def extract_somatic_spiking_features(self, traces, delay, duration): # soma trace = {} traces_for_efel=[] trace['T'] = traces['T'] trace['V'] = traces['v_stim'] trace['stim_start'] = [delay] trace['stim_end'] = [delay + duration] traces_for_efel.append(trace) # trunk locations ''' for key in traces['v_rec']: for k in traces['v_rec'][key]: trace = {} trace['T'] = traces['T'] trace['V'] = traces['v_rec'][key][k] trace['stim_start'] = [delay] trace['stim_end'] = [delay + duration] traces_for_efel.append(trace) ''' efel.setDoubleSetting('interp_step', 0.025) efel.setDoubleSetting('DerivativeThreshold', 40.0) traces_results = efel.getFeatureValues(traces_for_efel, ['inv_first_ISI','AP_begin_time', 'doublet_ISI']) return traces_results
def test_ohmic_input_resistance_vb_ssse(): """basic: Test ohmic_input_resistance_vb_ssse""" import efel efel.reset() stim_start = 500.0 stim_end = 900.0 time = efel.io.load_fragment('%s#col=1' % meanfrequency1_url) voltage = efel.io.load_fragment('%s#col=2' % meanfrequency1_url) trace = {} trace['T'] = time trace['V'] = voltage trace['stim_start'] = [stim_start] trace['stim_end'] = [stim_end] features = ['ohmic_input_resistance_vb_ssse', 'voltage_deflection_vb_ssse'] stimulus_current = 10.0 efel.setDoubleSetting('stimulus_current', stimulus_current) feature_values = \ efel.getFeatureValues( [trace], features) voltage_deflection = feature_values[0]['voltage_deflection_vb_ssse'][0] ohmic_input_resistance = \ feature_values[0]['ohmic_input_resistance_vb_ssse'][0] nt.assert_equal( ohmic_input_resistance, voltage_deflection / stimulus_current)
def generate_prediction(self, model: sciunit.Model, verbose: bool = False) -> float: efel.reset() stim_start = 10.0 # ms stim_dur = 50.0 # ms stim_amp = -1.0 # nA efel.setDoubleSetting('stimulus_current', stim_amp) model.inject_soma_square_current(current={'delay':stim_start, 'duration':stim_dur, 'amplitude':stim_amp}) trace = model.get_soma_membrane_potential_eFEL_format(tstop=stim_start+stim_dur+stim_start, start=stim_start, stop =stim_start+stim_dur) prediction = efel.getFeatureValues([trace], ['ohmic_input_resistance_vb_ssse'])[0]["ohmic_input_resistance_vb_ssse"][0] return prediction
def test_derivwindow1(): """basic: Test DerivativeWindow""" import efel efel.reset() stim_start = 100.0 stim_end = 1000.0 time = efel.io.load_fragment('%s#col=1' % derivwindow1_url) voltage = efel.io.load_fragment('%s#col=2' % derivwindow1_url) trace = {} trace['T'] = time trace['V'] = voltage trace['stim_start'] = [stim_start] trace['stim_end'] = [stim_end] features = ['AP_begin_voltage'] feature_values = \ efel.getFeatureValues( [trace], features) AP_begin_voltage = feature_values[0]['AP_begin_voltage'][0] nt.assert_almost_equal(AP_begin_voltage, -45.03627393790836) efel.reset() efel.setDoubleSetting('interp_step', 0.01) feature_values = \ efel.getFeatureValues( [trace], features) AP_begin_voltage = feature_values[0]['AP_begin_voltage'][0] nt.assert_almost_equal(AP_begin_voltage, -83.57661997973835) efel.reset() efel.setDoubleSetting('interp_step', 0.01) efel.setIntSetting('DerivativeWindow', 30) feature_values = \ efel.getFeatureValues( [trace], features) AP_begin_voltage = feature_values[0]['AP_begin_voltage'][0] nt.assert_almost_equal(AP_begin_voltage, -45.505521563640386)
def _setup_efel(self): """Set up efel before extracting the feature""" import efel efel.reset() if self.threshold is not None: efel.setThreshold(self.threshold) if self.stimulus_current is not None: efel.setDoubleSetting('stimulus_current', self.stimulus_current) if not efel.FeatureNameExists(self.efel_feature_name): raise ValueError("eFEL doesn't have a feature called %s" % self.efel_feature_name)
def generate_prediction(self, model: sciunit.Model, verbose: bool = False) -> Optional[float]: efel.reset() stim_start = 10.0 # ms stim_dur = 5.0 # ms stim_amp = 15.0 # nA efel.setDoubleSetting('stimulus_current', stim_amp) model.inject_soma_square_current(current={'delay':stim_start, 'duration':stim_dur, 'amplitude':stim_amp}) trace = model.get_soma_membrane_potential_eFEL_format(tstop=stim_start+stim_dur+stim_start, start=stim_start, stop =stim_start+stim_dur) output = efel.getFeatureValues([trace], ['AP_duration_half_width'])[0]["AP_duration_half_width"] prediction = output[0] if output else None return prediction
def _setup_efel(self): """Set up efel before extracting the feature""" import efel efel.reset() if self.threshold is not None: efel.setThreshold(self.threshold) if self.interp_step is not None: efel.setDoubleSetting("interp_step", self.interp_step) if self.double_settings is not None: for setting_name, setting_value in self.double_settings.items(): efel.setDoubleSetting(setting_name, setting_value) if self.int_settings is not None: for setting_name, setting_value in self.int_settings.items(): efel.setIntSetting(setting_name, setting_value)
def _setup_efel(self): """Set up efel before extracting the feature""" import efel efel.reset() if self.threshold is not None: efel.setThreshold(self.threshold) if self.stimulus_current is not None: efel.setDoubleSetting('stimulus_current', self.stimulus_current) if self.interp_step is not None: efel.setDoubleSetting('interp_step', self.interp_step) if self.double_settings is not None: for setting_name, setting_value in self.double_settings.items(): efel.setDoubleSetting(setting_name, setting_value) if self.int_settings is not None: for setting_name, setting_value in self.int_settings.items(): efel.setIntSetting(setting_name, setting_value) if self.string_settings is not None: print(self.string_settings) for setting_name, setting_value in self.string_settings.items(): efel.setStrSetting(setting_name, setting_value)
def _setup_efel(self): """Set up efel before extracting the feature""" import efel efel.reset() if self.threshold is not None: efel.setThreshold(self.threshold) if self.stimulus_current is not None: efel.setDoubleSetting('stimulus_current', self.stimulus_current) if self.interp_step is not None: efel.setDoubleSetting('interp_step', self.interp_step) if self.double_settings is not None: for setting_name, setting_value in self.double_settings.items(): efel.setDoubleSetting(setting_name, setting_value) if self.int_settings is not None: for setting_name, setting_value in self.int_settings.items(): efel.setIntSetting(setting_name, setting_value)
def _setup_efel(self): """Set up efel before extracting the feature""" import efel efel.reset() if self.threshold is not None: efel.setThreshold(self.threshold) if self.stimulus_current is not None: efel.setDoubleSetting('stimulus_current', self.stimulus_current) if self.interp_step is not None: efel.setDoubleSetting('interp_step', self.interp_step) if self.double_settings is not None: for setting_name, setting_value in self.double_settings.items(): efel.setDoubleSetting(setting_name, setting_value) if not efel.FeatureNameExists(self.efel_feature_name): raise ValueError("eFEL doesn't have a feature called %s" % self.efel_feature_name)
#*This script is designed to plot each sweep to visualize where errors in the main script (ABF_EFELv2) may be occurring #The following libraries must be installed before being imported! import efel import numpy as np import pyabf from tkinter import filedialog from matplotlib import pyplot as plt #Opens a dialog box allowing the user to select the file and removes the extension from the file name file_path = filedialog.askopenfilename() file = file_path[:-4] #Sets settings for derivative threshold, interpolation step, and calculation of RMP efel.setDoubleSetting('interp_step',0.05) #Must be set to the sampling rate (20,000 Hz = 0.05) efel.setDoubleSetting('voltage_base_start_perc',0.1) #Used for RMP calculation efel.setDoubleSetting('voltage_base_end_perc',0.8) #Used for RMP calculation efel.setDerivativeThreshold(15) #Normally set to 15 #Import ABF file and assign the corresponding data to Time and RawData variables File = pyabf.ABF(file_path) Time = (File.sweepX)*1000 RawData = File.data #Identify the number of traces in the abf file (*Note: this is designed for a 20kHz recording lasting ~10s) #Other differences in recording will need to change these values RawData = np.transpose(RawData) TraceNum = int((len(RawData) / 200000)) #Using the number of calulcated traces, split the first RawData column into equal arrays of 200000