ra4_stats  0341147a0dc35f80f4e12c6003afb76a38e2ed6e
send_limits.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 import argparse
4 import os
5 import glob
6 import subprocess
7 import errno
8 import numpy
9 
10 def ensureDir(path):
11  try:
12  os.makedirs(path)
13  except OSError as e:
14  if e.errno == errno.EEXIST and os.path.isdir(path):
15  pass
16  else:
17  raise
18 
19 def fullPath(path):
20  return os.path.realpath(os.path.abspath(os.path.expanduser(path)))
21 
22 def SendLimits(input_dir, output_dir, num_jobs):
23  input_dir = fullPath(input_dir)
24  output_dir = fullPath(output_dir)
25 
26  run_dir = os.path.join(output_dir, "run")
27  ensureDir(run_dir)
28 
29  cmssw_dir = os.path.join(os.environ["CMSSW_BASE"],"src")
30 
31  if num_jobs < 1:
32  num_jobs = 1
33 
34  input_files = [ fullPath(f) for f in glob.glob(os.path.join(input_dir, "*_xsecNom.root")) ]
35  num_files = len(input_files)
36  input_files = numpy.array_split(numpy.array(input_files), num_jobs)
37 
38  num_submitted = 0
39 
40  for sublist in input_files:
41  if len(sublist) == 0.:
42  continue
43  job_files = sublist.tolist()
44  run_path = os.path.join(run_dir,"scan_point_{}.sh".format(num_submitted))
45  with open(run_path, "w") as run_file:
46  os.fchmod(run_file.fileno(), 0755)
47  run_file.write("#! /bin/bash\n\n")
48 
49  run_file.write("DIRECTORY=`pwd`\n")
50  run_file.write("cd {}\n".format(cmssw_dir))
51  run_file.write(". /net/cms2/cms2r0/babymaker/cmsset_default.sh\n")
52  run_file.write("eval `scramv1 runtime -sh`\n")
53  run_file.write("cd $DIRECTORY\n\n")
54 
55  for ifile in range(len(job_files)):
56  f = job_files[ifile]
57  out_file = os.path.join(output_dir, "limits_and_significances_{}_{}.txt".format(num_submitted, ifile))
58  cmd = "./run/scan_point.exe -s -f {} >> {}\n\n".format(f, out_file)
59  run_file.write("echo Starting to process file {} of {}\n".format(ifile+1, len(job_files)))
60  run_file.write(cmd)
61 
62  subprocess.check_call(["JobSubmit.csh",run_path])
63  num_submitted += 1
64 
65  print("\nSubmitted {} files in {} jobs. Output will be sent to {}.\n".format(
66  num_files, num_submitted, output_dir))
67 
68 if __name__ == "__main__":
69  parser = argparse.ArgumentParser(description="Submits batch jobs to compute limits and significances from existing workspaces",
70  formatter_class = argparse.ArgumentDefaultsHelpFormatter)
71  parser.add_argument("output_dir", nargs="?", default = "txt",
72  help = "Directory in which to store computed results.")
73  parser.add_argument("input_dir", nargs="?", default = "/net/cms2/cms2r0/babymaker/wspaces/2016_08_10/T1tttt",
74  help = "Directory containing workspaces to be processed.")
75  parser.add_argument("--num_jobs","-n", type=int, default=50,
76  help = "nNumber of jobs into which to split processing of workspaces")
77  args = parser.parse_args()
78 
79  SendLimits(args.input_dir, args.output_dir, args.num_jobs)
def ensureDir(path)
Definition: send_limits.py:10
def fullPath(path)
Definition: send_limits.py:19
def SendLimits(input_dir, output_dir, num_jobs)
Definition: send_limits.py:22