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
                            
obfunc path_list(){local start_loc,end_loc localobj rvp,start_sref,end_sref,sec_list
    // give a list of all sections between start_sref and at end_loc 
    // of end_sref
    start_sref = $o1
    start_loc = $2
    end_sref = $o3
    end_loc = $4
    rvp = new RangeVarPlot("v")
    
    // start_sref and end_sref sections are added no matter what anyway
    start_sref.sec{ rvp.begin(0.5) }
    end_sref.sec{ rvp.end(0.5) }
    sec_list = new SectionList()
    rvp.list(sec_list)
    
    // now figure out whether start_sref and end_sref sections 
    // should be there
    start_sref.sec{ distance() }
    end_sref.sec{
	if(distance(1)>distance(0) && end_loc==0){
	    sec_list.remove()
	}else if(distance(0)>distance(1) && end_loc==1){
	    sec_list.remove()
	}
    }
    end_sref.sec{ distance() }
    start_sref.sec{
	if(distance(1)>distance(0) && start_loc==0){
	    sec_list.remove()
	}else if(distance(0)>distance(1) && start_loc==1){
	    sec_list.remove()
	}
    }
    return sec_list
}    

func soma_dist(){local dist localobj cell,sref
    // give the distance from top of sref to the soma in um
    cell = $o1
    sref = $o2
    cell.axon[cell.IS]{ distance() }
    sref.sec{ dist = distance(0) }
    return dist
}

func el_soma_dist(){local dist,end_loc,ss localobj cell,IS_sref,sref,sec_list
    // give the electrotonic distance from end_loc in sref to the soma
    cell = $o1
    sref = $o2
    end_loc = $3
    
    dist = 0
    ss = 0
    cell.axon[cell.IS]{ 
	IS_sref = new SectionRef() 
	if(sref.is_cas()){ ss = 1 } // sref is same section as IS
    }
    if(ss==1){
	IS_sref.sec{
	    distance()
	    dist = distance(end_loc)/elength(diam)
	}
    }else{
	sec_list = path_list(IS_sref,0,sref,end_loc)
	forsec sec_list{
	    dist = dist + L/elength(diam)
	}
    }
    return dist
}

func el_junction_dist(){local dist,end_loc,ss localobj cell,jref,sref,sec_list
    // give the electrotonic distance from end_loc in sref to junction_site
    // assumes end_loc is either 0 or 1
    cell = $o1
    sref = $o2
    end_loc = $3
    
    dist = 0
    ss = 0
    cell.axon[cell.junction_site]{ 
	jref = new SectionRef() 
	if(sref.is_cas()){ ss = 1 }
    }
    
    if(ss==1){
	jref.sec{
	    distance()
	    dist = distance(end_loc)/elength(diam)
	}
    }else{
	sec_list = path_list(jref,0,sref,end_loc)
        
	forsec sec_list{
	    dist = dist + L/elength(diam)
	}
    }
    return dist
}


func junction_gr(){local i, ratio localobj cell,sref, pref
    // get geometric ratio of junction_site with parent in axon
    ratio = 0
    cell = $o1
    
    cell.axon[cell.junction_site]{
        sref = new SectionRef()
    }
    sref.parent{
        pref = new SectionRef()
    }
    
    for(i=0;i<pref.nchild;i=i+1){
        pref.child[i]{
            if(!sref.is_cas()){
                ratio = gr(sref.sec.diam,diam,pref.sec.diam)
            }
        }
    }
    
    return ratio
}

func junction_ratio(){local ratio localobj cell,sref
    //get plain ratio between junction collateral and parent compartment
    ratio = 0
    cell = $o1
    
    cell.axon[cell.junction_site]{
        sref = new SectionRef()
    }
    sref.parent{
        ratio = diam/sref.sec.diam
    }
    
    return ratio
}

strdef ISname

func n_branch_points(){local i,el,total localobj cell,sref,pref,cref,prev_name
    // get how many branch points are 0.5 elengths from junction_site
    // junction site doesn't count as a branch point
    total = 0
    cell = $o1
    sprint(ISname,".*axon[%d]",cell.IS)
    prev_name = new String()
    
    cell.axon[cell.junction_site]{
        sref = new SectionRef()
    }
    
    sref.parent{
        el = elength(diam)
        //print secname(), L, el/2, 2*L/el
        pref = new SectionRef()
        if(!issection(ISname) && L<el/2){
	    sref.sec{ prev_name.s = secname() }
	    //print prev_name.s, secname(), " ", L/el, gr_up(pref)
	    total = total + 1
            total = total + count_bp_up(pref,2*L/el)
        }
    }
    
    for(i=0;i<pref.nchild;i=i+1){
        pref.child[i]{
            el = elength(diam)
            //print secname(), L, el/2, 2*L/el
            cref = new SectionRef()
            if(L<el/2 && cref.nchild>1){
		pref.sec{ prev_name.s = secname() }
		//print prev_name.s, secname(), " ", L/el, gr_down(cref)
                total = total + 1
                total = total + count_bp_down(cref,2*L/el)
            }
        }
    }        
    
    return total
}

