//spines.g for including spines in the MSN model.
//****************make the spines************************************
//for calcium and buffer diffusion messages between spine neck and dendrite.
//this is a very unclean way to do it because these variables are defined elsewhere.
str uppershellname = {CalciumName} @ 1
str midshellname = {CalciumName} @ 2
str bottomshellname = {CalciumName} @ 3
str outermostShellName = {CalciumName} @ 1
function make_spines
float surf_neck, vol_neck, len_neck, dia_neck,dia_head,len_head,dia_head, surf_head,vol_head, shell_thick, dia_shell, shell_head, Ca_tau, kB, kE,r,Ca_base
// parameters:
// for spine neck:
len_neck=1e-6 //0.16-2.13
dia_neck=0.1e-6 //(0.038-0.46)e-6
// for spine head:
dia_head=0.5e-6 //adopt common size, no exact data are available now
len_head=0.5e-6
surf_head=dia_head*len_head*{PI}
surf_neck=len_neck*dia_neck*{PI}
// for calcium constants using concen objects:
if ({shellMode}==1)
kE =86.0 // Cater and Sabatini, 2004
Ca_tau = 25.0e-3
r= (1+kE)/Ca_tau
Ca_base = 50e-6 // baseline: 50 nM
end
// vol_neck={len_neck*dia_neck*dia_neck*PI/4.0}
if (!{exists spine})
create compartment spine
end
addfield spine position
setfield spine \
Cm {{CM}*surf_neck} \
Ra { 4.0*len_neck*{RA}/(dia_neck*dia_neck*{PI})} \
Em {ELEAK} \
initVm {EREST_ACT} \
Rm {{RM}/surf_neck} \
inject 0.0 \
dia {dia_neck} \
len {len_neck} \
position 0.0
create compartment spine/head
addfield spine/head position
setfield spine/head \
Cm {{CM}*surf_head} \
Ra { 4.0*{RA}*len_head/(dia_head*dia_head*{PI})} \
Em {ELEAK} \
initVm {EREST_ACT} \
Rm {{RM}/surf_head} \
inject 0.0 \
dia {dia_head} \
len {len_head} \
position 0.0
/*combine neck-head of CA1 CA1_spine */
addmsg spine/head spine RAXIAL Ra Vm
addmsg spine spine/head AXIAL Vm
// make calcium buffers
if ({shellMode}==0)
//must be in this order, head made first then neck.
add_difshell_spine {CalciumName} "head" {dia_neck} {len_neck} //function in CaDifshellSpine.g
add_difshell_spine {CalciumName} "neck" {dia_head} {len_head}
elif ({shellMode}==1) // Sabatini's model. Sabatini, 2001,2004
str buffer1 = "spineCa" // calcium pool for the other calcium channels
str buffer2 = "spineCaL" // calcium pool for L-type Ca2+ channels
str buffer3 = "buffer_NMDA" // only to record NMDA-dependent [Ca]
create Ca_concen spine/head/{buffer1} // to create simplified Ca_pool here!
if ({CaDyeFlag}==2)
kB = 220 // Fluo-4, taken from Yasuda,et,al. 2004,STEK
Ca_tau = (1+kE+kB)/r // re-calculate time constant because of application of the new calcium-dye
elif({CaDyeFlag}==3)
kB = 70 // Fluo-5F
Ca_tau = (1+kE+kB)/r
end
float shell_dia= dia_head - shell_thick*2
float shell_vol= {PI}*(dia_head*dia_head/4-shell_dia*shell_dia/4)*len_head
setfield spine/head/{buffer1} \
B {1.0/(2.0*96494*shell_vol*(1+kE+kB))} \
tau {Ca_tau} \
Ca_base {Ca_base} \
thick {shell_thick}
copy spine/head/{buffer1} spine/head/{buffer2}
copy spine/head/{buffer1} spine/head/{buffer3}
setfield spine/head/{buffer2} Ca_base 50e-6
end
create neutral spine/presyn_ext
create neutral spine/presyn_inh
pushe spine/head
/**************************************************************************************
******************to add NMDA/AMPA channels*******************************************
**************************************************************************************/
addSynChannel . {AMPAname} {AMPAgmax}
addNMDAchannel . {NMDAname} {uppershellname} {NMDAgmax} 0
setfield ../presyn_ext z 0
addmsg ../presyn_ext ./{NMDAname} ACTIVATION z
addmsg ../presyn_ext ./{AMPAname} ACTIVATION z
/**********************************end**********************************************
/// now to add GABA
setfield ../presyn_inh z 0
if({GABA2Spine}==1)
addGABAchannel . GABA_1 {GABAcond} // added to spine head
addmsg ../presyn_inh ./GABA_1 ACTIVATION z
addGABAchannel . GABA_2 {GABAcond} // added to spine head
addmsg ../presyn_inh ./GABA_2 ACTIVATION z
elif({GABA2Spine}==2)
addGABAchannel .. GABA_1 {GABAcond} // added to spine neck
addmsg ../presyn_inh ../GABA_1 ACTIVATION z
addGABAchannel .. GABA_2 {GABAcond} // added to spine neck
addmsg ../presyn_inh ../GABA_2 ACTIVATION z
end
*/
if({addCa2Spine}==1)
/*************************************************************************************
****************** to add Calcium Channels********************************************
******************* L-type, R-type, and T-type
**************************************************************************************/
// addCaChannel {obj} {compt} {Gchan} {CalciumBuffer}
/** old numbers, now use those in globals directly.
float Pbar_CaL12, Pbar_CaL13, Pbar_CaR, Pbar_CaT
Pbar_CaL12 = 3.35e-7
Pbar_CaL13 = 4.25e-7
Pbar_CaR = 13e-7
Pbar_CaT = 0.235e-7
**/
if ({shellMode}==0)
addCaChannelspines CaL12_channel . {gCaL12} {midshellname} // HVA CaL
addCaChannelspines CaL13_channel . {gCaL13} {uppershellname} // LVA CaL
addCaChannelspines CaR_channel . {gCaR} {midshellname}
addCaChannelspines CaT_channel . {gCaT} {midshellname}
elif ({shellmode}==1)
addCaChannelspines CaL12_channel . {gCaL12} {buffer2} // HVA CaL
addCaChannelspines CaL13_channel . {gCaL13} {buffer2} // LVA CaL
addCaChannelspines CaR_channel . {gCaR} {buffer1}
addCaChannelspines CaT_channel . {gCaT} {buffer1}
end
pope
end
end
//******************done making spines*********************************
//*****************begin function to add spines*********************************
function add_spines_evenly(cellpath,spine,a,b,density)
/* "spine" : spine prototype
** "density" : 1/um, spine density; The number of spines in one compartment = density * compartment length.
*/
str cellpath,compt,spine,thespine,path
int number,i
float dia,len,surf_head,k,dia_dend,len_dend,surf_dend,a,b,density,position
if(!{exists /library/{spine}})
echo The spine protomodel has not been made!
return
end
foreach compt ({el {cellpath}/##[TYPE=compartment]})
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
//if the compartment is not a spine ,
// and its position is between [a,b]
if ({position>=a} && {position<b} )
number = density * len * 1e6
// make sure that one compartment has at least one spine
if (number == 0)
number = number + 1
end
for(i=1;i<=number;i=i+1)
thespine = "spine"@"_"@{i}
copy /library/{spine} {compt}/{thespine}
addmsg {compt}/{thespine} {compt} RAXIAL Ra Vm
addmsg {compt} {compt}/{thespine} AXIAL Vm
if ({shellMode}==0)
//send calcium diffusion message from bottom shell of spine neck to outer shell of compartment
addmsg {compt}/{thespine}/{bottomshellname} {compt}/{outermostShellName} DIFF_DOWN prev_C thick
addmsg {compt}/{outermostShellName} {compt}/{thespine}/{bottomshellname} DIFF_UP prev_C thick
//send buffer diffusion messages from bottom shell of spine neck to outer shell of compartement
addmsg {compt}/{thespine}/{bottomshellname}{bname2} {compt}/{outermostShellName}{bname2} DIFF_DOWN prev_free thick
addmsg {compt}/{outermostShellName}{bname2} {compt}/{thespine}/{bottomshellname}{bname2} DIFF_UP prev_free thick
addmsg {compt}/{thespine}/{bottomshellname}{bname3} {compt}/{outermostShellName}{bname3} DIFF_DOWN prev_free thick
addmsg {compt}/{outermostShellName}{bname3} {compt}/{thespine}/{bottomshellname}{bname3} DIFF_UP prev_free thick
end
end
end // end of if position...
end // end of if ... axIS
end // end of "foreach" loop
end