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('..')
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('..')
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('..')