CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
autophobj.py
Go to the documentation of this file.
1 #!/bin/env python
2 from math import *
3 import ROOT
4 #from CMGTools.TTHAnalysis.signedSip import *
7 
8 objectFloat = NTupleObjectType("builtInType", variables = [
9  NTupleVariable("", lambda x : x),
10 ])
11 objectInt = NTupleObjectType("builtInType", variables = [
12  NTupleVariable("", lambda x : x,int),
13 ])
14 
15 twoVectorType = NTupleObjectType("twoVector", variables = [
16  NTupleVariable("pt", lambda x : x.pt()),
17  NTupleVariable("phi", lambda x : x.phi()),
18 ])
19 
20 fourVectorType = NTupleObjectType("fourVector", variables = [
21  NTupleVariable("pt", lambda x : x.pt()),
22  NTupleVariable("eta", lambda x : x.eta()),
23  NTupleVariable("phi", lambda x : x.phi()),
24  NTupleVariable("mass", lambda x : x.mass()),
25  NTupleVariable("p4", lambda x : x, "TLorentzVector", default=ROOT.reco.Particle.LorentzVector(0.,0.,0.,0.), filler = lambda vector, obj: vector.SetPtEtaPhiM(obj.pt(), obj.eta(), obj.phi(), obj.mass())),
26  # ^^^^------- Note: p4 normally is not saved unless 'saveTLorentzVectors' is enabled in the tree producer
27 ])
28 particleType = NTupleObjectType("particle", baseObjectTypes = [ fourVectorType ], variables = [
29  NTupleVariable("pdgId", lambda x : x.pdgId(), int),
30 ])
31 
32 ##------------------------------------------
33 ## LEPTON
34 ##------------------------------------------
35 
36 ### BASIC VERSION WITH ONLY MAIN LEPTON ID CRITERIA
37 leptonType = NTupleObjectType("lepton", baseObjectTypes = [ particleType ], variables = [
38  NTupleVariable("charge", lambda x : x.charge(), int),
39  # Identification
40  NTupleVariable("tightId", lambda x : x.tightId(), int, help="POG Tight ID (for electrons it's configured in the analyzer)"),
41  NTupleVariable("eleCutIdCSA14_25ns_v1", lambda x : (1*x.electronID("POG_Cuts_ID_CSA14_25ns_v1_Veto") + 1*x.electronID("POG_Cuts_ID_CSA14_25ns_v1_Loose") + 1*x.electronID("POG_Cuts_ID_CSA14_25ns_v1_Medium") + 1*x.electronID("POG_Cuts_ID_CSA14_25ns_v1_Tight")) if abs(x.pdgId()) == 11 else -1, int, help="Electron cut-based id (POG CSA14_25ns_v1): 0=none, 1=veto, 2=loose, 3=medium, 4=tight"),
42  NTupleVariable("eleCutIdCSA14_50ns_v1", lambda x : (1*x.electronID("POG_Cuts_ID_CSA14_50ns_v1_Veto") + 1*x.electronID("POG_Cuts_ID_CSA14_50ns_v1_Loose") + 1*x.electronID("POG_Cuts_ID_CSA14_50ns_v1_Medium") + 1*x.electronID("POG_Cuts_ID_CSA14_50ns_v1_Tight")) if abs(x.pdgId()) == 11 else -1, int, help="Electron cut-based id (POG CSA14_50ns_v1): 0=none, 1=veto, 2=loose, 3=medium, 4=tight"),
43  # Impact parameter
44  NTupleVariable("dxy", lambda x : x.dxy(), help="d_{xy} with respect to PV, in cm (with sign)"),
45  NTupleVariable("dz", lambda x : x.dz() , help="d_{z} with respect to PV, in cm (with sign)"),
46  NTupleVariable("edxy", lambda x : x.edB(), help="#sigma(d_{xy}) with respect to PV, in cm"),
47  NTupleVariable("edz", lambda x : x.gsfTrack().dzError() if abs(x.pdgId())==11 else x.innerTrack().dzError() , help="#sigma(d_{z}) with respect to PV, in cm"),
48  NTupleVariable("ip3d", lambda x : x.ip3D() , help="d_{3d} with respect to PV, in cm (absolute value)"),
49  NTupleVariable("sip3d", lambda x : x.sip3D(), help="S_{ip3d} with respect to PV (significance)"),
50  # Conversion rejection
51  NTupleVariable("convVeto", lambda x : x.passConversionVeto() if abs(x.pdgId())==11 else 1, int, help="Conversion veto (always true for muons)"),
52  NTupleVariable("lostHits", lambda x : (x.gsfTrack() if abs(x.pdgId())==11 else x.innerTrack()).hitPattern().numberOfLostHits(ROOT.reco.HitPattern.MISSING_INNER_HITS), int, help="Number of lost hits on inner track"),
53  # Isolations with the two radia
54  NTupleVariable("relIso03", lambda x : x.relIso03, help="PF Rel Iso, R=0.3, pile-up corrected"),
55  NTupleVariable("relIso04", lambda x : x.relIso04, help="PF Rel Iso, R=0.4, pile-up corrected"),
56  # Charge flip rejection criteria
57  NTupleVariable("tightCharge", lambda lepton : ( lepton.isGsfCtfScPixChargeConsistent() + lepton.isGsfScPixChargeConsistent() ) if abs(lepton.pdgId()) == 11 else 2*(lepton.innerTrack().ptError()/lepton.innerTrack().pt() < 0.2), int, help="Tight charge criteria: for electrons, 2 if isGsfCtfScPixChargeConsistent, 1 if only isGsfScPixChargeConsistent, 0 otherwise; for muons, 2 if ptError/pt < 0.20, 0 otherwise "),
58  # MC-match info
59  NTupleVariable("mcMatchId", lambda x : x.mcMatchId, int, mcOnly=True, help="Match to source from hard scatter (pdgId of heaviest particle in chain, 25 for H, 6 for t, 23/24 for W/Z), zero if non-prompt or fake"),
60  NTupleVariable("mcMatchAny", lambda x : x.mcMatchAny, int, mcOnly=True, help="Match to any final state leptons: 0 if unmatched, 1 if light flavour (including prompt), 4 if charm, 5 if bottom"),
61  NTupleVariable("mcMatchTau", lambda x : x.mcMatchTau, int, mcOnly=True, help="True if the leptons comes from a tau"),
62 ])
63 
64 ### EXTENDED VERSION WITH INDIVIUAL DISCRIMINATING VARIABLES
65 leptonTypeExtra = NTupleObjectType("leptonExtra", baseObjectTypes = [ leptonType ], variables = [
66  # Extra isolation variables
67  NTupleVariable("chargedHadRelIso03", lambda x : x.chargedHadronIsoR(0.3)/x.pt(), help="PF Rel Iso, R=0.3, charged hadrons only"),
68  NTupleVariable("chargedHadRelIso04", lambda x : x.chargedHadronIsoR(0.4)/x.pt(), help="PF Rel Iso, R=0.4, charged hadrons only"),
69  # Extra muon ID working points
70  NTupleVariable("softMuonId", lambda x : x.muonID("POG_ID_Soft") if abs(x.pdgId())==13 else 1, int, help="Muon POG Soft id"),
71  NTupleVariable("pfMuonId", lambda x : x.muonID("POG_ID_Loose") if abs(x.pdgId())==13 else 1, int, help="Muon POG Loose id"),
72  NTupleVariable("mediumMuonId", lambda x : x.muonID("POG_ID_Medium") if abs(x.pdgId())==13 else 1, int, help="Muon POG Medium id"),
73  # Extra electron ID working points
74  NTupleVariable("eleCutId2012_full5x5", lambda x : (1*x.electronID("POG_Cuts_ID_2012_full5x5_Veto") + 1*x.electronID("POG_Cuts_ID_2012_full5x5_Loose") + 1*x.electronID("POG_Cuts_ID_2012_full5x5_Medium") + 1*x.electronID("POG_Cuts_ID_2012_full5x5_Tight")) if abs(x.pdgId()) == 11 else -1, int, help="Electron cut-based id (POG 2012, full5x5 shapes): 0=none, 1=veto, 2=loose, 3=medium, 4=tight"),
75  # Extra tracker-related variables
76  NTupleVariable("trackerLayers", lambda x : (x.track() if abs(x.pdgId())==13 else x.gsfTrack()).hitPattern().trackerLayersWithMeasurement(), int, help="Tracker Layers"),
77  NTupleVariable("pixelLayers", lambda x : (x.track() if abs(x.pdgId())==13 else x.gsfTrack()).hitPattern().pixelLayersWithMeasurement(), int, help="Pixel Layers"),
78  NTupleVariable("trackerHits", lambda x : (x.track() if abs(x.pdgId())==13 else x.gsfTrack()).hitPattern().numberOfValidTrackerHits(), int, help="Tracker hits"),
79  NTupleVariable("lostOuterHits", lambda x : (x.gsfTrack() if abs(x.pdgId())==11 else x.innerTrack()).hitPattern().numberOfLostHits(ROOT.reco.HitPattern.MISSING_OUTER_HITS), int, help="Number of lost hits on inner track"),
80  NTupleVariable("innerTrackValidHitFraction", lambda x : (x.gsfTrack() if abs(x.pdgId())==11 else x.innerTrack()).validFraction(), help="fraction of valid hits on inner track"),
81  NTupleVariable("innerTrackChi2", lambda x : (x.gsfTrack() if abs(x.pdgId())==11 else x.innerTrack()).normalizedChi2(), help="Inner track normalized chi2"),
82  # Extra muon ID variables
83  NTupleVariable("nStations", lambda lepton : lepton.numberOfMatchedStations() if abs(lepton.pdgId()) == 13 else 4, help="Number of matched muons stations (4 for electrons)"),
84  NTupleVariable("caloCompatibility", lambda lepton : lepton.caloCompatibility() if abs(lepton.pdgId()) == 13 else 0, help="Calorimetric compatibility"),
85  NTupleVariable("globalTrackChi2", lambda lepton : lepton.globalTrack().normalizedChi2() if abs(lepton.pdgId()) == 13 and lepton.globalTrack().isNonnull() else 0, help="Global track normalized chi2"),
86  NTupleVariable("trkKink", lambda lepton : lepton.combinedQuality().trkKink if abs(lepton.pdgId()) == 13 else 0, help="Tracker kink-finder"),
87  NTupleVariable("segmentCompatibility", lambda lepton : lepton.segmentCompatibility() if abs(lepton.pdgId()) == 13 else 0, help="Segment-based compatibility"),
88  NTupleVariable("chi2LocalPosition", lambda lepton : lepton.combinedQuality().chi2LocalPosition if abs(lepton.pdgId()) == 13 else 0, help="Tracker-Muon matching in position"),
89  NTupleVariable("chi2LocalMomentum", lambda lepton : lepton.combinedQuality().chi2LocalMomentum if abs(lepton.pdgId()) == 13 else 0, help="Tracker-Muon matching in momentum"),
90  NTupleVariable("glbTrackProbability", lambda lepton : lepton.combinedQuality().glbTrackProbability if abs(lepton.pdgId()) == 13 else 0, help="Global track pseudo-probability"),
91  # Extra electron ID variables
92  NTupleVariable("sigmaIEtaIEta", lambda x : x.full5x5_sigmaIetaIeta() if abs(x.pdgId())==11 else 0, help="Electron sigma(ieta ieta), with full5x5 cluster shapes"),
93  NTupleVariable("dEtaScTrkIn", lambda x : x.deltaEtaSuperClusterTrackAtVtx() if abs(x.pdgId())==11 else 0, help="Electron deltaEtaSuperClusterTrackAtVtx (without absolute value!)"),
94  NTupleVariable("dPhiScTrkIn", lambda x : x.deltaPhiSuperClusterTrackAtVtx() if abs(x.pdgId())==11 else 0, help="Electron deltaPhiSuperClusterTrackAtVtx (without absolute value!)"),
95  NTupleVariable("hadronicOverEm", lambda x : x.hadronicOverEm() if abs(x.pdgId())==11 else 0, help="Electron hadronicOverEm"),
96  NTupleVariable("eInvMinusPInv", lambda x : ((1.0/x.ecalEnergy() - x.eSuperClusterOverP()/x.ecalEnergy()) if x.ecalEnergy()>0. else 9e9) if abs(x.pdgId())==11 else 0, help="Electron 1/E - 1/p (without absolute value!)"),
97 ])
98 
99 
100 ##------------------------------------------
101 ## TAU
102 ##------------------------------------------
103 
104 tauType = NTupleObjectType("tau", baseObjectTypes = [ particleType ], variables = [
105  NTupleVariable("charge", lambda x : x.charge(), int),
106  NTupleVariable("dxy", lambda x : x.dxy(), help="d_{xy} of lead track with respect to PV, in cm (with sign)"),
107  NTupleVariable("dz", lambda x : x.dz() , help="d_{z} of lead track with respect to PV, in cm (with sign)"),
108  #NTupleVariable("idMVA2", lambda x : x.idMVA2, int, help="1,2,3 if the tau passes the loose, medium, tight WP of the By<X>IsolationMVA2 discriminator"),
109  NTupleVariable("idCI3hit", lambda x : x.idCI3hit, int, help="1,2,3 if the tau passes the loose, medium, tight WP of the By<X>CombinedIsolationDBSumPtCorr3Hits discriminator"),
110  NTupleVariable("isoCI3hit", lambda x : x.tauID("byCombinedIsolationDeltaBetaCorrRaw3Hits"), help="byCombinedIsolationDeltaBetaCorrRaw3Hits raw output discriminator"),
111  #NTupleVariable("isoMVA2", lambda x : x.tauID("byIsolationMVA2raw"), help="ByIsolationMVA2 raw output discriminator"),
112  # MC-match info
113  NTupleVariable("mcMatchId", lambda x : x.mcMatchId, int, mcOnly=True, help="Match to source from hard scatter (pdgId of heaviest particle in chain, 25 for H, 6 for t, 23/24 for W/Z), zero if non-prompt or fake"),
114 ])
115 
116 ##------------------------------------------
117 ## ISOTRACK
118 ##------------------------------------------
119 
120 isoTrackType = NTupleObjectType("isoTrack", baseObjectTypes = [ particleType ], variables = [
121  NTupleVariable("charge", lambda x : x.charge(), int),
122  NTupleVariable("dz", lambda x : x.dz() , help="d_{z} of lead track with respect to PV, in cm (with sign)"),
123  NTupleVariable("absIso", lambda x : x.absIso, float, mcOnly=False, help="abs charged iso with condition for isolation such that Min(0.2*pt, 8 GeV)"),
124  NTupleVariable("mcMatchId", lambda x : x.mcMatchId, int, mcOnly=True, help="Match to source from hard scatter (pdgId of heaviest particle in chain, 25 for H, 6 for t, 23/24 for W/Z), zero if non-prompt or fake"),
125 ])
126 
127 
128 ##------------------------------------------
129 ## PHOTON
130 ##------------------------------------------
131 
132 photonType = NTupleObjectType("gamma", baseObjectTypes = [ particleType ], variables = [
133  NTupleVariable("idCutBased", lambda x : x.idCutBased, int, help="1,2,3 if the gamma passes the loose, medium, tight WP of PhotonCutBasedID"),
134  NTupleVariable("hOverE", lambda x : x.hOVERe(), float, help="hoverE for photons"),
135  NTupleVariable("r9", lambda x : x.r9(), float, help="r9 for photons"),
136  NTupleVariable("sigmaIetaIeta", lambda x : x.sigmaIetaIeta(), float, help="sigmaIetaIeta for photons"),
137  NTupleVariable("chHadIso", lambda x : x.chargedHadronIso(), float, help="chargedHadronIsolation for photons"),
138  NTupleVariable("neuHadIso", lambda x : x.neutralHadronIso(), float, help="neutralHadronIsolation for photons"),
139  NTupleVariable("phIso", lambda x : x.photonIso(), float, help="gammaIsolation for photons"),
140  NTupleVariable("mcMatchId", lambda x : x.mcMatchId, int, mcOnly=True, help="Match to source from hard scatter (pdgId of heaviest particle in chain, 25 for H, 6 for t, 23/24 for W/Z), zero if non-prompt or fake"),
141 ])
142 
143 ##------------------------------------------
144 ## JET
145 ##------------------------------------------
146 
147 jetType = NTupleObjectType("jet", baseObjectTypes = [ fourVectorType ], variables = [
148  NTupleVariable("id", lambda x : x.jetID("POG_PFID") , int, mcOnly=False,help="POG Loose jet ID"),
149  NTupleVariable("puId", lambda x : getattr(x, 'puJetIdPassed', -99), int, mcOnly=False, help="puId (full MVA, loose WP, 5.3.X training on AK5PFchs: the only thing that is available now)"),
150  NTupleVariable("btagCSV", lambda x : x.btag('combinedInclusiveSecondaryVertexV2BJetTags'), help="CSV-IVF v2 discriminator"),
151  NTupleVariable("btagCMVA", lambda x : x.btag('combinedMVABJetTags'), help="CMVA discriminator"),
152  NTupleVariable("rawPt", lambda x : x.pt() * x.rawFactor(), help="p_{T} before JEC"),
153  NTupleVariable("mcPt", lambda x : x.mcJet.pt() if getattr(x,"mcJet",None) else 0., mcOnly=True, help="p_{T} of associated gen jet"),
154  NTupleVariable("mcFlavour", lambda x : x.partonFlavour(), int, mcOnly=True, help="parton flavour (physics definition, i.e. including b's from shower)"),
155  NTupleVariable("mcMatchId", lambda x : getattr(x, 'mcMatchId', -99), int, mcOnly=True, help="Match to source from hard scatter (pdgId of heaviest particle in chain, 25 for H, 6 for t, 23/24 for W/Z), zero if non-prompt or fake"),
156 ])
157 jetTypeExtra = NTupleObjectType("jetExtra", baseObjectTypes = [ jetType ], variables = [
158  NTupleVariable("area", lambda x : x.jetArea(), help="Catchment area of jet"),
159  # QG variables:
160  NTupleVariable("qgl", lambda x : getattr(x,'qgl', 0) , float, mcOnly=False,help="QG Likelihood"),
161  NTupleVariable("ptd", lambda x : getattr(x,'ptd', 0), float, mcOnly=False,help="QG input variable: ptD"),
162  NTupleVariable("axis2", lambda x : getattr(x,'axis2', 0) , float, mcOnly=False,help="QG input variable: axis2"),
163  NTupleVariable("mult", lambda x : getattr(x,'mult', 0) , int, mcOnly=False,help="QG input variable: total multiplicity"),
164  NTupleVariable("partonId", lambda x : getattr(x,'partonId', 0), int, mcOnly=True, help="parton flavour (manually matching to status 23 particles)"),
165  NTupleVariable("partonMotherId", lambda x : getattr(x,'partonMotherId', 0), int, mcOnly=True, help="parton flavour (manually matching to status 23 particles)"),
166  NTupleVariable("nLeptons", lambda x : len(x.leptons) if hasattr(x,'leptons') else 0 , float, mcOnly=False,help="Number of associated leptons"),
167 ])
168 
169 
170 ##------------------------------------------
171 ## MET
172 ##------------------------------------------
173 
174 metType = NTupleObjectType("met", baseObjectTypes = [ fourVectorType ], variables = [
175  NTupleVariable("sumEt", lambda x : x.sumEt() ),
176  NTupleVariable("genPt", lambda x : x.genMET().pt() , mcOnly=True ),
177  NTupleVariable("genPhi", lambda x : x.genMET().phi(), mcOnly=True ),
178  NTupleVariable("genEta", lambda x : x.genMET().eta(), mcOnly=True ),
179 ])
180 
181 ##------------------------------------------
182 ## GENPARTICLE
183 ##------------------------------------------
184 
185 genParticleType = NTupleObjectType("genParticle", baseObjectTypes = [ particleType ], mcOnly=True, variables = [
186  NTupleVariable("charge", lambda x : x.threeCharge()/3.0, float),
187  NTupleVariable("status", lambda x : x.status(),int),
188 ])
189 genParticleWithMotherId = NTupleObjectType("genParticleWithMotherId", baseObjectTypes = [ genParticleType ], mcOnly=True, variables = [
190  NTupleVariable("motherId", lambda x : x.mother(0).pdgId() if x.mother(0) else 0, int, help="pdgId of the mother of the particle"),
191  NTupleVariable("grandmotherId", lambda x : x.mother(0).mother(0).pdgId() if x.mother(0) and x.mother(0).mother(0) else 0, int, help="pdgId of the grandmother of the particle")
192 ])
193 genParticleWithAncestryType = NTupleObjectType("genParticleWithAncestry", baseObjectTypes = [ genParticleType ], mcOnly=True, variables = [
194  NTupleVariable("motherId", lambda x : x.motherId, int, help="pdgId of the mother of the particle"),
195  NTupleVariable("grandmotherId", lambda x : x.grandmotherId, int, help="pdgId of the grandmother of the particle"),
196  NTupleVariable("sourceId", lambda x : x.sourceId, int, help="origin of the particle (heaviest ancestor): 6=t, 25=h, 23/24=W/Z"),
197 ])
198 genParticleWithLinksType = NTupleObjectType("genParticleWithLinks", baseObjectTypes = [ genParticleWithAncestryType ], mcOnly=True, variables = [
199  NTupleVariable("motherIndex", lambda x : x.motherIndex, int, help="index of the mother in the generatorSummary")
200 ])
201 
T eta() const
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
Definition: DDAxes.h:10