From 45abc0ae147809fca7590f093dbfeed7d0e1276e Mon Sep 17 00:00:00 2001 From: AlexanderOtt Date: Fri, 27 Mar 2020 10:28:12 +0100 Subject: [PATCH] use model intern calculation for the characterizing values --- fit_lifacnoise.py | 76 ++++++++++++++++------------------------------- 1 file changed, 25 insertions(+), 51 deletions(-) diff --git a/fit_lifacnoise.py b/fit_lifacnoise.py index 9dc30aa..12c4882 100644 --- a/fit_lifacnoise.py +++ b/fit_lifacnoise.py @@ -120,7 +120,6 @@ class Fitter: self.fi_contrasts = [] self.eod_freq = 0 - self.modulation_frequency = 10 self.sc_max_lag = 1 # expected values the model has to replicate @@ -137,25 +136,7 @@ class Fitter: self.counter = 0 - def calculate_needed_values_from_data(self, data: CellData): - self.eod_freq = data.get_eod_frequency() - - self.baseline_freq = data.get_base_frequency() - self.vector_strength = data.get_vector_strength() - self.serial_correlation = data.get_serial_correlation(self.sc_max_lag) - - fi_curve = FICurve(data, contrast=True) - self.fi_contrasts = fi_curve.stimulus_value - print("Fitter: fi-contrasts", self.fi_contrasts) - self.f_infinities = fi_curve.f_infinities - self.f_infinities_slope = fi_curve.get_f_infinity_slope() - - f_zero_slope = fi_curve.get_fi_curve_slope_of_straight() - self.a_delta = (f_zero_slope / self.f_infinities_slope) / 1000 - adaption = Adaption(data, fi_curve) - self.a_tau = adaption.get_tau_real() *2 - print() # mem_tau, (threshold?), (v_offset), noise_strength, input_scaling def cost_function(self, X, tau_a=0.1, delta_a=0.08, error_scaling=()): @@ -163,10 +144,10 @@ class Fitter: self.model.set_variable("mem_tau", X[0]) self.model.set_variable("noise_strength", X[1]) self.model.set_variable("input_scaling", X[2]) - #self.model.set_variable("tau_a", X[3]) - #self.model.set_variable("delta_a", X[4]) - self.model.set_variable("tau_a", tau_a) - self.model.set_variable("delta_a", delta_a) + self.model.set_variable("tau_a", X[3]) + self.model.set_variable("delta_a", X[4]) + #self.model.set_variable("tau_a", tau_a) + #self.model.set_variable("delta_a", delta_a) # minimize the difference in baseline_freq first by fitting v_offset # v_offset = self.__fit_v_offset_to_baseline_frequency__() @@ -177,35 +158,8 @@ class Fitter: self.model.set_variable("v_offset", v_offset) baseline_freq, vector_strength, serial_correlation = self.model.calculate_baseline_markers(self.eod_freq, self.sc_max_lag) - # only eod with amplitude 1 and no modulation - # _, spiketimes = self.model.simulate_fast(base_stimulus, 30) - - # baseline_freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 5) - # # print("model:", baseline_freq, "data:", self.baseline_freq) - # - # if len(spiketimes) > 10: - # relative_spiketimes = np.array([s % (1/self.eod_freq) for s in spiketimes if s > 0]) - # eod_durations = np.full((len(relative_spiketimes)), 1/self.eod_freq) - # vector_strength = hF.__vector_strength__(relative_spiketimes, eod_durations) - # serial_correlation = hF.calculate_serial_correlation(np.array(spiketimes), self.sc_max_lag) - # else: - # vector_strength = 0 - # serial_correlation = [0]*self.sc_max_lag - - f_infinities = [] - for contrast in self.fi_contrasts: - stimulus = SinusoidalStepStimulus(self.eod_freq, contrast) - _, spiketimes = self.model.simulate_fast(stimulus, 1) - - if len(spiketimes) < 2: - f_infinities.append(0) - else: - f_infinity = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 0.5) - f_infinities.append(f_infinity) + f_infinities, f_infinities_slope = self.model.calculate_fi_markers(self.fi_contrasts, self.eod_freq) - popt, pcov = curve_fit(fu.clipped_line, self.fi_contrasts, f_infinities, maxfev=10000) - - f_infinities_slope = popt[0] error_bf = abs((baseline_freq - self.baseline_freq) / self.baseline_freq) error_vs = abs((vector_strength - self.vector_strength) / self.vector_strength) error_sc = abs((serial_correlation[0] - self.serial_correlation[0]) / self.serial_correlation[0]) @@ -240,6 +194,26 @@ class Fitter: self.calculate_needed_values_from_data(data) return self.fit_model() + def calculate_needed_values_from_data(self, data: CellData): + self.eod_freq = data.get_eod_frequency() + + self.baseline_freq = data.get_base_frequency() + self.vector_strength = data.get_vector_strength() + self.serial_correlation = data.get_serial_correlation(self.sc_max_lag) + + fi_curve = FICurve(data, contrast=True) + self.fi_contrasts = fi_curve.stimulus_value + print("Fitter: fi-contrasts", self.fi_contrasts) + self.f_infinities = fi_curve.f_infinities + self.f_infinities_slope = fi_curve.get_f_infinity_slope() + + f_zero_slope = fi_curve.get_fi_curve_slope_of_straight() + self.a_delta = (f_zero_slope / self.f_infinities_slope) / 1000 + + adaption = Adaption(data, fi_curve) + self.a_tau = adaption.get_tau_real() + print() + def fit_model_to_values(self, eod_freq, baseline_freq, sc, vs, fi_contrasts, fi_inf_values, fi_inf_slope, a_delta, a_tau, x0=None, init_simplex=None): self.eod_freq = eod_freq self.baseline_freq = baseline_freq