コード例 #1
0
ファイル: newfitter.py プロジェクト: nsmith-/DiBosonTP
    def fitBin(name, allProbeCondition, passingProbeCondition) :
        ROOT.gDirectory.mkdir(name).cd()
        fitter = PassFailSimulFitter(name, fitVariable)
        fitter.addDataFromTree(tmc, 'mcData', allProbeCondition+mcTruthCondition, passingProbeCondition, separatePassFail = True, weightVariable='weight')
        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(tmc, 'data', allProbeCondition, passingProbeCondition, weightVariable='weight')
        res = fitter.fit('simPdf', 'data')
        effValue = res.floatParsFinal().find('efficiency')
        dataEff = effValue.getVal()
        dataEffErrHi = effValue.getErrorHi()
        dataEffErrLo = effValue.getErrorLo()
        res.SetName('fitresults')
        c = fitter.drawFitCanvas(res)
        c.Write()
        h.Write()
        res.Write()

        fitter.workspace.Write()
        print name, ': Data=%.2f, MC=%.2f, Ratio=%.2f' % (dataEff, mcEff, dataEff/mcEff)
        condition = ' && '.join(allProbeCondition)
        variations = {
                'EFF_CUTCOUNT' : (mcEff, res),
                'EFF_CUTCOUNT_UP' : (mcEffHi, res),
                'EFF_CUTCOUNT_DOWN' : (mcEffLo, res),
                'EFF_FIT' : (mcEff, res),
                'EFF_FIT_UP' : (mcEffHi, res),
                'EFF_FIT_DOWN' : (mcEffLo, 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 'EFF_FIT' == 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('..')
コード例 #2
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('..')
コード例 #3
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('..')