ATLAS Offline Software
MuonSegmentFilter.py
Go to the documentation of this file.
1 # Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
2 
3 
12 
13 __doc__ = """This is a short algorithm to select events that contain one
14 muon which fulfills a certain set of criteria.
15 """
16 __version__ = "0.0.1"
17 __author__ = "David Lopez Mateos <David.Lopez@cern.ch>"
18 
19 
20 import AthenaPython.PyAthena as PyAthena
21 from AthenaPython.PyAthena import StatusCode
22 
23 class MuonSegmentFilter( PyAthena.AthFilterAlgorithm ):
24  """
25  This class is a short algorithm to select events that contain some
26  number of muon segments (probably zero).
27  """
28 
29 
30 
31  def __init__ ( self, name = "MuonSegmentFilter", **kw ):
32 
33  kw['name'] = name
34  super(MuonSegmentFilter, self).__init__(**kw)
35 
36 
37  self.muonSegmentContainerName = kw.get('muonSegmentContainers', "MooreSegments")
38  self.muonSegmentContainerType = kw.get('muonSegmentContainerType', "Trk::SegmentCollection")
39  self.passAll = kw.get('passAll', False)
40  self.minNumberSegments = kw.get('minNumberSegments', 0)
41  self.maxNumberSegments = kw.get('maxNumberSegments', 0)
42 
43  #handle to storegate
44  self.sgSvc = None
45  self.containerNames = []
46 
47  return
48 
49  def initialize(self):
50  self.msg.info( '************************************' )
51  self.msg.info( '===> initialize %s...', self.name() )
52  self.msg.info( 'Will apply the following cuts:' )
53  self.msg.info( 'Minimum number of segments = %r',str(self.minNumberSegments) )
54  self.msg.info( 'Maximum number of segments = %r',str(self.maxNumberSegments) )
55 
56 
57  self.nProcessed = 0
58  self.nMuonSegments = 0
59  self.nEventPassed = 0
60 
61 
62  self.sgSvc = PyAthena.py_svc('StoreGateSvc')
63  if not self.sgSvc :
64  self.msg.error("could not retrieve a handle to the event store !")
65  return StatusCode.Failure
66 
67  return StatusCode.Success
68 
69 
70 
71  def execute(self):
72  self.nProcessed+=1
73  self.msg.debug( '==> execute %s on %r. event...', self.name(), self.nProcessed )
74 
75 
76  if self.passAll :
77  self.msg.debug( '%s event passed because passAll is true', self.name() )
78  self.setFilterPassed(True)
79  return StatusCode.Success
80 
81  _retrieve = self.sgSvc.retrieve
82 
83  try :
84  muSegCollection = _retrieve (self.muonSegmentContainerType, self.muonSegmentContainerName)
85  except LookupError :
86  self.msg.warning('%s container not found in StoreGate ', self.muonSegmentContainerName)
87 
88 
89  if muSegCollection.__len__() >= self.minNumberSegments and \
90  muSegCollection.__len__()<= self.maxNumberSegments :
91  self.nEventPassed += 1
92  self.msg.debug( '%s event passed', self.name() )
93  self.setFilterPassed(True)
94  else :
95  self.msg.debug( '%s event failed', self.name() )
96  self.setFilterPassed(False)
97 
98  return StatusCode.Success
99 
100 
101 
102  def finalize(self):
103 
104  import math
105 
106  effiNumPassed = 0.0
107  effiErrNumPassed = 0.0
108  try :
109  # Efficiencies
110  effiNumPassed = self.nEventPassed / float(self.nProcessed)
111  # Error on efficiencies, use binomial errors
112  effiErrNumPassed = 100.0 * math.sqrt( effiNumPassed*(1.0 - effiNumPassed) / float(self.nProcessed) )
113  effiNumPassed *= 100.0
114 
115  except ZeroDivisionError :
116  self.msg.warning( 'Division by zero error when calculating the uncertainties on the pass efficiencies...' )
117 
118 
119  self.msg.info( '==> finalize %s...', self.name() )
120  self.msg.info( '***************************************************************' )
121  self.msg.info( 'Cut-flow table of %s skimming algorithm:', self.name() )
122  self.msg.info( '-------------' )
123  self.msg.info( ' Number of processed events: %r', self.nProcessed )
124  self.msg.info( ' Events after numberPassed %r and resulting efficiency = (%3.3f +/- %3.3f)%%', self.nEventPassed, effiNumPassed, effiErrNumPassed )
125  self.msg.info( '***************************************************************' )
126 
127  return StatusCode.Success
128 
129 
grepfile.info
info
Definition: grepfile.py:38
python.MuonSegmentFilter.MuonSegmentFilter.maxNumberSegments
maxNumberSegments
Definition: MuonSegmentFilter.py:41
python.MuonSegmentFilter.MuonSegmentFilter.minNumberSegments
minNumberSegments
Definition: MuonSegmentFilter.py:40
python.MuonSegmentFilter.MuonSegmentFilter.nProcessed
nProcessed
Also, declare some counters and initialize them to zero.
Definition: MuonSegmentFilter.py:57
python.MuonSegmentFilter.MuonSegmentFilter
Definition: MuonSegmentFilter.py:23
python.MuonSegmentFilter.MuonSegmentFilter.sgSvc
sgSvc
retrieve a handle to the event store
Definition: MuonSegmentFilter.py:44
python.MuonSegmentFilter.MuonSegmentFilter.finalize
def finalize(self)
Definition: MuonSegmentFilter.py:102
python.MuonSegmentFilter.MuonSegmentFilter.nEventPassed
nEventPassed
Definition: MuonSegmentFilter.py:59
python.MuonSegmentFilter.MuonSegmentFilter.containerNames
containerNames
Definition: MuonSegmentFilter.py:45
python.MuonSegmentFilter.MuonSegmentFilter.initialize
def initialize(self)
Definition: MuonSegmentFilter.py:49
python.MuonSegmentFilter.MuonSegmentFilter.muonSegmentContainerName
muonSegmentContainerName
initialize base class
Definition: MuonSegmentFilter.py:37
python.MuonSegmentFilter.MuonSegmentFilter.execute
def execute(self)
Definition: MuonSegmentFilter.py:71
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
python.MuonSegmentFilter.MuonSegmentFilter.__init__
def __init__(self, name="MuonSegmentFilter", **kw)
Definition: MuonSegmentFilter.py:31
python.MuonSegmentFilter.MuonSegmentFilter.passAll
passAll
Definition: MuonSegmentFilter.py:39
python.MuonSegmentFilter.MuonSegmentFilter.muonSegmentContainerType
muonSegmentContainerType
Definition: MuonSegmentFilter.py:38
str
Definition: BTagTrackIpAccessor.cxx:11
python.MuonSegmentFilter.MuonSegmentFilter.nMuonSegments
nMuonSegments
Definition: MuonSegmentFilter.py:58
error
Definition: IImpactPoint3dEstimator.h:70
readCCLHist.float
float
Definition: readCCLHist.py:83