def plotHisto(self, histo, canvasName): plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo, histo.GetName())) plot.createFrame(canvasName + self.label, opts={ "ymin": 0.1, "ymaxfactor": 2. }) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) plot.getPad().SetLogy(True) integralValue = int(0.5 + histo.Integral(0, histo.GetNbinsX(), "width")) print histo.GetName(), "Integral", histo.Integral( 0, histo.GetNbinsX(), "width") histograms.addText(0.4, 0.7, "Integral = %s ev" % integralValue) match = re.search("aseline", histo.GetName()) if match: self.nBaseQCD = integralValue match = re.search("nverted", histo.GetName()) if match: self.nInvQCD = integralValue self.plotIntegral(plot, histo.GetName())
def rtauGen(h, name, rebin=2, ratio=False, defaultStyles=True): if defaultStyles: h.setDefaultStyles() h.histoMgr.forEachHisto(styles.generator()) h.histoMgr.forEachHisto(lambda h: h.getRootHisto().Rebin(rebin)) xlabel = "PF E_{T}^{miss} (GeV)" ylabel = "Events / %.2f" % h.binWidth() if "LeptonsInMt" in name: xlabel = "m_{T}(#tau jet, E_{T}^{miss}) (GeV/c^{2})" ylabel = "Events / %.0f GeV/c^{2}" % h.binWidth() if "NoLeptonsRealTau" in name: xlabel = "m_{T}(#tau jet, E_{T}^{miss}) (GeV/c^{2})" ylabel = "Events / %.0f GeV/c^{2}" % h.binWidth() if "Mass" in name: xlabel = "m_{T}(#tau jet, E_{T}^{miss}) (GeV/c^{2})" ylabel = "Events / %.0f GeV/c^{2}" % h.binWidth() kwargs = {"ymin": 0.1, "ymax": 1000} if "LeptonsInMt" in name: kwargs = {"ymin": 0., "xmax": 300} if "NoLeptonsRealTau" in name: kwargs = {"ymin": 0., "xmax": 300} if "Rtau" in name: kwargs = {"ymin": 0.0001, "xmax": 1.1} kwargs = {"ymin": 0.1, "xmax": 1.1} h.getPad().SetLogy(True) # kwargs["opts"] = {"ymin": 0, "xmax": 14, "ymaxfactor": 1.1}} if ratio: kwargs["opts2"] = {"ymin": 0.5, "ymax": 1.5} kwargs["createRatio"] = True # name = name+"_log" h.createFrame(name, **kwargs) # histograms.addText(0.65, 0.7, "BR(t #rightarrow bH^{#pm})=0.05", 20) h.getPad().SetLogy(True) leg = histograms.createLegend(0.6, 0.75, 0.8, 0.9) if "LeptonsInMt" in name: h.getPad().SetLogy(False) leg = histograms.moveLegend(leg, dx=-0.18) histograms.addText(0.5, 0.65, "TailKiller cut: Tight", 20) h.setLegend(leg) plots._legendLabels["MetNoJetInHole"] = "Jets outside dead cells" plots._legendLabels["MetJetInHole"] = "Jets within dead cells" histograms.addText(300, 300, "p_{T}^{jet} > 50 GeV/c", 20) kwargs["opts2"] = {"ymin": 0.5, "ymax": 1.5} kwargs["createRatio"] = True # if ratio: # h.createFrameFraction(name, opts=opts, opts2=opts2) # h.setLegend(leg) common(h, xlabel, ylabel)
def vertexCount(h, prefix="", postfix="", ratio=True): xlabel = "Number of good vertices" ylabel = "Number of events" if h.normalizeToOne: ylabel = "Arbitrary units." h.stackMCHistograms() stack = h.histoMgr.getHisto("StackedMC") #hsum = stack.getSumRootHisto() #total = hsum.Integral(0, hsum.GetNbinsX()+1) #for rh in stack.getAllRootHistos(): # dataset._normalizeToFactor(rh, 1/total) #dataset._normalizeToOne(h.histoMgr.getHisto("Data").getRootHisto()) h.addMCUncertainty() opts = {} opts_log = {"ymin": 1e-10, "ymaxfactor": 10, "xmax": 30} opts_log.update(opts) opts2 = {"ymin": 0.5, "ymax": 3} opts2_log = opts2 #opts2_log = {"ymin": 5e-2, "ymax": 5e2} h.createFrame(prefix + "vertices" + postfix, opts=opts, createRatio=ratio, opts2=opts2) h.frame.GetXaxis().SetTitle(xlabel) h.frame.GetYaxis().SetTitle(ylabel) h.setLegend(histograms.createLegend()) h.draw() histograms.addCmsPreliminaryText() histograms.addEnergyText() # histograms.addLuminosityText(x=None, y=None, lumi=191.) h.histoMgr.addLuminosityText() if h.normalizeToOne: histograms.addText(0.35, 0.9, "Normalized to unit area", 17) h.save() h.createFrame(prefix + "vertices" + postfix + "_log", opts=opts_log, createRatio=ratio, opts2=opts2_log) h.frame.GetXaxis().SetTitle(xlabel) h.frame.GetYaxis().SetTitle(ylabel) h.getPad1().SetLogy(True) #h.getPad2().SetLogy(True) h.setLegend(histograms.createLegend()) h.draw() histograms.addCmsPreliminaryText() histograms.addEnergyText() # histograms.addLuminosityText(x=None, y=None, lumi=191.) h.histoMgr.addLuminosityText() if h.normalizeToOne: histograms.addText(0.35, 0.9, "Normalized to unit area", 17) h.save()
def vertexCount(h, prefix="", postfix="", ratio=True): xlabel = "Number of good vertices" ylabel = "Number of events" if h.normalizeToOne: ylabel = "Arbitrary units." h.stackMCHistograms() stack = h.histoMgr.getHisto("StackedMC") #hsum = stack.getSumRootHisto() #total = hsum.Integral(0, hsum.GetNbinsX()+1) #for rh in stack.getAllRootHistos(): # dataset._normalizeToFactor(rh, 1/total) #dataset._normalizeToOne(h.histoMgr.getHisto("Data").getRootHisto()) h.addMCUncertainty() opts = {} opts_log = {"ymin": 1e-10, "ymaxfactor": 10, "xmax": 30} opts_log.update(opts) opts2 = {"ymin": 0.5, "ymax": 3} opts2_log = opts2 #opts2_log = {"ymin": 5e-2, "ymax": 5e2} h.createFrame(prefix+"vertices"+postfix, opts=opts, createRatio=ratio, opts2=opts2) h.frame.GetXaxis().SetTitle(xlabel) h.frame.GetYaxis().SetTitle(ylabel) h.setLegend(histograms.createLegend()) h.draw() histograms.addCmsPreliminaryText() histograms.addEnergyText() # histograms.addLuminosityText(x=None, y=None, lumi=191.) h.histoMgr.addLuminosityText() if h.normalizeToOne: histograms.addText(0.35, 0.9, "Normalized to unit area", 17) h.save() h.createFrame(prefix+"vertices"+postfix+"_log", opts=opts_log, createRatio=ratio, opts2=opts2_log) h.frame.GetXaxis().SetTitle(xlabel) h.frame.GetYaxis().SetTitle(ylabel) h.getPad1().SetLogy(True) #h.getPad2().SetLogy(True) h.setLegend(histograms.createLegend()) h.draw() histograms.addCmsPreliminaryText() histograms.addEnergyText() # histograms.addLuminosityText(x=None, y=None, lumi=191.) h.histoMgr.addLuminosityText() if h.normalizeToOne: histograms.addText(0.35, 0.9, "Normalized to unit area", 17) h.save()
def plot(datasets): # datasetName = "TTJets_TuneZ2_Summer11" # datasetName = "TTToHplusBWB_M120_Summer11" datasetName = "WJets_TuneZ2_Summer11" den_selection = "jets_p4.Pt()>30 && ( abs(jets_flavour) < 4 || jets_flavour > 20)" # den_selection = "jets_p4.Pt()>30" num_selection = den_selection + "&&jets_btag>1.7" ds = datasets.getDataset(datasetName) den = ds.getDatasetRootHisto( treeDraw.clone(varexp="jets_p4.Pt()>>dist1(100,0.,500.)", selection=den_selection)).getHistogram() num = ds.getDatasetRootHisto( treeDraw.clone(varexp="jets_p4.Pt()>>dist2(100,0.,500.)", selection=num_selection)).getHistogram() canvas = ROOT.TCanvas("canvas", "", 500, 700) canvas.Divide(1, 3) canvas.cd(1) den.Draw() canvas.cd(2) num.Draw() canvas.cd(3) # eff = ROOT.TEfficiency(num,den) eff = num.Clone() eff.Divide(den) eff.Draw() canvas.Print("canvas.C") plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(eff, eff.GetName())) plot.createFrame("BtaggingEff", opts={"ymin": 0.1, "ymaxfactor": 2.}) plot.frame.GetXaxis().SetTitle("jet E_{T} (GeV)") plot.frame.GetYaxis().SetTitle("B-tagging eff.") histograms.addText(0.2, 0.8, "MC: " + datasetName, 25) plot.addStandardTexts() plot.draw() plot.save()
def plot(datasets): # datasetName = "TTJets_TuneZ2_Summer11" # datasetName = "TTToHplusBWB_M120_Summer11" datasetName = "WJets_TuneZ2_Summer11" den_selection = "jets_p4.Pt()>30 && ( abs(jets_flavour) < 4 || jets_flavour > 20)" # den_selection = "jets_p4.Pt()>30" num_selection = den_selection + "&&jets_btag>1.7" ds = datasets.getDataset(datasetName) den = ds.getDatasetRootHisto(treeDraw.clone(varexp="jets_p4.Pt()>>dist1(100,0.,500.)", selection=den_selection)).getHistogram() num = ds.getDatasetRootHisto(treeDraw.clone(varexp="jets_p4.Pt()>>dist2(100,0.,500.)", selection=num_selection)).getHistogram() canvas = ROOT.TCanvas("canvas","",500,700) canvas.Divide(1,3) canvas.cd(1) den.Draw() canvas.cd(2) num.Draw() canvas.cd(3) # eff = ROOT.TEfficiency(num,den) eff = num.Clone() eff.Divide(den) eff.Draw() canvas.Print("canvas.C") plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(eff,eff.GetName())) plot.createFrame("BtaggingEff", opts={"ymin": 0.1, "ymaxfactor": 2.}) plot.frame.GetXaxis().SetTitle("jet E_{T} (GeV)") plot.frame.GetYaxis().SetTitle("B-tagging eff.") histograms.addText(0.2, 0.8, "MC: "+datasetName, 25) plot.addStandardTexts() plot.draw() plot.save()
def plotHisto(self,histo,canvasName): plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo,histo.GetName())) plot.createFrame(canvasName+self.label, opts={"ymin": 0.1, "ymaxfactor": 2.}) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) plot.getPad().SetLogy(True) integralValue = int(0.5 + histo.Integral(0,histo.GetNbinsX(),"width")) print histo.GetName(),"Integral",histo.Integral(0,histo.GetNbinsX(),"width") histograms.addText(0.4,0.7,"Integral = %s ev"% integralValue) match = re.search("aseline",histo.GetName()) if match: self.nBaseQCD = integralValue match = re.search("nverted",histo.GetName()) if match: self.nInvQCD = integralValue self.plotIntegral(plot, histo.GetName())
def transverseMass(h, name, rebin=1, opts={}, opts_log={}, ratio=False): if rebin > 1: h.histoMgr.forEachHisto(lambda h: h.getRootHisto().Rebin(rebin)) xlabel = "m_{T}(#tau jet, E_{T}^{miss}) (GeV/c^{2})" ylabel = "Events / %.0f GeV/c^{2}" % h.binWidth() tauEmbedding.scaleNormalization(h) h.stackMCHistograms() h.addMCUncertainty() _opts = {"ymaxfactor": 1.5} _opts.update(opts) _opts_log = {"ymin": 1e-2, "ymaxfactor": 2} _opts_log.update(_opts) _opts_log.update(opts_log) _opts2 = {"ymin": 0, "ymax": 2} h.createFrame(name, opts=_opts, opts2=_opts2, createRatio=ratio) h.setLegend(histograms.createLegend()) deltaPhi = "#Delta#phi(#tau jet, E_{T}^{miss})" coord = {"x": 0.5, "y": 0.55, "size": 20} if "AfterBTagging" in name: histograms.addText(text="Without %s cut" % deltaPhi, **coord) elif "AfterDeltaPhi160" in name: histograms.addText(text="%s < 160^{#circ}" % deltaPhi, **coord) elif "AfterDeltaPhi130" in name: histograms.addText(text="%s < 130^{#circ}" % deltaPhi, **coord) common(h, xlabel, ylabel) name += "_log" h.createFrame(name, opts=_opts_log, opts2=_opts2, createRatio=ratio) h.setLegend(histograms.createLegend()) ROOT.gPad.SetLogy(True) common(h, xlabel, ylabel)
def transverseMass(h, name, rebin=1, opts={}, opts_log={}, ratio=False): if rebin > 1: h.histoMgr.forEachHisto(lambda h: h.getRootHisto().Rebin(rebin)) xlabel = "m_{T}(#tau jet, E_{T}^{miss}) (GeV/c^{2})" ylabel = "Events / %.0f GeV/c^{2}" % h.binWidth() tauEmbedding.scaleNormalization(h) h.stackMCHistograms() h.addMCUncertainty() _opts = {"ymaxfactor": 1.5} _opts.update(opts) _opts_log = {"ymin": 1e-2, "ymaxfactor": 2} _opts_log.update(_opts) _opts_log.update(opts_log) _opts2 = {"ymin": 0, "ymax": 2} h.createFrame(name, opts=_opts, opts2=_opts2, createRatio=ratio) h.setLegend(histograms.createLegend()) deltaPhi = "#Delta#phi(#tau jet, E_{T}^{miss})" coord = {"x": 0.5, "y": 0.55, "size": 20} if "AfterBTagging" in name: histograms.addText(text="Without %s cut"%deltaPhi, **coord) elif "AfterDeltaPhi160" in name: histograms.addText(text="%s < 160^{#circ}"%deltaPhi, **coord) elif "AfterDeltaPhi130" in name: histograms.addText(text="%s < 130^{#circ}"%deltaPhi, **coord) common(h, xlabel, ylabel) name += "_log" h.createFrame(name, opts=_opts_log, opts2=_opts2, createRatio=ratio) h.setLegend(histograms.createLegend()) ROOT.gPad.SetLogy(True) common(h, xlabel, ylabel)
def Save(self, name): hObserved = self.CreateGraph("Observed") hExpected = self.CreateGraph("Expected") hExpected1s = self.CreateGraph("Expected1") hExpected1s.SetFillColor(ROOT.kYellow) hExpected2s = self.CreateGraph("Expected2") hExpected2s.SetFillColor(ROOT.kOrange) style = tdrstyle.TDRStyle() plot = plots.ComparisonManyPlot( histograms.HistoGraph(hObserved, "Observed"), [ histograms.HistoGraph(hExpected, "Expected"), histograms.HistoGraph(hExpected1s, "Expected1"), histograms.HistoGraph(hExpected2s, "Expected2") ]) obsStyle = styles.getDataStyle().clone() plot.histoMgr.forHisto("Observed", styles.getDataStyle().clone()) plot.histoMgr.setHistoDrawStyle("Observed", "PL") expStyle = styles.getDataStyle().clone() expStyle.append(styles.StyleLine(lineStyle=2)) expStyle.append(styles.StyleLine(lineColor=ROOT.kRed)) expStyle.append(styles.StyleMarker(markerStyle=ROOT.kFullSquare)) expStyle.append(styles.StyleMarker(markerColor=ROOT.kRed)) plot.histoMgr.forHisto("Expected", expStyle) plot.histoMgr.setHistoDrawStyle("Expected", "PL") plot.histoMgr.setHistoDrawStyle("Expected1", "PL3") plot.histoMgr.setHistoDrawStyle("Expected2", "PL3") plot.createFrame(name, opts={ "xmin": 70.1, "xmax": 169.9, "ymin": 0, "ymax": 0.2 }) plot.frame.GetXaxis().SetTitle(self.xtitle) plot.frame.GetYaxis().SetTitle(self.ytitle) plot.histoMgr.setHistoLegendStyle("Observed", "PL") plot.histoMgr.setHistoLegendStyle("Expected", "PL") plot.histoMgr.setHistoLegendStyle("Expected1", "F") plot.histoMgr.setHistoLegendStyle("Expected2", "F") plot.histoMgr.setHistoLegendLabelMany({ "Expected": "Expected median", "Expected1": "Expected median #pm1#sigma", "Expected2": "Expected median #pm2#sigma" }) plot.setLegend(histograms.createLegend(0.55, 0.68, 0.9, 0.93)) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) textSize = 16 textX = 0.19 textY = 0.8 textDY = 0.038 histograms.addText(textX, textY + 2 * textDY, "t#rightarrowbH^{#pm}, H^{#pm}#rightarrow#tau#nu", textSize) histograms.addText(textX, textY + textDY, "Fully hadronic final state", textSize) histograms.addText(textX, textY, "BR(H^{#pm}#rightarrow#tau^{#pm} #nu) = 1", textSize) plot.draw() plot.save()
def fitData(self, histo): parInvQCD = self.parInvQCD parMCEWK = self.parMCEWK nInvQCD = self.nInvQCD nFitInvQCD = self.nFitInvQCD nMCEWK = self.nMCEWK class FitFunction: def __call__(self, x, par): return par[0] * ( par[1] * QCDFunction(x, parInvQCD, 1 / nFitInvQCD) + (1 - par[1]) * EWKFunction(x, parMCEWK, 1 / nMCEWK)) class QCDOnly: def __call__(self, x, par): return par[0] * par[1] * QCDFunction(x, parInvQCD, 1 / nFitInvQCD) rangeMin = histo.GetXaxis().GetXmin() rangeMax = histo.GetXaxis().GetXmax() numberOfParameters = 2 print "Fit range ", rangeMin, " - ", rangeMax theFit = TF1("theFit", FitFunction(), rangeMin, rangeMax, numberOfParameters) plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo, histo.GetName())) plot.createFrame("combinedfit" + self.label, opts={ "ymin": 1e-5, "ymaxfactor": 2. }) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) print "data events ", histo.Integral(0, histo.GetNbinsX()) histo.Fit(theFit, "R") theFit.SetRange(histo.GetXaxis().GetXmin(), histo.GetXaxis().GetXmax()) theFit.SetLineStyle(2) theFit.Draw("same") par = theFit.GetParameters() qcdOnly = TF1("qcdOnly", QCDOnly(), rangeMin, rangeMax, numberOfParameters) qcdOnly.FixParameter(0, par[0]) qcdOnly.FixParameter(1, par[1]) qcdOnly.SetLineStyle(2) qcdOnly.Draw("same") histograms.addText(0.35, 0.8, "Data, Baseline TauID") histograms.addText(0.4, 0.3, "QCD", 15) plot.histoMgr.appendHisto(histograms.Histo(qcdOnly, "qcdOnly")) plot.getPad().SetLogy(True) plot.draw() plot.save() fitPars = "fit parameters " i = 0 while i < numberOfParameters: fitPars = fitPars + " " + str(par[i]) i = i + 1 print fitPars nBaseQCD = par[0] self.QCDfraction = par[1] if len(self.label) > 0: print "Bin ", self.label print "Integral ", nBaseQCD print "QCD fraction ", self.QCDfraction return theFit
def fitEWK(self, histo, options="R"): rangeMin = histo.GetXaxis().GetXmin() rangeMax = histo.GetXaxis().GetXmax() # rangeMin = 120 # rangeMax = 120 numberOfParameters = 4 print "Fit range ", rangeMin, " - ", rangeMax class FitFunction: def __call__(self, x, par): return EWKFunction(x, par, 1, 1) # return SumFunction(x,par) # return TestFunction(x,par,1) class PlotFunction: def __call__(self, x, par): return EWKFunction(x, par, 0) theFit = TF1('theFit', FitFunction(), rangeMin, rangeMax, numberOfParameters) thePlot = TF1('thePlot', PlotFunction(), rangeMin, rangeMax, numberOfParameters) theFit.SetParLimits(0, 5, 30) theFit.SetParLimits(1, 90, 120) theFit.SetParLimits(2, 30, 50) theFit.SetParLimits(3, 0.001, 1) if self.label == "4050": theFit.SetParLimits(0, 5, 20) theFit.SetParLimits(1, 90, 120) theFit.SetParLimits(2, 30, 50) theFit.SetParLimits(3, 0.001, 1) if self.label == "5060": theFit.SetParLimits(0, 5, 20) theFit.SetParLimits(1, 90, 120) theFit.SetParLimits(2, 20, 50) theFit.SetParLimits(3, 0.001, 1) if self.label == "6070": theFit.SetParLimits(0, 5, 50) theFit.SetParLimits(1, 90, 150) theFit.SetParLimits(2, 20, 50) theFit.SetParLimits(3, 0.001, 1) if self.label == "7080": theFit.SetParLimits(0, 5, 60) theFit.SetParLimits(1, 90, 200) theFit.SetParLimits(2, 20, 100) theFit.SetParLimits(3, 0.001, 1) if self.label == "80100": theFit.SetParLimits(0, 5, 50) theFit.SetParLimits(1, 50, 170) theFit.SetParLimits(2, 20, 60) theFit.SetParLimits(3, 0.001, 1) if self.label == "100120": theFit.SetParLimits(0, 5, 50) theFit.SetParLimits(1, 90, 170) theFit.SetParLimits(2, 20, 60) theFit.SetParLimits(3, 0.001, 1) if self.label == "120150": theFit.SetParLimits(0, 5, 50) theFit.SetParLimits(1, 60, 170) theFit.SetParLimits(2, 10, 100) theFit.SetParLimits(3, 0.001, 1) if self.label == "150": theFit.SetParLimits(0, 5, 50) theFit.SetParLimits(1, 70, 170) theFit.SetParLimits(2, 20, 100) theFit.SetParLimits(3, 0.001, 1) plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo, histo.GetName())) plot.createFrame("ewkfit" + self.label, opts={ "ymin": 1e-5, "ymaxfactor": 2. }) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) self.normEWK = histo.Integral(0, histo.GetNbinsX()) histo.Scale(1 / self.normEWK) histo.Fit(theFit, options) theFit.SetRange(histo.GetXaxis().GetXmin(), histo.GetXaxis().GetXmax()) theFit.SetLineStyle(2) theFit.Draw("same") self.parMCEWK = theFit.GetParameters() fitPars = "fit parameters " i = 0 while i < numberOfParameters: fitPars = fitPars + " " + str(self.parMCEWK[i]) thePlot.SetParameter(i, theFit.GetParameter(i)) i = i + 1 thePlot.Draw("same") histograms.addText(0.2, 0.2, "EWK MC, baseline TauID") plot.histoMgr.appendHisto(histograms.Histo(theFit, "Fit")) plot.getPad().SetLogy(True) plot.draw() plot.save() self.parMCEWK = theFit.GetParameters() print fitPars self.nMCEWK = theFit.Integral(0, 1000, self.parMCEWK) print "Integral ", self.normEWK * self.nMCEWK
def fitQCD(self, origHisto): histo = origHisto.Clone("histo") rangeMin = histo.GetXaxis().GetXmin() rangeMax = histo.GetXaxis().GetXmax() numberOfParameters = 8 print "Fit range ", rangeMin, " - ", rangeMax class FitFunction: def __call__(self, x, par): return QCDFunction(x, par, 1) theFit = TF1('theFit', FitFunction(), rangeMin, rangeMax, numberOfParameters) theFit.SetParLimits(0, 1, 20) theFit.SetParLimits(1, 20, 40) theFit.SetParLimits(2, 10, 25) theFit.SetParLimits(3, 1, 10) theFit.SetParLimits(4, 0, 150) theFit.SetParLimits(5, 10, 100) theFit.SetParLimits(6, 0.0001, 1) theFit.SetParLimits(7, 0.001, 0.05) if self.label == "Baseline": rangeMax = 240 if self.label == "7080": theFit.SetParLimits(5, 10, 100) # if self.label == "100120": # theFit.SetParLimits(0,1,20) # theFit.SetParLimits(2,1,25) # theFit.SetParLimits(3,0.1,20) if self.label == "120150": theFit.SetParLimits(0, 1, 20) theFit.SetParLimits(3, 0.1, 5) gStyle.SetOptFit(0) plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo, histo.GetName())) plot.createFrame("qcdfit" + self.label, opts={ "ymin": 1e-5, "ymaxfactor": 2. }) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) self.normInvQCD = histo.Integral(0, histo.GetNbinsX()) histo.Scale(1 / self.normInvQCD) histo.Fit(theFit, "LR") theFit.SetRange(histo.GetXaxis().GetXmin(), histo.GetXaxis().GetXmax()) theFit.SetLineStyle(2) theFit.Draw("same") histograms.addText(0.4, 0.8, "Inverted TauID") plot.histoMgr.appendHisto(histograms.Histo(theFit, "Fit")) plot.getPad().SetLogy(True) plot.draw() plot.save() self.parInvQCD = theFit.GetParameters() fitPars = "fit parameters " i = 0 while i < numberOfParameters: fitPars = fitPars + " " + str(self.parInvQCD[i]) i = i + 1 print fitPars self.nFitInvQCD = theFit.Integral(0, 1000, self.parInvQCD) print "Integral ", self.normInvQCD * self.nFitInvQCD
def fitQCD(self,origHisto): histo = origHisto.Clone("histo") rangeMin = histo.GetXaxis().GetXmin() rangeMax = histo.GetXaxis().GetXmax() numberOfParameters = 8 print "Fit range ",rangeMin, " - ",rangeMax class FitFunction: def __call__( self, x, par ): return QCDFunction(x,par,1) theFit = TF1('theFit',FitFunction(),rangeMin,rangeMax,numberOfParameters) theFit.SetParLimits(0,1,20) theFit.SetParLimits(1,20,40) theFit.SetParLimits(2,10,25) theFit.SetParLimits(3,1,10) theFit.SetParLimits(4,0,150) theFit.SetParLimits(5,10,100) theFit.SetParLimits(6,0.0001,1) theFit.SetParLimits(7,0.001,0.05) if self.label == "Baseline": rangeMax = 240 if self.label == "7080": theFit.SetParLimits(5,10,100) # if self.label == "100120": # theFit.SetParLimits(0,1,20) # theFit.SetParLimits(2,1,25) # theFit.SetParLimits(3,0.1,20) if self.label == "120150": theFit.SetParLimits(0,1,20) theFit.SetParLimits(3,0.1,5) gStyle.SetOptFit(0) plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo,histo.GetName())) plot.createFrame("qcdfit"+self.label, opts={"ymin": 1e-5, "ymaxfactor": 2.}) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) self.normInvQCD = histo.Integral(0,histo.GetNbinsX()) histo.Scale(1/self.normInvQCD) histo.Fit(theFit,"LR") theFit.SetRange(histo.GetXaxis().GetXmin(),histo.GetXaxis().GetXmax()) theFit.SetLineStyle(2) theFit.Draw("same") histograms.addText(0.4,0.8,"Inverted TauID") plot.histoMgr.appendHisto(histograms.Histo(theFit,"Fit")) plot.getPad().SetLogy(True) plot.draw() plot.save() self.parInvQCD = theFit.GetParameters() fitPars = "fit parameters " i = 0 while i < numberOfParameters: fitPars = fitPars + " " + str(self.parInvQCD[i]) i = i + 1 print fitPars self.nFitInvQCD = theFit.Integral(0,1000,self.parInvQCD) print "Integral ",self.normInvQCD*self.nFitInvQCD
def fitData(self,histo): parInvQCD = self.parInvQCD parMCEWK = self.parMCEWK nInvQCD = self.nInvQCD nFitInvQCD = self.nFitInvQCD nMCEWK = self.nMCEWK class FitFunction: def __call__( self, x, par ): return par[0]*(par[1] * QCDFunction(x,parInvQCD,1/nFitInvQCD) + ( 1 - par[1] ) * EWKFunction(x,parMCEWK,1/nMCEWK)) class QCDOnly: def __call__( self, x, par ): return par[0]*par[1] * QCDFunction(x,parInvQCD,1/nFitInvQCD) rangeMin = histo.GetXaxis().GetXmin() rangeMax = histo.GetXaxis().GetXmax() numberOfParameters = 2 print "Fit range ",rangeMin, " - ",rangeMax theFit = TF1("theFit",FitFunction(),rangeMin,rangeMax,numberOfParameters) plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo,histo.GetName())) plot.createFrame("combinedfit"+self.label, opts={"ymin": 1e-5, "ymaxfactor": 2.}) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) print "data events ",histo.Integral(0,histo.GetNbinsX()) histo.Fit(theFit,"R") theFit.SetRange(histo.GetXaxis().GetXmin(),histo.GetXaxis().GetXmax()) theFit.SetLineStyle(2) theFit.Draw("same") par = theFit.GetParameters() qcdOnly = TF1("qcdOnly",QCDOnly(),rangeMin,rangeMax,numberOfParameters) qcdOnly.FixParameter(0,par[0]) qcdOnly.FixParameter(1,par[1]) qcdOnly.SetLineStyle(2) qcdOnly.Draw("same") histograms.addText(0.35,0.8,"Data, Baseline TauID") histograms.addText(0.4,0.3,"QCD",15) plot.histoMgr.appendHisto(histograms.Histo(qcdOnly,"qcdOnly")) plot.getPad().SetLogy(True) plot.draw() plot.save() fitPars = "fit parameters " i = 0 while i < numberOfParameters: fitPars = fitPars + " " + str(par[i]) i = i + 1 print fitPars nBaseQCD = par[0] self.QCDfraction = par[1] if len(self.label) > 0: print "Bin ",self.label print "Integral ", nBaseQCD print "QCD fraction ",self.QCDfraction return theFit
def __call__(self, x, y): mass = "m_{H^{#pm}} = %d GeV/c^{2}" % self.mass br = "BR(t #rightarrow bH^{#pm})=%.2f" % self.br histograms.addText(x, y, mass, size=self.size) histograms.addText(x, y - self.separation, br, size=self.size)
def main(): if len(sys.argv) < 2: usage() dirs = [] dirs.append(sys.argv[1]) datasets = dataset.getDatasetsFromMulticrabDirs(dirs, dataEra=dataEra, searchMode=searchMode, analysisName=analysis, optimizationMode=optMode) datasets.loadLuminosities() datasets.updateNAllEventsToPUWeighted() plots.mergeRenameReorderForDataMC(datasets) datasets.merge("EWK", ["TTJets", "WJets", "DYJetsToLL", "SingleTop", "Diboson"]) style = tdrstyle.TDRStyle() plot = plots.PlotBase() legends = {} name_re = re.compile("SelectedTau_pT_(?P<name>\S+)") for i, histo in enumerate(HISTONAMES): plot.histoMgr.appendHisto(purityGraph(i, datasets, histo)) name = histo match = name_re.search(histo) if match: name = match.group("name") legends["Purity%s" % i] = name # if "AfterMetCut" in name: # legends["Purity%s"%i] = "MET > 60 GeV" if "SelectedTau_pT_CollinearCuts" in name: legends["Purity%s" % i] = "Collinear cuts" if "AfterBtagging" in name: legends["Purity%s" % i] = "B tagging" if "AfterBveto" in name: legends["Purity%s" % i] = "B-jet veto" if "AfterBvetoPhiCuts" in name: legends["Purity%s" % i] = "B-jet veto, TailKiller" if "SelectedTau_pT_BackToBackCuts" in name: legends["Purity%s" % i] = "BackToBack cuts" plot.createFrame("purityLoose", opts={ "xmin": 40, "xmax": 160, "ymin": 0., "ymax": 1.05 }) plot.frame.GetXaxis().SetTitle("p_{T}^{#tau jet} (GeV/c)") plot.frame.GetYaxis().SetTitle("QCD purity") # plot.setEnergy(datasets.getEnergies()) plot.histoMgr.setHistoLegendLabelMany(legends) plot.setLegend(histograms.createLegend(0.3, 0.35, 0.6, 0.5)) # histograms.addText(0.2, 0.3, "TailKiller: MediumPlus", 18) histograms.addText(0.35, 0.28, "BackToBack cuts: TightPlus", 20) histograms.addText(0.35, 0.22, "2011B", 20) histograms.addText(0.2, 0.3, "TailKiller: MediumPlus", 18) # histograms.addText(0.2, 0.3, "TailKiller: TightPlus", 18) plot.setEnergy(datasets.getEnergies()) plot.setLuminosity(datasets.getDataset("Data").getLuminosity()) plot.addStandardTexts() plot.draw() plot.save()
def main(): if len(sys.argv) < 2: usage() dirs = [] dirs.append(sys.argv[1]) datasets = dataset.getDatasetsFromMulticrabDirs(dirs,dataEra=dataEra, searchMode=searchMode, analysisName=analysis, optimizationMode=optMode) datasets.loadLuminosities() datasets.updateNAllEventsToPUWeighted() plots.mergeRenameReorderForDataMC(datasets) datasets.merge("EWK", [ "TTJets", "WJets", "DYJetsToLL", "SingleTop", "Diboson" ]) style = tdrstyle.TDRStyle() plot = plots.PlotBase() legends = {} name_re = re.compile("SelectedTau_pT_(?P<name>\S+)") for i,histo in enumerate(HISTONAMES): plot.histoMgr.appendHisto(purityGraph(i,datasets,histo)) name = histo match = name_re.search(histo) if match: name = match.group("name") legends["Purity%s"%i] = name # if "AfterMetCut" in name: # legends["Purity%s"%i] = "MET > 60 GeV" if "SelectedTau_pT_CollinearCuts" in name: legends["Purity%s"%i] = "Collinear cuts" if "AfterBtagging" in name: legends["Purity%s"%i] = "B tagging" if "AfterBveto" in name: legends["Purity%s"%i] = "B-jet veto" if "AfterBvetoPhiCuts" in name: legends["Purity%s"%i] = "B-jet veto, TailKiller" if "SelectedTau_pT_BackToBackCuts" in name: legends["Purity%s"%i] = "BackToBack cuts" plot.createFrame("purityLoose", opts={"xmin": 40, "xmax": 160, "ymin": 0., "ymax": 1.05}) plot.frame.GetXaxis().SetTitle("p_{T}^{#tau jet} (GeV/c)") plot.frame.GetYaxis().SetTitle("QCD purity") # plot.setEnergy(datasets.getEnergies()) plot.histoMgr.setHistoLegendLabelMany(legends) plot.setLegend(histograms.createLegend(0.3, 0.35, 0.6, 0.5)) # histograms.addText(0.2, 0.3, "TailKiller: MediumPlus", 18) histograms.addText(0.35, 0.28, "BackToBack cuts: TightPlus", 20) histograms.addText(0.35, 0.22, "2011B", 20) histograms.addText(0.2, 0.3, "TailKiller: MediumPlus", 18) # histograms.addText(0.2, 0.3, "TailKiller: TightPlus", 18) plot.setEnergy(datasets.getEnergies()) plot.setLuminosity(datasets.getDataset("Data").getLuminosity()) plot.addStandardTexts() plot.draw() plot.save()
def drawPlot(h, name, xlabel, ylabel="Events / %.0f GeV/c", rebin=1, log=True, ratio=True, opts={}, opts2={}, moveLegend={}, **kwargs): if rebin > 1: h.histoMgr.forEachHisto(lambda h: h.getRootHisto().Rebin(rebin)) ylab = ylabel if "%" in ylabel: ylab = ylabel % h.binWidth() #scaleNormalization(h) #h.stackMCHistograms() sigErr = h.histoMgr.getHisto("Normal").getRootHisto().Clone("Normal_err") sigErr.SetFillColor(ROOT.kRed - 7) sigErr.SetMarkerSize(0) sigErr.SetFillStyle(3005) h.prependPlotObject(sigErr, "E2") if h.histoMgr.hasHisto("Embedded"): embErr = h.histoMgr.getHisto("Embedded").getRootHisto().Clone( "Embedded_err") embErr.SetFillColor(ROOT.kBlue - 7) embErr.SetFillStyle(3004) embErr.SetMarkerSize(0) h.prependPlotObject(embErr, "E2") if hasattr(h, "embeddingVariation"): h.prependPlotObject(h.embeddingVariation, "[]") if hasattr(h, "embeddingDataVariation"): h.prependPlotObject(h.embeddingDataVariation, "[]") _opts = {"ymin": 0.01, "ymaxfactor": 2} if not log: _opts["ymin"] = 0 _opts["ymaxfactor"] = 1.1 _opts2 = {"ymin": 0.5, "ymax": 1.5} _opts.update(opts) _opts2.update(opts2) if log: name = name + "_log" h.createFrame(name, createRatio=ratio, opts=_opts, opts2=_opts2) h.getPad().SetLogy(log) if ratio: h.getFrame2().GetYaxis().SetTitle("Ratio") # Very, very ugly hack if h.histoMgr.hasHisto("EmbeddedData"): if h.ratios[1].getName() != "Embedded": raise Exception("Assumption failed") h.ratios[1].setDrawStyle("PE2") rh = h.ratios[1].getRootHisto() rh.SetFillColor(ROOT.kBlue - 7) rh.SetFillStyle(3004) # err = h.ratios[1].getRootHisto().Clone("Embedded_ratio_err") # err.SetFillColor(ROOT.kBlue-7) # err.SetFillStyle(3004) # err.SetMarkerSize(0) # h.prependPlotObjectToRatio(err, "E2") #yaxis = h.getFrame2().GetYaxis() #yaxis.SetTitleSize(yaxis.GetTitleSize()*0.7) #yaxis.SetTitleOffset(yaxis.GetTitleOffset()*1.5) h.setLegend( histograms.moveLegend( histograms.moveLegend(histograms.createLegend(), **moveLegend))) tmp = sigErr.Clone("tmp") tmp.SetFillColor(ROOT.kBlack) tmp.SetFillStyle(3013) #tmp.SetFillStyle(sigErr.GetFillStyle()); tmp.SetFillColor(sigErr.GetFillColor()) tmp.SetLineColor(ROOT.kWhite) h.legend.AddEntry(tmp, "Stat. unc.", "F") x = h.legend.GetX1() y = h.legend.GetY1() x += 0.05 y -= 0.03 if hasattr(h, "embeddingDataVariation"): histograms.addText(x, y, "[ ]", size=17, color=h.embeddingDataVariation.GetMarkerColor()) x += 0.05 histograms.addText(x, y, "Embedded data min/max", size=17) y -= 0.03 if hasattr(h, "embeddingVariation"): histograms.addText(x, y, "[ ]", size=17, color=h.embeddingVariation.GetMarkerColor()) x += 0.05 histograms.addText(x, y, "Embedded MC min/max", size=17) y -= 0.03 #if hasattr(h, "embeddingDataVariation"): # h.legend.AddEntry(h.embeddingDataVariation, "Embedded data min/max", "p") #if hasattr(h, "embeddingVariation"): # h.legend.AddEntry(h.embeddingVariation, "Embedded MC min/max", "p") common(h, xlabel, ylab, **kwargs)
def __call__(self, x, y): mass = "m_{H^{#pm}} = %d GeV/c^{2}" % self.mass br = "BR(t #rightarrow bH^{#pm})=%.2f" % self.br histograms.addText(x, y, mass, size=self.size) histograms.addText(x, y-self.separation, br, size=self.size)
def doPlots(mainTable, xvalues, signalDatasets, signalPostfix, consequtive=True): allName = "All events" cuts = [ "Trigger and HLT_MET cut", "primary vertex", "taus == 1", "trigger scale factor", "electron veto", "muon veto", "njets", "MET", "btagging", "btagging scale factor", "deltaPhiTauMET<160", ] xerrs = [0]*len(xvalues) yvalues = {} yerrs = {} for cut in cuts: yvalues[cut] = [] yerrs[cut] = [] for name in signalDatasets: column = mainTable.getColumn(name=name) # Get the counts (returned objects are of type dataset.Count, # and have both value and uncertainty allCount = column.getCount(column.getRowNames().index("All events")) prevCount = allCount for cut in cuts: cutCount = column.getCount(column.getRowNames().index(cut)) eff = cutCount.clone() if consequtive: eff.divide(prevCount) prevCount = cutCount else: eff.divide(allCount) # N(cut) / N(all) yvalues[cut].append(eff.value()) yerrs[cut].append(eff.uncertainty()) def createErrors(cutname): gr = ROOT.TGraphErrors(len(xvalues), array.array("d", xvalues), array.array("d", yvalues[cutname]), array.array("d", xerrs), array.array("d", yerrs[cutname])) gr.SetMarkerStyle(24) gr.SetMarkerColor(2) gr.SetMarkerSize(2) gr.SetLineStyle(1) gr.SetLineWidth(4) return gr def setStyle(gr, lc, ls, ms): gr.SetLineColor(lc) gr.SetLineStyle(ls) gr.SetMarkerColor(lc) gr.SetMarkerStyle(ms) gtrig = createErrors("Trigger and HLT_MET cut") setStyle(gtrig, lc=38, ls=8, ms=20) #gtau = createErrors("trigger scale factor") gtau = createErrors("taus == 1") setStyle(gtau, lc=2, ls=3, ms=21) gveto = createErrors("muon veto") setStyle(gveto, lc=1, ls=5, ms=22) gjets = createErrors("njets") setStyle(gjets, lc=4, ls=1, ms=23) gmet = createErrors("MET") setStyle(gmet, lc=2, ls=2, ms=24) gbtag = createErrors("btagging") setStyle(gbtag, lc=1, ls=6, ms=24) gdphi = createErrors("deltaPhiTauMET<160") setStyle(gdphi, lc=9, ls=3, ms=25) glist = [gtrig, gtau, gveto, gjets, gmet, gbtag, gdphi] #opts = {"xmin": 75, "xmax": 165, "ymin": 0.001} opts = {"xmin": 75, "xmax": 165, "ymin": 7e-4, "ymax": 2e-1} name = "SignalEfficiency" if consequtive: opts.update({"ymin": 2.5e-2, "ymax": 1.15}) name += "Conseq" name += "_"+signalPostfix canvasFrame = histograms.CanvasFrame([histograms.HistoGraph(g, "", "") for g in glist], name, **opts) canvasFrame.frame.GetYaxis().SetTitle("Selection efficiency") canvasFrame.frame.GetXaxis().SetTitle("m_{H^{+}} (GeV/c^{2})") canvasFrame.canvas.SetLogy(True) canvasFrame.frame.Draw() for gr in glist: gr.Draw("PL same") histograms.addEnergyText() histograms.addCmsPreliminaryText(text="Simulation") legend = histograms.createLegend(x1=0.5, y1=0.5, x2=0.85, y2=0.75) legend = histograms.moveLegend(legend, dx=-0.3, dy=-0.04) if not consequtive and signalPostfix == "HH": legend = histograms.moveLegend(legend, dy=0.05) legend.AddEntry(gtrig,"Trigger", "lp"); # legend.AddEntry(gtau, "#tau-jet identification", "lp"); legend.AddEntry(gtau, "#tau_{h} identification", "lp"); legend.AddEntry(gveto ,"lepton vetoes", "lp"); legend.AddEntry(gjets ,"3 jets", "lp"); legend.AddEntry(gmet,"E_{T}^{miss}", "lp") legend.AddEntry(gbtag,"b tagging", "lp") # legend.AddEntry(gdphi,"#Delta#phi(#tau, E_{T}^{miss})<160^{o} ", "lp") legend.AddEntry(gdphi,"#Delta#phi(#tau_{h}, E_{T}^{miss})<160^{o} ", "lp") legend.Draw() process = { "HW": "t#bar{t} #rightarrow W^{+}bH^{-}#bar{b}", "HH": "t#bar{t} #rightarrow H^{+}bH^{-}#bar{b}" }[signalPostfix] histograms.addText(x=legend.GetX1()+0.02, y=legend.GetY2()+0.01, text=process, size=17) canvasFrame.canvas.SaveAs(".png") canvasFrame.canvas.SaveAs(".C") canvasFrame.canvas.SaveAs(".eps")
def fitEWK(self,histo,options="R"): rangeMin = histo.GetXaxis().GetXmin() rangeMax = histo.GetXaxis().GetXmax() # rangeMin = 120 # rangeMax = 120 numberOfParameters = 4 print "Fit range ",rangeMin, " - ",rangeMax class FitFunction: def __call__( self, x, par ): return EWKFunction(x,par,1,1) # return SumFunction(x,par) # return TestFunction(x,par,1) class PlotFunction: def __call__( self, x, par ): return EWKFunction(x,par,0) theFit = TF1('theFit',FitFunction(),rangeMin,rangeMax,numberOfParameters) thePlot = TF1('thePlot',PlotFunction(),rangeMin,rangeMax,numberOfParameters) theFit.SetParLimits(0,5,30) theFit.SetParLimits(1,90,120) theFit.SetParLimits(2,30,50) theFit.SetParLimits(3,0.001,1) if self.label == "4050": theFit.SetParLimits(0,5,20) theFit.SetParLimits(1,90,120) theFit.SetParLimits(2,30,50) theFit.SetParLimits(3,0.001,1) if self.label == "5060": theFit.SetParLimits(0,5,20) theFit.SetParLimits(1,90,120) theFit.SetParLimits(2,20,50) theFit.SetParLimits(3,0.001,1) if self.label == "6070": theFit.SetParLimits(0,5,50) theFit.SetParLimits(1,90,150) theFit.SetParLimits(2,20,50) theFit.SetParLimits(3,0.001,1) if self.label == "7080": theFit.SetParLimits(0,5,60) theFit.SetParLimits(1,90,200) theFit.SetParLimits(2,20,100) theFit.SetParLimits(3,0.001,1) if self.label == "80100": theFit.SetParLimits(0,5,50) theFit.SetParLimits(1,50,170) theFit.SetParLimits(2,20,60) theFit.SetParLimits(3,0.001,1) if self.label == "100120": theFit.SetParLimits(0,5,50) theFit.SetParLimits(1,90,170) theFit.SetParLimits(2,20,60) theFit.SetParLimits(3,0.001,1) if self.label == "120150": theFit.SetParLimits(0,5,50) theFit.SetParLimits(1,60,170) theFit.SetParLimits(2,10,100) theFit.SetParLimits(3,0.001,1) if self.label == "150": theFit.SetParLimits(0,5,50) theFit.SetParLimits(1,70,170) theFit.SetParLimits(2,20,100) theFit.SetParLimits(3,0.001,1) plot = plots.PlotBase() plot.histoMgr.appendHisto(histograms.Histo(histo,histo.GetName())) plot.createFrame("ewkfit"+self.label, opts={"ymin": 1e-5, "ymaxfactor": 2.}) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) self.normEWK = histo.Integral(0,histo.GetNbinsX()) histo.Scale(1/self.normEWK) histo.Fit(theFit,options) theFit.SetRange(histo.GetXaxis().GetXmin(),histo.GetXaxis().GetXmax()) theFit.SetLineStyle(2) theFit.Draw("same") self.parMCEWK = theFit.GetParameters() fitPars = "fit parameters " i = 0 while i < numberOfParameters: fitPars = fitPars + " " + str(self.parMCEWK[i]) thePlot.SetParameter(i,theFit.GetParameter(i)) i = i + 1 thePlot.Draw("same") histograms.addText(0.2,0.2,"EWK MC, baseline TauID") plot.histoMgr.appendHisto(histograms.Histo(theFit,"Fit")) plot.getPad().SetLogy(True) plot.draw() plot.save() self.parMCEWK = theFit.GetParameters() print fitPars self.nMCEWK = theFit.Integral(0,1000,self.parMCEWK) print "Integral ",self.normEWK*self.nMCEWK
def Save(self,name): hObserved = self.CreateGraph("Observed") hExpected = self.CreateGraph("Expected") hExpected1s = self.CreateGraph("Expected1") hExpected1s.SetFillColor(ROOT.kYellow) hExpected2s = self.CreateGraph("Expected2") hExpected2s.SetFillColor(ROOT.kOrange) style = tdrstyle.TDRStyle() plot = plots.ComparisonManyPlot( histograms.HistoGraph(hObserved, "Observed"), [ histograms.HistoGraph(hExpected, "Expected"), histograms.HistoGraph(hExpected1s, "Expected1"), histograms.HistoGraph(hExpected2s, "Expected2") ] ) obsStyle = styles.getDataStyle().clone() plot.histoMgr.forHisto("Observed", styles.getDataStyle().clone()) plot.histoMgr.setHistoDrawStyle("Observed", "PL") expStyle = styles.getDataStyle().clone() expStyle.append(styles.StyleLine(lineStyle=2)) expStyle.append(styles.StyleLine(lineColor=ROOT.kRed)) expStyle.append(styles.StyleMarker(markerStyle=ROOT.kFullSquare)) expStyle.append(styles.StyleMarker(markerColor=ROOT.kRed)) plot.histoMgr.forHisto("Expected", expStyle) plot.histoMgr.setHistoDrawStyle("Expected", "PL") plot.histoMgr.setHistoDrawStyle("Expected1", "PL3") plot.histoMgr.setHistoDrawStyle("Expected2", "PL3") plot.createFrame(name, opts={"xmin": 70.1, "xmax": 169.9, "ymin":0, "ymax": 0.2}) plot.frame.GetXaxis().SetTitle(self.xtitle) plot.frame.GetYaxis().SetTitle(self.ytitle) plot.histoMgr.setHistoLegendStyle("Observed", "PL") plot.histoMgr.setHistoLegendStyle("Expected", "PL") plot.histoMgr.setHistoLegendStyle("Expected1", "F") plot.histoMgr.setHistoLegendStyle("Expected2", "F") plot.histoMgr.setHistoLegendLabelMany({ "Expected": "Expected median", "Expected1": "Expected median #pm1#sigma", "Expected2": "Expected median #pm2#sigma" }) plot.setLegend(histograms.createLegend(0.55,0.68,0.9,0.93)) histograms.addCmsPreliminaryText() histograms.addEnergyText() histograms.addLuminosityText(x=None, y=None, lumi=self.lumi) textSize = 16 textX = 0.19 textY = 0.8 textDY = 0.038 histograms.addText(textX,textY+2*textDY,"t#rightarrowbH^{#pm}, H^{#pm}#rightarrow#tau#nu",textSize) histograms.addText(textX,textY+textDY,"Fully hadronic final state",textSize) histograms.addText(textX,textY,"BR(H^{#pm}#rightarrow#tau^{#pm} #nu) = 1",textSize) plot.draw() plot.save()
def drawPlot(h, name, xlabel, ylabel="Events / %.0f GeV/c", rebin=1, log=True, ratio=True, opts={}, opts2={}, moveLegend={}, **kwargs): if rebin > 1: h.histoMgr.forEachHisto(lambda h: h.getRootHisto().Rebin(rebin)) ylab = ylabel if "%" in ylabel: ylab = ylabel % h.binWidth() #scaleNormalization(h) #h.stackMCHistograms() sigErr = h.histoMgr.getHisto("Normal").getRootHisto().Clone("Normal_err") sigErr.SetFillColor(ROOT.kRed-7) sigErr.SetMarkerSize(0) sigErr.SetFillStyle(3005) h.prependPlotObject(sigErr, "E2") if h.histoMgr.hasHisto("Embedded"): embErr = h.histoMgr.getHisto("Embedded").getRootHisto().Clone("Embedded_err") embErr.SetFillColor(ROOT.kBlue-7) embErr.SetFillStyle(3004) embErr.SetMarkerSize(0) h.prependPlotObject(embErr, "E2") if hasattr(h, "embeddingVariation"): h.prependPlotObject(h.embeddingVariation, "[]") if hasattr(h, "embeddingDataVariation"): h.prependPlotObject(h.embeddingDataVariation, "[]") _opts = {"ymin": 0.01, "ymaxfactor": 2} if not log: _opts["ymin"] = 0 _opts["ymaxfactor"] = 1.1 _opts2 = {"ymin": 0.5, "ymax": 1.5} _opts.update(opts) _opts2.update(opts2) if log: name = name + "_log" h.createFrame(name, createRatio=ratio, opts=_opts, opts2=_opts2) h.getPad().SetLogy(log) if ratio: h.getFrame2().GetYaxis().SetTitle("Ratio") # Very, very ugly hack if h.histoMgr.hasHisto("EmbeddedData"): if h.ratios[1].getName() != "Embedded": raise Exception("Assumption failed") h.ratios[1].setDrawStyle("PE2") rh = h.ratios[1].getRootHisto() rh.SetFillColor(ROOT.kBlue-7) rh.SetFillStyle(3004) # err = h.ratios[1].getRootHisto().Clone("Embedded_ratio_err") # err.SetFillColor(ROOT.kBlue-7) # err.SetFillStyle(3004) # err.SetMarkerSize(0) # h.prependPlotObjectToRatio(err, "E2") #yaxis = h.getFrame2().GetYaxis() #yaxis.SetTitleSize(yaxis.GetTitleSize()*0.7) #yaxis.SetTitleOffset(yaxis.GetTitleOffset()*1.5) h.setLegend(histograms.moveLegend(histograms.moveLegend(histograms.createLegend(), **moveLegend))) tmp = sigErr.Clone("tmp") tmp.SetFillColor(ROOT.kBlack) tmp.SetFillStyle(3013) #tmp.SetFillStyle(sigErr.GetFillStyle()); tmp.SetFillColor(sigErr.GetFillColor()) tmp.SetLineColor(ROOT.kWhite) h.legend.AddEntry(tmp, "Stat. unc.", "F") x = h.legend.GetX1() y = h.legend.GetY1() x += 0.05; y -= 0.03 if hasattr(h, "embeddingDataVariation"): histograms.addText(x, y, "[ ]", size=17, color=h.embeddingDataVariation.GetMarkerColor()); x += 0.05 histograms.addText(x, y, "Embedded data min/max", size=17); y-= 0.03 if hasattr(h, "embeddingVariation"): histograms.addText(x, y, "[ ]", size=17, color=h.embeddingVariation.GetMarkerColor()); x += 0.05 histograms.addText(x, y, "Embedded MC min/max", size=17); y-= 0.03 #if hasattr(h, "embeddingDataVariation"): # h.legend.AddEntry(h.embeddingDataVariation, "Embedded data min/max", "p") #if hasattr(h, "embeddingVariation"): # h.legend.AddEntry(h.embeddingVariation, "Embedded MC min/max", "p") common(h, xlabel, ylab, **kwargs)