Neocort. pyramidal cells subthreshold somatic voltage controls spike propagation (Munro Kopell 2012)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:136309
There is suggestive evidence that pyramidal cell axons in neocortex may be coupled by gap junctions into an ``axonal plexus" capable of generating Very Fast Oscillations (VFOs) with frequencies exceeding 80 Hz. It is not obvious, however, how a pyramidal cell in such a network could control its output when action potentials are free to propagate from the axons of other pyramidal cells into its own axon. We address this problem by means of simulations based on 3D reconstructions of pyramidal cells from rat somatosensory cortex. We show that somatic depolarization enables propagation via gap junctions into the initial segment and main axon, while somatic hyperpolarization disables it. We show further that somatic voltage cannot effectively control action potential propagation through gap junctions on minor collaterals; action potentials may therefore propagate freely from such collaterals regardless of somatic voltage. In previous work, VFOs are all but abolished during the hyperpolarization phase of slow-oscillations induced by anesthesia in vivo. This finding constrains the density of gap junctions on collaterals in our model and suggests that axonal sprouting due to cortical lesions may result in abnormally high gap junction density on collaterals, leading in turn to excessive VFO activity and hence to epilepsy via kindling.
Reference:
1 . Munro E, Kopell N (2012) Subthreshold somatic voltage in neocortical pyramidal cells can control whether spikes propagate from the axonal plexus to axon terminals: a model study. J Neurophysiol 107:2833-52 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network; Neuron or other electrically excitable cell; Axon;
Brain Region(s)/Organism: Neocortex;
Cell Type(s): Neocortex L5/6 pyramidal GLU cell; Neocortex U1 L2/6 pyramidal intratelencephalic GLU cell;
Channel(s): I Na,t; I K; I Sodium; I Potassium;
Gap Junctions: Gap junctions;
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; MATLAB;
Model Concept(s): Oscillations; Detailed Neuronal Models; Axonal Action Potentials; Epilepsy;
Implementer(s): Munro, Erin [ecmun at math.bu.edu];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; Neocortex U1 L2/6 pyramidal intratelencephalic GLU cell; I Na,t; I K; I Sodium; I Potassium;
/
Munro_Kopell_corticalcontrol
NEURON
cell_geoms
run_files
readme.txt
extrema.mod
gap.mod
k2_Traub.mod *
ka_Traub.mod *
kdr_Jonas.mod
kdr_Traub.mod
kdr_Yu.mod
naf_Jonas.mod
naf_Traub.mod
naf_Yu.mod
pas_basket.mod
pas_chand.mod
030625DS2.hoc
axon_templates.hoc
C040896A-P3.hoc
C040896A-P3axgeom.hoc
C230797B-P4.hoc
C270999B-P2axgeom.hoc
C280199C-P1.hoc
C290500C-P1axgeom.hoc
cell_templates.hoc
expcell_templates.hoc
gap_junction.hoc
gj_propagation_test.ses
junction_stats.hoc
kinetics.hoc
kinetics_wholecell.hoc
mosinit.hoc
propagation_test.ses
PropagationSearch.hoc
simulation_base.hoc
vs-arg_cutoff.hoc
vs-arg_cutoff_Jonas.hoc
vs-expcell_gj.hoc
vs-expcell_gj_gL.hoc
vs-expcell_gj_Jonas.hoc
vs-expcell_gjCC.hoc
vs-expcell_gjISgNa.hoc
vs-expcell_gjsISgNa.hoc
vs-generic_cutoff.hoc
vs-generic_cutoff_Jonas.hoc
                            
begintemplate BranchDistCell
public axon,soma,layer,extstim_site,stim_sr,stim_loc,junction_site,prop_site,IS,stim_length,extstim_sr,extstimrec_loc,connect_branch,connect_subbranch,ratio,s_ratio,ell_c,taper,soma_diam,IS_diam,main_diam,main_length,insertwhole_Traub,insertwhole_modTraub,resetwhole_modTraub,insertwhole_Jonas,resetwhole_Jonas
external tstop,elength,n_cells
// This cell is for experiments involing distance of branch site away from 
// the soma. There is one main axon, and up to 3 branch coming off it.

create soma[1]
create axon[6]

objref this,stim_sr,extstim_sr,vip_secs,main_axon_secs

xopen("kinetics_wholecell.hoc")

proc init(){local i,alpha,gamma
    // kinetics = $1, dx=$2, 
    // branch ratio = $3
    // layer = $4 , can be 2, 4, or 5
    // branch 1 distance in elength = $5
    // branch 2 distance in elength = $6
    // branch 3 distance in elength= $7
    kinetics = $1
    dx = $2
    ratio = $3
    layer = $4
    n_cells = n_cells+1
    
    IS = 0
    main_shaft = 1
    extstim_site = 2
    junction_site = 2 
    prop_site = 5
    
    if(layer==2){ // estimate parameters based on cell reconstructions
        main_diam = 0.6
        IS_diam = 1.2
        s_ratio = 14
        ell_c = 0.015
    }else if(layer==4){
        main_diam = 0.6
        IS_diam = 1.5
        s_ratio = 11.2
        ell_c = 0.015
    }else if(layer==5){
        main_diam = 1.2
        IS_diam = 2
        s_ratio = 11.4
        ell_c = 0.02
    }else{ // use averages for all cells
        print "Invalid layer: Using guessed averages for cell parameters!"
        main_diam = 0.6
        IS_diam = 1.6
        s_ratio = 12.5
        ell_c = 0.015
    }
    /*    main_diam = 0.6
    IS_diam = 1.2
    s_ratio = 13 //21.1641 
    soma_diam = s_ratio*main_diam
    ell_c = 0.0265
    */
    
    soma_diam = s_ratio*IS_diam
    if(kinetics==1){
        main_length = 4
    }else{
        main_length = 8 // electronic length of main shaft
    }
    alpha=((sqrt(s_ratio)-1)/(s_ratio-1))^4/(25^4*100*IS_diam^2)
    gamma=IS_diam^2*(s_ratio-1)^2/4
    taper = sqrt(-gamma/2 + sqrt(alpha^2*gamma^2+4*alpha*ell_c^4)/(2*alpha))
    // calculated from equation (16) in Goldstein & Rall (1974)
    // this is the length from the *generalized* electronic length
    //taper = Lc*25*sqrt(10*main_diam)*(s_ratio-1)/(sqrt(s_ratio)-1)
    access axon[main_shaft]
    
    // set kinetics the fist time to that elength works
    if(kinetics==0){
        insertwhole_Traub()
    }else if(kinetics==1){
	      insertwhole_Jonas(this,IS)
    }else{
        insertwhole_modTraub(this,IS,main_shaft)
        print "axon[IS].gbar_nafTraub = ", axon[IS].gbar_nafTraub
    }
    
    soma{
        pt3dadd(100*(n_cells-1),soma_diam,0,soma_diam)
        pt3dadd(100*(n_cells-1),0,0,soma_diam)
        //diam = soma_diam // take average of experimental somata //23
        //L = soma_diam
    }
    axon[IS]{
        pt3dadd(100*(n_cells-1),0,0,soma_diam) // taken from TypicalCell's geometry
        pt3dadd(100*(n_cells-1),-taper,0,IS_diam)
        pt3dadd(100*(n_cells-1),-40,0,main_diam)
    }	
    axon[main_shaft]{
        pt3dadd(100*(n_cells-1),-40,0,main_diam)
        pt3dadd(100*(n_cells-1),-40 -main_length*elength(main_diam),0,main_diam)
    }
    axon[5].diam = main_diam
    axon[5].L = 4*elength(main_diam)
    
    soma connect axon[IS](0), 1
    axon[IS] connect axon[main_shaft](0), 1
    axon[main_shaft] connect axon[2](0), bdist1/main_length
    if(numarg()>4){
        bdist1 = $5 // distance of 1st branch
        axon[2]{
            if(n_cells==1){
                pt3dadd(0,-40-bdist1*elength(main_diam),0,main_diam/ratio)
                pt3dadd(-4*elength(main_diam/ratio),-40-bdist1*elength(main_diam),0,main_diam/ratio)
            }else if(n_cells==2){
                pt3dadd(100,-40-bdist1*elength(main_diam),0,main_diam/ratio)
                pt3dadd(100+4*elength(main_diam/ratio),-40-bdist1*elength(main_diam),0,main_diam/ratio)
            }
        }
    }else{
        extstim_site = 5
        junction_site = 5
        axon[2].diam=0
        axon[2].L=0
        axon[2]{ delete_section() }
    }
    if(numarg()>5){
	      bdist2 = $6
        axon[main_shaft] connect axon[3](0), bdist2/main_length
        axon[3].diam = main_diam/ratio
        axon[3].L = 4*elength(axon[i].diam)
        if(numarg()>6){
	          bdist3 = $7
            axon[main_shaft] connect axon[4](0), bdist3/main_length
            axon[4].diam = main_diam/ratio
            axon[4].L = 4*elength(axon[i].diam)
        }else{
            axon[4].diam = 0
            axon[4].L = 0
            axon[4]{ delete_section() }
        }
    }else{
        axon[3].diam = 0
        axon[3].L = 0
        axon[3]{ delete_section() }
        axon[4].diam = 0
        axon[4].L = 0
        axon[4]{ delete_section() }
    }
    axon[main_shaft] connect axon[5](0),1
    
    vip_secs = new SectionList()
    main_axon_secs = new SectionList()
    soma{
	      vip_secs.append()
    }
    axon[IS]{
	      vip_secs.subtree()
        main_axon_secs.subtree()
        main_axon_secs.remove()
    }
    
    if(kinetics!=1){
        forsec vip_secs{
            nseg = int(L/dx) + 1
        }
    }else{
        soma.nseg = int(L/dx) + 1
        axon[IS].nseg = int(L/dx) + 1
        forsec main_axon_secs{
            nseg = int(L/(dx*8)) + 1
        }
    }
    
    // insert kinetics again so that pas and pasBasket is set correctly in IS
    if(kinetics==0){
        insertwhole_Traub()
    }else if(kinetics==1){
        insertwhole_Jonas(this,IS)
    }else{
        insertwhole_modTraub(this,IS,main_shaft)
    }
    
    stim_length = 0
    stim_loc = 0
    extstimrec_loc = 0
    choose_stim_site(this,kinetics)
    
    print "tstop = ", tstop   
}

