-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathselectbest.py
More file actions
57 lines (51 loc) · 1.74 KB
/
selectbest.py
File metadata and controls
57 lines (51 loc) · 1.74 KB
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
from os import remove
from os.path import commonprefix, exists
from sys import argv
from time import strftime
from lib.io import BareRootFile, copy_directory, RootFile, Timestamp
def selectbest(names, delete=False):
prefix = commonprefix(names)
if prefix[-1] == '_':
prefix = prefix[:-1]
morenames = [n[n.index('_', len(prefix)+1)+1:] for n in names]
suffix = commonprefix(morenames)
if suffix[-1] == '_':
suffix = suffix[:-1]
while suffix[suffix.rfind('_')+1:].isdigit():
suffix = suffix[:suffix.rfind('_')]
chisq, best = 1.0e9, None
for name in names:
with BareRootFile(name) as f:
csq, dof = 0.0, 0
for c in ('X1', 'Y1', 'X2', 'Y2'):
csq += f.get_val('chisq{0}'.format(c))
dof += f.get_val('dof{0}'.format(c))
if csq/dof < chisq:
chisq, best = csq/dof, name
filename = '{0}_best_{1}_{2}.root' \
.format(prefix, suffix, strftime('%y%m%d_%H%M%S'))
with BareRootFile(best) as old, BareRootFile(filename, 'RECREATE') as new:
condition = lambda key: not key.GetName().startswith('selected')
copy_directory(new, old, condition=condition)
new.cd()
Timestamp('selectedTimestamp').Write()
if delete:
for name in names:
remove(name)
def main():
names = []
delete = False
for name in argv[1:]:
if exists(name):
names.append(name)
elif name == '--delete':
delete = True
else:
break
if len(names) < 2:
raise RuntimeError(
'Specify arguments: at least two ROOT results files.'
)
selectbest(names, delete=delete)
if __name__ == '__main__':
main()