13 __doc__ =
"""This is a short algorithm to select events that contain one
14 electron which fulfills a certain set of criteria.
17 __author__ =
"Karsten Koeneke <karsten.koeneke@desy.de>"
20 import AthenaPython.PyAthena
as PyAthena
21 from AthenaPython.PyAthena
import StatusCode
23 from PrimaryDPDMaker
import PrimaryDPDHelpers
30 This class is a short algorithm to select events that contain one
31 electron which fulfills a certain set of criteria. The possible
32 criteria are (with default values):
33 cutEtMin = 20.0*Units.GeV)
34 cutIsEM = 'None' # Possible values: 'None', 'Loose', 'Medium', 'Tight', 'TightNoIsolation'
35 cutAuthor = 'either' # Possible values: 'softe', 'egamma', 'either'
37 removeEtaCrack = False
46 def __init__ ( self, name = "ElectronFilter", **kw ):
49 super(ElectronFilter, self).
__init__(**kw)
55 self.
cutEtMin = kw.get(
'cutEtMin', 20.0*Units.GeV)
73 self.msg.
info(
'************************************' )
74 self.msg.
info(
'==> initialize %s...', self.name() )
75 self.msg.
info(
'Will apply the following cuts:' )
85 self.msg.
info(
'************************************' )
97 import PyUtils.RootUtils
as ru
98 ROOT = ru.import_root()
103 self.msg.
error(
"Problem retrieving StoreGateSvc pointer !!")
104 return StatusCode.Failure
106 return StatusCode.Success
113 self.msg.
debug(
'==> execute %s on %r. event...', self.name(), self.
nProcessed )
123 goodElectrons = PyAthena.ElectronContainer(VIEW_ELEMENTS)
129 self.msg.
debug(
'%s event passed because passAll is true', self.name() )
130 self.setFilterPassed(
True)
131 return StatusCode.Success
142 self.setFilterPassed(
True)
143 return StatusCode.Success
146 for electron
in electronCollection :
150 cluster = electron.cluster()
152 self.msg.warning(
'Could not get the cluster for this electron!' )
155 if abs(cluster.etaBE(2)) < self.
cutEtaMax :
166 if PrimaryDPDHelpers.checkEgammaAuthor( electron, self.
cutAuthor ) :
169 if PrimaryDPDHelpers.checkElectronIsEM( electron, self.
cutIsEM ):
172 goodElectrons.push_back( electron )
203 self.msg.
debug(
'%s event passed.', self.name() )
204 self.setFilterPassed(
True)
207 self.msg.
debug(
'%s event failed.', self.name() )
208 self.setFilterPassed(
False)
211 return StatusCode.Success
223 effiElPassAuthor = 0.0
225 effiMinNumPassed = 0.0
226 effiErrElectrons = 0.0
227 effiErrElPassEta = 0.0
228 effiErrElPassEt = 0.0
229 effiErrElPassAuthor = 0.0
230 effiErrElPassIsEM = 0.0
231 effiErrMinNumPassed = 0.0
243 effiErrElPassEta = 100.0 * math.sqrt( effiElPassEta*(1.0 - effiElPassEta) /
float(self.
nProcessed) )
244 effiErrElPassEt = 100.0 * math.sqrt( effiElPassEt*(1.0 - effiElPassEt) /
float(self.
nProcessed) )
245 effiErrElPassAuthor = 100.0 * math.sqrt( effiElPassAuthor*(1.0 - effiElPassAuthor) /
float(self.
nProcessed) )
246 effiErrElPassIsEM = 100.0 * math.sqrt( effiElPassIsEM*(1.0 - effiElPassIsEM) /
float(self.
nProcessed) )
247 effiErrMinNumPassed = 100.0 * math.sqrt( effiMinNumPassed*(1.0 - effiMinNumPassed) /
float(self.
nProcessed) )
249 effiElPassEta *= 100.0
250 effiElPassEt *= 100.0
251 effiElPassAuthor *= 100.0
252 effiElPassIsEM *= 100.0
253 effiMinNumPassed *= 100.0
255 except ZeroDivisionError :
256 self.msg.warning(
'Division by zero error when calculating the uncertainties on the pass efficiencies...' )
260 self.msg.
info(
'==> finalize %s...', self.name() )
261 self.msg.
info(
'***************************************************************' )
262 self.msg.
info(
'Cut-flow table of %s skimming algorithm:', self.name() )
263 self.msg.
info(
'-------------' )
264 self.msg.
info(
' Number of processed events: %r', self.
nProcessed )
265 self.msg.
info(
' Number of all electrons: %r and number of electrons per event: %3.3f +/- %3.3f', self.
nElectrons, effiElectrons, effiErrElectrons )
266 self.msg.
info(
' Events after eta cut: %r and resulting efficiency = (%3.3f +/- %3.3f)%%', self.
nEventElPassEta, effiElPassEta, effiErrElPassEta )
267 self.msg.
info(
' Events after E_T cut: %r and resulting efficiency = (%3.3f +/- %3.3f)%%', self.
nEventElPassEt, effiElPassEt, effiErrElPassEt )
268 self.msg.
info(
' Events after author cut: %r and resulting efficiency = (%3.3f +/- %3.3f)%%', self.
nEventElPassAuthor, effiElPassAuthor, effiErrElPassAuthor )
269 self.msg.
info(
' Events after IsEM cut: %r and resulting efficiency = (%3.3f +/- %3.3f)%%', self.
nEventElPassIsEM, effiElPassIsEM, effiErrElPassIsEM )
270 self.msg.
info(
' Events after minNumberPassed %r and resulting efficiency = (%3.3f +/- %3.3f)%%', self.
nEventMinNumPassed, effiMinNumPassed, effiErrMinNumPassed )
271 self.msg.
info(
'***************************************************************' )
273 return StatusCode.Success