//genesis /*****This script provides synapses for connecting the neurons ******The following synapses are implemented (as separate functions): ******conn_p2i: connects the pyramidal neuron to a given number of interenuron *****************in a deterministic or random fashion ******make_pyr2bas: specific function to connect pyramidal cells to ********************basket neurons ******make_pyr2olm2: specific function to connect pyramidal cells to ********************olm neurons ******make_pyr2ax: specific function to connect pyramidal cells to TO BE IMPLEMENTED ********************axo-axonic neurons ******make_ampaoni: creates a pulse generator or pyramidal cell driven ampa *****************-**receptor on a basket neuron or an olm neuron ******conn_i2p: makes interneuron-to-pyramidal cell connections ******make_olm2pyr: specific function to connect olm neurons to pyramidal cells ******make_bas2pyr: specific function to connect basket neurons to ********************pyramidal cells ******make_ax2pyr: specific function to connect axo-axonic neurons to TO BE IMPEMENTED ********************pyramidal cells ******make_olm2pyrconn: connects an olm cell to a pyramidal neuron ******make_b2pyrconn: connects a basket cell to a pyramidal neuron ******make_ax2pyrconn: connects an axo-axonic cell to a pyramidal neuron ******make_b_nw: creates a basket cell network ******conn_b2b: establishes connections between basket cells ******make_msg_nw: creates an MSGABA cell network ******conn_msg2msg: establishes a synapse between two ms-gaba cells ******conn_olm2b: establishes a synapse between an oriens -- ******************lacunosum moleculare interenuron and a basket cell ******make_olm2bas: connects olm neurons to basket neurons ******conn_olm2msg: establishes a synapse between an oriens -- ******************lacunosum moleculare interenuron and an MSGABA cell ******make_olm2msg: connects olm neurons to MSGABA neurons ******conn_msg2olm: connects an MSGABA neuron to an oriens interneuron ******conn_msg2b: connects an MSGABA neuron to a basket interneuron ******conn_msg2ax: connects an MSGABA neuron to an axo-axonic interneuron ******make_msg2hipi: establishes connections between MSGABA neurons and a *********************specified type of hippocampal interneuron ******make_GABAonmsg: creates artificially driven innervation of the **********************MSGABA network ******make_ampaonp: creates pulse generator-driven synapse on a pyramidal cell ******conn_pp2pyr: simulates perforant path connections using make_ampaonp on *******************a pyramidal neuron ******/ //**** adding fields to the basket cell's soma to keep track of the number //of synapses from olm neurons if ({exists /prot_b}) addfield /prot_b/soma o2b setfield /prot_b/soma o2b 0 addfield /prot_b/soma b2b setfield /prot_b/soma b2b 0 addfield /prot_b/soma ampa setfield /prot_b/soma ampa 0 addfield /prot_b/soma nmda setfield /prot_b/soma nmda 0 addfield /prot_b/soma m2b setfield /prot_b/soma m2b 0 end if ({exists /prot_ax}) addfield /prot_ax/soma o2a setfield /prot_ax/soma o2a 0 addfield /prot_ax/soma b2a setfield /prot_ax/soma b2a 0 addfield /prot_ax/soma ampa setfield /prot_ax/soma ampa 0 addfield /prot_ax/soma nmda setfield /prot_ax/soma nmda 0 addfield /prot_ax/soma m2a setfield /prot_ax/soma m2a 0 end if ({exists /prot_olm}) addfield /prot_olm/soma ampa setfield /prot_olm/soma ampa 0 addfield /prot_olm/soma nmda setfield /prot_olm/soma nmda 0 addfield /prot_olm/soma m2o setfield /prot_olm/soma m2o 0 end if ({exists /prot_pyr}) str pyr_field_comp foreach pyr_field_comp ({el /prot_pyr/##[OBJECT=compartment]}) addfield {pyr_field_comp} io2pyr setfield {pyr_field_comp} io2pyr 0 addfield {pyr_field_comp} ib2pyr setfield {pyr_field_comp} ib2pyr 0 addfield {pyr_field_comp} ia2pyr setfield {pyr_field_comp} ia2pyr 0 addfield {pyr_field_comp} ampa setfield {pyr_field_comp} ampa 0 end end if ({exists /prot_msgaba}) addfield /prot_msgaba/soma m2m setfield /prot_msgaba/soma m2m 0 addfield /prot_msgaba/soma GABA_syn setfield /prot_msgaba/soma GABA_syn 0 addfield /prot_msgaba/soma o2m setfield /prot_msgaba/soma o2m 0 addfield /prot_msgaba/soma ampa setfield /prot_msgaba/soma ampa 0 end //***************************************************************************** //GABA_A synapse between oriens--lacunosum moleculare neuron and innervated //pyramidale interneurons function conn_olm2b(pre_no, post_no, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /int_b[{post_no}]/soma o2b} + 1 setfield /int_b[{post_no}]/soma o2b {syn_no} if ({!{exists /prot_b/soma/syn_io2ip}}) create vdep_channel /prot_b/soma/syn_io2ip ce /prot_b/soma/syn_io2ip create tabgate s_gate setfield . Ek -80e-3 gbar {{g_syn} * {SOMA_A_B}} setupgate s_gate alpha 2e3 0 1 {Theta_o2b} -0.5e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.03e3 end end copy /prot_b/soma/syn_io2ip /int_b[{post_no}]/soma/syn_io2ip[{syn_no}] ce /int_b[{post_no}]/soma/syn_io2ip[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_B}} addmsg s_gate/ . MULTGATE m 1 addmsg /int_b[{post_no}]/soma . VOLTAGE Vm addmsg /int_olm[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /int_b[{post_no}]/soma CHANNEL Gk Ek ce / end //***************************************************************************** //GABA_A synapse between basket cells function conn_b2b(pre_no, post_no, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /int_b[{post_no}]/soma b2b} + 1 setfield /int_b[{post_no}]/soma b2b {syn_no} if ({!{exists /prot_b/soma/syn_ip2ip}}) create vdep_channel /prot_b/soma/syn_ip2ip ce /prot_b/soma/syn_ip2ip create tabgate s_gate setfield . Ek -75e-3 gbar {{g_syn} * {SOMA_A_B}} setupgate s_gate alpha 1e3 0 1 {Theta_b2b} -2e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.07e3 end end copy /prot_b/soma/syn_ip2ip /int_b[{post_no}]/soma/syn_ip2ip[{syn_no}] ce /int_b[{post_no}]/soma/syn_ip2ip[{syn_no}] addmsg s_gate/ . MULTGATE m 1 addmsg /int_b[{post_no}]/soma . VOLTAGE Vm addmsg /int_b[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /int_b[{post_no}]/soma CHANNEL Gk Ek ce / end //***************************************************************************** //Function for setting up a basket interneuron-network with a given connection //probability (cp) function make_b_nw (cp, g_syn) float cp //connection probability //1 if full float r int i,j float g_syn if (cp>1 || cp<0) return end for (i = 1; i<= {N_b}; i = i + 1) for (j = 1; j<= {N_b}; j = j + 1) r = {rand 0 1 } if (r<={cp} && i!=j) r = 1 conn_b2b {i} {j} {g_syn} else r = 0 end end end end //***************************************************************************** //GABA_A synapse between ms-gaba neurons function conn_msg2msg(pre_no, post_no, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell int syn_no int i float g_syn syn_no = {getfield /int_msg[{post_no}]/soma m2m} + 1 setfield /int_msg[{post_no}]/soma m2m {syn_no} if ({!{exists /prot_msgaba/soma/syn_m2m}}) create vdep_channel /prot_msgaba/soma/syn_m2m ce /prot_msgaba/soma/syn_m2m create tabgate s_gate setfield . Ek -75e-3 gbar {{g_syn} * {SOMA_A_MSGABA}} setupgate s_gate alpha 1e3 0 1 {Theta_m2m} -2e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.07e3 end end copy /prot_msgaba/soma/syn_m2m /int_msg[{post_no}]/soma/syn_m2m[{syn_no}] ce /int_msg[{post_no}]/soma/syn_m2m[{syn_no}] addmsg s_gate/ . MULTGATE m 1 addmsg /int_msg[{post_no}]/soma . VOLTAGE Vm addmsg /int_msg[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /int_msg[{post_no}]/soma CHANNEL Gk Ek ce / end //***************************************************************************** //Function for setting up septal GABAergic neural network with a given //connection probability (cp) and synaptic coductance function make_msg_nw (cp, g_syn) float cp //connection probability //1 if full float r int i,j float g_syn if (cp>1 || cp<0) return end for (i = 1; i<= {N_msg}; i = i + 1) for (j = 1; j<= {N_msg}; j = j + 1) r = {rand 0 1 } if (r<={cp} && i!=j) r = 1 conn_msg2msg {i} {j} {g_syn} else r = 0 end end end end //***************************************************************************** //Spike generator- or pyramidal cell-axon-driven AMPA receptor mediated //synapse on a basket cell or OLM neuron (cf Destexhe in: Koch & Segev MiCM) function make_ampaoni(post_no, gAMPA, inttype, pre_no) str post_no float gAMPA int syn_no str inttype //"b": basket cell, "olm": OLM neuron, "ax": axo-axonic neuron int pre_no //0: pulsegen -> i, other: pyr[other] -> i int i str postint postint = {strcat "int_" {inttype}} syn_no = {getfield /{postint}[{post_no}]/soma ampa} + 1 setfield /{postint}[{post_no}]/soma ampa {syn_no} create vdep_channel /{postint}[{post_no}]/soma/AMPA_syn[{syn_no}] ce /{postint}[{post_no}]/soma/AMPA_syn[{syn_no}] create tabgate r_gate setfield . Ek 0 gbar {{gAMPA}*1e-9} setupgate r_gate \ alpha 1.1e3 0 1 -2e-3 -5e-3 -size {VRES} -range {VMIN} {VMAX} call r_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= {VRES}; i = i + 1) setfield r_gate beta->table[{i}] 190 end addmsg r_gate . MULTGATE m 1 addmsg /{postint}[{post_no}]/soma . VOLTAGE Vm addmsg . /{postint}[{post_no}]/soma CHANNEL Gk Ek if (pre_no==0) create pulsegen /{postint}[{post_no}]/soma/preampa_gen[{syn_no}] ce /{postint}[{post_no}]/soma/preampa_gen[{syn_no}] setfield . baselevel -0.07 setfield . width1 0.001 setfield . level1 0.01 setfield . delay1 0.159 addmsg . /{postint}[{post_no}]/soma/AMPA_syn[{syn_no}]/r_gate VOLTAGE output elif (pre_no<={N_pyr}) addmsg /pyr[{pre_no}]/r3 /{postint}[{post_no}]/soma/AMPA_syn[{syn_no}]/r_gate VOLTAGE Vm else echo "Wrong p2i type in make_ampaoni" return end ce / end //Spike generator- or pyramidal cell-axon-driven NMDA receptor mediated //synapse on a basket cell or OLM neuron (cf Destexhe in: Koch & Segev MiCM) function make_nmdaoni(post_no, gNMDA, inttype, pre_no, mgconc, nmdatype) str post_no float gNMDA int syn_no str inttype //"b": basket cell, "olm": OLM neuron, "ax": axo-axonic neuron int pre_no //0: pulsegen -> i, other: pyr[other] -> i int i str postint float mgblock float mgconc //concentration of magnesium (in mM) str nmdatype float nmdacons1 float nmdacons2 if (nmdatype=="a") nmdacons1=-62 nmdacons2=1.37 elif (nmdatype=="c") nmdacons1=-45 nmdacons2=1.48 elif (nmdatype=="d") nmdacons1=-41 nmdacons2=1.57 else echo "Wrong nmdatype" end postint = {strcat "int_" {inttype}} syn_no = {getfield /{postint}[{post_no}]/soma nmda} + 1 setfield /{postint}[{post_no}]/soma nmda {syn_no} create vdep_channel /{postint}[{post_no}]/soma/NMDA_syn[{syn_no}] ce /{postint}[{post_no}]/soma/NMDA_syn[{syn_no}] create tabgate r_gate setfield . Ek 0 gbar {{gNMDA}*1e-9} setupgate r_gate \ alpha 0.072e3 0 1 -2e-3 -5e-3 -size {VRES} -range {VMIN} {VMAX} call r_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= {VRES}; i = i + 1) setfield r_gate beta->table[{i}] 6.6 end create table Mg_block call Mg_block TABCREATE {VRES} {VMIN} {VMAX} for (i = 0; i<= {VRES}; i = i + 1) x = (i * (VMAX - VMIN) / VRES) + VMIN mgblock = {1/(1+{exp {nmdacons1 * x }}*mgconc/nmdacons2)} //1 / (1 + exp {-0.062 * x} * 1e-6 / 3.57) setfield Mg_block table->table[{i}] {mgblock} end // for (i = 0; i<= {VRES}; i = i + 1) // setfield r_gate beta->table[{i}] 190 // end addmsg r_gate . MULTGATE m 1 addmsg Mg_block . MULTGATE output 1 addmsg /{postint}[{post_no}]/soma . VOLTAGE Vm addmsg /{postint}[{post_no}]/soma Mg_block INPUT Vm addmsg . /{postint}[{post_no}]/soma CHANNEL Gk Ek if (pre_no==0) create pulsegen /{postint}[{post_no}]/soma/prenmda_gen[{syn_no}] ce /{postint}[{post_no}]/soma/prenmda_gen[{syn_no}] setfield . baselevel -0.07 setfield . width1 0.002 setfield . level1 0.02 setfield . delay1 0.152 setfield . width2 0.002 setfield . level2 0.02 setfield . delay2 0.006 addmsg . /{postint}[{post_no}]/soma/NMDA_syn[{syn_no}]/r_gate VOLTAGE output elif (pre_no<={N_pyr}) addmsg /pyr[{pre_no}]/r3 /{postint}[{post_no}]/soma/NMDA_syn[{syn_no}]/r_gate VOLTAGE Vm else echo "Wrong p2i type in make_nmdaoni" return end ce / end //***************************************************************************** //AMPA and/or NMDA receptor mediated synapse on //interenurons (cf Destexhe in: Koch & Segev MiCM) function conn_p2i(pre_no, gAMPA, gNMDA, divp, inttype, mgconc, nmdatype, random) int pre_no //# of presynaptic neuron float gAMPA //maximal conductance of the ampa synapse (set 0 if no) float gNMDA //maximal conductance of the nmda synapse (set 0 if no) int divp //number of basket cells to be innervated str inttype //"b": basket cell, "olm": OLM neuron, "ax": axo-axonic neuron float mgconc //magnesium concentration for the nmda rec (set 0 if no NMDA) str nmdatype //subunit type of the nmda rec ("a", "c", or "d") int random //1: random connections, 0: deterministic connections int inttype_no int syn_no int i int j = 0 int t = 0 int r = 0 if (inttype=="olm") inttype_no=N_olm elif (inttype=="ax") inttype_no=N_ax else inttype_no=N_b end create table /p2{inttype}_list[{pre_no}] call /p2{inttype}_list[{pre_no}] TABCREATE {divp-1} 0 1 for(i=0; i<={divp-1}; i=i+1) setfield /p2{inttype}_list[{pre_no}] table->table[{i}] 0 end if(divp > inttype_no) echo "conn_p2i: more p->i connections than i! Multiple connections are not allowed. Exiting." exit end while (j < divp) r = {rand 1 {inttype_no + 0.9}} for(i=0; i<{j}; i=i+1) if({getfield /p2{inttype}_list[{pre_no}] table->table[{i}]} == r) t=1 end end if(t != 1) setfield /p2{inttype}_list[{pre_no}] table->table[{j}] {r} j = j+1 end t = 0 end if (gAMPA!=0) for (i=0; i<{divp}; i=i+1) //Connect pyr to inteenurons with AMPA if (random==1) make_ampaoni {getfield /p2{inttype}_list[{pre_no}] table->table[{i}]} {gAMPA} {inttype} {pre_no} else make_ampaoni {i+1} {gAMPA} {inttype} {pre_no} // ez igy talan egy kicsit koltseges, bar nem sokat szamit end end end if (gNMDA!=0) for (i=0; i<{divp}; i=i+1) //Connect pyr to inteenurons if (random==1) make_nmdaoni {getfield /p2{inttype}_list[{pre_no}] table->table[{i}]} {gNMDA} {inttype} {pre_no} {mgconc} {nmdatype} else make_nmdaoni {i+1} {gNMDA} {inttype} {pre_no} {mgconc} {nmdatype} // ez igy talan egy kicsit koltseges, bar nem sokat szamit end end end end //************************************************************************** //NMDA mediated synapses between pyramidal cells and intereurons function conn_p2iwn(pre_no, gNMDA, divp, inttype, random,mgconc,nmdatype) int pre_no //# of presynaptic neuron float gNMDA //maximal conductance of the ampa synapse int divp //number of basket cells to be innervated str inttype //"b": basket cell, "olm": OLM neuron, "ax": axo-axonic neuron int random //1: random connections, 0: deterministic connections int inttype_no int syn_no int i int j = 0 int t = 0 int r = 0 float mgconc str nmdatype if (inttype=="olm") inttype_no=N_olm elif (inttype=="ax") inttype_no=N_ax else inttype_no=N_b end if ({!{exists /p2{inttype}_list[{pre_no}]}}) create table /p2{inttype}_list[{pre_no}] call /p2{inttype}_list[{pre_no}] TABCREATE {divp-1} 0 1 for(i=0; i<={divp-1}; i=i+1) setfield /p2{inttype}_list[{pre_no}] table->table[{i}] 0 end if(divp > inttype_no) echo "conn_p2i: more p->i connections than i! Multiple connections are not allowed. Exiting." exit end while (j < divp) r = {rand 1 {inttype_no + 0.9}} for(i=0; i<{j}; i=i+1) if({getfield /p2{inttype}_list[{pre_no}] table->table[{i}]} == r) t=1 end end if(t != 1) setfield /p2{inttype}_list[{pre_no}] table->table[{j}] {r} j = j+1 end t = 0 end end for (i=0; i<{divp}; i=i+1) //Connect pyr to inteenurons if (random==1) make_nmdaoni {getfield /p2{inttype}_list[{pre_no}] table->table[{i}]} {gNMDA} {inttype} {pre_no} {mgconc} {nmdatype} else make_nmdaoni {i+1} {gNMDA} {inttype} {pre_no} {mgconc} {nmdatype} // ez igy talan egy kicsit koltseges, bar nem sokat szamit end end end //***************************************************************************** //***************************************************************************** //Spike generator-driven NMDA receptor mediated synapse on a //basket cell (cf Destexhe in: Koch & Segev MiCM) function make_nmdaonb(post_no, gNMDA) str post_no float gNMDA int syn_no int i float tconc //trasnmitter concentration float mgblock //Mg block on the channel float an = 7.2 float bn = 6.6 float x float arn, brn syn_no = {getfield /int_b[{post_no}]/soma ampa} + 1 setfield /int_b[{post_no}]/soma ampa {syn_no} addmsg r_gate . MULTGATE m 1 addmsg /int_b[{post_no}]/soma . VOLTAGE Vm addmsg . /int_b[{post_no}]/soma CHANNEL Gk Ek create pulsegen /int_b[{post_no}]/soma/prenmda_gen[{syn_no}] ce /int_b[{post_no}]/soma/prenmda_gen[{syn_no}] setfield . baselevel -0.06 setfield . width1 0.001 setfield . level1 0.01 setfield . delay1 0.199 addmsg . /int_b[{post_no}]/soma/NMDA_syn[{syn_no}]/r_gate VOLTAGE output ce / end //***************************************************************************** //GABA_A synapse between oriens--lacunosum moleculare interneurons and the //pyramidal neuron function make_olm2pyrconn(pre_no, post_no, post_comp, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell str post_comp //innervated compartment of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /pyr[{post_no}]/{post_comp} io2pyr} + 1 setfield /pyr[{post_no}]/{post_comp} io2pyr {syn_no} if ({!{exists /prot_pyr/{post_comp}/syn_iolm2pyr}}) create vdep_channel /prot_pyr/{post_comp}/syn_iolm2pyr ce /prot_pyr/{post_comp}/syn_iolm2pyr create tabgate s_gate setfield . Ek -85e-3 gbar {{g_syn} * {SOMA_A_OLM}} setupgate s_gate alpha 2e3 0 1 {Theta} -0.5e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.05e3 end end copy /prot_pyr/{post_comp}/syn_iolm2pyr /pyr[{post_no}]/{post_comp}/syn_iolm2pyr[{syn_no}] ce /pyr[{post_no}]/{post_comp}/syn_iolm2pyr[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_OLM}} addmsg s_gate/ . MULTGATE m 1 addmsg /pyr[{post_no}]/{post_comp} . VOLTAGE Vm addmsg /int_olm[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /pyr[{post_no}]/{post_comp} CHANNEL Gk Ek ce / end //for the holy sake of backward compatibility... function conn_olm2pyr(pre_no, post_no, post_comp, g_syn) int pre_no int post_no str post_comp float g_syn make_olm2pyrconn {pre_no} {post_no} {post_comp} {g_syn} end //***************************************************************************** //GABA_A synapse basket interneurons and the //pyramidal neuron function make_b2pyrconn(pre_no, post_no, post_comp, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell str post_comp //innervated compartment of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /pyr[{post_no}]/{post_comp} ib2pyr} + 1 setfield /pyr[{post_no}]/{post_comp} ib2pyr {syn_no} if ({!{exists /prot_pyr/{post_comp}/syn_ib2pyr}}) create vdep_channel /prot_pyr/{post_comp}/syn_ib2pyr ce /prot_pyr/{post_comp}/syn_ib2pyr create tabgate s_gate setfield . Ek -80e-3 gbar {{g_syn} * {SOMA_A_B}} setupgate s_gate alpha 1e3 0 1 {Theta_b2b} -2e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.07e3 end end copy /prot_pyr/{post_comp}/syn_ib2pyr /pyr[{post_no}]/{post_comp}/syn_ib2pyr[{syn_no}] ce /pyr[{post_no}]/{post_comp}/syn_ib2pyr[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_B}} addmsg s_gate/ . MULTGATE m 1 addmsg /pyr[{post_no}]/{post_comp} . VOLTAGE Vm addmsg /int_b[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /pyr[{post_no}]/{post_comp} CHANNEL Gk Ek ce / end //for the holy sake of backward compatibility... function conn_ib2pyr(pre_no, post_no, post_comp, g_syn) int pre_no int post_no str post_comp float g_syn make_b2pyrconn {pre_no} {post_no} {post_comp} {g_syn} end //***************************************************************************** //GABA_A synapse between an axo-axonic interneuron and a //pyramidal neuron function make_ax2pyrconn(pre_no, post_no, post_comp, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell str post_comp //innervated compartment of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /pyr[{post_no}]/{post_comp} ia2pyr} + 1 setfield /pyr[{post_no}]/{post_comp} ia2pyr {syn_no} if ({!{exists /prot_pyr/{post_comp}/syn_ia2pyr}}) create vdep_channel /prot_pyr/{post_comp}/syn_ia2pyr ce /prot_pyr/{post_comp}/syn_ia2pyr create tabgate s_gate setfield . Ek -80e-3 gbar {{g_syn} * {SOMA_A_AX}} setupgate s_gate alpha 1e3 0 1 {Theta_ax} -2e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.07e3 end end copy /prot_pyr/{post_comp}/syn_ia2pyr /pyr[{post_no}]/{post_comp}/syn_ia2pyr[{syn_no}] ce /pyr[{post_no}]/{post_comp}/syn_ia2pyr[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_AX}} addmsg s_gate/ . MULTGATE m 1 addmsg /pyr[{post_no}]/{post_comp} . VOLTAGE Vm addmsg /int_ax[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /pyr[{post_no}]/{post_comp} CHANNEL Gk Ek ce / end //***************************************************************************** //GABA receptor mediated synapse on //pyramidal neurons function conn_i2p(post_no, post_comp, gGABA, convp, inttype, initcell) int post_no //# of postsynaptic pyramidal neuron str post_comp //compartment of the pyramidal cell to innervate float gGABA //maximal conductance of the GABA synapse int convp //number of basket cells innervating a pyramidal cell str inttype //"b": basket cell, "olm": OLM neuron, "ax": axo-axonic neuron int initcell //0: random connections, else:deterministic with //first neuron to connect being $initcell int inttype_no int syn_no int i int j = 0 int t = 0 int r = 0 str listname if (inttype=="olm") inttype_no=N_olm elif (inttype=="ax") inttype_no=N_ax else inttype_no=N_b end listname={strcat {inttype} {strcat "2p" {strcat {post_comp} "_list"}}} create table /{listname}[{post_no}] call /{listname}[{post_no}] TABCREATE {convp-1} 0 1 for(i=0; i<={convp-1}; i=i+1) setfield /{listname}[{post_no}] table->table[{i}] 0 end while (j < convp) r = {rand 1 {inttype_no + 0.9}} for(i=0; i<{j}; i=i+1) if({getfield /{listname}[{post_no}] table->table[{i}]} == r) t=1 end end if(t != 1) setfield /{listname}[{post_no}] table->table[{j}] {r} j = j+1 end t = 0 end for (i=0; i<{convp}; i=i+1) //Connect interneuron to pyr if (initcell==0) make_{inttype}2pyrconn {getfield /{listname}[{post_no}] table->table[{i}]} {post_no} {post_comp} {gGABA} else make_{inttype}2pyrconn {i+initcell} {post_no} {post_comp} {gGABA} end end end //***************************************************************************** //periodic hyperpolarizing current generator on the pyramidal neuron function make_genonpyr(pyrno, ihyp, time) create pulsegen /pyr[{pyrno}]/soma/pregaba_gen ce /pyr[{pyrno}]/soma/pregaba_gen setfield . baselevel 1e-12 setfield . width1 0.020 setfield . level1 {ihyp} setfield . delay1 {{time} - 0.02} addmsg . /pyr[{pyrno}]/soma INJECT output end //***************************************************************************** //GABA_A synapse on MSGABA cells driven by a pulse generator function make_GABAonmsg(post_no, gGABA) int post_no //# of postsynaptic cell float gGABA //synaptic conductance int syn_no int i syn_no = {getfield /int_msg[{post_no}]/soma GABA_syn} + 1 setfield /int_msg[{post_no}]/soma GABA_syn {syn_no} create vdep_channel /int_msg[{post_no}]/soma/GABA_syn[{syn_no}] ce /int_msg[{post_no}]/soma/GABA_syn[{syn_no}] create tabgate s_gate setfield . Ek -80e-3 gbar {{gGABA} * {SOMA_A_MSGABA}} setupgate s_gate alpha 2e3 0 1 {Theta_GABA} -0.5e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.03e3 end addmsg s_gate/ . MULTGATE m 1 addmsg /int_msg[{post_no}]/soma . VOLTAGE Vm addmsg . /int_msg[{post_no}]/soma CHANNEL Gk Ek create pulsegen /int_msg[{post_no}]/soma/preGABA_gen[{syn_no}] ce /int_msg[{post_no}]/soma/preGABA_gen[{syn_no}] setfield . baselevel -0.06 setfield . width1 0.001 setfield . level1 0.01 setfield . delay1 1 addmsg . /int_msg[{post_no}]/soma/GABA_syn[{syn_no}]/s_gate VOLTAGE output ce / end /*protype GABA synapse intended for testing purpose only*/ function make_gabaoni(post_no, gGABA, inttype, gabadrive) str post_no float gGABA //note that it is given in nS!!! int syn_no str inttype //"b": basket cell, "olm": OLM neuron, "ax":axo-axonic neurons int gabadrive //0: pulsegen -> i int i str postint postint = {strcat "int_" {inttype}} if ({!{exists /{postint}[{post_no}]/soma/syn_GABAprot}}) create vdep_channel /{postint}[{post_no}]/soma/syn_GABAprot ce /{postint}[{post_no}]/soma/syn_GABAprot create tabgate s_gate setfield . Ek -75e-3 gbar {{gGABA} * {SOMA_A_B}} setupgate s_gate alpha 2e3 0 1 {Theta_o2b} -0.5e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.03e3 end end setfield . gbar {{gGABA}*1e-9} addmsg s_gate/ . MULTGATE m 1 addmsg /{postint}[{post_no}]/soma . VOLTAGE Vm addmsg . /{postint}[{post_no}]/soma CHANNEL Gk Ek ce / if (gabadrive==0) create pulsegen /{postint}[{post_no}]/soma/pregaba_gen ce /{postint}[{post_no}]/soma/pregaba_gen setfield . baselevel -0.07 setfield . width1 0.001 setfield . level1 0.01 setfield . delay1 0.399 addmsg . /{postint}[{post_no}]/soma/syn_GABAprot/s_gate VOLTAGE output elif (gabadrive==1) echo "currently not implemented" else echo "Wrong p2i type in make_ampaoni" return end ce / end function conn_olm2msg(pre_no, post_no, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /int_msg[{post_no}]/soma o2m} + 1 setfield /int_msg[{post_no}]/soma o2m {syn_no} if ({!{exists /prot_msgaba/soma/syn_io2im}}) create vdep_channel /prot_msgaba/soma/syn_io2im ce /prot_msgaba/soma/syn_io2im create tabgate s_gate setfield . Ek -80e-3 gbar {{g_syn} * {SOMA_A_MSGABA}} setupgate s_gate alpha 2e3 0 1 {Theta_o2m} -0.5e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.05e3 end end copy /prot_msgaba/soma/syn_io2im /int_msg[{post_no}]/soma/syn_io2im[{syn_no}] ce /int_msg[{post_no}]/soma/syn_io2im[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_MSGABA}} addmsg s_gate/ . MULTGATE m 1 addmsg /int_msg[{post_no}]/soma . VOLTAGE Vm addmsg /int_olm[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /int_msg[{post_no}]/soma CHANNEL Gk Ek ce / end function conn_msg2olm(pre_no, post_no, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /int_olm[{post_no}]/soma m2o} + 1 setfield /int_olm[{post_no}]/soma m2o {syn_no} if ({!{exists /prot_olm/soma/syn_im2io}}) create vdep_channel /prot_olm/soma/syn_im2io ce /prot_olm/soma/syn_im2io create tabgate s_gate setfield . Ek -80e-3 gbar {{g_syn} * {SOMA_A_OLM}} setupgate s_gate alpha 1e3 0 1 {Theta_m2o} -2e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.07e3 end end copy /prot_olm/soma/syn_im2io /int_olm[{post_no}]/soma/syn_im2io[{syn_no}] ce /int_olm[{post_no}]/soma/syn_im2io[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_OLM}} addmsg s_gate/ . MULTGATE m 1 addmsg /int_olm[{post_no}]/soma . VOLTAGE Vm addmsg /int_msg[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /int_olm[{post_no}]/soma CHANNEL Gk Ek ce / end function conn_msg2b(pre_no, post_no, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /int_b[{post_no}]/soma m2b} + 1 setfield /int_b[{post_no}]/soma m2b {syn_no} if ({!{exists /prot_b/soma/syn_im2ib}}) create vdep_channel /prot_b/soma/syn_im2ib ce /prot_b/soma/syn_im2ib create tabgate s_gate setfield . Ek -80e-3 gbar {{g_syn} * {SOMA_A_B}} setupgate s_gate alpha 1e3 0 1 {Theta_m2b} -2e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.07e3 end end copy /prot_b/soma/syn_im2ib /int_b[{post_no}]/soma/syn_im2ib[{syn_no}] ce /int_b[{post_no}]/soma/syn_im2ib[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_B}} addmsg s_gate/ . MULTGATE m 1 addmsg /int_b[{post_no}]/soma . VOLTAGE Vm addmsg /int_msg[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /int_b[{post_no}]/soma CHANNEL Gk Ek ce / end function conn_msg2ax(pre_no, post_no, g_syn) int pre_no //# of presynaptic cell int post_no //# of postsynaptic cell float g_syn //synaptic conductance int syn_no int i syn_no = {getfield /int_ax[{post_no}]/soma m2a} + 1 setfield /int_ax[{post_no}]/soma m2a {syn_no} if ({!{exists /prot_ax/soma/syn_im2ia}}) create vdep_channel /prot_ax/soma/syn_im2ia ce /prot_ax/soma/syn_im2ia create tabgate s_gate setfield . Ek -80e-3 gbar {{g_syn} * {SOMA_A_AX}} setupgate s_gate alpha 1e3 0 1 {Theta_m2a} -2e-3 -size {VRES} -range {VMIN} {VMAX} call s_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= VRES; i = i + 1) setfield s_gate beta->table[{i}] 0.07e3 end end copy /prot_ax/soma/syn_im2ia /int_ax[{post_no}]/soma/syn_im2ia[{syn_no}] ce /int_ax[{post_no}]/soma/syn_im2ia[{syn_no}] setfield . gbar {{g_syn} * {SOMA_A_AX}} addmsg s_gate/ . MULTGATE m 1 addmsg /int_ax[{post_no}]/soma . VOLTAGE Vm addmsg /int_msg[{pre_no}]/soma ./s_gate VOLTAGE Vm addmsg . /int_ax[{post_no}]/soma CHANNEL Gk Ek ce / end function make_olm2bas(amo_of_1, ob_gb) int amo_of_1 // gives how many basket cells are innervated by a single olm cell int i = 0 int j = 0 int k = 0 float ob_gb int r int t = 0 if (amo_of_1 > N_b) echo "make_olm2bas: multiple connections not allowed" exit end create table /o2b_list //table to store # of b to connect current olm to call /o2b_list TABCREATE {amo_of_1} 0 1 for (i = 1; i <= {N_olm}; i = i + 1) for (j = 0; j <= {amo_of_1-1}; j = j + 1) setfield /o2b_list table->table[{j}] 0 end j = 0 while (j < amo_of_1) r = {rand 1 {N_b + 0.9}} for (k = 0; k < {j}; k = k + 1) if ({getfield /o2b_list table->table[{k}]} == r) t=1 end end if (t != 1) setfield /o2b_list table->table[{j}] {r} j = j+1 end t = 0 end for (j = 0; j < {amo_of_1}; j = j + 1) //Connect olm to amo_of_1 piece of basket conn_olm2b {i} {getfield /o2b_list table->table[{j}]} {ob_gb} end end delete /o2b_list //no more need for this end function make_olm2msg(amo_of_1, gb) int amo_of_1 // gives how many basket cells are innervated by a single olm cell float gb int i = 0 int j = 0 int k = 0 int r = 0 int t = 0 if (amo_of_1 > N_msg) echo "make_olm2msg: multiple connections not allowed" exit end create table /o2m_list //table to store # of msg to connect current olm to call /o2m_list TABCREATE {amo_of_1} 0 1 for (i = 1; i <= {N_olm}; i = i + 1) for (j = 0; j <= {amo_of_1-1}; j = j + 1) setfield /o2m_list table->table[{j}] 0 end j = 0 while (j < amo_of_1) r = {rand 1 {N_msg + 0.9}} for (k = 0; k < {j}; k = k + 1) if ({getfield /o2m_list table->table[{k}]} == r) t=1 end end if (t != 1) setfield /o2m_list table->table[{j}] {r} j = j+1 end t = 0 end for (j = 0; j < {amo_of_1}; j = j + 1) //Connect olm to amo_of_1 piece of msgaba conn_olm2msg {i} {getfield /o2m_list table->table[{j}]} {gb} end end delete /o2m_list //no more need for this end function make_olm2pyr(olm_per_pyr, gb, olmpcomp) int olm_per_pyr float gb str olmpcomp int i, j //generates as many as {olm_per_pyr} synaptic contacts on every pyramidal //cell compartments listed in olmpcomp (compartmentnames separated by spaces) if (olm_per_pyr > N_olm) echo "make_olm2pyr: multiple connections not allowed" exit end for (i = 1; i <= {N_pyr}; i = i + 1) for (j = 1; j<={getarg {arglist {olmpcomp}} -count}; j=j+1) conn_i2p {i} {getarg {arglist {olmpcomp}} -arg {j}} {gb} {olm_per_pyr} "olm" 0 end end end function make_bas2pyr(bas_per_pyr, gb, bpcomp) int bas_per_pyr float gb str bpcomp int i,j //generates as many as {bas_per_pyr} synaptic contacts on every pyramidal //cell compartments listed in olmpcomp (compartmentnames separated by spaces) if (bas_per_pyr > N_b) echo "make_bas2pyr: multiple connections not allowed" exit end for (i = 1; i <= {N_pyr}; i = i + 1) for (j = 1; j<={getarg {arglist {bpcomp}} -count}; j=j+1) conn_i2p {i} {getarg {arglist {bpcomp}} -arg {j}} {gb} {bas_per_pyr} "b" 0 end end end function make_pyr2olm2(olm_per_pyr, gAMPA, gNMDA, mgconc, nmdatype) int olm_per_pyr float gAMPA, gNMDA, mgconc str mgconc if (olm_per_pyr > N_olm) echo "make_pyr2olm: multiple connections not allowed" exit end for (i = 1; i <= {N_pyr}; i = i + 1) conn_p2i {i} {gAMPA} {gNMDA} {olm_per_pyr} "olm" {mgconc} {nmdatype} 1 end end //nem hasznalt fuggveny: function make_pyr2olmNMDA(olm_per_pyr, gb,mgconc, nmdatype) int olm_per_pyr float gb float mgconc str nmdatype if (olm_per_pyr > N_olm) echo "make_pyr2olm: multiple connections not allowed" exit end for (i = 1; i <= {N_pyr}; i = i + 1) conn_p2iwn {i} {gb} {olm_per_pyr} "olm" 1 {mgconc} {nmdatype} end end function make_pyr2bas2(bas_per_pyr, gAMPA, gNMDA, mgconc, nmdatype) int bas_per_pyr float gAMPA, gNMDA, mgconc str mgconc if (bas_per_pyr > N_b) echo "make_pyr2bas: multiple connections not allowed" exit end for (i = 1; i <= {N_pyr}; i = i + 1) conn_p2i {i} {gAMPA} {gNMDA} {bas_per_pyr} "b" {mgconc} {nmdatype} 1 end end function make_msg2hipi(pre_am, post_am, gb, hipitype) int pre_no int post_no float gb str hipitype int j = 0 int k = 0 int i = 0 int r = 0 int t = 0 int hipino = 0 if ( hipitype == "olm" ) hipino = N_olm elif ( hipitype == "b" ) hipino = N_b elif ( hipitype == "ax" ) hipino = N_ax else echo "make_msg2hipi: unknown / unimplemented hippocampal interrneuron type. Bummer." exit end if ( (pre_am > N_msg) || (post_am > hipino) ) echo "make_msg2hipi: multiple connections not allowed / not enough cells for this" exit end create table /im2{hipitype}_list call /im2{hipitype}_list TABCREATE {pre_am} 0 1 j = 0 while (j < pre_am) r = {rand 1 {N_msg + 0.9}} for (k = 0; k < {j}; k = k + 1) if ({getfield /im2{hipitype}_list table->table[{k}]} == r) t=1 end end if (t != 1) setfield /im2{hipitype}_list table->table[{j}] {r} j = j+1 end t = 0 end create table /m2{hipitype}_list call /m2{hipitype}_list TABCREATE {post_am} 0 1 for (i = 0; i <= {pre_am - 1}; i = i + 1) for (j = 0; j <= {post_am-1}; j = j + 1) setfield /m2{hipitype}_list table->table[{j}] 0 end j = 0 while (j < post_am) r = {rand 1 {hipino + 0.9}} for (k = 0; k < {j}; k = k + 1) if ({getfield /m2{hipitype}_list table->table[{k}]} == r) t=1 end end if (t != 1) setfield /m2{hipitype}_list table->table[{j}] {r} j = j+1 end t = 0 end for (j = 0; j < {post_am}; j = j + 1) //Connect olm to post_am piece of msgaba conn_msg2{hipitype} {getfield /im2{hipitype}_list table->table[{i}]} {getfield /m2{hipitype}_list table->table[{j}]} {gb} end end delete /m2{hipitype}_list delete /im2{hipitype}_list end //***************************************************************************** //Spike generator-driven AMPA receptor mediated //synapse on pyramidal neurons (cf Destexhe in: Koch & Segev MiCM) function make_ampaonp(post_no, post_comp, gAMPA, fr) str post_no str post_comp float gAMPA //conductance of the synapse float fr //frquency of stimulation int syn_no int i syn_no = {getfield /pyr[{post_no}]/{post_comp} ampa} + 1 setfield /pyr[{post_no}]/{post_comp} ampa {syn_no} if ({!{exists /prot_pyr/soma/AMPA_syn}}) create vdep_channel /prot_pyr/soma/AMPA_syn ce /prot_pyr/soma/AMPA_syn create tabgate r_gate setfield . Ek 0 gbar {{gAMPA}*1e-9} setupgate r_gate \ alpha 1.1e3 0 1 -2e-3 -5e-3 -size {VRES} -range {VMIN} {VMAX} call r_gate TABCREATE beta {VRES} {VMIN} {VMAX} for (i = 0; i<= {VRES}; i = i + 1) setfield r_gate beta->table[{i}] 190 end end copy /prot_pyr/soma/AMPA_syn /pyr[{post_no}]/{post_comp}/AMPA_syn[{syn_no}] ce /pyr[{post_no}]/{post_comp}/AMPA_syn[{syn_no}] setfield . gbar {{gAMPA}*1e-9} addmsg r_gate . MULTGATE m 1 addmsg /pyr[{post_no}]/{post_comp} . VOLTAGE Vm addmsg . /pyr[{post_no}]/{post_comp} CHANNEL Gk Ek create pulsegen /pyr[{post_no}]/{post_comp}/preampa_gen[{syn_no}] ce /pyr[{post_no}]/{post_comp}/preampa_gen[{syn_no}] setfield . baselevel -0.07 setfield . width1 0.001 setfield . level1 0.01 setfield . delay1 {1/{fr}-0.001} addmsg . /pyr[{post_no}]/{post_comp}/AMPA_syn[{syn_no}]/r_gate VOLTAGE output ce / end function conn_pp2pyr(pyram, pyr_comps, gAMPA, fr) int pyram //amount pf pyramidal cells innervated by the PP //(typically {N_pyr} str pyrcomps //list (spaated by spaces) containing compartments //to be innervated float gAMPA //maximal conductance float fr //frequency of the stimulation coming from PP int i, j if (pyram > N_pyr) echo "conn_pp2pyr: too many connections to be established" exit end for (i = 1; i <= {N_pyr}; i = i + 1) for (j = 1; j<={getarg {arglist {pyr_comps}} -count}; j=j+1) make_ampaonp {i} {getarg {arglist {pyr_comps}} -arg {j}} {gAMPA} {fr} end end end