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

# Content
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))