ModelDB is moving. Check out our new site at https://modeldb.science. The corresponding page is https://modeldb.science/187610.

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

 Download zip file 
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 *
                            
// ALLOCATE VGAT+ SYNAPSES AS BEING OTHER TYPES OF SYNAPSES (e.g., SST+, NPY+)

// This function flags the given SectionRef synapses as being part of the given
// genotype.
//
// $o1: SectionRef instance.  The section to implement the flagging.
// $o2: Vector instance.  Contains the scaling rule to implement.  If the
//	density is uniform across the branch (e.g., 0.1 synapses/um2), then
//	simply supply as 
//		foo = new Vector(1); foo.x[0] = 0.1; $o1 = foo
// 	Conversely, if
// 	there is spatial variation across the branch (say, 0.1 synapses/um2 in the
//	first third, 0.2 synapses/um2 in the second third, and 0.3 synapses/um2
// 	in the final third), then, supply as
//		foo = new Vector(3) ; foo.x[0] = 0.1, foo.x[1] = 0.2;
//			foo.x[2] = 0.3 ; $o1 = foo
// $s3: strdef instance.  The genotype to flag.
//
// The number of synapses added is returned.
func flagVgatInhibition() {local nDiv,iii,kk,numToConvert localobj theSa,tempToConvert
	nDiv = $o2.size()
	theSa = new Vector(nDiv) // track SA; eventually overwrite to # of synapses

	// identify number of synapses to flag.
	for(x,0){
	
		theSa.x[int(x_eff(x)*nDiv)] = theSa.x[int(x_eff(x)*nDiv)] + area(x)
	}
	theSa.mul($o2) // multiple SA by density.
	theSa.floor()
	
	// flag corresponding synapses
	for iii=1,nDiv{
		numToConvert = theSa.x[iii-1]
		tempToConvert = synIndSubset(curSec,numToConvert,-1,(iii-1)/nDiv,iii/nDiv)

		for kk=1,tempToConvert.size(){
			if(abs(strcmp($s3,"sst"))<0.0001){
				synVgatAt[tempToConvert.x[kk-1]].sst = 1
			}
			if(abs(strcmp($s3,"npy"))<0.0001){
				synVgatAt[tempToConvert.x[kk-1]].npy = 1
			}
			if(abs(strcmp($s3,"pv"))<0.0001){
				synVgatAt[tempToConvert.x[kk-1]].pv = 1
			}
		}
	}
	
	return theSa.sum()
}

// DEFINE OBJECTS AND PARAMETERS FOR FLAGGING SYNAPSES
	// SST.
		objref denSstTuftTerm,denSstTuftPar
		denSstTuftTerm = new Vector(3)
			denSstTuftTerm.x[0] = 0.0575
			denSstTuftTerm.x[1] = 0.0675
			denSstTuftTerm.x[2] = 0.1075
		denSstTuftPar = new Vector(3)
			denSstTuftPar.x[0] = 0.045
			denSstTuftPar.x[1] = 0.055
			denSstTuftPar.x[2] = 0.05

	// NPY.
		objref denNpyObl,denNpyOblTemp
		denNpyObl = new Vector(3)
			denNpyObl.x[0] = 0.022 //0.022
			denNpyObl.x[1] = 0.02 // 0.014
			denNpyObl.x[2] = 0.01
		denNpyOblTemp = new Vector(denNpyObl.size())
		denNpyOblBase = 0//0.025 // base amount to be added everywhere after scaling
		
		objref denNpyTrunk,denNpyTrunkTemp
		denNpyTrunk = new Vector(1)
			denNpyTrunk.x[0] = 0.0425
		denNpyTrunkTemp = new Vector(denNpyTrunk.size())
		
		objref denNpySoma
		denNpySoma = new Vector(1)
			denNpySoma.x[0] = 0 // =0, as do not want somatic inhibition
		
		objref denNpyBasalPrim,denNpyBasalSec,denNpyBasalTerm
		denNpyBasalPrim = new Vector(1)
			denNpyBasalPrim.x[0] = 0.04
		denNpyBasalSec = new Vector(1)
			denNpyBasalSec.x[0] = 0.05
		denNpyBasalTerm = new Vector(1)
			denNpyBasalTerm.x[0] = 0.020
		
	// PV.
		objref denPvObl
		denPvObl = new Vector(1)
			denPvObl.x[0] = 0.008 // changed from 0.004 per Erik's request, 022415, to have ~15 synapses
		
		objref denPvSoma
		denPvSoma = new Vector(1)
			denPvSoma.x[0] = 0.032
			
		objref denPvBasalPrim,denPvBasalSec,denPvBasalTerm
		denPvBasalPrim = new Vector(1)
			denPvBasalPrim.x[0] = 0.05
		denPvBasalSec = new Vector(1)
			denPvBasalSec.x[0] = 0.02
		denPvBasalTerm = new Vector(1)
			denPvBasalTerm.x[0] = 0.001	

