Using Strahler's analysis to reduce realistic models (Marasco et al, 2013)

 Download zip file   Auto-launch 
Help downloading and running models
Accession:149000
Building on our previous work (Marasco et al., (2012)), we present a general reduction method based on Strahler's analysis of neuron morphologies. We show that, without any fitting or tuning procedures, it is possible to map any morphologically and biophysically accurate neuron model into an equivalent reduced version. Using this method for Purkinje cells, we demonstrate how run times can be reduced up to 200-fold, while accurately taking into account the effects of arbitrarily located and activated synaptic inputs.
Reference:
1 . Marasco A, Limongiello A, Migliore M (2013) Using Strahler's analysis to reduce up to 200-fold the run time of realistic neuron models. Sci Rep 3:2934 [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; Dendrite;
Brain Region(s)/Organism: Hippocampus; Cerebellum;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell; Cerebellum Purkinje GABA cell;
Channel(s): I Na,t; I T low threshold; I K; I Calcium; Ca pump;
Gap Junctions:
Receptor(s): AMPA;
Gene(s):
Transmitter(s): Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Activity Patterns; Active Dendrites; Influence of Dendritic Geometry; Detailed Neuronal Models; Action Potentials; Synaptic Integration;
Implementer(s): Limongiello, Alessandro [alessandro.limongiello at unina.it];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; Cerebellum Purkinje GABA cell; AMPA; I Na,t; I T low threshold; I K; I Calcium; Ca pump; Glutamate;
/
PurkReductionOnLine
morphologies
readme.txt
CaE.mod *
CalciumP.mod *
CaP.mod *
CaP2.mod *
CaT.mod *
K2.mod *
K22.mod *
K23.mod *
KA.mod *
KC.mod *
KC2.mod *
KC3.mod *
KD.mod *
Kdr.mod *
Kh.mod *
Khh.mod *
KM.mod *
Leak.mod *
NaF.mod *
NaP.mod *
pj.mod
clusterisingMethods.hoc
fixnseg.hoc
mergingMethods.hoc
mosinit.hoc
ranstream.hoc *
RedPurk.hoc
stimulation1.hoc
useful&InitProc.hoc
                            
/*---------------------------------------------------------------------

   Written by Alessandro Limongiello
   University "Federico II" of Naples, 2012-2013

-----------------------------------------------------------------------*/


load_file("nrngui.hoc")

/*---------------------------------------------
                   USEFUL DATA
  ---------------------------------------------*/
  

PRESERVINGMETHOD = 0            
SURFFACT_PARTIAL_TOTAL = 1                                    
SURFFACT_PARTIAL_METHOD = 2     
RaMERGINGMETHOD = 1           
  
create soma[1]  
create eqSection[1]  
                                                       	
xopen("fixnseg.hoc")            

Ra0 = 250                       //Ohm*cm
cmSoma = 0.8
cmSmoothSec = 0.8
cmSpinySect = 1.5
gl_LeakSoma = 0.00006
gl_LeakSmoothSec = 0.00021
gl_LeakSpinySect = 0.00021
el_Leak0 = -80

freq = 50
freqEq = 3
factRm = 1
factCm = 1
factRa = 1
celsius = 37

xopen("useful&InitProc.hoc") 
xopen("stimulation1.hoc") 


//////   Spike counter//////////

objref apcOr,apcEq

proc insert_APCor() {
    apcOr = new APCount(0.5)
    apcOr.thresh = -10
}
proc insert_APCeq() {
    apcEq = new APCount(0.5)
    apcEq.thresh = -10
}

proc initStim(){
    if (StimulationType == 1) {StimulationTypePartial_Total=0 syn_asyn=1
    }else if (StimulationType == 2) {StimulationTypePartial_Total=1 syn_asyn=1
    }else if (StimulationType == 3) {StimulationTypePartial_Total=0 syn_asyn=2}
}


/*---------------------------------------------
                      MAIN
  ---------------------------------------------*/


