AP back-prop. explains threshold variability and rapid rise (McCormick et al. 2007, Yu et al. 2008)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:135839
This simple axon-soma model explained how the rapid rising phase in the somatic spike is derived from the propagated axon initiated spike, and how the somatic spike threshold variance is affected by spike propagation.
Reference:
1 . McCormick DA, Shu Y, Yu Y (2007) Neurophysiology: Hodgkin and Huxley model--still standing? Nature 445:E1-2; discussion E2-3 [PubMed]
2 . Yu Y, Shu Y, McCormick DA (2008) Cortical action potential backpropagation explains spike threshold variability and rapid-onset kinetics. J Neurosci 28:7260-72 [PubMed]
Citations  Citation Browser
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell; Axon;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex L5/6 pyramidal GLU cell; Neocortex L2/3 pyramidal GLU cell;
Channel(s): I Na,t; I L high threshold; I T low threshold; I A; I K; I M; I h; I K,Ca; I_AHP;
Gap Junctions:
Receptor(s): GabaA; NMDA;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Action Potential Initiation; Detailed Neuronal Models;
Implementer(s):
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; Neocortex L2/3 pyramidal GLU cell; GabaA; NMDA; I Na,t; I L high threshold; I T low threshold; I A; I K; I M; I h; I K,Ca; I_AHP;
/
McCormickEtAl2007YuEtAl2008
readme.txt
ca.mod *
cad.mod *
caL3d.mod *
capump.mod
gabaa5.mod *
Gfluct.mod *
ia.mod *
iahp.mod *
iahp2.mod *
ih.mod
im.mod *
kca.mod *
km.mod *
kv.mod *
na.mod *
NMDA_Mg.mod *
nmda5.mod *
release.mod *
for_plot_spike.m
mosinit.hoc
neuron_soma.dat
Rapid_rising_somatic_spike_soma_axon.hoc
                            
/*
for the paper:
Yu Y.G., Shu Y., Duque A., Haider B., and McCormick D.A.                                                                
Cortical Action Potential Back-propagation Explains Spike Threshold Variability and Rapid-Onset Kinetics.                                  
Journal of Neuroscience, 28: 7260-7272, (2008).

McCormick D.A., Shu Y., and Yu Y.G.     
Neurophysiology: Hodgkin and Huxley model - still standing? 
Nature. 445: E1-E2, (2007).  

Create a single cell containing a dendrite, soma, an axon with 60 micrometer and a axon bleb
   to investigate generation of spike kink at soma
   As observed in experiment, spike usually initiated at the axon site 40~70 micrometer away from soma.
   There is a rapid rising phase in somatic spike, due to the initial segment traveling spike.
*/

load_file("nrngui.hoc")

// --------------------------------------------------------------
// redefine some things in stdrun.hoc
// --------------------------------------------------------------
objref st, st1

tstart = 0
tstop = 400
dt = 0.01/1
steps_per_ms = 1/dt

// Create the neuron
rm = 30000
v_init    = -70
celsius   = 37
Ek = -80   //-90 might affect the axon spike phase slope value low, and less noisy, increase to be -85?
           //   maybe not, still need check
Ena = 60
ra = 150  //the larger, the soma kink slope large is
c_m = 0.75 // the optimal value, both increase and decrease will decrease slope value
           //however, small C value will have high dv/dt value
xn = 1
gna = 8000 //7500
gk = 1600 //1800
ndend=1  // increase this will increase kink slope
//create dend[ndend], soma, axon
create dend, soma, axon, bleb

gkm = .3// .3   //.3~ 0.5
gca = .3//.3   //.3~ 0.5
gkca = .3// 3  //.3~ 0.5

gca_soma = gca
gkm_soma = gkm
gkca_soma = gkca


  dend {
         L=3000   //there some optimal length make stronger kink?
         nseg=L/50    //don't why increase or decrease nseg will decrease slope
         diam = 5    //sure this is also optimal value; increase this strenth the kink and biphase
          }
                
soma {
    L=30         //increase size make stronger kink
    nseg=L/5
    diam = 20
}

axon {
    L=50
    nseg=L/5
    //diam=1
//    diam(0:0.1) = 2:1 // weeken the biphase, but looks closer to the real data
//    diam(0.1:1) = 1:1 // weeken the biphase, but looks closer to the real data
    diam=1
}


bleb {
    nseg=1
    L=5                 //remove the bleb doesn't changing sth much except increase axon spike 
                        // phase slope from 2.5 to 4---which is good!
    diam = 5
}

