From 479d9c404a8b39246bf685ebebd9c167b697a42c Mon Sep 17 00:00:00 2001 From: Sebastien Wertz Date: Wed, 23 Jun 2021 14:35:36 +0200 Subject: [PATCH] use 'signal tag' to distinguish alternative signals; use command-line arg to specify 'main' signal sample for control plots --- config/analysis.yml | 17 +++++++++-------- config/samples_template.yml | 36 +++++++++++++++++++++++++++--------- python/baseTtbbPlotter.py | 9 +++++---- python/controlPlotter.py | 4 +++- python/genTtbbPlotter.py | 2 +- python/utils.py | 18 +++++++----------- 6 files changed, 52 insertions(+), 34 deletions(-) diff --git a/config/analysis.yml b/config/analysis.yml index 1b049d3..41bd878 100644 --- a/config/analysis.yml +++ b/config/analysis.yml @@ -80,7 +80,7 @@ plotIt: legend: ' Single t' fill-color: "#C02942" - systematics: + systematics: # this list is only used for control plots - muon_ID - muon_iso - muon_trigger @@ -125,10 +125,11 @@ plotIt: - jesBBEC1_2018 - jesEC2_2018 - jesHF_2018 - - qcdScale - - qcdMuF - - qcdMuR - - psISR - - psFSR - - hdamp - - tune + # don't include theory uncertainties in control plots + #- qcdScale + #- qcdMuF + #- qcdMuR + #- psISR + #- psFSR + #- hdamp + #- tune diff --git a/config/samples_template.yml b/config/samples_template.yml index d27cf54..df15d8d 100644 --- a/config/samples_template.yml +++ b/config/samples_template.yml @@ -168,32 +168,28 @@ SingleElectron_Run2016H-Nano25Oct2019-v1: TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8: regex: "TTToSemiLeptonic_TuneCP5(_PSweights)?_13TeV-powheg-pythia8(_ext.)?" - #group: TT1L subprocesses: &tt_subprocs ['ttB', 'ttcc', 'ttjj'] signal_subprocesses: &tt_sig_subprocs ['ttB'] # these will be flagged with `is_signal: True` + signal_tag: "powheg_5FS" # only the signal sub-process will keep this eras: ['2016', '2017', '2018'] cross-section: &xs_tt_1l 366. # 831.76 x 0.44 generated-events: genEventSumw split: -6 - TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8: regex: "TTTo2L2Nu_TuneCP5(_PSweights)?_13TeV-powheg-pythia8(_ext.)?" - #group: TT_other - #group: TT2L eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: &xs_tt_2l 91.5 # 831.76 x 0.11 generated-events: genEventSumw split: -6 - TTToHadronic_TuneCP5_13TeV-powheg-pythia8: regex: "TTToHadronic_TuneCP5(_PSweights)?_13TeV-powheg-pythia8(_ext.)?" - #group: TT_other - #group: TT0L eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: &xs_tt_0l 374.3 generated-events: genEventSumw split: -100 @@ -202,22 +198,23 @@ TTbb_4f_TTToSemiLeptonic_TuneCP5-Powheg-Openloops-Pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_sig_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_4FS" cross-section: 14.27 generated-events: genEventSumw split: -4 - TTbb_4f_TTTo2L2Nu_TuneCP5-Powheg-Openloops-Pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_sig_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_4FS" cross-section: 3.568 generated-events: genEventSumw split: -4 - TTbb_4f_TTToHadronic_TuneCP5-Powheg-Openloops-Pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_sig_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_4FS" cross-section: 14.59 generated-events: genEventSumw split: -4 @@ -227,6 +224,7 @@ TTToSemiLeptonic_hdampUP_TuneCP5_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_1l syst: ['hdampup', 'TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -236,6 +234,7 @@ TTToSemiLeptonic_hdampDOWN_TuneCP5_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_1l syst: ['hdampdown', 'TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -245,6 +244,7 @@ TTTo2L2Nu_hdampUP_TuneCP5_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_2l syst: ['hdampup', 'TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -254,6 +254,7 @@ TTTo2L2Nu_hdampDOWN_TuneCP5_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_2l syst: ['hdampdown', 'TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -263,6 +264,7 @@ TTToHadronic_hdampUP_TuneCP5_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_0l syst: ['hdampup', 'TTToHadronic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -272,6 +274,7 @@ TTToHadronic_hdampDOWN_TuneCP5_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_0l syst: ['hdampdown', 'TTToHadronic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -282,6 +285,7 @@ TTToSemiLeptonic_TuneCP5up_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_1l syst: ['tuneup', 'TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -291,6 +295,7 @@ TTToSemiLeptonic_TuneCP5down_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_1l syst: ['tunedown', 'TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -300,6 +305,7 @@ TTTo2L2Nu_TuneCP5up_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_2l syst: ['tuneup', 'TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -309,6 +315,7 @@ TTTo2L2Nu_TuneCP5down_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_2l syst: ['tunedown', 'TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -318,6 +325,7 @@ TTToHadronic_TuneCP5up_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_0l syst: ['tuneup', 'TTToHadronic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -327,6 +335,7 @@ TTToHadronic_TuneCP5down_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_0l syst: ['tunedown', 'TTToHadronic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -337,6 +346,7 @@ TTToSemiLeptonic_TuneCP5CR1_QCDbased_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_1l syst: ['CR1_QCDbased', 'TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -346,6 +356,7 @@ TTTo2L2Nu_TuneCP5CR1_QCDbased_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_2l syst: ['CR1_QCDbased', 'TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -355,6 +366,7 @@ TTToHadronic_TuneCP5CR1_QCDbased_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_0l syst: ['CR1_QCDbased', 'TTToHadronic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -365,6 +377,7 @@ TTToSemiLeptonic_TuneCP5CR2_GluonMove_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_1l syst: ['CR2_GluonMove', 'TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -374,6 +387,7 @@ TTTo2L2Nu_TuneCP5CR2_GluonMove_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_2l syst: ['CR2_GluonMove', 'TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -383,6 +397,7 @@ TTToHadronic_TuneCP5CR2_GluonMove_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_0l syst: ['CR2_GluonMove', 'TTToHadronic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -393,6 +408,7 @@ TTToSemiLeptonic_TuneCP5_erdON_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_1l syst: ['erdON', 'TTToSemiLeptonic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -402,6 +418,7 @@ TTTo2L2Nu_TuneCP5_erdON_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_2l syst: ['erdON', 'TTTo2L2Nu_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw @@ -411,6 +428,7 @@ TTToHadronic_TuneCP5_erdON_13TeV-powheg-pythia8: eras: ['2016', '2017', '2018'] subprocesses: *tt_subprocs signal_subprocesses: *tt_sig_subprocs + signal_tag: "powheg_5FS" cross-section: *xs_tt_0l syst: ['erdON', 'TTToHadronic_TuneCP5_13TeV-powheg-pythia8'] generated-events: genEventSumw diff --git a/python/baseTtbbPlotter.py b/python/baseTtbbPlotter.py index 52a2f12..f70a0a6 100644 --- a/python/baseTtbbPlotter.py +++ b/python/baseTtbbPlotter.py @@ -55,6 +55,7 @@ class baseTtbbPlotter(NanoAODHistoModule): parser.add_argument("-r", "--reduce-split", type=int, default=0, help="Reduce number of jobs by factor X") parser.add_argument("--samples", nargs='*', help="Sample template YML files: JSON files are inserted from env. variable SAMPLE_JSONS") parser.add_argument("--sample-jsons", default=[os.getenv("SAMPLE_JSONS")], nargs='*', help="Sample template YML files: JSON files are inserted from env. variable SAMPLE_JSONS") + parser.add_argument("--main-signal", default="powheg_4FS", help="Main signal sample, used for control plots") def customizeAnalysisCfg(self, analysisCfg): # fill sample template using JSON files @@ -142,7 +143,7 @@ class baseTtbbPlotter(NanoAODHistoModule): pass def postProcess(self, taskList, config=None, workdir=None, resultsdir=None, - makeBU=True, removeBatch=True, createEnvelope=True, moveSystHists=True, removeFileList=True, remove4F5Foverlap=True): + makeBU=True, removeBatch=True, createEnvelope=True, moveSystHists=True, removeFileList=True, removeSignalOverlap=True): self.plotList = self.getPlotList( resultsdir=resultsdir, config=config, @@ -179,9 +180,9 @@ class baseTtbbPlotter(NanoAODHistoModule): for smpName,smpCfg in list(config["samples"].items()): smpCfg.pop("files") - if remove4F5Foverlap: - # remove overlap between 4FS and 5FS ttbb/ttB contributions for plotIt - utils.remove4F5FOverlapPlotIt(config["samples"]) + if removeSignalOverlap: + # remove overlap between alternative signal contributions for plotIt + utils.removeSignalOverlapPlotIt(self.args.main_signal, config["samples"]) def runPlotIt(self, taskList, config=None, workdir=None, resultsdir=None): # run plotIt as defined in HistogramsModule diff --git a/python/controlPlotter.py b/python/controlPlotter.py index 6b8aa9f..31b1957 100644 --- a/python/controlPlotter.py +++ b/python/controlPlotter.py @@ -179,6 +179,8 @@ class controlPlotter(recoBaseTtbbPlotter): [(f"1mu_{selN}", sels[0]), (f"1ele_{selN}", sels[1])], f"1lep_{selN}", "extraLightJet_eta", EqBin(30, -2.4, 2.4), lightJets_notW[0].eta, title="Add. light jet eta") + exit() + return plots def postProcess(self, taskList, config=None, workdir=None, resultsdir=None): @@ -188,5 +190,5 @@ class controlPlotter(recoBaseTtbbPlotter): createEnvelope=True, moveSystHists=True, removeFileList=True, - remove4F5Foverlap=True) + removeSignalOverlap=True) self.runPlotIt(taskList, config, workdir, resultsdir) diff --git a/python/genTtbbPlotter.py b/python/genTtbbPlotter.py index 2f89154..53ce5c1 100644 --- a/python/genTtbbPlotter.py +++ b/python/genTtbbPlotter.py @@ -106,7 +106,7 @@ class genTtbbPlotter(genBaseTtbbPlotter): return plots def postProcess(self, taskList, config=None, workdir=None, resultsdir=None): - super().postProcess(taskList, config, workdir, resultsdir, remove4F5Foverlap=False) + super().postProcess(taskList, config, workdir, resultsdir, removeSignalOverlap=False) # run plotIt to have the 4f/5f comparison self.runPlotIt(taskList, config, workdir, resultsdir) diff --git a/python/utils.py b/python/utils.py index 76d0541..cee6726 100644 --- a/python/utils.py +++ b/python/utils.py @@ -203,20 +203,14 @@ def splitTTjetFlavours(cfg, tree, noSel): noSel = noSel.refine(subProc, cut=(tree.genTtbarId % 100) >= 51) return noSel -def remove4F5FOverlapPlotIt(samplesCfg): - """Give precedence to 4FS sample if both 5FS and 4FS samples are present for any of the ttbj, ttbb or ttB subprocesses before running plotIt""" +def removeSignalOverlapPlotIt(mainSignalTag, samplesCfg): + """Keep a single signal prediction before running plotIt""" toRemove = [] for smpName,smpCfg in samplesCfg.items(): - if not smpCfg.get("is_signal", False): - continue - dec = smpName.split("_")[0] # decay channel - proc = smpCfg.get("subprocess", "") - syst = smpCfg.get("syst", [None])[0] - if dec in ["TTToSemiLeptonic", "TTTo2L2Nu", "TTToHadronic"] and proc in ["ttbj", "ttbb", "ttB"]: - if any((cfg.get("subprocess", "") == proc and nm.startswith(f"TTbb_4f_{dec}_TuneCP5") and cfg.get("syst", [None])[0] == syst) for nm,cfg in samplesCfg.items()): - toRemove.append(smpName) + if smpCfg.get("signal_tag", "") != mainSignalTag: + toRemove.append(smpName) if toRemove: - logger.info(f"Will remove the following from plotIt list because of 4FS/5FS overlap: {toRemove}") + logger.info(f"Will remove the following from plotIt list because of signal overlap: {toRemove}") for nm in toRemove: samplesCfg.pop(nm) @@ -379,6 +373,8 @@ def insertSampleFilesIntoTemplate(template, jsonFiles, selEras=None): newProc["subprocess"] = subProc if subProc in newProc.pop("signal_subprocesses", []): newProc["is_signal"] = True + if not newProc.get("is_signal", False): + newProc.pop("signal_tag", None) newProc["group"] = subProc # be careful with the systematics samples (they have two '__' separators) newName = name.split("__")[0] + "_" + subProc + "__" + "__".join(name.split("__")[1:]) -- GitLab