proc connect_branch(){local branch,location,length
    // connect collateral branch at specified location
    branch = $1 // can be 2, 3, or 4
    location = $2 // in elength along main axon
    length = $3 // electronic length of branch
    
    axon[branch] disconnect()
    axon[main_shaft] connect axon[branch](0), location/main_length
    axon[branch]{
	L = length*elength(diam)
        nseg = int(L/dx) + 1
    }
}

proc connect_subbranch(){local branch,location,length
    // connect collateral branch at specified location
    branch = $1 // can be 2, 3, or 4
    subbranch = $2 // can be 3 or 4
    location = $3 // in elength along main branch
    length = $4 // electronic length of subbranch
    
    axon[subbranch] disconnect()
    axon[branch]{ 
	connect axon[subbranch](0), location/(L/elength(diam))
    }	
    axon[subbranch]{
	L = length*elength(diam)
        nseg = int(L/dx) + 1
    }
}

proc choose_stim_site(){local i,avg_diam,totalL,curL,arcl,l1,l2,arcd localobj rvp,sec_list,sn
    // choose the "stimulation site" of the crux of the axon for the cell
    // which is always 1/3 of the electrotonic length away from the crux
    
    totalL = 0.5*axon[extstim_site].L
    if(kinetics==1){
        stim_length = elength(axon[extstim_site].diam)/8
    }else{ // assume Traub or modTraub
        stim_length = elength(axon[extstim_site].diam)/3
    }
    print "axon[extstim_site].diam=", axon[extstim_site].diam, "elength=", elength(axon[extstim_site].diam)
    if(stim_length>totalL-stim_length){
        print "totalL = ", totalL, ", stim_length = ", stim_length, ", extstim_length = ", totalL-stim_length
        return
    }
    
    curL = 0
    axon[extstim_site]{
        if(stim_loc == 0 && L>stim_length){
            stim_loc = stim_length/L
            stim_sr = new SectionRef()
        }
        if(extstimrec_loc == 0 && L>totalL-stim_length){
            extstimrec_loc = (totalL-stim_length)/L
            extstim_sr = new SectionRef()
        }
    }
}

