コード例 #1
0
ファイル: newfitter.py プロジェクト: lmdodd/DiBosonTP
    def fitBin(name, allProbeCondition, passingProbeCondition):
        ROOT.gDirectory.mkdir(name).cd()
        fitter = PassFailSimulFitter(name, fitVariable)
        fitter.addDataFromTree(tmc,
                               'mcData',
                               allProbeCondition + mcTruthCondition,
                               passingProbeCondition,
                               separatePassFail=True)
        fitter.addDataFromTree(tmcAlt,
                               'mcAltData',
                               allProbeCondition + mcTruthCondition,
                               passingProbeCondition,
                               separatePassFail=True)
        nMCPass = fitter.workspace.data('mcDataPass').sumEntries()
        nMCFail = fitter.workspace.data('mcDataFail').sumEntries()
        mcEff = nMCPass / (nMCPass + nMCFail)
        mcEffLo = ROOT.TEfficiency.ClopperPearson(int(nMCPass + nMCFail),
                                                  int(nMCPass), 0.68, False)
        mcEffHi = ROOT.TEfficiency.ClopperPearson(int(nMCPass + nMCFail),
                                                  int(nMCPass), 0.68, True)
        h = ROOT.TH1F('mc_cutCount', 'Cut & Count', 2, 0, 2)
        h.SetBinContent(1, nMCPass)
        h.SetBinContent(2, nMCPass + nMCFail)

        # All MC templates must be set up by now
        fitter.setPdf(pdfDefinition)

        print '-' * 40, 'Central value fit'
        fitter.addDataFromTree(tdata, 'data', allProbeCondition,
                               passingProbeCondition)
        res = fitter.fit('simPdf', 'data')
        effValue = res.floatParsFinal().find('efficiency')
        dataEff = effValue.getVal()
        dataEffErrHi = effValue.getErrorHi()
        dataEffErrLo = effValue.getErrorLo()
        scaleFactor = dataEff / mcEff
        maxSf = (dataEff + dataEffErrHi) / mcEffLo
        minSf = (dataEff + dataEffErrLo) / mcEffHi
        res.SetName('fitresults')
        c = fitter.drawFitCanvas(res)
        c.Write()
        h.Write()
        res.Write()

        print '-' * 40, 'Fit with alternate MC template'
        resAlt = fitter.fit('simAltPdf', 'data')
        dataAltEff = resAlt.floatParsFinal().find('efficiency').getVal()
        resAlt.SetName('fitresults_systAltTemplate')
        resAlt.Write()

        print '-' * 40, 'Fit with tag pt > 30 (vs. 25)'
        fitter.addDataFromTree(tdata, 'dataTagPt30',
                               allProbeCondition + ['tag_tag_pt>30'],
                               passingProbeCondition)
        resTagPt30 = fitter.fit('simPdf', 'dataTagPt30')
        dataTagPt30Eff = resTagPt30.floatParsFinal().find(
            'efficiency').getVal()
        resTagPt30.Write()

        print '-' * 40, 'Fit with CMSShape background (vs. Bernstein)'
        resCMSBkg = fitter.fit('simCMSBkgPdf', 'data')
        dataCMSBkgEff = resCMSBkg.floatParsFinal().find('efficiency').getVal()
        resCMSBkg.Write()

        fitter.workspace.Write()
        print name, ': Data=%.2f, MC=%.2f, Ratio=%.2f' % (dataEff, mcEff,
                                                          dataEff / mcEff)
        condition = ' && '.join(allProbeCondition + [passingProbeCondition])
        variations = {
            'CENTRAL': (scaleFactor, res),
            'STAT_UP': (maxSf, res),
            'STAT_DOWN': (minSf, res),
            'SYST_ALT_TEMPL': (dataAltEff / mcEff, resAlt),
            'SYST_TAG_PT30': (dataTagPt30Eff / mcEff, resTagPt30),
            'SYST_CMSSHAPE': (dataCMSBkgEff / mcEff, resCMSBkg),
            'EFF_DATA': (dataEff, res),
            'EFF_DATA_ERRSYM': ((dataEffErrHi - dataEffErrLo) / 2, res),
            'EFF_MC': (mcEff, res),
            'EFF_MC_ERRSYM': ((mcEffHi - mcEffLo) / 2, res),
        }
        cutString = ''
        for varName, value in variations.items():
            (value, fitResult) = value
            cutString += '    if ( variation == Variation::%s && (%s) ) return %f;\n' % (
                varName, condition, value)
            print '  Variation {:>15s} : {:.4f}, edm={:f}, status={:s}'.format(
                varName, value, fitResult.edm(), statusInfo(fitResult))
            if 'STAT' not in varName and fitResult.statusCodeHistory(0) < 0:
                cBad = fitter.drawFitCanvas(fitResult)
                cBad.Print('badFit_%s_%s.png' % (name, varName))

        ROOT.TNamed('cutString', cutString).Write()
        print
        ROOT.gDirectory.cd('..')