diff --git a/compareModelVsCell.py b/compareModelVsCell.py new file mode 100644 index 0000000..9f5c9bb --- /dev/null +++ b/compareModelVsCell.py @@ -0,0 +1,92 @@ + +from FiCurve import FICurve +from CellData import CellData +from models.LIFACnoise import LifacNoiseModel +import helperFunctions as hF +import functions as fu +import numpy as np + + +CELL_PATH = "data/2012-06-27-ah-invivo-1/" +# current parameters from fit with folus on improving model f0 response +# MODEL_PARAMETERS = {'step_size': 5e-05, 'mem_tau': 0.042542178602690675, 'v_base': 0, 'v_zero': 0, 'threshold': 1, 'v_offset': -111.328125, 'input_scaling': 388.9439738592248, 'delta_a': 0.05513136301255167, 'tau_a': 0.1017720885626184, 'a_zero': 2, 'noise_strength': 0.01740931732483443} +# parameters fit with fixed adaption focus on serial cor and f_inf_slope +MODEL_PARAMETERS = {'step_size': 5e-05, 'mem_tau': 0.03547683648372142, 'v_base': 0, 'v_zero': 0, 'threshold': 1, 'v_offset': -43.75, 'input_scaling': 162.97353975832954, 'delta_a': 0.024625305808413798, 'tau_a': 0.07632538029074364, 'a_zero': 2, 'noise_strength': 0.00408169739163286} + +SAVE_PATH = "results/test/" + + +def main(): + cell_data = CellData(CELL_PATH) + fi_curve = FICurve(cell_data) + model = LifacNoiseModel(MODEL_PARAMETERS) + + print_characteristics(cell_data, fi_curve, model) + plot_fi_curve(cell_data, fi_curve, model) + + +def print_characteristics(cell_data: CellData, fi_curve: FICurve, model): + sc_max_lag = 1 + eod_freq = cell_data.get_eod_frequency() + + fi_contrasts = fi_curve.stimulus_value + + cell_bf = cell_data.get_base_frequency() + cell_sc = cell_data.get_serial_correlation(sc_max_lag) + cell_vs = cell_data.get_vector_strength() + + cell_f_inf_slope = fi_curve.get_f_infinity_slope() + cell_f_inf_values = fi_curve.f_infinities + + cell_f_zero_slope = fi_curve.get_fi_curve_slope_of_straight() + cell_f_zero_values = fi_curve.f_zeros + + # calculate Model characteristics: + baseline_freq, vector_strength, serial_correlation = model.calculate_baseline_markers(eod_freq, sc_max_lag) + + f_baselines, f_zeros, f_infinities = model.calculate_fi_curve(fi_contrasts, eod_freq) + f_infinities_fit = hF.fit_clipped_line(fi_contrasts, f_infinities) + f_infinities_slope = f_infinities_fit[0] + + f_zeros_fit = hF.fit_boltzmann(fi_contrasts, f_zeros) + f_zero_slope = fu.full_boltzmann_straight_slope(f_zeros_fit[0], f_zeros_fit[1], f_zeros_fit[2], f_zeros_fit[3]) + + print_value("Base frequency", cell_bf, baseline_freq) + for i in range(sc_max_lag): + print_value("Serial correlation lag {}".format(i+1), cell_sc[i], serial_correlation[i]) + print_value("Vector strength", cell_vs, vector_strength) + print_value("f_inf slope", cell_f_inf_slope, f_infinities_slope) + print_f_values("f_inf values", cell_f_inf_values, f_infinities) + print_value("f_zero slope", cell_f_zero_slope, f_zero_slope) + print_f_values("f_zero values", cell_f_zero_values, f_zeros) + + +def print_value(name, cell_value, model_value): + print("{} - expected: {:.2f}, current: {:.2f}, %-error: {:.3f}".format(name, + cell_value, model_value, (model_value-cell_value)/cell_value)) + + +def print_f_values(name, cell_values, model_values): + cell_values = np.array(cell_values) + model_values = np.array(model_values) + + mean_perc_error = 0 + for c,m in zip(cell_values, model_values): + mean_perc_error += (m-c)/ c + + mean_perc_error = mean_perc_error/ len(cell_values) + + print("{}:\nexpected:".format(name), np.around(cell_values), "\ncurrent: ", np.around(model_values), + "\nmean %-error: {:.3f}".format(mean_perc_error)) + + +def plot_fi_curve(cell_data, fi_curve, model, save=False): + f_b, f_zero, f_inf = model.calculate_fi_curve(cell_data.get_fi_contrasts(), cell_data.get_eod_frequency()) + if save: + fi_curve.plot_fi_curve(savepath=SAVE_PATH, comp_f_baselines=f_b, comp_f_zeros=f_zero, comp_f_infs=f_inf) + else: + fi_curve.plot_fi_curve(comp_f_baselines=f_b, comp_f_zeros=f_zero, comp_f_infs=f_inf) + + +if __name__ == '__main__': + main()