Impact of dendritic size and topology on pyramidal cell burst firing (van Elburg and van Ooyen 2010)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:114359
The code provided here was written to systematically investigate which of the physical parameters controlled by dendritic morphology underlies the differences in spiking behaviour observed in different realizations of the 'ping-pong'-model. Structurally varying dendritic topology and length in a simplified model allows us to separate out the physical parameters derived from morphology underlying burst firing. To perform the parameter scans we created a new NEURON tool the MultipleRunControl which can be used to easily set up a parameter scan and write the simulation results to file. Using this code we found that not input conductance but the arrival time of the return current, as measured provisionally by the average electrotonic path length, determines whether the pyramidal cell (with ping-pong model dynamics) will burst or fire single spikes.
Reference:
1 . van Elburg RA, van Ooyen A (2010) Impact of dendritic size and dendritic topology on burst firing in pyramidal cells. PLoS Comput Biol 6:e1000781 [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: Neocortex;
Cell Type(s): Neocortex L5/6 pyramidal GLU cell;
Channel(s): I Na,t; I K; I M; I K,Ca; I Sodium; I Calcium; I Potassium;
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; MATLAB;
Model Concept(s): Activity Patterns; Bursting; Spatio-temporal Activity Patterns; Simplified Models; Active Dendrites; Influence of Dendritic Geometry; Detailed Neuronal Models; Methods;
Implementer(s): van Elburg, Ronald A.J. [R.van.Elburg at ai.rug.nl];
Search NeuronDB for information about:  Neocortex L5/6 pyramidal GLU cell; I Na,t; I K; I M; I K,Ca; I Sodium; I Calcium; I Potassium;
// Author: Ronald van Elburg  (RonaldAJ at vanElburg eu)
//
// NEURON script for the paper:
//
//   Ronald A.J. van Elburg and Arjen van Ooyen (2010) `Impact of dendritic size and
//   dendritic topology on burst firing in pyramidal cells', 
//   PLoS Comput Biol 6(5): e1000781. doi:10.1371/journal.pcbi.1000781.
//
// Please consult readme.txt or instructions on the usage of this file.
//
// This software is released under the GNU GPL version 3: 
// http://www.gnu.org/copyleft/gpl.html

ExecutePruneTest=0

// proc prune:
//      Can prune endsegments from a whole subtree or a set of subtrees, 
//      provided all section in the subtree share a part of their name 
//      (parameter:sectionname) and the soma differs from this name.
//
//      parameters:
//          $s1 sectionname
// parameters:
//          $s1 sectionname

objref r
r = new Random()

proc prune_endsegments_rnd(){localobj allSections, endSections,tmpSecRef
    allSections=new SectionList()
    
    r.uniform(0, 1) 
    
     // Create a sectionlist containing all sections corresponding to the sectionname
    forsec $s1 {
        allSections.append()
    }

    // Find terminal segments and put them in the endSections sectionlist 
    endSections=new SectionList()
    forsec allSections {
        tmpSecRef=new SectionRef()
        if (tmpSecRef.nchild==0) {
            endSections.append()
        }                          
    } 
    
    // Delete  terminal segments
    forsec endSections {
        if(r.repick() < $2){		
            tmpSecRef=new SectionRef()
            
            if (tmpSecRef.has_parent==1) {
                disconnect()
                delete_section()
            }   
        }                       
    } 
}

proc prune_endsegments_rndn(){local pruneDepth
    // $1 proces name 
    // $2 pruning Probability
    // $3 pruneDepth
    // $4 prune Sees
    
    r = new Random($4)
    
    for pruneDepth=1,$3 {
        prune_endsegments_rnd($s1,$2)
    }
}

proc prune_endsegments(){localobj allSections, endSections,tmpSecRef, pruneCandidate
    allSections=new SectionList()
   
    forsec $s1 {
        allSections.append()
    }

    // Find terminal segments and put them in the endSections sectionlist 
    endSections=new SectionList()
    forsec allSections {
        tmpSecRef=new SectionRef()
        if (tmpSecRef.nchild==0) {
            endSections.append()
        }                          
    } 
    
    // Delete  terminal segments
    forsec endSections {	
            tmpSecRef=new SectionRef()
            
            if (tmpSecRef.has_parent==1) {
                disconnect()
                delete_section()
            }                          
    } 
}

proc retract_endsegments(){localobj allSections, endSections,tmpSecRef, pruneCandidate
    allSections=new SectionList()
    
    // $1 proces name 
    // $2 retraction length
    
    forsec $s1 {
        allSections.append()
    }

    // Find terminal segments and put them in the endSections sectionlist 
    endSections=new SectionList()
    forsec allSections {
        tmpSecRef=new SectionRef()
        if (tmpSecRef.nchild==0) {
            endSections.append()
        }                          
    } 
    
    // Delete  terminal segments
    forsec endSections {	
            tmpSecRef=new SectionRef()
            
            if (tmpSecRef.has_parent==1) {
                if(L>$2){
                    L=L-$2
                }else{
                    disconnect()
                    delete_section()
                }
            }                          
    } 
}


// proc rallify:
//      Can make a whole subtree or a set of subtrees fit Rall's law, 
//      provided all section in the subtree share a part of their name 
//      (parameter:sectionname) and the soma differs from this name.
//
//      parameters:
//          $s1 sectionname
//          $2  rall power
//          $3  endterminal diameter
//          $o4 optional shapeplot object
//
strdef tstr
proc rallify(){local NewParents,setColor localobj allSections, endSections, parentSections, intermediateSections, tmpSecRef,tmpSecRefParent
    allSections=new SectionList()
    endSections=new SectionList()
    
    NewParents=0
    
    // See if a shape plot object was provided for showing diameters and coloring segments
    if(4==numarg()){
        setColor=1
        $o4.exec_menu("View ...")
        $o4.exec_menu("View = plot")
        $o4.exec_menu("Shape Style")
        $o4.exec_menu("Show Diam")
        doNotify()
    }else{
        setColor=0
    }
    
    // Put sectionname into a search string
    sprint(tstr,".*%s.*",$s1)
    
    // Create a sectionlist containing all sections corresponding to the sectionname and 
    // initialize the section diameters (i.e. set it to 0). We will (ab)use diam to store the 
    // number of endsegments of the subtree of the present section.
    forsec $s1 {
        allSections.append()
        diam=0  
        //print secname()
    }

    // Find terminal segments and put them in the endSections sectionlist 
    forsec allSections {
        tmpSecRef=new SectionRef()
        if (tmpSecRef.nchild==0) {
            NewParents=1
            endSections.append()
        }                          
    } 
    
    // Move through tree from endsegments to soma and update diam of every 
    // section by adding 1 to diam when passing through it. When this part of 
    // the code is excuted diam of every section  should contain the number of 
    // endsegments in the subtree corresponding to the section.
    
    intermediateSections=endSections
    while(NewParents==1){
              
        NewParents=0
        parentSections=new SectionList()
        
        forsec intermediateSections {
            tmpSecRef=new SectionRef()
            diam=diam+1
            if (tmpSecRef.has_parent==1) {
                tmpSecRef.parent { 
                    tmpSecRef if (issection(tstr)){
                        NewParents=1
                        parentSections.append()
                    } 
                }
            }  
        }
        intermediateSections=parentSections
        
    }

    // Use the number of endsegments of the subtree stored in diam 
    // to calculate correct rallified diameter of the section and use it to 
    // set the correct diam.
    forsec allSections {
        if(diam==0){
          print "error in Rallify: zero diameter element"
        }else{
          diam=exp(1/$2*log(diam))*$3
        }            
    } 
    
    if(1==setColor){
        doNotify()
        round=0
        intermediateSections=endSections
        NewParents=1
        while(NewParents==1){
            round=round+1
            NewParents=0
            parentSections=new SectionList()
            
            forsec intermediateSections {
                $o4.color((round+7)%9+1)
                tmpSecRef=new SectionRef()
             
                if (tmpSecRef.has_parent==1) {
                    tmpSecRef.parent { 
                        tmpSecRef if (issection(tstr)){
                            NewParents=1
                            parentSections.append()
                        } 
                    }
                }  
            }
            intermediateSections=parentSections
        }
    }
}

if(ExecutePruneTest==1){
    tstop=1500   
    chdir("/cygdrive/d/Projects/TopologySimulations/MainenSejnowski")
    load_file("demofig1.hoc")
    fig1d()
  
    xpanel("Prune Tools")
        xbutton("prune endsegments random ","prune_endsegments_rnd(\"dend\",0.1)")
        xbutton("prune endsegments","prune_endsegments(\"dend11\[\")")
        xbutton("rallify","rallify(\"dend\",1.5,1.25,sh)")
    xpanel()
}

Loading data, please wait...