//genesis
function addNMDAchannel(compPath, chanpath,caBuffer, gbar, ghk)
str compPath, chanpath
float gbar
str caBuffer
copy /library/{chanpath} {compPath}/{chanpath}
addmsg {compPath} {compPath}/{chanpath}/block VOLTAGE Vm
addmsg {compPath} {compPath}/{chanpath} VOLTAGE Vm
if (ghk==0)
addmsg {compPath}/{chanpath}/block {compPath} CHANNEL Gk Ek
end
if (ghk==1)
addmsg {compPath} {compPath}/{chanName}/GHK VOLTAGE Vm
addmsg {compPath}/{chanName}/GHK {compPath} CHANNEL Gk Ek
end
// Set the new conductance
float len = {getfield {compPath} len}
float dia = {getfield {compPath} dia}
float pi = 3.141592653589793
float surf = {len*dia*pi}
/* //echo "XXXXXXXXXXXXXXX addNMDAchannel XXXXXXXXXXXXXXXX"
//echo "compPath = "{compPath}
//echo "chanpath = "{chanpath}
//echo "caBuffer = "{caBuffer}
//echo "gbar = "{gbar}
//echo "XXXXXXXXXXXXXXX addNMDAchannel XXXXXXXXXXXXXXXX"
*/
// setfield {compPath}/{chanName} gmax {surf*gbar}
setfield {compPath}/{chanpath} gmax {gbar}
// WE NEED TO ADD CA DYNAMICS, use 10% of current to CaL buffer
if ({isa dif_shell {compPath}/{caBuffer}} ) // dif_shell
// //echo spine calcium model is dif_shell
addmsg {compPath}/{chanpath}/block {compPath}/{caBuffer} FINFLUX Ik 0.1
elif ({isa Ca_concen {compPath}/{caBuffer}}) // Ca_conc
// //echo spine calcium model is Ca_conc
addmsg {compPath}/{chanpath}/block {compPath}/{caBuffer} fI_Ca Ik 0.1
end
end
function addSynChannel (compPath, chanpath, gbar)
str compPath, chanpath
float gbar
copy /library/{chanpath} {compPath}/{chanpath}
addmsg {compPath} {compPath}/{chanpath} VOLTAGE Vm
addmsg {compPath}/{chanpath} {compPath} CHANNEL Gk Ek
// Set the new conductance
float len = {getfield {compPath} len}
float dia = {getfield {compPath} dia}
float pi = 3.141592653589793
float surf = {len*dia*pi}
/* //echo "XXXXXXXXXXXXXXX addSynChannel XXXXXXXXXXXXXXXX"
//echo "compPath = "{compPath}
//echo "chanpath = "{chanpath}
//echo "gbar = "{gbar}
//echo "XXXXXXXXXXXXXXX addSynchannel XXXXXXXXXXXXXXXX"
*/
// setfield {compPath}/{chanName} gmax {surf*gbar}
setfield {compPath}/{chanpath} gmax {gbar}
end
function add_Rand_exSynapse_evenly(cellpath,a,b,spine_density,exSyn_name,filepath)
// number: num of AMPA/NMDA per compartment
// spiketrain: name for all spike generators
str cellpath,compt,compt2,NMDAname,AMPAname,spikegen,spiketrain,new_spiketrain,NMDA,AMPA,filepath,fname,exSyn_name
float a,b,position,len,spine_density,delaytime
int number,i,method,j,k //
float maxtime = 5.0 // maxim time of the duration for the input spike train
str NMDAname = "NMDA_channel_GHKCa"
str AMPAname = "AMPA_channel_GHKCa"
//float AMPAcond = 80e-12
//float NMDAcond = 220e-12
//float AMPAcond = 470e-12
//float NMDAcond = 170e-12
str buffer1 = "Ca_difshell_1" // name of the calcium pool in the spine
str buffer2 = "Ca_difshell_2"
str buffer3 = "Ca_difshell_3" // only to record NMDA-dependent [Ca]
if (!{ exists /spikes})
create neutral /spikes
end
spiketrain = "/spikes/"@{exSyn_name}
if (!{ exists {spiketrain}})
create neutral {spiketrain}
end
j = 21 // spike train
k=1
foreach compt ({el {cellpath}/##[TYPE=compartment]})
position={getfield {compt} position}
len ={getfield {compt} len}
number = len*1e6*spine_density
compt2 = {getpath {compt} -tail}
//if({number<1})
// number = 1
// end // make sure at least one synapse per compartment
if ({position>=a} && {position<b} )
for(i=1;i<=number;i=i+1)
new_spiketrain = {spiketrain}@"/"@{i}@"_"@{compt2}
// //echo the spiketrain is {new_spiketrain} and the existence is { exists {new_spiketrain}}
//new_spiketrain = {spiketrain}@"/"@{k}
fname = {filepath}@"-"@{j}
// it is a bit complicated here:
// we need to check the existence of the spikegen first
if (!{ exists {new_spiketrain}})
create timetable {new_spiketrain}
k=k+1
////echo create {new_spiketrain}
setfield {new_spiketrain} maxtime {maxtime} method 4 act_val 1.0 fname {fname}
// setfield {new_spiketrain} maxtime 1.0 method 1 meth_desc1 0.02 /*test only*/
call {new_spiketrain} TABFILL
spikegen = {new_spiketrain}@"/spike"
create spikegen {spikegen}
setfield {spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {new_spiketrain} {spikegen} INPUT activation
NMDA = {exSyn_name}@"_"@{NMDAname}@"_"@{i}
AMPA = {exSyn_name}@"_"@{AMPAname}@"_"@{i}
if({!{ exists {compt}/{AMPA}}})
addAMPAchannelGHKCa {compt} {AMPAname} {AMPA} {buffer1} {AMPAcond}
end
if({!{ exists {compt}/{NMDA}}})
addNMDAchannelGHKCa {compt} {NMDAname} {NMDA} {buffer1} {NMDAcond}
end
addmsg {spikegen} {compt}/{NMDA} SPIKE
addmsg {spikegen} {compt}/{AMPA} SPIKE
else
////echo the {new_spiketrain} already existed!
////echo {showfield {new_spiketrain} fname} and new file is {fname}
setfield {new_spiketrain} method 4 // need to change it back
setfield {new_spiketrain} fname {fname}
call {new_spiketrain} TABFILL
end
//setfield {new_spiketrain} method 1 // we "cheat" here :-)
//call {new_spiketrain} TUPDATE 2 0.0 {delaytime} 10000.0 // this means from 0-0.5, there would be NO synaptic inputs since the isi is very big
j=j+1
end // end of for...
end // end of if({position>=a} && {position<b} )
end // end of foreach...
//echo the sum of all exsyn {exSyn_name} is {k}
end
/******** add clustered random synapses to the compartments of interest*************************/
function add_Rand_ClusterExSynapse(cellpath,compt_list,spine_density,filepath, exSyn_name , mode, maxnum,j)
// number: num of AMPA/NMDA per compartment
// mode: "0", all synapses receiving the same random input; "1", receiving different random inputs
str cellpath,compt,NMDAname,AMPAname,spikegen,spiketrain,new_spiketrain,NMDA,AMPA,filepath,fname,compt_list,exSyn_name,compt2
float a,b,position,len,spine_density
int number,i,method,j, mode,maxnum,k //
str NMDAname = "NMDA_channel_GHKCa"
str AMPAname = "AMPA_channel_GHKCa"
//float AMPAcond = 170e-12
//float NMDAcond = 470e-12
//float AMPAcond = 80e-12
//float NMDAcond = 220e-12
str buffer1 = "Ca_difshell_1" // name of the calcium pool in the spine
if (!{ exists /spikes})
create neutral /spikes
end
spiketrain = "/spikes/"@{exSyn_name}
if (!{ exists {spiketrain}})
create neutral {spiketrain}
end
//j = 20 // spike train
k=1
int k2 = 1
int all_num = 0
foreach compt ({arglist {compt_list}})
compt = {cellpath}@"/"@{compt}
position ={getfield {compt} position}
len ={getfield {compt} len}
number = len*1e6*spine_density
compt2 = {getpath {compt} -tail}
for(i=1;i<=number;i=i+1)
new_spiketrain = {spiketrain}@"/"@{i}@"_"@{compt2} // note: there is a bug in the GENESIS
// the command "exists" can not compare two strings like" a[3]_1" and "a[3]_2"
// so we have to name two strings like "1_a[3]" and "2_a[3]" to make them distinguished by "exists"
//new_spiketrain = {spiketrain}@"/"@{k}
// //echo the spiketrain is {new_spiketrain} and the existence is { exists {new_spiketrain}}
if({mode}==1)
fname = {filepath}@"-"@{j}
else
fname = filepath
end
j=j+1
if ({all_num<maxnum})
if (!{ exists {new_spiketrain}})
create timetable {new_spiketrain}
k=k+1
////echo create {new_spiketrain}
setfield {new_spiketrain} maxtime 5.0 method 4 act_val 1.0 fname {fname}
////echo the file name is {fname}
//setfield {new_spiketrain} maxtime 10.0 method 1 act_val 1.0 meth_desc1 0.2
// note: we need to set a delay here
call {new_spiketrain} TABFILL
spikegen = {new_spiketrain}@"/spike"
create spikegen {spikegen}
setfield {spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {new_spiketrain} {spikegen} INPUT activation
NMDA = {exSyn_name}@"_"@{NMDAname}@"_"@{i}
AMPA = {exSyn_name}@"_"@{AMPAname}@"_"@{i}
if({!{ exists {compt}/{AMPA}}})
addAMPAchannelGHKCa {compt} {AMPAname} {AMPA} {buffer1} {AMPAcond3}
end
if({!{ exists {compt}/{NMDA}}})
addNMDAchannelGHKCa {compt} {NMDAname} {NMDA} {buffer1} {NMDAcond3}
end
addmsg {spikegen} {compt}/{NMDA} SPIKE
addmsg {spikegen} {compt}/{AMPA} SPIKE
else // if (!{ exists {new_spiketrain}}).....
k2=k2+1
////echo {new_spiketrain} has existed!
setfield {new_spiketrain} method 4 // need to change it back
setfield {new_spiketrain} fname {fname}
call {new_spiketrain} TABFILL
end // end for if (!{ exists...
all_num = all_num+1
end // end of "if all_num....
end // end of "for...
end // end of "foreach...
//echo the sum of the clustered exsyn {exSyn_name} is {k}
//echo the sum of existed clustered exsyn {exSyn_name} is {k2}
end
/******** add clustered random synapses to the compartments of interest*************************/
function add_Rand_NewClusterExSynapse(cellpath,compt_list,spine_density,filepath, exSyn_name , NMDAcond, AMPAcond, mode, maxnum,j)
// number: num of AMPA/NMDA per compartment
// mode: "0", all synapses receiving the same random input; "1", receiving different random inputs
str cellpath,compt,NMDAname,AMPAname,spikegen,spiketrain,new_spiketrain,NMDA,AMPA,filepath,fname,compt_list,exSyn_name,compt2
float a,b,position,len,spine_density
int number,i,method,j, mode,maxnum,k //
str NMDAname = "NMDA_channel_GHKCa"
str AMPAname = "AMPA_channel_GHKCa"
//float AMPAcond = 170e-12
//float NMDAcond = 470e-12
//float AMPAcond = 80e-12
//float NMDAcond = 220e-12
str buffer1 = "Ca_difshell_1" // name of the calcium pool in the spine
if (!{ exists /spikes})
create neutral /spikes
end
spiketrain = "/spikes/"@{exSyn_name}
if (!{ exists {spiketrain}})
create neutral {spiketrain}
end
//j = 20 // spike train
k=1
int k2 = 1
int all_num = 0
foreach compt ({arglist {compt_list}})
compt = {cellpath}@"/"@{compt}
position ={getfield {compt} position}
len ={getfield {compt} len}
//number = len*1e6*spine_density
number = spine_density
compt2 = {getpath {compt} -tail}
for(i=1;i<=number;i=i+1)
new_spiketrain = {spiketrain}@"/"@{i}@"_"@{compt2} // note: there is a bug in the GENESIS
// the command "exists" can not compare two strings like" a[3]_1" and "a[3]_2"
// so we have to name two strings like "1_a[3]" and "2_a[3]" to make them distinguished by "exists"
//new_spiketrain = {spiketrain}@"/"@{k}
// //echo the spiketrain is {new_spiketrain} and the existence is { exists {new_spiketrain}}
if({mode}==1)
fname = {filepath}@"-"@{j}
else
fname = filepath
end
j=j+1
if ({all_num<maxnum})
if (!{ exists {new_spiketrain}})
create timetable {new_spiketrain}
k=k+1
////echo create {new_spiketrain}
setfield {new_spiketrain} maxtime 5.0 method 4 act_val 1.0 fname {fname}
//echo the file name is {fname}
//setfield {new_spiketrain} maxtime 10.0 method 1 act_val 1.0 meth_desc1 0.2
// note: we need to set a delay here
call {new_spiketrain} TABFILL
spikegen = {new_spiketrain}@"/spike"
create spikegen {spikegen}
setfield {spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {new_spiketrain} {spikegen} INPUT activation
NMDA = {exSyn_name}@"_"@{NMDAname}@"_"@{i}
AMPA = {exSyn_name}@"_"@{AMPAname}@"_"@{i}
if({!{ exists {compt}/{AMPA}}})
addAMPAchannelGHKCa {compt} {AMPAname} {AMPA} {buffer1} {AMPAcond}
end
if({!{ exists {compt}/{NMDA}}})
addNMDAchannelGHKCa {compt} {NMDAname} {NMDA} {buffer1} {NMDAcond}
end
addmsg {spikegen} {compt}/{NMDA} SPIKE
addmsg {spikegen} {compt}/{AMPA} SPIKE
else // if (!{ exists {new_spiketrain}}).....
k2=k2+1
////echo {new_spiketrain} has existed!
setfield {new_spiketrain} method 4 // need to change it back
setfield {new_spiketrain} fname {fname}
call {new_spiketrain} TABFILL
end // end for if (!{ exists...
all_num = all_num+1
end // end of "if all_num....
end // end of "for...
end // end of "foreach...
//echo the sum of the clustered exsyn {exSyn_name} is {k}
//echo the sum of existed clustered exsyn {exSyn_name} is {k2}
end
/******** add clustered random synapses to the compartments of interest*************************/
function add_Rand_ClusterAMPA(cellpath,compt_list,spine_density,filepath, exSyn_name , mode, maxnum,j)
// number: num of AMPA per compartment
// mode: "0", all synapses receiving the same random input; "1", receiving different random inputs
str cellpath,compt,NMDAname,AMPAname,spikegen,spiketrain,new_spiketrain,NMDA,AMPA,filepath,fname,compt_list,exSyn_name,compt2
float a,b,position,len,spine_density
int number,i,method,j, mode,maxnum,k //
str AMPAname = "AMPA2_channel_GHKCa"
str buffer1 = "Ca_difshell_1" // name of the calcium pool in the spine
float tau1_AMPA2 = 1e-3
float tau2_AMPA2 = 5e-3
if (!{ exists /spikes})
create neutral /spikes
end
spiketrain = "/spikes/"@{exSyn_name}
if (!{ exists {spiketrain}})
create neutral {spiketrain}
end
//j = 20 // spike train
k=1
int all_num = 0
foreach compt ({arglist {compt_list}})
compt = {cellpath}@"/"@{compt}
position ={getfield {compt} position}
len ={getfield {compt} len}
number = len*1e6*spine_density
compt2 = {getpath {compt} -tail}
for(i=1;i<=number;i=i+1)
new_spiketrain = {spiketrain}@"/"@{i}@"_"@{compt2} // note: there is a bug in the GENESIS
// the command "exists" can not compare two strings like" a[3]_1" and "a[3]_2"
// so we have to name two strings like "1_a[3]" and "2_a[3]" to make them distinguished by "exists"
//new_spiketrain = {spiketrain}@"/"@{k}
// //echo the spiketrain is {new_spiketrain} and the existence is { exists {new_spiketrain}}
if({mode}==1)
fname = {filepath}@"-"@{j}
else
fname = filepath
end
j=j+1
if ({all_num<maxnum})
if (!{ exists {new_spiketrain}})
create timetable {new_spiketrain}
k=k+1
//echo create {new_spiketrain}
setfield {new_spiketrain} maxtime 5.0 method 4 act_val 1.0 fname {fname}
//echo the file name is {fname}
//setfield {new_spiketrain} maxtime 10.0 method 1 act_val 1.0 meth_desc1 0.2
// note: we need to set a delay here
call {new_spiketrain} TABFILL
spikegen = {new_spiketrain}@"/spike"
create spikegen {spikegen}
setfield {spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {new_spiketrain} {spikegen} INPUT activation
AMPA = {exSyn_name}@"_"@{AMPAname}@"_"@{i}
if({!{ exists {compt}/{AMPA}}})
addAMPAchannelGHKCa {compt} {AMPAname} {AMPA} {buffer1} {AMPAcond3}
end
addmsg {spikegen} {compt}/{AMPA} SPIKE
setfield {compt}/{AMPA} tau1 {tau1_AMPA2} tau2 {tau2_AMPA2}
else // if (!{ exists {new_spiketrain}}).....
setfield {new_spiketrain} method 4 // need to change it back
setfield {new_spiketrain} fname {fname}
call {new_spiketrain} TABFILL
end // end for if (!{ exists...
all_num = all_num+1
end // end of "if all_num....
end // end of "for...
end // end of "foreach...
end
function add_tonicGABA_evenly(cellpath,a,b,number,filepath)
// number: num of AMPA/NMDA per compartment
str cellpath,compt,spikegen,spikegen,spiketrain,new_spiketrain,filepath,filename,tGABA
float a,b,position
int number,i,method,j //
float GABAcond = 90e-12 // single gaba channel recording, Ade,et.al 2008
str GABAname = "tGABA"
if ({exists /spikes})
delete /spikes
reclaim
end
create neutral /spikes
if (!{ exists /tGABAs})
create neutral /tGABAs
else
delete /tGABAs
reclaim
create neutral /tGABAs
end
spiketrain = "/spikes/input_train"
j = 20 // spike train
foreach compt ({el {cellpath}/##[TYPE=compartment]})
position={getfield {compt} position}
if ({position>=a} && {position<b} )
for(i=1;i<=number;i=i+1)
new_spiketrain = {spiketrain}@"_"@{j}
filename = {filepath}@"-"@{j}
j=j+1
create timetable {new_spiketrain}
////echo create {new_spiketrain}
// setfield {new_spiketrain} maxtime 10.0 method {method} act_val 1.0 meth_desc1 {interval}
setfield {new_spiketrain} maxtime 10.0 method 4 act_val 1.0 fname {filename}
call {new_spiketrain} TABFILL
spikegen = {new_spiketrain}@"/spike"
create spikegen {spikegen}
setfield {spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {new_spiketrain} {spikegen} INPUT activation
/*****************************************************************************************/
tGABA = {GABAname}@"_"@{j}
copy /library/MSsynaptic/GABA_channel /tGABAs/{tGABA}
setfield /tGABAs/{tGABA} gmax {GABAcond}
addmsg {compt} /tGABAs/{tGABA} VOLTAGE Vm
addmsg /tGABAs/{tGABA} {compt} CHANNEL Gk Ek
if({exists {spikegen} })
addmsg {spikegen} /tGABAs/{tGABA} SPIKE
end // end of if ({exists {spikegen} })
end // end of for...
end // end of if({position>=a} && {position<b} )
end // end of foreach...
end
function add_Rand_ClusterGABA(cellpath,list,syn_density,filepath,GABAtype,GABAname,GABAcond, j)
// number: num of AMPA/NMDA per compartment
str cellpath,compt,spikegen,spikegen,spiketrain,new_spiketrain,filepath,filename,GABA,GABAname,list,GABAtype,compt2
float GABAcond,position,syn_density,len
int number,i,method,j,num //
if (!{exists /spikes})
create neutral /spikes
end
if (!{ exists /GABAs})
create neutral /GABAs
end
spiketrain = "/spikes/"@{GABAname}
//spiketrain = "/spikes/GABA_input_train"
if (!{ exists {spiketrain}})
create neutral {spiketrain}
end
num = 1
//j = 20 // spike train
foreach compt ({arglist {list}})
compt = {cellpath}@"/"@{compt}
position={getfield {compt} position}
len ={getfield {compt} len}
number = syn_density
compt2 = {getpath {compt} -tail}
//number = len*1e6*syn_density
//if ({position>=a} && {position<b} )
for(i=1;i<=number;i=i+1)
//new_spiketrain = {spiketrain}@"_"@{num}
new_spiketrain = {spiketrain}@"/"@{i}@"_"@{compt2}
filename = {filepath}@"-"@{j}
j=j+1
num = num+1
if (!{ exists {new_spiketrain}})
create timetable {new_spiketrain}
//echo create {new_spiketrain}
// setfield {new_spiketrain} maxtime 10.0 method {method} act_val 1.0 meth_desc1 {interval}
setfield {new_spiketrain} maxtime 10.0 method 4 act_val 1.0 fname {filename}
call {new_spiketrain} TABFILL
spikegen = {new_spiketrain}@"/spike"
create spikegen {spikegen}
setfield {spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {new_spiketrain} {spikegen} INPUT activation
/*****************************************************************************************/
GABA = {GABAname}@"_"@{i}
if(!{exists {compt}/{GABA}} )
copy /library/MSsynaptic/{GABAtype} {compt}/{GABA}
end
setfield {compt}/{GABA} gmax {GABAcond}
// to get a fixed driving force, "pseudoGABA_channel" does not communicate to its parent compartment
if (!{{strcmp "pseudoGABA_channel" {GABAtype}} == 0 } )
addmsg {compt} {compt}/{GABA} VOLTAGE Vm
addmsg {compt}/{GABA} {compt} CHANNEL Gk Ek
else
addmsg {compt}/{GABA} {compt} INJECT Ik
end
if({exists {spikegen} })
addmsg {spikegen} {compt}/{GABA} SPIKE
end// end of if ({exists {spikegen} })
else // (!{ exists {new_spiketrain}}).....
//echo {new_spiketrain} has existed!!
setfield {new_spiketrain} method 4
setfield {new_spiketrain} fname {filename}
call {new_spiketrain} TABFILL
end // end of if (!{ exists .....
end // end of for...
// end // end of if({position>=a} && {position<b} )
end // end of foreach...
end
function add_RandGABA_evenly(cellpath,a,b,density,filepath,GABAname,GABAcond, j)
// number: num of AMPA/NMDA per compartment
str cellpath,compt,spikegen,spikegen,spiketrain,new_spiketrain,filepath,filename,GABA,GABAname,compt2
float a,b,GABAcond,position,number ,density,len
int i,method,j,num //
if (!{exists /spikes})
create neutral /spikes
end
if (!{ exists /GABAs})
create neutral /GABAs
else
delete /GABAs
reclaim
create neutral /GABAs
end
spiketrain = "/spikes/GABA_input_train"
if (!{ exists {spiketrain}})
create neutral {spiketrain}
end
//j = 20 // spike train
foreach compt ({el {cellpath}/##[TYPE=compartment]})
// //echo compt is {compt}
position={getfield {compt} position}
len ={getfield {compt} len}
number = len*1e6*density
compt2 = {getpath {compt} -tail}
if ({position>=a} && {position<b} )
for(i=1;i<=number;i=i+1)
// new_spiketrain = {spiketrain}@"_"@{num}
new_spiketrain = {spiketrain}@"/"@{i}@"_"@{compt2}
filename = {filepath}@"-"@{j}
j=j+1
num = num+1
if (!{ exists {new_spiketrain}})
create timetable {new_spiketrain}
////echo create {new_spiketrain}
// setfield {new_spiketrain} maxtime 10.0 method {method} act_val 1.0 meth_desc1 {interval}
setfield {new_spiketrain} maxtime 10.0 method 4 act_val 1.0 fname {filename}
call {new_spiketrain} TABFILL
spikegen = {new_spiketrain}@"/spike"
create spikegen {spikegen}
setfield {spikegen} output_amp 1 thresh 0.5 abs_refract 0.0001
addmsg {new_spiketrain} {spikegen} INPUT activation
/*****************************************************************************************/
GABA = {GABAname}@"_"@{j}
copy /library/MSsynaptic/GABA_channel {compt}/{GABA}
setfield {compt}/{GABA} gmax {GABAcond}
addmsg {compt} {compt}/{GABA} VOLTAGE Vm
addmsg {compt}/{GABA} {compt} CHANNEL Gk Ek
if({exists {spikegen} })
addmsg {spikegen} {compt}/{GABA} SPIKE
end // end of if ({exists {spikegen} })
else
////echo {new_spiketrain} has existed!!
setfield {new_spiketrain} method 4
setfield {new_spiketrain} fname {filename}
call {new_spiketrain} TABFILL
end // end of if (!{ exists.....
end // end of for...
end // end of if({position>=a} && {position<b} )
end // end of foreach...
end
function addAMPA2channel(compPath, gbar,num)
str compPath, chanName,preSyn
float gbar
int i,num
for(i=1;i<=num;i=i+1)
preSyn = "presyn"@{i}@"_ext2"
chanName = "AMPA2"@"_"@{i}
create neutral {compPath}/{preSyn}
copy /library/MSsynaptic/AMPA2_channel {compPath}/{chanName} // AMPA2-channel is a "mutant" version of GABA channel
// i.e. only varied in Ek.
setfield {compPath}/{chanName} gmax {gbar}
addmsg {compPath} {compPath}/{chanName} VOLTAGE Vm
addmsg {compPath}/{chanName} {compPath} CHANNEL Gk Ek
addmsg {compPath}/{preSyn} {compPath}/{chanName} ACTIVATION z
//echo Add {compPath}/{preSyn} and {compPath}/{chanName}
end
end
function addGABAchannel(cellpath, list,GABAchanType,chanName,gbar,num)
str compPath, chanName,preSyn,GABAchanType,cellpath,list,compt
float gbar
int i,num
foreach compt ({arglist {list}})
compPath = {cellpath}@"/"@{compt}
for(i=1;i<=num;i=i+1)
preSyn = "presyn"@{i}@"_inh"
create neutral {compPath}/{preSyn}
copy /library/MSsynaptic/{GABAchanType} {compPath}/{chanName}"_"{i}
setfield {compPath}/{chanName}"_"{i} gmax {gbar}
// note!!!
// for "pseudoGABA_channel", the driving force is *FIXED*
if (!{{strcmp "pseudoGABA_channel" {GABAchanType}} == 0 } )
// echo this is NOT pseudoGABA
addmsg {compPath} {compPath}/{chanName}"_"{i} VOLTAGE Vm
addmsg {compPath}/{chanName}"_"{i} {compPath} CHANNEL Gk Ek
else
//echo This is pseudoGABA
addmsg {compPath}/{chanName}"_"{i} {compPath} INJECT Ik
end
addmsg {compPath}/{preSyn} {compPath}/{chanName}"_"{i} ACTIVATION z
//echo Add {compPath}/{preSyn} and {compPath}/{chanName}"_"{i}
end
end // end of foreach....
end
function addGABAchannel_NoPreSyn(cellpath, list,GABAchanType,chanName,gbar,num)
str compPath, chanName,preSyn,GABAchanType,cellpath,list,compt
float gbar
int i,num
foreach compt ({arglist {list}})
compPath = {cellpath}@"/"@{compt}
for(i=1;i<=num;i=i+1)
//preSyn = "presyn"@{i}@"_inh"
//create neutral {compPath}/{preSyn}
copy /library/MSsynaptic/{GABAchanType} {compPath}/{chanName}"_"{i}
setfield {compPath}/{chanName}"_"{i} gmax {gbar}
// note!!!
// for "pseudoGABA_channel", the driving force is *FIXED*
if (!{{strcmp "pseudoGABA_channel" {GABAchanType}} == 0 } )
// echo this is NOT pseudoGABA
addmsg {compPath} {compPath}/{chanName}"_"{i} VOLTAGE Vm
addmsg {compPath}/{chanName}"_"{i} {compPath} CHANNEL Gk Ek
else
//echo This is pseudoGABA
addmsg {compPath}/{chanName}"_"{i} {compPath} INJECT Ik
end
// addmsg {compPath}/{preSyn} {compPath}/{chanName}"_"{i} ACTIVATION z
//echo Add {compPath}/{preSyn} and {compPath}/{chanName}"_"{i}
end
end // end of foreach....
end
function activateGABAchannels(cellpath,list,num,ISI)
str compPath, chanName,preSyn,GABAchanType,cellpath,list,compt
float ISI
int i,num
foreach compt ({arglist {list}})
compPath = {cellpath}@"/"@{compt}
for(i=1;i<=num;i=i+1)
preSyn = "presyn"@{i}@"_inh"
setfield {compPath}/{preSyn} z {1/{getclock 0}}
step 1
setfield {compPath}/{preSyn} z 0
step {ISI} -time
//echo Activating {compPath}/{preSyn} now!
end
end // end of foreach....
end
function addExtSynapses(cellpath, list,chanName,gbar_NMDA,gbar_AMPA,num)
str compPath, chanName,preSyn,AMPAchanType,cellpath,list,compt
float gbar_NMDA,gbar_AMPA
int i,num
str NMDAname = "NMDA_channel_GHKCa"
str AMPAname = "AMPA_channel_GHKCa"
str buffer1 = "Ca_difshell_1" // name of the calcium pool in the spine
str buffer2 = "Ca_difshell_2"
str buffer3 = "Ca_difshell_3" // only to record NMDA-dependent [Ca]
foreach compt ({arglist {list}})
compPath = {cellpath}@"/"@{compt}
for(i=1;i<=num;i=i+1)
preSyn = "presyn"@{i}@"_ext"
create neutral {compPath}/{preSyn}
if({!{ exists {compPath}/{chanName}"_AMPA_"{i}}})
addAMPAchannelGHKCa {compPath} {AMPAname} {chanName}"_AMPA_"{i} {buffer1} {gbar_AMPA}
end
if({!{ exists {compPath}/{chanName}"_NMDA_"{i}}})
addNMDAchannelGHKCa {compPath} {NMDAname} {chanName}"_NMDA_"{i} {buffer1} {gbar_NMDA}
end
addmsg {compPath}/{preSyn} {compPath}/{chanName}"_AMPA_"{i} ACTIVATION z
addmsg {compPath}/{preSyn} {compPath}/{chanName}"_NMDA_"{i} ACTIVATION z
//echo Add {compPath}/{preSyn}
end
end // end of foreach....
end
function addExtSynapses_0Mg(cellpath, list,chanName,gbar_NMDA,gbar_AMPA,num)
str compPath, chanName,preSyn,AMPAchanType,cellpath,list,compt
float gbar_NMDA,gbar_AMPA
int i,num
str NMDAname = "NMDA_channel_GHKCa"
str AMPAname = "AMPA_channel_GHKCa"
str buffer1 = "Ca_difshell_1" // name of the calcium pool in the spine
str buffer2 = "Ca_difshell_2"
str buffer3 = "Ca_difshell_3" // only to record NMDA-dependent [Ca]
foreach compt ({arglist {list}})
compPath = {cellpath}@"/"@{compt}
for(i=1;i<=num;i=i+1)
preSyn = "presyn"@{i}@"_ext"
create neutral {compPath}/{preSyn}
if({!{ exists {compPath}/{chanName}"_AMPA_"{i}}})
addAMPAchannelGHKCa {compPath} {AMPAname} {chanName}"_AMPA_"{i} {buffer1} {gbar_AMPA}
end
if({!{ exists {compPath}/{chanName}"_NMDA_"{i}}})
addNMDAchannelGHKCa {compPath} {NMDAname} {chanName}"_NMDA_"{i} {buffer1} {gbar_NMDA}
setfield {compPath}/{chanName}"_NMDA_"{i}/Mg_block_NMDA CMg 0
end
addmsg {compPath}/{preSyn} {compPath}/{chanName}"_AMPA_"{i} ACTIVATION z
addmsg {compPath}/{preSyn} {compPath}/{chanName}"_NMDA_"{i} ACTIVATION z
//echo Add {compPath}/{preSyn}
end
end // end of foreach....
end
function addExtSynapses_Mg(cellpath, list,chanName,gbar_NMDA,gbar_AMPA,num,CMg)
str compPath, chanName,preSyn,AMPAchanType,cellpath,list,compt
float gbar_NMDA,gbar_AMPA,CMg
int i,num
str NMDAname = "NMDA_channel_GHKCa"
str AMPAname = "AMPA_channel_GHKCa"
str buffer1 = "Ca_difshell_1" // name of the calcium pool in the spine
str buffer2 = "Ca_difshell_2"
str buffer3 = "Ca_difshell_3" // only to record NMDA-dependent [Ca]
foreach compt ({arglist {list}})
compPath = {cellpath}@"/"@{compt}
for(i=1;i<=num;i=i+1)
preSyn = "presyn"@{i}@"_ext"
create neutral {compPath}/{preSyn}
if({!{ exists {compPath}/{chanName}"_AMPA_"{i}}})
addAMPAchannelGHKCa {compPath} {AMPAname} {chanName}"_AMPA_"{i} {buffer1} {gbar_AMPA}
end
if({!{ exists {compPath}/{chanName}"_NMDA_"{i}}})
addNMDAchannelGHKCa {compPath} {NMDAname} {chanName}"_NMDA_"{i} {buffer1} {gbar_NMDA}
setfield {compPath}/{chanName}"_NMDA_"{i}/Mg_block_NMDA CMg {CMg}
end
addmsg {compPath}/{preSyn} {compPath}/{chanName}"_AMPA_"{i} ACTIVATION z
addmsg {compPath}/{preSyn} {compPath}/{chanName}"_NMDA_"{i} ACTIVATION z
//echo Add {compPath}/{preSyn}
end
end // end of foreach....
end
function activateExtSynchannels(cellpath,list,num,ISI)
str compPath, chanName,preSyn,GABAchanType,cellpath,list,compt
float ISI
int i,num
foreach compt ({arglist {list}})
compPath = {cellpath}@"/"@{compt}
for(i=1;i<=num;i=i+1)
preSyn = "presyn"@{i}@"_ext"
setfield {compPath}/{preSyn} z {1/{getclock 0}}
step 1
setfield {compPath}/{preSyn} z 0
step {ISI} -time
//echo Activating {compPath}/{preSyn} now!
end
end // end of foreach....
end
function findCompt(cellpath,a, b ,minLen)
float a,b,position,len, minLen
str cellpath, compt, list, temp
list = ""
foreach compt ({el {cellpath}/##[TYPE=compartment]})
position = {getfield {compt} position}
len = {getfield {compt} len}
if ({{position >= a} && {position < b} && len>={minLen}})
compt = {getpath {compt} -tail}
list = {list}@" "@{compt}
////echo ""
// //echo {compt}
// //echo position: {position} length: {len}
end // end of if
end // end of foreach
////echo the compartments between {a} and {b} are
////echo {list}
return {list}
end
function findComptAtTheBranch( cellpath ,branch_name, a, b , minLen )
float a,b,position,len, minLen
str cellpath, compt, list, temp, branch_name, tmp
list = ""
int num = {strlen {branch_name} }
foreach compt ({el {cellpath}/##[TYPE=compartment]})
position = {getfield {compt} position}
len = {getfield {compt} len}
compt = {getpath {compt} -tail}
tmp = { substring {compt} 0 {{num}-1} }
int indx = {{strcmp {branch_name} {tmp}} == 0}
// //echo {branch_name} {tmp} {indx}
if ({{position >= a} && {position < b} && len>={minLen} && {strcmp {branch_name} {tmp}}==0})
list = {list}@" "@{compt}
////echo ""
// //echo {compt}
// //echo position: {position} length: {len}
end // end of if
end // end of foreach
////echo the compartments between {a} and {b} are
////echo {list}
return {list}
end
function findComptAtTheBranch2(filepath,compt_initial, compt_end)
// compt_initial is the first compt in the branch
int flag = 1
int flag2 = 0
int num
str compt_initial, filepath, compt_1,compt_2,list,lines,compt_end
list =""
lines = ""
openfile {filepath} r
while (flag == 1 )
lines = {readfile {filepath} -l}
num = {getarg {arglist {lines}} -count}
if (num>2)
////echo the current line is {lines}
////echo the num is {num}
compt_1 = {getarg {arglist {lines}} -arg 1} // the first collumn
compt_2 = {getarg {arglist {lines}} -arg 2} // the second collumn
////echo compt_1 is {compt_1} and compt_2 is {compt_2}
end
if ({{strcmp {compt_1} {compt_initial}}==0} && {flag2 ==0} ) // find the first compartment in the branch
flag2 = 1
//echo ============================
//echo now start to add to list!
//echo ============================
end // end of if
//if({flag2 == 1} && {num==0} ) // this is another branch, so ends to read lines
if ({{strcmp {compt_1} {compt_end}}==0})
flag2 = 0
flag = 0
//echo ""
//echo =====================
//echo ends here!!
//echo ======================
end
if (flag2 == 1)
list = {list}@" "@{compt_1}
//echo add {compt_1} to the list
end
end // end of while
return {list}
closefile {filepath}
end
function makeRandList ( list, number)
str list, list2, tmp
int number,num,num2,randnum
/*
str tt
float isi,x1,x2,x3
int x4
int new_seed
tt = { getarg {arglist {getdate}} -arg 4} // using time for the random seeds
x1 = {substring {tt} 0 1} // hour;
x2 = {substring {tt} 3 4} // minute;
x3 = {substring {tt} 6 7} // second;
x4 = x1*x2*x3+ {pow {x1} 4} + {pow {x2} 4} + {pow {x3} 4} // this formula is arbitrarily set to make a big but random number
new_seed = {rand 1 {x4}}
randseed {new_seed}
*/
list2 = ""
num = {getarg {arglist {list}}-count}
while ({num>0} && {num2<number})
randnum = {rand 1 {num}} // generate a random (int) number
tmp = {getarg {arglist {list}} -arg {randnum}}
list2 = {list2}@" "@{tmp}
////echo the list2 is {list2}
list = {strsub {list} {tmp} ""} // delete the one we used
////echo the list is {list}
num = {getarg {arglist {list}} -count} // update "num"
num2 = {getarg {arglist {list2}} -count}
// //echo the num2 is {num2}
end // end of while
return {list2}
end // end of function
// romove list2 from list1
function rmList(list1,list2)
str list1,list2,tmp
int i,num1,num2
num2 = {getarg {arglist {list2}}-count}
for(i=1;i<=num2;i=i+1)
tmp = {getarg {arglist {list2}} -arg {i}}
list1 = {strsub {list1} {tmp} ""} // delete the same string from "list2"
end
return {list1}
end
/*********************************************************************************/
// taken from Alex's code
function Make_integr_syn (compart, synchannel, ek, gmax, tau1, tau2, dur,delay1)
str compart, synchannel
float ek, gmax, tau1, tau2, dur,delay1
float xmin, xmax
int xdivs
float rho={1/tau2}, sig={1/tau1}
float x,dx,y,z
int i
// Strob signal of duration {dur} for each incoming spike event
create pulsegen {compart}/{synchannel}
setfield {compart}/{synchannel} width1 {dur} level1 1 trig_mode 0 delay1 {delay1}
// Integration of synaptic inputs
pushe {compart}/{synchannel}
create tabchannel integr
setfield ^ \
Ek 0 \
Gbar 1 \
Xpower 0 \
Ypower 0 \
Zpower 1
xmin = -.1
xmax = 1.1
xdivs = 10
call integr TABCREATE Z {xdivs} {xmin} {xmax}
dx = (xmax - xmin)/xdivs
x = xmin
for (i = 0 ; i <= {xdivs} ; i = i + 1)
y = rho*x
z = (rho-sig)*x+sig
setfield integr Z_A->table[{i}] {y}
setfield integr Z_B->table[{i}] {z}
x = x + dx
end
pope
// Synaptic channel
pushe {compart}/{synchannel}
create vdep_channel out
setfield out Ek {ek} gbar {gmax}
pope
// Linking synapse to postsynaptic compartment
addmsg {compart} {compart}/{synchannel}/integr VOLTAGE Vm
addmsg {compart} {compart}/{synchannel}/out VOLTAGE Vm
addmsg {compart}/{synchannel}/out {compart} CHANNEL Gk Ek
pushe {compart}/{synchannel}
addmsg ./ integr CONCEN output
addmsg integr out MULTGATE Gk 1
pope
end
// ---
// --- NMDA Synapse: input integration, Mg block, [Ca], K(Ca) channel
// ---
// function makeDynamicSyn(path,spikegen,syn,syn_type,num_syn,filepath,j0)
// str path,syn_type,filepath,syn,spikegen,new_spikegen
// int num,num_syn,i,j0,num2,k,nn
// float activation,tt,tmin,tmax,tt1,dt
// tmin =0;tmax=1
// dt = {getclock 0}
// int num = (tmax-tmin)/dt
// //pushe {path}
// if({!{exists /FSsyn }})
// create neutral /FSsyn
// end
// for(i=1;i<=num_syn;i=i+1)
// new_spikegen = "/FSsyn/"@{spikegen}@"_"@{i}
// //echo spigen is {new_spikegen}
// if({!{exists {new_spikegen} }})
// //echo j0 is {j0} and creat the spikegen {new_spikegen} now!!
// create table {new_spikegen}
// else
// //echo j0 is {j0} and the spikegen {new_spikegen} has existed!!
// call {new_spikegen} TABCREATE 1 0 0 // to *clear* existed table
// end
// setfield {new_spikegen} step_mode 2 stepsize 0 // we use simulation time for lookup
// call {new_spikegen} TABCREATE {num} {tmin} {tmax}
// deletemsg {path}/{syn}"_"{i} 0 -in // NOTE:should delete the previous "activation" msg first!!
// addmsg {new_spikegen} {path}/{syn}"_"{i} ACTIVATION output
// openfile {filepath}/"noise-gate-totalnumber-"{(j0+i)} r // number of spikes
// openfile {filepath}/"noise-gate-"{syn_type}"-"{(j0+i)} r // spike modulation
// openfile {filepath}/"noise-gate-"{(j0+i)} r // spike timings
// //echo gaba {path}/{syn}"_"{i} is now using the file "noise-gate-"{(j0+i)}
// num2 = {readfile {filepath}/"noise-gate-totalnumber-"{(j0+i)} }
// closefile {filepath}/"noise-gate-totalnumber-"{(j0+i)}
// for(k=1;k<=num2;k=k+1)
// tt1 = {readfile {filepath}/"noise-gate-"{(j0+i)} }
// activation = {readfile {filepath}/"noise-gate-"{syn_type}"-"{(j0+i)} }
// nn = tt1/dt
// setfield {new_spikegen} table->table[{nn}] {activation/{getclock 0}}
// end
// closefile {filepath}/"noise-gate-"{syn_type}"-"{(j0+i)}
// closefile {filepath}/"noise-gate-"{(j0+i)}
// end
// //pope
// end
function findActivatedRandSyn(spikePath,tmin,tmax)
str spikePath,path1,line1,fname,spkgen,compt,list
float t1,t2,tt,dt1,dt2,tmin,tmax
int len
list =""
foreach path1 ({el {spikePath}/#})
fname = {getfield {path1} fname}
////echo {fname}
openfile {fname} r
line1="0" // non-empty
while({strlen {line1}}>0)
line1 = {readfile {fname} }
////echo {line1}
if({strlen {line1}}>0)
tt = {arglist {line1}}
if (tt>=tmin && tt<=tmax)
spkgen = {getpath {path1} -tail }
compt = {substring {spkgen} 2} // the spkgen is always like this "1_739"; "739" is the compartment we want.
////echo compt is {compt}
////echo the old list is {list}
list = {list}@" "@{compt}
////echo the new list is {list}
end // end of if...
end // end of if...
end // end of while
closefile {fname}
end // end of foreach
return {list}
end
function makeDynamicSyn(path,spikegen,syn,syn_type,num_syn,filepath,j0)
str path,syn_type,filepath,syn,spikegen,new_spikegen
int num,num_syn,i,j0,num2,k,nn
float activation,tt,tmin,tmax,tt1,dt
tmin =0.4;tmax=1
dt = {getclock 0}
int num = (tmax-tmin)/dt
//pushe {path}
if({!{exists /FSsyn }})
create neutral /FSsyn
end
for(i=1;i<=num_syn;i=i+1)
new_spikegen = "/FSsyn/"@{spikegen}@"_"@{i}
//echo spigen is {new_spikegen}
if({!{exists {new_spikegen} }})
//echo j0 is {j0} and creat the spikegen {new_spikegen} now!!
create table {new_spikegen}
else
//echo j0 is {j0} and the spikegen {new_spikegen} has existed!!
call {new_spikegen} TABCREATE 1 0 0 // to *clear* existed table
end
setfield {new_spikegen} step_mode 2 stepsize 0 // we use simulation time for lookup
call {new_spikegen} TABCREATE {num} {tmin} {tmax}
deletemsg {path}/{syn}"_"{i} 0 -in // NOTE:should delete the previous "activation" msg first!!
addmsg {new_spikegen} {path}/{syn}"_"{i} ACTIVATION output
openfile {filepath}/"noise-gate-totalnumber-"{(j0+i)} r // number of spikes
openfile {filepath}/"noise-gate-"{syn_type}"-"{(j0+i)} r // spike modulation
openfile {filepath}/"noise-gate-"{(j0+i)} r // spike timings
// //echo gaba {path}/{syn}"_"{i} is now using the file "noise-gate-"{(j0+i)}
num2 = {readfile {filepath}/"noise-gate-totalnumber-"{(j0+i)} }
closefile {filepath}/"noise-gate-totalnumber-"{(j0+i)}
for(k=1;k<=num2;k=k+1)
tt1 = {readfile {filepath}/"noise-gate-"{(j0+i)} }
tt1 = tt1 - tmin
activation = {readfile {filepath}/"noise-gate-"{syn_type}"-"{(j0+i)} }
nn = tt1/dt
//echo@0 set table at {mynode} and nn is {nn}
setfield {new_spikegen} table->table[{nn}] {activation/{getclock 0}}
end
closefile {filepath}/"noise-gate-"{syn_type}"-"{(j0+i)}
closefile {filepath}/"noise-gate-"{(j0+i)}
end
//pope
end