use model intern calculation for the characterizing values

This commit is contained in:
AlexanderOtt 2020-03-27 10:28:12 +01:00
parent f41b6bdb78
commit 45abc0ae14

View File

@ -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