File indexing completed on 2024-04-06 11:56:23
0001
0002
0003 from __future__ import print_function
0004 import sys
0005 import imp
0006 import copy
0007 import os
0008 import shutil
0009 import pickle
0010 import math
0011 import pprint
0012 import subprocess
0013 from datetime import date
0014 from optparse import OptionParser
0015
0016
0017 class MyBatchManager:
0018 '''Batch manager specific to cmsRun processes.'''
0019
0020 def __init__(self):
0021
0022 self.parser = OptionParser()
0023 self.parser.add_option("-o", "--outdir", dest="outputdir", type="string",
0024 help="Name of the local output directory for your jobs. This directory will be created automatically.",
0025 default="./")
0026 self.parser.add_option("--commoncfg", dest="commoncfg", type="string",
0027 help="Name of the common config file.",
0028 default="python/common_cff_py.txt")
0029 self.parser.add_option("--aligncfg", dest="aligncfg", type="string",
0030 help="Name of the align. config file.",
0031 default="python/align_tpl_py.txt")
0032 self.parser.add_option("--niter", dest="niter", type="int",
0033 help="Number of iterations",
0034 default="15")
0035 self.parser.add_option("--lst", "--listfile", "--lstfile", dest="lstfile", type="string",
0036 help="lst file to read",
0037 default=None)
0038 self.parser.add_option("--iovs", "--iovfile", dest="iovfile", type="string",
0039 help="IOV list to read",
0040 default=None)
0041 self.parser.add_option("--trkselcfg", "--trackselectionconfig", dest="trkselcfg", type="string",
0042 help="Track selection config location",
0043 default="python")
0044 self.parser.add_option("--notify", "--sendto", dest="sendto", type="string",
0045 help="Email addresses (comma-separated) to notify when job is complete.",
0046 default=None)
0047 self.parser.add_option("--deform", action="store_true",
0048 dest="useSD", default=False,
0049 help="Include surface deformations in alignment")
0050 self.parser.add_option("-f", "--force", action="store_true",
0051 dest="force", default=False,
0052 help="Don't ask any questions, just over-write")
0053 self.parser.add_option("--resubmit", action="store_true",
0054 dest="resubmit", default=False,
0055 help="Resubmit a job from the last iteration")
0056 self.parser.add_option("--redirectproxy", action="store_true",
0057 dest="redirectproxy", default=False,
0058 help="Redirect the proxy to a path visible in batch")
0059 self.parser.add_option("--dry", dest="dryRun", type="int",
0060 default=0,
0061 help="Do not submit jobs, just set up the cfg files")
0062 (self.opt,self.args) = self.parser.parse_args()
0063
0064 self.checkProxy()
0065
0066 self.mkdir(self.opt.outputdir)
0067
0068 if self.opt.lstfile is None:
0069 print("Unspecified lst file.")
0070 sys.exit(1)
0071 if self.opt.iovfile is None:
0072 print("Unspecified IOV list.")
0073 sys.exit(1)
0074
0075 self.jobname = self.opt.outputdir.split('/')[-1]
0076
0077 if self.opt.redirectproxy:
0078 print("Job {} is configured to redirect its Grid proxy.".format(self.jobname))
0079 self.redirectProxy()
0080
0081 if self.opt.sendto is not None:
0082 self.opt.sendto.strip()
0083 self.opt.sendto.replace(","," ")
0084 print("Job {} is configured to notify {}.".format(self.jobname, self.opt.sendto))
0085
0086
0087 self.SDflag = 1 if self.opt.useSD else 0
0088 self.redirectproxyflag = 1 if self.opt.redirectproxy else 0
0089
0090
0091 def mkdir(self, dirname):
0092 mkdir = 'mkdir -p %s' % dirname
0093 ret = os.system( mkdir )
0094 if( ret != 0 ):
0095 print('Please remove or rename directory: ', dirname)
0096 sys.exit(4)
0097
0098 def notify(self, desc):
0099 print(desc)
0100 if self.opt.sendto is not None:
0101 strcmd = "mail -s {1} {0} <<< \"{2}\"".format(self.opt.sendto, self.jobname, desc)
0102 os.system(strcmd)
0103
0104 def checkLastIteration(self):
0105 lastIter=self.opt.niter
0106 doesExist=os.system("test -s {}/alignments_iter{}.db".format(self.opt.outputdir, lastIter))
0107 while (doesExist != 0):
0108 lastIter -= 1
0109 if lastIter < 0:
0110 break
0111 doesExist=os.system("test -s {}/alignments_iter{}.db".format(self.opt.outputdir, lastIter))
0112 return lastIter
0113
0114 def finalize(self, ret):
0115 strresult=""
0116 exitCode=0
0117 if( ret != 0 ):
0118 strresult = "Jobs cannot be submitted for {}. Exiting...".format(self.jobname)
0119 exitCode=1
0120 elif self.opt.dryRun > 0:
0121 strresult = "Dry run setup is complete for {}.".format(self.jobname)
0122 else:
0123 lastIter=self.checkLastIteration()
0124 if lastIter == self.opt.niter:
0125 strresult = "The final iteration {}/alignments_iter{}.db is recorded successfully.".format(self.jobname, lastIter)
0126 elif lastIter>0:
0127 strresult = "The last successful iteration was {}/alignments_iter{}.db out of the {} requested iterations.".format(self.jobname, lastIter, self.opt.niter)
0128 exitCode=1
0129 else:
0130 strresult = "None of the {} iterations were successful in job {}.".format(self.opt.niter, self.jobname)
0131 exitCode=1
0132 self.notify(strresult)
0133 if exitCode!=0:
0134 sys.exit(strresult)
0135
0136 def submitJobs(self):
0137 jobcmd=""
0138 if self.opt.resubmit:
0139 jobcmd = 'scripts/reiterator_py {} {} {} {} {} {}'.format(
0140 self.opt.niter,
0141 self.opt.outputdir,
0142 self.opt.iovfile
0143 )
0144 else:
0145 if self.opt.dryRun > 0:
0146 print('Dry run option is enabled. Will not submit jobs to the queue')
0147 jobcmd = 'scripts/iterator_py {} {} {} {} {} {} {} {} {} {}'.format(
0148 self.opt.niter,
0149 self.opt.outputdir,
0150 self.opt.lstfile,
0151 self.opt.iovfile,
0152 self.opt.commoncfg,
0153 self.opt.aligncfg,
0154 self.opt.trkselcfg,
0155 self.SDflag,
0156 self.redirectproxyflag,
0157 self.opt.dryRun
0158 )
0159 ret = os.system( jobcmd )
0160 self.finalize(ret)
0161
0162 def checkProxy(self):
0163 try:
0164 subprocess.check_call(["voms-proxy-info", "--exists"])
0165 except subprocess.CalledProcessError:
0166 print("Please initialize your proxy before submitting.")
0167 sys.exit(1)
0168
0169 def redirectProxy(self):
0170 local_proxy = subprocess.check_output(["voms-proxy-info", "--path"]).strip()
0171 new_proxy_path = os.path.join(self.opt.outputdir,".user_proxy")
0172 print("Copying local proxy {} to the job directory as {}.".format(local_proxy,new_proxy_path))
0173 shutil.copyfile(local_proxy, new_proxy_path)
0174
0175
0176
0177 if __name__ == '__main__':
0178 batchManager = MyBatchManager()
0179 batchManager.submitJobs()