def generate(reference = "SimpleNet", scale=1, format='xml'): population_size = scale_pop_size(3,scale) nml_doc, network = oc.generate_network(reference) oc.add_cell_and_channels(nml_doc, 'izhikevich/RS.cell.nml','RS') pop = oc.add_population_in_rectangular_region(network, 'RS_pop', 'RS', population_size, 0,0,0, 100,100,100) syn = oc.add_exp_two_syn(nml_doc, id="syn0", gbase="2nS", erev="0mV", tau_rise="0.5ms", tau_decay="10ms") pfs = oc.add_poisson_firing_synapse(nml_doc, id="poissonFiringSyn", average_rate="50 Hz", synapse_id=syn.id) oc.add_inputs_to_population(network, "Stim0", pop, pfs.id, all_cells=True) nml_file_name = '%s.net.nml'%network.id oc.save_network(nml_doc, nml_file_name, validate=(format=='xml'), format = format) if format=='xml': oc.generate_lems_simulation(nml_doc, network, nml_file_name, duration = 500, dt = 0.025)
def generate(reference="SimpleNet", scale=1, format='xml'): population_size = scale_pop_size(3, scale) nml_doc, network = oc.generate_network(reference) oc.add_cell_and_channels(nml_doc, 'izhikevich/RS.cell.nml', 'RS') pop = oc.add_population_in_rectangular_region(network, 'RS_pop', 'RS', population_size, 0, 0, 0, 100, 100, 100) syn = oc.add_exp_two_syn(nml_doc, id="syn0", gbase="2nS", erev="0mV", tau_rise="0.5ms", tau_decay="10ms") pfs = oc.add_poisson_firing_synapse(nml_doc, id="poissonFiringSyn", average_rate="50 Hz", synapse_id=syn.id) oc.add_inputs_to_population(network, "Stim0", pop, pfs.id, all_cells=True) nml_file_name = '%s.net.nml' % network.id oc.save_network(nml_doc, nml_file_name, validate=(format == 'xml'), format=format) if format == 'xml': oc.generate_lems_simulation(nml_doc, network, nml_file_name, duration=500, dt=0.025)
''' Generates a NeuroML 2 file with many types of cells, populations and inputs for testing purposes ''' import opencortex.build as oc nml_doc, network = oc.generate_network("Balanced") scale = .4 min_pop_size = 3 def scale_pop_size(baseline): return max(min_pop_size, int(baseline*scale)) oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/AllenInstituteCellTypesDB_HH/HH_464198958.cell.nml','HH_464198958') oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/AllenInstituteCellTypesDB_HH/HH_471141261.cell.nml','HH_471141261') #oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/BlueBrainProject_NMC/cADpyr229_L23_PC_5ecbf9b163_0_0.cell.nml', 'cADpyr229_L23_PC_5ecbf9b163_0_0') xDim = 400 yDim = 500 zDim = 300 xs = -200 ys = -150 zs = 100 ##### Synapses
import opencortex.build as oc population_size = 3 nml_doc, network = oc.generate_network("SimpleNet") oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/izhikevich/RS.cell.nml','RS') pop = oc.add_population_in_rectangular_region(network, 'RS_pop', 'RS', population_size, 0,0,0, 100,100,100) syn = oc.add_exp_two_syn(nml_doc, id="syn0", gbase="2nS", erev="0mV", tau_rise="0.5ms", tau_decay="10ms") pfs = oc.add_poisson_firing_synapse(nml_doc, id="poissonFiringSyn", average_rate="50 Hz", synapse_id=syn.id) oc.add_inputs_to_population(network, "Stim0", pop,
def RunPotjans2014(net_id='TestRunPotjans2014', neuron_params = {'cm' : 0.25, # nF 'i_offset' : 0.0, # nA 'tau_m' : 10.0, # ms 'tau_refrac': 2.0, # ms 'tau_syn_E' : 0.5, # ms 'tau_syn_I' : 0.5, # ms 'v_reset' : -65.0, # mV 'v_rest' : -65.0, # mV 'v_thresh' : -50.0, # mV 'v_init' : -58.0 # mV }, V0_mean = -58.0, V0_sd= 5.0, bg_rate=8.0, # spikes/s w_mean = 87.8e-3, # nA w_ext = 87.8e-3, # nA w_234 = 2 * 87.8e-3, # nA w_rel = 0.1, w_rel_234 = 0.05, d_mean = {'E': 1.5, 'I': 0.75}, d_sd = {'E': 0.75, 'I': 0.375}, K_ext = {'L23_E': 1600, 'L23_I': 1500, 'L4_E': 2100, 'L4_I': 1900, 'L5_E': 2000, 'L5_I': 1900, 'L6_E': 2900, 'L6_I': 2100}, full_mean_rates = {'L23_E': 0.971, 'L23_I': 2.868, 'L4_E': 4.746, 'L4_I': 5.396, 'L5_E': 8.142, 'L5_I': 9.078, 'L6_E' : 0.991, 'L6_I': 7.523}, thal_params = { # Number of neurons in thalamic population 'n_thal' : 902, # Connection probabilities 'C' : {'L23_E': 0, 'L23_I': 0, 'L4_E' : 0.0983, 'L4_I': 0.0619, 'L5_E' : 0, 'L5_I': 0, 'L6_E' : 0.0512, 'L6_I': 0.0196}, 'rate' : 120., # spikes/s; 'start' : 700., # ms 'duration' : 10. # ms; }, which_populations='all', which_pops_to_stimulate=[], scale_excitatory_cortex=0.01, scale_inhibitory_cortex=0.01, scale_thalamus=0.01, K_scaling=1.0, rel_inh_syn_w=-4.0, input_type='poisson', thalamic_input=False, build_connections=True, build_inputs=True, duration=300.0, dt=0.025, max_memory='4000M', seed=1234, simulator=None): ######################### Full-scale model ############################################################# popDictFull={} popDictFull['L23_E'] = (20683, 'L23','IF_curr_exp_L23_E','single') popDictFull['L23_I'] = (5834, 'L23','IF_curr_exp_L23_I','single') popDictFull['L4_E'] = (21915, 'L4','IF_curr_exp_L4_E','single') popDictFull['L4_I'] = (5479, 'L4','IF_curr_exp_L4_I','single') popDictFull['L5_E']= (4850,'L5','IF_curr_exp_L5_E','single') popDictFull['L5_I']= (1065,'L5','IF_curr_exp_L5_I','single') popDictFull['L6_E']= (14395,'L23','IF_curr_exp_L6_E','single') popDictFull['L6_I']= (2948,'L6','IF_curr_exp_L6_I','single') popDictFull['Thalamus']=(thal_params['n_thal'],'Thalamus','Thalamus_Input','single') pop_ids=['L23_E','L23_I','L4_E','L4_I', 'L5_E','L5_I', 'L6_E','L6_I'] n_layers = 4 n_pops_per_layer = 2 K_full = np.zeros([n_layers * n_pops_per_layer, n_layers * n_pops_per_layer]) ####################################################################################################### nml_doc, network = oc.generate_network(net_id,seed) popDict={} for cell_pop_id in popDictFull.keys(): if which_populations=='all' or cell_pop_id in which_populations: if 'Thalamus' not in cell_pop_id: popDict[cell_pop_id]=() if 'E' in cell_pop_id: popDict[cell_pop_id]=(int(round(scale_excitatory_cortex*popDictFull[cell_pop_id][0])), popDictFull[cell_pop_id][1], popDictFull[cell_pop_id][2], popDictFull[cell_pop_id][3]) if 'I' in cell_pop_id: popDict[cell_pop_id]=(int(round(scale_inhibitory_cortex*popDictFull[cell_pop_id][0])), popDictFull[cell_pop_id][1], popDictFull[cell_pop_id][2], popDictFull[cell_pop_id][3]) else: if thalamic_input: thal_tuple=(int(round(scale_thalamus*popDictFull[cell_pop_id][0])), popDictFull[cell_pop_id][1], popDictFull[cell_pop_id][2], popDictFull[cell_pop_id][3]) popDictFinal={} for cell_pop_id in popDict.keys(): if V0_mean != None and V0_sd != None: for cell_ind in range(0,popDict[cell_pop_id][0]): v0=random.gauss(V0_mean,V0_sd) new_pop_id=cell_pop_id+str(cell_ind) PyNN_cell=neuroml.IF_curr_exp(id=popDict[cell_pop_id][2]+str(cell_ind), cm=neuron_params['cm'], i_offset=neuron_params['i_offset'], tau_syn_E=neuron_params['tau_syn_E'], tau_syn_I=neuron_params['tau_syn_I'], v_init=v0, tau_m=neuron_params['tau_m'], tau_refrac=neuron_params['tau_refrac'], v_reset=neuron_params['v_reset'], v_rest=neuron_params['v_rest'], v_thresh=neuron_params['v_thresh']) nml_doc.IF_curr_exp.append(PyNN_cell) popDictFinal[new_pop_id]=(1,popDict[cell_pop_id][1],popDict[cell_pop_id][2]+str(cell_ind),popDict[cell_pop_id][3]) else: popDictFinal[cell_pop_id]=popDict[cell_pop_id] PyNN_cell=neuroml.IF_curr_exp(id=popDict[cell_pop_id][2], cm=neuron_params['cm'], i_offset=neuron_params['i_offset'], tau_syn_E=neuron_params['tau_syn_E'], tau_syn_I=neuron_params['tau_syn_I'], v_init=neuron_params['v_init'], tau_m=neuron_params['tau_m'], tau_refrac=neuron_params['tau_refrac'], v_reset=neuron_params['v_reset'], v_rest=neuron_params['v_rest'], v_thresh=neuron_params['v_thresh']) nml_doc.IF_curr_exp.append(PyNN_cell) t1=-100 t2=-150 t3=-150 t4=-300.0 t5=-300.0 t6=-300.0 t7=-200.0 t8=-200.0 boundaries={} boundaries['L1']=[0,t1] boundaries['L23']=[t1,t1+t2+t3] boundaries['L4']=[t1+t2+t3,t1+t2+t3+t4] boundaries['L5']=[t1+t2+t3+t4,t1+t2+t3+t4+t5] boundaries['L6']=[t1+t2+t3+t4+t5,t1+t2+t3+t4+t5+t6] boundaries['Thalamus']=[t1+t2+t3+t4+t5+t6+t7,t1+t2+t3+t4+t5+t6+t7+t8] xs = [0,1000] zs = [0,1000] passed_pops=oc_utils.check_pop_dict_and_layers(pop_dict=popDictFinal,boundary_dict=boundaries) if passed_pops: opencortex.print_comment_v("Population parameters were specified correctly.") #other options #pop_params=oc_utils.add_populations_in_cylindrical_layers(network,boundaries,popDictFinal,radiusOfCylinder=500,numOfSides=3) #pop_params=oc_utils.add_populations_in_cylindrical_layers(network,boundaries,popDictFinal,radiusOfCylinder=500) pop_params=oc_utils.add_populations_in_rectangular_layers(network,boundaries,popDictFinal,xs,zs) else: opencortex.print_comment_v("Population parameters were specified incorrectly; execution of RunPotjans2014.py will terminate.") quit() # Probabilities for >=1 connection between neurons in the given populations. # The first index is for the target population; the second for the source population # 2/3e 2/3i 4e 4i 5e 5i 6e 6i #pop_ids= ['L23_E','L23_I','L4_E','L4_I', 'L5_E','L5_I', 'L6_E','L6_I'] conn_probs = [[0.1009, 0.1689, 0.0437, 0.0818, 0.0323, 0., 0.0076, 0. ], [0.1346, 0.1371, 0.0316, 0.0515, 0.0755, 0., 0.0042, 0. ], [0.0077, 0.0059, 0.0497, 0.135, 0.0067, 0.0003, 0.0453, 0. ], [0.0691, 0.0029, 0.0794, 0.1597, 0.0033, 0., 0.1057, 0. ], [0.1004, 0.0622, 0.0505, 0.0057, 0.0831, 0.3726, 0.0204, 0. ], [0.0548, 0.0269, 0.0257, 0.0022, 0.06, 0.3158, 0.0086, 0. ], [0.0156, 0.0066, 0.0211, 0.0166, 0.0572, 0.0197, 0.0396, 0.2252], [0.0364, 0.001, 0.0034, 0.0005, 0.0277, 0.008, 0.0658, 0.1443]] conn_mean_w=[[w_mean, rel_inh_syn_w*w_mean, w_234 , rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean], [w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean], [w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean], [w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean], [w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean], [w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean], [w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean], [w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean, w_mean, rel_inh_syn_w*w_mean]] conn_std_w=[] for target_pop_index in range(0,len(pop_ids)): conn_std_w_per_target_pop=[] for source_pop_index in range(0,len(pop_ids)): w_val=conn_mean_w[target_pop_index][source_pop_index] if pop_ids[source_pop_index]=="L4_E" and pop_ids[target_pop_index]=="L23_E": w_sd=w_val*w_rel_234 else: w_sd=abs(w_val * w_rel) conn_std_w_per_target_pop.append(w_sd) conn_std_w.append(conn_std_w_per_target_pop) conn_mean_delay=[[d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']], [d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']], [d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']], [d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']], [d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']], [d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']], [d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']], [d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I'], d_mean['E'], d_mean['I']]] conn_std_delay=[[d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']], [d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']], [d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']], [d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']], [d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']], [d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']], [d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']], [d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I'], d_sd['E'], d_sd['I']]] syn=neuroml.ExpCurrSynapse(id='exp_curr_syn_all',tau_syn=0.5) nml_doc.exp_curr_synapses.append(syn) syn_id_matrix=[['exp_curr_syn_all']] # utils method build_probability_based_connectivity will assume that the same synapse model is shared by all projections; # however, it must be inside 'list' because generically each physical projection might contain multiple synaptic components. #### get in-degrees for all connections in the full scale model according to scaling.py in the original project for source_pop in pop_ids: for target_pop in pop_ids: n_target = popDictFull[target_pop][0] n_source = popDictFull[source_pop][0] K_full[pop_ids.index(target_pop)][pop_ids.index(source_pop)] = round(np.log(1. - conn_probs[pop_ids.index(target_pop)][pop_ids.index(source_pop)]) / np.log( (n_target * n_source - 1.) / (n_target * n_source))) / n_target input_params ={'L23_E':[{'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L23_E", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }, {'InputType':'PulseGenerators', 'InputName':"Ext_L23_E", 'Noise':False, 'AmplitudeList':[], 'DurationList':[], 'DelayList':[], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }], 'L23_I':[{'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L23_I", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }, {'InputType':'PulseGenerators', 'InputName':"Ext_L23_I", 'Noise':False, 'AmplitudeList':[], 'DurationList':[], 'DelayList':[], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }], 'L4_E':[ {'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L4_E", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }, {'InputType':'PulseGenerators', 'InputName':"Ext_L4_E", 'Noise':False, 'AmplitudeList':[], 'DurationList':[], 'DelayList':[], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }], 'L4_I':[ {'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L4_I", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1}}, {'InputType':'PulseGenerators', 'InputName':"Ext_L4_I", 'Noise':False, 'AmplitudeList':[0.0], 'DurationList':[0.0], 'DelayList':[0.0], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} } ], 'L5_E':[ {'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L5_E", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }, {'InputType':'PulseGenerators', 'InputName':"Ext_L5_E", 'Noise':False, 'AmplitudeList':[], 'DurationList':[], 'DelayList':[], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} } ], 'L5_I':[ {'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L5_I", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }, {'InputType':'PulseGenerators', 'InputName':"Ext_L5_I", 'Noise':False, 'AmplitudeList':[], 'DurationList':[], 'DelayList':[], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} } ], 'L6_E':[ {'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L6_E", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }, {'InputType':'PulseGenerators', 'InputName':"Ext_L6_E", 'Noise':False, 'AmplitudeList':[], 'DurationList':[], 'DelayList':[], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} } ], 'L6_I':[ {'InputType':'GenerateSpikeSourcePoisson', 'InputName':"EXT_L6_I", 'AverageRateList':[], 'DurationList':[], 'DelayList':[], 'WeightList':[], 'Synapse':'exp_curr_syn_all', 'RateUnits':'Hz', 'TimeUnits':'ms', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} }, {'InputType':'PulseGenerators', 'InputName':"Ext_L6_I", 'Noise':False, 'AmplitudeList':[], 'DurationList':[], 'DelayList':[], 'TimeUnits':'ms', 'AmplitudeUnits':'nA', 'FractionToTarget':1.0, 'LocationSpecific':False, 'TargetDict':{None:1} } ] } DC_amp = {} for target_pop_index in range(0,len(pop_ids)): if input_type == "DC": DC_amp[pop_ids[target_pop_index]] = bg_rate *K_ext[pop_ids[target_pop_index]] * w_mean * neuron_params['tau_syn_E'] / 1000.0 else: DC_amp[pop_ids[target_pop_index]]= 0.0 if K_scaling != 1 : for target_pop_index in range(0,len(pop_ids)): input_coefficient = 0 for source_pop_index in range(0,len(pop_ids)): input_coefficient += conn_mean_w[target_pop_index][source_pop_index] * K_full[target_pop_index][source_pop_index] * full_mean_rates[pop_ids[source_pop_index]] conn_mean_w[target_pop_index][source_pop_index] = conn_mean_w[target_pop_index][source_pop_index] / np.sqrt(K_scaling) if input_type=="poisson": input_coefficient += w_ext*K_ext[pop_ids[target_pop_index]]*bg_rate K_ext[pop_ids[target_pop_index]] = K_ext[pop_ids[target_pop_index]]*K_scaling DC_amp[pop_ids[target_pop_index]] = 0.001 * neuron_params['tau_syn_E'] * \ (1. - np.sqrt(K_scaling)) * input_coefficient + DC_amp[pop_ids[target_pop_index]] w_ext = w_ext / np.sqrt(K_scaling) input_params_final={} for target_pop_tag in input_params.keys(): found_target_pop=False for pop_id in pop_params.keys(): if target_pop_tag in pop_id: found_target_pop=True break if found_target_pop and ( (target_pop_tag in which_pops_to_stimulate) or (which_pops_to_stimulate==[])): input_params_final[target_pop_tag]=[] for input_group_ind in range(0,len(input_params[target_pop_tag])): if (input_type=='DC' or K_scaling !=1) and input_params[target_pop_tag][input_group_ind]['InputType']=='PulseGenerators': input_params[target_pop_tag][input_group_ind]['AmplitudeList'].append(DC_amp[target_pop_tag]) input_params[target_pop_tag][input_group_ind]['DurationList'].append(duration) input_params[target_pop_tag][input_group_ind]['DelayList'].append(0.0) input_params_final[target_pop_tag].append(input_params[target_pop_tag][input_group_ind]) if input_type=='poisson' and input_params[target_pop_tag][input_group_ind]['InputType']=='GenerateSpikeSourcePoisson': input_params[target_pop_tag][input_group_ind]['AverageRateList'].append(bg_rate*K_ext[target_pop_tag]) input_params[target_pop_tag][input_group_ind]['WeightList'].append(w_ext) input_params[target_pop_tag][input_group_ind]['DurationList'].append(duration) input_params[target_pop_tag][input_group_ind]['DelayList'].append(0.0) input_params_final[target_pop_tag].append(input_params[target_pop_tag][input_group_ind]) if build_connections: proj_array=oc_utils.build_probability_based_connectivity(net=network, pop_params=pop_params, probability_matrix=conn_probs, synapse_matrix=syn_id_matrix, weight_matrix=conn_mean_w, delay_matrix=conn_mean_delay, tags_on_populations=pop_ids, std_weight_matrix=conn_std_w, std_delay_matrix=conn_std_delay) if build_inputs: input_list_array_final, input_synapse_list=oc_utils.build_inputs(nml_doc=nml_doc, net=network, population_params=pop_params, input_params=input_params_final, cached_dicts=None, path_to_cells=None, path_to_synapses=None) if thalamic_input: if thal_tuple[0] != 0: if duration > thal_params['start']: start_time="%f ms"%thal_params['start'] else: start_time="0 ms" oc.add_spike_source_poisson(nml_doc, id=thal_tuple[2], start=start_time, duration="%f ms"%thal_params['duration'], rate="%f Hz"%thal_params['rate']) thalamus_pop = neuroml.Population(id='Thalamus', component=thal_tuple[2], size=thal_tuple[0] ) network.populations.append(thalamus_pop) for target_pop in thal_params['C'].keys(): for pop_id in pop_params.keys(): if target_pop in pop_id: oc.add_probabilistic_projection_list(net=network, presynaptic_population=thalamus_pop, postsynaptic_population=pop_params[pop_id]['PopObj'], synapse_list=['exp_curr_syn_all'], connection_probability=thal_params['C'][target_pop], delay = d_mean['E'], weight = w_ext, presynaptic_population_list=False, std_delay=d_sd['E'], std_weight=w_ext*w_rel) else: print("Note: thalamic_input is set to True but population was scaled down to zero, thus thalamic input will not be added.") nml_file_name = '%s.net.nml'%network.id oc.save_network(nml_doc, nml_file_name, validate=True,max_memory=max_memory) lems_file_name=oc.generate_lems_simulation(nml_doc, network, nml_file_name, duration =duration, dt =dt, include_extra_lems_files=["PyNN.xml"], gen_plots_for_all_v = False, gen_plots_for_only_populations=pop_params.keys(), gen_saves_for_all_v = False, gen_saves_for_only_populations=pop_params.keys() ) if simulator != None: opencortex.print_comment_v("Starting simulation of %s.net.nml"%net_id) oc.simulate_network(lems_file_name=lems_file_name, simulator=simulator, max_memory=max_memory)
''' Generates a deterministic NeuroML 2 file (not stochastic elements )with many types of cells, populations and inputs for testing exact spike times across simulations ''' import opencortex.build as oc nml_doc, network = oc.generate_network("Deterministic") ##### Cells oc.add_cell_and_channels(nml_doc, 'izhikevich/RS.cell.nml','RS') oc.add_cell_and_channels(nml_doc, 'iaf/iaf.cell.nml','iaf') oc.add_cell_and_channels(nml_doc, 'acnet2/pyr_4_sym_soma.cell.nml','pyr_4_sym_soma') xDim = 500 yDim = 100 zDim = 500 offset = 0 ##### Synapses synAmpa1 = oc.add_exp_two_syn(nml_doc, id="synAmpa1", gbase="1nS", erev="0mV", tau_rise="0.5ms", tau_decay="10ms") synGaba1 = oc.add_exp_two_syn(nml_doc, id="synGaba1", gbase="1nS", erev="-70mV", tau_rise="2ms", tau_decay="20ms")
''' Generates a complex NeuroML 2 file with many types of cells, populations and inputs for testing purposes ''' import opencortex.build as oc nml_doc, network = oc.generate_network("Complex") scale = 0.01 min_pop_size = 3 def scale_pop_size(baseline): return max(min_pop_size, int(baseline*scale)) ##### Cells #oc.add_cell_prototype(nml_doc, 'izhikevich/Izh_471141261.cell.nml') oc.add_cell_and_channels(nml_doc, 'izhikevich/RS.cell.nml','RS') oc.add_cell_and_channels(nml_doc, 'iaf/iaf.cell.nml','iaf') oc.add_cell_and_channels(nml_doc, 'iaf/iafRef.cell.nml','iafRef') oc.add_cell_and_channels(nml_doc, 'acnet2/pyr_4_sym_soma.cell.nml','pyr_4_sym_soma') oc.add_cell_and_channels(nml_doc, 'acnet2/pyr_4_sym.cell.nml','pyr_4_sym') xDim = 500 yDim = 100 zDim = 500 offset = 0
t7=-200.0 t8=-200.0 boundaries={} boundaries['L1']=[0,t1] boundaries['L23']=[t1,t1+t2+t3] boundaries['L4']=[t1+t2+t3,t1+t2+t3+t4] boundaries['L5']=[t1+t2+t3+t4,t1+t2+t3+t4+t5] boundaries['L6']=[t1+t2+t3+t4+t5,t1+t2+t3+t4+t5+t6] boundaries['Thalamus']=[t1+t2+t3+t4+t5+t6+t7,t1+t2+t3+t4+t5+t6+t7+t8] xs = [0,500] zs = [0,500] nml_doc, network = oc.generate_network("TestTraubBuildFull_winputs") for cellModel in popDict.keys(): oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/Thalamocortical/%s.cell.nml'%cellModel,cellModel) popObjs=oc.add_populations_in_layers(network,boundaries,popDict,xs,zs) #extra_params=[{'pre':'L23PyrRS','post':'SupBasket','weights':[0.05],'delays':[5],'synComps':['NMDA']}] input_params={'TCR':[ {'InputType':'GeneratePoissonTrains', 'InputTag':'PT', 'Layer':'Thalamus',
t7=-200.0 t8=-200.0 boundaries={} boundaries['L1']=[0,t1] boundaries['L23']=[t1,t1+t2+t3] boundaries['L4']=[t1+t2+t3,t1+t2+t3+t4] boundaries['L5']=[t1+t2+t3+t4,t1+t2+t3+t4+t5] boundaries['L6']=[t1+t2+t3+t4+t5,t1+t2+t3+t4+t5+t6] boundaries['Thalamus']=[t1+t2+t3+t4+t5+t6+t7,t1+t2+t3+t4+t5+t6+t7+t8] xs = [0,500] zs = [0,500] nml_doc, network = oc.generate_network("TestTraubDivergent") for cellModel in popDict.keys(): oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/Thalamocortical/%s.cell.nml'%cellModel,cellModel) popObjs=oc.add_populations_in_layers(network,boundaries,popDict,xs,zs) conn_dict_Traub=[] proj3={'type':'chem','PreCellGroup':'L23PyrRS','PostCellGroup':'SupBasket','SynapseList':['Syn_AMPA_SupPyr_SupFS','Syn_NMDA_RSPyr_SupFS'],'NumPerPreCell':8,'LocOnPostCell':'mid_tip_dends'} conn_dict_Traub.append(proj3)
import os,sys,inspect currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) parentdir = os.path.dirname(currentdir) sys.path.insert(0,parentdir) import opencortex.build as oc population_size0 = 2 population_size1 = 2 nml_doc, network = oc.generate_network("L23TraubDemo") oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/Thalamocortical/L23PyrRS.cell.nml','L23PyrRS') oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/Thalamocortical/SupBasket.cell.nml','SupBasket') pop_pre = oc.add_population_in_rectangular_region(network, 'pop_pre', 'L23PyrRS', population_size0, 0,0,0, 100,100,100) pop_post = oc.add_population_in_rectangular_region(network, 'pop_post', 'SupBasket', population_size1, 0,100,0, 100,200,100) syn0 = oc.add_exp_two_syn(nml_doc,
import opencortex.build as oc population_size0 = 10 population_size1 = 10 nml_doc, network = oc.generate_network("SpikingNet") oc.add_cell_and_channels(nml_doc, 'izhikevich/RS.cell.nml','RS') pop_pre = oc.add_population_in_rectangular_region(network, 'pop_pre', 'RS', population_size0, 0,0,0, 100,100,100) pop_post = oc.add_population_in_rectangular_region(network, 'pop_post', 'RS', population_size1, 0,100,0, 100,200,100) syn0 = oc.add_exp_two_syn(nml_doc, id="syn0", gbase="1nS", erev="0mV", tau_rise="0.5ms", tau_decay="10ms")
def generate(reference = "ACNet", num_pyr = 48, num_bask = 12, scalex=1, scaley=1, scalez=1, connections=True, global_delay = 0, duration = 300, segments_to_plot_record = {'pop_pyr':[0],'pop_bask':[0]}, format='xml'): nml_doc, network = oc.generate_network(reference) oc.add_cell_and_channels(nml_doc, 'acnet2/pyr_4_sym.cell.nml','pyr_4_sym') oc.add_cell_and_channels(nml_doc, 'acnet2/bask.cell.nml','bask') xDim = 500*scalex yDim = 50*scaley zDim = 500*scalez pop_pyr = oc.add_population_in_rectangular_region(network, 'pop_pyr', 'pyr_4_sym', num_pyr, 0,0,0, xDim,yDim,zDim) pop_bask = oc.add_population_in_rectangular_region(network, 'pop_bask', 'bask', num_bask, 0,yDim,0, xDim,yDim+yDim,zDim) ampa_syn = oc.add_exp_two_syn(nml_doc, id="AMPA_syn", gbase="30e-9S", erev="0mV", tau_rise="0.003s", tau_decay="0.0031s") ampa_syn_inh = oc.add_exp_two_syn(nml_doc, id="AMPA_syn_inh", gbase="0.15e-9S", erev="0mV", tau_rise="0.003s", tau_decay="0.0031s") gaba_syn = oc.add_exp_two_syn(nml_doc, id="GABA_syn", gbase="0.6e-9S", erev="-0.080V", tau_rise="0.005s", tau_decay="0.012s") gaba_syn_inh = oc.add_exp_two_syn(nml_doc, id="GABA_syn_inh", gbase="0S", erev="-0.080V", tau_rise="0.003s", tau_decay="0.008s") pfs = oc.add_poisson_firing_synapse(nml_doc, id="poissonFiringSyn", average_rate="30 Hz", synapse_id=ampa_syn.id) oc.add_inputs_to_population(network, "Stim0", pop_pyr, pfs.id, all_cells=True) total_conns = 0 if connections: this_syn=ampa_syn.id proj = oc.add_chem_projection0(nml_doc, network, "Proj_pyr_pyr", pop_pyr, pop_pyr, targeting_mode='convergent', synapse_list=[this_syn], pre_segment_group = 'soma_group', post_segment_group = 'dendrite_group', number_conns_per_cell=7, delays_dict = {this_syn:global_delay}) if proj: total_conns += len(proj[0].connection_wds) this_syn=ampa_syn_inh.id proj = oc.add_chem_projection0(nml_doc, network, "Proj_pyr_bask", pop_pyr, pop_bask, targeting_mode='convergent', synapse_list=[this_syn], pre_segment_group = 'soma_group', post_segment_group = 'all', number_conns_per_cell=21, delays_dict = {this_syn:global_delay}) if proj: total_conns += len(proj[0].connection_wds) this_syn=gaba_syn.id proj = oc.add_chem_projection0(nml_doc, network, "Proj_bask_pyr", pop_bask, pop_pyr, targeting_mode='convergent', synapse_list=[this_syn], pre_segment_group = 'soma_group', post_segment_group = 'all', number_conns_per_cell=21, delays_dict = {this_syn:global_delay}) if proj: total_conns += len(proj[0].connection_wds) this_syn=gaba_syn_inh.id proj = oc.add_chem_projection0(nml_doc, network, "Proj_bask_bask", pop_bask, pop_bask, targeting_mode='convergent', synapse_list=[this_syn], pre_segment_group = 'soma_group', post_segment_group = 'all', number_conns_per_cell=5, delays_dict = {this_syn:global_delay}) if proj: total_conns += len(proj[0].connection_wds) if num_pyr != 48 or num_bask!=12: new_reference = '%s_%scells_%sconns'%(nml_doc.id,num_pyr+num_bask,total_conns) network.id = new_reference nml_doc.id = new_reference nml_file_name = '%s.net.%s'%(network.id,'nml.h5' if format == 'hdf5' else 'nml') oc.save_network(nml_doc, nml_file_name, validate=(format=='xml'), format = format) if format=='xml': gen_plots_for_quantities = {} # Dict with displays vs lists of quantity paths gen_saves_for_quantities = {} # Dict with file names vs lists of quantity paths for pop in segments_to_plot_record.keys(): pop_nml = network.get_by_id(pop) if pop_nml is not None and pop_nml.size>0: group = len(segments_to_plot_record[pop]) == 1 if group: display = 'Display_%s_v'%(pop) file_ = 'Sim_%s.%s.v.dat'%(nml_doc.id,pop) gen_plots_for_quantities[display] = [] gen_saves_for_quantities[file_] = [] for i in range(int(pop_nml.size)): if not group: display = 'Display_%s_%i_v'%(pop,i) file_ = 'Sim_%s.%s.%i.v.dat'%(nml_doc.id,pop,i) gen_plots_for_quantities[display] = [] gen_saves_for_quantities[file_] = [] for seg in segments_to_plot_record[pop]: quantity = '%s/%i/%s/%i/v'%(pop,i,pop_nml.component,seg) gen_plots_for_quantities[display].append(quantity) gen_saves_for_quantities[file_].append(quantity) lems_file_name = oc.generate_lems_simulation(nml_doc, network, nml_file_name, duration = duration, dt = 0.025, gen_plots_for_all_v = False, gen_plots_for_quantities = gen_plots_for_quantities, gen_saves_for_all_v = False, gen_saves_for_quantities = gen_saves_for_quantities) else: lems_file_name = None return nml_doc, nml_file_name, lems_file_name
def RunColumnSimulation( net_id="TestRunColumn", nml2_source_dir="../../../neuroConstruct/generatedNeuroML2/", sim_config="TempSimConfig", scale_cortex=0.1, scale_thalamus=0.1, cell_bodies_overlap=True, cylindrical=True, default_synaptic_delay=0.05, gaba_scaling=1.0, l4ss_ampa_scaling=1.0, l5pyr_gap_scaling=1.0, in_nrt_tcr_nmda_scaling=1.0, pyr_ss_nmda_scaling=1.0, deep_bias_current=-1, include_gap_junctions=True, which_models='all', dir_nml2="../../", duration=300, dt=0.025, max_memory='1000M', seed=1234, simulator=None, num_of_cylinder_sides=None): popDictFull = {} ############## Full model ################################## popDictFull['CG3D_L23PyrRS'] = (1000, 'L23', 'L23PyrRS', 'multi') popDictFull['CG3D_SupBask'] = (90, 'L23', 'SupBasket', 'multi') popDictFull['CG3D_SupAxAx'] = (90, 'L23', 'SupAxAx', 'multi') popDictFull['CG3D_L5TuftIB'] = (800, 'L5', 'L5TuftedPyrIB', 'multi') popDictFull['CG3D_L5TuftRS'] = (200, 'L5', 'L5TuftedPyrRS', 'multi') popDictFull['CG3D_L4SpinStell'] = (240, 'L4', 'L4SpinyStellate', 'multi') popDictFull['CG3D_L23PyrFRB'] = (50, 'L23', 'L23PyrFRB_varInit', 'multi') popDictFull['CG3D_L6NonTuftRS'] = (500, 'L6', 'L6NonTuftedPyrRS', 'multi') popDictFull['CG3D_DeepAxAx'] = (100, 'L6', 'DeepAxAx', 'multi') popDictFull['CG3D_DeepBask'] = (100, 'L6', 'DeepBasket', 'multi') popDictFull['CG3D_DeepLTS'] = (100, 'L6', 'DeepLTSInter', 'multi') popDictFull['CG3D_SupLTS'] = (90, 'L23', 'SupLTSInter', 'multi') popDictFull['CG3D_nRT'] = (100, 'Thalamus', 'nRT', 'multi') popDictFull['CG3D_TCR'] = (100, 'Thalamus', 'TCR', 'multi') ############################################################### dir_to_cells = os.path.join(dir_nml2, "cells") dir_to_synapses = os.path.join(dir_nml2, "synapses") dir_to_gap_junctions = os.path.join(dir_nml2, "gapJunctions") popDict = {} cell_model_list = [] cell_diameter_dict = {} nml_doc, network = oc.generate_network(net_id, seed) for cell_population in popDictFull.keys(): include_cell_population = False cell_model = popDictFull[cell_population][2] if which_models == 'all' or cell_model in which_models: popDict[cell_population] = () if popDictFull[cell_population][1] != 'Thalamus': popDict[cell_population] = (int( round(scale_cortex * popDictFull[cell_population][0])), popDictFull[cell_population][1], popDictFull[cell_population][2], popDictFull[cell_population][3]) cell_count = int( round(scale_cortex * popDictFull[cell_population][0])) else: popDict[cell_population] = (int( round(scale_thalamus * popDictFull[cell_population][0])), popDictFull[cell_population][1], popDictFull[cell_population][2], popDictFull[cell_population][3]) cell_count = int( round(scale_thalamus * popDictFull[cell_population][0])) if cell_count != 0: include_cell_population = True if include_cell_population: cell_model_list.append(popDictFull[cell_population][2]) cell_diameter = oc.get_soma_diameter( popDictFull[cell_population][2], dir_to_cell=dir_to_cells) if popDictFull[cell_population][2] not in cell_diameter_dict.keys( ): cell_diameter_dict[popDictFull[cell_population] [2]] = cell_diameter cell_model_list_final = list(set(cell_model_list)) opencortex.print_comment_v("This is a final list of cell model ids: %s" % cell_model_list_final) copy_nml2_from_source = False for cell_model in cell_model_list_final: if not os.path.exists( os.path.join(dir_to_cells, "%s.cell.nml" % cell_model)): copy_nml2_from_source = True break if copy_nml2_from_source: oc.copy_nml2_source(dir_to_project_nml2=dir_nml2, primary_nml2_dir=nml2_source_dir, electrical_synapse_tags=['Elect'], chemical_synapse_tags=['.synapse.'], extra_channel_tags=['cad']) passed_includes_in_cells = oc_utils.check_includes_in_cells( dir_to_cells, cell_model_list_final, extra_channel_tags=['cad']) if not passed_includes_in_cells: opencortex.print_comment_v( "Execution of RunColumn.py will terminate.") quit() for cell_model in cell_model_list_final: oc.add_cell_and_channels(nml_doc, os.path.join(dir_to_cells, "%s.cell.nml" % cell_model), cell_model, use_prototypes=False) t1 = -0 t2 = -250 t3 = -250 t4 = -200.0 t5 = -300.0 t6 = -300.0 t7 = -200.0 t8 = -200.0 boundaries = {} boundaries['L1'] = [0, t1] boundaries['L23'] = [t1, t1 + t2 + t3] boundaries['L4'] = [t1 + t2 + t3, t1 + t2 + t3 + t4] boundaries['L5'] = [t1 + t2 + t3 + t4, t1 + t2 + t3 + t4 + t5] boundaries['L6'] = [t1 + t2 + t3 + t4 + t5, t1 + t2 + t3 + t4 + t5 + t6] boundaries['Thalamus'] = [ t1 + t2 + t3 + t4 + t5 + t6 + t7, t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8 ] xs = [0, 500] zs = [0, 500] passed_pops = oc_utils.check_pop_dict_and_layers(pop_dict=popDict, boundary_dict=boundaries) if passed_pops: opencortex.print_comment_v( "Population parameters were specified correctly.") if cylindrical: pop_params = oc_utils.add_populations_in_cylindrical_layers( network, boundaries, popDict, radiusOfCylinder=250, cellBodiesOverlap=cell_bodies_overlap, cellDiameterArray=cell_diameter_dict, numOfSides=num_of_cylinder_sides) else: pop_params = oc_utils.add_populations_in_rectangular_layers( network, boundaries, popDict, xs, zs, cellBodiesOverlap=False, cellDiameterArray=cell_diameter_dict) else: opencortex.print_comment_v( "Population parameters were specified incorrectly; execution of RunColumn.py will terminate." ) quit() src_files = os.listdir("./") if 'netConnList' in src_files: full_path_to_connectivity = 'netConnList' else: full_path_to_connectivity = "../../../neuroConstruct/pythonScripts/netbuild/netConnList" weight_params = [{ 'weight': gaba_scaling, 'synComp': 'GABAA', 'synEndsWith': [], 'targetCellGroup': [] }, { 'weight': l4ss_ampa_scaling, 'synComp': 'Syn_AMPA_L4SS_L4SS', 'synEndsWith': [], 'targetCellGroup': [] }, { 'weight': l5pyr_gap_scaling, 'synComp': 'Syn_Elect_DeepPyr_DeepPyr', 'synEndsWith': [], 'targetCellGroup': ['CG3D_L5'] }, { 'weight': in_nrt_tcr_nmda_scaling, 'synComp': 'NMDA', 'synEndsWith': [ "_IN", "_DeepIN", "_SupIN", "_SupFS", "_DeepFS", "_SupLTS", "_DeepLTS", "_nRT", "_TCR" ], 'targetCellGroup': [] }, { 'weight': pyr_ss_nmda_scaling, 'synComp': 'NMDA', 'synEndsWith': [ "_IN", "_DeepIN", "_SupIN", "_SupFS", "_DeepFS", "_SupLTS", "_DeepLTS", "_nRT", "_TCR" ], 'targetCellGroup': [] }] delay_params = [{'delay': default_synaptic_delay, 'synComp': 'all'}] passed_weight_params = oc_utils.check_weight_params(weight_params) passed_delay_params = oc_utils.check_delay_params(delay_params) if passed_weight_params and passed_delay_params: opencortex.print_comment_v( "Synaptic weight and delay parameters were specified correctly.") ignore_synapses = [] if not include_gap_junctions: ignore_synapses = [ 'Syn_Elect_SupPyr_SupPyr', 'Syn_Elect_CortIN_CortIN', 'Syn_Elect_L4SS_L4SS', 'Syn_Elect_DeepPyr_DeepPyr', 'Syn_Elect_nRT_nRT' ] all_synapse_components, projArray, cached_segment_dicts = oc_utils.build_connectivity( net=network, pop_objects=pop_params, path_to_cells=dir_to_cells, full_path_to_conn_summary=full_path_to_connectivity, pre_segment_group_info=[{ 'PreSegGroup': "distal_axon", 'ProjType': 'Chem' }], synaptic_scaling_params=weight_params, synaptic_delay_params=delay_params, ignore_synapses=ignore_synapses) else: if not passed_weight_params: opencortex.print_comment_v( "Synaptic weight parameters were specified incorrectly; execution of RunColumn.py will terminate." ) if not passed_delay_params: opencortex.print_comment_v( "Synaptic delay parameters were specified incorrectly; execution of RunColumn.py will terminate." ) quit() ############ for testing only; will add original specifications later ############################################################## if sim_config == "Testing1": input_params = { 'CG3D_L23PyrRS': [{ 'InputType': 'GeneratePoissonTrains', 'InputName': 'Poi_CG3D_L23PyrRS', 'TrainType': 'transient', 'Synapse': 'Syn_AMPA_SupPyr_SupPyr', 'AverageRateList': [200.0, 150.0], 'RateUnits': 'Hz', 'TimeUnits': 'ms', 'DurationList': [100.0, 50.0], 'DelayList': [50.0, 200.0], 'FractionToTarget': 1.0, 'LocationSpecific': False, 'TargetDict': { 'soma_group': 1 } }] } ################################################################################################################################### if sim_config == "Testing2": input_params_final = { 'CG3D_L23PyrRS': [{ 'InputType': 'PulseGenerators', 'InputName': "DepCurr_L23RS", 'Noise': True, 'SmallestAmplitudeList': [5.0E-5, 1.0E-5], 'LargestAmplitudeList': [1.0E-4, 2.0E-5], 'DurationList': [20000.0, 20000.0], 'DelayList': [0.0, 20000.0], 'TimeUnits': 'ms', 'AmplitudeUnits': 'uA', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'TargetDict': { 'dendrite_group': 1 } }] } if sim_config == "TempSimConfig": input_params = { 'CG3D_L23PyrRS': [{ 'InputType': 'PulseGenerators', 'InputName': "DepCurr_L23RS", 'Noise': True, 'SmallestAmplitudeList': [5.0E-5], 'LargestAmplitudeList': [1.0E-4], 'DurationList': [20000.0], 'DelayList': [0.0], 'TimeUnits': 'ms', 'AmplitudeUnits': 'uA', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 0, 'UniversalFractionAlong': 0.5 }, { 'InputType': 'GeneratePoissonTrains', 'InputName': "BackgroundL23RS", 'TrainType': 'persistent', 'Synapse': 'Syn_AMPA_SupPyr_SupPyr', 'AverageRateList': [30.0], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'TargetDict': { 'dendrite_group': 100 } }, { 'InputType': 'GeneratePoissonTrains', 'InputName': "EctopicStimL23RS", 'TrainType': 'persistent', 'Synapse': 'SynForEctStim', 'AverageRateList': [0.1], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 143, 'UniversalFractionAlong': 0.5 }], 'CG3D_TCR': [{ 'InputType': 'GeneratePoissonTrains', 'InputName': "EctopicStimTCR", 'TrainType': 'persistent', 'Synapse': 'SynForEctStim', 'AverageRateList': [1.0], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 269, 'UniversalFractionAlong': 0.5 }, { 'InputType': 'GeneratePoissonTrains', 'InputName': "Input_20", 'TrainType': 'persistent', 'Synapse': 'Syn_AMPA_L6NT_TCR', 'AverageRateList': [50.0], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'TargetDict': { 'dendrite_group': 100 } }], 'CG3D_L23PyrFRB': [{ 'InputType': 'GeneratePoissonTrains', 'InputName': "EctopicStimL23FRB", 'TrainType': 'persistent', 'Synapse': 'SynForEctStim', 'AverageRateList': [0.1], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 143, 'UniversalFractionAlong': 0.5 }, { 'InputType': 'PulseGenerators', 'InputName': "DepCurr_L23FRB", 'Noise': True, 'SmallestAmplitudeList': [2.5E-4], 'LargestAmplitudeList': [3.5E-4], 'DurationList': [20000.0], 'DelayList': [0.0], 'TimeUnits': 'ms', 'AmplitudeUnits': 'uA', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 0, 'UniversalFractionAlong': 0.5 }], 'CG3D_L6NonTuftRS': [{ 'InputType': 'GeneratePoissonTrains', 'InputName': "EctopicStimL6NT", 'TrainType': 'persistent', 'Synapse': 'SynForEctStim', 'AverageRateList': [1.0], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 95, 'UniversalFractionAlong': 0.5 }, { 'InputType': 'PulseGenerators', 'InputName': "DepCurr_L6NT", 'Noise': True, 'SmallestAmplitudeList': [5.0E-5], 'LargestAmplitudeList': [1.0E-4], 'DurationList': [20000.0], 'DelayList': [0.0], 'TimeUnits': 'ms', 'AmplitudeUnits': 'uA', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 0, 'UniversalFractionAlong': 0.5 }], 'CG3D_L4SpinStell': [{ 'InputType': 'PulseGenerators', 'InputName': "DepCurr_L4SS", 'Noise': True, 'SmallestAmplitudeList': [5.0E-5], 'LargestAmplitudeList': [1.0E-4], 'DurationList': [20000.0], 'DelayList': [0.0], 'TimeUnits': 'ms', 'AmplitudeUnits': 'uA', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 0, 'UniversalFractionAlong': 0.5 }], 'CG3D_L5TuftIB': [{ 'InputType': 'GeneratePoissonTrains', 'InputName': "BackgroundL5", 'TrainType': 'persistent', 'Synapse': 'Syn_AMPA_L5RS_L5Pyr', 'AverageRateList': [30.0], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'TargetDict': { 'dendrite_group': 100 } }, { 'InputType': 'GeneratePoissonTrains', 'InputName': "EctopicStimL5IB", 'TrainType': 'persistent', 'Synapse': 'SynForEctStim', 'AverageRateList': [1.0], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 119, 'UniversalFractionAlong': 0.5 }, { 'InputType': 'PulseGenerators', 'InputName': "DepCurr_L5IB", 'Noise': True, 'SmallestAmplitudeList': [5.0E-5], 'LargestAmplitudeList': [1.0E-4], 'DurationList': [20000.0], 'DelayList': [0.0], 'TimeUnits': 'ms', 'AmplitudeUnits': 'uA', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 0, 'UniversalFractionAlong': 0.5 }], 'CG3D_L5TuftRS': [{ 'InputType': 'GeneratePoissonTrains', 'InputName': "EctopicStimL5RS", 'TrainType': 'persistent', 'Synapse': 'SynForEctStim', 'AverageRateList': [1.0], 'RateUnits': 'Hz', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 119, 'UniversalFractionAlong': 0.5 }, { 'InputType': 'PulseGenerators', 'InputName': "DepCurr_L5RS", 'Noise': True, 'SmallestAmplitudeList': [5.0E-5], 'LargestAmplitudeList': [1.0E-4], 'DurationList': [20000.0], 'DelayList': [0.0], 'TimeUnits': 'ms', 'AmplitudeUnits': 'uA', 'FractionToTarget': 1.0, 'LocationSpecific': False, 'UniversalTargetSegmentID': 0, 'UniversalFractionAlong': 0.5 }] } input_params_final = {} for pop_id in pop_params.keys(): if pop_id in input_params.keys(): input_params_final[pop_id] = input_params[pop_id] if deep_bias_current >= 0: for cell_group in input_params_final.keys(): for input_group in range(0, len(input_params_final[cell_group])): check_type = input_params_final[cell_group][input_group][ 'InputType'] == "PulseGenerators" check_group_1 = cell_group == "CG3D_L5TuftIB" check_group_2 = cell_group == "CG3D_L5TuftRS" check_group_3 = cell_group == "CG3D_L6NonTuftRS" if check_type and (check_group_1 or check_group_2 or check_group_3): opencortex.print_comment_v( "Changing offset current in 'PulseGenerators' for %s to %f" % (cell_group, deep_bias_current)) input_params_final[cell_group][input_group][ 'SmallestAmplitudeList'] = [ (deep_bias_current - 0.05) / 1000 ] input_params_final[cell_group][input_group][ 'LargestAmplitudeList'] = [ (deep_bias_current + 0.05) / 1000 ] input_list_array_final, input_synapse_list = oc_utils.build_inputs( nml_doc=nml_doc, net=network, population_params=pop_params, input_params=input_params_final, cached_dicts=cached_segment_dicts, path_to_cells=dir_to_cells, path_to_synapses=dir_to_synapses) #################################################################################################################################### for input_synapse in input_synapse_list: if input_synapse not in all_synapse_components: all_synapse_components.append(input_synapse) synapse_list = [] gap_junction_list = [] for syn_ind in range(0, len(all_synapse_components)): if 'Elect' not in all_synapse_components[syn_ind]: synapse_list.append(all_synapse_components[syn_ind]) all_synapse_components[syn_ind] = os.path.join( net_id, all_synapse_components[syn_ind] + ".synapse.nml") else: gap_junction_list.append(all_synapse_components[syn_ind]) all_synapse_components[syn_ind] = os.path.join( net_id, all_synapse_components[syn_ind] + ".nml") oc.add_synapses(nml_doc, dir_to_synapses, synapse_list, synapse_tag=True) oc.add_synapses(nml_doc, dir_to_gap_junctions, gap_junction_list, synapse_tag=False) nml_file_name = '%s.net.nml' % network.id oc.save_network(nml_doc, nml_file_name, validate=True, max_memory=max_memory) oc.remove_component_dirs(dir_to_project_nml2="%s" % network.id, list_of_cell_ids=cell_model_list_final, extra_channel_tags=['cad']) lems_file_name = oc.generate_lems_simulation( nml_doc, network, nml_file_name, duration=duration, dt=dt, include_extra_lems_files=all_synapse_components) if simulator != None: opencortex.print_comment_v("Starting simulation of %s.net.nml" % net_id) oc.simulate_network(lems_file_name=lems_file_name, simulator=simulator, max_memory=max_memory)
def RunColumnSimulation( net_id="TestRunColumn", nml2_source_dir="../../../neuroConstruct/generatedNeuroML2/", sim_config="TempSimConfig", scale_cortex=0.1, scale_thalamus=0.1, cell_bodies_overlap=True, cylindrical=True, default_synaptic_delay=0.05, gaba_scaling=1.0, l4ss_ampa_scaling=1.0, l5pyr_gap_scaling=1.0, in_nrt_tcr_nmda_scaling=1.0, pyr_ss_nmda_scaling=1.0, deep_bias_current=-1, include_gap_junctions=True, which_models="all", dir_nml2="../../", duration=300, dt=0.025, max_memory="1000M", seed=1234, simulator=None, num_of_cylinder_sides=None, ): popDictFull = {} ############## Full model ################################## popDictFull["CG3D_L23PyrRS"] = (1000, "L23", "L23PyrRS", "multi") popDictFull["CG3D_SupBask"] = (90, "L23", "SupBasket", "multi") popDictFull["CG3D_SupAxAx"] = (90, "L23", "SupAxAx", "multi") popDictFull["CG3D_L5TuftIB"] = (800, "L5", "L5TuftedPyrIB", "multi") popDictFull["CG3D_L5TuftRS"] = (200, "L5", "L5TuftedPyrRS", "multi") popDictFull["CG3D_L4SpinStell"] = (240, "L4", "L4SpinyStellate", "multi") popDictFull["CG3D_L23PyrFRB"] = (50, "L23", "L23PyrFRB_varInit", "multi") popDictFull["CG3D_L6NonTuftRS"] = (500, "L6", "L6NonTuftedPyrRS", "multi") popDictFull["CG3D_DeepAxAx"] = (100, "L6", "DeepAxAx", "multi") popDictFull["CG3D_DeepBask"] = (100, "L6", "DeepBasket", "multi") popDictFull["CG3D_DeepLTS"] = (100, "L6", "DeepLTSInter", "multi") popDictFull["CG3D_SupLTS"] = (90, "L23", "SupLTSInter", "multi") popDictFull["CG3D_nRT"] = (100, "Thalamus", "nRT", "multi") popDictFull["CG3D_TCR"] = (100, "Thalamus", "TCR", "multi") ############################################################### dir_to_cells = os.path.join(dir_nml2, "cells") dir_to_synapses = os.path.join(dir_nml2, "synapses") dir_to_gap_junctions = os.path.join(dir_nml2, "gapJunctions") popDict = {} cell_model_list = [] cell_diameter_dict = {} nml_doc, network = oc.generate_network(net_id, seed) for cell_population in popDictFull.keys(): include_cell_population = False cell_model = popDictFull[cell_population][2] if which_models == "all" or cell_model in which_models: popDict[cell_population] = () if popDictFull[cell_population][1] != "Thalamus": popDict[cell_population] = ( int(round(scale_cortex * popDictFull[cell_population][0])), popDictFull[cell_population][1], popDictFull[cell_population][2], popDictFull[cell_population][3], ) cell_count = int(round(scale_cortex * popDictFull[cell_population][0])) else: popDict[cell_population] = ( int(round(scale_thalamus * popDictFull[cell_population][0])), popDictFull[cell_population][1], popDictFull[cell_population][2], popDictFull[cell_population][3], ) cell_count = int(round(scale_thalamus * popDictFull[cell_population][0])) if cell_count != 0: include_cell_population = True if include_cell_population: cell_model_list.append(popDictFull[cell_population][2]) cell_diameter = oc.get_soma_diameter(popDictFull[cell_population][2], dir_to_cell=dir_to_cells) if popDictFull[cell_population][2] not in cell_diameter_dict.keys(): cell_diameter_dict[popDictFull[cell_population][2]] = cell_diameter cell_model_list_final = list(set(cell_model_list)) opencortex.print_comment_v("This is a final list of cell model ids: %s" % cell_model_list_final) copy_nml2_from_source = False for cell_model in cell_model_list_final: if not os.path.exists(os.path.join(dir_to_cells, "%s.cell.nml" % cell_model)): copy_nml2_from_source = True break if copy_nml2_from_source: oc.copy_nml2_source( dir_to_project_nml2=dir_nml2, primary_nml2_dir=nml2_source_dir, electrical_synapse_tags=["Elect"], chemical_synapse_tags=[".synapse."], extra_channel_tags=["cad"], ) passed_includes_in_cells = oc_utils.check_includes_in_cells( dir_to_cells, cell_model_list_final, extra_channel_tags=["cad"] ) if not passed_includes_in_cells: opencortex.print_comment_v("Execution of RunColumn.py will terminate.") quit() for cell_model in cell_model_list_final: oc.add_cell_and_channels( nml_doc, os.path.join(dir_to_cells, "%s.cell.nml" % cell_model), cell_model, use_prototypes=False ) t1 = -0 t2 = -250 t3 = -250 t4 = -200.0 t5 = -300.0 t6 = -300.0 t7 = -200.0 t8 = -200.0 boundaries = {} boundaries["L1"] = [0, t1] boundaries["L23"] = [t1, t1 + t2 + t3] boundaries["L4"] = [t1 + t2 + t3, t1 + t2 + t3 + t4] boundaries["L5"] = [t1 + t2 + t3 + t4, t1 + t2 + t3 + t4 + t5] boundaries["L6"] = [t1 + t2 + t3 + t4 + t5, t1 + t2 + t3 + t4 + t5 + t6] boundaries["Thalamus"] = [t1 + t2 + t3 + t4 + t5 + t6 + t7, t1 + t2 + t3 + t4 + t5 + t6 + t7 + t8] xs = [0, 500] zs = [0, 500] passed_pops = oc_utils.check_pop_dict_and_layers(pop_dict=popDict, boundary_dict=boundaries) if passed_pops: opencortex.print_comment_v("Population parameters were specified correctly.") if cylindrical: pop_params = oc_utils.add_populations_in_cylindrical_layers( network, boundaries, popDict, radiusOfCylinder=250, cellBodiesOverlap=cell_bodies_overlap, cellDiameterArray=cell_diameter_dict, numOfSides=num_of_cylinder_sides, ) else: pop_params = oc_utils.add_populations_in_rectangular_layers( network, boundaries, popDict, xs, zs, cellBodiesOverlap=False, cellDiameterArray=cell_diameter_dict ) else: opencortex.print_comment_v( "Population parameters were specified incorrectly; execution of RunColumn.py will terminate." ) quit() src_files = os.listdir("./") if "netConnList" in src_files: full_path_to_connectivity = "netConnList" else: full_path_to_connectivity = "../../../neuroConstruct/pythonScripts/netbuild/netConnList" weight_params = [ {"weight": gaba_scaling, "synComp": "GABAA", "synEndsWith": [], "targetCellGroup": []}, {"weight": l4ss_ampa_scaling, "synComp": "Syn_AMPA_L4SS_L4SS", "synEndsWith": [], "targetCellGroup": []}, { "weight": l5pyr_gap_scaling, "synComp": "Syn_Elect_DeepPyr_DeepPyr", "synEndsWith": [], "targetCellGroup": ["CG3D_L5"], }, { "weight": in_nrt_tcr_nmda_scaling, "synComp": "NMDA", "synEndsWith": ["_IN", "_DeepIN", "_SupIN", "_SupFS", "_DeepFS", "_SupLTS", "_DeepLTS", "_nRT", "_TCR"], "targetCellGroup": [], }, { "weight": pyr_ss_nmda_scaling, "synComp": "NMDA", "synEndsWith": ["_IN", "_DeepIN", "_SupIN", "_SupFS", "_DeepFS", "_SupLTS", "_DeepLTS", "_nRT", "_TCR"], "targetCellGroup": [], }, ] delay_params = [{"delay": default_synaptic_delay, "synComp": "all"}] passed_weight_params = oc_utils.check_weight_params(weight_params) passed_delay_params = oc_utils.check_delay_params(delay_params) if passed_weight_params and passed_delay_params: opencortex.print_comment_v("Synaptic weight and delay parameters were specified correctly.") ignore_synapses = [] if not include_gap_junctions: ignore_synapses = [ "Syn_Elect_SupPyr_SupPyr", "Syn_Elect_CortIN_CortIN", "Syn_Elect_L4SS_L4SS", "Syn_Elect_DeepPyr_DeepPyr", "Syn_Elect_nRT_nRT", ] all_synapse_components, projArray, cached_segment_dicts = oc_utils.build_connectivity( net=network, pop_objects=pop_params, path_to_cells=dir_to_cells, full_path_to_conn_summary=full_path_to_connectivity, pre_segment_group_info=[{"PreSegGroup": "distal_axon", "ProjType": "Chem"}], synaptic_scaling_params=weight_params, synaptic_delay_params=delay_params, ignore_synapses=ignore_synapses, ) else: if not passed_weight_params: opencortex.print_comment_v( "Synaptic weight parameters were specified incorrectly; execution of RunColumn.py will terminate." ) if not passed_delay_params: opencortex.print_comment_v( "Synaptic delay parameters were specified incorrectly; execution of RunColumn.py will terminate." ) quit() ############ for testing only; will add original specifications later ############################################################## if sim_config == "Testing1": input_params = { "CG3D_L23PyrRS": [ { "InputType": "GeneratePoissonTrains", "InputName": "Poi_CG3D_L23PyrRS", "TrainType": "transient", "Synapse": "Syn_AMPA_SupPyr_SupPyr", "AverageRateList": [200.0, 150.0], "RateUnits": "Hz", "TimeUnits": "ms", "DurationList": [100.0, 50.0], "DelayList": [50.0, 200.0], "FractionToTarget": 1.0, "LocationSpecific": False, "TargetDict": {"soma_group": 1}, } ] } ################################################################################################################################### if sim_config == "Testing2": input_params_final = { "CG3D_L23PyrRS": [ { "InputType": "PulseGenerators", "InputName": "DepCurr_L23RS", "Noise": True, "SmallestAmplitudeList": [5.0e-5, 1.0e-5], "LargestAmplitudeList": [1.0e-4, 2.0e-5], "DurationList": [20000.0, 20000.0], "DelayList": [0.0, 20000.0], "TimeUnits": "ms", "AmplitudeUnits": "uA", "FractionToTarget": 1.0, "LocationSpecific": False, "TargetDict": {"dendrite_group": 1}, } ] } if sim_config == "TempSimConfig": input_params = { "CG3D_L23PyrRS": [ { "InputType": "PulseGenerators", "InputName": "DepCurr_L23RS", "Noise": True, "SmallestAmplitudeList": [5.0e-5], "LargestAmplitudeList": [1.0e-4], "DurationList": [20000.0], "DelayList": [0.0], "TimeUnits": "ms", "AmplitudeUnits": "uA", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 0, "UniversalFractionAlong": 0.5, }, { "InputType": "GeneratePoissonTrains", "InputName": "BackgroundL23RS", "TrainType": "persistent", "Synapse": "Syn_AMPA_SupPyr_SupPyr", "AverageRateList": [30.0], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "TargetDict": {"dendrite_group": 100}, }, { "InputType": "GeneratePoissonTrains", "InputName": "EctopicStimL23RS", "TrainType": "persistent", "Synapse": "SynForEctStim", "AverageRateList": [0.1], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 143, "UniversalFractionAlong": 0.5, }, ], "CG3D_TCR": [ { "InputType": "GeneratePoissonTrains", "InputName": "EctopicStimTCR", "TrainType": "persistent", "Synapse": "SynForEctStim", "AverageRateList": [1.0], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 269, "UniversalFractionAlong": 0.5, }, { "InputType": "GeneratePoissonTrains", "InputName": "Input_20", "TrainType": "persistent", "Synapse": "Syn_AMPA_L6NT_TCR", "AverageRateList": [50.0], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "TargetDict": {"dendrite_group": 100}, }, ], "CG3D_L23PyrFRB": [ { "InputType": "GeneratePoissonTrains", "InputName": "EctopicStimL23FRB", "TrainType": "persistent", "Synapse": "SynForEctStim", "AverageRateList": [0.1], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 143, "UniversalFractionAlong": 0.5, }, { "InputType": "PulseGenerators", "InputName": "DepCurr_L23FRB", "Noise": True, "SmallestAmplitudeList": [2.5e-4], "LargestAmplitudeList": [3.5e-4], "DurationList": [20000.0], "DelayList": [0.0], "TimeUnits": "ms", "AmplitudeUnits": "uA", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 0, "UniversalFractionAlong": 0.5, }, ], "CG3D_L6NonTuftRS": [ { "InputType": "GeneratePoissonTrains", "InputName": "EctopicStimL6NT", "TrainType": "persistent", "Synapse": "SynForEctStim", "AverageRateList": [1.0], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 95, "UniversalFractionAlong": 0.5, }, { "InputType": "PulseGenerators", "InputName": "DepCurr_L6NT", "Noise": True, "SmallestAmplitudeList": [5.0e-5], "LargestAmplitudeList": [1.0e-4], "DurationList": [20000.0], "DelayList": [0.0], "TimeUnits": "ms", "AmplitudeUnits": "uA", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 0, "UniversalFractionAlong": 0.5, }, ], "CG3D_L4SpinStell": [ { "InputType": "PulseGenerators", "InputName": "DepCurr_L4SS", "Noise": True, "SmallestAmplitudeList": [5.0e-5], "LargestAmplitudeList": [1.0e-4], "DurationList": [20000.0], "DelayList": [0.0], "TimeUnits": "ms", "AmplitudeUnits": "uA", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 0, "UniversalFractionAlong": 0.5, } ], "CG3D_L5TuftIB": [ { "InputType": "GeneratePoissonTrains", "InputName": "BackgroundL5", "TrainType": "persistent", "Synapse": "Syn_AMPA_L5RS_L5Pyr", "AverageRateList": [30.0], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "TargetDict": {"dendrite_group": 100}, }, { "InputType": "GeneratePoissonTrains", "InputName": "EctopicStimL5IB", "TrainType": "persistent", "Synapse": "SynForEctStim", "AverageRateList": [1.0], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 119, "UniversalFractionAlong": 0.5, }, { "InputType": "PulseGenerators", "InputName": "DepCurr_L5IB", "Noise": True, "SmallestAmplitudeList": [5.0e-5], "LargestAmplitudeList": [1.0e-4], "DurationList": [20000.0], "DelayList": [0.0], "TimeUnits": "ms", "AmplitudeUnits": "uA", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 0, "UniversalFractionAlong": 0.5, }, ], "CG3D_L5TuftRS": [ { "InputType": "GeneratePoissonTrains", "InputName": "EctopicStimL5RS", "TrainType": "persistent", "Synapse": "SynForEctStim", "AverageRateList": [1.0], "RateUnits": "Hz", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 119, "UniversalFractionAlong": 0.5, }, { "InputType": "PulseGenerators", "InputName": "DepCurr_L5RS", "Noise": True, "SmallestAmplitudeList": [5.0e-5], "LargestAmplitudeList": [1.0e-4], "DurationList": [20000.0], "DelayList": [0.0], "TimeUnits": "ms", "AmplitudeUnits": "uA", "FractionToTarget": 1.0, "LocationSpecific": False, "UniversalTargetSegmentID": 0, "UniversalFractionAlong": 0.5, }, ], } input_params_final = {} for pop_id in pop_params.keys(): if pop_id in input_params.keys(): input_params_final[pop_id] = input_params[pop_id] if deep_bias_current >= 0: for cell_group in input_params_final.keys(): for input_group in range(0, len(input_params_final[cell_group])): check_type = input_params_final[cell_group][input_group]["InputType"] == "PulseGenerators" check_group_1 = cell_group == "CG3D_L5TuftIB" check_group_2 = cell_group == "CG3D_L5TuftRS" check_group_3 = cell_group == "CG3D_L6NonTuftRS" if check_type and (check_group_1 or check_group_2 or check_group_3): opencortex.print_comment_v( "Changing offset current in 'PulseGenerators' for %s to %f" % (cell_group, deep_bias_current) ) input_params_final[cell_group][input_group]["SmallestAmplitudeList"] = [ (deep_bias_current - 0.05) / 1000 ] input_params_final[cell_group][input_group]["LargestAmplitudeList"] = [ (deep_bias_current + 0.05) / 1000 ] input_list_array_final, input_synapse_list = oc_utils.build_inputs( nml_doc=nml_doc, net=network, population_params=pop_params, input_params=input_params_final, cached_dicts=cached_segment_dicts, path_to_cells=dir_to_cells, path_to_synapses=dir_to_synapses, ) #################################################################################################################################### for input_synapse in input_synapse_list: if input_synapse not in all_synapse_components: all_synapse_components.append(input_synapse) synapse_list = [] gap_junction_list = [] for syn_ind in range(0, len(all_synapse_components)): if "Elect" not in all_synapse_components[syn_ind]: synapse_list.append(all_synapse_components[syn_ind]) all_synapse_components[syn_ind] = os.path.join(net_id, all_synapse_components[syn_ind] + ".synapse.nml") else: gap_junction_list.append(all_synapse_components[syn_ind]) all_synapse_components[syn_ind] = os.path.join(net_id, all_synapse_components[syn_ind] + ".nml") oc.add_synapses(nml_doc, dir_to_synapses, synapse_list, synapse_tag=True) oc.add_synapses(nml_doc, dir_to_gap_junctions, gap_junction_list, synapse_tag=False) nml_file_name = "%s.net.nml" % network.id oc.save_network(nml_doc, nml_file_name, validate=True, max_memory=max_memory) oc.remove_component_dirs( dir_to_project_nml2="%s" % network.id, list_of_cell_ids=cell_model_list_final, extra_channel_tags=["cad"] ) lems_file_name = oc.generate_lems_simulation( nml_doc, network, nml_file_name, duration=duration, dt=dt, include_extra_lems_files=all_synapse_components ) if simulator != None: opencortex.print_comment_v("Starting simulation of %s.net.nml" % net_id) oc.simulate_network(lems_file_name=lems_file_name, simulator=simulator, max_memory=max_memory)
import opencortex.build as oc nml_doc, network = oc.generate_network("IClamps") oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/izhikevich/RS.cell.nml', 'RS') oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/acnet2/pyr_4_sym_soma.cell.nml', 'pyr_4_sym_soma') #oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/BlueBrainProject_NMC/cADpyr229_L23_PC_5ecbf9b163_0_0.cell.nml', 'cADpyr229_L23_PC_5ecbf9b163_0_0') popIzh = oc.add_single_cell_population(network, 'popIzh', 'RS') popHH = oc.add_single_cell_population(network, 'popHH', 'pyr_4_sym_soma', z=100) ''' popBBP = oc.add_single_cell_population(network, 'popBBP', 'cADpyr229_L23_PC_5ecbf9b163_0_0', z=200)''' pgIzh = oc.add_pulse_generator(nml_doc, id="pgIzh", delay="100ms", duration="300ms", amplitude="0.7nA") pgHH = oc.add_pulse_generator(nml_doc, id="pgHH",
def generate_lems(glif_dir, curr_pA, show_plot=True): os.chdir(glif_dir) with open('model_metadata.json', "r") as json_file: model_metadata = json.load(json_file) with open('neuron_config.json', "r") as json_file: neuron_config = json.load(json_file) with open('ephys_sweeps.json', "r") as json_file: ephys_sweeps = json.load(json_file) template_cell = '''<Lems> <%s %s/> </Lems> ''' type = '???' print(model_metadata['name']) if '(LIF)' in model_metadata['name']: type = 'glifCell' if '(LIF-ASC)' in model_metadata['name']: type = 'glifAscCell' if '(LIF-R)' in model_metadata['name']: type = 'glifRCell' if '(LIF-R-ASC)' in model_metadata['name']: type = 'glifRAscCell' if '(LIF-R-ASC-A)' in model_metadata['name']: type = 'glifRAscATCell' cell_id = 'GLIF_%s'%glif_dir attributes = "" attributes +=' id="%s"'%cell_id attributes +='\n C="%s F"'%neuron_config["C"] attributes +='\n leakReversal="%s V"'%neuron_config["El"] attributes +='\n reset="%s V"'%neuron_config["El"] attributes +='\n thresh="%s V"'%( float(neuron_config["th_inf"]) * float(neuron_config["coeffs"]["th_inf"])) attributes +='\n leakConductance="%s S"'%(1/float(neuron_config["R_input"])) if 'Asc' in type: attributes +='\n tau1="%s s"'%neuron_config["asc_tau_array"][0] attributes +='\n tau2="%s s"'%neuron_config["asc_tau_array"][1] attributes +='\n amp1="%s A"'% ( float(neuron_config["asc_amp_array"][0]) * float(neuron_config["coeffs"]["asc_amp_array"][0]) ) attributes +='\n amp2="%s A"'% ( float(neuron_config["asc_amp_array"][1]) * float(neuron_config["coeffs"]["asc_amp_array"][1]) ) if 'glifR' in type: attributes +='\n bs="%s per_s"'%neuron_config["threshold_dynamics_method"]["params"]["b_spike"] attributes +='\n deltaThresh="%s V"'%neuron_config["threshold_dynamics_method"]["params"]["a_spike"] attributes +='\n fv="%s"'%neuron_config["voltage_reset_method"]["params"]["a"] attributes +='\n deltaV="%s V"'%neuron_config["voltage_reset_method"]["params"]["b"] if 'glifRAscATCell' in type: attributes +='\n bv="%s per_s"'%neuron_config["threshold_dynamics_method"]["params"]["b_voltage"] attributes +='\n a="%s per_s"'%neuron_config["threshold_dynamics_method"]["params"]["a_voltage"] file_contents = template_cell%(type, attributes) print(file_contents) cell_file_name = '%s.xml'%(cell_id) cell_file = open(cell_file_name,'w') cell_file.write(file_contents) cell_file.close() import opencortex.build as oc nml_doc, network = oc.generate_network("Test_%s"%glif_dir) pop = oc.add_single_cell_population(network, 'pop_%s'%glif_dir, cell_id) pg = oc.add_pulse_generator(nml_doc, id="pg0", delay="100ms", duration="1000ms", amplitude="%s pA"%curr_pA) oc.add_inputs_to_population(network, "Stim0", pop, pg.id, all_cells=True) nml_file_name = '%s.net.nml'%network.id oc.save_network(nml_doc, nml_file_name, validate=True) thresh = 'thresh' if 'glifR' in type: thresh = 'threshTotal' lems_file_name = oc.generate_lems_simulation(nml_doc, network, nml_file_name, include_extra_lems_files = [cell_file_name,'../GLIFs.xml'], duration = 1200, dt = 0.01, gen_saves_for_quantities = {'thresh.dat':['pop_%s/0/GLIF_%s/%s'%(glif_dir,glif_dir,thresh)]}, gen_plots_for_quantities = {'Threshold':['pop_%s/0/GLIF_%s/%s'%(glif_dir,glif_dir,thresh)]}) results = pynml.run_lems_with_jneuroml(lems_file_name, nogui=True, load_saved_data=True) print("Ran simulation; results reloaded for: %s"%results.keys()) info = "Model %s; %spA stimulation"%(glif_dir,curr_pA) times = [results['t']] vs = [results['pop_%s/0/GLIF_%s/v'%(glif_dir,glif_dir)]] labels = ['LEMS - jNeuroML'] original_model_v = 'original.v.dat' if os.path.isfile(original_model_v): data, indices = pynml.reload_standard_dat_file(original_model_v) times.append(data['t']) vs.append(data[0]) labels.append('Allen SDK') pynml.generate_plot(times, vs, "Membrane potential; %s"%info, xaxis = "Time (s)", yaxis = "Voltage (V)", labels = labels, grid = True, show_plot_already=False, save_figure_to='Comparison_%ipA.png'%(curr_pA)) times = [results['t']] vs = [results['pop_%s/0/GLIF_%s/%s'%(glif_dir,glif_dir,thresh)]] labels = ['LEMS - jNeuroML'] original_model_th = 'original.thresh.dat' if os.path.isfile(original_model_th): data, indeces = pynml.reload_standard_dat_file(original_model_th) times.append(data['t']) vs.append(data[0]) labels.append('Allen SDK') pynml.generate_plot(times, vs, "Threshold; %s"%info, xaxis = "Time (s)", yaxis = "Voltage (V)", labels = labels, grid = True, show_plot_already=show_plot, save_figure_to='Comparison_Threshold_%ipA.png'%(curr_pA)) readme = ''' ## Model: %(id)s ### Original model %(name)s [Allen Cell Types DB electrophysiology page for specimen](http://celltypes.brain-map.org/mouse/experiment/electrophysiology/%(spec)s) [Neuron configuration](neuron_config.json); [model metadata](model_metadata.json); [electrophysiology summary](ephys_sweeps.json) #### Original traces: **Membrane potential** Current injection of %(curr)s pA ![Original](MembranePotential_%(curr)spA.png) **Threshold** ![Threshold](Threshold_%(curr)spA.png) ### Conversion to NeuroML 2 LEMS version of this model: [GLIF_%(id)s.xml](GLIF_%(id)s.xml) [Definitions of LEMS Component Types](../GLIFs.xml) for GLIFs. This model can be run locally by installing [jNeuroML](https://github.com/NeuroML/jNeuroML) and running: jnml LEMS_Test_%(id)s.xml #### Comparison: **Membrane potential** Current injection of %(curr)s pA ![Comparison](Comparison_%(curr)spA.png) **Threshold** ![Comparison](Comparison_Threshold_%(curr)spA.png)''' readme_file = open('README.md','w') curr_str = str(curr_pA) # @type curr_str str if curr_str.endswith('.0'): curr_str = curr_str[:-2] readme_file.write(readme%{"id":glif_dir,"name":model_metadata['name'],"spec":model_metadata["specimen_id"],"curr":curr_str}) readme_file.close() os.chdir('..') return model_metadata, neuron_config, ephys_sweeps
def generate(reference = "L23TraubDemo", num_rs =2, num_bask =2, scalex=1, scaley=1, scalez=1, connections=True, poisson_inputs=True, offset_curents=False, global_delay = 0, duration = 300, segments_to_plot_record = {'pop_rs':[0],'pop_bask':[0]}, format='xml'): nml_doc, network = oc.generate_network(reference) #oc.add_cell_and_channels(nml_doc, 'acnet2/pyr_4_sym.cell.nml','pyr_4_sym') oc.add_cell_and_channels(nml_doc, 'Thalamocortical/L23PyrRS.cell.nml','L23PyrRS') oc.add_cell_and_channels(nml_doc, 'Thalamocortical/SupBasket.cell.nml','SupBasket') xDim = 500*scalex yDim = 200*scaley zDim = 500*scalez pop_rs = oc.add_population_in_rectangular_region(network, 'pop_rs', 'L23PyrRS', num_rs, 0,0,0, xDim,yDim,zDim) pop_bask = oc.add_population_in_rectangular_region(network, 'pop_bask', 'SupBasket', num_bask, 0,0,0, xDim,yDim,zDim) syn0 = oc.add_exp_two_syn(nml_doc, id="syn0", gbase="1nS", erev="0mV", tau_rise="0.5ms", tau_decay="10ms") syn1 = oc.add_exp_two_syn(nml_doc, id="syn1", gbase="2nS", erev="0mV", tau_rise="1ms", tau_decay="15ms") if poisson_inputs: pfs = oc.add_poisson_firing_synapse(nml_doc, id="poissonFiringSyn", average_rate="150 Hz", synapse_id=syn0.id) oc.add_inputs_to_population(network, "Stim0", pop_rs, pfs.id, all_cells=True) if offset_curents: pg0 = oc.add_pulse_generator(nml_doc, id="pg0", delay="0ms", duration="%sms"%duration, amplitude="0.5nA") oc.add_inputs_to_population(network, "Stim0", pop_rs, pg0.id, all_cells=True) oc.add_inputs_to_population(network, "Stim0", pop_bask, pg0.id, all_cells=True) total_conns = 0 if connections: proj = oc.add_probabilistic_projection(network, "proj0", pop_rs, pop_bask, syn1.id, 0.3, weight=0.05, delay=global_delay) if proj: total_conns += len(proj.connection_wds) if num_rs != 2 or num_bask!=2: new_reference = '%s_%scells_%sconns'%(nml_doc.id,num_rs+num_bask,total_conns) network.id = new_reference nml_doc.id = new_reference nml_file_name = '%s.net.%s'%(network.id,'nml.h5' if format == 'hdf5' else 'nml') oc.save_network(nml_doc, nml_file_name, validate=(format=='xml'), format = format) if format=='xml': gen_plots_for_quantities = {} # Dict with displays vs lists of quantity paths gen_saves_for_quantities = {} # Dict with file names vs lists of quantity paths for pop in segments_to_plot_record.keys(): pop_nml = network.get_by_id(pop) if pop_nml is not None and pop_nml.size>0: for i in range(int(pop_nml.size)): gen_plots_for_quantities['Display_%s_%i_v'%(pop,i)] = [] gen_saves_for_quantities['Sim_%s.%s.%i.v.dat'%(nml_doc.id,pop,i)] = [] for seg in segments_to_plot_record[pop]: quantity = '%s/%i/%s/%i/v'%(pop,i,pop_nml.component,seg) gen_plots_for_quantities['Display_%s_%i_v'%(pop,i)].append(quantity) gen_saves_for_quantities['Sim_%s.%s.%i.v.dat'%(nml_doc.id,pop,i)].append(quantity) lems_file_name = oc.generate_lems_simulation(nml_doc, network, nml_file_name, duration = duration, dt = 0.025, gen_plots_for_all_v = False, gen_plots_for_quantities = gen_plots_for_quantities, gen_saves_for_all_v = False, gen_saves_for_quantities = gen_saves_for_quantities) else: lems_file_name = None return nml_doc, nml_file_name, lems_file_name
t4=-200.0 t5=-300.0 t6=-300.0 boundaries={} boundaries['L1']=[0,t1] boundaries['L23']=[t1,t1+t2+t3] boundaries['L4']=[t1+t2+t3,t1+t2+t3+t4] boundaries['L5']=[t1+t2+t3+t4,t1+t2+t3+t4+t5] boundaries['L6']=[t1+t2+t3+t4+t5,t1+t2+t3+t4+t5+t6] xs = [0,500] zs = [0,500] nml_doc, network = oc.generate_network("TestTraubBuild") oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/Thalamocortical/L23PyrRS.cell.nml','L23PyrRS') oc.add_cell_and_channels(nml_doc, '../NeuroML2/prototypes/Thalamocortical/SupBasket.cell.nml','SupBasket') popObjs=oc.add_populations_in_layers(network,boundaries,popDict,xs,zs) extra_params=[{'pre':'L23PyrRS','post':'SupBasket','weights':[0.05],'delays':[5],'synComps':['NMDA']}] synapseList,projArray=oc.build_connectivity(network,popObjs,"Traub_conn_data.json","../NeuroML2/prototypes/Thalamocortical/",extra_params) oc.add_synapses(nml_doc,'../NeuroML2/prototypes/Thalamocortical/',synapseList)
def generate(reference = "Balanced", num_bbp =1, scalePops = 1, scalex=1, scaley=1, scalez=1, connections=True, duration = 1000, global_delay = 0, format='xml'): num_exc = scale_pop_size(80,scalePops) num_inh = scale_pop_size(40,scalePops) nml_doc, network = oc.generate_network(reference) oc.add_cell_and_channels(nml_doc, 'AllenInstituteCellTypesDB_HH/HH_464198958.cell.nml','HH_464198958') oc.add_cell_and_channels(nml_doc, 'AllenInstituteCellTypesDB_HH/HH_471141261.cell.nml','HH_471141261') if num_bbp>0: oc.add_cell_and_channels(nml_doc, 'BlueBrainProject_NMC/cADpyr229_L23_PC_5ecbf9b163_0_0.cell.nml', 'cADpyr229_L23_PC_5ecbf9b163_0_0') xDim = 400*scalex yDim = 500*scaley zDim = 300*scalez xs = -200 ys = -150 zs = 100 ##### Synapses synAmpa1 = oc.add_exp_two_syn(nml_doc, id="synAmpa1", gbase="1nS", erev="0mV", tau_rise="0.5ms", tau_decay="5ms") synGaba1 = oc.add_exp_two_syn(nml_doc, id="synGaba1", gbase="2nS", erev="-80mV", tau_rise="1ms", tau_decay="20ms") ##### Input types pfs1 = oc.add_poisson_firing_synapse(nml_doc, id="psf1", average_rate="150 Hz", synapse_id=synAmpa1.id) ##### Populations popExc = oc.add_population_in_rectangular_region(network, 'popExc', 'HH_464198958', num_exc, xs,ys,zs, xDim,yDim,zDim) popInh = oc.add_population_in_rectangular_region(network, 'popInh', 'HH_471141261', num_inh, xs,ys,zs, xDim,yDim,zDim) if num_bbp == 1: popBBP = oc.add_single_cell_population(network, 'popBBP', 'cADpyr229_L23_PC_5ecbf9b163_0_0', z=200) elif num_bbp > 1: popBBP = oc.add_population_in_rectangular_region(network, 'popBBP', 'cADpyr229_L23_PC_5ecbf9b163_0_0', num_bbp, xs,ys,zs, xDim,yDim,zDim) ##### Projections total_conns = 0 if connections: proj = oc.add_probabilistic_projection(network, "proj0", popExc, popExc, synAmpa1.id, 0.3, delay = global_delay) total_conns += len(proj.connection_wds) proj = oc.add_probabilistic_projection(network, "proj1", popExc, popInh, synAmpa1.id, 0.5, delay = global_delay) total_conns += len(proj.connection_wds) proj = oc.add_probabilistic_projection(network, "proj3", popInh, popExc, synGaba1.id, 0.7, delay = global_delay) total_conns += len(proj.connection_wds) proj = oc.add_probabilistic_projection(network, "proj4", popInh, popInh, synGaba1.id, 0.5, delay = global_delay) total_conns += len(proj.connection_wds) if num_bbp>0: proj = oc.add_probabilistic_projection(network, "proj5", popExc, popBBP, synAmpa1.id, 0.5, delay = global_delay) total_conns += len(proj.connection_wds) ##### Inputs oc.add_inputs_to_population(network, "Stim0", popExc, pfs1.id, all_cells=True) ##### Save NeuroML and LEMS Simulation files if num_bbp != 1: new_reference = 'Balanced_%scells_%sconns'%(num_bbp+num_exc+num_inh,total_conns) network.id = new_reference nml_doc.id = new_reference nml_file_name = '%s.net.%s'%(network.id,'nml.h5' if format == 'hdf5' else 'nml') oc.save_network(nml_doc, nml_file_name, validate=(format=='xml'), format = format) if format=='xml': lems_file_name = oc.generate_lems_simulation(nml_doc, network, nml_file_name, duration = duration, dt = 0.025) else: lems_file_name = None return nml_doc, nml_file_name, lems_file_name
''' Generates a NeuroML 2 file with a LEMS file recording many details of the network ''' import opencortex.build as oc nml_doc, network = oc.generate_network("Recording") ##### Cells oc.add_cell_and_channels(nml_doc, 'izhikevich/RS.cell.nml','RS') oc.add_cell_and_channels(nml_doc, 'iaf/iaf.cell.nml','iaf') oc.add_cell_and_channels(nml_doc, 'acnet2/pyr_4_sym_soma.cell.nml','pyr_4_sym_soma') oc.add_cell_and_channels(nml_doc, 'acnet2/pyr_4_sym.cell.nml','pyr_4_sym') xDim = 500 yDim = 100 zDim = 500 offset = 0 ##### Synapses synAmpa1 = oc.add_exp_two_syn(nml_doc, id="synAmpa1", gbase="1nS", erev="0mV", tau_rise="0.5ms", tau_decay="10ms") synAmpa2 = oc.add_exp_two_syn(nml_doc, id="synAmpa2", gbase="0.5nS", erev="0mV", tau_rise="0.5ms", tau_decay="5ms")
def generate_lems(glif_dir, curr_pA, show_plot=True): os.chdir(glif_dir) with open('model_metadata.json', "r") as json_file: model_metadata = json.load(json_file) with open('neuron_config.json', "r") as json_file: neuron_config = json.load(json_file) with open('ephys_sweeps.json', "r") as json_file: ephys_sweeps = json.load(json_file) template_cell = '''<Lems> <%s %s/> </Lems> ''' type = '???' print(model_metadata['name']) if '(LIF)' in model_metadata['name']: type = 'glifCell' if '(LIF-ASC)' in model_metadata['name']: type = 'glifAscCell' if '(LIF-R)' in model_metadata['name']: type = 'glifRCell' if '(LIF-R-ASC)' in model_metadata['name']: type = 'glifRAscCell' if '(LIF-R-ASC-A)' in model_metadata['name']: type = 'glifRAscATCell' cell_id = 'GLIF_%s' % glif_dir attributes = "" attributes += ' id="%s"' % cell_id attributes += '\n C="%s F"' % neuron_config["C"] attributes += '\n leakReversal="%s V"' % neuron_config["El"] attributes += '\n reset="%s V"' % neuron_config["El"] attributes += '\n thresh="%s V"' % (float( neuron_config["th_inf"]) * float(neuron_config["coeffs"]["th_inf"])) attributes += '\n leakConductance="%s S"' % ( 1 / float(neuron_config["R_input"])) if 'Asc' in type: attributes += '\n tau1="%s s"' % neuron_config[ "asc_tau_array"][0] attributes += '\n tau2="%s s"' % neuron_config[ "asc_tau_array"][1] attributes += '\n amp1="%s A"' % ( float(neuron_config["asc_amp_array"][0]) * float(neuron_config["coeffs"]["asc_amp_array"][0])) attributes += '\n amp2="%s A"' % ( float(neuron_config["asc_amp_array"][1]) * float(neuron_config["coeffs"]["asc_amp_array"][1])) if 'glifR' in type: attributes += '\n bs="%s per_s"' % neuron_config[ "threshold_dynamics_method"]["params"]["b_spike"] attributes += '\n deltaThresh="%s V"' % neuron_config[ "threshold_dynamics_method"]["params"]["a_spike"] attributes += '\n fv="%s"' % neuron_config[ "voltage_reset_method"]["params"]["a"] attributes += '\n deltaV="%s V"' % neuron_config[ "voltage_reset_method"]["params"]["b"] if 'glifRAscATCell' in type: attributes += '\n bv="%s per_s"' % neuron_config[ "threshold_dynamics_method"]["params"]["b_voltage"] attributes += '\n a="%s per_s"' % neuron_config[ "threshold_dynamics_method"]["params"]["a_voltage"] file_contents = template_cell % (type, attributes) print(file_contents) cell_file_name = '%s.xml' % (cell_id) cell_file = open(cell_file_name, 'w') cell_file.write(file_contents) cell_file.close() import opencortex.build as oc nml_doc, network = oc.generate_network("Test_%s" % glif_dir) pop = oc.add_single_cell_population(network, 'pop_%s' % glif_dir, cell_id) pg = oc.add_pulse_generator(nml_doc, id="pg0", delay="100ms", duration="1000ms", amplitude="%s pA" % curr_pA) oc.add_inputs_to_population(network, "Stim0", pop, pg.id, all_cells=True) nml_file_name = '%s.net.nml' % network.id oc.save_network(nml_doc, nml_file_name, validate=True) thresh = 'thresh' if 'glifR' in type: thresh = 'threshTotal' lems_file_name = oc.generate_lems_simulation( nml_doc, network, nml_file_name, include_extra_lems_files=[cell_file_name, '../GLIFs.xml'], duration=1200, dt=0.01, gen_saves_for_quantities={ 'thresh.dat': ['pop_%s/0/GLIF_%s/%s' % (glif_dir, glif_dir, thresh)] }, gen_plots_for_quantities={ 'Threshold': ['pop_%s/0/GLIF_%s/%s' % (glif_dir, glif_dir, thresh)] }) results = pynml.run_lems_with_jneuroml(lems_file_name, nogui=True, load_saved_data=True) print("Ran simulation; results reloaded for: %s" % results.keys()) info = "Model %s; %spA stimulation" % (glif_dir, curr_pA) times = [results['t']] vs = [results['pop_%s/0/GLIF_%s/v' % (glif_dir, glif_dir)]] labels = ['LEMS - jNeuroML'] original_model_v = 'original.v.dat' if os.path.isfile(original_model_v): data, indices = pynml.reload_standard_dat_file(original_model_v) times.append(data['t']) vs.append(data[0]) labels.append('Allen SDK') pynml.generate_plot(times, vs, "Membrane potential; %s" % info, xaxis="Time (s)", yaxis="Voltage (V)", labels=labels, grid=True, show_plot_already=False, save_figure_to='Comparison_%ipA.png' % (curr_pA)) times = [results['t']] vs = [results['pop_%s/0/GLIF_%s/%s' % (glif_dir, glif_dir, thresh)]] labels = ['LEMS - jNeuroML'] original_model_th = 'original.thresh.dat' if os.path.isfile(original_model_th): data, indeces = pynml.reload_standard_dat_file(original_model_th) times.append(data['t']) vs.append(data[0]) labels.append('Allen SDK') pynml.generate_plot(times, vs, "Threshold; %s" % info, xaxis="Time (s)", yaxis="Voltage (V)", labels=labels, grid=True, show_plot_already=show_plot, save_figure_to='Comparison_Threshold_%ipA.png' % (curr_pA)) readme = ''' ## Model: %(id)s ### Original model %(name)s [Allen Cell Types DB electrophysiology page for specimen](http://celltypes.brain-map.org/mouse/experiment/electrophysiology/%(spec)s) [Neuron configuration](neuron_config.json); [model metadata](model_metadata.json); [electrophysiology summary](ephys_sweeps.json) #### Original traces: **Membrane potential** Current injection of %(curr)s pA ![Original](MembranePotential_%(curr)spA.png) **Threshold** ![Threshold](Threshold_%(curr)spA.png) ### Conversion to NeuroML 2 LEMS version of this model: [GLIF_%(id)s.xml](GLIF_%(id)s.xml) [Definitions of LEMS Component Types](../GLIFs.xml) for GLIFs. This model can be run locally by installing [jNeuroML](https://github.com/NeuroML/jNeuroML) and running: jnml LEMS_Test_%(id)s.xml #### Comparison: **Membrane potential** Current injection of %(curr)s pA ![Comparison](Comparison_%(curr)spA.png) **Threshold** ![Comparison](Comparison_Threshold_%(curr)spA.png)''' readme_file = open('README.md', 'w') curr_str = str(curr_pA) # @type curr_str str if curr_str.endswith('.0'): curr_str = curr_str[:-2] readme_file.write( readme % { "id": glif_dir, "name": model_metadata['name'], "spec": model_metadata["specimen_id"], "curr": curr_str }) readme_file.close() os.chdir('..') return model_metadata, neuron_config, ephys_sweeps