P-unit_model/compareModelVsCell.py
2020-04-02 10:10:19 +02:00

93 lines
3.8 KiB
Python

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