ATLAS Offline Software
Loading...
Searching...
No Matches
python.AtlRunQueryRun Namespace Reference

Classes

class  DataEntry
class  DataEntryList
class  Run
class  RunData

Functions

 ashtml (run)
 createToolTips (run)

Variables

dict _fW = {'Run' : 12, 'NLB': 5, 'Time': 50, '#Events': 10, 'Stream': 10}

Function Documentation

◆ ashtml()

python.AtlRunQueryRun.ashtml ( run)

Definition at line 963 of file AtlRunQueryRun.py.

963def ashtml(run):
964 import CoolRunQuery.html.AtlRunQueryHtmlUtils as HU
965
966 with timer("print runnur, runtime, etc"):
967 s = "<!-- Run %s -->\n" % run.runNrS
968
969 # disctionary with results
970 if Run.bgcolor == "1":
971 Run.bgcolor = "2"
972 else:
973 Run.bgcolor = "1"
974 color = Run.bgcolor
975
976 runrowclass = "out"
977 if run.showDataIncomplete:
978 runrowclass="showmiss"
979 if run.selDataIncomplete:
980 runrowclass="selmiss"
981 runrowclass += color
982
983 s += '<tr class="out%s">\n' % (color)
984
985 if Run.showrunnr: # show columns Run, Links, LB
986 # run number
987 if run.runNr == Run.runnropen: # is the run still ongoing?
988 s += ' <td style="text-align:center" class="%s"><font color="#BB0000">%s<br><font size="-2">(ongoing)</font></font>' % (runrowclass, run.runNrS)
989 else:
990 s += '<td style="text-align:center" class="%s">%s' % (runrowclass, run.runNrS)
991 p = Run.runPeriods.findPeriod( run.runNr )
992 if p:
993 # split in the middle
994 idx=-1
995 for i in range(p.count(',')//2+1):
996 idx = p.find(',',idx+1)
997 s += '<br><font color="#488AC7"><font size=-2><nobr>Period: %s<br>%s</nobr></font></font>' % (p[:idx],p[idx+1:])
998
999 # open for prompt calibration?
1000 if run.runNr in Run.PromptCalibRuns:
1001 s += '<br><font color="#008800"><font size="-2">(in&nbsp;calib&nbsp;loop)</font></font>'
1002 s += '</td>'
1003
1004 # links to other information
1005 s += '\n <td>\n%s</td>' % run.runlinks()
1006
1007 # luminosity block and average lb duration
1008 lbcontent = '%s' % run.NrLBs
1009 try:
1010 vf = float(run.NrLBs)
1011 if vf > 0:
1012 lbcontent = '%s<br><font size="-2">(%i&nbsp;s)</font>' % (run.NrLBs, (run.eor-run.sor)/(1.0E9*vf) )
1013 except ValueError:
1014 pass
1015
1016 window = HU.OpenWindow( HU.CreateLBTable(run), extracss=['html/atlas-runquery-lb.css'] )
1017
1018 # put into html page
1019 tip = 'showTip LBStart_%i' % run.runNr
1020 s += '\n <!-- LB Content -->\n'
1021 s += ' <td style="text-align: right"><div class="%s tooltip" style="display:inline;cursor:pointer">%s%s</a></div></td>\n' % (tip, window, lbcontent)
1022
1023
1024 if Run.showtime:
1025 s += ' <td>%s</td>' % run.timestr('html',run.runNr != Run.runnropen) # is the run still ongoing?
1026
1027
1028 if Run.showduration:
1029 if run.runNr == Run.runnropen:
1030 s += ' <td><font color="#BB0000">%s<br><font size="-2">(ongoing)</font></font></td>' % run.durationstr()
1031 else:
1032 s += " <td>%s</td>" % run.durationstr()
1033
1034 # find maximum output rate in case of streams
1035 sumstrnev = 0
1036 for k in Run.SortedShowOrder():
1037 if k.Type == DataKey.STREAM and k.ResultKey in run.stats and 'calibration' not in k.ResultKey:
1038 sumstrnev += run.result[k.ResultKey][0]
1039 if sumstrnev == 0:
1040 sumstrnev = -1
1041
1042 # flags...
1043 ofllumiFlag = False
1044
1045
1046 # the loop
1047 with timer("print keys"):
1048 for data_key in Run.SortedShowOrder():
1049 k = data_key.ResultKey
1050 v = run.result[k]
1051
1052 with timer("keybuild %s" % k, disabled=True):
1053 if any(['olc:beam2intensity' in k,
1054 'olc:beam1intensity' in k,
1055 'lhc:beamenergy' in k,
1056 'beam1bunches' in k,
1057 'beam2bunches' in k,
1058 'collbunches' in k,
1059 'L1 PSK' == k,
1060 ]):
1061 continue
1062
1063 s += '\n '
1064
1065 # -----------------------------------------------------------------------------------------------------------------------
1066
1067 if k == "#Events":
1068 # compute approximative output rate in Hz
1069 durInSec = (run.eor-run.sor)/1.0E9
1070 rate = 'n.a. Hz'
1071 try:
1072 if durInSec > 0:
1073 rate = '%.1f Hz' % (float(v)/durInSec)
1074 except ValueError: # if n.a.
1075 pass
1076 s += ' <td style="text-align: right">%s<BR><font size="-2">(%s)</font></td>' % (addKommaToNumber(v),rate)
1077 continue
1078
1079 # -----------------------------------------------------------------------------------------------------------------------
1080
1081 if k == "#L1A" or k == '#L2A' or k == '#EFA' or k == '#Events (streamed)' or k == '#Events (incl. calib.)':
1082 s += ' <td style="text-align: right">%s</td>' % addKommaToNumber(v)
1083 continue
1084
1085 # -----------------------------------------------------------------------------------------------------------------------
1086
1087 if k == 'DQ': # DEFECT
1088 intolerable = Run.Fieldinfo['DQ']['IntolerableDefects']
1089
1090 for channelname in Run.Fieldinfo['DQ']['DefChannels']:
1091 if channelname == '':
1092 matching_dqentries = run.stats[k]["defects"]
1093 elif channelname == 'DET':
1094 matching_dqentries = [dqentry for dqentry in run.stats[k]["defects"] if '_' not in dqentry[0]]
1095 else:
1096 from re import compile
1097 pattern = compile(channelname)
1098 matching_dqentries = [dqentry for dqentry in run.stats[k]["defects"] if pattern.match(dqentry[0])]
1099
1100
1101 # reduce to LB ranges inside READY
1102 matching_dqentries_ready = []
1103 for (defect, listLBranges) in matching_dqentries: # dqentry is of format ('SCT_GLOBAL_STANDBY', [(1L, 49L), (119L, 123L)])
1104 readyLBRanges = [lbrange for lbrange in listLBranges if run.data.isReady(lbrange)]
1105 if len(readyLBRanges)>0:
1106 matching_dqentries_ready += [ (defect, readyLBRanges) ]
1107
1108
1109 if len(matching_dqentries_ready)==0:
1110 dq_info = "<table class='dqdefects' style='border-color: limegreen; height=100%'><tr><td>&nbsp;</td></tr></table>\n"
1111 else:
1112 dq_info = "<table class='dqdefects'>\n"
1113 for defect,listLBranges in matching_dqentries_ready:
1114 tip = 'showTip dqdefect_%i_%s tooltip' % (run.runNr, defect)
1115 if defect in intolerable:
1116 dq_info += "<tr class='%s'><td class='intolerable'>%s</td><td class='lb'>" % (tip, defect)
1117 else:
1118 dq_info += "<tr class='%s tolerable' style='visibility:collapse;'><td>%s</td><td class='lb'>" % (tip, defect)
1119 dq_info += ", ".join([("%g&minus;%g" % (x[0],x[1]-1) if x[1]-x[0]!=1 else "%g" % x[0]) for x in listLBranges])
1120 dq_info += "</td></tr>\n"
1121 dq_info += '<tr height="100%%"><td height="100%%"></td></tr>\n'
1122 dq_info += "</table>\n"
1123 s += '<td class="def">%s</td>' % dq_info
1124
1125 continue
1126
1127 # -----------------------------------------------------------------------------------------------------------------------
1128
1129 if isDQ(k): # old, traffic-light DQ
1130 extraDQInfo = ''
1131 tip = ''
1132 dqmax = run.stats[k]["max"]
1133 n = run.stats[k]["counts"]
1134
1135 foundComment = False
1136 for (dq,comment), start, end in run.stats[k]["blocks"]:
1137 dqcss = dq
1138 if dq == 'n.a.':
1139 dqcss = 'NA'
1140 elif comment:
1141 foundComment = True
1142
1143 if n[dq]>0 and dq != dqmax:
1144 if start == end-1: # only one LB
1145 extraDQInfo += '<tr><td class="td%s" style="min-width: 45px; text-align: left; border-width: 0px; padding:1px;">&nbsp;LB&nbsp;%g:</td><td class="td%s" style="text-align: left; border-width: 0px; padding: 1px; ">%s&nbsp;</td></tr>' % (dqcss,start,dqcss,dq)
1146 else: # range of LBs
1147 extraDQInfo += '<tr><td class="td%s" style="min-width: 45px; text-align: left; border-width: 0px; padding:1px;">&nbsp;LB&nbsp;%g&minus;%g:</td><td class="td%s" style="text-align: left; border-width: 0px; padding: 1px; ">%s&nbsp;</td></tr>' % (dqcss,start,end-1,dqcss,dq)
1148
1149 if foundComment:
1150 tip = 'showTip dqcomm_%s_%i' % (k, run.runNr)
1151 if extraDQInfo:
1152 extraDQInfo = '<br><img vspace=2 height="1" width="1" src="wdot.jpg"><br><table style="width: 100%; border: 1px solid; border-width: 1px; border-spacing: 0px; border-color: #eeeeee; border-collapse: separate; padding: 0px; font-size: 65%"><tr>' + extraDQInfo + '</table>'
1153
1154 if tip:
1155 s += '<td class="%s td tooltip td%s">%s%s</td>' % (tip,dqmax,dqmax,extraDQInfo)
1156 else:
1157 s += '<td class="td td%s">%s%s</td>' % (dqmax,dqmax,extraDQInfo)
1158
1159 continue
1160
1161 # -----------------------------------------------------------------------------------------------------------------------
1162
1163 if "detector systems" in k.lower():
1164 if v!='n.a.':
1165 mask = '0x'+v if Selector.condDB()=='CONDBR2' else v # run2 the format is a hex string, in run 1 it is an int (represented as string)
1166 v = DecodeDetectorMask( mask=mask, lhcRun=run.lhcRun, smart=True)
1167 s += ' <td style="min-width:%ipx"><font size="-2">%s<hr color="#aaaaaa" size=1>[<a href="http://sroe.home.cern.ch/sroe/cgi-bin/avgmodule.py?run=%i" target=_blank>SCT HV setting</a>]</font></td>' % (1.1*len(v),v,run.runNr)
1168 continue
1169
1170 # -----------------------------------------------------------------------------------------------------------------------
1171
1172 if 'olc:lumi' in k:
1173
1174 # find range with stable beams (requires LHC information to be available)
1175 hasStableBeamsInfo, xvecStb = run.getStableBeamsVector()
1176
1177 # is pileup information available?
1178 printMu = 'olc:bcidmask' in Run.SortedShowOrder() and run.runNr>=151260 and run.givepeakmuinfo
1179
1180 # insert events per LB
1181 xvec = []
1182 yvec = []
1183 yvecInt = []
1184 for entry in run.data[k]:
1185 assert entry.startlb != 0, 'entry should not start at LB=0'
1186 val = entry.value if (entry.value!='n.a.' and entry.value>0) else 0
1187 lastlb = min(entry.lastlb,run.nr_lb)
1188 xvec += range(entry.startlb,lastlb+1)
1189 nlb = lastlb - entry.startlb + 1
1190 yvec += nlb*[val]
1191 yvecInt += nlb*[val]
1192
1193 # correct for time span
1194 intlumi, intlumiStb = (0, 0)
1195
1196 # for lifetime
1197 lifetime = 0
1198 lb1 = 0
1199 lb2 = 0
1200 t1 = 0
1201 t2 = 0
1202 y1 = 0
1203 y2 = 0
1204 if len(xvecStb) > 15:
1205 lb1 = xvecStb[3]
1206 lb2 = xvecStb[-1-5]
1207
1208 peaklumi = -1
1209 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
1210 lb=idx+1
1211 dt = (float(lbendtime)-float(lbtime))/1.E9
1212 yvecInt[idx] *= dt/1000.0*run.lumiunit # unit of yvec was: ub-1 s-1 -> nb-1
1213 yvec[idx] *= 1.0*run.lumiunit # unit of yvec was: ub-1 s-1, transform to: 10^30 cm-2s-1
1214 intlumi += yvecInt[idx]
1215
1216 if yvec[idx] > peaklumi:
1217 peaklumi = yvec[idx]
1218 if lb in xvecStb:
1219 intlumiStb += yvecInt[idx]
1220 if lb == lb1:
1221 t1 = lbtime/1.E9
1222 y1 = yvec[idx]
1223 elif lb == lb2:
1224 t2 = lbtime/1.E9
1225 y2 = yvec[idx]
1226
1227 if y1 > 0 and y2 > 0:
1228 lifetime = (t2 - t1)/(3600*math.log(y1/y2)) # unit: hours
1229
1230 # line to be printed in column
1231 if hasStableBeamsInfo:
1232 fullprint_ = 'All&nbsp;LBs:&nbsp;%0.4g<br>Stable&nbsp;B:&nbsp;%0.4g' % (intlumi,intlumiStb)
1233 histoText = 'Integrated luminosity: %.4g %s-1 (all LBs) and %.4g %s-1 (stable beams)' % (intlumi,run.lumiunittxt,intlumiStb,run.lumiunittxt)
1234 else:
1235 fullprint_ = 'All&nbsp;LBs:&nbsp;%0.4g' % (intlumi)
1236 histoText = 'Integrated luminosity: %.4g %s-1 (all LBs)' % (intlumi,run.lumiunittxt)
1237
1238 # find out which channel was used
1239 tp1, tp2, chan = k.split(':')
1240 try:
1241 chan = int(chan)
1242 if chan in OLCAlgorithms:
1243 chanstr = OLCAlgorithms[chan]
1244 else:
1245 chanstr = 'UNKNOWN'
1246 except ValueError:
1247 chanstr = chan
1248
1249 path = makeLBPlot( xvec, xvecStb, yvec, 'Luminosity block number', 'Online luminosity (10^{%s}cm^{-2}s^{-1})' % run.instlumiunittxt, '',
1250 'olclumi_vs_lb_run_%i' % (run.runNr),
1251 'Online lumi [%s] per LB for run %i' % (chanstr, run.runNr),
1252 QC.datapath, histoText )
1253
1254 # create window and tooltip
1255 wincontent = '<table class=&quot;outer&quot; style=&quot;padding: 5px&quot;><tr><td>'
1256 wincontent += '<strong><b>Online luminosity [algorithm: %s] per LB for run %i:</b></strong><br><font size=&quot;-1&quot; color=&quot;#888888&quot;>(Begin/end of run: %s)</font>' % (chanstr, run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1257 wincontent += '<hr color=&quot;black&quot; size=1>'
1258 wincontent += '<table style=&quot;padding: 0px&quot;><tr><td>'
1259 wincontent += '<img src=&quot;%s&quot; align=&quot;left&quot;>' % path
1260 wincontent += '</td></tr></table>'
1261 wincontent += '<hr color=&quot;black&quot; size=1>'
1262 wincontent += '<table class=&quot;LB&quot;>'
1263 wincontent += '<tr><th>LB</th><th>Start time<br> (%s)</th><th>Duration<br>(sec)</th><th>Inst. luminosity<br>(1e%s&nbsp;cm<sup>&minus;2</sup>s<sup>&minus;1</sup>)</th>' % (QC.tzdesc(), run.instlumiunittxt)
1264 wincontent += '<th>Int. luminosity<br>(%s<sup>&minus;1</sup>)</th><th>Cumul. luminosity<br>(%s<sup>&minus;1</sup>)</th>' % (run.lumiunittxt, run.lumiunittxt)
1265 if printMu:
1266 wincontent += '<th>&nbsp;&nbsp;&lt;&mu;&gt;&nbsp;&nbsp;</th>'
1267 if hasStableBeamsInfo:
1268 wincontent += '<th>Stable beams</th>'
1269 wincontent += '</tr><tr style=&quot;background:%s&quot;>' % '#eeeeee'
1270 intlumi = 0
1271 mumax = -1
1272 minBiasXsec = 80.0 if Selector.isRun2() else 71.5 # minbias cross-section for 8TeV (71.5) and 13TeV (80.0)
1273
1274 is5TeVRun = (run.sor/1.E9) > time.mktime((2017,11,11,0,0,0,0,0,0)) and (run.sor/1.E9) < time.mktime((2017,11,21,8,0,0,0,0,0))
1275 if is5TeVRun:
1276 minBiasXsec = 66.25
1277
1278 is5TeVHIRun = (run.sor/1.E9) > time.mktime((2018,11,7,0,0,0,0,0,0)) and (run.sor/1.E9) < time.mktime((2018,12,31,0,0,0,0,0,0))
1279 if is5TeVHIRun:
1280 minBiasXsec = 7660
1281
1282 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
1283 lb=idx+1
1284 isStableBeams = (lb in xvecStb)
1285 intlumi += yvecInt[idx]
1286 stbBeams = 'T' if isStableBeams else '&minus;'
1287 timetuple = time.localtime(lbtime/1.E9) if QC.localtime else time.gmtime(lbtime/1.E9)
1288 wincontent += '<td>%s</td><td>%s</td><td>%.2f</td><td>%.4g</td><td>%.4g</td><td>%.4g</td>' % (lb, time.strftime("%X",timetuple), (float(lbendtime)-float(lbtime))/1.E9, yvec[idx], yvecInt[idx], intlumi)
1289 # pileup <mu> information?
1290 if printMu:
1291 nb = 0
1292 for n,v,lbstart,lbend in run.stats['olc:bcidmask']['blocks']:
1293 if lb >= lbstart and lb <= lbend:
1294 if v:
1295 nb = len(v[2])
1296 break
1297 # compute expected number of interactions
1298 lumi_mb = yvec[idx]*1000.0
1299 mu = 0
1300 if nb:
1301 mu = lumi_mb * minBiasXsec / 11245.511 / nb
1302 wincontent += '<td>%.3g</td>' % mu
1303 if isStableBeams and mu > mumax:
1304 mumax = mu
1305 if hasStableBeamsInfo:
1306 wincontent += '<td>%s</td>' % stbBeams
1307 if idx%2!=0:
1308 col = '#eeeeee'
1309 else:
1310 col = '#ffffff'
1311 wincontent += '</tr><tr style=&quot;background:%s&quot;>' % col
1312
1313 printMuInfoToFile = True
1314 if printMuInfoToFile:
1315 mutextfilename = QC.datapath + '/mu_vs_run_output.txt'
1316 muout = open( mutextfilename, 'a' )
1317 muout.write( '%10i %f\n' % (run.runNr, mumax) )
1318 muout.close()
1319
1320 if mumax < 0:
1321 s_mumax = "n.a."
1322 elif mumax < 0.1:
1323 s_mumax = "%0.3e" % mumax
1324 else:
1325 s_mumax = "%0.3f" % mumax
1326
1327 if run.runNr == Run.runnropen: # run still ongoing
1328 wincontent += '<tr><td style=&quot;text-align:left&quot;colspan=&quot;3&quot;><i>&nbsp;&nbsp;Run still ongoing ...</i></td></tr>'
1329 wincontent += '</tr></table>'
1330
1331 wincontent += """<hr color=&quot;red&quot; size=1><font color=&quot;#777777&quot;><font size=&quot;-1&quot;><i><font size=&quot;-2&quot;>Created by AtlRunQuery on: %s</font></i></font></td></tr></table><script type=&quot;text/javascript&quot;></script></body></html>""" % str(datetime.datetime.now())
1332 wincontent += '</td></tr></table>'
1333
1334 openwincmd = '<a href="javascript:openLargeWindow('
1335 openwincmd += "'Print','<!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;><html xmlns:&quot;my&quot;><head><title>Run query result for online luminosity</title><LINK href=&quot;html/atlas-runquery-lb.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;></head><body><table style=&quot;font-family: sans-serif; font-size: 85%%&quot;>"
1336 openwincmd += wincontent
1337 openwincmd += "')\">"
1338
1339 # line to be printed in column
1340 fullprint = '<table class="bcidtable">'
1341 fullprint += '<tr><td colspan="2"><img src="%s" align="left" width="90px"></td></tr>' % path
1342 if hasStableBeamsInfo:
1343 fullprint += '<tr><td style="text-align:left">Entire&nbsp;run:</td><td style="text-align:left">&nbsp;%0.4g&nbsp;%s<sup>&minus;1</sup></td></tr><tr><td style="text-align:left">Stable&nbsp;beams:</td><td style="text-align:left">&nbsp;%0.4g&nbsp;%s<sup>&minus;1</sup></td></tr><tr><td style="text-align:left">Peak&nbsp;lumi:</td><td style="text-align:left">&nbsp;%.2g&nbsp;e%s&nbsp;cm<sup>&minus;2</sup>s<sup>&minus;1</sup></td></tr><tr><td style="text-align:left">Peak&nbsp;&lt;&mu;&gt;:</td><td style="text-align:left">&nbsp;%s</td></tr>' % (intlumi, run.lumiunittxt, intlumiStb, run.lumiunittxt, peaklumi, run.instlumiunittxt, s_mumax)
1344 if lifetime > 0:
1345 fullprint += '<tr><td style="text-align:left">Approx.&nbsp;lifetime:</td><td style="text-align:left">&nbsp;%0.2g&nbsp;h</td></tr>' % (lifetime)
1346 else:
1347 fullprint += '<td style="text-align:left">All&nbsp;LBs:</td><td style="text-align:left">&nbsp;%0.4g</td></tr>' % (intlumi)
1348 fullprint += '</table>'
1349
1350 # put into html page
1351 s += '<td class="showTip OLCLumi stream" style="text-decoration:none; text-align: right">%s%s</a></td>' % (openwincmd, fullprint)
1352
1353 continue
1354
1355 # -----------------------------------------------------------------------------------------------------------------------
1356
1357 if 'olc:bcidmask' in k:
1358
1359 firstGoodRun = 151260
1360 if run.runNr < firstGoodRun: # OLC information not properly filled
1361 s += '<td style="text-align:center;color:#AA0000;font-size:60%%;">BCID information only available for run numbers larger than %i</font></td>' % firstGoodRun
1362 continue
1363
1364 # line to be printed in column
1365 fullprint = '<font size=-2><i>Run without stable beams (or, in few cases, missing bunch information in COOL). Click here to obtain bunch crossing information</i>.</font>'
1366
1367 wincontent = '<table class=&quot;outer&quot; style=&quot;padding: 5px&quot;><tr><td>'
1368 wincontent += '<strong><b>Identifiers (BCID) for paired and unpaired bunches for run %i:</b></strong><br><font size=&quot;-1&quot; color=&quot;#888888&quot;>(Begin/end of run: %s)</font>' % (run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1369 wincontent += '<hr color=&quot;black&quot; size=1>'
1370 wincontent += '<table class=&quot;bcidtable&quot; align=&quot;center&quot;><tr class=&quot;tr0&quot;><td style=&quot;text-align:left;font-weight:bold&quot; colspan=&quot;3&quot;>LB&nbsp;range</td><td style=&quot;text-align:right;font-weight:bold&quot;>&nbsp;&nbsp;&nbsp;&nbsp;Stable<br>beams</td><td style=&quot;text-align:right;font-weight:bold&quot;>%s</td><td style=&quot;text-align:right;font-weight:bold&quot;>%s</td><td style=&quot;text-align:right;font-weight:bold&quot;>%s</td></tr>' % ('&nbsp;&nbsp;Crossing&nbsp;(Paired)', '<nobr>&nbsp;&nbsp;Unpaired&nbsp;Beam-1&nbsp;</nobr>', '<nobr>&nbsp;&nbsp;Unpaired&nbsp;Beam-2</nobr>')
1371 ic = 0
1372
1373 # retrieve stable beam information
1374 hasStableBeamsInfo, xvecStb = run.getStableBeamsVector()
1375
1376 first = True
1377 for n,v,lbstart,lbend in run.stats[k]['blocks']:
1378 ic += 1
1379 cls = 'tr1' if (ic%2==1) else 'tr2'
1380
1381 # is this block during stable beams ?
1382 isInStableBeamPeriod = False
1383 stableBeamWord = '&minus;'
1384 if hasStableBeamsInfo:
1385 if lbstart <= xvecStb[-1] and lbend >= xvecStb[0]:
1386 isInStableBeamPeriod = True
1387 stableBeamWord = '<b>T</b>'
1388
1389 wincontent += '<tr class=&quot;%s&quot;><td class=&quot;td1&quot; style=&quot;text-align:right&quot;><b>%s</b></td><td style=&quot;text-align:right&quot;><b>&minus;</b></td><td style=&quot;text-align:right&quot;><b>%s:</b>&nbsp;&nbsp;&nbsp;</td><td>%s&nbsp;&nbsp;&nbsp;&nbsp;</td>' % (cls,str(lbstart),str(lbend-1),stableBeamWord)
1390 if v:
1391 beam1, beam2, beam12 = v
1392 unpaired1 = [b for b in beam1 if b not in beam12]
1393 unpaired2 = [b for b in beam2 if b not in beam12]
1394
1395 noBunches = not unpaired1 and not unpaired2 and not beam12 # happens at least in run 152508
1396 if not unpaired1:
1397 unpaired1 = ['&minus;']
1398 if not unpaired2:
1399 unpaired2 = ['&minus;']
1400 if not beam12:
1401 beam12 = ['&minus;']
1402
1403 # analyse bunch train structure
1404 if isInStableBeamPeriod and first and not noBunches:
1405 first = False # don't do that again
1406
1407 maxBunchDistanceInTrain = 6
1408 if int(run.runNr) > 168665:
1409 maxBunchDistanceInTrain = 25 # large (20) bunch distance for Heavy Ion collisions
1410 trains = []
1411 bp = -1
1412 for b in beam12:
1413 if bp > 0 and b - bp <= maxBunchDistanceInTrain:
1414 if trains[-1][-1] != bp:
1415 trains.append([bp])
1416 trains[-1].append(b)
1417 elif len(beam12) > 1 and bp <= 0 and beam12[0] - b <= maxBunchDistanceInTrain:
1418 trains.append([b])
1419 bp = b
1420
1421 fullprint = '<table class = "triggerlinktable">'
1422 fullprint += '<tr><td style="text-align:left"><nobr>No. of coll. bunches:&nbsp;&nbsp;</nobr></td><td> <b>%i</b></td></tr>' % len(beam12)
1423 fullprint += '<tr><td style="text-align:left"><nobr>No. of bunch trains:</nobr></td><td><b> %i</b></td></tr>' % len(trains)
1424 if trains:
1425 Run.TmpBoxContent = '<strong><b><nobr>Bunch train configuration for run <font color="#AA0000">%i</font></nobr></b></strong>' % run.runNr
1426 Run.TmpBoxContent += '<hr size=1>'
1427
1428 # it may be that the BCID=1 is a single pilot bunch only without a train
1429 # in that case, don't use it to compute bunch distance in train, but print comment
1430 icoor = 0
1431 if len(trains) > 1:
1432 icoor = 1
1433 if len(trains[icoor]) > 1:
1434 bunchDist = trains[icoor][1] - trains[icoor][0]
1435 fullprint += '<tr><td style="text-align:left"><nobr>Bunch dist. in trains:</nobr></td><td><nobr><b> %i</b> (%i ns)</nobr></td></tr>' % (bunchDist, bunchDist*25)
1436 # print the comment in case of single pilot bunch
1437 if len(trains) > 0:
1438 if len(trains[0]) == 1:
1439 fullprint += '<tr><td style="text-align:left;color:#4477EE" colspan=2><i>The first "bunch train" is trivial and consists of only the colliding pilot bunch</td></tr>'
1440 fullprint += '</table><hr size=1>'
1441 Run.TmpBoxContent += '<table><tr><td>Train</td><td><nobr>No. of bunches</nobr></td><td style="text-align:right">&nbsp;&nbsp;&nbsp;BCID range</td></tr>'
1442 for it, train in enumerate(trains):
1443 Run.TmpBoxContent += '<tr><td>&nbsp;&nbsp;%i:&nbsp;&nbsp;</td><td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;%i</td><td style="text-align:right"><nobr>&nbsp;&nbsp;%i &minus; %i</nobr></td></tr>' % (it+1, len(train), train[0], train[-1])
1444 Run.TmpBoxContent += '</table><hr size=1>'
1445 else:
1446 Run.TmpBoxContent = '<nobr>No bunch trains in this run</nobr> <hr size=1>'
1447 fullprint += '</table><hr size=1>'
1448 Run.TmpBoxContent += '<p><font color="#AA0000"><b><nobr>Click to obtain full list of BCIDs</nobr></b></font>'
1449 fullprint += '<span style="font-size: xx-small; color: #555555">[ <i>Mouse over for train configuration. Click for full list of BCIDs</i> ]</span>'
1450
1451 wincontent += '<td class=&quot;td1&quot; style=&quot;text-align:right&quot;>%s</td><td style=&quot;text-align:right; border-left:1px #C0C0D0 solid;border-right:1px #C0C0D0 solid&quot;>%s</td><td style=&quot;text-align:right&quot;>%s</td>' % (', '.join(map(str,beam12)), ', '.join(map(str,unpaired1)), ', '.join(map(str,unpaired2)) )
1452 else:
1453 wincontent += '<td class=&quot;td1&quot; style=&quot;text-align:right&quot;>%s</td><td style=&quot;text-align:right&quot;>%s</td><td style=&quot;text-align:right&quot;>%s</td>' % ('&minus;','&minus;','&minus;')
1454
1455 wincontent += '</tr>'
1456
1457
1458 wincontent += '</table></td>'
1459 wincontent += '</td></tr></table>'
1460
1461
1462 openwincmd = HU.OpenWindow(wincontent, title="Run query result for online luminosity", extracss=None, size="large")
1463 #openwincmd = '<a href="javascript:openLargeWindow('
1464 #openwincmd += "'Print','<!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;><html xmlns:&quot;my&quot;><head><title>Run query result for online luminosity</title><LINK href=&quot;html/atlas-runquery-results.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;></head><body><table style=&quot;font-family: sans-serif; font-size: 85%%&quot;>"
1465 #openwincmd += wincontent
1466 #openwincmd += "')\">"
1467
1468 s += '<td class="showTip OLCBCID_%i stream" style="text-decoration:none; text-align: left">%s%s</a></td>' % (run.runNr, openwincmd, fullprint)
1469
1470 continue
1471
1472 # -----------------------------------------------------------------------------------------------------------------------
1473
1474 if k.startswith('bs:Pos') or k.startswith('bs:Sig') or k.startswith('bs:Tilt'):
1475
1476 # reference for average
1477 refkey = 'bs:Sig-X' # must exist !
1478 statkey = 'bs:Status' # must exist !
1479
1480 onloffltype = 'Online' if (run.stats['Beamspot']=='online') else 'Offline'
1481
1482 # given is beamspot position or width or tilt
1483 xvec = []
1484 yvec = []
1485 yvecSt = []
1486 bsidx = []
1487 isOK = False
1488 vave = 0
1489 eave = 0
1490 iave = float(0)
1491 idx = 0
1492
1493 for entry in run.data[k]:
1494 if entry.startlb==0 and entry.lastlb==0:
1495 continue
1496
1497 val,valerr = entry.value
1498 ref = run.data[refkey].atLB(entry.startlb)[0].value[0]
1499 stat = run.data[statkey].atLB(entry.startlb)[0].value
1500
1501 lastlb = min(entry.lastlb,run.lastlb)
1502 lbs = range(entry.startlb,lastlb+1)
1503 nlb = len(lbs)
1504
1505 xvec += [nlb]
1506 yvec += [(val,valerr)]# * nlb
1507 yvecSt += [stat]# * nlb
1508 bsidx += [idx] * nlb
1509 idx += 1
1510
1511 # compute average if BS has been determined
1512 if ref < 10:
1513 vave += nlb * val
1514 eave += nlb * val**2
1515 iave += nlb
1516 isOK = True
1517
1518 if not isOK:
1519 s += '<td>n.a.</td>'
1520 continue
1521
1522 if iave>0:
1523 vave /= float(iave)
1524 rad = eave/iave - vave*vave
1525 if rad>=0:
1526 eave = math.sqrt(rad)
1527 else:
1528 eave = 0
1529 else:
1530 vave = -1
1531
1532 ymin = vave - 3*eave
1533 ymax = vave + 3*eave
1534
1535 if ymin >= ymax:
1536 ymin = ymin*0.9
1537 ymax = ymin*1.1
1538 if ymin >= ymax:
1539 ymin = -0.1
1540 ymax = 0.1
1541
1542 if ymin==ymax:
1543 delta = 0.1*abs(ymax)
1544 else:
1545 delta = 0.1*(ymax-ymin)
1546 ymin -= delta
1547 ymax += delta
1548
1549
1550 bstype = 'pos'
1551 if 'Sig' in k:
1552 bstype = 'width'
1553 elif 'Tilt' in k:
1554 bstype = 'tilt'
1555 bstype += k[k.find('-'):]
1556
1557 histoText = 'Average beam spot %s: (%.4g +- %.1g) mm' % (bstype, vave, eave)
1558
1559 path = makeBSPlots( xvec=xvec, yvec=yvec,
1560 xtitle = 'Luminosity block number', ytitle = '%s beamspot %s (mm)' % (onloffltype, bstype),
1561 histname = '%s_vs_lb_run_%i' % (k.replace(':','_').replace('-','_'), run.runNr),
1562 histtitle = '%s beamspot %s per LB for run %i' % (onloffltype, bstype, run.runNr),
1563 datapath = QC.datapath, ymin = ymin, ymax = ymax, printText = histoText )
1564
1565
1566 # create window and tooltip
1567 wincontent = '<table class=&quot;outer&quot; style=&quot;padding: 5px&quot;><tr><td>'
1568 wincontent += '<strong><b>%s beamspot %s per LB for run %i:</b></strong><br><font size=&quot;-1&quot;><font color=&quot;#888888&quot;>(Begin/end of run: %s)</font></font><hr color=&quot;black&quot; size=1>' % (onloffltype, bstype, run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1569 wincontent += '<table style=&quot;padding: 0px&quot;><tr><td>'
1570 wincontent += '<img src=&quot;%s&quot; align=&quot;left&quot;>' % (path)
1571 wincontent += '</td></tr></table>'
1572 wincontent += '<hr color=&quot;black&quot; size=1>'
1573
1574 wincontent += '<table style=&quot;width: auto; border: 0px solid; border-width: margin: 0 0 0 0; border-spacing: 0px; border-collapse: separate; padding: 0px; font-size: 90%; vertical-align:top; &quot;>'
1575 wincontent += '<tr><th style=&quot;text-align:right&quot;>LB</th><th style=&quot;text-align:right&quot;>&nbsp;&nbsp;&nbsp;Start time<br> (%s)</th><th style=&quot;text-align:right&quot;>&nbsp;&nbsp;&nbsp;Duration<br>(sec)</th><th style=&quot;text-align:right&quot;>&nbsp;&nbsp;&nbsp;Beamspot %s<br>(mm)</th><th style=&quot;text-align:right&quot;>&nbsp;&nbsp;&nbsp;Fit&nbsp;status</th>' % (QC.tzdesc(),bstype)
1576 wincontent += '</tr><tr style=&quot;background:%s&quot;>' % '#eeeeee'
1577 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
1578 lb=idx+1
1579 timetuple = time.localtime(lbtime/1.E9) if QC.localtime else time.gmtime(lbtime/1.E9)
1580 wincontent += '<td style=&quot;text-align:right&quot;>&nbsp;&nbsp;%s</td>' % lb
1581 wincontent += '<td style=&quot;text-align:right&quot;>&nbsp;%s</td>' % time.strftime("%X",timetuple)
1582 wincontent += '<td style=&quot;text-align:right&quot;>%.2f</td>' % ((float(lbendtime)-float(lbtime))/1.E9)
1583 wincontent += '<td style=&quot;text-align:right&quot;>%.4g &plusmn; %.2g</td>' % yvec[bsidx[idx]]
1584 wincontent += '<td style=&quot;text-align:right&quot;>%i</td>' % yvecSt[bsidx[idx]]
1585
1586 if idx%2!=0:
1587 col = '#eeeeee'
1588 else:
1589 col = '#ffffff'
1590 wincontent += '</tr><tr style=&quot;background:%s&quot;>' % col
1591 if run.runNr == Run.runnropen: # run still ongoing
1592 wincontent += '<tr><td style=&quot;text-align:left&quot;colspan=&quot;3&quot;><i>&nbsp;&nbsp;Run still ongoing ...</i></td></tr>'
1593 wincontent += '</tr></table>'
1594
1595 wincontent += """<hr color=&quot;red&quot; size=1><font color=&quot;#777777&quot;><font size=&quot;-1&quot;><i><font size=&quot;-2&quot;>Created by AtlRunQuery on: %s</font></i></font></td></tr></table><script type=&quot;text/javascript&quot;></script></body></html>""" % str(datetime.datetime.now())
1596 wincontent += '</td></tr></table>'
1597
1598 openwincmd = '<a href="javascript:openWindow('
1599 openwincmd += "'Print','<!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;>"
1600 openwincmd += "<html><head><title>Run query result for the %s beamspot</title><LINK href=&quot;html/atlas-runquery-lb.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot;></head>" % (onloffltype.lower())
1601 openwincmd += "<body><table style=&quot;font-family: sans-serif; font-size: 85%&quot;>"
1602 openwincmd += wincontent
1603 openwincmd += "</table></body></html>"
1604 openwincmd += "')\">"
1605
1606 # plot
1607 fullprint = '<table class="triggerlinktable">'
1608 fullprint += '<tr><td colspan="2"><img src="%s" align="left" width="90px"></td></tr>' % path
1609 fullprint += '<tr><td colspan="2"></td></tr>'
1610 if isOK:
1611 fullprint += '<tr><td style="text-align:left">Average&nbsp;%s:</td></tr><tr><td style="text-align:left"><nobr>&nbsp;%0.3g&nbsp;&plusmn;&nbsp;%.2g&nbsp;(RMS)</nobr></td></tr>' % (bstype, vave, eave)
1612 fullprint += '</table>'
1613
1614 # put into html page
1615 s += '<td class="showTip OFLBS stream" style="text-decoration:none; text-align: right">%s%s</a></td>' % (openwincmd, fullprint)
1616 continue
1617
1618 # -----------------------------------------------------------------------------------------------------------------------
1619
1620 if "STR:" == k[0:4]:
1621 streamName = k[4:]
1622 if 'n.a.' in v:
1623 s += '<td class="tdna">n.a.</td>'
1624 continue
1625
1626 # compute approximative output rate in Hz
1627 durInSec = (run.eor-run.sor)/1.0E9
1628 rate = 'n.a.&nbsp;Hz'
1629 try:
1630 if durInSec > 0:
1631 rate = '%.3f&nbsp;Hz' % (v[0]/durInSec)
1632 except ValueError:
1633 pass
1634 strevents = v[0]
1635 strsize = v[1]
1636 # add relative fraction (only if not calibrtion string)
1637 fracstr = ''
1638 if 'calibration' not in k:
1639 fracstr = '%.1f%%,' % (float(strevents)/sumstrnev*100)
1640
1641
1642 ev = {}
1643 xvec = []
1644 xvecStb = []
1645 yvecN = []
1646 yvecR = []
1647 nevtot = 0
1648
1649 # statistics
1650 maxrate = -1
1651 averate = 0
1652 nc = 0
1653
1654 # insert events per LB
1655 lbrecinfo = run.stats[k]['LBRecInfo']
1656
1657 isPhysicsStream = lbrecinfo is not None and len(lbrecinfo)>0
1658 if isPhysicsStream: # only for physics stream we have LB wise information
1659 ev = dict(lbrecinfo)
1660 for lb in ev:
1661 ev[lb]=0
1662 for lb,nev in lbrecinfo:
1663 ev[lb] += nev
1664 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
1665 lb=idx+1
1666 nev = 0
1667 if lb in ev:
1668 nev = ev[lb]
1669 xvec.append(lb)
1670 yvecN.append(nev)
1671 yvecR.append(0)
1672 nevtot += nev
1673 try:
1674 if float(lbendtime)-float(lbtime) > 0:
1675 yvecR[-1] = nev/((float(lbendtime)-float(lbtime))/1.E9)
1676 except ValueError:
1677 pass
1678
1679
1680 # find range with stable beams (requires LHC information to be available)
1681 hasStableBeamsInfo, xvecStb = run.getStableBeamsVector()
1682
1683 # prepare pop-up window
1684 wincontent = '<table class=&quot;outer&quot; style=&quot;padding: 5px&quot;>'
1685 wincontent += '<tr><td><b>Number of events and rates per LB for stream %s run %i:</b><br><font size=&quot;-1&quot;><font color=&quot;#888888&quot;>(Begin/end of run: %s)</font></font><hr color=&quot;black&quot; size=1>' % (streamName, run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1686
1687 # create plot
1688 pathN = makeLBPlot( xvec, xvecStb, yvecN, 'Luminosity block number', 'Number of events / LB', '',
1689 'nev_vs_lb_str_%s_run_%i' % (streamName, run.runNr),
1690 'N events per LB in stream "%s", run %i' % (streamName, run.runNr),
1691 QC.datapath, 'Total number of events: %i' % nevtot )
1692 pathR = makeLBPlot( xvec, xvecStb, yvecR, 'Luminosity block numer', 'Event rate [Hz] / LB', '',
1693 'rate_vs_lb_str_%s_run_%i' % (streamName, run.runNr),
1694 'Event rate per LB in stream "%s", run %i' % (streamName, run.runNr),
1695 QC.datapath )
1696 wincontent += '<table style="padding: 0px">\n<tr><td>'
1697 wincontent += '<img src="%s" width="350">' % pathN.split('/')[-1]
1698 wincontent += '</td><td>'
1699 wincontent += '<img src="%s" width="350">' % pathR.split('/')[-1]
1700 wincontent += '</td></tr></table>\n'
1701 wincontent += '<hr color="black" size=1>\n'
1702 wincontent += '<table class="lb">\n'
1703 wincontent += '<tr><th>LB</th><th>Start time (%s)</th><th>Duration (sec)</th><th>Nevents</th><th>Cumul. Nevents</th><th>Rate [Hz]</th>' % QC.tzdesc()
1704 if hasStableBeamsInfo:
1705 wincontent += '<th>Stable beams</th>'
1706 wincontent += '</tr>\n<tr style="background:%s">' % '#eeeeee'
1707 sumnev = 0
1708 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
1709 lb=idx+1
1710 nev = 0
1711 if lb in ev:
1712 nev = ev[lb]
1713 sumnev += nev
1714 stbBeams = '&minus;'
1715 if yvecR[idx] > 0:
1716 averate += yvecR[idx]
1717 if yvecR[idx] > maxrate:
1718 maxrate = yvecR[idx]
1719 nc += 1
1720 if lb in xvecStb:
1721 stbBeams = 'T'
1722
1723 timetuple = time.localtime(lbtime/1.E9) if QC.localtime else time.gmtime(lbtime/1.E9)
1724 wincontent += '<td>%s</td><td>%s</td><td>%.2f</td><td>%i</td><td>%i</td><td>%.3g</td>' % (lb, time.strftime("%X",timetuple), (float(lbendtime)-float(lbtime))/1.E9, int(yvecN[idx]), sumnev, yvecR[idx])
1725 if hasStableBeamsInfo:
1726 wincontent += '<td>%s</td>' % stbBeams
1727 if idx%2!=0:
1728 col = '#eeeeee'
1729 else:
1730 col = '#ffffff'
1731 wincontent += '</tr>\n<tr style="background:%s">' % col
1732
1733 # compute max and averages
1734 if nc>0:
1735 averate /= float(nc)
1736
1737 if run.runNr == Run.runnropen: # run still ongoing
1738 wincontent += '<tr><td style="text-align:left"colspan="3"><i>&nbsp;&nbsp;Run still ongoing ...</i></td></tr>\n'
1739 wincontent += '</tr></table>\n'
1740 wincontent += '<hr color="red" size=1><font color="#777777"><font size="-1"><i><font size="-2">Created by AtlRunQuery on: %s</font></i></font></td></tr></table><script type="text/javascript"></script></body></html>' % str(datetime.datetime.now())
1741 wincontent += '</td></tr></table>'
1742 else:
1743 wincontent = ""
1744
1745 # the output
1746 tooltipkey = "STROV_%i_%s" % (run.runNr, streamName)
1747
1748 physStrOnlyInfo = ""
1749 if isPhysicsStream:
1750 maxrate = 'max:&nbsp;%.2f&nbsp;Hz' % (maxrate)
1751 averate = 'ave:&nbsp;%.2f&nbsp;Hz' % (averate)
1752 physStrOnlyInfo = "%s,<br>%s,<br>%s,&nbsp;" % (maxrate, averate, fracstr)
1753 debugStrLink = ""
1754 if 'debug_' in k:
1755 debugStrLink = '&nbsp;<a href="https://trigmon.web.cern.ch/trigmon/ResultsAnalysis/RESULTS/%i/00%i_%s" target=_blank><font color="#993333">[MON]</font></a>' % (time.gmtime(run.sor/1.E9)[0], run.runNr, k[4:].strip())
1756 evtsize = ',<br>%s/evt' % filesize(float(strsize)/float(strevents)) if (strevents>0) else ""
1757 tdcontent = '%s <BR><font size="-2">(%s%s/run%s%s)' % (addKommaToNumber(strevents), physStrOnlyInfo, filesize(strsize), evtsize, debugStrLink)
1758
1759 # wrap content in div with tooltip
1760 tdcontent = '<div class="showTip %s stream" style="display:inline;cursor:pointer">%s</div>' % (tooltipkey, tdcontent)
1761
1762 if isPhysicsStream:
1763 # create popup page and wrap content into href
1764 filename = HU.CreatePopupHtmlPage( 'streamov_%i_%s' % (run.runNr, streamName), HU.WrapIntoHTML(wincontent, title="%s Stream Content" % streamName) )
1765 tdcontent = '<a class="externalWindow" style="text-decoration:none" href="%s">%s</a>' % (filename, tdcontent)
1766
1767 s += '<td style="text-decoration:none">%s</td>' % (tdcontent)
1768
1769 continue
1770
1771 # -----------------------------------------------------------------------------------------------------------------------
1772
1773 if k=="TriggerMenu":
1774 chains = run.splitTriggerChains(v)
1775 if len(chains)==0:
1776 s += '<td></td>'
1777 elif len(chains)==1:
1778 s += '<td style="min-width:300px"><font size="-2">%s</font></td>' % ( chains )
1779 elif len(chains)==2:
1780 s += '<td style="min-width:300px"><font size="-2">%s<hr color="gray" size=1>%s</font></td>' % ( chains )
1781 else:
1782 s += '<td style="min-width:300px"><font size="-2">%s<hr color="gray" size=1>%s<hr color="gray" size=1>%s</font></td>' % ( chains )
1783 continue
1784
1785 # -----------------------------------------------------------------------------------------------------------------------
1786
1787 if k=="TriggerRates":
1788 if type(v)==str:
1789 s += '<td>%s</td>'%v
1790 else:
1791 tablecontent = ""
1792 triggergroups,imgpaths,openwincmds = HU.createRatePopupWindow(v,run)
1793 for idx,(trgroup,imgpath,openwincmd) in enumerate(zip(triggergroups,imgpaths,openwincmds)):
1794 tooltipkey = "TrRate_Set%i_%i" % (idx,run.runNr)
1795 contentpage = "%s/popupContent_trRates_%i_%i.html" % (QC.datapath, run.runNr, idx)
1796
1797 if idx!=0:
1798 tablecontent += ' <tr><td colspan="2"><hr color="gray"></td></tr>'
1799 imgcontent = '<img src="%s" align="center" width="90px"><br>' % imgpath
1800 imagerow = '<div class="showTip %s ratespopup" id="%s" style="display:inline;cursor:pointer;font-size:80%%;">%s</div>' % (tooltipkey, contentpage, imgcontent)
1801 tablecontent += ' <tr><td colspan="2" >%s</td></tr>' % imagerow
1802 for tr,avr in trgroup:
1803 tablecontent += ' <tr><td>%s</td><td>: %3.1f Hz</td></tr>' % (tr,avr)
1804 s+="<td><table class='ratestable'>\n%s\n </table></td>" % tablecontent
1805 continue
1806
1807 # -----------------------------------------------------------------------------------------------------------------------
1808
1809 if "Datasets" == k:
1810 # separate datasets into stream types
1811 streamtypes = ['physics_','express_','calibration_','debug_', 'debugrec_']
1812 steptypes = ['.daq.','.recon.','.merge.','other','Reproc' ]
1813 datatypes = ['.RAW','.DRAW','.ESD.','.DESD','.AOD.','.TAG.','.TAG_COMM.','.HIST.','.NTUP','other']
1814 vetotypes = ['_TMP']
1815 shownlist = []
1816
1817 s += '<td>'
1818 s += '<table class="datasettable">'
1819 hrline = ''
1820 allcafdsnames = ''
1821 first = True
1822 for stype in streamtypes:
1823 for step in steptypes:
1824 for dtype in datatypes:
1825 selectedds = {}
1826 for ds in v:
1827 if (stype in ds[0] and step in ds[0] and dtype in ds[0]) or (stype in ds[0] and stype == 'debug_' and step == 'other' and (dtype in ds[0] or dtype == 'other')) and not ds[0] in shownlist:
1828 vetoed = False
1829 for veto in vetotypes:
1830 if veto in ds[0]:
1831 vetoed = True
1832 break
1833 if not vetoed:
1834 # number of files, size, events
1835 st = ['&nbsp;%s&nbsp;files' % (prettyNumber(ds[4]))]
1836 st += ['&nbsp;%s' % (filesize(ds[5]))]
1837 if ds[6] == 0:
1838 st += ['&nbsp;unkn.&nbsp;evts&nbsp;']
1839 else:
1840 st += ['&nbsp;%s&nbsp;evts&nbsp;' % (prettyNumber(ds[6]))]
1841 selectedds[ds[0]] = st
1842 # replication status
1843 if 'replicate:done' in ds[2]:
1844 selectedds[ds[0]] += [True]
1845 else:
1846 selectedds[ds[0]] += [False]
1847 if ds[3] == 'DONE':
1848 selectedds[ds[0]] += [True]
1849 else:
1850 selectedds[ds[0]] += [False]
1851 selectedds[ds[0]] += [ds[7]] # add dataset creation time
1852 shownlist.append(ds[0])
1853
1854 if not selectedds:
1855 continue
1856 dsnames = selectedds.keys()
1857 dsnames.sort()
1858 if not first:
1859 s += hrline
1860 first = False
1861 s += '<tr><td colspan="1"><font color="#666666"><i>[&nbsp;Stream&nbsp;type&nbsp;+&nbsp;processing&nbsp;step&nbsp;+&nbsp;data&nbsp;type:&nbsp;<b>%s</b>&nbsp;+&nbsp;<b>%s</b>&nbsp;+&nbsp;<b>%s</b>&nbsp;]</i> </font></td></tr>' % (stype, step, dtype)
1862 for dsname in dsnames:
1863 # build AMI link to dataset
1864 dsnspl = dsname.split('.')
1865 lk = "https://ami.in2p3.fr/AMI/servlet/net.hep.atlas.Database.Bookkeeping.AMI.Servlet.Command?Converter=/AMIXmlToAMIProdHtml.xsl&Command=FormBrowseDatasetPerParameter+-runNumber%3D"
1866 project = dsnspl[0]
1867 runNum = dsnspl[1]
1868 stream = dsnspl[2]
1869 format = dsnspl[4]
1870 s += '<tr><td>'
1871 s += '<a href="https://ami.in2p3.fr/AMI/servlet/net.hep.atlas.Database.Bookkeeping.AMI.Servlet.Command?Converter=/AMIXmlToAMIProdHtml.xsl&Command=FormBrowseDatasetPerParameter+-runNumber%3D'
1872 s += runNum + "+-dataType=" + format + "+-projectName=" + project + "+-streamName=" + stream
1873 s += '" target="_blank" title="AMI dataset information">'
1874 s += dsname + '</td>'
1875 res = selectedds[dsname]
1876 s += '<td style="text-align:right"><font color="#005500">&nbsp;[</font></td>'
1877 for st in res[0:3]:
1878 s += '<td style="text-align:right"><font color="#005500">%s</font></td>' % st
1879 s += '<td style="text-align:right"><font color="#005500">]</font></td>'
1880 if res[3]:
1881 if Run.showCAFLinks:
1882 s += '<td><a href="javascript:openPageWindow('
1883 s += "'data/%s.html','%s')" % (dsname,dsname)
1884 s += '"title="Check which files of this dataset are available on ATLCAL disk pool">'
1885 s += '<font color="#BB0517">&nbsp;[&nbsp;on&nbsp;CAF&nbsp;]</font></a></td>'
1886
1887 # get age of file in hours
1888 deltat = (datetime.datetime.utcnow() - res[5])
1889 deltat = deltat.days*24.*3600. + deltat.seconds
1890 allcafdsnames += dsname + '@' + '%g' % deltat + ','
1891 else:
1892 s +='<td><font color="#BB0517">&nbsp;[&nbsp;on&nbsp;CAF&nbsp;]</font></td>'
1893 else:
1894 s += '<td></td>'
1895 if res[4]:
1896 lk = '<a href="https://ami.in2p3.fr/AMI/servlet/net.hep.atlas.Database.Bookkeeping.AMI.Servlet.Command?Command=FormGetDQ2InfoPerDataset+-logicalDatasetName%3D%22' + dsname + '%22&Converter=%2FAMIXmlToProdFrameHtml.xsl" target="_blank" title="DQ2 information (via AMI) for dataset: ' + dsname + '">'
1897 s += '<td>%s<font color="#153EBB">&nbsp;[&nbsp;in&nbsp;DDM&nbsp;]</font></a></td>' % lk
1898 else:
1899 s += '<td></td>'
1900
1901 s += '</tr>'
1902 if dtype != datatypes[-1]:
1903 hrline = '<tr><td colspan="8"><hr style="width:100%; background-color: #BBBBBB; height:1px; margin-left:0; border:0"/></td>'
1904 else:
1905 hrline = ''
1906
1907 if step != steptypes[-1]:
1908 hrline = '<tr><td colspan="8"><hr style="width:100%; background-color: #666666; height:2px; margin-left:0; border:0"/></td>'
1909 if stype != streamtypes[-1]:
1910 hrline = '<tr><td colspan="8"><hr style="width:100%; background-color: #6D7B8D; height:3px; margin-left:0; border:0"/></td>'
1911 # sanity check
1912 s_ = ''
1913 for ds in v:
1914 if 'TMP.' not in ds[0] and ds[0] not in shownlist:
1915 s_ += '<tr><td colspan=8>' + ds[0] + '</td></tr>'
1916 if s_:
1917 s += '<tr><td colspan="8"><hr style="width:100%; background-color: #EE0000; height:3px; margin-left:0; border:0"/></td>'
1918 s += '<tr><td colspan=8><font color="#EE0000"><i>Remaining, unassigned datasets:</i></font></td></tr>'
1919 s += s_
1920
1921 # close table
1922 s += '</table>\n'
1923 s += '</td>'
1924
1925 # call subprocesses
1926 if allcafdsnames:
1927 subprocess.Popen('python subproc.py caf %s' % (allcafdsnames[:-1]), shell=True)
1928
1929 continue
1930
1931 # -----------------------------------------------------------------------------------------------------------------------
1932
1933 if 'HLT PSK' == k:
1934 # add another column with links to trigger menu for all SMK and PSKs combinations
1935 linklist = run.stats['PSK']['blocks']
1936 linkRun12 = (
1937 '<a href="https://atlas-trigconf.cern.ch/run/smkey/{smk}/l1key/{l1psk}/hltkey/{hltpsk}/" target="_blank" '
1938 'title="L1: \'{l1name}\', HLT \'{hltname}\'. '
1939 'You can obtain the full trigger menu corresponding to SMK={smk} and prescale keys L1={l1psk}, HLT={hltpsk} in an independent window"'
1940 '>{l1psk}&nbsp;|&nbsp;{hltpsk}</a>'
1941 )
1942 linkRun3L1 = (
1943 '<a href="https://atlas-triggertool.web.cern.ch/db/{db}/smk/{smk}/l1psk/{l1psk}/" target="_blank" '
1944 'title="L1: \'{l1name}\'. You can obtain the full trigger menu corresponding to SMK={smk} and L1 prescale key {l1psk} in an independent window"'
1945 '>{l1psk}</a>'
1946 )
1947 linkRun3HLT = (
1948 '<a href="https://atlas-triggertool.web.cern.ch/db/{db}/smk/{smk}/hltpsk/{hltpsk}/" target="_blank" '
1949 'title="HLT: \'{hltname}\'. You can obtain the full trigger menu corresponding to SMK={smk} and HLT prescale key {l1psk} in an independent window"'
1950 '>{hltpsk}</a>'
1951 )
1952 if linklist:
1953 if len(linklist)<=15:
1954 ncol = 1
1955 elif len(linklist)<=30:
1956 ncol = 2
1957 else:
1958 ncol = 3
1959 if len(linklist)<=15:
1960 nrow = len(linklist)
1961 elif len(linklist)<=45:
1962 nrow = 15
1963 else:
1964 nrow = (len(linklist)+2)//3
1965
1966 s += '<td align="center"><table class="triggerlinktable" align="center">'
1967 s += '<tr>'
1968 for x in range(ncol):
1969 s += '<td style="text-align:center;font-weight:bold" colspan="3">LB&nbsp;range</td><td style="text-align:center;font-weight:bold">L1&nbsp;&nbsp;&nbsp;HLT</td>'
1970 s += '</tr>'
1971
1972 for row in range(nrow):
1973 s += '<tr>'
1974 for col in range(ncol):
1975 entry = row + col*nrow
1976 if entry>=len(linklist):
1977 continue
1978 link = dict(zip( ("startlb", "endlb", "l1psk", "hltpsk", "l1name", "hltname"),linklist[entry]))
1979 link.update({
1980 "smk" : run.result["SMK"],
1981 "db" : "dev1_i8" if int(run.result["SMK"]) < 3000 else "run3"
1982 })
1983 s += f'<td style="padding-left: 0.8em">{link["startlb"]}</td><td>&minus;</td><td>{link["endlb"]}:&nbsp;</td>'
1984 if run.lhcRun < 3:
1985 cellContent = linkRun12.format(**link)
1986 else:
1987 cellContent = linkRun3L1.format(**link) + "&nbsp;|&nbsp;" + linkRun3HLT.format(**link)
1988 s += f'<td style="border-right: 1px solid gray; padding-right: 0.8em">{cellContent}</td>'
1989 s += '</tr>'
1990 s += '</table>'
1991 s += '<hr style="width:100%; background-color: #AAAABB; height:1px; margin-left:0; border:0"/>'
1992 s += '<a href="https://atlas-trigconf.cern.ch/psevo/%i/" target="_blank" title="Obtain prescale evolution for all L1/L2/EF chains of this run in independent window"><font size="-2"><i>Prescale&nbsp;evolution...</i></font></a>' % run.runNr
1993 s+='</td>'
1994 else:
1995 s += '<td style="text-align:center">n.a.</td>'
1996 continue
1997
1998 # -----------------------------------------------------------------------------------------------------------------------
1999
2000 if 'BGS Key' == k:
2001 if v!='n.a.':
2002 smk = int(run.result["SMK"])
2003 bgskOffset = 10000 if (smk<3000 and run.lhcRun==3) else 0
2004
2005 if len(run.stats['BGS Key' ]['blocks'])>0:
2006 s += '<td align="center"><table class="triggerlinktable" align="center"><tr><td style="text-align:left;font-weight:bold" colspan="3">LB&nbsp;range</td><td style="text-align:right;font-weight:bold">BGS</td></tr>'
2007 for bgskey, lbbeg, lbend in run.stats['BGS Key' ]['blocks']:
2008 s += '<tr><td style="text-align:right">%i</td><td style="text-align:right">&minus;</td><td style="text-align:right">%i:&nbsp;</td>' % (lbbeg, lbend-1)
2009 cellContent = (
2010 f'&nbsp;<a href="https://atlas-trigconf.cern.ch/bunchgroups?key={bgskey+bgskOffset}" target="_blank" '
2011 f'title="Obtain bunch group description for BGS Key={bgskey} in independent window"'
2012 f'>{bgskey}</a>'
2013 )
2014 s += f'<td>{cellContent}</td></tr>'
2015 s += '</table>'
2016 s+='</td>'
2017 else:
2018 s += '<td style="text-align:center">n.a.</td>'
2019 else:
2020 s += '<td class="tdna">n.a.</td>'
2021 continue
2022
2023 # -----------------------------------------------------------------------------------------------------------------------
2024
2025 if "SMK" == k:
2026 if v=='n.a.':
2027 s += '<td class="tdna">n.a.</td>'
2028 else:
2029 namecomment = '<div style="font-size:80%%;color:#488AC7"><b>%s</b> (v.%i)</div><div style="width:200px;font-size:60%%;color:#777777;text-align:left">%s</div>' % run.stats['SMK']['info']
2030 s += '<td style="text-align: center;">%s<br>%s</td>' % (v,namecomment)
2031 continue
2032
2033 # -----------------------------------------------------------------------------------------------------------------------
2034
2035 if 'lar:runtype' in k or 'lar:format' in k:
2036 info = LArConfig(k.replace('lar:',''))
2037 try:
2038 s += '<td style="text-align: center">%s<br><font size="-2">(%s)</font></td>' % (v,info[int(v)])
2039 except ValueError:
2040 if v=='n.a.':
2041 s += '<td class="tdna">n.a.</td>'
2042 else:
2043 s += '<td style="text-align: right">%s</td>' % v
2044 continue
2045
2046 # -----------------------------------------------------------------------------------------------------------------------
2047
2048 if 'BPM' == k:
2049
2050 # compute average and RMS BPMs
2051 fullprint = '<table class="triggerlinktable" align="center">'
2052 keys = v.keys()
2053 keys.sort()
2054
2055 # time results
2056 xvec = []
2057 yvec = []
2058 toffset = int(run.sor/1.E9)
2059 deltat = int(run.eor/1.E9) - int(run.sor/1.E9)
2060
2061 # LB axis
2062 xveclb = []
2063 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
2064 lb=idx+1
2065 xveclb.append( [lbtime/1.E9-toffset, (float(lbendtime)-float(lbtime))/1.E9] )
2066
2067 ymin = +1e30
2068 ymax = -1e30
2069 legend = []
2070 for ik,key in enumerate(keys):
2071 y = 0
2072 y2 = 0
2073 xvec.append([])
2074 yvec.append([])
2075 for (val,dte) in v[key]:
2076 y += val
2077 y2 += val*val
2078
2079 ts = time.strptime( dte[:dte.rfind(':')] + '/UTC','%d-%m-%Y %H:%M:%S/%Z' )
2080 tsec = int(calendar.timegm(ts))
2081 xvec[-1].append(tsec - toffset) # time defined with respect to offset
2082 yvec[-1].append(val)
2083
2084 ic = len(v[key])
2085 if ic > 0:
2086 y /= float(ic)
2087 arg = y2/float(ic) - y*y
2088 if arg > 0:
2089 y2 = math.sqrt(arg)
2090 else:
2091 y2 = 0
2092 ymin = min(ymin,y - 1.5*y2)
2093 ymax = max(ymax,y + 1.5*y2)
2094
2095 # fill table
2096 vname = 'unknown'
2097 if 'B1' in key and 'hori' in key:
2098 vname = 'B1&nbsp;horiz.&nbsp;IP'
2099 lname = 'B1 horizont IP pos.'
2100 elif 'B1' in key and 'vert' in key:
2101 vname = 'B1&nbsp;vert.&nbsp;IP'
2102 lname = 'B1 vertical IP pos.'
2103 elif 'B2' in key and 'hori' in key:
2104 vname = 'B2&nbsp;horiz.&nbsp;IP'
2105 lname = 'B2 horizontal IP pos.'
2106 elif 'B2' in key and 'vert' in key:
2107 vname = 'B2&nbsp;vert.&nbsp;IP'
2108 lname = 'B2 vertical IP pos.'
2109 legend.append( lname )
2110 fullprint += '<tr><td style="text-align:left">%s:&nbsp;</td><td>(</td><td style="text-align:right">&nbsp;%s</td><td style="text-align:left">&nbsp;&#177;&nbsp;</td><td style="text-align:left">%.4g</td><td>)&nbsp;um</td><td>&nbsp;&nbsp;&nbsp;</td>' % (vname, ('%.4g' % y).replace('-','&minus;'), y2)
2111
2112 if ik == 0:
2113 fullprint += '<td rowspan="4">REPLACEME</td>'
2114 fullprint += '</tr>'
2115
2116 # write to file (as text and TGraphs)
2117 bpmrootfilename = QC.datapath + '/bpm_output_run%i.root' % run.runNr
2118 SaveGraphsToFile( bpmrootfilename, keys, xvec, yvec, "TimeOffset", toffset )
2119
2120 bpmtextfilename = QC.datapath + '/bpm_output_run%i.txt' % run.runNr
2121 bpmout = open( bpmtextfilename, 'w' )
2122
2123 bpmout.write( '# BPM Output for run %i\n' % run.runNr )
2124 bpmout.write( '# Start - end of run: %s [UTC]\n' % run.timestr('txt') )
2125 bpmout.write( '# Time offset applied below in seconds: %i\n' % int(toffset) )
2126 bpmout.write( '#\n' )
2127 bpmout.write( '# ---------------------------------------------------------------------------------\n' )
2128 for ik,key in enumerate(keys):
2129 bpmout.write( '# Output for variable: "%s"\n' % key )
2130 bpmout.write( '# Format: index / timestamp (seconds) wrt. begin of run / BPM position in microns\n' )
2131 bpmout.write( '#\n' )
2132 for i in range(len(xvec[ik])):
2133 bpmout.write( "%4i %9.2f %14.6f\n" % (i, xvec[ik][i], yvec[ik][i]) )
2134 bpmout.write( '#\n' )
2135 bpmout.write( '# ---------------------------------------------------------------------------------\n' )
2136 bpmout.close()
2137
2138 fullprint += '<tr><td colspan=8><hr style="width:100%; background-color:#999999; height:1px; margin-left:0; border:0"/></td></tr>'
2139 fullprint += '<tr><td colspan=8 style="text-align:left"><a href="%s" target="_blank" title="Tabulated BPM information versus time for run %i"><i>Click here for tabulated BPM values versus time...</i></a></td></tr>' % (bpmtextfilename, run.runNr)
2140 fullprint += '<tr><td colspan=8 style="text-align:left"><a href="%s" target="_blank" title="BPM information versus time for run %i as four TGraph objects in ROOT file"><i>Right-click to download ROOT file with TGraphs...</i></a></td></tr>' % (bpmrootfilename, run.runNr)
2141 fullprint += '</table>'
2142
2143 # make plot
2144 path = makeTimePlotList( xvec, xveclb, yvec, toffset, deltat, ymin, ymax,
2145 'Time of day (UTC)', 'Beam position (microns)', legend,
2146 'bp_vs_time_run_%i' % (run.runNr),
2147 'Beam position versus time of day for run %i' % (run.runNr),
2148 QC.datapath, '' )
2149
2150 replacetxt = '<img src="%s" align="left" width="70px">' % path
2151 fullprint = fullprint.replace('REPLACEME',replacetxt)
2152
2153 # create window and tooltip
2154 wincontent = '<table class=&quot;outer&quot; style=&quot;padding: 5px&quot;><tr><td>'
2155 wincontent += '<strong><b>LHC beam positions at IP verssu time for run %i:</b></strong><br><font size=&quot;-1&quot;><font color=&quot;#888888&quot;>(Begin/end of run: %s)</font></font><hr color=&quot;black&quot; size=1>' % (run.runNr, run.timestr('html', run.runNr != Run.runnropen))
2156 wincontent += '<table style=&quot;padding: 0px&quot;><tr><td>'
2157 wincontent += '<img src=&quot;%s&quot; align=&quot;left&quot;></td>' % path
2158 wincontent += '</td></tr></table>'
2159 wincontent += """<hr color=&quot;red&quot; size=1><font color=&quot;#777777&quot;><font size=&quot;-1&quot;><i><font size=&quot;-2&quot;>Created by AtlRunQuery on: %s</font></i></font></td></tr></table><script type=&quot;text/javascript&quot;></script></body></html>""" % str(datetime.datetime.now())
2160 wincontent += '</td></tr></table>'
2161
2162
2163 openwincmd = HU.OpenWindow(wincontent,title="Summary of LHC information")
2164
2165 # put into html page
2166 s += '<td style="text-decoration:none">%s<div class="showTip BPM stream" style="display:inline;cursor:pointer">%s</div></a></td>' % (tooltipkey, fullprint)
2167 continue
2168
2169 # -----------------------------------------------------------------------------------------------------------------------
2170
2171 if 'ofllumi:' in k:
2172
2173 if ofllumiFlag:
2174 continue
2175 ofllumiFlag = True
2176
2177 # find range with stable beams (requires LHC information to be available)
2178 hasStableBeamsInfo, xvecStb = run.getStableBeamsVector()
2179
2180 # find all channels that should be printed
2181 kref = []
2182 chans = []
2183 tags = []
2184 for kp in Run.ShowOrder:
2185 if 'ofllumi:' in kp.ResultKey:
2186 name, chanstr, tagstr = kp.ResultKey.split(':')
2187 kref.append(kp)
2188 chans.append(chanstr)
2189 tags.append(tagstr)
2190
2191 # get the channel names
2192 chanstr = []
2193 for ch in chans:
2194 ich = int(ch)
2195 if ich in OLCAlgorithms:
2196 chanstr.append(OLCAlgorithms[ich])
2197 else:
2198 chanstr.append('Unknown')
2199
2200 # insert events per LB
2201 xvec = []
2202 yvec = []
2203 peaklumi = []
2204 intlumi = []
2205 intlumiStb = []
2206 for ikp,kp in enumerate(kref):
2207 yvec.append([])
2208 peaklumi.append(-1)
2209 intlumi.append(0)
2210 intlumiStb.append(0)
2211 for entry in run.data[kp]:
2212 if entry.startlb == 0:
2213 continue
2214 val = entry.value if entry.value!='n.a.' and entry.value>0 else 0
2215 lastlb = min(entry.lastlb,run.lastlb)
2216 lbs = range(entry.startlb,lastlb+1)
2217 if ikp == 0:
2218 xvec += lbs
2219 yvec[-1] += len(lbs)*[float(val)]
2220
2221
2222 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
2223 lb=idx+1
2224 dt = (float(lbendtime)-float(lbtime))/1.E9
2225 for ich in range(len(chans)):
2226 tmp = yvec[ich]
2227 intlumi[ich] += tmp[idx]*dt/1000.0 # unit of yvec was: ub-1 s-1 -> nb-1
2228 if lb in xvecStb:
2229 intlumiStb[ich] += yvec[ich][idx]*dt/1000.0
2230
2231 yvec[ich][idx] *= 1.0 # unit of yvec was: ub-1 s-1, transform to: 10^30 cm-2s-1
2232 if yvec[ich][idx] > peaklumi[ich]:
2233 peaklumi[ich] = yvec[ich][idx]
2234
2235 # line to be printed in column
2236 fullprint_ = ''
2237 if hasStableBeamsInfo:
2238 for ich,ch in enumerate(chans):
2239 fullprint_ += 'Integrated&nbsp;(channel:&nbsp;%s):&nbsp;%0.4g<br>Stable&nbsp;B:&nbsp;%0.4g<br>' % (ch,intlumi[ich],intlumiStb[ich])
2240 histoText = 'Integr. lumi (channel: %i): %.4g nb-1 (all LBs) and %.4g nb-1 (stable beams)' % (0, intlumi[0],intlumiStb[0])
2241 else:
2242 for ich,ch in enumerate(chans):
2243 fullprint_ += 'Integrated&nbsp;(channel:&nbsp;%s):&nbsp;%0.4g<br>' % (ch,intlumi[ich])
2244 histoText = 'Integr. lumi (channel: %i): %.4g nb-1 (all LBs)' % (0, intlumi[0])
2245
2246 # make plot
2247 path = makeLBPlotList( xvec, xvecStb, yvec,
2248 'Luminosity block number', 'Offline luminosity (10^{30}cm^{-2}s^{-1})', chanstr,
2249 'ofllumi%s_vs_lb_run_%i' % (chans[0],run.runNr),
2250 'Offline lumi per LB for run %i' % (run.runNr),
2251 QC.datapath, histoText )
2252
2253 # create window and tooltip
2254 wincontent = '<table class=&quot;outer&quot; style=&quot;padding: 5px&quot;><tr><td>'
2255 wincontent += '<strong><b>Offline luminosity per LB for run %i:</b></strong><br><font size=&quot;-1&quot; color=&quot;#888888&quot;>(Begin/end of run: %s)</font>' % (run.runNr, run.timestr('html', run.runNr != Run.runnropen))
2256 wincontent += '<hr color=&quot;black&quot; size=1>'
2257 wincontent += '<table style=&quot;padding: 0px&quot;><tr><td>'
2258 wincontent += '<img src=&quot;%s&quot; align=&quot;left&quot;>' % path
2259 wincontent += '</td></tr></table>'
2260 wincontent += '<hr color=&quot;black&quot; size=1>'
2261 wincontent += '<table class=&quot;LB&quot;>'
2262 wincontent += '<tr><th>LB</th><th>Start time<br> (%s)</th><th>Duration<br>(sec)</th>' % QC.tzdesc()
2263 for ch in chanstr:
2264 wincontent += '<th>Inst. luminosity<br>(1e%s&nbsp;cm<sup>&minus;2</sup>s<sup>&minus;1</sup>)<br>[ %s ]</th>' % (run.instlumiunittxt,ch)
2265 wincontent += '<th>Stable beams</th>'
2266 wincontent += '</tr><tr style=&quot;background:%s&quot;>' % '#eeeeee'
2267 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
2268 lb=idx+1
2269 stbBeams = '&minus;'
2270 if lb in xvecStb:
2271 stbBeams = 'T'
2272 timetuple = time.localtime(lbtime/1.E9) if QC.localtime else time.gmtime(lbtime/1.E9)
2273 wincontent += '<td>%i</td><td>%s</td><td>%.2f</td>' % (lb, time.strftime("%X",timetuple), (float(lbendtime)-float(lbtime))/1.E9)
2274 for ich in range(len(chans)):
2275 wincontent += '<td>%.4g</td>' % (yvec[ich][idx])
2276 wincontent += '<td>%s</td>' % stbBeams
2277 if idx%2!=0:
2278 col = '#eeeeee'
2279 else:
2280 col = '#ffffff'
2281 wincontent += '</tr><tr style=&quot;background:%s&quot;>' % col
2282 if run.runNr == Run.runnropen: # run still ongoing
2283 wincontent += '<tr><td style=&quot;text-align:left&quot;colspan=&quot;3&quot;><i>&nbsp;&nbsp;Run still ongoing ...</i></td></tr>'
2284 wincontent += '</tr></table>'
2285 wincontent += """<hr color=&quot;red&quot; size=1><font color=&quot;#777777&quot;><font size=&quot;-1&quot;><i><font size=&quot;-2&quot;>Created by AtlRunQuery on: %s</font></i></font></td></tr></table><script type=&quot;text/javascript&quot;></script></body></html>""" % str(datetime.datetime.now())
2286 wincontent += '</td></tr></table>'
2287
2288 openwincmd = HU.OpenWindow(wincontent,title="Run query result for online luminosity")
2289
2290 # line to be printed in column
2291 fullprint = '<table class="bcidtable">'
2292 fullprint += '<tr><td colspan="2"><img src="%s" align="left" width="90px"></td></tr>' % path
2293 if hasStableBeamsInfo:
2294 for ich in range(len(chans)):
2295 fullprint += '<tr><td style="text-align:left">Entire&nbsp;run:</td><td style="text-align:left">&nbsp;%0.4g&nbsp;%s<sup>&minus;1</sup></td></tr><tr><td style="text-align:left">Stable&nbsp;beams:</td><td style="text-align:left">&nbsp;%0.4g&nbsp;%s<sup>&minus;1</sup></td></tr><tr><td style="text-align:left">Peak&nbsp;lumi:</td><td style="text-align:left">&nbsp;%0.3g&nbsp;e%s&nbsp;cm<sup>&minus;2</sup>s<sup>&minus;1</sup></td></tr>' % (intlumi[ich], run.lumiunittxt, intlumiStb[ich], run.lumiunittxt, peaklumi[ich], run.instlumiunittxt)
2296 else:
2297 for ich in range(len(chans)):
2298 fullprint += '<td style="text-align:left">All&nbsp;LBs:</td><td style="text-align:left">&nbsp;%0.4g</td></tr>' % (intlumi[ich])
2299 fullprint += '</table>'
2300
2301 # put into html page
2302 s += '<td class="showTip OFLLumi stream" style="text-decoration:none; text-align: right">%s%s</a></td>' % (openwincmd, fullprint)
2303 continue
2304
2305 # -----------------------------------------------------------------------------------------------------------------------
2306
2307 if any( [ ('lhc:' in k and 'beamenergy' not in k),
2308 ('TorCurrent' in k),
2309 ('SolCurrent' in k),
2310 ('bs:' in k),
2311 ('Ready for physics' in k),
2312 ] ):
2313 res = []
2314 keys = []
2315
2316 # search unique ranges
2317 for entry in run.data[k]:
2318 if entry.startlb == 0:
2319 continue
2320 val = entry.value
2321
2322 try:
2323 val = float(val)
2324 if 'bs:' not in k and 'ofllumi:' not in k and 'beam1intensity' not in k and 'beam2intensity' not in k:
2325 val = round(val) # no floating points, unless it is 'bs'
2326 except ValueError:
2327 pass
2328
2329 # special treatment for E-beam = 7864
2330 if 'beamenergy' in k and val>=7864:
2331 val = 'ASYNC'
2332
2333 if not keys or res[-1] != val:
2334 if keys:
2335 keys[-1][1] = entry.startlb
2336 res.append ( val )
2337 keys.append( [entry.startlb, entry.endlb] )
2338 elif res[-1] == val:
2339 keys[-1][1] = entry.endlb
2340
2341
2342 if len(keys) > 1:
2343 s += '<td><table class="triggerlinktable" align="center">'
2344 for i, c in enumerate(keys):
2345 if int(c[0]) != int(c[1])-1:
2346 s += '<tr><td>LB&nbsp;</td><td style="text-align:right">%i</td><td style="text-align:right">&minus;</td><td style="text-align:right">%i:&nbsp;</td>' % (int(c[0]),int(c[1])-1)
2347 else:
2348 s += '<tr><td>LB&nbsp;</td><td style="text-align:right">%i</td><td style="text-align:right"></td><td style="text-align:right">:&nbsp;</td>' % (int(c[0]))
2349 try:
2350 val = float(res[i])
2351 if 'bs:' in k or 'beam1intensity' in k or 'beam2intensity' in k:
2352 vt = '%.4g' % abs(val)
2353 if val < 0:
2354 vt = '&minus;' + vt
2355 if 'e-' in vt:
2356 vt = vt.replace('e-','e&minus;')
2357 s += '<td style="text-align:right">%s</td></tr>' % vt
2358 elif 'ofllumi:' in k:
2359 s += '<td style="text-align:right">%g</td></tr>' % val
2360 else:
2361 s += '<td style="text-align:right">%i</td></tr>' % round(val)
2362 except ValueError:
2363 s += '<td style="text-align:left">%s</td></tr>' % res[i].strip()
2364 s += '</table></td>'
2365
2366 else:
2367 try:
2368 if 'bs:' in k:
2369 vt = '%.4g' % abs(float(v))
2370 if float(v) < 0:
2371 v = '&minus;' + vt
2372 else:
2373 v = vt
2374 if 'e-' in v:
2375 v = v.replace('e-','e&minus;')
2376 else:
2377 v = round(float(v))
2378 if 'beamenergy' in k and v >= 7864:
2379 v = 'ASYNC'
2380 else:
2381 v = '%i' % v
2382 except ValueError:
2383 pass
2384 s += '<td style="text-align:center;font-size: 85%%">%s</td>' % v
2385
2386
2387 if ('lhc:stablebeams' in k and 'lhc:beamenergy' in Run.ShowOrder and 'lhc:beammode' not in Run.ShowOrder) or 'lhc:beammode' in k:
2388 imgpath, xvec, yvec, ymax = HU.makeSummaryPlotForLHC(run)
2389 wincontent = HU.makeSummaryPageForLHC(run, yvec, imgpath)
2390 openwincmd = HU.OpenWindow(wincontent, 'Summary of LHC information')
2391 fullprint = '<table class="bcidtable">'
2392 fullprint += '<tr><td><img src="%s" align="left" width="90px"></td></tr>' % imgpath
2393 fullprint += '<tr><td style="text-align:left">Maximum&nbsp;intensities:<br>Beam&nbsp;1:&nbsp;%0.3g&nbsp;e11&nbsp;protons<br>Beam&nbsp;2:&nbsp;%0.3g&nbsp;e11&nbsp;protons</td></tr>' % (ymax[0], ymax[1])
2394 fullprint += '<tr><td style="text-align:left">Maximum&nbsp;beam&nbsp;energy:<br>%i&nbsp;GeV</td></tr>' % int(ymax[2])
2395 fullprint += '</table>'
2396 fullprint += '<span style="font-size: xx-small; color: #555555">[ <i>Numbers given for stable beam period (if applies)</i> ]</span>'
2397 # put into html page
2398 s += '<td class="showTip LHCSummary stream" style="text-decoration:none; text-align: left">%s %s </a></td>' % (openwincmd, fullprint)
2399
2400 continue
2401
2402 # -----------------------------------------------------------------------------------------------------------------------
2403
2404 # all others
2405 if v=='n.a.':
2406 s += '<td class="tdna">n.a.</td>'
2407 else:
2408 s += '<td style="text-align: right">%s</td>' % v
2409
2410
2411 s += "</tr>\n\n"
2412
2413
2416
2417 # here we start filling the tooltips. there are quite a lot and we should be a bit smarter about them.
2418 # For instance, there is no need to define the whole table for each single box
2419
2420 with timer("Tooltips"):
2421 createToolTips(run)
2422
2423 return s
2424
2425
2426
#define min(a, b)
Definition cfImp.cxx:40
#define max(a, b)
Definition cfImp.cxx:41
STL class.
std::string replace(std::string s, const std::string &s2, const std::string &s3)
Definition hcg.cxx:310

◆ createToolTips()

python.AtlRunQueryRun.createToolTips ( run)

Definition at line 2427 of file AtlRunQueryRun.py.

2427def createToolTips(run):
2428 import CoolRunQuery.html.AtlRunQueryHtmlUtils as HU
2429
2430 HU.CreateLBTooltip(run)
2431
2432 # DQ DEFECTS
2433 if 'DQ' in Run.ShowOrder:
2434 HU.CreateDQTooltip(run)
2435
2436 # stream overlaps
2437 for k in [k for k in Run.ShowOrder if k.Type==DataKey.STREAM and k.ResultKey in run.stats]:
2438 HU.CreateStreamOverlapTooltip(run, k)
2439
2440 # DQ (old)
2441 for data_key in Run.ShowOrder:
2442 k = data_key.ResultKey
2443 if not isDQ(k):
2444 continue
2445 if k not in run.stats:
2446 continue
2447 commentbox = ''
2448 for (dq,comment), start, end in run.stats[k]["blocks"]:
2449 if dq != 'n.a.':
2450 if not comment:
2451 comment = 'no comment'
2452 col = "#000000"
2453 if dq == 'R':
2454 col = "#AA0000"
2455 elif dq == 'G':
2456 col = "#006600"
2457 elif dq == 'Y':
2458 col = "#716309"
2459 if start == end-1:
2460 commentbox += '<tr style="color:%s"><td style="vertical-align:top;">LB&nbsp;</td><td style="text-align:right;vertical-align:top;">%s</td><td style="text-align:right;vertical-align:top;"></td><td style="text-align:right;vertical-align:top;">&nbsp;(%s)&nbsp;:&nbsp;</td><td style="text-align:left;vertical-align:top;"><i><strong><b>"%s"</b></strong></i></td></tr>' % (col,start,dq,comment)
2461 else:
2462 commentbox += '<tr style="color:%s"><td style="vertical-align:top;">LB&nbsp;</td><td style="text-align:right;vertical-align:top;">%s</td><td style="text-align:right;vertical-align:top;">&minus;</td><td style="text-align:right;vertical-align:top;">%s&nbsp;(%s)&nbsp;:&nbsp;</td><td style="text-align:left;vertical-align:top;"><i><strong><b>"%s"</b></strong></i></td></tr>' % (col,start,end-1,dq,comment)
2463 else:
2464 if start == end-1:
2465 commentbox += '<tr style="color:#222222"><td style="vertical-align:top;">LB&nbsp;</td><td style="text-align:right;vertical-align:top;">%s</td><td style="text-align:right;vertical-align:top;"></td><td style="text-align:right;vertical-align:top;">&nbsp;(n.a.)&nbsp;</td><td style="text-align:left;vertical-align:top;"></td></tr>' % (start)
2466 else:
2467 commentbox += '<tr style="color:#222222"><td style="vertical-align:top;">LB&nbsp;</td><td style="text-align:right;vertical-align:top;">%s</td><td style="text-align:right;vertical-align:top;">&minus;</td><td style="text-align:right;vertical-align:top;">%s&nbsp;(n.a.)&nbsp;</td><td style="text-align:left;vertical-align:top;"></td></tr>' % (start,end-1)
2468 if commentbox:
2469 sp = k.split(':')
2470 commentbox = '<strong><b>Comments&nbsp;for&nbsp;%s&nbsp;DQ&nbsp;channel&nbsp;"%s"&nbsp;in&nbsp;run&nbsp;%s:</b></strong>' % (sp[0],sp[1],run.runNr) + '<table>' + commentbox
2471 commentbox += '</table>'
2472 run.addToolTip( "dqcomm_%s_%i" % (k, run.runNr), commentbox)
2473
2474
2475 # trigger keys
2476 lbtrigtypes = { 'L1 PSK': ['L1&nbsp;PSK', 'L1K'], 'HLT PSK' : ['HLT&nbsp;PSK','HLTK'] }
2477 for lbtrigtype, c in lbtrigtypes.items():
2478 if lbtrigtype in Run.ShowOrder and 'blocks' in run.stats[lbtrigtype] and len(run.stats[lbtrigtype]['blocks'])>1:
2479 boxcontent = '<strong><b>%s&nbsp;evolved&nbsp;during&nbsp;run:</b></strong><br>' % c[0]
2480 boxcontent += '<table style="width: auto; border: 0px solid; border-width: margin: 0 0 0 0; 0px; border-spacing: 0px; border-collapse: separate; padding: 0px; font-size: 100%">'
2481 for item, start, stop in run.stats[lbtrigtype]['blocks']:
2482 boxcontent += '<tr><td>LB&nbsp;</td><td style="text-align:right">%s</td><td style="text-align:right">&minus;</td><td style="text-align:right">%s</td><td style="text-align:right">:&nbsp;%s</td></tr>' % (start,stop-1,item)
2483 boxcontent += '</table>'
2484 run.addToolTip("%s_%i" % (c[1], run.runNr), boxcontent)
2485
2486
2487 # OLC BCID
2488 if any([k for k in Run.ShowOrder if "olc:bcidmask" in k.ResultKey]):
2489 boxcontent = Run.TmpBoxContent
2490 if boxcontent:
2491 Run.addGlobalToolTip("OLCBCID_%i" % run.runNr, boxcontent)
2492

Variable Documentation

◆ _fW

dict python.AtlRunQueryRun._fW = {'Run' : 12, 'NLB': 5, 'Time': 50, '#Events': 10, 'Stream': 10}
protected

Definition at line 32 of file AtlRunQueryRun.py.