Introduction Page 1 ========================================================================= == MultiCell - Model description and script documentation written by Matt Wilson 4/89 ========================================================================= == TABLE OF CONTENTS Section pages ----------------------------------------------Introduction .......................... Model description ..................... MultiCell.g ........................... constants.g ........................... channel.g ............................. compartment.g ......................... cell.g ................................ Description of MultiCell.g ............ Description of constants.g ............ Description of channel.g .............. Description of compartment.g .......... Description of cell.g ................. Exercises ............................. Exercise solutions .................... Index ................................. 1 2 5 7 8 10 11 13 21 23 27 28 32 33 34 ========================================================================= == Documentation for the MultiCell simulation Line-by-Line Script commentary ========================================================================= == This document contains numbered versions of the MultiCell simulation scripts along with line-by-line descriptions for each. The basic format for the line by line documentation will be line number(s) in the actual script description description description : complete/partial line Note that the line numbers shown in the sample scripts are for reference purposes and are not present in the actual scripts. Line numbering is NOT used or allowed within actual scripts. ========================================================================= == Model description Page 2 MODEL DESCRIPTION ----------------This is a simulation of two simplified, but realistic neurons. in a feedback configuration. Each cell is composed of two compartments corresponding to a soma and a dendrite. Each compartment is composed of two variable conductance ionic channels for sodium (Na) and potassium (K). The dendritic channels are synaptically activated while the somatic channels are voltage dependent with Hodgkin-Huxley kinetics. The output of each cell is a spike event. These spike events reach their synaptic destinations after a specified delay. When they arrive they activate a conductance change Gk with peak value given by 'weight*gmax'. The parameters 'tau1/tau2' control the time course of the postsynapstic conductance changes. These conductances have time courses of the form alpha function form for tau1 == tau2 G = Gk*Ate(-t/Tau) dual exponential form for tau1 <> tau2 G = Gk*A(e(-t/tau1) - e(-t/tau2)) where A is a normalizing factor. The change in membrane potential caused by this input is given by dVm/dt = [(Vm' - Vm)/Ra + (ENa - Vm)*GNa + (EK - Vm)*GK + (Erest - Vm)/Rm + Iinject]/Cm ENa and EK are the ionic equilibrium potentials for each conductance. Rm is the membrane resistance and Cm is the membrane capacitance. Erest is the resting membrane potential and Iinject is an injection current. Vm' is the membrane potential of the adjacent compartment and Ra is the axial resistance between them. The network diagram for the model looks like this: ___ synaptic |ENa| weight |___| +-----------< |EK | DENDRITE | |___| | / \ | / cell1 \ SOMA | --------| | | +---------+ | | delay [ ] [ ] | ___ | | |ENa| >----+ | |___| | |EK | | |___| | / \ | / cell2 \ | --------| | +--------------+ axon Model description Page 3 The circuit diagram for each cell looks like this DENDRITE Vm o__________________________________________________________ | | | | | | | | | | | | | \ \ \ | | | --/--> --/--> / / \ ___|___ | GNa \ GK \ Rm \ / A \ _______ Cm | | | | \ | / | | | | | \ / | | ENa --EK --Erest --| Iinject| | ------------------| | | | | | | | \ |______________|_____________|________|________| / Ra \ | | | | SOMA AXON | Vm _____ o________________________________________________________________| |____\ | | | | | | | / | | | | | ----\ \ \ | | --/--> --/--> / | ___|___ HH-GNa \ HH-GK \ Rm \ / \ _______ Cm | | | / A \ | | | | \ | / | ENa --EK --Erest --\ / | ------------------| Iinject| | | | | | |______________|_____________|________|________| RUNNING THE SIMULATION ---------------------To start up the simulation change into the directory containing the MultiCell scripts (e.g. /usr/genesis/Scripts/MultiCell) and type 'genesis'. This should display a few messages and return with a 'genesis #0 >' prompt. To run the MultiCell demo type the following after the prompt: genesis #0 > MultiCell After 30 seconds or so the simulation graphics should appear. The control panel at the upper left of the screen contains buttons which control the starting and stopping of the simulation. To start, enter the duration of the simulation in the 'STEP' dialog box, then either press the 'Return' key or click on the 'STEP' button. At this point the simulation Model description Page 4 should begin running and the graphs should begin to display data. To interrupt the simulation at any time press the 'STOP' button. Pressing the 'STEP' button again will continue the simulation for an additional n msec where n is the value given in the STEP dialog. To return the simulation to its initial conditions and erase all graphs press the 'RESET' button. Toggling the 'overlay graphs' button will cause successive runs to be overlayed on the same graph. Pressing the 'QUIT' button will exit the simulator completely. The scales of the graphs can be changed by clicking on the 'scale' button associated with the graph, changing the values in the appropriate dialogs and pressing the 'DONE' button. Several graphs are displayed for each cell. The upper graph shows the membrane potential Vm vs time for the dendrite (upper) and the soma (lower). The lower graph plots the conductances GNa and GK vs time. ** Note: Most parameters can be varied while the simulation is actually running with immediate effect. For instance, changing the values of synaptic weights during execution will have directly observable effect on the magnitude of displayed membrane conductances and potentials. Delay parameters are an exception. After changing a delay parameter the simulation must be reset for the effects to be accurately accounted for. SCRIPTS ------The simulation uses these basic scripts. 'MultiCell.g' - the startup file for the model 'constants.g' - global constants used in the model specification 'channel.g' - functions for creating several types of channels 'compartment.g' - function for creating a basic compartment 'cells.g' - function for creating a basic neuron 'buttons.g' - functions used for buttons and other graphical objects. 'graphics.g' - the specification for the graphics display. To get your own copy of this simulation, copy all of these files into your own directory. The simulator also uses the following system toolbox scripts. 'tools.g' - generally useful simulation functions 'xtools.g' - generally useful graphics functions. These files should reside in the general system directory and do not need to copied. ADDITIONAL REQUIREMENTS ----------------------- The simulator reads a file called .simrc when it starts up. This file must be present in the current working directory or in the home directory of the user. If you dont have this file you should get a copy from the genesis system directory (normally located in /usr/genesis) and place it in your home directory. MultiCell.g Page 5 MultiCell.g ========================================================================= 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 //genesis echo " " echo "*************************************************" echo "* MultiCell *" echo "* A simple neuronal circuit simulation. *" echo "* *" echo "* Written by Matt Wilson *" echo "* California Institute of Technology *" echo "* 4/89 *" echo "*************************************************" echo " " prompt setclock setclock int echo echo echo echo echo "MultiCell 0 0.1 1 1.0 GRAPHICS = !" // set the prompt // simulation time step in msec // output interval 1 SIMULATION CONFIGURATION ========================= Hodgkin-Huxley multi-compartmental neurons (soma + dendrite) with synaptic connections //================================================== // STARTUP SCRIPTS //================================================== include constants.g include tools.g include xtools.g include channel.g 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 include compartment.g include cell.g if(GRAPHICS) include graphics.g end //================================================== // CELL1 //================================================== makeneuron(/cell1,30e-4,30e-4,100e-4,2e-4) position /cell1 100e-4 100e-4 500e-4 //================================================== // CELL2 //================================================== makeneuron(/cell2,10e-4,10e-4,100e-4,1e-4) position /cell2 200e-4 200e-4 500e-4 //================================================== // CONNECTIONS //================================================== MultiCell.g 53 synapse 54 55 */ 56 msec 57 synapses 58 59 60 61 msec 62 synapses 63 64 65 66 67 68 connect Page 6 /cell1/axon /cell2/soma/dend/Na_channel with /* set delay and weight parameters for connections from cell1 set /cell1/axon:0 delay weight 5 \ 30 // // /* set up connections for cell2 */ connect /cell2/axon /cell1/soma/dend/K_channel with synapse set /cell2/axon:0 delay 5 \ // weight 300 // //================================================== // provide current injection to cell 1 //================================================== set /cell1/soma inject 3e-4 // uA 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 //================================================== // OUTPUT //================================================== // write out the intracellular soma potentials to disk //================================================== disk_output /cell1/Vm1 ascii sendmsg /cell1/soma /cell1/Vm1 SAVE Vm disk_output /cell2/Vm2 ascii sendmsg /cell2/soma /cell2/Vm2 SAVE Vm //================================================== // GRAPHICS //================================================== if(GRAPHICS) loadgraphics makegraphics /cell1 makegraphics /cell2 580 120 end //================================================== // check and initialize the simulation //================================================== check reset adjustspike echo ================== echo Simulation loaded. echo ================== constants.g Page 7 constants.g ========================================================================= 1 //genesis 2 3 4 5 6 7 potential 8 9 10 11 12 13 14 randomseed -new float PI // initialize the random # generator = 3.14159 // channel equilibrium potentials mV float EREST = -70 // resting membrane float ENa float EK float Eleak = = = 115.0 + EREST -12.0 + EREST 10.6 + EREST // leakage potential // peak channel conductance mS/synapse float GNa = 80e-9 float GK = 40e-9 channel.g Page 8 channel.g ========================================================================= 1 //genesis 2 /* 3 functions defined in this script 4 =================================================================== ========== 5 FUNCTION NAME ARGUMENTS 6 =================================================================== ========== 7 makechannel (compartment,channel,Ek,tau1,tau2,gmax) 8 make_hhNa (compartment,channel,activearea,ENa,Erest) 9 make_hhK (compartment,channel,activearea,EK,Erest) 10 =================================================================== ========== 11 */ 12 13 // different forms for the HH rate coefficients 14 int EXPONENTIAL = 1 15 int SIGMOID = 2 16 int LINOID = 3 17 18 //================================================= 19 // BASIC TRANSMITTER ACTIVATED CHANNEL 20 //================================================= 21 function makechannel(compartment,channel,Ek,tau1,tau2,gmax) 22 str compartment 23 str channel 24 float Ek // mV 25 float tau1,tau2 // msec 26 float gmax // mS 27 28 create channelC2 {compartment}/{channel} 29 set ^ \ 30 Ek {Ek} \ 31 tau1 {tau1} \ 32 tau2 {tau2} \ 33 gmax {gmax} 34 link_channel2 {compartment}/{channel} {compartment} 35 end 36 37 //================================================= 38 // HH NA CHANNEL 39 //================================================= 40 function make_hhNa(compartment,channel,activearea,ENa,Erest) 41 str compartment 42 str channel 43 float activearea // cm^2 44 float ENa,Erest // mV 45 46 create hh_channel {compartment}/{channel} 47 set {compartment}/{channel} \ 48 Ek {ENa} \ // mV 49 Gbar {120.0*activearea} \ // mmhos/cm^2 50 Xpower 3.0 \ 51 Ypower 1.0 \ 52 X_alpha_FORM {LINOID} \ 53 X_alpha_A -0.1 \ // 1/mVmsec channel.g Page 9 54 X_alpha_B -10.0 \ // mV 55 X_alpha_V0 { 25.0 + Erest } \ // mV 56 X_beta_FORM {EXPONENTIAL} \ 57 X_beta_A 4.0 \ // 1/msec 58 X_beta_B -18.0 \ // mV 59 X_beta_V0 { 0.0 + Erest } \ // mV 60 Y_alpha_FORM {EXPONENTIAL} \ 61 Y_alpha_A 0.07 \ // 1/msec 62 Y_alpha_B -20.0 \ // mV 63 Y_alpha_V0 { 0.0 + Erest } \ // mV 64 Y_beta_FORM {SIGMOID} \ 65 Y_beta_A 1.0 \ // 1/msec 66 Y_beta_B -10.0 \ // mV 67 Y_beta_V0 { 30.0 + Erest } // mV 68 link_channel2 {compartment}/{channel} {compartment} 69 end 70 71 //================================================= 72 // HH K CHANNEL 73 //================================================= 74 function make_hhK(compartment,channel,activearea,EK,Erest) 75 str compartment 76 str channel 77 float activearea 78 float EK,Erest 79 80 create hh_channel {compartment}/{channel} 81 set ^ \ 82 Ek {EK} \ // 83 Gbar { 36.0 * activearea } \ mmhos/cm^2 84 Xpower 4.0 \ 85 Ypower 0.0 \ 86 X_alpha_FORM {LINOID} \ 87 X_alpha_A -0.01 \ // 88 X_alpha_B -10.0 \ // 89 X_alpha_V0 { 10.0 + Erest } \ // 90 X_beta_FORM {EXPONENTIAL} \ 91 X_beta_A 0.125 \ // 92 X_beta_B -80.0 \ // 93 X_beta_V0 { 0.0 + Erest } // mV 94 link_channel2 {compartment}/{channel} {compartment} 95 end compartment.g mV // 1/mV-msec mV mV 1/msec mV Page 10 compartment.g ========================================================================= 1 //genesis 2 /* 3 functions defined in this script 4 =================================================================== ========== 5 FUNCTION NAME ARGUMENTS 6 =================================================================== ========== 7 makecompartment (path,l,d,Eleak) 8 =================================================================== ========== 9 */ 10 11 //================================================= 12 // COMPARTMENT 13 //================================================= 14 function makecompartment(path,l,d,Erest) 15 str path 16 float l,d 17 float Erest 18 float area = l*PI*d 19 float xarea = PI*d*d/4 20 float rm = 10.0 // Kohm-cm^2 21 float cm = 1.0 // uF/cm^2 22 float ra = 0.05 // Kohm-cm 23 24 create compartment {path} 25 set {path} \ 26 Em { Erest } \ // mV 27 Rm { rm/area } \ // Kohm 28 Cm { cm*area } \ // uF 29 Ra { ra*l/xarea } // Kohm 30 end cell.g Page 11 cell.g ========================================================================= 1 //genesis 2 /* 3 functions defined in this script 4 =================================================================== ========== 5 FUNCTION NAME ARGUMENTS 6 =================================================================== ========== 7 makeneuron (path,soma_l,soma_d,dend_l,dend_d) 8 =================================================================== ========== 9 */ 10 11 //================================================= 12 // NEURON 13 //================================================= 14 function makeneuron(path,soma_l,soma_d,dend_l,dend_d) 15 str path 16 float soma_l,soma_d 17 float dend_l,dend_d 18 19 float active_area = soma_l*PI*soma_d*1.0 // 100% of the soma active 20 21 create neutral {path} 22 push {path} 23 //============================================= 24 // cell body 25 //============================================= 26 makecompartment(soma,{soma_l},{soma_d},{Eleak}) 27 position soma I I R{-soma_l/2.0} 28 29 //============================================= 30 // voltage dependent conductances 31 //============================================= 32 make_hhNa(soma,hh_Na,{active_area},{ENa},{EREST}) 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 make_hhK(soma,hh_K,{active_area},{EK},{EREST}) //============================================= // dendrite //============================================= makecompartment(soma/dend,{dend_l},{dend_d},{Eleak}) position soma/dend I I R{-dend_l/2.0} link_compartment soma/dend soma //============================================= // synaptic conductances on the dendrite //============================================= makechannel(soma/dend,Na_channel,{ENa},3.0,3.0,{GNa}) makechannel(soma/dend,K_channel,{EK},10.0,10.0,{GK}) //============================================= // spike detector //============================================= create spike spike set spike \ thresh 0 \ cell.g 54 55 56 detector */ 57 58 59 60 61 62 63 64 65 66 67 end Page 12 abs_refract 10 \ output_amp 1 /* use the soma membrane potential to drive the spike sendmsg soma spike INPUT Vm //============================================= // output axon //============================================= create axon axon /* use the spike detector output to drive the axon */ sendmsg spike axon BUFFER name pop MultiCell.g Page 13 ========================================================================= == MultiCell.g ========================================================================= == This is the main simulation script. It invokes the scripts used to construct the model as well as the graphics. To start up the simulation enter 'MultiCell' at the simulator command line. genesis #0 > MultiCell line 1 : //genesis This comment line should be placed at the beginning of each GENESIS script. This distinguished the file from an ordinary text file or a shell script which otherwise would be executed as a GENESIS script if invoked from the command line. The spacing of the line is not important but it must precede any other non-blank text. line 2-11 : echo "* MultiCell *" The echo command is used to print text to the standard output (normally the screen). Each argument to the echo command is concatenated with a single space between them and then output. Since white space is used to separate command line arguments a line such as: echo * MultiCell * will actually call the echo command with the three arguments arg 1: * arg 2: MultiCell arg 3: * which will then be concatenated and displayed as * MultiCell * To preserve spacing, the command echo "* MultiCell *" will call echo with the single argument arg 1: * MultiCell * and display * MultiCell * Note the use of the string delimiters "" to place white space into a single argument. The string delimiters can be used in other contexts which require grouping of text into single string arguments. line 12 : Empty lines are ignored by the interpreter and can be used to improve the readability of scripts. line 13 : prompt "MultiCell !" This sets the prompt string used by the simulator when waiting for keyboard input. The prompt "genesis !" is used by default. The '!' character in the prompt string will be replaced by the current command number which can be used in conjunction with the command line history recall mechanisms (see also 'history') Note the use of single line comments which are started with the characters '//'. Any text following these characters MultiCell.g Page 14 up to the carriage return at the end of the line will be treated as a comment and ignored. line 14 : setclock 0 0.1 The simulator contains an array of 100 interval timers called clocks. These clocks are used to call element functions (see 'objects' and 'clocks') at the desired intervals during a simulation. Clock 0 is the basic simulation clock. Each simulation step will advance the simulation time by this amount. Each element uses clock 0 by default and, therefore, is called on each time step. This command sets the basic simulation clock to the value of 0.1 time units (msec in this simulation). line 15 : setclock 1 1.0 This assigns clock 1 the value of 1.0. This clock is used to drive output elements such as graphs and disk file storage, which can be simulated at a slower rate to reduce computational overhead (see also 'useclock'). line 16 : int GRAPHICS = 1 The interpreter allows the definition of global variables which are accessible to scripts and interpreter functions. There are three types of variables supported: int integer float floating point str string This command creates a global variable called GRAPHICS and assigns it the value of 1. The variable name is capitalized only for readability and is not a requirement. Variables can also be defined without being assigned a value. For example, the following is a valid global variable declaration: int GRAPHICS Global variables which have already been declared can later be assigned values. For example, following the declaration above GRAPHICS could be assigned the value 1 using GRAPHICS = 1 line 18-22 : echo SIMULATION CONFIGURATION Prints out a message describing the configuration of the neurons in the simulation (see lines 2-11 for a description of the 'echo' command) line 24-26 : // STARTUP SCRIPTS One line comments which do not print anything to the screen as in 'echo' and are used for readability of scripts. (see also line 13) line 27 : include constants.g The 'include' command causes the named script to be read in at that point and executed as though the text were actually included in the script which invoked it. The script 'constants.g' defines global variables which are used by other scripts in the simulation. (see the description of constants.g). MultiCell.g Page 15 line 28 : include tools.g tools.g contains general functions which are frequently used and therefore have been placed in the general system toolbox. see description of tools.g (see also line 27) line 29 : include xtools.g xtools.g contains graphical functions which are frequently used and therefore have been placed in the general system toolbox. see description of xtools.g (see also line 27) line 30 : include channel.g channel.g contains functions used to define and add various types of channels to a compartment. see description of channel.g (see also line 27) line 31 : include compartment.g compartment.g contains the function used to create and link together compartments. see description of compartment.g (see also line 27) line 32 : include cell.g cell.g contains the function used to construct a single multicompartment neuron. see description of cell.g (see also line 27) line 34 : if(GRAPHICS) The interpreter supports the 'if' conditional statement. The expression between the parentheses will be evaluated. If the value of the expression is non-zero then all statements between the if and the matching else or end will be executed. Examples of valid if statements are: if(1) echo hello end if(1); echo hello; end if((GRAPHICS == 1) || (5+3 > 10)) echo hello end Note the use of the semi-colon in example 2 which can be used as an end-of-statement delimiter not only in the case of 'if's but in any context. In the specific case of line 34, the global variable GRAPHICS is being used as a flag for invoking the graphical components of the simulation. If GRAPHICS is not zero then the graphics script specified in line 35 will be invoked. line 35 : include graphics.g graphics.g contains functions used to create the graphical interface to the simulation. see description of graphics.g (see also line 27) line 36 : end This is the matching 'end' for the 'if' in line 34. All MultiCell.g Page 16 'if' statements MUST have a matching 'end' or bad things will happen. (see also line 34) line 38-40 : // CELL1 comment. see line 25-27 line 41 : makeneuron(/cell1,30e-4,30e-4,100e-4,2e-4) This line invokes a function defined in cell.g which constructs a single neuron called '/cell1', with a soma 30 microns in length (30e-4 cm) and 30 microns in diameter, and a dendrite 100 microns in length and 2 microns in diameter. Note that the parameters to the function have been placed within parentheses in a comma-separated form. This is the 'function-call' format. This is not necessary in this context and the function could have been invoked as makeneuron /cell1 30e-4 30e-4 100e-4 2e-4 in the 'command-line' format with the same results. line 42 : position /cell1 100e-4 100e-4 500e-4 The position command moves an element to the specified xyz coordinates. All of the sub-elements in the tree beneath it will be also be moved, preserving relative positions relationships between the sub-elements. In the case of line 42, '/cell1' is positioned at location x = 100um, y=100um at a depth of 500um. When the cell was created in line 41, /cell1 was given the coordinates x=0,y=0,z=0 and the soma and dentritic compartments were given coordinates of x=0,y=0,z=-15um and x=0, y=0, z=-80um respectively (the centers of each compartment). Following the 'position' command of line 42 /cell1 would have the coordinates x=100,y=100,z=500 and its soma and dendrite would have coordinates x=100um,y=100um,z=485um and x=100um,y=100um,z=420um. The use of the 'position' command in this context should be contrasted with the use of the 'set' command which does not adjust the coordinates of subelements. If the command set /cell1 x 100e-4 y 100e-4 z 500e-4 had been used, only the coordinates of /cell1 would have been assigned the values of x=100um,y=100um,z=500um and the coordinates of its soma and dendrite would have remain unchanged. line 44-46 : // CELL2 comment. see line 25-27 line 47 : makeneuron(/cell2,10e-4,10e-4,100e-4,1e-4) constructs a single neuron called '/cell2', with a soma 10 microns in length and 10 microns in diameter, and a dendrite 100 microns in length and 1 micron in diameter. (see also line 41) line 48 : position /cell2 200e-4 200e-4 500e-4 places /cell2 at location x=200um, y=200um, at a depth of 500um. (see also line 42) MultiCell.g Page 17 line 50-52 : // CONNECTIONS comment. see line 25-27 line 53 : 'segment' connect /cell1/axon /cell2/soma/dend/Na_channel with synapse The 'connect' command establishes a single synaptic connection between a 'projection' class element and a class element with the specified synapse type. A connection allows communication of information between elements with arbitrary delay and with the ability to operate on the communicated information using a synaptic transformation. Thus it is a more powerful (but also more costly) means of passing information between components of a simulation. In this case the axon of cell1 is interconnected to the sodium channel on the dendrite of cell2. 'synapse' is a particular type of synaptic transformation which performs simple multiplication of presynaptic events with a synaptic weight to compute the resulting postsynaptic activation. The axon generates impulse spike events which reach the sodium channel after a delay stored in the connection. The amplitude of this spike event is multiplied by the synaptic weight. The resulting value is used as the amount of transmitter activating the dendritic sodium channel. (see also lines 56-57) line 55 : */ /* set delay and weight parameters for connections from cell1 This is an example of a 'C' style comment which can extend over multiple lines. The characters '/*' are used to indicate the beginning of a comment while '*/' indicate the end of a comment. All characters between these delimiters are ignored by the interpreter and are used strictly for readability of the script. line 56-57 : set /cell1/axon:0 delay 5 \ // msec The 'set' command allows the contents of the element data structure to be changed (see also 'create' and 'object' commands). The general syntax of this command is set [path][:connection] field value [field value ...] The path is the pathname of an element or a list of elements (if wildcarding is used). If this is omitted then the current working element is used (see also 'pwe'). In this case the path identifies the single element '/cell1/axon'. If the path is a 'projection' class element which has connections from it, the individual connections can be identified using the ':connection' notation. Connections can be identified by number or by destination. For example :0 refers to the first connection of the axon, :0-5 would refer to the first 6 connections of the axon, :# refers to all of the connections of the axon, and :@/cell2/soma/dend/Na_channel would refer to the connection leading to the element MultiCell.g Page 18 /cell2/soma/dend/Na_channel. In the case of line 56, the 'axon' has only one connection. This connection can be referred to as either :0 or as :@/cell2/soma/dend/Na_channel. The 'field' is the name of a parameter field contained in the data structure of the named element or connection. The contents of this field will be changed to the specified 'value' when the command is executed. Multiple fields may be set in a single command. In this case the two fields 'delay' and 'weight' are being set to the values 5 and 30 respectively. The delay refers to the time between the generation of a spike event by the axon (/cell1/axon) and the arrival of that event at the target (/cell2/soma/dend/Na_channel). The weight multiplies the spike amplitude (always 1 in this case) and uses this value to activate the target channel (simulating a pulse of transmitter)(see also line 53). The weight has no intrinsic units. In this simulation it has been assigned the units of 'number of synapses'. line 59 : /* set up connections for cell2 */ comment. see line 55 line 60 : connect /cell2/axon /cell1/soma/dend/K_channel with synapse This establishes a connection between the 'projection' class element '/cell2/axon' (axon) and the 'segment' class element /cell1/soma/dend_K_channel (potassium channel). (see also line 53) line 61-62 : set /cell2/axon:0 delay 5 \ // msec Assigns the delay and weight of the connection created in line 60. (see also line 56-57) line 64-65 : // provide current injection to cell 1 comment. see line 24-26 line 67 : set /cell1/soma inject 3e-4 // uA This command sets the injection field of the compartment '/cell1/soma'. The compartment will receive a steady current injection of .3 nA until the value of this field is changed. To stop the current injection the command set /cell1/soma inject 0 could be used (see also line 56-57). line 69-73 : // OUTPUT comment. see line 25-27 line 74 : disk_output /cell1/Vm1 ascii disk_output is a function defined in the system tools script 'tools.g' found in the system startup directory. This function creates an element which saves simulation data to a disk file in either ascii or special binary form. The general syntax of the command is disk_output path ascii/binary Note that this command only creates the output element MultiCell.g Page 19 and does not indicate what information is to be saved (see line 75). When the simulation is run, output will be saved to disk at intervals determined by clock 1 (see line 15). The default name of the data file is the same as the name of the element. (see also the 'asc_file' object description). In the case of line 74 the function will create an element called '/cell1/Vm1' which will save data in ascii form in a file called 'Vm1'. line 75 : sendmsg /cell1/soma /cell1/Vm1 SAVE Vm The general syntax of the sendmsg command is sendmsg source destination msgtype arg1 arg2 ... Sending messages is the way in which the simulator allows the destination element to access the specified information in the source. Along with simply giving access to the specified fields the message also indicates what the destination is to do with that information. A single destination element may be capable of handling many different 'types' of messages, each requiring different pieces of information used for different functions. In the case of line 75 the type of the message is 'SAVE' which has a single field name as its argument. Different objects will have different message types which they are capable of handling. To list the types of messages and the arguments they require, use either the showobject 'objectname' command for objects (element definitions) or the show path *b command for elements (created instances of objects) The command in line 75 sends a message from the compartment '/cell1/soma' to the file output element '/cell1/Vm1' with the instructions to SAVE the data contained in field 'Vm' (membrane potential) of the compartment. (see also the 'sendmsg' command, 'objects', 'show' and 'messages') line 77 : disk_output /cell2/Vm2 ascii creates an element called /cell2/Vm2 which will save ascii data in a file called Vm2. (see line 74) line 78 : sendmsg /cell2/soma /cell2/Vm2 SAVE Vm Sends a message from /cell2/soma to /cell2/Vm2 instructing it to save the membrane potential Vm to disk. (see line 75 for discussion of sendmsg command) line 80-82 : // GRAPHICS comment. (see line 25-27) line 83 : if(GRAPHICS) conditional. (see line 34) line 84 : loadgraphics If the conditional in line 83 is true then this function will be activate the graphical interface and construct the main control panel. The function itself is defined MultiCell.g Page 20 in the script 'graphics.g' line 85 : makegraphics /cell1 This function (defined in the script graphics.g) constructs a graphical control panel for the named cell. The function has optional x,y screen coordinate arguments (see line 86). line 86 : makegraphics /cell2 580 120 Construct the graphical control panel for /cell2 and place it at screen location x=580, y=120 (in pixels) (see line 85). line 87 : end Matching 'end' for the 'if' in line 83. (see line 36) line 89-91 : // check and initialize the simulation comment. (see line 25-27) line 92 : check Each element capable of checking its own consistency is called with the CHECK action and reports the results. Usually this takes the form of a printed warning that an error has been found. This should be performed before running a simulation whenever the simulation has been significantly changed for instance by adding new components. line 93 : reset Reset returns the simulation to its initial state. Each element requiring resetting is called with the RESET action. This must be performed at least once before executing a simulation. line 94 : adjustspike This function adjusts the amplitude of spike inpulses to normalize the area under the impulse to a value independent of the time step. This should be executed whenever the time step is changed. line 96-98 : echo Simulation loaded. echo. (see lines 2-11) constants.g Page 21 ========================================================================= == constants.g ========================================================================= == line 1 : //genesis script header. (see line 1 of MultiCell.g) line 2 : randomseed -new initialize the random number generator. The arguments to randomseed can be either an integer seed or -new. A seed can be used when it is desirable to generate a reproducible random number sequence. The -new option uses the current date (yr:mo:da:hr:min:sec) as a seed thereby producing a new random sequence each time it is invoked. line 4 : float PI = 3.14159 This command creates a global variable called PI and assigns it the value of 3.14159. This variable is used for calculating cylindrical volumes and areas of dendritic compartments. (for discussion of global variables see line 16 of MultiCell.g) line 7 : EREST = -70 EREST is used to define the resting membrane potential for the soma and dendrite of each neuron. (for discussion of global variables see line 16 of MultiCell.g) line 8 : ENa = 115.0 + EREST Ena is used to define the equilibrium potential for sodium channels. This value is used by both the synaptically activated channels as well as the voltage dependent Hodgkin-Huxley channels. The value of 115 mV is based on values for the squid giant axon referenced to a resting potential of 0 mV. The EREST term allows the value of ENa to be referenced to arbitrary resting potentials. (for discussion of global variables see line 16 of MultiCell.g) line 9 : EK = -12.0 + EREST EK is used to define the equilibrium potential for potassium channels. (see line 9) (for discussion of global variables see line 16 of MultiCell.g) line 10 : Eleak = 10.6 + EREST Eleak defines the membrane leakage potential. The value of 10.6 results in zero net current flow at the resting potential in membrane containing the squid voltage dependent sodium and potassium channels. (see line 9) (for discussion of global variables see line 16 of MultiCell.g) line 13 : GNa = 80e-9 GNa defines the peak conductance for synaptically activated sodium channels. (80 pS/synapse) (for discussion of global variables see line 16 of MultiCell.g) constants.g line 14 : Page 22 GK = 40e-9 GK defines the peak conductance for synaptically activated potassium channels (40 pS/synapse) (for discussion of global variables see line 16 of MultiCell.g) channel.g Page 23 ========================================================================= == channel.g ========================================================================= == line 1 : //genesis script header. (see line 1 of MultiCell.g) line 2-11 : functions defined in this script C style comment. (see line 55 of MultiCell.g) line 13-17 : // different forms for the HH rate coefficients comment. (see line 13 of MultiCell.g ) line 14-16 : int EXPONENTIAL = 1 The three variables EXPONENTIAL, SIGMOID, and LINOID are used by the Hodgkin-Huxley channels to determine the functional form of the voltage dependent rate coefficients. The use of GLOBAL variables is simply to enhance the readibility of the script since using functional form of EXPONENTIAL is more descriptive than functional form 1. (see line 47 and 81 for use of the variables) (see line 9 of MultiCell.g for description of global variables) line 18-20 : // BASIC TRANSMITTER ACTIVATED comment. (see line 13 of MultiCell.g ) line 21 : function makechannel(compartment,channel,Ek,tau1,tau2,gmax) The 'function' keyword is used to define a named interpreted function. The general form for function definitions is: function name or function name(arg1[,arg2,...argn]) All script commands contained between the 'function' keyword and the matching 'end' statement will be executed when the function name ('overlaytoggle' in this case) is invoked from the keyboard or within a script. Example: function test echo I will try end This defines a function called 'test'. Invoking the command test will cause the echo statement to be executed. Example: > test I will try Arguments can be passed to functions. These arguments can be assigned variable names in the function definition. Example: function test(value) echo OK {value} channel.g Page 24 end This defines a function called 'test' which will accept an argument. Within the function this argument can be referred to using the name 'value'. To use this argument within the function the curly brackets {} are used to get the value of the variable. Example: > test this I will try this Multiple arguments can be passed to a function. These arguments can be assigned names within the function by using a comma separated argument list when defining the function. Example: function test(value1,value2) echo I will try again {value1} {value2} end > test this again I will try this again In line 21 the function 'makechannel' is defined with six arguments. This function uses these arguments to construct a synaptically activated channel on the specified compartment. line 22-26 : str compartment Any variables defined between the 'function' keyword and its matching end statement are local variables. Local variables are distinct from global variables in that they have value only within the function in which they are defined. These variables cannot be referred to outside of their function and when the function execution is complete they are removed and their values are lost. Therefore they cannot be used for permanent storage of information as with global variables. Local variables are defined using the same syntax as global variables. (see line 16 MultiCell.g ) There is no way to define a global variable from within a function. In line 22-26 the local variables correspond to the named variables in the function argument list of line 21. These allow the type of each argument to be explicitly declared. If these statements were omitted each argument would default to string (str) type. Thus lines 22 and 23 which define compartment and channel to be strings are redundant and are included only for clarity. The remaining arguments are specified as floating point numbers. line 28 : create channelC2 {compartment}/{channel} The general form of the create command is create object_name pathname [options] Create takes an object specification and creates an instance of it called an element. This new element resides in the element tree hierarchy and channel.g Page 25 is referred to by the pathname. The new element has its own data area for parameters and variables and uses the specific functions which allow it to simulate the specified object. The creation of some objects can be modified through the use of options. This will be a function of specific objects but occurs most frequently with graphical objects. The list of valid objects can be obtained using the 'listobjects' command. Line 46 creates an element using the channelC2 object specification. This new element will have the path given by {compartment}/{channel} where 'compartment' and 'channel' are local variables passed into the 'makechannel' function. 'channelC2' implements a simple second-order synaptically activated, time dependent conductance which also computes channel current. line 29-33 : set ^ \ Set the parameters associated with the newly created channel element. These parameters specify the time course of the (tau1,tau2) the amplitude (gmax) of the synaptically activated conductance. Ek is used in the calculation of channel current. The ^ is a shorthand notation for the most recently created (or copied) element. Thus in this context ^ is equivalent to the path {compartment}/{channel} used to create the channel in line 28. The backslash (\) allows the command to be continued on another line. All text following the backslash on the same line will be ignored. (see also line 56-57 of MultiCell.g for discussion of the set command) line 34 : link_channel2 {compartment}/{channel} {compartment} link_channel2 is function defined in the system tools script 'tools.g'. This function establishes functional connections between a compartment and a channel using messages. (see also line 75 of MultiCell.g for discussion of messages) line 35 : end This is the matching end for the 'function' statement in line 21. (see also line 34 of MultiCell.g) line 37-39 : // HH NA CHANNEL comment. (see line 13 of MultiCell.g ) line 40 : function make_hhNa(compartment,channel,activearea,ENa,Erest) Defines a function which creates a Hodgkin-Huxley voltage dependent sodium channel. Hodgkin-Huxley parameters are normalized to an area of membrane specified by the activearea argument. The ENa argument sets the equilibrium potential for sodium while Erest is the resting potential of the compartment to which the channel will be added. (see line 21 for discussion of functions) channel.g Page 26 line 41-44 : str compartment These local variable definitions give the types of the function arguments. The 'compartment' is the pathname of the compartment onto which the new channel will be added. 'channel' is the name of the new channel. (see also line 22-26 for discussion of local variables) line 46 : create hh_channel {compartment}/{channel} Line 46 creates an element using the hh_channel object specification. This new element will have the path given by {compartment}/{channel} where 'compartment' and 'channel' are local variables passed into the 'makechannel' function. (see line 28 for discussion of create) line 47-67 : set {compartment}/{channel} \ (see line 29-33) (see also line 56-57 of MultiCell.g for discussion of the set command) line 68 : link_channel2 {compartment}/{channel} {compartment} (see line 34) line 69 : end This is the matching end for the 'function' statement in line 40. (see also line 34 of MultiCell.g) line 71-73 : // HH K CHANNEL comment. (see line 13 of MultiCell.g ) line 74 : function make_hhK(compartment,channel,activearea,EK,Erest) Defines a function which creates a Hodgkin-Huxley voltage dependent potassium channel. (see line 40) line 75-78 : str compartment (see line 41-44) line 80 : create hh_channel (see line 46) {compartment}/{channel} line 81-93 : set ^ \ (see also line 29-33) line 94 : link_channel2 (see line 34) {compartment}/{channel} {compartment} line 95 : end This is the matching end for the 'function' statement in line 74. (see also line 34 of MultiCell.g) compartment.g Page 27 ========================================================================= == compartment.g ========================================================================= == line 1 : //genesis script header. (see line 1 of MultiCell.g) line 2-9 : functions defined in this script C style comment. (see line 55 of MultiCell.g) line 11-13 : // COMPARTMENT comment. (see line 13 of MultiCell.g) line 14 : function makecompartment(path,l,d,Erest) Makes a cylidrical compartment on the element given by the path variable with dimensions of length l, and diameter d. The resting membrane potential of the compartment is given by Erest. (for description of functions see line 21 of channel.g) line 15-17 : str path local variable declarations for the function arguments. (see line 14) (for description of local variables see line 22-26 of channel.g) line 18-19 : float area = l*PI*d calculate the surface area of the cylinder given by the length and diameter arguments to the function. Note that expression evaluation brackets are not necessary for the right hand side of the variable assignment. This is because the assignment operation automatically assumes expression evaluation. line 20-22 : float rm = 10.0 assign a local variable the value of membrane resistivity used in calculating membrane resistance (see line 25-29) line 24 : create compartment {path} creates an element called {path} using the compartment object specification. 'path' is a local variable passed into the function. (see line 28 of channel.g for discussion of create command) line 25-29 : set {path} \ set the parameters associated with the compartment element. These parameters include the resting membrane potential Em, the membrane resistance Rm, the membrane capacitance Cm, and the axial resistance of the compartment Ra. (see line 29-33 of channel.g and line 56-57 of MultiCell.g for discussion of the 'set' command) line 30 : end This is the matching end for the 'function' statement in line 14. (see also line 34 of MultiCell.g) cell.g Page 28 ========================================================================= == cell.g ========================================================================= == line 1 : //genesis script header. (see line 1 of MultiCell.g) line 2-9 : functions defined in this script C style comment. (see line 55 of MultiCell.g) line 11-13 : // NEURON comment. (see line 13 of MultiCell.g) line 14 : function makeneuron(path,soma_l,soma_d,dend_l,dend_d) This function creates a neuron at location 'path' containing a soma and a dendrite. The dimensions for each compartment are passed to the function. The soma contains voltage dependent Hodgkin-Huxley sodium and potassium conductances while the dendrite contains synaptically activated sodium and potassium conductances. (see line 21 of channel.g for discussion of functions) line 15-17 : str path Local variable definitions for the arguments to the makeneuron function. (see line 22-26 of channel.g for discussion of local variables) line 19 : float active_area = soma_l*PI*soma_d*1.0 Calculates the area of active Hodgkin-Huxley membrane used as a fraction of the total somatic membrane. line 21 : create neutral {path} Create an element called {path} using the neutral object specification. A neutral object is one which performs no function during the simulation and is simply used to organize elements in the hierarchy. (see line 22 of channel.g for discussion of the create command) line 22 : push {path} saves the current working element on a changes the current working element to specified by the 'path' variable. This when one wishes to temporarily visit a and then return. stack and the element is used different element line 26 : makecompartment(soma,{soma_l},{soma_d},{Eleak}) This calls the function defined in compartment.g to add a compartment whose pathname is given by the value of soma with dimensions given by soma_l (length) and soma_d (diameter). line 27 : position soma I I R{-soma_l/2.0} sets the position of the newly created soma compartment to -1/2 of the length of the compartment relative to the cell.g Page 29 parent or neuron location. The 'I' arguments in the locations of the x,y coordinates tells the function to 'ignore' x and y, leaving them with their original values. The R modifier indicates that the given coordinate is to be taken relative to the parent element (the element above the specified element in the hierarchy) rather than as an absolute coordinate. (see line 42 of MultiCell.g for discussion of the position command) line 32 : make_hhNa(soma,hh_Na,{active_area},{ENa},{EREST}) calls the function defined in 'channel.g' to create a Hodgkin-Huxley voltage dependent sodium channel on the soma over the specified area. line 33 : make_hhK(soma,hh_K,{active_area},{EK},{EREST}) calls the function defined in 'channel.g' to create a Hodgkin-Huxley voltage dependent potassium channel on the soma over the specified area. line 38 : makecompartment(soma/dend,{dend_l},{dend_d},{Eleak}) adds a dendritic compartment to the soma with the specified dimensions. (see line 26) line 39 : position soma/dend I I R{-dend_l/2.0} sets the position of the dendrite to -1/2 the length of the dendritic compartment relative to the soma. (see line 27) line 40 : link_compartment soma/dend soma link_compartment is function defined in the system tools script 'tools.g'. This function establishes functional connections between two compartments using messages. In this case it creates an axial coupling between the soma and dendritic compartments. (see also line 75 of MultiCell.g for discussion of messages) line 45 : makechannel(soma/dend,Na_channel,{ENa},3.0,3.0,{GNa}) This calls the function defined in channel.g to add a synaptically activated channel to the dendrite of the neuron (compartment soma/dend) called Na_channel. The equilibrium potential of the channel is given by the value of ENa. The time course of the conductance is given by the two time constants 3.0 and 3.0 msec which result in an alpha function form with a peak 3 msec. The amplitude of the conductance is given by the value of GNa. The parameters are designed to make this channel behave like a sodium channel but the channel itself does not presuppose any ionic type. line 46 : makechannel(soma/dend,K_channel,{EK},10.0,10.0,{GK}) create a synaptically activated potassium channel on the dendrite of the neuron. (see line 45) cell.g line 51 : Page 30 create spike spike create a spike generation element using the spike object and call it spike. The spike generation element uses the level of the membrane potential, a threshold, and a refractory period to determine whether to generate a spike at each time step of the simulation. When using Hodgkin-Huxley channels to produce realistic action potentials, this component serves as a spike discriminator. Without Hodgkin-Huxley the spike element can serve as an integrate and fire model for neuronal output. In general, any model which requires propagation of impulse events such as spikes will use this strategy. (see line 28 of channel.g for discussion of the create command) line 52-55 : set spike \ set the parameters of the spike generation element. The thresh parameter sets the threshold level for spike generation. When a spike is generated it is given the amplitude output_amp. (see line 29-33 of channel.g and line 56-57 of MultiCell.g for discussion of the 'set' command) line 57 : sendmsg soma spike INPUT Vm sends a message from the soma of the neuron to the spike generation element telling it to use the membrane potential Vm as the input to trigger spike production. (see line 75 of MultiCell.g for discussion of the sendmsg command) line 62 : create axon axon create an axonal output element using the axon object and call it axon. The axon output element takes a buffer or history of events (e.g. spikes) and sends them out to other elements with which it has synaptic connections with the appropriate delay. (see line 28 of channel.g for discussion of the create command) line 64 : sendmsg spike axon BUFFER name sends a message from the spike generation element to the axonal output element telling it to use the history of spike events to drive the axon. (see line 75 of MultiCell.g for discussion of the sendmsg command) line 66 : pop restore the current working element to the element pushed in line 22. Thus the current working element is the same leaving the function as it was entering regardless of movement about the hierarchy while cell.g Page 31 executing the makeneuron function. line 67 : end This is the matching end for the 'function' statement in line 14. (see also line 34 of MultiCell.g) Exercises Page 32 Exercises --------For all of these exercises you should create a new script file called 'exercises' and place the commands to complete each exercise in this file. Note that the first line in the file must be the genesis header //genesis. After completing the exercises, run the simulator and load in the MultiCell simulation. Following this, load in the exercises script by typing 'exercises'. Exercise 1) create a third cell called cell3 with soma dimensions 20 um length 20 um diameter, and dendritic dimensions 200 um length 1.5 um diameter. Exercise 2) make a graphics control panel for the cell created in exercise 2 Exercise 3) make an inhibitory connection from cell3 to cell2 and an excitatory connection from cell1 to cell3. Exercise 4) save the membrane potential Vm of the cell3 dendrite to an ascii file called Vmdend. Exercise 5) using script commands (not the graphical interface) set the weight of the connection from cell1 to cell3 to 50. Set the weight from cell3 to cell2 to 100. Exercise solutions Page 33 Exercise solutions -----------------Solution 1) makeneuron(/cell3,20e-4,20e-4,200e-4,1.5e-4) (see line 41 of MultiCell.g, pages 6 and 16 of the documentation) Solution 2) makegraphics /cell3 (see line 85 of MultiCell.g, pages 6 and 20 of the documentation) Solution 3) For the inhibitory connection from cell3 to cell2 connect the axon of cell3 to the hypolarizing channel (potassium) of cell2 using the command connect /cell3/axon /cell2/soma/dend/K_channel with synapse Note that in this type of model inhibitory connections can not be constructed using negative weights which would result in negative conductance at the destination. For the excitatory connection from cell1 to cell3 connect the axon of cell1 to the depolarizing channel (sodium) of cell3 with connect /cell1/axon /cell3/soma/dend/Na_channel with synapse Note that the default delay and weight for newly constructed synapses is 0. (see line 53 of MultiCell.g, pages 6 and 17 of the documentation) Solution 4) First we must create the element which will save the data to disk in the appropriate format using the command disk_output /cell3/Vmdend ascii Then we must send a message to this element indicating what information is to be saved using sendmsg /cell3/soma/dend /cell3/Vmdend SAVE Vm (see line 74 of MultiCell.g, pages 6 and 18 of the documentation) Solution 5) To set the weight of the connection from cell1 to cell3 use the set command set /cell1/axon:@/cell3/soma/dend/Na_channel weight 50 Note that the connection is actually from the axon of cell1 to the sodium channel on the dendrite of cell3. To set the weight of the connection from cell3 to cell2 use set /cell3/axon:@/cell2/soma/dend/K_channel weight 100 (see line 56-57 of MultiCell.g, pages 6 and 17 of the documentation) Index A axon C Cm cell check channel comment compartment conductance connect create D delay disk E Erest echo element 2,6,12,17,18, 21,30,33 Page 34 28,29,30,31, 32,33 expression 15,27 F 2,3,10,27 float 7,8,9,10,11, 1,2,3,4,5,6, 14,21,24,27, 11,15,16,17, 28 18,19,20,28, function 2,4,8,9,10, 32,33 11,14,15,16, 6,20 18,19,20,23, 1,2,4,5,6,7, 24,25,26,27, 8,9,11,15,17, 28,29,30,31 18,21,22,23, 24,25,26,27, G 28,29,30,33 GK 2,3,4,7,11, 1,13,14,16, 22,29 17,18,19,20, GNa 2,3,4,7,11, 23,25,26,27, 21,29 28 global 4,14,15,21, 1,2,4,5,8,9, 22,23,24 10,11,15,16, graphics 3,4,5,6,13, 18,19,21,23, 15,19,20,32, 24,25,26,27, 33 28,29 2,4,7,11,21, H 22,25,28,29, Hodgkin-Huxley 2,5,21,23,25, 33 26,28,29,30 5,6,17,18,25, 29,30,32,33 I 8,9,10,11,12, if 2,4,5,6,8,13, 14,15,16,17, 15,16,17,18, 18,19,21,24, 19,20,23,24, 25,26,27,28, 25,26,27,28, 29,30,32,33 29 include 5,14,15,24, 27 2,4,6,17,18, inject 2,3,6,18 30,33 int 3,4,5,6,8,13, 6,14,18,19, 14,15,17,18, 33 19,20,21,23, 24,25,26,27, 30,32 2,3,8,9,10, 25,26,27 L 5,6,13,14,15, local 24,25,26,27, 20,23,24 28 14,16,17,18, 19,20,24,25, M end 26,27,28,29, 30,33 2,4,5,6,8,9, 10,11,12,14, 15,16,17,18, 19,20,21,23, 24,25,26,27, makechannel 8,11,23,24, 25,26,29 makecompartment 10,11,27,28, 29 makegraphics 6,20,33 makeneuron 5,11,16,28, 31,33 Index message 3,14,19,25, 29,30,33 Page 35 Vm 2,3,4,6,12, 18,19,30,32, 33 N neuron P path 2,4,5,11,14, W 15,16,21,28, weight 29,30,31,33 prompt push 10,11,17,18, 19,24,25,26, 27,28 12,30 5,11,16,28, 29 3,5,13 11,28,30 R Rm random reset 2,3,10,27 7,21 4,6,20 pop position S script sendmsg set setclock 1,3,4,8,10, 11,13,14,15, 17,18,19,20, 21,23,25,27, 28,29,32 6,12,19,30, 33 4,5,6,8,9,10, 11,13,14,16, 17,18,20,25, 26,27,28,29, 30,32,33 5,14 2,4,6,17,18, 32,33 soma spike str synapse T tau threshold V 2,4,5,6,11, 12,16,17,18, 19,21,28,29, 30,32,33 2,6,11,12,17, 18,20,30 8,9,10,11,13, 14,15,16,17, 18,19,20,24, 26,27,28,30, 33 6,7,17,18,21, 22,33 2,8,23,25 30