Exemple #1
0
class PlotsBase:

    variables = { }
    cutflows = { }

    def getVariables(self):
        return PlotsBase.variables

    def getVariables1D(self):
        return [ v for v in PlotsBase.variables.values() if not v.is2D() ]

    def getVariables2D(self):
        return [ v for v in PlotsBase.variables.values() if v.is2D() ]

    def addVariable(self,name,nbins,xmin,xmax,scut='l',uselog=True,binEdges=None):
        assert name.isalnum()
        assert not name in self.histogramList
        if not name in PlotsBase.variables:
            nb = nbins if binEdges else nbins/self.rebin
            PlotsBase.variables[name] = Variable(name,nb,xmin,xmax,scut,uselog)
        h1d = PlotsBase.variables[name].createHistogram(binEdges)
        self.histogramList[name] = h1d
        setattr(self,"h"+name,h1d)

    def getCutFlows(self):
        return PlotsBase.cutflows

    def addCutFlow(self,labels,nameFlow="DefaultCutFlow"):
        assert nameFlow.isalnum()
        assert not nameFlow in self.cutflowList
        if not nameFlow in PlotsBase.cutflows:
            PlotsBase.cutflows[nameFlow] = CutFlow(nameFlow,labels)
        h = PlotsBase.cutflows[nameFlow].createHistogram()
        self.cutflowList[nameFlow] = h
        setattr(self,"c"+nameFlow,h)

    def addVariablePair(self,xname,nbinsx,xmin,xmax,yname,nbinsy,ymin,ymax,uselog=True,suffix=None):
        varPair = VariablePair(xname,nbinsx/self.rebin,xmin,xmax,yname,nbinsy/self.rebin,ymin,ymax, \
                                   uselog,suffix)
        assert not varPair.name in self.histogramList
        if not varPair.name in PlotsBase.variables:
            PlotsBase.variables[varPair.name] = varPair
        h2d = varPair.createHistogram()
        self.histogramList[varPair.name] = h2d
        setattr(self,"h"+varPair.name,h2d)

    def __init__(self,name,preselection=None,elist=None,elistBase="./elists",rebin=1):
        self.name = name
        self.preselection = preselection
        self.elist = elist
        if elist!=None:
            self.elist = elist.lower()[0]
        self.elistBase = elistBase
        assert os.path.isdir(elistBase)
        self.timers = [ ]
        for i in range(10):
            self.timers.append(MyTimer())
        self.writeElist = False
        self.readElist = False
        if self.preselection!=None and self.elist!=None:
            self.preselName = self.preselection.__class__.__name__
            if self.elist=="w" or self.elist=="a":
                self.writeElist = True
            elif self.elist=="r" or self.elist=="a":
                self.readElist = True
        if self.writeElist or self.readElist:
            self.preselDirName = os.path.join(self.elistBase,self.preselName)
            if not os.path.isdir(self.preselDirName):
                os.mkdir(self.preselDirName,0744)
        self.rebin = rebin
        self.progress = None
         
    def showProgressBar(self,flag=True):
        if flag and self.progress==None:
            self.progress = ProgBar()
        elif self.progress!=None and not flag:
            if self.progress.isActive():
                self.progress.halt()
            self.progress = None

    def showTimers(self):
        line = ""
        for t in self.timers:
            line += "{0:14.2f}".format(1000000*t.meanTime())
