5 from DQMServices.FileIO.DQM
import DQMReader
6 from collections
import namedtuple
8 HistogramEntry = namedtuple(
'HistogramEntry', [
'type',
'bin_size',
'bin_count',
'extra',
'total_bytes'])
16 'TProfile': 8,
'TProfile2D': 8,
23 name = fn.split(
"/")[-1]
25 if hasattr(obj,
'ClassName'):
27 t =
str(obj.ClassName())
28 bin_size = self.BIN_SIZE.get(t,
None)
30 sys.stderr.write(
"warning: unknown root type: %s\n" % t)
34 bin_count = obj.GetNcells()
36 total_bytes = bin_count * bin_size + extra
38 self.
_all[fn] = HistogramEntry(t, bin_size, bin_count, extra, total_bytes)
43 bin_count, bin_size, extra = 0, 0, 10 + len(fn)
44 total_bytes = bin_count * bin_size + extra
46 self.
_all[fn] = HistogramEntry(t, bin_size, bin_count, extra, total_bytes)
48 def group(self, level, countObjects):
51 for k, v
in self._all.items():
52 group_key =
"/".
join(k.split(
"/")[:level])
54 current = group_stats.get(group_key, 0)
55 group_stats[group_key] = current + (1
if countObjects
else v.total_bytes)
63 zero = HistogramEntry(
"null", 0, 0, 0, 0)
65 return HistogramEntry(b.type, b.bin_size,
66 a.bin_count - b.bin_count,
68 a.total_bytes - b.total_bytes )
70 for k, refv
in ref._all.items():
71 results._all[k] = cmp(self._all.get(k, zero), refv)
79 pStr=
"%."+
str(args.precision)+
"f %s" 80 for prefix
in [
'KiB',
'MiB',
'GiB']:
83 if num < 1024.0
or args.units == prefix:
84 return pStr % (num, prefix)
85 return pStr % (num, prefix)
88 group_stats = stats.group(args.depth, args.count)
90 cutoff, display = args.cutoff * 1024, args.display
92 as_list = [(v, k, )
for (k, v)
in group_stats.items()]
93 as_list.sort(reverse=
True, key=
lambda v_k1:
abs(v_k1[0]))
95 if cutoff
is not None:
96 as_list = [v_k
for v_k
in as_list
if abs(v_k[0]) > cutoff]
98 if display
is not None:
99 as_list = as_list[:display]
103 print (
" DQM level %d folder breakdown " % args.depth).center(80,
"*")
105 print (
"* Size cutoff: %s" %
kibisize(cutoff,args)).ljust(79) +
"*" 107 print (
"* Showing top %d entries." % display).ljust(79) +
"*" 112 print kibisize(v,args).ljust(16,
" "), k
116 if __name__ ==
'__main__':
119 parser = argparse.ArgumentParser()
120 parser.add_argument(
"-i",
"--input", help =
"Input DQM ROOT file")
121 parser.add_argument(
"-r",
"--ref", help =
"Reference DQM ROOT file (to diff)")
122 parser.add_argument(
"--summary", help =
"Dump summary", action =
"store_true")
123 parser.add_argument(
"--count", help =
"Count Histograms", action =
"store_true")
124 parser.add_argument(
"-x",
"--human", help =
"Human readable output.", action =
"store_true")
125 parser.add_argument(
"-n",
"--display", help =
"Max entries to display in --summary.", type = int, default =
None)
126 parser.add_argument(
"-c",
"--cutoff", help =
"Max cutoff to display in --summary.", type = float, default = 512, metavar=
"KiB")
127 parser.add_argument(
"-d",
"--depth", help =
"Folder depth in --summary.", type = int, default = 2)
128 parser.add_argument(
"-u",
"--units", help =
"Memory units to use (KiB,MiB,GiB) if fixed output desired", type = str, default =
"None")
129 parser.add_argument(
"-p",
"--precision", help =
"Places after decimal to display.", type = int, default = 2)
131 args = parser.parse_args()
134 reader = DQMReader(args.input)
135 for (fn, v)
in reader.read_objects():
140 reader = DQMReader(args.ref)
142 for (fn, v)
in reader.read_objects():
143 ref_stats.analyze(fn, v)
146 stats = stats.difference(ref_stats)
151 total = stats.group(0, args.count)
153 print "Total bytes: %s" %
kibisize(total[
""],args)
def group(self, level, countObjects)
def analyze(self, fn, obj)
Abs< T >::type abs(const T &t)
def difference(self, ref)
static std::string join(char **cmd)
def displayDirectoryStatistics(stats, args)