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
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:
986
987 if run.runNr == Run.runnropen:
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
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
1000 if run.runNr in Run.PromptCalibRuns:
1001 s += '<br><font color="#008800"><font size="-2">(in calib loop)</font></font>'
1002 s += '</td>'
1003
1004
1005 s += '\n <td>\n%s</td>' % run.runlinks()
1006
1007
1008 lbcontent = '%s' % run.NrLBs
1009 try:
1010 vf = float(run.NrLBs)
1011 if vf > 0:
1012 lbcontent = '%s<br><font size="-2">(%i 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
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)
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
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
1043 ofllumiFlag = False
1044
1045
1046
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
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:
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':
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
1102 matching_dqentries_ready = []
1103 for (defect, listLBranges) in matching_dqentries:
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> </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−%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):
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:
1145 extraDQInfo += '<tr><td class="td%s" style="min-width: 45px; text-align: left; border-width: 0px; padding:1px;"> LB %g:</td><td class="td%s" style="text-align: left; border-width: 0px; padding: 1px; ">%s </td></tr>' % (dqcss,start,dqcss,dq)
1146 else:
1147 extraDQInfo += '<tr><td class="td%s" style="min-width: 45px; text-align: left; border-width: 0px; padding:1px;"> LB %g−%g:</td><td class="td%s" style="text-align: left; border-width: 0px; padding: 1px; ">%s </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
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
1175 hasStableBeamsInfo, xvecStb = run.getStableBeamsVector()
1176
1177
1178 printMu = 'olc:bcidmask' in Run.SortedShowOrder() and run.runNr>=151260 and run.givepeakmuinfo
1179
1180
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
1194 intlumi, intlumiStb = (0, 0)
1195
1196
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
1213 yvec[idx] *= 1.0*run.lumiunit
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))
1229
1230
1231 if hasStableBeamsInfo:
1232 fullprint_ = 'All LBs: %0.4g<br>Stable B: %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 LBs: %0.4g' % (intlumi)
1236 histoText = 'Integrated luminosity: %.4g %s-1 (all LBs)' % (intlumi,run.lumiunittxt)
1237
1238
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
1255 wincontent = '<table class="outer" style="padding: 5px"><tr><td>'
1256 wincontent += '<strong><b>Online luminosity [algorithm: %s] per LB for run %i:</b></strong><br><font size="-1" color="#888888">(Begin/end of run: %s)</font>' % (chanstr, run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1257 wincontent += '<hr color="black" size=1>'
1258 wincontent += '<table style="padding: 0px"><tr><td>'
1259 wincontent += '<img src="%s" align="left">' % path
1260 wincontent += '</td></tr></table>'
1261 wincontent += '<hr color="black" size=1>'
1262 wincontent += '<table class="LB">'
1263 wincontent += '<tr><th>LB</th><th>Start time<br> (%s)</th><th>Duration<br>(sec)</th><th>Inst. luminosity<br>(1e%s cm<sup>−2</sup>s<sup>−1</sup>)</th>' % (QC.tzdesc(), run.instlumiunittxt)
1264 wincontent += '<th>Int. luminosity<br>(%s<sup>−1</sup>)</th><th>Cumul. luminosity<br>(%s<sup>−1</sup>)</th>' % (run.lumiunittxt, run.lumiunittxt)
1265 if printMu:
1266 wincontent += '<th> <μ> </th>'
1267 if hasStableBeamsInfo:
1268 wincontent += '<th>Stable beams</th>'
1269 wincontent += '</tr><tr style="background:%s">' % '#eeeeee'
1270 intlumi = 0
1271 mumax = -1
1272 minBiasXsec = 80.0 if Selector.isRun2() else 71.5
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 '−'
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
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
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="background:%s">' % 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:
1328 wincontent += '<tr><td style="text-align:left"colspan="3"><i> Run still ongoing ...</i></td></tr>'
1329 wincontent += '</tr></table>'
1330
1331 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())
1332 wincontent += '</td></tr></table>'
1333
1334 openwincmd = '<a href="javascript:openLargeWindow('
1335 openwincmd += "'Print','<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html xmlns:"my"><head><title>Run query result for online luminosity</title><LINK href="html/atlas-runquery-lb.css" rel="stylesheet" type="text/css"></head><body><table style="font-family: sans-serif; font-size: 85%%">"
1336 openwincmd += wincontent
1337 openwincmd += "')\">"
1338
1339
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 run:</td><td style="text-align:left"> %0.4g %s<sup>−1</sup></td></tr><tr><td style="text-align:left">Stable beams:</td><td style="text-align:left"> %0.4g %s<sup>−1</sup></td></tr><tr><td style="text-align:left">Peak lumi:</td><td style="text-align:left"> %.2g e%s cm<sup>−2</sup>s<sup>−1</sup></td></tr><tr><td style="text-align:left">Peak <μ>:</td><td style="text-align:left"> %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. lifetime:</td><td style="text-align:left"> %0.2g h</td></tr>' % (lifetime)
1346 else:
1347 fullprint += '<td style="text-align:left">All LBs:</td><td style="text-align:left"> %0.4g</td></tr>' % (intlumi)
1348 fullprint += '</table>'
1349
1350
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:
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
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="outer" style="padding: 5px"><tr><td>'
1368 wincontent += '<strong><b>Identifiers (BCID) for paired and unpaired bunches for run %i:</b></strong><br><font size="-1" color="#888888">(Begin/end of run: %s)</font>' % (run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1369 wincontent += '<hr color="black" size=1>'
1370 wincontent += '<table class="bcidtable" align="center"><tr class="tr0"><td style="text-align:left;font-weight:bold" colspan="3">LB range</td><td style="text-align:right;font-weight:bold"> Stable<br>beams</td><td style="text-align:right;font-weight:bold">%s</td><td style="text-align:right;font-weight:bold">%s</td><td style="text-align:right;font-weight:bold">%s</td></tr>' % (' Crossing (Paired)', '<nobr> Unpaired Beam-1 </nobr>', '<nobr> Unpaired Beam-2</nobr>')
1371 ic = 0
1372
1373
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
1382 isInStableBeamPeriod = False
1383 stableBeamWord = '−'
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="%s"><td class="td1" style="text-align:right"><b>%s</b></td><td style="text-align:right"><b>−</b></td><td style="text-align:right"><b>%s:</b> </td><td>%s </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
1396 if not unpaired1:
1397 unpaired1 = ['−']
1398 if not unpaired2:
1399 unpaired2 = ['−']
1400 if not beam12:
1401 beam12 = ['−']
1402
1403
1404 if isInStableBeamPeriod and first and not noBunches:
1405 first = False
1406
1407 maxBunchDistanceInTrain = 6
1408 if int(run.runNr) > 168665:
1409 maxBunchDistanceInTrain = 25
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: </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
1429
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
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"> BCID range</td></tr>'
1442 for it, train in enumerate(trains):
1443 Run.TmpBoxContent += '<tr><td> %i: </td><td> %i</td><td style="text-align:right"><nobr> %i − %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="td1" style="text-align:right">%s</td><td style="text-align:right; border-left:1px #C0C0D0 solid;border-right:1px #C0C0D0 solid">%s</td><td style="text-align:right">%s</td>' % (
', '.join(
map(str,beam12)),
', '.join(
map(str,unpaired1)),
', '.join(
map(str,unpaired2)) )
1452 else:
1453 wincontent += '<td class="td1" style="text-align:right">%s</td><td style="text-align:right">%s</td><td style="text-align:right">%s</td>' % ('−','−','−')
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
1464
1465
1466
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
1477 refkey = 'bs:Sig-X'
1478 statkey = 'bs:Status'
1479
1480 onloffltype = 'Online' if (run.stats['Beamspot']=='online') else 'Offline'
1481
1482
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)]
1507 yvecSt += [stat]
1508 bsidx += [idx] * nlb
1509 idx += 1
1510
1511
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
1567 wincontent = '<table class="outer" style="padding: 5px"><tr><td>'
1568 wincontent += '<strong><b>%s beamspot %s per LB for run %i:</b></strong><br><font size="-1"><font color="#888888">(Begin/end of run: %s)</font></font><hr color="black" size=1>' % (onloffltype, bstype, run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1569 wincontent += '<table style="padding: 0px"><tr><td>'
1570 wincontent += '<img src="%s" align="left">' % (path)
1571 wincontent += '</td></tr></table>'
1572 wincontent += '<hr color="black" size=1>'
1573
1574 wincontent += '<table style="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; ">'
1575 wincontent += '<tr><th style="text-align:right">LB</th><th style="text-align:right"> Start time<br> (%s)</th><th style="text-align:right"> Duration<br>(sec)</th><th style="text-align:right"> Beamspot %s<br>(mm)</th><th style="text-align:right"> Fit status</th>' % (QC.tzdesc(),bstype)
1576 wincontent += '</tr><tr style="background:%s">' % '#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="text-align:right"> %s</td>' % lb
1581 wincontent += '<td style="text-align:right"> %s</td>' % time.strftime("%X",timetuple)
1582 wincontent += '<td style="text-align:right">%.2f</td>' % ((float(lbendtime)-float(lbtime))/1.E9)
1583 wincontent += '<td style="text-align:right">%.4g ± %.2g</td>' % yvec[bsidx[idx]]
1584 wincontent += '<td style="text-align:right">%i</td>' % yvecSt[bsidx[idx]]
1585
1586 if idx%2!=0:
1587 col = '#eeeeee'
1588 else:
1589 col = '#ffffff'
1590 wincontent += '</tr><tr style="background:%s">' % col
1591 if run.runNr == Run.runnropen:
1592 wincontent += '<tr><td style="text-align:left"colspan="3"><i> Run still ongoing ...</i></td></tr>'
1593 wincontent += '</tr></table>'
1594
1595 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())
1596 wincontent += '</td></tr></table>'
1597
1598 openwincmd = '<a href="javascript:openWindow('
1599 openwincmd += "'Print','<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">"
1600 openwincmd += "<html><head><title>Run query result for the %s beamspot</title><LINK href="html/atlas-runquery-lb.css" rel="stylesheet" type="text/css"></head>" % (onloffltype.lower())
1601 openwincmd += "<body><table style="font-family: sans-serif; font-size: 85%">"
1602 openwincmd += wincontent
1603 openwincmd += "</table></body></html>"
1604 openwincmd += "')\">"
1605
1606
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 %s:</td></tr><tr><td style="text-align:left"><nobr> %0.3g ± %.2g (RMS)</nobr></td></tr>' % (bstype, vave, eave)
1612 fullprint += '</table>'
1613
1614
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
1627 durInSec = (run.eor-run.sor)/1.0E9
1628 rate = 'n.a. Hz'
1629 try:
1630 if durInSec > 0:
1631 rate = '%.3f Hz' % (v[0]/durInSec)
1632 except ValueError:
1633 pass
1634 strevents = v[0]
1635 strsize = v[1]
1636
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
1650 maxrate = -1
1651 averate = 0
1652 nc = 0
1653
1654
1655 lbrecinfo = run.stats[k]['LBRecInfo']
1656
1657 isPhysicsStream = lbrecinfo is not None and len(lbrecinfo)>0
1658 if isPhysicsStream:
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
1681 hasStableBeamsInfo, xvecStb = run.getStableBeamsVector()
1682
1683
1684 wincontent = '<table class="outer" style="padding: 5px">'
1685 wincontent += '<tr><td><b>Number of events and rates per LB for stream %s run %i:</b><br><font size="-1"><font color="#888888">(Begin/end of run: %s)</font></font><hr color="black" size=1>' % (streamName, run.runNr, run.timestr('html', run.runNr != Run.runnropen))
1686
1687
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 = '−'
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
1734 if nc>0:
1735 averate /= float(nc)
1736
1737 if run.runNr == Run.runnropen:
1738 wincontent += '<tr><td style="text-align:left"colspan="3"><i> 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
1746 tooltipkey = "STROV_%i_%s" % (run.runNr, streamName)
1747
1748 physStrOnlyInfo = ""
1749 if isPhysicsStream:
1750 maxrate = 'max: %.2f Hz' % (maxrate)
1751 averate = 'ave: %.2f Hz' % (averate)
1752 physStrOnlyInfo = "%s,<br>%s,<br>%s, " % (maxrate, averate, fracstr)
1753 debugStrLink = ""
1754 if 'debug_' in k:
1755 debugStrLink =
' <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
1760 tdcontent = '<div class="showTip %s stream" style="display:inline;cursor:pointer">%s</div>' % (tooltipkey, tdcontent)
1761
1762 if isPhysicsStream:
1763
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":
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
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
1835 st = [' %s files' % (prettyNumber(ds[4]))]
1836 st += [' %s' % (filesize(ds[5]))]
1837 if ds[6] == 0:
1838 st += [' unkn. evts ']
1839 else:
1840 st += [' %s evts ' % (prettyNumber(ds[6]))]
1841 selectedds[ds[0]] = st
1842
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]]
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>[ Stream type + processing step + data type: <b>%s</b> + <b>%s</b> + <b>%s</b> ]</i> </font></td></tr>' % (stype, step, dtype)
1862 for dsname in dsnames:
1863
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"> [</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"> [ on CAF ]</font></a></td>'
1886
1887
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"> [ on CAF ]</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"> [ in DDM ]</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
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
1922 s += '</table>\n'
1923 s += '</td>'
1924
1925
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
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} | {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 range</td><td style="text-align:center;font-weight:bold">L1 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>−</td><td>{link["endlb"]}: </td>'
1984 if run.lhcRun < 3:
1985 cellContent = linkRun12.format(**link)
1986 else:
1987 cellContent = linkRun3L1.format(**link) + " | " + 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 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 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">−</td><td style="text-align:right">%i: </td>' % (lbbeg, lbend-1)
2009 cellContent = (
2010 f' <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
2051 fullprint = '<table class="triggerlinktable" align="center">'
2052 keys = v.keys()
2053 keys.sort()
2054
2055
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
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)
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
2096 vname = 'unknown'
2097 if 'B1' in key and 'hori' in key:
2098 vname = 'B1 horiz. IP'
2099 lname = 'B1 horizont IP pos.'
2100 elif 'B1' in key and 'vert' in key:
2101 vname = 'B1 vert. IP'
2102 lname = 'B1 vertical IP pos.'
2103 elif 'B2' in key and 'hori' in key:
2104 vname = 'B2 horiz. IP'
2105 lname = 'B2 horizontal IP pos.'
2106 elif 'B2' in key and 'vert' in key:
2107 vname = 'B2 vert. IP'
2108 lname = 'B2 vertical IP pos.'
2109 legend.append( lname )
2110 fullprint +=
'<tr><td style="text-align:left">%s: </td><td>(</td><td style="text-align:right"> %s</td><td style="text-align:left"> ± </td><td style="text-align:left">%.4g</td><td>) um</td><td> </td>' % (vname, (
'%.4g' % y).
replace(
'-',
'−'), y2)
2111
2112 if ik == 0:
2113 fullprint += '<td rowspan="4">REPLACEME</td>'
2114 fullprint += '</tr>'
2115
2116
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
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
2154 wincontent = '<table class="outer" style="padding: 5px"><tr><td>'
2155 wincontent += '<strong><b>LHC beam positions at IP verssu time for run %i:</b></strong><br><font size="-1"><font color="#888888">(Begin/end of run: %s)</font></font><hr color="black" size=1>' % (run.runNr, run.timestr('html', run.runNr != Run.runnropen))
2156 wincontent += '<table style="padding: 0px"><tr><td>'
2157 wincontent += '<img src="%s" align="left"></td>' % path
2158 wincontent += '</td></tr></table>'
2159 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())
2160 wincontent += '</td></tr></table>'
2161
2162
2163 openwincmd = HU.OpenWindow(wincontent,title="Summary of LHC information")
2164
2165
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
2178 hasStableBeamsInfo, xvecStb = run.getStableBeamsVector()
2179
2180
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
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
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
2228 if lb in xvecStb:
2229 intlumiStb[ich] += yvec[ich][idx]*dt/1000.0
2230
2231 yvec[ich][idx] *= 1.0
2232 if yvec[ich][idx] > peaklumi[ich]:
2233 peaklumi[ich] = yvec[ich][idx]
2234
2235
2236 fullprint_ = ''
2237 if hasStableBeamsInfo:
2238 for ich,ch in enumerate(chans):
2239 fullprint_ += 'Integrated (channel: %s): %0.4g<br>Stable B: %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 (channel: %s): %0.4g<br>' % (ch,intlumi[ich])
2244 histoText = 'Integr. lumi (channel: %i): %.4g nb-1 (all LBs)' % (0, intlumi[0])
2245
2246
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
2254 wincontent = '<table class="outer" style="padding: 5px"><tr><td>'
2255 wincontent += '<strong><b>Offline luminosity per LB for run %i:</b></strong><br><font size="-1" color="#888888">(Begin/end of run: %s)</font>' % (run.runNr, run.timestr('html', run.runNr != Run.runnropen))
2256 wincontent += '<hr color="black" size=1>'
2257 wincontent += '<table style="padding: 0px"><tr><td>'
2258 wincontent += '<img src="%s" align="left">' % path
2259 wincontent += '</td></tr></table>'
2260 wincontent += '<hr color="black" size=1>'
2261 wincontent += '<table class="LB">'
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 cm<sup>−2</sup>s<sup>−1</sup>)<br>[ %s ]</th>' % (run.instlumiunittxt,ch)
2265 wincontent += '<th>Stable beams</th>'
2266 wincontent += '</tr><tr style="background:%s">' % '#eeeeee'
2267 for idx,(lbtime,lbendtime) in enumerate(run.lbtimes):
2268 lb=idx+1
2269 stbBeams = '−'
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="background:%s">' % col
2282 if run.runNr == Run.runnropen:
2283 wincontent += '<tr><td style="text-align:left"colspan="3"><i> Run still ongoing ...</i></td></tr>'
2284 wincontent += '</tr></table>'
2285 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())
2286 wincontent += '</td></tr></table>'
2287
2288 openwincmd = HU.OpenWindow(wincontent,title="Run query result for online luminosity")
2289
2290
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 run:</td><td style="text-align:left"> %0.4g %s<sup>−1</sup></td></tr><tr><td style="text-align:left">Stable beams:</td><td style="text-align:left"> %0.4g %s<sup>−1</sup></td></tr><tr><td style="text-align:left">Peak lumi:</td><td style="text-align:left"> %0.3g e%s cm<sup>−2</sup>s<sup>−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 LBs:</td><td style="text-align:left"> %0.4g</td></tr>' % (intlumi[ich])
2299 fullprint += '</table>'
2300
2301
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
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)
2326 except ValueError:
2327 pass
2328
2329
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 </td><td style="text-align:right">%i</td><td style="text-align:right">−</td><td style="text-align:right">%i: </td>' % (int(c[0]),int(c[1])-1)
2347 else:
2348 s += '<tr><td>LB </td><td style="text-align:right">%i</td><td style="text-align:right"></td><td style="text-align:right">: </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 = '−' + vt
2355 if 'e-' in vt:
2356 vt = vt.replace('e-','e−')
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 = '−' + vt
2372 else:
2373 v = vt
2374 if 'e-' in v:
2375 v = v.replace('e-','e−')
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 intensities:<br>Beam 1: %0.3g e11 protons<br>Beam 2: %0.3g e11 protons</td></tr>' % (ymax[0], ymax[1])
2394 fullprint += '<tr><td style="text-align:left">Maximum beam energy:<br>%i 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
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
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
2418
2419
2420 with timer("Tooltips"):
2421 createToolTips(run)
2422
2423 return s
2424
2425
2426
std::string replace(std::string s, const std::string &s2, const std::string &s3)