1 |
|
#!/usr/bin/env python |
2 |
|
|
3 |
< |
# Must specify options with -l argument, e.g.: |
4 |
< |
# > makeBNTreePlot.py -l sampleBNTreePlotConfig.py |
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 |
21 |
|
from OSUT3Analysis.Configuration.configurationOptions import * |
22 |
|
from OSUT3Analysis.Configuration.processingUtilities import * |
23 |
|
|
24 |
< |
from ROOT import TChain, TCut, TDirectory, TFile, TH1D, TStopwatch, TTree, gROOT |
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 |
32 |
> |
executable = p.communicate()[0] # read the stdout of the command |
33 |
|
workdir = os.getcwd() + "/" |
34 |
< |
outdir = "condor/"+arguments.condorDir+"/"+dataset+"/" |
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 |
< |
out.write("Arguments = -D " + dataset + " -l " + arguments.localConfig + " -c " + arguments.condorDir + " \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 |
< |
out.write("Queue 1 \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 |
|
|
77 |
|
|
78 |
|
for dataset in split_datasets: |
79 |
|
MakeCondorSubmitFile(arguments, dataset) |
80 |
< |
# Now submit the condor job |
81 |
< |
# os.system("condor_submit condor/"+arguments.condorDir+"/"+dataset+"condorBNTree.sub") |
82 |
< |
print "Submitted job for: %s/%s" % (arguments.condorDir, 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 |
> |
if arguments.splitCondorJobs: |
86 |
> |
print " mergeOutput.py -q -l " + arguments.localConfig + " -c " + arguments.condorDir |
87 |
> |
else: |
88 |
> |
print " makeBNTreePlot.py -q -l " + arguments.localConfig + " -c " + arguments.condorDir |
89 |
> |
print " makePlots.py -l " + arguments.localConfig + " -c " + arguments.condorDir |
90 |
|
|
91 |
|
return |
92 |
|
|
93 |
|
|
94 |
< |
watch = TStopwatch() |
94 |
> |
watch = TStopwatch() |
95 |
> |
watch1 = TStopwatch() |
96 |
> |
|
97 |
|
|
98 |
|
parser = OptionParser() |
99 |
|
parser = set_commandline_arguments(parser) |
100 |
+ |
|
101 |
+ |
### Only used by makeBNTreePlot.py (maybe move to another file?) |
102 |
+ |
parser.remove_option("-p") |
103 |
+ |
parser.add_option("-D", "--dataset", dest="datasetName", |
104 |
+ |
help="Name of dataset (overrides value from local configuration file)") |
105 |
+ |
parser.add_option("-C", "--runOnCondor", action="store_true", dest="runOnCondor", default=False, |
106 |
+ |
help="Run on condor instead of interactively") |
107 |
+ |
parser.add_option("-S", "--splitCondorJobs", action="store_true", dest="splitCondorJobs", default=False, |
108 |
+ |
help="Split condor jobs to have one for each file, rather than one for each dataset") |
109 |
+ |
parser.add_option("-p", "--condorProcessNum", dest="condorProcessNum", default=-1, |
110 |
+ |
help="Specify which condor process to run (default is to run over all).") |
111 |
+ |
|
112 |
+ |
|
113 |
|
(arguments, args) = parser.parse_args() |
114 |
+ |
|
115 |
|
|
116 |
|
if not arguments.localConfig: |
117 |
|
sys.exit(" You must specify a localOptions.py file with -l") |
133 |
|
#save a list of datasets with composite datasets split up |
134 |
|
split_datasets = split_composite_datasets(datasets, composite_dataset_definitions) |
135 |
|
|
136 |
+ |
if arguments.quickMerge and arguments.runOnCondor: |
137 |
+ |
print "Cannot use -q (--quickMerge) and -C (--runOnCondor) options simultaneously. Please choose one or the other." |
138 |
+ |
exit() |
139 |
+ |
|
140 |
|
if arguments.runOnCondor: |
141 |
|
RunOnCondor(arguments, split_datasets) |
142 |
< |
exit() |
86 |
< |
|
87 |
< |
print "Running interactively instead" |
88 |
< |
|
142 |
> |
exit() |
143 |
|
|
144 |
|
#write new histogram to dataset |
145 |
< |
for dataset in split_datasets: |
146 |
< |
for hist in input_histograms: |
147 |
< |
#chain trees together |
148 |
< |
ch = TChain("OSUAnalysis/"+hist['channel']+"/BNTree_"+hist['channel']) |
149 |
< |
ch.Add(condor_dir + "/" + dataset + "/hist_*.root") |
150 |
< |
print "Looping over chain with # entries = %f" % ch.GetEntries() |
151 |
< |
|
152 |
< |
outputFile = TFile(condor_dir + "/" + dataset + ".root", "UPDATE") |
153 |
< |
if not outputFile or outputFile.IsZombie(): print "Could not open file: %s/%s.root" % (condor_dir, dataset) |
154 |
< |
outputFile.cd("OSUAnalysis/"+hist['channel']) |
155 |
< |
|
156 |
< |
deleteString = hist['histName'] + ";*" # delete all existing instances of the object |
157 |
< |
currentDir = outputFile.GetDirectory("OSUAnalysis/"+hist['channel']); |
158 |
< |
if not currentDir: print "Could not find directory OSUAnalysis/%s in file %s" % (hist['channel'], outputFile.GetName()) |
159 |
< |
currentDir.Delete(deleteString); |
160 |
< |
|
161 |
< |
h = TH1D(hist['histName'], hist['histName'], hist['nbins'], hist['xMin'], hist['xMax']) |
162 |
< |
h.Sumw2() # Needed to get weights correct. |
163 |
< |
cut = TCut(hist['cutString']) |
164 |
< |
ch.Draw(hist['varToPlot']+">>"+hist['histName'], cut) |
165 |
< |
h.Write() |
166 |
< |
outputFile.Close() |
167 |
< |
print "Histogram " + hist['histName'] + " has been added to " + condor_dir + "/"+ dataset + ".root" |
145 |
> |
if not arguments.quickMerge: |
146 |
> |
for dataset in split_datasets: |
147 |
> |
if BNTreeUseScript: |
148 |
> |
chainName = "OSUAnalysis/" + BNTreeChannel + "/BNTree_" + BNTreeChannel |
149 |
> |
command = "root -l -b -q '" + BNTreeScript + "+(\"" + condor_dir + "\",\"" + dataset + "\",\"" + chainName + "\"," + str(arguments.condorProcessNum) + ")'" |
150 |
> |
print "About to execute command: " + command |
151 |
> |
os.system(command) |
152 |
> |
else: |
153 |
> |
for hist in input_histograms: |
154 |
> |
#chain trees together |
155 |
> |
ch = TChain("OSUAnalysis/"+hist['channel']+"/BNTree_"+hist['channel']) |
156 |
> |
ch.Add(condor_dir + "/" + dataset + "/hist_*.root") |
157 |
> |
print ("Looping over chain with # entries = %f; split time = " % ch.GetEntries()), |
158 |
> |
watch1.Stop(); watch1.Print(); watch1.Start() |
159 |
> |
|
160 |
> |
outputFile = TFile(condor_dir + "/" + dataset + ".root", "UPDATE") |
161 |
> |
if not outputFile or outputFile.IsZombie(): print "Could not open file: %s/%s.root" % (condor_dir, dataset) |
162 |
> |
outputFile.cd("OSUAnalysis/"+hist['channel']) |
163 |
> |
|
164 |
> |
deleteString = hist['histName'] + ";*" # delete all existing instances of the object |
165 |
> |
currentDir = outputFile.GetDirectory("OSUAnalysis/"+hist['channel']); |
166 |
> |
if not currentDir: print "Could not find directory OSUAnalysis/%s in file %s" % (hist['channel'], outputFile.GetName()) |
167 |
> |
currentDir.Delete(deleteString); |
168 |
> |
if 'nbinsY' in hist: # only make a 2D histogram if the key "nbinsY" is defined |
169 |
> |
h = TH2D(hist['histName'], hist['histName'], |
170 |
> |
hist['nbins'], hist['xMin'], hist['xMax'], |
171 |
> |
hist['nbinsY'], hist['yMin'], hist['yMax']) |
172 |
> |
else: |
173 |
> |
h = TH1D(hist['histName'], hist['histName'], hist['nbins'], hist['xMin'], hist['xMax']) |
174 |
> |
h.Sumw2() # Needed to get weights correct. |
175 |
> |
cut = TCut(hist['cutString']) |
176 |
> |
ch.Draw(hist['varToPlot']+">>"+hist['histName'], cut) |
177 |
> |
h.Write() |
178 |
> |
outputFile.Close() |
179 |
> |
print "Histogram " + hist['histName'] + " has been added to " + condor_dir + "/"+ dataset + ".root" |
180 |
|
|
181 |
|
#merge output if composite dataset |
182 |
|
for composite_dataset in composite_datasets: |
192 |
|
print "Merging output for composite dataset: " + composite_dataset |
193 |
|
os.system(command) |
194 |
|
|
195 |
+ |
print ("Total time to run makeBNTreePlot.py: "), |
196 |
|
watch.Stop() |
197 |
|
watch.Print() |
198 |
|
|