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