ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/Development/various_assignments/SimJo/scripts/hadd.py
Revision: 1.1
Committed: Fri Feb 8 16:51:45 2013 UTC (12 years, 3 months ago) by pjordi
Content type: text/x-python
Branch: MAIN
CVS Tags: HEAD
Log Message:
Initial commit.

File Contents

# User Rev Content
1 pjordi 1.1 #!/usr/bin/python
2    
3     #
4     # This is a wrapper script around the hadd tool.
5     # - hadd tool merges multiple root files with same tree
6     # but is limited to 1000 files
7     # - this script can merge up to 1000 * 1000 root files
8     #
9     # Todo:
10     # - extend to merge more files.
11     #
12    
13     import subprocess
14     import sys
15     import os
16    
17     def callHadd(outfile, filelist):
18     if os.path.exists(outfile):
19     print 'ERROR: file ', outfile, ' exists already.'
20     sys.exit()
21    
22     cmd = 'hadd %s %s' % (outfile, ' '.join(filelist))
23     #print cmd
24     if not subprocess.call(cmd, shell=True) == 0:
25     print 'ERROR: while executing hadd.'
26     sys.exit()
27    
28    
29     def hadd(outfile, infiles):
30     nFiles = 0
31     files = []
32     nTempfiles = 0
33     tempfiles = []
34    
35     for f in infiles:
36     if os.path.splitext(f)[1] == '.root':
37     files.append(f)
38     nFiles+=1
39    
40     if nFiles > 0 and nFiles % 1000 == 0:
41     nTempfiles+=1
42     tmpfile = '%s_%03d.root' % (os.path.splitext(outfile)[0], nTempfiles)
43     callHadd(tmpfile, files)
44     files = []
45     tempfiles.append(tmpfile)
46    
47     # join rest
48     if nFiles > 0 and not nFiles % 1000 == 0:
49     nTempfiles+=1
50     tmpfile = '%s_%03d.root' % (os.path.splitext(outfile)[0], nTempfiles)
51     callHadd(tmpfile, files)
52     tempfiles.append(tmpfile)
53    
54     # join the tempfiles
55     callHadd(outfile, tempfiles)
56    
57     # remove tempfiles
58     for f in tempfiles:
59     os.remove(f)
60    
61     print '%d files joined in %s.' % (nFiles, outfile)
62    
63     # ----------------------------------------------------------------------
64    
65     if __name__ == '__main__':
66    
67     if len(sys.argv) < 3:
68     print 'Usage: ', sys.argv[0], ' outfile infile1 [infile2] ...'
69     exit()
70    
71     outfile = sys.argv[1]
72    
73     if not os.path.splitext(outfile)[1] == '.root':
74     print 'ERROR: outfile ', outfile, 'must be a root file.'
75     exit()
76    
77     if os.path.exists(outfile):
78     print 'ERROR: outfile ', outfile, ' must not exist.'
79     exit()
80    
81     hadd(outfile, sys.argv[2:])