diff --git a/Analyzer/.gitignore b/Analyzer/.gitignore new file mode 100644 index 0000000..424cfcc --- /dev/null +++ b/Analyzer/.gitignore @@ -0,0 +1 @@ +nbinnorj.cc diff --git a/Analyzer/Helpers.h b/Analyzer/Helpers.h index 03c82f0..ae058cb 100644 --- a/Analyzer/Helpers.h +++ b/Analyzer/Helpers.h @@ -19,6 +19,125 @@ float DeltaPhiNorm(float dphi){ } return _dphi/TMath::Pi(); } +// +// https://github.com/cms-sw/cmssw/blob/CMSSW_10_6_17/RecoJets/JetProducers/python/PileupJetIDCutParams_cfi.py#L44 +// +bool PUJetID_106XUL17Cut_WPTight(float pt, float eta, float disc){ + + if (pt > 0.0 && pt < 10.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.77; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > 0.38; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.31; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.21; + } + else if (pt >= 10.0 && pt < 20.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.77; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > 0.38; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.31; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.21; + } + else if (pt >= 20.0 && pt < 30.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.90; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > 0.60; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.12; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.13; + } + else if (pt >= 30.0 && pt < 40.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.96; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > 0.82; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > 0.20; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > 0.09; + } + else if (pt >= 40.0 && pt < 50.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.98; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > 0.92; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > 0.47; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > 0.29; + } + else return true; + + return true; +} +// +// https://github.com/cms-sw/cmssw/blob/CMSSW_10_6_17/RecoJets/JetProducers/python/PileupJetIDCutParams_cfi.py#L44 +// +bool PUJetID_106XUL17Cut_WPMedium(float pt, float eta, float disc){ + + if (pt > 0.0 && pt < 10.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.26; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.33; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.54; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.37; + } + else if (pt >= 10.0 && pt < 20.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.26; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.33; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.54; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.37; + } + else if (pt >= 20.0 && pt < 30.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.68; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.04; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.43; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.30; + } + else if (pt >= 30.0 && pt < 40.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.90; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > 0.36; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.16; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.09; + } + else if (pt >= 40.0 && pt < 50.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > 0.96; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > 0.61; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > 0.14; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > 0.12; + } + else return true; + + return true; +} +// +// https://github.com/cms-sw/cmssw/blob/CMSSW_10_6_17/RecoJets/JetProducers/python/PileupJetIDCutParams_cfi.py#L44 +// +bool PUJetID_106XUL17Cut_WPLoose(float pt, float eta, float disc){ + + if (pt > 0.0 && pt < 10.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > -0.95; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.72; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.68; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.47; + } + else if (pt >= 10.0 && pt < 20.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > -0.95; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.72; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.68; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.47; + } + else if (pt >= 20.0 && pt < 30.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > -0.88; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.55; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.60; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.43; + } + else if (pt >= 30.0 && pt < 40.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > -0.63; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.18; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.43; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.24; + } + else if (pt >= 40.0 && pt < 50.0){ + if (std::abs(eta) >= 0.00 && std::abs(eta) < 2.50) return disc > -0.19; + else if (std::abs(eta) >= 2.50 && std::abs(eta) < 2.75) return disc > -0.22; + else if (std::abs(eta) >= 2.75 && std::abs(eta) < 3.00) return disc > -0.13; + else if (std::abs(eta) >= 3.00 && std::abs(eta) < 5.00) return disc > -0.03; + } + else return true; + + return true; +} + + // // https://github.com/cms-sw/cmssw/blob/CMSSW_10_2_22/RecoJets/JetProducers/python/PileupJetIDCutParams_cfi.py // diff --git a/Analyzer/MakeHistograms.py b/Analyzer/MakeHistograms.py index e38f73a..2b5ebec 100644 --- a/Analyzer/MakeHistograms.py +++ b/Analyzer/MakeHistograms.py @@ -8,6 +8,7 @@ import ROOT import VariableList import SampleList +import SampleListUL ROOT.gROOT.SetBatch() ROOT.gROOT.LoadMacro("./Helpers.h") @@ -20,19 +21,35 @@ ] def main(sample_name, useSkimNtuples, systStr, useNewTraining=False): + + isUL=False + + crabFiles = [] + ntupleFiles = [] + + if "DataUL" in sample_name or "MCUL" in sample_name: + EOSURL = SampleListUL.EOSURL + crabFiles = SampleListUL.Samples[sample_name].crabFiles + ntupleFiles = SampleListUL.Samples[sample_name].ntupleFiles + isUL=True + else: + EOSURL = SampleList.EOSURL + crabFiles = SampleList.Samples[sample_name].crabFiles + ntupleFiles = SampleList.Samples[sample_name].ntupleFiles + FileList = [] if useSkimNtuples: print "Globbing File Paths:" - for files in SampleList.Samples[sample_name].ntupleFiles: + for files in ntupleFiles: print files - FileList += [SampleList.EOSURL+f for f in glob.glob(files)] + FileList += [EOSURL+f for f in glob.glob(files)] else: print "Globbing File Paths:" - for files in SampleList.Samples[sample_name].crabFiles: + for files in crabFiles: print files - FileList += [SampleList.EOSURL+f for f in glob.glob(files)] + FileList += [EOSURL+f for f in glob.glob(files)] # Creating std::vector as filelist holder to be plugged into RDataFrame vec = ROOT.vector('string')() @@ -92,6 +109,8 @@ def main(sample_name, useSkimNtuples, systStr, useNewTraining=False): df = df.Define("probeJet_dilep_dphi", probeJetStr+"_dilep_dphi") if isMC: df = df.Define("probeJet_passGenMatch",probeJetStr+"_gen_match") + if isUL: + df = df.Define("probeJet_puIdDiscOTF", probeJetStr+"_puIdDiscOTF") # # # @@ -99,26 +118,33 @@ def main(sample_name, useSkimNtuples, systStr, useNewTraining=False): df = df.Define("probeJet_dilep_ptbalance","dilep_pt/probeJet_pt") # # Define pileup ID cuts - # - # Guide on how to read the pileup ID bitmap variable: - # https://twiki.cern.ch/twiki/bin/viewauth/CMS/PileupJetID#miniAOD_and_nanoAOD - # NOTE: The pileup ID decision flag stored in NanoAOD (v7 and earlier) is based on - # the 80X BDT training and working point (as in the parent MiniAOD). # - if not useNewTraining: - df = df.Define("probeJet_puIdLoose_pass", "probeJet_puIdFlag_Loose") - df = df.Define("probeJet_puIdMedium_pass", "probeJet_puIdFlag_Medium") - df = df.Define("probeJet_puIdTight_pass", "probeJet_puIdFlag_Tight") - # - # Starting from NanoAODv7, the pileup ID BDT discriminant value is stored for each jet. - # The discriminant is calculated based on the appropriate training for each Run-2 year. - # i.e 80X for 2016, 94X for 2017 and 102X for 2018 - # - else: - argStr = "probeJet_pt,probeJet_eta,probeJet_puIdDisc" - df = df.Define("probeJet_puIdLoose_pass", "PUJetID_80XCut_WPLoose("+argStr+")") - df = df.Define("probeJet_puIdMedium_pass", "PUJetID_80XCut_WPMedium("+argStr+")") - df = df.Define("probeJet_puIdTight_pass", "PUJetID_80XCut_WPTight("+argStr+")") + if not isUL: #EOY + # + # Guide on how to read the pileup ID bitmap variable: + # https://twiki.cern.ch/twiki/bin/viewauth/CMS/PileupJetID#miniAOD_and_nanoAOD + # NOTE: The pileup ID decision flag stored in NanoAOD (v7 and earlier) is based on + # the 80X BDT training and working point (as in the parent MiniAOD). + # + if not useNewTraining: + df = df.Define("probeJet_puIdLoose_pass", "probeJet_puIdFlag_Loose") + df = df.Define("probeJet_puIdMedium_pass", "probeJet_puIdFlag_Medium") + df = df.Define("probeJet_puIdTight_pass", "probeJet_puIdFlag_Tight") + # + # Starting from NanoAODv7, the pileup ID BDT discriminant value is stored for each jet. + # The discriminant is calculated based on the appropriate training for each Run-2 year. + # i.e 80X for 2016, 94X for 2017 and 102X for 2018 + # + else: + argStr = "probeJet_pt,probeJet_eta,probeJet_puIdDisc" + df = df.Define("probeJet_puIdLoose_pass", "PUJetID_80XCut_WPLoose("+argStr+")") + df = df.Define("probeJet_puIdMedium_pass", "PUJetID_80XCut_WPMedium("+argStr+")") + df = df.Define("probeJet_puIdTight_pass", "PUJetID_80XCut_WPTight("+argStr+")") + else: #UL + argStr = "probeJet_pt,probeJet_eta,probeJet_puIdDiscOTF" + df = df.Define("probeJet_puIdLoose_pass", "PUJetID_106XUL17Cut_WPLoose("+argStr+")") + df = df.Define("probeJet_puIdMedium_pass", "PUJetID_106XUL17Cut_WPMedium("+argStr+")") + df = df.Define("probeJet_puIdTight_pass", "PUJetID_106XUL17Cut_WPTight("+argStr+")") # # # @@ -354,4 +380,3 @@ def main(sample_name, useSkimNtuples, systStr, useNewTraining=False): elapsed = time_end - time_start elapsed_str = str(datetime.timedelta(seconds=elapsed.seconds)) print("MakeHistograms.py::DONE::Sample("+args.sample+")::Time("+str(time_end)+")::Elapsed("+elapsed_str+")") - diff --git a/Analyzer/MakeHistogramsHisto3D.py b/Analyzer/MakeHistogramsHisto3D.py index b19604e..e5cafac 100644 --- a/Analyzer/MakeHistogramsHisto3D.py +++ b/Analyzer/MakeHistogramsHisto3D.py @@ -8,6 +8,7 @@ import array import ROOT import SampleList +import SampleListUL ROOT.gROOT.SetBatch() ROOT.gROOT.LoadMacro("./Helpers.h") @@ -85,18 +86,33 @@ def main(sample_name, useSkimNtuples, systStr, useNewTraining=False): + isUL=False + + crabFiles = [] + ntupleFiles = [] + + if "DataUL" in sample_name or "MCUL" in sample_name: + EOSURL = SampleListUL.EOSURL + crabFiles = SampleListUL.Samples[sample_name].crabFiles + ntupleFiles = SampleListUL.Samples[sample_name].ntupleFiles + isUL=True + else: + EOSURL = SampleList.EOSURL + crabFiles = SampleList.Samples[sample_name].crabFiles + ntupleFiles = SampleList.Samples[sample_name].ntupleFiles + FileList = [] if useSkimNtuples: print "Globbing File Paths:" - for files in SampleList.Samples[sample_name].ntupleFiles: + for files in ntupleFiles: print files - FileList += [SampleList.EOSURL+f for f in glob.glob(files)] + FileList += [EOSURL+f for f in glob.glob(files)] else: print "Globbing File Paths:" - for files in SampleList.Samples[sample_name].crabFiles: + for files in crabFiles: print files - FileList += [SampleList.EOSURL+f for f in glob.glob(files)] + FileList += [EOSURL+f for f in glob.glob(files)] # Creating std::vector as filelist holder to be plugged into RDataFrame vec = ROOT.vector('string')() @@ -157,6 +173,8 @@ def main(sample_name, useSkimNtuples, systStr, useNewTraining=False): df = df.Define("probeJet_dilep_dphi", probeJetStr+"_dilep_dphi") if isMC: df = df.Define("probeJet_passGenMatch", probeJetStr+"_gen_match") + if isUL: + df = df.Define("probeJet_puIdDiscOTF", probeJetStr+"_puIdDiscOTF") # # # @@ -165,25 +183,33 @@ def main(sample_name, useSkimNtuples, systStr, useNewTraining=False): # # Define pileup ID cuts # - # Guide on how to read the pileup ID bitmap variable: - # https://twiki.cern.ch/twiki/bin/viewauth/CMS/PileupJetID#miniAOD_and_nanoAOD - # NOTE: The pileup ID decision flag stored in NanoAOD (v7 and earlier) is based on - # the 80X BDT training and working point (as in the parent MiniAOD). - # - if not useNewTraining: - df = df.Define("probeJet_puIdLoose_pass", "probeJet_puIdFlag_Loose") - df = df.Define("probeJet_puIdMedium_pass", "probeJet_puIdFlag_Medium") - df = df.Define("probeJet_puIdTight_pass", "probeJet_puIdFlag_Tight") - # - # Starting from NanoAODv7, the pileup ID BDT discriminant value is stored for each jet. - # The discriminant is calculated based on the appropriate training for each Run-2 year. - # i.e 80X for 2016, 94X for 2017 and 102X for 2018 - # - else: - argStr = "probeJet_pt,probeJet_eta,probeJet_puIdDisc" - df = df.Define("probeJet_puIdLoose_pass", "PUJetID_80XCut_WPLoose("+argStr+")") - df = df.Define("probeJet_puIdMedium_pass", "PUJetID_80XCut_WPMedium("+argStr+")") - df = df.Define("probeJet_puIdTight_pass", "PUJetID_80XCut_WPTight("+argStr+")") + if not isUL: #EOY + # + # Guide on how to read the pileup ID bitmap variable: + # https://twiki.cern.ch/twiki/bin/viewauth/CMS/PileupJetID#miniAOD_and_nanoAOD + # NOTE: The pileup ID decision flag stored in NanoAOD (v7 and earlier) is based on + # the 80X BDT training and working point (as in the parent MiniAOD). + # + if not useNewTraining: + df = df.Define("probeJet_puIdLoose_pass", "probeJet_puIdFlag_Loose") + df = df.Define("probeJet_puIdMedium_pass", "probeJet_puIdFlag_Medium") + df = df.Define("probeJet_puIdTight_pass", "probeJet_puIdFlag_Tight") + # + # Starting from NanoAODv7, the pileup ID BDT discriminant value is stored for each jet. + # The discriminant is calculated based on the appropriate training for each Run-2 year. + # i.e 80X for 2016, 94X for 2017 and 102X for 2018 + # + else: + argStr = "probeJet_pt,probeJet_eta,probeJet_puIdDisc" + df = df.Define("probeJet_puIdLoose_pass", "PUJetID_80XCut_WPLoose("+argStr+")") + df = df.Define("probeJet_puIdMedium_pass", "PUJetID_80XCut_WPMedium("+argStr+")") + df = df.Define("probeJet_puIdTight_pass", "PUJetID_80XCut_WPTight("+argStr+")") + else: #UL + if useNewTraining: + argStr = "probeJet_pt,probeJet_eta,probeJet_puIdDiscOTF" + df = df.Define("probeJet_puIdLoose_pass", "PUJetID_106XUL17Cut_WPLoose("+argStr+")") + df = df.Define("probeJet_puIdMedium_pass", "PUJetID_106XUL17Cut_WPMedium("+argStr+")") + df = df.Define("probeJet_puIdTight_pass", "PUJetID_106XUL17Cut_WPTight("+argStr+")") # # # @@ -335,7 +361,7 @@ def ProjectTH3(h3, HistoDict, systStrPost): for hist3DName in Histograms3D: Histograms3D[hist3DName].Write() - # Loop over the Histograms1D dictionary and store TH3 in ROOT file + # Loop over the Histograms1D dictionary and store TH1 in ROOT file for histName in Histograms: Histograms[histName].Write() @@ -361,6 +387,7 @@ def ProjectTH3(h3, HistoDict, systStrPost): isMC = False if "MC" in args.sample: isMC = True + # # List all jet energy scale and resolution systematics # @@ -377,7 +404,6 @@ def ProjectTH3(h3, HistoDict, systStrPost): if "AMCNLO" in args.sample: ak4Systematics=[] ROOT.ROOT.EnableImplicitMT(args.cores) - # # Do Nominal # diff --git a/Analyzer/RunLocal_MakeHistograms.sh b/Analyzer/RunLocal_MakeHistograms.sh index 17a77e7..44c80bc 100755 --- a/Analyzer/RunLocal_MakeHistograms.sh +++ b/Analyzer/RunLocal_MakeHistograms.sh @@ -44,6 +44,16 @@ SAMPLES=( # Data18C_EGamma # Data18D_EGamma ) +SAMPLES=( +# MCUL17_DY_MG +# MCUL17_DY_AMCNLO +# DataUL17B_DoubleMuon +# DataUL17C_DoubleMuon +# DataUL17D_DoubleMuon +# DataUL17E_DoubleMuon +# DataUL17F_DoubleMuon +) + # # Make histograms from ntuples # diff --git a/Analyzer/RunLocal_SkimNtuples.sh b/Analyzer/RunLocal_SkimNtuples.sh index e003a02..94372a9 100755 --- a/Analyzer/RunLocal_SkimNtuples.sh +++ b/Analyzer/RunLocal_SkimNtuples.sh @@ -43,7 +43,23 @@ SAMPLES=( # Data18B_EGamma # Data18C_EGamma # Data18D_EGamma +# DataUL17B_DoubleMuon +# DataUL17C_DoubleMuon +# DataUL17D_DoubleMuon +# DataUL17E_DoubleMuon +# DataUL17F_DoubleMuon ) + +SAMPLES=( +# MCUL17_DY_MG +# MCUL17_DY_AMCNLO +# DataUL17B_DoubleMuon +# DataUL17C_DoubleMuon +# DataUL17D_DoubleMuon +# DataUL17E_DoubleMuon +# DataUL17F_DoubleMuon +) + # # Make skimmed ntuples # diff --git a/Analyzer/SampleListUL.py b/Analyzer/SampleListUL.py new file mode 100644 index 0000000..34993ca --- /dev/null +++ b/Analyzer/SampleListUL.py @@ -0,0 +1,91 @@ +import collections +from SampleList import Sample + +version="DiLeptonSkim_JMEnanoUL_v0p2" + +EOSURL="root://eoscms.cern.ch/" +EOSDIR="/eos/cms/store/group/phys_jetmet/nbinnorj/" +CRABDIR="JetPUId_"+version+"/CRABOUTPUT/" +NTUPDIR="JetPUId_"+version+"/ntuples_skim/" +Samples = collections.OrderedDict() + +################################################ +# +# 2016 +# +################################################ + +################################################ +# +# 2017 +# +################################################ +Samples["MCUL17_DY_MG"] = Sample( + name="MCUL17_DY_MG", + crabFiles=[ + EOSDIR+CRABDIR+"DYJetsToLL_M-50_TuneCP5_13TeV-madgraphMLM-pythia8/JetPUId_MCUL17JMEnanoV1_"+version+"/*/*/tree_*.root", + ], + ntupleFiles=[ + EOSDIR+NTUPDIR+"ntuple_MCUL17_DY_MG.root" + ] +) +Samples["MCUL17_DY_AMCNLO"] = Sample( + name="MCUL17_DY_AMCNLO", + crabFiles=[ + EOSDIR+CRABDIR+"DYJetsToLL_M-50_TuneCP5_13TeV-amcatnloFXFX-pythia8/JetPUId_MCUL17JMEnanoV1_"+version+"/*/*/tree_*.root", + ], + ntupleFiles=[ + EOSDIR+NTUPDIR+"ntuple_MCUL17_DY_AMCNLO.root" + ] +) +Samples["DataUL17B_DoubleMuon"] = Sample( + name="DataUL17B_DoubleMuon", + crabFiles=[ + EOSDIR+CRABDIR+"DoubleMuon/JetPUId_Run2017B-DataUL17JMEnanoV1_"+version+"/*/*/tree_*.root" + ], + ntupleFiles=[ + EOSDIR+NTUPDIR+"ntuple_DataUL17B_DoubleMuon.root" + ] +) +Samples["DataUL17C_DoubleMuon"] = Sample( + name="DataUL17C_DoubleMuon", + crabFiles=[ + EOSDIR+CRABDIR+"DoubleMuon/JetPUId_Run2017C-DataUL17JMEnanoV1_"+version+"/*/*/tree_*.root" + ], + ntupleFiles=[ + EOSDIR+NTUPDIR+"ntuple_DataUL17C_DoubleMuon.root" + ] +) +Samples["DataUL17D_DoubleMuon"] = Sample( + name="DataUL17D_DoubleMuon", + crabFiles=[ + EOSDIR+CRABDIR+"DoubleMuon/JetPUId_Run2017D-DataUL17JMEnanoV1_"+version+"/*/*/tree_*.root" + ], + ntupleFiles=[ + EOSDIR+NTUPDIR+"ntuple_DataUL17D_DoubleMuon.root" + ] +) +Samples["DataUL17E_DoubleMuon"] = Sample( + name="DataUL17E_DoubleMuon", + crabFiles=[ + EOSDIR+CRABDIR+"DoubleMuon/JetPUId_Run2017E-DataUL17JMEnanoV1_"+version+"/*/*/tree_*.root" + ], + ntupleFiles=[ + EOSDIR+NTUPDIR+"ntuple_DataUL17E_DoubleMuon.root" + ] +) +Samples["DataUL17F_DoubleMuon"] = Sample( + name="DataUL17F_DoubleMuon", + crabFiles=[ + EOSDIR+CRABDIR+"DoubleMuon/JetPUId_Run2017F-DataUL17JMEnanoV1_"+version+"/*/*/tree_*.root" + ], + ntupleFiles=[ + EOSDIR+NTUPDIR+"ntuple_DataUL17F_DoubleMuon.root" + ] +) + +################################################ +# +# 2018 +# +################################################ diff --git a/Analyzer/SkimNtuples.py b/Analyzer/SkimNtuples.py index 123b3fb..0e1d560 100644 --- a/Analyzer/SkimNtuples.py +++ b/Analyzer/SkimNtuples.py @@ -7,6 +7,7 @@ import ROOT import VariableList import SampleList +import SampleListUL import datetime @@ -15,11 +16,23 @@ def main(sample_name): - FileList = [] + crabFiles = [] + if "DataUL" in sample_name or "MCUL" in sample_name: + crabFiles = SampleListUL.Samples[sample_name].crabFiles + EOSURL=SampleListUL.EOSURL + EOSDIR=SampleListUL.EOSDIR + NTUPDIR=SampleListUL.NTUPDIR + else: + crabFiles = SampleList.Samples[sample_name].crabFiles + EOSURL=SampleList.EOSURL + EOSDIR=SampleList.EOSDIR + NTUPDIR=SampleList.NTUPDIR + print "Globbing File Paths:" - for files in SampleList.Samples[sample_name].crabFiles: + FileList = [] + for files in crabFiles: print files - FileList += [SampleList.EOSURL+f for f in glob.glob(files)] + FileList += [EOSURL+f for f in glob.glob(files)] # Creating std::vector as filelist holder to be plugged into RDataFrame vec = ROOT.vector('string')() @@ -85,9 +98,9 @@ def main(sample_name): # # Save at EOS # - prefix=SampleList.EOSURL - prefix+=SampleList.EOSDIR - prefix+=SampleList.NTUPDIR + prefix=EOSURL + prefix+=EOSDIR + prefix+=NTUPDIR # # # diff --git a/Analyzer/batchscripts/MakeHistosAtBatch.sh.sub b/Analyzer/batchscripts/MakeHistosAtBatch.sh.sub index 45e8485..cbc4057 100644 --- a/Analyzer/batchscripts/MakeHistosAtBatch.sh.sub +++ b/Analyzer/batchscripts/MakeHistosAtBatch.sh.sub @@ -6,74 +6,110 @@ log = BatchLog/Histo.$(ClusterId).log stream_output = True stream_error = True +############################ +# +# UL +# +############################ -+JobFlavour = "longlunch" ++JobFlavour = "microcentury" request_cpus = 4 arguments = $(SAMPLE) 4 queue SAMPLE from ( -MC16_DY_MG -MC17_DY_MG -MC18_DY_MG +MCUL17_DY_MG ) +JobFlavour = "microcentury" request_cpus = 4 arguments = $(SAMPLE) 4 queue SAMPLE from ( -MC16_DY_AMCNLO -MC17_DY_AMCNLO -MC18_DY_AMCNLO +MCUL17_DY_AMCNLO ) +JobFlavour = "microcentury" request_cpus = 4 arguments = $(SAMPLE) 4 queue SAMPLE from ( -MC16_DY_MG_HW -MC17_DY_MG_HW -MC18_DY_MG_HW +DataUL17B_DoubleMuon +DataUL17C_DoubleMuon +DataUL17D_DoubleMuon +DataUL17E_DoubleMuon +DataUL17F_DoubleMuon ) -+JobFlavour = "espresso" -request_cpus = 4 -arguments = $(SAMPLE) 4 -queue SAMPLE from ( -Data16B_DoubleMuon -Data16C_DoubleMuon -Data16D_DoubleMuon -Data16E_DoubleMuon -Data16F_DoubleMuon -Data16G_DoubleMuon -Data16H_DoubleMuon -Data17B_DoubleMuon -Data17C_DoubleMuon -Data17D_DoubleMuon -Data17E_DoubleMuon -Data17F_DoubleMuon -Data18A_DoubleMuon -Data18B_DoubleMuon -Data18C_DoubleMuon -Data18D_DoubleMuon -) +############################ +# +# EOY +# +############################ -+JobFlavour = "espresso" -request_cpus = 4 -arguments = $(SAMPLE) 4 -queue SAMPLE from ( -Data16B_DoubleEG -Data16C_DoubleEG -Data16D_DoubleEG -Data16E_DoubleEG -Data16F_DoubleEG -Data16G_DoubleEG -Data16H_DoubleEG -Data17B_DoubleEG -Data17C_DoubleEG -Data17D_DoubleEG -Data17E_DoubleEG -Data17F_DoubleEG -Data18A_EGamma -Data18B_EGamma -Data18C_EGamma -Data18D_EGamma -) +#+JobFlavour = "longlunch" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#MC16_DY_MG +#MC17_DY_MG +#MC18_DY_MG +#) + +#+JobFlavour = "microcentury" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#MC16_DY_AMCNLO +#MC17_DY_AMCNLO +#MC18_DY_AMCNLO +#) + +#+JobFlavour = "microcentury" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#MC16_DY_MG_HW +#MC17_DY_MG_HW +#MC18_DY_MG_HW +#) + +#+JobFlavour = "espresso" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#Data16B_DoubleMuon +#Data16C_DoubleMuon +#Data16D_DoubleMuon +#Data16E_DoubleMuon +#Data16F_DoubleMuon +#Data16G_DoubleMuon +#Data16H_DoubleMuon +#Data17B_DoubleMuon +#Data17C_DoubleMuon +#Data17D_DoubleMuon +#Data17E_DoubleMuon +#Data17F_DoubleMuon +#Data18A_DoubleMuon +#Data18B_DoubleMuon +#Data18C_DoubleMuon +#Data18D_DoubleMuon +#) + +#+JobFlavour = "espresso" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#Data16B_DoubleEG +#Data16C_DoubleEG +#Data16D_DoubleEG +#Data16E_DoubleEG +#Data16F_DoubleEG +#Data16G_DoubleEG +#Data16H_DoubleEG +#Data17B_DoubleEG +#Data17C_DoubleEG +#Data17D_DoubleEG +#Data17E_DoubleEG +#Data17F_DoubleEG +#Data18A_EGamma +#Data18B_EGamma +#Data18C_EGamma +#Data18D_EGamma +#) diff --git a/Analyzer/batchscripts/SkimNtuplesAtBatch.sh.sub b/Analyzer/batchscripts/SkimNtuplesAtBatch.sh.sub index 33a29f7..1308113 100644 --- a/Analyzer/batchscripts/SkimNtuplesAtBatch.sh.sub +++ b/Analyzer/batchscripts/SkimNtuplesAtBatch.sh.sub @@ -6,74 +6,110 @@ log = BatchLog/Skim.$(ClusterId).log stream_output = True stream_error = True - -+JobFlavour = "longlunch" -request_cpus = 4 -arguments = $(SAMPLE) 4 -queue SAMPLE from ( -MC16_DY_MG -MC17_DY_MG -MC18_DY_MG -) - -+JobFlavour = "longlunch" -request_cpus = 4 -arguments = $(SAMPLE) 4 -queue SAMPLE from ( -MC16_DY_AMCNLO -MC17_DY_AMCNLO -MC18_DY_AMCNLO -) +############################ +# +# UL +# +############################ +JobFlavour = "microcentury" request_cpus = 4 arguments = $(SAMPLE) 4 queue SAMPLE from ( -MC16_DY_MG_HW -MC17_DY_MG_HW -MC18_DY_MG_HW +MCUL17_DY_MG ) +JobFlavour = "microcentury" request_cpus = 4 arguments = $(SAMPLE) 4 queue SAMPLE from ( -Data16B_DoubleMuon -Data16C_DoubleMuon -Data16D_DoubleMuon -Data16E_DoubleMuon -Data16F_DoubleMuon -Data16G_DoubleMuon -Data16H_DoubleMuon -Data17B_DoubleMuon -Data17C_DoubleMuon -Data17D_DoubleMuon -Data17E_DoubleMuon -Data17F_DoubleMuon -Data18A_DoubleMuon -Data18B_DoubleMuon -Data18C_DoubleMuon -Data18D_DoubleMuon +MCUL17_DY_AMCNLO ) +JobFlavour = "microcentury" request_cpus = 4 arguments = $(SAMPLE) 4 queue SAMPLE from ( -Data16B_DoubleEG -Data16C_DoubleEG -Data16D_DoubleEG -Data16E_DoubleEG -Data16F_DoubleEG -Data16G_DoubleEG -Data16H_DoubleEG -Data17B_DoubleEG -Data17C_DoubleEG -Data17D_DoubleEG -Data17E_DoubleEG -Data17F_DoubleEG -Data18A_EGamma -Data18B_EGamma -Data18C_EGamma -Data18D_EGamma +DataUL17B_DoubleMuon +DataUL17C_DoubleMuon +DataUL17D_DoubleMuon +DataUL17E_DoubleMuon +DataUL17F_DoubleMuon ) + +############################ +# +# EOY +# +############################ + +#+JobFlavour = "longlunch" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#MC16_DY_MG +#MC17_DY_MG +#MC18_DY_MG +#) + +#+JobFlavour = "longlunch" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#MC16_DY_AMCNLO +#MC17_DY_AMCNLO +#MC18_DY_AMCNLO +#) + +#+JobFlavour = "microcentury" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#MC16_DY_MG_HW +#MC17_DY_MG_HW +#MC18_DY_MG_HW +#) + +#+JobFlavour = "microcentury" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#Data16B_DoubleMuon +#Data16C_DoubleMuon +#Data16D_DoubleMuon +#Data16E_DoubleMuon +#Data16F_DoubleMuon +#Data16G_DoubleMuon +#Data16H_DoubleMuon +#Data17B_DoubleMuon +#Data17C_DoubleMuon +#Data17D_DoubleMuon +#Data17E_DoubleMuon +#Data17F_DoubleMuon +#Data18A_DoubleMuon +#Data18B_DoubleMuon +#Data18C_DoubleMuon +#Data18D_DoubleMuon +#) + +#+JobFlavour = "microcentury" +#request_cpus = 4 +#arguments = $(SAMPLE) 4 +#queue SAMPLE from ( +#Data16B_DoubleEG +#Data16C_DoubleEG +#Data16D_DoubleEG +#Data16E_DoubleEG +#Data16F_DoubleEG +#Data16G_DoubleEG +#Data16H_DoubleEG +#Data17B_DoubleEG +#Data17C_DoubleEG +#Data17D_DoubleEG +#Data17E_DoubleEG +#Data17F_DoubleEG +#Data18A_EGamma +#Data18B_EGamma +#Data18C_EGamma +#Data18D_EGamma +#) diff --git a/Analyzer/haddHistos.sh b/Analyzer/haddHistos.sh index 9ee2bdd..8bb11b3 100644 --- a/Analyzer/haddHistos.sh +++ b/Analyzer/haddHistos.sh @@ -2,6 +2,9 @@ # combine all data histos into one root file # HISTODIR="histos" -hadd -f ${HISTODIR}/Histo_Data16.root ${HISTODIR}/Histo_Data16*.root -hadd -f ${HISTODIR}/Histo_Data17.root ${HISTODIR}/Histo_Data17*.root -hadd -f ${HISTODIR}/Histo_Data18.root ${HISTODIR}/Histo_Data18*.root + +hadd -f ${HISTODIR}/Histo_DataUL17.root ${HISTODIR}/Histo_DataUL17*.root + +# hadd -f ${HISTODIR}/Histo_Data16.root ${HISTODIR}/Histo_Data16*.root +# hadd -f ${HISTODIR}/Histo_Data17.root ${HISTODIR}/Histo_Data17*.root +# hadd -f ${HISTODIR}/Histo_Data18.root ${HISTODIR}/Histo_Data18*.root diff --git a/Analyzer/setupBatchScripts.sh b/Analyzer/setupBatchScripts.sh old mode 100644 new mode 100755 diff --git a/Skimmer/RunLocal.sh b/Skimmer/RunLocal.sh index 4f7dd9f..bbd67df 100755 --- a/Skimmer/RunLocal.sh +++ b/Skimmer/RunLocal.sh @@ -1,25 +1,44 @@ -MAX_EVENTS=50000 # +# EOY 2016 # -python RunSkimmerLocal.py \ ---era="2016" \ ---maxEvents=${MAX_EVENTS} \ ---outDir="./MC16_DYJetsToLL_NLO" \ ---isMC=1 \ ---dataStream="MC" +# MAX_EVENTS=50000 +# python RunSkimmerLocal.py \ +# --era="2016" \ +# --maxEvents=${MAX_EVENTS} \ +# --outDir="./MC16_DYJetsToLL_NLO" \ +# --isMC=1 \ +# --dataStream="MC" +# # +# MAX_EVENTS=50000 +# python RunSkimmerLocal.py \ +# --era="2016" \ +# --maxEvents=${MAX_EVENTS} \ +# --outDir="./Data16_DoubleMuon" \ +# --isMC=0 \ +# --dataStream="DoubleMuon" +# # +# MAX_EVENTS=50000 +# python RunSkimmerLocal.py \ +# --era="2016" \ +# --maxEvents=${MAX_EVENTS} \ +# --outDir="./Data16_DoubleEG" \ +# --isMC=0 \ +# --dataStream="DoubleEG" # +# UL 2017 JMEnano v1 # -python RunSkimmerLocal.py \ ---era="2016" \ ---maxEvents=${MAX_EVENTS} \ ---outDir="./Data16_DoubleMuon" \ ---isMC=0 \ ---dataStream="DoubleMuon" +# MAX_EVENTS=20000 +# python RunSkimmerLocal.py \ +# --era="UL2017" \ +# --maxEvents=${MAX_EVENTS} \ +# --outDir="./MCUL17_DYJetsToLL_LO" \ +# --isMC=1 \ +# --dataStream="MC" # -# -python RunSkimmerLocal.py \ ---era="2016" \ ---maxEvents=${MAX_EVENTS} \ ---outDir="./Data16_DoubleEG" \ ---isMC=0 \ ---dataStream="DoubleEG" +# MAX_EVENTS=20000 +# python RunSkimmerLocal.py \ +# --era="UL2017" \ +# --maxEvents=${MAX_EVENTS} \ +# --outDir="./DataUL17_DoubleMuon" \ +# --isMC=0 \ +# --dataStream="DoubleMuon" diff --git a/Skimmer/RunSkimmerCrab.py b/Skimmer/RunSkimmerCrab.py index 0f19739..e3afbbb 100644 --- a/Skimmer/RunSkimmerCrab.py +++ b/Skimmer/RunSkimmerCrab.py @@ -5,21 +5,6 @@ ROOT.PyConfig.IgnoreCommandLineOptions = True from PhysicsTools.NanoAODTools.postprocessing.framework.postprocessor import * -from PhysicsTools.NanoAODTools.postprocessing.modules.common.puWeightProducer import puWeight_2016 -from PhysicsTools.NanoAODTools.postprocessing.modules.common.puWeightProducer import puWeight_2017 -from PhysicsTools.NanoAODTools.postprocessing.modules.common.puWeightProducer import puWeight_2018 - -from PhysicsTools.NanoAODTools.postprocessing.modules.jme.jetmetHelperRun2 import * - -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2016_mc -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2017_mc -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2018_mc -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2016_data_dielectron -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2017_data_dielectron -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2018_data_dielectron -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2016_data_dimuon -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2017_data_dimuon -from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2018_data_dimuon print "RunSkimmerCrab.py START" @@ -98,4 +83,3 @@ print "RunSkimmerCrab.py DONE" os.system("ls -lR") - diff --git a/Skimmer/RunSkimmerHelper.py b/Skimmer/RunSkimmerHelper.py index 0565b78..1434778 100644 --- a/Skimmer/RunSkimmerHelper.py +++ b/Skimmer/RunSkimmerHelper.py @@ -6,6 +6,7 @@ def GetSelection(era): # the first element is not necessarily the leading in pt. # objectSel = "((nMuon>=2 && Sum$(Muon_pt>20.)>=1) || (nElectron>=2 && Sum$(Electron_pt>20.)>=1)) && (nJet>=1)" + # # Define trigger selection. Need to do "Alt$(trigBranchName,0)" because some trigger paths are not available throughout a given year. # If it doesn't exist in a period or a run, the branch will not exist in nanoAOD. @@ -21,6 +22,8 @@ def GetSelection(era): selection = " && ".join((objectSel,trigSel2017)) elif era == "2018": selection = " && ".join((objectSel,trigSel2018)) + elif era == "UL2017": + selection = " && ".join((objectSel,trigSel2017)) return selection @@ -33,6 +36,8 @@ def GetJSON(era): jsonInput="/src/PUjetID/Skimmer/data/lumi/Cert_294927-306462_13TeV_EOY2017ReReco_Collisions17_JSON.txt" elif era == "2018": jsonInput="/src/PUjetID/Skimmer/data/lumi/Cert_314472-325175_13TeV_17SeptEarlyReReco2018ABC_PromptEraD_Collisions18_JSON.txt" + elif era == "UL2017": + jsonInput="/src/PUjetID/Skimmer/data/lumi/Cert_294927-306462_13TeV_UL2017_Collisions17_GoldenJSON.txt" return jsonInput @@ -45,6 +50,13 @@ def GetJSON(era): from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2016_data_dimuon from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2017_data_dimuon from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_2018_data_dimuon + +from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_UL2017_mc +from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_UL2017_data_dielectron +from PUjetID.Skimmer.SkimmerDiLepton import SkimmerDiLepton_UL2017_data_dimuon + +from PUjetID.Skimmer.PUIDCalculator import PUIDCalculator_UL2017 + from PhysicsTools.NanoAODTools.postprocessing.modules.jme.jetmetHelperRun2 import * from PhysicsTools.NanoAODTools.postprocessing.modules.common.puWeightProducer import puWeight_2016 from PhysicsTools.NanoAODTools.postprocessing.modules.common.puWeightProducer import puWeight_2017 @@ -58,16 +70,25 @@ def GetModules(era, isMC, dataStream): applyJetPtSmearing=True if era == "2016": if isMC: - jetCorr_AK4_MC16 = createJMECorrector(isMC=True, dataYear="2016", runPeriod="", jesUncert="Total", redojec=False, jetType="AK4PFchs", applySmearing=applyJetPtSmearing) + jetCorr_AK4_MC16 = createJMECorrector(isMC=True, dataYear="2016", runPeriod="", jesUncert="Total", jetType="AK4PFchs", applySmearing=applyJetPtSmearing) elif era == "2017": if isMC: - jetCorr_AK4_MC17 = createJMECorrector(isMC=True, dataYear="2017", runPeriod="", jesUncert="Total", redojec=False, jetType="AK4PFchs", applySmearing=applyJetPtSmearing) + jetCorr_AK4_MC17 = createJMECorrector(isMC=True, dataYear="2017", runPeriod="", jesUncert="Total", jetType="AK4PFchs", applySmearing=applyJetPtSmearing) elif era == "2018": if isMC: - jetCorr_AK4_MC18 = createJMECorrector(isMC=True, dataYear="2018", runPeriod="", jesUncert="Total", redojec=False, jetType="AK4PFchs", applySmearing=applyJetPtSmearing) + jetCorr_AK4_MC18 = createJMECorrector(isMC=True, dataYear="2018", runPeriod="", jesUncert="Total", jetType="AK4PFchs", applySmearing=applyJetPtSmearing) + elif era == "UL2017": + if isMC: + jetCorr_AK4_MCUL17 = createJMECorrector(isMC=True, dataYear="UL2017", runPeriod="", jesUncert="Total", jetType="AK4PFchs", applySmearing=applyJetPtSmearing) + + #=========================================== # # Make list of modules # + #============================================ + # + # EOY 2016 + # if era == "2016": if isMC: modules=[puWeight_2016(), jetCorr_AK4_MC16(), SkimmerDiLepton_2016_mc()] @@ -76,6 +97,9 @@ def GetModules(era, isMC, dataStream): modules=[SkimmerDiLepton_2016_data_dimuon()] elif "DoubleEG" in dataStream: modules=[SkimmerDiLepton_2016_data_dielectron()] + # + # EOY 2017 + # elif era == "2017": if isMC: modules=[puWeight_2017(), jetCorr_AK4_MC17(), SkimmerDiLepton_2017_mc()] @@ -84,6 +108,9 @@ def GetModules(era, isMC, dataStream): modules=[SkimmerDiLepton_2017_data_dimuon()] elif "DoubleEG" in dataStream: modules=[SkimmerDiLepton_2017_data_dielectron()] + # + # EOY 2018 + # elif era == "2018": if isMC: modules=[puWeight_2018(), jetCorr_AK4_MC18(), SkimmerDiLepton_2018_mc()] @@ -92,6 +119,18 @@ def GetModules(era, isMC, dataStream): modules=[SkimmerDiLepton_2018_data_dimuon()] elif "EGamma" in dataStream: modules=[SkimmerDiLepton_2018_data_dielectron()] + # + # UL 2017 + # + elif era == "UL2017": + if isMC: + modules=[jetCorr_AK4_MCUL17(), SkimmerDiLepton_UL2017_mc()] + # modules=[SkimmerDiLepton_UL2017_mc()] + else: + if "DoubleMuon" in dataStream: + modules=[SkimmerDiLepton_UL2017_data_dimuon()] + elif "DoubleEG" in dataStream: + modules=[SkimmerDiLepton_UL2017_data_dielectron()] return modules diff --git a/Skimmer/RunSkimmerLocal.py b/Skimmer/RunSkimmerLocal.py index 49b5b5b..f962b20 100644 --- a/Skimmer/RunSkimmerLocal.py +++ b/Skimmer/RunSkimmerLocal.py @@ -58,9 +58,22 @@ files = [ "/store/data/Run2016H/DoubleEG/NANOAOD/02Apr2020-v1/250000/47FD42C2-6583-D941-95F4-1BFF0061C7D5.root", ] - -CMSXROOTD="root://xrootd-cms.infn.it/" -files = [CMSXROOTD+file for file in files] + CMSXROOTD="root://xrootd-cms.infn.it/" + files = [CMSXROOTD+file for file in files] +elif era == "UL2017": + if isMC: + files = [ + "/eos/cms/store/group/phys_jetmet/JMEnanoV01/UL17/DYJetsToLL_M-50_TuneCP5_13TeV-madgraphMLM-pythia8/RunIISummer19UL17JMEnanoV1-106X_mc2017_realistic_v6-v2/201026_101150/0000/step1_NANO_1.root" + ] + else: + if isDoubleMuonData: + files = [ + "/eos/cms/store/group/phys_jetmet/JMEnanoV01/UL17/DoubleMuon/Run2017B-09Aug2019_UL2017-v1_JMEnanoV1/201026_100435/0000/step1_NANO_1.root", + ] + elif isDoubleElecData: + files = [] + CMSXROOTD="root://eoscms.cern.ch/" + files = [CMSXROOTD+file for file in files] varTxtFileIn="./script/branches_in.txt" varTxtFileOut="./script/branches_out.txt" diff --git a/Skimmer/crab_JMEnano/PSet.py b/Skimmer/crab_JMEnano/PSet.py new file mode 100644 index 0000000..d27797e --- /dev/null +++ b/Skimmer/crab_JMEnano/PSet.py @@ -0,0 +1,15 @@ +#this fake PSET is needed for local test and for crab to figure the output filename +#you do not need to edit it unless you want to do a local test using a different input file than +#the one marked below +import FWCore.ParameterSet.Config as cms +process = cms.Process('NANO') +process.source = cms.Source("PoolSource", fileNames = cms.untracked.vstring(), +) +process.source.fileNames = [ + '../lzma_1.root' ##you can change only this line +] +process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(10)) + +# process.output = cms.OutputModule("PoolOutputModule", fileName = cms.untracked.string('tree.root')) +# process.out = cms.EndPath(process.output) + diff --git a/Skimmer/crab_JMEnano/SOURCEMEFIRST.sh b/Skimmer/crab_JMEnano/SOURCEMEFIRST.sh new file mode 100755 index 0000000..3f6a287 --- /dev/null +++ b/Skimmer/crab_JMEnano/SOURCEMEFIRST.sh @@ -0,0 +1,2 @@ +source /cvmfs/cms.cern.ch/common/crab-setup.sh + diff --git a/Skimmer/crab_JMEnano/SendToCrab.sh b/Skimmer/crab_JMEnano/SendToCrab.sh new file mode 100755 index 0000000..e081d99 --- /dev/null +++ b/Skimmer/crab_JMEnano/SendToCrab.sh @@ -0,0 +1,2 @@ +python crab_UL2017_data.py ../samples/JMEnanoV1/JMEnanoV1_UL2017_Data.txt +python crab_UL2017_mc.py ../samples/JMEnanoV1/JMEnanoV1_UL2017_MC.txt diff --git a/Skimmer/crab_JMEnano/crab_UL2017_data.py b/Skimmer/crab_JMEnano/crab_UL2017_data.py new file mode 100644 index 0000000..6cc9ed6 --- /dev/null +++ b/Skimmer/crab_JMEnano/crab_UL2017_data.py @@ -0,0 +1,58 @@ +import sys +import crab_common +import helpers + +crab_common.config.JobType.maxJobRuntimeMin = 300 + +def GetDataStream(name): + if "DoubleEG" in name: return "DoubleEG" + if "DoubleMuon" in name: return "DoubleMuon" + +if __name__ == '__main__': + # + # Read in txt file with list of samples + # + f = open(sys.argv[1]) + samplelist = helpers.GetSampleList(f) + + print "Will send crab jobs for the following samples:" + for dataset in samplelist: + print dataset + print "\n\n" + + from CRABAPI.RawCommand import crabCommand + for i, dataset in enumerate(samplelist): + print "%d/%d:Sending CRAB job: %s" % (i+1,len(samplelist), dataset) + crab_common.config.Data.inputDataset = dataset + # + # + # + dataStreamName=GetDataStream(dataset) + crab_common.config.JobType.scriptArgs = [ + 'era=UL2017',#CHECK + 'isMC=0', + 'dataStream='+dataStreamName, + ] + # + # Have to make unique requestName. + # + primaryName = dataset.split('/')[1] + # + # TO DO: Fix This + # + secondaryName = dataset.split('/')[2] + secondaryName = secondaryName.replace("algomez-","")#CHECK + secondaryName = secondaryName.replace("09Aug2019_UL2017-v1_JMEnanoV1","DataUL17JMEnanoV1") #CHECK + secondaryName = secondaryName.replace("-f3095d45f30d5f5a51b7a75248c8ce9d","") #CHECK + # + requestName = primaryName + "_" + secondaryName + requestName = crab_common.reqNamePrefix + "_" + requestName + "_" + crab_common.version + crab_common.config.General.requestName = requestName + # + outputDatasetTag = crab_common.reqNamePrefix + "_" + secondaryName + "_" + crab_common.version + crab_common.config.Data.outputDatasetTag = outputDatasetTag + # + print "requestName: ", requestName + print "outputDatasetTag: ", outputDatasetTag + crabCommand('submit', config = crab_common.config) + print "" \ No newline at end of file diff --git a/Skimmer/crab_JMEnano/crab_UL2017_mc.py b/Skimmer/crab_JMEnano/crab_UL2017_mc.py new file mode 100644 index 0000000..8a749c2 --- /dev/null +++ b/Skimmer/crab_JMEnano/crab_UL2017_mc.py @@ -0,0 +1,57 @@ +import sys +import crab_common +import helpers + +crab_common.config.JobType.maxJobRuntimeMin = 600 + +if __name__ == '__main__': + # + # Read in txt file with list of samples + # + f = open(sys.argv[1]) + samplelist = helpers.GetSampleList(f) + print "Will send crab jobs for the following samples:" + for dataset in samplelist: + print dataset + print "\n\n" + + from CRABAPI.RawCommand import crabCommand + for i, dataset in enumerate(samplelist): + print "%d/%d:Sending CRAB job: %s" % (i+1,len(samplelist), dataset) + crab_common.config.Data.inputDataset = dataset + # + # + # + crab_common.config.JobType.scriptArgs = [ + 'era=UL2017',#CHECK + 'isMC=1', + 'dataStream=MC', + ] + # + # Have to make unique requestName. + # + primaryName = dataset.split('/')[1].split("_")[0:4] + primaryName = "_".join(primaryName) + primaryName = primaryName.replace("_13TeV","") + # + # TO DO: Fix This + # + secondaryName = dataset.split('/')[2] + secondaryName = secondaryName.replace("algomez-","")#CHECK + secondaryName = secondaryName.replace("RunIISummer19UL17JMEnanoV1","MCUL17JMEnanoV1")#CHECK + secondaryName = secondaryName.replace("-106X_mc2017_realistic_v6","")#CHECK + secondaryName = secondaryName.replace("-v1","")#CHECK + secondaryName = secondaryName.replace("-v2","")#CHECK + secondaryName = secondaryName.replace("-1c822544b349959fbcd74e91edede2d7","")#CHECK + # + requestName = primaryName + "_" + secondaryName + requestName = crab_common.reqNamePrefix +"_" + requestName + "_" + crab_common.version + crab_common.config.General.requestName = requestName + # + outputDatasetTag = crab_common.reqNamePrefix +"_" + secondaryName + "_" + crab_common.version + crab_common.config.Data.outputDatasetTag = outputDatasetTag + # + print "requestName: ", requestName + print "outputDatasetTag: ", outputDatasetTag + crabCommand('submit', config = crab_common.config) + print "" \ No newline at end of file diff --git a/Skimmer/crab_JMEnano/crab_common.py b/Skimmer/crab_JMEnano/crab_common.py new file mode 100644 index 0000000..4ee031a --- /dev/null +++ b/Skimmer/crab_JMEnano/crab_common.py @@ -0,0 +1,62 @@ +from CRABClient.UserUtilities import config +config = config() +# +# Set version number (CHECK) +# +version="DiLeptonSkim_JMEnanoUL_v0p2" +# +# Set request name prefx +# +reqNamePrefix="JetPUId" +# +# Change this PATH where the crab directories are stored +# Example: config.General.workArea = '/afs/cern.ch/work/n/nbinnorj/private/crab_projects/' +# +config.General.workArea = '/afs/cern.ch/work/n/nbinnorj/private/crab_projects/' +config.General.transferOutputs = True +config.General.transferLogs = False +# +config.JobType.pluginName = 'Analysis' +config.JobType.psetName = 'PSet.py' +config.JobType.scriptExe = 'crab_script.sh' +# +config.JobType.inputFiles = [ +'../script/branches_in.txt', +'../script/branches_out.txt', +'../RunSkimmerCrab.py', +'../RunSkimmerHelper.py', +'../../../PhysicsTools/NanoAODTools/scripts/haddnano.py' +] +# +config.JobType.sendPythonFolder = True +config.JobType.outputFiles = ['tree.root'] +# +config.Data.splitting = 'FileBased' +config.Data.unitsPerJob = 1 +config.Data.publication = False +config.Data.inputDBS = 'phys03' #IMPORTANT! We're using a USER published dataset. Need this set. +# +config.Data.allowNonValidInputDataset = True +config.JobType.allowUndistributedCMSSW = True +# +# Specify the outLFNDirBase and your storage site +# +# +# JetMET CMS EOS space at CERN +# +config.Data.outLFNDirBase = '/store/group/phys_jetmet/nbinnorj/'+reqNamePrefix+'_'+version+'/CRABOUTPUT/' +config.Site.storageSite = 'T2_CH_CERN' +# +# User CERNBox +# +# config.Data.outLFNDirBase = '/store/user/nbinnorj/JetPUId_'+version+'/CRABOUTPUT/' +# config.Site.storageSite = 'T2_CH_CERNBOX' +# +config.Data.ignoreLocality = True +whitelist_sites=[ +'T2_CH_CERN', +'T2_UK_*', +'T2_DE_*', +'T2_FR_*', +] +config.Site.whitelist = whitelist_sites \ No newline at end of file diff --git a/Skimmer/crab_JMEnano/crab_script.sh b/Skimmer/crab_JMEnano/crab_script.sh new file mode 100644 index 0000000..7acce87 --- /dev/null +++ b/Skimmer/crab_JMEnano/crab_script.sh @@ -0,0 +1,29 @@ +# +# this is not mean to be run locally +# +echo Check if TTY +if [ "`tty`" != "not a tty" ]; then + echo "YOU SHOULD NOT RUN THIS IN INTERACTIVE, IT DELETES YOUR LOCAL FILES" +else + +ls -lR . +echo "ENV..................................." +env +echo "VOMS" +voms-proxy-info -all +echo "CMSSW BASE, python path, pwd" +echo $CMSSW_BASE +echo $PYTHONPATH +echo $PWD +rm -rf $CMSSW_BASE/lib/ +rm -rf $CMSSW_BASE/src/ +rm -rf $CMSSW_BASE/module/ +rm -rf $CMSSW_BASE/python/ +mv lib $CMSSW_BASE/lib +mv src $CMSSW_BASE/src +mv module $CMSSW_BASE/module +mv python $CMSSW_BASE/python + +echo Found Proxy in: $X509_USER_PROXY +python RunSkimmerCrab.py --jobNum=$1 --$2 --$3 --$4 +fi diff --git a/Skimmer/crab_JMEnano/helpers.py b/Skimmer/crab_JMEnano/helpers.py new file mode 100644 index 0000000..24c3e6a --- /dev/null +++ b/Skimmer/crab_JMEnano/helpers.py @@ -0,0 +1,7 @@ +def GetSampleList(file): + samplelist = file.readlines() + samplelist = [x.strip() for x in samplelist] + samplelist = [x for x in samplelist if x] # Choose lines that are not empty + samplelist = [x for x in samplelist if not(x.startswith("#"))] # Choose lines that do not start with # + + return samplelist \ No newline at end of file diff --git a/Skimmer/data/lumi/Cert_294927-306462_13TeV_UL2017_Collisions17_GoldenJSON.txt b/Skimmer/data/lumi/Cert_294927-306462_13TeV_UL2017_Collisions17_GoldenJSON.txt new file mode 100644 index 0000000..5882756 --- /dev/null +++ b/Skimmer/data/lumi/Cert_294927-306462_13TeV_UL2017_Collisions17_GoldenJSON.txt @@ -0,0 +1,615 @@ +{ + "297050": [[12, 137], [193, 776]], + "297056": [[12, 203]], + "297057": [[1, 4], [14, 105], [112, 377], [385, 418], [424, 509], [516, 906]], + "297099": [[24, 62]], + "297100": [[1, 15], [21, 369], [375, 381]], + "297101": [[1, 668], [673, 697], [700, 856], [862, 937], [943, 1101]], + "297113": [[1, 204], [211, 252]], + "297114": [[1, 99], [106, 161]], + "297175": [[1, 85]], + "297176": [[11, 120], [125, 214]], + "297177": [[1, 162]], + "297178": [ + [1, 54], + [59, 334], + [342, 749], + [754, 967], + [972, 1037], + [1043, 1264], + [1272, 1282], + [1290, 1385] + ], + "297179": [[1, 6], [12, 97]], + "297215": [[1, 47]], + "297218": [[1, 27]], + "297219": [ + [1, 80], + [85, 281], + [288, 579], + [585, 916], + [921, 1429], + [1436, 2004], + [2010, 2638] + ], + "297224": [[10, 19], [24, 138]], + "297225": [[1, 32]], + "297227": [[9, 192]], + "297292": [[1, 125], [130, 131], [136, 667], [675, 753]], + "297293": [[1, 121], [127, 150]], + "297296": [[1, 236], [240, 401], [406, 418], [425, 497]], + "297308": [[1, 44]], + "297359": [[39, 70], [164, 180]], + "297411": [[32, 737], [740, 800], [807, 950]], + "297424": [[32, 149]], + "297425": [[1, 107], [112, 157]], + "297426": [[1, 28], [34, 84], [90, 111]], + "297429": [[1, 72]], + "297430": [[1, 199]], + "297431": [[1, 49], [55, 64], [71, 188]], + "297432": [[1, 112]], + "297433": [[1, 159]], + "297434": [[1, 161]], + "297435": [[1, 94]], + "297467": [[50, 138]], + "297468": [[1, 74]], + "297469": [[1, 4], [9, 70]], + "297483": [[37, 68], [71, 201], [206, 214]], + "297484": [[1, 47], [53, 208], [214, 214]], + "297485": [[1, 16], [23, 253], [258, 299], [302, 314], [321, 420]], + "297486": [[1, 74], [79, 598], [603, 625]], + "297487": [[1, 433], [439, 491], [495, 603], [609, 613]], + "297488": [[1, 73], [80, 424]], + "297503": [ + [5, 275], + [282, 559], + [566, 606], + [612, 635], + [642, 772], + [777, 779] + ], + "297504": [[1, 41], [125, 136]], + "297505": [[1, 394]], + "297557": [[8, 28], [67, 113], [119, 167], [173, 174], [180, 394]], + "297558": [[9, 266]], + "297562": [[1, 69], [120, 369]], + "297563": [[1, 254], [260, 264]], + "297598": [[17, 17], [22, 33]], + "297599": [[1, 169], [211, 225], [230, 312], [319, 385], [395, 407]], + "297603": [[1, 420]], + "297604": [[1, 126], [131, 272], [279, 375], [381, 407]], + "297605": [[1, 6], [13, 20], [24, 89], [95, 223], [257, 407]], + "297606": [[1, 94], [99, 231]], + "297620": [[32, 318]], + "297656": [ + [64, 116], + [123, 135], + [140, 230], + [269, 307], + [313, 330], + [341, 388], + [393, 433] + ], + "297665": [[1, 153], [159, 209], [214, 279]], + "297666": [[1, 11], [17, 81], [86, 121]], + "297670": [[21, 34]], + "297674": [[3, 102], [108, 188]], + "297675": [[1, 123], [129, 239], [244, 328], [334, 467], [470, 471]], + "297722": [[55, 160], [165, 353]], + "297723": [[1, 13], [51, 222]], + "298996": [[33, 216]], + "298997": [[1, 37], [47, 47]], + "299000": [[4, 77]], + "299042": [[33, 55]], + "299061": [[38, 355]], + "299062": [[1, 163], [166, 303]], + "299064": [[7, 85]], + "299065": [[13, 248], [251, 342]], + "299067": [[1, 459]], + "299096": [[2, 97]], + "299149": [[29, 470]], + "299178": [[37, 56], [58, 111]], + "299180": [[5, 98]], + "299184": [[1, 561]], + "299185": [[1, 120]], + "299327": [[1, 72]], + "299329": [[1, 172]], + "299368": [[37, 175]], + "299369": [[1, 303]], + "299370": [[1, 7], [47, 705]], + "299380": [[34, 227]], + "299381": [[1, 45]], + "299394": [[5, 33]], + "299395": [[1, 187]], + "299396": [[1, 81]], + "299420": [[2, 50]], + "299443": [[145, 164]], + "299450": [[39, 88]], + "299477": [[39, 42], [82, 87]], + "299478": [[1, 175]], + "299479": [[1, 123]], + "299480": [[1, 6], [8, 715]], + "299481": [ + [1, 196], + [199, 236], + [260, 479], + [487, 940], + [943, 1037], + [1061, 1257] + ], + "299593": [[95, 177], [179, 896]], + "299594": [[1, 317]], + "299595": [[1, 134], [138, 138]], + "299597": [[3, 91], [93, 540]], + "299649": [[151, 332]], + "300087": [[36, 59], [61, 126], [128, 216], [218, 239]], + "300105": [[1, 21]], + "300106": [[1, 74]], + "300107": [[1, 28], [30, 47]], + "300117": [[35, 67]], + "300122": [[46, 730], [735, 924], [927, 1295]], + "300123": [[1, 384], [387, 612]], + "300155": [[35, 1229]], + "300156": [[1, 72]], + "300157": [[9, 1107]], + "300226": [[43, 448]], + "300233": [[43, 162]], + "300234": [[1, 59]], + "300235": [[1, 187]], + "300236": [[11, 187]], + "300237": [[1, 713], [716, 717]], + "300238": [[30, 58], [62, 329]], + "300239": [[1, 145], [148, 167], [171, 213]], + "300240": [[1, 7], [11, 46], [51, 362]], + "300280": [ + [52, 56], + [61, 69], + [73, 150], + [155, 165], + [178, 198], + [207, 222], + [226, 251], + [255, 268], + [275, 345], + [349, 370], + [381, 548], + [553, 607], + [617, 639], + [663, 691] + ], + "300281": [[3, 8]], + "300282": [[1, 9], [13, 59], [73, 92], [97, 114], [142, 151], [156, 186]], + "300283": [[1, 34]], + "300284": [ + [1, 22], + [38, 47], + [50, 82], + [90, 98], + [108, 130], + [133, 152], + [156, 250], + [260, 414], + [420, 561], + [568, 585], + [590, 680], + [691, 751] + ], + "300364": [[27, 46]], + "300372": [[1, 8]], + "300375": [[1, 93]], + "300389": [[1, 1], [4, 5], [8, 8], [11, 20], [23, 39], [60, 149]], + "300399": [[1, 20]], + "300400": [[1, 677]], + "300401": [[19, 673]], + "300459": [[40, 332]], + "300461": [[1, 98]], + "300462": [[1, 97]], + "300463": [[1, 124]], + "300464": [[1, 103], [126, 265]], + "300466": [[1, 650]], + "300467": [[1, 563]], + "300497": [[26, 175]], + "300514": [[38, 150]], + "300515": [[1, 838], [957, 1013]], + "300516": [[1, 111]], + "300517": [[1, 8], [103, 623]], + "300558": [[8, 548]], + "300560": [[1, 640], [645, 844]], + "300574": [[15, 111]], + "300575": [[1, 82]], + "300576": [[7, 123], [125, 1206]], + "300631": [[41, 49], [63, 66], [75, 226]], + "300632": [[1, 21]], + "300633": [[1, 447]], + "300635": [[1, 23], [26, 176]], + "300636": [[1, 335], [338, 1572]], + "300673": [[41, 47], [49, 49], [52, 56], [59, 66]], + "300674": [[1, 33]], + "300675": [[1, 33]], + "300676": [[1, 26]], + "300742": [[56, 343]], + "300777": [[21, 509]], + "300780": [[3, 341]], + "300785": [[1, 549], [552, 750], [752, 1201], [1219, 1272]], + "300806": [[36, 214]], + "300811": [[6, 508]], + "300812": [[1, 59]], + "300816": [[6, 161]], + "300817": [[1, 33], [36, 74], [80, 383], [410, 493]], + "301046": [[162, 223]], + "301141": [[25, 31]], + "301142": [[1, 897]], + "301161": [[36, 805]], + "301165": [[1, 145]], + "301179": [[35, 59]], + "301180": [[1, 97]], + "301183": [[3, 10], [13, 303]], + "301281": [[38, 157]], + "301283": [[3, 886]], + "301298": [[45, 949]], + "301323": [[35, 474], [477, 990]], + "301330": [[22, 353]], + "301359": [[33, 319]], + "301384": [[1, 476]], + "301391": [[38, 214]], + "301392": [[1, 627]], + "301393": [[2, 18]], + "301396": [[1, 33]], + "301397": [[1, 228], [231, 517], [519, 728]], + "301398": [[1, 9]], + "301399": [[1, 108]], + "301417": [[50, 367]], + "301447": [[86, 96], [99, 400], [404, 512]], + "301448": [[1, 329]], + "301449": [[1, 404]], + "301450": [[1, 173]], + "301461": [[28, 581]], + "301472": [[35, 830]], + "301475": [[1, 18]], + "301476": [[1, 844]], + "301519": [[42, 250]], + "301524": [[1, 110], [117, 263]], + "301529": [[1, 49]], + "301530": [[1, 110]], + "301531": [[1, 394]], + "301532": [[1, 611]], + "301567": [[14, 372]], + "301627": [[57, 943]], + "301664": [[28, 445]], + "301665": [[1, 294], [319, 487]], + "301694": [[36, 102]], + "301912": [[43, 52], [101, 422]], + "301913": [[1, 58]], + "301914": [[1, 350]], + "301941": [[31, 568]], + "301959": [[30, 1938]], + "301960": [[1, 147]], + "301970": [[6, 123]], + "301984": [[17, 317]], + "301985": [[1, 367]], + "301986": [[1, 381]], + "301987": [[1, 1128]], + "301997": [[37, 407]], + "301998": [[1, 1704]], + "302019": [[34, 86]], + "302026": [[24, 53], [66, 72]], + "302029": [[1, 98]], + "302031": [[1, 401], [403, 446], [448, 675], [678, 818]], + "302033": [[1, 40], [44, 46]], + "302034": [[1, 20]], + "302037": [[18, 20]], + "302038": [[10, 10]], + "302040": [[1, 174]], + "302041": [[1, 72]], + "302042": [[1, 523]], + "302043": [[1, 228]], + "302131": [[71, 943]], + "302159": [[33, 140]], + "302163": [[32, 671], [674, 1230]], + "302165": [[1, 85]], + "302166": [[1, 16]], + "302225": [[54, 133], [136, 923]], + "302228": [[58, 78], [81, 293]], + "302229": [[1, 457]], + "302240": [[1, 960]], + "302262": [[37, 471]], + "302263": [[1, 1250]], + "302277": [[15, 17], [22, 192], [194, 391]], + "302279": [[1, 71]], + "302280": [[1, 152]], + "302322": [[33, 870]], + "302328": [[42, 722]], + "302337": [[27, 162]], + "302342": [[19, 72]], + "302343": [[1, 98]], + "302344": [[3, 482]], + "302350": [[1, 136]], + "302388": [[27, 157], [164, 717]], + "302392": [[45, 407]], + "302393": [[1, 887]], + "302448": [[21, 312], [317, 442], [445, 483], [486, 1926]], + "302472": [[28, 808]], + "302473": [[1, 368], [398, 406]], + "302474": [[1, 305]], + "302475": [[1, 7]], + "302476": [[1, 259]], + "302479": [[30, 222], [225, 340]], + "302484": [[8, 176]], + "302485": [[1, 922]], + "302492": [[10, 21], [23, 59]], + "302493": [[1, 7]], + "302494": [[1, 618]], + "302509": [[73, 92]], + "302513": [[37, 89]], + "302522": [[29, 46]], + "302523": [[1, 59]], + "302525": [[1, 677], [747, 778]], + "302526": [[1, 582]], + "302548": [[40, 124]], + "302551": [[1, 7]], + "302553": [[1, 188]], + "302554": [[1, 7]], + "302555": [[1, 11]], + "302563": [[40, 46]], + "302565": [[1, 7]], + "302572": [[6, 291]], + "302573": [[1, 693], [730, 1285]], + "302596": [[47, 534], [545, 705], [710, 986]], + "302597": [[1, 1054]], + "302634": [ + [37, 73], + [75, 123], + [125, 129], + [133, 165], + [168, 175], + [177, 216], + [218, 358], + [361, 375], + [378, 404], + [407, 423], + [425, 503], + [505, 578], + [581, 594], + [596, 638] + ], + "302635": [ + [1, 22], + [24, 28], + [30, 39], + [41, 53], + [55, 132], + [134, 144], + [146, 265], + [267, 271], + [274, 344], + [347, 357], + [359, 375], + [378, 384], + [386, 414], + [416, 494], + [497, 608], + [611, 634], + [637, 684], + [687, 706], + [708, 724], + [726, 901], + [904, 954], + [957, 982], + [984, 1072], + [1075, 1124], + [1126, 1129], + [1132, 1206], + [1209, 1234], + [1236, 1291] + ], + "302651": [[1, 149]], + "302654": [[1, 317]], + "302661": [[1, 72]], + "302663": [[1, 706]], + "303825": [[1, 180]], + "303832": [[54, 1334], [1338, 1913]], + "303838": [[54, 54], [83, 2044]], + "303885": [[60, 2052]], + "303948": [[55, 1678]], + "303998": [[58, 319]], + "303999": [[1, 751]], + "304000": [[1, 56]], + "304062": [[54, 2014]], + "304119": [[71, 138], [143, 150]], + "304120": [[1, 253]], + "304125": [[1, 1769]], + "304144": [[76, 2596], [2598, 2656]], + "304158": [[165, 1750], [1752, 2087]], + "304169": [[50, 1714], [1731, 1733]], + "304170": [[1, 620]], + "304199": [[10, 18]], + "304200": [[1, 321]], + "304204": [[55, 607]], + "304209": [[52, 98], [100, 133], [135, 157], [176, 253], [255, 477]], + "304291": [[56, 85]], + "304292": [[1, 1125], [1183, 1779], [1781, 1811]], + "304333": [[74, 1653]], + "304354": [[82, 295]], + "304366": [ + [44, 1387], + [1390, 1396], + [1399, 1402], + [1404, 1407], + [1409, 1412], + [1414, 1416], + [1419, 1421], + [1424, 1873] + ], + "304446": [[40, 92], [110, 111]], + "304447": [[1, 534], [540, 1644]], + "304451": [[1, 60]], + "304505": [[60, 86]], + "304506": [[1, 370]], + "304507": [[1, 239]], + "304508": [[1, 1324]], + "304562": [[52, 56], [60, 848]], + "304616": [[52, 223], [227, 740], [747, 1002]], + "304625": [[73, 536]], + "304626": [[1, 8]], + "304654": [[53, 704]], + "304655": [[1, 1194]], + "304661": [[53, 67], [69, 143], [147, 173], [175, 198], [237, 240]], + "304662": [[1, 150]], + "304663": [[1, 689]], + "304671": [[51, 1193]], + "304672": [[1, 60]], + "304737": [[69, 149]], + "304738": [[1, 1681]], + "304739": [[3, 16]], + "304740": [[1, 278]], + "304776": [[49, 98]], + "304777": [[1, 431], [438, 510]], + "304778": [[4, 1300]], + "304797": [[28, 87], [91, 306], [308, 377], [385, 1202], [1205, 2950]], + "305044": [[3, 203], [302, 306], [309, 310], [313, 313], [318, 330]], + "305045": [[1, 873]], + "305046": [[1, 667], [671, 686]], + "305059": [[63, 518], [520, 575]], + "305062": [[1, 8]], + "305063": [[1, 35]], + "305064": [[1, 2045]], + "305081": [[52, 1107]], + "305112": [[68, 1527]], + "305113": [[9, 72]], + "305114": [[1, 526]], + "305178": [[69, 124]], + "305179": [[1, 21]], + "305180": [[1, 9]], + "305181": [[1, 8]], + "305182": [[1, 8]], + "305183": [[1, 231], [262, 266]], + "305184": [[1, 8]], + "305186": [[1, 112], [120, 422]], + "305188": [[1, 1002]], + "305202": [[74, 132], [136, 729]], + "305204": [[1, 1229]], + "305207": [[52, 1077]], + "305208": [[1, 372]], + "305234": [[52, 99]], + "305236": [[1, 23]], + "305237": [[1, 16], [18, 1147]], + "305247": [[57, 433]], + "305248": [[1, 957]], + "305252": [[1, 548]], + "305282": [[75, 207]], + "305310": [[60, 157], [163, 458]], + "305311": [[1, 153]], + "305312": [[1, 227]], + "305313": [[1, 741]], + "305314": [[1, 404]], + "305336": [[36, 241]], + "305338": [[1, 107]], + "305341": [[1, 503]], + "305349": [[1, 34]], + "305350": [[1, 21]], + "305351": [[1, 868]], + "305358": [[91, 231], [233, 253]], + "305364": [[50, 147]], + "305365": [[1, 668], [676, 832]], + "305366": [[1, 721], [724, 756], [769, 934], [936, 1254]], + "305376": [[71, 168]], + "305377": [[9, 1292], [1294, 1383], [1386, 1525]], + "305405": [[44, 536], [573, 575]], + "305406": [[1, 394], [401, 520], [528, 535], [540, 1475]], + "305440": [[20, 291]], + "305441": [[1, 121]], + "305516": [[46, 518], [558, 639]], + "305517": [[1, 163]], + "305518": [[1, 1134]], + "305586": [[53, 583]], + "305589": [[1, 691]], + "305590": [[1, 500], [517, 1020]], + "305636": [[60, 339], [342, 667], [671, 2390]], + "305766": [[55, 902]], + "305809": [[56, 197]], + "305814": [[85, 689], [692, 978], [980, 1074], [1077, 1912]], + "305821": [[59, 830]], + "305832": [[87, 266]], + "305840": [[1, 1144]], + "305842": [[1, 862]], + "305862": [[81, 705]], + "305898": [[70, 780]], + "305902": [[53, 521]], + "305967": [[1, 32]], + "306029": [[63, 96]], + "306030": [[1, 110]], + "306036": [[60, 63]], + "306037": [[1, 49]], + "306038": [[1, 139]], + "306041": [[1, 320]], + "306042": [[1, 371]], + "306048": [[1, 140]], + "306049": [[1, 358]], + "306051": [[1, 415]], + "306091": [[422, 629]], + "306092": [[1, 588], [593, 976]], + "306095": [[1, 300]], + "306121": [[57, 152]], + "306122": [[1, 127]], + "306125": [[1, 756], [770, 2642], [2667, 3007]], + "306126": [[1, 497]], + "306134": [[53, 84]], + "306135": [[1, 1095]], + "306138": [[1, 1298]], + "306139": [[1, 1112]], + "306153": [[78, 165]], + "306154": [[1, 251], [253, 691], [709, 1233]], + "306155": [[1, 1440]], + "306169": [[1, 745]], + "306170": [[1, 22]], + "306171": [[1, 503]], + "306418": [[1, 33], [35, 75]], + "306419": [[1, 62]], + "306420": [[1, 108]], + "306422": [[9, 126]], + "306423": [[1, 333]], + "306432": [[1, 339]], + "306454": [[13, 101]], + "306455": [[1, 11]], + "306456": [[1, 237], [239, 787]], + "306457": [[1, 31]], + "306458": [ + [1, 17], + [20, 35], + [37, 41], + [43, 47], + [49, 53], + [56, 60], + [62, 66], + [68, 72], + [74, 77], + [79, 83], + [85, 89], + [93, 102], + [104, 108], + [110, 114], + [116, 120], + [122, 126], + [129, 139], + [141, 145], + [147, 151], + [153, 166], + [169, 173], + [175, 179], + [181, 185], + [187, 191], + [193, 197], + [200, 210], + [212, 216], + [218, 222], + [225, 229], + [231, 235], + [237, 241], + [243, 247], + [249, 249], + [252, 256], + [258, 268] + ], + "306459": [[1, 512], [514, 2275]], + "306460": [[1, 73]] +} \ No newline at end of file diff --git a/Skimmer/data/mvaWeights/.gitignore b/Skimmer/data/mvaWeights/.gitignore new file mode 100644 index 0000000..09a5768 --- /dev/null +++ b/Skimmer/data/mvaWeights/.gitignore @@ -0,0 +1,2 @@ +*.xml +*.xml.gz diff --git a/Skimmer/data/mvaWeights/README.md b/Skimmer/data/mvaWeights/README.md new file mode 100644 index 0000000..82431aa --- /dev/null +++ b/Skimmer/data/mvaWeights/README.md @@ -0,0 +1,19 @@ +Get the UL2017 weights + + +```bash +wget https://github.com/cms-data/RecoJets-JetProducers/raw/master/pileupJetId_UL17_Eta0p0To2p5_chs_BDT.weights.xml.gz +wget https://github.com/cms-data/RecoJets-JetProducers/raw/master/pileupJetId_UL17_Eta2p5To2p75_chs_BDT.weights.xml.gz +wget https://github.com/cms-data/RecoJets-JetProducers/raw/master/pileupJetId_UL17_Eta2p75To3p0_chs_BDT.weights.xml.gz +wget https://github.com/cms-data/RecoJets-JetProducers/raw/master/pileupJetId_UL17_Eta3p0To5p0_chs_BDT.weights.xml.gz +``` + +then unzip + + +```bash +gzip -d pileupJetId_UL17_Eta0p0To2p5_chs_BDT.weights.xml.gz +gzip -d pileupJetId_UL17_Eta2p5To2p75_chs_BDT.weights.xml.gz +gzip -d pileupJetId_UL17_Eta2p75To3p0_chs_BDT.weights.xml.gz +gzip -d pileupJetId_UL17_Eta3p0To5p0_chs_BDT.weights.xml.gz +``` diff --git a/Skimmer/python/PUIDCalculator.py b/Skimmer/python/PUIDCalculator.py new file mode 100644 index 0000000..798c078 --- /dev/null +++ b/Skimmer/python/PUIDCalculator.py @@ -0,0 +1,201 @@ +from PhysicsTools.NanoAODTools.postprocessing.framework.datamodel import Collection,Object +from PhysicsTools.NanoAODTools.postprocessing.framework.eventloop import Module +from PhysicsTools.NanoAODTools.postprocessing.tools import * +import os +import math +import array +import ROOT +ROOT.PyConfig.IgnoreCommandLineOptions = True + +class PUIDCalculator(Module): + def __init__(self, era, jetBranchName): + self.era = era + self.jetBranchName = jetBranchName + self.lenVar = "n"+self.jetBranchName + self.minJetPt = 15. + self.tmvaWeightsPath = os.environ['CMSSW_BASE']+"/src/PUjetID/Skimmer/data/mvaWeights/" + # + # TMVA BDT weights + # + self.tmvaWeightFilenames = [] + # UL 2017 training weights + if self.era == "UL2017": + self.tmvaWeightFilenames = [ + self.tmvaWeightsPath+"pileupJetId_UL17_Eta0p0To2p5_chs_BDT.weights.xml", + self.tmvaWeightsPath+"pileupJetId_UL17_Eta2p5To2p75_chs_BDT.weights.xml", + self.tmvaWeightsPath+"pileupJetId_UL17_Eta2p75To3p0_chs_BDT.weights.xml", + self.tmvaWeightsPath+"pileupJetId_UL17_Eta3p0To5p0_chs_BDT.weights.xml", + ] + # + # + # + self.eta_bins = [ + "Eta0p0To2p5", + "Eta2p5To2p75", + "Eta2p75To3p0", + "Eta3p0To5p0" + ] + # + # Define variables to be provided to TMVA::Reader + # + self.tmva_v_nvtx = array.array("f", [-999.]) + self.tmva_v_beta = array.array("f", [-999.]) + self.tmva_v_dR2Mean = array.array("f", [-999.]) + self.tmva_v_frac01 = array.array("f", [-999.]) + self.tmva_v_frac02 = array.array("f", [-999.]) + self.tmva_v_frac03 = array.array("f", [-999.]) + self.tmva_v_frac04 = array.array("f", [-999.]) + self.tmva_v_majW = array.array("f", [-999.]) + self.tmva_v_minW = array.array("f", [-999.]) + self.tmva_v_jetR = array.array("f", [-999.]) + self.tmva_v_jetRchg = array.array("f", [-999.]) + self.tmva_v_nParticles = array.array("f", [-999.]) + self.tmva_v_nCharged = array.array("f", [-999.]) + self.tmva_v_ptD = array.array("f", [-999.]) + self.tmva_v_pull = array.array("f", [-999.]) + # NOTE: It is important that this list follows + # the order of the variables as in the tmva weights + # files + self.tmva_variables = [ + ("nvtx" , self.tmva_v_nvtx), + ("beta", self.tmva_v_beta), + ("dR2Mean", self.tmva_v_dR2Mean), + ("frac01", self.tmva_v_frac01), + ("frac02", self.tmva_v_frac02), + ("frac03", self.tmva_v_frac03), + ("frac04", self.tmva_v_frac04), + ("majW", self.tmva_v_majW), + ("minW", self.tmva_v_minW), + ("jetR", self.tmva_v_jetR), + ("jetRchg", self.tmva_v_jetRchg), + ("nParticles", self.tmva_v_nParticles), + ("nCharged", self.tmva_v_nCharged), + ("ptD", self.tmva_v_ptD), + ("pull", self.tmva_v_pull), + ] + self.tmva_s_jetPt = array.array("f", [-999]) + self.tmva_s_jetEta = array.array("f", [-999]) + self.tmva_spectators = [ + ("jetPt", self.tmva_s_jetPt), + ("jetEta", self.tmva_s_jetEta), + ] + + self.tmva_readers = [] + if len(self.eta_bins) == len(self.tmvaWeightFilenames): + # + # For each etaBin, setup a TMVA::Reader + # + for i, eta_bin in enumerate(self.eta_bins): + # + # Initialize TMVA::Reader + # + self.tmva_readers.append(ROOT.TMVA.Reader("!Color:!Silent")) + # + # Add spectator variables + # + for spec_name, spec_address in self.tmva_spectators: + self.tmva_readers[i].AddSpectator(spec_name, spec_address) + # + # Add training variables + # + for var_name, var_address in self.tmva_variables: + # For the last eta bin, we don't use the following + # variables. + if eta_bin == "Eta3p0To5p0": + if var_name == "beta": continue + if var_name == "jetRchg": continue + if var_name == "nCharged": continue + self.tmva_readers[i].AddVariable(var_name, var_address) + # + # Book BDT + # + self.tmva_readers[i].BookMVA("BDT", self.tmvaWeightFilenames[i]) + else: + raise ValueError("ERROR: eta_bins length not the same as tmvaWeightFilenames length. Please check!") + + def beginJob(self,histFile=None,histDirName=None): + Module.beginJob(self) + + def endJob(self): + Module.endJob(self) + print "PUIDCalculator module ended successfully" + pass + + def endFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): + pass + + def beginFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): + self.out = wrappedOutputTree + self.out.branch("Jet_puIdDiscOTF","F",lenVar=self.lenVar) # OTF here means on-the-fly + + def analyze(self, event): + + jets = Collection(event, self.jetBranchName) + + #============================================================ + # + # + # + #============================================================ + jets_puIdDiscOTF = [] + + for iJet, jet in enumerate(jets): + jet_pt = jet.pt + jet_eta = jet.eta + jet_puIdDiscOTF = -9. + + # + # Let us just calculate BDT for jets with pt > 15 GeV. + # In NanoAOD JME, there are a LOT of low pt jets. + # + if jet_pt > self.minJetPt: + # Spectator variables + self.tmva_s_jetPt[0] = jet_pt + self.tmva_s_jetEta[0] = jet_eta + # Training variables + self.tmva_v_nvtx[0] = event.PV_npvsGood + self.tmva_v_beta[0] = jet.puId_beta + self.tmva_v_dR2Mean[0] = jet.puId_dR2Mean + self.tmva_v_frac01[0] = jet.puId_frac01 + self.tmva_v_frac02[0] = jet.puId_frac02 + self.tmva_v_frac03[0] = jet.puId_frac03 + self.tmva_v_frac04[0] = jet.puId_frac04 + self.tmva_v_majW[0] = jet.puId_majW + self.tmva_v_minW[0] = jet.puId_minW + self.tmva_v_jetR[0] = jet.puId_jetR + self.tmva_v_jetRchg[0] = jet.puId_jetRchg + self.tmva_v_nParticles[0] = jet.nConstituents + self.tmva_v_nCharged[0] = jet.puId_nCharged + self.tmva_v_ptD[0] = jet.puId_ptD + self.tmva_v_pull[0] = jet.puId_pull + # + # Determine which eta bin + # + etaBinIdx = -1 + if abs(jet_eta) > 0.00 and abs(jet_eta) <= 2.50: + etaBinIdx = 0 + elif abs(jet_eta) > 2.50 and abs(jet_eta) <= 2.75: + etaBinIdx = 1 + elif abs(jet_eta) > 2.75 and abs(jet_eta) <= 3.00: + etaBinIdx = 2 + elif abs(jet_eta) > 3.00 and abs(jet_eta) <= 5.00: + etaBinIdx = 3 + # + # Calculate the BDT output and store the value + # + jet_puIdDiscOTF = self.tmva_readers[etaBinIdx].EvaluateMVA("BDT") + else: + jet_puIdDiscOTF = -9. + # + # + # + jets_puIdDiscOTF.append(jet_puIdDiscOTF) + + # + # Save variable in TTree + # + self.out.fillBranch("Jet_puIdDiscOTF", jets_puIdDiscOTF) + + return True + +PUIDCalculator_UL2017 = lambda : PUIDCalculator(era="UL2017", jetBranchName="Jet") diff --git a/Skimmer/python/SkimmerDiLepton.py b/Skimmer/python/SkimmerDiLepton.py index 8784e80..5c0ec48 100644 --- a/Skimmer/python/SkimmerDiLepton.py +++ b/Skimmer/python/SkimmerDiLepton.py @@ -1,12 +1,11 @@ -import ROOT -ROOT.PyConfig.IgnoreCommandLineOptions = True - from PhysicsTools.NanoAODTools.postprocessing.framework.datamodel import Collection,Object from PhysicsTools.NanoAODTools.postprocessing.framework.eventloop import Module from PhysicsTools.NanoAODTools.postprocessing.tools import * - import math import array +import os +import ROOT +ROOT.PyConfig.IgnoreCommandLineOptions = True class SkimmerDiLepton(Module): def __init__(self, isMC, era, isDoubleElecData=False, isDoubleMuonData=False): @@ -27,9 +26,157 @@ def __init__(self, isMC, era, isDoubleElecData=False, isDoubleMuonData=False): "jerUp", "jerDown" ] + # + # + # self.jetSystsList = [""] # Nominal if self.isMC: self.jetSystsList.extend(ak4Systematics) + # + # + # + self.calcBDTDiscOTF = False + if self.era == "UL2017": + self.setupTMVAReader() + self.calcBDTDiscOTF = True + + def setupTMVAReader(self): + self.tmvaWeightsPath = os.environ['CMSSW_BASE']+"/src/PUjetID/Skimmer/data/mvaWeights/" + # + # TMVA BDT weights + # + self.tmvaWeightFilenames = [] + # UL 2017 training weights + if self.era == "UL2017": + self.tmvaWeightFilenames = [ + self.tmvaWeightsPath+"pileupJetId_UL17_Eta0p0To2p5_chs_BDT.weights.xml", + self.tmvaWeightsPath+"pileupJetId_UL17_Eta2p5To2p75_chs_BDT.weights.xml", + self.tmvaWeightsPath+"pileupJetId_UL17_Eta2p75To3p0_chs_BDT.weights.xml", + self.tmvaWeightsPath+"pileupJetId_UL17_Eta3p0To5p0_chs_BDT.weights.xml", + ] + # + # Eta bins + # + self.eta_bins = [ + "Eta0p0To2p5", + "Eta2p5To2p75", + "Eta2p75To3p0", + "Eta3p0To5p0" + ] + # + # Define variables to be provided to TMVA::Reader + # + self.tmva_v_nvtx = array.array("f", [-999.]) + self.tmva_v_beta = array.array("f", [-999.]) + self.tmva_v_dR2Mean = array.array("f", [-999.]) + self.tmva_v_frac01 = array.array("f", [-999.]) + self.tmva_v_frac02 = array.array("f", [-999.]) + self.tmva_v_frac03 = array.array("f", [-999.]) + self.tmva_v_frac04 = array.array("f", [-999.]) + self.tmva_v_majW = array.array("f", [-999.]) + self.tmva_v_minW = array.array("f", [-999.]) + self.tmva_v_jetR = array.array("f", [-999.]) + self.tmva_v_jetRchg = array.array("f", [-999.]) + self.tmva_v_nParticles = array.array("f", [-999.]) + self.tmva_v_nCharged = array.array("f", [-999.]) + self.tmva_v_ptD = array.array("f", [-999.]) + self.tmva_v_pull = array.array("f", [-999.]) + # NOTE: It is important that this list follows + # the order of the variables as in the tmva weights + # files + self.tmva_variables = [ + ("nvtx" , self.tmva_v_nvtx), + ("beta", self.tmva_v_beta), + ("dR2Mean", self.tmva_v_dR2Mean), + ("frac01", self.tmva_v_frac01), + ("frac02", self.tmva_v_frac02), + ("frac03", self.tmva_v_frac03), + ("frac04", self.tmva_v_frac04), + ("majW", self.tmva_v_majW), + ("minW", self.tmva_v_minW), + ("jetR", self.tmva_v_jetR), + ("jetRchg", self.tmva_v_jetRchg), + ("nParticles", self.tmva_v_nParticles), + ("nCharged", self.tmva_v_nCharged), + ("ptD", self.tmva_v_ptD), + ("pull", self.tmva_v_pull), + ] + self.tmva_s_jetPt = array.array("f", [-999]) + self.tmva_s_jetEta = array.array("f", [-999]) + self.tmva_spectators = [ + ("jetPt", self.tmva_s_jetPt), + ("jetEta", self.tmva_s_jetEta), + ] + self.tmva_readers = [] + if len(self.eta_bins) == len(self.tmvaWeightFilenames): + # + # For each eta bin, setup a TMVA::Reader + # + for i, eta_bin in enumerate(self.eta_bins): + # + # Initialize TMVA::Reader + # + self.tmva_readers.append(ROOT.TMVA.Reader("!Color:!Silent")) + # + # Add spectator variables + # + for spec_name, spec_address in self.tmva_spectators: + self.tmva_readers[i].AddSpectator(spec_name, spec_address) + # + # Add training variables + # + for var_name, var_address in self.tmva_variables: + # For the last eta bin, we don't use the following + # variables in training. + if eta_bin == "Eta3p0To5p0": + if var_name == "beta": continue + if var_name == "jetRchg": continue + if var_name == "nCharged": continue + self.tmva_readers[i].AddVariable(var_name, var_address) + # + # Book BDT + # + self.tmva_readers[i].BookMVA("BDT", self.tmvaWeightFilenames[i]) + else: + raise ValueError("ERROR: eta_bins length not the same as tmvaWeightFilenames length. Please check!") + + def calcPUIDBDTDisc(self, event, jet): + # + jet_pt = jet.pt + jet_eta = jet.eta + # + self.tmva_s_jetPt[0] = jet_pt + self.tmva_s_jetEta[0] = jet_eta + # + self.tmva_v_nvtx[0] = event.PV_npvsGood + self.tmva_v_beta[0] = jet.puId_beta + self.tmva_v_dR2Mean[0] = jet.puId_dR2Mean + self.tmva_v_frac01[0] = jet.puId_frac01 + self.tmva_v_frac02[0] = jet.puId_frac02 + self.tmva_v_frac03[0] = jet.puId_frac03 + self.tmva_v_frac04[0] = jet.puId_frac04 + self.tmva_v_majW[0] = jet.puId_majW + self.tmva_v_minW[0] = jet.puId_minW + self.tmva_v_jetR[0] = jet.puId_jetR + self.tmva_v_jetRchg[0] = jet.puId_jetRchg + self.tmva_v_nParticles[0] = jet.nConstituents + self.tmva_v_nCharged[0] = jet.puId_nCharged + self.tmva_v_ptD[0] = jet.puId_ptD + self.tmva_v_pull[0] = jet.puId_pull + # + # Determine which etaBin this jet is in + # + etaBinIdx = -1 + if abs(jet_eta) > 0.00 and abs(jet_eta) <= 2.50: + etaBinIdx = 0 + elif abs(jet_eta) > 2.50 and abs(jet_eta) <= 2.75: + etaBinIdx = 1 + elif abs(jet_eta) > 2.75 and abs(jet_eta) <= 3.00: + etaBinIdx = 2 + elif abs(jet_eta) > 3.00 and abs(jet_eta) <= 5.00: + etaBinIdx = 3 + # + return self.tmva_readers[etaBinIdx].EvaluateMVA("BDT") def beginJob(self,histFile=None,histDirName=None): Module.beginJob(self) @@ -81,6 +228,7 @@ def beginFile(self, inputFile, outputFile, inputTree, wrappedOutputTree): self.out.branch(jetSystPreFix+"jetSel"+str(i)+"_jetId", "I") self.out.branch(jetSystPreFix+"jetSel"+str(i)+"_puId", "I") self.out.branch(jetSystPreFix+"jetSel"+str(i)+"_puIdDisc", "F")# Starting from NanoAODv7 + self.out.branch(jetSystPreFix+"jetSel"+str(i)+"_puIdDiscOTF","F") self.out.branch(jetSystPreFix+"jetSel"+str(i)+"_qgl", "F") self.out.branch(jetSystPreFix+"jetSel"+str(i)+"_nConst", "I") self.out.branch(jetSystPreFix+"jetSel"+str(i)+"_chEmEF", "F") @@ -190,6 +338,9 @@ def passElectronTriggerSelection(self, event): elif self.era == "2018": if hasattr(event, 'HLT_Ele23_Ele12_CaloIdL_TrackIdL_IsoVL'): event.passElectronTrig |= event.HLT_Ele23_Ele12_CaloIdL_TrackIdL_IsoVL + elif self.era == "UL2017": + if hasattr(event, 'HLT_Ele23_Ele12_CaloIdL_TrackIdL_IsoVL'): + event.passElectronTrig |= event.HLT_Ele23_Ele12_CaloIdL_TrackIdL_IsoVL return True if event.passElectronTrig else False @@ -214,6 +365,9 @@ def passMuonTriggerSelection(self, event): elif self.era == "2018": if hasattr(event, 'HLT_Mu17_TrkIsoVVL_Mu8_TrkIsoVVL_DZ_Mass3p8'): event.passMuonTrig |= event.HLT_Mu17_TrkIsoVVL_Mu8_TrkIsoVVL_DZ_Mass3p8 + elif self.era == "UL2017": + if hasattr(event, 'HLT_Mu17_TrkIsoVVL_Mu8_TrkIsoVVL_DZ_Mass8'): + event.passMuonTrig |= event.HLT_Mu17_TrkIsoVVL_Mu8_TrkIsoVVL_DZ_Mass8 return True if event.passMuonTrig else False @@ -546,12 +700,12 @@ def fillJetBranches(self, event, jetSyst): for i, jet in enumerate(event.jetsSel): if i >= self.maxNSelJetsSaved: break self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_pt", getattr(jet, jetPtName)) - self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_pt_nom", getattr(jet, "pt_nom") if self.isMC else jet.pt) + self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_pt_nom", getattr(jet, "pt_nom") if self.isMC and hasattr(jet, "pt_nom") else jet.pt)# Fix this self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_pt_nano", jet.pt) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_eta", jet.eta) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_phi", jet.phi) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_mass", getattr(jet, jetMassName)) - self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_mass_nom",getattr(jet, "mass_nom") if self.isMC else jet.mass) + self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_mass_nom",getattr(jet, "mass_nom") if self.isMC and hasattr(jet, "mass_nom") else jet.mass)# Fix this self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_mass_nano",jet.mass) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_jetId", jet.jetId) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_puId", jet.puId) @@ -564,6 +718,14 @@ def fillJetBranches(self, event, jetSyst): self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_neHEF", jet.neHEF) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_muEF", jet.muEF) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_dilep_dphi",event.dilep_p4.DeltaPhi(jet.p4())) + # + # This is where we calculate the PU BDT discriminant + # + puIdDiscOTF = -9. + if self.calcBDTDiscOTF: + jetPuIdDiscOTF = self.calcPUIDBDTDisc(event, jet) + self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_puIdDiscOTF",jetPuIdDiscOTF) + # if self.isMC: self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_partflav",jet.partonFlavour) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_hadflav", jet.hadronFlavour) @@ -576,15 +738,21 @@ def fillJetBranches(self, event, jetSyst): self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_gen_mass", genJet.mass) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_gen_partflav", genJet.partonFlavour) self.out.fillBranch(jetSystPreFix+"jetSel"+str(i)+"_gen_hadflav", genJet.hadronFlavour) - +# +# EOY +# SkimmerDiLepton_2016_data_dielectron = lambda : SkimmerDiLepton(isMC=False, era="2016", isDoubleElecData=True) SkimmerDiLepton_2017_data_dielectron = lambda : SkimmerDiLepton(isMC=False, era="2017", isDoubleElecData=True) SkimmerDiLepton_2018_data_dielectron = lambda : SkimmerDiLepton(isMC=False, era="2018", isDoubleElecData=True) - SkimmerDiLepton_2016_data_dimuon = lambda : SkimmerDiLepton(isMC=False, era="2016", isDoubleMuonData=True) SkimmerDiLepton_2017_data_dimuon = lambda : SkimmerDiLepton(isMC=False, era="2017", isDoubleMuonData=True) -SkimmerDiLepton_2018_data_dimuon = lambda : SkimmerDiLepton(isMC=False, era="2018", isDoubleMuonData=True) - -SkimmerDiLepton_2016_mc = lambda : SkimmerDiLepton(isMC=True, era="2016") -SkimmerDiLepton_2017_mc = lambda : SkimmerDiLepton(isMC=True, era="2017") -SkimmerDiLepton_2018_mc = lambda : SkimmerDiLepton(isMC=True, era="2018") +SkimmerDiLepton_2018_data_dimuon = lambda : SkimmerDiLepton(isMC=False, era="2018", isDoubleMuonData=True) +SkimmerDiLepton_2016_mc = lambda : SkimmerDiLepton(isMC=True, era="2016") +SkimmerDiLepton_2017_mc = lambda : SkimmerDiLepton(isMC=True, era="2017") +SkimmerDiLepton_2018_mc = lambda : SkimmerDiLepton(isMC=True, era="2018") +# +# Ultra-Legacy +# +SkimmerDiLepton_UL2017_data_dielectron = lambda : SkimmerDiLepton(isMC=False, era="UL2017", isDoubleElecData=True) +SkimmerDiLepton_UL2017_data_dimuon = lambda : SkimmerDiLepton(isMC=False, era="UL2017", isDoubleMuonData=True) +SkimmerDiLepton_UL2017_mc = lambda : SkimmerDiLepton(isMC=True, era="UL2017") diff --git a/Skimmer/samples/JMEnanoV1/JMEnanoV1_UL2017_Data.txt b/Skimmer/samples/JMEnanoV1/JMEnanoV1_UL2017_Data.txt new file mode 100644 index 0000000..2957b8a --- /dev/null +++ b/Skimmer/samples/JMEnanoV1/JMEnanoV1_UL2017_Data.txt @@ -0,0 +1,5 @@ +/DoubleMuon/algomez-Run2017B-09Aug2019_UL2017-v1_JMEnanoV1-f3095d45f30d5f5a51b7a75248c8ce9d/USER +/DoubleMuon/algomez-Run2017C-09Aug2019_UL2017-v1_JMEnanoV1-f3095d45f30d5f5a51b7a75248c8ce9d/USER +/DoubleMuon/algomez-Run2017D-09Aug2019_UL2017-v1_JMEnanoV1-f3095d45f30d5f5a51b7a75248c8ce9d/USER +/DoubleMuon/algomez-Run2017E-09Aug2019_UL2017-v1_JMEnanoV1-f3095d45f30d5f5a51b7a75248c8ce9d/USER +/DoubleMuon/algomez-Run2017F-09Aug2019_UL2017-v1_JMEnanoV1-f3095d45f30d5f5a51b7a75248c8ce9d/USER \ No newline at end of file diff --git a/Skimmer/samples/JMEnanoV1/JMEnanoV1_UL2017_MC.txt b/Skimmer/samples/JMEnanoV1/JMEnanoV1_UL2017_MC.txt new file mode 100644 index 0000000..b1f224a --- /dev/null +++ b/Skimmer/samples/JMEnanoV1/JMEnanoV1_UL2017_MC.txt @@ -0,0 +1,2 @@ +/DYJetsToLL_M-50_TuneCP5_13TeV-amcatnloFXFX-pythia8/algomez-RunIISummer19UL17JMEnanoV1-106X_mc2017_realistic_v6-v2-1c822544b349959fbcd74e91edede2d7/USER +/DYJetsToLL_M-50_TuneCP5_13TeV-madgraphMLM-pythia8/algomez-RunIISummer19UL17JMEnanoV1-106X_mc2017_realistic_v6-v2-1c822544b349959fbcd74e91edede2d7/USER \ No newline at end of file