#            line += " " + str(t.meanTime())
        print line

    def prepareElist(self,sample,subSampleName):
        elist = None
        elistFile = None
        if self.readElist or self.writeElist:
            dirName = os.path.join(self.preselDirName,sample.name)
            if not os.path.isdir(dirName):
                os.mkdir(dirName,0744)
            elistFileName = os.path.join(dirName,subSampleName+"_elist.root")
            if self.elist=="a":
                self.writeElist = False
                self.readElist = False
                if not os.path.exists(elistFileName):
                    self.writeElist = True
                else:
                    elistTime = os.path.getmtime(elistFileName)
                    if elistTime<=os.path.getmtime(self.preselection.sourcefile):
                        self.writeElist = True
                    if elistTime<=os.path.getmtime(sample.fullname(subSampleName)):
                        self.writeElist = True
                self.readElist = not self.writeElist
            if self.writeElist:
                print "(Re)creating elist for ",sample.name,subSampleName
            if self.writeElist:
                print "Reading elist for ",sample.name,subSampleName
            opt = "recreate" if self.writeElist else "read"
            elistFile = ROOT.TFile(elistFileName,opt)
            objarr = ROOT.TObjArray()
            if self.writeElist:
                objstr = ROOT.TObjString()
                objstr.SetString(sample.name)
                objarr.Add(objstr.Clone())
                objstr.SetString(subSampleName)
                objarr.Add(objstr.Clone())
                objstr.SetString(str(sample.downscale))
                objarr.Add(objstr.Clone())
                objarr.Write("file",ROOT.TObject.kSingleKey)
                elist = ROOT.TEventList("elist",self.preselName+" / "+sample.name+" / "+subSampleName)
            else:
                objarr = elistFile.Get("file")
                assert objarr[0].GetString().Data()==sample.name
                assert objarr[1].GetString().Data()==subSampleName
                assert objarr[2].GetString().Data()==str(sample.downscale)
                elist = elistFile.Get("elist")
        return ( elist, elistFile )

    def createGenerator(self,end,downscale=1):
        i = downscale - 1
        while i<end:
            yield i
            i += downscale


    def fillall(self,sample):
        for itree in range(len(sample.names)):
            tree = sample.getchain(itree)            
#            print sample.name,itree
#            print tree.GetEntries()
            nentries = tree.GetEntries()
            nprog = nentries
            downscale = sample.downscale
            iterator = self.createGenerator(tree.GetEntries(),sample.downscale)
            if self.readElist or self.writeElist:
                elist, elistFile = self.prepareElist(sample,sample.names[itree])
                if self.readElist:
                    iterator = self.createGenerator(elist.GetN())
                    nprog = elist.GetN()
            self.timers[6].start()
            eh = EventHelper(tree)
            self.timers[6].stop()
#        for iev in range(tree.GetEntries()):
            nall = 0
            nsel = 0
#            self.timers[7].start(paused=True)
#            self.timers[8].start(paused=True)
            if self.progress:
                self.progress.initialize(length=nprog,title=sample.name+" "+sample.names[itree])
            for iev in iterator:
#            for iev in sample.getentries(tree):
#            if sample.downscale==1 or (iev%sample.downscale)==0:
                jev = iev if not self.readElist else elist.GetEntry(iev)
#                self.timers[8].resume()
                self.timers[8].start()
                eh.getEntry(jev)
#                self.timers[8].pause()
                self.timers[8].stop()
                nall += 1
                if self.progress and nall%100==0:
                    self.progress.increment(100)
                if self.readElist or ( \
                    ( self.preselection==None or self.preselection.accept(eh,sample) ) and \
                    ( sample.filter==None or sample.filter.accept(eh) ) ):
#                    if sample.name.startswith("TTJets"):
#                        print "Accepted for ",sample.name,":",eh.get("run"),eh.get("lumi"),eh.get("evt")                        
#                    self.timers[7].resume()
                    self.timers[7].start()
                    self.fill(eh,sample,itree)
#                    self.timers[7].pause()
                    self.timers[7].stop()
                    for timer in self.timers[:7]:
                        if timer.active:
                            timer.stop()
                    if self.writeElist:
                        elist.Enter(iev)
                    nsel += 1
