ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
Trigger
TrigCost
RatesAnalysis
python
RatesTrigger.py
Go to the documentation of this file.
1
#
2
# Copyright (C) 2002-2020 CERN for the benefit of the ATLAS collaboration
3
#
4
5
'''
6
@file RatesTrigger.py
7
@brief Accumulator class to buffer data for a single trigger and export this to JSON or CSV
8
'''
9
10
import
math
11
from
enum
import
Enum
12
from
AthenaCommon.Logging
import
logging
13
log = logging.getLogger(
'RatesTrigger'
)
14
15
class
RatesBins
(Enum):
16
ACTIVE_RAW_BIN = 1
17
ACTIVE_WEIGHTED_BIN = 2
18
PASS_RAW_BIN = 3
19
PASS_WEIGHTED_OR_BIN = 4
20
PASS_WEIGHTED_AND_BIN = 5
21
EXPRESS_BIN = 6
22
UNIQUE_BIN = 7
23
24
class
RatesTrigger
:
25
def
__init__
(self, name, metadata, data, masterGroup, suffix):
26
self.
name
= name
27
self.
chainName
= self.
name
.removesuffix(suffix)
28
# Total weighted events passing the trigger
29
self.
passWeighted
= data.GetBinContent(RatesBins.PASS_WEIGHTED_OR_BIN.value)
30
self.
passWeightedErr
= data.GetBinError(RatesBins.PASS_WEIGHTED_OR_BIN.value)
31
32
# Total un-weighted events passing the trigger
33
self.
passRaw
= data.GetBinContent(RatesBins.PASS_RAW_BIN.value)
34
35
# Total weighted events passing the trigger, using the express prescale
36
self.
passExpressWeighted
= data.GetBinContent(RatesBins.EXPRESS_BIN.value)
37
self.
passExpressWeightedErr
= data.GetBinError(RatesBins.EXPRESS_BIN.value)
38
39
# Total weighted events passing a full hypothetical menu which *excluded* this trigger
40
self.
passUniqueWeighted
= data.GetBinContent(RatesBins.UNIQUE_BIN.value)
41
self.
passUniqueWeightedErr
= data.GetBinError(RatesBins.UNIQUE_BIN.value)
42
43
# Total weighted events passing the full menu (full L1 for L1 chains, full HLT for HLT chains)
44
self.
passMasterWeighted
= masterGroup.GetBinContent(RatesBins.PASS_WEIGHTED_OR_BIN.value)
45
46
# Total un-weighted number of events in which the trigger was active (always active if L1)
47
self.
activeRaw
= data.GetBinContent(RatesBins.ACTIVE_RAW_BIN.value)
48
49
# Total weighted number of events in which the trigger was active
50
self.
activeWeighted
= data.GetBinContent(RatesBins.ACTIVE_WEIGHTED_BIN.value)
51
self.
activeWeightedErr
= data.GetBinError(RatesBins.ACTIVE_WEIGHTED_BIN.value)
52
53
# Wall-time in seconds. No error on this.
54
self.
rateDenominator
= metadata[
'normalisation'
+suffix]
55
if
not
self.
rateDenominator
:
56
log.error(
"Normalisation factor not found in the input ntuple! Check if it's not corrupted"
)
57
raise
ValueError
58
59
# Trigger's rate is total weighted passing events normalised to wall-time
60
self.
rate
= self.
passWeighted
/ self.
rateDenominator
61
self.
rateErr
= self.
passWeightedErr
/ self.
rateDenominator
62
63
# Trigger's efficiency is the fraction of active events which are passed. Error propagated.
64
self.
efficiency
= self.
passWeighted
/ self.
activeWeighted
if
self.
activeWeighted
> 0.0
else
0.0
65
self.
efficiencyErr
= 0
66
if
self.
passWeighted
!= 0
and
self.
activeWeighted
!= 0:
67
fracErr = math.sqrt( math.pow(self.
passWeightedErr
/self.
passWeighted
,2) + math.pow(self.
activeWeightedErr
/self.
activeWeighted
,2) )
68
self.
efficiencyErr
= self.
efficiency
* fracErr
69
70
# Rate using express prescales
71
self.
rateExpress
= self.
passExpressWeighted
/ self.
rateDenominator
72
self.
rateExpressErr
= self.
passExpressWeightedErr
/ self.
rateDenominator
73
74
# Some menu-derived metadata
75
prescales = metadata[
'prescales'
]
76
77
lowers = metadata[
'lowers'
]
78
express = metadata[
'express'
]
79
80
self.
prescale
= prescales.get(self.
chainName
,1)
81
self.
lower
= lowers.get(self.
chainName
)
82
self.
expressPrescale
= express.get(self.
chainName
)
83
84
# Unique rate requires the subtraction of the (all minus this trigger) total from the (all triggers) total
85
# The error is taken as a fractional error on the main rate calc
86
# Disabled items should have unique rate = 0
87
if
self.
prescale
!=
"Multiple"
and
float(self.
prescale
) <= 0:
88
self.
rateUnique
= 0
89
self.
rateUniqueErr
= 0
90
else
:
91
self.
rateUnique
= (self.
passMasterWeighted
- self.
passUniqueWeighted
) / self.
rateDenominator
92
self.
rateUniqueErr
= 0
93
if
self.
passWeighted
!= 0:
94
self.
rateUniqueErr
= (self.
passWeightedErr
/ self.
passWeighted
) * self.
rateUnique
95
96
# The total rate of all triggers
97
self.
masterRate
= self.
passMasterWeighted
/ self.
rateDenominator
98
99
# What fraction of the total rate is unique to this trigger
100
self.
uniqueFraction
= 0
if
self.
masterRate
== 0
else
self.
rateUnique
/ self.
masterRate
101
102
103
def
export
(self, exportDict):
104
myDict = {}
105
myDict[
'express_stream'
] = self.
rateExpress
106
myDict[
'chain_prescale'
] = self.
prescale
107
myDict[
'lower_chain_name'
] = self.
lower
108
myDict[
'evts_passed'
] = self.
passRaw
109
myDict[
'evts_passed_weighted'
] = self.
passWeighted
110
myDict[
'efficiency'
] = self.
efficiency
111
myDict[
'efficiency_err'
] = self.
efficiencyErr
112
myDict[
'rate'
] = self.
rate
113
myDict[
'rate_err'
] = self.
rateErr
114
myDict[
'unique_fraction'
] = self.
uniqueFraction
115
myDict[
'unique_rate'
] = self.
rateUnique
116
exportDict[self.
name
] = myDict
python.RatesTrigger.RatesBins
Definition
RatesTrigger.py:15
python.RatesTrigger.RatesTrigger
Definition
RatesTrigger.py:24
python.RatesTrigger.RatesTrigger.__init__
__init__(self, name, metadata, data, masterGroup, suffix)
Definition
RatesTrigger.py:25
python.RatesTrigger.RatesTrigger.activeWeightedErr
activeWeightedErr
Definition
RatesTrigger.py:51
python.RatesTrigger.RatesTrigger.rateExpressErr
rateExpressErr
Definition
RatesTrigger.py:72
python.RatesTrigger.RatesTrigger.rateDenominator
rateDenominator
Definition
RatesTrigger.py:54
python.RatesTrigger.RatesTrigger.passMasterWeighted
passMasterWeighted
Definition
RatesTrigger.py:44
python.RatesTrigger.RatesTrigger.rateErr
rateErr
Definition
RatesTrigger.py:61
python.RatesTrigger.RatesTrigger.export
export(self, exportDict)
Definition
RatesTrigger.py:103
python.RatesTrigger.RatesTrigger.passRaw
passRaw
Definition
RatesTrigger.py:33
python.RatesTrigger.RatesTrigger.passWeightedErr
passWeightedErr
Definition
RatesTrigger.py:30
python.RatesTrigger.RatesTrigger.passExpressWeightedErr
passExpressWeightedErr
Definition
RatesTrigger.py:37
python.RatesTrigger.RatesTrigger.lower
lower
Definition
RatesTrigger.py:81
python.RatesTrigger.RatesTrigger.activeRaw
activeRaw
Definition
RatesTrigger.py:47
python.RatesTrigger.RatesTrigger.passUniqueWeightedErr
passUniqueWeightedErr
Definition
RatesTrigger.py:41
python.RatesTrigger.RatesTrigger.passUniqueWeighted
passUniqueWeighted
Definition
RatesTrigger.py:40
python.RatesTrigger.RatesTrigger.name
name
Definition
RatesTrigger.py:26
python.RatesTrigger.RatesTrigger.masterRate
masterRate
Definition
RatesTrigger.py:97
python.RatesTrigger.RatesTrigger.efficiency
float efficiency
Definition
RatesTrigger.py:64
python.RatesTrigger.RatesTrigger.uniqueFraction
int uniqueFraction
Definition
RatesTrigger.py:100
python.RatesTrigger.RatesTrigger.passWeighted
passWeighted
Definition
RatesTrigger.py:29
python.RatesTrigger.RatesTrigger.rateUnique
int rateUnique
Definition
RatesTrigger.py:88
python.RatesTrigger.RatesTrigger.chainName
chainName
Definition
RatesTrigger.py:27
python.RatesTrigger.RatesTrigger.rateExpress
rateExpress
Definition
RatesTrigger.py:71
python.RatesTrigger.RatesTrigger.passExpressWeighted
passExpressWeighted
Definition
RatesTrigger.py:36
python.RatesTrigger.RatesTrigger.efficiencyErr
int efficiencyErr
Definition
RatesTrigger.py:65
python.RatesTrigger.RatesTrigger.rate
rate
Definition
RatesTrigger.py:60
python.RatesTrigger.RatesTrigger.prescale
prescale
Definition
RatesTrigger.py:80
python.RatesTrigger.RatesTrigger.expressPrescale
expressPrescale
Definition
RatesTrigger.py:82
python.RatesTrigger.RatesTrigger.rateUniqueErr
int rateUniqueErr
Definition
RatesTrigger.py:89
python.RatesTrigger.RatesTrigger.activeWeighted
activeWeighted
Definition
RatesTrigger.py:50
Generated on
for ATLAS Offline Software by
1.17.0