change implementation to more efficient way. adapt signature

This commit is contained in:
a.ott 2020-03-02 16:37:37 +01:00
parent 8997e56618
commit 7e65ebae4e
5 changed files with 28 additions and 14 deletions

View File

@ -126,7 +126,7 @@ class Fitter:
# only eod with amplitude 1 and no modulation # only eod with amplitude 1 and no modulation
_, spiketimes = self.model.simulate_fast(base_stimulus, 30) _, spiketimes = self.model.simulate_fast(base_stimulus, 30)
baseline_freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, freq_sampling_rate, 5) baseline_freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 5)
# print("model:", baseline_freq, "data:", self.baseline_freq) # print("model:", baseline_freq, "data:", self.baseline_freq)
relative_spiketimes = np.array([s % (1/self.eod_freq) for s in spiketimes if s > 0]) relative_spiketimes = np.array([s % (1/self.eod_freq) for s in spiketimes if s > 0])
@ -142,7 +142,7 @@ class Fitter:
if len(spiketimes) < 2: if len(spiketimes) < 2:
f_infinities.append(0) f_infinities.append(0)
else: else:
f_infinity = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, freq_sampling_rate, 0.5) f_infinity = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 0.5)
f_infinities.append(f_infinity) f_infinities.append(f_infinity)
popt, pcov = curve_fit(fu.line, self.fi_contrasts, f_infinities, maxfev=10000) popt, pcov = curve_fit(fu.line, self.fi_contrasts, f_infinities, maxfev=10000)

View File

@ -155,19 +155,33 @@ def calculate_mean_of_frequency_traces(trial_time_traces, trial_frequency_traces
return shortened_time, mean_freq return shortened_time, mean_freq
def mean_freq_of_spiketimes_after_time_x(spiketimes, sampling_interval, time_x, time_in_ms=False): def mean_freq_of_spiketimes_after_time_x(spiketimes, time_x, time_in_ms=False):
""" Calculates the mean frequency of the portion of spiketimes that is after last_x_time """ """ Calculates the mean frequency of the portion of spiketimes that is after last_x_time """
if len(spiketimes) <= 1: if len(spiketimes) <= 1:
return 0 return 0
freq = calculate_isi_frequency_trace(spiketimes, sampling_interval, time_in_ms) relevant_spikes = spiketimes[spiketimes > time_x]
# returned frequency starts at the
idx = int((time_x-spiketimes[0]) / sampling_interval) if len(relevant_spikes) <= 1:
rest_array = freq[idx:] return 0
mean_freq = np.mean(rest_array) if time_in_ms:
relevant_spikes = relevant_spikes / 1000
isis = np.diff(relevant_spikes)
isi_freqs = 1 / isis
weights = isis / min(isis)
mean_freq = sum(isi_freqs * weights) / sum(weights)
return mean_freq return mean_freq
# freq = calculate_isi_frequency_trace(spiketimes, sampling_interval, time_in_ms)
# # returned frequency starts at the
# idx = int((time_x-spiketimes[0]) / sampling_interval)
# rest_array = freq[idx:]
# mean_freq = np.mean(rest_array)
# return mean_freq
def calculate_mean_isi_freq(spiketimes, time_in_ms=False): def calculate_mean_isi_freq(spiketimes, time_in_ms=False):
if len(spiketimes) < 2: if len(spiketimes) < 2:

View File

@ -163,7 +163,7 @@ class LifacNoiseModel(AbstractModel):
base_stimulus = SinusAmplitudeModulationStimulus(base_stimulus_freq, 0, 0) base_stimulus = SinusAmplitudeModulationStimulus(base_stimulus_freq, 0, 0)
_, spiketimes = self.simulate_fast(base_stimulus, 30) _, spiketimes = self.simulate_fast(base_stimulus, 30)
time_x = 5 time_x = 5
baseline_freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, self.get_sampling_interval(), time_x) baseline_freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, time_x)
relative_spiketimes = np.array([s % (1 / base_stimulus_freq) for s in spiketimes]) relative_spiketimes = np.array([s % (1 / base_stimulus_freq) for s in spiketimes])
eod_durations = np.full((len(spiketimes)), 1 / base_stimulus_freq) eod_durations = np.full((len(spiketimes)), 1 / base_stimulus_freq)
@ -184,7 +184,7 @@ class LifacNoiseModel(AbstractModel):
stimulus = SinusAmplitudeModulationStimulus(base_freq, contrast, modulation_frequency) stimulus = SinusAmplitudeModulationStimulus(base_freq, contrast, modulation_frequency)
_, spiketimes = self.simulate_fast(stimulus, 1) _, spiketimes = self.simulate_fast(stimulus, 1)
f_infinity = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, self.get_sampling_interval(), 0.3) f_infinity = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 0.3)
f_infinities.append(f_infinity) f_infinities.append(f_infinity)
popt, pcov = curve_fit(fu.line, contrasts, f_infinities, maxfev=10000) popt, pcov = curve_fit(fu.line, contrasts, f_infinities, maxfev=10000)
@ -239,7 +239,7 @@ def test_v_offset(model: LifacNoiseModel, v_offset, base_stimulus, simulation_le
model.set_variable("v_offset", v_offset) model.set_variable("v_offset", v_offset)
_, spiketimes = model.simulate_fast(base_stimulus, simulation_length) _, spiketimes = model.simulate_fast(base_stimulus, simulation_length)
freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, 0.0005, simulation_length/3) freq = hF.mean_freq_of_spiketimes_after_time_x(spiketimes, simulation_length / 3)
return freq return freq

