1 from __future__
import print_function
2 from builtins
import range
4 from PhysicsTools.Heppy.analyzers.core.Analyzer
import Analyzer
5 from PhysicsTools.Heppy.analyzers.core.AutoHandle
import AutoHandle
6 from PhysicsTools.Heppy.physicsobjects.PhysicsObjects
import Jet
8 from PhysicsTools.Heppy.physicsutils.JetReCalibrator
import JetReCalibrator
9 import PhysicsTools.HeppyCore.framework.config
as cfg
11 from PhysicsTools.Heppy.physicsutils.QGLikelihoodCalculator
import QGLikelihoodCalculator
16 good = [
True for j
in jets ]
19 for i,j
in enumerate(jets):
20 d2i =
deltaR2(l.eta(),l.phi(), j.eta(),j.phi())
23 if ibest != -1: good[ibest] =
False
24 return [ j
for (i,j)
in enumerate(jets)
if good[i] ==
True ]
28 goodjet = [
True for j
in jets ]
29 goodlep = [
True for l
in leptons ]
30 for il, l
in enumerate(leptons):
32 for i,j
in enumerate(jets):
33 d2i =
deltaR2(l.eta(),l.phi(), j.eta(),j.phi())
35 choice = arbitration(j,l)
40 elif choice == (j,l)
or choice == (l,j):
46 if not goodlep[il]:
continue
47 if ibest != -1: goodjet[ibest] =
False
48 return ( [ j
for (i ,j)
in enumerate(jets)
if goodjet[i ] ==
True ],
49 [ l
for (il,l)
in enumerate(leptons)
if goodlep[il] ==
True ] )
54 factor = 1.079 + JERShift*0.026
55 if aeta > 3.2: factor = 1.056 + JERShift * 0.191
56 elif aeta > 2.8: factor = 1.395 + JERShift * 0.063
57 elif aeta > 2.3: factor = 1.254 + JERShift * 0.062
58 elif aeta > 1.7: factor = 1.208 + JERShift * 0.046
59 elif aeta > 1.1: factor = 1.121 + JERShift * 0.029
60 elif aeta > 0.5: factor = 1.099 + JERShift * 0.028
68 """Taken from RootTools.JetAnalyzer, simplified, modified, added corrections """
69 def __init__(self, cfg_ana, cfg_comp, looperName):
70 super(JetAnalyzer,self).
__init__(cfg_ana, cfg_comp, looperName)
71 mcGT = cfg_ana.mcGT
if hasattr(cfg_ana,
'mcGT')
else "PHYS14_25_V2"
72 dataGT = cfg_ana.dataGT
if hasattr(cfg_ana,
'dataGT')
else "GR_70_V2_AN1"
73 self.
shiftJEC = self.cfg_ana.shiftJEC
if hasattr(self.cfg_ana,
'shiftJEC')
else 0
75 self.
addJECShifts = self.cfg_ana.addJECShifts
if hasattr(self.cfg_ana,
'addJECShifts')
else 0
78 elif self.
recalibrateJets not in [
True,
False]:
raise RuntimeError(
"recalibrateJets must be any of { True, False, 'MC', 'Data' }, while it is %r " % self.
recalibrateJets)
80 calculateSeparateCorrections = getattr(cfg_ana,
"calculateSeparateCorrections",
False);
81 calculateType1METCorrection = getattr(cfg_ana,
"calculateType1METCorrection",
False);
84 doResidual = getattr(cfg_ana,
'applyL2L3Residual',
'Data')
85 if doResidual ==
"MC": doResidual = self.cfg_comp.isMC
86 elif doResidual ==
"Data": doResidual =
not self.cfg_comp.isMC
87 elif doResidual
not in [
True,
False]:
raise RuntimeError(
"If specified, applyL2L3Residual must be any of { True, False, 'MC', 'Data'(default)}")
88 GT = getattr(cfg_comp,
'jecGT', mcGT
if self.cfg_comp.isMC
else dataGT)
90 kwargs = {
'calculateSeparateCorrections':calculateSeparateCorrections,
91 'calculateType1METCorrection' :calculateType1METCorrection, }
92 if kwargs[
'calculateType1METCorrection']: kwargs[
'type1METParams'] = cfg_ana.type1METParams
95 self.
doPuId = getattr(self.cfg_ana,
'doPuId',
True)
96 self.
jetLepDR = getattr(self.cfg_ana,
'jetLepDR', 0.4)
97 self.
jetLepArbitration = getattr(self.cfg_ana,
'jetLepArbitration',
lambda jet,lepton: lepton)
98 self.
lepPtMin = getattr(self.cfg_ana,
'minLepPt', -1)
99 self.
lepSelCut = getattr(self.cfg_ana,
'lepSelCut',
lambda lep :
True)
104 if hasattr(self.cfg_ana,
'jetGammaLepDR'):
109 raise RuntimeError(
"DR for simultaneous cleaning of jets from leptons and photons is not defined, and dR(gamma, jet)!=dR(lep, jet)")
110 if(self.cfg_ana.doQG):
111 qgdefname=
"{CMSSW_BASE}/src/PhysicsTools/Heppy/data/pdfQG_AK4chs_13TeV_v2b.root"
113 if not hasattr(self.cfg_ana ,
"collectionPostFix"):self.cfg_ana.collectionPostFix=
""
117 self.handles[
'jets'] = AutoHandle( self.cfg_ana.jetCol,
'std::vector<pat::Jet>' )
118 self.handles[
'genJet'] = AutoHandle( self.cfg_ana.genJetCol,
'vector<reco::GenJet>' )
119 self.
shiftJER = self.cfg_ana.shiftJER
if hasattr(self.cfg_ana,
'shiftJER')
else 0
120 self.
addJERShifts = self.cfg_ana.addJERShifts
if hasattr(self.cfg_ana,
'addJERShifts')
else 0
121 self.handles[
'rho'] = AutoHandle( self.cfg_ana.rho,
'double' )
127 self.readCollections( event.input )
128 rho = float(self.handles[
'rho'].product()[0])
132 if self.cfg_ana.copyJetsByValue:
135 allJets = map(
lambda j:
Jet(ROOT.heppy.JetUtils.copyJet(j)), self.handles[
'jets'].product())
137 allJets = map(Jet, self.handles[
'jets'].product())
148 jetsBefore = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
149 self.jetReCalibrator.correctAll(allJets, rho, delta=self.
shiftJEC,
153 jetsAfter = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
154 if len(jetsBefore) != len(jetsAfter):
155 print(
"ERROR: I had to recompute jet corrections, and they rejected some of the jets:\nold = %s\n new = %s\n" % (jetsBefore,jetsAfter))
157 for (told, tnew)
in zip(jetsBefore,jetsAfter):
158 if (
deltaR2(told[1],told[2],tnew[1],tnew[2])) > 0.0001:
159 print(
"ERROR: I had to recompute jet corrections, and one jet direction moved: old = %s, new = %s\n" % (told, tnew))
160 elif abs(told[0]-tnew[0])/(told[0]+tnew[0]) > 0.5e-3
or abs(told[3]-tnew[3]) > 0.5e-3:
161 print(
"ERROR: I had to recompute jet corrections, and one jet pt or corr changed: old = %s, new = %s\n" % (told, tnew))
165 if self.cfg_comp.isMC:
166 self.
genJets = [ x
for x
in self.handles[
'genJet'].product() ]
167 if self.cfg_ana.do_mc_match:
168 for igj, gj
in enumerate(self.
genJets):
171 self.
matchJets(event, [ j
for j
in allJets
if j.pt()>self.cfg_ana.jetPt ])
172 if getattr(self.cfg_ana,
'smearJets',
False):
179 allJets.sort(key =
lambda j : j.pt(), reverse =
True)
182 if hasattr(event,
'selectedLeptons'):
183 leptons = [ l
for l
in event.selectedLeptons
if l.pt() > self.
lepPtMin and self.
lepSelCut(l) ]
184 if self.cfg_ana.cleanJetsFromTaus
and hasattr(event,
'selectedTaus'):
185 leptons = leptons[:] + event.selectedTaus
186 if self.cfg_ana.cleanJetsFromIsoTracks
and hasattr(event,
'selectedIsoCleanTrack'):
187 leptons = leptons[:] + event.selectedIsoCleanTrack
196 leps_with_overlaps = []
197 if getattr(self.cfg_ana,
'checkLeptonPFOverlap',
True):
198 for i
in range(jet.numberOfSourceCandidatePtrs()):
199 p1 = jet.sourceCandidatePtr(i)
201 for j
in range(lep.numberOfSourceCandidatePtrs()):
202 p2 = lep.sourceCandidatePtr(j)
203 has_overlaps = p1.key() == p2.key()
and p1.refCore().
id().productIndex() == p2.refCore().
id().productIndex()
and p1.refCore().
id().processIndex() == p2.refCore().
id().processIndex()
205 leps_with_overlaps += [lep]
206 if len(leps_with_overlaps)>0:
207 for lep
in leps_with_overlaps:
210 self.jetsAllNoID.append(jet)
211 if(self.cfg_ana.doQG):
212 jet.qgl_calc = self.qglcalc.computeQGLikelihood
215 self.jets.append(jet)
216 self.jetsIdOnly.append(jet)
218 self.jetsFailId.append(jet)
220 self.jetsIdOnly.append(jet)
222 jetsEtaCut = [j
for j
in self.
jets if abs(j.eta()) < self.cfg_ana.jetEta ]
228 if hasattr(event,
'selectedLeptons')
and self.cfg_ana.cleanSelectedLeptons:
229 event.discardedLeptons = [ l
for l
in leptons
if l
not in cleanLeptons ]
230 event.selectedLeptons = [ l
for l
in event.selectedLeptons
if l
not in event.discardedLeptons ]
232 if hasattr(lep,
"jetOverlap"):
235 lep.jetOverlapIdx = self.cleanJetsAll.index(lep.jetOverlap)
238 lep.jetOverlapIdx = 1000 + self.discardedJets.index(lep.jetOverlap)
248 if hasattr(event,
'selectedPhotons'):
249 if self.cfg_ana.cleanJetsFromFirstPhoton:
250 photons = event.selectedPhotons[:1]
252 photons = [ g
for g
in event.selectedPhotons ]
271 if self.cfg_ana.alwaysCleanPhotons:
284 self.cleanJetsFailIdAll.append(jet)
292 self.gamma_cleanJetsFailIdAll.append(jet)
297 incleptons = event.inclusiveLeptons
if hasattr(event,
'inclusiveLeptons')
else event.selectedLeptons
301 jet.leptons = [l
for l
in jlpairs
if jlpairs[l] == jet ]
302 for lep
in incleptons:
305 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,lep)
307 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,jet)
309 taus = getattr(event,
'selectedTaus',[])
313 jet.taus = [l
for l
in jtaupairs
if jtaupairs[l] == jet ]
315 setattr(tau,
"jet"+self.cfg_ana.collectionPostFix,jtaupairs[tau])
318 if self.cfg_comp.isMC:
321 if hasattr(j,
'deltaMetFromJetSmearing'):
327 if self.cfg_ana.cleanGenJetsFromPhoton:
330 if getattr(self.cfg_ana,
'attachNeutrinos',
True)
and hasattr(self.cfg_ana,
"genNuSelection") :
331 jetNus=[x
for x
in event.genParticles
if abs(x.pdgId())
in [12,14,16]
and self.cfg_ana.genNuSelection(x) ]
332 pairs= matchObjectCollection (jetNus, self.
genJets, 0.4**2)
334 for (nu,genJet)
in pairs.items() :
335 if genJet
is not None :
336 if not hasattr(genJet,
"nu") :
342 if self.cfg_ana.do_mc_match:
345 if hasattr(event,
"jets"+self.cfg_ana.collectionPostFix):
raise RuntimeError(
"Event already contains a jet collection with the following postfix: "+self.cfg_ana.collectionPostFix)
346 setattr(event,
"rho" +self.cfg_ana.collectionPostFix, self.
rho )
347 setattr(event,
"deltaMetFromJEC" +self.cfg_ana.collectionPostFix, self.
deltaMetFromJEC )
348 setattr(event,
"type1METCorr" +self.cfg_ana.collectionPostFix, self.
type1METCorr )
349 setattr(event,
"allJetsUsedForMET" +self.cfg_ana.collectionPostFix, self.
allJetsUsedForMET )
350 setattr(event,
"jets" +self.cfg_ana.collectionPostFix, self.
jets )
351 setattr(event,
"jetsFailId" +self.cfg_ana.collectionPostFix, self.
jetsFailId )
352 setattr(event,
"jetsAllNoID" +self.cfg_ana.collectionPostFix, self.
jetsAllNoID )
353 setattr(event,
"jetsIdOnly" +self.cfg_ana.collectionPostFix, self.
jetsIdOnly )
354 setattr(event,
"cleanJetsAll" +self.cfg_ana.collectionPostFix, self.
cleanJetsAll )
355 setattr(event,
"cleanJets" +self.cfg_ana.collectionPostFix, self.
cleanJets )
356 setattr(event,
"cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.
cleanJetsFwd )
357 setattr(event,
"cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.
cleanJetsFailIdAll )
358 setattr(event,
"cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.
cleanJetsFailId )
359 setattr(event,
"discardedJets" +self.cfg_ana.collectionPostFix, self.
discardedJets )
360 setattr(event,
"gamma_cleanJetsAll" +self.cfg_ana.collectionPostFix, self.
gamma_cleanJetsAll )
361 setattr(event,
"gamma_cleanJets" +self.cfg_ana.collectionPostFix, self.
gamma_cleanJets )
362 setattr(event,
"gamma_cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.
gamma_cleanJetsFwd )
367 if self.cfg_comp.isMC:
369 setattr(event,
"cleanGenJets" +self.cfg_ana.collectionPostFix, self.
cleanGenJets )
370 setattr(event,
"genJets" +self.cfg_ana.collectionPostFix, self.
genJets )
371 if self.cfg_ana.do_mc_match:
372 setattr(event,
"bqObjects" +self.cfg_ana.collectionPostFix, self.
bqObjects )
373 setattr(event,
"cqObjects" +self.cfg_ana.collectionPostFix, self.
cqObjects )
374 setattr(event,
"partons" +self.cfg_ana.collectionPostFix, self.
partons )
375 setattr(event,
"heaviestQCDFlavour" +self.cfg_ana.collectionPostFix, self.
heaviestQCDFlavour )
383 jet.puJetIdPassed = jet.puJetId()
384 jet.pfJetIdPassed = jet.jetID(
'POG_PFID_Loose')
385 if self.cfg_ana.relaxJetId:
388 return jet.pfJetIdPassed
and (jet.puJetIdPassed
or not(self.
doPuId))
392 return jet.pt() > self.cfg_ana.jetPt
and \
393 abs( jet.eta() ) < self.cfg_ana.jetEta;
398 if id > 999:
return (id/1000)%10 == f
399 if id > 99:
return (id/100)%10 == f
404 self.
bqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,5)) ]
405 self.
cqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,4)) ]
407 self.
partons = [ p
for p
in event.genParticles
if ((p.status() == 23
or p.status() == 3)
and abs(p.pdgId())>0
and (
abs(p.pdgId())
in [1,2,3,4,5,21]) ) ]
414 jet.partonId = (parton.pdgId()
if parton !=
None else 0)
415 jet.partonMotherId = (parton.mother(0).pdgId()
if parton !=
None and parton.numberOfMothers()>0
else 0)
417 for jet
in self.
jets:
432 event.genbquarks + event.genwzquarks,
437 jet.mcMatchId = (gen.sourceId
if gen !=
None else 0)
438 jet.mcMatchFlav = (
abs(gen.pdgId())
if gen !=
None else 0)
444 jet.mcJet = match[jet]
453 genpt, jetpt, aeta = gen.pt(), jet.pt(),
abs(jet.eta())
457 ptscale =
max(0.0, (jetpt + (factor-1)*(jetpt-genpt))/jetpt)
459 jet.deltaMetFromJetSmearing = [ -(ptscale-1)*jet.rawFactor()*jet.px(), -(ptscale-1)*jet.rawFactor()*jet.py() ]
461 jet.setP4(jet.p4()*ptscale)
463 jet.setRawFactor(jet.rawFactor()/ptscale)
466 setattr(jet,
"corrJER", ptscale )
468 ptscaleJERUp =
max(0.0, (jetpt + (factorJERUp-1)*(jetpt-genpt))/jetpt)
469 setattr(jet,
"corrJERUp", ptscaleJERUp)
471 ptscaleJERDown =
max(0.0, (jetpt + (factorJERDown-1)*(jetpt-genpt))/jetpt)
472 setattr(jet,
"corrJERDown", ptscaleJERDown)
478 setattr(JetAnalyzer,
"defaultConfig", cfg.Analyzer(
479 class_object = JetAnalyzer,
480 jetCol =
'slimmedJets',
481 copyJetsByValue =
False,
482 genJetCol =
'slimmedGenJets',
483 rho = (
'fixedGridRhoFastjetAll',
'',
''),
488 jetLepArbitration = (
lambda jet,lepton : lepton),
489 cleanSelectedLeptons =
True,
491 lepSelCut =
lambda lep :
True,
495 checkLeptonPFOverlap =
True,
496 recalibrateJets =
False,
497 applyL2L3Residual =
'Data',
498 recalibrationType =
"AK4PFchs",
500 addJECShifts =
False,
504 calculateSeparateCorrections =
False,
505 calculateType1METCorrection =
False,
506 type1METParams = {
'jetPtThreshold':15.,
'skipEMfractionThreshold':0.9,
'skipMuons':
True },
508 cleanJetsFromFirstPhoton =
False,
509 cleanJetsFromTaus =
False,
510 cleanJetsFromIsoTracks =
False,
511 alwaysCleanPhotons =
False,
513 cleanGenJetsFromPhoton =
False,
515 cleanFromLepAndGammaSimultaneously =
False,
517 attachNeutrinos =
True,
518 genNuSelection =
lambda nu :
True,
519 collectionPostFix =
""
deltaMetFromJEC
Read jets, if necessary recalibrate and shift MET.
uint16_t *__restrict__ id
gamma_cleanJetaAll
Clean Jets from photons (first cleaning, then Jet Id)
cleanJetsFailIdAll
Jet Id, after jet/lepton cleaning.
noIdCleanJets
First cleaning, then Jet Id.
cleanFromLepAndGammaSimultaneously
const uint16_t range(const Frame &aFrame)
def matchObjectCollection
deltaMetFromJetSmearing
Associate jets to leptons.
def matchObjectCollection2
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
if(conf_.getParameter< bool >("UseStripCablingDB"))
void print(TMatrixD &m, const char *label=nullptr, bool mathematicaFormat=false)
Abs< T >::type abs(const T &t)
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
gamma_cleanJetsFailIdAll
Jet Id, after jet/photon cleaning.