ATLAS Offline Software
FancyJetFilter.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
2 
3 
16 
17 __doc__ = """This is a short algorithm to select events that contain one
18 jet which fulfills a certain set of criteria, including jet moments.
19 """
20 __version__ = "0.0.1"
21 __author__ = "Andy Haas <ahaas@cern.ch>"
22 
23 
24 import AthenaPython.PyAthena as PyAthena
25 from AthenaPython.PyAthena import StatusCode
26 
27 import PyUtils.RootUtils as ru
28 ROOT = ru.import_root()
29 
30 
31 
32 import AthenaCommon.SystemOfUnits as Units
33 
34 class FancyJetFilter( PyAthena.AthFilterAlgorithm ):
35  """
36  This class is a short algorithm to select events that contain one
37  jet which fulfills a certain set of criteria. All energies below
38  are uncalibrated (EM scale). The possible criteria are (with
39  default values):
40  jetCollectionType = "xAOD::JetCollection"
41  jetCollectionName = "AntiKt4LCTopoJets"
42  useUncalibratedJets = True
43  cutEtMin = 0.0*Units.GeV
44  cutEtMax = 14.0*Units.TeV
45  cutEtaMin = 0
46  cutEtaMax = 2.5
47  cutSumPtTrkMax = -1.0
48  removeOverlap = False
49  deltaR = 0.2
50  leptonContainerTypeList = []
51  leptonContainerNameList = []
52  nLeadingsForCheck = 10000000
53  minNumberPassed = 1
54  recordGoodJets = False
55  goodJetCollectionName = self.name()
56  passAll = False
57  """
58 
59 
60 
61  def __init__ ( self, name = "FancyJetFilter", **kw ):
62 
63  kw['name'] = name
64  super(FancyJetFilter, self).__init__(**kw)
65 
66 
67  self.jetCollectionType = kw.get('jetCollectionType', "xAOD::JetContainer")
68  self.jetCollectionName = kw.get('jetCollectionName', "AntiKt4LCTopoJets")
69  self.useUncalibratedJets = kw.get('useUncalibratedJets', True)
70  self.cutEtMin = kw.get('cutEtMin', 0.0*Units.GeV)
71  self.cutEtMax = kw.get('cutEtMax', 14.0*Units.TeV)
72  self.cutEtaMin = kw.get('cutEtaMin', 0.0)
73  self.cutEtaMax = kw.get('cutEtaMax', 2.5)
74  self.cutSumPtTrkMax = kw.get('cutSumPtTrkMax', -1.0)
75  self.removeOverlap = kw.get('removeOverlap', False)
76  self.deltaR = kw.get('deltaR', 0.2)
77  self.leptonContainerTypeList = kw.get('leptonContainerTypeList', [])
78  self.leptonContainerNameList = kw.get('leptonContainerNameList', [])
79  self.nLeadingsForCheck = kw.get('nLeadingsForCheck', 10000000)
80  self.minNumberPassed = kw.get('minNumberPassed', 1)
81  self.recordGoodJets = kw.get('recordGoodJets', False)
82  self.goodJetCollectionName = kw.get('goodJetCollectionName', self.name() )
83  self.passAll = kw.get('passAll', False)
84 
85 
86  self.storeGateSvc = None
87 
88 
89  self.jss = None
90 
91  return
92 
93 
94 
95 
96  def initialize(self):
97  self.msg.info( '************************************' )
98  self.msg.info( '==> initialize %s...', self.name() )
99  self.msg.info( ' jetCollectionType = %r', self.jetCollectionType )
100  self.msg.info( ' jetCollectionName = %r', self.jetCollectionName )
101  self.msg.info( ' recordGoodJets = %r', self.recordGoodJets )
102  self.msg.info( ' goodJetCollectionName = %r', self.goodJetCollectionName )
103  self.msg.info( 'Will apply the following cuts:' )
104  self.msg.info( ' useUncalibratedJets = %r', self.useUncalibratedJets )
105  self.msg.info( ' EtMin (GeV) = %r', self.cutEtMin/Units.GeV )
106  self.msg.info( ' EtMax (GeV) = %r', self.cutEtMax/Units.GeV )
107  self.msg.info( ' EtaMin = %r', self.cutEtaMin )
108  self.msg.info( ' EtaMax = %r', self.cutEtaMax )
109  self.msg.info( ' cutSumPtTrkMax = %r', self.cutSumPtTrkMax )
110  self.msg.info( ' removeOverlap = %r', self.removeOverlap )
111  self.msg.info( ' deltaR = %r', self.deltaR )
112  self.msg.info( ' leptonContainerTypeList = %r', self.leptonContainerTypeList )
113  self.msg.info( ' leptonContainerNameList = %r', self.leptonContainerNameList )
114  self.msg.info( ' nLeadingsForCheck = %r', self.nLeadingsForCheck )
115  self.msg.info( ' minNumberPassed = %r', self.minNumberPassed )
116  self.msg.info( ' passAll = %r', self.passAll )
117  self.msg.info( '************************************' )
118 
119 
120  self.nProcessed = 0
121  self.nJets = 0
122  self.nEventPassed = 0
123 
124 
125  import PyUtils.RootUtils as ru
126  ROOT = ru.import_root() # noqa: F841
127 
128 
129  self.storeGateSvc = PyAthena.py_svc('StoreGateSvc')
130  if self.storeGateSvc is None:
131  self.msg.error("Problem retrieving StoreGateSvc pointer !!")
132  return StatusCode.Failure
133 
134 
135  PyAthena.load_library ('FourMomUtils')
136 
137 
138  self.jss = PyAthena.SignalStateHelper(PyAthena.P4SignalState.JETFINAL)
139 
140 
141  import FourMomUtils.Bindings # noqa: F401
142  self.utils = { 'deltaR' : PyAthena.P4Helpers.deltaR }
143 
144 
145  return StatusCode.Success
146 
147 
148 
149  def execute(self):
150  self.nProcessed+=1
151  self.msg.debug( '==> execute %s on %r. event...', self.name(), self.nProcessed )
152 
153 
154 
155  if self.passAll :
156  self.msg.debug( '%s event passed because passAll is true', self.name() )
157  self.setFilterPassed(True)
158  self.nEventPassed += 1
159  return StatusCode.Success
160 
161 
162  # Load the jet collection from the input file
163  jetCollection = None
164  try:
165  jetCollection = self.storeGateSvc.retrieve( self.jetCollectionType, self.jetCollectionName )
166  self.msg.debug( 'Loading the jet collection %s from the input file.', self.jetCollectionName )
167  except LookupError:
168  self.msg.warning( 'Collection %s not found', self.jetCollectionName )
169  self.setFilterPassed(True)
170  return StatusCode.Success
171 
172 
173  if self.useUncalibratedJets :
174  self.jss.setSignalState( PyAthena.P4SignalState.UNCALIBRATED)
175  self.msg.debug( 'Setting the jet state to uncalibrated jets.' )
176 
177 
178  # Create a class-member list of all jets that passed all cuts.
179  # This can then be used by other filters to do overlap removal, etc.
180  VIEW_ELEMENTS = 1
181  goodJets = PyAthena.JetCollection(VIEW_ELEMENTS)
182 
183 
184  # Print a debug message
185  self.msg.debug( 'Starting loop over all jets. In this event, there are %s jets', jetCollection.size() )
186 
187 
188 
189  leadEt = 0.0*Units.GeV
190  jet_pass=0
191  jet_n=0
192 
193  controlObject = self.jss.controlObject
194  releaseObject = self.jss.releaseObject
195 
196  for jet in jetCollection :
197  controlObject(jet)
198  self.msg.debug( ' jet = %s', jet)
199  self.nJets += 1
200  jet_n += 1
201  if jet_n <= self.nLeadingsForCheck :
202  if abs(jet.eta()) >= self.cutEtaMin and abs(jet.eta()) < self.cutEtaMax :
203  if jet.et() > self.cutEtMin :
204 
205  #ACH
206  pass_trk = False
207  for mk in jet.getMomentKeys():
208  if mk not in ['sumPtTrk']: continue
209  value_mom=jet.getMoment (mk, True)
210  self.msg.debug("mom: %s %s", (mk, value_mom) )
211  if self.cutSumPtTrkMax>0.0 and value_mom < self.cutSumPtTrkMax:
212  pass_trk = True
213 
214  if not pass_trk:
215  self.msg.debug("failed sumPtTrk cut")
216  continue
217  else:
218  self.msg.debug("passed sumPtTrk cut")
219  if self.removeOverlap :
220  self.msg.debug( 'FancyJetFilter: I am in overlap!' )
221  doesOverlap = False
222  for lep in leptonList : # noqa: F821 (FIXME, leptonList unknown)
223  if self.utils['deltaR'](jet, lep) <= self.deltaR :
224  doesOverlap = True
225  break
226  if not doesOverlap :
227  if jet.et() > leadEt :
228  leadEt = jet.et()
229  jet_pass+=1
230  jetCopy = jet
231  goodJets.push_back( jetCopy )
232  else :
233  self.msg.debug( 'FancyJetFilter: I am NOT in overlap!' )
234  if jet.et() > leadEt :
235  leadEt = jet.et()
236  jet_pass+=1
237  jetCopy = jet
238  goodJets.push_back( jetCopy )
239  self.msg.debug("added a good jet")
240 
241  # Print a debug message
242  self.msg.debug( 'Done with the loop over the jets. Have %s jets in collection, put %s jets in goodJets, and the leading jet has et = %s GeV.', jetCollection.size(), goodJets.__len__(), leadEt/Units.GeV )
243 
244  releaseObject()
245 
246 
247 
248  if goodJets.__len__() >= self.minNumberPassed and leadEt <= self.cutEtMax :
249  self.msg.debug( 'The %d leading jets are within [%f , %f] GeV', jet_pass, self.cutEtMin/Units.GeV, self.cutEtMax/Units.GeV)
250  self.msg.debug( '%s event passed.', self.name() )
251  self.setFilterPassed(True)
252  self.nEventPassed += 1
253  else:
254  self.msg.debug( '%s event failed', self.name() )
255  self.setFilterPassed(False)
256 
257  return StatusCode.Success
258 
259 
260 
261  def finalize(self):
262 
263  import math
264 
265 
266  effiJets = 0.0
267  effiEvents = 0.0
268  effiErrJets = 0.0
269  effiErrEvents = 0.0
270  try :
271  # Efficiencies
272  effiJets = self.nJets / float(self.nProcessed)
273  effiEvents = self.nEventPassed / float(self.nProcessed)
274 
275  # Error on efficiencies
276  effiErrJets = math.sqrt(self.nJets) / float(self.nProcessed)
277  effiErrEvents = 100.0*math.sqrt(effiEvents*(1.-effiEvents)/float(self.nProcessed))
278 
279  effiEvents *= 100.
280 
281  except ZeroDivisionError :
282  self.msg.warning( 'Division by zero error when calculating the uncertainties on the pass efficiencies...' )
283 
284 
285 
286  self.msg.info( '==> finalize %s...', self.name() )
287  self.msg.info( '***************************************************************' )
288  self.msg.info( 'Cut-flow table of %s skimming algorithm:', self.name() )
289  self.msg.info( '-------------' )
290  self.msg.info( ' Number of processed events: %r', self.nProcessed )
291  self.msg.info( ' Number of all jets: %r and number of jets per event: %3.3f +/- %3.3f', self.nJets, effiJets, effiErrJets )
292  self.msg.info( ' Events accepted: %r and resulting efficiency = (%3.3f +/- %3.3f)%%', self.nEventPassed, effiEvents, effiErrEvents )
293  self.msg.info( '***************************************************************' )
294 
295  return StatusCode.Success
296 
grepfile.info
info
Definition: grepfile.py:38
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
python.FancyJetFilter.FancyJetFilter.cutSumPtTrkMax
cutSumPtTrkMax
Definition: FancyJetFilter.py:74
python.FancyJetFilter.FancyJetFilter.goodJetCollectionName
goodJetCollectionName
Definition: FancyJetFilter.py:82
SystemOfUnits
python.FancyJetFilter.FancyJetFilter.minNumberPassed
minNumberPassed
Definition: FancyJetFilter.py:80
python.FancyJetFilter.FancyJetFilter.useUncalibratedJets
useUncalibratedJets
Definition: FancyJetFilter.py:69
python.FancyJetFilter.FancyJetFilter.__init__
def __init__(self, name="FancyJetFilter", **kw)
Definition: FancyJetFilter.py:61
python.FancyJetFilter.FancyJetFilter.storeGateSvc
storeGateSvc
Get the storgate handle.
Definition: FancyJetFilter.py:86
python.FancyJetFilter.FancyJetFilter.jetCollectionType
jetCollectionType
initialize base class
Definition: FancyJetFilter.py:67
python.FancyJetFilter.FancyJetFilter.deltaR
deltaR
Definition: FancyJetFilter.py:76
python.FancyJetFilter.FancyJetFilter.cutEtaMin
cutEtaMin
Definition: FancyJetFilter.py:72
python.FancyJetFilter.FancyJetFilter.nLeadingsForCheck
nLeadingsForCheck
Definition: FancyJetFilter.py:79
python.FancyJetFilter.FancyJetFilter.jetCollectionName
jetCollectionName
Definition: FancyJetFilter.py:68
python.FancyJetFilter.FancyJetFilter.leptonContainerNameList
leptonContainerNameList
Definition: FancyJetFilter.py:78
python.FancyJetFilter.FancyJetFilter
Definition: FancyJetFilter.py:34
python.FancyJetFilter.FancyJetFilter.utils
utils
import some 4-mom utils
Definition: FancyJetFilter.py:142
python.FancyJetFilter.FancyJetFilter.leptonContainerTypeList
leptonContainerTypeList
Definition: FancyJetFilter.py:77
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
python.FancyJetFilter.FancyJetFilter.jss
jss
Handle to JetSignalState.
Definition: FancyJetFilter.py:89
python.FancyJetFilter.FancyJetFilter.execute
def execute(self)
Definition: FancyJetFilter.py:149
python.FancyJetFilter.FancyJetFilter.cutEtMin
cutEtMin
Definition: FancyJetFilter.py:70
python.FancyJetFilter.FancyJetFilter.removeOverlap
removeOverlap
Definition: FancyJetFilter.py:75
python.FancyJetFilter.FancyJetFilter.nJets
nJets
Definition: FancyJetFilter.py:121
python.FancyJetFilter.FancyJetFilter.nProcessed
nProcessed
Initialize the counters.
Definition: FancyJetFilter.py:120
python.FancyJetFilter.FancyJetFilter.finalize
def finalize(self)
Definition: FancyJetFilter.py:261
python.FancyJetFilter.FancyJetFilter.passAll
passAll
Definition: FancyJetFilter.py:83
python.FancyJetFilter.FancyJetFilter.initialize
def initialize(self)
Definition: FancyJetFilter.py:96
python.FancyJetFilter.FancyJetFilter.recordGoodJets
recordGoodJets
Definition: FancyJetFilter.py:81
python.FancyJetFilter.FancyJetFilter.nEventPassed
nEventPassed
Definition: FancyJetFilter.py:122
python.FancyJetFilter.FancyJetFilter.cutEtaMax
cutEtaMax
Definition: FancyJetFilter.py:73
error
Definition: IImpactPoint3dEstimator.h:70
readCCLHist.float
float
Definition: readCCLHist.py:83
python.FancyJetFilter.FancyJetFilter.cutEtMax
cutEtMax
Definition: FancyJetFilter.py:71