#            print "Ntot for ",sample.name,sample.names[itree]," = ",nall,nsel
#        for ev in tree:
#            self.fill(ev)
#            self.timers[7].stop()
#            self.timers[8].stop()
            if self.writeElist:
                elist.Write()
            if self.writeElist or self.readElist:
                elistFile.Close()
            if self.progress and self.progress.status!=3:
                    self.progress.update(1.)
        # handle under- & overflows
        for n,v in PlotsBase.variables.iteritems():
            v.moveUnderOverFlow(self.histogramList[n])
        self.showTimers()
            
        
    def fill1DBySign(self,name,pdg,value,weight):
        fullname = name
        if pdg>0:
            fullname += "Minus"
        elif pdg<0:
            fullname += "Plus"
        self.histogramList[fullname].Fill(value,weight)

    def fill1DByFlavour(self,name,pdg,value,weight):
        self.histogramList[name].Fill(value,weight)
        if pdg!=None:
            if pdg==0 or abs(pdg)==11:
                self.histogramList[name+"Ele"].Fill(value,weight)        
            if pdg==0 or abs(pdg)==13:
                self.histogramList[name+"Mu"].Fill(value,weight)        

    def fill1DByCategory(self,name,category,value,weight):
        self.histogramList[name].Fill(value,weight)
        if category!=None:
            self.histogramList[name+category].Fill(value,weight)        

    def fill1D(self,name,value,weight):
        self.fill1DBySign(name,0,value,weight)

    def fill2DBySign(self,name,pdg,xvalue,yvalue,weight):
        fullname = name + "_"
        if pdg>0:
            fullname += "Minus"
        elif pdg<0:
            fullname += "Plus"
        self.histogramList[fullname].Fill(xvalue,yvalue,weight)

    def fill2D(self,name,xvalue,yvalue,weight):
        self.fill2DBySign(name,0,xvalue,yvalue,weight)

    def passedCut(self,label,w,nameFlow="DefaultCutFlow"):
        flow = PlotsBase.cutflows[nameFlow]
        self.cutflowList[nameFlow].Fill(flow.index(label),w)

    def passedCutByFlavour(self,label,pdg,w,nameFlow="DefaultCutFlow"):
        flow = PlotsBase.cutflows[nameFlow]
        self.cutflowList[nameFlow].Fill(flow.index(label),w)
        if pdg!=None:
            if pdg==0 or abs(pdg)==11:
                flow = PlotsBase.cutflows[nameFlow+"Ele"]
                self.cutflowList[nameFlow+"Ele"].Fill(flow.index(label),w)
            if pdg==0 or abs(pdg)==13:
                flow = PlotsBase.cutflows[nameFlow+"Mu"]
                self.cutflowList[nameFlow+"Mu"].Fill(flow.index(label),w)

    def passedCutByCategory(self,label,category,w,nameFlow="DefaultCutFlow"):
        flow = PlotsBase.cutflows[nameFlow]
        self.cutflowList[nameFlow].Fill(flow.index(label),w)
        if category!=None and category!="":
            flow = PlotsBase.cutflows[nameFlow+category]
            self.cutflowList[nameFlow+category].Fill(flow.index(label),w)
Exemple #2
0
class PlotsBase:

    variables = {}
    cutflows = {}

    def getVariables(self):
        return PlotsBase.variables

    def getVariables1D(self):
        return [v for v in PlotsBase.variables.values() if not v.is2D()]

    def getVariables2D(self):
        return [v for v in PlotsBase.variables.values() if v.is2D()]

    def addVariable(self,
                    name,
                    nbins,
                    xmin,
                    xmax,
                    scut='l',
                    uselog=True,
                    binEdges=None):
        assert name.isalnum()
        assert not name in self.histogramList
        if not name in PlotsBase.variables:
            nb = nbins if binEdges else nbins / self.rebin
            PlotsBase.variables[name] = Variable(name, nb, xmin, xmax, scut,
                                                 uselog)
        h1d = PlotsBase.variables[name].createHistogram(binEdges)
        self.histogramList[name] = h1d
        setattr(self, "h" + name, h1d)

    def getCutFlows(self):
        return PlotsBase.cutflows

    def addCutFlow(self, labels, nameFlow="DefaultCutFlow"):
        assert nameFlow.isalnum()
        assert not nameFlow in self.cutflowList
        if not nameFlow in PlotsBase.cutflows:
            PlotsBase.cutflows[nameFlow] = CutFlow(nameFlow, labels)
        h = PlotsBase.cutflows[nameFlow].createHistogram()
        self.cutflowList[nameFlow] = h
        setattr(self, "c" + nameFlow, h)

    def addVariablePair(self,
                        xname,
                        nbinsx,
                        xmin,
                        xmax,
                        yname,
                        nbinsy,
                        ymin,
                        ymax,
                        uselog=True,
                        suffix=None):
        varPair = VariablePair(xname,nbinsx/self.rebin,xmin,xmax,yname,nbinsy/self.rebin,ymin,ymax, \
                                   uselog,suffix)
        assert not varPair.name in self.histogramList
        if not varPair.name in PlotsBase.variables:
            PlotsBase.variables[varPair.name] = varPair
        h2d = varPair.createHistogram()
        self.histogramList[varPair.name] = h2d
        setattr(self, "h" + varPair.name, h2d)

    def __init__(self,
                 name,
                 preselection=None,
                 elist=None,
                 elistBase="./elists",
                 rebin=1):
        self.name = name
        self.preselection = preselection
        self.elist = elist
        if elist != None:
            self.elist = elist.lower()[0]
        self.elistBase = elistBase
        assert os.path.isdir(elistBase)
        self.timers = []
        for i in range(10):
            self.timers.append(MyTimer())
        self.writeElist = False
        self.readElist = False
        if self.preselection != None and self.elist != None:
            self.preselName = self.preselection.__class__.__name__
            if self.elist == "w" or self.elist == "a":
                self.writeElist = True
            elif self.elist == "r" or self.elist == "a":
                self.readElist = True
        if self.writeElist or self.readElist:
            self.preselDirName = os.path.join(self.elistBase, self.preselName)
            if not os.path.isdir(self.preselDirName):
                os.mkdir(self.preselDirName, 0744)
        self.rebin = rebin
        self.progress = None

    def showProgressBar(self, flag=True):
        if flag and self.progress == None:
            self.progress = ProgBar()
        elif self.progress != None and not flag:
            if self.progress.isActive():
                self.progress.halt()
            self.progress = None

    def showTimers(self):
        line = ""
        for t in self.timers:
            line += "{0:14.2f}".format(1000000 * t.meanTime())
