ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
MuonSpectrometer
MuonValidation
MuonDQA
MuonRawDataMonitoring
RpcRawDataMonitoring
python
GetLBInfoFromCOOL.py
Go to the documentation of this file.
1
#
2
#Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3
#
4
5
from
PyCool
import
cool
6
from
CoolConvUtilities.AtlCoolLib
import
indirectOpen
7
8
class
LumiBlock
:
9
def
__init__
(self, cool_obj):
10
11
self.
run
, self.
lb
=
getRunLBFromObj
(cool_obj)
12
13
self.
start_time
= cool_obj.payload()[
'StartTime'
]
14
self.
end_time
= cool_obj.payload()[
'EndTime'
]
15
self.
key_since
= cool_obj.since()
16
self.
key_until
= cool_obj.until()
17
18
self.
inst_lumi_valid
=
None
19
self.
inst_lumi_algid
=
None
20
self.
inst_lumi_offline
=
None
21
22
self.
is_atlas_physics
=
None
23
self.
is_stable_beams
=
None
24
self.
l1_live_fraction
=
None
25
26
self.
beam1_intensity
= -1.0
27
self.
beam2_intensity
= -1.0
28
29
def
ReadLumiInfo
(self, cool_obj):
30
self.
inst_lumi
= cool_obj.payload()[
'LBAvInstLumi'
]
31
self.
inst_lumi_valid
= cool_obj.payload()[
'Valid'
]
32
self.
inst_lumi_algid
= cool_obj.payload()[
'AlgorithmID'
]
33
34
def
ReadPhysicsLumiInfo
(self, payload):
35
if
self.
is_atlas_physics
is
not
None
:
36
raise
Exception(
'ReadPhysicsLumiInfo - duplicate lb=%d'
,self.
lb
)
37
38
self.
is_atlas_physics
= payload[
'AtlasPhysics'
]
39
self.
is_stable_beams
= payload[
'StableBeams'
]
40
self.
l1_live_fraction
= payload[
'LiveFraction'
]
41
self.
beam1_intensity
= payload[
'Beam1Intensity'
]
42
self.
beam2_intensity
= payload[
'Beam2Intensity'
]
43
self.
inst_lumi_offline
= payload[
'InstLumiAll'
]
44
self.
inst_lumi_offline_algid
= payload[
'AlgorithmID'
]
45
46
def
GetLBSecs
(self):
47
if
not
(self.
end_time
> self.
start_time
):
48
raise
Exception(
'GetLBSecs - invalid start/end times'
)
49
return
(self.
end_time
- self.
start_time
)*1.0e-9
50
51
def
GetInstLumi
(self):
52
if
self.
inst_lumi_valid
== 0:
53
return
self.
inst_lumi
54
55
return
0.0
56
57
def
GetIntLumi
(self):
58
if
self.
inst_lumi_valid
== 0:
59
return
self.
inst_lumi
*self.
GetLBSecs
()
60
61
return
0.0
62
63
#==================================================================================================================
64
class
Run
:
65
def
__init__
(self, run_number, lbs):
66
self.
run_number
= run_number
67
self.
lbs
= lbs
68
self.
lb_first
=
None
69
self.
lb_last
=
None
70
71
self.
int_lumi
= 0
72
self.
peak_inst_lumi
= 0.0
73
74
for
lb
in
lbs:
75
self.
peak_inst_lumi
=
max
([self.
peak_inst_lumi
, lb.GetInstLumi()])
76
77
self.
int_lumi
+= lb.GetIntLumi()
78
79
if
self.
lb_first
is
None
:
80
self.
lb_first
= lb
81
self.
lb_last
= lb
82
else
:
83
if
lb.lb < self.
lb_first
.lb: self.
lb_first
= lb
84
if
lb.lb > self.
lb_last
.lb: self.
lb_last
= lb
85
86
def
GetRunStartTime
(self):
87
return
self.
lb_first
.start_time
88
89
def
GetRunEndTime
(self):
90
return
self.
lb_last
.end_time
91
92
def
GetIntLumiInvPB
(self):
93
return
self.
int_lumi
*1.0e-6
94
95
def
GetPeakInstLumi
(self):
96
return
self.
peak_inst_lumi
97
98
def
AsStr
(self):
99
ip = (
'%.0f'
,(self.
GetPeakInstLumi
())).rjust(5)
100
il = (
'%.3f'
,(self.
GetIntLumiInvPB
())).rjust(8)
101
102
s =
'Run %s peak lumi=%s int lumi=%s'
,(self.
run_number
, ip, il)
103
104
return
s
105
106
107
#==================================================================================================================
108
def
getRunLBFromObj
(obj):
109
run = (obj.since() >> 32)
110
lb = (obj.since() & 0xffff)
111
return
(run, lb)
112
113
#==================================================================================================================
114
def
getRunLB
(beg_run, end_run,dbObj):
115
print
(
'INFO::getRunLB - will search for ATLAS runs in the following range:'
)
116
print
(
'INFO:: beg run: '
,(beg_run))
117
print
(
'INFO:: end run: '
,(end_run))
118
119
f=dbObj.getFolder(
'/TRIGGER/LUMI/LBLB'
)
120
fit = f.browseObjects(beg_run << 32, end_run << 32, cool.ChannelSelection.all())
121
122
runs = {}
123
124
while
fit.goToNext():
125
lb =
LumiBlock
(fit.currentRef())
126
127
try
:
128
runs[lb.run]
129
except
KeyError:
130
runs[lb.run] = {}
131
132
runs[lb.run][lb.lb] = lb
133
134
print
(
'INFO::getRunLB - found '
, len(runs),
' ATLAS runs'
)
135
136
return
runs
137
138
#==================================================================================================================
139
def
getRunOnlineLumi
(runs,dbObj):
140
141
print
(
'INFO::getRunOnlineLumi - will read online luminosity for '
, len(runs),
' ATLAS runs'
)
142
143
f= dbObj.getFolder(
'/TRIGGER/LUMI/OnlPrefLumi'
)
144
icount = 0
145
146
for
run_, lbs
in
runs.items():
147
148
fit = f.browseObjects(run_ << 32, (run_ << 32) + 100000, cool.ChannelSelection(0))
149
150
while
fit.goToNext():
151
obj = fit.currentRef()
152
153
run = (obj.since() >> 32)
154
lb = (obj.since() & 0xffff)
155
156
if
run != run_:
157
raise
Exception(
'getRunOnlineLumi - logic error: run='
, run,
', run_='
, run_)
158
159
if
lb == 0:
160
continue
161
162
try
:
163
lblock = lbs[lb]
164
except
KeyError:
165
print
(
'WANRING::getRunOnlineLumi - failed to find LumiBlock for run, lb: '
, run, lb)
166
continue
167
168
lblock.ReadLumiInfo(obj)
169
170
icount += 1
171
172
#==================================================================================================================
173
def
GetLumiInfoDic
(beg_run, end_run):
174
dbInst=indirectOpen(
"COOLONL_TRIGGER/CONDBR2"
)
175
176
collect_runs =
getRunLB
(beg_run, end_run,dbInst)
177
physics_runs = []
178
179
getRunOnlineLumi
(collect_runs,dbInst)
180
physics_runs = [
Run
(run, lbs.values())
for
run,lbs
in
collect_runs.items()]
181
182
dbInst.closeDatabase()
183
184
if
len(physics_runs) == 0:
185
print
(
'WARNING::Found 0 physics runs'
)
186
return
187
188
physics_runs.sort(key =
lambda
x: x.run_number)
189
190
oflDb=indirectOpen(
'COOLOFL_TRIGGER/CONDBR2'
)
191
192
RunsLumiDic = {}
193
for
run
in
physics_runs:
194
LumiDic = {}
195
196
key_since = run.GetRunStartTime() - 100000
197
key_until = run.GetRunEndTime() + 100000
198
199
f = oflDb.getFolder(
'/TRIGGER/OFLLUMI/LumiAccounting'
)
200
taglist=f.listTags()
201
filledTags = {}
202
for
tag
in
taglist:
203
objs = f.browseObjects(key_since, key_until, cool.ChannelSelection.all(), tag)
204
if
len(objs) != 0:
205
filledTags[tag] = len(objs)
206
207
if
len(filledTags) == 0:
208
print
(
"ERROR: no filled tag"
)
209
return
210
elif
len(filledTags) > 1:
211
print
(
"WARNING: the number filled tags is more than 1"
)
212
213
filledTags = sorted(filledTags.items(),key=
lambda
x:x[1],reverse=
True
)
214
objs = f.browseObjects(key_since, key_until, cool.ChannelSelection.all(), filledTags[0][0])
215
icount = 0
216
for
obj
in
objs:
217
crun = obj.payload()[
'Run'
]
218
clb = obj.payload()[
'LumiBlock'
]
219
220
if
crun != run.run_number:
221
continue
222
223
for
lb
in
run.lbs:
224
if
lb.lb == clb:
225
lb.ReadPhysicsLumiInfo(obj.payload())
226
icount += 1
227
break
228
229
i_LB = obj.payload()[
'LumiBlock'
]
230
LumiDic[i_LB] = {
231
'AtlasPhysics'
: obj.payload()[
'AtlasPhysics'
],
232
'InstLumi'
: obj.payload()[
'InstLumi'
]/10000.,
233
'LiveFraction'
: obj.payload()[
'LiveFraction'
],
234
'Duration'
: lb.GetLBSecs(),
235
'start_time'
: lb.start_time,
236
'end_time'
: lb.end_time
237
}
238
239
if
len(run.lbs) != icount:
240
print
(
'WARNING::getRunPhysicsLumi - number of missed lbs=%d'
,(len(run.lbs) - icount))
241
print
(
'WARNING:: number of run lbs=%d'
,(len(run.lbs)))
242
print
(
'WARNING:: number of matched lbs=%d'
,(icount))
243
244
RunsLumiDic = LumiDic
245
246
oflDb.closeDatabase()
247
return
RunsLumiDic
248
249
#==================================================================================================================
250
def
printLumiInfo
(RunsLumiDic):
251
# for run, lumiDic in RunsLumiDic.items():
252
for
lb, lumiInfo
in
RunsLumiDic.items():
253
# s = 'Run %d lb=%4d - AtlasPhysics=%d, InstLumi=%f, LiveFraction=%f, Duration=%f' %(
254
# run,
255
s =
'lb=%4d - AtlasPhysics=%d, InstLumi=%f, LiveFraction=%f, Duration=%f'
%(
256
lb,
257
lumiInfo[
'AtlasPhysics'
],
258
lumiInfo[
'InstLumi'
],
259
lumiInfo[
'LiveFraction'
],
260
lumiInfo[
'Duration'
]
261
)
262
263
print
(s)
264
265
#==================================================================================================================
266
if
__name__ ==
'__main__'
:
267
print
(
"GetRunInfoFromCOOL: Hello, World !"
)
print
void print(char *figname, TCanvas *c1)
Definition
TRTCalib_StrawStatusPlots.cxx:26
max
#define max(a, b)
Definition
cfImp.cxx:41
GetLBInfoFromCOOL.LumiBlock
Definition
GetLBInfoFromCOOL.py:8
GetLBInfoFromCOOL.LumiBlock.start_time
start_time
Definition
GetLBInfoFromCOOL.py:13
GetLBInfoFromCOOL.LumiBlock.inst_lumi_offline_algid
inst_lumi_offline_algid
Definition
GetLBInfoFromCOOL.py:44
GetLBInfoFromCOOL.LumiBlock.end_time
end_time
Definition
GetLBInfoFromCOOL.py:14
GetLBInfoFromCOOL.LumiBlock.__init__
__init__(self, cool_obj)
Definition
GetLBInfoFromCOOL.py:9
GetLBInfoFromCOOL.LumiBlock.is_stable_beams
is_stable_beams
Definition
GetLBInfoFromCOOL.py:23
GetLBInfoFromCOOL.LumiBlock.is_atlas_physics
is_atlas_physics
Definition
GetLBInfoFromCOOL.py:22
GetLBInfoFromCOOL.LumiBlock.GetInstLumi
GetInstLumi(self)
Definition
GetLBInfoFromCOOL.py:51
GetLBInfoFromCOOL.LumiBlock.inst_lumi
inst_lumi
Definition
GetLBInfoFromCOOL.py:30
GetLBInfoFromCOOL.LumiBlock.ReadLumiInfo
ReadLumiInfo(self, cool_obj)
Definition
GetLBInfoFromCOOL.py:29
GetLBInfoFromCOOL.LumiBlock.inst_lumi_algid
inst_lumi_algid
Definition
GetLBInfoFromCOOL.py:19
GetLBInfoFromCOOL.LumiBlock.l1_live_fraction
l1_live_fraction
Definition
GetLBInfoFromCOOL.py:24
GetLBInfoFromCOOL.LumiBlock.key_since
key_since
Definition
GetLBInfoFromCOOL.py:15
GetLBInfoFromCOOL.LumiBlock.run
run
Definition
GetLBInfoFromCOOL.py:11
GetLBInfoFromCOOL.LumiBlock.GetIntLumi
GetIntLumi(self)
Definition
GetLBInfoFromCOOL.py:57
GetLBInfoFromCOOL.LumiBlock.key_until
key_until
Definition
GetLBInfoFromCOOL.py:16
GetLBInfoFromCOOL.LumiBlock.lb
lb
Definition
GetLBInfoFromCOOL.py:11
GetLBInfoFromCOOL.LumiBlock.inst_lumi_offline
inst_lumi_offline
Definition
GetLBInfoFromCOOL.py:20
GetLBInfoFromCOOL.LumiBlock.inst_lumi_valid
int inst_lumi_valid
Definition
GetLBInfoFromCOOL.py:18
GetLBInfoFromCOOL.LumiBlock.ReadPhysicsLumiInfo
ReadPhysicsLumiInfo(self, payload)
Definition
GetLBInfoFromCOOL.py:34
GetLBInfoFromCOOL.LumiBlock.beam2_intensity
float beam2_intensity
Definition
GetLBInfoFromCOOL.py:27
GetLBInfoFromCOOL.LumiBlock.GetLBSecs
GetLBSecs(self)
Definition
GetLBInfoFromCOOL.py:46
GetLBInfoFromCOOL.LumiBlock.beam1_intensity
float beam1_intensity
Definition
GetLBInfoFromCOOL.py:26
GetLBInfoFromCOOL.Run
Definition
GetLBInfoFromCOOL.py:64
GetLBInfoFromCOOL.Run.AsStr
AsStr(self)
Definition
GetLBInfoFromCOOL.py:98
GetLBInfoFromCOOL.Run.peak_inst_lumi
float peak_inst_lumi
Definition
GetLBInfoFromCOOL.py:72
GetLBInfoFromCOOL.Run.int_lumi
int int_lumi
Definition
GetLBInfoFromCOOL.py:71
GetLBInfoFromCOOL.Run.lb_first
lb_first
Definition
GetLBInfoFromCOOL.py:68
GetLBInfoFromCOOL.Run.GetRunEndTime
GetRunEndTime(self)
Definition
GetLBInfoFromCOOL.py:89
GetLBInfoFromCOOL.Run.lbs
lbs
Definition
GetLBInfoFromCOOL.py:67
GetLBInfoFromCOOL.Run.GetRunStartTime
GetRunStartTime(self)
Definition
GetLBInfoFromCOOL.py:86
GetLBInfoFromCOOL.Run.GetPeakInstLumi
GetPeakInstLumi(self)
Definition
GetLBInfoFromCOOL.py:95
GetLBInfoFromCOOL.Run.run_number
run_number
Definition
GetLBInfoFromCOOL.py:66
GetLBInfoFromCOOL.Run.GetIntLumiInvPB
GetIntLumiInvPB(self)
Definition
GetLBInfoFromCOOL.py:92
GetLBInfoFromCOOL.Run.__init__
__init__(self, run_number, lbs)
Definition
GetLBInfoFromCOOL.py:65
GetLBInfoFromCOOL.Run.lb_last
lb_last
Definition
GetLBInfoFromCOOL.py:69
GetLBInfoFromCOOL.printLumiInfo
printLumiInfo(RunsLumiDic)
Definition
GetLBInfoFromCOOL.py:250
GetLBInfoFromCOOL.getRunLB
getRunLB(beg_run, end_run, dbObj)
Definition
GetLBInfoFromCOOL.py:114
GetLBInfoFromCOOL.getRunLBFromObj
getRunLBFromObj(obj)
Definition
GetLBInfoFromCOOL.py:108
GetLBInfoFromCOOL.getRunOnlineLumi
getRunOnlineLumi(runs, dbObj)
Definition
GetLBInfoFromCOOL.py:139
GetLBInfoFromCOOL.GetLumiInfoDic
GetLumiInfoDic(beg_run, end_run)
Definition
GetLBInfoFromCOOL.py:173
Generated on
for ATLAS Offline Software by
1.17.0