ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/OSUT3Analysis/Configuration/scripts/makeBNTreePlot.py
Revision: 1.15
Committed: Fri Jun 14 16:08:18 2013 UTC (11 years, 10 months ago) by wulsin
Content type: text/x-python
Branch: MAIN
Changes since 1.14: +36 -6 lines
Log Message:
Allow to split condor jobs for each dataset with -S option

File Contents

# Content
1 #!/usr/bin/env python
2
3 # Must specify options with -l argument, and condor directory with -c argument, e.g.:
4 # > makeBNTreePlot.py -l sampleBNTreePlotConfig.py -c myCondorDir
5
6 # Additional arugments specify the running mode:
7 # -D <dataset>: Run on a single dataset (typically for testing)
8 # -C: Submit jobs to run on condor over all datasets
9 # BNTreeUseScript=True (set in sampleBNTreePlotConfig.py): run BNTreeScript root macro (also set in sampleBNTreePlotConfig.py),
10 # which must take as arguments the condor directory, dataset, and channel
11
12
13 import sys
14 import os
15 import re
16 from optparse import OptionParser
17 from array import *
18 from decimal import *
19 import subprocess
20
21 from OSUT3Analysis.Configuration.configurationOptions import *
22 from OSUT3Analysis.Configuration.processingUtilities import *
23
24 from ROOT import TChain, TCut, TDirectory, TFile, TH1D, TH2D, TStopwatch, TTree, gROOT
25
26 gROOT.SetBatch(True) # This is to prevent pop-up graphical windows
27
28
29 def MakeCondorSubmitFile(arguments, dataset):
30 outdir = "condor/"+arguments.condorDir+"/"+dataset+"/"
31 p = subprocess.Popen(["which", "makeBNTreePlot.py"], stdout=subprocess.PIPE)
32 executable = p.communicate()[0] # read the stdout of the command
33 workdir = os.getcwd() + "/"
34
35 # Count the number of hist*root files in the specified directory
36 p = subprocess.Popen("ls " + workdir + outdir + "hist*root | wc", shell=True, stdout=subprocess.PIPE)
37 out = p.communicate()[0]
38 outSplit = out.split()
39 totalJobs = int(outSplit[0]) # The first element of the list is the number of files
40
41 ## print "Debug: outSplit = "
42 ## print outSplit
43 ## out, err = p.communicate()
44 ## print "Debug: Size of out:"
45 ## print len(out)
46 ## print "out = "
47 ## print out
48 ## print "err = "
49 ## print err
50 ## print "Debug: p.communicate()[0] = " + p.communicate()[0]
51 ## totalJobs = len(out)
52 out = open(outdir+"/condorBNTree.sub", "w")
53 out.write("Executable = " + executable + " \n")
54 out.write("Universe = vanilla \n")
55 out.write("Getenv = True \n")
56 argCondorProcess = ""
57 if arguments.splitCondorJobs:
58 argCondorProcess = " -p $(Process) "
59 out.write("Arguments = -D " + dataset + " -l " + arguments.localConfig + " -c " + arguments.condorDir + argCondorProcess + " \n")
60 out.write("Output = " + workdir + outdir + "condorBNTree_$(Process).out \n")
61 out.write("Error = " + workdir + outdir + "condorBNTree_$(Process).err \n")
62 out.write("Log = " + workdir + outdir + "condorBNTree_$(Process).log \n")
63 out.write("+IsLocalJob = true \n")
64 out.write("Rank = TARGET.IsLocalSlot \n")
65 if arguments.splitCondorJobs:
66 out.write("Queue " + str(totalJobs) + " \n")
67 else:
68 out.write("Queue 1 \n")
69 out.close()
70
71
72 def RunOnCondor(arguments, split_datasets):
73 print "Running jobs on condor, instead of interactively."
74 ## print "Found condorDir = %s" % (condorDir)
75 ## print "Found split_datasets = "
76 ## print split_datasets
77
78 for dataset in split_datasets:
79 MakeCondorSubmitFile(arguments, dataset)
80 cmd = "condor_submit condor/"+arguments.condorDir+"/"+dataset+"/condorBNTree.sub"
81 os.system(cmd)
82 print "Submitting job: %s " % cmd
83
84 print "Once condor jobs have finished, merge the composite datasets and then make plots with:"
85 print " makeBNTreePlot.py -q -l " + arguments.localConfig + " -c " + arguments.condorDir
86 print " makePlots.py -l " + arguments.localConfig + " -c " + arguments.condorDir
87
88 return
89
90
91 watch = TStopwatch()
92 watch1 = TStopwatch()
93
94
95 parser = OptionParser()
96 parser = set_commandline_arguments(parser)
97
98 ### Only used by makeBNTreePlot.py (maybe move to another file?)
99 parser.remove_option("-p")
100 parser.add_option("-D", "--dataset", dest="datasetName",
101 help="Name of dataset (overrides value from local configuration file)")
102 parser.add_option("-C", "--runOnCondor", action="store_true", dest="runOnCondor", default=False,
103 help="Run on condor instead of interactively")
104 parser.add_option("-S", "--splitCondorJobs", action="store_true", dest="splitCondorJobs", default=False,
105 help="Split condor jobs to have one for each file, rather than one for each dataset")
106 parser.add_option("-p", "--condorProcessNum", dest="condorProcessNum", default=-1,
107 help="Specify which condor process to run (default is to run over all).")
108
109
110 (arguments, args) = parser.parse_args()
111
112
113 if not arguments.localConfig:
114 sys.exit(" You must specify a localOptions.py file with -l")
115 if arguments.localConfig:
116 sys.path.append(os.getcwd())
117 exec("from " + arguments.localConfig.rstrip('.py') + " import *")
118 if not arguments.condorDir:
119 sys.exit(" You must specify a condor directory with -c")
120 if arguments.condorDir:
121 condor_dir = "condor/%s" % arguments.condorDir
122
123 if arguments.datasetName: # If datasetName is specified on command line, then override the value from localConfig
124 datasets = [
125 arguments.datasetName,
126 ]
127
128 #save a list of composite datasets
129 composite_datasets = get_composite_datasets(datasets, composite_dataset_definitions)
130 #save a list of datasets with composite datasets split up
131 split_datasets = split_composite_datasets(datasets, composite_dataset_definitions)
132
133 if arguments.quickMerge and arguments.runOnCondor:
134 print "Cannot use -q (--quickMerge) and -C (--runOnCondor) options simultaneously. Please choose one or the other."
135 exit()
136
137 if arguments.runOnCondor:
138 RunOnCondor(arguments, split_datasets)
139 exit()
140
141 #write new histogram to dataset
142 if not arguments.quickMerge:
143 for dataset in split_datasets:
144 if BNTreeUseScript:
145 chainName = "OSUAnalysis/" + BNTreeChannel + "/BNTree_" + BNTreeChannel
146 command = "root -l -b -q '" + BNTreeScript + "+(\"" + condor_dir + "\",\"" + dataset + "\",\"" + chainName + "\"," + str(arguments.condorProcessNum) + ")'"
147 print "About to execute command: " + command
148 os.system(command)
149 else:
150 for hist in input_histograms:
151 #chain trees together
152 ch = TChain("OSUAnalysis/"+hist['channel']+"/BNTree_"+hist['channel'])
153 ch.Add(condor_dir + "/" + dataset + "/hist_*.root")
154 print ("Looping over chain with # entries = %f; split time = " % ch.GetEntries()),
155 watch1.Stop(); watch1.Print(); watch1.Start()
156
157 outputFile = TFile(condor_dir + "/" + dataset + ".root", "UPDATE")
158 if not outputFile or outputFile.IsZombie(): print "Could not open file: %s/%s.root" % (condor_dir, dataset)
159 outputFile.cd("OSUAnalysis/"+hist['channel'])
160
161 deleteString = hist['histName'] + ";*" # delete all existing instances of the object
162 currentDir = outputFile.GetDirectory("OSUAnalysis/"+hist['channel']);
163 if not currentDir: print "Could not find directory OSUAnalysis/%s in file %s" % (hist['channel'], outputFile.GetName())
164 currentDir.Delete(deleteString);
165 if 'nbinsY' in hist: # only make a 2D histogram if the key "nbinsY" is defined
166 h = TH2D(hist['histName'], hist['histName'],
167 hist['nbins'], hist['xMin'], hist['xMax'],
168 hist['nbinsY'], hist['yMin'], hist['yMax'])
169 else:
170 h = TH1D(hist['histName'], hist['histName'], hist['nbins'], hist['xMin'], hist['xMax'])
171 h.Sumw2() # Needed to get weights correct.
172 cut = TCut(hist['cutString'])
173 ch.Draw(hist['varToPlot']+">>"+hist['histName'], cut)
174 h.Write()
175 outputFile.Close()
176 print "Histogram " + hist['histName'] + " has been added to " + condor_dir + "/"+ dataset + ".root"
177
178 #merge output if composite dataset
179 for composite_dataset in composite_datasets:
180 component_datasets_list = ""
181 component_dataset_file_path = ""
182 for component_dataset in composite_dataset_definitions[composite_dataset]:
183 component_dataset_dir = "%s/%s" % (condor_dir,component_dataset)
184 component_dataset_file_path = component_dataset_dir + ".root"
185 if os.path.isfile(component_dataset_file_path):
186 component_datasets_list += " " + component_dataset_file_path
187 composite_dataset_dir = "%s/%s" % (condor_dir,composite_dataset)
188 command = "mergeHists -p %s %s" % (composite_dataset_dir, component_datasets_list)
189 print "Merging output for composite dataset: " + composite_dataset
190 os.system(command)
191
192 print ("Total time to run makeBNTreePlot.py: "),
193 watch.Stop()
194 watch.Print()
195
196
197