#            line += " " + str(t.meanTime())
        print line

    def prepareElist(self, sample, subSampleName):
        elist = None
        elistFile = None
        if self.readElist or self.writeElist:
            dirName = os.path.join(self.preselDirName, sample.name)
            if not os.path.isdir(dirName):
                os.mkdir(dirName, 0744)
            elistFileName = os.path.join(dirName,
                                         subSampleName + "_elist.root")
            if self.elist == "a":
                self.writeElist = False
                self.readElist = False
                if not os.path.exists(elistFileName):
                    self.writeElist = True
                else:
                    elistTime = os.path.getmtime(elistFileName)
                    if elistTime <= os.path.getmtime(
                            self.preselection.sourcefile):
                        self.writeElist = True
                    if elistTime <= os.path.getmtime(
                            sample.fullname(subSampleName)):
                        self.writeElist = True
                self.readElist = not self.writeElist
            if self.writeElist:
                print "(Re)creating elist for ", sample.name, subSampleName
            if self.writeElist:
                print "Reading elist for ", sample.name, subSampleName
            opt = "recreate" if self.writeElist else "read"
            elistFile = ROOT.TFile(elistFileName, opt)
            objarr = ROOT.TObjArray()
            if self.writeElist:
                objstr = ROOT.TObjString()
                objstr.SetString(sample.name)
                objarr.Add(objstr.Clone())
                objstr.SetString(subSampleName)
                objarr.Add(objstr.Clone())
                objstr.SetString(str(sample.downscale))
                objarr.Add(objstr.Clone())
                objarr.Write("file", ROOT.TObject.kSingleKey)
                elist = ROOT.TEventList(
                    "elist", self.preselName + " / " + sample.name + " / " +
                    subSampleName)
            else:
                objarr = elistFile.Get("file")
                assert objarr[0].GetString().Data() == sample.name
                assert objarr[1].GetString().Data() == subSampleName
                assert objarr[2].GetString().Data() == str(sample.downscale)
                elist = elistFile.Get("elist")
        return (elist, elistFile)

    def createGenerator(self, end, downscale=1):
        i = downscale - 1
        while i < end:
            yield i
            i += downscale

    def fillall(self, sample):
        for itree in range(len(sample.names)):
            tree = sample.getchain(itree)
            #            print sample.name,itree
            #            print tree.GetEntries()
            nentries = tree.GetEntries()
            nprog = nentries
            downscale = sample.downscale
            iterator = self.createGenerator(tree.GetEntries(),
                                            sample.downscale)
            if self.readElist or self.writeElist:
                elist, elistFile = self.prepareElist(sample,
                                                     sample.names[itree])
                if self.readElist:
                    iterator = self.createGenerator(elist.GetN())
                    nprog = elist.GetN()
            self.timers[6].start()
            eh = EventHelper(tree)
            self.timers[6].stop()
            #        for iev in range(tree.GetEntries()):
            nall = 0
            nsel = 0
            #            self.timers[7].start(paused=True)
            #            self.timers[8].start(paused=True)
            if self.progress:
                self.progress.initialize(length=nprog,
                                         title=sample.name + " " +
                                         sample.names[itree])
            for iev in iterator:
                #            for iev in sample.getentries(tree):
                #            if sample.downscale==1 or (iev%sample.downscale)==0:
                jev = iev if not self.readElist else elist.GetEntry(iev)
                #                self.timers[8].resume()
                self.timers[8].start()
                eh.getEntry(jev)
                #                self.timers[8].pause()
                self.timers[8].stop()
                nall += 1
                if self.progress and nall % 100 == 0:
                    self.progress.increment(100)
                if self.readElist or ( \
                    ( self.preselection==None or self.preselection.accept(eh,sample) ) and \
                    ( sample.filter==None or sample.filter.accept(eh) ) ):
                    #                    if sample.name.startswith("TTJets"):
                    #                        print "Accepted for ",sample.name,":",eh.get("run"),eh.get("lumi"),eh.get("evt")
                    #                    self.timers[7].resume()
                    self.timers[7].start()
                    self.fill(eh, sample, itree)
                    #                    self.timers[7].pause()
                    self.timers[7].stop()
                    for timer in self.timers[:7]:
                        if timer.active:
                            timer.stop()
                    if self.writeElist:
                        elist.Enter(iev)
                    nsel += 1
