00001
00002
00003
00004
00005
00006
00007 import ProcessManager.Status as Status
00008
00009 class SiteConfig:
00010 """ Configuration information for a given computer site """
00011 def __init__(self):
00012 """Constructor"""
00013 import os
00014 self.nuwaDir=None
00015 self.cmtConfig=None
00016 self.outputDir=None
00017 self.jobLogDir=None
00018 self.statsOffsetDir=None
00019 self.figuresOffsetDir=None
00020 self.xmlOffsetDir=None
00021 self.statsRootDir=None
00022 self.figuresRootDir=None
00023 self.xmlRootDir=None
00024 self.runsXmlDir=None
00025 self.batchExec=None
00026 self.batchWrapper="$PROCESSMANAGERROOT/scripts/batchNuWa.sh"
00027 self.batchLogDir=self.jobLogDir
00028 self.batchLogDir=None
00029 self.stateRootDir=None
00030 return
00031
00032 def jobId(self, jobName=None, runNumber=None, seqNumber=None):
00033 """ Return a string to identify the job """
00034 jobId = ""
00035 if jobName:
00036 jobId += jobName
00037 else:
00038 jobId += "noname"
00039 if runNumber:
00040 jobId += "_run%07d" % runNumber
00041 if seqNumber:
00042 jobId += "_seq%04d" % seqNumber
00043 return jobId
00044
00045 def batchCommand(self, batchArgs, jobName, runNumber, seqNumber):
00046 """Construct a batch command"""
00047 print "SiteConfig: batchCommand is undefined for this site"
00048 return ""
00049
00050 def runSepDir(self, runNumber):
00051 """Make an appropriate structure for run subdirectories"""
00052
00053 runK = runNumber / 1000
00054 runH = runNumber / 100
00055 return "runs_%04d000/runs_%05d00" % (runK, runH)
00056
00057 def runSubDir(self, runNumber):
00058 """Return run subpath + directory"""
00059 return self.runSepDir(runNumber)+"/run_%07d" % runNumber
00060
00061 def statsRelativeDir(self, runNumber):
00062 """Construct the relative path of the root files from the index"""
00063 return self.runSubDir(runNumber)+"/root"
00064
00065 def statsDirectory(self, runNumber):
00066 """Construct the absolute path of the root files from the index"""
00067 return self.statsRootDir+"/"+self.statsRelativeDir(runNumber)
00068
00069 def statsSeqFile(self, jobName, runNumber, seqNumber):
00070 """Construct the stats ROOT file path and name"""
00071 filename = "%s.root" % self.jobId(jobName, runNumber, seqNumber)
00072 return self.statsDirectory(runNumber)+"/"+filename
00073
00074 def statsInstallPath(self, jobName, runNumber):
00075 """Construct the relative summed stats ROOT file path and name for index lookup"""
00076 filename = "%s_total.root" % self.jobId(jobName, runNumber)
00077 return self.statsOffsetDir+'/'+self.statsRelativeDir(runNumber)+"/"+filename
00078
00079 def statsSumFile(self, jobName, runNumber):
00080 """Construct the summed stats ROOT file path and name"""
00081 filename = "%s_total.root" % self.jobId(jobName, runNumber)
00082 return self.statsDirectory(runNumber)+"/"+filename
00083
00084 def statsLockFile(self, jobName, runNumber):
00085 """Construct the stats lock file path and name"""
00086 filename = "%s_total.lock" % self.jobId(jobName, runNumber)
00087 return self.statsDirectory(runNumber)+"/"+filename
00088
00089 def runLockFile(self, runNumber):
00090 """Construct the run summary lock file path and name"""
00091 filename = "run_%07d.lock" % runNumber
00092 return self.xmlRootDir+"/"+self.runSubDir(runNumber)+"/"+filename
00093
00094 def figuresDirectory(self, runNumber):
00095 """Construct the figures directory for the given run"""
00096 return self.figuresRootDir+"/"+self.runSubDir(runNumber)
00097
00098 def figuresPathReplace(self, runNumber):
00099 """Construct the figures directory for the given run"""
00100 runPath = "run_%07d" % runNumber
00101 return runPath+","+self.runSubDir(runNumber)
00102
00103 def xmlRelativeDir(self, runNumber):
00104 """Construct the xml directory for the given run"""
00105 return self.xmlOffsetDir+"/"+self.runSubDir(runNumber)
00106
00107 def xmlDirectory(self, runNumber):
00108 """Construct the xml directory for the given run"""
00109 return self.outputDir+'/'+self.xmlRelativeDir(runNumber)
00110
00111 def xmlIndexFile(self, runNumber):
00112 """Construct the run index file path and name"""
00113 filename = "run_%07d.xml" % runNumber
00114 return self.xmlDirectory(runNumber)+"/"+filename
00115
00116 def runIndexDir(self):
00117 """Construct the index of all runs file path"""
00118 return self.runsXmlDir
00119
00120 def runIndexFile(self):
00121 """Construct the index of all runs file path and name"""
00122 return self.runIndexDir() + "/runs.xml"
00123
00124 def runIndexLockFile(self):
00125 """Construct the index of all runs lock file path and name"""
00126 return self.runsXmlDir + "/runs.lock"
00127
00128 def logDirectory(self, runNumber):
00129 """Construct the path for the nuwa log output directory"""
00130 return self.jobLogDir+"/"+self.runSepDir(runNumber)
00131
00132 def logOutFile(self, jobName, runNumber, seqNumber=None):
00133 """Construct the path for the nuwa log output file"""
00134 import os
00135 filename = "%s_%d.out" % (self.jobId(jobName, runNumber, seqNumber),
00136 os.getpid() )
00137 return self.logDirectory(runNumber)+"/"+filename
00138
00139 def logErrFile(self, jobName, runNumber, seqNumber=None):
00140 """Construct the path for the log error file"""
00141 import os
00142 filename = "%s_%d.err" % (self.jobId(jobName, runNumber, seqNumber),
00143 os.getpid() )
00144 return self.logDirectory(runNumber)+"/"+filename
00145
00146 def batchLogDirectory(self, runNumber):
00147 """Construct the directory for batch log files"""
00148 return self.batchLogDir+"/"+self.runSepDir(runNumber)
00149
00150 def batchLogOutFile(self, jobName, runNumber, seqNumber=None):
00151 """Construct the path for the batch log output file"""
00152 import os
00153 jobId = self.jobId(jobName, runNumber, seqNumber)
00154 filename = "batch_%s_%d.out" % (self.jobId(jobName, runNumber,
00155 seqNumber),
00156 os.getpid() )
00157 return self.batchLogDirectory(runNumber)+"/"+filename
00158
00159 def batchLogErrFile(self, jobName, runNumber, seqNumber=None):
00160 """Construct the path for the batch log error file"""
00161 import os
00162 filename = "batch_%s_%d.err" % (self.jobId(jobName, runNumber,
00163 seqNumber),
00164 os.getpid() )
00165 return self.batchLogDirectory(runNumber)+"/"+filename
00166
00167 def stateFile(self, jobType, jobName, runNumber, seqNumber):
00168 """Construct the path and filename for logging state of this job"""
00169 filename = "%s_%s.state" % (self.jobId(jobName, runNumber,seqNumber),
00170 jobType)
00171 return self.stateRootDir+"/"+self.runSubDir(runNumber)+"/"+filename
00172
00173 class SiteConfigLocal(SiteConfig):
00174 """ Configuration information for a local install """
00175 def __init__(self):
00176 """Constructor"""
00177 SiteConfig.__init__(self)
00178 self.nuwaDir="$SITEROOT"
00179 self.cmtConfig="$CMTCONFIG"
00180 self.outputDir="."
00181 self.jobLogDir=self.outputDir+"/logs"
00182 self.statsOffsetDir="diagnostics"
00183 self.figuresOffsetDir="diagnostics"
00184 self.xmlOffsetDir="diagnostics"
00185 self.statsRootDir=self.outputDir+'/'+self.statsOffsetDir
00186 self.figuresRootDir=self.outputDir+'/'+self.figuresOffsetDir
00187 self.xmlRootDir=self.outputDir+'/'+self.xmlOffsetDir
00188 self.runsXmlDir=self.outputDir
00189 self.batchExec=None
00190 self.batchLogDir=self.jobLogDir
00191 self.stateRootDir=self.outputDir+"/state"
00192
00193 def batchCommand(self, batchArgs, jobName, runNumber, seqNumber):
00194 """Construct a batch command"""
00195 import os
00196 pid = os.getpid()
00197 batchCommand = "%(wrapper)s %(nuwaDir)s %(cmtConfig)s " % {
00198 'wrapper':self.batchWrapper,
00199 'nuwaDir':self.nuwaDir,
00200 'cmtConfig':self.cmtConfig
00201 }
00202 batchCommand += "'runProcess.py %(args)s " % {
00203 'args': ' '.join(batchArgs) }
00204 batchCommand += "> %(outlog)s 2> %(errlog)s &'" % {
00205 'outlog':self.batchLogOutFile(jobName, runNumber, seqNumber),
00206 'errlog':self.batchLogErrFile(jobName, runNumber, seqNumber) }
00207 return batchCommand
00208
00209 class SiteConfigPdsf(SiteConfig):
00210 """ Configuration information for a given site """
00211 def __init__(self):
00212 """Constructor"""
00213 SiteConfig.__init__(self)
00214
00215 self.nuwaDir="/eliza7/dayabay/scratch/dandwyer/NuWa-trunk-opt"
00216 self.cmtConfig="x86_64-slc4-gcc34-opt"
00217 self.outputDir="/project/projectdirs/dayabay/www/dybprod"
00218 self.jobLogDir=self.outputDir+"/logs"
00219 self.statsOffsetDir="diagnostics"
00220 self.figuresOffsetDir="diagnostics"
00221 self.xmlOffsetDir="diagnostics"
00222 self.statsRootDir=self.outputDir+'/'+self.statsOffsetDir
00223 self.figuresRootDir=self.outputDir+'/'+self.figuresOffsetDir
00224 self.xmlRootDir=self.outputDir+'/'+self.xmlOffsetDir
00225 self.runsXmlDir=self.outputDir
00226 self.batchExec="qsub"
00227 self.batchLogDir=self.jobLogDir
00228 self.stateRootDir=self.outputDir+"/state"
00229
00230 def batchCommand(self, batchArgs, jobName, runNumber, seqNumber):
00231 """Construct a batch command"""
00232 import os
00233 pid = os.getpid()
00234 jobId = "%s_%d" % (jobName[:2],runNumber)
00235 if seqNumber:
00236 jobId += "_%d" % seqNumber
00237 batchCommand = "%(exec)s -o %(outlog)s -e %(errlog)s -N %(jobId)s " % {
00238 'exec':self.batchExec,
00239 'outlog':self.batchLogOutFile(jobName, runNumber, seqNumber),
00240 'errlog':self.batchLogErrFile(jobName, runNumber, seqNumber),
00241 'jobId':jobId}
00242 batchCommand += "%(wrapper)s %(nuwaDir)s %(cmtConfig)s " % {
00243 'wrapper':self.batchWrapper,
00244 'nuwaDir':self.nuwaDir,
00245 'cmtConfig':self.cmtConfig
00246 }
00247 batchCommand += "'runProcess.py %(args)s'" % {
00248 'args': ' '.join(batchArgs) }
00249 return batchCommand
00250
00251 class SiteConfigPdsfTest(SiteConfig):
00252 """ Configuration information for a given site """
00253 def __init__(self):
00254 """Constructor"""
00255 SiteConfig.__init__(self)
00256 self.nuwaDir="$SITEROOT"
00257 self.cmtConfig="$CMTCONFIG"
00258 self.outputDir="/eliza7/dayabay/scratch/dandwyer/dybprodTest"
00259 self.jobLogDir=self.outputDir+"/logs"
00260 self.statsOffsetDir="diagnostics"
00261 self.figuresOffsetDir="diagnostics"
00262 self.xmlOffsetDir="diagnostics"
00263 self.statsRootDir=self.outputDir+'/'+self.statsOffsetDir
00264 self.figuresRootDir=self.outputDir+'/'+self.figuresOffsetDir
00265 self.xmlRootDir=self.outputDir+'/'+self.xmlOffsetDir
00266 self.runsXmlDir=self.outputDir
00267 self.batchExec="qsub"
00268 self.batchLogDir=self.jobLogDir
00269 self.stateRootDir=self.outputDir+"/state"
00270
00271 def batchCommand(self, batchArgs, jobName, runNumber, seqNumber):
00272 """Construct a batch command"""
00273 import os
00274 pid = os.getpid()
00275 jobId = "%s_%d" % (jobName[:2],runNumber)
00276 if seqNumber:
00277 jobId += "_%d" % seqNumber
00278 batchCommand = "%(exec)s -o %(outlog)s -e %(errlog)s -N %(jobId)s " % {
00279 'exec':self.batchExec,
00280 'outlog':self.batchLogOutFile(jobName, runNumber, seqNumber),
00281 'errlog':self.batchLogErrFile(jobName, runNumber, seqNumber),
00282 'jobId':jobId}
00283 batchCommand += "%(wrapper)s %(nuwaDir)s %(cmtConfig)s " % {
00284 'wrapper':self.batchWrapper,
00285 'nuwaDir':self.nuwaDir,
00286 'cmtConfig':self.cmtConfig
00287 }
00288 batchCommand += "'runProcess.py %(args)s'" % {
00289 'args': ' '.join(batchArgs) }
00290 return batchCommand
00291
00292 class SiteConfigPdsfSim(SiteConfig):
00293 """ Configuration information for a given site """
00294 def __init__(self):
00295 """Constructor"""
00296 SiteConfig.__init__(self)
00297
00298 self.nuwaDir="$SITEROOT"
00299 self.cmtConfig="$CMTCONFIG"
00300 self.outputDir="/project/projectdirs/dayabay/www/dybprodSim"
00301 self.jobLogDir=self.outputDir+"/logs"
00302 self.statsOffsetDir="diagnostics"
00303 self.figuresOffsetDir="diagnostics"
00304 self.xmlOffsetDir="diagnostics"
00305 self.statsRootDir=self.outputDir+'/'+self.statsOffsetDir
00306 self.figuresRootDir=self.outputDir+'/'+self.figuresOffsetDir
00307 self.xmlRootDir=self.outputDir+'/'+self.xmlOffsetDir
00308 self.runsXmlDir=self.outputDir
00309 self.batchExec="qsub"
00310 self.batchLogDir=self.jobLogDir
00311 self.stateRootDir=self.outputDir+"/state"
00312
00313 def batchCommand(self, batchArgs, jobName, runNumber, seqNumber):
00314 """Construct a batch command"""
00315 import os
00316 pid = os.getpid()
00317 jobId = "%s_%d" % (jobName[:2],runNumber)
00318 if seqNumber:
00319 jobId += "_%d" % seqNumber
00320 batchCommand = "%(exec)s -o %(outlog)s -e %(errlog)s -N %(jobId)s " % {
00321 'exec':self.batchExec,
00322 'outlog':self.batchLogOutFile(jobName, runNumber, seqNumber),
00323 'errlog':self.batchLogErrFile(jobName, runNumber, seqNumber),
00324 'jobId':jobId}
00325 batchCommand += "%(wrapper)s %(nuwaDir)s %(cmtConfig)s " % {
00326 'wrapper':self.batchWrapper,
00327 'nuwaDir':self.nuwaDir,
00328 'cmtConfig':self.cmtConfig
00329 }
00330 batchCommand += "'runProcess.py %(args)s'" % {
00331 'args': ' '.join(batchArgs) }
00332 return batchCommand
00333
00334
00335 siteConfigs = {"local":SiteConfigLocal(),
00336 "pdsf":SiteConfigPdsf(),
00337 "pdsfSim":SiteConfigPdsfSim(),
00338 "pdsfTest":SiteConfigPdsfTest()
00339 }