//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
func cellID() { //$1 cell type, $2 id within type, returns global id
//return global id
tmp = -1
if ($1==ID_STN) {
if ($2 < numSTN) {
tmp = $2
}
} else {
if ($1==ID_GPe) {
if ($2 < numGPe) {
tmp = numSTN + $2
}
} else {
if ($1==ID_GPi) {
if ($2 < numGPi) {
tmp = numSTN + numGPe + $2
}
}
}
}
return tmp
}
//----------------------------------------------------------------------------
func synNum() { //$1 src cell type, $2 target cell type, $3 number within type, returns synapse number
//return synapse list index
tmp = -1
//-----------------------------------------
if ($2==ID_STN) {
if ($1==ID_Ctx) {
if ($3 < numCtxSTN) {
tmp = $3
}
} else {
if ($1==ID_GPe) {
if ($3 < numGPeSTN) {
tmp = $3 + numCtxSTN
}
}
}
} else {
//-----------------------------------------
if ($2==ID_GPe) {
if ($1==ID_Str) {
if ($3 < numStrGPe) {
tmp = $3
}
} else {
if ($1==ID_STN) {
if ($3 < numSTNGPe) {
tmp = $3 + numStrGPe
}
} else {
if ($1==ID_GPe) {
if ($3 < numGPeGPe) {
tmp = $3 + numStrGPe + numSTNGPe
}
}
}
}
} else {
//-----------------------------------------
if ($2==ID_GPi) {
if ($1==ID_Str) {
if ($3 < numStrGPi) {
tmp = $3
}
} else {
if ($1==ID_STN) {
if ($3 < numSTNGPi) {
tmp = $3 + numStrGPi
}
} else {
if ($1==ID_GPe) {
if ($3 < numGPeGPi) {
tmp = $3 + numStrGPi + numSTNGPi
}
}
}
}
} else {
//-----------------------------------------
// if ($2==ID_Tha) {
// if ($1==ID_GPi) { // this is a fake Tha synapse located in its connected GPi output cell
// if ($3 < numGPiTha) {
// tmp = $3 + numStrGPi + numSTNGPi + numGPeGPi
// }
// }
// }
}
}
}
return tmp
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
//Setup global parameters
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
objref probCtxSTN, probStrGPe, probStrGPi
//-----------------------------------------------------------------------------------------------------
// IDs
ID_STN = 1
ID_GPe = 2
ID_GPi = 3
ID_Ctx = 4
ID_Str = 5
ID_Tha = 6
// make space for variables
numSTN = 0
numGPe = 0
numGPi = 0
ncell = 0
numSTNGPe = 0
numGPeGPe = 0
numGPeSTN = 0
numGPeGPi = 0
numSTNGPi = 0
numCtxSTN = 0
numStrGPe = 0
numStrGPi = 0
numGPiTha = 0
divSTNGPe = 0
divGPeGPe = 0
divGPeSTN = 0
divGPeGPi = 0
divSTNGPi = 0
divGPiTha = 0
iBiasSTN = 0
iBiasGPe = 0
iBiasGPi = 0
gmaxSTNGPe = 0
gmaxGPeGPe = 0
gmaxGPeSTN = 0
gmaxGPeGPi = 0
gmaxSTNGPi = 0
gmaxGPiTha = 0
gDA_STNGPe = 0
gDA_GPeGPe = 0
gDA_GPeSTN = 0
gDA_GPeGPi = 0
gDA_STNGPi = 0
gDA_GPiTha = 0
delSTNGPe = 0
delGPeGPe = 0
delGPeSTN = 0
delGPeGPi = 0
delSTNGPi = 0
delGPiTha = 0
imnCtxSTN = 0
isdCtxSTN = 0
bmnCtxSTN = 0
bsdCtxSTN = 0
bdmnCtxSTN = 0
bdsdCtxSTN = 0
imnStrGPe = 0
isdStrGPe = 0
bmnStrGPe = 0
bsdStrGPe = 0
bdmnStrGPe = 0
bdsdStrGPe = 0
imnStrGPi = 0
isdStrGPi = 0
bmnStrGPi = 0
bsdStrGPi = 0
bdmnStrGPi = 0
bdsdStrGPi = 0
probCtxSTN = new Vector(numCtxSTN)
probStrGPe = new Vector(numStrGPe)
probStrGPi = new Vector(numStrGPi)
gmaxCtxSTN = 0
gmaxStrGPe = 0
gmaxStrGPi = 0
gDA_CtxSTN = 0
gDA_StrGPe = 0
gDA_StrGPi = 0
delCtxSTN = 0
delStrGPe = 0
delStrGPi = 0
dbs_del = 0
dbs_dur = 0
dbs_direct_amp = 0
dbs_direct_pw = 0
dbs_ad_amp = 0
dbs_ad_pw = 0
dbs_period = 0
dbs_odSTNGPe_weight = 0
dbs_odSTNGPi_weight = 0
dbs_odGPeSTN_weight = 0
dbs_odGPiTha_weight = 0
dbs_odSTNGPe_delay = 0
dbs_odSTNGPi_delay = 0
dbs_odGPeSTN_delay = 0
dbs_odGPiTha_delay = 0
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
proc allocCells() {local i
pnm.ncell = ncell
pnm.round_robin() // may want to change this due to patterned gpe-gpe connections
for i=cellID(ID_STN,0),cellID(ID_STN, numSTN-1) {
pnm.create_cell(i, "new pSTN(numCtxSTN, numGPeSTN)")
}
for i=cellID(ID_GPe,0),cellID(ID_GPe, numGPe-1) {
pnm.create_cell(i, "new pGPe(numStrGPe, numSTNGPe, numGPeGPe)")
}
for i=cellID(ID_GPi,0),cellID(ID_GPi, numGPi-1) {
pnm.create_cell(i, "new pGPi(numStrGPi, numSTNGPi, numGPeGPi)")
}
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
func readParms() {local i localobj f
//Setup global parameters from values stored in parameter file, name passed as $s1
f = new File()
f.ropen($s1)
// Counts
sav1 = numSTN
sav2 = numGPe
sav3 = numGPi
numSTN = f.scanvar()
numGPe = f.scanvar()
numGPi = f.scanvar()
ncell = numSTN + numGPe + numGPi
numSTNGPe = f.scanvar() // each GPe contacted by numSTNGPe presyn STN cells, etc...
numGPeGPe = f.scanvar()
numGPeSTN = f.scanvar()
numGPeGPi = f.scanvar()
numSTNGPi = f.scanvar()
numCtxSTN = f.scanvar()
numStrGPe = f.scanvar()
numStrGPi = f.scanvar()
numGPiTha = f.scanvar()
divSTNGPe = f.scanvar() // each STN contacts divSTNGPe postsyn GPe cells, etc...
divGPeGPe = f.scanvar()
divGPeSTN = f.scanvar()
divGPeGPi = f.scanvar()
divSTNGPi = f.scanvar()
divGPiTha = f.scanvar()
//-----------------------------------------------------------------------------------------------------
// bias currents
iBiasSTN = f.scanvar()
iBiasGPe = f.scanvar()
iBiasGPi = f.scanvar()
//-----------------------------------------------------------------------------------------------------
// cell to cell connection parameters
gmaxSTNGPe = f.scanvar()
gmaxGPeGPe = f.scanvar()
gmaxGPeSTN = f.scanvar()
gmaxGPeGPi = f.scanvar()
gmaxSTNGPi = f.scanvar()
gmaxGPiTha = f.scanvar()
gDA_STNGPe = f.scanvar()
gDA_GPeGPe = f.scanvar()
gDA_GPeSTN = f.scanvar()
gDA_GPeGPi = f.scanvar()
gDA_STNGPi = f.scanvar()
gDA_GPiTha = f.scanvar()
// THESE NEED TO BE SELECTED BASED ON EXPERIMENTAL/ANATOMICAL DATA ***********************************
delSTNGPe = f.scanvar()
delGPeGPe = f.scanvar()
delGPeSTN = f.scanvar()
delGPeGPi = f.scanvar()
delSTNGPi = f.scanvar()
delGPiTha = f.scanvar()
//-----------------------------------------------------------------------------------------------------
// higher level input connection parameters
imnCtxSTN = f.scanvar()
isdCtxSTN = f.scanvar()
bmnCtxSTN = f.scanvar()
bsdCtxSTN = f.scanvar()
bdmnCtxSTN = f.scanvar()
bdsdCtxSTN = f.scanvar()
imnStrGPe = f.scanvar()
isdStrGPe = f.scanvar()
bmnStrGPe = f.scanvar()
bsdStrGPe = f.scanvar()
bdmnStrGPe = f.scanvar()
bdsdStrGPe = f.scanvar()
imnStrGPi = f.scanvar()
isdStrGPi = f.scanvar()
bmnStrGPi = f.scanvar()
bsdStrGPi = f.scanvar()
bdmnStrGPi = f.scanvar()
bdsdStrGPi = f.scanvar()
probCtxSTN.resize(numCtxSTN)
for i=0,6 {
probCtxSTN.x(i) = f.scanvar()
}
probStrGPe.resize(numStrGPe)
for i=0,6 {
probStrGPe.x(i) = f.scanvar()
}
probStrGPi.resize(numStrGPi)
for i=0,6 {
probStrGPi.x(i) = f.scanvar()
}
gmaxCtxSTN = f.scanvar()
gmaxStrGPe = f.scanvar()
gmaxStrGPi = f.scanvar()
gDA_CtxSTN = f.scanvar()
gDA_StrGPe = f.scanvar()
gDA_StrGPi = f.scanvar()
delCtxSTN = f.scanvar()
delStrGPe = f.scanvar()
delStrGPi = f.scanvar()
//-----------------------------------------------------------------------------------------------------
// DBS parameters
dbs_del = f.scanvar()
dbs_dur = f.scanvar()
dbs_direct_amp = f.scanvar()
dbs_direct_pw = f.scanvar()
dbs_ad_amp = f.scanvar()
dbs_ad_pw = f.scanvar()
dbs_period = f.scanvar()
dbs_odSTNGPe_weight = gmaxSTNGPe
dbs_odSTNGPi_weight = gmaxSTNGPi
dbs_odGPeSTN_weight = gmaxGPeSTN
dbs_odGPiTha_weight = 1
dbs_odSTNGPe_delay = delSTNGPe/2
dbs_odSTNGPi_delay = delSTNGPi/2
dbs_odGPeSTN_delay = delGPeSTN/2
dbs_odGPiTha_delay = delGPiTha/2
f.close()
if (numSTN != sav1 || numGPe != sav2 || numGPi != sav3) {
return 1 //number of cells (and cellIds) have changed
} else {
return 0
}
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
proc writeParms() {local i localobj f
//Save current global parameter values in parameter file, name passed as $s1
f = new File()
f.wopen($s1)
// Counts
f.printf("%f\n", numSTN)
f.printf("%f\n", numGPe)
f.printf("%f\n", numGPi)
f.printf("%f\n", numSTNGPe) // each GPe contacted by numSTNGPe presyn STN cells, etc...
f.printf("%f\n", numGPeGPe)
f.printf("%f\n", numGPeSTN)
f.printf("%f\n", numGPeGPi)
f.printf("%f\n", numSTNGPi)
f.printf("%f\n", numCtxSTN)
f.printf("%f\n", numStrGPe)
f.printf("%f\n", numStrGPi)
f.printf("%f\n", numGPiTha)
f.printf("%f\n", divSTNGPe) // each STN contacts divSTNGPe postsyn GPe cells, etc...
f.printf("%f\n", divGPeGPe)
f.printf("%f\n", divGPeSTN)
f.printf("%f\n", divGPeGPi)
f.printf("%f\n", divSTNGPi)
f.printf("%f\n", divGPiTha)
//-----------------------------------------------------------------------------------------------------
// bias currents
f.printf("%f\n", iBiasSTN)
f.printf("%f\n", iBiasGPe)
f.printf("%f\n", iBiasGPi)
//-----------------------------------------------------------------------------------------------------
// cell to cell connection parameters
f.printf("%f\n", gmaxSTNGPe)
f.printf("%f\n", gmaxGPeGPe)
f.printf("%f\n", gmaxGPeSTN)
f.printf("%f\n", gmaxGPeGPi)
f.printf("%f\n", gmaxSTNGPi)
f.printf("%f\n", gmaxGPiTha)
f.printf("%f\n", gDA_STNGPe)
f.printf("%f\n", gDA_GPeGPe)
f.printf("%f\n", gDA_GPeSTN)
f.printf("%f\n", gDA_GPeGPi)
f.printf("%f\n", gDA_STNGPi)
f.printf("%f\n", gDA_GPiTha)
// THESE NEED TO BE SELECTED BASED ON EXPERIMENTAL/ANATOMICAL DATA ***********************************
f.printf("%f\n", delSTNGPe)
f.printf("%f\n", delGPeGPe)
f.printf("%f\n", delGPeSTN)
f.printf("%f\n", delGPeGPi)
f.printf("%f\n", delSTNGPi)
f.printf("%f\n", delGPiTha)
//-----------------------------------------------------------------------------------------------------
// higher level input connection parameters
f.printf("%f\n", imnCtxSTN)
f.printf("%f\n", isdCtxSTN)
f.printf("%f\n", bmnCtxSTN)
f.printf("%f\n", bsdCtxSTN)
f.printf("%f\n", bdmnCtxSTN)
f.printf("%f\n", bdsdCtxSTN)
f.printf("%f\n", imnStrGPe)
f.printf("%f\n", isdStrGPe)
f.printf("%f\n", bmnStrGPe)
f.printf("%f\n", bsdStrGPe)
f.printf("%f\n", bdmnStrGPe)
f.printf("%f\n", bdsdStrGPe)
f.printf("%f\n", imnStrGPi)
f.printf("%f\n", isdStrGPi)
f.printf("%f\n", bmnStrGPi)
f.printf("%f\n", bsdStrGPi)
f.printf("%f\n", bdmnStrGPi)
f.printf("%f\n", bdsdStrGPi)
for i=0,6 {
f.printf("%f\n", probCtxSTN.x(i))
}
for i=0,6 {
f.printf("%f\n", probStrGPe.x(i))
}
for i=0,6 {
f.printf("%f\n", probStrGPi.x(i))
}
f.printf("%f\n", gmaxCtxSTN)
f.printf("%f\n", gmaxStrGPe)
f.printf("%f\n", gmaxStrGPi)
f.printf("%f\n", gDA_CtxSTN)
f.printf("%f\n", gDA_StrGPe)
f.printf("%f\n", gDA_StrGPi)
// THESE NEED TO BE SELECTED BASED ON EXPERIMENTAL/ANATOMICAL DATA ***********************************
f.printf("%f\n", delCtxSTN)
f.printf("%f\n", delStrGPe)
f.printf("%f\n", delStrGPi)
//-----------------------------------------------------------------------------------------------------
// DBS parameters
f.printf("%f\n", dbs_del)
f.printf("%f\n", dbs_dur)
f.printf("%f\n", dbs_direct_amp)
f.printf("%f\n", dbs_direct_pw)
f.printf("%f\n", dbs_ad_amp)
f.printf("%f\n", dbs_ad_pw)
f.printf("%f\n", dbs_period)
f.close()
}