//genesis //spines.g for including spines in the MSN model. if ({exists {getglobal len_neck}}) include MScell/spineParams.g end include MScell/AddCaSpines.g function make_spineProto float shell_thick, Ca_tau, kB, kE, r float surf_head=dia_head*len_head*{PI} float surf_neck=len_neck*dia_neck*{PI} // ############# electrical compartments if (!{exists spine}) create compartment spine end addfield spine position addfield spine pathlen // path length to soma, = position for prototype .p file addfield spine parentprim addfield spine parentsec addfield spine parenttert setfield spine \ Cm {{spineCM}*surf_neck} \ Ra /*{spineRa}*/ { 4.0*len_neck*{neckRA}/(dia_neck*dia_neck*{PI})} \ Em {ELEAK} \ initVm {EREST_ACT} \ Rm {{spineRM}/surf_neck} \ inject 0.0 \ dia {dia_neck} \ len {len_neck} \ position 0.0 create compartment spine/{spcomp1} addfield spine/{spcomp1} position addfield spine/{spcomp1} pathlen addfield spine/{spcomp1} parentprim addfield spine/{spcomp1} parentsec addfield spine/{spcomp1} parenttert setfield spine/{spcomp1} \ Cm {{spineCM}*surf_head} \ Ra {4.0*{spineRA}*len_head/(dia_head*dia_head*{PI})} \ Em {ELEAK} \ initVm {EREST_ACT} \ Rm {{spineRM}/surf_head} \ inject 0.0 \ dia {dia_head} \ len {len_head} \ position 0.0 /*combine neck-head of CA1 CA1_spine */ addmsg spine/{spcomp1} spine RAXIAL Ra Vm addmsg spine spine/{spcomp1} AXIAL Vm // ******** make calcium objects ************************** enable /library if ({spinecalcium}==0) //This function adds calcium and buffer shells, connects them, and adds pumps //The function is in AddCaSpines.g neckSlabs={add_difshell_spine {CalciumName} "neck" {dia_neck} {len_neck} {neckSlabs} {neck_thickness_inc}} headSlabs={add_difshell_spine {CalciumName} "head" {dia_head} {len_head} {headSlabs} {head_thickness_inc}} echo "new slabs, neck=" {neckSlabs} ", head=" {headSlabs} //Connect head to neck, calcium and diffusible buffers addmsg spine/{spcomp1}/{CalciumName}{headSlabs} spine/{CalciumName}1 DIFF_DOWN prev_C thick addmsg spine/{CalciumName}1 spine/{spcomp1}/{CalciumName}{headSlabs} DIFF_UP prev_C thick addmsg spine/{spcomp1}/{CalciumName}{headSlabs}{bname2} spine/{CalciumName}1{bname2} DIFF_DOWN prev_free thick addmsg spine/{CalciumName}1{bname2} spine/{spcomp1}/{CalciumName}{headSlabs}{bname2} DIFF_UP prev_free thick addmsg spine/{spcomp1}/{CalciumName}{headSlabs}{bname4} spine/{CalciumName}1{bname4} DIFF_DOWN prev_free thick addmsg spine/{CalciumName}1{bname4} spine/{spcomp1}/{CalciumName}{headSlabs}{bname4} DIFF_UP prev_free thick addmsg spine/{spcomp1}/{CalciumName}{headSlabs}{bname1} spine/{CalciumName}1{bname1} DIFF_DOWN prev_free thick addmsg spine/{CalciumName}1{bname1} spine/{spcomp1}/{CalciumName}{headSlabs}{bname1} DIFF_UP prev_free thick if ({calciumdye}>0) addmsg spine/{spcomp1}/{CalciumName}{headSlabs}{bnamefluor} spine/{CalciumName}1{bnamefluor} DIFF_DOWN prev_free thick addmsg spine/{CalciumName}1{bnamefluor} spine/{spcomp1}/{CalciumName}{headSlabs}{bnamefluor} DIFF_UP prev_free thick end bufferNMDA={upperShell} elif ({spinecalcium}==1) // Sabatini's model. Sabatini, 2001,2004 create Ca_concen spine/{spcomp1}/{bufferNMDA} // to create simplified Ca_pool here! kE =86.0 // Carter and Sabatini, 2004 Ca_tau = 25.0e-3 r= (1+kE)/Ca_tau if ({calciumdye}==3) 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({calciumdye}==2) kB = 70 // Fluo-5F Ca_tau = (1+kE+kB)/r elif ({calciumdye}==1) echo "spines.g, ca_concen: need parameter kB for fura, single tau" end float shell_vol= {PI}*(dia_head*dia_head/4.0)*len_head setfield spine/{spcomp1}/{bufferNMDA} \ B {1.0/(2.0*96494*shell_vol*(1+kE+kB))} \ tau {Ca_tau} \ Ca_base {Ca_basal} \ thick {shell_thick} end disable /library /******************Channels*************************** /**** add NMDA/AMPA channels**************************/ pushe spine/{spcomp1} if(synYesNo==1) addSynChannel . {AMPAname} {AMPAgmax} {bufferNMDA} addNMDAchannel . {NMDAname} {bufferNMDA} {NMDAgmax} {ghk_yesno} {nmdacdiyesno} end /***************** add L-type, R-type, and T-type Calcium Channels*****************/ // addCaChannel {obj} {compt} {Gchan} {CalciumBuffer} if({addCa2Spine}==1) if ({spinecalcium}==0) addCaChannelspines CaL12_channel . {gCaL12spine} {CalciumName}2 // HVA CaL addCaChannelspines CaL13_channel . {gCaL13spine} {CalciumName}1 // LVA CaL addCaChannelspines CaR_channel . {gCaRspine} {CalciumName}2 addCaChannelspines CaT32_channel . {gCaT32spine} {CalciumName}2 addCaChannelspines CaT33_channel . {gCaT33spine} {CalciumName}2 addKCaChannelspines SK_channel . {gSKspine} {CalciumName}2 elif ({spinecalcium}==1) copy {bufferNMDA} {bufferNR} copy {bufferNMDA} {bufferLT} copy {bufferNMDA} {bufferAll} addmsg {NMDAname} {bufferAll} I_Ca Ik if ({gCaL12spine} > {SMALLNUMBER}) addCaChannelspines CaL12_channel . {gCaL12spine} {bufferLT} // HVA CaL addmsg CaL12_channelGHK {bufferAll} I_Ca Ik end if ({gCaL13spine} > {SMALLNUMBER}) addCaChannelspines CaL13_channel . {gCaL13spine} {bufferLT} // LVA CaL addmsg CaL13_channelGHK {bufferAll} I_Ca Ik end if ({gCaRspine} > {SMALLNUMBER}) addCaChannelspines CaR_channel . {gCaRspine} {bufferNR} addmsg CaR_channelGHK {bufferAll} I_Ca Ik end if ({gCaT32spine} > {SMALLNUMBER}) addCaChannelspines CaT32_channel . {gCaT32spine} {bufferLT} addmsg CaT32_channelGHK {bufferAll} I_Ca Ik end if ({gCaT33spine} > {SMALLNUMBER}) addCaChannelspines CaT33_channel . {gCaT33spine} {bufferLT} addmsg CaT33_channelGHK {bufferAll} I_Ca Ik end if ({gSKspine} > {SMALLNUMBER}) addKCaChannelspines SK_channel . {gSKspine} {bufferNR} end end pope end return {neckSlabs} end //******************done making spines********************************* //*****************begin function to add spines********************************* function compensate_for_spines(cellpath,parentlevel) // This function compensates Rm and Cm for increased surface area when spines are explicitly added to the model. Compensation must be done for each spine and the parent dendritic compartment for any dendritic compartment containing spines str cellpath, parentlevel 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>={spineStart}} && {position<{spineEnd}} ) //it's a compartment that would have spines int numspines = {{spineDensity} * {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} //str subcompt //foreach subcompt ({el {compt}/##[TYPE=compartment]}) // float Cm_old = {getfield {subcompt} Cm} // float Rm_old = {getfield {subcompt} Rm} // setfield {subcompt} \ // Cm {{Cm_old}/{{{surfaceArea}+{totalSpineSurf}}/{surfaceArea}}} \ // Rm {{Rm_old}*{{{surfaceArea}+{totalSpineSurf}}/{surfaceArea}}} // echo compensating {subcompt} //end end end end end end function add_spines_evenly(cellpath,spineproto,a,b,density,bottomslab,parentlevel) /* "spineproto" : spine prototype ** "density" : 1/um, spine density; The number of spines in one compartment = density * compartment length. */ // parentlevel specifies where to add spines: soma - adds to every branch; primdend1 - adds only to branches off of primdend1, etc str cellpath,compt,spineproto,spine,bottomslab int number,i float dia,len,a,b,density,position float separation,spineloc float parentPathlen, spinepath if(!{exists /library/{spineproto}}) echo "The spine protomodel has not been made!" return end str bottomslabName={CalciumName}@{bottomslab} int totalspines=0 str parent foreach compt ({el {cellpath}/#[TYPE={compartment}]}) if (!{{compt}=={{cellpath}@"/axIS"} || {compt}=={{cellpath}@"/ax"}}) dia={getfield {compt} dia} position={getfield {compt} position} parentPathlen={getfield {compt} pathlen} len={getfield {compt} len} float xstart={getfield {compt} x0} //if the compartment is not a spine , // and its position is between [a,b] if ({position>=a} && {position<b} ) 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 if ({{parent}=={{cellpath}@"/"@{parentlevel}}}) number = density * len * 1e6 // make sure that each compartment has at least one spine if (number == 0) number = number + 1 end separation={len/number} for(i=1;i<=number;i=i+1) spine = "spine"@"_"@{i} totalspines=totalspines+1 copy /library/{spineproto} {compt}/{spine} //assign position and pathlen to the spine, this is specific to our one dimensional morphology //The 2nd term of pathlen needs to be changed if spineloc is changed for real morphology spineloc={separation/2}+{i-1}*{separation}+{xstart} spinepath=(parentPathlen-len/2)+(spineloc-xstart) setfield {compt}/{spine} position {spineloc} setfield {compt}/{spine}/{spcomp1} position {spineloc} setfield {compt}/{spine} pathlen {spinepath} setfield {compt}/{spine}/{spcomp1} pathlen {(parentPathlen-len/2)+(spineloc-xstart)} //parents of spine are same as parents of compartment setfield {compt}/{spine} parentprim {getfield {compt} parentprim} setfield {compt}/{spine}/{spcomp1} parentprim {getfield {compt} parentprim} setfield {compt}/{spine} parentsec {getfield {compt} parentsec} setfield {compt}/{spine}/{spcomp1} parentsec {getfield {compt} parentsec} setfield {compt}/{spine} parenttert {getfield {compt} parenttert} setfield {compt}/{spine}/{spcomp1} parenttert {getfield {compt} parenttert} //messages between spineneck and dendrite compartment addmsg {compt}/{spine} {compt} RAXIAL Ra Vm addmsg {compt} {compt}/{spine} AXIAL Vm if ({spinecalcium}==0) //send calcium diffusion message from bottom shell of spine neck to outer shell of compartment addmsg {compt}/{spine}/{bottomslabName} {compt}/{upperShell} DIFF_DOWN prev_C thick addmsg {compt}/{upperShell} {compt}/{spine}/{bottomslabName} DIFF_UP prev_C thick //send buffer diffusion messages from bottom shell of spine neck to outer shell of compartement addmsg {compt}/{spine}/{bottomslabName}{bname2} {compt}/{upperShell}{bname2} DIFF_DOWN prev_free thick addmsg {compt}/{upperShell}{bname2} {compt}/{spine}/{bottomslabName}{bname2} DIFF_UP prev_free thick addmsg {compt}/{spine}/{bottomslabName}{bname4} {compt}/{upperShell}{bname4} DIFF_DOWN prev_free thick addmsg {compt}/{upperShell}{bname4} {compt}/{spine}/{bottomslabName}{bname4} DIFF_UP prev_free thick addmsg {compt}/{spine}/{bottomslabName}{bname1} {compt}/{upperShell}{bname1} DIFF_DOWN prev_free thick addmsg {compt}/{upperShell}{bname1} {compt}/{spine}/{bottomslabName}{bname1} DIFF_UP prev_free thick if ({calciumdye} > 0) addmsg {compt}/{spine}/{bottomslabName}{bnamefluor} {compt}/{upperShell}{bnamefluor} DIFF_DOWN prev_free thick addmsg {compt}/{upperShell}{bnamefluor} {compt}/{spine}/{bottomslabName}{bnamefluor} DIFF_UP prev_free thick end end end //end of for i< number //// Loop to set up CONNECTCROSS MESSAGES Between child spines and child dendrites of current compartment /*int outmsgcount = {getmsg {compt} -outgoing -count} int i for (i = 0; {i} < {outmsgcount}; i = {i} + 1) str msgtype = {getmsg {compt} -outgoing -type {i}} str child = {getmsg {compt} -outgoing -destination {i}} if ({strcmp {msgtype} "CONNECTHEAD"} == 0) //If the message is CONNECTHEAD We Want to connectcross this child (spine or dend) with every other spine-only child str subcompt foreach subcompt ({el {compt}/#[TYPE={compartment}]}) //This will get list of spine compartments if (!{strcmp {subcompt} {child}}==0) //If the element we are crossconnecting is not itself addmsg {child} {subcompt} CONNECTCROSS Ra Vm //This will add messages both ways for every spine-spine and msgs from dend-to-spine but not spine-to-dend if (!{strncmp {getpath {child} -tail} "spine" 5} ==0) //child is dendrite (not spine), also add message: addmsg {subcompt} {child} //echo adding connectcross message from {child} to {subcompt} addmsg {subcompt} {child} CONNECTCROSS Ra Vm end // if child is dendrite (not spine) end //if subcompt, child not identical end //foreach subcompt (spine) end //if message is connect tail end //for i = 0:outmsgcount*/ end //end if parentprim is prim1 end // end of if position... end // end of if ... axIS end // end of "foreach" loop compensate_for_spines {cellpath} {parentlevel} return totalspines end