Striatal Spiny Projection Neuron, inhibition enhances spatial specificity (Dorman et al 2018)

 Download zip file 
Help downloading and running models
We use a computational model of a striatal spiny projection neuron to investigate dendritic spine calcium dynamics in response to spatiotemporal patterns of synaptic inputs. We show that spine calcium elevation is stimulus-specific, with supralinear calcium elevation in cooperatively stimulated spines. Intermediate calcium elevation occurs in neighboring non-stimulated dendritic spines, predicting heterosynaptic effects. Inhibitory synaptic inputs enhance the difference between peak calcium in stimulated spines, and peak calcium in non-stimulated spines, thereby enhancing stimulus specificity.
1 . Dorman DB, Jedrzejewska-Szmek J, Blackwell KT (2018) Inhibition enhances spatially-specific calcium encoding of synaptic input patterns in a biologically constrained model. Elife, Kennedy, Mary B, ed. [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Basal ganglia;
Cell Type(s): Neostriatum spiny neuron;
Channel(s): Ca pump; Kir; I A; I A, slow; I CAN; I K,Ca; I Krp; I Na,t; I L high threshold; I R; I T low threshold; IK Bkca; IK Skca; Na/Ca exchanger;
Gap Junctions:
Receptor(s): AMPA; NMDA; GabaA;
Gene(s): Cav3.2 CACNA1H; Cav3.3 CACNA1I; Cav1.2 CACNA1C; Cav1.3 CACNA1D; Cav2.2 CACNA1B; Kv4.2 KCND2; Kir2.1 KCNJ2; Kv2.1 KCNB1;
Transmitter(s): Gaba; Glutamate;
Simulation Environment: GENESIS;
Model Concept(s): Calcium dynamics; Detailed Neuronal Models; Synaptic Integration; Synaptic Plasticity;
Implementer(s): Dorman, Daniel B ;
Search NeuronDB for information about:  GabaA; AMPA; NMDA; I Na,t; I L high threshold; I T low threshold; I A; I K,Ca; I CAN; I A, slow; Na/Ca exchanger; I Krp; I R; Ca pump; Kir; IK Bkca; IK Skca; Gaba; Glutamate;

/***************************		MS Model, Version 12	*********************
**************************** 	      MScellshort.g 	*********************
	Avrama Blackwell
	Rebekah Evans

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"
if ({exists {getglobal calciumdye}})
    include MScell/Ca_constants.g
    echo "include MScell/Ca_constants"
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) 
    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 function set_position ***********************

//************************ Begin function add_channels *********************
function sigmoida(x,x0,k,gbar)
    float x, x0, k
    return {gbar/(1+{exp {-(x-x0)/k}})}
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}
            //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}  


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}


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 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
                    j = j+1


//************************ 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} 
        // 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}

    echo "finished adding calcium"
    add_channels {cellpath} {DA}					// local call

//************************ End function make_MS_cell ***********************