Irregular spiking in NMDA-driven prefrontal cortex neurons (Durstewitz and Gabriel 2006)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:82784
Slow N-Methyl-D-aspartic acid (NMDA) synaptic currents are assumed to strongly contribute to the persistently elevated firing rates observed in prefrontal cortex (PFC) during working memory. During persistent activity, spiking of many neurons is highly irregular. ... The highest interspike-interval (ISI) variability occurred in a transition regime where the subthreshold membrane potential distribution shifts from mono- to bimodality, ... Predictability within irregular ISI series was significantly higher than expected from a noise-driven linear process, indicating that it might best be described through complex (potentially chaotic) nonlinear deterministic processes. Accordingly, the phenomena observed in vitro could be reproduced in purely deterministic biophysical model neurons. High spiking irregularity in these models emerged within a chaotic, close-to-bifurcation regime characterized by a shift of the membrane potential distribution from mono- to bimodality and by similar ISI return maps as observed in vitro. ... NMDA-induced irregular dynamics may have important implications for computational processes during working memory and neural coding.
Reference:
1 . Durstewitz D, Gabriel T (2007) Dynamical basis of irregular spiking in NMDA-driven prefrontal cortex neurons. Cereb Cortex 17:894-908 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Neocortex; Prefrontal cortex (PFC);
Cell Type(s): Neocortex L5/6 pyramidal GLU cell;
Channel(s): I Na,p; I Na,t; I L high threshold; I K; I Potassium;
Gap Junctions:
Receptor(s): GabaA; AMPA; NMDA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; MATLAB;
Model Concept(s): Activity Patterns; Working memory; Calcium dynamics; Bifurcation;
Implementer(s): Durstewitz, Daniel [daniel.durstewitz at plymouth.ac.uk];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; GabaA; AMPA; NMDA; I Na,p; I Na,t; I L high threshold; I K; I Potassium;
// *********************************************************************
// Simulation code from Durstewitz & Gabriel (2006), "Dynamical basis of 
// irregular spiking in NMDA-driven prefrontal cortex neurons", Cerebral
// Cortex
// *********************************************************************
//
// (c) 2006 Daniel Durstewitz

objref IBnet[Npc*Ncol]
objref INnet[Nin*Ncol]

objref randn
randn=new Random(1)

for i=0,Npc*Ncol-1 {
    IBnet[i]=new IBcell()
    IBnet[i].dend.gNMDAcbar_nmdac=randn.normal(gNMDAc_avgPC,gNMDAc_stdPC^2)
    if (IBnet[i].dend.gNMDAcbar_nmdac<0) IBnet[i].dend.gNMDAcbar_nmdac=0

    y=IBnet[i].soma.gHVAbar_HVA
    IBnet[i].soma.gHVAbar_HVA=randn.normal(y,(y*gHVAstd)^2)
    if (IBnet[i].soma.gHVAbar_HVA<0) IBnet[i].soma.gHVAbar_HVA=0
    y=IBnet[i].soma.gKcbar_Kc
    IBnet[i].soma.gKcbar_Kc=randn.normal(y,(y*gCstd)^2)
    if (IBnet[i].soma.gKcbar_Kc<0) IBnet[i].soma.gKcbar_Kc=0
    y=IBnet[i].soma.gKsbar_Ks
    IBnet[i].soma.gKsbar_Ks=randn.normal(y,(y*gKsstd)^2)
    if (IBnet[i].soma.gKsbar_Ks<0) IBnet[i].soma.gKsbar_Ks=0
    y=IBnet[i].soma.gNapbar_NapDA
    IBnet[i].soma.gNapbar_NapDA=randn.normal(y,(y*gNapstd)^2)
    if (IBnet[i].soma.gNapbar_NapDA<0) IBnet[i].soma.gNapbar_NapDA=0

    y=IBnet[i].dend.gHVAbar_HVA
    IBnet[i].dend.gHVAbar_HVA=randn.normal(y,(y*gHVAstd)^2)
    if (IBnet[i].dend.gHVAbar_HVA<0) IBnet[i].dend.gHVAbar_HVA=0
    y=IBnet[i].dend.gKcbar_Kc
    IBnet[i].dend.gKcbar_Kc=randn.normal(y,(y*gCstd)^2)
    if (IBnet[i].dend.gKcbar_Kc<0) IBnet[i].dend.gKcbar_Kc=0
    y=IBnet[i].dend.gKsbar_Ks
    IBnet[i].dend.gKsbar_Ks=randn.normal(y,(y*gKsstd)^2)
    if (IBnet[i].dend.gKsbar_Ks<0) IBnet[i].dend.gKsbar_Ks=0
    y=IBnet[i].dend.gNapbar_NapDA
    IBnet[i].dend.gNapbar_NapDA=randn.normal(y,(y*gNapstd)^2)
    if (IBnet[i].dend.gNapbar_NapDA<0) IBnet[i].dend.gNapbar_NapDA=0

    SFmorph=randn.normal(1.0,MorphStd^2)
    if (SFmorph<0.5) SFmorph=0.5
    if (SFmorph>2.0) SFmorph=2.0
    IBnet[i].soma.diam=SFmorph*IBnet[i].soma.diam
    IBnet[i].soma.L=SFmorph*IBnet[i].soma.L
    IBnet[i].dend.diam=SFmorph*IBnet[i].dend.diam
    IBnet[i].dend.L=SFmorph*IBnet[i].dend.L
}

for i=0,Nin*Ncol-1 {
    INnet[i]=new INcell()
    INnet[i].soma.gNMDAcbar_nmdac=randn.normal(gNMDAc_avgIN,gNMDAc_stdIN^2)
    if (INnet[i].soma.gNMDAcbar_nmdac<0) INnet[i].soma.gNMDAcbar_nmdac=0 

    SFmorph=randn.normal(1.0,MorphStd^2)
    if (SFmorph<0.5) SFmorph=0.5
    if (SFmorph>2.0) SFmorph=2.0
    INnet[i].soma.diam=SFmorph*INnet[i].soma.diam
    INnet[i].soma.L=SFmorph*INnet[i].soma.L
}


objref IBasyn[Npc*Ncol]
objref IBnsyn[Npc*Ncol]
objref IBg0syn[Npc*Ncol]
objref IBg1syn[Npc*Ncol]

objref INasyn[Nin*Ncol]
objref INnsyn[Nin*Ncol]
objref INgsyn[Nin*Ncol]

for i=0,Npc*Ncol-1 {
    IBnet[i].dend IBasyn[i]=new ampa(.5)
    IBnet[i].dend IBnsyn[i]=new nmda(.5)
    IBnet[i].dend IBg1syn[i]=new gaba(.5)
    IBnet[i].soma IBg0syn[i]=new gaba(.5)

    IBasyn[i].gAMPAmax=gAMPAmaxPC
    IBnsyn[i].gNMDAmax=gNMDAmaxPC
    IBg0syn[i].gGABAmax=gGABAmaxPC
    IBg1syn[i].gGABAmax=gGABAmaxPC

    IBasyn[i].tauD=PCPCtauD
    IBasyn[i].tauF=PCPCtauF
    IBasyn[i].util=PCPCutil

    IBnsyn[i].tauD=PCPCtauD
    IBnsyn[i].tauF=PCPCtauF
    IBnsyn[i].util=PCPCutil

    IBg0syn[i].tauD=INPCtauD
    IBg0syn[i].tauF=INPCtauF
    IBg0syn[i].util=INPCutil

    IBg1syn[i].tauD=INPCtauD
    IBg1syn[i].tauF=INPCtauF
    IBg1syn[i].util=INPCutil
}

for i=0,Nin*Ncol-1 {
    INnet[i].soma INasyn[i]=new ampa(.5)
    INnet[i].soma INnsyn[i]=new nmda(.5)
    INnet[i].soma INgsyn[i]=new gaba(.5)

    INasyn[i].gAMPAmax=gAMPAmaxIN
    INnsyn[i].gNMDAmax=gNMDAmaxIN
    INgsyn[i].gGABAmax=gGABAmaxIN

    INasyn[i].tauD=PCINtauD
    INasyn[i].tauF=PCINtauF
    INasyn[i].util=PCINutil

    INnsyn[i].tauD=PCINtauD
    INnsyn[i].tauF=PCINtauF
    INnsyn[i].util=PCINutil

    INgsyn[i].tauD=ININtauD
    INgsyn[i].tauF=ININtauF
    INgsyn[i].util=ININutil
}


// PC->PC connections

objref PCPCconA[Npc*Ncol][Npc*Ncol]
objref PCPCconN[Npc*Ncol][Npc*Ncol]
objref ConPCPC
ConPCPC = new Matrix(Npc*Ncol,Npc*Ncol)
for i=0,Npc*Ncol-1 {
    for j=0,Npc*Ncol-1 {
	q=randn.uniform(0,1)
	if (int(i/Npc)==int(j/Npc)) { p=pconPPwc } else { p=pconPPbc }
	ConPCPC.x[i][j]=-100
	if (p>q) {
	   wgt=randn.normal(wPPavg,wPPstd^2)
	   if (wgt<0) wgt=0
	   IBnet[i].soma PCPCconA[i][j]=new NetCon(&v(.5),IBasyn[j],thPC,delPC,wgt)
	   IBnet[i].soma PCPCconN[i][j]=new NetCon(&v(.5),IBnsyn[j],thPC,delPC,wgt)
	   ConPCPC.x[i][j]=wgt
	   }
    }
}

// IN->IN connections