soma connect dend(0), 0
soma connect axon(0), 1
axon connect bleb(0), 1

//   connect dend(1), soma(0)
//   connect axon(0), soma(1)
//   connect bleb(0), axon(1)

proc init_cell() {
      forall {
              insert pas
              Ra = ra
              cm = c_m
              g_pas = 1/rm
              e_pas = v_init
              }
              bleb g_pas = 1/rm // 5/rm
            axon cm=c_m*0.75
            soma cm=c_m
            bleb cm = c_m*0.75

      forall insert na             
             soma.gbar_na = 0.1*gna  //750 //gna/8 // increase this will increase dv/dt amplitude, but weak kink value
             axon.gbar_na = gna //7500
             bleb.gbar_na = gna/3 //3000 //gna/3
             dend.gbar_na = 20 //100 //10 //increase this will make cell has spontaneous spikes.
      
      forall insert kv
             soma.gbar_kv = gk/5 //250 //gk/2 // increase this will increase dv/dt amplitude and weak biphase
             axon.gbar_kv = gk
              bleb.gbar_kv = gk/3 //gk/2
             dend.gbar_kv=10
             
           forall {
            insert km    gbar_km  = 0 //gkm
	    insert kca   gbar_kca = 0 //gkca
    	    insert ca    gbar_ca = 0 //gca
    	    insert cad
             }
             axon gbar_km=0
             bleb gbar_km=0
             
             axon gbar_kca=0
             bleb gbar_kca=0
             
             axon gbar_ca=0
             bleb gbar_ca=0
              
      forall if(ismembrane("ca_ion")) {
               eca = 140
               ion_style("ca_ion",0,1,0,0,0)
               vshift_ca = 0
  }
             
   
      forall if(ismembrane("k_ion")) ek = Ek
      forall if(ismembrane("na_ion")) {
                ena = Ena
                // seems to be necessary for 3d cells to shift Na kinetics -5 mV
                vshift_na = -6 //-5
                                      }
   finitialize(v_init)
  if (cvode.active()) {
    cvode.re_init()
  } else {
    fcurrent()
  }
  frecord_init()    
}             
                      
init_cell()
nrnmainmenu()
nrncontrolmenu()

access soma
proc newplot() { local wd,ht
    graphItem = new Graph(0)
   wd=300 ht=200
    graphItem.save_name("graphList[0].")
    graphList[0].append(graphItem)
   // graphItem.view(100,-1,106,90,300,200,wd,ht)
   graphItem.view(0,-80,tstop,140,300,200,wd,ht)
  }

proc newplot1() { local wd,ht
    graphItem = new Graph(0)
   wd=300 ht=200
    graphItem.save_name("graphList[0].")
    graphList[0].append(graphItem)
   graphItem.view(0,-3.5,tstop,4,300,200,wd,ht)
  }

newplot1()
graphItem.addvar("soma.ina(0.5)",1,1)
graphItem.addvar("axon.ina(0.9)",2,1)
//graphItem.addvar("bleb.ina(0.5)",3,1)


newplot1()
graphItem.addvar("soma.i_cap(.5)",1,1)
graphItem.addvar("axon.i_cap(.9)",2,1)
//graphItem.addvar("bleb.i_cap(.5)",3,1)
graphItem.addvar("soma.ina(.5)",5,1)
graphItem.addvar("axon.ina(.9)",6,1)

objectvar scene_vector_[14]
objectvar save_window_, rvp_
save_window_ = new Graph(0)
save_window_.size(-100,200,-80,40)
scene_vector_[5] = save_window_
{save_window_.view(-100, -80, 200, 120, 33, 410, 300, 200)}
flush_list.append(save_window_)
save_window_.save_name("flush_list.")
objectvar rvp_
//rvp_ = new RangeVarPlot("gbar_na")
//rvp_ = new RangeVarPlot("ina")
rvp_ = new RangeVarPlot("v")
dend rvp_.begin(0)
//bleb rvp_.end(1)
//soma rvp_.begin(0)
//bleb rvp_.end(1)
save_window_.addobject(rvp_, 2, 1, 0.8, 0.9)  //addobject: Adds the RangeVarPlot to the list of items to be plotted on flush

newplot()
graphItem.addvar("soma.v(.5)",1,1)
graphItem.addvar("axon.v(.9)",2,1)
//graphItem.addvar("bleb.v(.5)",3,1)

