From af40a601896c7750a29f7f141f2e0baa8d7bb2af Mon Sep 17 00:00:00 2001 From: AlexanderOtt Date: Thu, 2 Apr 2020 10:07:17 +0200 Subject: [PATCH] use same type of calculations for characteristics as in the data --- models/LIFACnoise.py | 46 ++++++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/models/LIFACnoise.py b/models/LIFACnoise.py index cab44a5..e67c769 100644 --- a/models/LIFACnoise.py +++ b/models/LIFACnoise.py @@ -8,7 +8,7 @@ import helperFunctions as hF from stimuli.SinusoidalStepStimulus import SinusoidalStepStimulus from scipy.optimize import curve_fit from warnings import warn - +import matplotlib.pyplot as plt class LifacNoiseModel(AbstractModel): # all times in milliseconds @@ -157,7 +157,7 @@ class LifacNoiseModel(AbstractModel): def get_model_copy(self): return LifacNoiseModel(self.parameters) - def calculate_baseline_markers(self, stimulus_freq, max_lag=1): + def calculate_baseline_markers(self, stimulus_freq, max_lag=1, simulation_time=30): """ calculates the baseline markers baseline frequency, vector strength and serial correlation based on simulated 30 seconds with a standard Sinusoidal stimulus with the given frequency @@ -165,7 +165,7 @@ class LifacNoiseModel(AbstractModel): :return: baseline_freq, vs, sc """ base_stimulus = SinusoidalStepStimulus(stimulus_freq, 0) - _, spiketimes = self.simulate_fast(base_stimulus, 30) + _, spiketimes = self.simulate_fast(base_stimulus, simulation_time) time_x = 5 baseline_freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, time_x) @@ -187,24 +187,31 @@ class LifacNoiseModel(AbstractModel): based on simulated 2 seconds for each contrast :return: f_inf_values_list, f_inf_slope """ - + stimulus_start = 0.3 + stimulus_duration = 1 f_infinities = [] for contrast in contrasts: - stimulus = SinusoidalStepStimulus(stimulus_freq, contrast) - _, spiketimes = self.simulate_fast(stimulus, 1) - - f_infinity = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 0.3) - f_infinities.append(f_infinity) + stimulus = SinusoidalStepStimulus(stimulus_freq, contrast, stimulus_start, stimulus_duration) + _, spiketimes = self.simulate_fast(stimulus, stimulus_start*2+stimulus_duration) + time, freq = hF.calculate_time_and_frequency_trace(spiketimes, self.get_sampling_interval()) + f_inf = hF.detect_f_infinity_in_freq_trace(time, freq, stimulus_start, stimulus_duration, self.get_sampling_interval()) + f_infinities.append(f_inf) - popt, pcov = curve_fit(fu.line, contrasts, f_infinities, maxfev=10000) + popt = hF.fit_clipped_line(contrasts, f_infinities) f_infinities_slope = popt[0] return f_infinities, f_infinities_slope def calculate_fi_curve(self, contrasts, stimulus_freq): - stim_duration = 1 - stim_start = 1 + + max_time_constant = max([self.parameters["tau_a"], self.parameters["mem_tau"]]) + factor_to_equilibrium = 5 + stim_duration = max_time_constant * factor_to_equilibrium + stim_start = max_time_constant * factor_to_equilibrium + total_simulation_time = max_time_constant * factor_to_equilibrium * 3 + # print("Total simulation time (vs 2.5) {:.2f}".format(total_simulation_time)) + sampling_interval = self.get_sampling_interval() f_infinities = [] f_zeros = [] @@ -212,10 +219,12 @@ class LifacNoiseModel(AbstractModel): import matplotlib.pyplot as plt for c in contrasts: stimulus = SinusoidalStepStimulus(stimulus_freq, c, stim_start, stim_duration) - _, spiketimes = self.simulate_fast(stimulus, 3.5) + _, spiketimes = self.simulate_fast(stimulus, total_simulation_time) time, frequency = hF.calculate_time_and_frequency_trace(spiketimes, sampling_interval) - + # if c == contrasts[0] or c == contrasts[-1]: + # plt.plot(frequency) + # plt.show() f_inf = hF.detect_f_infinity_in_freq_trace(time, frequency, stim_start, stim_duration, sampling_interval) f_infinities.append(f_inf) @@ -290,10 +299,13 @@ def binary_search_base_freq(model: LifacNoiseModel, base_stimulus, goal_frequenc def test_v_offset(model: LifacNoiseModel, v_offset, base_stimulus, simulation_length): model.set_variable("v_offset", v_offset) - v, spiketimes = model.simulate_fast(base_stimulus, simulation_length) - - freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, simulation_length / 3) + try: + v, spiketimes = model.simulate_fast(base_stimulus, simulation_length) + freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, simulation_length / 3) + except ZeroDivisionError: + print("divide by zero!") + freq = 0 # if freq > 10000: # from IPython import embed # import matplotlib.pyplot as plt