func count_bp_up(){local i,prevL,el,total localobj sref,pref,oref,prev_name
    // count branch points up the parent branch
    sref = $o1
    prevL = $2
    total = 0
    prev_name = new String()
    
    sref.parent{
        el = elength(diam)
        //print secname(), L, el/2, prevL+2*L/el
        pref = new SectionRef()
        if(!issection(ISname) && prevL+2*L/el<1){
	    sref.sec{ prev_name.s = secname() }
	    //print prev_name.s, secname(), " ", L/el, gr_up(pref)
            total = total + 1
            total = total + count_bp_up(pref,prevL+2*L/el)
        }
    }
    
    for(i=0;i<pref.nchild;i=i+1){
        pref.child[i]{
            el = elength(diam)
            //print secname(), L, el/2, prevL+2*L/el
            oref = new SectionRef()
            if(!sref.is_cas() && prevL+2*L/el<1 && oref.nchild>1){
		//pref.sec{ prev_name.s = secname() }
		print prev_name.s, secname(), " ", L/el, gr_down(oref)
                total = total + 1
                total = total + count_bp_down(oref,prevL+2*L/el)
            }
        }
    }
    
    return total
}

func count_bp_down(){local i,prevL,el,total localobj sref,cref,prev_name
    // count branch point down the current branch
    sref = $o1
    prevL = $2
    total = 0
    prev_name = new String()
    
    for(i=0;i<sref.nchild;i=i+1){
        sref.child[i]{
            el = elength(diam)
            //print secname(), L, el/2, prevL+2*L/el
            cref = new SectionRef()
            if(prevL+2*L/el<1 && cref.nchild>1){
		sref.sec{ prev_name.s = secname() }
		//print prev_name.s, secname(), " ", L/el, gr_down(cref)
                total = total + 1
                total = total + count_bp_down(cref,prevL+2*L/el)
            }
        }
    }
    
    return total
}

func gr_up(){local i, ratio localobj sref, pref
    // get geometric ratio of referenced site with parent in axon
    ratio = 0    
    sref = $o1

    sref.parent{
        pref = new SectionRef()
    }
    
    for(i=0;i<pref.nchild;i=i+1){
        pref.child[i]{
            if(!sref.is_cas()){
                ratio = gr(sref.sec.diam,diam,pref.sec.diam)
            }
        }
    }
    
    return ratio
}

func gr_down(){local i, ratio localobj sref
    // get geometric ratio of referenced site with children in axon
    ratio = 0
    sref = $o1
    
    if(sref.nchild>0){
	ratio = gr(sref.sec.diam,sref.child[0].diam,sref.child[1].diam)
    }
    
    return ratio
}

func wa_branch_points(){local i,total,jdist localobj cell,sref,pref,cref
    // get a weighted aver of the branch points that are within 0.5 elengths 
    // from the junction_site. Use weight w=exp(-6*log(2)*x), estimated from
    // Manor et al. (1991)
    // junction site doesn't count as a branch point
    total = 0
    cell = $o1
    sprint(ISname,".*axon[%d]",cell.IS)
    
    cell.axon[cell.junction_site]{
        sref = new SectionRef()
    }
    
    sref.parent{
        pref = new SectionRef()
	jdist = el_junction_dist(cell,pref,0)
        if(!issection(ISname) && jdist<0.5){
	    print secname(), " ", jdist, " adding: ",exp(-6*log(2)*jdist)
            total = total + exp(-6*log(2)*jdist)
            total = total + wa_bp_up(cell,pref)
        }else{ print secname(), " ", jdist, " rejected"}
    }
    
    for(i=0;i<pref.nchild;i=i+1){
        pref.child[i]{
            cref = new SectionRef()
	    jdist = el_junction_dist(cell,cref,1)
            if(!sref.is_cas() && jdist<0.5 && cref.nchild>1){
		print secname(), " ", jdist, " adding: ",exp(-6*log(2)*jdist)
                total = total + exp(-6*log(2)*jdist)
                total = total + wa_bp_down(cell,cref)
            }else{ print secname(), " ", jdist, " rejected"}
        }
    }        
    
    return total
}

func wa_bp_up(){local i,total,jdist localobj cell,sref,pref,oref
    // count branch points up the parent branch
    cell = $o1
    sref = $o2
    total = 0

    sref.parent{
        pref = new SectionRef()
	jdist = el_junction_dist(cell,pref,0)
        if(!issection(ISname) && jdist<0.5){
	    print secname(), " ", jdist, " adding: ",exp(-6*log(2)*jdist)
            total = total + exp(-6*log(2)*jdist)
            total = total + wa_bp_up(cell,pref)
        }else{ print secname(), " ", jdist, " rejected"}
    }

    for(i=0;i<pref.nchild;i=i+1){
        pref.child[i]{
            el = elength(diam)
            oref = new SectionRef()
	    jdist = el_junction_dist(cell,oref,1)
            if(!sref.is_cas() && jdist<0.5 && oref.nchild>1){
		print secname(), " ", jdist, " adding: ",exp(-6*log(2)*jdist)
                total = total + exp(-6*log(2)*jdist)
                total = total + wa_bp_down(cell,oref)
            }else{ print secname(), " ", jdist, " rejected"}
        }
    }

    return total
}

