From 40bb5ddd2bfb668a40fd2d8327c5b71441e77c7f Mon Sep 17 00:00:00 2001 From: "a.ott" Date: Mon, 7 Dec 2020 18:29:52 +0100 Subject: [PATCH] axon delay fit + presentation --- sam_experiments.py | 79 +++++++++++++++++++++++++- thesis/presentation/planned_order.odp | Bin 0 -> 15060 bytes 2 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 thesis/presentation/planned_order.odp diff --git a/sam_experiments.py b/sam_experiments.py index f80a986..e6a5e68 100644 --- a/sam_experiments.py +++ b/sam_experiments.py @@ -173,6 +173,11 @@ def sam_analysis(fit_path): cell_stds = [] model_stds = [] + + approx_offset = approximate_axon_delay_in_idx(cell_data, model) + print("Approx offset idx:", approx_offset) + print("Approx offset ms:", (approx_offset * step_size) * 1000) + for mod_freq in sorted(u_delta_freqs): # TODO problem of cutting the pdf as in some cases the pdf is shorter than 1 modulation frequency period! # length info wrong ? always at least one period? @@ -213,7 +218,11 @@ def sam_analysis(fit_path): final_model_mean = np.mean(model_means, axis=0) cell_stds.append(np.std(final_cell_mean)) model_stds.append(np.std(final_model_mean)) - final_model_mean_phase_corrected = correct_phase(final_cell_mean, final_model_mean, step_size) + # offset, final_model_mean_phase_corrected = correct_phase(final_cell_mean, final_model_mean, step_size) + # print("Offset:", offset) + # print("modfreq:", mod_freq) + + final_model_mean_phase_corrected = np.roll(final_model_mean, approx_offset) # PLOT EVERY MOD FREQ fig, axes = plt.subplots(1, 5, figsize=(15, 5), sharex=True) @@ -280,7 +289,73 @@ def correct_phase(cell_mean, model_mean, step_size): lowest_err = abs roll_idx = roll_by - return np.roll(model_mean, roll_idx) + return roll_idx, np.roll(model_mean, roll_idx) + + +def approximate_axon_delay_in_idx(cell_data, model): + + lowest_mod_freq = 80 + highest_mod_freq = 150 + + eod_freq = cell_data.get_eod_frequency() + step_size = cell_data.get_sampling_interval() + + durations = cell_data.get_sam_durations() + contrasts = cell_data.get_sam_contrasts() + u_contrasts = np.unique(contrasts) + spiketimes = cell_data.get_sam_spiketimes() + delta_freqs = cell_data.get_sam_delta_frequencies() + u_delta_freqs = np.unique(delta_freqs) + + used_mod_freqs = [] + axon_delays = [] + + for mod_freq in sorted(u_delta_freqs): + # Only use "stable" mod_freqs to approximate the axon delay + if not lowest_mod_freq <= mod_freq <= highest_mod_freq: + continue + + if 1/mod_freq > durations[0] / 4: + print("skipped mod_freq: {}".format(mod_freq)) + print("Duration: {} while mod_freq period: {:.2f}".format(durations[0], 1/mod_freq)) + continue + mfreq_data = {} + cell_means = [] + model_means = [] + for c in u_contrasts: + mfreq_data[c] = [] + + for i in range(len(delta_freqs)): + if delta_freqs[i] != mod_freq: + continue + + if len(spiketimes[i]) > 1: + print("There are more spiketimes in one 'point'! Only the first was used! ") + spikes = spiketimes[i][0] + + cell_pdf = spiketimes_calculate_pdf(spikes, step_size) + + cell_cuts = cut_pdf_into_periods(cell_pdf, 1/mod_freq, step_size, factor=1.0) + cell_mean = np.mean(cell_cuts, axis=0) + cell_means.append(cell_mean) + + stimulus = SAM(eod_freq, contrasts[i] / 100, mod_freq) + v1, spikes_model = model.simulate(stimulus, durations[i] * 4) + model_pdf = spiketimes_calculate_pdf(spikes_model, step_size) + model_cuts = cut_pdf_into_periods(model_pdf, 1/mod_freq, step_size, factor=1.0) + model_mean = np.mean(model_cuts, axis=0) + model_means.append(model_mean) + + final_cell_mean = np.mean(cell_means, axis=0) + final_model_mean = np.mean(model_means, axis=0) + + offset, final_model_mean_phase_corrected = correct_phase(final_cell_mean, final_model_mean, step_size) + + used_mod_freqs.append(mod_freq) + axon_delays.append(offset) + + mean_delay = np.mean(axon_delays) + return int(round(mean_delay)) def generate_pdf(model, stimulus, trials=4, sim_length=3, kernel_width=0.005): diff --git a/thesis/presentation/planned_order.odp b/thesis/presentation/planned_order.odp new file mode 100644 index 0000000000000000000000000000000000000000..53178196428b3baa8b31e9b39fa8785dfde80816 GIT binary patch literal 15060 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