/*
//------controlled by Gluct.mod---------------------------------------------------------------
access soma

objref fl
fl = new Gfluct2(0.5)


fl.g_e0 = 0.0012		// 5 times larger
fl.g_i0 = 0.0012*5

//fl.std_e = 0.012*0.8		// 4 times larger
//fl.std_i = 0.0264*0.8
fl.std_e = 0 //0.012/3		// 4 times larger
fl.std_i = 0 //0.0264/3
*/

// --------------------------------------------------------------
// stimulus
// --------------------------------------------------------------

  st=new IClamp(.5)
  st.dur = 5000
  st.del = 5
  st.amp = .0

  st1=new IClamp(.5)
  st1.dur = 5000
  st1.del = 5
  st1.amp = .0
  
proc set_stim() {
  st.loc($1)  st.amp = $2   st.del = $3   st.dur = $4
}

proc set_stim1() {
  st1.loc($1)  st1.amp = $2   st1.del = $3   st1.dur = $4
}

objref rect, recv, rec_somaic, rec_axonv, rec_blebv
objref rec_axon1, rec_axon2, rec_axon3, rec_axon4, rec_axon5 , rec_axon6, rec_axon7, rec_axon8, rec_axon9, rec_axon10 
objref rec_somaic, rec_axonic, rec_blebic, rec_somaina, rec_axonina//used to record values of variables
objref rec_somaik, recaxonik, recblebina, rec_blebik
objref csna1, cana1, cana2, cana3, cana4, cana5, cana6, cana7, cana8, cana9, cana10
rect = new Vector()
recv = new Vector()
rec_axonv=new Vector()
rec_axon1=new Vector()
rec_axon2=new Vector()
rec_axon3=new Vector()
rec_axon4=new Vector()
rec_axon5=new Vector()
rec_axon6=new Vector()
rec_axon7=new Vector()
rec_axon8=new Vector()
rec_axon9=new Vector()
rec_axon10=new Vector()

rec_somaic=new Vector()
rec_axonic=new Vector()
rec_somaina=new Vector()
rec_axonina=new Vector()
rec_somaik=new Vector()
recaxonik=new Vector()


objref savdata //used for saving file
savdata = new File()  //savdata is a file pointer
savdata.wopen("neuron_soma.dat")  //open a file with a defined name to save data

//objref savdata1 //used for saving file
//savdata1 = new File()  //savdata is a file pointer
//savdata1.wopen("ina.dat")  //open a file with a defined name to save data

soma set_stim1(.5,0,0,50000)
proc soma_inj() {
//soma set_stim(0.5,0.,50,200)
soma set_stim(0.5,0.1,50,250)

//recv.record(&axon.v(0))   //put value of soma.v to recv
recv.record(&soma.v(0.5))   //put value of soma.v to recv
rect.record(&t)             //put value of t to rect 
rec_axon1.record(&axon.v(0.1))
rec_axon2.record(&axon.v(0.2))
rec_axon3.record(&axon.v(0.3))
rec_axon4.record(&axon.v(0.4))
rec_axon5.record(&axon.v(0.5))
rec_axon6.record(&axon.v(0.6))
rec_axon7.record(&axon.v(0.7))
rec_axon8.record(&axon.v(0.8))
rec_axon9.record(&axon.v(0.9))
rec_axon10.record(&axon.v(1))

rec_somaic.record(&soma.i_cap(0.5))
rec_axonic.record(&axon.i_cap(0.9))
rec_somaina.record(&soma.ina(0.5))
rec_axonina.record(&axon.ina(0.9))
rec_somaik.record(&soma.ik(0.5))
recaxonik.record(&axon.ik(0.9))


run() // this is the right position

for i=0,rect.size()-1 {
savdata.printf("%g %g %g %g %g %g %g %g %g %g %g %g\n", rect.x(i), recv.x(i), rec_axon1.x(i), rec_axon2.x(i), rec_axon3.x(i), rec_axon4.x(i), rec_axon5.x(i), rec_axon6.x(i), rec_axon7.x(i), rec_axon8.x(i), rec_axon9.x(i), rec_axon10.x(i))
//savdata1.printf("%g %g %g %g %g %g %g %g %g\n", rect.x(i), recv.x(i), rec_axonv.x(i),rec_somaic.x(i),rec_axonic.x(i),rec_somaina.x(i),rec_axonina.x(i),rec_somaik.x(i),recaxonik.x(i))
}

savdata.close()
//savdata1.close()
}

xpanel("Stuart & Sakmann")
xvalue("stim amp","st.amp")
xbutton("inject soma","soma_inj()")
xpanel()