func wa_bp_down(){local i,total,jdist localobj cell,sref,cref
    // count branch point down the current branch
    cell = $o1
    sref = $o2
    total = 0

    for(i=0;i<sref.nchild;i=i+1){
        sref.child[i]{
            cref = new SectionRef()
	    jdist = el_junction_dist(cell,cref,1)
            if(jdist<0.5 && cref.nchild>1){
		print secname(), " ", jdist, " adding: ",exp(-6*log(2)*jdist)
                total = total + exp(-6*log(2)*jdist)
                total = total + wa_bp_down(cell,cref)
            }else{ print secname(), " ", jdist, " rejected"}
        }
    }

    return total
}

proc gr_report(){local j_dist,i localobj cell,pl,eref,jref,sref,pref,cref
    // print report of all branch points and geometric ratios 
    // leading up to junction and after junction within el/2 of junction
    cell = $o1
    sprint(ISname,".*axon[%d]",cell.IS)
    
    cell.axon[cell.extstim_site]{ eref = new SectionRef() }
    cell.axon[cell.junction_site]{ jref = new SectionRef() }
    pl = path_list(eref,0.5,jref,1)
    //pl.printnames()
    
    forsec pl{
	sref = new SectionRef()
	jdist = el_junction_dist(cell,sref,0)
	print secname(), "\t", jdist, "\t", gr_up(sref)
    }
    jref.sec{
	print secname(), "\t", 0, "\t", junction_gr(cell)
    }
    jref.parent{
	pref = new SectionRef()
	jdist = el_junction_dist(cell,pref,0)
	if(!issection(ISname) && jdist<0.5){
	    print secname(), "\t", jdist, "\t", gr_up(pref)
	    grrep_up(cell,pref)
	}//else{ print secname(), " ", jdist, " rejected" }
    }
    for(i=0;i<pref.nchild;i=i+1){
	pref.child[i]{
	    sref = new SectionRef()
	    jdist = el_junction_dist(cell,sref,1)
	    if(!jref.is_cas() && jdist<0.5 && sref.nchild>1){
		print secname(), "\t", jdist, "\t", gr_down(sref)
		grrep_down(cell,sref)
	    }//else{ print secname(), " ", jdist, " rejected" }
	}
    }
}

proc grrep_up(){local i,jdist localobj cell,tref,sref,pref
    // give gr report searching up from sref
    cell = $o1
    tref = $o2
    tref.parent{
	pref = new SectionRef()
	jdist = el_junction_dist(cell,pref,0)
	if(!issection(ISname) && jdist<0.5){
	    print secname(), "\t", jdist, "\t", gr_up(pref)
	    grrep_up(cell,pref)
	}//else{ print secname(), " ", jdist, " rejected" }
    }
    for(i=0;i<pref.nchild;i=i+1){
	pref.child[i]{
	    sref = new SectionRef()
	    jdist = el_junction_dist(cell,sref,1)
	    if(!tref.is_cas() && jdist<0.5 && sref.nchild>1){
		print secname(), "\t", jdist, "\t", gr_down(sref)
		grrep_down(cell,sref)
	    }//else{ print secname(), " ", jdist, " rejected" }
	}
    }
}

proc grrep_down(){local i,jdist localobj cell,tref,sref 
    // give gr report searching down from sref
    cell = $o1
    tref = $o2
    for(i=0;i<tref.nchild;i=i+1){
	tref.child[i]{
	    sref = new SectionRef()
	    jdist = el_junction_dist(cell,sref,1)
	    if(jdist<0.5 && sref.nchild>1){
		print secname(), "\t", jdist, "\t", gr_down(sref)
		grrep_down(cell,sref)
	    }//else{ print secname(), " ", jdist, " rejected" }
	}
    }
}

proc print_junction_report(){local nbp localobj cell,j_sref
    // print all the information about the junction_site
    cell = $o1
    cell.axon[cell.junction_site]{ 
	j_sref = new SectionRef()
    }
    
    print "dist from soma: ", soma_dist(cell,j_sref)
    print "el dist from soma: ", el_soma_dist(cell,j_sref,0)
    print "junction ratio: ", junction_ratio(cell)
    print "junction gr: ", junction_gr(cell)
    nbp = n_branch_points(cell)
    print "n branch points: ", nbp
    print "wa branch points: ", wa_branch_points(cell)
    print "gr report: "
    gr_report(cell)
}

Loading data, please wait...