Feedforward inhibition in pyramidal cells (Ferrante & Ascoli 2015)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:206378
"Feedforward inhibition (FFI) enables pyramidal cells in area CA1 of the hippocampus (CA1PCs) to remain easily excitable while faithfully representing a broad range of excitatory inputs without quickly saturating. Despite the cortical ubiquity of FFI, its specific function is not completely understood. FFI in CA1PCs is mediated by two physiologically and morphologically distinct GABAergic interneurons: fast-spiking, perisomatic-targeting basket cells and regular-spiking, dendritic-targeting bistratified cells. These two FFI pathways might create layer-specific computational sub-domains within the same CA1PC, but teasing apart their specific contributions remains experimentally challenging. We implemented a biophysically realistic model of CA1PCs using 40 digitally reconstructed morphologies and constraining synaptic numbers, locations, amplitude, and kinetics with available experimental data. ..."
Reference:
1 . Ferrante M, Ascoli GA (2015) Distinct and synergistic feedforward inhibition of pyramidal cells by basket and bistratified interneurons. Front Cell Neurosci 9:439 [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: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell; Hippocampus CA1 bistratified cell; Hippocampus CA1 basket cell;
Channel(s): I K; I A; I h; I Na,t;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Synaptic Integration;
Implementer(s): Ferrante, Michele [mferr133 at bu.edu];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; I Na,t; I A; I K; I h;
/
FFI_CA1
readme.html
distr.mod *
h.mod
kadist.mod *
kaprox.mod *
kdrca1.mod *
na3n.mod *
naxn.mod *
c20465.hoc
ffi.hoc
Fig3F_OrangeCurveSubSampled.hoc
fixnseg.hoc *
mosinit.hoc
n1.txt
regNsyn.hoc *
screenshot.png
                            
MODELTYPE = 0
use_mcell_ran4(1)
lowindex = 1001
mcell_ran4_init(lowindex)
highindex = 1

print "---------------------------SIM running-----------------------------"


NMDAFLAG = 0

if (NMDAFLAG == 0) { //only AMPA-R
    wtAmpa = 1
    wtNmda = 0
} else { //NMDAFLAG = 1, with both AMPA-R, NMDA-R
    wtAmpa = 0.8
    wtNmda = 0.2
}

soma area(0.5) 


TOTALDEND = APIDENDMAX + BASDENDMAX + 3 //"3": counting start at 0
objref dend[TOTALDEND]



/****************************************************************************
Grouping dendritic sections together in an array dend, later for being used to
randomly put synapses on the proximal apical, distal apical and basal dendrite
*****************************************************************************/
index = 0

forsec "dendrite" { //this will includes both dendrites and apical-dendrites
    dend[index] = new SectionRef()
    index += 1
}

//quadratic function fitting result A and B are set in cell's hoc file
A = 0.0036
B = 156

//synapses rise and decay time constants from andrasfalvy mody

TAU1e=0.5 
TAU2e=5.5 

TAU1i=0.73
TAU2i=6.5 

dist=1
rel=0.1

Rm = 28000    //unit: Ohm-cm^2
RmDend = Rm/1
RmSoma = Rm
RmAx = Rm

Cm    = 1
CmSoma= Cm
CmAx  = Cm
CmDend = Cm*1

RaAll= 50  //unit: Ohm-cm
RaSoma=50  
RaAx = 50

Vrest = -65
gna =  .02  
AXONM = 2
gkdr = 0.01
celsius = 35.0  
KMULT =  0.025  
KMULTP = 0.025  
gcan=0.0//005
gcal=0.0//005
gcat=0.0//005
ghd=0.00005
nash=0



forsec "axon" {insert pas e_pas=Vrest g_pas = 1/RmAx Ra=RaAx cm=CmAx}

forsec "soma" {
                insert pas e_pas=Vrest g_pas = 1/RmSoma Ra=RaSoma cm=CmSoma
                insert ds 
}

forsec "dendrite" {insert pas e_pas=Vrest g_pas = 1/RmDend Ra=RaAll cm=CmDend}

forsec "user5" {insert pas e_pas=Vrest g_pas = 1/RmDend Ra=RaAll  cm=CmDend}


access soma
freq=50
load_file("fixnseg.hoc")
geom_nseg()

tot=0
forall {tot=tot+nseg}
distance()
maxdist=0
forsec "user5" for(x) {if (distance(x)>maxdist) {maxdist=distance(x)}}


/****************************************************************************************
The following two lines of declaration are to match up ModelTypeC.hoc mapping bifurcation.
They are not used in ModelTypeI.hoc & ModelPassive.hoc
****************************************************************************************/
objref  outfile, sref, blist[USER5MAX+1],   aplist
strdef dend2, trunk


forsec "axon" {   
                insert nax gbar_nax=gna * AXONM	sh_nax=nash
                insert kdr gkdrbar_kdr=gkdr
               
                insert kap gkabar_kap = KMULTP*0.2
}

forsec "soma" {   
		insert hd ghdbar_hd=ghd	vhalfl_hd=-73
                insert na3 ar_na3=1 sh_na3=nash gbar_na3=gna
                insert kdr gkdrbar_kdr=gkdr
                insert kap gkabar_kap = KMULTP
               
}

/*---------------------setting up apical oblique dendrite channel kinetics--------*/
for (i=0; i<= APIDENDMAX; i += 1) {
        access apical_dendrite[i] {
	insert ds
                if (diam>0.35) {factor=1} else {factor=1}
                insert hd ghdbar_hd=ghd
                insert na3 ar_na3=1 gbar_na3=gna*factor sh_na3=nash
                insert kdr gkdrbar_kdr=gkdr*factor
                insert kap gkabar_kap=0
                insert kad gkabar_kad=0

                for (x) if (x>0 && x<1) { xdist = distance(x)
                        ghdbar_hd(x) = factor*ghd*(1+3*xdist/100)
                                if (xdist > 100){
                                        vhalfl_hd=-81
                                        gkabar_kad(x) = factor*KMULT*(1+xdist/100)
                                        } else {
                                        vhalfl_hd=-73
                                        gkabar_kap(x) = factor*KMULTP*(1+xdist/100)
                                        }
                }
        }
}


/*---------------------setting up basal dendrite channel kinetics--------*/
for (i=0; i <= BASDENDMAX; i += 1) { 
	access dendrite[i] { 
		if (diam>0.35) {factor=1} else {factor=1}
		insert hd ghdbar_hd=ghd
                insert na3 ar_na3=1 gbar_na3=gna*factor sh_na3=nash
                insert kdr gkdrbar_kdr=gkdr*factor
		insert kap gkabar_kap=0
		insert kad gkabar_kad=0

		for (x) if (x>0 && x<1) { xdist = distance(x)
                	ghdbar_hd(x) = factor*ghd*(1+3*xdist/100)
                		if (xdist > 100){
					vhalfl_hd=-81
                        		gkabar_kad(x) = factor*KMULT*(1+xdist/100)
                			} else {
					vhalfl_hd=-73
                        		gkabar_kap(x) = factor*KMULTP*(1+xdist/100)
               				}
		}
	}
}

/*----------------------------setting up main trunk channel kinetics-------------*/
forsec "user5" {   // the main trunk
	insert ds

		insert hd ghdbar_hd=ghd
                insert na3 ar_na3=1 gbar_na3=gna sh_na3=nash
                insert kdr gkdrbar_kdr=gkdr
		insert kap gkabar_kap=0
		insert kad gkabar_kad=0

		for (x) if (x>0 && x<1) { xdist = distance(x)
                	ghdbar_hd(x) = ghd*(1+3*xdist/100)
                		if (xdist > 100){
					vhalfl_hd=-81
                        		gkabar_kad(x) = KMULT*(1+xdist/100)
                			} else {
					vhalfl_hd=-73
                        		gkabar_kap(x) = KMULTP*(1+xdist/100)
               				}
		}

}


access soma

objref pw
pw = new PWManager()
pw.landscape(1)


proc init() {
	t=0
        forall {
        v=Vrest
        if (ismembrane("nax") || ismembrane("na3")) {ena=55}	
        if (ismembrane("kdr") || ismembrane("kap") || ismembrane("kad")) {ek=-90}
        if (ismembrane("hd") ) {ehd_hd=-30}
	}
	finitialize(Vrest)
        fcurrent()

        forall {
	for (x) {
	if (ismembrane("na3")||ismembrane("nax")){e_pas(x)=v(x)+(ina(x)+ik(x))/g_pas(x)}
	if (ismembrane("hd")) {e_pas(x)=e_pas(x)+i_hd(x)/g_pas(x)}
		}
	}
	cvode.re_init()
	cvode.event(tstop)
	access soma
}


proc advance() {
	fadvance()
}
//------------end modeltypeI

dt = 0.1
steps_per_ms = 1/dt







objref b,apc,rc,rd,fs,rs,rex,rob,rtrp,ror,rexfs,rexrs,pc,rci


outfile = new File()



/******************************************************************************
Create totSyn number(here is 1000) synapses on either proximal apical dendrite,
distal apical dendrite or basal dendrite (based on the flag "choice"). Also sets
the synaptic weight following Type I or Type C model based on the value of MODELTYPE.
MODELTYPE is inherited.
Here each synapse is connected to individual NetStim cell
******************************************************************************/



choice = 1

if (choice == 1 || choice == 2) {
    BEGINSECTION= 0
    ENDSECTION= TOTALDEND - 1
} else {
    BEGINSECTION= 0
    ENDSECTION= BASDENDMAX
} 

rc = new Random()
rc.MCellRan4(highindex+1)
rc.uniform(BEGINSECTION, ENDSECTION) 

rd = new Random()
rd.MCellRan4(highindex+2)
rd.uniform(0,1) 


pc = new Random()//
pc.MCellRan4(highindex+6)
pc.normal(5,5) 

fs = new Random()            // basket
fs.MCellRan4(highindex+5)   
fs.normal(2.5,0.85)  // variance= SEM*sqrt(n) from scanziani sem=.2 n=18

rs = new Random()// bistratified
rs.MCellRan4(highindex+7)
rs.normal(4.2,1.75) // variance= SEM*sqrt(n) from scanziani sem=.3 n=34

rex = new Random()
rex.MCellRan4(highindex+8)
rex.uniform(0, 28858) 

rexfs = new Random()
rexfs.MCellRan4(highindex+9)
rexfs.uniform(0,nfs)

rexrs = new Random()
rexrs.MCellRan4(highindex+9)
rexrs.uniform(0,nrs)  

rob = new Random()
rob.MCellRan4(highindex+10)
rob.uniform(0, APIDENDMAX-1)

rtrp = new Random()
rtrp.MCellRan4(highindex+11)
rtrp.uniform(0, USER5MAX-1)

ror = new Random()
ror.MCellRan4(highindex+12)
ror.uniform(0, BASDENDMAX-1)

cutsim=0

totSyn=28868+1379
we=0

access soma
soma distance()
objref Ens[3000], syn[3000], nc[3000],Ensi[3000], syni[3000], nci[3000],Ensii[3000], synii[3000], ncii[3000]



while(we<1){
for r=0, sim{ // how many sims per syn #

fssin=int((27.771*log(nsyn) - 65.645)*nfs*0.01)   
rssin=int((39.959*log(nsyn) - 160.57)*nrs*0.01)

if (fssin<=0){fssin=0}
if (fssin>=nfs){fssin=nfs}
if (rssin<=0){rssin=0}
if (rssin>=nrs){rssin=nrs}

for (j=0; j <= nsyn-1; j +=1) {

 c=int(rex.repick())
 loc=rd.repick()

 	
if (c<14425){ //obliques exc
den=int(rob.repick())
apical_dendrite[den]{
	Ens[j] = new NetStim(loc)
	syn[j] = new Exp2Syn(loc)
	nc[j] = new NetCon(Ens[j], syn[j],0,0,((A*distance(loc)^2)+B)*pc_sil*multp*1.e-6)  
 }
}
if (c>14424 && c<14429){// trunk apical prox exc
den=int(rtrp.repick())
access user5[den]
 
 if (distance(loc)<100){
user5[den]{
	Ens[j] = new NetStim(loc)
	syn[j] = new Exp2Syn(loc)
	nc[j] = new NetCon(Ens[j], syn[j],0,0,((A*distance(loc)^2)+B)*pc_sil*multp*1.e-6) 
	}}else{j=j-1}}

if (c>14428 && c<14706){ //trunk apical med exc
den=int(rtrp.repick())
access user5[den]
 
 if (distance(loc)>100 && distance(loc)<350){
user5[den]{
	
	Ens[j] = new NetStim(loc)
	syn[j] = new Exp2Syn(loc)
	nc[j] = new NetCon(Ens[j], syn[j],0,0,((A*distance(loc)^2)+B)*pc_sil*multp*1.e-6)  
	
	}}else{j=j-1}
}

if (c>14705 && c<16877){      //trunk apical distal exc

den=int(rtrp.repick())
access user5[den]
 
 if (distance(loc)>350 && distance(loc)<550){ 
user5[den]{
	Ens[j] = new NetStim(loc)
	syn[j] = new Exp2Syn(loc)
	nc[j] = new NetCon(Ens[j], syn[j],0,0,((A*distance(loc)^2)+B)*pc_sil*multp*1.e-6) 
	
	}}else{j=j-1}
}
if (c>16876 && c<17123){//basal prox exc

den=int(ror.repick())
access dendrite[den]
 
 if (distance(loc)<50){
dendrite[den]{
	Ens[j] = new NetStim(loc)
	syn[j] = new Exp2Syn(loc)
	nc[j] = new NetCon(Ens[j], syn[j],0,0,((A*distance(loc)^2)+B)*pc_sil*multp*1.e-6)  

	}}else{j=j-1}
}

if (c>17122){ //basal distal exc

den=int(ror.repick())
access dendrite[den]
 
 if (distance(loc)>50){
dendrite[den]{
	Ens[j] = new NetStim(loc)
	syn[j] = new Exp2Syn(loc)
	nc[j] = new NetCon(Ens[j], syn[j],0,0,((A*distance(loc)^2)+B)*pc_sil*multp*1.e-6) 
	//print "PC", "----", nc[j].weight, "mult ", multp
	}}else{j=j-1}
}
	Ens[j].number = 1
	Ens[j].start=pc.repick()
	Ens[j].interval=inter
	Ens[j].noise=noise
	syn[j].e=0
	syn[j].tau1 = TAU1e
	syn[j].tau2 = TAU2e
}



for (y=0; y <= fssin-1; y +=1) {
loci=rd.repick()

d=int(rexfs.repick())

if (d<193){// trunk apical prox inhi

den=int(rtrp.repick())
access user5[den]
 
 if (distance(loci)<100){ //FS
user5[den]{

	Ensi[y] = new NetStim(loci)
	Ensi[y].number = 1
	Ensi[y].interval = inter
	Ensi[y].start=fs.repick()
	Ensi[y].noise=0 
	
	syni[y] = new Exp2Syn(loci)
	syni[y].e=-80
	syni[y].tau1 = TAU1i
	syni[y].tau2 = TAU2i
	
	nci[y] = new NetCon(Ensi[y],syni[y],0,0,fs_sil)
    
	

	}}else{y=y-1}}else{

den=int(ror.repick())//basal prox inhi
access dendrite[den]
 
 if (distance(loci)<50){ //FS
dendrite[den]{
	Ensi[y] = new NetStim(loci)
	Ensi[y].number = 1
	Ensi[y].interval = inter
	Ensi[y].start=fs.repick()
	Ensi[y].noise=0 
	
	syni[y] = new Exp2Syn(loci)
	syni[y].e=-80
	syni[y].tau1 = TAU1i
	syni[y].tau2 = TAU2i
	
	nci[y] = new NetCon(Ensi[y],syni[y],0,0,fs_sil)
    

	}}else{y=y-1}}}
	
	for (q=0; q <= rssin-1; q +=1) {
       loci=rd.repick()
       m=int(rexrs.repick())

	
if (m<438){ 

den=int(rob.repick()) //obliques inhi

apical_dendrite[den]{

   	Ensii[q] = new NetStim(loci)
	Ensii[q].number = 1
	Ensii[q].interval = inter
    Ensii[q].noise=0 
	
	synii[q] = new Exp2Syn(loci)
	synii[q].e=-80
    synii[q].tau1 = TAU1i
    synii[q].tau2 = TAU2i
	
	if (distance(loci)>100){
    
	Ensii[q].start=fs.repick()
	ncii[q] = new NetCon(Ensii[q],synii[q],0,0,rs_sil) 
	
	}else{
	
    Ensii[q].start=fs.repick()
	ncii[q] = new NetCon(Ensii[q],synii[q],0,0,fs_sil) 

	}
}
}


if (m>437 && m<485){  //trunk dist inhi

den=int(rtrp.repick())
access user5[den]
 
 if (distance(loci)>350 && distance(loci)<550){ 
user5[den]{
	Ensii[q] = new NetStim(loci)
	Ensii[q].number = 1
	Ensii[q].interval = inter
	Ensii[q].start=fs.repick()
	Ensii[q].noise=0 
	
	synii[q] = new Exp2Syn(loci)
	synii[q].e=-80
	synii[q].tau1 = TAU1i
	synii[q].tau2 = TAU2i
	
	ncii[q] = new NetCon(Ensii[q],synii[q],0,0,rs_sil)

	
	
	}}else{q=q-1}
}

if (m>484 && m<890){ // oriens dist inhi

den=int(ror.repick())
access dendrite[den]
 
 if (distance(loci)>50){
	dendrite[den]{
	Ensii[q] = new NetStim(loci)
	Ensii[q].number = 1
	Ensii[q].interval = inter
	Ensii[q].start=fs.repick()
	Ensii[q].noise=0 
	
	synii[q] = new Exp2Syn(loci)
	synii[q].e=-80
	synii[q].tau1 = TAU1i
	synii[q].tau2 = TAU2i
	
	ncii[q] = new NetCon(Ensii[q],synii[q],0,0,rs_sil)
    
	
	}}else{q=q-1}
}
	
if (m>889){  //trunk dist inhi

den=int(rtrp.repick())
access user5[den]
 
 if (distance(loci)>100 && distance(loci)<350){ 
user5[den]{
	Ensii[q] = new NetStim(loci)
	Ensii[q].number = 1
	Ensii[q].interval = inter
	Ensii[q].start=fs.repick()
	Ensii[q].noise=0 
	
	synii[q] = new Exp2Syn(loci)
	synii[q].e=-80
	synii[q].tau1 = TAU1i
	synii[q].tau2 = TAU2i
	
	ncii[q] = new NetCon(Ensii[q], synii[q],0,0,rs_sil)


	
	}}else{q=q-1}
}}
	
	for (q=0; q <= rssin-1; q +=1) {
       loci=rd.repick()
       m=int(rexrs.repick())

	
if (m<438){ 

den=int(rob.repick()) //obliques inhi

apical_dendrite[den]{
 Ensii[q] = new NetStim(loci)
 synii[q] = new Exp2Syn(loci)
	if (distance(loci)>100){
	Ensii[q].start=fs.repick()
	ncii[q] = new NetCon(Ensii[q], synii[q],0,0,rs_sil)

	}else{
    Ensii[q].start=fs.repick()
	ncii[q] = new NetCon(Ensii[q],synii[q],0,0,fs_sil) 
	
	}
}
}


if (m>437 && m<485){  //trunk dist inhi

den=int(rtrp.repick())
access user5[den]
 
 if (distance(loci)>350 && distance(loci)<550){ 
user5[den]{
	Ensii[q] = new NetStim(loci)
	Ensii[q].start=fs.repick()
	synii[q] = new Exp2Syn(loci)
	ncii[q] = new NetCon(Ensii[q], synii[q],0,0,rs_sil)

	
	
	}}else{q=q-1}
}

if (m>484 && m<890){ // oriens dist inhi

den=int(ror.repick())
access dendrite[den]
 
 if (distance(loci)>50){
	dendrite[den]{
	Ensii[q] = new NetStim(loci)
	Ensii[q].start=fs.repick()
	synii[q] = new Exp2Syn(loci)
	ncii[q] = new NetCon(Ensii[q], synii[q],0,0,rs_sil)
    
		
	}}else{q=q-1}
}
	
if (m>889){  //trunk dist inhi

den=int(rtrp.repick())
access user5[den]
 
 if (distance(loci)>100 && distance(loci)<350){ 
user5[den]{
	Ensii[q] = new NetStim(loci)
	Ensii[q].start=fs.repick()
	synii[q] = new Exp2Syn(loci)
	ncii[q] = new NetCon(Ensii[q], synii[q],0,0,rs_sil)
	
	}}else{q=q-1}
}
	Ensii[q].number = 1
	Ensii[q].interval = inter
	Ensii[q].noise=0 
	synii[q].e=-80
	synii[q].tau1 = TAU1i
	synii[q].tau2 = TAU2i
}
forsec "axon[10]" {    
apc = new APCount(.5)
apc.thresh=-20
}

run()


if (apc.n>0.5){
apc.n=1
time=apc.time+time
}
apcc=apcc+apc.n
strdef  b1, c1,d1 

if (apcc>flag){
flag=flag+1
a1 = time/(apcc+0.00000001)
b1 = " "
sprint(c1,"%s%g%s",c1,a1,b1)
}else{
d1 = "-"
b1 = " "
sprint(c1,"%s%s%s",c1,d1,b1)
}

}	

nsyn=nsyn+1

time=0
if(apcc/(sim+1)==1){
cutsim=cutsim+1

if (cutsim>2.5){
we=10000
cutsim=0
}
}

if((apcc/(sim+1))>=0.5&&flag2<1){
flag2=flag2+1
print "neuron#",cou, "syn#", nsyn-1,fssin,rssin, "%spike: ", apcc/(sim+1),"onsets: ",c1
outfile.aopen(filename) 
outfile.printf("%g %s %g %s %s %g %g %g %g %g %g %s\n",frac,filename,cou,infilename,"1",nsyn-1,fssin,rssin,apcc/(sim+1),apc.n,time/(apcc+0.00000001),c1)
outfile.close()
}else{

if(apcc>0||flag3>0){
flag3=flag3+1
outfile.aopen(filename) 
outfile.printf("%g %s %g %s %s %g %g %g %g %g %g %s\n",frac, filename,cou,infilename,"0",nsyn-1,fssin,rssin,apcc/(sim+1),apc.n,time/(apcc+0.00000001),c1)
outfile.close()
}}
c1=""
apcc=0
flag=0
}
flag=0
flag2=0
flag3=0
outfile.aopen(filename) 
outfile.printf("%s %s %s %s % \n"," "," "," "," "," ")
outfile.close()


Loading data, please wait...