CA1 pyramidal neuron synaptic integration (Bloss et al. 2016)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:187610
"... We examined synaptic connectivity between molecularly defined inhibitory interneurons and CA1 pyramidal cell dendrites using correlative light-electron microscopy and large-volume array tomography. We show that interneurons can be highly selective in their connectivity to specific dendritic branch types and, furthermore, exhibit precisely targeted connectivity to the origin or end of individual branches. Computational simulations indicate that the observed subcellular targeting enables control over the nonlinear integration of synaptic input or the initiation and backpropagation of action potentials in a branchselective manner. Our results demonstrate that connectivity between interneurons and pyramidal cell dendrites is more precise and spatially segregated than previously appreciated, which may be a critical determinant of how inhibition shapes dendritic computation."
Reference:
1 . Bloss EB, Cembrowski MS, Karsh B, Colonell J, Fetter RD, Spruston N (2016) Structured Dendritic Inhibition Supports Branch-Selective Integration in CA1 Pyramidal Cells. Neuron 89:1016-30 [PubMed]
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:
Cell Type(s): Hippocampus CA1 pyramidal GLU cell;
Channel(s): I Na,t; I K;
Gap Junctions:
Receptor(s): AMPA; NMDA; Gaba;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Synaptic Integration;
Implementer(s): Cembrowski, Mark S [cembrowskim at janelia.hhmi.org];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; AMPA; NMDA; Gaba; I Na,t; I K;
/
arrayTomography
README.txt
dists.mod *
eff.mod *
exc.mod
id.mod *
inh.mod
kad.mod *
kap.mod *
kdr.mod *
na3.mod *
nmdaSyn.mod
syns.mod *
activateExcitation.hoc
activateInhibition.hoc
addChannels.hoc *
addExcitation.hoc
addVgatInhibition.hoc
channelParameters.hoc *
flagVgatInhibition.hoc
getBranchOrder.hoc *
idMorph.hoc
inhibitionBiophysics.hoc
initializationAndRun.hoc
loadMorph.hoc
mosinit.hoc *
naceaxon.nrn *
processMorph.hoc
proofreadMorph.hoc
resetNSeg.hoc *
start.hoc
synHelperScripts.hoc
twinApical.swc *
                            
// THIS SCRIPT ASSIGNS ANNOTATION TO SPECIFIC SUBCELLULAR COMPARTMENTS.

forall {
	
	insert id
	
	for (x) {
		isTerm_id(x) = 0
		isTuft_id(x) = 0
		isObl_id(x) = 0
		isBas_id(x) = 0
		isPrim_id(x) = 0
	}
}

objref soma
objref basalList,obliqueList,primList,apicalList,tuftList,dendList,cellList,ca3List
	
apicalList = new SectionList() // apical list
basalList = new SectionList() // basal list
obliqueList = new SectionList() // oblique list
primList = new SectionList() // primary apical list
tuftList = new SectionList()
dendList = new SectionList() // list of all dendrites
cellList = new SectionList()
ca3List = new SectionList() // list of places that CA3 cells would contact CA1 (SO + SR)
	
Cell[0].dend[72] {soma = new SectionRef()}

// Populate apical list.
Cell[0].dend[11] { apicalList.subtree() }

// Populate primary apical list.
Cell[0].dend[11] { primList.append() }
Cell[0].dend[74] { primList.append() }
Cell[0].dend[75] { primList.append() }
Cell[0].dend[76] { primList.append() }
Cell[0].dend[77] { primList.append() } // right before twin bifurcation
Cell[0].dend[78] { primList.append() } // left twin apical
Cell[0].dend[79] { primList.append() }
Cell[0].dend[80] { primList.append() }
Cell[0].dend[82] { primList.append() }
Cell[0].dend[83] { primList.append() }
Cell[0].dend[84] { primList.append() }
Cell[0].dend[85] { primList.append() }
Cell[0].dend[86] { primList.append() }
Cell[0].dend[151] { primList.append() } // right twin apical
Cell[0].dend[154] { primList.append() }
Cell[0].dend[155] { primList.append() }
Cell[0].dend[157] { primList.append() }
Cell[0].dend[160] { primList.append() }
Cell[0].dend[161] { primList.append() }

// By eye, these were the beginning of sections that define the tuft.
Cell[0].dend[87] { tuftList.subtree() }
Cell[0].dend[162] { tuftList.subtree() }
Cell[0].dend[163] { tuftList.subtree() }

// Populate obliques.  By previous definitions, this is simply the
// whole apical dendrite less the tuft and the primary apical.
forsec apicalList { obliqueList.append() }
forsec tuftList { obliqueList.remove() }
forsec primList { obliqueList.remove() }


	
// Populate basals.  By previous definitions, this is simply the
// whole tree less the apical dendrite and the soma.
forall { basalList.append() }
forsec apicalList { basalList.remove() }
soma.sec { basalList.remove () }