synNum = 1000
synType = 0
noise0 = 1    
positionSeed = 2058529//9384772//2181150
poissonSeed = 1421192//6479171//1505849


optFactGmaxSyn = 0
iMorph = 2
optPrint = 0
optPrint1 = 1
optPrint2 = 0
optPrint3 = 1
tgraph = 2000
StimulationTypePartial_Total = 0 // 0 - Total Stimulation / 1 - Partial Stimulation
StimulationType = 1 // 1- Full / 2- Partial /3- Segregated



objref vbox3

vbox3 = new VBox()    
vbox3.intercept(1)
xpanel("Input Data:")
xbutton("Cell Morphologies","readingFile()")
xvalue("freqSyn (Hz)","freqSyn",0,"if(firstInit == -1) firstInit = 0")
xvalue("Number of Active Synapses","synNum",0,"if(firstInit == -1) firstInit = 0")
stateFull = 1
statePartial=0
stateSegr=0
xcheckbox("Full Stimulation",&stateFull,"StimulationType=1 statePartial=0 stateSegr=0 initStim()")
xcheckbox("Partial Stimulation",&statePartial,"StimulationType=2 stateFull=0 stateSegr=0 initStim()")
xcheckbox("Segregated Stimulation",&stateSegr,"StimulationType=3 stateFull=0 statePartial=0 initStim()")

xpanel()
vbox3.intercept(0)
vbox3.map("Input Data", 360, 0, 250, 120)


time0=0
    
objref vbox4

vbox4 = new VBox()    
vbox4.intercept(1)
xpanel("Run Control:")
xbutton("Run the Full & Reduced Models","{init() integrate()}")
xbutton("Run the Full Model","goMorph()")
xbutton("Run the Reduced Model","goEq()")
xbutton("Stop","{stoprun = 1}")
xvalue("tstop","tgraph",0)
xvalue("Simulation Time (sec): ","time0",0)
xvalue("Accuracy: ","accu",0)

xpanel()
vbox4.intercept(0)
vbox4.map("Run Control", 700, 0, 200, 170)    
    
    
firstInit = 1    // 0=file already read but any change in the parameters
                 // 1=first init
                 // -1=file already read and no change in the parameters
                 // 2=file not yet read but any change in the parameters