#            print "Ntot for ",sample.name,sample.names[itree]," = ",nall,nsel
#        for ev in tree:
#            self.fill(ev)
#            self.timers[7].stop()
#            self.timers[8].stop()
            if self.writeElist:
                elist.Write()
            if self.writeElist or self.readElist:
                elistFile.Close()
            if self.progress and self.progress.status != 3:
                self.progress.update(1.)
        # handle under- & overflows
        for n, v in PlotsBase.variables.iteritems():
            v.moveUnderOverFlow(self.histogramList[n])
        self.showTimers()

    def fill1DBySign(self, name, pdg, value, weight):
        fullname = name
        if pdg > 0:
            fullname += "Minus"
        elif pdg < 0:
            fullname += "Plus"
        self.histogramList[fullname].Fill(value, weight)

    def fill1DByFlavour(self, name, pdg, value, weight):
        self.histogramList[name].Fill(value, weight)
        if pdg != None:
            if pdg == 0 or abs(pdg) == 11:
                self.histogramList[name + "Ele"].Fill(value, weight)
            if pdg == 0 or abs(pdg) == 13:
                self.histogramList[name + "Mu"].Fill(value, weight)

    def fill1DByCategory(self, name, category, value, weight):
        self.histogramList[name].Fill(value, weight)
        if category != None:
            self.histogramList[name + category].Fill(value, weight)

    def fill1D(self, name, value, weight):
        self.fill1DBySign(name, 0, value, weight)

    def fill2DBySign(self, name, pdg, xvalue, yvalue, weight):
        fullname = name + "_"
        if pdg > 0:
            fullname += "Minus"
        elif pdg < 0:
            fullname += "Plus"
        self.histogramList[fullname].Fill(xvalue, yvalue, weight)

    def fill2D(self, name, xvalue, yvalue, weight):
        self.fill2DBySign(name, 0, xvalue, yvalue, weight)

    def passedCut(self, label, w, nameFlow="DefaultCutFlow"):
        flow = PlotsBase.cutflows[nameFlow]
        self.cutflowList[nameFlow].Fill(flow.index(label), w)

    def passedCutByFlavour(self, label, pdg, w, nameFlow="DefaultCutFlow"):
        flow = PlotsBase.cutflows[nameFlow]
        self.cutflowList[nameFlow].Fill(flow.index(label), w)
        if pdg != None:
            if pdg == 0 or abs(pdg) == 11:
                flow = PlotsBase.cutflows[nameFlow + "Ele"]
                self.cutflowList[nameFlow + "Ele"].Fill(flow.index(label), w)
            if pdg == 0 or abs(pdg) == 13:
                flow = PlotsBase.cutflows[nameFlow + "Mu"]
                self.cutflowList[nameFlow + "Mu"].Fill(flow.index(label), w)

    def passedCutByCategory(self,
                            label,
                            category,
                            w,
                            nameFlow="DefaultCutFlow"):
        flow = PlotsBase.cutflows[nameFlow]
        self.cutflowList[nameFlow].Fill(flow.index(label), w)
        if category != None and category != "":
            flow = PlotsBase.cutflows[nameFlow + category]
            self.cutflowList[nameFlow + category].Fill(flow.index(label), w)