use model intern calculation for the characterizing values
This commit is contained in:
parent
f41b6bdb78
commit
45abc0ae14
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user