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

 Download zip file 
Help downloading and running models
Accession:245411
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.
Reference:
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;
//genesis
//CaDifshell.g

/***************************		MS Model, Version 12	*********************
	Avrama Blackwell 	kblackw1@gmu.edu
	Rebekah Evans 		rcolema2@gmu.edu
	Sriram 				dsriraman@gmail.com	
*****************************************************************************/

//old calcium concentration - single time constant of decay
function add_CaConcen (buffername, a, b, cellpath)
	str buffername,cellpath
    float a,b

    str compt
	float len,dia,position
    float Ca_tau,kb   		
	float PI = 3.14159
    float shell_thick={outershell_thickness}

	foreach compt ({el {cellpath}/##[TYPE={compartment}]})
		//make sure this is not an axon, and determine length and diameter
 		  if (!{{compt} == {{cellpath}@"/axIS"} || {compt} == {{cellpath}@"/ax"}}) 
    		dia = {getfield {compt} dia}
    		position = {getfield {compt} position}
     		len = {getfield {compt} len}
    	end


  			//if the compartment is not a spine and its position is between [a,b] 
   		if ({position >= a} && {position < b} ) 
     			// Sabatini's model. Sabatini, 2001,2004
      		create Ca_concen  {compt}/{buffername}  // create Ca_pool here!
      		if({dia} < 0.81e-6)        // this is tertiary dendrites
            		kb = 96
      		elif (dia < 1.5e-6)        // secondary dendrites
            		kb = 96
      		elif (dia < 1.8e-6)        // primary dendrites
            		kb = 96
            else                       // soma 
                kb = 200             	// the setting for soma is arbitrary
            end

            if({dia}	<	15e-6)
   				Ca_tau = 25e-3
            else 
      			Ca_tau = 100e-3       	// adhoc setting to fit the model
            end  
                
   			// set Ca_tau  according to diameters of dendrites
            if ({shell_thick} > 0)
                float  inner_dia = dia - shell_thick*2
            else
                float inner_dia = 0
            end
            float  shell_vol= {PI}*(dia*dia/4-inner_dia*inner_dia/4)*len
            float surf = dia*{PI}*dia
            if ({dia}>= 15e-6)
                echo {compt} "shell vol,len,dia=" {shell_vol} {len} "dia=" {dia} "SA=" {surf}
            end
		
            setfield {compt}/{buffername} \
               B          {1.0/(2.0*96494*shell_vol*(1+kb))}	\ 
               tau        {Ca_tau}                        		\  
               Ca_base    {Ca_basal}   									\
               thick      {shell_thick}  
        end
    end
end

//new calcium concentration - various buffers, pumps and diffusion
function create_difshell (shellName, basal, compLen, r, shellThickness, mode)
	str shellName
	float basal
	float compLen
	float r, shellThickness
    str mode

	create difshell {shellName}
	setfield {shellName}	\
		C    {basal}	\
        Ceq  {basal}	\
        D    {dca}	\ //D_Ca = 2e-6 (cm^2)(s^(-1))
        val  2	\
        leak 0	\
        shape_mode {mode}	\ 
        len {compLen}	\
        dia {r*2}	\	//outer diameter of the shell
        thick {shellThickness}
end

function add_difbuffer_to_difshell (shellName, bname, btotal, kf, kb, d, compLen, r, shellThickness, mode)
	str shellName, bname
	float btotal, kf, kb, d, compLen, r
    str mode

	create difbuffer {shellName}{bname}

    setfield {shellName}{bname}	\
		Btot {btotal}	\
        kBf {kf} \
        kBb {kb} \
        D {d} \
        shape_mode {mode} \
        len {compLen} \
        dia {r*2} \
        thick {shellThickness}

    addmsg {shellName}{bname} {shellName} BUFFER kBf kBb Bfree Bbound
    addmsg {shellName} {shellName}{bname} CONCEN C 
end

function add_mmpump (shellName, surfaceArea, kcat, km, pname)
	str shellName
	float surfaceArea, kcat, km
	str pname
	
	create mmpump {shellName}{pname}
	setfield {shellName}{pname}	\
        vmax {kcat*surfaceArea}	\ 
		val {2}	\	
        Kd {km}
   	addmsg {shellName}{pname} {shellName} MMPUMP vmax Kd
    addmsg {shellName} {shellName}{pname} CONCEN C
end

function make_fura (compt, totalshells, bufname, calname)
	str compt
	str calname
	str bufname
	int totalshells, i
	create fura2 {compt}/{bnamefluor}
	i=1
	while (i < totalshells+1)
		str bnx = {calname} @ {i}
		//str bn = {bnx}{bufname}
		addmsg {compt}/{bnx}{bufname} {compt}/{bnamefluor} CONCEN Bfree Bbound vol
		i=i+1
	end 
end

function make_volavg (compt, totalshells, calname)
	str compt
	str calname
	int totalshells, i
	create wgtavg {compt}/volavg
	i=1
	while (i < totalshells+1)
		str bnx = {calname} @ {i}
		addmsg {compt}/{bnx} {compt}/volavg ValueWgt C vol
		i=i+1	
	end
end

function make_buffervolavg (compt, totalshells, calname, buffer)
	str compt
	str calname
	str buffer
	int totalshells, i
	create wgtavg {compt}/{buffer}Vavg
	i=1
	while (i < totalshells+1)
		str bnx = {calname} @ {i}
		addmsg {compt}/{bnx}{buffer} {compt}/{buffer}Vavg ValueWgt Bbound vol
		i=i+1	
	end
end


function add_caconcen_objects (calName, CELLPATH)
	str calName, CELLPATH
	str outermostShellName = {calName} @ 1
	str compt 
	int totalshells
	float thickness, totalthick, remaining

	foreach compt ({el {CELLPATH}/##[TYPE={compartment}]})
        float dia={getfield {compt} dia}
        float rad = 0.5*{dia}
        float len = {getfield {compt} len}
        int numShells = 0 //initialize numShells at 0

//**********calculate how many shells are needed from the diameter and thickness
        int i
        totalthick=outershell_thickness
        remaining=rad
        for (i = 1; remaining>minthick; i=i+1)
               remaining=rad-totalthick
               totalthick=totalthick+outershell_thickness*thicknessincrease**i
               //echo "shells="{i}, "remaining" {remaining}
        end
        totalshells=i-1
        if (({substring {compt} 6 9} != "tert") || ({compt}=="/cell/tertdend1_1"))
            echo {compt} "radius=" {rad} ", totalshells=" {totalshells}
        end

//make shells and buffers using the number of shells calculated above. 
        float shellRadius = {rad} 
        thickness=outershell_thickness
        for (i=1; i<= totalshells; i=i+1)
			str shellname = {calName} @ {i}
			create_difshell {compt}/{shellname} {Ca_basal} {len} {shellRadius} {thickness} {SHELL} 
			add_difbuffer_to_difshell {compt}/{shellname} {bname1} {btotal1} {kf1} {kb1} {d1} {len} {shellRadius} {thickness} {SHELL}
			add_difbuffer_to_difshell {compt}/{shellname} {bname2} {btotal2} {kf2} {kb2} {d2} {len} {shellRadius} {thickness} {SHELL} 
			add_difbuffer_to_difshell {compt}/{shellname} {bname4} {btotal4} {kf4} {kb4} {d4} {len} {shellRadius} {thickness} {SHELL}
            add_difbuffer_to_difshell {compt}/{shellname} {bname8} {btotal8} {kf8} {kb8} {d8} {len} {shellRadius} {thickness} {SHELL}

            if (calciumdye>0)
                add_difbuffer_to_difshell {compt}/{shellname} {bnamefluor} {btotalfluor} {kffluor} {kbfluor} {dfluor} {len} {shellRadius} {thickness} {SHELL} 
            end
			shellRadius = shellRadius-thickness
            if (i==totalshells-1)
                thickness=shellRadius
            else
                thickness=thickness*thicknessincrease
			end
		end
        reset > reset.txt //reset to set sa and vol for correct diffusion messages.

		if (calciumdye == 1)
		   //add fura object to each compartment to calc fluorescence
			make_fura {compt} {totalshells} {bnamefluor} {calName}
		elif (calciumdye > 1)
		   //add wgtavg object for bound single wavelength indicator dye 
			make_buffervolavg {compt} {totalshells} {calName} {bnamefluor}
		end

		//add wgtavg object to calculated Ca concentration without dyes
		make_volavg {compt} {totalshells} {calName}
		
		//diffusion between calcium and diffusible buffer shells
			for (i=1; i < totalshells; i=i+1)
				str sn = {calName} @ {i} 
				str innerSn = {calName} @ {i+1}
                //echo "shell=" {compt}/{sn} "SA=" {getfield {compt}/{sn} surf_up}
				addmsg {compt}/{sn} {compt}/{innerSn} DIFF_DOWN prev_C thick
				addmsg {compt}/{innerSn} {compt}/{sn} DIFF_UP prev_C thick
				addmsg {compt}/{sn}{bname2} {compt}/{innerSn}{bname2} DIFF_DOWN prev_free thick
				addmsg {compt}/{innerSn}{bname2} {compt}/{sn}{bname2} DIFF_UP prev_free thick
				addmsg {compt}/{sn}{bname4} {compt}/{innerSn}{bname4} DIFF_DOWN prev_free thick
				addmsg {compt}/{innerSn}{bname4} {compt}/{sn}{bname4} DIFF_UP prev_free thick
				addmsg {compt}/{sn}{bname1} {compt}/{innerSn}{bname1} DIFF_DOWN prev_free thick
				addmsg {compt}/{innerSn}{bname1} {compt}/{sn}{bname1} DIFF_UP prev_free thick
                
                if (calciumdye>0)
                    addmsg {compt}/{sn}{bnamefluor} {compt}/{innerSn}{bnamefluor} DIFF_DOWN prev_free thick
                    addmsg {compt}/{innerSn}{bnamefluor} {compt}/{sn}{bnamefluor} DIFF_UP prev_free thick
                end
			end	

			//pump @ outershell
			float surfaceArea = {getfield {compt}/{outermostShellName} surf_up}
			//echo "shell=" {compt}/{outermostShellName}
			//showfield {compt}/{outermostShellName} *
			if ({compt} == "/cell/soma")
                float kcat=kcatsoma
            else
                float kcat=kcatdend
            end

			add_mmpump {compt}/{outermostShellName} {surfaceArea} {kcat} {km} {MMpumpName}
            float CaBase = {getfield {compt}/{outermostShellName} Ceq}
            float vmax = kcat*surfaceArea
            float vol = {getfield {compt}/{outermostShellName} vol}
            float leak = {{{vmax*CaBase}/{vol*{CaBase + km}}}}// {{kcat*CaBase}/{outershell_thickness*{CaBase + km}}} 
            setfield {compt}/{outermostShellName} leak {leak}
            //echo "mmpump" {compt} "kcat="{kcatsoma} "leak ="{leak}
	end
end