ATLAS Offline Software
Loading...
Searching...
No Matches
TriggerEnums.py
Go to the documentation of this file.
1# Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2
3__author__ = 'Javier Montejo'
4__version__="$Revision: 2.0 $"
5__doc__="Enumerations for trigger types and periods"
6
7from enum import IntEnum
8
9class TriggerType(IntEnum):
10 el_single = 1 << 0
11 el_multi = 1 << 1
12 mu_single = 1 << 2
13 mu_multi = 1 << 3
14 j_single = 1 << 4
15 j_multi = 1 << 5
16 bj_single = 1 << 6
17 bj_multi = 1 << 7
18 tau_single = 1 << 8
19 tau_multi = 1 << 9
20 g_single = 1 << 10
21 g_multi = 1 << 11
22 xe = 1 << 12
23 ht = 1 << 13
24 mu_bphys = 1 << 14
25 exotics = 1 << 15
26 afp = 1 << 16
27
28 el = el_single | el_multi
29 mu = mu_single | mu_multi
30 j = j_single | j_multi
31 bj = bj_single | bj_multi
32 tau = tau_single| tau_multi
33 g = g_single | g_multi
34
35 ALL = el | mu | j | bj | tau | g | xe | ht | mu_bphys | exotics | afp
36 UNDEFINED = 0
37
38 @classmethod
39 def toStr(cls, val):
40 out = []
41 for e in cls:
42 if val == e.value: return e.name # perfect matches returned as-is
43 if bin(e.value).count('1')!=1: continue # will only express in terms of fundamental types
44 if e.value & val: out += [e.name]
45 if not out: return "undefined"
46 return "|".join(out)
47
48
49class TriggerPeriod(IntEnum):
50 customGRL = 0
51 y2015 = 1 << 0
52 y2016periodA = 1 << 1
53 y2016periodBD3 = 1 << 2
54 y2016periodD4plus = 1 << 3
55 y2017periodB1 = 1 << 4
56 y2017periodB2B4 = 1 << 5
57 y2017periodB5B7 = 1 << 6
58 y2017periodB8 = 1 << 7
59 y2017periodC = 1 << 8
60 y2017periodD1D5 = 1 << 9
61 y2017periodD6 = 1 << 10
62 y2017periodEF = 1 << 11
63 y2017periodGHIK = 1 << 12
64 y2017lowmu = 1 << 13
65 y2018periodBE = 1 << 14
66 y2018periodFI = 1 << 15
67 y2018lowmu = 1 << 16
68 y2018periodKQ = 1 << 17
69
70 runNumber = 1 << 18 #Can't get higher than this, enters the run number domain
71 future1p8e34 = 1 << 19
72 future2e34 = 1 << 20
73
74 y2017periodB = y2017periodB1 | y2017periodB2B4 | y2017periodB5B7 | y2017periodB8
75 y2017periodD = y2017periodD1D5 | y2017periodD6
76 y2017periodAll = y2017periodB | y2017periodC | y2017periodD | y2017periodEF | y2017periodGHIK #low-mu period is not considered
77 y2018 = y2018periodBE | y2018periodFI | y2018periodKQ #low-mu period is not considered
78 y2017 = y2017periodAll
79 y2016 = y2016periodA | y2016periodBD3 | y2016periodD4plus
80 future = future1p8e34 | future2e34
81
82 def isBasePeriod(self):
83 return TriggerPeriod.isRunNumber(self) or all([self & x == 0 or self & x == self for x in TriggerPeriod])
84
85 @classmethod
86 def isRunNumber(cls, number):
87 try:
88 number = int(number)
89 except ValueError:
90 return False
91 return (number==0 or (number > TriggerPeriod.runNumber and number < TriggerPeriod.runNumber*2))
92
93 @classmethod
94 def basePeriods(cls):
95 return [x for x in TriggerPeriod if x.isBasePeriod()]
96
97 @classmethod
98 def toName(cls, p):
99 return p if TriggerPeriod.isRunNumber(p) else p.name
100
101 @classmethod
102 def fromName(cls, p):
103 return p if TriggerPeriod.isRunNumber(p) else TriggerPeriod[p]
104
106 ''' List of LBs to be skipped.
107 Usually due to accidental prescales that will be taken into account in future GRLs or via reduced luminosity.
108 Users can modify this if needed, but hopefully there is no need ;)
109 '''
110 # Run number: [(LB start, LB end), ...] both inclusive
111 exceptions = {
112 276262: [(72 , 75 )], #toroid off keys
113 281317: [(116, 118)], #toroid off keys
114 299055: [(650, 700)], #Toroid was going down, turned muons off
115 301932: [(233, 234)], #Accidentaly moved to MuScan prescales
116 302831: [(4 , 10 )], #toroid off keys
117 336506: [(212, 260)], #Regular muscan but the defect is not in sync with the switch of keys
118 341294: [(137, 156)], #Standby keys
119 355650: [(117, 117)], #Last LB of emittance scan
120 357283: [(117, 117)], #Last LB of emittance scan
121 359623: [(129, 129)], #Last LB of emittance scan
122 }
123
125 ''' Pairs of triggers that have been renamed at some point
126 The code will complete each other so that each contains
127 luminosity of both
128 Assumes that they are orthogonal, i.e. they haven't run both at the same time
129 '''
130 pairs = [
131 ("HLT_mu20_mu8noL1_e9_lhvloose_nod0","HLT_e9_lhvloose_nod0_mu20_mu8noL1"),
132 ("HLT_mu20_mu8noL1_e9_lhvloose_nod0_L1EM8VH_MU20","HLT_e9_lhvloose_nod0_mu20_mu8noL1_L1EM8VH_MU20"),
133 ("HLT_mu20_mu8noL1_e9_lhvloose_nod0_L1EM7_MU20","HLT_e9_lhvloose_nod0_mu20_mu8noL1_L1EM7_MU20"),
134 ]
135
136if __name__ == "__main__":
137 from AthenaCommon.Logging import logging
138 log = logging.getLogger(__name__)
139 log.info(TriggerPeriod.y2015.isBasePeriod() )
140 log.info(TriggerPeriod.y2017.isBasePeriod() )
141 log.info(TriggerPeriod.basePeriods() )
int count(std::string s, const std::string &regx)
count how many occurances of a regx are in a string
Definition hcg.cxx:146