CMS 3D CMS Logo

Public Member Functions | Private Attributes

offlineValidation::OfflineValidationParallel Class Reference

Inheritance diagram for offlineValidation::OfflineValidationParallel:
offlineValidation::OfflineValidation genericValidation::GenericValidationData genericValidation::GenericValidation

List of all members.

Public Member Functions

def __init__
def appendToMergeParJobs
def createConfiguration
def createCrabCfg
def createScript
def getRepMap

Private Attributes

 __NJobs

Detailed Description

Definition at line 98 of file offlineValidation.py.


Constructor & Destructor Documentation

def offlineValidation::OfflineValidationParallel::__init__ (   self,
  valName,
  alignment,
  config 
)

Reimplemented from offlineValidation::OfflineValidation.

Definition at line 99 of file offlineValidation.py.

00100                                                  :
00101         OfflineValidation.__init__(self, valName, alignment, config)
00102         defaults = {
00103             "parallelJobs":"1",
00104             "jobmode":self.jobmode
00105             }
00106         offline = config.getResultingSection( "offline:"+self.name, 
00107                                               defaultDict = defaults )
00108         self.general.update( offline )
00109         self.__NJobs = self.general["parallelJobs"]


Member Function Documentation

def offlineValidation::OfflineValidationParallel::appendToMergeParJobs (   self,
  validationsSoFar = "" 
)
if no argument or "" is passed a string with an instantiation is returned,
else the validation is appended to the list

Definition at line 206 of file offlineValidation.py.

00207                                                            :
00208         """
00209         if no argument or "" is passed a string with an instantiation is returned,
00210         else the validation is appended to the list
00211         """
00212         repMap = self.getRepMap()
00213 
00214         parameters = ""
00215         fileToAdd = ""
00216         for index in range(int(self.__NJobs)):
00217             fileToAdd = '%(outputFile)s'%repMap
00218             fileToAdd = fileToAdd.replace('.root','_'+str(index)+'.root')
00219             if index < int( self.general["parallelJobs"] )-1:
00220                 parameters = parameters+fileToAdd+','
00221             else:
00222                 parameters = parameters+fileToAdd                
00223                 
00224         mergedoutputfile = ("AlignmentValidation_" + self.name + "_"
00225                             + '%(name)s'%repMap + ".root")
00226         validationsSoFar += ('root -x -b -q "TkAlOfflineJobsMerge.C(\\\"'
00227                              +parameters+'\\\",\\\"'+mergedoutputfile+'\\\")"'
00228                              +"\n")
00229         return validationsSoFar

def offlineValidation::OfflineValidationParallel::createConfiguration (   self,
  path,
  configBaseName = "TkAlOfflineValidation" 
)

Reimplemented from offlineValidation::OfflineValidation.

Definition at line 110 of file offlineValidation.py.

00111                                                                                  :
00112         # if offline validation uses N parallel jobs, we create here N cfg files
00113         numberParallelJobs = int( self.general["parallelJobs"] )
00114         # limit maximum number of parallel jobs to 40
00115         # (each output file is approximately 20MB)
00116         maximumNumberJobs = 40
00117         if numberParallelJobs > maximumNumberJobs:
00118             msg = ("Maximum allowed number of parallel jobs "
00119                    +str(maximumNumberJobs)+" exceeded!!!")
00120             raise AllInOneError(msg)
00121         # if maxevents is not specified, cannot calculate number of events for
00122         # each parallel job, and therefore running only a single job
00123         if int( self.general["maxevents"] ) == -1:
00124             msg = ("Maximum number of events (maxevents) not specified: "
00125                    "cannot use parallel jobs in offline validation")
00126             raise AllInOneError(msg)
00127         if numberParallelJobs > 1:    
00128             if self.general["offlineModuleLevelHistsTransient"] == "True":
00129                 msg = ("To be able to merge results when running parallel jobs,"
00130                        " set offlineModuleLevelHistsTransient to false.")
00131                 raise AllInOneError(msg)
00132         for index in range(numberParallelJobs):
00133             cfgName = "%s.%s.%s_%s_cfg.py"%(configBaseName, self.name,
00134                                             self.alignmentToValidate.name,
00135                                             str(index))
00136             repMap = self.getRepMap()
00137             # in this parallel job, skip index*(maxEvents/nJobs) events from
00138             # the beginning
00139             # (first index is zero, so no skipping for a single job)
00140             # and use _index_ in the name of the output file
00141             repMap.update({"nIndex": str(index)})
00142             # Create the result file directly to datadir since should not use /tmp/
00143             # see https://cern.service-now.com/service-portal/article.do?n=KB0000484
00144             repMap.update({
00145                 "outputFile": replaceByMap("AlignmentValidation_"
00146                                            + self.name +
00147                                            "_.oO[name]Oo._.oO[nIndex]Oo..root",
00148                                            repMap )
00149                 })
00150             repMap["outputFile"] = os.path.expandvars( repMap["outputFile"] )
00151 
00152             cfgs = {cfgName:replaceByMap(configTemplates.offlineParallelTemplate,
00153                                          repMap)}
00154             self.filesToCompare[GenericValidationData.defaultReferenceName] = repMap["resultFile"] 
00155             GenericValidationData.createConfiguration(self, cfgs, path)
00156             # here is a small problem. only the last cfgs is saved
00157             # it requires a bit ugly solution later
        
