cbar.minorticks_on() fig.suptitle('$r_{tot}$ versus $I_{drive}$ and $I_{di}$') # plt.title(title_string) ax.set_xlabel(r'$I_{drive}$ [$\mu$A]') ax.set_ylabel(r'$I_{di}$ [$\mu$A]') plt.show() # fig.savefig('figures/'+save_str+'__log.png') #%% save data save_string = 'master_rate_matrix' data_array = dict() data_array['master_rate_matrix'] = master_rate_matrix data_array['I_drive_vec'] = I_drive_vec * 1e-6 data_array['I_di_list'] = I_di_list print('\n\nsaving session data ...') save_session_data(data_array, save_string) #%% load test data_array_imported = load_session_data( 'session_data__master_rate_matrix__2020-04-17_13-11-03.dat') I_di_list__imported = data_array_imported['I_di_list'] I_drive_vec__imported = data_array_imported['I_drive_vec'] master_rate_matrix__imported = data_array_imported['master_rate_matrix'] I_drive_sought = 23.45e-6 I_drive_sought_ind = ( np.abs(np.asarray(I_drive_vec__imported) - I_drive_sought)).argmin() I_di_sought = 14.552e-6 I_di_sought_ind = ( np.abs(np.asarray(I_di_list__imported[I_drive_sought_ind]) - I_di_sought)).argmin()
plot_dend_rate_array(I_di_array=I_di_array__scaled, I_drive_list=I_drive_list, influx_list=influx_list, master_rate_array=master_rate_array) # save data save_string = 'master_dnd_rate_array_{:1d}jj_Llft{:05.2f}_Lrgt{:05.2f}_Ide{:05.2f}'.format( num_jjs, L_left_list[pp] + 10, L_right_list[pp], I_de_list[qq]) data_array = dict() data_array['rate_array'] = master_rate_array data_array['I_drive_list'] = I_drive_list data_array['influx_list'] = influx_list data_array['I_di_array'] = I_di_array__scaled print('\n\nsaving session data ...\n\n') # save_session_data(data_array,save_string) save_session_data(data_array, save_string + '.soen', False) #%% just plot if 1 == 1: L_left = 10 L_right = 20 I_de = 70 # file_name = 'master_dnd_rate_array_{:1d}jj_Llft{:05.2f}_Lrgt{:05.2f}_Ide{:05.2f}.soen'.format(num_jjs,L_left+10,L_right,I_de) # plot_dend_rate_array(file_name = file_name) for pp in range(num_L): for qq in range(num_I_de): file_name = 'master_dnd_rate_array_{:1d}jj_Llft{:05.2f}_Lrgt{:05.2f}_Ide{:05.2f}.soen'.format(
def dendrite_model__parameter_sweep(data_file_list, L_di_vec, tau_di_vec, dt_vec, tf_vec, drive_info, amp_vec, mu1_vec, mu2_vec, mu3_vec, mu4_vec, master_error_plot_name): master_error_plot_name = 'mstr_err__' + master_error_plot_name best_params = dict() best_params['amp_mu12'] = [] best_params['amp_mu34'] = [] best_params['mu1'] = [] best_params['mu2'] = [] best_params['mu3'] = [] best_params['mu4'] = [] data_array = dict() data_array['amp_vec'] = amp_vec data_array['mu1_vec'] = mu1_vec data_array['mu2_vec'] = mu2_vec data_array['mu3_vec'] = mu3_vec data_array['mu4_vec'] = mu4_vec num_sims = len(data_file_list) num_amps = len(amp_vec) num_mu1 = len(mu1_vec) num_mu2 = len(mu2_vec) num_mu3 = len(mu3_vec) num_mu4 = len(mu4_vec) mu3_initial = 0 #1 mu4_initial = 0 #0.5 print( '\n\nrunning dendrite_model__parameter_sweep\n\nnum_files = {:d}\nnum_amps = {:d}\nnum_mu1 = {:d}\nnum_mu2 = {:d}\nnum_mu3 = {:d}\nnum_mu4 = {:d}' .format(num_sims, num_amps, num_mu1, num_mu2, num_mu3, num_mu4)) error_mat_master__mu1_mu2 = np.zeros([num_amps, num_mu1, num_mu2]) error_mat_master__mu3_mu4 = np.zeros([num_amps, num_mu3, num_mu4]) if drive_info['drive_type'] == 'piecewise_linear': pwl_drive = drive_info['pwl_drive'] directory_string = 'constant_drive' wr_drive_string = '@I0[c]' wr_target_string = 'L9#branch' if drive_info['drive_type'] == 'linear_ramp': pwl_drive = drive_info['pwl_drive'] directory_string = 'linear_ramp' wr_drive_string = '@I0[c]' wr_target_string = 'L9#branch' if drive_info['drive_type'] == 'sq_pls_trn': sq_pls_trn_params = drive_info['sq_pls_trn_params'] directory_string = 'square_pulse_sequence' wr_drive_string = '@I0[c]' wr_target_string = 'L9#branch' if drive_info['drive_type'] == 'exp_pls_trn': exp_pls_trn_params = drive_info['exp_pls_trn_params'] directory_string = 'exponential_pulse_sequence' wr_drive_string = 'L5#branch' wr_target_string = 'L10#branch' for ii in range(num_sims): print('\ndata_file {} of {}\n'.format(ii + 1, num_sims)) plt.close('all') dt = dt_vec[ii] tf = tf_vec[ii] # WR data print('reading wr data ...\n') file_name = data_file_list[ii] + '.dat' data_dict = read_wr_data('wrspice_data/' + directory_string + '/' + file_name) target_data = np.vstack( (data_dict['time'], data_dict[wr_target_string])) #---------------------- # compare drive signals #---------------------- target_data__drive = np.vstack( (data_dict['time'], data_dict[wr_drive_string])) # initialize input signal if drive_info['drive_type'] == 'piecewise_linear' or drive_info[ 'drive_type'] == 'linear_ramp': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), piecewise_linear=pwl_drive) dendritic_drive = dendritic_drive__piecewise_linear( input_1.time_vec, pwl_drive) if drive_info['drive_type'] == 'sq_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), square_pulse_train=sq_pls_trn_params) dendritic_drive = dendritic_drive__square_pulse_train( input_1.time_vec, sq_pls_trn_params) if drive_info['drive_type'] == 'exp_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), exponential_pulse_train=exp_pls_trn_params) dendritic_drive = dendritic_drive__exp_pls_train__LR( input_1.time_vec, exp_pls_trn_params) actual_data__drive = np.vstack( (input_1.time_vec[:], dendritic_drive[:, 0])) print('comparing drive signals ...\n') error__drive = chi_squared_error(target_data__drive, actual_data__drive) #------------------------ # find best amp, mu1, mu2 #------------------------ mu3 = [mu3_initial] #np.linspace([0.5,2.5,10]) mu4 = [mu4_initial] #np.linspace([0.25,1.5,10]) error_mat_1 = np.zeros([num_amps, num_mu1, num_mu2]) print('seeking amp, mu1, mu2 ...') for aa in range(num_amps): for bb in range(num_mu1): for cc in range(num_mu2): print('aa = {} of {}, bb = {} of {}, cc = {} of {}'.format( aa + 1, num_amps, bb + 1, num_mu1, cc + 1, num_mu2)) # create sim_params dictionary sim_params = dict() sim_params['amp'] = amp_vec[aa] sim_params['mu1'] = mu1_vec[bb] sim_params['mu2'] = mu2_vec[cc] sim_params['mu3'] = mu3 sim_params['mu4'] = mu4 sim_params['dt'] = dt sim_params['tf'] = tf # initialize dendrite dendrite_1 = dendrite( 'dendrite_under_test', inhibitory_or_excitatory='excitatory', circuit_inductances=[ 10e-12, 26e-12, 200e-12, 77.5e-12 ], input_synaptic_connections=[], input_synaptic_inductances=[[]], input_dendritic_connections=[], input_dendritic_inductances=[[]], input_direct_connections=['input_dendritic_drive'], input_direct_inductances=[[10e-12, 1]], thresholding_junction_critical_current=40e-6, bias_currents=[72e-6, 29e-6, 35e-6], integration_loop_self_inductance=L_di_vec[ii], integration_loop_output_inductance=0e-12, integration_loop_temporal_form='exponential', integration_loop_time_constant=tau_di_vec[ii], integration_loop_saturation_current=11.75e-6, dendrite_model_params=sim_params) dendrite_1.run_sim() actual_data = np.vstack( (input_1.time_vec[:], dendrite_1.I_di[:, 0])) error_mat_1[aa, bb, cc] = chi_squared_error( target_data, actual_data) error_mat_master__mu1_mu2 += error_mat_1 ind_best = np.where( error_mat_1 == np.amin(error_mat_1)) #error_mat.argmin() amp_best_mu12 = amp_vec[ind_best[0]][0] mu1_best = mu1_vec[ind_best[1]][0] mu2_best = mu2_vec[ind_best[2]][0] print('\n\namp_best_mu12 = {}'.format(amp_best_mu12)) print('mu1_best = {}'.format(mu1_best)) print('mu2_best = {}\n\n'.format(mu2_best)) best_params['amp_mu12'].append(amp_best_mu12) best_params['mu1'].append(mu1_best) best_params['mu2'].append(mu2_best) data_array['error_mat__amp_mu1_mu2'] = error_mat_1 #plot errors title_string = '{}\namp_best_mu12 = {:2.2f}, mu1_best = {:1.2f}, mu2_best = {:1.2f}'.format( data_file_list[ii], amp_best_mu12, mu1_best, mu2_best) save_str = '{}__error__mu1_mu2'.format(data_file_list[ii]) for aa in range(num_amps): plot_error_mat(error_mat_1[aa, :, :], mu1_vec, mu2_vec, 'mu1', 'mu2', 'amp = {}'.format(amp_vec[aa]), title_string, save_str) #repeat best one and plot if drive_info['drive_type'] == 'piecewise_linear' or drive_info[ 'drive_type'] == 'linear_ramp': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), piecewise_linear=pwl_drive) dendritic_drive = dendritic_drive__piecewise_linear( input_1.time_vec, pwl_drive) if drive_info['drive_type'] == 'sq_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), square_pulse_train=sq_pls_trn_params) dendritic_drive = dendritic_drive__square_pulse_train( input_1.time_vec, sq_pls_trn_params) if drive_info['drive_type'] == 'exp_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), exponential_pulse_train=exp_pls_trn_params) dendritic_drive = dendritic_drive__exp_pls_train__LR( input_1.time_vec, exp_pls_trn_params) sim_params = dict() sim_params['amp'] = amp_best_mu12 sim_params['mu1'] = mu1_best sim_params['mu2'] = mu2_best sim_params['mu3'] = mu3 sim_params['mu4'] = mu4 sim_params['dt'] = dt sim_params['tf'] = tf dendrite_1 = dendrite( 'dendrite_under_test', inhibitory_or_excitatory='excitatory', circuit_inductances=[10e-12, 26e-12, 200e-12, 77.5e-12], input_synaptic_connections=[], input_synaptic_inductances=[[]], input_dendritic_connections=[], input_dendritic_inductances=[[]], input_direct_connections=['input_dendritic_drive'], input_direct_inductances=[[10e-12, 1]], thresholding_junction_critical_current=40e-6, bias_currents=[72e-6, 29e-6, 35e-6], integration_loop_self_inductance=L_di_vec[ii], integration_loop_output_inductance=0e-12, integration_loop_temporal_form='exponential', integration_loop_time_constant=tau_di_vec[ii], integration_loop_saturation_current=11.75e-6, dendrite_model_params=sim_params) dendrite_1.run_sim() # plot_dendritic_integration_loop_current(dendrite_1) actual_data = np.vstack((input_1.time_vec[:], dendrite_1.I_di[:, 0])) main_title = '{}\namp_best_{:2.2f}_mu1_best_{:1.4f}_mu2_best_{:1.4f}'.format( data_file_list[ii], amp_best_mu12, mu1_best, mu2_best) error__signal = np.amin(error_mat_1) plot_wr_comparison__drive_and_response(main_title, target_data__drive, actual_data__drive, target_data, actual_data, data_file_list[ii], error__drive, error__signal) #----------------------------- # find best amp_mu34, mu3, mu4 #----------------------------- error_mat_2 = np.zeros([num_amps, num_mu3, num_mu4]) print('seeking amp, mu3, mu4 ...') for aa in range(num_amps): for bb in range(num_mu1): for cc in range(num_mu2): print('aa = {} of {}, bb = {} of {}, cc = {} of {}'.format( aa + 1, num_amps, bb + 1, num_mu3, cc + 1, num_mu4)) # initialize input signal if drive_info[ 'drive_type'] == 'piecewise_linear' or drive_info[ 'drive_type'] == 'linear_ramp': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), piecewise_linear=pwl_drive) dendritic_drive = dendritic_drive__piecewise_linear( input_1.time_vec, pwl_drive) if drive_info['drive_type'] == 'sq_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), square_pulse_train=sq_pls_trn_params) dendritic_drive = dendritic_drive__square_pulse_train( input_1.time_vec, sq_pls_trn_params) if drive_info['drive_type'] == 'exp_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), exponential_pulse_train=exp_pls_trn_params) dendritic_drive = dendritic_drive__exp_pls_train__LR( input_1.time_vec, exp_pls_trn_params) # create sim_params dictionary sim_params = dict() sim_params['amp'] = amp_vec[aa] sim_params['mu1'] = mu1_best sim_params['mu2'] = mu2_best sim_params['mu3'] = mu3_vec[bb] sim_params['mu4'] = mu4_vec[cc] sim_params['dt'] = dt sim_params['tf'] = tf # initialize dendrite dendrite_1 = dendrite( 'dendrite_under_test', inhibitory_or_excitatory='excitatory', circuit_inductances=[ 10e-12, 26e-12, 200e-12, 77.5e-12 ], input_synaptic_connections=[], input_synaptic_inductances=[[]], input_dendritic_connections=[], input_dendritic_inductances=[[]], input_direct_connections=['input_dendritic_drive'], input_direct_inductances=[[10e-12, 1]], thresholding_junction_critical_current=40e-6, bias_currents=[72e-6, 29e-6, 35e-6], integration_loop_self_inductance=L_di_vec[ii], integration_loop_output_inductance=0e-12, integration_loop_temporal_form='exponential', integration_loop_time_constant=tau_di_vec[ii], integration_loop_saturation_current=11.75e-6, dendrite_model_params=sim_params) dendrite_1.run_sim() actual_data = np.vstack( (input_1.time_vec[:], dendrite_1.I_di[:, 0])) error_mat_2[aa, bb, cc] = chi_squared_error( target_data, actual_data) error_mat_master__mu3_mu4 += error_mat_2 ind_best = np.where( error_mat_2 == np.amin(error_mat_2)) #error_mat.argmin() amp_best_mu34 = amp_vec[ind_best[0]][0] mu3_best = mu3_vec[ind_best[1]][0] mu4_best = mu4_vec[ind_best[2]][0] print('\n\namp_best_mu34 = {}'.format(amp_best_mu34)) print('mu3_best = {}'.format(mu3_best)) print('mu4_best = {}'.format(mu4_best)) best_params['amp_mu34'].append(amp_best_mu34) best_params['mu3'].append(mu3_best) best_params['mu4'].append(mu4_best) data_array['error_mat__mu3_mu4'] = error_mat_2 #plot errors title_string = '{}\namp_best_mu12 = {:2.2f}, amp_best_mu34 = {:2.2f}, mu1_best = {:1.2f}, mu2_best = {:1.2f}, mu3_best = {:1.2f}, mu4_best = {:1.2f}'.format( data_file_list[ii], amp_best_mu12, amp_best_mu34, mu1_best, mu2_best, mu3_best, mu4_best) save_str = '{}__error__mu3_mu4'.format(data_file_list[ii]) for aa in range(num_amps): plot_error_mat(error_mat_2[aa, :, :], mu3_vec, mu4_vec, 'mu3', 'mu4', 'amp = {}'.format(amp_vec[aa]), title_string, save_str) #repeat best one and plot if drive_info['drive_type'] == 'piecewise_linear' or drive_info[ 'drive_type'] == 'linear_ramp': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), piecewise_linear=pwl_drive) dendritic_drive = dendritic_drive__piecewise_linear( input_1.time_vec, pwl_drive) if drive_info['drive_type'] == 'sq_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), square_pulse_train=sq_pls_trn_params) dendritic_drive = dendritic_drive__square_pulse_train( input_1.time_vec, sq_pls_trn_params) if drive_info['drive_type'] == 'exp_pls_trn': input_1 = input_signal( 'input_dendritic_drive', input_temporal_form='analog_dendritic_drive', output_inductance=200e-12, time_vec=np.arange(0, tf + dt, dt), exponential_pulse_train=exp_pls_trn_params) dendritic_drive = dendritic_drive__exp_pls_train__LR( input_1.time_vec, exp_pls_trn_params) sim_params = dict() sim_params['amp'] = amp_best_mu34 sim_params['mu1'] = mu1_best sim_params['mu2'] = mu2_best sim_params['mu3'] = mu3_best sim_params['mu4'] = mu4_best sim_params['dt'] = dt sim_params['tf'] = tf dendrite_1 = dendrite( 'dendrite_under_test', inhibitory_or_excitatory='excitatory', circuit_inductances=[10e-12, 26e-12, 200e-12, 77.5e-12], input_synaptic_connections=[], input_synaptic_inductances=[[]], input_dendritic_connections=[], input_dendritic_inductances=[[]], input_direct_connections=['input_dendritic_drive'], input_direct_inductances=[[10e-12, 1]], thresholding_junction_critical_current=40e-6, bias_currents=[72e-6, 29e-6, 35e-6], integration_loop_self_inductance=L_di_vec[ii], integration_loop_output_inductance=0e-12, integration_loop_temporal_form='exponential', integration_loop_time_constant=tau_di_vec[ii], integration_loop_saturation_current=11.75e-6, dendrite_model_params=sim_params) dendrite_1.run_sim() main_title = '{}\namp_best_mu12_{:2.2f}_amp_best_mu34_{:2.2f}_mu1_best_{:1.2f}_mu2_best_{:1.2f}_mu3_best_{:1.2f}_mu4_best_{:1.2f}'.format( data_file_list[ii], amp_best_mu12, amp_best_mu34, mu1_best, mu2_best, mu3_best, mu4_best) actual_data = np.vstack((input_1.time_vec[:], dendrite_1.I_di[:, 0])) error__signal = np.amin(error_mat_2) plot_wr_comparison__drive_and_response(main_title, target_data__drive, actual_data__drive, target_data, actual_data, data_file_list[ii], error__drive, error__signal) # save data save_string = 'wr_fits__finding_amp_mu1_mu2+mu3_mu4' data_array['wr_spice_data_file_list'] = data_file_list data_array['best_params'] = best_params data_array['error_mat_master__mu1_mu2'] = error_mat_master__mu1_mu2 data_array['error_mat_master__mu3_mu4'] = error_mat_master__mu3_mu4 print('\n\nsaving session data ...') save_session_data(data_array, save_string) #plot errors title_string = '{}\namp_best_mu12 = {:2.2f}, amp_best_mu34 = {:2.2f}, mu1_best = {:1.2f}, mu2_best = {:1.2f}, mu3_best = {:1.2f}, mu4_best = {:1.2f}'.format( master_error_plot_name, amp_best_mu12, amp_best_mu34, mu1_best, mu2_best, mu3_best, mu4_best) for aa in range(num_amps): save_str_1 = '{}__master_error__mu1_mu2__amp_{:2.2f}'.format( master_error_plot_name, amp_vec[aa]) save_str_2 = '{}__master_error__mu3_mu4__amp_{:2.2f}'.format( master_error_plot_name, amp_vec[aa]) plot_error_mat(error_mat_master__mu1_mu2[aa, :, :], mu1_vec, mu2_vec, 'mu1', 'mu2', 'amp = {}'.format(amp_vec[aa]), title_string, save_str_1) plot_error_mat(error_mat_master__mu3_mu4[aa, :, :], mu3_vec, mu4_vec, 'mu3', 'mu4', 'amp = {}'.format(amp_vec[aa]), title_string, save_str_2) return best_params, error_mat_master__mu1_mu2, error_mat_master__mu3_mu4