canvas.rtitle = 'Data / Pred.' if pdir == 'p': outname = 'prefit_' + region elif pdir == 'c': outname = 'CRonly_' + region elif pdir == 'b': outname = 'bonly_' + region elif pdir == 's': outname = 'splusb_' + region resultLegend.construct() canvas.addObject(resultLegend.legend, clone=False) canvas.Update( hList=hList, rList=[iLine, iPreUncRatio, iPostUncRatio, iPreRatio, iPostRatio], logy=True) zeroBins = [] for iBin in range(1, dataHist.GetNbinsX() + 1): if dataHist.GetBinContent(iBin) == 0.: zeroBins.append(iBin) if len(zeroBins) != 0: # OK we need to manually edit the ratio histograms after all the acrobat of making inverted ratios.. for prim in canvas.ratioPad.GetListOfPrimitives(): name = prim.GetName().replace('ratio_', '') if name not in [ 'prefitUncRatio', 'postfitUncRatio', 'prefitRatio', 'postfitRatio' ]:
def plotFit(mass, targHist, model, dataType, suffix, bkgModel='nombkgModel', hmcbkg=None, alt='', plotName=''): global canvas if canvas is None: canvas = RatioCanvas(lumi=lumi, sim=(dataType == 'mc')) canvas.Clear(full=True) canvas.titlePave.SetX2NDC(0.5) canvas.legend.setPosition(0.6, 0.7, 0.9, 0.9) canvas.legend.add('obs', title='Observed', opt='LP', color=ROOT.kBlack, mstyle=8) canvas.legend.add('fit', title='Fit', opt='L', lcolor=ROOT.kBlue, lwidth=2, lstyle=ROOT.kSolid) canvas.legend.add('bkg', title='Bkg component', opt='L', lcolor=ROOT.kGreen, lwidth=2, lstyle=ROOT.kDashed) if hmcbkg: canvas.legend.add('mcbkg', title='Bkg (MC truth)', opt='LF', lcolor=ROOT.kRed, lwidth=1, fcolor=ROOT.kRed, fstyle=3003) if targHist.sumEntries() > 500.: plotBinning = plotBinningT else: plotBinning = plotBinningT2 frame = mass.frame() targHist.plotOn(frame, ROOT.RooFit.Binning(*plotBinning)) model.plotOn(frame) model.plotOn(frame, ROOT.RooFit.Components(bkgModel + '_' + suffix), ROOT.RooFit.LineStyle(ROOT.kDashed), ROOT.RooFit.LineColor(ROOT.kGreen)) frame.SetTitle('') frame.SetMinimum(0.) canvas.addHistogram(frame, clone=True, drawOpt='') if hmcbkg: htruth = hmcbkg.Rebin(hmcbkg.GetNbinsX() / plotBinning[0], 'truth') canvas.legend.apply('mcbkg', htruth) canvas.addHistogram(htruth) canvas.rlimits = (-2., 2.) canvas.Update(rList=[], logy=False) frame.Print() # adding ratio pad fitcurve = frame.findObject(model.GetName() + '_Norm[mass]') hresid = targHist.createHistogram('residual', mass, ROOT.RooFit.Binning(*plotBinning)) rdata = ROOT.TGraphErrors(hresid.GetNbinsX()) for iP in range(rdata.GetN()): x = hresid.GetXaxis().GetBinCenter(iP + 1) nData = hresid.GetBinContent(iP + 1) statErr = hresid.GetBinError(iP + 1) nFit = fitcurve.interpolate(x) if statErr > 0.: rdata.SetPoint(iP, x, (nData - nFit) / statErr) else: rdata.SetPoint(iP, x, (nData - nFit)) # rdata.SetPointError(iP, 0., dmet.GetBinError(iP + 1) / norm) rdata.SetMarkerStyle(8) rdata.SetMarkerColor(ROOT.kBlack) rdata.SetLineColor(ROOT.kBlack) canvas.ratioPad.cd() canvas.rtitle = '(data - fit) / #sigma_{data}' rframe = ROOT.TH1F('rframe', '', 1, *plotBinning[1:]) rframe.GetYaxis().SetRangeUser(-2., 2.) rframe.Draw() line = ROOT.TLine(plotBinning[1], 0., plotBinning[2], 0.) line.SetLineWidth(2) line.SetLineColor(ROOT.kBlue) line.Draw() rdata.Draw('EP') canvas._needUpdate = False if not plotName: plotName = 'fit_' + dataType + '_' + suffix if alt: plotName += '_' + alt canvas.printWeb(plotDir, plotName, logy=False) rframe.Delete() if hmcbkg: htruth.Delete() hresid.Delete()
mcpdf.plotOn(frame, ROOT.RooFit.LineColor(ROOT.kRed), ROOT.RooFit.LineStyle(ROOT.kDotted)) # frame.SetTitle('min#Delta#phi(j, E_{T}^{miss}) < 0.5') #frame.GetXaxis().SetTitle('E_{T}^{miss} (GeV)') frame.GetXaxis().SetTitle('') frame.GetXaxis().SetTitleSize(0.) frame.GetXaxis().SetLabelSize(0.) frame.GetYaxis().SetLabelSize(0.) frame.GetYaxis().SetTickSize(0.) canvas.Clear() canvas.xtitle = 'E_{T}^{miss} (GeV)' canvas.ylimits = (0.1, 1000000.) canvas.addHistogram(frame, clone = True, drawOpt = '') canvas.Update(rList = []) fitcurve = frame.findObject('model_Norm[met]') rawcurve = frame.findObject('mcpdf_Norm[met]') rdata = ROOT.TGraphErrors(dmet.GetNbinsX()) for iP in range(rdata.GetN()): x = dmet.GetXaxis().GetBinCenter(iP + 1) norm = fitcurve.interpolate(x) rdata.SetPoint(iP, x, dmet.GetBinContent(iP + 1) / norm) rdata.SetPointError(iP, 0., dmet.GetBinError(iP + 1) / norm) rdata.SetMarkerStyle(8) rdata.SetMarkerColor(ROOT.kBlack) rdata.SetLineColor(ROOT.kBlack)