rectify stimulus in simulate fast, add marker calculation
This commit is contained in:
parent
04ba55bbc5
commit
251ca4f2ef
@ -4,7 +4,9 @@ from models.AbstractModel import AbstractModel
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import functions as fu
|
import functions as fu
|
||||||
from numba import jit
|
from numba import jit
|
||||||
import time
|
import helperFunctions as hF
|
||||||
|
from stimuli.SinusAmplitudeModulation import SinusAmplitudeModulationStimulus
|
||||||
|
from scipy.optimize import curve_fit
|
||||||
|
|
||||||
|
|
||||||
class LifacNoiseModel(AbstractModel):
|
class LifacNoiseModel(AbstractModel):
|
||||||
@ -64,7 +66,7 @@ class LifacNoiseModel(AbstractModel):
|
|||||||
|
|
||||||
return output_voltage, spiketimes
|
return output_voltage, spiketimes
|
||||||
|
|
||||||
def simulate_fast(self, stimulus: AbstractStimulus, total_time_s):
|
def simulate_fast(self, stimulus: AbstractStimulus, total_time_s, time_start=0):
|
||||||
|
|
||||||
v_zero = self.parameters["v_zero"]
|
v_zero = self.parameters["v_zero"]
|
||||||
a_zero = self.parameters["a_zero"]
|
a_zero = self.parameters["a_zero"]
|
||||||
@ -77,10 +79,12 @@ class LifacNoiseModel(AbstractModel):
|
|||||||
mem_tau = self.parameters["mem_tau"]
|
mem_tau = self.parameters["mem_tau"]
|
||||||
noise_strength = self.parameters["noise_strength"]
|
noise_strength = self.parameters["noise_strength"]
|
||||||
|
|
||||||
stimulus_array = stimulus.as_array(total_time_s, step_size)
|
stimulus_array = stimulus.as_array(time_start, total_time_s, step_size)
|
||||||
|
rectified_stimulus = rectify_stimulus_array(stimulus_array)
|
||||||
|
|
||||||
parameters = np.array([v_zero, a_zero, step_size, threshold, v_base, delta_a, tau_a, v_offset, mem_tau, noise_strength])
|
parameters = np.array([v_zero, a_zero, step_size, threshold, v_base, delta_a, tau_a, v_offset, mem_tau, noise_strength])
|
||||||
voltage_trace, adaption, spiketimes = simulate_fast(stimulus_array, total_time_s, parameters)
|
|
||||||
|
voltage_trace, adaption, spiketimes = simulate_fast(rectified_stimulus, total_time_s, parameters)
|
||||||
|
|
||||||
self.stimulus = stimulus
|
self.stimulus = stimulus
|
||||||
self.voltage_trace = voltage_trace
|
self.voltage_trace = voltage_trace
|
||||||
@ -146,35 +150,53 @@ class LifacNoiseModel(AbstractModel):
|
|||||||
def get_model_copy(self):
|
def get_model_copy(self):
|
||||||
return LifacNoiseModel(self.parameters)
|
return LifacNoiseModel(self.parameters)
|
||||||
|
|
||||||
def calculate_baseline_markers(self, stimulus_freq=750):
|
def calculate_baseline_markers(self, base_stimulus_freq, max_lag=1):
|
||||||
"""
|
"""
|
||||||
calculates the baseline markers baseline frequency, vector strength and serial correlation
|
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
|
based on simulated 30 seconds with a standard Sinusoidal stimulus with the given frequency
|
||||||
|
|
||||||
:return: baseline_freq, vs, sc
|
:return: baseline_freq, vs, sc
|
||||||
"""
|
"""
|
||||||
|
base_stimulus = SinusAmplitudeModulationStimulus(base_stimulus_freq, 0, 0)
|
||||||
|
_, spiketimes = self.simulate_fast(base_stimulus, 30)
|
||||||
|
|
||||||
|
baseline_freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 5)
|
||||||
|
|
||||||
|
relative_spiketimes = np.array([s % (1 / base_stimulus_freq) for s in spiketimes])
|
||||||
|
eod_durations = np.full((len(spiketimes)), 1 / base_stimulus_freq)
|
||||||
|
vector_strength = hF.__vector_strength__(relative_spiketimes, eod_durations)
|
||||||
|
serial_correlation = hF.calculate_serial_correlation(np.array(spiketimes), max_lag)
|
||||||
|
|
||||||
|
return baseline_freq, vector_strength, serial_correlation
|
||||||
|
|
||||||
pass
|
def calculate_fi_markers(self, contrasts, base_freq, modulation_frequency):
|
||||||
|
|
||||||
def calculate_fi_markers(self, contrasts, ):
|
|
||||||
"""
|
"""
|
||||||
calculates the fi markers f_infinity, f_infinity_slope for given contrasts
|
calculates the fi markers f_infinity, f_infinity_slope for given contrasts
|
||||||
based on simulated 2 seconds for each contrast
|
based on simulated 2 seconds for each contrast
|
||||||
:return:
|
:return: f_inf_values_list, f_inf_slope
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
f_infinities = []
|
||||||
|
for contrast in contrasts:
|
||||||
|
stimulus = SinusAmplitudeModulationStimulus(base_freq, contrast, modulation_frequency)
|
||||||
|
_, spiketimes = self.simulate_fast(stimulus, 0.5)
|
||||||
|
|
||||||
|
if len(spiketimes) < 2:
|
||||||
|
f_infinities.append(0)
|
||||||
|
else:
|
||||||
|
f_infinity = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 0.4)
|
||||||
|
f_infinities.append(f_infinity)
|
||||||
|
|
||||||
|
popt, pcov = curve_fit(fu.line, contrasts, f_infinities, maxfev=10000)
|
||||||
|
|
||||||
def stimulus_to_numpy_array(stimulus: AbstractStimulus, total_time_s, step_size):
|
f_infinities_slope = popt[0]
|
||||||
total_time_points = int(total_time_s * 1000 / step_size)
|
|
||||||
stimulus_values = np.zeros(total_time_points)
|
|
||||||
for idx in range(len(stimulus_values)):
|
|
||||||
# rectified input:
|
|
||||||
stimulus_values[idx] = fu.rectify(stimulus.value_at_time_in_ms(step_size*idx))
|
|
||||||
|
|
||||||
return stimulus_values
|
return f_infinities, f_infinities_slope
|
||||||
|
|
||||||
|
|
||||||
|
@jit(nopython=True)
|
||||||
|
def rectify_stimulus_array(stimulus_array:np.ndarray):
|
||||||
|
return np.array([x if x > 0 else 0 for x in stimulus_array])
|
||||||
|
|
||||||
|
|
||||||
@jit(nopython=True)
|
@jit(nopython=True)
|
||||||
|
Loading…
Reference in New Issue
Block a user