2 from PhysicsTools.Heppy.analyzers.core.Analyzer
import Analyzer
3 from PhysicsTools.Heppy.analyzers.core.AutoHandle
import AutoHandle
4 from PhysicsTools.Heppy.physicsobjects.PhysicsObjects
import Jet
6 from PhysicsTools.Heppy.physicsutils.JetReCalibrator
import JetReCalibrator
7 import PhysicsTools.HeppyCore.framework.config
as cfg
9 from PhysicsTools.Heppy.physicsutils.QGLikelihoodCalculator
import QGLikelihoodCalculator
14 good = [
True for j
in jets ]
17 for i,j
in enumerate(jets):
18 d2i =
deltaR2(l.eta(),l.phi(), j.eta(),j.phi())
21 if ibest != -1: good[ibest] =
False
22 return [ j
for (i,j)
in enumerate(jets)
if good[i] ==
True ]
26 goodjet = [
True for j
in jets ]
27 goodlep = [
True for l
in leptons ]
28 for il, l
in enumerate(leptons):
30 for i,j
in enumerate(jets):
31 d2i =
deltaR2(l.eta(),l.phi(), j.eta(),j.phi())
33 choice = arbitration(j,l)
38 elif choice == (j,l)
or choice == (l,j):
44 if not goodlep[il]:
continue
45 if ibest != -1: goodjet[ibest] =
False
46 return ( [ j
for (i ,j)
in enumerate(jets)
if goodjet[i ] ==
True ],
47 [ l
for (il,l)
in enumerate(leptons)
if goodlep[il] ==
True ] )
52 factor = 1.079 + JERShift*0.026
53 if aeta > 3.2: factor = 1.056 + JERShift * 0.191
54 elif aeta > 2.8: factor = 1.395 + JERShift * 0.063
55 elif aeta > 2.3: factor = 1.254 + JERShift * 0.062
56 elif aeta > 1.7: factor = 1.208 + JERShift * 0.046
57 elif aeta > 1.1: factor = 1.121 + JERShift * 0.029
58 elif aeta > 0.5: factor = 1.099 + JERShift * 0.028
66 """Taken from RootTools.JetAnalyzer, simplified, modified, added corrections """
67 def __init__(self, cfg_ana, cfg_comp, looperName):
68 super(JetAnalyzer,self).
__init__(cfg_ana, cfg_comp, looperName)
69 mcGT = cfg_ana.mcGT
if hasattr(cfg_ana,
'mcGT')
else "PHYS14_25_V2"
70 dataGT = cfg_ana.dataGT
if hasattr(cfg_ana,
'dataGT')
else "GR_70_V2_AN1"
71 self.
shiftJEC = self.cfg_ana.shiftJEC
if hasattr(self.cfg_ana,
'shiftJEC')
else 0
73 self.
addJECShifts = self.cfg_ana.addJECShifts
if hasattr(self.cfg_ana,
'addJECShifts')
else 0
76 elif self.
recalibrateJets not in [
True,
False]:
raise RuntimeError,
"recalibrateJets must be any of { True, False, 'MC', 'Data' }, while it is %r " % self.
recalibrateJets
78 calculateSeparateCorrections = getattr(cfg_ana,
"calculateSeparateCorrections",
False);
79 calculateType1METCorrection = getattr(cfg_ana,
"calculateType1METCorrection",
False);
82 doResidual = getattr(cfg_ana,
'applyL2L3Residual',
'Data')
83 if doResidual ==
"MC": doResidual = self.cfg_comp.isMC
84 elif doResidual ==
"Data": doResidual =
not self.cfg_comp.isMC
85 elif doResidual
not in [
True,
False]:
raise RuntimeError,
"If specified, applyL2L3Residual must be any of { True, False, 'MC', 'Data'(default)}"
86 GT = getattr(cfg_comp,
'jecGT', mcGT
if self.cfg_comp.isMC
else dataGT)
88 kwargs = {
'calculateSeparateCorrections':calculateSeparateCorrections,
89 'calculateType1METCorrection' :calculateType1METCorrection, }
90 if kwargs[
'calculateType1METCorrection']: kwargs[
'type1METParams'] = cfg_ana.type1METParams
93 self.
doPuId = getattr(self.cfg_ana,
'doPuId',
True)
94 self.
jetLepDR = getattr(self.cfg_ana,
'jetLepDR', 0.4)
95 self.
jetLepArbitration = getattr(self.cfg_ana,
'jetLepArbitration',
lambda jet,lepton: lepton)
96 self.
lepPtMin = getattr(self.cfg_ana,
'minLepPt', -1)
97 self.
lepSelCut = getattr(self.cfg_ana,
'lepSelCut',
lambda lep :
True)
98 self.
jetGammaDR = getattr(self.cfg_ana,
'jetGammaDR', 0.4)
102 if hasattr(self.cfg_ana,
'jetGammaLepDR'):
107 raise RuntimeError,
"DR for simultaneous cleaning of jets from leptons and photons is not defined, and dR(gamma, jet)!=dR(lep, jet)"
108 if(self.cfg_ana.doQG):
109 qgdefname=
"{CMSSW_BASE}/src/PhysicsTools/Heppy/data/pdfQG_AK4chs_13TeV_v2b.root"
111 if not hasattr(self.cfg_ana ,
"collectionPostFix"):self.cfg_ana.collectionPostFix=
""
115 self.handles[
'jets'] = AutoHandle( self.cfg_ana.jetCol,
'std::vector<pat::Jet>' )
116 self.handles[
'genJet'] = AutoHandle( self.cfg_ana.genJetCol,
'vector<reco::GenJet>' )
117 self.
shiftJER = self.cfg_ana.shiftJER
if hasattr(self.cfg_ana,
'shiftJER')
else 0
118 self.
addJERShifts = self.cfg_ana.addJERShifts
if hasattr(self.cfg_ana,
'addJERShifts')
else 0
119 self.handles[
'rho'] = AutoHandle( self.cfg_ana.rho,
'double' )
125 self.readCollections( event.input )
126 rho = float(self.handles[
'rho'].product()[0])
130 if self.cfg_ana.copyJetsByValue:
133 allJets = map(
lambda j:
Jet(ROOT.heppy.JetUtils.copyJet(j)), self.handles[
'jets'].product())
135 allJets = map(Jet, self.handles[
'jets'].product())
146 jetsBefore = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
147 self.jetReCalibrator.correctAll(allJets, rho, delta=self.
shiftJEC,
151 jetsAfter = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
152 if len(jetsBefore) != len(jetsAfter):
153 print "ERROR: I had to recompute jet corrections, and they rejected some of the jets:\nold = %s\n new = %s\n" % (jetsBefore,jetsAfter)
155 for (told, tnew)
in zip(jetsBefore,jetsAfter):
156 if (
deltaR2(told[1],told[2],tnew[1],tnew[2])) > 0.0001:
157 print "ERROR: I had to recompute jet corrections, and one jet direction moved: old = %s, new = %s\n" % (told, tnew)
158 elif abs(told[0]-tnew[0])/(told[0]+tnew[0]) > 0.5e-3
or abs(told[3]-tnew[3]) > 0.5e-3:
159 print "ERROR: I had to recompute jet corrections, and one jet pt or corr changed: old = %s, new = %s\n" % (told, tnew)
163 if self.cfg_comp.isMC:
164 self.
genJets = [ x
for x
in self.handles[
'genJet'].product() ]
165 if self.cfg_ana.do_mc_match:
166 for igj, gj
in enumerate(self.
genJets):
169 self.
matchJets(event, [ j
for j
in allJets
if j.pt()>self.cfg_ana.jetPt ])
170 if getattr(self.cfg_ana,
'smearJets',
False):
177 allJets.sort(key =
lambda j : j.pt(), reverse =
True)
180 if hasattr(event,
'selectedLeptons'):
181 leptons = [ l
for l
in event.selectedLeptons
if l.pt() > self.
lepPtMin and self.
lepSelCut(l) ]
182 if self.cfg_ana.cleanJetsFromTaus
and hasattr(event,
'selectedTaus'):
183 leptons = leptons[:] + event.selectedTaus
184 if self.cfg_ana.cleanJetsFromIsoTracks
and hasattr(event,
'selectedIsoCleanTrack'):
185 leptons = leptons[:] + event.selectedIsoCleanTrack
190 self.jetsAllNoID = []
194 leps_with_overlaps = []
195 if getattr(self.cfg_ana,
'checkLeptonPFOverlap',
True):
196 for i
in range(jet.numberOfSourceCandidatePtrs()):
197 p1 = jet.sourceCandidatePtr(i)
199 for j
in range(lep.numberOfSourceCandidatePtrs()):
200 p2 = lep.sourceCandidatePtr(j)
201 has_overlaps = p1.key() == p2.key()
and p1.refCore().id().productIndex() == p2.refCore().id().productIndex()
and p1.refCore().id().processIndex() == p2.refCore().id().processIndex()
203 leps_with_overlaps += [lep]
204 if len(leps_with_overlaps)>0:
205 for lep
in leps_with_overlaps:
208 self.jetsAllNoID.append(jet)
209 if(self.cfg_ana.doQG):
210 jet.qgl_calc = self.qglcalc.computeQGLikelihood
213 self.jets.append(jet)
214 self.jetsIdOnly.append(jet)
216 self.jetsFailId.append(jet)
218 self.jetsIdOnly.append(jet)
220 jetsEtaCut = [j
for j
in self.jets
if abs(j.eta()) < self.cfg_ana.jetEta ]
223 self.cleanJets = [j
for j
in self.cleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
224 self.cleanJetsFwd = [j
for j
in self.cleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
225 self.discardedJets = [j
for j
in self.jets
if j
not in self.cleanJetsAll]
226 if hasattr(event,
'selectedLeptons')
and self.cfg_ana.cleanSelectedLeptons:
227 event.discardedLeptons = [ l
for l
in leptons
if l
not in cleanLeptons ]
228 event.selectedLeptons = [ l
for l
in event.selectedLeptons
if l
not in event.discardedLeptons ]
230 if hasattr(lep,
"jetOverlap"):
231 if lep.jetOverlap
in self.cleanJetsAll:
233 lep.jetOverlapIdx = self.cleanJetsAll.index(lep.jetOverlap)
234 elif lep.jetOverlap
in self.discardedJets:
236 lep.jetOverlapIdx = 1000 + self.discardedJets.index(lep.jetOverlap)
240 self.noIdCleanJets = [j
for j
in self.noIdCleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
241 self.noIdCleanJetsFwd = [j
for j
in self.noIdCleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
242 self.noIdDiscardedJets = [j
for j
in self.jetsAllNoID
if j
not in self.noIdCleanJetsAll]
246 if hasattr(event,
'selectedPhotons'):
247 if self.cfg_ana.cleanJetsFromFirstPhoton:
248 photons = event.selectedPhotons[:1]
250 photons = [ g
for g
in event.selectedPhotons ]
252 self.gamma_cleanJetaAll = []
253 self.gamma_noIdCleanJetsAll = []
262 self.gamma_cleanJets = [j
for j
in self.gamma_cleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
263 self.gamma_cleanJetsFwd = [j
for j
in self.gamma_cleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
265 self.gamma_noIdCleanJets = [j
for j
in self.gamma_noIdCleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
266 self.gamma_noIdCleanJetsFwd = [j
for j
in self.gamma_noIdCleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
269 if self.cfg_ana.alwaysCleanPhotons:
270 self.cleanJets = self.gamma_cleanJets
271 self.cleanJetsAll = self.gamma_cleanJetsAll
272 self.cleanJetsFwd = self.gamma_cleanJetsFwd
274 self.noIdCleanJets = self.gamma_noIdCleanJets
275 self.noIdCleanJetsAll = self.gamma_noIdCleanJetsAll
276 self.noIdCleanJetsFwd = self.gamma_noIdCleanJetsFwd
279 self.cleanJetsFailIdAll = []
280 for jet
in self.noIdCleanJetsAll:
282 self.cleanJetsFailIdAll.append(jet)
284 self.cleanJetsFailId = [j
for j
in self.cleanJetsFailIdAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
287 self.gamma_cleanJetsFailIdAll = []
288 for jet
in self.gamma_noIdCleanJetsAll:
290 self.gamma_cleanJetsFailIdAll.append(jet)
292 self.gamma_cleanJetsFailId = [j
for j
in self.gamma_cleanJetsFailIdAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
295 incleptons = event.inclusiveLeptons
if hasattr(event,
'inclusiveLeptons')
else event.selectedLeptons
299 jet.leptons = [l
for l
in jlpairs
if jlpairs[l] == jet ]
300 for lep
in incleptons:
303 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,lep)
305 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,jet)
307 taus = getattr(event,
'selectedTaus',[])
311 jet.taus = [l
for l
in jtaupairs
if jtaupairs[l] == jet ]
313 setattr(tau,
"jet"+self.cfg_ana.collectionPostFix,jtaupairs[tau])
316 if self.cfg_comp.isMC:
317 self.deltaMetFromJetSmearing = [0, 0]
318 for j
in self.cleanJetsAll:
319 if hasattr(j,
'deltaMetFromJetSmearing'):
320 self.deltaMetFromJetSmearing[0] += j.deltaMetFromJetSmearing[0]
321 self.deltaMetFromJetSmearing[1] += j.deltaMetFromJetSmearing[1]
325 if self.cfg_ana.cleanGenJetsFromPhoton:
328 if getattr(self.cfg_ana,
'attachNeutrinos',
True)
and hasattr(self.cfg_ana,
"genNuSelection") :
329 jetNus=[x
for x
in event.genParticles
if abs(x.pdgId())
in [12,14,16]
and self.cfg_ana.genNuSelection(x) ]
330 pairs= matchObjectCollection (jetNus, self.
genJets, 0.4**2)
332 for (nu,genJet)
in pairs.iteritems() :
333 if genJet
is not None :
334 if not hasattr(genJet,
"nu") :
340 if self.cfg_ana.do_mc_match:
343 if hasattr(event,
"jets"+self.cfg_ana.collectionPostFix):
raise RuntimeError(
"Event already contains a jet collection with the following postfix: "+self.cfg_ana.collectionPostFix)
344 setattr(event,
"rho" +self.cfg_ana.collectionPostFix, self.
rho )
345 setattr(event,
"deltaMetFromJEC" +self.cfg_ana.collectionPostFix, self.
deltaMetFromJEC )
346 setattr(event,
"type1METCorr" +self.cfg_ana.collectionPostFix, self.
type1METCorr )
347 setattr(event,
"allJetsUsedForMET" +self.cfg_ana.collectionPostFix, self.
allJetsUsedForMET )
348 setattr(event,
"jets" +self.cfg_ana.collectionPostFix, self.jets )
349 setattr(event,
"jetsFailId" +self.cfg_ana.collectionPostFix, self.jetsFailId )
350 setattr(event,
"jetsAllNoID" +self.cfg_ana.collectionPostFix, self.jetsAllNoID )
351 setattr(event,
"jetsIdOnly" +self.cfg_ana.collectionPostFix, self.jetsIdOnly )
352 setattr(event,
"cleanJetsAll" +self.cfg_ana.collectionPostFix, self.cleanJetsAll )
353 setattr(event,
"cleanJets" +self.cfg_ana.collectionPostFix, self.cleanJets )
354 setattr(event,
"cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.cleanJetsFwd )
355 setattr(event,
"cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.cleanJetsFailIdAll )
356 setattr(event,
"cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.cleanJetsFailId )
357 setattr(event,
"discardedJets" +self.cfg_ana.collectionPostFix, self.discardedJets )
358 setattr(event,
"gamma_cleanJetsAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsAll )
359 setattr(event,
"gamma_cleanJets" +self.cfg_ana.collectionPostFix, self.gamma_cleanJets )
360 setattr(event,
"gamma_cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFwd )
361 setattr(event,
"gamma_cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailIdAll )
362 setattr(event,
"gamma_cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailId )
365 if self.cfg_comp.isMC:
366 setattr(event,
"deltaMetFromJetSmearing"+self.cfg_ana.collectionPostFix, self.deltaMetFromJetSmearing)
367 setattr(event,
"cleanGenJets" +self.cfg_ana.collectionPostFix, self.cleanGenJets )
368 setattr(event,
"genJets" +self.cfg_ana.collectionPostFix, self.
genJets )
369 if self.cfg_ana.do_mc_match:
370 setattr(event,
"bqObjects" +self.cfg_ana.collectionPostFix, self.
bqObjects )
371 setattr(event,
"cqObjects" +self.cfg_ana.collectionPostFix, self.
cqObjects )
372 setattr(event,
"partons" +self.cfg_ana.collectionPostFix, self.
partons )
373 setattr(event,
"heaviestQCDFlavour" +self.cfg_ana.collectionPostFix, self.
heaviestQCDFlavour )
381 jet.puJetIdPassed = jet.puJetId()
382 jet.pfJetIdPassed = jet.jetID(
'POG_PFID_Loose')
383 if self.cfg_ana.relaxJetId:
386 return jet.pfJetIdPassed
and (jet.puJetIdPassed
or not(self.
doPuId))
390 return jet.pt() > self.cfg_ana.jetPt
and \
391 abs( jet.eta() ) < self.cfg_ana.jetEta;
396 if id > 999:
return (id/1000)%10 == f
397 if id > 99:
return (id/100)%10 == f
402 self.
bqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,5)) ]
403 self.
cqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,4)) ]
405 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]) ) ]
410 for jet
in self.cleanJetsAll:
412 jet.partonId = (parton.pdgId()
if parton !=
None else 0)
413 jet.partonMotherId = (parton.mother(0).
pdgId()
if parton !=
None and parton.numberOfMothers()>0
else 0)
415 for jet
in self.jets:
430 event.genbquarks + event.genwzquarks,
435 jet.mcMatchId = (gen.sourceId
if gen !=
None else 0)
436 jet.mcMatchFlav = (
abs(gen.pdgId())
if gen !=
None else 0)
442 jet.mcJet = match[jet]
451 genpt, jetpt, aeta = gen.pt(), jet.pt(),
abs(jet.eta())
455 ptscale =
max(0.0, (jetpt + (factor-1)*(jetpt-genpt))/jetpt)
457 jet.deltaMetFromJetSmearing = [ -(ptscale-1)*jet.rawFactor()*jet.px(), -(ptscale-1)*jet.rawFactor()*jet.py() ]
459 jet.setP4(jet.p4()*ptscale)
461 jet.setRawFactor(jet.rawFactor()/ptscale)
463 if (self.shiftJER==0)
and (self.addJERShifts):
464 setattr(jet,
"corrJER", ptscale )
466 ptscaleJERUp =
max(0.0, (jetpt + (factorJERUp-1)*(jetpt-genpt))/jetpt)
467 setattr(jet,
"corrJERUp", ptscaleJERUp)
469 ptscaleJERDown =
max(0.0, (jetpt + (factorJERDown-1)*(jetpt-genpt))/jetpt)
470 setattr(jet,
"corrJERDown", ptscaleJERDown)
476 setattr(JetAnalyzer,
"defaultConfig", cfg.Analyzer(
477 class_object = JetAnalyzer,
478 jetCol =
'slimmedJets',
479 copyJetsByValue =
False,
480 genJetCol =
'slimmedGenJets',
481 rho = (
'fixedGridRhoFastjetAll',
'',
''),
486 jetLepArbitration = (
lambda jet,lepton : lepton),
487 cleanSelectedLeptons =
True,
489 lepSelCut =
lambda lep :
True,
493 checkLeptonPFOverlap =
True,
494 recalibrateJets =
False,
495 applyL2L3Residual =
'Data',
496 recalibrationType =
"AK4PFchs",
498 addJECShifts =
False,
502 calculateSeparateCorrections =
False,
503 calculateType1METCorrection =
False,
504 type1METParams = {
'jetPtThreshold':15.,
'skipEMfractionThreshold':0.9,
'skipMuons':
True },
506 cleanJetsFromFirstPhoton =
False,
507 cleanJetsFromTaus =
False,
508 cleanJetsFromIsoTracks =
False,
509 alwaysCleanPhotons =
False,
511 cleanGenJetsFromPhoton =
False,
513 cleanFromLepAndGammaSimultaneously =
False,
515 attachNeutrinos =
True,
516 genNuSelection =
lambda nu :
True,
517 collectionPostFix =
""
deltaMetFromJEC
Read jets, if necessary recalibrate and shift MET.
cleanFromLepAndGammaSimultaneously
def matchObjectCollection
def matchObjectCollection2
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
Abs< T >::type abs(const T &t)
T1 deltaR2(T1 eta1, T2 phi1, T3 eta2, T4 phi2)