CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
JetAnalyzer.py
Go to the documentation of this file.
1 import random
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.HeppyCore.statistics.counter import Counter, Counters
7 from PhysicsTools.Heppy.physicsutils.JetReCalibrator import JetReCalibrator
9 
10 def cleanNearestJetOnly(jets,leptons,deltaR):
11  dr2 = deltaR**2
12  good = [ True for j in jets ]
13  for l in leptons:
14  ibest, d2m = -1, dr2
15  for i,j in enumerate(jets):
16  d2i = deltaR2(l.eta(),l.phi(), j.eta(),j.phi())
17  if d2i < d2m:
18  ibest, d2m = i, d2i
19  if ibest != -1: good[ibest] = False
20  return [ j for (i,j) in enumerate(jets) if good[i] == True ]
21 
22 
23 class JetAnalyzer( Analyzer ):
24  """Taken from RootTools.JetAnalyzer, simplified, modified, added corrections """
25  def __init__(self, cfg_ana, cfg_comp, looperName):
26  super(JetAnalyzer,self).__init__(cfg_ana, cfg_comp, looperName)
27  mcGT = cfg_ana.mcGT if hasattr(cfg_ana,'mcGT') else "START53_V27"
28  dataGT = cfg_ana.dataGT if hasattr(cfg_ana,'dataGT') else "FT_53_V21_AN5"
29  self.shiftJEC = self.cfg_ana.shiftJEC if hasattr(self.cfg_ana, 'shiftJEC') else 0
30  self.doJEC = self.cfg_ana.recalibrateJets or (self.shiftJEC != 0)
31  if self.doJEC:
32  if self.cfg_comp.isMC:
33  self.jetReCalibrator = JetReCalibrator(mcGT,"AK5PF", False,cfg_ana.jecPath)
34  self.jetReCalibratorCHS = JetReCalibrator(mcGT,"AK5PFchs", False,cfg_ana.jecPath)
35  else:
36  self.jetReCalibrator = JetReCalibrator(dataGT,"AK5PF", True,cfg_ana.jecPath)
37  self.jetReCalibratorCHS = JetReCalibrator(dataGT,"AK5PFchs", True,cfg_ana.jecPath)
38  self.doPuId = self.cfg_ana.doPuId if hasattr(self.cfg_ana, 'doPuId') else True
39  self.jetLepDR = self.cfg_ana.jetLepDR if hasattr(self.cfg_ana, 'jetLepDR') else 0.5
40  self.lepPtMin = self.cfg_ana.minLepPt if hasattr(self.cfg_ana, 'minLepPt') else -1
41  self.jetGammaDR = self.cfg_ana.jetGammaDR if hasattr(self.cfg_ana, 'jetGammaDR') else 0.4
42  self.gammaPtMin = self.cfg_ana.minGammaPt if hasattr(self.cfg_ana, 'minGammaPt') else -1
43  self.gammaEtaCentral = self.cfg_ana.gammaEtaCentral if hasattr(self.cfg_ana, 'gammaEtaCentral') else 0
44 
45  def declareHandles(self):
46  super(JetAnalyzer, self).declareHandles()
47  self.handles['jets'] = AutoHandle( self.cfg_ana.jetCol, 'std::vector<pat::Jet>' )
48  self.handles['jets4MVA'] = AutoHandle( self.cfg_ana.jetCol4MVA, 'std::vector<pat::Jet>' )
49  self.handles['rho'] = AutoHandle( ('fixedGridRhoFastjetAll','',''), 'double' )
50 
51  def beginLoop(self):
52  super(JetAnalyzer,self).beginLoop()
53 
54  def process(self, event):
55  self.readCollections( event.input )
56  rho = float(self.handles['rho'].product()[0])
57  event.rho=rho
58 
59  ## Read jets, if necessary recalibrate and shift MET
60  allJets = map(Jet, self.handles['jets'].product())
61  event.deltaMetFromJEC = [0.,0.]
62  if self.doJEC:
63  #print "\nCalibrating jets %s for lumi %d, event %d" % (self.cfg_ana.jetCol, event.lumi, event.eventId)
64  corr = self.jetReCalibratorCHS if 'CHS' in self.cfg_ana.jetCol else self.jetReCalibrator
65  corr.correctAll(allJets, rho, delta=self.shiftJEC, metShift=event.deltaMetFromJEC)
66  event.allJetsUsedForMET = allJets
67 
68  ## If using a different collection for MVA, set it up
69  allJets4MVA = []
70  if self.cfg_ana.jetCol4MVA != self.cfg_ana.jetCol:
71  allJets4MVA = map(Jet, self.handles['jets4MVA'].product())
72  if self.doJEC:
73  #print "\nCalibrating jets %s for lumi %d, event %d" % (self.cfg_ana.jetCol4MVA, event.lumi, event.eventId)
74  corr = self.jetReCalibratorCHS if 'CHS' in self.cfg_ana.jetCol4MVA else self.jetReCalibrator
75  corr.correctAll(allJets4MVA, rho, delta=self.shiftJEC)
76  else:
77  allJets4MVA = allJets[:]
78 
79  ## QG Likelihood
80  #QGAlgo = "LD_CHS_CMGVARS" if ("CHS" in self.cfg_ana.jetCol) else "LD_CMGVARS";
81  #QGCorr = "Pythia" if self.cfg_comp.isMC else "Data" # FIXME: what about herwig??
82  #for jet in allJets:
83  # jet.QG = jet.quarkGluonID(rho, QGAlgo, QGCorr)
84 
85  ## Apply jet selection
86  event.jets = []
87  event.jetsFailId = []
88  event.jetsAllNoID = []
89  event.jetsIdOnly = []
90  for jet in allJets:
91  if self.testJetNoID( jet ):
92  event.jetsAllNoID.append(jet)
93  if self.testJetID (jet ):
94  event.jets.append(jet)
95  event.jetsIdOnly.append(jet)
96  else:
97  event.jetsFailId.append(jet)
98  elif self.testJetID (jet ):
99  event.jetsIdOnly.append(jet)
100 
101  ## Clean Jets from leptons
102  leptons = [ l for l in event.selectedLeptons if l.pt() > self.lepPtMin ]
103  if self.cfg_ana.cleanJetsFromTaus:
104  leptons = leptons[:] + event.selectedTaus
105  #event.cleanJets, dummy = cleanObjectCollection( event.jets,
106  # masks = leptons,
107  # deltaRMin = self.jetLepDR )
108  event.cleanJetsAll = cleanNearestJetOnly(event.jets, leptons, self.jetLepDR)
109  event.cleanJets = [j for j in event.cleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
110  event.cleanJetsFwd = [j for j in event.cleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
111 
112  ## Clean Jets from photons
113  photons = [ g for g in event.selectedPhotonsCentral ]
114  event.gamma_cleanJetsAll = cleanNearestJetOnly(event.cleanJetsAll, photons, self.jetGammaDR)
115  event.gamma_cleanJets = [j for j in event.gamma_cleanJetsAll if abs(j.eta()) < self.cfg_ana.jetEtaCentral ]
116  event.gamma_cleanJetsFwd = [j for j in event.gamma_cleanJetsAll if abs(j.eta()) >= self.cfg_ana.jetEtaCentral ]
117  ###
118 
119  ## Associate jets to leptons
120  leptons = event.inclusiveLeptons if hasattr(event, 'inclusiveLeptons') else event.selectedLeptons
121  #jlpairs = matchObjectCollection( event.inclusiveLeptons, allJets4MVA, self.jetLepDR**2)
122  jlpairs = matchObjectCollection( leptons, allJets4MVA, self.jetLepDR**2)
123  for lep in leptons:
124  jet = jlpairs[lep]
125  if jet is None:
126  lep.jet = lep
127  else:
128  lep.jet = jet
129 
130  return True
131 
132 
133  def testJetID(self, jet):
134  jet.puJetIdPassed = jet.puJetId()
135  jet.pfJetIdPassed = jet.jetID('POG_PFID_Loose')
136  if self.cfg_ana.relaxJetId:
137  return True
138  else:
139  return jet.pfJetIdPassed and (jet.puJetIdPassed or not(self.doPuId))
140 
141  def testJetNoID( self, jet ):
142  # 2 is loose pile-up jet id
143  return jet.pt() > self.cfg_ana.jetPt and \
144  abs( jet.eta() ) < self.cfg_ana.jetEta;
145 
146 
147 setattr(JetAnalyzer,"defaultConfig", cfg.Analyzer(
148  class_object = JetAnalyzer,
149  jetCol = 'slimmedJets',
150  jetCol4MVA = 'slimmedJets',
151  jetPt = 25.,
152  jetEta = 4.7,
153  jetEtaCentral = 2.4,
154  jetLepDR = 0.4,
155  minLepPt = 10,
156  relaxJetId = False,
157  doPuId = False, # Not commissioned in 7.0.X
158  recalibrateJets = False,
159  shiftJEC = 0, # set to +1 or -1 to get +/-1 sigma shifts
160  cleanJetsFromTaus = False,
161  jecPath = ""
162  )
163 )
def cleanNearestJetOnly
Definition: JetAnalyzer.py:10
def matchObjectCollection
Definition: deltar.py:98
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double deltaR2(const T1 &t1, const T2 &t2)
Definition: deltaR.h:36