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.
23 __author__ =
"Ulla Blumenschein <Ulla.Blumenschein@cern.ch>"
24 __author__ =
"Karsten Koeneke <karsten.koeneke@cern.ch>"
27 import AthenaPython.PyAthena
as PyAthena
28 from AthenaPython.PyAthena
import StatusCode
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
44 requireMet = True # What to do in case the MET container can't be retrieved
50 def __init__ ( self, name = "MissingEtFilter", **kw ):
53 super(MissingEtFilter, self).
__init__(**kw)
82 self.msg.
info(
'************************************' )
83 self.msg.
info(
'==> initialize %s...', self.name() )
86 self.msg.
info(
'Will apply the following cuts:' )
91 self.msg.
info(
'************************************' )
97 self.msg.
error(
"Problem retrieving StoreGateSvc pointer !!")
98 return StatusCode.Failure
102 import PyUtils.RootUtils
as ru
103 ROOT = ru.import_root()
110 self.
jss = PyAthena.SignalStateHelper(PyAthena.P4SignalState.JETFINAL)
113 import FourMomUtils.Bindings
114 self.
utils = {
'deltaR' : PyAthena.P4Helpers.deltaR ,
115 'deltaEta' : PyAthena.P4Helpers.deltaEta ,
116 'deltaPhi' : PyAthena.P4Helpers.deltaPhi }
119 return StatusCode.Success
129 self.msg.
debug(
'==> execute %s on %r. event...', self.name(), self.
nProcessed )
134 self.msg.
debug(
'%s event passed because passAll is true', self.name() )
135 self.setFilterPassed(
True)
136 return StatusCode.Success
147 self.setFilterPassed(
False)
149 self.setFilterPassed(
True)
151 return StatusCode.Success
164 self.msg.
debug(
'Loading the jet collection %s from the input file.',
178 self.msg.
error(
'List of jets type %s and key %s has different lenght!',
185 self.
jss.setSignalState( PyAthena.P4SignalState.UNCALIBRATED)
195 controlObject = self.
jss.controlObject
196 releaseObject = self.
jss.releaseObject
199 if jet.et() > leadJetEt :
242 if PassMet
and PassDeltaPhi :
243 self.msg.
debug(
'%s event passed ', self.name() )
244 self.setFilterPassed(
True)
246 self.msg.
debug(
'%s event failed ', self.name() )
247 self.setFilterPassed(
False)
250 return StatusCode.Success
269 efferrPassMet = 100.0*math.sqrt(effPassMet*(1.-effPassMet)/
float(self.
nProcessed))
270 efferrDeltaPhi = 100.0*math.sqrt(effDeltaPhi*(1.-effDeltaPhi)/
float(self.
nProcessed))
275 except ZeroDivisionError :
276 self.msg.warning(
'Division by zero error when calculating the uncertainties on the pass efficiencies...' )
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)%%',
287 self.msg.
info(
' Events after deltaPhi cut: %r, efficiency = (%3.3f +/- %3.3f)%%',
289 self.msg.
info(
'***************************************************************' )
291 return StatusCode.Success