ATLAS Offline Software
PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 
17 
18 __doc__ = """This is a short algorithm to select events that contain
19 a certain amount of missing transverse energy. A minimum deltaPhi cut
20 between the missing Et and the leading jet can be applied.
21 """
22 __version__ = "0.0.1"
23 __author__ = "Ulla Blumenschein <Ulla.Blumenschein@cern.ch>"
24 __author__ = "Karsten Koeneke <karsten.koeneke@cern.ch>"
25 
26 
27 import AthenaPython.PyAthena as PyAthena
28 from AthenaPython.PyAthena import StatusCode
29 
30 
31 import AthenaCommon.SystemOfUnits as Units
32 
33 class MissingEtFilter( PyAthena.AthFilterAlgorithm ):
34  """
35  This is a short algorithm to select events that contain
36  a certain amount of missing transverse energy. A minimum deltaPhi cut
37  between the missing Et and the leading jet can be applied.
38  cutMetMin = 0.0*Units.GeV
39  jetContainerTypeList = []
40  jetContainerNameList = []
41  useUncalibratedJets = True
42  useLeadingJet = False
43  minDeltaPhi = 0.0
44  requireMet = True # What to do in case the MET container can't be retrieved
45  passAll = False
46  """
47 
48 
49 
50  def __init__ ( self, name = "MissingEtFilter", **kw ):
51 
52  kw['name'] = name
53  super(MissingEtFilter, self).__init__(**kw)
54 
55 
56  self.metCollectionType = kw.get('metCollectionType', "MissingET")
57  self.metCollectionName = kw.get('metCollectionName', "MET_RefFinal")
58  self.jetCollectionTypeList = kw.get('jetCollectionTypeList', [])
59  self.jetCollectionNameList = kw.get('jetCollectionNameList', [])
60  self.useUncalibratedJets = kw.get('useUncalibratedJets', True)
61  self.cutMetMin = kw.get('cutMetMin', 0.0*Units.GeV)
62  self.useLeadingJet = kw.get('useLeadingJet', False)
63  self.minDeltaPhi = kw.get('minDeltaPhi', 0.0)
64  self.requireMet = kw.get('requireMet', True) # What to do in case the MET container can't be retrieved
65  self.passAll = kw.get('passAll', False)
66 
67 
68  self.nProcessed = 0
69  self.nEventPassMet = 0
71 
72 
73  self.storeGateSvc = None
74 
75 
76  self.jss = None
77 
78  return
79 
80 
81  def initialize(self):
82  self.msg.info( '************************************' )
83  self.msg.info( '==> initialize %s...', self.name() )
84  self.msg.info( ' jetCollectionTypeList = %r', self.jetCollectionTypeList )
85  self.msg.info( ' jetCollectionNameList = %r', self.jetCollectionNameList )
86  self.msg.info( 'Will apply the following cuts:' )
87  self.msg.info( ' MetMin = %r', self.cutMetMin )
88  self.msg.info( ' minDeltaPhi = %r', self.minDeltaPhi )
89  self.msg.info( ' useLeadingJet = %r', self.useLeadingJet )
90  self.msg.info( ' requireMet = %r', self.requireMet )
91  self.msg.info( '************************************' )
92 
93 
94 
95  self.storeGateSvc = PyAthena.py_svc('StoreGateSvc')
96  if self.storeGateSvc is None:
97  self.msg.error("Problem retrieving StoreGateSvc pointer !!")
98  return StatusCode.Failure
99 
100 
101 
102  import PyUtils.RootUtils as ru
103  ROOT = ru.import_root() # noqa: F841
104 
105 
107 
108 
110  self.jss = PyAthena.SignalStateHelper(PyAthena.P4SignalState.JETFINAL)
111 
112 
113  import FourMomUtils.Bindings # noqa: F401
114  self.utils = { 'deltaR' : PyAthena.P4Helpers.deltaR ,
115  'deltaEta' : PyAthena.P4Helpers.deltaEta ,
116  'deltaPhi' : PyAthena.P4Helpers.deltaPhi }
117 
118 
119  return StatusCode.Success
120 
121 
122 
123 
124  def execute(self):
125  # Increment the event counter
126  self.nProcessed+=1
127 
128  # Print a message to the log file
129  self.msg.debug( '==> execute %s on %r. event...', self.name(), self.nProcessed )
130 
131 
132 
133  if self.passAll :
134  self.msg.debug( '%s event passed because passAll is true', self.name() )
135  self.setFilterPassed(True)
136  return StatusCode.Success
137 
138 
139  # Try to access container. Avoid crash if Containers absent in first data
140  met = None
141  try:
143  pass
144  except LookupError:
145  self.msg.warning( 'Collection %s not found', self.metCollectionName )
146  if self.requireMet:
147  self.setFilterPassed(False)
148  else:
149  self.setFilterPassed(True)
150  pass
151  return StatusCode.Success
152 
153 
154  # Load the jet collections from the input file
155  jetList = []
156  leadJet = None
157  if self.useLeadingJet :
158  self.msg.debug( 'Going to load the jets of type %s and key %s.', self.jetCollectionTypeList, self.jetCollectionNameList)
159  if self.jetCollectionTypeList.__len__() == self.jetCollectionNameList.__len__() :
160  for i in range( self.jetCollectionTypeList.__len__() ) :
161  try:
162  lepColl = self.storeGateSvc.retrieve( self.jetCollectionTypeList[i],
163  self.jetCollectionNameList[i] )
164  self.msg.debug( 'Loading the jet collection %s from the input file.',
165  self.jetCollectionNameList[i] )
166  for lep in lepColl :
167  jetList.append(lep)
168  pass
169  pass
170  except LookupError:
171  if self.nProcessed <100:
172  self.msg.warning( 'Collection %s not found', self.jetCollectionNameList[i] )
173  pass
174  pass
175  pass
176  pass
177  else :
178  self.msg.error( 'List of jets type %s and key %s has different lenght!',
180  pass
181 
182 
183  # Turn all jets into uncalibrated state
184  if self.useUncalibratedJets :
185  self.jss.setSignalState( PyAthena.P4SignalState.UNCALIBRATED)
186 
191 
192 
193  # Find the leading jet
194  leadJetEt = 0.0
195  controlObject = self.jss.controlObject
196  releaseObject = self.jss.releaseObject
197  for jet in jetList :
198  controlObject(jet)
199  if jet.et() > leadJetEt :
200  leadJetEt = jet.et()
201  leadJet = jet
202  pass
203  releaseObject()
204  pass
205 
206 
207 
208 
216 
217 
218  # Initialize some variables
219  PassMet = False
220  PassDeltaPhi = True
221 
222 
223  # Now, do the selection
224  if met.et() > self.cutMetMin :
225  PassMet = True
226  # Check that a jet object was actually provided
227  if self.useLeadingJet and leadJet :
228  if self.utils['deltaPhi']( leadJet, met.phi() ) < self.minDeltaPhi :
229  PassDeltaPhi = False
230  pass
231  pass
232  pass
233 
234 
235 
236 
237  if PassMet : self.nEventPassMet += 1
238  if PassDeltaPhi : self.nEventPassDeltaPhi += 1
239 
240 
241 
242  if PassMet and PassDeltaPhi :
243  self.msg.debug( '%s event passed ', self.name() )
244  self.setFilterPassed(True)
245  else:
246  self.msg.debug( '%s event failed ', self.name() )
247  self.setFilterPassed(False)
248  pass
249 
250  return StatusCode.Success
251 
252 
253 
254  def finalize(self):
255 
256  import math
257 
258 
259  effPassMet = 0.0
260  effDeltaPhi = 0.0
261  efferrPassMet = 0.0
262  efferrDeltaPhi = 0.0
263  try :
264  # Efficiencies
265  effPassMet = self.nEventPassMet / float(self.nProcessed)
266  effDeltaPhi = self.nEventPassDeltaPhi / float(self.nProcessed)
267 
268  # Error on efficiencies, use binomial errors
269  efferrPassMet = 100.0*math.sqrt(effPassMet*(1.-effPassMet)/float(self.nProcessed))
270  efferrDeltaPhi = 100.0*math.sqrt(effDeltaPhi*(1.-effDeltaPhi)/float(self.nProcessed))
271 
272  effPassMet *= 100.0
273  effDeltaPhi *= 100.0
274 
275  except ZeroDivisionError :
276  self.msg.warning( 'Division by zero error when calculating the uncertainties on the pass efficiencies...' )
277  pass
278 
279 
280  self.msg.info( '==> finalize %s...', self.name() )
281  self.msg.info( '***************************************************************' )
282  self.msg.info( 'Cut-flow table of %s skimming algorithm:', self.name() )
283  self.msg.info( '-------------' )
284  self.msg.info( ' Number of processed events: %r', self.nProcessed )
285  self.msg.info( ' Events after Met cut: %r, efficiency = (%3.3f +/- %3.3f)%%',
286  self.nEventPassMet, effPassMet, efferrPassMet )
287  self.msg.info( ' Events after deltaPhi cut: %r, efficiency = (%3.3f +/- %3.3f)%%',
288  self.nEventPassDeltaPhi, effDeltaPhi, efferrDeltaPhi )
289  self.msg.info( '***************************************************************' )
290 
291  return StatusCode.Success
292 
grepfile.info
info
Definition: grepfile.py:38
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
SystemOfUnits
python.MissingEtFilter.MissingEtFilter.jetCollectionTypeList
jetCollectionTypeList
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:58
python.MissingEtFilter.MissingEtFilter.nEventPassMet
nEventPassMet
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:69
python.MissingEtFilter.MissingEtFilter.minDeltaPhi
minDeltaPhi
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:63
python.MissingEtFilter.MissingEtFilter.requireMet
requireMet
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:64
python.MissingEtFilter.MissingEtFilter.__init__
def __init__(self, name="MissingEtFilter", **kw)
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:50
python.MissingEtFilter.MissingEtFilter.useUncalibratedJets
useUncalibratedJets
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:60
python.MissingEtFilter.MissingEtFilter.nProcessed
nProcessed
Also, declare some counters and initialize them to zero.
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:68
python.MissingEtFilter.MissingEtFilter.finalize
def finalize(self)
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:254
python.MissingEtFilter.MissingEtFilter
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:33
python.MissingEtFilter.MissingEtFilter.passAll
passAll
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:65
python.MissingEtFilter.MissingEtFilter.jss
jss
Handle to JetSignalState.
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:76
python.MissingEtFilter.MissingEtFilter.metCollectionName
metCollectionName
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:57
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.MissingEtFilter.MissingEtFilter.jetCollectionNameList
jetCollectionNameList
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:59
python.MissingEtFilter.MissingEtFilter.execute
def execute(self)
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:124
python.MissingEtFilter.MissingEtFilter.utils
utils
import some 4-mom utils
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:114
python.MissingEtFilter.MissingEtFilter.cutMetMin
cutMetMin
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:61
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
python.MissingEtFilter.MissingEtFilter.initialize
def initialize(self)
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:81
python.MissingEtFilter.MissingEtFilter.storeGateSvc
storeGateSvc
Get the storgate handle.
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:73
python.MissingEtFilter.MissingEtFilter.nEventPassDeltaPhi
nEventPassDeltaPhi
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:70
python.MissingEtFilter.MissingEtFilter.useLeadingJet
useLeadingJet
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:62
error
Definition: IImpactPoint3dEstimator.h:70
readCCLHist.float
float
Definition: readCCLHist.py:83
python.MissingEtFilter.MissingEtFilter.metCollectionType
metCollectionType
initialize base class
Definition: PhysicsAnalysis/PrimaryDPDMaker/python/MissingEtFilter.py:56