objref graphCum,graphEq,graphMorph,graphMorph1
objref vbox7
        
        
objref pc
pc = new ParallelContext()        
              
        
proc init(){
        
    t=0
    tstop = tgraph   
    
    while (firstInit==1) {readingFile()} 
    time00 = pc.time()
    PurkinjeSetting()
    
    if (optPrint3==1) print "InitialSetting Time: ", pc.time() - time00
    


    if (firstInit==0){
        time00 = pc.time()
        cellPurkAnalysis()
        
        clusterise1PurkinjeCell()
        
        stimulationClusterise1()
        
        PurkReduction()   
    
        {create eqSection[clusterList.count]}
        createPurkEqCell(clusterList,RaMERGINGMETHOD)
        
        
        if (optPrint3==1) print "cellPurkAnalysis+clusterisePurkinjeCell+PurkReduction+createPurkEqCell Time: ", pc.time() - time00
        
        printClusterList(clusterList)
        
       
        objref injCurr, injCurrEq
        time00 = pc.time()
        insertPurkSyn(synNum,positionSeed,synType,clusterList)
        
        if (optPrint3==1) print "insertPurkSyn Time: ", pc.time() - time00
        time00 = pc.time()
        changeSurf(clusterList,synNum)
        if (optPrint3==1) print "changeSurf Time: ", pc.time() - time00
        

        firstInit = -1   
    }

    time00 = pc.time()
    findSyn(clusterList,optFactGmaxSyn,synNum,synType,iMorph)
    if (optPrint3==1) print "findSyn Time: ", pc.time() - time00
  
    for (i = 0; i < clusterList.count; i = i + 1){print "surfFact",i,": ",surfFact.x(i)}

    time00 = pc.time()



    for (j = 0; j < eqTrunkVector.size(); j = j + 1){
        jj = eqTrunkVector.x(j)
        eqSection[jj] {gl_Leak = factRm*surfFactRmCm.x(jj)*gl_LeakSmoothSec
                       cm=factCm*cmSmoothSec*surfFactRmCm.x(jj)}    
    }
    for (j = 0; j < eqSmoothVector.size(); j = j + 1){
        jj = eqSmoothVector.x(j)
        eqSection[jj] {gl_Leak = factRm*surfFactRmCm.x(jj)*gl_LeakSmoothSec
                       cm=factCm*cmSmoothSec*surfFactRmCm.x(jj)}    
    }
    for (j = 0; j < eqSpinyVector.size(); j = j + 1){
        jj = eqSpinyVector.x(j)
        eqSection[jj] {gl_Leak = factRm*surfFactRmCm.x(jj)*gl_LeakSpinySect
                       cm=factCm*cmSpinySect*surfFactRmCm.x(jj)}    
    }
    
   
    totEq=0
    for (i = 0; i < clusterList.count; i = i + 1){
        eqSection[i] {
               nseg = int((L/(d_lambda*lambda_f(freqEq))+0.9)/2)*2 + 1 
               totEq=totEq+nseg
        } 
    }
    
      
    if (optPrint3==1) print "Nseg Time: ", pc.time() - time00

    printf("Morphology Name: %s\n", strFile)
    printf("totSegIni: %d\n", totOr)
    printf("totSegEq: %d\n", totEq)
    printf("_____________________________\n\n")
    
    time00 = pc.time()
    

    gnabar_NaFSoma0 = 10
    gcabar_CaP2Soma0 = 0.0005
    gcabar_CaP20 = 0.004
  
    
    channelsByMiyasho01()
    initMiyasho01()
    if (optPrint3==1) print "channelsByMiyasho01+initMiyasho01 Time: ", pc.time() - time00 

    vbox7 = new VBox()    
    vbox7.intercept(1)
    
    graphCum = new Graph()
    graphCum.addvar("soma[0].v(0.5)",2,1)
    graphCum.addvar("eqSection[0].v(0.5)",4,1)  
    graphCum.size(0,tgraph,-70,50)   
    graphEq = new Graph()
    graphEq.addvar("eqSection[0].v(0.5)",4,1) 
    graphEq.size(0,tgraph,-70,50)     
    graphMorph = new Graph()
    graphMorph.addvar("soma[0].v(0.5)",2,1)
    graphMorph.size(0,tgraph,-70,50) 

    
    vbox7.intercept(0)
    vbox7.map("graphCum", 980, 0,410, 550)     
    
    cumEqMorph = 0
    
    coloringStimulatedClusters()
}


objref vecNSpikeOr,vecNSpikeEq,vecISISpikeOr,vecISISpikeEq,vecTTSpikeOr,vecTTSpikeEq


proc integrate() {
    time00 = pc.time()
    //advance()
    
    if (cumEqMorph==0){
                       
        vecNSpikeOr= new Vector()
        vecISISpikeOr= new Vector()
        vecTTSpikeOr= new Vector()
        vecNSpikeEq= new Vector()
        vecISISpikeEq= new Vector()
        vecTTSpikeEq= new Vector()                       
                               
        objref apcOr
        access soma[0]
        insert_APCor() 
        tprecOr=0
        ttOr=0 
        firstSpikeOr = 1  
        
        objref apcEq
        access eqSection[0]
        insert_APCeq() 
        tprecEq=0   
        ttEq=0
        firstSpikeEq = 1        
        
    }  
    
    doNotify()
    if(optPrint1) {coloringClusterList(clusterList)}
        
    continuerun(tstop)

    time0 = pc.time()-time00
    print "Time: ",time0
    
    if (cumEqMorph==0){
       accu = accuracy(vecTTSpikeOr,vecTTSpikeEq)
       print "Accuracy: ",accu
    }
}



