/** * This model implements a morphologically extended version of the fast-spiking * neuron by Golomb et al. * Conductances were taken from: * Golomb, Donner, Shacham, Shlosberg, Amitai Y, et al. (2007) * Mechanisms of Firing Patterns in Fast-Spiking Cortical Interneurons. * PLoS Comput Biol 3(8): e156. doi:10.1371/journal.pcbi.0030156. */ paron -parallel /* Simulation time and other simulation parameters. */ float T = 4.0 /* Print some info. */ if ({mynode} == 0) echo "*****************************************************************************" echo "Number of nodes: "{nnodes} echo "T = "{T}" sec" echo "*****************************************************************************" end float spikeoutdt = 1e-3 float vmoutdt = 1e-4 float simdt = 1e-5 int spikesteps = {T / simdt} include protodefs include protocols include utils setrand -sprng randseed /* Set the clocks. */ setclock 2 {1.0e-4} setclock 1 {vmoutdt} setclock 0 {simdt} /************************************************************************** * Model configuration **************************************************************************/ /* Flags for electrical coupling [GJ = 1 (soma), 2 (primary dendrites), or * 3 (secondary dendrites)], current injection from file (CI = 1) and * synaptic input from file (SI = 1). */ int GJ = 0 int CI = 1 int SI = 0 int n float GJcond = 0.5e-9 /* Read the cell description and create a second FS model neuron. */ readcell fsn_soma_dend.p /fsn[{mynode}] /* Current step injection into one of the FS cells if mynode==0 or 1. */ if ({mynode} == -1) create pulsegen /pulse_inj setfield /pulse_inj level1 50.0e-12 delay1 0.5 width1 2.0 level2 0.0 delay2 0.0 width2 100.0 \ baselevel 0.0 trig_mode 0 raddmsg /pulse_inj /fsn[0]/soma INJECT output end /* Compartment name. */ str pchan /* Scale channel density. */ float scale_AMPA = 500 float scale_GABA = 1.0 * {scale_AMPA} /* Scale AMPA channel conductances. */ foreach pchan ({el /fsn[{mynode}]/##[TYPE=synchan]}) if ({strcmp {getpath {pchan} -tail} "AMPA_channel"} == 0) setfield {pchan} gmax {{scale_AMPA} * {getfield {pchan} gmax}} end end /* Scale GABA channel conductances. */ foreach pchan ({el /fsn[{mynode}]/##[TYPE=synchan]}) if ({strcmp {getpath {pchan} -tail} "GABA_channel"} == 0) setfield {pchan} gmax {{scale_GABA} * {getfield {pchan} gmax}} end end /* Create current injection from file ./input/fsn<N>_istim.dat, where N is the cell number (N=0,1). */ if (CI == 1) echo "Current injection (read from file) ..." create disk_in /in[{mynode}] setfield /in[{mynode}] nx 1 ny 1 filename "./input/fsn"{mynode}"_istim.dat" leave_open 1 fileformat 0 echo {getfield /in[{mynode}] filename} useclock /in[{mynode}] 2 raddmsg /in[{mynode}] /fsn[{mynode}]/soma INJECT val[0][0] end /* Synaptic input. */ if (SI == 1) /* Read synaptic input times from files. */ if (!{exists /input}) create neutral /input end str ttpath str sgpath echo "Include AMPA synapses (FS "{mynode}") ..." str chan = "ampa" if (!{exists /input/fsn[{mynode}]}) create neutral /input/fsn[{mynode}] end /* Read the spike trains for each AMPA channel. */ int j = 0 foreach pchan ({el /fsn[{mynode}]/##[TYPE=synchan]}) if ({strcmp {getpath {pchan} -tail} "AMPA_channel"} == 0) /* Create the timetable and fill it with values from file. */ ttpath = "/input/fsn["@{mynode}@"]/tt_"@{chan}@"["@{j}@"]" create timetable {ttpath} setfield {ttpath} maxtime {T} method 4 act_val 1.0 \ fname "./input/"{chan}"/fsn"{mynode}"_"{chan}{j}".dat" call {ttpath} TABFILL /* Create the spike generator. */ sgpath = "/input/fsn["@{mynode}@"]/sg_"@{chan}@"["@{j}@"]" create spikegen {sgpath} setfield {sgpath} output_amp 1 thresh 0.5 abs_refract 0.0001 /* Connect timetable with spike generator. */ raddmsg {ttpath} {sgpath} INPUT activation j = j + 1 end end /* Connect AMPA. */ j = 0 foreach pchan ({el /fsn[{mynode}]/##[TYPE=synchan]}) /* Connect spike trains to AMPA. */ if ({strcmp {getpath {pchan} -tail} "AMPA_channel"} == 0) sgpath = "/input/fsn["@{mynode}@"]/sg_"@{chan}@"["@{j}@"]" raddmsg {sgpath} {pchan} SPIKE j = j + 1 end end echo "Include GABA synapses (FS "{mynode}") ..." chan = "gaba" if (!{exists /input/fsn[{mynode}]}) create neutral /input/fsn[{mynode}] end /* Read the spike trains for each GABA channel. */ j = 0 foreach pchan ({el /fsn[{mynode}]/##[TYPE=synchan]}) if ({strcmp {getpath {pchan} -tail} "GABA_channel"} == 0) /* Create the timetable and fill it with values from file. */ ttpath = "/input/fsn["@{mynode}@"]/tt_"@{chan}@"["@{j}@"]" create timetable {ttpath} //echo {mynode}" - "{ttpath} setfield {ttpath} maxtime {T} method 4 act_val 1.0 \ fname "./input/"{chan}"/fsn"{mynode}"_"{chan}{j}".dat" call {ttpath} TABFILL /* Create the spike generator. */ sgpath = "/input/fsn["@{mynode}@"]/sg_"@{chan}@"["@{j}@"]" //echo "Create "{sgpath} create spikegen {sgpath} setfield {sgpath} output_amp 1 thresh 0.5 abs_refract 0.0001 /* Connect timetable with spike generator. */ raddmsg {ttpath} {sgpath} INPUT activation j = j + 1 end end /* Connect GABA. */ j = 0 foreach pchan ({el /fsn[{mynode}]/##[TYPE=synchan]}) if ({strcmp {getpath {pchan} -tail} "GABA_channel"} == 0) sgpath = "/input/fsn["@{mynode}@"]/sg_"@{chan}@"["@{j}@"]" addmsg {sgpath} {pchan} SPIKE j = j + 1 end end end /* Create output. */ create asc_file /output/plot[{mynode}] setfield /output/plot[{mynode}] filename "./output/fsn"{mynode}".dat" echo {getfield /output/plot[{mynode}] filename} useclock /output/plot[{mynode}] 1 raddmsg /fsn[{mynode}]/soma /output/plot[{mynode}] SAVE Vm /* Connect via gap junction. */ if (GJ == 1) if ({mynode} == 0) echo "Electrical coupling (somatic)." raddmsg /fsn[0]/soma /fsn[1]/soma@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/soma /fsn[0]/soma@{0} RAXIAL {1.0/{GJcond}} Vm end end if (GJ == 2) if ({mynode} == 0) echo "Electrical coupling (proximal dendrites)." raddmsg /fsn[0]/primdend1/prim_dend2 /fsn[1]/primdend1/prim_dend2@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/primdend1/prim_dend2 /fsn[0]/primdend1/prim_dend2@{0} RAXIAL {1.0/{GJcond}} Vm raddmsg /fsn[0]/primdend2/prim_dend2 /fsn[1]/primdend2/prim_dend2@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/primdend2/prim_dend2 /fsn[0]/primdend2/prim_dend2@{0} RAXIAL {1.0/{GJcond}} Vm end end if (GJ == 3) if ({mynode} == 0) echo "Electrical coupling (secondary dendrites)." raddmsg /fsn[0]/secdend1/sec_dend4 /fsn[1]/secdend1/sec_dend4@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/secdend1/sec_dend4 /fsn[0]/secdend1/sec_dend4@{0} RAXIAL {1.0/{GJcond}} Vm raddmsg /fsn[0]/secdend2/sec_dend4 /fsn[1]/secdend2/sec_dend4@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/secdend2/sec_dend4 /fsn[0]/secdend2/sec_dend4@{0} RAXIAL {1.0/{GJcond}} Vm raddmsg /fsn[0]/secdend3/sec_dend4 /fsn[1]/secdend3/sec_dend4@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/secdend3/sec_dend4 /fsn[0]/secdend3/sec_dend4@{0} RAXIAL {1.0/{GJcond}} Vm raddmsg /fsn[0]/secdend4/sec_dend4 /fsn[1]/secdend4/sec_dend4@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/secdend4/sec_dend4 /fsn[0]/secdend4/sec_dend4@{0} RAXIAL {1.0/{GJcond}} Vm raddmsg /fsn[0]/secdend5/sec_dend4 /fsn[1]/secdend5/sec_dend4@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/secdend5/sec_dend4 /fsn[0]/secdend5/sec_dend4@{0} RAXIAL {1.0/{GJcond}} Vm raddmsg /fsn[0]/secdend6/sec_dend4 /fsn[1]/secdend6/sec_dend4@{1} RAXIAL {1.0/{GJcond}} Vm raddmsg@{1} /fsn[1]/secdend6/sec_dend4 /fsn[0]/secdend6/sec_dend4@{0} RAXIAL {1.0/{GJcond}} Vm end end check reset reset setVrest /fsn[{mynode}] /* Run the simulation. */ barrier step {spikesteps} /* Exit ... */ barrier paroff quit