1 from PhysicsTools.Heppy.physicsobjects.Lepton
import Lepton
8 '''Initializing tightIdResult to None. The user is responsible
9 for setting this attribute externally if he wants to use the tightId
11 super(Electron, self).
__init__(*args, **kwargs)
24 if id
is None or id ==
"":
return True
26 if rho ==
None and hasattr(self,
'rho')
and self.
rho !=
None: rho = self.
rho
27 if id ==
"POG_MVA_ID_NonTrig":
return self.
mvaIDLoose()
28 elif id ==
"POG_MVA_ID_Trig":
return self.
mvaIDTight()
29 elif id ==
"POG_MVA_ID_NonTrig_full5x5":
return self.
mvaIDLoose(full5x5=
True)
30 elif id ==
"POG_MVA_ID_Trig_full5x5":
return self.
mvaIDTight(full5x5=
True)
31 elif id ==
"POG_MVA_ID_Run2_NonTrig_Loose":
return self.
mvaIDRun2(
"NonTrigPhys14",
"Loose")
32 elif id ==
"POG_MVA_ID_Run2_NonTrig_Tight":
return self.
mvaIDRun2(
"NonTrigPhys14",
"Tight")
33 elif id.startswith(
"POG_Cuts_ID_"):
34 return self.
cutBasedId(id.replace(
"POG_Cuts_ID_",
"POG_"))
35 for ID
in self.electronIDs():
38 raise RuntimeError,
"Electron id '%s' not yet implemented in Electron.py" % id
42 showerShapes =
"full5x5"
43 wp = wp.replace(
"_full5x5",
"")
44 elif showerShapes ==
"auto":
45 if "POG_CSA14_25ns_v1" in wp
or "POG_CSA14_50ns_v1" in wp
or "POG_PHYS14_25ns_v1" in wp:
46 showerShapes =
"full5x5"
48 'dEtaIn' :
abs(self.physObj.deltaEtaSuperClusterTrackAtVtx()),
49 'dPhiIn' :
abs(self.physObj.deltaPhiSuperClusterTrackAtVtx()),
50 'sigmaIEtaIEta' : self.physObj.full5x5_sigmaIetaIeta()
if showerShapes ==
"full5x5" else self.physObj.sigmaIetaIeta(),
51 'H/E' : self.physObj.hadronicOverEm(),
53 '1/E-1/p' :
abs(1.0/self.physObj.ecalEnergy() - self.physObj.eSuperClusterOverP()/self.physObj.ecalEnergy())
if self.physObj.ecalEnergy()>0.
else 9e9,
54 'conversionVeto' : self.physObj.passConversionVeto(),
55 'missingHits' : self.physObj.gsfTrack().hitPattern().numberOfHits(ROOT.reco.HitPattern.MISSING_INNER_HITS),
59 'POG_2012_Veto' : [(
'dEtaIn', [0.007, 0.01]), (
'dPhiIn', [0.8, 0.7 ]), (
'sigmaIEtaIEta', [0.01, 0.03]), (
'H/E', [0.15, 9e9]), (
'1/E-1/p', [9e9, 9e9])],
60 'POG_2012_Loose' : [(
'dEtaIn', [0.007, 0.009]), (
'dPhiIn', [0.15, 0.1 ]), (
'sigmaIEtaIEta', [0.01, 0.03]), (
'H/E', [0.12, 0.1]), (
'1/E-1/p', [0.05, 0.05])],
61 'POG_2012_Medium' : [(
'dEtaIn', [0.004, 0.007]), (
'dPhiIn', [0.06, 0.03]), (
'sigmaIEtaIEta', [0.01, 0.03]), (
'H/E', [0.12, 0.1]), (
'1/E-1/p', [0.05, 0.05])],
62 'POG_2012_Tight' : [(
'dEtaIn', [0.004, 0.005]), (
'dPhiIn', [0.03, 0.02]), (
'sigmaIEtaIEta', [0.01, 0.03]), (
'H/E', [0.12, 0.1]), (
'1/E-1/p', [0.05, 0.05])],
66 'POG_CSA14_25ns_v1_Veto' : [(
'dEtaIn', [0.017938, 0.014569]), (
'dPhiIn', [0.182958, 0.230914]), (
'sigmaIEtaIEta', [0.012708, 0.036384]), (
'H/E', [0.335015, 0.200792]), (
'1/E-1/p', [0.198287, 0.146856])],
67 'POG_CSA14_25ns_v1_Loose' : [(
'dEtaIn', [0.014928, 0.013045]), (
'dPhiIn', [0.141050, 0.149017]), (
'sigmaIEtaIEta', [0.011304, 0.035536]), (
'H/E', [0.127690, 0.107898]), (
'1/E-1/p', [0.097806, 0.102261])],
68 'POG_CSA14_25ns_v1_Medium' : [(
'dEtaIn', [0.013071, 0.010006]), (
'dPhiIn', [0.132113, 0.052321]), (
'sigmaIEtaIEta', [0.010726, 0.032882]), (
'H/E', [0.109761, 0.101755]), (
'1/E-1/p', [0.032639, 0.041427])],
69 'POG_CSA14_25ns_v1_Tight' : [(
'dEtaIn', [0.012671, 0.008823]), (
'dPhiIn', [0.025218, 0.027286]), (
'sigmaIEtaIEta', [0.010061, 0.030222]), (
'H/E', [0.065085, 0.090710]), (
'1/E-1/p', [0.027873, 0.019404])],
70 'POG_CSA14_50ns_v1_Veto' : [(
'dEtaIn', [0.021, 0.028]), (
'dPhiIn', [0.25 , 0.23 ]), (
'sigmaIEtaIEta', [0.012, 0.035]), (
'H/E', [0.24 , 0.19 ]), (
'1/E-1/p', [0.32 , 0.13 ])],
71 'POG_CSA14_50ns_v1_Loose' : [(
'dEtaIn', [0.016, 0.025]), (
'dPhiIn', [0.080, 0.097]), (
'sigmaIEtaIEta', [0.012, 0.032]), (
'H/E', [0.15 , 0.12 ]), (
'1/E-1/p', [0.11 , 0.11 ])],
72 'POG_CSA14_50ns_v1_Medium' : [(
'dEtaIn', [0.015, 0.023]), (
'dPhiIn', [0.051, 0.056]), (
'sigmaIEtaIEta', [0.010, 0.030]), (
'H/E', [0.10 , 0.099]), (
'1/E-1/p', [0.053, 0.11 ])],
73 'POG_CSA14_50ns_v1_Tight' : [(
'dEtaIn', [0.012, 0.019]), (
'dPhiIn', [0.024, 0.043]), (
'sigmaIEtaIEta', [0.010, 0.029]), (
'H/E', [0.074, 0.080]), (
'1/E-1/p', [0.026, 0.076])],
75 'POG_PHYS14_25ns_v1_Veto' : [(
'dEtaIn', [0.016315, 0.010671]), (
'dPhiIn', [0.252044, 0.245263]), (
'sigmaIEtaIEta', [0.011100 , 0.033987]), (
'H/E', [0.345843, 0.134691]), (
'1/E-1/p', [0.248070, 0.157160])],
76 'POG_PHYS14_25ns_v1_Loose' : [(
'dEtaIn', [0.012442, 0.010654]), (
'dPhiIn', [0.072624, 0.145129]), (
'sigmaIEtaIEta', [0.010557 , 0.032602]), (
'H/E', [0.121476, 0.131862]), (
'1/E-1/p', [0.221803, 0.142283])],
77 'POG_PHYS14_25ns_v1_Medium' : [(
'dEtaIn', [0.007641, 0.009285]), (
'dPhiIn', [0.032643, 0.042447]), (
'sigmaIEtaIEta', [0.010399 , 0.029524]), (
'H/E', [0.060662, 0.104263]), (
'1/E-1/p', [0.153897, 0.137468])],
78 'POG_PHYS14_25ns_v1_Tight' : [(
'dEtaIn', [0.006574, 0.005681]), (
'dPhiIn', [0.022868, 0.032046]), (
'sigmaIEtaIEta', [0.010181 , 0.028766]), (
'H/E', [0.037553, 0.081902]), (
'1/E-1/p', [0.131191, 0.106055])],
80 WP_conversion_veto = {
83 'POG_CSA14_25ns_v1_ConvVeto_Veto' : WP[
'POG_CSA14_25ns_v1_Veto' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [3, 4])],
84 'POG_CSA14_25ns_v1_ConvVeto_Loose' : WP[
'POG_CSA14_25ns_v1_Loose' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
85 'POG_CSA14_25ns_v1_ConvVeto_Medium' : WP[
'POG_CSA14_25ns_v1_Medium']+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
86 'POG_CSA14_25ns_v1_ConvVeto_Tight' : WP[
'POG_CSA14_25ns_v1_Tight' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
87 'POG_CSA14_50ns_v1_ConvVeto_Veto' : WP[
'POG_CSA14_50ns_v1_Veto' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [3, 4])],
88 'POG_CSA14_50ns_v1_ConvVeto_Loose' : WP[
'POG_CSA14_50ns_v1_Loose' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
89 'POG_CSA14_50ns_v1_ConvVeto_Medium' : WP[
'POG_CSA14_50ns_v1_Medium']+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
90 'POG_CSA14_50ns_v1_ConvVeto_Tight' : WP[
'POG_CSA14_50ns_v1_Tight' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
92 'POG_PHYS14_25ns_v1_ConvVeto_Veto' : WP[
'POG_PHYS14_25ns_v1_Veto' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [3, 4])],
93 'POG_PHYS14_25ns_v1_ConvVeto_Loose' : WP[
'POG_PHYS14_25ns_v1_Loose' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
94 'POG_PHYS14_25ns_v1_ConvVeto_Medium' : WP[
'POG_PHYS14_25ns_v1_Medium']+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
95 'POG_PHYS14_25ns_v1_ConvVeto_Tight' : WP[
'POG_PHYS14_25ns_v1_Tight' ]+[(
'conversionVeto', [
True,
True]), (
'missingHits', [2, 2])],
98 WP.update(WP_conversion_veto)
101 raise RuntimeError,
"Working point '%s' not yet implemented in Electron.py" % wp
102 for (cut_name,(cut_eb,cut_ee))
in WP[wp]:
103 if cut_name ==
'conversionVeto':
104 return vars[cut_name] == (cut_eb
if self.physObj.isEB()
else cut_ee)
105 elif vars[cut_name] >= (cut_eb
if self.physObj.isEB()
else cut_ee):
110 '''MIKE, missing doc.
111 Should have the same name as the function in the mother class.
112 Can call the mother class function with super.
114 return self.absIsoFromEA(rho,self.superCluster().
eta(),effectiveAreas.eGamma)
124 if self.
associatedVertex ==
None:
raise RuntimeError,
"You need to set electron.associatedVertex before calling any MVA"
125 if self.
rho ==
None:
raise RuntimeError,
"You need to set electron.rho before calling any MVA"
131 if self.
associatedVertex ==
None:
raise RuntimeError,
"You need to set electron.associatedVertex before calling any MVA"
132 if self.
rho ==
None:
raise RuntimeError,
"You need to set electron.rho before calling any MVA"
138 if self.
associatedVertex ==
None:
raise RuntimeError,
"You need to set electron.associatedVertex before calling any MVA"
139 if self.
rho ==
None:
raise RuntimeError,
"You need to set electron.rho before calling any MVA"
145 if name
not in ElectronMVAID_ByName:
raise RuntimeError,
"Unknown electron run2 mva id %s (known ones are: %s)\n" % (name, ElectronMVAID_ByName.keys())
146 if self.
associatedVertex ==
None:
raise RuntimeError,
"You need to set electron.associatedVertex before calling any MVA"
147 if self.
rho ==
None:
raise RuntimeError,
"You need to set electron.rho before calling any MVA"
152 eta =
abs(self.superCluster().
eta())
154 if (eta < 0.8) :
return self.
mvaTrigV0(full5x5) > +0.00;
155 elif (eta < 1.479):
return self.
mvaTrigV0(full5x5) > +0.10;
156 else :
return self.
mvaTrigV0(full5x5) > +0.62;
158 if (eta < 0.8) :
return self.
mvaTrigV0(full5x5) > +0.94;
159 elif (eta < 1.479):
return self.
mvaTrigV0(full5x5) > +0.85;
160 else :
return self.
mvaTrigV0(full5x5) > +0.92;
163 eta =
abs(self.superCluster().
eta())
165 if (eta < 0.8) :
return self.
mvaNonTrigV0(full5x5) > +0.47;
166 elif (eta < 1.479):
return self.
mvaNonTrigV0(full5x5) > +0.004;
169 if (eta < 0.8) :
return self.
mvaNonTrigV0(full5x5) > -0.34;
170 elif (eta < 1.479):
return self.
mvaNonTrigV0(full5x5) > -0.65;
174 eta =
abs(self.superCluster().
eta())
175 if name ==
"NonTrigPhys14":
177 if (eta < 0.8) :
return self.
mvaRun2(name) > +0.35;
178 elif (eta < 1.479):
return self.
mvaRun2(name) > +0.20;
179 else :
return self.
mvaRun2(name) > -0.52;
181 if (eta < 0.8) :
return self.
mvaRun2(name) > 0.73;
182 elif (eta < 1.479):
return self.
mvaRun2(name) > 0.57;
183 else :
return self.
mvaRun2(name) > 0.05;
184 else:
raise RuntimeError,
"Ele MVA ID Working point not found"
185 else:
raise RuntimeError,
"Ele MVA ID type not found"
189 return self.
mvaIDLoose()
and (self.gsfTrack().trackerExpectedHitsInner().numberOfLostHits()<=1)
192 if R == 0.3:
return self.physObj.pfIsolationVariables().sumChargedHadronPt
193 elif R == 0.4:
return self.physObj.chargedHadronIso()
194 raise RuntimeError,
"Electron chargedHadronIso missing for R=%s" % R
197 if R == 0.3:
return self.physObj.pfIsolationVariables().sumNeutralHadronEt
198 elif R == 0.4:
return self.physObj.neutralHadronIso()
199 raise RuntimeError,
"Electron neutralHadronIso missing for R=%s" % R
202 if R == 0.3:
return self.physObj.pfIsolationVariables().sumPhotonEt
203 elif R == 0.4:
return self.physObj.photonIso()
204 raise RuntimeError,
"Electron photonIso missing for R=%s" % R
207 if R == 0.3:
return self.physObj.pfIsolationVariables().sumChargedParticlePt
208 raise RuntimeError,
"Electron chargedAllIso missing for R=%s" % R
211 raise RuntimeError,
"Electron chargedAllIso missing"
214 if R == 0.3:
return self.physObj.pfIsolationVariables().sumPUPt
215 elif R == 0.4:
return self.physObj.puChargedHadronIso()
216 raise RuntimeError,
"Electron chargedHadronIso missing for R=%s" % R
218 def dxy(self, vertex=None):
220 Computed using vertex (or self.associatedVertex if vertex not specified),
225 return self.gsfTrack().
dxy( vertex.position() )
228 '''returns the uncertainty on dxy (from gsf track)'''
229 return self.gsfTrack().dxyError()
232 return ROOT.reco.Candidate.p4(self.physObj)
237 def dz(self, vertex=None):
239 Computed using vertex (or self.associatedVertex if vertex not specified),
244 return self.gsfTrack().
dz( vertex.position() )
247 '''returns the uncertainty on dxz (from gsf track)'''
248 return self.gsfTrack().dzError()
252 if hasattr(self.gsfTrack(),
"trackerExpectedHitsInner") :
253 return self.gsfTrack().trackerExpectedHitsInner().numberOfLostHits()
255 return self.gsfTrack().hitPattern().numberOfHits(ROOT.reco.HitPattern.MISSING_INNER_HITS)
tuple ElectronMVAID_NonTrig
tuple ElectronMVAID_TrigNoIP
Abs< T >::type abs(const T &t)