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
17 good = [
True for j
in jets ]
20 for i,j
in enumerate(jets):
21 d2i =
deltaR2(l.eta(),l.phi(), j.eta(),j.phi())
24 if ibest != -1: good[ibest] =
False
25 return [ j
for (i,j)
in enumerate(jets)
if good[i] ==
True ]
29 goodjet = [
True for j
in jets ]
30 goodlep = [
True for l
in leptons ]
31 for il, l
in enumerate(leptons):
33 for i,j
in enumerate(jets):
34 d2i =
deltaR2(l.eta(),l.phi(), j.eta(),j.phi())
36 choice = arbitration(j,l)
41 elif choice == (j,l)
or choice == (l,j):
47 if not goodlep[il]:
continue
48 if ibest != -1: goodjet[ibest] =
False
49 return ( [ j
for (i ,j)
in enumerate(jets)
if goodjet[i ] ==
True ],
50 [ l
for (il,l)
in enumerate(leptons)
if goodlep[il] ==
True ] )
55 factor = 1.079 + JERShift*0.026
56 if aeta > 3.2: factor = 1.056 + JERShift * 0.191
57 elif aeta > 2.8: factor = 1.395 + JERShift * 0.063
58 elif aeta > 2.3: factor = 1.254 + JERShift * 0.062
59 elif aeta > 1.7: factor = 1.208 + JERShift * 0.046
60 elif aeta > 1.1: factor = 1.121 + JERShift * 0.029
61 elif aeta > 0.5: factor = 1.099 + JERShift * 0.028
69 """Taken from RootTools.JetAnalyzer, simplified, modified, added corrections """
70 def __init__(self, cfg_ana, cfg_comp, looperName):
71 super(JetAnalyzer,self).
__init__(cfg_ana, cfg_comp, looperName)
72 mcGT = cfg_ana.mcGT
if hasattr(cfg_ana,
'mcGT')
else "PHYS14_25_V2"
73 dataGT = cfg_ana.dataGT
if hasattr(cfg_ana,
'dataGT')
else "GR_70_V2_AN1"
74 self.
shiftJEC = self.cfg_ana.shiftJEC
if hasattr(self.cfg_ana,
'shiftJEC')
else 0
76 self.
addJECShifts = self.cfg_ana.addJECShifts
if hasattr(self.cfg_ana,
'addJECShifts')
else 0
79 elif self.
recalibrateJets not in [
True,
False]:
raise RuntimeError(
"recalibrateJets must be any of { True, False, 'MC', 'Data' }, while it is %r " % self.
recalibrateJets)
81 calculateSeparateCorrections = getattr(cfg_ana,
"calculateSeparateCorrections",
False);
82 calculateType1METCorrection = getattr(cfg_ana,
"calculateType1METCorrection",
False);
85 doResidual = getattr(cfg_ana,
'applyL2L3Residual',
'Data')
86 if doResidual ==
"MC": doResidual = self.cfg_comp.isMC
87 elif doResidual ==
"Data": doResidual =
not self.cfg_comp.isMC
88 elif doResidual
not in [
True,
False]:
raise RuntimeError(
"If specified, applyL2L3Residual must be any of { True, False, 'MC', 'Data'(default)}")
89 GT = getattr(cfg_comp,
'jecGT', mcGT
if self.cfg_comp.isMC
else dataGT)
91 kwargs = {
'calculateSeparateCorrections':calculateSeparateCorrections,
92 'calculateType1METCorrection' :calculateType1METCorrection, }
93 if kwargs[
'calculateType1METCorrection']: kwargs[
'type1METParams'] = cfg_ana.type1METParams
96 self.
doPuId = getattr(self.cfg_ana,
'doPuId',
True)
97 self.
jetLepDR = getattr(self.cfg_ana,
'jetLepDR', 0.4)
98 self.
jetLepArbitration = getattr(self.cfg_ana,
'jetLepArbitration',
lambda jet,lepton: lepton)
99 self.
lepPtMin = getattr(self.cfg_ana,
'minLepPt', -1)
100 self.
lepSelCut = getattr(self.cfg_ana,
'lepSelCut',
lambda lep :
True)
101 self.
jetGammaDR = getattr(self.cfg_ana,
'jetGammaDR', 0.4)
102 self.
jetGammaLepDR = getattr(self.cfg_ana,
'jetGammaLepDR', 0.4)
105 if hasattr(self.cfg_ana,
'jetGammaLepDR'):
110 raise RuntimeError(
"DR for simultaneous cleaning of jets from leptons and photons is not defined, and dR(gamma, jet)!=dR(lep, jet)")
111 if(self.cfg_ana.doQG):
112 qgdefname=
"{CMSSW_BASE}/src/PhysicsTools/Heppy/data/pdfQG_AK4chs_13TeV_v2b.root"
114 if not hasattr(self.cfg_ana ,
"collectionPostFix"):self.cfg_ana.collectionPostFix=
""
118 self.handles[
'jets'] = AutoHandle( self.cfg_ana.jetCol,
'std::vector<pat::Jet>' )
119 self.handles[
'genJet'] = AutoHandle( self.cfg_ana.genJetCol,
'vector<reco::GenJet>' )
120 self.
shiftJER = self.cfg_ana.shiftJER
if hasattr(self.cfg_ana,
'shiftJER')
else 0
121 self.
addJERShifts = self.cfg_ana.addJERShifts
if hasattr(self.cfg_ana,
'addJERShifts')
else 0
122 self.handles[
'rho'] = AutoHandle( self.cfg_ana.rho,
'double' )
128 self.readCollections( event.input )
129 rho =
float(self.handles[
'rho'].product()[0])
133 if self.cfg_ana.copyJetsByValue:
136 allJets =
map(
lambda j:
Jet(ROOT.heppy.JetUtils.copyJet(j)), self.handles[
'jets'].product())
138 allJets =
map(Jet, self.handles[
'jets'].product())
149 jetsBefore = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
154 jetsAfter = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
155 if len(jetsBefore) != len(jetsAfter):
156 print(
"ERROR: I had to recompute jet corrections, and they rejected some of the jets:\nold = %s\n new = %s\n" % (jetsBefore,jetsAfter))
158 for (told, tnew)
in zip(jetsBefore,jetsAfter):
159 if (
deltaR2(told[1],told[2],tnew[1],tnew[2])) > 0.0001:
160 print(
"ERROR: I had to recompute jet corrections, and one jet direction moved: old = %s, new = %s\n" % (told, tnew))
161 elif abs(told[0]-tnew[0])/(told[0]+tnew[0]) > 0.5e-3
or abs(told[3]-tnew[3]) > 0.5e-3:
162 print(
"ERROR: I had to recompute jet corrections, and one jet pt or corr changed: old = %s, new = %s\n" % (told, tnew))
166 if self.cfg_comp.isMC:
167 self.
genJets = [ x
for x
in self.handles[
'genJet'].product() ]
168 if self.cfg_ana.do_mc_match:
169 for igj, gj
in enumerate(self.
genJets):
172 self.
matchJets(event, [ j
for j
in allJets
if j.pt()>self.cfg_ana.jetPt ])
173 if getattr(self.cfg_ana,
'smearJets',
False):
180 allJets.sort(key =
lambda j : j.pt(), reverse =
True)
183 if hasattr(event,
'selectedLeptons'):
184 leptons = [ l
for l
in event.selectedLeptons
if l.pt() > self.
lepPtMin and self.
lepSelCut(l) ]
185 if self.cfg_ana.cleanJetsFromTaus
and hasattr(event,
'selectedTaus'):
186 leptons = leptons[:] + event.selectedTaus
187 if self.cfg_ana.cleanJetsFromIsoTracks
and hasattr(event,
'selectedIsoCleanTrack'):
188 leptons = leptons[:] + event.selectedIsoCleanTrack
197 leps_with_overlaps = []
198 if getattr(self.cfg_ana,
'checkLeptonPFOverlap',
True):
199 for i
in range(jet.numberOfSourceCandidatePtrs()):
200 p1 = jet.sourceCandidatePtr(i)
202 for j
in range(lep.numberOfSourceCandidatePtrs()):
203 p2 = lep.sourceCandidatePtr(j)
204 has_overlaps = p1.key() == p2.key()
and p1.refCore().
id().productIndex() == p2.refCore().
id().productIndex()
and p1.refCore().
id().processIndex() == p2.refCore().
id().processIndex()
206 leps_with_overlaps += [lep]
207 if len(leps_with_overlaps)>0:
208 for lep
in leps_with_overlaps:
212 if(self.cfg_ana.doQG):
213 jet.qgl_calc = self.
qglcalc.computeQGLikelihood
223 jetsEtaCut = [j
for j
in self.
jets if abs(j.eta()) < self.cfg_ana.jetEta ]
229 if hasattr(event,
'selectedLeptons')
and self.cfg_ana.cleanSelectedLeptons:
230 event.discardedLeptons = [ l
for l
in leptons
if l
not in cleanLeptons ]
231 event.selectedLeptons = [ l
for l
in event.selectedLeptons
if l
not in event.discardedLeptons ]
233 if hasattr(lep,
"jetOverlap"):
249 if hasattr(event,
'selectedPhotons'):
250 if self.cfg_ana.cleanJetsFromFirstPhoton:
251 photons = event.selectedPhotons[:1]
253 photons = [ g
for g
in event.selectedPhotons ]
272 if self.cfg_ana.alwaysCleanPhotons:
298 incleptons = event.inclusiveLeptons
if hasattr(event,
'inclusiveLeptons')
else event.selectedLeptons
302 jet.leptons = [l
for l
in jlpairs
if jlpairs[l] == jet ]
303 for lep
in incleptons:
306 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,lep)
308 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,jet)
310 taus = getattr(event,
'selectedTaus',[])
314 jet.taus = [l
for l
in jtaupairs
if jtaupairs[l] == jet ]
316 setattr(tau,
"jet"+self.cfg_ana.collectionPostFix,jtaupairs[tau])
319 if self.cfg_comp.isMC:
322 if hasattr(j,
'deltaMetFromJetSmearing'):
328 if self.cfg_ana.cleanGenJetsFromPhoton:
331 if getattr(self.cfg_ana,
'attachNeutrinos',
True)
and hasattr(self.cfg_ana,
"genNuSelection") :
332 jetNus=[x
for x
in event.genParticles
if abs(x.pdgId())
in [12,14,16]
and self.cfg_ana.
genNuSelection(x) ]
333 pairs= matchObjectCollection (jetNus, self.
genJets, 0.4**2)
335 for (nu,genJet)
in six.iteritems(pairs) :
336 if genJet
is not None :
337 if not hasattr(genJet,
"nu") :
343 if self.cfg_ana.do_mc_match:
346 if hasattr(event,
"jets"+self.cfg_ana.collectionPostFix):
raise RuntimeError(
"Event already contains a jet collection with the following postfix: "+self.cfg_ana.collectionPostFix)
347 setattr(event,
"rho" +self.cfg_ana.collectionPostFix, self.
rho )
348 setattr(event,
"deltaMetFromJEC" +self.cfg_ana.collectionPostFix, self.
deltaMetFromJEC )
349 setattr(event,
"type1METCorr" +self.cfg_ana.collectionPostFix, self.
type1METCorr )
350 setattr(event,
"allJetsUsedForMET" +self.cfg_ana.collectionPostFix, self.
allJetsUsedForMET )
351 setattr(event,
"jets" +self.cfg_ana.collectionPostFix, self.
jets )
352 setattr(event,
"jetsFailId" +self.cfg_ana.collectionPostFix, self.
jetsFailId )
353 setattr(event,
"jetsAllNoID" +self.cfg_ana.collectionPostFix, self.
jetsAllNoID )
354 setattr(event,
"jetsIdOnly" +self.cfg_ana.collectionPostFix, self.
jetsIdOnly )
355 setattr(event,
"cleanJetsAll" +self.cfg_ana.collectionPostFix, self.
cleanJetsAll )
356 setattr(event,
"cleanJets" +self.cfg_ana.collectionPostFix, self.
cleanJets )
357 setattr(event,
"cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.
cleanJetsFwd )
358 setattr(event,
"cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.
cleanJetsFailIdAll )
359 setattr(event,
"cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.
cleanJetsFailId )
360 setattr(event,
"discardedJets" +self.cfg_ana.collectionPostFix, self.
discardedJets )
361 setattr(event,
"gamma_cleanJetsAll" +self.cfg_ana.collectionPostFix, self.
gamma_cleanJetsAll )
362 setattr(event,
"gamma_cleanJets" +self.cfg_ana.collectionPostFix, self.
gamma_cleanJets )
363 setattr(event,
"gamma_cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.
gamma_cleanJetsFwd )
368 if self.cfg_comp.isMC:
370 setattr(event,
"cleanGenJets" +self.cfg_ana.collectionPostFix, self.
cleanGenJets )
371 setattr(event,
"genJets" +self.cfg_ana.collectionPostFix, self.
genJets )
372 if self.cfg_ana.do_mc_match:
373 setattr(event,
"bqObjects" +self.cfg_ana.collectionPostFix, self.
bqObjects )
374 setattr(event,
"cqObjects" +self.cfg_ana.collectionPostFix, self.
cqObjects )
375 setattr(event,
"partons" +self.cfg_ana.collectionPostFix, self.
partons )
376 setattr(event,
"heaviestQCDFlavour" +self.cfg_ana.collectionPostFix, self.
heaviestQCDFlavour )
384 jet.puJetIdPassed = jet.puJetId()
385 jet.pfJetIdPassed = jet.jetID(
'POG_PFID_Loose')
386 if self.cfg_ana.relaxJetId:
389 return jet.pfJetIdPassed
and (jet.puJetIdPassed
or not(self.
doPuId))
393 return jet.pt() > self.cfg_ana.jetPt
and \
394 abs( jet.eta() ) < self.cfg_ana.jetEta;
399 if id > 999:
return (id/1000)%10 == f
400 if id > 99:
return (id/100)%10 == f
405 self.
bqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,5)) ]
406 self.
cqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,4)) ]
408 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]) ) ]
415 jet.partonId = (parton.pdgId()
if parton !=
None else 0)
416 jet.partonMotherId = (parton.mother(0).
pdgId()
if parton !=
None and parton.numberOfMothers()>0
else 0)
418 for jet
in self.
jets:
433 event.genbquarks + event.genwzquarks,
438 jet.mcMatchId = (gen.sourceId
if gen !=
None else 0)
439 jet.mcMatchFlav = (
abs(gen.pdgId())
if gen !=
None else 0)
445 jet.mcJet = match[jet]
454 genpt, jetpt, aeta = gen.pt(), jet.pt(),
abs(jet.eta())
458 ptscale =
max(0.0, (jetpt + (factor-1)*(jetpt-genpt))/jetpt)
460 jet.deltaMetFromJetSmearing = [ -(ptscale-1)*jet.rawFactor()*jet.px(), -(ptscale-1)*jet.rawFactor()*jet.py() ]
462 jet.setP4(jet.p4()*ptscale)
464 jet.setRawFactor(jet.rawFactor()/ptscale)
467 setattr(jet,
"corrJER", ptscale )
469 ptscaleJERUp =
max(0.0, (jetpt + (factorJERUp-1)*(jetpt-genpt))/jetpt)
470 setattr(jet,
"corrJERUp", ptscaleJERUp)
472 ptscaleJERDown =
max(0.0, (jetpt + (factorJERDown-1)*(jetpt-genpt))/jetpt)
473 setattr(jet,
"corrJERDown", ptscaleJERDown)
479 setattr(JetAnalyzer,
"defaultConfig", cfg.Analyzer(
480 class_object = JetAnalyzer,
481 jetCol =
'slimmedJets',
482 copyJetsByValue =
False,
483 genJetCol =
'slimmedGenJets',
484 rho = (
'fixedGridRhoFastjetAll',
'',
''),
489 jetLepArbitration = (
lambda jet,lepton : lepton),
490 cleanSelectedLeptons =
True,
492 lepSelCut =
lambda lep :
True,
496 checkLeptonPFOverlap =
True,
497 recalibrateJets =
False,
498 applyL2L3Residual =
'Data',
499 recalibrationType =
"AK4PFchs",
501 addJECShifts =
False,
505 calculateSeparateCorrections =
False,
506 calculateType1METCorrection =
False,
507 type1METParams = {
'jetPtThreshold':15.,
'skipEMfractionThreshold':0.9,
'skipMuons':
True },
509 cleanJetsFromFirstPhoton =
False,
510 cleanJetsFromTaus =
False,
511 cleanJetsFromIsoTracks =
False,
512 alwaysCleanPhotons =
False,
514 cleanGenJetsFromPhoton =
False,
516 cleanFromLepAndGammaSimultaneously =
False,
518 attachNeutrinos =
True,
519 genNuSelection =
lambda nu :
True,
520 collectionPostFix =
""