ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/DistributedModelCalculations/CBAFviaCRAB/utils/fusejobs.py
Revision: 1.1
Committed: Thu Jan 19 13:57:47 2012 UTC (13 years, 3 months ago) by buchmann
Content type: text/x-python
Branch: MAIN
CVS Tags: cbaf_4_98ifb_paper, cbaf_4p7ifb, HEAD
Log Message:
Added two utilities: one to download root, and the other to fuse crab job output files

File Contents

# User Rev Content
1 buchmann 1.1 #!/usr/bin/python
2    
3     # System libraries to interact with the shell
4     import sys
5     import os
6     from os import popen
7     import commands
8     import time
9     import getpass
10     from sys import stdout
11     from optparse import OptionParser
12    
13     def ensure_dir(f) :
14     if not os.path.exists(f):
15     os.makedirs(f)
16    
17    
18     def join_directory(path,filelist) :
19     localpath="/scratch/"+uname+"/"+path
20     ensure_dir(localpath)
21     cleanpath=path;
22     if (cleanpath[len(cleanpath)-1]=="/") : # remove trailing slash
23     cleanpath=cleanpath[0:len(cleanpath)-2]
24     filecounter=0
25     maxsizeperhadd=50
26     commandlist=[]
27     command=""
28     invertedcounter=len(filelist)
29     for item in filelist:
30     sys.stdout.write("\r Working on file "+str(filecounter+1)+" of "+str(len(filelist))+" ("+str(round(100*filecounter/float(len(filelist)),2))+" % done)")
31     sys.stdout.flush()
32     copycommand="lcg-cp srm://storage01.lcg.cscs.ch:8443/srm/managerv2?SFN=/pnfs/lcg.cscs.ch/cms/trivcat/store/user/"+uname+"/"+item+" file:////scratch/"+uname+"/"+item
33     commands.getstatusoutput(copycommand)
34     command=command+" "+" /scratch/"+uname+"/"+item
35     filecounter=filecounter+1
36     invertedcounter=invertedcounter-1
37     if filecounter == maxsizeperhadd or invertedcounter == 0:
38     commandlist.append(command)
39     command=""
40     filecounter=0
41     stdout.write("\r \r\n") #clean up
42    
43     commandcounter=0
44     fusedfiles=[]
45     for command in commandlist:
46     commandcounter=commandcounter+1
47     fusefile=" /scratch/"+uname+"/"+cleanpath+"/earlystagecommand"+str(commandcounter)+".root"
48     fusedfiles.append(fusefile)
49     ccommand="hadd -f "+fusefile+" "+command
50     print "Fusing "+str(maxsizeperhadd)+" files"
51     print ccommand
52     commands.getoutput(ccommand)
53     command="hadd -f /scratch/"+uname+"/"+cleanpath+".root"
54     for file in fusedfiles:
55     command=command+" "+file
56     commands.getoutput(command)
57    
58     # deletecommand="rm -r /scratch/"+uname+"/"+path+"/"
59     print commands.getoutput(deletecommand)
60     print "All files have been joined; the merged file is in /scratch/"+uname+"/"+cleanpath+".root"
61     return "/scratch/"+uname+"/"+cleanpath+".root"
62    
63    
64     def check_directory(path) :
65     complete_path="/pnfs/lcg.cscs.ch/cms/trivcat/store/user/"+uname+"/"+path+"/"
66     print "\033[1;34m Going to checkout the subdirectory "+complete_path+" \033[0m "
67     listoffiles=[]
68     supposedtobejoined=False;
69     commandline="lcg-ls -l srm://storage01.lcg.cscs.ch:8443/srm/managerv2?SFN="+complete_path
70     pipe=popen(commandline)
71     for l in pipe.readlines():
72     currentline=l.strip("\n")
73     if(currentline[0]=="d") :
74     check_directory(currentline[currentline.find(path):])
75     else :
76     if(currentline.count(path) > 0) :
77     supposedtobejoined=True
78     listoffiles.append(currentline[currentline.find(path):])
79     if supposedtobejoined==True:
80     join_directory(path,listoffiles)
81    
82     def fuse_job(jobname) :
83     print "Going to fuse the output."
84     check_directory("bussolaresults/"+jobname)
85    
86     def usage() :
87     print "Please indicate the directory you'd like to fuse, using the -d option"
88     sys.exit(-1)
89    
90     parser = OptionParser()
91     parser.add_option("-d","--dir",dest="directory",help="name of directory",default=-1)
92     (options, args) = parser.parse_args()
93    
94     jdir=options.directory
95    
96     if jdir==-1:
97     usage()
98    
99     uname=getpass.getuser()
100     fuse_job(str(jdir))