forked from cms-sw/cmssw
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiffTreeTool.py
executable file
·203 lines (191 loc) · 7.58 KB
/
diffTreeTool.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#! /usr/bin/env python3
from builtins import range
import optparse
import os
import re
from pprint import pprint
epsilon = 1.e-4
def getPieceFromObject (obj, description):
"""Returns piece from object """
parsed = GenObject.parseVariableTofill (description)
return GenObject.evaluateFunction (obj, parsed)
def getDictFromObject (obj, varDict, prefix = ''):
"""Given a object and a prefix, fills an return dictionary with the
proper values"""
if prefix:
obj = getPieceFromObject (obj, prefix)
retval = {}
for key, description in varDict.items():
retval[key] = getPieceFromObject (obj, description)
return retval
def format (objDict, label, spacing=9, firstOnly = False):
'''return a formatted string for given object'''
value = objDict[label]
if firstOnly:
diff = 0.
else:
diff = objDict['delta_' + label]
problem = False
if isinstance (value, float):
formatString = '%%%d.%df' % (spacing, spacing - 5)
retval = formatString % value
if abs(diff) > epsilon:
if options.delta:
retval += ' [' + formatString % (diff) + ']'
else:
retval += ' (' + formatString % (value + diff) + ')'
elif not firstOnly:
retval += ' ' * (spacing + 3)
return retval
else:
formatString = '%%%ds' % spacing
retval = formatString % value
if diff:
if isinstance (value, str):
retval += ' (' + formatString % diff + ')'
elif options.delta:
retval += ' [' + formatString % diff + ']'
else:
retval += ' (' + formatString % (value + diff) + ')'
elif not firstOnly:
retval += ' ' * (spacing + 3)
return retval
if __name__ == "__main__":
parser = optparse.OptionParser ("Usage: %prog bla.root lib.so var1 [var2]")
parser.add_option ("--delta", dest="delta",
action="store_true", default=False,
help="Show deltas when difference is large enough.")
parser.add_option ("--skipUndefined", dest="skipUndefined",
action="store_true", default=False,
help="Skip undefined variables without warning.")
options, args = parser.parse_args()
from Validation.Tools.GenObject import GenObject
if len (args) <= 2:
raise RuntimeError("Must provide root file, shlib location, "\
"and at least one variable")
rootFilename = args.pop(0)
shlib = args.pop(0)
variables = args
# play with shlib and cFile names
if not re.search (r'_C.so$', shlib) and not re.search (r'_C$', shlib):
shlib += '_C'
cFile = re.sub (r'_C$', r'.C', re.sub(r'\.so$','', shlib))
if not os.path.exists (cFile):
raise RuntimeError("Can not find accompying C file '%s'." % cFile)
if not os.path.exists (rootFilename):
raise RuntimeError("Can not find root file '%s'." % rootFilename)
# regex
diffContRE = re.compile (r'^class goDiffCont_(\w+)')
# diffRE = re.compile (r'^class goDiff_(\w+)')
variableREDict = {}
for var in variables:
variableREDict[var] = ( re.compile (r'\bdelta_%s\b' % var),
re.compile (r'\bother_%s\b' % var) )
source = open (cFile, 'r')
stringSet = set()
typeFoundSet = set()
name = ''
for line in source:
match = diffContRE.search (line)
if match:
if name:
raise RuntimeError("Currently only supported for a single"\
" class at a time.")
name = match.group(1)
continue
for key, regexTuple in variableREDict.items():
if regexTuple[0].search(line):
typeFoundSet.add( key )
continue
if regexTuple[1].search(line):
typeFoundSet.add( key )
stringSet.add ( key )
if not name:
raise RuntimeError("Didn't find any Diff Container")
working = []
for var in variables:
if var not in typeFoundSet:
if not options.skipUndefined:
raise RuntimeError("Variable '%s' not found." % var)
else:
working.append (var)
variables = working
import ROOT
if ROOT.gSystem.Load (shlib):
raise RuntimeError("Can not load shilb '%s'." % shlib)
rootfile = ROOT.TFile.Open (rootFilename)
if not rootfile:
raise RuntimeError("Failed to open root file '%s'" % rootFilename)
tree = rootfile.Get ('diffTree')
if not tree:
raise RuntimeError("Failed to get 'diffTree'")
size = tree.GetEntries()
runeventDict = {'Run':'run', 'Event':'event'}
indexSingleDict = {'index':'index'}
indexDoubleDict = {'index':'index', 'delta_index':'delta_index'}
infoSingleDict = {}
infoDoubleDict = {}
for var in variables:
infoSingleDict[var] = infoDoubleDict[var] = var;
if var in stringSet:
infoDoubleDict['delta_' + var] = 'other_' + var
else:
infoDoubleDict['delta_' + var] = 'delta_' + var
for index in range (size):
tree.GetEntry (index)
runevent = getDictFromObject (tree, runeventDict, 'runevent')
pprint (runevent)
# first only
firstOnlyColl = getPieceFromObject (tree, name + '.firstOnly')
size = firstOnlyColl.size()
if size:
print("First Only:\n index ", end=' ')
for var in variables:
print("%-12s" % (' ' + var), end=' ')
print()
print('-' * (12 + 11 * len(variables)))
for index in range (size):
firstOnly = firstOnlyColl[index]
index = getDictFromObject (firstOnly, indexSingleDict)
print(' ', format (index, 'index', 3, firstOnly = True), end=' ')
info = getDictFromObject (firstOnly, infoSingleDict)
for var in variables:
print(' ', format (info, var, firstOnly = True), end=' ')
print()
print()
# second only
secondOnlyColl = getPieceFromObject (tree, name + '.secondOnly')
size = secondOnlyColl.size()
if size:
print("Second Only:\n index ", end=' ')
for var in variables:
print("%-12s" % (' ' + var), end=' ')
print()
print('-' * (12 + 11 * len(variables)))
for index in range (size):
secondOnly = secondOnlyColl[index]
index = getDictFromObject (secondOnly, indexSingleDict)
print(' ', format (index, 'index', 3, firstOnly = True), end=' ')
info = getDictFromObject (secondOnly, infoSingleDict)
for var in variables:
print(' ', format (info, var, firstOnly = True), end=' ')
print()
print()
# both
diffColl = getPieceFromObject (tree, name+'.diff')
size = diffColl.size()
if size:
print("Both:\n index", end=' ')
for var in variables:
print("%-24s" % (' ' + var), end=' ')
print()
print('-' * (16 + 23 * len(variables)))
for index in range (size):
diff = diffColl[index]
index = getDictFromObject (diff, indexDoubleDict)
print(' ', format (index, 'index', 3), end=' ')
info = getDictFromObject (diff, infoDoubleDict)
for var in variables:
print(' ', format (info, var), end=' ')
print()
print()