stim values extraction but without functionality
This commit is contained in:
parent
8b10dba43b
commit
df346b2a35
@ -3,6 +3,7 @@ from DatParser import DatParser
|
|||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from warnings import warn
|
from warnings import warn
|
||||||
|
import os
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
|
|
||||||
@ -32,6 +33,7 @@ class Controller:
|
|||||||
|
|
||||||
self.sorting = {}
|
self.sorting = {}
|
||||||
self.thresholds = {}
|
self.thresholds = {}
|
||||||
|
self.stim_values = {}
|
||||||
self.recording_times = {}
|
self.recording_times = {}
|
||||||
|
|
||||||
def save_parameters(self):
|
def save_parameters(self):
|
||||||
@ -84,9 +86,10 @@ class Controller:
|
|||||||
[time_traces, v1_traces, eod_traces, local_eod_traces, stimulus_traces] = self.get_unsorted_traces(repro)
|
[time_traces, v1_traces, eod_traces, local_eod_traces, stimulus_traces] = self.get_unsorted_traces(repro)
|
||||||
(spiketimes, metadata) = self.get_unsorted_spiketimes(repro)
|
(spiketimes, metadata) = self.get_unsorted_spiketimes(repro)
|
||||||
|
|
||||||
|
repro_stim_values = self.extract_stim_values(repro, metadata)
|
||||||
|
self.stim_values[repro] = repro_stim_values
|
||||||
if len(v1_traces) != len(spiketimes):
|
if len(v1_traces) != len(spiketimes):
|
||||||
warn("get_traces_with_spiketimes():Unequal number of traces and spiketimes for repro {}!"
|
warn("get_traces_with_spiketimes():Unequal number of traces ({}) and spiketimes ({}) for repro {}! Returning only according to the number of traces!".format(len(v1_traces), len(spiketimes), repro))
|
||||||
"Returning only according to the number of traces!".format(repro))
|
|
||||||
|
|
||||||
ash = calculate_distance_matrix_traces_spikes(v1_traces, spiketimes, self.parser.get_sampling_interval(), before)
|
ash = calculate_distance_matrix_traces_spikes(v1_traces, spiketimes, self.parser.get_sampling_interval(), before)
|
||||||
|
|
||||||
@ -102,13 +105,35 @@ class Controller:
|
|||||||
return v1_traces, sorted_spiketimes, (before, after)
|
return v1_traces, sorted_spiketimes, (before, after)
|
||||||
|
|
||||||
def get_stim_values(self, repro):
|
def get_stim_values(self, repro):
|
||||||
|
return sorted(np.unique(self.stim_values[repro]))
|
||||||
|
|
||||||
|
def extract_stim_values(self, repro, metadata_list):
|
||||||
|
stim_values = []
|
||||||
if repro == "BaselineActivity":
|
if repro == "BaselineActivity":
|
||||||
return ["None"]
|
for i in range(len(metadata_list)):
|
||||||
|
stim_values.append("None")
|
||||||
elif repro == "FICurve":
|
elif repro == "FICurve":
|
||||||
# TODO other function that just provides the contrasts
|
current_intensity = None
|
||||||
return sorted([str(x[0]) for x in self.parser.get_fi_curve_contrasts()])
|
for i in range(len(metadata_list)):
|
||||||
|
if len(metadata_list[i]) != 0:
|
||||||
|
current_intensity = float(metadata_list[i][-1]["intensity"][:-2])
|
||||||
|
|
||||||
|
stim_values.append(current_intensity)
|
||||||
|
|
||||||
|
elif repro == "FileStimulus":
|
||||||
|
for i in range(len(metadata_list)):
|
||||||
|
stim_values.append(os.path.basename(metadata_list[i][0]["file"]))
|
||||||
|
|
||||||
|
elif repro == "SAM":
|
||||||
|
for i in range(len(metadata_list)):
|
||||||
|
deltaf = metadata_list[i][0]["----- Stimulus -------------------------------------------------------"]["deltaf"]
|
||||||
|
contrast = metadata_list[i][0]["----- Stimulus -------------------------------------------------------"]["contrast"]
|
||||||
|
stim_values.append("{} {}".format(deltaf, contrast))
|
||||||
|
|
||||||
|
if len(stim_values) == 0:
|
||||||
|
return ["Stimulus values of repro not supported"]
|
||||||
|
|
||||||
return ["repro not supported"]
|
return stim_values
|
||||||
|
|
||||||
def get_trials(self, repro, stimulus_value):
|
def get_trials(self, repro, stimulus_value):
|
||||||
pass
|
pass
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
from PyQt5.QtWidgets import QWidget, QPushButton, QSizePolicy, QLineEdit,\
|
from PyQt5.QtWidgets import QWidget, QPushButton, QSizePolicy, QLineEdit,\
|
||||||
QMessageBox, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QFrame,\
|
QMessageBox, QVBoxLayout, QHBoxLayout, QGridLayout, QLabel, QFrame,\
|
||||||
QDoubleSpinBox, QComboBox, QSpinBox, QCheckBox
|
QDoubleSpinBox, QComboBox, QSpinBox, QCheckBox, QFileDialog
|
||||||
from PyQt5.QtCore import pyqtSlot
|
from PyQt5.QtCore import pyqtSlot
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@ -14,9 +14,13 @@ from redetector import detect_spiketimes
|
|||||||
|
|
||||||
class SpikeRedetectGui(QWidget):
|
class SpikeRedetectGui(QWidget):
|
||||||
|
|
||||||
def __init__(self, controller: Controller):
|
def __init__(self, data_path=None):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.controller = controller
|
|
||||||
|
if data_path is None:
|
||||||
|
data_path = QFileDialog.getExistingDirectory(self, caption='Select a cell directory:')
|
||||||
|
|
||||||
|
self.controller = Controller(data_path)
|
||||||
self.title = 'Spike Redetection'
|
self.title = 'Spike Redetection'
|
||||||
self.left = 10
|
self.left = 10
|
||||||
self.top = 10
|
self.top = 10
|
||||||
@ -188,6 +192,9 @@ class SpikeRedetectGui(QWidget):
|
|||||||
def repro_change(self):
|
def repro_change(self):
|
||||||
repro = self.repro_box.currentText()
|
repro = self.repro_box.currentText()
|
||||||
|
|
||||||
|
redetection = (self.threshold_spinbox.value(), self.window_spinbox.value(), self.step_spinbox.value())
|
||||||
|
self.canvas.plot(self.trial_idx, self.repro_box.currentText(), self.controller, redetection)
|
||||||
|
|
||||||
# reset trials and stim values
|
# reset trials and stim values
|
||||||
self.trial_change(0)
|
self.trial_change(0)
|
||||||
self.stim_val_box.clear()
|
self.stim_val_box.clear()
|
||||||
@ -195,8 +202,7 @@ class SpikeRedetectGui(QWidget):
|
|||||||
for val in self.controller.get_stim_values(repro):
|
for val in self.controller.get_stim_values(repro):
|
||||||
self.stim_val_box.addItem(str(val))
|
self.stim_val_box.addItem(str(val))
|
||||||
|
|
||||||
redetection = (self.threshold_spinbox.value(), self.window_spinbox.value(), self.step_spinbox.value())
|
|
||||||
self.canvas.plot(self.trial_idx, self.repro_box.currentText(), self.controller, redetection)
|
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def accept_redetection(self):
|
def accept_redetection(self):
|
||||||
@ -320,9 +326,9 @@ class PlotCanvas(FigureCanvas):
|
|||||||
ax.clear()
|
ax.clear()
|
||||||
time = np.arange(len(trace)) * sampling_interval - recording_times[0]
|
time = np.arange(len(trace)) * sampling_interval - recording_times[0]
|
||||||
ax.plot(time, trace)
|
ax.plot(time, trace)
|
||||||
ax.eventplot(spiketimes, lineoffsets=max(trace) + 1, colors="black")
|
ax.eventplot(spiketimes, lineoffsets=max(trace) + 2, colors="black")
|
||||||
redetect = detect_spiketimes(time, trace, redetection_vars[0], redetection_vars[1], redetection_vars[2])
|
redetect = detect_spiketimes(time, trace, redetection_vars[0], redetection_vars[1], redetection_vars[2])
|
||||||
ax.eventplot(redetect, lineoffsets=max(trace) + 2, colors="red")
|
ax.eventplot(redetect, lineoffsets=max(trace) + 1, colors="red")
|
||||||
ax.set_title('Trial XYZ')
|
ax.set_title('Trial XYZ')
|
||||||
|
|
||||||
if self.current_repro == repro:
|
if self.current_repro == repro:
|
||||||
|
19
main.py
19
main.py
@ -1,28 +1,21 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
|
||||||
|
|
||||||
from PyQt5.QtWidgets import QApplication, QFileDialog
|
from PyQt5.QtWidgets import QApplication
|
||||||
|
|
||||||
from Controller import Controller
|
|
||||||
from SpikeRedetectGui import SpikeRedetectGui
|
from SpikeRedetectGui import SpikeRedetectGui
|
||||||
|
|
||||||
|
|
||||||
test_file = "../neuronModel/data/final_sam/2010-11-08-al-invivo-1"
|
test_file = "../neuronModel/data/final_sam/2010-11-08-al-invivo-1"
|
||||||
|
sam_file = "../neuronModel/data/final_sam/2011-10-25-ad-invivo-1"
|
||||||
|
# TODO CLI
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
data_path = QFileDialog.getExistingDirectory(caption='Select a directory')
|
|
||||||
if os.path.isdir(data_path):
|
|
||||||
data_provider = Controller(data_path)
|
|
||||||
else:
|
|
||||||
print("Cell loading didn't work!\n Cell folder: {}".format(data_path))
|
|
||||||
return
|
|
||||||
#data_provider = Controller(test_file)
|
|
||||||
ex = SpikeRedetectGui(data_provider)
|
|
||||||
sys.exit(app.exec_())
|
|
||||||
|
|
||||||
|
|
||||||
|
ex = SpikeRedetectGui(sam_file)
|
||||||
|
sys.exit(app.exec_())
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -16,14 +16,14 @@ def detect_spike_indices_automatic_split(v1, threshold, min_length=5000, split_s
|
|||||||
break_threshold = 0.25
|
break_threshold = 0.25
|
||||||
splits = []
|
splits = []
|
||||||
|
|
||||||
if len(v1) < min_length:
|
if len(v1) <= min_length:
|
||||||
splits = [(0, len(v1))]
|
splits = [(0, len(v1))]
|
||||||
else:
|
else:
|
||||||
last_max = max(v1[0:min_length])
|
last_max = max(v1[0:min_length])
|
||||||
last_min = min(v1[0:min_length])
|
last_min = min(v1[0:min_length])
|
||||||
idx = min_length
|
idx = min_length
|
||||||
|
|
||||||
while idx < len(v1):
|
while idx <= len(v1):
|
||||||
if idx + step_size > len(v1):
|
if idx + step_size > len(v1):
|
||||||
splits.append((split_start, len(v1)))
|
splits.append((split_start, len(v1)))
|
||||||
break
|
break
|
||||||
|
Loading…
Reference in New Issue
Block a user