// ADD IN SYNAPSES.
// Flag genotypes according to the above defined rules.  Wrapped in a proc call
// so that can be re-called as needed, which will redraw synapses from the 
// distributions (stochasticity present in the synIndSubset() call in 
// flagVgatInhibition() ).
proc seedGenotypes(){local ii,mm,theX

	// Clear previous identities.
	for ii=0,totVgatAt-1{
		synVgatAt[ii].sst = 0
		synVgatAt[ii].npy = 0
		synVgatAt[ii].pv = 0
	}

	// SST /////////////////////////////////////////////////////////////////

	// Add SST synapses to tuft.
		totSstTuft = 0
		
		forsec tuftList {
			curSec = new SectionRef()
			if(isTerm_id){
				numFlagged = flagVgatInhibition(curSec,denSstTuftTerm,"sst")
			}else{
				numFlagged = flagVgatInhibition(curSec,denSstTuftPar,"sst")
			}
			totSstTuft += numFlagged
			
		}
		
		// print "The total number of SST synapses in tuft is ",totSstTuft
	
	// NPY /////////////////////////////////////////////////////////////////	
	
	// Add synapses to oblique.
	
		
		totNpyObl = 0
		forsec obliqueList {
			curSec = new SectionRef()
			
			theOblDist = mainbif_dists
			scaleFact = (200-theOblDist)/66		
			if(scaleFact<0){scaleFact=0}
			
			denNpyOblTemp.copy(denNpyObl)
			denNpyOblTemp.add(denNpyOblBase)
			denNpyOblTemp.mul(scaleFact)
			
			numFlagged = flagVgatInhibition(curSec,denNpyOblTemp,"npy")
			
			totNpyObl+=numFlagged
		}
		
		// print "The total number of NPY synapses in obliques is ",totNpyObl
	
	// Add in synapses to trunk.
		
		
		
		totNpyTrunk = 0
			
		soma.sec {distance()}
		forsec primList {
			curSec = new SectionRef()
		
			theDist = distance(0.5)
			scaleFact = scaleFact = 1-theDist/250
			if(scaleFact<0){scaleFact=0}
			
			denNpyTrunkTemp.copy(denNpyTrunk)
			denNpyTrunkTemp.mul(scaleFact)
			
			numFlagged = flagVgatInhibition(curSec,denNpyTrunkTemp,"npy")
		
			totNpyTrunk += numFlagged
		}
		// print "The total number of NPY synapses in trunk is ",totNpyTrunk
		
	// Add synapses to soma.
		
		totNpySoma=0
		soma.sec {
			curSec = new SectionRef()
			numFlagged = flagVgatInhibition(curSec,denNpySoma,"npy")
			totNpySoma+=numFlagged
		}
		// print "The total number of NPY synapses at soma is ",totNpySoma
		
	// Add synapses to basals.
		totNpyBasal = 0
		forsec basalList {
			curSec = new SectionRef()
			if(isTerm_id){
				numFlagged = flagVgatInhibition(curSec,denNpyBasalTerm,"npy")
			}else{
				if(abs(brOrd_id-1)<0.001){
					numFlagged = flagVgatInhibition(curSec,denNpyBasalPrim,"npy")
				}else{
					if(abs(brOrd_id-2)<0.001){
						numFlagged = flagVgatInhibition(curSec,denNpyBasalSec,"npy")
					}else{
						numFlagged = flagVgatInhibition(curSec,denNpyBasalSec,"npy") // keep as 2ary for right now...
					}
				}
			}
			totNpyBasal += numFlagged
		}
		// print "The total number of NPY synapses in basal is ",totNpyBasal
		

	// PV //////////////////////////////////////////////////////////////////
		
	// Add synapses to oblique.
		totPvObl = 0
		
		forsec obliqueList {
			curSec = new SectionRef()
			numFlagged = flagVgatInhibition(curSec,denPvObl,"pv")
			totPvObl+=numFlagged
		}
		
		// print "The total number of PV synapses in obliques is ",totPvObl
	
	// Add synapses to soma.
		totPvSoma=0
		
		soma.sec {
			curSec = new SectionRef()
			numFlagged = flagVgatInhibition(curSec,denPvSoma,"pv")
			totPvSoma+=numFlagged
		}
		// print "The total number of PV synapses at soma is ",totPvSoma
		

	// Add synapses to basals.
		
		totPvBasal = 0
		forsec basalList {

			curSec = new SectionRef()
			if(isTerm_id){
				numFlagged = flagVgatInhibition(curSec,denPvBasalTerm,"pv")
			}else{
				if(abs(brOrd_id-1)<0.001){
					numFlagged = flagVgatInhibition(curSec,denPvBasalPrim,"pv")
				}else{
					if(abs(brOrd_id-2)<0.001){
						numFlagged = flagVgatInhibition(curSec,denPvBasalSec,"pv")
					}else{
						numFlagged = flagVgatInhibition(curSec,denPvBasalSec,"pv") // keep as 2ary for right now...
					}
				}
			}
			totPvBasal += numFlagged
		}
		// print "The total number of PV synapses in basal is ",totPvBasal

	// Update values storing number of each genotype at each synapse.
	forall {
		for (x,0) {
			sstAt_syns(x)=0
			npyAt_syns(x)=0
			pvAt_syns(x)=0
		}
	}
	
	for mm=1,totVgatAt{
		synVgatAt[mm-1].get_loc() {
			theX = synVgatAt[mm-1].get_loc()
			
		
			
			if(synVgatAt[mm-1].sst==1){
				sstAt_syns(theX) = sstAt_syns(theX)+1		
			}
			if(synVgatAt[mm-1].npy==1){
				npyAt_syns(theX) = npyAt_syns(theX)+1
			}
			if(synVgatAt[mm-1].pv==1){
				pvAt_syns(theX) = pvAt_syns(theX)+1
			}
			pop_section()
		}
		pop_section()
	}
}
seedGenotypes() // add in inhibition

Loading data, please wait...