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 = 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 if(self.cfg_ana.doQG):
100 qgdefname=
"{CMSSW_BASE}/src/PhysicsTools/Heppy/data/pdfQG_AK4chs_13TeV_v2b.root"
102 if not hasattr(self.cfg_ana ,
"collectionPostFix"):self.cfg_ana.collectionPostFix=
""
106 self.handles[
'jets'] = AutoHandle( self.cfg_ana.jetCol,
'std::vector<pat::Jet>' )
107 self.handles[
'genJet'] = AutoHandle( self.cfg_ana.genJetCol,
'vector<reco::GenJet>' )
108 self.
shiftJER = self.cfg_ana.shiftJER
if hasattr(self.cfg_ana,
'shiftJER')
else 0
109 self.
addJERShifts = self.cfg_ana.addJERShifts
if hasattr(self.cfg_ana,
'addJERShifts')
else 0
110 self.handles[
'rho'] = AutoHandle( self.cfg_ana.rho,
'double' )
116 self.readCollections( event.input )
117 rho = float(self.handles[
'rho'].product()[0])
121 if self.cfg_ana.copyJetsByValue:
123 allJets =
map(
lambda j:
Jet(ROOT.pat.Jet(ROOT.edm.Ptr(ROOT.pat.Jet)(ROOT.edm.ProductID(),j,0))), self.handles[
'jets'].product())
125 allJets =
map(Jet, self.handles[
'jets'].product())
136 jetsBefore = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
137 self.jetReCalibrator.correctAll(allJets, rho, delta=self.
shiftJEC,
141 jetsAfter = [ (j.pt(),j.eta(),j.phi(),j.rawFactor())
for j
in allJets ]
142 if len(jetsBefore) != len(jetsAfter):
143 print "ERROR: I had to recompute jet corrections, and they rejected some of the jets:\nold = %s\n new = %s\n" % (jetsBefore,jetsAfter)
145 for (told, tnew)
in zip(jetsBefore,jetsAfter):
146 if (
deltaR2(told[1],told[2],tnew[1],tnew[2])) > 0.0001:
147 print "ERROR: I had to recompute jet corrections, and one jet direction moved: old = %s, new = %s\n" % (told, tnew)
148 elif abs(told[0]-tnew[0])/(told[0]+tnew[0]) > 0.5e-3
or abs(told[3]-tnew[3]) > 0.5e-3:
149 print "ERROR: I had to recompute jet corrections, and one jet pt or corr changed: old = %s, new = %s\n" % (told, tnew)
153 if self.cfg_comp.isMC:
154 self.
genJets = [ x
for x
in self.handles[
'genJet'].product() ]
155 if self.cfg_ana.do_mc_match:
156 for igj, gj
in enumerate(self.
genJets):
159 if getattr(self.cfg_ana,
'smearJets',
False):
166 allJets.sort(key =
lambda j : j.pt(), reverse =
True)
169 if hasattr(event,
'selectedLeptons'):
170 leptons = [ l
for l
in event.selectedLeptons
if l.pt() > self.
lepPtMin and self.
lepSelCut(l) ]
171 if self.cfg_ana.cleanJetsFromTaus
and hasattr(event,
'selectedTaus'):
172 leptons = leptons[:] + event.selectedTaus
173 if self.cfg_ana.cleanJetsFromIsoTracks
and hasattr(event,
'selectedIsoCleanTrack'):
174 leptons = leptons[:] + event.selectedIsoCleanTrack
179 self.jetsAllNoID = []
183 leps_with_overlaps = []
184 if getattr(self.cfg_ana,
'checkLeptonPFOverlap',
True):
185 for i
in range(jet.numberOfSourceCandidatePtrs()):
186 p1 = jet.sourceCandidatePtr(i)
188 for j
in range(lep.numberOfSourceCandidatePtrs()):
189 p2 = lep.sourceCandidatePtr(j)
190 has_overlaps = p1.key() == p2.key()
and p1.refCore().id().productIndex() == p2.refCore().id().productIndex()
and p1.refCore().id().processIndex() == p2.refCore().id().processIndex()
192 leps_with_overlaps += [lep]
193 if len(leps_with_overlaps)>0:
194 for lep
in leps_with_overlaps:
197 self.jetsAllNoID.append(jet)
198 if(self.cfg_ana.doQG):
199 jet.qgl_calc = self.qglcalc.computeQGLikelihood
202 self.jets.append(jet)
203 self.jetsIdOnly.append(jet)
205 self.jetsFailId.append(jet)
207 self.jetsIdOnly.append(jet)
209 jetsEtaCut = [j
for j
in self.jets
if abs(j.eta()) < self.cfg_ana.jetEta ]
212 self.cleanJets = [j
for j
in self.cleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
213 self.cleanJetsFwd = [j
for j
in self.cleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
214 self.discardedJets = [j
for j
in self.jets
if j
not in self.cleanJetsAll]
215 if hasattr(event,
'selectedLeptons')
and self.cfg_ana.cleanSelectedLeptons:
216 event.discardedLeptons = [ l
for l
in leptons
if l
not in cleanLeptons ]
217 event.selectedLeptons = [ l
for l
in event.selectedLeptons
if l
not in event.discardedLeptons ]
219 if hasattr(lep,
"jetOverlap"):
220 if lep.jetOverlap
in self.cleanJetsAll:
222 lep.jetOverlapIdx = self.cleanJetsAll.index(lep.jetOverlap)
223 elif lep.jetOverlap
in self.discardedJets:
225 lep.jetOverlapIdx = 1000 + self.discardedJets.index(lep.jetOverlap)
229 self.noIdCleanJets = [j
for j
in self.noIdCleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
230 self.noIdCleanJetsFwd = [j
for j
in self.noIdCleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
231 self.noIdDiscardedJets = [j
for j
in self.jetsAllNoID
if j
not in self.noIdCleanJetsAll]
235 if hasattr(event,
'selectedPhotons'):
236 if self.cfg_ana.cleanJetsFromFirstPhoton:
237 photons = event.selectedPhotons[:1]
239 photons = [ g
for g
in event.selectedPhotons ]
242 self.gamma_cleanJets = [j
for j
in self.gamma_cleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
243 self.gamma_cleanJetsFwd = [j
for j
in self.gamma_cleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
245 self.gamma_noIdCleanJets = [j
for j
in self.gamma_noIdCleanJetsAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
246 self.gamma_noIdCleanJetsFwd = [j
for j
in self.gamma_noIdCleanJetsAll
if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
249 if self.cfg_ana.alwaysCleanPhotons:
250 self.cleanJets = self.gamma_cleanJets
251 self.cleanJetsAll = self.gamma_cleanJetsAll
252 self.cleanJetsFwd = self.gamma_cleanJetsFwd
254 self.noIdCleanJets = self.gamma_noIdCleanJets
255 self.noIdCleanJetsAll = self.gamma_noIdCleanJetsAll
256 self.noIdCleanJetsFwd = self.gamma_noIdCleanJetsFwd
259 self.cleanJetsFailIdAll = []
260 for jet
in self.noIdCleanJetsAll:
262 self.cleanJetsFailIdAll.append(jet)
264 self.cleanJetsFailId = [j
for j
in self.cleanJetsFailIdAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
267 self.gamma_cleanJetsFailIdAll = []
268 for jet
in self.gamma_noIdCleanJetsAll:
270 self.gamma_cleanJetsFailIdAll.append(jet)
272 self.gamma_cleanJetsFailId = [j
for j
in self.gamma_cleanJetsFailIdAll
if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
275 incleptons = event.inclusiveLeptons
if hasattr(event,
'inclusiveLeptons')
else event.selectedLeptons
279 jet.leptons = [l
for l
in jlpairs
if jlpairs[l] == jet ]
280 for lep
in incleptons:
283 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,lep)
285 setattr(lep,
"jet"+self.cfg_ana.collectionPostFix,jet)
287 taus = getattr(event,
'selectedTaus',[])
291 jet.taus = [l
for l
in jtaupairs
if jtaupairs[l] == jet ]
293 setattr(tau,
"jet"+self.cfg_ana.collectionPostFix,jtaupairs[tau])
296 if self.cfg_comp.isMC:
297 self.deltaMetFromJetSmearing = [0, 0]
298 for j
in self.cleanJetsAll:
299 if hasattr(j,
'deltaMetFromJetSmearing'):
300 self.deltaMetFromJetSmearing[0] += j.deltaMetFromJetSmearing[0]
301 self.deltaMetFromJetSmearing[1] += j.deltaMetFromJetSmearing[1]
305 if self.cfg_ana.cleanGenJetsFromPhoton:
308 if getattr(self.cfg_ana,
'attachNeutrinos',
True)
and hasattr(self.cfg_ana,
"genNuSelection") :
309 jetNus=[x
for x
in event.genParticles
if abs(x.pdgId())
in [12,14,16]
and self.cfg_ana.genNuSelection(x) ]
310 pairs= matchObjectCollection (jetNus, self.
genJets, 0.4**2)
312 for (nu,genJet)
in pairs.iteritems() :
313 if genJet
is not None :
314 if not hasattr(genJet,
"nu") :
320 if self.cfg_ana.do_mc_match:
323 if hasattr(event,
"jets"+self.cfg_ana.collectionPostFix):
raise RuntimeError,
"Event already contains a jet collection with the following postfix: "+self.cfg_ana.collectionPostFix
324 setattr(event,
"rho" +self.cfg_ana.collectionPostFix, self.
rho )
325 setattr(event,
"deltaMetFromJEC" +self.cfg_ana.collectionPostFix, self.
deltaMetFromJEC )
326 setattr(event,
"type1METCorr" +self.cfg_ana.collectionPostFix, self.
type1METCorr )
327 setattr(event,
"allJetsUsedForMET" +self.cfg_ana.collectionPostFix, self.
allJetsUsedForMET )
328 setattr(event,
"jets" +self.cfg_ana.collectionPostFix, self.jets )
329 setattr(event,
"jetsFailId" +self.cfg_ana.collectionPostFix, self.jetsFailId )
330 setattr(event,
"jetsAllNoID" +self.cfg_ana.collectionPostFix, self.jetsAllNoID )
331 setattr(event,
"jetsIdOnly" +self.cfg_ana.collectionPostFix, self.jetsIdOnly )
332 setattr(event,
"cleanJetsAll" +self.cfg_ana.collectionPostFix, self.cleanJetsAll )
333 setattr(event,
"cleanJets" +self.cfg_ana.collectionPostFix, self.cleanJets )
334 setattr(event,
"cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.cleanJetsFwd )
335 setattr(event,
"cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.cleanJetsFailIdAll )
336 setattr(event,
"cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.cleanJetsFailId )
337 setattr(event,
"discardedJets" +self.cfg_ana.collectionPostFix, self.discardedJets )
338 setattr(event,
"gamma_cleanJetsAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsAll )
339 setattr(event,
"gamma_cleanJets" +self.cfg_ana.collectionPostFix, self.gamma_cleanJets )
340 setattr(event,
"gamma_cleanJetsFwd" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFwd )
341 setattr(event,
"gamma_cleanJetsFailIdAll" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailIdAll )
342 setattr(event,
"gamma_cleanJetsFailId" +self.cfg_ana.collectionPostFix, self.gamma_cleanJetsFailId )
345 if self.cfg_comp.isMC:
346 setattr(event,
"deltaMetFromJetSmearing"+self.cfg_ana.collectionPostFix, self.deltaMetFromJetSmearing)
347 setattr(event,
"cleanGenJets" +self.cfg_ana.collectionPostFix, self.cleanGenJets )
348 setattr(event,
"genJets" +self.cfg_ana.collectionPostFix, self.
genJets )
349 if self.cfg_ana.do_mc_match:
350 setattr(event,
"bqObjects" +self.cfg_ana.collectionPostFix, self.
bqObjects )
351 setattr(event,
"cqObjects" +self.cfg_ana.collectionPostFix, self.
cqObjects )
352 setattr(event,
"partons" +self.cfg_ana.collectionPostFix, self.
partons )
353 setattr(event,
"heaviestQCDFlavour" +self.cfg_ana.collectionPostFix, self.
heaviestQCDFlavour )
361 jet.puJetIdPassed = jet.puJetId()
362 jet.pfJetIdPassed = jet.jetID(
'POG_PFID_Loose')
363 if self.cfg_ana.relaxJetId:
366 return jet.pfJetIdPassed
and (jet.puJetIdPassed
or not(self.
doPuId))
370 return jet.pt() > self.cfg_ana.jetPt
and \
371 abs( jet.eta() ) < self.cfg_ana.jetEta;
376 if id > 999:
return (id/1000)%10 == f
377 if id > 99:
return (id/100)%10 == f
382 self.
bqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,5)) ]
383 self.
cqObjects = [ p
for p
in event.genParticles
if (p.status() == 2
and isFlavour(p,4)) ]
385 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]) ) ]
390 for jet
in self.cleanJetsAll:
392 jet.partonId = (parton.pdgId()
if parton !=
None else 0)
393 jet.partonMotherId = (parton.mother(0).
pdgId()
if parton !=
None and parton.numberOfMothers()>0
else 0)
395 for jet
in self.jets:
410 event.genbquarks + event.genwzquarks,
415 jet.mcMatchId = (gen.sourceId
if gen !=
None else 0)
416 jet.mcMatchFlav = (
abs(gen.pdgId())
if gen !=
None else 0)
422 jet.mcJet = match[jet]
431 genpt, jetpt, aeta = gen.pt(), jet.pt(),
abs(jet.eta())
435 ptscale =
max(0.0, (jetpt + (factor-1)*(jetpt-genpt))/jetpt)
437 jet.deltaMetFromJetSmearing = [ -(ptscale-1)*jet.rawFactor()*jet.px(), -(ptscale-1)*jet.rawFactor()*jet.py() ]
439 jet.setP4(jet.p4()*ptscale)
441 jet.setRawFactor(jet.rawFactor()/ptscale)
443 if (self.shiftJER==0)
and (self.addJERShifts):
444 setattr(jet,
"corrJER", ptscale )
446 ptscaleJERUp =
max(0.0, (jetpt + (factorJERUp-1)*(jetpt-genpt))/jetpt)
447 setattr(jet,
"corrJERUp", ptscaleJERUp)
449 ptscaleJERDown =
max(0.0, (jetpt + (factorJERDown-1)*(jetpt-genpt))/jetpt)
450 setattr(jet,
"corrJERDown", ptscaleJERDown)
456 setattr(JetAnalyzer,
"defaultConfig", cfg.Analyzer(
457 class_object = JetAnalyzer,
458 jetCol =
'slimmedJets',
459 copyJetsByValue =
False,
460 genJetCol =
'slimmedGenJets',
461 rho = (
'fixedGridRhoFastjetAll',
'',
''),
466 jetLepArbitration = (
lambda jet,lepton : lepton),
467 cleanSelectedLeptons =
True,
469 lepSelCut =
lambda lep :
True,
473 checkLeptonPFOverlap =
True,
474 recalibrateJets =
False,
475 applyL2L3Residual =
'Data',
476 recalibrationType =
"AK4PFchs",
478 addJECShifts =
False,
482 calculateSeparateCorrections =
False,
483 calculateType1METCorrection =
False,
484 type1METParams = {
'jetPtThreshold':15.,
'skipEMfractionThreshold':0.9,
'skipMuons':
True },
486 cleanJetsFromFirstPhoton =
False,
487 cleanJetsFromTaus =
False,
488 cleanJetsFromIsoTracks =
False,
489 alwaysCleanPhotons =
False,
491 cleanGenJetsFromPhoton =
False,
492 attachNeutrinos =
True,
493 genNuSelection =
lambda nu :
True,
494 collectionPostFix =
""
deltaMetFromJEC
Read jets, if necessary recalibrate and shift MET.
def matchObjectCollection
def matchObjectCollection2
Abs< T >::type abs(const T &t)
if(c.getParameter< edm::InputTag >("puppiValueMap").label().size()!=0)
double deltaR2(const T1 &t1, const T2 &t2)