From 9d68799c63e3ffda4eaf0b07d2266c70c219da37 Mon Sep 17 00:00:00 2001 From: alexanderott Date: Mon, 7 Jun 2021 09:26:21 +0200 Subject: [PATCH] stuff --- Figures_results.py | 1 - experiments/FiCurve.py | 22 +++--- models/LIFACnoise.py | 2 + test.py | 165 ++++++++++++++++++++++++++++++++++++----- 4 files changed, 161 insertions(+), 29 deletions(-) diff --git a/Figures_results.py b/Figures_results.py index b9c97ba..8896a75 100644 --- a/Figures_results.py +++ b/Figures_results.py @@ -64,7 +64,6 @@ def main(): def run_all_images(dir_path, filter=True, pre_analysis_path="", recalculate=False): - if pre_analysis_path != "": fit_info_name = "figures_res_fit_info.npy" behaviours_name = "figures_res_behaviour.npy" diff --git a/experiments/FiCurve.py b/experiments/FiCurve.py index 5c9424f..fbe5a49 100644 --- a/experiments/FiCurve.py +++ b/experiments/FiCurve.py @@ -46,8 +46,8 @@ class FICurve: self.f_inf_fit = hF.fit_clipped_line(self.stimulus_values, self.f_inf_frequencies) self.f_zero_fit = hF.fit_boltzmann(self.stimulus_values, self.f_zero_frequencies) - def __calculate_time_constant_internal__(self, contrast, mean_frequency, baseline_freq, sampling_interval, pre_duration, plot=False): - time_constant_fit_length = 0.05 + def __calculate_time_constant_internal__(self, contrast, mean_frequency, baseline_freq, sampling_interval, pre_duration, plot=False, plot_data=False): + time_constant_fit_length = 0.05 # change to 25 - 30 ms if contrast > 0: maximum_idx = np.argmax(mean_frequency) @@ -88,6 +88,9 @@ class FICurve: fu.exponential_function(x_values, popt[0], popt[1], popt[2]), color="orange") plt.show() plt.close() + + if plot_data: + return popt, np.arange(start_fit_idx, end_fit_idx, 1) * sampling_interval - pre_duration return popt, pcov except RuntimeError: print("RuntimeError happened in fit_exponential.") @@ -375,7 +378,7 @@ class FICurveCellData(FICurve): popt, pcov = super().__calculate_time_constant_internal__(self.stimulus_values[contrast_idx], mean_frequency, baseline_freq, sampling_interval, pre_duration, plot=plot) - return popt[1] + return popt def calculate_all_frequency_points(self): mean_frequencies = self.cell_data.get_mean_fi_curve_isi_frequencies() @@ -498,7 +501,7 @@ class FICurveModel(FICurve): stim_start = 0.5 total_simulation_time = stim_duration + 2 * stim_start - def __init__(self, model, stimulus_values, eod_frequency, trials=5): + def __init__(self, model, stimulus_values, eod_frequency, trials=5, save_dir=None, recalculate=False): self.eod_frequency = eod_frequency self.model = model self.trials = trials @@ -506,7 +509,7 @@ class FICurveModel(FICurve): self.mean_frequency_traces = [] self.mean_time_traces = [] self.set_model_adaption_to_baseline() - super().__init__(stimulus_values) + super().__init__(stimulus_values, save_dir=None, recalculate=False) def set_model_adaption_to_baseline(self): stimulus = SinusoidalStepStimulus(self.eod_frequency, 0, 0, 0) @@ -540,7 +543,7 @@ class FICurveModel(FICurve): if len(time) == 0 or min(time) > self.stim_start \ or max(time) < self.stim_start + self.stim_duration: - # print("Too few spikes to calculate f_inf, f_0 and f_base") + self.f_inf_frequencies.append(0) self.f_zero_frequencies.append(0) self.f_baseline_frequencies.append(0) @@ -569,10 +572,7 @@ class FICurveModel(FICurve): popt, pcov = super().__calculate_time_constant_internal__(self.stimulus_values[contrast_idx], mean_frequency, baseline_freq, sampling_interval, pre_duration, plot=plot) - if len(popt) > 0: - return popt[1] - else: - return -1 + return popt def get_mean_time_and_freq_traces(self): return self.mean_time_traces, self.mean_frequency_traces @@ -644,6 +644,6 @@ def get_fi_curve_class(data, stimulus_values, eod_freq=None, trials=5, save_dir= if isinstance(data, LifacNoiseModel): if eod_freq is None: raise ValueError("The FiCurveModel needs the eod variable to work") - return FICurveModel(data, stimulus_values, eod_freq, trials=trials) + return FICurveModel(data, stimulus_values, eod_freq, trials=trials, save_dir=None, recalculate=False) raise ValueError("Unknown type: Cannot find corresponding Baseline class. Data was type:" + str(type(data))) diff --git a/models/LIFACnoise.py b/models/LIFACnoise.py index 8a82e76..47ce96c 100644 --- a/models/LIFACnoise.py +++ b/models/LIFACnoise.py @@ -264,10 +264,12 @@ def test_v_offset(model: LifacNoiseModel, v_offset, base_stimulus, simulation_le @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]) +# faster ? stimulus[stimulus<0] = 0 @jit(nopython=True) def simulate_fast(rectified_stimulus_array, total_time_s, parameters: np.ndarray): + # rectified_stimulus_array = np.power(rectified_stimulus_array, 3) # TODO ! v_zero = parameters[0] a_zero = parameters[1] step_size = parameters[2] diff --git a/test.py b/test.py index eecf842..0f0c325 100644 --- a/test.py +++ b/test.py @@ -7,7 +7,8 @@ from fitting.ModelFit import ModelFit, get_best_fit import matplotlib.pyplot as plt from run_Fitter import iget_start_parameters from experiments.FiCurve import FICurve, FICurveCellData, FICurveModel - +from Figures_results import scatter_hist +from my_util.functions import exponential_function colors = ["black", "red", "blue", "orange", "green"] @@ -46,6 +47,9 @@ def main(): # f.write(str(steady_state[i]) + ",") # f.write(str(onset[i]) + "\n") # quit() + + step_response_comparison() + quit() cell_taus = [] model_taus = [] @@ -60,36 +64,163 @@ def main(): model = fit.get_model() cell_data = fit.get_cell_data() - fi_model = FICurveModel(model, cell_data.get_fi_contrasts(), cell_data.get_eod_frequency()) + fi_model = FICurveModel(model, cell_data.get_fi_contrasts(), cell_data.get_eod_frequency(), save_dir=folder_path) tau_model = fi_model.calculate_time_constant(-2) - model_taus.append(tau_model) + model_taus.append(tau_model[1]) fi_cell = FICurveCellData(cell_data, cell_data.get_fi_contrasts(), cell_data.data_path) tau_cell = fi_cell.calculate_time_constant(-2) - cell_taus.append(tau_cell) - # model_taus = [0.008227050473746214, 339.82706244279075, 0.010807838358313856, 0.01115826226335211, 0.007413613528371537, 0.013213123673467943, 0.010808781901437248, 0.0014254019917934319, 0.015448860984264491, 0.014413888046967265, 0.029301687421672096, 255.82969629640462, 0.00457130444591641, 0.009463250852321902, 0.007755615618900141, 0.009110183466482135, 0.007225102891006319, 0.0024319255218167336, 0.017420779742227246, 0.027195130905873905, 0.00934661249103802, 0.07158177921097474, 0.004866423936911278, 0.0008792730042370866, 0.00820470663372859, 0.05135988132772797, -945.8805502129879, -625.3981095962032, 0.00045249542468299257, 0.10198296886109447, 0.02992101543230009, 715.8802825637086, 0.0074281010613263775, 0.002038042609377947, 0.0055331475878047445, 0.010965819934792512, 0.00916015878530846, -123.0502556160885, 0.013734214511572751, 0.004193114169578979, 0.011103783836162914, 0.018070119202374276] - # cell_taus = [0.0035588022114672975, 0.005541599918212267, 0.007848670525682807, 0.008147461940299978, 0.005948699597158819, 0.0024739217090879104, 0.0038303906688137847, 0.00300889313116284, 0.014167509501882801, 0.009459132581703281, 0.005226151863380407, 772.607757547133, 0.0016936075127979523, 0.008768601246126134, 0.0036987681597240958, 0.009306705661392982, 0.004808427175831087, 0.005419130192821167, 0.0028735071877832733, 0.005983916198767454, 0.004369124640159074, 0.020115307489662095, 468.1810372271939, 0.0012946259647070454, 0.0021810924044437753, 259.6701021041893, 2891.7659169677813, -2155.469810882238, 0.0027895996432137117, 0.01503608591999554, 1138.5941497875147, -0.009831620851536924, 0.004657794528111363, -0.007131468820451661, -0.0221455330638256, -589.1530734507537, -506.6077728634018, -0.0028166760486066605, 359.3395355603788, -0.003053762369811596, 0.00465946355831796, 0.01675427242298042] + cell_taus.append(tau_cell[1]) + + model_taus_c = [] + cell_taus_c = [] + border = 1 + for i in range(len(model_taus)): + if np.abs(model_taus[i]) < border and np.abs(cell_taus[i]) < border: + model_taus_c.append(model_taus[i]) + cell_taus_c.append(cell_taus[i]) - model_taus_c = [v for v in model_taus if np.abs(v) < 0.15] - cell_taus_c = [v for v in cell_taus if np.abs(v) < 0.15] print("model removed:", len(model_taus) - len(model_taus_c)) print("cell removed:", len(cell_taus) - len(cell_taus_c)) - fig, axes = plt.subplots(1, 2, sharey="all", sharex="all") + plot_cell_model_comp_taus(cell_taus_c, model_taus_c) - axes[0].hist(model_taus_c) - axes[0].set_title("Model taus") - - axes[1].hist(cell_taus_c) - axes[1].set_title("Cell taus") - - plt.show() - plt.close() + # fig, axes = plt.subplots(1, 2, sharey="all", sharex="all") + # + # axes[0].hist(model_taus_c) + # axes[0].set_title("Model taus") + # + # axes[1].hist(cell_taus_c) + # axes[1].set_title("Cell taus") + # + # plt.show() + # plt.close() print(model_taus) print(cell_taus) # sam_tests() +def step_response_comparison(): + results_dir = "results/sam_cells_only_best/" + for folder in sorted(os.listdir(results_dir)): + folder_path = os.path.join(results_dir, folder) + if not os.path.isdir(folder_path): + continue + + fit = get_best_fit(folder_path) + print(fit.get_fit_routine_error()) + model = fit.get_model() + cell_data = fit.get_cell_data() + + fi_model = FICurveModel(model, cell_data.get_fi_contrasts(), cell_data.get_eod_frequency(), + save_dir=folder_path) + # model_times, model_mean_freqs = fi_model.get_mean_time_and_freq_traces() + + fi_cell = FICurveCellData(cell_data, cell_data.get_fi_contrasts(), cell_data.data_path) + + contrasts = cell_data.get_fi_contrasts() + mean_frequencies = cell_data.get_mean_fi_curve_isi_frequencies() + baseline_freqs = fi_cell.get_f_baseline_frequencies() + pre_duration = -1 * cell_data.get_recording_times()[0] + sampling_interval = cell_data.get_sampling_interval() + + fig, axes = plt.subplots(2, 2, figsize=(12, 8)) + + c_contrast_idx = -2 + tau_params, tau_x = fi_cell.__calculate_time_constant_internal__(contrasts[c_contrast_idx], mean_frequencies[c_contrast_idx], + baseline_freqs[c_contrast_idx], sampling_interval, + pre_duration, plot=False, plot_data=True) + + # cell + x_values = np.arange(len(mean_frequencies[c_contrast_idx])) * sampling_interval - pre_duration + index_range = (x_values > -0.05) & (x_values < 0.15) + plot_freq_with_tau_fit(axes[0, 0], x_values[index_range], + np.array(mean_frequencies[c_contrast_idx])[index_range], tau_x, tau_params) + axes[0, 0].set_title("2nd highest Contrast: {:.2f}".format(contrasts[c_contrast_idx])) + axes[0, 0].set_ylabel("Cell") + axes[0, 0].set_xlabel("Time [s]; tau: {:.3f}".format(tau_params[1])) + c_contrast_idx = -3 + tau_params, tau_x = fi_cell.__calculate_time_constant_internal__(contrasts[c_contrast_idx], mean_frequencies[c_contrast_idx], + baseline_freqs[c_contrast_idx], sampling_interval, + pre_duration, plot=False, plot_data=True) + x_values = np.arange(len(mean_frequencies[c_contrast_idx])) * sampling_interval - pre_duration + index_range = (x_values > -0.05) & (x_values < 0.15) + plot_freq_with_tau_fit(axes[0, 1], x_values[index_range], + np.array(mean_frequencies[c_contrast_idx])[index_range], tau_x, tau_params) + axes[0, 1].set_title("3rd highest Contrast: {:.2f}".format(contrasts[c_contrast_idx])) + axes[0, 1].set_xlabel("Time [s]; tau: {:.3f}".format(tau_params[1])) + + # model + contrasts = cell_data.get_fi_contrasts() + mean_frequencies = fi_model.mean_frequency_traces + baseline_freqs = fi_model.get_f_baseline_frequencies() + pre_duration = 0.5 + sampling_interval = fi_model.model.get_sampling_interval() + + c_contrast_idx = -2 + tau_params, tau_x = fi_cell.__calculate_time_constant_internal__(contrasts[c_contrast_idx], + mean_frequencies[c_contrast_idx], + baseline_freqs[c_contrast_idx], + sampling_interval, + pre_duration, plot=False, plot_data=True) + + x_values = np.arange(len(mean_frequencies[c_contrast_idx])) * sampling_interval - pre_duration + index_range = (x_values > -0.05) & (x_values < 0.15) + plot_freq_with_tau_fit(axes[1, 0], x_values[index_range], + np.array(mean_frequencies[c_contrast_idx])[index_range], tau_x, tau_params) + axes[1, 0].set_ylabel("Model") + axes[1, 0].set_xlabel("Time [s]; tau: {:.3f}".format(tau_params[1])) + c_contrast_idx = -3 + tau_params, tau_x = fi_cell.__calculate_time_constant_internal__(contrasts[c_contrast_idx], + mean_frequencies[c_contrast_idx], + baseline_freqs[c_contrast_idx], + sampling_interval, + pre_duration, plot=False, plot_data=True) + x_values = np.arange(len(mean_frequencies[c_contrast_idx])) * sampling_interval - pre_duration + index_range = (x_values > -0.05) & (x_values < 0.15) + plot_freq_with_tau_fit(axes[1, 1], x_values[index_range], + np.array(mean_frequencies[c_contrast_idx])[index_range], tau_x, tau_params) + axes[1, 1].set_xlabel("Time [s]; tau: {:.3f}".format(tau_params[1])) + + axes[0, 0].set_ylim((0, 800)) + axes[0, 1].set_ylim((0, 800)) + axes[1, 1].set_ylim((0, 800)) + axes[1, 0].set_ylim((0, 800)) + + plt.tight_layout() + plt.savefig("figures/tau_images/" + cell_data.get_cell_name() + "_tau.png") + plt.close() + + +def plot_freq_with_tau_fit(ax, time, freq, tau_x, tau_params): + ax.plot(time, freq) + ax.plot(tau_x, exponential_function(tau_x, tau_params[0], tau_params[1], tau_params[2])) + + +def plot_cell_model_comp_taus(cell_taus, model_taus): + fig = plt.figure(figsize=(3, 4)) + gs = fig.add_gridspec(2, 1, height_ratios=[3, 7], + left=0.1, right=0.95, bottom=0.1, top=0.9, + wspace=0.4, hspace=0.2) + num_of_bins = 20 + + minimum = min(min(cell_taus), min(model_taus)) + maximum = max(max(cell_taus), max(model_taus)) + step = (maximum - minimum) / num_of_bins + bins = np.arange(minimum, maximum + step, step) + + ax = fig.add_subplot(gs[1, 0]) + ax_histx = fig.add_subplot(gs[0, 0], sharex=ax) + scatter_hist(cell_taus, model_taus, ax, ax_histx, "Tau Comparison", bins) # , cmap, cell_bursting) + ax.set_xlabel(r"Cell [s]") + ax.set_ylabel(r"Model [s]") + ax_histx.set_ylabel("Count") + + plt.tight_layout() + plt.savefig("figures/tau_images/fit_tau_comparison.pdf", transparent=True) + plt.close() + + def sam_tests(): data_folder = "./data/final_sam/" for cell in sorted(os.listdir(data_folder)):