endtemplate BranchDistCell

begintemplate BranchDistCellAlt
public axon,soma,extstim_site,stim_sr,stim_loc,junction_site,prop_site,IS,stim_length,extstim_sr,extstimrec_loc,connect_branch,connect_subbranch,ratio,s_ratio,ell_c,taper,soma_diam,IS_diam,main_diam,main_length,insertwhole_Traub,insertwhole_modTraub,resetwhole_modTraub,insertwhole_Jonas,resetwhole_Jonas
external tstop,elength
// This cell is for experiments involing distance of branch site away from 
// the soma. There is one main axon, and up to 3 branch coming off it.

create soma[1]
create axon[6]

objref this,stim_sr,extstim_sr,vip_secs,main_axon_secs

xopen("kinetics_wholecell.hoc")

proc init(){local i
    kinetics = $1
    dx = $2
    ratio = $3
    s_ratio = $4    
    ell_c = $5
    main_diam = $6
    soma_diam = s_ratio*main_diam
    bdist1 = $7 //distance for first branch
    alpha=((sqrt(s_ratio)-1)/(s_ratio-1))^4/(25^4*100*main_diam^2)
    gamma=main_diam^2*(s_ratio-1)^2/4
    taper = sqrt(-gamma/2 + sqrt(alpha^2*gamma^2+4*alpha*ell_c^4)/(2*alpha))
    // calculated from equation (16) in Goldstein & Rall (1974)
    // this is the length from the *generalized* electronic length
    //taper = Lc*25*sqrt(10*main_diam)*(s_ratio-1)/(sqrt(s_ratio)-1)
    // this assumes you're using Traub kinetics
    if(kinetics==1){
        main_length = 5
    }else{
        main_length = 10
    }
    
    IS = 0
    main_shaft=1
    extstim_site = 2
    junction_site = 2
    prop_site = 5
    access axon[main_shaft]
    
    // set kinetics the fist time to that elength works
    print "kinetics = ", kinetics
    if(kinetics==0){
        insertwhole_Traub()
    }else if(kineticss==1){
	      insertwhole_Jonas(this,IS)
    }else{
        insertwhole_modTraub(this,IS,main_shaft)
    }
    
    soma{
        diam = soma_diam
        L = soma_diam
    }
    axon[IS]{
        pt3dadd(0,0,0,soma_diam) 
        pt3dadd(0,-taper,0,main_diam)
    }	
    axon[main_shaft]{
        pt3dadd(0,-taper,0,main_diam)
        pt3dadd(0,-taper -main_length*elength(main_diam),0,main_diam)
    }
    axon[5].diam = main_diam
    axon[5].L = 2*elength(main_diam)
    for(i=2;i<=4;i=i+1){
        axon[i].diam = main_diam/ratio
        axon[i].L = 4*elength(axon[i].diam)
    }
    
    soma connect axon[IS](0), 1
    axon[IS] connect axon[main_shaft](0), 1
    axon[main_shaft] connect axon[2](0), bdist1/main_length
    if(numarg()>7){
        bdist2 = $8
        axon[main_shaft] connect axon[3](0), bdist2/main_length
        if(numarg()>8){
            bdist3 = $9
            axon[main_shaft] connect axon[4](0), bdist3/main_length
        }
    }
    axon[main_shaft] connect axon[5](0),1
    
    vip_secs = new SectionList()
    main_axon_secs = new SectionList()
    soma{
	      vip_secs.append()
    }
    axon[IS]{
	      vip_secs.subtree()
        main_axon_secs.subtree()
        main_axon_secs.remove()
    }
    
    if(kinetics != 1){
        forsec vip_secs{
            nseg = int(L/dx) + 1
        }
    }else{
        soma.nseg = int(L/dx) + 1
        axon[IS].nseg = int(L/dx) + 1
        forsec main_axon_secs{
            nseg = int(L/(dx*8)) + 1
        }
    }

    // insert kinetics again so that pas and pasBasket is set correctly in IS
    if(kinetics==0){
        insertwhole_Traub()
    }else if(kinetics==1){
        insertwhole_Jonas(this,IS)
    }else{
        insertwhole_modTraub(this,IS,main_shaft)
    }
    
    stim_length = 0
    stim_loc = 0
    extstimrec_loc = 0
    choose_stim_site(this,kinetics)
    print "axon[junction_site]=", axon[junction_site].diam
    
}