// Populate all dendrites.  This is everything minus the soma.
forall { dendList.append() }
soma.sec { dendList.remove() }

// Populate the whole cell.  This is everything.
forall { cellList.append() }

// Populate sections which would contact CA3 axons.
forsec basalList {ca3List.append()}
forsec primList {ca3List.append()}
forsec obliqueList {ca3List.append()}
soma.sec {ca3List.append()}

// Declare a function that looks at whether a given SectionRef instance 
// (argument 1) is found in a given SectionList (argument 2).
// $o1: SectionRef instance to match.
// $o2: SectionList instance to search over.
// Returns logical of whether section is in list.
func sectionRefInList() {local isInList
	isInList = 0
	
	strdef tempSecName
	
	$o1.sec { tempSecName = secname() }
	
	forsec $o2 {
		if(abs(strcmp(secname(),tempSecName))<(1e-5)){
			isInList=1
		}
	}

	return isInList
}

objref theSec
forall {
	theSec = new SectionRef()
	for (x){
		isTuft_id(x) = sectionRefInList(theSec,tuftList)
		isPrim_id(x) = sectionRefInList(theSec,primList)
		isObl_id(x) = sectionRefInList(theSec,obliqueList)
		isBas_id(x) = sectionRefInList(theSec,basalList)
		brOrd_id(x) = -1
	}
}

// Assign distances from bifurcation of apical trunk.  Note this is used solely
// for obliques, so all other locations get assigned a -1 value.

forall {
	insert dists
	
}

// Generate a function that point out how far something is from main apical.
// INPUT: a SectionRef instance that refers to an oblique branch.
// OUTPUT: the distance from the initial bifurcation of this branch from the
//	primary apical branch.  [ note : to be consistent with AT data, this 
//	may not be the distance of the branch itself, but rather from a
//	parent branch that stems directly off of the primary apical ]
func oblDist(){localobj theSec,tempParSec
	theSec = $o1 // a SectionRef instance
	
	// Traverse down branch until hit parent branch that stems directly
	// off the main apical.
	
	// Identify parent.
	strdef strPar
	while(1){
		theSec.parent{	
			strPar = secname()	
		}
		
		inList = 0
		
		// Is parent in the obliques list?
		forsec obliqueList {
			curDist = abs(strcmp(secname(),strPar))
			if(curDist<0.0001){
				inList = 1
				tempParSec = new SectionRef()
			}
		}
		if(inList){
			// Repeat; update parent section.
			tempParSec.sec { theSec = new SectionRef() }
		}else{
			break
		}
	}
	
	// Get the distance from this parent branch to the soma.
	soma.sec {
		distance()
	}
	
	theSec.sec {
		theDist = distance(0)
	}
			
	return theDist
}

// Generate a function that point out how far along the main apical a given
// section (with associated x value) is.
// INPUT: a SectionRef instance that refers to an main apical branch, and a 
//	variable (0<= , <=1) corresponding to the x value.
// OUTPUT: the distance of the _middle_ of the section from the soma, divided
//	by the distance of the total main apical dendrite
func primDist(){local tuftDist,somaDist,outDist,theX localobj theSec,allTuftDists
	theSec = $o1 // a SectionRef instance
	theX = $2
	allTuftDists = new Vector()
	
	// Calculate minimum distance from tuft to selected section.
	theSec.sec { distance() }
	forsec tuftList {
		tuftDist = distance(0)
		allTuftDists.append(tuftDist)
	}
	tuftDist = allTuftDists.min() 
	
	// Calculate distance from selected section to soma.
	soma.sec { distance() }
	theSec.sec { somaDist = distance(theX) }

	outDist = somaDist/(somaDist+tuftDist)	
	return outDist
}

// Assign main bifurcation distances to obliques, as well as normalised
// primary apical distances.
forall {
	for(x) {
		theSec = new SectionRef()
		
		// Main bifurcation distance.
		if(sectionRefInList(theSec,obliqueList)){
			mainbif_dists = oblDist(theSec)
		}else{
			mainbif_dists = -1
		}
		
		// Norm prim apical distance.
		if(sectionRefInList(theSec,primList)){
			normprim_dists(x) = primDist(theSec,x)
		}else{
			normprim_dists = -1
		}
	}
}

forall {
	insert syns
	npyAt_syns = 0
	npyUnif_syns = 0
	sstAt_syns = 0
	sstUnif_syns = 0
	vlsAt_syns = 0
	exc_syns = 0
}


Loading data, please wait...