//genesis
//ConstrainUp.g
/*Functions used to connect a set of spines that are constrained by
*pathlength from soma
*sharing a common parent branch, either soma, primary, secondary, or tertiary
*/
function ConnectWithDelay (minDelay, maxDelay, othercell, compt, meanDelay)
str othercell, compt
float maxDelay, minDelay, meanDelay
float StimDelay
int i
StimDelay={rand {minDelay} {maxDelay}}
//echo "minDelay: " {minDelay} " maxDelay: " {maxDelay} " StimDelay: " {StimDelay}
addmsg {othercell}/spikegen {compt}/{NMDAname} SPIKE
addmsg {othercell}/spikegen {compt}/{AMPAname} SPIKE
int msgnum = {getfield {compt}/{NMDAname} nsynapses} - 1
setfield {compt}/{NMDAname} synapse[{msgnum}].weight 1 synapse[{msgnum}].delay {StimDelay+meanDelay}
msgnum = {getfield {compt}/{AMPAname} nsynapses} - 1
setfield {compt}/{AMPAname} synapse[{msgnum}].weight 1 synapse[{msgnum}].delay {StimDelay+meanDelay}
return {StimDelay}
end
/* This function loops through all spines to either count the number filling criteria
or to connect one of those spines */
function spineLoop(startcomp,parenttype,maxpath,connectProb,maxdelay,mindelay)
int parenttype
str startcomp, connectProb
float maxpath,maxdelay,mindelay
float compPathLen,ConnProb, rannum,StimDelay,meanDelay=0
str compt,compParent,commonBranch
int numsp=0,connect=0
//echo "spineLoop function minDelay= " {mindelay}
//extract minpath from the starting compartment
//maxpath is the total distance between start comp and most distance spine
float minpath={getfield {neuronname}/{startcomp} pathlen}-{getfield {neuronname}/{startcomp} len}/2
maxpath={minpath}+{maxpath}
//strcmp returns 0 if connectProb = 0, so we do this only if NE 0
if ({strcmp {connectProb} "0"})
connect=1
ConnProb={connectProb}
end
//parenttype is either 0:soma, 1:parentprim, 2:parentsec, 3:parenttert
if ({parenttype}==0)
commonBranch="soma"
elif ({parenttype}==1)
commonBranch={getfield {neuronname}/{startcomp} parentprim}
elif ({parenttype}==2)
commonBranch={getfield {neuronname}/{startcomp} parentsec}
elif ({parenttype}==3)
commonBranch={getfield {neuronname}/{startcomp} parenttert}
end
foreach compt ({el {neuronname}/##[TYPE=symcompartment]})
//is this a spine head, if so, determine pathlength
if ({strcmp {getpath {compt} -tail} "head"} == 0)
compPathLen={getfield {compt} pathlen}
//is pathlength within min and max? If so, determine parent branch
if ((compPathLen > minpath) && (compPathLen < maxpath))
if ({parenttype} == 1)
compParent={getfield {compt} parentprim}
elif ({parenttype} == 2)
compParent={getfield {compt} parentsec}
elif ({parenttype} == 3)
compParent={getfield {compt} parenttert}
else
compParent="soma"
end
//is parent branch correct? if so either count it (first time through loop) or connect with probability
if ({strcmp {compParent} {commonBranch}}==0)
if (connect)
rannum={rand 0 1}
if ({rannum}<{ConnProb})
StimDelay={ConnectWithDelay {mindelay} {maxdelay} {precell} {compt} {meanDelay}}
//count connected spines
numsp=numsp+1
meanDelay=meanDelay+StimDelay
echo "connect" {compt} "ranum" {rannum} "stimdelay" {StimDelay} "totaldelay" {meanDelay}
else
echo "no connect" {compt} {rannum} "gt" {ConnProb}
end
else
//count valid spines
echo "valid sp" {compt} {compPathLen} "bt" {minpath} "&" {maxpath} "par:" {compParent} "numsp" {numsp+1}
numsp=numsp+1
end
end
end
end
end
if (connect)
echo "meanDelay=" {meanDelay/numsp} "num connect=" {numsp}
end
return {numsp}
end
function ConstrainUp(numstim,startcomp,parenttype,maxpath,mindelay,maxdelay,file)
int numstim,parenttype
str startcomp,file
float maxpath,maxdelay,mindelay
str noConnect="0"
int nummsg=0
float initSim=0.1,postSim=0.52
//*********set up presynaptic element for stimulating
PreSynStim {precell}
addmsg {precell}/spikegen /output/{Vmfile} SAVE state
//call spineloop to count number of valid spines
int numsp = {spineLoop {startcomp} {parenttype} {maxpath} {noConnect} {maxdelay} {mindelay}}
if ({numsp}<{numstim})
echo "PROBLEM in SpineLoop:" {numsp} "spines < " {numstim} ": not enough spines fill criteria"
else
//calculate connection prob, then call spineloop to connect spines
float nstim=numstim
float prob=nstim/numsp
echo "spines" {numsp} "stim" {numstim} "connecting with probability" {prob}
numsp = {spineLoop {startcomp} {parenttype} {maxpath} {prob} {maxdelay} {mindelay}}
end
//**********set the file name and headers. Must be after spines connected
spinehead={add_outputMultiSpines {spinefile} {prob}}
str filenam={file}@"p"@{parenttype}@{startcomp}@{maxpath}
setfilename {Vmfile} {filenam} 1 {Vmhead}
setfilename {Cafile} {filenam} 1 {Cahead}
setfilename {Gkfile} {filenam} 1 {Gkhead}
setfilename {spinefile} {filenam} 1 {spinehead}
//run the simulation
step {initSim} -time
setfield {precell} Vm 10
step 1
showfield {precell}/spikegen state lastevent
setfield {precell} Vm 0
step {postSim} -time
fileFLUSH {Vmfile}
fileFLUSH {Cafile}
fileFLUSH {Gkfile}
fileFLUSH {spinefile}
//disconnect the spike generator, in preparation for another stimulation paradigm
nummsg={getmsg {precell}/spikegen -out -count}
int i
for (i=0; i<nummsg; i=i+1)
deletemsg {precell}/spikegen 0 -outgoing
end
end