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)
99 self.
jetGammaLepDR = getattr(self.cfg_ana,
'jetGammaLepDR', 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
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 ]
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"):
233 lep.jetOverlapIdx = self.cleanJetsAll.index(lep.jetOverlap)
236 lep.jetOverlapIdx = 1000 + self.discardedJets.index(lep.jetOverlap)
246 if hasattr(event,
'selectedPhotons'):
247 if self.cfg_ana.cleanJetsFromFirstPhoton:
248 photons = event.selectedPhotons[:1]
250 photons = [ g
for g
in event.selectedPhotons ]
269 if self.cfg_ana.alwaysCleanPhotons:
282 self.cleanJetsFailIdAll.append(jet)
290 self.gamma_cleanJetsFailIdAll.append(jet)
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:
319 if hasattr(j,
'deltaMetFromJetSmearing'):
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 )
365 if self.cfg_comp.isMC:
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]) ) ]
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.
def testJetNoID(self, jet)
cleanJetsFailIdAll
Jet Id, after jet/lepton cleaning.
def beginLoop(self, setup)
cleanFromLepAndGammaSimultaneously
def matchObjectCollection
def matchJets(self, event, jets)
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
noIdCleanJetsAll
First cleaning, then Jet Id.
Abs< T >::type abs(const T &t)
def jetFlavour(self, event)
def cleanNearestJetOnly(jets, leptons, deltaR)
def bestMatch(object, matchCollection)
def cleanJetsAndLeptons(jets, leptons, deltaR, arbitration)
def shiftJERfactor(JERShift, aeta)
T1 deltaR2(T1 eta1, T2 phi1, T3 eta2, T4 phi2)
def __init__(self, cfg_ana, cfg_comp, looperName)
def matchObjectCollection2(objects, matchCollection, deltaRMax=0.3)
gamma_cleanJetsFailIdAll
Jet Id, after jet/photon cleaning.