//genesis
//addchans.g
/*************************** MS Model, Version 7.6 *********************
**************************** addchans.g *********************
Avrama Blackwell kblackw1@gmu.edu
Rebekah Evans rcolema2@gmu.edu
Tom Sheehan tsheeha2@gmu.edu
******************************************************************************
*****************************************************************************/
function connectSKchannel(compPath, caBufferName)
str compPath
str caBufferName
if({isa difshell {compPath}/{caBufferName}})
addmsg {compPath}/{caBufferName} {compPath}/SK_channel CONCEN C
elif({isa Ca_concen {compPath}/{caBufferName}})
addmsg {compPath}/{caBufferName} {compPath}/SK_channel CONCEN Ca
end
end
function connectBKchannel(compPath, caBufferName)
str compPath
str caBufferName
if({isa difshell {compPath}/{caBufferName}})
addmsg {compPath}/{caBufferName} {compPath}/BK_channel CONCEN1 C
elif({isa Ca_concen {compPath}/{caBufferName}})
addmsg {compPath}/{caBufferName} {compPath}/BK_channel CONCEN1 Ca
end
end
include MScell/connectCaChannels.g
//************************ Begin function add_CaShells ************************
//***************** simple calcium pool following Sabatini's work *************
function add_CaShells(buffername, a, b, cellpath)
//************************ Begin Local Variables ***************************
str buffername,compt, cellpath
float len,dia,a,b,position,Ca_tau,Ca_base,kb
float shell_thick = 0.1e-6 // meter
float PI = 3.14159
float Ca_base = 50e-6 // mM
//************************ End Local Variables *****************************
//************************* Begin Warnings *********************************
if (!{exists {cellpath}})
echo the cell path {cellpath} does not exist! Please check it (add_CaShells)
return
end
if (a > b)
echo You set a WRONG boundary of a and b (add_CaShell)
return
end
//************************* End Warnings **********************************
//********************* Begin foreach statement ****************************
foreach compt ({el {cellpath}/##[TYPE=compartment]})
//************** Begin external if statement*****************************
if (!{{compt} == {{cellpath}@"/axIS"} || {compt} == {{cellpath}@"/ax"}})
dia = {getfield {compt} dia}
position = {getfield {compt} position}
len = {getfield {compt} len}
if ({{getpath {compt} -tail} == "soma"})
len = dia
end
//************** Begin internal if statement**************************
//if the compartment is not a spine and its position is between [a,b]
if ({position >= a} && {position < b} )
// Sabatini's model. Sabatini, 2001,2004
create Ca_concen {compt}/{buffername} // create Ca_pool here!
if({dia} < 0.75e-6) // this is tertiary dendrites
kb = 96
elif (dia < 1.2e-6) // secondary dendrites
kb = 96
elif (dia < 2.3e-6) // primary dendrites
kb = 96
else // soma
kb = 200 // the setting for soma is imaginary
end
if({dia} < 15e-6)
Ca_tau = 25e-3
else
Ca_tau = 100e-3 // an imaginary setting to fit the model
end
// set Ca_tau according to diameters of dendrites
float shell_dia = dia - shell_thick*2
float shell_vol= {PI}*(dia*dia/4-shell_dia*shell_dia/4)*len
setfield {compt}/{buffername} \
B {1.0/(2.0*96494*shell_vol*(1+kb))} \
tau {Ca_tau} \
Ca_base {Ca_base} \
thick {shell_thick}
end
//************** End internal if statement****************************
end
//************** End external if statement*******************************
end
//********************* End foreach statement ******************************
end
//************************ End function add_CaShells **************************
//*****************************************************************************
//********************* Begin function add_uniform_channel ********************
//*****************************************************************************
function add_uniform_channel(obj, a, b,Gchan,cellpath )
//************************ Begin Local Variables ***************************
str obj, compt, path, strhead,strhead3
float dia,len,surf,shell_vol,shell_thick, a,b,position,Gchan,PI,shell_dia,kb
int chantype = -1 // initialized as -1
float Ca_base = 5.0e-5 // mM
float Ca_tau // second
float PI = 3.14159
//************************ End Local Variables *****************************
//************************* Begin Warnings *********************************
if (!{exists /library/{obj}} )
echo the object {obj} has not been made (C)
return
end
if (!{exists {cellpath}})
echo the cell path {cellpath} does not exist! Please check it (add_uniform_channel)
return
end
if (a>b)
echo You set a WRONG boundary of a and b (E)
return
end
//************************* End Warnings **********************************
// now we first determine which type the current object channel belongs to.
// we devide all channels into 4 categories:
//category 1 : voltage-dependent all Na and K channels
// ....... 2 : calcium-dependent SK channel
// ....... 3 : both volt- and calcium-dependent BK channel
// ....... 4 : Calcium channels
strhead = {substring {obj} 0 0}
// we need the first letter of the name of the object
strhead3 = {substring {obj} 2 2}
// we need the third letter of the name of the object
if ({strhead} == "N" || {strhead} == "K" || {strhead} == "I")
chantype = 1 // all Na+, Kv+, and h channels
elif ({strhead} == "S")
chantype = 2 // SK channel
elif ({strhead} == "B")
chantype = 3 // BK
elif ({strhead} == "C")
chantype = 4 // all Ca2+ channels
end
//********************* Begin foreach statement ****************************
foreach compt ({el {cellpath}/##[TYPE=compartment]})
//************** Begin external if statement*****************************
if (!{{compt} == {{cellpath}@"/axIS"} || {compt} == {{cellpath}@"/ax"}})
dia = {getfield {compt} dia}
position = {getfield {compt} position}
//********* calculate surface area from diameter (above) and length *************
if ({({dia} > 0.11e-6) && {position >= a} && {position <= b} })
//if the compartment is not a spine ,and position between [a,b]
len = {getfield {compt} len}
if ({{getpath {compt} -tail} == "soma"})
len = dia
end
surf = dia*{PI}*len
/* add channels & make channels communicated w/parent dendrites */
copy /library/{obj} {compt}
addmsg {compt} {compt}/{obj} VOLTAGE Vm
if ({chantype} == 1)
addmsg {compt}/{obj} {compt} CHANNEL Gk Ek
elif ({chantype} == 2)
addmsg {compt}/{obj} {compt} CHANNEL Gk Ek
connectSKchannel {compt} {CA_BUFF_2}
elif ({chantype}==3)
addmsg {compt}/{obj} {compt} CHANNEL Gk Ek
connectBKchannel {compt} {CA_BUFF_2}
elif ({chantype}==4)
if ({strhead3}=="L"||{strhead3}=="T")
addCaChannel {obj} {compt} {Gchan} {CA_BUFF_1}
else
addCaChannel {obj} {compt} {Gchan} {CA_BUFF_2}
end
if ({exists {compt}/{CA_BUFF_2}})
coupleCaBufferCaChannel1 {CA_BUFF_3} {compt} {obj}
end
end
if ({isa tabchannel /library/{obj}} || {isa tab2Dchannel /library/{obj}})
setfield {compt}/{obj} Gbar {Gchan*surf}
elif ({isa vdep_channel /library/{obj} })
setfield {compt}/{obj} gbar {Gchan*surf}
end
end
//*************** End internal if statement***************************
end
//****************** End external if statement***************************
end
//********************* End foreach statement ******************************
end
//************************ End function add_uniform_channel *******************
//*****************************************************************************