ATLAS Offline Software
MultiJetMetFilter.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
2 
3 
12 
13 __doc__ = """This filter provides an algorithm to select events that contain multiple high-pT jets and large Met."""
14 __version__ = "0.0.1"
15 __author__ = "Shimpei Yamamoto <shimpei.yamamoto@cern.ch>"
16 
17 
18 import AthenaPython.PyAthena as PyAthena
19 from AthenaPython.PyAthena import StatusCode
20 
21 
22 import AthenaCommon.SystemOfUnits as Units
23 
24 class MultiJetMetFilter( PyAthena.AthFilterAlgorithm ):
25 
26  def __init__ ( self, name = "MultiJetMetFilter", **kw ):
27  kw['name'] = name
28  super(MultiJetMetFilter, self).__init__(**kw)
29 
30 
31  self.jetCollectionType = kw.get('jetCollectionType', "JetCollection")
32  self.jetCollectionName = kw.get('jetCollectionName', "AntiKt4TopoJets")
33  self.cutsEtMin = kw.get('cutsEtMin', [])
34  self.cutEtaMax = kw.get('cutEtaMax', [])
35  self.requireMet = kw.get('requireMet ', True)
36  self.metCollectionType = kw.get('metCollectionType', "MissingET")
37  self.metCollectionNames = kw.get('metCollectionNames', [])
38  self.cutMetMin = kw.get('cutMetMin', 0.0*Units.GeV)
39  self.passAll = kw.get('passAll', False)
40 
41  return
42 
43  def initialize(self):
44  self.msg.info( '************************************' )
45  self.msg.info( '==> initialize %s...', self.name() )
46  self.msg.info( ' jetCollectionType = %s', self.jetCollectionType )
47  self.msg.info( ' jetCollectionName = %s', self.jetCollectionName )
48  self.msg.info( ' metCollectionType = %s', self.metCollectionType )
49  self.msg.info( ' metCollectionNames = %s', self.metCollectionNames )
50  self.msg.info( 'Will apply the following cuts:' )
51  self.msg.info( ' cutsEtMin = %r', self.cutsEtMin )
52  self.msg.info( ' cutEtaMax = %r', self.cutEtaMax )
53  self.msg.info( ' requireMet = %r', self.requireMet )
54  self.msg.info( ' MetMin = %r', self.cutMetMin )
55  self.msg.info( '************************************' )
56 
57  self.nProcessed = 0
58  self.nEventPassed = 0
59  self.nEventPassJet = 0
60  self.nEventPassMet = 0
61 
62 
63  self.storeGateSvc = PyAthena.py_svc('StoreGateSvc')
64  if not self.storeGateSvc :
65  self.msg.error("Problem retrieving StoreGateSvc pointer !!")
66  return StatusCode.Failure
67 
68  return StatusCode.Success
69 
70 
71  def execute(self):
72  self.nProcessed+=1
73 
74 
75  if self.passAll :
76  self.msg.debug( '%s event passed because passAll is true', self.name() )
77  self.setFilterPassed(True)
78  return StatusCode.Success
79 
80  if len(self.cutsEtMin) < 2 :
81  self.msg.warning( 'Invalid configuration' )
82  self.setFilterPassed(False)
83  return StatusCode.Success
84 
85  # Get the jet collection from StoreGate
86  jetCollection = None
87 
88  try:
89  jetCollection = self.storeGateSvc.retrieve( self.jetCollectionType, self.jetCollectionName )
90  except LookupError:
91  self.msg.warning( 'Collection %s not found', self.jetCollectionName )
92  self.setFilterPassed(False)
93  return StatusCode.Success
94 
95 
96  selectedJetIdx = []
97  for i in range( jetCollection.size() ) :
98  jet = jetCollection[i]
99  if abs(jet.eta()) < self.cutEtaMax :
100  selectedJetIdx.append(i)
101 
102  passedJet = True
103  if len(selectedJetIdx) >= len(self.cutsEtMin) :
104  for i in range( len(self.cutsEtMin) ) :
105  jet = jetCollection[selectedJetIdx[i]]
106  if jet.et() <= self.cutsEtMin[i] :
107  passedJet = False
108  break
109 
110  if passedJet :
111  self.nEventPassJet+=1
112 
113 
114  if self.requireMet :
115  passedMet = False
116  for i in range( len(self.metCollectionNames) ) :
117  try:
118  met = self.storeGateSvc.retrieve( self.metCollectionType, self.metCollectionNames[i] )
119  except LookupError:
120  self.msg.warning( 'Collection %s not found', self.metCollectionNames[i] )
121  self.setFilterPassed(False)
122  return StatusCode.Success
123 
124  if met.et() > self.cutMetMin :
125  passedMet = True
126  self.nEventPassMet+=1
127  break
128  else :
129  pass
130 
131  if passedJet and passedMet :
132  self.nEventPassed+=1
133  self.setFilterPassed(True)
134  else :
135  self.setFilterPassed(False)
136 
137  else :
138  self.nEventPassMet+=1
139  if passedJet :
140  self.nEventPassed+=1
141  self.setFilterPassed(True)
142  else :
143  self.setFilterPassed(False)
144 
145  return StatusCode.Success
146 
147  def finalize(self):
148 
149  import math
150 
151 
152  effPassJet = 0.0
153  effPassMet = 0.0
154  effPassAll = 0.0
155  effErrPassJet = 0.0
156  effErrPassMet = 0.0
157  effErrPassAll = 0.0
158 
159  try :
160  # Efficiencies
161  effPassJet = self.nEventPassJet / float(self.nProcessed)
162  effPassMet = self.nEventPassMet / float(self.nProcessed)
163  effPassAll = self.nEventPassed / float(self.nProcessed)
164 
165  # Error on efficiencies
166  effErrPassJet = 100.0*math.sqrt(effPassJet*(1.-effPassMet)/float(self.nProcessed))
167  effErrPassMet = 100.0*math.sqrt(effPassMet*(1.-effPassMet)/float(self.nProcessed))
168  effErrPassAll = 100.0*math.sqrt(effPassAll*(1.-effPassAll)/float(self.nProcessed))
169 
170  effPassJet *= 100.
171  effPassMet *= 100.
172  effPassAll *= 100.
173 
174  except ZeroDivisionError :
175  self.msg.warning( 'Division by zero error when calculating the uncertainties on the pass efficiencies...' )
176 
177  self.msg.info( '==> finalize %s...', self.name() )
178  self.msg.info( '***************************************************************' )
179  self.msg.info( 'Cut-flow table of %s skimming algorithm:', self.name() )
180  self.msg.info( '-------------' )
181  self.msg.info( ' Number of processed events: %r', self.nProcessed )
182  self.msg.info( ' Number of events with jet requirement: %r, eff. = (%3.3f +/- %3.3f)%%', self.nEventPassJet, effPassJet, effErrPassJet )
183  self.msg.info( ' Number of events with met requirement: %r, eff. = (%3.3f +/- %3.3f)%%', self.nEventPassMet, effPassMet, effErrPassMet )
184  self.msg.info( ' Number of events with all requirements: %r, eff. = (%3.3f +/- %3.3f)%%', self.nEventPassed, effPassAll, effErrPassAll )
185  self.msg.info( '***************************************************************' )
186 
187 
188  return StatusCode.Success
189 
grepfile.info
info
Definition: grepfile.py:38
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
SystemOfUnits
python.MultiJetMetFilter.MultiJetMetFilter.finalize
def finalize(self)
Definition: MultiJetMetFilter.py:147
python.MultiJetMetFilter.MultiJetMetFilter
Definition: MultiJetMetFilter.py:24
python.MultiJetMetFilter.MultiJetMetFilter.jetCollectionName
jetCollectionName
Definition: MultiJetMetFilter.py:32
python.MultiJetMetFilter.MultiJetMetFilter.nEventPassed
nEventPassed
Definition: MultiJetMetFilter.py:58
python.MultiJetMetFilter.MultiJetMetFilter.nEventPassMet
nEventPassMet
Definition: MultiJetMetFilter.py:60
python.MultiJetMetFilter.MultiJetMetFilter.metCollectionNames
metCollectionNames
Definition: MultiJetMetFilter.py:37
python.MultiJetMetFilter.MultiJetMetFilter.storeGateSvc
storeGateSvc
Get the StoreGate service.
Definition: MultiJetMetFilter.py:63
python.MultiJetMetFilter.MultiJetMetFilter.requireMet
requireMet
Definition: MultiJetMetFilter.py:35
plotBeamSpotVxVal.range
range
Definition: plotBeamSpotVxVal.py:195
python.MultiJetMetFilter.MultiJetMetFilter.__init__
def __init__(self, name="MultiJetMetFilter", **kw)
Definition: MultiJetMetFilter.py:26
python.MultiJetMetFilter.MultiJetMetFilter.cutEtaMax
cutEtaMax
Definition: MultiJetMetFilter.py:34
python.MultiJetMetFilter.MultiJetMetFilter.jetCollectionType
jetCollectionType
Define the cuts.
Definition: MultiJetMetFilter.py:31
python.MultiJetMetFilter.MultiJetMetFilter.execute
def execute(self)
Definition: MultiJetMetFilter.py:71
python.MultiJetMetFilter.MultiJetMetFilter.cutMetMin
cutMetMin
Definition: MultiJetMetFilter.py:38
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
python.MultiJetMetFilter.MultiJetMetFilter.cutsEtMin
cutsEtMin
Definition: MultiJetMetFilter.py:33
python.MultiJetMetFilter.MultiJetMetFilter.initialize
def initialize(self)
Definition: MultiJetMetFilter.py:43
python.MultiJetMetFilter.MultiJetMetFilter.passAll
passAll
Definition: MultiJetMetFilter.py:39
python.MultiJetMetFilter.MultiJetMetFilter.nProcessed
nProcessed
Definition: MultiJetMetFilter.py:57
error
Definition: IImpactPoint3dEstimator.h:70
python.MultiJetMetFilter.MultiJetMetFilter.nEventPassJet
nEventPassJet
Definition: MultiJetMetFilter.py:59
readCCLHist.float
float
Definition: readCCLHist.py:83
python.MultiJetMetFilter.MultiJetMetFilter.metCollectionType
metCollectionType
Definition: MultiJetMetFilter.py:36