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)
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 + 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)
77 pStr=
"%."+
str(args.precision)+
"f %s" 78 for prefix
in [
'KiB',
'MiB',
'GiB']:
81 if num < 1024.0
or args.units == prefix:
82 return pStr % (num, prefix)
83 return pStr % (num, prefix)
86 group_stats = stats.group(args.depth)
88 cutoff, display = args.cutoff * 1024, args.display
90 as_list = [(v, k, )
for (k, v)
in group_stats.items()]
91 as_list.sort(reverse=
True, key=
lambda (v, k):
abs(v))
93 if cutoff
is not None:
94 as_list =
filter(
lambda (v, k):
abs(v) > cutoff, as_list)
96 if display
is not None:
97 as_list = as_list[:display]
101 print (
" DQM level %d folder breakdown " % args.depth).center(80,
"*")
103 print (
"* Size cutoff: %s" %
kibisize(cutoff,args)).ljust(79) +
"*" 105 print (
"* Showing top %d entries." % display).ljust(79) +
"*" 110 print kibisize(v,args).ljust(16,
" "), k
114 if __name__ ==
'__main__':
118 parser.add_argument(
"-i",
"--input", help =
"Input DQM ROOT file")
119 parser.add_argument(
"-r",
"--ref", help =
"Reference DQM ROOT file (to diff)")
120 parser.add_argument(
"--summary", help =
"Dump summary", action =
"store_true")
121 parser.add_argument(
"-x",
"--human", help =
"Human readable output.", action =
"store_true")
122 parser.add_argument(
"-n",
"--display", help =
"Max entries to display in --summary.", type = int, default =
None)
123 parser.add_argument(
"-c",
"--cutoff", help =
"Max cutoff to display in --summary.", type = float, default = 512, metavar=
"KiB")
124 parser.add_argument(
"-d",
"--depth", help =
"Folder depth in --summary.", type = int, default = 2)
125 parser.add_argument(
"-u",
"--units", help =
"Memory units to use (KiB,MiB,GiB) if fixed output desired", type = str, default =
"None")
126 parser.add_argument(
"-p",
"--precision", help =
"Places after decimal to display.", type = int, default = 2)
128 args = parser.parse_args()
131 reader = DQMReader(args.input)
132 for (fn, v)
in reader.read_objects():
137 reader = DQMReader(args.ref)
139 for (fn, v)
in reader.read_objects():
140 ref_stats.analyze(fn, v)
143 stats = stats.difference(ref_stats)
148 total = stats.group(0)
150 print "Total bytes: %s" %
kibisize(total[
""],args)
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)