def saveSigmaDev(self, legend, isData, log, lumi, hdata, hMC, r_ymin=-8, r_ymax=8, label="(Data - MC)/#sigma(MC)", outputDir='plots/', xlog=False): self.myCanvas.cd() pad1 = TPad("pad1", "pad1", 0, 0.25, 1, 1.0) pad1.SetBottomMargin(0.12) pad1.Draw() pad2 = TPad("pad2", "pad2", 0, 0.05, 1, 0.25) pad2.SetTopMargin(0.1) pad2.SetBottomMargin(0.3) pad2.Draw() pad1.cd() if (log): pad1.SetLogy(1) if (xlog): pad1.SetLogx(1) pad2.SetLogx(1) for i in range(0, len(self.histos)): if (self.ToDraw[i] != 0): if str(type(self.histos[i])) == "<class 'ROOT.TEfficiency'>": self.makeRate(self.histos[i], self.options[i]) else: self.histos[i].Draw(self.options[i]) if (legend): self.makeLegend() self.myLegend.SetTextSize(0.035) # Modify the legend size self.myLegend.Draw() for band in self.bands: band.Draw('f') for line in self.lines: line.Draw() for arrow in self.arrows: arrow.Draw() for latex in self.latexs: lat = TLatex() lat.SetNDC() lat.SetTextAlign(latex[-1]) lat.SetTextSize(latex[-2]) lat.SetTextFont(latex[-3]) lat.DrawLatex(latex[0], latex[1], latex[2]) if type(hMC) != list: hMClist = [hMC] else: hMClist = hMC devs = [] for tmp_hMC in hMClist: ind = hMClist.index(tmp_hMC) tmp_dev = hdata.Clone(tmp_hMC.GetName() + '_ratio') for n in range(1, tmp_dev.GetNbinsX() + 1): data_value = hdata.GetBinContent(n) MC_value = tmp_hMC.GetBinContent(n) MC_err = tmp_hMC.GetBinError(n) tmp_dev.SetBinContent(n, (data_value - MC_value) / MC_err) tmp_dev.SetTitle("") tmp_dev.GetYaxis().SetRangeUser(r_ymin, r_ymax) tmp_dev.GetYaxis().SetTitle(label) tmp_dev.GetYaxis().CenterTitle() tmp_dev.GetYaxis().SetLabelSize(0.12) tmp_dev.GetXaxis().SetLabelSize(0.12) tmp_dev.GetYaxis().SetTitleOffset(0.3) tmp_dev.GetYaxis().SetNdivisions(4) tmp_dev.GetYaxis().SetTitleSize(0.12) tmp_dev.GetXaxis().SetTitleSize(0.12) tmp_dev.GetXaxis().SetLabelOffset(0.08) tmp_dev.GetXaxis().SetTitle('') tmp_dev.SetFillColor(r.kRed + 1) tmp_dev.SetLineColor(r.kBlack) devs.append(tmp_dev) xmin = tmp_dev.GetBinLowEdge(1) xmax = tmp_dev.GetBinLowEdge(tmp_dev.GetNbinsX() + 1) #tmp_ratio.Draw("E,SAME"); pad2.cd() for dev in devs: dev.Draw('hist,same') line = TLine(xmin, 0, xmax, 0) line.SetLineColor(r.kGray + 2) line.Draw('') pad1.cd() self.banner2(isData, lumi) if not outputDir[-1] == '/': dirName = outputDir + '/' else: dirName = outputDir for i, plotName in enumerate(self.plotNames): pad1.cd() pad1.SetLogy(0) path = dirName + plotName pathlog = dirName + self.plotNamesLog[i] self.ensurePath(path) self.myCanvas.SaveAs(path) """ if not '.root' in pathlog: pad1.cd() pad1.SetLogy() self.myCanvas.SaveAs(pathlog) """ pad1.IsA().Destructor(pad1) pad2.IsA().Destructor(pad2) self.myLegend.IsA().Destructor(self.myLegend) self.myCanvas.IsA().Destructor(self.myCanvas)
def saveRatio(self, legend, isData, log, lumi, hdata, hMC, r_ymin=0, r_ymax=2, label="Data/Prediction", outputDir='plots/'): self.myCanvas.cd() pad1 = TPad("pad1", "pad1", 0, 0.25, 1, 1.0) pad1.SetBottomMargin(0.12) pad1.Draw() pad2 = TPad("pad2", "pad2", 0, 0.05, 1, 0.25) pad2.SetTopMargin(0.1) pad2.SetBottomMargin(0.3) pad2.Draw() pad1.cd() if (log): pad1.SetLogy(1) for i in range(0, len(self.histos)): if (self.ToDraw[i] != 0): #self.histos[i].SetMinimum(0.00001) #self.histos[i].SetMinimum(0.1) #self.histos[i].SetMinimum(0.0001) #self.histos[i].SetMaximum(0.5) if str(type(self.histos[i])) == "<class 'ROOT.TEfficiency'>": self.makeRate(self.histos[i], self.options[i]) else: self.histos[i].Draw(self.options[i]) if (legend): self.makeLegend() self.myLegend.SetTextSize(0.035) # Modify the legend size self.myLegend.Draw() for band in self.bands: band.Draw('f') for line in self.lines: line.Draw() for arrow in self.arrows: arrow.Draw() for latex in self.latexs: lat = TLatex() lat.SetNDC() lat.SetTextAlign(latex[-1]) lat.SetTextSize(latex[-2]) lat.SetTextFont(latex[-3]) lat.DrawLatex(latex[0], latex[1], latex[2]) if type(hMC) != list: hMClist = [hMC] else: hMClist = hMC ratios = [] for tmp_hMC in hMClist: ind = hMClist.index(tmp_hMC) if str(type(tmp_hMC)) == "<class 'ROOT.TEfficiency'>": tmp_den = tmp_hMC.GetTotalHistogram().Clone() tmp_num = hdata.GetTotalHistogram().Clone() for n in range(0, tmp_num.GetNbinsX()): tmp_den.SetBinContent(n + 1, tmp_hMC.GetEfficiency(n + 1)) tmp_num.SetBinContent(n + 1, hdata.GetEfficiency(n + 1)) #tmp_num.SetBinErrorUp(n+1, tmp_hMC.GetEfficiencyErrorUp(n+1)) tmp_den.SetBinError(n + 1, tmp_hMC.GetEfficiencyErrorLow(n + 1)) #tmp_den.SetBinErrorUp(n+1, hdata.GetEfficiencyErrorUp(n+1)) tmp_num.SetBinError(n + 1, hdata.GetEfficiencyErrorLow(n + 1)) tmp_ratio = tmp_num.Clone(tmp_hMC.GetName() + '_ratio') tmp_ratio.Divide(tmp_den) else: tmp_ratio = hdata.Clone(tmp_hMC.GetName() + '_ratio') tmp_ratio.Divide(tmp_hMC) tmp_ratio.SetTitle("") tmp_ratio.GetYaxis().SetRangeUser(r_ymin, r_ymax) tmp_ratio.GetYaxis().SetTitle(label) tmp_ratio.GetYaxis().CenterTitle() tmp_ratio.GetYaxis().SetLabelSize(0.12) tmp_ratio.GetXaxis().SetLabelSize(0.12) tmp_ratio.GetYaxis().SetTitleOffset(0.3) tmp_ratio.GetYaxis().SetNdivisions(4) tmp_ratio.GetYaxis().SetTitleSize(0.12) tmp_ratio.GetXaxis().SetTitleSize(0.12) tmp_ratio.GetXaxis().SetLabelOffset(0.08) tmp_ratio.GetXaxis().SetTitle('') tmp_ratio.SetMarkerStyle(20) #tmp_ratio.SetFillColorAlpha(r.kAzure-3,0.8) #tmp_ratio.SetFillStyle(3017) tmp_ratio.SetMarkerColor(r.kBlack) tmp_ratio.SetMarkerSize(0.8) tmp_ratio.SetMarkerColor(r.kBlack if len(hMClist) == 1 else tmp_hMC.GetMarkerColor()) tmp_ratio.SetLineColor(r.kBlack if len(hMClist) == 1 else tmp_hMC.GetLineColor()) tmp_ratio.SetLineColor(r.kBlack) tmp_ratio.SetLineStyle(tmp_hMC.GetLineStyle()) ratios.append(tmp_ratio) xmin = tmp_ratio.GetBinLowEdge(1) xmax = tmp_ratio.GetBinLowEdge(tmp_ratio.GetNbinsX() + 1) #tmp_ratio.Draw("E,SAME"); pad2.cd() for rat in ratios: rat.Draw('PE1,same') line = TLine(xmin, 1, xmax, 1) line.SetLineColor(r.kGray + 2) line.Draw('') pad1.cd() self.banner2(isData, lumi) if not outputDir[-1] == '/': dirName = outputDir + '/' else: dirName = outputDir for i, plotName in enumerate(self.plotNames): pad1.cd() pad1.SetLogy(0) path = dirName + plotName pathlog = dirName + self.plotNamesLog[i] self.ensurePath(path) self.myCanvas.SaveAs(path) if not '.root' in pathlog: pad1.cd() pad1.SetLogy() self.myCanvas.SaveAs(pathlog) pad1.IsA().Destructor(pad1) pad2.IsA().Destructor(pad2) self.myLegend.IsA().Destructor(self.myLegend) self.myCanvas.IsA().Destructor(self.myCanvas)
def saveRatio(self, legend, isData, log, lumi, hdata, hMC, r_ymin=0, r_ymax=2, label="Data/Prediction"): self.myCanvas.cd() pad1 = TPad("pad1", "pad1", 0, 0.25, 1, 1.0) pad1.SetBottomMargin(0.12) pad1.Draw() pad2 = TPad("pad2", "pad2", 0, 0.05, 1, 0.25) pad2.SetTopMargin(0.1) pad2.SetBottomMargin(0.3) pad2.Draw() pad1.cd() if (log): pad1.SetLogy(1) for i in range(0, len(self.histos)): if (self.ToDraw[i] != 0): self.histos[i].Draw(self.options[i]) if (legend): self.makeLegend() self.myLegend.Draw() for band in self.bands: band.Draw('f') for line in self.lines: line.Draw() for arrow in self.arrows: arrow.Draw() for latex in self.latexs: lat = TLatex() lat.SetNDC() lat.SetTextSize(latex[-1]) lat.SetTextFont(latex[-2]) lat.DrawLatex(latex[0], latex[1], latex[2]) if type(hMC) != list: hMClist = [hMC] else: hMClist = hMC ratios = [] for tmp_hMC in hMClist: ind = hMClist.index(tmp_hMC) tmp_ratio = hdata.Clone(tmp_hMC.GetName() + '_ratio') tmp_ratio.Divide(tmp_hMC) tmp_ratio.SetTitle("") tmp_ratio.GetYaxis().SetRangeUser(r_ymin, r_ymax) tmp_ratio.GetYaxis().SetTitle(label) tmp_ratio.GetYaxis().CenterTitle() tmp_ratio.GetYaxis().SetLabelSize(0.12) tmp_ratio.GetXaxis().SetLabelSize(0.12) tmp_ratio.GetYaxis().SetTitleOffset(0.3) tmp_ratio.GetYaxis().SetNdivisions(4) tmp_ratio.GetYaxis().SetTitleSize(0.14) tmp_ratio.GetXaxis().SetTitleSize(0.14) tmp_ratio.GetXaxis().SetTitle('') tmp_ratio.SetMarkerStyle(tmp_hMC.GetMarkerStyle()) tmp_ratio.SetFillColorAlpha(r.kBlue - 3, 0.9) tmp_ratio.SetFillStyle(3017) tmp_ratio.SetMarkerColor(r.kBlack) tmp_ratio.SetMarkerSize(0.6) #tmp_ratio.SetMarkerColor(r.kBlack if len(hMClist) == 1 else tmp_hMC.GetMarkerColor()); #tmp_ratio.SetLineColor (r.kBlack if len(hMClist) == 1 else tmp_hMC.GetLineColor ()); tmp_ratio.SetLineColor(tmp_hMC.GetLineColor()) tmp_ratio.SetLineStyle(tmp_hMC.GetLineStyle()) ratios.append(tmp_ratio) xmin = tmp_ratio.GetBinLowEdge(1) xmax = tmp_ratio.GetBinLowEdge(tmp_ratio.GetNbinsX() + 1) #tmp_ratio.Draw("E,SAME"); pad2.cd() for rat in ratios: rat.Draw('PE2,same') line = TLine(xmin, 1, xmax, 1) line.SetLineColor(r.kGray + 2) line.Draw('') pad1.cd() self.banner2(isData, lumi) for i, plotName in enumerate(self.plotNames): pad1.cd() pad1.SetLogy(0) path = 'plots/' + plotName pathlog = 'plots/' + self.plotNamesLog[i] self.ensurePath(path) self.myCanvas.SaveAs(path) if not '.root' in pathlog: pad1.cd() pad1.SetLogy() self.myCanvas.SaveAs(pathlog) pad1.IsA().Destructor(pad1) pad2.IsA().Destructor(pad2) self.myLegend.IsA().Destructor(self.myLegend) self.myCanvas.IsA().Destructor(self.myCanvas)