//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 symcompartment 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 symcompartment 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 Ra 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 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 if ({calciumdye} == 4) addmsg spine/{spcomp1}/{CalciumName}{headSlabs}{egtaname} spine/{CalciumName}1{egtaname} DIFF_DOWN prev_free thick addmsg spine/{CalciumName}1{egtaname} spine/{spcomp1}/{CalciumName}{headSlabs}{egtaname} DIFF_UP prev_free thick end 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} 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 CaT_channel . {gCaTspine} {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 ({gCaTspine} > {SMALLNUMBER}) addCaChannelspines CaT_channel . {gCaTspine} {bufferLT} addmsg CaT_channelGHK {bufferAll} I_Ca Ik end end pope end return {neckSlabs} end //******************done making spines********************************* //*****************begin function to add spines********************************* function add_spines_evenly(cellpath,spineproto,a,b,density,bottomslab) /* "spineproto" : spine prototype ** "density" : 1/um, spine density; The number of spines in one compartment = density * compartment length. */ 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 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} ) str parentsec={getfield {compt} parentsec} if ({parentsec}=={"/cell/secdend11"}) 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 Ra 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 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 if ({calciumdye} == 4) addmsg {compt}/{spine}/{bottomslabName}{egtaname} {compt}/{upperShell}{egtaname} DIFF_DOWN prev_free thick addmsg {compt}/{upperShell}{egtaname} {compt}/{spine}/{bottomslabName}{egtaname} DIFF_UP prev_free thick end 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 return totalspines end