cumEqMorph = 0  // 0,1,2


proc advance() {

    if(optPrint2) shPlot.flush()
    
    if (cumEqMorph==0){
                                
        graphCum.plot(t)
        graphCum.flush()
        graphEq.plot(t)
        graphEq.flush()
        graphMorph.plot(t)
        graphMorph.flush()
        
        if (apcOr.n==1){tprecOr=apcOr.time if(firstSpikeOr){vecTTSpikeOr.append(tprecOr) firstSpikeOr=0 print "TSpikesOr: ",tprecOr }}                   
        if (apcOr.time>tprecOr && tprecOr!=0){
           //if (apcOr.n==2){vecTTSpikeOr.append(tprecOr)}
           vecTTSpikeOr.append(apcOr.time)
           ttOr = apcOr.time - tprecOr
           vecISISpikeOr.append(ttOr)
           print "TSpikesOr: ",apcOr.time 
           tprecOr=apcOr.time
        }
        
        if (apcEq.n==1){tprecEq=apcEq.time if(firstSpikeEq){vecTTSpikeEq.append(tprecEq) firstSpikeEq=0 print "TSpikesEq: ",tprecEq }}                        
        if (apcEq.time>tprecEq && tprecEq!=0){
           //if (apcEq.n==2){vecTTSpikeEq.append(tprecEq)}
           vecTTSpikeEq.append(apcEq.time)
           ttEq = apcEq.time - tprecEq
           vecISISpikeEq.append(ttEq)
           print "TSpikesEq: ",apcEq.time 
           tprecEq=apcEq.time
        }
        
    } else if (cumEqMorph==1){
        graphEq.plot(t)
        graphEq.flush()
    } else if (cumEqMorph==2){
        graphMorph.plot(t)
        graphMorph.flush()
    }
    
    
    	
    fadvance()  
}

proc goMorph(){
     
     init()          

     objectvar StimEqList,Exp2SynEqList,NetConEqList
     objref stimEqApp,synEqApp,netConEqApp

     forall if (issection("eqSection.*")){
         uninsert Leak uninsert NaF uninsert NaP uninsert CaP2 uninsert CaT uninsert CaE 
         uninsert Khh uninsert KM uninsert KA uninsert KD uninsert Kh uninsert cad 
         delete_section()
     }
    
    vbox7 = new VBox()    
    vbox7.intercept(1)
    graphMorph = new Graph()
    graphMorph.addvar("soma[0].v(0.5)",2,1)
    graphMorph.size(0,tgraph,-70,50)    
    vbox7.intercept(0)
    vbox7.map("graphMorph",980,510,410,170)      
    
    cumEqMorph = 2 
    
    objref apcOr,apcEq
    access soma[0]
    insert_APCor() 
       
    coloringStimulatedClusters()
       
    integrate()

}

proc goEq(){
     
     init()          

     objectvar Exp2SynList,NetConList,StimList//,StimEqList,Exp2SynEqList,NetConEqList
     objref synApp,netConApp//stimApp,stimEqApp,synEqApp,netConEqApp

     forall if (!issection("eqSection.*")){
         uninsert Leak uninsert NaF uninsert NaP uninsert CaP2 uninsert CaT uninsert CaE 
         uninsert Khh uninsert KM uninsert KA uninsert KD uninsert Kh uninsert cad 
         delete_section()
     }
     
    vbox7 = new VBox()    
    vbox7.intercept(1)
    graphEq = new Graph()
    graphEq.addvar("eqSection[0].v(0.5)",4,1) 
    graphEq.size(0,tgraph,-70,50)      
    vbox7.intercept(0)
    vbox7.map("graphEq",980,340,410,170)  
  
    cumEqMorph = 1
    
    objref apcOr,apcEq
    access eqSection[0]
    insert_APCeq() 
    
    integrate()



}