//genesis /********************************************************************** ** This simulation script and the files included in this package ** are Copyright (C) 2019 by David Beeman (dbeeman@colorado.edu) ** and are made available under the terms of the ** GNU Lesser General Public License version 2.1 *********************************************************************/ /*====================================================================== ACnet23 a 'simple yet realistic' model of primary auditory layer 2/3 based on: Beeman D (2013) A modeling study of cortical waves in primary auditory cortex. BMC Neuroscience, 14(Suppl 1):P23 doi:10.1186/1471-2202-14-S1-P23 (http://www.biomedcentral.com/1471-2202/14/S1/P23) This simulation script reproduces the results shown in Fig. 1 of: David Beeman, Alfred Yu, Joshua Crone (2019) Studying evoked potentials in large cortical networks with PGENESIS 2.4. BMC Neuroscience 2019, 20(Suppl 1):P46 https://bmcneurosci.biomedcentral.com/articles/10.1186/s12868-019-0538-0#Sec281 Further description of the ACnet2 series of models and the installation/use of GENESIS and PGENESIS is given at the GENESIS website: http://genesis-sim.org/GENESIS/ Note that this simulation requires the May 2019 official release version of PGENESIS 2.4 This variation of the 2013 model uses a new compiled object facdep_rules to provide short term facilitation and depression of excitatory synapses of the two populations of neurons: Ex_cell_name = "pyr_23" // name of the excitatory pyramidal cell Inh_cell_name = "bask_4" // name of the inhibitory (basket) cell The main script (script_name) includes: synapseinfo.g - optionally included for synapse debugging information par-ACnet23_netfuncs.g - defines functions for connecting the network par-ACnet23_funcs.g - defines most other functions used by the main script protodefs.g - defines the prototype cell elements and cells. Includes: pyrchans3.g - channel definitions for pyramidal cells FSchans.g - channel definitions for FS (basket) Inh_cell par-simple_inputs.g - provides for regular or random pulsed spike trains MGB-protodefs.g - prototypes for the input Medial Geniculate Body cells uses MGBcell.p and MGBchans.g for channel definitions. These are not used in this simulation. par-LFPfuncs.g - functions for measuring field potentials ======================================================================*/ str script_name = "par-ACnet23-6-4.g" // version with default parameters str RUNID = "6404" // default ID string used in output file names // Include the definitions and default values for all global variables // constants.g defines many flags for simulation options and provides the // default values of most cell and network model parameters. include constants3.g /* for debugging and exploring - see comments in file for details Usage: synapse_info path_to_synchan Example: synapse_info /Ex_layer4/Ex_cell[5]/dend/Ex_channel */ if (debug_level) include synapseinfo.g end /* ============ Customizations for this run ========================= Change these global variables from their default values before setting up the simulation. ================================================================== */ // These need to be defined before the includes n_slices = 24 n_nodes = n_slices + 2 Ex_cells_per_slice = Ex_NX*Ex_NY / n_slices Inh_cells_per_slice = Inh_NX*Inh_NY / n_slices /* Fill the workers list (a string of comma-separated worker numbers) */ output_node = n_slices + 1 // Use a separate node for output to files // output_node = 0 // share a node with control_node int worker0 = 1 // Used to identify the first worker node // int worker0 = 0 // Used to identify the first worker node // str workers = "0" // "0" is first in list of nodes str workers = "1" // "1" is first in list of nodes int i for (i = 2; i <= n_slices; i = i + 1) // for (i = 1; i < n_slices; i = i + 1) workers = workers @ "," @ {i} // add a comma and the next worker end if (pdebug) echo "Created list of workers = " {workers} end /* Optional changes to override definitions in contstants.g */ // RUNID = 6410 // Ex_inh_gmax = 10.0e-9 tmax = 11.1 // original run was for 10.2 sec // ================================= // Parallel function definitions // ================================= /* The function quit_sim is designed to be issued from just one node, and causes all nodes, including itself, with "quit@all". One can quit at the command prompt with "quit_sim", or with the QUIT button in the GUI, which invokes quit_sim. */ function quit_sim echo@{control_node} Quitting simulation quit@all end // ===========-================== // Include Function definitions // ============================== include par-ACnet23_funcs-6.g include par-netfuncs-5.g /* For running simulations in batch mode without using the GUI when "batch = 1". The function do_batch may need to be edited for the specific simulation. Note that it is called last, after all setup of the network has been performed. Some global options and parameters used in setup must be set at the beginning of this main script. */ function do_batch // performed by all nodes str path if (i_am_output_node) change_RUNID {RUNID} end barrier // all wait to change_RUNID if(pdebug) echo@{control_node} "Node: " {mynode} " Memory used: " {getstat -memory} end if (i_am_control_node) echo "RUNID: " {RUNID} if (conn_debug) print_avg_syn_number print_avg_input_number end do_reset do_reset step_tmax end barrier // wait until the run is finished flush_buffers if (pdebug) echo@{control_node} "Node: " {mynode} " Memory used: " {getstat -memory} end barrier // wait before quitting paroff quit end // function do_batch //=============================== // Main simulation section //=============================== /***** set the clocks *****/ setclock 0 {dt} // set the simulation clock setclock 1 {out_dt} // for most output and graphics setclock 2 {netview_dt} // for network Vm and Ik display setclock 3 {facdep_dt} // for FACDEP weight update setclock 4 {weights_out_dt} // output and plot the weights setclock 5 {pulse_interval} // used for oddball_freqs output if (normalize_weights) // rarely used option setclock 6 {wtscale_dt} end //=================================================================== // Start up parallel nodes - console output goes to control_node //=================================================================== paron -parallel -silent 1 -nodes {n_nodes} /* Parse optional arguments with alternative parameter values. For example: pgenesis -nox -nodes 26 par-ACnet23-6B.g 6206B 6.0e-6 The statements below extract a new RUNID and Ex_inh_gmax value from the extra arguments. At some point, this will be generalized. */ int count = {argc} if (count > 1) RUNID = {argv 1} Ex_inh_gmax = {argv 2} echo "Changing parameters - RUNID: "{RUNID} " gmax = " {Ex_inh_gmax} else echo "No arguments were given. Default values will be used." end /* When all nodes but the control_node are waiting at the final barrier, only report this every 60 seconds instead of the default 3 seconds. This is described in BoG Sec. Sec. 21.9.6. A longer pvm_hang_time gives time to enter interactive commands between the printed dots. */ setfield /post pvm_hang_time 60 // give time for connection set up setfield /post msg_hang_time 3600 // give time for for console input i_am_control_node = {mynode} == {control_node} i_am_graphics_node = (graphics) && ({mynode} == {graphics_node}) i_am_worker_node = ({mynode} >= worker0) && ({mynode} < {n_slices + worker0}) i_am_output_node = {mynode} == {output_node} randseed {seed + {mynode}*347} // this avoids artifacts of each node using // the same random number sequence if(pdebug) echo@{control_node} {nnodes} " nodes in " {nzones} " zones, " {npvmcpu} "CPUs" echo@{control_node} I am node {mynode} echo@{control_node} Completed startup at {getdate} end barrier // wait for everyone to catch up if ((i_am_control_node) && (pdebug > 0)) echo "START of network setup: " {getdate} end barrier /* Set up the network on the worker nodes */ if (i_am_worker_node) /* Including the protodefs file creates prototypes of the channels, and other cellular components under the neutral element '/library'. Calling the function 'make_prototypes', defined earlier in this script, uses these and the cell reader to add the cells. */ include protodefs3-0.g // Now /library contains prototype channels, compartments, spikegen make_prototypes // This adds the prototype cells to /library make_network_slice {default_layer} // Copy cells into network layers // make_network should do some of this, but set all synchan gmax values set_all_gmax /* synchan tau values should not be changed after hsolve SETUP */ // Change the synchan tau1 and tau2 from the values used in protodefs set_all_taus // set the random background excitation frequency set_frequency {frequency} make_hsolve {default_layer} if (pdebug) echo@{control_node} {mynode} " waiting at barrier 1 after creating slice" end barrier 1 // wait for every slice to be set up // Now connect them if (connect_network) //if (debug_level) if (pdebug > 0) echo@{control_node} {mynode} " Starting connection set up: " {getdate} end // defined in par-netfuncs.g connect_cells // connect up the cells in the network layers // if (debug_level) if (pdebug > 0) echo@{control_node} {mynode} " Finished connection set up: " {getdate} end end if (pdebug) // echo@{control_node} {mynode} " waiting at barrier 2 after connecting" echo "node " {mynode} " waiting at barrier 2 after connecting" end barrier 2 // wait for every slice to be connected // This version uses no random background excitation frequency = 0.0 set_frequency {frequency} // set weights and delays set_weights {syn_weight} set_delays {prop_delay} if (pdebug) echo@{control_node} {mynode} " Set wights/delays; waiting at barrier 3" end barrier 3 // wait for every slice to be connected /* set up FACDEP -- setup functions defined in ACnet23_funcs.g */ if (use_Ex_ex_FACDEP) setup_depdep_Ex_ex if(debug_level) echo "Using facdep_rules2 with step " {getclock 3} end useclock /depdep_Ex_ex 3 end if (use_Inh_ex_FACDEP) setup_depdep_Inh_ex if(debug_level) echo "Using facdep_rules2 with step " {getclock 3} end useclock /depdep_Inh_ex 3 end if (pdebug) echo@{control_node} {mynode} " setup facdep: waiting at barrier 4" end barrier 4 // wait for facdep setup else // non-worker nodes barrier 1 barrier 2 barrier 3 barrier 4 end // if/else i_am_worker if ((i_am_control_node) && (pdebug > 0)) echo "END of network setup (create, connect, facdep): " {getdate} end barrier /* Set up the inputs to the network. Depending on the type of input to be used, include the appropriate file for defining the functions make_inputs and connect_inputs. par-simple_inputs.g recognizes the input_types "pulsed_spiketrain" and "pulsed_randomspike", and the patterns "row" (the default), "line" and "box". The "ACnet2-6" series of scripts have been specialized to use the two types "MGBv" (with two tones and the MGBv input model) and the variant "oddball", which alternately applies two tones with probabilities input1_prob and 1 - input1_prob. */ /* However, this version uses par-simple_inputs3.g for a pulsed randomspike. Unlike earlier versions, this provides thalamic input to Inh_cells also. The function connect_inputs2 in par-simple_inputs3.g uses a loop with raddmsg to connect the spike generators to cells in a target row and and adjacent rows. The connection probability decreaases with distance from the target row. The older function connect_inputs used rvolumeconnect to connect to probabalistically connect to one of the rows, but connecting to all the cells in the row with 100% proability if that row is picked. To reproduce the published CNS 2019 results, set use_connect_inputs2 = 0 in constants.g. */ if (i_am_control_node) include par-simple_inputs3.g // Now increase row_sep from 7 to 12 row_sep = 12 /* Modify the pulse parameters to reflect a version of Eliades/Boatman expt */ float pulse_width = 0.015 // width of pulse float pulse_delay = 0.1 // delay before start of pulse float pulse_interval = 1.0 // time from start of pulse to next (period) float spikefreq = 793.7 // frequency "f0" of first input row make_inputs {spikefreq} // Create array of network inputs starting at spikefreq if(input_paradigm == "oddball") // from ACnet2-9-7_funcs.g setup_oddball_inputs 1 2 {input1_prob} apply_oddball_inputs // start it off before the first step setclock 5 {pulse_interval} end if(use_connect_inputs2) connect_inputs2 else connect_inputs // Connect the inputs to the network end setall_driveweights {drive_weight} // Initialize the weights of input drive setfield /MGBv[1]/spikepulse level1 1.0 if (pdebug) echo@{control_node} {mynode} "waiting at barrier 5 after connecting inputs" end if (conn_debug) echo "Messages from /MGBv[1]/spikepulse/spike: " rshowmsg /MGBv[1]/spikepulse/spike end barrier 5 else barrier 5 end // if (i_am_control_node) if (pdebug) echo@{control_node} {mynode} "waiting at barrier 6 after setting up inputs" end barrier 6 /* For this version, efield electrodes will be placed in the middle of a row, with an offset to avoid being on top of a neuron. z = 2 mm above the somata of the network layer 2/3. Electrodes are placed above row 16. make_electrode_cells applies only to workers and creates efield_cells elements in each slice. The fields are summed in the output node calculator. */ if (calc_LFP) include par-LFPfuncs.g use_syn_currents = 1 make_electrode_cells "Im_field" {cellpath}[] \ {(Ex_NX-1)*Ex_SEP_X/2.0} {39.5*Ex_SEP_Y} 0.002 // use efield_cells end // if (calc_LFP) barrier 7 make_electrode_cells_messages "Im_field" // only applies to workers barrier 8 // wait for everyone to catch up if (pdebug) echo@{control_node} "waiting at barrier 8 after setting up efield_cells" end if (i_am_output_node) if(input_paradigm == "oddball") setup_oddball_output end // Create disk_out elements /output/{net_efile}, {net_ifile}, {net_EPSC_file} make_network_out // set up the calculator and file for summed EPSCs if (calc_EPSCsum) do_EPSCsum_out end if (calc_LFP) /* include these for fields arising from only synchans or thalamic drive make_electrode "Electrode_synchans" {(Ex_NX-1)*Ex_SEP_X/2.0} \ {39.5*Ex_SEP_Y} 0.002 // uses efield2 make_electrode_synpath "Ex_drive_synchans" \ {(Ex_NX-1)*Ex_SEP_X/2.0} {39.5*Ex_SEP_Y} 0.002 make_electrode_synpath "Ex_inh_synchans" \ {(Ex_NX-1)*Ex_SEP_X/2.0} {39.5*Ex_SEP_Y} 0.002 do_electrodes_out */ do_electrodes_cells_out end if (pyrVm_output) make_pyrVm_out 792 // middle of row 16 end end // if (i_am_output_node) if (pdebug) echo@{control_node} "node " {mynode} " waiting at barrier 10 to setup outputs" end barrier 10 // everyone waits if (i_am_worker_node) make_network_out_messages // function checks flags if (calc_EPSCsum) make_EPSCsummer_messages end /* Don't calculate or output these if (calc_LFP) make_electrode_messages "Electrode_synchans" {cellpath} make_electrode_synpath_messages "Ex_drive_synchans" \ {cellpath} {Ex_drive_synpath} make_electrode_synpath_messages "Ex_inh_synchans" \ {cellpath} {Ex_inh_synpath} end */ if (pyrVm_output) make_pyrVm_out_messages 792 // these return if cell_numm not on mynode end end // if (i_am_worker_node) if (pdebug) echo@{control_node} "node " {mynode} " waiting at barrier 11 to setup output messages" end barrier 11 // everyone waits /* if running in batch mode, the function do_batch may need to be modified */ if (batch) do_batch end /* Otherwise, run the simulation and stop at a genesis prompt on control_node */ if(i_am_control_node) echo "Network of "{Ex_NX}" by "{Ex_NY}" excitatory cells with separations" \ {Ex_SEP_X}" by "{Ex_SEP_Y} echo "and "{Inh_NX}" by "{Inh_NY}" inhibitory cells with separations" \ {Inh_SEP_X}" by "{Inh_SEP_Y} echo "Random number generator seed initialized to: " {seed} print_avg_syn_number barrier 12 echo "resetting all nodes" reset@all echo "stepping all nodes" step_tmax barrier 13 else barrier 12 barrier 13 end // if(i_am_control_node) /* for all nodes: these will return if the cell is not on that node */ if (debug_level>1) print_Ex_synapse_info 792 end // All the other nodes will get stuck at this barrier // and the genesis prompt will be available in Node 0 if (!i_am_control_node) barrier 15 end