8 from __future__
import print_function
15 from optparse
import OptionParser
16 parser = OptionParser(usage =
"usage: %prog [options] reference file",
17 description =
"Compare the histograms in two root files. See https://twiki.cern.ch/twiki/bin/view/Atlas/TrigValTools#rootcomp_py for more details and examples.")
19 parser.add_option(
"-c",
"--chi2",
20 action =
"store_true",
21 help =
"use chi2 comparison instead of bin-by-bin")
23 parser.add_option(
"-a",
"--axis",
24 action =
"store_true",
25 help =
"use axis comparison instead of bin-by-bin")
27 parser.add_option(
"-l",
"--sortLabels",
28 action =
"store_true", default=
False,
29 help =
"sort/deflate alphanumeric axis before comparing")
31 parser.add_option(
"-t",
"--threshold",
32 action =
"store", type=
"float",
33 help =
"threshold for bin or chi2 comparison (default: 1e-6 or 0.95)")
35 parser.add_option(
"-o",
"--output",
36 action =
"store", dest =
"outFile",
37 metavar =
"NAME", default =
"rootcomp",
38 help =
"write output to NAME.[ps,root] (default: rootcomp)")
40 parser.add_option(
"-s",
"--skip",
41 action =
"append", default=[], type=
"string",
42 help =
"add objects to skip (regular expression, can be used multiple times, mutual exclusive with -e)")
44 parser.add_option(
"-e",
"--select",
45 action =
"append", default=[], type=
"string",
46 help =
"select histograms to compare (regular expression, can be used multiple times, mutual exclusive with -s)")
48 parser.add_option(
"--refBaseDir",
49 action =
"store", default =
"",
50 help =
"base directory of reference file")
52 parser.add_option(
"--fileBaseDir",
53 action =
"store", default =
"",
54 help =
"base directory of file")
56 parser.add_option(
"-S",
"--noSkipList",
57 action =
"store_true", default=
False,
58 help =
"do not use default list of histograms to skip")
60 parser.add_option(
"-n",
"--noRoot",
61 action =
"store_true",
62 help =
"do not write .root file")
64 parser.add_option(
"--noPS",
65 action =
"store_true",
66 help =
"do not write ps/pdf file")
68 parser.add_option(
"-N",
"--norm",
69 action =
"store_true", default =
False,
70 help =
"draw normalized")
72 parser.add_option(
"--noDiff",
73 action =
"store_true", default =
False,
74 help =
"do not plot difference histogram")
76 parser.add_option(
"--ignoreMissingRef",
77 action =
"store_true", default =
False,
78 help =
"ignore missing references for overall test result")
80 parser.add_option(
"-z",
"--zip",
81 action =
"store_true",
82 help =
"gzip postscript output file")
84 parser.add_option(
"-p",
"--pdf",
85 action =
"store_true",
86 help =
"create pdf instead of ps output file")
88 parser.add_option(
"-v",
"--verbose",
89 action =
"store_true", default =
False,
92 parser.add_option(
"--html",action=
"store_true",default=
False,help=
"generate root html code to view results in web browser")
94 (opts, args) = parser.parse_args()
100 if not opts.noSkipList:
101 opts.skip += [
"Unpck$",
"BufFreeCnt$",
"CalEvtSize$"]
102 opts.skip += [
"/TIME_"]
103 opts.skip += [
"/athenaHLT.*/.*Time$"]
104 opts.skip += [
"HltEventLoopMgr/.*Time.*"]
105 opts.skip += [
"HltEventLoopMgr/PopScheduler.*"]
106 opts.skip += [
"MessageSvc/MessageCount"]
107 opts.skip += [
"TrigSignatureMoni/.*Rate"]
108 opts.skip += [
"TrigOpMonitor/GeneralOpInfo"]
109 opts.skip += [
"TrigOpMonitor/IOVDb.*"]
110 opts.skip += [
"TrigOpMonitor/.*ReadTime"]
111 opts.skip += [
"TrigOpMonitor/.*BytesRead"]
112 opts.skip += [
"HLTFramework/ROBDataProviderSvc"]
113 opts.skip += [
"HLTFramework/SchedulerMonSvc"]
114 opts.skip += [
"HLTSeeding/Random"]
118 if not opts.threshold:
119 if opts.chi2: opts.threshold = 0.95
120 else: opts.threshold = 1e-6
123 print(
"Command : rootcomp.py %s\n" % (
" ".
join(sys.argv[1:])))
124 print(
"Reference : %s" % args[0])
125 print(
"File : %s" % args[1])
126 print(
"Comparison : ", end=
"")
127 if opts.chi2:
print(
"CHI2 (%.2f)" % opts.threshold)
128 elif opts.axis:
print(
"AXIS")
129 else:
print(
"BIN-BY-BIN (%.1e)" % opts.threshold)
130 if not opts.skip==[]:
print(
"Ignored histograms: %s" % (
", ".
join(opts.skip)))
131 if not opts.select==[]:
print(
"Selected histograms: %s" % (
", ".
join(opts.select)))
139 from PerfMonAna
import PyRootLib
140 ROOT = PyRootLib.importRoot( batch=
True )
147 from ROOT
import TRootCompare
148 from ROOT
import gROOT, gStyle
149 gROOT.SetStyle(
"Plain")
150 gStyle.SetOptStat(111111)
153 valid.setVerbose(opts.verbose)
157 valid.setAlg(TRootCompare.CHI2, opts.threshold)
159 valid.setAlg(TRootCompare.AXIS, opts.threshold)
161 valid.setAlg(TRootCompare.BIN, opts.threshold)
164 for s
in opts.select:
165 valid.passBeforeFailRegexp()
166 valid.addPassRegexp(s)
170 valid.addFailRegexp(s)
173 if not opts.noRoot: valid.setOutputFile(opts.outFile+
".root")
178 valid.setPsFile(opts.outFile+
".pdf")
180 valid.setPsFile(opts.outFile+
".ps")
182 valid.sortLabels(opts.sortLabels)
183 valid.drawNormalized(opts.norm)
184 valid.drawDiff(
not opts.noDiff)
187 rc = valid.setReferenceFile(args[0],opts.refBaseDir)
191 rc = valid.run(args[1],opts.fileBaseDir)
196 if opts.zip
and not opts.pdf:
197 print(
"GZipping postscript file -> %s.ps.gz" % opts.outFile)
198 os.system(
"gzip -f %s.ps" % (opts.outFile))
202 elif valid.totalHist()>0:
204 if opts.ignoreMissingRef: result =
min(valid.totalHist()-valid.matchingHist(),255)
206 else: result =
min(valid.totalHist()-valid.matchingHist()-valid.missingHist(),255)
207 elif valid.totalHist()==0
and valid.missingHist()==0
and valid.matchingHist()==0:
214 os.system(
"root2html.py *.root")
216 print(
"Overall test result: %i" % result)
219 if __name__ ==
"__main__":