1 from __future__
import print_function
3 from PhysicsTools.Heppy.analyzers.core.Analyzer
import Analyzer
4 from PhysicsTools.Heppy.analyzers.core.AutoHandle
import AutoHandle
5 from PhysicsTools.Heppy.physicsobjects.PhysicsObjects
import Jet
7 from PhysicsTools.Heppy.physicsutils.JetReCalibrator
import JetReCalibrator
8 import PhysicsTools.HeppyCore.framework.config
as cfg
10 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)
100 self.
jetGammaDR = getattr(self.cfg_ana,
'jetGammaDR', 0.4)
101 self.
jetGammaLepDR = getattr(self.cfg_ana,
'jetGammaLepDR', 0.4)
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 six.iteritems(pairs) :
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.
def testJetNoID(self, jet)
gamma_cleanJetaAll
Clean Jets from photons (first cleaning, then Jet Id)
S & print(S &os, JobReport::InputFile const &f)
cleanJetsFailIdAll
Jet Id, after jet/lepton cleaning.
noIdCleanJets
First cleaning, then Jet Id.
def beginLoop(self, setup)
cleanFromLepAndGammaSimultaneously
def matchObjectCollection
def matchJets(self, event, jets)
deltaMetFromJetSmearing
Associate jets to leptons.
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
Abs< T >::type abs(const T &t)
constexpr auto deltaR2(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
def jetFlavour(self, event)
def cleanNearestJetOnly(jets, leptons, deltaR)
def bestMatch(object, matchCollection)
def cleanJetsAndLeptons(jets, leptons, deltaR, arbitration)
def shiftJERfactor(JERShift, aeta)
def __init__(self, cfg_ana, cfg_comp, looperName)
def matchObjectCollection2(objects, matchCollection, deltaRMax=0.3)
gamma_cleanJetsFailIdAll
Jet Id, after jet/photon cleaning.