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 ]
150 self.jetReCalibrator.correctAll(allJets, rho, delta=self.
shiftJEC,
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:
211 self.jetsAllNoID.append(jet)
212 if(self.cfg_ana.doQG):
213 jet.qgl_calc = self.qglcalc.computeQGLikelihood
216 self.jets.append(jet)
217 self.jetsIdOnly.append(jet)
219 self.jetsFailId.append(jet)
221 self.jetsIdOnly.append(jet)
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"):
236 lep.jetOverlapIdx = self.cleanJetsAll.index(lep.jetOverlap)
239 lep.jetOverlapIdx = 1000 + self.discardedJets.index(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:
285 self.cleanJetsFailIdAll.append(jet)
293 self.gamma_cleanJetsFailIdAll.append(jet)
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 =
""
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.