proc connect_branch(){local branch,location,length
    // connect collateral branch at specified location
    branch = $1 // can be 2, 3, or 4
    location = $2 // in elength along main axon
    length = $3 // elength of branch
    
    axon[branch] disconnect()
    axon[main_shaft] connect axon[branch](0), location/main_length
    axon[branch]{
	L = length*elength(diam)
        nseg = int(L/dx) + 1
    }
}

proc connect_subbranch(){local branch,location,length
    // connect collateral branch at specified location
    branch = $1 // can be 2, 3, or 4
    subbranch = $2 // can be 3 or 4
    location = $3 // in elength along main branch
    length = $4 // electronic length of subbranch
    
    axon[subbranch] disconnect()
    axon[branch]{ 
	connect axon[subbranch](0), location/(L/elength(diam))
    }	
    axon[subbranch]{
	L = length*elength(diam)
        nseg = int(L/dx) + 1
    }
}

proc choose_stim_site(){local i,avg_diam,totalL,curL,arcl,l1,l2,arcd localobj cell,rvp,sec_list,sn
    // choose the "stimulation site" of the crux of the axon for the cell
    // which is always 1/4 of the electrotonic length away from the crux
    cell = $o1
    kinetics = $2
    
    totalL = 0.5*cell.axon[cell.extstim_site].L
    if(kinetics==1){
        cell.stim_length = elength(cell.axon[cell.extstim_site].diam)/3
    }else{
        cell.stim_length = elength(cell.axon[cell.extstim_site].diam)/3
    }
    print "elength=", elength(cell.axon[cell.extstim_site].diam)
    if(cell.stim_length>totalL-cell.stim_length){
        print "totalL = ", totalL, ", stim_length = ", cell.stim_length, ", extstim_length = ", totalL-cell.stim_length
        return
    }
    
    curL = 0
    cell.axon[cell.extstim_site]{
        if(cell.stim_loc == 0 && L>cell.stim_length){
            cell.stim_loc = cell.stim_length/L
            cell.stim_sr = new SectionRef()
        }
        if(cell.extstimrec_loc == 0 && L>totalL-cell.stim_length){
            cell.extstimrec_loc = (totalL-cell.stim_length)/L
            cell.extstim_sr = new SectionRef()
        }
    }
}

endtemplate BranchDistCellAlt

Loading data, please wait...