13 from ROOT
import gSystem
16 gSystem.Load(
'libDataQualityUtils')
17 from ROOT
import dqutils
26 def handiWithComparisons(name, resultsFile, htmlDir, runlistLoc, compare, browserMenu, allDirsScriptDir, jsRoot=1):
35 if (htmlDir.rfind(
"/") != (len(htmlDir)-1)):
40 dirs = dirsstring.rsplit()
41 for subHtmlDir
in dirs:
42 if(
not os.access(subHtmlDir, os.F_OK)):
44 os.makedirs(subHtmlDir)
46 print(
'Cannot create directory "' + subHtmlDir +
'"; exiting.')
52 if (name.find(
'minutes10_') > -1):
54 digit = ((t[len(t)-1]).
split(
','))[0]
56 low_limit =
int((digit-1.0)*10.0/LBlength+1)
57 hi_limit =
int(digit*10.0/LBlength)
58 LB_range =
', LB '+
str(low_limit)+
' - ' +
str(hi_limit)
59 elif (name.find(
'minutes30_') > -1):
62 low_limit =
int((digit-1.0)*30.0/LBlength+1)
63 hi_limit =
int(digit*30.0/LBlength)
64 LB_range =
', LB '+
str(low_limit)+
' - ' +
str(hi_limit)
67 resultsFile, htmlDir,
True, (name+LB_range), jsRoot)
69 print(
"There are no histograms in this file; writing a dummy index file")
70 if(
not os.access(htmlDir, os.F_OK)):
74 print(
'Cannot create directory "' + htmlDir +
'"; exiting.')
76 dummyIndex = htmlDir +
"/index.html"
77 d =
open(dummyIndex,
'w')
78 d.write(
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
79 d.write(
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n')
81 d.write(
'<title>Error</title>\n')
84 d.write(
'<h1>Error:</h1>\n')
86 'No histograms found for display. Check the <tt>han</tt> configuration\n')
87 d.write(
'to make sure it is consistent with the <tt>han</tt> input file.\n')
93 s = total.rsplit(
'\n')
96 if (len(s[number-1]) < 1):
102 htmlDir, name, s, number, resultsFile, allDirsScriptDir)
105 htmlDir, name, s, number, resultsFile)
107 for x
in range(0, len(dirlist)):
109 namelist[x], dirlist[x], runlistLoc, compare, allDirsScriptDir, jsRoot)
111 namelist[x], dirlist[x],
'Red', runlistLoc, compare, allDirsScriptDir, jsRoot)
113 namelist[x], dirlist[x],
'Yellow', runlistLoc, compare, allDirsScriptDir, jsRoot)
115 namelist[x], dirlist[x],
'Green', runlistLoc, compare, allDirsScriptDir, jsRoot)
120 for path
in jsonFileCull:
121 if os.path.isfile(path):
122 os.system(
"rm "+path)
126 g =
open(htmlDir+
'AllDirs.xml',
'w')
127 g.write(
'<?xml version="1.0" encoding="ISO-8859-1"?>\n')
132 for x
in range(0, number):
136 shortNameDir = namedir
137 namediri = namedir.rfind(
"/")
139 shortNameDir = namedir[namediri+1:]
140 if namedir ==
'<top_level>':
141 shortNameDir =
'Overall Status'
142 spaces_new = s[x].
find(sp[0][0])
143 if ((x < number-1)
and (s[x+1].rsplit())[3] ==
'ass'):
147 if spaces_new > spaces:
150 g.write(
'<dir tag=\"'+sub+
'dir\" id=\"' + shortNameDir +
151 '\" status=\"'+sp[1]+
'\" histo = \"' + histo +
'\">\n')
153 elif spaces_new == spaces:
154 g.write(
'</dir>\n<dir tag=\"'+sub+
'dir\" id=\"' + shortNameDir +
155 '\" status=\"'+sp[1] +
'\" histo = \"' + histo +
'\">\n')
157 diff = spaces - spaces_new
162 sub = sub[3:len(sub)]
164 g.write(
'<dir tag=\"'+sub+
'dir\" id=\"' + shortNameDir +
165 '\" status=\"'+sp[1] +
'\" histo = \"' + histo +
'\">\n')
167 if namedir ==
'<top_level>':
169 g.write(
'<a href="'+namedir +
'/toplevel.html">' +
170 shortNameDir +
'</a>\n')
172 g.write(
'<a href="'+namedir +
'/index.html" >' +
173 shortNameDir +
'</a>\n')
176 for x
in range(0, num_lists):
178 sub = sub[3:len(sub)]
183 g =
open(htmlDir+
'index.html',
'w')
184 g.write(
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
185 g.write(
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n')
187 g.write(
'<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />\n')
188 g.write(
'<title>' + name +
'</title>\n')
189 g.write(
'<link rel="stylesheet" href="AutomChecks.css" type="text/css" />\n')
190 g.write(
'<link rel="stylesheet" href="https://atlasdqm.web.cern.ch/atlasdqm/css/mktree.css"/>\n')
191 g.write(
'<script type="text/javascript" src="https://atlasdqm.web.cern.ch/atlasdqm/js/mktree.js"></script>\n')
196 '<font class="DQGroup">[<a href="#" onclick="history.go(-1);return false;">Back</a>]</font>')
198 g.write(
'<h1>' + name +
': Monitoring and Automatic Checks</h1>\n')
210 g.write(
'<tr><td>Click to expand</td></tr>\n')
211 g.write(
'<tr valign="top">\n<td width="500"><font class="DQGroup">\n')
212 for x
in range(0, number):
216 shortNameDir = namedir
217 namediri = namedir.rfind(
"/")
219 shortNameDir = namedir[namediri+1:]
220 if namedir ==
'<top_level>':
221 shortNameDir =
'Overall Status'
222 spaces_new = s[x].
find(sp[0][0])
223 if spaces_new > spaces:
225 g.write(
'<ul%s>\n<li>' %
226 (
' class="mktree"' if namedir ==
'<top_level>' else ''))
228 elif spaces_new == spaces:
229 g.write(
'</li>\n<li>')
232 diff = spaces - spaces_new
234 g.write(
'</ul></li>\n')
241 if ((x < number-1)
and (s[x+1].rsplit())[3] ==
'ass'):
242 if namedir ==
'<top_level>':
244 g.write(
'<a href="'+namedir +
245 '/toplevel.html">'+shortNameDir +
':</a>')
247 g.write(
'<a href="'+namedir +
248 '/index.html" >'+shortNameDir +
':</a>')
249 g.write(
' <font class="' +
250 sp[1]+
'">' + sp[1] +
'</font>\n')
252 namelist.append(namedir)
254 g.write(shortNameDir +
':')
255 g.write(
' <font class="' +
256 sp[1]+
'">' + sp[1] +
'</font>\n')
260 for x
in range(0, num_lists-1):
261 g.write(
'</ul></li>\n')
265 g.write(
'</font></td>\n</tr>\n</table>')
266 g.write(
'</body>\n</html>\n')
268 return dirlist, namelist
272 g =
open(htmlDir+
'index.html',
'w')
273 g.write(
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
274 g.write(
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n')
276 g.write(
'<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />\n')
277 g.write(
'<title>' + name +
'</title>\n')
278 g.write(
'<link rel="stylesheet" href="AutomChecks.css" type="text/css" />\n')
279 g.write(
'<link rel="stylesheet" href="'+AllDirsScriptDir +
280 '/mktree/mktree.css" type="text/css" />')
281 g.write(
'<script type="text/javascript" src="'+AllDirsScriptDir +
282 '/AllDirs.js"><!-- dont contract--></script>\n')
283 g.write(
'<script type="text/javascript" src="'+AllDirsScriptDir +
284 '/mktree/mktree.js"><!-- dont contract--></script>\n')
286 g.write(
'<body onLoad=\"loadXMLDoc(\'AllDirs.xml\');\">')
288 '<font class="DQGroup">[<a href="#" onclick="history.go(-1);return false;">Back</a>]</font>')
289 g.write(
'<h1>' + name +
': Monitoring and Automatic Checks</h1>\n')
291 g.write(
'<div id=\"Select_subdir\">\n</div>\n')
296 g.write(
'<div id=\"Display_dir\">\n</div>\n')
297 g.write(
'</body>\n</html>\n')
305 for x
in range(0, number):
310 if ((x < number-1)
and (s[x+1].rsplit())[3] ==
'ass'):
311 if namedir ==
'<top_level>':
314 namelist.append(namedir)
316 return dirlist, namelist
319 def makeSubDirFile(htmlDir, name, s, number, subname, assessIndex, runlistLoc, compare, AllDirsScriptDir, jsRoot):
322 h =
open(htmlDir+
'/'+subname+
'/toplevel.html',
'w')
323 subnameTitle =
'Top Level'
325 h =
open(htmlDir+
'/'+subname+
'/index.html',
'w')
326 subnameTitle = subname
327 h.write(
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
328 h.write(
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n')
330 h.write(
'<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />\n')
331 h.write(
'<title>' + name +
' ' + subnameTitle +
'</title>\n')
332 h.write(
'<link rel="stylesheet" href="AutomChecks.css" type="text/css" />\n')
333 h.write(
'<script type="text/javascript" src="'+AllDirsScriptDir +
334 '/AllDirs.js"><!-- dont contract--></script>\n')
338 '<font class="DQGroup">[<a href="#" onclick="history.go(-1);return false;">Back</a>]</font>')
344 h.write(
'<table>\n<tr valign="top">\n<td width="250"></td>\n')
345 h.write(
'<td width="300" align="center"><h2>' +
346 name+
' '+subnameTitle+
'</h2>\n')
347 h.write(
'<a href="Red.html">[Only Red]</a>\n')
348 h.write(
'<a href="Yellow.html">[Only Yellow]</a>\n')
349 h.write(
'<a href="Green.html">[Only Green]</a></td>\n')
350 h.write(
'<td width="250">\n<font class="Note">Click on images for details and full size.</font>\n')
351 h.write(
'</td>\n</tr>\n</table>\n')
352 h.write(
'<table cellpadding="4" cellspacing="20">\n')
356 while(sp[3] ==
'ass' and y < number):
358 titleStream = s[y].rsplit(
" title ")
359 title = titleStream[1]
362 h.write(
'<tr>\n<td class="' + sp[1] +
'" align="center"><a href="'+sp[0]+
'.html" class="hintanchor" onmouseover="showhint(\'' + title+
'\', this, event, \'400px\')"><img src="' +
363 sp[0] +
'.png" height="200" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a><br/><div style="text-overflow:ellipsis;overflow:hidden;max-width:240px">'+sp[0]+
'</div></td>\n')
365 h.write(
'<td class="' + sp[1] +
'" align="center"><a href="'+sp[0]+
'.html" class="hintanchor" onmouseover="showhint(\'' + title+
'\', this, event, \'500px\')"><img src="' + sp[0] +
366 '.png" height="200" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a><br/><div style="text-overflow:ellipsis;overflow:hidden;max-width:240px">'+sp[0]+
'</div></td>\n</tr>\n')
369 h.write(
'<td class="' + sp[1] +
'" align="center"><a href="'+sp[0]+
'.html" class="hintanchor" onmouseover="showhint(\'' + title+
'\', this, event, \'400px\')"><img src="' +
370 sp[0] +
'.png" height="200" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a><br/><div style="text-overflow:ellipsis;overflow:hidden;max-width:240px">'+sp[0]+
'</div></td>\n')
371 temp = s[y].rsplit(
" title ")
374 runlistLoc, compare, jsRoot)
380 h.write(
'</table>\n</center>\n</body>\n</html>\n')
384 def makeColorFile(htmlDir, name, s, number, subname, assessIndex, color, runlistLoc, compare, AllDirsScriptDir, jsRoot):
387 h =
open(htmlDir+
'/'+subname+
'/'+color+
'.html',
'w')
388 subnameTitle =
'Top Level'
390 h =
open(htmlDir+
'/'+subname+
'/'+color+
'.html',
'w')
391 subnameTitle = subname
392 h.write(
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
393 h.write(
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n')
395 h.write(
'<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />\n')
396 h.write(
'<title>' + name +
' ' + subnameTitle +
' ' + color +
'</title>\n')
397 h.write(
'<link rel="stylesheet" href="AutomChecks.css" type="text/css" />\n')
398 h.write(
'<script type="text/javascript" src="'+AllDirsScriptDir +
399 '/AllDirs.js"><!-- dont contract--></script>\n')
403 '<font class="DQGroup">[<a href="#" onclick="history.go(-1);return false;">Back</a>]</font>')
405 h.write(
'<table>\n<tr valign="top">\n<td width="250"></td>\n')
406 h.write(
'<td width="300"><h2>'+name+
' ' +
407 subnameTitle+
': ' + color +
' only</h2>\n')
408 h.write(
'<a href="Red.html">[Only Red]</a>\n')
409 h.write(
'<a href="Yellow.html">[Only Yellow]</a>\n')
410 h.write(
'<a href="Green.html">[Only Green]</a></td>\n')
411 h.write(
'<td width="250">\n<font class="Note">Click on images for details and full size.</font>\n')
412 h.write(
'</td>\n</tr>\n</table>\n')
413 h.write(
'<table cellpadding="4" cellspacing="20">\n')
418 while(sp[3] ==
'ass' and y < number):
419 titleStream = s[y].rsplit(
" title ")
420 title = titleStream[1]
426 h.write(
'<tr>\n<td class="' + sp[1] +
'"><a href="'+sp[0]+
'.html" class="hintanchor" onmouseover="showhint(\''+title +
427 '\', this, event, \'400px\')"><img src="' + sp[0] +
'.png" height="200" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a></td>\n')
429 h.write(
'<td class="' + sp[1] +
'"><a href="'+sp[0]+
'.html" class="hintanchor" onmouseover="showhint(\''+title +
430 '\', this, event, \'500px\')"><img src="' + sp[0] +
'.png" height="200" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a></td>\n</tr>\n')
433 h.write(
'<td class="' + sp[1] +
'"><a href="'+sp[0]+
'.html" class="hintanchor" onmouseover="showhint(\'' + title +
434 '\', this, event, \'400px\')"><img src="' + sp[0] +
'.png" height="200" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a></td>\n')
435 temp = s[y].rsplit(
" title ")
438 runlistLoc, compare, jsRoot)
444 h.write(
'</table>\n')
446 h.write(
'<h3> No '+color+
' histograms </h3>\n')
447 h.write(
'</center>\n</body>\n</html>\n')
452 k.write(
'<tr><td> </td></tr>\n')
453 k.write(
'<tr><td colspan="2">\n')
455 k.write(
'<caption>'+limitName+
'</caption>\n')
457 k.write(
'<td width="340" align="center" colspan="4">\n')
458 k.write(
'<font color="'+lowColor+
'">XXXXXXX</font><b>I</b>\n')
459 k.write(
'<font color="#ffd700">XXXXXXX</font><b>I</b>\n')
460 k.write(
'<font color="'+hiColor+
'">XXXXXXX</font></td>\n')
461 k.write(
'</tr><tr>\n')
462 k.write(
'<td width="92"></td>\n')
463 k.write(
'<td width="78" align="center">' + loVal +
'</td>\n')
464 k.write(
'<td width="78" align="center">' + hiVal +
'</td>\n')
465 k.write(
'<td width="92"></td>\n')
466 k.write(
'</tr>\n</table>\n')
471 runmatch = re.compile(
'^Run ([0-9]+), ([0-9]+)/(.+)$')
472 subrunmatch = re.compile(
'^Run ([0-9]+), (.+)_(.*), ([0-9]+)/(.+)$')
473 rm = runmatch.match(name)
474 srm = subrunmatch.match(name)
476 run, proc_ver, stream = rm.groups()
479 elif srm
is not None:
480 run, period_type, period, proc_ver, stream = srm.groups()
482 run, period_type, period, proc_ver, stream = [
None]*5
484 k =
open(htmlDir+
'/'+subname+
'/'+sp[0]+
'.html',
'w')
485 k.write(
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n')
486 k.write(
'<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n')
488 k.write(
'<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />\n')
489 k.write(
'<title>'+name +
' ' + subname +
' ' + sp[0]+
'</title>\n')
490 k.write(
'<link rel="stylesheet" href="AutomChecks.css" type="text/css" />\n')
491 k.write(
'<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js"></script>\n')
492 k.write(
'<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>')
496 k.write(
'<center>\n')
497 k.write(
'<table>\n<tr valign="top">\n')
499 '<td width="250"><font class="DQGroup">[<a href="#" onclick="history.go(-1);return false;">Back</a>]</font></td>\n')
500 k.write(
'<td width="500"><h2>'+name +
' ' +
501 subname+
'/'+sp[0]+
'</h2></td>\n')
502 k.write(
'<td width="250"></td>\n</tr>\n')
503 for x
in range(4, len(sp)-1):
504 if (
'inputname' in sp[x]):
506 k.write(
'<tr><td width="250"></td><td width="500">Location in ROOT file: ' +
507 inputname +
'</td>\n</tr>\n')
508 k.write(
'</table>\n')
509 k.write(
'<table cellpadding="10">\n<tr>\n')
510 k.write(
'<td>\n<table width="400">\n')
512 '<tr><td colspan="2"><font class="Heading">Assessment Details:</font></td></tr>\n')
513 k.write(
'<tr><td> </td></tr>\n')
514 k.write(
'<tr><td align="right"><font class="DatumName">Name:</font></td>')
515 k.write(
'<td>' + sp[0] +
'</td></tr>\n')
516 k.write(
'<tr><td align="right"><font class="DatumName">Status:</font></td>')
517 k.write(
'<td><font class="' + sp[1] +
'">' + sp[1] +
'</font></td></tr>\n')
518 k.write(
'<tr><td align="right"><font class="DatumName">Algorithm:</font></td>')
519 k.write(
'<td>'+sp[2]+
'</td></tr>\n')
529 if 'Green' in sp[cc]:
530 currentHeading =
'limits'
532 limitName = sp[cc][:spi]
533 Green =
float(sp[cc+1])
537 if (cG > 0
and cR > 0):
540 "Green", sp[cR], sp[cG])
543 "Red", sp[cG], sp[cR])
546 elif 'Red' in sp[cc]:
547 currentHeading =
'limits'
548 spi = sp[cc].
find(
"Red")
549 limitName = sp[cc][:spi]
554 if (cG > 0
and cR > 0):
557 "Green", sp[cR], sp[cG])
560 "Red", sp[cG], sp[cR])
563 elif sp[cc] ==
"Results":
564 currentHeading =
'results'
565 k.write(
'<tr><td> </td></tr>\n')
567 '<tr><td colspan="2"><font class="Heading">Results:</font></td></tr>\n')
568 k.write(
'<tr><td> </td></tr>\n')
571 elif sp[cc] ==
"Config":
572 currentHeading =
'config'
573 k.write(
'<tr><td> </td></tr>\n')
575 '<tr><td colspan="2"><font class="Heading">Configuration Parameters:</font></td></tr>\n')
576 k.write(
'<tr><td> </td></tr>\n')
579 elif sp[cc] ==
"entries:":
580 currentHeading =
'nentries'
582 '<tr><td align="right"><font class="DatumName">Num. of Entries:</font> </td>')
583 k.write(
'<td>'+sp[cc+1]+
'</td></tr>\n')
586 elif sp[cc] ==
"Underflow:":
588 '<tr><td align="right"><font class="DatumName">Underflow:</font> </td>')
589 k.write(
'<td>'+sp[cc+1]+
'</td></tr>\n')
592 elif sp[cc] ==
"Overflow:":
594 '<tr><td align="right"><font class="DatumName">Overflow:</font> </td>')
595 k.write(
'<td>'+sp[cc+1]+
'</td></tr>\n')
598 elif cc < len(sp)-1
and 'inputname' not in sp[cc]:
599 if currentHeading ==
'results':
600 namecache.append(sp[cc-2])
601 if ':' not in sp[cc]:
606 name =
' '.
join([namecache[-1]])
608 from six.moves
import urllib
609 resultname = name.rsplit(
':', 1)[0]
611 if algorithm ==
'RepeatAlgorithm' and resultname.endswith(
'|Status'):
612 resultval = {
'1':
'Red',
'2':
'Yellow',
613 '3':
'Green'}[resultval]
614 if compare
and run
is not None:
615 if period_type ==
'run':
616 queryurl =
'http://atlasdqm.cern.ch:8080/dqmfquery/query?histogram=%s&result=%s&error=&stream=%s&period_type=%s&source=tier0&proc_ver=%s&low_run=%s&high_run=&low_y=&high_y=&outputtype=png' % (
617 urllib.parse.quote_plus(subname+
'/'+sp[0]), urllib.parse.quote_plus(resultname), stream.strip(), period_type, proc_ver,
int(run)-1000)
619 '<tr><td align="right"><b><a href="%s">%s</a>:</b></td>' % (queryurl, resultname))
620 k.write(
'<td>'+resultval+
'</td></tr>\n')
622 queryurl1 =
'http://atlasdqm.cern.ch:8080/dqmfquery/query?histogram=%s&result=%s&error=&stream=%s&period_type=%s&source=tier0&proc_ver=%s&low_run=%s&high_run=&low_y=&high_y=&outputtype=png' % (
623 urllib.parse.quote_plus(subname+
'/'+sp[0]), urllib.parse.quote_plus(resultname), stream.strip(), period_type, proc_ver,
int(run)-1000)
624 queryurl2 =
'http://atlasdqm.cern.ch:8080/dqmfquery/query?histogram=%s&result=%s&error=&stream=%s&period_type=%s&source=tier0&proc_ver=%s&low_run=%s&high_run=%s&low_y=&high_y=&outputtype=png' % (
625 urllib.parse.quote_plus(subname+
'/'+sp[0]), urllib.parse.quote_plus(resultname), stream.strip(), period_type, proc_ver, run, run)
627 '<tr><td align="right"><b><a href="%s">%s</a>:</b></td>' % (queryurl1, resultname))
629 '<td>'+resultval+
' (<a href="%s">History for this run</a>)</td></tr>\n' % queryurl2)
631 k.write(
'<tr><td align="right"><b> %s: </b></td>' %
633 k.write(
'<td>'+resultval+
'</td></tr>\n')
635 k.write(
'<tr><td align="right"><b>'+sp[cc]+
' </b></td>')
636 if sp[cc+1:cc+3] == [
'Multiple',
'references']:
637 k.write(
'<td>'+
' '.
join(sp[cc+1:cc+3])+
'</td></tr>\n')
641 k.write(
'<td>'+sp[cc+1]+
'</td></tr>\n')
647 k.write(
'</table>\n</td>\n')
648 jsonPath = htmlDir+
'/'+subname+
'/'+sp[0]+
".json" if sp[0]
else ""
650 jsonFileCull.add(jsonPath)
651 jsonFile =
open(jsonPath,
'r')
if os.path.isfile(jsonPath)
else ""
653 if((jsRoot & 2)
and os.path.isfile(jsonPath)):
655 jsonStr = jsonFile.read()
656 jsonStr = jsonStr.replace(
'\n',
'')
658 '<td><div id="root_plot_1" style="width: 600px; height: 400px"></div></td>\n<script>\n requirejs.config( { paths: { \'JSRootCore\' : \'https://root.cern.ch/js/dev//scripts/JSRootCore\', \'JSRootPainter\' : \'https://root.cern.ch/js/dev//scripts/JSRootPainter\', } });require([\'JSRootCore\', \'JSRootPainter\'], function(Core, Painter) {\n var obj = Core.parse(\''+jsonStr+
'\');\nPainter.draw("root_plot_1", obj, ""); });</script>\n')
660 k.write(
'<td><a href="toplevel.html"><img src="' +
661 sp[0] +
'.png" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a></td>\n')
663 if((jsRoot & 2)
and os.path.isfile(jsonPath)):
665 jsonStr = jsonFile.read()
666 jsonStr = jsonStr.replace(
'\n',
'')
668 '<td><div id="root_plot_2" style="width: 600px; height: 400px"></div></td>\n<script>\n requirejs.config( { paths: { \'JSRootCore\' : \'https://root.cern.ch/js/dev//scripts/JSRootCore\', \'JSRootPainter\' : \'https://root.cern.ch/js/dev//scripts/JSRootPainter\', } });require([\'JSRootCore\', \'JSRootPainter\'], function(Core, Painter) {\n var obj = Core.parse(\''+jsonStr+
'\');\nPainter.draw("root_plot_2", obj, ""); });</script>\n')
670 k.write(
'<td><a href="index.html"><img src="' +
671 sp[0] +
'.png" alt="' + name +
' ' + subname+
'/'+sp[0]+
'.png" /></a></td>\n')
672 k.write(
'</tr></table>\n')
673 k.write(
'</center>\n')
674 now = time.localtime()
676 lastUpdate =
"Last Update: "+time.strftime(
'%Y-%m-%d %H:%M %Z', now)
677 k.write(
'</br><font class=\"Note\">'+lastUpdate+
'</font><br />\n')
727 k.write(
'</body>\n</html>\n')
732 k =
open(htmlDir+
'index.html',
'w')
733 k.write(
'<html>\n<frameset rows="200,*">\n')
734 k.write(
'<frame src="'+name+
'AllDirs.html">\n')
737 k.write(
'<frame src="'+subname+
'/index.html" name="showframe"> \n')
739 k.write(
'<frame src="'+subname +
740 '/toplevel.html" name="showframe"> \n')
741 k.write(
'</frameset>\n</html> \n')
746 css =
open(htmlDir+
'/'+subname+
'/'+name+
'AutomChecks.css',
'w')
748 'BODY\n{\n background: #E6E6FA;\n color: #000000;\n font-family: helvetica,sans-serif;\n}\n')
750 'H1\n{\n font-family: helvetica,sans-serif;\n font-size: x-large;\n text-align: left;\n}\n')
752 'H2\n{\n font-family: helvetica,sans-serif;\n font-size: large;\n text-align: center;\n}\n')
754 'H3\n{\n font-family: helvetica,sans-serif;\n font-size: medium;\n text-align: left;\n}\n')
755 css.write(
'A IMG\n{\n border: none;\n}\n')
756 css.write(
'FONT.Info\n{\n color: black;\n font-style: italic;\n}\n')
758 'FONT.Heading\n{\n color: black;\n font-weight: bold;\n font-size: large;\n}\n')
759 css.write(
'FONT.DatumName\n{\n color: black;\n font-weight: bold;\n}\n')
760 css.write(
'FONT.Note\n{\n color: black;\n font-size: small;\n}\n')
761 css.write(
'FONT.DQGroup\n{\n font-size: small;\n}\n')
762 css.write(
'FONT.Red\n{\n color: red;\n font-weight: bold;\n}\n')
763 css.write(
'FONT.Yellow\n{\n color: #ffd700;\n font-weight: bold;\n}\n')
764 css.write(
'FONT.Green\n{\n color: green;\n font-weight: bold;\n}\n')
765 css.write(
'FONT.Disabled\n{\n color: black;\n font-weight: bold;\n}\n')
766 css.write(
'FONT.Undefined\n{\n color: gray;\n}\n')
767 css.write(
'FONT.NoCheck\n{\n color: black;\n font-weight: bold;\n}\n')
768 css.write(
'TD.Red\n{\n background-color: red;\n}\n')
769 css.write(
'TD.Yellow\n{\n background-color: #ffd700;\n}\n')
770 css.write(
'TD.Green\n{\n background-color: green;\n}\n')
771 css.write(
'TD.Disabled\n{\n background-color: black;\n}\n')
772 css.write(
'TD.Undef\n{\n background-color: gray;\n}\n')
773 css.write(
'TD.NoCheck\n{\n background-color: #E6E6FA;\n}\n')
774 css.write(
'.hintanchor\n{\n font-weight: bold; \n color: navy; \n }\n')
775 css.write(
'#hintbox{\n position:absolute; \n top: 0; \n background-color: lightyellow; \n width: 150px; \n padding: 3px; \n border:1px solid black; \n')
776 css.write(
'font:normal 15px Verdana;\n line-height:18px; \n z-index:100; \n border-right: 3px solid black; \n border-bottom: 3px solid black; \n visibility: hidden;\n }')
782 dirsstring = of.stringListSystemPaths(location)
789 total = of.stringAllDQAssessments()
797 cnvType = 1
if jsRoot == 1
else 3
798 nSaved = of.saveAllHistograms(location, drawRefs, run_min_LB, cnvType)