def test_kernik_py_vs_mat(self): protocol = protocols.SingleActionPotentialProtocol(1800) baseline_model = kernik.KernikModel() baseline_model.generate_response(protocol) mat_baseline = np.loadtxt('model_data/original_baseline_3000ms.csv') compare_voltage_plots(baseline_model, mat_baseline)
def test_run_comparing_experiment_raises_value_error_double_protocol(self): parameters = [ ga_configs.Parameter(name='g_na', default_value=3671.2302), ga_configs.Parameter(name='g_f_s', default_value=30.10312), ] sap_protocol = protocols.SingleActionPotentialProtocol() sap_config = ga_configs.ParameterTuningConfig( population_size=2, max_generations=2, protocol=sap_protocol, tunable_parameters=parameters, params_lower_bound=0.5, params_upper_bound=1.5, mutate_probability=1., mate_probability=0.9, gene_swap_probability=0.5, gene_mutation_probability=0.1, tournament_size=2) configs = generate_config_list() configs.append(sap_config) with self.assertRaises(ValueError) as ve: parameter_tuning_experiments.run_comparison_experiment( configs=configs, iterations=2) self.assertEqual('Configs do not have unique protocols.', str(ve.exception))
def test_evaluate_performance_with_combined_protocol(self): config = ga_configs.ParameterTuningConfig( population_size=2, max_generations=2, protocol=protocols.SingleActionPotentialProtocol(), tunable_parameters=[ ga_configs.Parameter(name='g_b_na', default_value=0.95), ga_configs.Parameter(name='g_na', default_value=3671.2302) ], params_lower_bound=0.9, params_upper_bound=1.1, mutate_probability=1., mate_probability=0.9, gene_swap_probability=0.5, gene_mutation_probability=0.15, tournament_size=2) single_ap_ga = parameter_tuning_genetic_algorithm.\ ParameterTuningGeneticAlgorithm(config=config) single_ap_error = single_ap_ga._evaluate_performance( new_parameters=[0.94, 3000.]) config.secondary_protocol = protocols.IrregularPacingProtocol( duration=5, stimulation_offsets=[0.1, 0.2]) combined_protocol_ga = parameter_tuning_genetic_algorithm.\ ParameterTuningGeneticAlgorithm(config=config) combined_protocol_error = combined_protocol_ga._evaluate_performance( new_parameters=[0.94, 3000.]) # Combined protocol error should be larger than a single protocol error. self.assertGreater(combined_protocol_error, single_ap_error)
def setUp(self): config = ga_configs.ParameterTuningConfig( population_size=2, max_generations=2, protocol=protocols.SingleActionPotentialProtocol(), tunable_parameters=[ ga_configs.Parameter(name='g_b_na', default_value=1.), ga_configs.Parameter(name='g_na', default_value=3600.) ], params_lower_bound=0.9, params_upper_bound=1.1, mate_probability=0.9, mutate_probability=1., gene_swap_probability=0.5, gene_mutation_probability=0.15, tournament_size=2) self.ga_result = genetic_algorithm_results.GAResultParameterTuning( config=config) generation_one = [ genetic_algorithm_results.ParameterTuningIndividual( parameters=[0.95, 3671.2302], fitness=0), genetic_algorithm_results.ParameterTuningIndividual( parameters=[0.1, 3400.0], fitness=2), ] generation_two = [ genetic_algorithm_results.ParameterTuningIndividual( parameters=[0.6, 3500.0], fitness=5), genetic_algorithm_results.ParameterTuningIndividual( parameters=[0.9, 3600.0], fitness=9), ] self.ga_result.generations.append(generation_one) self.ga_result.generations.append(generation_two)
def plot_all_in_system_of_equations(duration=10): model = paci_2018.PaciModel() model.generate_response( protocol=protocols.SingleActionPotentialProtocol(duration=duration)) for i in range(len(model.y_names)): plt.figure() plt.plot([timestamp[i] for timestamp in model.full_y]) plt.savefig('figures/before_hold_i_na_480/{}.png'.format( model.y_names[i]))
def test_generate_trace_SAP(self): protocol = protocols.SingleActionPotentialProtocol() baseline_model = paci_2018.PaciModel() baseline_model.generate_response(protocol) self.assertTrue( len(baseline_model.t) > 100, 'Paci errored in less than .4s') self.assertTrue( min(baseline_model.y_voltage) < -.01, 'baseline Paci min is greater than .01') self.assertTrue( max(baseline_model.y_voltage) < .06, 'baseline Paci max is greater than .06')
def test_no_ion_selective_setter(self): protocol = protocols.SingleActionPotentialProtocol() paci_baseline = paci_2018.PaciModel() ion_selective_scales = {'I_CaL': .4, 'I_NaCa': .4} paci_no_ion = paci_2018.PaciModel() baseline_trace = paci_baseline.generate_response(protocol) paci_baseline.no_ion_selective = ion_selective_scales baseline_no_ion_trace = paci_baseline.generate_response( protocol, is_no_ion_selective=True) tst.assert_raises(AssertionError, tst.assert_array_equal, baseline_trace.y, baseline_no_ion_trace.y, 'generate_no_ion_trace() does not update trace')
def test_no_ion_selective_IK1_no_effect(self): protocol = protocols.SingleActionPotentialProtocol() paci_k1_increase = paci_2018.PaciModel( updated_parameters={'G_K1': 1.4}) ion_selective_scales = {'I_K1': .4} paci_k1_no_ion = paci_2018.PaciModel( no_ion_selective_dict=ion_selective_scales) trace_ion_selective = paci_k1_increase.generate_response(protocol) trace_no_ion_selective = paci_k1_no_ion.generate_response( protocol, is_no_ion_selective=True) tst.assert_raises(AssertionError, tst.assert_array_equal, trace_ion_selective.y, trace_no_ion_selective.y, 'generate_no_ion_trace() does not update trace')
def test_write_data(self): path_to_output = './data/paci_sap_baseline.csv' protocol = protocols.SingleActionPotentialProtocol() baseline_trace = paci_2018.generate_trace(protocol) write_voltage_data.save_data_to_file(baseline_trace) with open(path_to_output) as csv_file: csv_reader = csv.reader(csv_file) loaded_data = np.array(list(csv_reader)) print(len(loaded_data)) tst.assert_raises(AssertionError, tst.assert_array_equal, baseline_trace.y, loaded_data[:, 1], 'loaded data is equal to Paci')
def test_generate_trace_SAP(self): protocol = protocols.SingleActionPotentialProtocol(1800) baseline_model = kernik.KernikModel() baseline_model.generate_response(protocol) import seaborn as sns plt.plot(baseline_model.t, baseline_model.y_voltage) pdb.set_trace() self.assertTrue( len(baseline_model.t) > 100, 'Kernik errored in less than .4s') self.assertTrue( min(baseline_model.y_voltage) < -10, 'baseline Kernik min is greater than -.01') self.assertTrue( max(baseline_model.y_voltage) < 60, 'baseline Kernik max is greater than .06')
def plot_voltage_currents(): kernik_protocol = protocols.SingleActionPotentialProtocol(983) baseline_kernik = KernikModel() baseline_kernik.generate_response(kernik_protocol) coi = ['I_K1', 'I_Kr', 'I_Ks', 'I_CaL', 'I_Na', 'I_To'] currents_df = get_current_data(baseline_kernik.current_response_info.currents, coi, baseline_kernik.t) fig = plt.figure(figsize=(10,8)) plt.plot(baseline_kernik.t, baseline_kernik.y_voltage, label='Kernik') plt.axis([0, 983, -80, 40]) ax = plt.gca() ax.tick_params(labelsize=18) ax.tick_params(axis='x', labelcolor='none') plt.ylabel('Voltage (mV)', fontsize=20) #plt.savefig('figures/voltage.svg') plt.show()
def setUp(self): config = ga_configs.ParameterTuningConfig( population_size=2, max_generations=2, protocol=protocols.SingleActionPotentialProtocol(), tunable_parameters=[ ga_configs.Parameter(name='g_b_na', default_value=0.95), ga_configs.Parameter(name='g_na', default_value=3671.2302) ], params_lower_bound=0.9, params_upper_bound=1.1, mutate_probability=1.0, mate_probability=0.9, gene_swap_probability=0.5, gene_mutation_probability=0.15, tournament_size=2) self.ga = parameter_tuning_genetic_algorithm.\ ParameterTuningGeneticAlgorithm(config=config)
def test_update_parameters(self): protocol = protocols.SingleActionPotentialProtocol() tunable_parameters = [ ga_configs.Parameter(name='G_Na', default_value=1), ga_configs.Parameter(name='G_F', default_value=1), ga_configs.Parameter(name='G_Ks', default_value=1), ga_configs.Parameter(name='G_Kr', default_value=1), ga_configs.Parameter(name='G_K1', default_value=1), ga_configs.Parameter(name='G_bNa', default_value=1), ga_configs.Parameter(name='G_NaL', default_value=1), ga_configs.Parameter(name='G_CaL', default_value=1), ga_configs.Parameter(name='G_pCa', default_value=1), ga_configs.Parameter(name='G_bCa', default_value=1) ] new_params = [.7, .7, .7, .7, .7, .7, .7, .7, .7, .7] baseline_trace = paci_2018.generate_trace(protocol) new_trace = paci_2018.generate_trace(protocol, tunable_parameters, new_params) tst.assert_raises(AssertionError, tst.assert_array_equal, baseline_trace.y, new_trace.y, 'updating parameters does not change trace')
def main(): protocol = protocols.SingleActionPotentialProtocol() save_data_to_file(paci_2018.generate_trace(protocol)) load_and_plot_data('./data/paci_sap_baseline.csv')
def plot_baseline_single_action_potential_trace(): trace = paci_2018.generate_trace( protocol=protocols.SingleActionPotentialProtocol(duration=2)) trace.plot() plt.savefig( 'figures/Single AP Figure/baseline_single_action_potential_trace.svg')
ga_configs.Parameter(name='G_F', default_value=1), ga_configs.Parameter(name='G_Ks', default_value=1), ga_configs.Parameter(name='G_Kr', default_value=1), ga_configs.Parameter(name='G_K1', default_value=1), ga_configs.Parameter(name='G_bNa', default_value=1), ga_configs.Parameter(name='G_NaL', default_value=1), ga_configs.Parameter(name='G_CaL', default_value=1), ga_configs.Parameter(name='G_pCa', default_value=1), ga_configs.Parameter(name='G_bCa', default_value=1), ga_configs.Parameter(name='K_NaCa', default_value=1) ] # Parameters are sorted alphabetically to maintain order during each # generation of the genetic algorithm. PARAMETERS.sort(key=lambda x: x.name) SAP_PROTOCOL_KERNIK = protocols.SingleActionPotentialProtocol(1800) VC_PROTOCOL = protocols.VoltageClampProtocol(steps=[ protocols.VoltageClampStep(duration=0.050, voltage=-0.08), protocols.VoltageClampStep(duration=0.050, voltage=-0.12), protocols.VoltageClampStep(duration=0.500, voltage=-0.057), protocols.VoltageClampStep(duration=0.025, voltage=-0.04), protocols.VoltageClampStep(duration=0.075, voltage=0.02), protocols.VoltageClampStep(duration=0.025, voltage=-0.08), protocols.VoltageClampStep(duration=0.250, voltage=0.04), protocols.VoltageClampStep(duration=1.900, voltage=-0.03), protocols.VoltageClampStep(duration=0.750, voltage=0.04), protocols.VoltageClampStep(duration=1.725, voltage=-0.03), protocols.VoltageClampStep(duration=0.650, voltage=-0.08), ])
def generate_config_list(): parameters = [ ga_configs.Parameter(name='g_na', default_value=3671.2302), ga_configs.Parameter(name='g_f_s', default_value=30.10312), ] sap_protocol = protocols.SingleActionPotentialProtocol() ip_protocol = protocols.IrregularPacingProtocol(duration=3, stimulation_offsets=[0.1]) vc_protocol = protocols.VoltageClampProtocol(steps=[ protocols.VoltageClampStep(duration=0.1, voltage=-0.08), protocols.VoltageClampStep(duration=0.1, voltage=-0.12), protocols.VoltageClampStep(duration=0.5, voltage=-0.06), protocols.VoltageClampStep(duration=0.05, voltage=-0.04), protocols.VoltageClampStep(duration=0.15, voltage=0.02), protocols.VoltageClampStep(duration=0.025, voltage=-0.08), protocols.VoltageClampStep(duration=0.3, voltage=0.04) ]) sap_config = ga_configs.ParameterTuningConfig( population_size=2, max_generations=2, protocol=sap_protocol, tunable_parameters=parameters, params_lower_bound=0.5, params_upper_bound=1.5, mutate_probability=1., mate_probability=0.9, gene_swap_probability=0.5, gene_mutation_probability=0.1, tournament_size=2) ip_config = ga_configs.ParameterTuningConfig(population_size=2, max_generations=2, protocol=ip_protocol, tunable_parameters=parameters, params_lower_bound=0.5, params_upper_bound=1.5, mutate_probability=1., mate_probability=0.9, gene_swap_probability=0.5, gene_mutation_probability=0.1, tournament_size=2) vc_config = ga_configs.ParameterTuningConfig(population_size=2, max_generations=2, protocol=vc_protocol, tunable_parameters=parameters, params_lower_bound=0.5, params_upper_bound=1.5, mutate_probability=1., mate_probability=0.9, gene_swap_probability=0.5, gene_mutation_probability=0.1, tournament_size=2) combined_config = ga_configs.ParameterTuningConfig( population_size=2, max_generations=2, protocol=ip_protocol, tunable_parameters=parameters, params_lower_bound=0.5, params_upper_bound=1.5, mutate_probability=1., mate_probability=0.9, gene_swap_probability=0.5, gene_mutation_probability=0.1, tournament_size=2, secondary_protocol=vc_protocol) return [sap_config, ip_config, vc_config, combined_config]
""" ##Single Action Potential """ The SingleActionPotentialProtocol() class name is a misnomer. It should be called SpontaneousProtocol(). You initialize the protocol with: - duration: float – the amount of time you want the model to run spontaneously """ # 1. Imports from kernik import KernikModel import protocols import matplotlib.pyplot as plt DURATION = 983 # Length of Kernik AP, in milliseconds SAP_PROTOCOL_KERNIK = protocols.SingleActionPotentialProtocol(DURATION) # STOP AND OPEN ./protocols.py. Look at the SingleActionPotentialProtocol # so you understand what the kernik_protocol variable holds. baseline_kernik = KernikModel() # Initialize the baseline kernik individual baseline_kernik.generate_response(SAP_PROTOCOL_KERNIK) # Run model plt.plot(baseline_kernik.t, baseline_kernik.y_voltage) plt.show() ## ---------------------------------------------------------------------- ##VC Protocol VC_PROTOCOL = protocols.VoltageClampProtocol(steps=[ protocols.VoltageClampStep(duration=0.050, voltage=-0.08),