from models.LIFACnoise import LifacNoiseModel from Baseline import BaselineModel from FiCurve import FICurveModel import numpy as np import matplotlib.pyplot as plt import copy import os SEARCH_WIDTH = 3 SEARCH_PRECISION = 30 CONTRASTS = np.arange(-0.4, 0.45, 0.1) def main(): model_parameters = {'threshold': 1, 'step_size': 5e-05, 'a_zero': 2, 'delta_a': 0.2032269898801589, 'mem_tau': 0.011314027210564803, 'noise_strength': 0.056724809998220195, 'v_zero': 0, 'v_base': 0, 'tau_a': 0.05958195972016753, 'input_scaling': 119.81500448274554, 'dend_tau': 0.0027746086464721723, 'v_offset': -24.21875} parameters_to_test = ["input_scaling", "dend_tau", "mem_tau", "noise_strength", "v_offset", "delta_a", "tau_a"] effect_data = [] for p in parameters_to_test: print("Working on parameter " + p) effect_data.append(test_parameter_effect(model_parameters, p)) plot_effects(effect_data, "./figures/variable_effect/") def test_parameter_effect(model_parameters, test_parameter): model_parameters = copy.deepcopy(model_parameters) start_value = model_parameters[test_parameter] start = start_value*(1/SEARCH_WIDTH) end = start_value*SEARCH_WIDTH step = (end - start) / SEARCH_PRECISION values = np.arange(start, end+step, step) bf = [] vs = [] sc = [] cv = [] f_inf_s = [] f_inf_v = [] f_zero_s = [] f_zero_v = [] broken_i = [] for i in range(len(values)): model_parameters[test_parameter] = values[i] model = LifacNoiseModel(model_parameters) fi_curve = FICurveModel(model, CONTRASTS, 600, trials=50) f_inf_s.append(fi_curve.get_f_inf_slope()) f_inf_v.append(fi_curve.get_f_inf_frequencies()) f_zero_s.append(fi_curve.get_f_zero_fit_slope_at_stimulus_value(0.1)) f_zero_v.append(fi_curve.get_f_zero_frequencies()) if not os.path.exists("./figures/f_point_detection/"): os.makedirs("./figures/f_point_detection/") detection_save_path = "./figures/f_point_detection/{}_{:.4f}/".format(test_parameter, values[i]) if not os.path.exists(detection_save_path): os.makedirs(detection_save_path) fi_curve.plot_f_point_detections(detection_save_path) baseline = BaselineModel(model, 600, trials=10) bf.append(baseline.get_baseline_frequency()) vs.append(baseline.get_vector_strength()) sc.append(baseline.get_serial_correlation(2)) cv.append(baseline.get_coefficient_of_variation()) values = list(values) if len(broken_i) > 0: broken_i = sorted(broken_i, reverse=True) for i in broken_i: del values[i] return ParameterEffectData(values, test_parameter, bf, vs, sc, cv, f_inf_s, f_inf_v, f_zero_s, f_zero_v) # plot_effects(values, test_parameter, bf, vs, sc, cv, f_inf_s, f_inf_v, f_zero_s, f_zero_v) def plot_effects(par_effect_data_list, save_path=None): fig, axes = plt.subplots(8, len(par_effect_data_list), figsize=(32, 4*len(par_effect_data_list)), sharex="col") names = ("bf", "vs", "sc", "cv", "f_inf_s", "f_inf_v", "f_zero_s", "f_zero_v") for j in range(len(par_effect_data_list)): ped = par_effect_data_list[j] ranges = ((0, max(ped.get_data("bf")) * 1.1), (0, 1), (-1, 1), (0, 1), (0, max(ped.get_data("f_inf_s")) * 1.1), (0, 800), (0, max(ped.get_data("f_zero_s")) * 1.1), (0, 3000)) values = ped.values for i in range(len(names)): y_data = ped.get_data(names[i]) axes[i, j].plot(values, y_data) axes[i, j].set_ylim(ranges[i]) if j == 0: axes[i, j].set_ylabel(names[i]) if i == 0: axes[i, j].set_title(ped.test_parameter) plt.tight_layout() if save_path is not None: plt.savefig(save_path + "variable_effect_master_plot.png") else: plt.show() plt.close() class ParameterEffectData: data_names = ("bf", "vs", "sc", "cv", "f_inf_s", "f_inf_v" "f_zero_s", "f_zero_v") def __init__(self, values, test_parameter, bf, vs, sc, cv, f_inf_s, f_inf_v, f_zero_s, f_zero_v): self.values = values self.test_parameter = test_parameter self.bf = bf self.vs = vs self.sc = sc self.cv = cv self.f_inf_s = f_inf_s self.f_inf_v = f_inf_v self.f_zero_s = f_zero_s self.f_zero_v = f_zero_v def get_data(self, name): if name == "bf": return self.bf elif name == "vs": return self.vs elif name == "sc": return self.sc elif name == "cv": return self.cv elif name == "f_inf_s": return self.f_inf_s elif name == "f_inf_v": return self.f_inf_v elif name == "f_zero_s": return self.f_zero_s elif name == "f_zero_v": return self.f_zero_v else: raise ValueError("Unknown attribute name!") if __name__ == '__main__': main()