diff --git a/config/samples_template.yml b/config/samples_template.yml index 15a9c63fb301f5c52dd78e08d9d6e8649401e52c..31b06b441a783558a4c5846f3b1e0dad3236ed88 100644 --- a/config/samples_template.yml +++ b/config/samples_template.yml @@ -202,7 +202,7 @@ TTbb_4f_TTToSemiLeptonic_TuneCP5-Powheg-Openloops-Pythia8: eras: ['2016', '2017', '2018'] subprocesses: ['ttB'] is_signal: true - cross-section: 14.27 + cross-section: 15.75 generated-events: genEventSumw split: -4 @@ -210,7 +210,7 @@ TTbb_4f_TTTo2L2Nu_TuneCP5-Powheg-Openloops-Pythia8: eras: ['2016', '2017', '2018'] subprocesses: ['ttB'] is_signal: true - cross-section: 3.568 + cross-section: 3.938 generated-events: genEventSumw split: -4 @@ -218,7 +218,7 @@ TTbb_4f_TTToHadronic_TuneCP5-Powheg-Openloops-Pythia8: eras: ['2016', '2017', '2018'] subprocesses: ['ttB'] is_signal: true - cross-section: 14.59 + cross-section: 16.11 generated-events: genEventSumw split: -4 diff --git a/include/BTagEffEvaluator.h b/include/BTagEffEvaluator.h index 8d9288abc5e36c629c11ec7e4174840b7e5e465a..490cd146dbe91d40b7f62a4ec4d5830301728752 100644 --- a/include/BTagEffEvaluator.h +++ b/include/BTagEffEvaluator.h @@ -13,13 +13,13 @@ std::map flavMap { {5, "b"}, {4, "c"}, {0, "light"}}; class BTagEffEvaluator { public: - BTagEffEvaluator(std::string path, std::vector thresholds) { + BTagEffEvaluator(std::string path, std::vector thresholds, std::string era) { _thresholds = thresholds; TFile* file = TFile::Open(path.c_str()); for (auto flav: flavMap) { //flavEffsL.emplace(flav.first, static_cast(file->Get("1lep_4j_jet_pt_eta_" + flav.second + "_wpL_eff"))); //flavEffsM.emplace(flav.first, static_cast(file->Get(("1lep_4j_jet_pt_eta_" + flav.second + "_wpM_eff").c_str()))); - TH2D* hist = dynamic_cast(file->Get(("1lep_4j_jet_pt_eta_" + flav.second + "_wpM_eff").c_str())); + TH2D* hist = dynamic_cast(file->Get(("1lep_4j_jet_pt_eta_" + flav.second + "_wpM_" + era.c_str() + "_eff").c_str())); hist->SetDirectory(0); std::cout << "Loaded " << hist->GetName() << std::endl; flavEffsM.emplace(flav.first, hist); @@ -43,7 +43,11 @@ class BTagEffEvaluator { // return SFT; // } float evaluate(int flavour, float bTag, float pT, float eta, float SFM) const { - float effM = flavEffsM.at(flavour)->GetBinContent(flavEffsM.at(flavour)->FindBin(pT, eta)); + std::shared_ptr hist = flavEffsM.at(flavour); + // take value from previous bin if we are above the pT range + if (pT >= hist->GetXaxis()->GetXmax()) + pT = hist->GetXaxis()->GetBinLowEdge(hist->GetXaxis()->GetLast()); + float effM = hist->GetBinContent(hist->FindBin(pT, eta)); if (bTag <= _thresholds.at(0)) { return (1 - SFM * effM) / (1 - effM); } else { diff --git a/include/HistogramEvaluator.h b/include/HistogramEvaluator.h index 9003534774f898b7fbf9f2d9f9aaabf2ed00b9e3..a16cc2f911b26161a4d0934b5f762dded21d0cce 100644 --- a/include/HistogramEvaluator.h +++ b/include/HistogramEvaluator.h @@ -29,4 +29,16 @@ class HistogramEvaluator { private: std::shared_ptr _hist; +}; + +template +class DummyHistogramEvaluator { + public: + DummyHistogramEvaluator() { + } + virtual ~DummyHistogramEvaluator() {} + + float evaluate(Args... args) const { + return 1; + } }; \ No newline at end of file diff --git a/python/bTagPlotter.py b/python/bTagPlotter.py index 01942ff76ea97ac825a90117dcd9307a307e5129..31d95ec60ba389b7f2a12d9862abfbd582c0ed46 100644 --- a/python/bTagPlotter.py +++ b/python/bTagPlotter.py @@ -49,9 +49,15 @@ class bTagPlotter(NanoAODHistoModule): if "subprocess" in sampleCfg: noSel = utils.splitTTjetFlavours(sampleCfg, tree, noSel) - self.bTagEff = op.define("BTagEffEvaluator", 'const auto <> = BTagEffEvaluator("/t3home/swertz/swertz/bambooOutput/200113_bTagEffs/results/efficiencies.root", {0.277});') - # self.nJetRwgt = op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/swertz/swertz/bambooOutput/191209_btagSFchecks/results/{sample}.root", "1lep_nJets_sfCorr");') - self.nJetNBHTRwgt = op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/swertz/swertz/bambooOutput/200827_bTagPatch3D_fix2L2Nu/results/summedProcesses_{era}_ratios.root", "1lep_nJets_nBFlav_HT_sfCorr");') + if era == "2016": + self.bTagEff = op.define("BTagEffEvaluator", 'const auto <> = BTagEffEvaluator("/t3home/umolinat/CMSSW_10_2_16_NanoSkim/src/ttbbRun2Bamboo/test/02_10_2020-b-tag_patches/results/summedProcesses_2016_ratios.root", {0.3093}, "2016");') + if era == "2017": + self.bTagEff = op.define("BTagEffEvaluator", 'const auto <> = BTagEffEvaluator("/t3home/umolinat/CMSSW_10_2_16_NanoSkim/src/ttbbRun2Bamboo/test/02_10_2020-b-tag_patches/results/summedProcesses_2017_ratios.root", {0.3033}, "2017");') + if era == "2018": + self.bTagEff = op.define("BTagEffEvaluator", 'const auto <> = BTagEffEvaluator("/t3home/umolinat/CMSSW_10_2_16_NanoSkim/src/ttbbRun2Bamboo/test/02_10_2020-b-tag_patches/results/summedProcesses_2018_ratios.root", {0.277}, "2018");') + + self.nJetRwgt = op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/swertz/swertz/bambooOutput/191209_btagSFchecks/results/{sample}.root", "1lep_nJets_sfCorr");') + self.nJetNBHTRwgt = op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/umolinat/CMSSW_10_2_16_NanoSkim/src/ttbbRun2Bamboo/test/02_10_2020-b-tag_patches/results/summedProcesses_{era}_ratios.root", "1lep_nJets_nBFlav_HT_sfCorr");') self.nJetHTttHRwgt = defs.getNJetHTttHPatches(sample, sampleCfg, era) return tree,noSel,be,lumiArgs @@ -93,12 +99,15 @@ class bTagPlotter(NanoAODHistoModule): # shape correction bTagWeight = [ op.rng_product(cleanedJets, lambda jet: jet.btagSF_deepjet_shape) ] - # fixed working point + ## fixed working point bTagSFPerJet = op.map(cleanedJets, lambda j: self.bTagEff.evaluate(j.hadronFlavour, j.btagDeepFlavB, j.pt, op.abs(j.eta), j.btagSF_deepjet_M)) bTagWeightFixWP = op.rng_product(bTagSFPerJet) - + + print("sample") + print(sample) + # correction weights - # nJetCorrWgt = self.nJetRwgt.evaluate(op.rng_len(cleanedJets)) + nJetCorrWgt = self.nJetRwgt.evaluate(op.rng_len(cleanedJets)) nJetNBHTCorrWgt = self.nJetNBHTRwgt.evaluate(op.rng_len(cleanedJets), op.rng_len(bFlavJets), HT) nJetHTttHCorrWgt = self.nJetHTttHRwgt.evaluate(HT, op.rng_len(cleanedJets)) @@ -106,8 +115,8 @@ class bTagPlotter(NanoAODHistoModule): oneEle_BWgtAll_Sel = oneEleTriggerSel.refine("1ele_bWgt", weight=bTagWeight) oneMu_BWgtFixWP_Sel = oneMuTriggerSel.refine("1mu_bWgt_fixWP", weight=bTagWeightFixWP) oneEle_BWgtFixWP_Sel = oneEleTriggerSel.refine("1ele_bWgt_fixWP", weight=bTagWeightFixWP) - # oneMu_BWgtAll_nJetCorr_Sel = oneMu_BWgtAll_Sel.refine("1mu_bWgt_nJetCorr", weight=nJetCorrWgt) - # oneEle_BWgtAll_nJetCorr_Sel = oneEle_BWgtAll_Sel.refine("1ele_bWgt_nJetCorr", weight=nJetCorrWgt) + oneMu_BWgtAll_nJetCorr_Sel = oneMu_BWgtAll_Sel.refine("1mu_bWgt_nJetCorr", weight=nJetCorrWgt) + oneEle_BWgtAll_nJetCorr_Sel = oneEle_BWgtAll_Sel.refine("1ele_bWgt_nJetCorr", weight=nJetCorrWgt) oneMu_BWgtAll_nJetNBHTCorr_Sel = oneMu_BWgtAll_Sel.refine("1mu_bWgt_nJetNBHTCorr", weight=nJetNBHTCorrWgt) oneEle_BWgtAll_nJetNBHTCorr_Sel = oneEle_BWgtAll_Sel.refine("1ele_bWgt_nJetNBHTCorr", weight=nJetNBHTCorrWgt) oneMu_BWgtAll_nJetHTttHCorr_Sel = oneMu_BWgtAll_Sel.refine("1mu_bWgt_nJetHTttHCorr", weight=nJetHTttHCorrWgt) @@ -116,64 +125,67 @@ class bTagPlotter(NanoAODHistoModule): ## overall jet multiplicity for vari, sel in [ ("", (oneMuTriggerSel, oneEleTriggerSel)), ("_shape", (oneMu_BWgtAll_Sel, oneEle_BWgtAll_Sel)), + ("_shape_FixWP", (oneMu_BWgtFixWP_Sel, oneEle_BWgtFixWP_Sel)), ("_shape_nJetNBHTCorr", (oneMu_BWgtAll_nJetNBHTCorr_Sel, oneEle_BWgtAll_nJetNBHTCorr_Sel)), ("_shape_nJetHTttHCorr", (oneMu_BWgtAll_nJetHTttHCorr_Sel, oneEle_BWgtAll_nJetHTttHCorr_Sel)), ]: - plots += utils.makeMergedPlots([(f"1mu{vari}", sel[0]), (f"1ele{vari}", sel[1])], + plots += utils.makeMergedPlots([(f"1mu{vari}", sel[0]), (f"1ele{vari}", sel[1])], #THIS IS WHERE THE PROBLEM IS BUT ONLY FOR MUONS f"1lep{vari}", "nJets", EqBin(10, 0, 10), var=op.rng_len(cleanedJets), title="Number of jets", plotopts=utils.getOpts("lep")) htBinning = VarBin([0, 60, 120, 180, 240, 300, 400, 500, 600, 700, 800, 1000, 1500]) - plots += utils.makeMergedPlots([(f"1mu{vari}", sel[0]), (f"1ele{vari}", sel[1])], f"1lep{vari}", "nJets_nBFlav_HT", + plots += utils.makeMergedPlots([(f"1mu{vari}", sel[0]), (f"1ele{vari}", sel[1])], f"1lep{vari}", "nJets_nBFlav_HT", #THIS WORKS FINE (EqBin(10, 0, 10), EqBin(5, 0, 5), htBinning), (op.rng_len(cleanedJets), op.rng_len(bFlavJets), HT), plotopts=utils.getOpts("lep"), title="Number of jets vs. number of true b-flavour jets vs. jet HT", xTitle="nJets", yTitle="nBFlav", zTitle="HT") #### >= 4 jets - # fourJetCut = op.rng_len(cleanedJets) >= 4 - # oneMu_4Jet_Sel = oneMuTriggerSel.refine("muon_4jets", cut=fourJetCut) - # oneEle_4Jet_Sel = oneEleTriggerSel.refine("ele_4jets", cut=fourJetCut) - - # oneMu_4Jet_BWgtAll_Sel = oneMu_4Jet_Sel.refine("1mu_4j_bWgt", cut=fourJetCut, weight=bTagWeight) - # oneEle_4Jet_BWgtAll_Sel = oneEle_4Jet_Sel.refine("1ele_4j_bWgt", cut=fourJetCut, weight=bTagWeight) - - # oneMu_4Jet_BWgtAll_nJetCorr_Sel = oneMu_4Jet_BWgtAll_Sel.refine("1mu_4j_bWgt_nJetCorr", weight=nJetCorrWgt) - # oneEle_4Jet_BWgtAll_nJetCorr_Sel = oneEle_4Jet_BWgtAll_Sel.refine("1ele_4j_bWgt_nJetCorr", weight=nJetCorrWgt) - - # for flav, flavJets in zip(['b', 'c', 'light'], [bFlavJets, cFlavJets, lFlavJets]): - # # b tagging efficiencies as a function of flavour/pt/|eta| - # if self.args.efficiencies: - # binning = (VarBin([30, 40, 60, 80, 100, 200, 350, 1000]), EqBin(5, 0, 2.5)) - - # pt = op.map(flavJets, lambda j: j.pt) - # eta = op.map(flavJets, lambda j: op.abs(j.eta)) - # plots.append(Plot.make2D(f"1mu_4j_jet_pt_eta_{flav}", (pt, eta), oneMu_4Jet_Sel, binning)) - # plots.append(Plot.make2D(f"1el_4j_jet_pt_eta_{flav}", (pt, eta), oneEle_4Jet_Sel, binning)) - # plots.append(SummedPlot(f"1lep_4j_jet_pt_eta_{flav}", plots[-2:-1])) - - # for (wp, deepThr) in zip(["L", "M", "T"], [0.0494, 0.277, 0.7264]): - # selJets = op.select(flavJets, lambda j: j.btagDeepFlavB >= deepThr) - # pt = op.map(selJets, lambda j: j.pt) - # eta = op.map(selJets, lambda j: op.abs(j.eta)) - # plots.append(Plot.make2D(f"1mu_4j_jet_pt_eta_{flav}_wp{wp}", (pt, eta), oneMu_4Jet_Sel, binning)) - # plots.append(Plot.make2D(f"1el_4j_jet_pt_eta_{flav}_wp{wp}", (pt, eta), oneEle_4Jet_Sel, binning)) - # plots.append(SummedPlot(f"1lep_4j_jet_pt_eta_{flav}_wp{wp}", plots[-2:-1])) - - # # jet pt for each flavour for events with at least 3 jets of that flavour - # cuts = [op.rng_len(flavJets) >= 3] - # sel = oneMu_4Jet_Sel.refine(oneMu_4Jet_Sel.name + f"{flav}", cut=cuts) - # for i in range(1, 4): - # plots.append(Plot.make1D(f"1mu_4j_eq_{flav}_jet{i}_pt", flavJets[i-1].pt, sel, - # EqBin(30, 30, 730 - i*100), - # title=f"{utils.getCounter(i)} {flav} jet pT (GeV)", plotopts=utils.getOpts("1mu_4j"))) - - # sel = oneMu_4Jet_BWgtAll_Sel.refine(oneMu_4Jet_BWgtAll_Sel.name + f"{flav}", cut=cuts) - # for i in range(1, 4): - # plots.append(Plot.make1D(f"1mu_4j_eq_btagSF_{flav}_jet{i}_pt", flavJets[i-1].pt, sel, - # EqBin(30, 30, 730 - i*100), - # title=f"{utils.getCounter(i)} {flav} jet pT (GeV)", plotopts=utils.getOpts("1mu_4j"))) + fourJetCut = op.rng_len(cleanedJets) >= 4 + oneMu_4Jet_Sel = oneMuTriggerSel.refine("muon_4jets", cut=fourJetCut) + oneEle_4Jet_Sel = oneEleTriggerSel.refine("ele_4jets", cut=fourJetCut) + oneMu_4Jet_BWgtAll_Sel = oneMu_4Jet_Sel.refine("1mu_4j_bWgt", cut=fourJetCut, weight=bTagWeight) + oneEle_4Jet_BWgtAll_Sel = oneEle_4Jet_Sel.refine("1ele_4j_bWgt", cut=fourJetCut, weight=bTagWeight) + + #oneMu_4Jet_BWgtAll_nJetCorr_Sel = oneMu_4Jet_BWgtAll_Sel.refine("1mu_4j_bWgt_nJetCorr", weight=nJetCorrWgt) + #oneEle_4Jet_BWgtAll_nJetCorr_Sel = oneEle_4Jet_BWgtAll_Sel.refine("1ele_4j_bWgt_nJetCorr", weight=nJetCorrWgt) + + + thresholds = [[0.0614, 0.3093, 0.7221],[0.0521, 0.3033, 0.7489],[0.0494, 0.277, 0.7264]] + dictionary = dict(zip(["2016","2017","2018"], thresholds)) + for flav, flavJets in zip(['b', 'c', 'light'], [bFlavJets, cFlavJets, lFlavJets]): + # b tagging efficiencies as a function of flavour/pt/|eta| + if self.args.efficiencies: + binning = (VarBin([30, 40, 60, 80, 100, 200, 350, 1000]), EqBin(5, 0, 2.5)) + + pt = op.map(flavJets, lambda j: j.pt) + eta = op.map(flavJets, lambda j: op.abs(j.eta)) + plots.append(Plot.make2D(f"1mu_4j_jet_pt_eta_{flav}_{era}", (pt, eta), oneMu_4Jet_Sel, binning)) + plots.append(Plot.make2D(f"1ele_4j_jet_pt_eta_{flav}_{era}", (pt, eta), oneEle_4Jet_Sel, binning)) + plots.append(SummedPlot(f"1lep_4j_jet_pt_eta_{flav}_{era}", plots[-2:-1])) + + for (wp, deepThr) in zip(["L", "M", "T"], dictionary[era]): + selJets = op.select(flavJets, lambda j: j.btagDeepFlavB >= deepThr) + pt = op.map(selJets, lambda j: j.pt) + eta = op.map(selJets, lambda j: op.abs(j.eta)) + plots.append(Plot.make2D(f"1mu_4j_jet_pt_eta_{flav}_wp{wp}_{era}", (pt, eta), oneMu_4Jet_Sel, binning)) + plots.append(Plot.make2D(f"1ele_4j_jet_pt_eta_{flav}_wp{wp}_{era}", (pt, eta), oneEle_4Jet_Sel, binning)) + plots.append(SummedPlot(f"1lep_4j_jet_pt_eta_{flav}_wp{wp}_{era}", plots[-2:-1])) + + # jet pt for each flavour for events with at least 3 jets of that flavour + cuts = [op.rng_len(flavJets) >= 3] + sel = oneMu_4Jet_Sel.refine(oneMu_4Jet_Sel.name + f"{flav}", cut=cuts) + for i in range(1, 4): + plots.append(Plot.make1D(f"1mu_4j_eq_{flav}_jet{i}_pt_{era}", flavJets[i-1].pt, sel, + EqBin(30, 30, 730 - i*100), + title=f"{utils.getCounter(i)} {flav} jet pT (GeV)", plotopts=utils.getOpts("1mu_4j"))) + + sel = oneMu_4Jet_BWgtAll_Sel.refine(oneMu_4Jet_BWgtAll_Sel.name + f"{flav}", cut=cuts) + for i in range(1, 4): + plots.append(Plot.make1D(f"1mu_4j_eq_btagSF_{flav}_jet{i}_pt_{era}", flavJets[i-1].pt, sel, + EqBin(30, 30, 730 - i*100), + title=f"{utils.getCounter(i)} {flav} jet pT (GeV)", plotopts=utils.getOpts("1mu_4j"))) #### >= 6 jets #### event-level minimum deltaR between jets/b jets/light jets @@ -198,6 +210,7 @@ class bTagPlotter(NanoAODHistoModule): for vari, sel in [ ("", oneLep_6Jet_Sel), ("_shape", oneLep_6Jet_BWgtAll_Sel), + ("_shape_FixWP", oneLep_6Jet_BWgtFixWP_Sel), ("_shape_nJetNBHTCorr", oneLep_6Jet_BWgtAll_nJetNBHTCorr_Sel), ("_shape_nJetHTttHCorr", oneLep_6Jet_BWgtAll_nJetHTttHCorr_Sel), ]: @@ -241,10 +254,11 @@ class bTagPlotter(NanoAODHistoModule): # compute efficiencies (divide histo after cut by total histo) if self.args.efficiencies: - for flav in ["b", "c", "light"]: - for wp in ["L", "M", "T"]: - getRatio(in_tf, f"1lep_4j_jet_pt_eta_{flav}_wp{wp}", f"1lep_4j_jet_pt_eta_{flav}", "_eff").Write() - + era = proc[-4:] + if era == "2016" or era == "2017" or era == "2018": + for flav in ["b", "c", "light"]: + for wp in ["L", "M", "T"]: + getRatio(in_tf, f"1lep_4j_jet_pt_eta_{flav}_wp{wp}_{era}", f"1lep_4j_jet_pt_eta_{flav}_{era}", "_eff").Write() in_tf.Close() out_tf.Close() @@ -263,7 +277,7 @@ class bTagPlotter(NanoAODHistoModule): HT.plot2DSlices(hist, outDir, axis, f"{name}_{era}") # plots: compare without SF, with SF, with SF+patches - variations = ["shape", "shape_nJetNBHTCorr", "shape_nJetHTttHCorr"] + variations = ["shape", "shape_FixWP", "shape_nJetNBHTCorr", "shape_nJetHTttHCorr"] plotCfg = { "jet1_eta": { "xTitle": "Leading jet eta", "cats": ["1mu_6j"], "nominal": "{cat}_jet1_eta", "vars": [{"leg": v, "hist": f"{{cat}}_{v}_jet1_eta"} for v in variations] }, "jet1_pt": { "xTitle": "Leading jet pT", "cats": ["1mu_6j"], "nominal": "{cat}_jet1_pt", "vars": [{"leg": v, "hist": f"{{cat}}_{v}_jet1_pt"} for v in variations], "logy": True }, diff --git a/python/controlPlotter.py b/python/controlPlotter.py index 6bd86d7dd1a8d132b750c77b0d7d180918616e60..42f1d8ba12099848f618e4c7c87ea772f9f9cd46 100644 --- a/python/controlPlotter.py +++ b/python/controlPlotter.py @@ -107,7 +107,7 @@ class controlPlotter(NanoAODHistoModule): if self.args.sf_patches == "3d": # 3D b-tagging patches - self.nJetNBHTRwgt = op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/swertz/swertz/bambooOutput/200702_bTagPatch3D/results/summedProcesses_{era}_ratios.root", "1lep_nJets_nBFlav_HT_sfCorr");') + self.nJetNBHTRwgt = op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/swertz/swertz/bambooOutput/200827_bTagPatch3D_fix2L2Nu/results/summedProcesses_{era}_ratios.root", "1lep_nJets_nBFlav_HT_sfCorr");') elif self.args.sf_patches == "tth": # alternatively, 2D ttH b-tagging patches self.nJetHTttHRwgt = defs.getNJetHTttHPatches(sample, sampleCfg, era) diff --git a/python/definitions.py b/python/definitions.py index 01d64901623cc2ba31a21b9d94f3d51d9e26e9b4..b7f4b2553f749d060fa9623905e6d52658d7da61 100644 --- a/python/definitions.py +++ b/python/definitions.py @@ -16,14 +16,9 @@ import utils #### Configure NanoAOD decoration def getNanoAODDescription(era, isMC, doRocCor=True): - groups = ["PV_", "Flag_", "HLT_"] + groups = ["MET_", "PV_", "Flag_", "HLT_"] collections = ["nElectron", "nJet", "nMuon", "nTrigObj"] - if era == "2017": - groups.append("METFixEE2017_") - met = "METFixEE2017" - else: - groups.append("MET_") - met = "MET" + met = "METFixEE2017" if era == "2017" else "MET" varReaders = [] if doRocCor: @@ -332,10 +327,10 @@ myScaleFactors = { } # fill in some defaults: myScalefactors and bamboo.scalefactors.binningVariables_nano -def getScaleFactor(objType, key, periods=None, combine=None, isElectron=False, systName=None, defineOnFirstUse=True): +def getScaleFactor(objType, key, periods=None, combine=None, isElectron=False, systName=None): return scalefactors.get_scalefactor(objType, key, combine=combine, sfLib=myScaleFactors, paramDefs=scalefactors.binningVariables_nano, - isElectron=isElectron, systName=systName, defineOnFirstUse=defineOnFirstUse) + isElectron=isElectron, systName=systName) def getL1PrefiringSystematic(tree): return op.systematic(tree.L1PreFiringWeight_Nom, name="L1prefire", up=tree.L1PreFiringWeight_Up, down=tree.L1PreFiringWeight_Dn) @@ -376,7 +371,7 @@ def buildElectronSelections(tree, noSel, muons, vetoMuons, electrons, vetoElectr eleIDSF = getScaleFactor("lepton", (era, "electron_ID", "cut_tight"), isElectron=True, systName="ele_ID") eleTriggerSF = getScaleFactor("lepton", (era, "electron_trigger"), isElectron=True, systName="ele_trigger") scaleFactors = [ eleRecoSF(electrons[0]), eleIDSF(electrons[0]) ] - + oneEleSel = noSel.refine("electron", cut=op.AND( op.rng_len(vetoMuons) == 0, @@ -416,4 +411,4 @@ def getNJetHTttHPatches(sample, cfg, era): return op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/umolinat/btag_patches/btag_sf_patches_sl_{era}_deepJet.root", "SF_Evt_HT_jets_vs_N_Jets__ttH__btag_NOMINAL");') elif "TTZ" in sample: return op.define("HistogramEvaluator", f'const auto <> = HistogramEvaluator("/t3home/umolinat/btag_patches/btag_sf_patches_sl_{era}_deepJet.root", "SF_Evt_HT_jets_vs_N_Jets__ttZ__btag_NOMINAL");') - return None + return op.define("DummyHistogramEvaluator", f'const auto <> = DummyHistogramEvaluator();') diff --git a/python/simplePlotter.py b/python/simplePlotter.py index 8e0ba5c6b7dc261fd78197e5344672294d34ae52..04fcaa59cdf65829574ffb74f96dd1b6aa8b9d3f 100755 --- a/python/simplePlotter.py +++ b/python/simplePlotter.py @@ -127,8 +127,8 @@ def drawPlot(name, plot, outDir): ratios = [ v["hist"].Clone(HT.randomString()) for v in variations ] for r in ratios: - # r.SetDirectory(0) - r.Divide(nominal) + if nominal != 0: + r.Divide(nominal) ratio_style = "hist" @@ -162,11 +162,10 @@ def drawPlot(name, plot, outDir): ratio_max = 1. ratio_min = 1. for i in range(1, ratios[0].GetNbinsX() + 1): - contents = [r.GetBinContent(i) for r in ratios if r.GetBinContent(i) > 0] - if len(contents): + contents = [r.GetBinContent(i) for r in ratios if ((r.GetBinContent(i) > 0))]# and (r.GetBinContent(i) != float("inf")))] + if ((len(contents)) and (float("inf") not in contents)): ratio_max = max(ratio_max, *contents) ratio_min = min(ratio_min, *contents) - # Symetrize ratio_range = halfRound(max(abs(ratio_max - 1), abs(1 - ratio_min))) ratios[0].GetYaxis().SetRangeUser(max(0, 1 - ratio_range), 1 + ratio_range) diff --git a/python/utils.py b/python/utils.py index b99e43a72c2f252ad42907a0263a31edc9f45a8b..5d188a85d86a2a8d99fb173efdd9834b41c40480 100644 --- a/python/utils.py +++ b/python/utils.py @@ -27,6 +27,7 @@ def getOpts(uname, **kwargs): label = "1 muon" elif "lep" in uname: label = "1 lepton (e/#mu)" + #label = "1 lepton (e/#mu)" if "4j" in uname: label += ", #geq 4 jets" elif "5j" in uname: @@ -196,7 +197,10 @@ def normalizeAndSumSamples(eras, samples, inDir, outPath): if cfg["era"] != era: continue if "syst" in cfg: continue sumWgt = cfg["generated-events"] - xs = cfg["cross-section"] + if "cross-section" in cfg: + xs = cfg["cross-section"] + else: + xs = 1 tf = HT.openFileAndGet(os.path.join(inDir, proc + ".root")) keyList = tf.GetListOfKeys() for key in keyList: