ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/cbrown/AnalysisFramework/DistributedModelCalculations/CBAFviaCRAB/RunUsingCrab.py
Revision: 1.2
Committed: Thu Jan 19 12:58:17 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
Changes since 1.1: +1 -1 lines
Log Message:
Moved makefile to templates

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 import ftplib
13
14
15 def clean_file(filename):
16 if os.path.exists(filename):
17 os.unlink(filename)
18
19 def clean():
20 clean_file("Crab_Jobs/runthis.sh");
21 clean_file("Crab_Jobs/crabconfig.cfg");
22 clean_file("Crab_Jobs/Modules.tar");
23 clean_file("Crab_Jobs/AddFiles.tar");
24 clean_file("Crab_Jobs/dummy.py");
25
26 def get_root_file_name():
27 filename=""
28 commandline="ls -ltrh | grep root | grep gcc | awk '{ print $9 }'"
29 pipe=popen(commandline)
30 for l in pipe.readlines():
31 filename=str(l)
32 return filename.rstrip()
33
34 def produce_all_plots(rootpath):
35 command=" cp ../Limits/PlotScanResults.exec . && ./PlotScanResults.exec "+rootpath
36 commands.getoutput(command)
37 command=" rm ../Limits/PlotScanResults.exec"
38 commands.getoutput(command)
39 print "All plots have been generated. That's all, now have a look at the results :-)"
40
41 def monitor_job(jobname) :
42 job_done=False
43 jobdirectory=os.getcwd()+"/Crab_Jobs/"+jobname
44 print "Job monitoring for "+str(jobname)
45 confcommandM="~/material/check_status_plus_LIST.sh -r "+jobdirectory
46 pipe=popen(confcommandM)
47 for l in pipe.readlines():
48 stdout.write("\r Monitoring: " + str(l))
49 stdout.flush()
50 stdout.write("\r \r\n") #Done with monitoring ... let's clean this up :-)
51
52 def ensure_dir(f) :
53 if not os.path.exists(f):
54 os.makedirs(f)
55
56 def join_directory(path,filelist) :
57 localpath="/scratch/"+uname+"/"+path
58 ensure_dir(localpath)
59 cleanpath=path;
60 if (cleanpath[len(cleanpath)-1]=="/") : # remove trailing slash
61 cleanpath=cleanpath[0:len(cleanpath)-2]
62 filecounter=0
63 maxsizeperhadd=50
64 commandlist=[]
65 command=""
66 invertedcounter=len(filelist)
67 for item in filelist:
68 sys.stdout.write("\r Working on file "+str(filecounter)+" of "+str(len(filelist))+" ("+str(round(100*filecounter/float(len(filelist)),2))+" % done)")
69 sys.stdout.flush()
70 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
71 commands.getstatusoutput(copycommand)
72 command=command+" "+" /scratch/"+uname+"/"+item
73 filecounter=filecounter+1
74 invertedcounter=invertedcounter-1
75 if filecounter == maxsizeperhadd or invertedcounter == 0:
76 commandlist.append(command)
77 command=""
78 filecounter=0
79 stdout.write("\r \r\n") #clean up
80
81 commandcounter=0
82 fusedfiles=[]
83 for command in commandlist:
84 commandcounter=commandcounter+1
85 fusefile=" /scratch/"+uname+"/"+cleanpath+"/earlystagecommand"+str(commandcounter)+".root"
86 fusedfiles.append(fusefile)
87 ccommand="hadd -f "+fusefile+" "+command
88 print "Fusing "+str(maxsizeperhadd)+" files"
89 print ccommand
90 commands.getoutput(ccommand)
91 command="hadd -f /scratch/"+uname+"/"+cleanpath+".root"
92 for file in fusedfiles:
93 command=command+" "+file
94 commands.getoutput(command)
95
96 # deletecommand="rm -r /scratch/"+uname+"/"+path+"/"
97 print commands.getoutput(deletecommand)
98 print "All files have been joined; the merged file is in /scratch/"+uname+"/"+cleanpath+".root"
99 return "/scratch/"+uname+"/"+cleanpath+".root"
100
101
102 def check_directory(path) :
103 complete_path="/pnfs/lcg.cscs.ch/cms/trivcat/store/user/"+uname+"/"+path+"/"
104 print "\033[1;34m Going to checkout the subdirectory "+complete_path+" \033[0m "
105 listoffiles=[]
106 supposedtobejoined=False;
107 commandline="lcg-ls -l srm://storage01.lcg.cscs.ch:8443/srm/managerv2?SFN="+complete_path
108 pipe=popen(commandline)
109 for l in pipe.readlines():
110 currentline=l.strip("\n")
111 if(currentline[0]=="d") :
112 check_directory(currentline[currentline.find(path):])
113 else :
114 if(currentline.count(path) > 0) :
115 supposedtobejoined=True
116 listoffiles.append(currentline[currentline.find(path):])
117 if supposedtobejoined==True:
118 join_directory(path,listoffiles)
119
120 def fuse_job(jobname) :
121 print "Going to fuse the output."
122 check_directory("bussolaresults/"+jobname)
123
124 def produce_plots(jobname) :
125 print "Going to produce all plots"
126 externalcommand= "../Limits/produce_scan_plots.exec /scratch/"+uname+"/bussolaresults/"+jobname+".root "
127 commands.getoutput(externalcommand)
128 tarcommand= "tar zfv allplots_"+jobname+".tar.gz ../Limits/Plots/"
129 commands.getoutput(tarcommand)
130
131 def name_not_taken(specialname):
132 dirList=os.listdir(os.getcwd()+"/Crab_Jobs")
133 for fname in dirList:
134 if fname == specialname:
135 print "There already seems to be a crab job with the same name - please pick a different (less generic?) name"
136 return 1
137 return 0
138
139 def usage() :
140 print "Just run this script and it will prompt you for information; if you want to be quicker you can specify the number of jobs (--jobs/-j) and the name of the crab job (--name/-n)"
141 sys.exit(0)
142
143 print "\n\n This script is going to create your crab job and manage it. Since this will require quite a long time to run \n (the script continuously monitors the progress and resubmits any failing jobs) please make sure to run \n it only from a computer that can easily remain online for quite some time (or be prepared to babysit the jobs \n yourself) \n\n"
144
145 def getinfo() :
146 print "Cleaning up first ..."
147 clean()
148 njobs=1234567890
149 name=""
150 parser = OptionParser()
151 parser.add_option("-j","--jobs",dest="njobs",help="number of jobs",default=-1)
152 parser.add_option("-n","--name",dest="name",help="name of crab job",default="")
153 (options, args) = parser.parse_args()
154
155 name=options.name
156 njobs=int(options.njobs)
157
158 if not os.path.exists("Crab_Jobs") :
159 makecommand="mkdir Crab_Jobs"
160 commands.getoutput(makecommand)
161
162 while(float(njobs)<1 or float(njobs)>5000):
163 njobs=0
164 njobs=raw_input("Question 1: How many jobs would you like to split this into? (0<njobs<5000), --jobs=")
165 if njobs=="": #user hits enter
166 njobs=-1
167 print "Accepted number of jobs:"+str(njobs)
168 while(name=="" or name_not_taken(name)):
169 name=raw_input("Question 2: Name for this job? [no spaces!] --name=")
170 print "Accepted job name :"+name
171
172 print "We have now established the number of jobs ("+str(njobs)+") as well as the jobs name ("+str(name)+") which will serve as working directory"
173 confcommand="cat templates/runthis.sh | sed 's/TOTNJOBS/"+str(njobs)+"/' > Crab_Jobs/runthis.sh"
174 commands.getoutput(confcommand)
175 confcommand2="cat templates/crabconfig.cfg | sed 's/NJOBS/"+str(njobs)+"/' | sed 's/WORKINGDIR/"+str(name)+"/' > Crab_Jobs/crabconfig.cfg"
176 commands.getoutput(confcommand2)
177
178 print "Generated the run script (runthis.sh) as well as the crab configuration file (crabconfig.cfg); will now attempt to create the crab job"
179 tarcommand2="cp templates/dummy.py Crab_Jobs/ && tar -cvf Crab_Jobs/Modules.tar ../../Plotting/Modules/ && tar -cvf Crab_Jobs/AddFiles.tar ../Limits/TimedLimitCapsule.C && tar -rvf Crab_Jobs/AddFiles.tar ../LimitsFromSystematics/WorkerScript.C && tar -rvf Crab_Jobs/AddFiles.tar ../last_configuration.C && tar -rvf Crab_Jobs/AddFiles.tar ../Systematics/SystematicsWorkerScript.C && cp templates/Fake_Makefile Makefile && tar -rvf Crab_Jobs/AddFiles.tar Makefile && rm Makefile"
180 commands.getoutput(tarcommand2)
181
182 rootfilefetchingcommand="bash utils/get_latest_root_version.sh"
183 commands.getoutput(rootfilefetchingcommand)
184
185 latestrootfile=str(get_root_file_name())
186 tarcommand2a="tar -rf Crab_Jobs/AddFiles.tar "+str(latestrootfile)+""
187 commands.getoutput(str(tarcommand2a))
188
189 crabcommand="cd Crab_Jobs && crab -create -cfg crabconfig.cfg && rm dummy.py && rm dummy.pyc"
190 pipe=popen(crabcommand)
191 for l in pipe.readlines():
192 print l
193 dirList=os.listdir(os.getcwd()+"/Crab_Jobs")
194 direxists=0
195 for fname in dirList:
196 if fname == name:
197 direxists=1
198 if direxists == 0:
199 print "There seems to have been a problem while trying to generate the crab job; please verify that the crab environment is correctly set up. If you would like to create the crab job manually (and monitor it yourself), you can still do: \n \n cd Crab_Jobs && crab -c crabconfig.cfg -create -submit"
200 sys.exit(-1)
201 else:
202 print "Crab seems to have run correctly. Will now clean up a bit."
203 confcommand4="cd Crab_Jobs && rm crabconfig.cfg && rm runthis.sh && rm Modules.tar && rm AddFiles.tar"
204 commands.getoutput(confcommand4)
205
206 monitor="doit"
207 while(monitor!="" and monitor!="me"):
208 monitor=raw_input("Would you like to submit the jobs manually (e.g. for testing) [me] or would you like this script to submit the jobs and monitor them [enter]?")
209 if monitor=="me":
210 print "You want to submit the jobs yourself. Exiting now."
211 sys.exit(0)
212 else:
213 print "This script will submit jobs and monitor them."
214 confcommand5="cd Crab_Jobs && crab -c "+str(name)+" -submit"
215 commands.getoutput(confcommand5)
216 monitor_job(name)
217 fuse_job(name)
218 produce_all_plots("/scratch/"+uname+"/bussolaresults/"+name+".root")
219 print "Done. Your results are in Limits/Plots/ :-)"
220
221 uname=getpass.getuser()
222 getinfo()
223
224