This commit is contained in:
alexanderott 2021-06-07 09:26:21 +02:00
parent ccca6e030b
commit 9d68799c63
4 changed files with 161 additions and 29 deletions

View File

@ -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"

View File

@ -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)))

View File

@ -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]

165
test.py
View File

@ -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)):