objref ININconG[Nin*Ncol][Nin*Ncol]
objref ConININ
ConININ = new Matrix(Nin*Ncol,Nin*Ncol)
for i=0,Nin*Ncol-1 {
    for j=0,Nin*Ncol-1 {
	q=randn.uniform(0,1)
	if (int(i/Nin)==int(j/Nin)) { p=pconIIwc } else { p=pconIIbc }
	ConININ.x[i][j]=-100
	if (p>q) {
	   wgt=randn.normal(wIIavg,wIIstd^2)
	   if (wgt<0) wgt=0
	   INnet[i].soma ININconG[i][j]=new NetCon(&v(.5),INgsyn[j],thIN,delIN,wgt)
	   ConININ.x[i][j]=wgt
	   }
    }
}

// PC->IN connections

objref PCINconA[Npc*Ncol][Nin*Ncol]
objref PCINconN[Npc*Ncol][Nin*Ncol]
objref ConPCIN
ConPCIN = new Matrix(Npc*Ncol,Nin*Ncol)
for i=0,Npc*Ncol-1 {
    for j=0,Nin*Ncol-1 {
	q=randn.uniform(0,1)
	if (int(i/Npc)==int(j/Nin)) { p=pconPIwc } else { p=pconPIbc }
	ConPCIN.x[i][j]=-100
	if (p>q) {
	   wgt=randn.normal(wPIavg,wPIstd^2)
	   if (wgt<0) wgt=0
	   IBnet[i].soma PCINconA[i][j]=new NetCon(&v(.5),INasyn[j],thPC,delPC,wgt)
	   IBnet[i].soma PCINconN[i][j]=new NetCon(&v(.5),INnsyn[j],thPC,delPC,wgt)
	   ConPCIN.x[i][j]=wgt
	   }
    }
}

// IN->PC connections

objref INPCconG0[Nin*Ncol][Npc*Ncol]
objref INPCconG1[Nin*Ncol][Npc*Ncol]
objref ConINPC
ConINPC = new Matrix(Nin*Ncol,Npc*Ncol)
for i=0,Nin*Ncol-1 {
    for j=0,Npc*Ncol-1 {
	q=randn.uniform(0,1)
	if (int(i/Nin)==int(j/Npc)) { p=pconIPwc } else { p=pconIPbc }
	ConINPC.x[i][j]=-100
	if (p>q) {
	   wgt=randn.normal(wIPavg,wIPstd^2)
	   if (wgt<0) wgt=0
	   INnet[i].soma INPCconG0[i][j]=new NetCon(&v(.5),IBg0syn[j],thIN,delIN,wgt)
	   INnet[i].soma INPCconG1[i][j]=new NetCon(&v(.5),IBg1syn[j],thIN,delIN,wgt)
	   ConINPC.x[i][j]=wgt
	   }
    }
}


objref fpPar
fpPar=new File()
func StoreNetPar() {
     strdef fnp
     sprint(fnp,"out/NetPar%d.par",$1)
     fpPar.wopen(fnp)
     for (i=0;i<Npc*Ncol;i=i+1) {
	  fpPar.printf("%d %10.6lf %10.6lf %10.8lf %10.8lf %10.8lf %10.8lf\n",i,IBnet[i].soma.L,IBnet[i].soma.diam,IBnet[i].soma.gNapbar_NapDA,IBnet[i].soma.gKsbar_Ks,IBnet[i].soma.gHVAbar_HVA,IBnet[i].soma.gKcbar_Kc)
	  fpPar.printf("%d %10.6lf %10.6lf %10.8lf %10.8lf %10.8lf %10.8lf %10.8lf\n",i,IBnet[i].dend.L,IBnet[i].dend.diam,IBnet[i].dend.gNMDAcbar_nmdac,IBnet[i].dend.gNapbar_NapDA,IBnet[i].dend.gKsbar_Ks,IBnet[i].dend.gHVAbar_HVA,IBnet[i].dend.gKcbar_Kc)
	  }
     fpPar.printf("\n")
     for i=0,Nin*Ncol-1 {
	  fpPar.printf("%d %10.6lf %10.6lf %10.8lf\n",i,INnet[i].soma.L,INnet[i].soma.diam,INnet[i].soma.gNMDAcbar_nmdac)
	  }
     fpPar.printf("\n")
     for i=0,Npc*Ncol-1 {
	 for j=0,Npc*Ncol-1 {
	     fpPar.printf("PC%d PC%d %f\n",i,j,ConPCPC.x[i][j])
	     } }
     fpPar.printf("\n")
     for i=0,Nin*Ncol-1 {
	 for j=0,Nin*Ncol-1 {
	     fpPar.printf("IN%d IN%d %f\n",i,j,ConININ.x[i][j])
	     } }
     fpPar.printf("\n")
     for i=0,Npc*Ncol-1 {
	 for j=0,Nin*Ncol-1 {
	     fpPar.printf("PC%d IN%d %f\n",i,j,ConPCIN.x[i][j])
	     } }
     fpPar.printf("\n")
     for i=0,Nin*Ncol-1 {
	 for j=0,Npc*Ncol-1 {
	     fpPar.printf("IN%d PC%d %f\n",i,j,ConINPC.x[i][j])
	     } }
     fpPar.close()
     return i
}