예제 #1
0
    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'
            ]:
예제 #2
0
파일: efake_plot.py 프로젝트: yiiyama/MonoX
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()
예제 #3
0
파일: smearfit.py 프로젝트: yiiyama/MonoX
    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)