1 from PhysicsTools.Heppy.analyzers.core.Analyzer
import Analyzer
2 from PhysicsTools.Heppy.analyzers.core.AutoHandle
import AutoHandle
3 from PhysicsTools.Heppy.physicsobjects.Electron
import Electron
4 from PhysicsTools.Heppy.physicsobjects.Muon
import Muon
8 from PhysicsTools.Heppy.physicsutils.RochesterCorrections
import rochcor
9 from PhysicsTools.Heppy.physicsutils.MuScleFitCorrector
import MuScleFitCorr
10 from PhysicsTools.Heppy.physicsutils.ElectronCalibrator
import EmbeddedElectronCalibrator
17 from ROOT
import heppy
23 def __init__(self, cfg_ana, cfg_comp, looperName ):
24 super(LeptonAnalyzer,self).
__init__(cfg_ana,cfg_comp,looperName)
25 if self.cfg_ana.doMuScleFitCorrections
and self.cfg_ana.doMuScleFitCorrections !=
"none":
26 if self.cfg_ana.doMuScleFitCorrections
not in [
"none",
"prompt",
"prompt-sync",
"rereco",
"rereco-sync" ]:
27 raise RuntimeError,
'doMuScleFitCorrections must be one of "none", "prompt", "prompt-sync", "rereco", "rereco-sync"'
28 rereco = (
"prompt" not in self.cfg_ana.doMuScleFitCorrections)
29 sync = (
"sync" in self.cfg_ana.doMuScleFitCorrections)
30 self.
muscleCorr = MuScleFitCorr(cfg_comp.isMC, rereco, sync)
31 if hasattr(self.cfg_ana,
"doRochesterCorrections")
and self.cfg_ana.doRochesterCorrections:
32 raise RuntimeError,
"You can't run both Rochester and MuScleFit corrections!"
34 self.cfg_ana.doMuScleFitCorrections =
False
36 self.electronEnergyCalibrator = EmbeddedElectronCalibrator()
40 if hasattr(cfg_ana,
'loose_electron_isoCut'):
41 self.eleIsoCut = cfg_ana.loose_electron_isoCut
43 self.eleIsoCut =
lambda ele : (
44 ele.relIso03 <= self.cfg_ana.loose_electron_relIso
and
45 ele.absIso03 < getattr(self.cfg_ana,
'loose_electron_absIso',9e99))
46 if hasattr(cfg_ana,
'loose_muon_isoCut'):
47 self.muIsoCut = cfg_ana.loose_muon_isoCut
49 self.muIsoCut =
lambda mu : (
50 mu.relIso03 <= self.cfg_ana.loose_muon_relIso
and
51 mu.absIso03 < getattr(self.cfg_ana,
'loose_muon_absIso',9e99))
55 self.
eleEffectiveArea = getattr(cfg_ana,
'ele_effectiveAreas',
"Phys14_25ns_v1")
56 self.
muEffectiveArea = getattr(cfg_ana,
'mu_effectiveAreas',
"Phys14_25ns_v1")
58 self.doMiniIsolation = getattr(cfg_ana,
'doMiniIsolation',
False)
59 if self.doMiniIsolation:
63 raise RuntimeError,
"miniIsolationVetoLeptons should be None, or 'any' (all reco leptons), or 'inclusive' (all inclusive leptons)"
77 self.handles[
'muons'] = AutoHandle(self.cfg_ana.muons,
"std::vector<pat::Muon>")
78 self.handles[
'electrons'] = AutoHandle(self.cfg_ana.electrons,
"std::vector<pat::Electron>")
81 self.handles[
'rhoMu'] = AutoHandle( self.cfg_ana.rhoMuon,
'double')
83 self.handles[
'rhoEle'] = AutoHandle( self.cfg_ana.rhoElectron,
'double')
85 if self.doMiniIsolation:
86 self.handles[
'packedCandidates'] = AutoHandle( self.cfg_ana.packedCandidates,
'std::vector<pat::PackedCandidate>')
88 super(LeptonAnalyzer,self).
beginLoop(setup)
89 self.counters.addCounter(
'events')
90 count = self.counters.counter(
'events')
91 count.register(
'all events')
100 event.inclusiveLeptons = []
103 event.selectedLeptons = []
104 event.selectedMuons = []
105 event.selectedElectrons = []
106 event.otherLeptons = []
108 if self.doMiniIsolation:
109 self.IsolationComputer.setPackedCandidates(self.handles[
'packedCandidates'].product())
111 for lep
in self.handles[
'muons'].product():
112 self.IsolationComputer.addVeto(lep)
113 for lep
in self.handles[
'electrons'].product():
114 self.IsolationComputer.addVeto(lep)
124 inclusiveElectrons = []
126 if (mu.track().isNonnull()
and mu.muonID(self.cfg_ana.inclusive_muon_id)
and
127 mu.pt()>self.cfg_ana.inclusive_muon_pt
and abs(mu.eta())<self.cfg_ana.inclusive_muon_eta
and
128 abs(mu.dxy())<self.cfg_ana.inclusive_muon_dxy
and abs(mu.dz())<self.cfg_ana.inclusive_muon_dz):
129 inclusiveMuons.append(mu)
130 for ele
in allelectrons:
131 if ( ele.electronID(self.cfg_ana.inclusive_electron_id)
and
132 ele.pt()>self.cfg_ana.inclusive_electron_pt
and abs(ele.eta())<self.cfg_ana.inclusive_electron_eta
and
133 abs(ele.dxy())<self.cfg_ana.inclusive_electron_dxy
and abs(ele.dz())<self.cfg_ana.inclusive_electron_dz
and
134 ele.lostInner()<=self.cfg_ana.inclusive_electron_lostHits ):
135 inclusiveElectrons.append(ele)
136 event.inclusiveLeptons = inclusiveMuons + inclusiveElectrons
138 if self.doMiniIsolation:
140 for lep
in event.inclusiveLeptons:
141 self.IsolationComputer.addVeto(lep)
142 for lep
in event.inclusiveLeptons:
146 for mu
in inclusiveMuons:
147 if (mu.muonID(self.cfg_ana.loose_muon_id)
and
148 mu.pt() > self.cfg_ana.loose_muon_pt
and abs(mu.eta()) < self.cfg_ana.loose_muon_eta
and
149 abs(mu.dxy()) < self.cfg_ana.loose_muon_dxy
and abs(mu.dz()) < self.cfg_ana.loose_muon_dz
and
151 mu.looseIdSusy =
True
152 event.selectedLeptons.append(mu)
153 event.selectedMuons.append(mu)
155 mu.looseIdSusy =
False
156 event.otherLeptons.append(mu)
157 looseMuons = event.selectedLeptons[:]
158 for ele
in inclusiveElectrons:
159 if (ele.electronID(self.cfg_ana.loose_electron_id)
and
160 ele.pt()>self.cfg_ana.loose_electron_pt
and abs(ele.eta())<self.cfg_ana.loose_electron_eta
and
161 abs(ele.dxy()) < self.cfg_ana.loose_electron_dxy
and abs(ele.dz())<self.cfg_ana.loose_electron_dz
and
162 self.eleIsoCut(ele)
and
163 ele.lostInner() <= self.cfg_ana.loose_electron_lostHits
and
164 (
True if getattr(self.cfg_ana,
'notCleaningElectrons',
False)
else (
bestMatch(ele, looseMuons)[1] > (self.cfg_ana.min_dr_electron_muon**2)) )):
165 event.selectedLeptons.append(ele)
166 event.selectedElectrons.append(ele)
167 ele.looseIdSusy =
True
169 event.otherLeptons.append(ele)
170 ele.looseIdSusy =
False
172 event.otherLeptons.sort(key =
lambda l : l.pt(), reverse =
True)
173 event.selectedLeptons.sort(key =
lambda l : l.pt(), reverse =
True)
174 event.selectedMuons.sort(key =
lambda l : l.pt(), reverse =
True)
175 event.selectedElectrons.sort(key =
lambda l : l.pt(), reverse =
True)
176 event.inclusiveLeptons.sort(key =
lambda l : l.pt(), reverse =
True)
178 for lepton
in event.selectedLeptons:
179 if hasattr(self,
'efficiency'):
180 self.efficiency.attachToObject(lepton)
184 make a list of all muons, and apply basic corrections to them
187 allmuons =
map( Muon, self.handles[
'muons'].product() )
190 if self.cfg_ana.doMuScleFitCorrections:
192 self.muscleCorr.correct(mu, event.run)
193 elif self.cfg_ana.doRochesterCorrections:
195 corp4 = rochcor.corrected_p4(mu, event.run)
199 if self.cfg_ana.doSegmentBasedMuonCleaning:
200 isgood = cmgMuonCleanerBySegments.clean( self.handles[
'muons'].product() )
202 for i,mu
in enumerate(allmuons):
203 if isgood[i]: newmu.append(mu)
208 mu.rho = float(self.handles[
'rhoMu'].product()[0])
210 if aeta < 1.0 : mu.EffectiveArea03 = 0.382;
211 elif aeta < 1.47 : mu.EffectiveArea03 = 0.317;
212 elif aeta < 2.0 : mu.EffectiveArea03 = 0.242;
213 elif aeta < 2.2 : mu.EffectiveArea03 = 0.326;
214 elif aeta < 2.3 : mu.EffectiveArea03 = 0.462;
215 else : mu.EffectiveArea03 = 0.372;
216 if aeta < 1.0 : mu.EffectiveArea04 = 0.674;
217 elif aeta < 1.47 : mu.EffectiveArea04 = 0.565;
218 elif aeta < 2.0 : mu.EffectiveArea04 = 0.442;
219 elif aeta < 2.2 : mu.EffectiveArea04 = 0.515;
220 elif aeta < 2.3 : mu.EffectiveArea04 = 0.821;
221 else : mu.EffectiveArea04 = 0.660;
224 if aeta < 0.800: mu.EffectiveArea03 = 0.0913
225 elif aeta < 1.300: mu.EffectiveArea03 = 0.0765
226 elif aeta < 2.000: mu.EffectiveArea03 = 0.0546
227 elif aeta < 2.200: mu.EffectiveArea03 = 0.0728
228 else: mu.EffectiveArea03 = 0.1177
229 if aeta < 0.800: mu.EffectiveArea04 = 0.1564
230 elif aeta < 1.300: mu.EffectiveArea04 = 0.1325
231 elif aeta < 2.000: mu.EffectiveArea04 = 0.0913
232 elif aeta < 2.200: mu.EffectiveArea04 = 0.1212
233 else: mu.EffectiveArea04 = 0.2085
234 else:
raise RuntimeError,
"Unsupported value for mu_effectiveAreas: can only use Data2012 (rho: ?) and Phys14_v1 (rho: fixedGridRhoFastjetAll)"
237 mu.associatedVertex = event.goodVertices[0]
if len(event.goodVertices)>0
else event.vertices[0]
238 mu.setTrackForDxyDz(self.cfg_ana.muon_dxydz_track)
241 if hasattr(self.cfg_ana,
"mu_tightId"):
243 mu.tightIdResult = mu.muonID(self.cfg_ana.mu_tightId)
247 if self.cfg_ana.mu_isoCorr==
"rhoArea" :
248 mu.absIso03 = (mu.pfIsolationR03().sumChargedHadronPt +
max( mu.pfIsolationR03().sumNeutralHadronEt + mu.pfIsolationR03().sumPhotonEt - mu.rho * mu.EffectiveArea03,0.0))
249 mu.absIso04 = (mu.pfIsolationR04().sumChargedHadronPt +
max( mu.pfIsolationR04().sumNeutralHadronEt + mu.pfIsolationR04().sumPhotonEt - mu.rho * mu.EffectiveArea04,0.0))
250 elif self.cfg_ana.mu_isoCorr==
"deltaBeta" :
251 mu.absIso03 = (mu.pfIsolationR03().sumChargedHadronPt +
max( mu.pfIsolationR03().sumNeutralHadronEt + mu.pfIsolationR03().sumPhotonEt - mu.pfIsolationR03().sumPUPt/2,0.0))
252 mu.absIso04 = (mu.pfIsolationR04().sumChargedHadronPt +
max( mu.pfIsolationR04().sumNeutralHadronEt + mu.pfIsolationR04().sumPhotonEt - mu.pfIsolationR04().sumPUPt/2,0.0))
254 raise RuntimeError,
"Unsupported mu_isoCorr name '" + str(self.cfg_ana.mu_isoCorr) +
"'! For now only 'rhoArea' and 'deltaBeta' are supported."
255 mu.relIso03 = mu.absIso03/mu.pt()
256 mu.relIso04 = mu.absIso04/mu.pt()
261 make a list of all electrons, and apply basic corrections to them
263 allelectrons =
map( Electron, self.handles[
'electrons'].product() )
267 for e
in allelectrons:
269 for e2
in allelenodup:
270 if abs(e.pt()-e2.pt()) < 1e-6
and abs(e.eta()-e2.eta()) < 1e-6
and abs(e.phi()-e2.phi()) < 1e-6
and e.charge() == e2.charge():
273 if not dup: allelenodup.append(e)
274 allelectrons = allelenodup
277 for ele
in allelectrons:
278 ele.rho = float(self.handles[
'rhoEle'].product()[0])
281 SCEta =
abs(ele.superCluster().
eta())
282 if SCEta < 1.0 : ele.EffectiveArea03 = 0.13
283 elif SCEta < 1.479: ele.EffectiveArea03 = 0.14
284 elif SCEta < 2.0 : ele.EffectiveArea03 = 0.07
285 elif SCEta < 2.2 : ele.EffectiveArea03 = 0.09
286 elif SCEta < 2.3 : ele.EffectiveArea03 = 0.11
287 elif SCEta < 2.4 : ele.EffectiveArea03 = 0.11
288 else : ele.EffectiveArea03 = 0.14
289 if SCEta < 1.0 : ele.EffectiveArea04 = 0.208;
290 elif SCEta < 1.479: ele.EffectiveArea04 = 0.209;
291 elif SCEta < 2.0 : ele.EffectiveArea04 = 0.115;
292 elif SCEta < 2.2 : ele.EffectiveArea04 = 0.143;
293 elif SCEta < 2.3 : ele.EffectiveArea04 = 0.183;
294 elif SCEta < 2.4 : ele.EffectiveArea04 = 0.194;
295 else : ele.EffectiveArea04 = 0.261;
297 aeta =
abs(ele.eta())
298 if aeta < 0.800: ele.EffectiveArea03 = 0.1013
299 elif aeta < 1.300: ele.EffectiveArea03 = 0.0988
300 elif aeta < 2.000: ele.EffectiveArea03 = 0.0572
301 elif aeta < 2.200: ele.EffectiveArea03 = 0.0842
302 else: ele.EffectiveArea03 = 0.1530
303 if aeta < 0.800: ele.EffectiveArea04 = 0.1830
304 elif aeta < 1.300: ele.EffectiveArea04 = 0.1734
305 elif aeta < 2.000: ele.EffectiveArea04 = 0.1077
306 elif aeta < 2.200: ele.EffectiveArea04 = 0.1565
307 else: ele.EffectiveArea04 = 0.2680
308 else:
raise RuntimeError,
"Unsupported value for ele_effectiveAreas: can only use Data2012 (rho: ?) and Phys14_v1 (rho: fixedGridRhoFastjetAll)"
311 if self.cfg_ana.doElectronScaleCorrections:
312 for ele
in allelectrons:
313 self.electronEnergyCalibrator.correct(ele, event.run)
316 for ele
in allelectrons:
317 ele.associatedVertex = event.goodVertices[0]
if len(event.goodVertices)>0
else event.vertices[0]
320 for ele
in allelectrons:
321 if self.cfg_ana.ele_isoCorr==
"rhoArea" :
322 ele.absIso03 = (ele.chargedHadronIsoR(0.3) +
max(ele.neutralHadronIsoR(0.3)+ele.photonIsoR(0.3)-ele.rho*ele.EffectiveArea03,0))
323 ele.absIso04 = (ele.chargedHadronIsoR(0.4) +
max(ele.neutralHadronIsoR(0.4)+ele.photonIsoR(0.4)-ele.rho*ele.EffectiveArea04,0))
324 elif self.cfg_ana.ele_isoCorr==
"deltaBeta" :
325 ele.absIso03 = (ele.chargedHadronIsoR(0.3) +
max( ele.neutralHadronIsoR(0.3)+ele.photonIsoR(0.3) - ele.puChargedHadronIsoR(0.3)/2, 0.0))
326 ele.absIso04 = (ele.chargedHadronIsoR(0.4) +
max( ele.neutralHadronIsoR(0.4)+ele.photonIsoR(0.4) - ele.puChargedHadronIsoR(0.4)/2, 0.0))
328 raise RuntimeError,
"Unsupported ele_isoCorr name '" + str(self.cfg_ana.ele_isoCorr) +
"'! For now only 'rhoArea' and 'deltaBeta' are supported."
329 ele.relIso03 = ele.absIso03/ele.pt()
330 ele.relIso04 = ele.absIso04/ele.pt()
333 for ele
in allelectrons:
334 if self.cfg_ana.ele_tightId==
"MVA" :
335 ele.tightIdResult = ele.electronID(
"POG_MVA_ID_Trig_full5x5")
336 elif self.cfg_ana.ele_tightId==
"Cuts_2012" :
337 ele.tightIdResult = -1 + 1*ele.electronID(
"POG_Cuts_ID_2012_Veto_full5x5") + 1*ele.electronID(
"POG_Cuts_ID_2012_Loose_full5x5") + 1*ele.electronID(
"POG_Cuts_ID_2012_Medium_full5x5") + 1*ele.electronID(
"POG_Cuts_ID_2012_Tight_full5x5")
340 ele.tightIdResult = ele.electronID(self.cfg_ana.ele_tightId)
342 raise RuntimeError,
"Unsupported ele_tightId name '" + str(self.cfg_ana.ele_tightId) +
"'! For now only 'MVA' and 'Cuts_2012' are supported, in addition to what provided in Electron.py."
348 mu.miniIsoR = 10.0/
min(
max(mu.pt(), 50),200)
351 what =
"mu" if (
abs(mu.pdgId()) == 13)
else (
"eleB" if mu.isEB()
else "eleE")
352 mu.miniAbsIsoCharged = self.IsolationComputer.chargedAbsIso(mu.physObj, mu.miniIsoR, {
"mu":0.0001,
"eleB":0,
"eleE":0.015}[what], 0.0);
355 mu.miniAbsIsoNeutral = self.IsolationComputer.neutralAbsIsoWeighted(mu.physObj, mu.miniIsoR, 0.01, 0.5);
357 mu.miniAbsIsoNeutral = ( self.IsolationComputer.photonAbsIsoWeighted( mu.physObj, mu.miniIsoR, 0.08
if what ==
"eleE" else 0.0, 0.0, self.IsolationComputer.selfVetoNone) +
358 self.IsolationComputer.neutralHadAbsIsoWeighted(mu.physObj, mu.miniIsoR, 0.0, 0.0, self.IsolationComputer.selfVetoNone) )
361 mu.miniAbsIsoNeutral = self.IsolationComputer.neutralAbsIsoRaw(mu.physObj, mu.miniIsoR, 0.01, 0.5);
363 mu.miniAbsIsoPho = self.IsolationComputer.photonAbsIsoRaw( mu.physObj, mu.miniIsoR, 0.08
if what ==
"eleE" else 0.0, 0.0, self.IsolationComputer.selfVetoNone)
364 mu.miniAbsIsoNHad = self.IsolationComputer.neutralHadAbsIsoRaw(mu.physObj, mu.miniIsoR, 0.0, 0.0, self.IsolationComputer.selfVetoNone)
365 mu.miniAbsIsoNeutral = mu.miniAbsIsoPho + mu.miniAbsIsoNHad
371 mu.miniAbsIsoNeutral =
max(0.0, mu.miniAbsIsoNeutral - mu.rho * mu.EffectiveArea03 * (mu.miniIsoR/0.3)**2)
374 mu.miniAbsIsoPU = self.IsolationComputer.puAbsIso(mu.physObj, mu.miniIsoR, 0.01, 0.5);
376 mu.miniAbsIsoPU = self.IsolationComputer.puAbsIso(mu.physObj, mu.miniIsoR, 0.015
if what ==
"eleE" else 0.0, 0.0);
377 mu.miniAbsIsoNeutral =
max(0.0, mu.miniAbsIsoNeutral - 0.5*mu.miniAbsIsoPU)
379 raise RuntimeError,
"Unsupported miniIsolationCorr name '" + str(self.cfg_ana.miniIsolationCorr) +
"'! For now only 'rhoArea', 'deltaBeta', 'raw', 'weights' are supported (and 'weights' is not tested)."
380 mu.miniAbsIso = mu.miniAbsIsoCharged + mu.miniAbsIsoNeutral
381 mu.miniRelIso = mu.miniAbsIso/mu.pt()
384 def plausible(rec,gen):
385 if abs(rec.pdgId()) == 11
and abs(gen.pdgId()) != 11:
return False
386 if abs(rec.pdgId()) == 13
and abs(gen.pdgId()) != 13:
return False
387 dr =
deltaR(rec.eta(),rec.phi(),gen.eta(),gen.phi())
388 if dr < 0.3:
return True
389 if rec.pt() < 10
and abs(rec.pdgId()) == 13
and gen.pdgId() != rec.pdgId():
return False
390 if dr < 0.7:
return True
391 if min(rec.pt(),gen.pt())/
max(rec.pt(),gen.pt()) < 0.3:
return False
394 leps = event.inclusiveLeptons
if self.cfg_ana.match_inclusiveLeptons
else event.selectedLeptons
396 event.genleps + event.gentauleps,
397 deltaRMax = 1.2, filter = plausible)
400 lep.mcMatchId = (gen.sourceId
if gen !=
None else 0)
401 lep.mcMatchTau = (gen
in event.gentauleps
if gen
else -99)
405 for i
in xrange( particle.numberOfMothers() ):
406 mom = particle.mother(i)
407 momid =
abs(mom.pdgId())
408 if momid / 1000 == bid
or momid / 100 == bid
or momid == bid:
410 elif mom.status() == 2
and self.
isFromB(mom, done=done):
415 event.anyLeptons = [ x
for x
in event.genParticles
if x.status() == 1
and abs(x.pdgId())
in [11,13] ]
416 leps = event.inclusiveLeptons
if hasattr(event,
'inclusiveLeptons')
else event.selectedLeptons
420 lep.mcMatchAny_gp = gen
422 if self.
isFromB(gen): lep.mcMatchAny = 5
423 elif self.
isFromB(gen,bid=4): lep.mcMatchAny = 4
424 else: lep.mcMatchAny = 1
428 if gen !=
None and hasattr(lep,
'mcMatchId')
and lep.mcMatchId == 0:
430 elif not hasattr(lep,
'mcMatchId'):
432 if not hasattr(lep,
'mcMatchTau'): lep.mcMatchTau = 0
435 self.readCollections( event.input )
436 self.counters.counter(
'events').inc(
'all events')
441 if self.cfg_comp.isMC
and self.cfg_ana.do_mc_match:
448 setattr(LeptonAnalyzer,
"defaultConfig",cfg.Analyzer(
450 class_object=LeptonAnalyzer,
452 muons=
'slimmedMuons',
453 electrons=
'slimmedElectrons',
454 rhoMuon=
'fixedGridRhoFastjetAll',
455 rhoElectron =
'fixedGridRhoFastjetAll',
458 doMuScleFitCorrections=
False,
459 doRochesterCorrections=
False,
460 doElectronScaleCorrections=
False,
461 doSegmentBasedMuonCleaning=
False,
463 inclusive_muon_id =
"POG_ID_Loose",
464 inclusive_muon_pt = 3,
465 inclusive_muon_eta = 2.4,
466 inclusive_muon_dxy = 0.5,
467 inclusive_muon_dz = 1.0,
468 muon_dxydz_track =
"muonBestTrack",
470 loose_muon_id =
"POG_ID_Loose",
472 loose_muon_eta = 2.4,
473 loose_muon_dxy = 0.05,
475 loose_muon_relIso = 0.4,
477 inclusive_electron_id =
"",
478 inclusive_electron_pt = 5,
479 inclusive_electron_eta = 2.5,
480 inclusive_electron_dxy = 0.5,
481 inclusive_electron_dz = 1.0,
482 inclusive_electron_lostHits = 1.0,
484 loose_electron_id =
"",
485 loose_electron_pt = 7,
486 loose_electron_eta = 2.4,
487 loose_electron_dxy = 0.05,
488 loose_electron_dz = 0.2,
489 loose_electron_relIso = 0.4,
490 loose_electron_lostHits = 1.0,
492 mu_isoCorr =
"rhoArea" ,
493 mu_effectiveAreas =
"Phys14_25ns_v1",
494 mu_tightId =
"POG_ID_Tight" ,
496 ele_isoCorr =
"rhoArea" ,
497 el_effectiveAreas =
"Phys14_25ns_v1" ,
498 ele_tightId =
"Cuts_2012" ,
500 min_dr_electron_muon = 0.02,
502 doMiniIsolation =
False,
503 packedCandidates =
'packedPFCandidates',
504 miniIsolationPUCorr =
'rhoArea',
505 miniIsolationVetoLeptons =
None,
508 match_inclusiveLeptons =
False,
Abs< T >::type abs(const T &t)
double deltaR(double eta1, double eta2, double phi1, double phi2)
eleEffectiveArea
Duplicate removal for fast sim (to be checked if still necessary in latest greatest 5...
miniIsolationVetoLeptons
inclusive leptons = all leptons that could be considered somewhere in the analysis, with minimal requirements (used e.g.
def matchObjectCollection3