CA1 pyramidal neuron: Dendritic Na+ spikes are required for LTP at distal synapses (Kim et al 2015)

 Download zip file 
Help downloading and running models
Accession:184054
This model simulates the effects of dendritic sodium spikes initiated in distal apical dendrites on the voltage and the calcium dynamics revealed by calcium imaging. It shows that dendritic sodium spike promotes large and transient calcium influxes via NMDA receptor and L-type voltage-gated calcium channels, which contribute to the induction of LTP at distal synapses.
Reference:
1 . Kim Y, Hsu CL, Cembrowski MS, Mensh BD, Spruston N (2015) Dendritic sodium spikes are required for long-term potentiation at distal synapses on hippocampal pyramidal neurons. Elife [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Synapse; Channel/Receptor; Dendrite;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell;
Channel(s): I L high threshold; I K; Ca pump; I Sodium;
Gap Junctions:
Receptor(s): AMPA; NMDA;
Gene(s):
Transmitter(s): Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Dendritic Action Potentials; Ion Channel Kinetics; Active Dendrites; Detailed Neuronal Models; Synaptic Plasticity; Long-term Synaptic Plasticity; Synaptic Integration; Calcium dynamics; Conductance distributions;
Implementer(s): Cembrowski, Mark S [cembrowskim at janelia.hhmi.org]; Hsu, Ching-Lung [hsuc at janelia.hhmi.org];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; AMPA; NMDA; I L high threshold; I K; I Sodium; Ca pump; Glutamate;
/
fullMorphCaLTP8
fullMorphCaLTP8
calH.mod
cdp.mod
id.mod
kad.mod *
kap.mod *
kdr.mod *
na3.mod *
nmdaSyn.mod
spgen2.mod
analyseTBSCC.hoc
channelParameters.hoc
displayPanels.hoc
doTBSStimCC.hoc
getVoltageIntegral.hoc
init.hoc
initializationAndRun.hoc
morphology_ri06.nrn *
naceaxon.nrn *
plotTBSCC.hoc
preallocate.hoc
resetNSeg.hoc *
runTBSCC.hoc
seclists.hoc
start.hoc
                            
// DECLARE OBJECTS TO BE ASSIGNED DURING initchannels() CALL

objref osec[10]
objref neurAreas,neurNames,curSecname[1] // parameters inherent to determining surface area of branches
objref seclistDist // list of distal neurites
objref normNeurAreas,nnaInt, randGen, randGenAnat // used for distributing input across branches
strdef sectionToAccess // used for distributing input
objref ampa[1],nmda[1],ncAMPA[1],ncNMDA[1] // simple synapses

// LOAD SECTION LISTS
{
	xopen("seclists.hoc")
}

// LOAD PARAMETERS FOR CHANNELS
{
	load_file("channelParameters.hoc")
}


// LOAD COMMON FUNCTIONS USED FOR ASSIGNING CHANNEL DISTRIBUTIONS
{
	load_file("../commonFcns/round.hoc") // loads a rounding function
	load_file("../commonFcns/pause.hoc") // loads a pausing function
}
	
proc initchannels(){

	ttxInBath = $1 // simulate TTX in bath?  0 = no; 1 = yes
	
	forall {
		insert pas  g_pas=1/(Rm)  Ra=global_ra  e_pas=Vleak                   
		insert id
	 	insert cdp
	}
	
	forall {
		for (x) {
			id1_id(x) = 0
			id2_id(x) = 0
			id3_id(x) = 0
			id4_id(x) = 0
			id5_id(x) = 0
		}
	}
	
	if (abs(ttxInBath-1)<1e-5){
		// cut density of channels
		gnainit = gnainit0*ttxScale
		gnaslope = gnaslope0*ttxScale
	}else{
		gnainit = gnainit0
		gnaslope = gnaslope0
	}
	
	somaA { 
		insert nax  gbar_nax=gnabar  
		insert kdr  gkdrbar_kdr=gkdr
		insert kap  gkabar_kap=gkap
		insert kad  gkabar_kad=0
		insert calH gcalbar_calH=0
		insert pas	e_pas=Vleak  g_pas=1/Rm   Ra=global_ra  cm=Cm
	}
	
	hill { 
		insert nax  gbar_nax=gnabar  
		insert kdr  gkdrbar_kdr=gkdr
		insert kap  gkabar_kap=gkap
		insert kad  gkabar_kad=0
		insert calH gcalbar_calH=0
		insert pas	e_pas=Vleak  g_pas=1/Rm   Ra=global_ra   cm=Cm
	}
	
	iseg { 
		insert nax  gbar_nax=gnabar  
		insert kdr  gkdrbar_kdr=gkdr
		insert kap  gkabar_kap=gkap
		insert kad  gkabar_kad=0
		insert calH gcalbar_calH = 0
		insert pas	e_pas=Vleak  g_pas=1/Rm   Ra=global_ra   cm=Cm
	}
	
	for i=0,2 inode[i] { 
		insert nax  gbar_nax=gnabar  
		insert kdr  gkdrbar_kdr=gkdr
		insert kap  gkabar_kap=gkap*0.2
		insert kad  gkabar_kad=0
		insert calH gcalbar_calH=0
		insert pas	e_pas=Vleak  g_pas=1/Rm   Ra=global_ra   cm=Cmy
	}
	
	for i=0,1 node[i] { 
		insert nax  gbar_nax=gnode  
		insert kdr  gkdrbar_kdr=gkdr
		insert kap  gkabar_kap=gkap*0.2
		insert kad  gkabar_kad=0
		insert calH gcalbar_calH=0
		insert pas	e_pas=Vleak  g_pas=1/Rn   Ra=global_ra   cm=Cm
	}
	
	forsec all_basals {
		insert nax  gbar_nax=gnabar  
		insert kdr  gkdrbar_kdr=gkdr
		insert kap  gkabar_kap=gkap
		insert kad  gkabar_kad=0
		insert calH gcalbar_calH=0
		insert pas	e_pas=Vleak  g_pas=1/Rm   Ra=global_ra  cm=Cm
	}
	
	access somaA
	area(0.5)
	distance()
		
	forsec all_apicals {
		insert pas	e_pas=Vleak  Ra=global_ra 
		for (x) {
			xdist=distance(x)
			id2_id(x) = xdist		// id2 stores xdist, the path distance of each segment from the soma
			if (xdist <= spinelimit) {
				g_pas(x) = 1/Rm
				cm(x) = Cm
			} else {
				g_pas(x) = spinefactor/Rm
				cm(x) = spinefactor*Cm
			}
		}
		insert nax	
		insert kdr	gkdrbar_kdr=gkdr
		insert kap
		insert kad
		insert calH gcalbar_calH = 0
		gkabar_kap = 0
		gkabar_kad = 0
		
		for (x) {
			xdist = distance(x)
			xdistNoLimit = xdist
			if (xdist > dlimit) {
				xdist = dlimit
			}
			gkabar_kap(x) = 0
			gkabar_kad(x) = 0
			gbar_nax(x) = gnainit-xdistNoLimit*gnaslope
			if (xdist > dprox) {
				gkabar_kad(x) = gkad*(1+xdist*dslope)
			} else {
				gkabar_kap(x) = gkap*(1+xdist*dslope)
			}
		}
	}
	   
	forsec primary_apical_list {
		id1_id = 1				// id1=1 means the section is on the primary apical branch
	}
	
	forsec all_apicals {
		if (id1_id == 1) {			// skip the sections on the primary branch
			continue
		}
		osec[0] = new SectionRef()		// osec[0] contains the current oblique branch in the list
		for p = 1, 10 {
			osec[p-1].parent {
				osec[p] = new SectionRef()	// osec[1] references the parent of osec[0], osec[2] references 
				id1 = id1_id			// the parent of osec[1] etc. until the primary branch
			}
			if (id1 == 1) { 		// if osec[p] is the primary branch, stop incrementing p 
				break
			}
		}
		access osec[p-1].sec	// access the first parent oblique branch
		pdist = id2_id(0)	// pdist is the distance of the parent oblique branch from the soma
		for (x) {
			if (x == 0) {
				odist = distance()	// odist is zeroed to where the parent oblique branch intersects the primary branch
			}
		}
		access osec[0].sec
		for (x) {
			odist = distance(x) 	// odist is the distance of each segment along the oblique branch
			id3_id(x) = odist
			if (pdist > dlimit) {
				pdist_k = dlimit
			} else {
				pdist_k = pdist
			}				
			if (gkabar_kap(x) > 0) {
				gkabar_kap(x) = gkap*(1+pdist_k*dslope+odist*okslope)
			}
			if (gkabar_kad(x) > 0) {
			gkabar_kad(x) = gkad*(1+pdist_k*dslope+odist*okslope)
			}
			if (gkabar_kap(x) > okmax) {
				gkabar_kap(x) = okmax
			}
			if (gkabar_kad(x) > okmax) {
				gkabar_kad(x) = okmax
			}
			
		}
	}
	
	
	somaA { 
		distance()
	}
	forsec all_basals {
		for (x) {
			odist=distance(x)
			id3_id(x) = odist	
			gkabar_kap(x) = gkap*(1+odist*okslope)
			if (gkabar_kap(x) > okmax) {
				gkabar_kap(x) = okmax
			}
		}
	}
	
	// INCORPORATE SLOW INACTIVATION
	forall {ar2_nax=slowInact}
	
	// SURFACE AREA CALCULATION	
	// determine surface area of all branching neurites and add them to a list
	objref curSecname[numDistNeurites]
	neuriteArea=0
	neurAreas = new Vector(numDistNeurites)
	neurNames = new List()
	seclistDist = new SectionList()
	numDistNeurites=0
	forsec distTuft{
		insert calH gcalbar_calH = gcad
	
		numDistNeurites+=1
		curSecname[numDistNeurites-1] = new String()
		seclistDist.append()
		for (x) {
			neuriteArea+=area(x)
		}
		neurAreas.x[numDistNeurites-1] = neuriteArea
		curSecname[numDistNeurites-1].s = secname()
		neurNames.append(curSecname[numDistNeurites-1])
		neuriteArea=0
		
	}

	// DISTRIBUTE SYNAPSES
	objref normNeurAreas,nnaInt
	distNeurSum = neurAreas.sum()


	normNeurAreas = new Vector()
	nnaInt = new Vector()
	
	normNeurAreas.copy(neurAreas)
	normNeurAreas.div(distNeurSum)
	nnaInt.integral(normNeurAreas)
		
	objref randGen,randGenAnat
	randGen = new Random(theSeed)
	randGenAnat = new Random()
	randGen.uniform(0,1)
	randGenAnat = new Random(theSeed+1e6)
	randGenAnat.uniform(0,1)
	
	objref ampa[numSyn],nmda[numSyn],ncAMPA[numSyn],ncNMDA[numSyn]
	curSyn = 0
	
	strdef sectionToAccess
	for m=1,numSyn {
	
		curRand = randGen.repick()
		while(curRand>nnaInt.x[curSyn]){
			curSyn+=1
		}
		
		// access section
		sprint(sectionToAccess,"access %s",neurNames.o(curSyn).s)
		execute(sectionToAccess)
		
		curSyn=0
		curRandAnat = randGenAnat.repick()
		curRandAnatB = (int(curRandAnat*nseg)*2+1)/(nseg*2)		
		
		// DEFINE FEATURES OF SIMPLE SYNAPSES
		ampa[m-1] = new Exp2Syn(curRandAnatB)
		nmda[m-1] = new Exp2SynNMDA(curRandAnatB)
		
		ncAMPA[m-1] = new NetCon(ppStim,ampa[m-1])
		ncNMDA[m-1] = new NetCon(ppStim,nmda[m-1])
		
		ampa[m-1].tau1 = 0.2 	// msec; Jarsky et al 2005
		ampa[m-1].tau2 = 2 	// msec; Jarsky et al 2005
		
		nmda[m-1].tau1 = 1//10//5
		nmda[m-1].tau2 = 50//500//250 
		
		ncAMPA[m-1].weight = ampaWeight
		ncNMDA[m-1].weight = nmdaWeight
		ncAMPA[m-1].delay = 0
		ncNMDA[m-1].delay = 0
		
	}
}

Loading data, please wait...