From 3ad7330f95fd481441e61b4de4d0d49d3d052a7f Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 1 Apr 2015 15:48:20 +0200 Subject: [PATCH 1/4] - added information of generator level hadronic tau decays (using tauGenJetsSelectorAllHadrons module) - relaxed tau preselection to: pT > 18 GeV && abs(eta) < 2.5 && decayModeFindingNewDMs - increased max. size of TauGood collection - added missing check if muon track exists when computing nChamberHits and pixelHits variables for muons --- .../python/analyzers/objects/TauAnalyzer.py | 19 +++--- .../Heppy/python/TauGenJetAnalyzer.py | 54 +++++++++++++++++ VHbbAnalysis/Heppy/python/genTauDecayMode.py | 60 +++++++++++++++++++ VHbbAnalysis/Heppy/python/vhbbobj.py | 8 ++- VHbbAnalysis/Heppy/test/combined_cmssw.py | 9 +++ VHbbAnalysis/Heppy/test/vhbb-combined.py | 11 +++- VHbbAnalysis/Heppy/test/vhbb.py | 3 +- 7 files changed, 150 insertions(+), 14 deletions(-) create mode 100644 VHbbAnalysis/Heppy/python/TauGenJetAnalyzer.py create mode 100644 VHbbAnalysis/Heppy/python/genTauDecayMode.py diff --git a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py index 11200ae13d1ec..adbf834cf2551 100644 --- a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py +++ b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py @@ -20,7 +20,6 @@ def declareHandles(self): super(TauAnalyzer, self).declareHandles() self.handles['taus'] = AutoHandle( ('slimmedTaus',''),'std::vector') - def beginLoop(self, setup): super(TauAnalyzer,self).beginLoop(setup) self.counters.addCounter('events') @@ -92,6 +91,7 @@ def id6(tau,X): elif tau.tauID(self.cfg_ana.tauLooseID): event.looseTaus.append(tau) event.inclusiveTaus.append(tau) + event.looseTaus.extend(event.selectedTaus) event.selectedTaus.sort(key = lambda l : l.pt(), reverse = True) event.looseTaus.sort(key = lambda l : l.pt(), reverse = True) @@ -101,7 +101,6 @@ def id6(tau,X): if len(event.looseTaus): self.counters.counter('events').inc('has >=1 loose taus') if len(event.inclusiveTaus): self.counters.counter('events').inc('has >=1 inclusive taus') - def matchTaus(self, event): match = matchObjectCollection3(event.inclusiveTaus, event.gentaus, deltaRMax = 0.5) for lep in event.inclusiveTaus: @@ -126,17 +125,17 @@ def process(self, event): setattr(TauAnalyzer,"defaultConfig",cfg.Analyzer( class_object=TauAnalyzer, - ptMin = 20, - etaMax = 9999, + ptMin = 18., + etaMax = 2.5, dxyMax = 1000., - dzMax = 0.2, - vetoLeptons = True, + dzMax = 0.4, + vetoLeptons = False, leptonVetoDR = 0.4, decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" - tauID = "byLooseCombinedIsolationDeltaBetaCorr3Hits", + tauID = "decayModeFindingNewDMs", vetoLeptonsPOG = False, # If True, the following two IDs are required - tauAntiMuonID = "againstMuonLoose3", - tauAntiElectronID = "againstElectronLooseMVA5", - tauLooseID = "decayModeFinding", + tauAntiMuonID = "", + tauAntiElectronID = "", + tauLooseID = "decayModeFindingNewDMs", ) ) diff --git a/VHbbAnalysis/Heppy/python/TauGenJetAnalyzer.py b/VHbbAnalysis/Heppy/python/TauGenJetAnalyzer.py new file mode 100644 index 0000000000000..2bedb494419a7 --- /dev/null +++ b/VHbbAnalysis/Heppy/python/TauGenJetAnalyzer.py @@ -0,0 +1,54 @@ + +from PhysicsTools.Heppy.analyzers.core.Analyzer import Analyzer +from PhysicsTools.HeppyCore.framework.event import Event +from PhysicsTools.Heppy.analyzers.core.AutoHandle import AutoHandle +from PhysicsTools.Heppy.physicsobjects.PhysicsObjects import GenParticle + +from PhysicsTools.Heppy.physicsutils.genutils import * +import PhysicsTools.HeppyCore.framework.config as cfg + +from VHbbAnalysis.Heppy.genTauDecayMode import genTauDecayMode + +class TauGenJetAnalyzer( Analyzer ): + """Determine generator level tau decay mode.""" + + def __init__(self, cfg_ana, cfg_comp, looperName ): + super(TauGenJetAnalyzer,self).__init__(cfg_ana,cfg_comp,looperName) + + #--------------------------------------------- + # DECLARATION OF HANDLES OF GEN LEVEL OBJECTS + #--------------------------------------------- + + def declareHandles(self): + super(TauGenJetAnalyzer, self).declareHandles() + + #mc information + self.mchandles['tauGenJetsSelectorAllHadrons'] = AutoHandle( 'tauGenJetsSelectorAllHadrons', + 'vector' ) + + def beginLoop(self,setup): + super(TauGenJetAnalyzer,self).beginLoop(setup) + + def makeMCInfo(self, event): + event.tauGenJets = [] + tauGenJets = list(self.mchandles['tauGenJetsSelectorAllHadrons'].product() ) + for tauGenJet in tauGenJets: + tauGenJet.decayMode = genTauDecayMode(tauGenJet)[0] + event.tauGenJets.append(tauGenJet) + + def process(self, event): + self.readCollections(event.input) + + # if not MC, nothing to do + if not self.cfg_comp.isMC: + return True + + # do MC level analysis + self.makeMCInfo(event) + + return True + +setattr(TauGenJetAnalyzer, "defaultConfig", cfg.Analyzer( + class_object = TauGenJetAnalyzer, + verbose = False, +)) diff --git a/VHbbAnalysis/Heppy/python/genTauDecayMode.py b/VHbbAnalysis/Heppy/python/genTauDecayMode.py new file mode 100644 index 0000000000000..daaec8b9df667 --- /dev/null +++ b/VHbbAnalysis/Heppy/python/genTauDecayMode.py @@ -0,0 +1,60 @@ + +#-------------------------------------------------------------------------------- +# Auxiliary function to determine generator level tau decay mode. +# +# The function corresponds to a translation of +# PhysicsTools/JetMCUtils/src/JetMCTag.cc +# to python. +# +# author: Christian Veelken, NICPB Tallinn +#-------------------------------------------------------------------------------- + +def genTauDecayMode(tau): + + numElectrons = 0 + numMuons = 0 + numChargedHadrons = 0 + numNeutralHadrons = 0 + numPhotons = 0 + + daughters = tau.daughterPtrVector(); + for daughter in daughters: + pdg_id = abs(daughter.pdgId()) + if pdg_id == 22: + numPhotons = numPhotons + 1 + elif pdg_id == 11: + numElectrons = numElectrons + 1 + elif pdg_id == 13: + numMuons = numMuons + 1 + elif abs(daughter.charge()) > 0.5: + numChargedHadrons = numChargedHadrons + 1 + else: + numNeutralHadrons = numNeutralHadrons + 1 + + ##print ": numChargedHadrons = %i, numNeutralHadrons = %i, numPhotons = %i" % (numChargedHadrons, numNeutralHadrons, numPhotons) + + if numElectrons == 1: + return ( 0, "electron" ) + elif numMuons == 1: + return ( 1, "muon" ) + elif numChargedHadrons == 1: + if numNeutralHadrons != 0: + return ( 5, "oneProngOther" ) + elif numPhotons == 0: + return ( 2, "oneProng0Pi0" ) + elif numPhotons == 2: + return ( 3, "oneProng1Pi0" ) + elif numPhotons == 4: + return ( 4, "oneProng2Pi0" ) + else: + return ( 5, "oneProngOther" ) + elif numChargedHadrons == 3: + if numNeutralHadrons != 0: + return ( 8, "threeProngOther" ) + elif numPhotons == 0: + return ( 6, "threeProng0Pi0" ) + elif numPhotons == 2: + return ( 7, "threeProng1Pi0" ) + else: + return ( 8, "threeProngOther" ) + return ( 9, "rare" ) diff --git a/VHbbAnalysis/Heppy/python/vhbbobj.py b/VHbbAnalysis/Heppy/python/vhbbobj.py index 6230da66e803d..90a8244ebe36f 100644 --- a/VHbbAnalysis/Heppy/python/vhbbobj.py +++ b/VHbbAnalysis/Heppy/python/vhbbobj.py @@ -32,11 +32,11 @@ NTupleVariable("trkKink", lambda lepton : lepton.combinedQuality().trkKink if abs(lepton.pdgId()) == 13 else 0, help="Tracker kink-finder"), NTupleVariable("caloCompatibility", lambda lepton : lepton.caloCompatibility() if abs(lepton.pdgId()) == 13 else 0, help="Calorimetric compatibility"), NTupleVariable("globalTrackChi2", lambda lepton : lepton.globalTrack().normalizedChi2() if abs(lepton.pdgId()) == 13 and lepton.globalTrack().isNonnull() else 0, help="Global track normalized chi2"), - NTupleVariable("nChamberHits", lambda lepton: lepton.globalTrack().hitPattern().numberOfValidMuonHits() if abs(lepton.pdgId()) == 13 else -1, help="Number of muon chamber hits (-1 for electrons)"), + NTupleVariable("nChamberHits", lambda lepton: lepton.globalTrack().hitPattern().numberOfValidMuonHits() if abs(lepton.pdgId()) == 13 and lepton.globalTrack().isNonnull() else -1, help="Number of muon chamber hits (-1 for electrons)"), NTupleVariable("isPFMuon", lambda lepton: lepton.isPFMuon() if abs(lepton.pdgId()) == 13 else 0, help="1 if muon passes particle flow ID"), NTupleVariable("isGlobalMuon", lambda lepton: lepton.isGlobalMuon() if abs(lepton.pdgId()) == 13 else 0, help="1 if muon is global muon"), NTupleVariable("isTrackerMuon", lambda lepton: lepton.isTrackerMuon() if abs(lepton.pdgId()) == 13 else 0, help="1 if muon is tracker muon"), - NTupleVariable("pixelHits", lambda lepton : lepton.innerTrack().hitPattern().numberOfValidPixelHits() if abs(lepton.pdgId()) == 13 else -1, help="Number of pixel hits (-1 for electrons)"), + NTupleVariable("pixelHits", lambda lepton : lepton.innerTrack().hitPattern().numberOfValidPixelHits() if abs(lepton.pdgId()) == 13 and lepton.innerTrack().isNonnull() else -1, help="Number of pixel hits (-1 for electrons)"), # Extra tracker-related id variables NTupleVariable("trackerLayers", lambda x : (x.track() if abs(x.pdgId())==13 else x.gsfTrack()).hitPattern().trackerLayersWithMeasurement(), int, help="Tracker Layers"), NTupleVariable("pixelLayers", lambda x : (x.track() if abs(x.pdgId())==13 else x.gsfTrack()).hitPattern().pixelLayersWithMeasurement(), int, help="Pixel Layers"), @@ -176,6 +176,10 @@ NTupleVariable("sumEt", lambda x : x.sumEt() ), ]) +genTauJetType = NTupleObjectType("genTauJet", baseObjectTypes = [ genParticleType ], variables = [ + NTupleVariable("decayMode", lambda x : x.decayMode, int, mcOnly=True, help="Generator level tau decay mode"), +]) + def ptRel(p4,axis): a=ROOT.TVector3(axis.Vect().X(),axis.Vect().Y(),axis.Vect().Z()) o=ROOT.TLorentzVector(p4.Px(),p4.Py(),p4.Pz(),p4.E()) diff --git a/VHbbAnalysis/Heppy/test/combined_cmssw.py b/VHbbAnalysis/Heppy/test/combined_cmssw.py index 1502d78d7c089..ecda5ab146aa9 100644 --- a/VHbbAnalysis/Heppy/test/combined_cmssw.py +++ b/VHbbAnalysis/Heppy/test/combined_cmssw.py @@ -139,3 +139,12 @@ process.OUT.outputCommands.append("keep *_ca15PFTrimmedJetsCHS_*_EX") process.OUT.outputCommands.append("keep *_looseMultiRHTT_*_EX") +######################################## +# Generator level hadronic tau decays +######################################## + +process.load("PhysicsTools.JetMCAlgos.TauGenJets_cfi") +process.tauGenJets.GenParticles = cms.InputTag('prunedGenParticles') +process.load("PhysicsTools.JetMCAlgos.TauGenJetsDecayModeSelectorAllHadrons_cfi") + +process.OUT.outputCommands.append("keep *_tauGenJetsSelectorAllHadrons_*_EX") diff --git a/VHbbAnalysis/Heppy/test/vhbb-combined.py b/VHbbAnalysis/Heppy/test/vhbb-combined.py index 7e563bc19ce0b..d0a091968d493 100644 --- a/VHbbAnalysis/Heppy/test/vhbb-combined.py +++ b/VHbbAnalysis/Heppy/test/vhbb-combined.py @@ -28,7 +28,6 @@ 10, help="MultiR HEPTopTagger Candidates") - # Add b-Tagging Information btagana=cfg.Analyzer( @@ -37,6 +36,16 @@ ) sequence.insert(sequence.index(VHbb),btagana) +# Add Information on generator level hadronic tau decays + +from VHbbAnalysis.Heppy.TauGenJetAnalyzer import TauGenJetAnalyzer +TauGenJet = cfg.Analyzer( + verbose = False, + class_object = TauGenJetAnalyzer, +) +sequence.insert(sequence.index(VHbb),TauGenJet) + +treeProducer.collections["tauGenJets"] = NTupleCollection("GenHadTaus", genTauJetType, 15, help="Generator level hadronic tau decays") # Run Everything diff --git a/VHbbAnalysis/Heppy/test/vhbb.py b/VHbbAnalysis/Heppy/test/vhbb.py index c3702196cce7a..df87a0c619c4c 100755 --- a/VHbbAnalysis/Heppy/test/vhbb.py +++ b/VHbbAnalysis/Heppy/test/vhbb.py @@ -66,7 +66,7 @@ "ajidx3cj" : NTupleCollection("aJ3Cidx", objectInt, 2,help="additional jet indices 3 cen jets"), "cleanJetsAll" : NTupleCollection("Jet", jetTypeVHbb, 15, help="Cental+fwd jets after full selection and cleaning, sorted by b-tag"), - "selectedTaus" : NTupleCollection("TauGood", tauTypeVHbb, 3, help="Taus after the preselection"), + "selectedTaus" : NTupleCollection("TauGood", tauTypeVHbb, 25, help="Taus after the preselection"), # "softActivityJets" : NTupleCollection("softActivityJets", fourVectorType, 5, help="jets made for soft activity"), #dump of gen objects @@ -237,6 +237,7 @@ #"root://xrootd.ba.infn.it//store/mc/Spring14miniaod/ZH_HToBB_ZToLL_M-125_13TeV_powheg-herwigpp/MINIAODSIM/141029_PU40bx50_PLS170_V6AN2-v1/10000/C6D4D875-6665-E411-9E35-00266CF91A18.root" #"/home/joosep/mac-docs/tth/data/phys14/tth_hbb_phys14_08B36E8F-5E7F-E411-9D5A-002590200AE4.root" #"/home/joosep/mac-docs/tth/data/phys14/ttjets_phys14_00C90EFC-3074-E411-A845-002590DB9262.root" +##'root://eoscms//eos/cms//store/user/veelken/Phys14/miniAODs/selEvents_TTH_3l1tauh_passingRecTTHtoTauTauDecayModeFilter_original_miniAOD.root' ], #files = ["226BB247-A565-E411-91CF-00266CFF0AF4.root"], From dba54c6c26646fb0218169169965d4785b9d8984 Mon Sep 17 00:00:00 2001 From: Christian Date: Wed, 1 Apr 2015 17:08:20 +0200 Subject: [PATCH 2/4] set relaxed tau ID cuts in vhbb rather than in general heppy --- .../python/analyzers/objects/TauAnalyzer.py | 16 ++++++++-------- VHbbAnalysis/Heppy/test/vhbb-combined.py | 2 +- VHbbAnalysis/Heppy/test/vhbb.py | 18 +++++++++++++++--- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py index adbf834cf2551..3fdf500afc586 100644 --- a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py +++ b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py @@ -125,17 +125,17 @@ def process(self, event): setattr(TauAnalyzer,"defaultConfig",cfg.Analyzer( class_object=TauAnalyzer, - ptMin = 18., - etaMax = 2.5, + ptMin = 20, + etaMax = 9999, dxyMax = 1000., - dzMax = 0.4, - vetoLeptons = False, + dzMax = 0.2, + vetoLeptons = True, leptonVetoDR = 0.4, decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" - tauID = "decayModeFindingNewDMs", + tauID = "byLooseCombinedIsolationDeltaBetaCorr3Hits", vetoLeptonsPOG = False, # If True, the following two IDs are required - tauAntiMuonID = "", - tauAntiElectronID = "", - tauLooseID = "decayModeFindingNewDMs", + tauAntiMuonID = "againstMuonLoose3", + tauAntiElectronID = "againstElectronLooseMVA5", + tauLooseID = "decayModeFinding", ) ) diff --git a/VHbbAnalysis/Heppy/test/vhbb-combined.py b/VHbbAnalysis/Heppy/test/vhbb-combined.py index d0a091968d493..d81c05c23e64b 100644 --- a/VHbbAnalysis/Heppy/test/vhbb-combined.py +++ b/VHbbAnalysis/Heppy/test/vhbb-combined.py @@ -53,7 +53,7 @@ config.preprocessor=preprocessor if __name__ == '__main__': from PhysicsTools.HeppyCore.framework.looper import Looper - looper = Looper( 'Loop', config, nPrint = 1, nEvents = 200) + looper = Looper( 'Loop', config, nPrint = 1, nEvents = 1000) import time import cProfile p = cProfile.Profile(time.clock) diff --git a/VHbbAnalysis/Heppy/test/vhbb.py b/VHbbAnalysis/Heppy/test/vhbb.py index df87a0c619c4c..07f8c7dd24e0f 100755 --- a/VHbbAnalysis/Heppy/test/vhbb.py +++ b/VHbbAnalysis/Heppy/test/vhbb.py @@ -106,6 +106,18 @@ from PhysicsTools.Heppy.analyzers.objects.TauAnalyzer import TauAnalyzer TauAna = TauAnalyzer.defaultConfig +TauAna.ptMin = 18. +TauAna.etaMax = 2.5 +TauAna.dxyMax = 1000. +TauAna.dzMax = 0.4 +TauAna.vetoLeptons = False +TauAna.leptonVetoDR = 0.4 +TauAna.decayModeID = "decayModeFindingNewDMs" +TauAna.tauID = "decayModeFindingNewDMs" +TauAna.vetoLeptonsPOG = False +TauAna.tauAntiMuonID = "" +TauAna.tauAntiElectronID = "" +TauAna.tauLooseID = "decayModeFindingNewDMs" from PhysicsTools.Heppy.analyzers.objects.JetAnalyzer import JetAnalyzer JetAna = JetAnalyzer.defaultConfig @@ -226,7 +238,7 @@ #'root://xrootd.ba.infn.it//store/mc/Phys14DR/WH_HToBB_WToLNu_M-125_13TeV_powheg-herwigpp/MINIAODSIM/PU20bx25_tsg_PHYS14_25_V1-v1/00000/12328AE8-796B-E411-9D32-002590A831B4.root' #"32ABFE4A-916B-E411-B2FA-00266CFFBC60.root" #Hbb #"04860BAA-B673-E411-8B20-002481E0D50C.root" #DY 600 -"TTPU20-007B37D4-8B70-E411-BC2D-0025905A6066.root" # +##"TTPU20-007B37D4-8B70-E411-BC2D-0025905A6066.root" # #"root://xrootd.ba.infn.it//store/mc/Phys14DR/ZH_HToBB_ZToNuNu_M-125_13TeV_powheg-herwigpp/MINIAODSIM/PU20bx25_tsg_PHYS14_25_V1-v1/00000/32ABFE4A-916B-E411-B2FA-00266CFFBC60.root" ##"root://xrootd.ba.infn.it//store/mc/Phys14DR/ZH_HToBB_ZToNuNu_M-125_13TeV_powheg-herwigpp/MINIAODSIM/PU20bx25_tsg_PHYS14_25_V1-v1/00000/32ABFE4A-916B-E411-B2FA-00266CFFBC60.root" #"root://xrootd.ba.infn.it//store/mc/Spring14miniaod/ZH_HToBB_ZToLL_M-125_13TeV_powheg-herwigpp/MINIAODSIM/#141029_PU40bx50_PLS170_V6AN2-v1/10000/80161D59-6665-E411-9B4F-C4346BB25698.root", @@ -237,7 +249,7 @@ #"root://xrootd.ba.infn.it//store/mc/Spring14miniaod/ZH_HToBB_ZToLL_M-125_13TeV_powheg-herwigpp/MINIAODSIM/141029_PU40bx50_PLS170_V6AN2-v1/10000/C6D4D875-6665-E411-9E35-00266CF91A18.root" #"/home/joosep/mac-docs/tth/data/phys14/tth_hbb_phys14_08B36E8F-5E7F-E411-9D5A-002590200AE4.root" #"/home/joosep/mac-docs/tth/data/phys14/ttjets_phys14_00C90EFC-3074-E411-A845-002590DB9262.root" -##'root://eoscms//eos/cms//store/user/veelken/Phys14/miniAODs/selEvents_TTH_3l1tauh_passingRecTTHtoTauTauDecayModeFilter_original_miniAOD.root' +'root://eoscms//eos/cms//store/user/veelken/Phys14/miniAODs/selEvents_TTH_3l1tauh_passingRecTTHtoTauTauDecayModeFilter_original_miniAOD.root' ], #files = ["226BB247-A565-E411-91CF-00266CFF0AF4.root"], @@ -265,7 +277,7 @@ def filter(self, record): # and the following runs the process directly if __name__ == '__main__': from PhysicsTools.HeppyCore.framework.looper import Looper - looper = Looper( 'Loop', config, nPrint = 1, nEvents = 400) + looper = Looper( 'Loop', config, nPrint = 1, nEvents = 1000) import time import cProfile From 5a85f5cb9a144af01df3d2b0475e7de784fa1d49 Mon Sep 17 00:00:00 2001 From: Andrea Date: Wed, 8 Apr 2015 09:10:07 +0200 Subject: [PATCH 3/4] Separate VHbb stuff --- .../python/analyzers/objects/TauAnalyzer.py | 121 +++++++----------- 1 file changed, 46 insertions(+), 75 deletions(-) diff --git a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py index c4e11a9270f02..bee7a85a55ec1 100644 --- a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py +++ b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py @@ -20,6 +20,7 @@ def declareHandles(self): super(TauAnalyzer, self).declareHandles() self.handles['taus'] = AutoHandle( ('slimmedTaus',''),'std::vector') + def beginLoop(self, setup): super(TauAnalyzer,self).beginLoop(setup) self.counters.addCounter('events') @@ -27,46 +28,46 @@ def beginLoop(self, setup): count.register('all events') count.register('has >=1 tau at preselection') count.register('has >=1 selected taus') - count.register('has >=1 other taus') + count.register('has >=1 loose taus') + count.register('has >=1 inclusive taus') #------------------ # MAKE LEPTON LISTS #------------------ def makeTaus(self, event): - event.inclusiveTaus = [] event.selectedTaus = [] - event.otherTaus = [] + event.looseTaus = [] + event.inclusiveTaus = [] #get all alltaus = map( Tau, self.handles['taus'].product() ) - #make inclusive taus + foundTau = False for tau in alltaus: tau.associatedVertex = event.goodVertices[0] if len(event.goodVertices)>0 else event.vertices[0] tau.lepVeto = False tau.idDecayMode = tau.tauID("decayModeFinding") tau.idDecayModeNewDMs = tau.tauID("decayModeFindingNewDMs") - - if hasattr(self.cfg_ana, 'inclusive_decayModeID') and self.cfg_ana.inclusive_decayModeID and not tau.tauID(self.cfg_ana.inclusive_decayModeID): + if hasattr(self.cfg_ana, 'decayModeID') and self.cfg_ana.decayModeID and not tau.tauID(self.cfg_ana.decayModeID): continue - tau.inclusive_lepVeto = False - if self.cfg_ana.inclusive_vetoLeptons: + if self.cfg_ana.vetoLeptons: for lep in event.selectedLeptons: - if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.inclusive_leptonVetoDR: - tau.inclusive_lepVeto = True - if tau.inclusive_lepVeto: continue - if self.cfg_ana.inclusive_vetoLeptonsPOG: - if not tau.tauID(self.cfg_ana.inclusive_tauAntiMuonID): - tau.inclusive_lepVeto = True - if not tau.tauID(self.cfg_ana.inclusive_tauAntiElectronID): - tau.inclusive_lepVeto = True - if tau.inclusive_lepVeto: continue - - if tau.pt() < self.cfg_ana.inclusive_ptMin: continue - if abs(tau.eta()) > self.cfg_ana.inclusive_etaMax: continue - if abs(tau.dxy()) > self.cfg_ana.inclusive_dxyMax or abs(tau.dz()) > self.cfg_ana.inclusive_dzMax: continue - + if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.leptonVetoDR: + tau.lepVeto = True + if tau.lepVeto: continue + if self.cfg_ana.vetoLeptonsPOG: + if not tau.tauID(self.cfg_ana.tauAntiMuonID): + tau.lepVeto = True + if not tau.tauID(self.cfg_ana.tauAntiElectronID): + tau.lepVeto = True + if tau.lepVeto: continue + + if tau.pt() < self.cfg_ana.ptMin: continue + if abs(tau.eta()) > self.cfg_ana.etaMax: continue + if abs(tau.dxy()) > self.cfg_ana.dxyMax or abs(tau.dz()) > self.cfg_ana.dzMax: continue + + foundTau = True def id3(tau,X): """Create an integer equal to 1-2-3 for (loose,medium,tight)""" return tau.tauID(X%"Loose") + tau.tauID(X%"Medium") + tau.tauID(X%"Tight") @@ -85,38 +86,21 @@ def id6(tau,X): tau.idAntiMu = tau.tauID("againstMuonLoose") + tau.tauID("againstMuonTight") tau.idAntiE = id5(tau, "againstElectron%sMVA5") #print "Tau pt %5.1f: idMVA2 %d, idCI3hit %d, %s, %s" % (tau.pt(), tau.idMVA2, tau.idCI3hit, tau.tauID(self.cfg_ana.tauID), tau.tauID(self.cfg_ana.tauLooseID)) - - if tau.tauID(self.cfg_ana.inclusive_tauID): - event.inclusiveTaus.append(tau) - - for tau in event.inclusiveTaus: - - tau.loose_lepVeto = False - if self.cfg_ana.loose_vetoLeptons: - for lep in event.selectedLeptons: - if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.loose_leptonVetoDR: - tau.loose_lepVeto = True - if self.cfg_ana.loose_vetoLeptonsPOG: - if not tau.tauID(self.cfg_ana.loose_tauAntiMuonID): - tau.loose_lepVeto = True - if not tau.tauID(self.cfg_ana.loose_tauAntiElectronID): - tau.loose_lepVeto = True - - if tau.tauID(self.cfg_ana.loose_decayModeID) and \ - tau.pt() > self.cfg_ana.loose_ptMin and abs(tau.eta()) < self.cfg_ana.loose_etaMax and \ - abs(tau.dxy()) < self.cfg_ana.loose_dxyMax and abs(tau.dz()) < self.cfg_ana.loose_dzMax and \ - tau.tauID(self.cfg_ana.loose_tauID) and not tau.loose_lepVeto: + if tau.tauID(self.cfg_ana.tauID): event.selectedTaus.append(tau) - else: - event.otherTaus.append(tau) + event.inclusiveTaus.append(tau) + elif tau.tauID(self.cfg_ana.tauLooseID): + event.looseTaus.append(tau) + event.inclusiveTaus.append(tau) - event.inclusiveTaus.sort(key = lambda l : l.pt(), reverse = True) event.selectedTaus.sort(key = lambda l : l.pt(), reverse = True) - event.otherTaus.sort(key = lambda l : l.pt(), reverse = True) + event.looseTaus.sort(key = lambda l : l.pt(), reverse = True) self.counters.counter('events').inc('all events') - if len(event.inclusiveTaus): self.counters.counter('events').inc('has >=1 tau at preselection') + if foundTau: self.counters.counter('events').inc('has >=1 tau at preselection') if len(event.selectedTaus): self.counters.counter('events').inc('has >=1 selected taus') - if len(event.otherTaus): self.counters.counter('events').inc('has >=1 other taus') + if len(event.looseTaus): self.counters.counter('events').inc('has >=1 loose taus') + if len(event.inclusiveTaus): self.counters.counter('events').inc('has >=1 inclusive taus') + def matchTaus(self, event): match = matchObjectCollection3(event.inclusiveTaus, event.gentaus, deltaRMax = 0.5) @@ -141,31 +125,18 @@ def process(self, event): # http://cmslxr.fnal.gov/lxr/source/PhysicsTools/PatAlgos/python/producersLayer1/tauProducer_cfi.py setattr(TauAnalyzer,"defaultConfig",cfg.Analyzer( - class_object = TauAnalyzer, - # inclusive very loose hadronic tau selection - inclusive_ptMin = 18, - inclusive_etaMax = 9999, - inclusive_dxyMax = 1000., - inclusive_dzMax = 0.4, - inclusive_vetoLeptons = False, - inclusive_leptonVetoDR = 0.4, - inclusive_decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" - inclusive_tauID = "decayModeFindingNewDMs", - inclusive_vetoLeptonsPOG = False, # If True, the following two IDs are required - inclusive_tauAntiMuonID = "", - inclusive_tauAntiElectronID = "", - # loose hadronic tau selection - loose_ptMin = 18, - loose_etaMax = 9999, - loose_dxyMax = 1000., - loose_dzMax = 0.2, - loose_vetoLeptons = True, - loose_leptonVetoDR = 0.4, - loose_decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" - loose_tauID = "byLooseCombinedIsolationDeltaBetaCorr3Hits", - loose_vetoLeptonsPOG = False, # If True, the following two IDs are required - loose_tauAntiMuonID = "againstMuonLoose3", - loose_tauAntiElectronID = "againstElectronLooseMVA5", - loose_tauLooseID = "decayModeFindingNewDMs" + class_object=TauAnalyzer, + ptMin = 20, + etaMax = 9999, + dxyMax = 1000., + dzMax = 0.2, + vetoLeptons = True, + leptonVetoDR = 0.4, + decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" + tauID = "byLooseCombinedIsolationDeltaBetaCorr3Hits", + vetoLeptonsPOG = False, # If True, the following two IDs are required + tauAntiMuonID = "againstMuonLoose3", + tauAntiElectronID = "againstElectronLooseMVA5", + tauLooseID = "decayModeFinding", ) ) From b0228c36ce896f17f59e6a829db71fdb0481e4a9 Mon Sep 17 00:00:00 2001 From: Andrea Date: Wed, 8 Apr 2015 09:11:20 +0200 Subject: [PATCH 4/4] Heppy: @veelken changes for TauAnalyzer --- .../python/analyzers/objects/TauAnalyzer.py | 121 +++++++++++------- 1 file changed, 75 insertions(+), 46 deletions(-) diff --git a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py index bee7a85a55ec1..c4e11a9270f02 100644 --- a/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py +++ b/PhysicsTools/Heppy/python/analyzers/objects/TauAnalyzer.py @@ -20,7 +20,6 @@ def declareHandles(self): super(TauAnalyzer, self).declareHandles() self.handles['taus'] = AutoHandle( ('slimmedTaus',''),'std::vector') - def beginLoop(self, setup): super(TauAnalyzer,self).beginLoop(setup) self.counters.addCounter('events') @@ -28,46 +27,46 @@ def beginLoop(self, setup): count.register('all events') count.register('has >=1 tau at preselection') count.register('has >=1 selected taus') - count.register('has >=1 loose taus') - count.register('has >=1 inclusive taus') + count.register('has >=1 other taus') #------------------ # MAKE LEPTON LISTS #------------------ def makeTaus(self, event): - event.selectedTaus = [] - event.looseTaus = [] event.inclusiveTaus = [] + event.selectedTaus = [] + event.otherTaus = [] #get all alltaus = map( Tau, self.handles['taus'].product() ) - foundTau = False + #make inclusive taus for tau in alltaus: tau.associatedVertex = event.goodVertices[0] if len(event.goodVertices)>0 else event.vertices[0] tau.lepVeto = False tau.idDecayMode = tau.tauID("decayModeFinding") tau.idDecayModeNewDMs = tau.tauID("decayModeFindingNewDMs") - if hasattr(self.cfg_ana, 'decayModeID') and self.cfg_ana.decayModeID and not tau.tauID(self.cfg_ana.decayModeID): + + if hasattr(self.cfg_ana, 'inclusive_decayModeID') and self.cfg_ana.inclusive_decayModeID and not tau.tauID(self.cfg_ana.inclusive_decayModeID): continue - if self.cfg_ana.vetoLeptons: + tau.inclusive_lepVeto = False + if self.cfg_ana.inclusive_vetoLeptons: for lep in event.selectedLeptons: - if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.leptonVetoDR: - tau.lepVeto = True - if tau.lepVeto: continue - if self.cfg_ana.vetoLeptonsPOG: - if not tau.tauID(self.cfg_ana.tauAntiMuonID): - tau.lepVeto = True - if not tau.tauID(self.cfg_ana.tauAntiElectronID): - tau.lepVeto = True - if tau.lepVeto: continue - - if tau.pt() < self.cfg_ana.ptMin: continue - if abs(tau.eta()) > self.cfg_ana.etaMax: continue - if abs(tau.dxy()) > self.cfg_ana.dxyMax or abs(tau.dz()) > self.cfg_ana.dzMax: continue - - foundTau = True + if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.inclusive_leptonVetoDR: + tau.inclusive_lepVeto = True + if tau.inclusive_lepVeto: continue + if self.cfg_ana.inclusive_vetoLeptonsPOG: + if not tau.tauID(self.cfg_ana.inclusive_tauAntiMuonID): + tau.inclusive_lepVeto = True + if not tau.tauID(self.cfg_ana.inclusive_tauAntiElectronID): + tau.inclusive_lepVeto = True + if tau.inclusive_lepVeto: continue + + if tau.pt() < self.cfg_ana.inclusive_ptMin: continue + if abs(tau.eta()) > self.cfg_ana.inclusive_etaMax: continue + if abs(tau.dxy()) > self.cfg_ana.inclusive_dxyMax or abs(tau.dz()) > self.cfg_ana.inclusive_dzMax: continue + def id3(tau,X): """Create an integer equal to 1-2-3 for (loose,medium,tight)""" return tau.tauID(X%"Loose") + tau.tauID(X%"Medium") + tau.tauID(X%"Tight") @@ -86,21 +85,38 @@ def id6(tau,X): tau.idAntiMu = tau.tauID("againstMuonLoose") + tau.tauID("againstMuonTight") tau.idAntiE = id5(tau, "againstElectron%sMVA5") #print "Tau pt %5.1f: idMVA2 %d, idCI3hit %d, %s, %s" % (tau.pt(), tau.idMVA2, tau.idCI3hit, tau.tauID(self.cfg_ana.tauID), tau.tauID(self.cfg_ana.tauLooseID)) - if tau.tauID(self.cfg_ana.tauID): - event.selectedTaus.append(tau) - event.inclusiveTaus.append(tau) - elif tau.tauID(self.cfg_ana.tauLooseID): - event.looseTaus.append(tau) + + if tau.tauID(self.cfg_ana.inclusive_tauID): event.inclusiveTaus.append(tau) + + for tau in event.inclusiveTaus: + tau.loose_lepVeto = False + if self.cfg_ana.loose_vetoLeptons: + for lep in event.selectedLeptons: + if deltaR(lep.eta(), lep.phi(), tau.eta(), tau.phi()) < self.cfg_ana.loose_leptonVetoDR: + tau.loose_lepVeto = True + if self.cfg_ana.loose_vetoLeptonsPOG: + if not tau.tauID(self.cfg_ana.loose_tauAntiMuonID): + tau.loose_lepVeto = True + if not tau.tauID(self.cfg_ana.loose_tauAntiElectronID): + tau.loose_lepVeto = True + + if tau.tauID(self.cfg_ana.loose_decayModeID) and \ + tau.pt() > self.cfg_ana.loose_ptMin and abs(tau.eta()) < self.cfg_ana.loose_etaMax and \ + abs(tau.dxy()) < self.cfg_ana.loose_dxyMax and abs(tau.dz()) < self.cfg_ana.loose_dzMax and \ + tau.tauID(self.cfg_ana.loose_tauID) and not tau.loose_lepVeto: + event.selectedTaus.append(tau) + else: + event.otherTaus.append(tau) + + event.inclusiveTaus.sort(key = lambda l : l.pt(), reverse = True) event.selectedTaus.sort(key = lambda l : l.pt(), reverse = True) - event.looseTaus.sort(key = lambda l : l.pt(), reverse = True) + event.otherTaus.sort(key = lambda l : l.pt(), reverse = True) self.counters.counter('events').inc('all events') - if foundTau: self.counters.counter('events').inc('has >=1 tau at preselection') + if len(event.inclusiveTaus): self.counters.counter('events').inc('has >=1 tau at preselection') if len(event.selectedTaus): self.counters.counter('events').inc('has >=1 selected taus') - if len(event.looseTaus): self.counters.counter('events').inc('has >=1 loose taus') - if len(event.inclusiveTaus): self.counters.counter('events').inc('has >=1 inclusive taus') - + if len(event.otherTaus): self.counters.counter('events').inc('has >=1 other taus') def matchTaus(self, event): match = matchObjectCollection3(event.inclusiveTaus, event.gentaus, deltaRMax = 0.5) @@ -125,18 +141,31 @@ def process(self, event): # http://cmslxr.fnal.gov/lxr/source/PhysicsTools/PatAlgos/python/producersLayer1/tauProducer_cfi.py setattr(TauAnalyzer,"defaultConfig",cfg.Analyzer( - class_object=TauAnalyzer, - ptMin = 20, - etaMax = 9999, - dxyMax = 1000., - dzMax = 0.2, - vetoLeptons = True, - leptonVetoDR = 0.4, - decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" - tauID = "byLooseCombinedIsolationDeltaBetaCorr3Hits", - vetoLeptonsPOG = False, # If True, the following two IDs are required - tauAntiMuonID = "againstMuonLoose3", - tauAntiElectronID = "againstElectronLooseMVA5", - tauLooseID = "decayModeFinding", + class_object = TauAnalyzer, + # inclusive very loose hadronic tau selection + inclusive_ptMin = 18, + inclusive_etaMax = 9999, + inclusive_dxyMax = 1000., + inclusive_dzMax = 0.4, + inclusive_vetoLeptons = False, + inclusive_leptonVetoDR = 0.4, + inclusive_decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" + inclusive_tauID = "decayModeFindingNewDMs", + inclusive_vetoLeptonsPOG = False, # If True, the following two IDs are required + inclusive_tauAntiMuonID = "", + inclusive_tauAntiElectronID = "", + # loose hadronic tau selection + loose_ptMin = 18, + loose_etaMax = 9999, + loose_dxyMax = 1000., + loose_dzMax = 0.2, + loose_vetoLeptons = True, + loose_leptonVetoDR = 0.4, + loose_decayModeID = "decayModeFindingNewDMs", # ignored if not set or "" + loose_tauID = "byLooseCombinedIsolationDeltaBetaCorr3Hits", + loose_vetoLeptonsPOG = False, # If True, the following two IDs are required + loose_tauAntiMuonID = "againstMuonLoose3", + loose_tauAntiElectronID = "againstElectronLooseMVA5", + loose_tauLooseID = "decayModeFindingNewDMs" ) )