ATLAS Offline Software
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 #==================================================================================================================
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 !")
DerivationFramework::TriggerMatchingUtils::sorted
std::vector< typename R::value_type > sorted(const R &r, PROJ proj={})
Helper function to create a sorted vector from an unsorted range.
GetLBInfoFromCOOL.Run.AsStr
def AsStr(self)
Definition: GetLBInfoFromCOOL.py:98
GetLBInfoFromCOOL.getRunOnlineLumi
def getRunOnlineLumi(runs, dbObj)
Definition: GetLBInfoFromCOOL.py:139
GetLBInfoFromCOOL.LumiBlock.ReadPhysicsLumiInfo
def ReadPhysicsLumiInfo(self, payload)
Definition: GetLBInfoFromCOOL.py:34
GetLBInfoFromCOOL.LumiBlock.inst_lumi_valid
inst_lumi_valid
Definition: GetLBInfoFromCOOL.py:18
GetLBInfoFromCOOL.LumiBlock.key_until
key_until
Definition: GetLBInfoFromCOOL.py:16
GetLBInfoFromCOOL.LumiBlock.start_time
start_time
Definition: GetLBInfoFromCOOL.py:13
GetLBInfoFromCOOL.Run.GetRunStartTime
def GetRunStartTime(self)
Definition: GetLBInfoFromCOOL.py:86
GetLBInfoFromCOOL.Run
Definition: GetLBInfoFromCOOL.py:64
GetLBInfoFromCOOL.Run.int_lumi
int_lumi
Definition: GetLBInfoFromCOOL.py:71
GetLBInfoFromCOOL.Run.lb_last
lb_last
Definition: GetLBInfoFromCOOL.py:69
GetLBInfoFromCOOL.LumiBlock.key_since
key_since
Definition: GetLBInfoFromCOOL.py:15
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
GetLBInfoFromCOOL.LumiBlock.inst_lumi_offline
inst_lumi_offline
Definition: GetLBInfoFromCOOL.py:20
GetLBInfoFromCOOL.Run.lbs
lbs
Definition: GetLBInfoFromCOOL.py:67
GetLBInfoFromCOOL.LumiBlock.GetLBSecs
def GetLBSecs(self)
Definition: GetLBInfoFromCOOL.py:46
GetLBInfoFromCOOL.Run.GetIntLumiInvPB
def GetIntLumiInvPB(self)
Definition: GetLBInfoFromCOOL.py:92
GetLBInfoFromCOOL.Run.GetRunEndTime
def GetRunEndTime(self)
Definition: GetLBInfoFromCOOL.py:89
GetLBInfoFromCOOL.LumiBlock.inst_lumi_algid
inst_lumi_algid
Definition: GetLBInfoFromCOOL.py:19
GetLBInfoFromCOOL.LumiBlock.ReadLumiInfo
def ReadLumiInfo(self, cool_obj)
Definition: GetLBInfoFromCOOL.py:29
GetLBInfoFromCOOL.LumiBlock.lb
lb
Definition: GetLBInfoFromCOOL.py:11
GetLBInfoFromCOOL.getRunLB
def getRunLB(beg_run, end_run, dbObj)
Definition: GetLBInfoFromCOOL.py:114
GetLBInfoFromCOOL.LumiBlock.is_atlas_physics
is_atlas_physics
Definition: GetLBInfoFromCOOL.py:22
GetLBInfoFromCOOL.GetLumiInfoDic
def GetLumiInfoDic(beg_run, end_run)
Definition: GetLBInfoFromCOOL.py:173
GetLBInfoFromCOOL.LumiBlock.inst_lumi_offline_algid
inst_lumi_offline_algid
Definition: GetLBInfoFromCOOL.py:44
GetLBInfoFromCOOL.getRunLBFromObj
def getRunLBFromObj(obj)
Definition: GetLBInfoFromCOOL.py:108
GetLBInfoFromCOOL.printLumiInfo
def printLumiInfo(RunsLumiDic)
Definition: GetLBInfoFromCOOL.py:250
GetLBInfoFromCOOL.LumiBlock.__init__
def __init__(self, cool_obj)
Definition: GetLBInfoFromCOOL.py:9
GetLBInfoFromCOOL.LumiBlock
Definition: GetLBInfoFromCOOL.py:8
GetLBInfoFromCOOL.LumiBlock.l1_live_fraction
l1_live_fraction
Definition: GetLBInfoFromCOOL.py:24
GetLBInfoFromCOOL.Run.run_number
run_number
Definition: GetLBInfoFromCOOL.py:66
GetLBInfoFromCOOL.LumiBlock.is_stable_beams
is_stable_beams
Definition: GetLBInfoFromCOOL.py:23
print
void print(char *figname, TCanvas *c1)
Definition: TRTCalib_StrawStatusPlots.cxx:25
GetLBInfoFromCOOL.LumiBlock.end_time
end_time
Definition: GetLBInfoFromCOOL.py:14
GetLBInfoFromCOOL.LumiBlock.inst_lumi
inst_lumi
Definition: GetLBInfoFromCOOL.py:30
GetLBInfoFromCOOL.Run.GetPeakInstLumi
def GetPeakInstLumi(self)
Definition: GetLBInfoFromCOOL.py:95
GetLBInfoFromCOOL.LumiBlock.GetIntLumi
def GetIntLumi(self)
Definition: GetLBInfoFromCOOL.py:57
GetLBInfoFromCOOL.LumiBlock.beam1_intensity
beam1_intensity
Definition: GetLBInfoFromCOOL.py:26
GetLBInfoFromCOOL.LumiBlock.beam2_intensity
beam2_intensity
Definition: GetLBInfoFromCOOL.py:27
GetLBInfoFromCOOL.Run.peak_inst_lumi
peak_inst_lumi
Definition: GetLBInfoFromCOOL.py:72
GetLBInfoFromCOOL.LumiBlock.GetInstLumi
def GetInstLumi(self)
Definition: GetLBInfoFromCOOL.py:51
GetLBInfoFromCOOL.Run.lb_first
lb_first
Definition: GetLBInfoFromCOOL.py:68
python.AtlCoolLib.indirectOpen
def indirectOpen(coolstr, readOnly=True, debug=False)
Definition: AtlCoolLib.py:129
GetLBInfoFromCOOL.Run.__init__
def __init__(self, run_number, lbs)
Definition: GetLBInfoFromCOOL.py:65