15 from functools
import reduce
16 import xml.etree.ElementTree
as et
18 from PyCool
import cool
19 dbSvc = cool.DatabaseSvcFactory.databaseService()
21 from CoolRunQuery.AtlRunQuerySelectorBase
import DataKey
23 THIRTYTWOMASK=
int(2**32-1)
24 SERVER=
'http://atlasdqm.cern.ch:8080'
26 FLAGS_WE_CARE_ABOUT = [
'PIXB',
'PIX0',
'PIXEA',
'PIXEC',
27 'SCTB',
'SCTEA',
'SCTEC',
28 'TRTB',
'TRTEA',
'TRTEC',
'TRTTR'
30 'EMBA',
'EMBC',
'EMECA',
'EMECC',
'HECA',
'HECC',
32 'TILBA',
'TILBC',
'TIEBA',
'TIEBC',
34 'MDTBA',
'MDTBC',
'MDTEA',
'MDTEC',
52 'PIX': [
'PIXB',
'PIX0',
'PIXEA',
'PIXEC'],
53 'SCT': [
'SCTB',
'SCTEA',
'SCTEC'],
54 'TRT': [
'TRTB',
'TRTEA',
'TRTEC',
'TRTTR'],
55 'LAR': [
'EMBA',
'EMBC',
'EMECA',
'EMECC',
56 'HECA',
'HECC',
'FCALA',
'FCALC'],
57 'EM': [
'EMBA',
'EMBC',
'EMECA',
'EMECC'],
58 'HEC': [
'HECA',
'HECC'],
59 'FCAL': [
'FCALA',
'FCALC'],
60 'TILE': [
'TILBA',
'TILBC',
'TIEBA',
'TIEBC'],
61 'MDT': [
'MDTBA',
'MDTBC',
'MDTEA',
'MDTEC'],
62 'RPC': [
'RPCBA',
'RPCBC'],
63 'TGC': [
'TGCEA',
'TGCEC'],
64 'CSC': [
'CSCEA',
'CSCEC'],
65 'MBTS': [
'MBTSA',
'MBTSC'],
71 return (
max(1, lbr[0]), lbr[1]
if lbr[1] != -1
else THIRTYTWOMASK)
74 rv = (
max(tlbr1[0],tlbr2[0]),
min(tlbr1[1],tlbr2[1]))
83 if tuple(lbr)
in lumicache:
84 return lumicache[tuple(lbr)]
86 lblbdb = dbSvc.openDatabase(
'COOLONL_TRIGGER/CONDBR2',
True)
87 lblb = lblbdb.getFolder(
'/TRIGGER/LUMI/LBLB')
88 lblestonl = lblbdb.getFolder(
'/TRIGGER/LUMI/LBLESTONL')
90 lbs = lblb.browseObjects((run<<32)+lbr[0],
92 cool.ChannelSelection(0))
97 inf[(run, obj.since() & 0xFFFFFFFF)] = (lbpy[
'EndTime']-lbpy[
'StartTime'])/1e9
98 if obj.since() & 0xFFFFFFFF == lbr[1]:
99 print (
'Oops: this should not happen, appears to be off-by-one error')
100 lbls = lblestonl = lblestonl.browseObjects((run<<32)+lbr[0],
102 cool.ChannelSelection(0))
105 lblpy = obj.payload()
106 infl[(run, obj.since() & 0xFFFFFFFF)] = lblpy[
'LBAvInstLumi']
112 totlum += inf[lb]*infl[lb]
114 print (
'Missing run %d, LB %d' % lb)
115 lumicache[tuple(lbr)] = totlum
121 for runnum
in rundict.keys():
124 s = xmlrpc.client.ServerProxy(SERVER)
125 flaginfo = s.get_dqmf_summary_flags_lb({
'run_list':
list(runset)}, FLAGS_WE_CARE_ABOUT,
'SHIFTOFL')
128 for flag
in FLAGS_WE_CARE_ABOUT:
131 if str(run)
not in flaginfo:
132 print (
'%s not in flaginfo' % run)
135 for sublb
in rundict[run]:
136 for flag, periods
in flaginfo[
str(run)].
items():
137 for period
in periods:
142 record[flag].
append((ip[1]-ip[0], period[2],
lumi(run, ip)))
147 for pair
in rundict[run]:
148 totallum +=
lumi(run, pair)
149 print (
'Total lumi:', totallum)
153 for flag
in FLAGS_WE_CARE_ABOUT:
156 cols =
set([x[1]
for x
in lr])
159 llum =
sum([x[2]
for x
in lr
if x[1] == col])
161 print (flag, col, llum,
'%.2f%%' % (llum/totallum*100))
162 flagsum[flag][col] = (llum/totallum*100)
163 if abs(accounted-totallum) > 1e-8:
164 print (flag,
'n.a.', totallum-accounted,
'%.2f%%' % ((1-accounted/totallum)*100))
165 flagsum[flag][
'n.a.'] = ((1-accounted/totallum)*100)
169 for key
in set(d1.keys() + d2.keys()):
170 rv[key] = d1.get(key, 0) + d2.get(key, 0)
174 for flagtop, flaggroup
in FLAGGROUPS.items():
175 vals =
reduce(_sum, [flagsum[f]
for f
in flaggroup], {})
178 print (
' %s: %.2f%%' % (typ, vals[typ]/len(flaggroup)))
185 runs = dic[DataKey(
'Run')]
186 times = dic[DataKey(
'Start and endtime')]
191 s =
'<table style="color: #777777; font-size: 85%; margin-left: 14px" cellpadding="0" cellspacing="3">\n'
193 s +=
'<tr><td><i>Number of runs selected:</i></td><td> %g</td><td></td></tr>\n' % (len(runs))
194 s +=
'<tr><td><i>First run selected:</i></td><td> %s</td><td> (%s)</td></tr>\n' % (runs[-1], time.strftime(
"%a %b %d, %Y, %X",time.gmtime(starttime)))
195 s +=
'<tr><td><i>Last run selected:</i></td><td> %s</td><td> (%s)</td></tr>\n' % (runs[0], time.strftime(
"%a %b %d, %Y, %X",time.gmtime(endtime)))
201 s +=
'<table style="margin-left: 14px">\n'
202 s +=
'<tr><td><b>Run / Event Summary</b></td></tr>\n'
207 if __name__ ==
'__main__':
209 p = et.parse(sys.argv[1])
212 for lbc
in p.getiterator(
'LumiBlockCollection'):
213 runnum =
int(lbc.find(
'Run').text)
216 for lbr
in lbc.findall(
'LBRange'):
217 rundict[runnum].
append([
int(lbr.get(
'Start')),
218 int(lbr.get(
'End'))+1])