def offlineValidation::OfflineValidationParallel::createCrabCfg (   self)

Definition at line 230 of file offlineValidation.py.

00231                              :
00232         msg =  ("jobmode 'crab' not supported for 'offlineParallel' validation."
00233                 " Please choose another 'jobmode'.")
00234         raise AllInOneError(msg)
00235 

def offlineValidation::OfflineValidationParallel::createScript (   self,
  path,
  scriptBaseName = "TkAlOfflineValidation" 
)

Reimplemented from offlineValidation::OfflineValidation.

Definition at line 158 of file offlineValidation.py.

00159                                                                           :
00160         # A separate script is created for each parallel jobs.
00161         # Since only one cfg is saved a bit ugly solution is needed in the loop.
00162         returnValue = []
00163         numJobs = int( self.general["parallelJobs"] )
00164         for index in range(numJobs):
00165             scriptName = "%s.%s.%s_%s.sh"%(scriptBaseName, self.name, 
00166                                            self.alignmentToValidate.name,
00167                                            str(index))
00168             repMap = self.getRepMap()
00169             repMap["nIndex"]=""
00170             repMap["nIndex"]=str(index)
00171             repMap["CommandLine"]=""
00172             repMap.update({
00173                 "outputFile": replaceByMap("AlignmentValidation_"
00174                                            + self.name +
00175                                            "_.oO[name]Oo._.oO[nIndex]Oo..root",
00176                                            repMap )
00177                 })
00178             for cfg in self.configFiles:
00179                 # The ugly solution here is to change the name for each parallel job 
00180                 cfgtemp = cfg.replace(str(numJobs-1)+"_cfg.py",
00181                                       str(index)+"_cfg.py")
00182                 repMap["CommandLine"]+= repMap["CommandLineTemplate"]%{"cfgFile":cfgtemp,
00183                                                                        "postProcess":""
00184                                                                        }
00185                 scripts = {scriptName: replaceByMap(configTemplates.parallelScriptTemplate,
00186                                                     repMap ) }
00187                 returnValue.extend(GenericValidationData.createScript(self,
00188                                                                       scripts,
00189                                                                       path) )
00190         return returnValue

def offlineValidation::OfflineValidationParallel::getRepMap (   self,
  alignment = None 
)

Reimplemented from offlineValidation::OfflineValidation.

Definition at line 191 of file offlineValidation.py.

00192                                          :
00193         repMap = OfflineValidation.getRepMap(self, alignment) 
00194         repMap.update({
00195             "nJobs": self.general["parallelJobs"],
00196             "offlineValidationFileOutput":
00197             configTemplates.offlineParallelFileOutputTemplate,
00198             "nameValidation": self.name
00199             })
00200         # In case maxevents==-1, set number of parallel jobs to 1
00201         # since we cannot calculate number of events for each
00202         # parallel job
00203         if str(self.general["maxevents"]) == "-1":
00204             repMap.update({ "nJobs": "1" })
00205         return repMap


Member Data Documentation

Definition at line 99 of file offlineValidation.py.