def estimate_sag(self, peak_width=0.005): """Calculate the sag in a hyperpolarizing voltage response. Parameters ---------- peak_width : window width to get more robust peak estimate in sec (default 0.005) Returns ------- sag : fraction that membrane potential relaxes back to baseline """ t = self.t v = self.v start = self.start if not start: start = 0 end = self.end if not end: end = self.t[-1] v_peak, peak_index = self.voltage_deflection("min") v_peak_avg = ft.average_voltage(v, t, start=t[peak_index] - peak_width / 2., end=t[peak_index] + peak_width / 2.) v_baseline = self.sweep_feature("v_baseline") v_steady = ft.average_voltage(v, t, start=end - self.baseline_interval, end=end) sag = (v_peak_avg - v_steady) / (v_peak_avg - v_baseline) return sag
def _get_baseline_voltage(self): v = self.v t = self.t filter_frequency = 1. # in kHz # Look at baseline interval before start if start is defined if self.start is not None: return ft.average_voltage(v, t, self.start - self.baseline_interval, self.start) # Otherwise try to find an interval where things are pretty flat dv = ft.calculate_dvdt(v, t, filter_frequency) non_flat_points = np.flatnonzero( np.abs(dv >= self.baseline_detect_thresh)) flat_intervals = t[non_flat_points[1:]] - t[non_flat_points[:-1]] long_flat_intervals = np.flatnonzero( flat_intervals >= self.baseline_interval) if long_flat_intervals.size > 0: interval_index = long_flat_intervals[0] + 1 baseline_end_time = t[non_flat_points[interval_index]] return ft.average_voltage( v, t, baseline_end_time - self.baseline_interval, baseline_end_time) else: logging.info( "Could not find sufficiently flat interval for automatic baseline voltage", RuntimeWarning) return np.nan
def estimate_sag(self, peak_width=0.005): """Calculate the sag in a hyperpolarizing voltage response. Parameters ---------- peak_width : window width to get more robust peak estimate in sec (default 0.005) Returns ------- sag : fraction that membrane potential relaxes back to baseline sag_ratio: ratio of steady state voltage decrease to the largest voltage decrease """ t = self.t v = self.v start = self.start if not start: start = 0 end = self.end # To calculate the steady state, not the peak deflection (see code below) if not end: end = self.t[-1] v_peak, peak_index = self.voltage_deflection("min") # There was one cell with a noisy (?) peak downwards (to -250 mV) unfortunately. That's why we have the if-statement here. # You can delete this if-statement if you have normal traces. # If this all still didn't work as expected, then hopefully there are more hyperpolarisation traces for which tau can be estimated if (self.v[peak_index] < -200) : print("A DOWNWARD PEAK WAS OBSERVED GOING TO LESS THAN 200 MV!!!") # Look for another local minimum closer to stimulus onset # A spike should only last about a couple of milliseconds, so let's look a bit before the 'spike' peak_index = peak_index - (ft.find_time_index(t, 0.12) - ft.find_time_index(t, 0.1)) #print(t[peak_index]) v_peak_avg = ft.average_voltage(v, t, start=t[peak_index] - peak_width / 2., end=t[peak_index] + peak_width / 2.) v_baseline = self.sweep_feature("v_baseline") v_steady = ft.average_voltage(v, t, start=end - self.baseline_interval, end=end) #print('v_stead: ', v_steady) #print('v_baseline: ', v_baseline) #print('v_peak_avg: ', v_peak_avg) #print('denominater=v_stead-v_baseline: ', v_steady-v_baseline) #print('numerator=v_peak_avg-v_baseline: ', v_peak_avg-v_baseline) sag = (v_peak_avg - v_steady) / (v_peak_avg - v_baseline) sag_ratio = (v_peak_avg - v_baseline)/(v_steady-v_baseline) #print(sag_ratio) return sag, sag_ratio
def _get_baseline_voltage(self): v = self.v t = self.t filter_frequency = 1. # in kHz # Look at baseline interval before start if start is defined if self.start is not None: return ft.average_voltage(v, t, self.start - self.baseline_interval, self.start) # Otherwise try to find an interval where things are pretty flat dv = ft.calculate_dvdt(v, t, filter_frequency) non_flat_points = np.flatnonzero(np.abs(dv >= self.baseline_detect_thresh)) flat_intervals = t[non_flat_points[1:]] - t[non_flat_points[:-1]] long_flat_intervals = np.flatnonzero(flat_intervals >= self.baseline_interval) if long_flat_intervals.size > 0: interval_index = long_flat_intervals[0] + 1 baseline_end_time = t[non_flat_points[interval_index]] return ft.average_voltage(v, t, baseline_end_time - self.baseline_interval, baseline_end_time) else: logging.info("Could not find sufficiently flat interval for automatic baseline voltage", RuntimeWarning) return np.nan