423def MakeSummaryHtml( dic, dicsum, datapath ):
424
425 runs = dic[DataKey('Run')]
426 nruns = len(runs)
427 times = dic[DataKey('Start and endtime')]
428
429 starttime = float(times[-1].partition(',')[0])
430 endtime = float(times[0].partition(',')[2])
431
432 s = '<table style="color: #777777; font-size: 85%; margin-left: 14px" cellpadding="0" cellspacing="3">\n'
433
434 s += '<tr><td><i>Number of runs selected:</i></td><td> %g</td><td></td></tr>\n' % (len(runs))
435 s += '<tr><td><i>First run selected:</i></td><td> %s</td><td> (%s)</td></tr>\n' % (runs[-1], time.strftime("%a %b %d, %Y, %X",time.gmtime(starttime)))
436 s += '<tr><td><i>Last run selected:</i></td><td> %s</td><td> (%s)</td></tr>\n' % (runs[0], time.strftime("%a %b %d, %Y, %X",time.gmtime(endtime)))
437 s += '</table>\n'
438
439
440
441 s += '<p></p>\n'
442 s += '<table style="margin-left: 14px">\n'
443 s += '<tr><td><b>Run / Event Summary</b></td></tr>\n'
444 s += '</table>\n'
445
446 table = []
447
448 keys = [ [ 'Duration', 'Run duration', ' h', '%.2f', [] ],
449 [ '#Events', '#Events (excl.)', '', 'pretty-int', [] ],
450 [ '#Events (streamed)', '#Events (incl.)', '', 'pretty-int', [] ],
451 [ 'STR:physics_*', 'Event size <font size="-2">(RAW)</font>',' MB', '%.2f', [0] ]
452 ]
453 for k in keys:
454 v = []
455 for dk, c in dic.iteritems():
456
457 if (
'*' in k[0]
and k[0].
replace(
'*',
'')
in dk.ResultKey)
or (
'*' not in k[0]
and k[0] == dk.ResultKey):
458 for x in c:
459 try:
460 v.append( DecodeStr( x, k[0] ) )
461 except ValueError:
462 pass
463
464
465
469 table.append( ComputeStats( v ) )
470
471 s += MakeSummaryTableHtml( '', ['Total', 'Average', 'Min', 'Max'], keys, table, 500 )
472
473
474
475 s += '<p></p>\n'
476 s += '<table style="margin-left: 14px">\n'
477 s += '<tr><td><b>Streams / Events Summary</b> <font size=-2> [ Straight averages given, not weighted by number of events in run ]</font></td></tr>\n'
478 s += '</table>\n'
479
480 streamdic = {}
481 streamsizedic = {}
482 streamfracdic = {}
483 streamratedic = {}
484 rootstreamdic = {}
485 v = []
486 for dk, c in dic.iteritems():
487
488 if '#Events' in dk.ResultKey:
489 rootstreamdic[dk] = []
490 for run,dataentries in zip(runs,c):
491
492 run = int(run)
493 data = dataentries[0].value
494 try:
495 rootstreamdic[dk].append([run, int(data)])
496 except ValueError:
497 if data != 'n.a.':
498 rootstreamdic[dk].append([run, data])
499
500 if 'Start and endtime' in dk.ResultKey:
501 rootstreamdic[dk] = []
502 for run,data in zip(runs,c):
503 if data != 'n.a.':
504 rootstreamdic[dk].append([int(run),
map(float,data.split(
','))])
505
506
507 if 'STR:' in dk.ResultKey:
508
509 sname = dk.ResultKey.replace('STR:','')
510 streamdic[sname] = []
511 streamsizedic[sname] = 0
512 streamfracdic[sname] = []
513 streamratedic[sname] = []
514 rootstreamdic[sname] = []
515
516 for run,t,dataentries in zip(runs,times,c):
517 run = int(run)
518 data = dataentries[0].value
519 if not isinstance(data, str):
520 streamdic[sname].append(data[0])
521 streamfracdic[sname].append(data[0])
522 tmin_ = float(t.partition(',')[0])
523 tmax_ = float(t.partition(',')[2])
524 deltat = tmax_ - tmin_
525 if (deltat > 0):
526 streamratedic[sname].append(data[0]/deltat)
527 else:
528 streamratedic[sname].append(-1)
529 streamsizedic[sname] += data[1]
530 try:
531 rootstreamdic[sname].append([run, data[0]])
532 except ValueError:
533 pass
534 else:
535 streamfracdic[sname].append('na')
536
537
538 streamtypes = ['physics', 'express', 'debug', 'calibration']
539 sortedstreams = []
540 for stype in streamtypes:
541 keys = {}
542 for key, c in streamdic.iteritems():
543 if stype in key:
544 keys[key] = sum(c)
545 sortedstreams += sorted(keys, key=keys.__getitem__, reverse=True)
546
547
548 keys = []
549 table = []
550 for stream in sortedstreams:
551 stats = ComputeStats( streamdic[stream] )
552 table.append( stats[0:4] )
553
554
555 if 'calibration_' not in stream:
556 v = []
557 for i, evrun in enumerate(streamfracdic[stream]):
558 if evrun != 'na':
559 evsum = float(0)
560 for stream2 in sortedstreams:
561 if 'calibration_' not in stream2:
562 if streamfracdic[stream2][i] != 'na':
563 evsum += streamfracdic[stream2][i]
564 if evsum > 0:
565 v.append( float(evrun)/evsum*100 )
566
567 table[-1] += ['%.3g' % ComputeStats( v )[1]]
568 else:
569 table[-1] += ['&minus']
570
571
572 table[-1] += ['%.3g' % ComputeStats( streamratedic[stream] )[1]]
573
574
575 table[-1] += [stats[4]]
576
577
578 if table[-1][0] > 0:
579 table[-1] += [filesize(streamsizedic[stream]),
580 filesize(float(streamsizedic[stream])/table[-1][0])]
581 else:
582 table[-1] += [filesize(streamsizedic[stream]),'&minus']
583
584 prettystr = stream
585 if 'debug' in stream:
586 prettystr = '<font color="#C11B17">' + stream + '</font>'
587
588 keys.append( [stream, prettystr, '', 'pretty-int', []] )
589
590 s += MakeSummaryTableHtml( 'Stream',
591 ['Total', 'Average', 'Min', 'Max',
592 'Average<br>fraction (%)',
593 'Average<br>rate (Hz)',
594 '#Runs<br><font size="-2">(out of %i)</font>' % nruns,
595 'Total file<br>size <font size="-2">(RAW)</font>',
596 'Average event<br>size <font size="-2">(RAW)</font>'], keys, table, 900 )
597
598
599 htmlstr = MakeRootPlots( rootstreamdic, datapath )
600 s += htmlstr
601
602 return s
603
604
605
606
607
608 s += '<p></p>\n'
609 s += '<table style="margin-left: 14px">\n'
610 s += '<tr><td><b>Data Quality Summary - SHIFTOFL (number of runs)</b> <font size=-2> [ No number signifies zero. Move mouse over number to see corresponding runs. ]</font></td></tr>\n'
611 s += '</table>\n'
612
613 dqflags = ['G','Y','R','B','U','n.a.']
614 dqflagsNames = ['Green', 'Yellow', 'Red', 'Black', 'Unknown', 'Not assigned ']
615 dqitems = DQChannels()
616
617
618
619
620 UseGroups = False
621 if UseGroups:
622 ndq = {}
623 for chan, dqgroup in DQGroupDict.items():
624 ndq[chan] = {}
625 for dqflag in dqflags:
626 ndq[chan][dqflag] = 0
627
628 for chan, dqchan in dqitems:
629 if dqchan in dic:
630 grchan = int(chan/10)*10
631 if grchan == 430:
632 grchan = 420
633 for dqflag in dic[dqchan]:
634 ndq[grchan][dqflag] += 1
635
636 colstr = []
637 colchans = []
638 for chan, dqgroup in DQChannelDict.items():
639 colstr.append( dqgroup )
640 colchans.append( chan )
641
642
643 colstr = []
644 colchans = []
645 ndq = {}
646 for chan, dqchan in dqitems:
647 dqchan = "SHIFTOFL_%s" % (dqchan)
648 colstr.append( dqchan )
649 colchans.append( chan )
650
651 ndq[chan] = {}
652 for dqflag in dqflags:
653 ndq[chan][dqflag] = [0, []]
654
655 if dqchan in dic:
656 for i, dqflag in enumerate(dic[dqchan]):
657 ndq[chan][dqflag][0] += 1
658 ndq[chan][dqflag][1].append(runs[i])
659
660
661
662
663 nc = 15
664 colstr_ = []
665 colchans_ = []
666 for i in range(len(colchans)):
667 if (i+1)%nc == 0:
668 labeloffset = i
669 colstr_ = []
670 colchans_ = []
671 else:
672 colstr_.append(colstr[i])
673 colchans_.append(colchans[i])
674
675
676 labeloffset = 0
677 for dqgroup, content in DQSuperGroupsDict.iteritems():
678 colstr_ = []
679 colchans_ = []
680 title = content[0]
681 for dqchan in content[1]:
682 colstr_.append(dqchan)
683 colchans_.append(DQChannelDict[dqchan])
684 s += MakeDQSummaryTableHtml( '', title, colstr_, colchans_, dqflags, dqflagsNames, ndq, nruns, labeloffset )
685 labeloffset += 1
686 s += '<p></p>'
687
688
689 return s