View File

@ -31,7 +31,7 @@ class FrequencyFunctionsTester(unittest.TestCase):
for freq in self.frequencies: for freq in self.frequencies:
for n in self.noise_levels: for n in self.noise_levels:
spikes = generate_jittered_spiketimes(freq, n, end=simulation_time) spikes = generate_jittered_spiketimes(freq, n, end=simulation_time)
sim_freq = hF.mean_freq_of_spiketimes_after_time_x(spikes, 0.00005, simulation_time/4, time_in_ms=False) sim_freq = hF.mean_freq_of_spiketimes_after_time_x(spikes, simulation_time / 4, time_in_ms=False)
max_diff = round(n*(10+0.7*np.sqrt(freq)), 2) max_diff = round(n*(10+0.7*np.sqrt(freq)), 2)
# print("noise: {:.2f}".format(n), "\texpected: {:.2f}".format(freq), "\tgotten: {:.2f}".format(round(sim_freq, 2)), "\tfreq diff: {:.2f}".format(abs(freq-round(sim_freq, 2))), "\tmax_diff:", max_diff) # print("noise: {:.2f}".format(n), "\texpected: {:.2f}".format(freq), "\tgotten: {:.2f}".format(round(sim_freq, 2)), "\tfreq diff: {:.2f}".format(abs(freq-round(sim_freq, 2))), "\tmax_diff:", max_diff)
@ -223,7 +223,7 @@ def test_distribution():
print("#### - freq:", freq, "noise level:", n ) print("#### - freq:", freq, "noise level:", n )
for reps in range(repetitions): for reps in range(repetitions):
spikes = generate_jittered_spiketimes(freq, n, end=simulation_time) spikes = generate_jittered_spiketimes(freq, n, end=simulation_time)
sim_freq = hF.mean_freq_of_spiketimes_after_time_x(spikes, 0.0002, simulation_time / 4, time_in_ms=False) sim_freq = hF.mean_freq_of_spiketimes_after_time_x(spikes, simulation_time / 4, time_in_ms=False)
diffs.append(sim_freq-freq) diffs.append(sim_freq-freq)
diffs_per_noise.append(diffs) diffs_per_noise.append(diffs)

View File

@ -55,7 +55,7 @@ class HelperFunctionsTester(unittest.TestCase):
test_model.set_variable("v_offset", offset) test_model.set_variable("v_offset", offset)
_, spikes = test_model.simulate_fast(stimulus, 5) _, spikes = test_model.simulate_fast(stimulus, 5)
goal_freq = hF.mean_freq_of_spiketimes_after_time_x(spikes, 0.0005, 1) goal_freq = hF.mean_freq_of_spiketimes_after_time_x(spikes, 1)
if goal_freq <= threshold: if goal_freq <= threshold:
print("test Offset ({:.1f}) generates a too low frequency: {:.2f}".format(offset, goal_freq)) print("test Offset ({:.1f}) generates a too low frequency: {:.2f}".format(offset, goal_freq))