//genesis
/*************************** MS Model, Version 9.1 *********************
**************************** CaDifshell.g *********************
Avrama Blackwell kblackw1@gmu.edu
Wonryull Koh wkoh1@gmu.edu
Rebekah Evans rcolema2@gmu.edu
Sriram dsriraman@gmail.com
******************************************************************************
*****************************************************************************/
//***************************** Begin Local Subroutine ***********************
//old calcium concentration - single time constant of decay
function add_CaConcen (buffername, a, b, cellpath)
str buffername,cellpath
float a,b
str compt
float len,dia,position
float Ca_tau,kb
float PI = 3.14159
float shell_thick={outershell_thickness}
float Ca_base = {base}
foreach compt ({el {cellpath}/##[TYPE=compartment]})
//make sure this is the correct compartment type, and determine length and diameter
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
end
//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.81e-6) // this is tertiary dendrites
kb = 96
elif (dia < 1.5e-6) // secondary dendrites
kb = 96
elif (dia < 1.8e-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
float surf = dia*{PI}*dia
if ({dia}>= 15e-6)
echo {compt} "shell_vol=" {shell_vol} "+" {len}
echo "shell_dia="{shell_dia}
echo "dia=" {dia}
echo "surface area=" {surf}
end
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
end
//new calcium concentration - various buffers, pumps and diffusion
function create_difshell (shellName, base, compLen, r, shellThickness, mode)
str shellName
float base
float compLen
float r, shellThickness
str mode
create difshell {shellName}
setfield {shellName} \
C {base} \
Ceq {base} \
D {dca} \ //D_Ca = 2e-6 (cm^2)(s^(-1))
val 2 \
leak 0 \
shape_mode {mode} \
len {compLen} \
dia {r*2} \ //outer diameter of the shell
thick {shellThickness}
end
function add_difbuffer_to_difshell (shellName, bname, btotal, kf, kb, d, compLen, r, shellThickness, mode)
str shellName, bname
float btotal, kf, kb, d, compLen, r
str mode
create difbuffer {shellName}{bname}
setfield {shellName}{bname} \
activation {base} \
Btot {btotal} \
kBf {kf} \
kBb {kb} \
D {d} \
shape_mode {mode} \
len {compLen} \
dia {r*2} \
thick {shellThickness}
addmsg {shellName}{bname} {shellName} BUFFER kBf kBb Bfree Bbound
addmsg {shellName} {shellName}{bname} CONCEN C
end
function add_mmpump (shellName, surfaceArea, kcat, km)
str shellName
float surfaceArea, kcat, km
str pname = "MMpump"
create mmpump {shellName}{pname}
setfield {shellName}{pname} \
vmax {kcat*surfaceArea} \
val {2} \
Kd {km}
addmsg {shellName}{pname} {shellName} MMPUMP vmax Kd
addmsg {shellName} {shellName}{pname} CONCEN C
end
function make_fura (compt, totalshells, bufname, calname)
str compt
str calname
str bufname
int totalshells, i
create fura2 {compt}/fluorescence
i=1
while (i < totalshells+1)
str bnx = {calname} @ {i}
//str bn = {bnx}{bufname}
addmsg {compt}/{bnx}{bufname} {compt}/fluorescence CONCEN Bfree Bbound vol
i=i+1
end
end
function make_volavg (compt, totalshells, calname)
str compt
str calname
int totalshells, i
create wgtavg {compt}/volavg
i=1
while (i < totalshells+1)
str bnx2 = {calname} @ {i}
addmsg {compt}/{bnx2} {compt}/volavg ValueWgt C vol
i=i+1
end
end
function make_buffervolavg (compt, totalshells, calname, buffer)
str compt
str calname
str buffer
int totalshells, i
create wgtavg {compt}/{buffer}Vavg
i=1
while (i < totalshells+1)
str bnx3 = {calname} @ {i}
addmsg {compt}/{bnx3}{buffer} {compt}/{buffer}Vavg ValueWgt Bbound vol
i=i+1
end
end
function make_extra_pools (a, b, compt) //called in mscellshort.g
str compt
float a, b
str NMDApool = "NMDApool"
str LVApool = "LVApool"
str HVApool = "HVApool"
add_CaConcen {NMDApool} {a} {b} {compt}
add_CaConcen {HVApool} {a} {b} {compt}
add_CaConcen {LVApool} {a} {b} {compt}
str allpool = "allpool"
add_CaConcen {allpool} {a} {b} {compt}
//making an extra pool to add up all calcium accruing over the upstate, no decay so tau=0
//add_CaConcen {allpool} {a} {b} {compt}
//setfield {compt}/{allpool} B 0
end
//add_extra_pools is called by MScellshort.g
function add_extra_pools (compt, NMDACaGHK)
str compt
float NMDACaGHK
addmsg {compt}/CaL12_channelGHK {compt}/HVApool I_Ca Ik
addmsg {compt}/CaL13_channelGHK {compt}/LVApool I_Ca Ik
addmsg {compt}/NR2A/GHK {compt}/NMDApool fI_Ca Ik {NMDACaGHK}
addmsg {compt}/CaR_channelGHK {compt}/HVApool I_Ca Ik
addmsg {compt}/CaT_channelGHK {compt}/LVApool I_Ca Ik
addmsg {compt}/CaL12_channelGHK {compt}/allpool I_Ca Ik
addmsg {compt}/CaL13_channelGHK {compt}/allpool I_Ca Ik
addmsg {compt}/NR2A/GHK {compt}/allpool fI_Ca Ik {NMDACaGHK}
addmsg {compt}/CaR_channelGHK {compt}/allpool I_Ca Ik
addmsg {compt}/CaT_channelGHK {compt}/allpool I_Ca Ik
end
//***************************** End Local Subroutines ************************
function add_caconcen_objects (calName, CELLPATH)
str calName
str CELLPATH
str outermostShellName = {calName} @ 1
str compt
float totalshells
float thickness
//use maxshells if you want to set a low number of shells, and the thicknesses will be changed accordingly.
//If you want the thicknesses to be determined
int setshellnum = 0
//0= set thickness; max shell num determined by thickness, 1= set max shell num; thickness determined by max shell num.
//set shell number
int maxshellnum = 3
//or thickness
foreach compt ({el {CELLPATH}/##[TYPE=compartment]})
float dia={getfield {compt} dia}
float r = 0.5*{dia}
float len = {getfield {compt} len}
int numShells = 0 //initialize numShells at 0
//**********calculate how many shells are needed from the diameter and thickness
//*********when that works, can replace the next four sections of add_difbuffer ... with a single section
//If setting the initial thickness, this counts the number of shells for each compartment. the outer shell is set to
//equal thickness and then the thickness progressively doubles for each inner shell
float testsum = 0
if (setshellnum == 0)
thickness = {outershell_thickness}
if ({{{r} >= {thickness}} && {r <= {1.1*thickness}}})
numShells = 0
else
while ({r} >= {thickness*thicknessincrease})
//echo "thickness=" {thickness}
//echo "r=" {r}
//echo "numshells=" {numShells}
numShells = numShells + 1
r = r - thickness
testsum = testsum + thickness
thickness = thickness*thicknessincrease
end
//this last thickness=r is to make one last shell that is the thickness of 'whatever is leftover'
thickness=r
testsum=testsum+thickness
totalshells=numShells+1
end
//echo "r=" {r}
//echo "thickness=" {thickness}
//echo "totalshells=" {totalshells}
//echo "testsum=" {testsum}
r = 0.5*{dia} //re-initialize r and thickness to make the shells.
thickness = {outershell_thickness}
end
//If setting the max number of shells, this calculates the thickness.
//NOTE: this results in different thicknesses depending on the total size of the compartment.
if (setshellnum == 1)
thickness = {r}/{maxshellnum}
totalshells = {maxshellnum}
//echo "r=" {r}
//echo "thickness=" {thickness}
//echo "totalshells=" {totalshells}
end
//make shells and buffers using the number of shells calculated above.
int i = 1
while (i < totalshells)
float shellRadius = {r}
str shellname = {calName} @ {i}
create_difshell {compt}/{shellname} {base} {len} {shellRadius} {thickness} SHELL
add_difbuffer_to_difshell {compt}/{shellname} {bname1} {btotal1} {kf1} {kb1} {d1} {len} {shellRadius} {thickness} SHELL
add_difbuffer_to_difshell {compt}/{shellname} {bname2} {btotal2} {kf2} {kb2} {d2} {len} {shellRadius} {thickness} SHELL
add_difbuffer_to_difshell {compt}/{shellname} {bname4} {btotal4} {kf4} {kb4} {d4} {len} {shellRadius} {thickness} SHELL
if (calciumdye == 1)
add_difbuffer_to_difshell {compt}/{shellname} {bname3} {btotal3} {kf3} {kb3} {d3} {len} {shellRadius} {thickness} SHELL
elif (calciumdye == 2)
add_difbuffer_to_difshell {compt}/{shellname} {bname5} {btotal5} {kf5} {kb5} {d5} {len} {shellRadius} {thickness} SHELL
end
i = {i} + 1
//echo "r=" {shellRadius}
//echo "thickness=" {thickness}
//echo "shellname=" {shellname}
r = r-thickness
if (setshellnum == 0)
thickness=thickness*thicknessincrease
end
end
//make final shell with the 'remaining' radius
shellRadius={r}
thickness={shellRadius}
str shellname = {calName} @ {i}
//echo "r=" {shellRadius}
//echo "thickness=" {thickness}
//echo "shellname=" {shellname}
create_difshell {compt}/{shellname} {base} {len} {shellRadius} {thickness} SHELL
add_difbuffer_to_difshell {compt}/{shellname} {bname1} {btotal1} {kf1} {kb1} {d1} {len} {shellRadius} {thickness} SHELL
add_difbuffer_to_difshell {compt}/{shellname} {bname2} {btotal2} {kf2} {kb2} {d2} {len} {shellRadius} {thickness} SHELL
add_difbuffer_to_difshell {compt}/{shellname} {bname4} {btotal4} {kf4} {kb4} {d4} {len} {shellRadius} {thickness} SHELL
if (calciumdye == 1)
add_difbuffer_to_difshell {compt}/{shellname} {bname3} {btotal3} {kf3} {kb3} {d3} {len} {shellRadius} {thickness} SHELL
elif (calciumdye == 2)
add_difbuffer_to_difshell {compt}/{shellname} {bname5} {btotal5} {kf5} {kb5} {d5} {len} {shellRadius} {thickness} SHELL
end
reset
//add fura object to each compartment to calc fluorescence
if (calciumdye == 1)
make_fura {compt} {totalshells} {bname3} {calName}
end
//add wgtavg object to calculated ca concentration without dyes
make_volavg {compt} {totalshells} {calName}
//add bound Fluo5F wgtavg object
if (calciumdye == 2)
make_buffervolavg {compt} {totalshells} {calName} {bname5}
end
//diffusion between shells
i = 1
while (i < totalshells)
str sn = {calName} @ {i}
str innerSn = {calName} @ {i+1}
addmsg {compt}/{sn} {compt}/{innerSn} DIFF_DOWN prev_C thick
addmsg {compt}/{innerSn} {compt}/{sn} DIFF_UP prev_C thick
addmsg {compt}/{sn}{bname4} {compt}/{innerSn}{bname4} DIFF_DOWN prev_free thick
addmsg {compt}/{innerSn}{bname4} {compt}/{sn}{bname4} DIFF_UP prev_free thick
i = {i} + 1
end
//diffusion between difbuffers
i = 1
while (i < totalshells)
str sn = {calName} @ {i}
str innerSn = {calName} @ {i+1}
addmsg {compt}/{sn}{bname2} {compt}/{innerSn}{bname2} DIFF_DOWN prev_free thick
addmsg {compt}/{innerSn}{bname2} {compt}/{sn}{bname2} DIFF_UP prev_free thick
if (calciumdye == 1)
addmsg {compt}/{sn}{bname3} {compt}/{innerSn}{bname3} DIFF_DOWN prev_free thick
addmsg {compt}/{innerSn}{bname3} {compt}/{sn}{bname3} DIFF_UP prev_free thick
elif (calciumdye == 2)
addmsg {compt}/{sn}{bname5} {compt}/{innerSn}{bname5} DIFF_DOWN prev_free thick
addmsg {compt}/{innerSn}{bname5} {compt}/{sn}{bname5} DIFF_UP prev_free thick
end
i = {i} + 1
end
//pump @ outershell
float surfaceArea = {getfield {compt}/{outermostShellName} surf_up}
//echo "shell=" {compt}/{outermostShellName}
//showfield {compt}/{outermostShellName} *
if ({compt} == "/cell/soma")
add_mmpump {compt}/{outermostShellName} {surfaceArea} {kcatsoma} {km}
float CaBase = {getfield {compt}/{outermostShellName} Ceq}
float vmax = kcatsoma*surfaceArea
float vol = {getfield {compt}/{outermostShellName} vol}
float leak = {{vmax*CaBase}/{vol*{CaBase + km}}} // {{kcatsoma*CaBase}/{outershell_thickness*{CaBase + km}}}
setfield {compt}/{outermostShellName} leak {leak}
echo "soma="{kcatsoma}
echo "soma="{leak}
elif ({compt} != "/cell/soma")
add_mmpump {compt}/{outermostShellName} {surfaceArea} {kcatdend} {km}
float CaBase = {getfield {compt}/{outermostShellName} Ceq}
float vmax = kcatdend*surfaceArea
float vol = {getfield {compt}/{outermostShellName} vol}
float leak = {{vmax*CaBase}/{vol*{CaBase + km}}} // {{kcatdend*CaBase}/{outershell_thickness*{CaBase + km}}}
setfield {compt}/{outermostShellName} leak {leak}
end
end
end