//genesis /*************************** MS Model, Version 12 ********************* **************************** MScellshort.g ********************* Avrama Blackwell kblackw1@gmu.edu Rebekah Evans rcolema2@gmu.edu Sriram dsriraman@gmail.com ******************************************************************************/ if ({exists {getglobal ELEAK}}) // if a global in globals.g exists, globals.g has already been included so do not include; otherwise, include globals.g include MScell/globals // Defines & initializes cell specific parameters echo "include MScell/globals" end if ({exists {getglobal calciumdye}}) include MScell/Ca_constants.g echo "include MScell/Ca_constants" end include MScell/proto // provides access to make_prototypes (and individual channels) include MScell/addchans // provides access to add_uniform_channel & add_CaShells include MScell/CaDifshell.g //************************ Begin function set_position ********************* //************************************************************************** function set_position (cellpath) //********************* Begin Local Variables ************************ str compt, cellpath float dist2soma,x,y,z //********************* End Local Variables ***************************** if (!{exists {cellpath}}) echo The current input {cellpath} does not exist (set_position) return end foreach compt ({el {cellpath}/##[TYPE={compartment}]}) x={getfield {compt} x} y={getfield {compt} y} z={getfield {compt} z} dist2soma={sqrt {({pow {x} 2 }) + ({pow {y} 2}) + ({pow {z} 2})} } setfield {compt} position {dist2soma} end end //************************ End function set_position *********************** //************************************************************************** //************************ Begin function add_channels ********************* //************************************************************************** function sigmoida(x,x0,k,gbar) float x, x0, k return {gbar/(1+{exp {-(x-x0)/k}})} end function compensate_implicit_spines(cellpath,parentlevel,a,b,density) /* Function to account for resistance/capacitance of implicit spines based on a set realistic density. Should be called when building model before adding explicit spines. Then when spines are explicitly added, the function to compensate for explicit spine should be called*/ str cellpath, parentlevel float a, b, density str compt, parent foreach compt ({el {cellpath}/#[TYPE={compartment}]}) if (!{{compt}=={{cellpath}@"/axIS"} || {compt}=={{cellpath}@"/ax"}}) if ({strcmp {parentlevel} soma}==0) parent = {cellpath}@"/soma" elif ({strcmp {parentlevel} primdend1}==0) parent = {getfield {compt} parentprim} elif ({strcmp {parentlevel} secdend11}==0) parent = {getfield {compt} parentsec} end //echo parent {parent} parentlevel {parentlevel} if ({{parent}=={{cellpath}@"/"@{parentlevel}}}) float dia={getfield {compt} dia} float position={getfield {compt} position} float parentPathlen={getfield {compt} pathlen} float len={getfield {compt} len} float surfaceArea = PI*dia*len float singleSpineSurf = {{{dia_head}*{len_head}*{PI}} + {{dia_neck}*{len_neck}*{PI}}} float Cm_old = {getfield {compt} Cm} float Rm_old = {getfield {compt} Rm} if ({position>={a}} && {position<{b}} ) //it's a compartment that would have spines int numspines = {{density} * {len} * 1e6} //echo numspines= {numspines} float totalSpineSurf = singleSpineSurf*numspines setfield {compt} \ Cm {{Cm_old}*{{{surfaceArea}+{totalSpineSurf}}/{surfaceArea}}} \ Rm {{Rm_old}/{{{surfaceArea}+{totalSpineSurf}}/{surfaceArea}}} //echo compensating {compt} end end end end end function add_sigmoid_channel(chan_name,gbar,x0,k,cellpath,type) str cellpath, chan_name,type float gbar,x0,k float primdend = 14.e-6, otherdend = 18.e-6 int i add_uniform_channel {chan_name} 0 {somaLen} 0 {cellpath} {type} add_uniform_channel {chan_name} {somaLen} {somaLen+primdend} 0 {cellpath} {type} float pom_len = {somaLen+primdend} for (i = 4; i <= 16;i = i+1) add_uniform_channel {chan_name} {pom_len} {pom_len+otherdend} {sigmoida {pom_len} {x0} {k} {gbar}} {cellpath} {type} pom_len = {pom_len} + {otherdend} end end function add_channels (cellpath, DA) str cellpath, DA /* add_uniform_channel (from addchans.g) channel_Name a b density channeltype - VC for calcium permeable, KC for calcium dep*/ // Naf in the soma add_uniform_channel "NaF_channel" 0 {somaLen} {getglobal gNaFsoma_{DA}} {cellpath} "V" // Naf in the dendrites add_uniform_channel "NaF_channel" {somaLen} {{mid}+18e-6} {getglobal gNaFprox_{DA}} {cellpath} "V" add_uniform_channel "NaF_channel" {{mid}+18e-6} {dist} {getglobal gNaFdist_{DA}} {cellpath} "V" // potassium channels add_uniform_channel "KAf_channel" 0 {somaLen} {getglobal gKAfsoma_{DA}} {cellpath} "V" add_uniform_channel "KAf_channel" {somaLen} {mid} {getglobal gKAfprox_{DA}} {cellpath} "V" add_uniform_channel "KAf_channel" {mid} {dist} {getglobal gKAfdist_{DA}} {cellpath} "V" add_uniform_channel "KAs_channel" 0 {somaLen} {getglobal gKAssoma_{DA}} {cellpath} "V" add_uniform_channel "KAs_channel" {somaLen} {dist} {getglobal gKAsdend_{DA}} {cellpath} "V" //note that these two channels don't have distance dependent conductances add_uniform_channel "KIR_channel" 0 {somaLen} {getglobal gKIRsoma_{DA}} {cellpath} "V" add_uniform_channel "KIR_channel" {somaLen} {dist} {getglobal gKIRdend_{DA}} {cellpath} "V" add_uniform_channel "Krp_channel" 0 {somaLen} {gKrpsoma} {cellpath} "V" add_uniform_channel "Krp_channel" {somaLen} {dist} {gKrpdend} {cellpath} "V" echo "add VGCC" add_uniform_channel "CaR_channel" 0 {somaLen} {gCaRsoma} {cellpath} "VC" add_uniform_channel "CaR_channel" {somaLen} {dist} {gCaRdend} {cellpath} "VC" add_uniform_channel "CaN_channel" 0 {somaLen} {gCaNsoma} {cellpath} "VC" add_uniform_channel "CaL12_channel" 0 {somaLen} {getglobal gCaL12soma_{DA}} {cellpath} "VC" add_uniform_channel "CaL12_channel" {somaLen} {dist} {getglobal gCaL12dend_{DA}} {cellpath} "VC" add_uniform_channel "CaL13_channel" 0 {somaLen} {getglobal gCaL13soma_{DA}} {cellpath} "VC" add_uniform_channel "CaL13_channel" {somaLen} {mid} {getglobal gCaL13dend_{DA}} {cellpath} "VC" add_uniform_channel "CaL13_channel" {mid} {dist} {getglobal gCaL13dend_{DA}} {cellpath} "VC" add_uniform_channel "CaT32_channel" {somaLen} {mid} {gCaT32prox} {cellpath} "VC" add_uniform_channel "CaT32_channel" {mid} {dist} {gCaT32dist} {cellpath} "VC" add_uniform_channel "CaT33_channel" {somaLen} {mid} {gCaT33prox} {cellpath} "VC" add_uniform_channel "CaT33_channel" {mid} {dist} {gCaT33dist} {cellpath} "VC" echo "add KCa" add_uniform_channel "BK_channel" 0 {somaLen} {gBKsoma} {cellpath} "KC" add_uniform_channel "BK_channel" {somaLen} {dist} {gBKdend} {cellpath} "KC" add_uniform_channel "SK_channel" 0 {somaLen} {gSKsoma} {cellpath} "KC" add_uniform_channel "SK_channel" {somaLen} {dist} {gSKdend} {cellpath} "KC" if ({GABAtonic}) add_sigmoid_channel "tonic_GABA" {gtonicGABAdend} {x0GABA} {kGABA} {cellpath} "V" end end //************************ End function add_channels *********************** //************************************************************************** function delete_connectcross (cellpath) // if using symcompts, cellreader creates connectcross msgs between siblings at branch points; we do not want these at the soma branchpoint in order for hsolve to work str cellpath int msgs = {getmsg {cellpath}/soma -count} int i str msgtype str msgsource for (i=0; i<msgs; i=i+1) msgtype = {getmsg {cellpath}/soma -type {i}} if ({strcmp {msgtype} CONNECTTAIL}==0) msgsource = {getmsg {cellpath}/soma -source {i}} int submsgs = {getmsg {msgsource} -count} int j = 0 while (j < submsgs) str submsgtype = {getmsg {msgsource} -type {j}} if ({strcmp {submsgtype} CONNECTCROSS}==0) deletemsg {msgsource} {j} j = j submsgs = submsgs-1 else j = j+1 end end end end end //************************ Begin Primary Routine ****************************** //***************************************************************************** //************************ Begin function make_MS_cell ********************* //************************************************************************** function make_MS_cell (cellpath,pfile, DA) str cellpath,pfile,DA echo "Cellname=" {cellpath} // function make_MS_cell is the first call from the primary file (MSsim.g). // Note that the first thing it does is to call make_protypes in proto.g. // These prototypes must be made before the call to add_channels. make_prototypes // see proto.g //readcell {pfile} {cellpath} -hsolve // see MScell.g readcell {pfile} {cellpath} delete_connectcross {cellpath} echo "Pfile: " {pfile} set_position {cellpath} // local call set_pathlen {cellpath} "/soma" compensate_implicit_spines {cellpath} {"soma"} {26.1e-6} {300e-6} {1.0} //allow either the full calcium dynamics or the old single time constant of decay if (calciumtype==0) add_caconcen_objects {CalciumName} {cellpath} //make_extra_pools 0 500e-6 {cellpath} else // to be coupled with T/L Ca2+ channels add_CaConcen {bufferLT} 0 500e-6 {cellpath} // to be coupled with N/R Ca2+ channels add_CaConcen {bufferNR} 0 500e-6 {cellpath} // to be coupled with all Ca2+ channels add_CaConcen {bufferAll} 0 500e-6 {cellpath} end echo "finished adding calcium" add_channels {cellpath} {DA} // local call end //************************ End function make_MS_cell *********************** //**************************************************************************