![]() |
![]() |
The main building routines
Definition at line 65 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::__init__ | ( | self, | |
options, | |||
process = None , |
|||
with_output = False , |
|||
with_input = False |
|||
) |
options taken from old cmsDriver and optparse
Definition at line 68 of file ConfigBuilder.py.
00069 : 00070 """options taken from old cmsDriver and optparse """ 00071 00072 options.outfile_name = options.dirout+options.fileout 00073 00074 self._options = options 00075 00076 if self._options.isData and options.isMC: 00077 raise Exception("ERROR: You may specify only --data or --mc, not both") 00078 if not self._options.conditions: 00079 raise Exception("ERROR: No conditions given!\nPlease specify conditions. E.g. via --conditions=IDEAL_30X::All") 00080 00081 # what steps are provided by this class? 00082 stepList = [re.sub(r'^prepare_', '', methodName) for methodName in ConfigBuilder.__dict__ if methodName.startswith('prepare_')] 00083 self.stepMap={} 00084 for step in self._options.step.split(","): 00085 if step=='': continue 00086 stepParts = step.split(":") 00087 stepName = stepParts[0] 00088 if stepName not in stepList: 00089 raise ValueError("Step "+stepName+" unknown") 00090 if len(stepParts)==1: 00091 self.stepMap[stepName]="" 00092 elif len(stepParts)==2: 00093 self.stepMap[stepName]=stepParts[1].split('+') 00094 elif len(stepParts)==3: 00095 self.stepMap[stepName]=(stepParts[2].split('+'),stepParts[1]) 00096 else: 00097 raise ValueError("Step definition "+step+" invalid") 00098 #print "map of steps is:",self.stepMap 00099 00100 self.with_output = with_output 00101 if hasattr(self._options,"no_output_flag") and self._options.no_output_flag: 00102 self.with_output = False 00103 self.with_input = with_input 00104 if process == None: 00105 self.process = cms.Process(self._options.name) 00106 else: 00107 self.process = process 00108 self.imports = [] 00109 self.define_Configs() 00110 self.schedule = list() 00111 00112 # we are doing three things here: 00113 # creating a process to catch errors 00114 # building the code to re-create the process 00115 00116 self.additionalCommands = [] 00117 # TODO: maybe a list of to be dumped objects would help as well 00118 self.blacklist_paths = [] 00119 self.addedObjects = [] 00120 self.additionalOutputs = {} 00121 00122 self.productionFilterSequence = None 00123 00124
def ConfigBuilder::ConfigBuilder::addCommon | ( | self | ) |
Definition at line 141 of file ConfigBuilder.py.
00142 : 00143 if 'HARVESTING' in self.stepMap.keys() or 'ALCAHARVEST' in self.stepMap.keys(): 00144 self.process.options = cms.untracked.PSet( Rethrow = cms.untracked.vstring('ProductNotFound'),fileMode = cms.untracked.string('FULLMERGE')) 00145 else: 00146 self.process.options = cms.untracked.PSet( ) 00147 self.addedObjects.append(("","options")) 00148 00149 if self._options.lazy_download: 00150 self.process.AdaptorConfig = cms.Service("AdaptorConfig", 00151 stats = cms.untracked.bool(True), 00152 enable = cms.untracked.bool(True), 00153 cacheHint = cms.untracked.string("lazy-download"), 00154 readHint = cms.untracked.string("read-ahead-buffered") 00155 ) 00156 self.addedObjects.append(("Setup lazy download","AdaptorConfig")) 00157 00158 #self.process.cmsDriverCommand = cms.untracked.PSet( command=cms.untracked.string('cmsDriver.py '+self._options.arguments) ) 00159 #self.addedObjects.append(("what cmsDriver command was used","cmsDriverCommand"))
def ConfigBuilder::ConfigBuilder::addConditions | ( | self | ) |
Add conditions to the process
Definition at line 436 of file ConfigBuilder.py.
00437 : 00438 """Add conditions to the process""" 00439 00440 if 'auto:' in self._options.conditions: 00441 from autoCond import autoCond 00442 key=self._options.conditions.split(':')[-1] 00443 if key not in autoCond: 00444 raise Exception('no correspondance for '+self._options.conditions+'\n available keys are'+','.join(autoCond.keys())) 00445 else: 00446 self._options.conditions = autoCond[key] 00447 00448 # the option can be a list of GT name and connection string 00449 00450 #it is insane to keep this replace in: dependency on changes in DataProcessing 00451 conditions = self._options.conditions.replace("FrontierConditions_GlobalTag,",'').split(',') 00452 gtName = str( conditions[0] ) 00453 if len(conditions) > 1: 00454 connect = str( conditions[1] ) 00455 if len(conditions) > 2: 00456 pfnPrefix = str( conditions[2] ) 00457 00458 self.loadAndRemember(self.ConditionsDefaultCFF) 00459 00460 # set the global tag 00461 self.executeAndRemember("process.GlobalTag.globaltag = '%s'" % gtName) 00462 if len(conditions) > 1: 00463 self.executeAndRemember("process.GlobalTag.connect = '%s'" % connect) 00464 if len(conditions) > 2: 00465 self.executeAndRemember("process.GlobalTag.pfnPrefix = cms.untracked.string('%s')" % pfnPrefix) 00466 00467 if self._options.slhc: 00468 self.loadAndRemember("SLHCUpgradeSimulations/Geometry/fakeConditions_%s_cff"%(self._options.slhc,)) 00469 00470 if self._options.custom_conditions!="": 00471 specs=self._options.custom_conditions.split('+') 00472 self.executeAndRemember("process.GlobalTag.toGet = cms.VPSet()") 00473 for spec in specs: 00474 #format is tag=<...>,record=<...>,connect=<...>,label=<...> with connect and label optionnal 00475 items=spec.split(',') 00476 payloadSpec={} 00477 allowedFields=['tag','record','connect','label'] 00478 for i,item in enumerate(items): 00479 if '=' in item: 00480 field=item.split('=')[0] 00481 if not field in allowedFields: 00482 raise Exception('in --custom_conditions, '+field+' is not a valid field') 00483 payloadSpec[field]=item.split('=')[1] 00484 else: 00485 payloadSpec[allowedFields[i]]=item 00486 if (not 'record' in payloadSpec) or (not 'tag' in payloadSpec): 00487 raise Exception('conditions cannot be customised with: '+repr(payloadSpec)+' no record or tag field available') 00488 payloadSpecToAppend='' 00489 for i,item in enumerate(allowedFields): 00490 if not item in payloadSpec: continue 00491 if not payloadSpec[item]: continue 00492 if i<2: untracked='' 00493 else: untracked='untracked.' 00494 payloadSpecToAppend+='%s=cms.%sstring("%s"),'%(item,untracked,payloadSpec[item]) 00495 print 'customising the GlogalTag with:',payloadSpecToAppend 00496 self.executeAndRemember('process.GlobalTag.toGet.append(cms.PSet(%s))'%(payloadSpecToAppend,)) 00497
def ConfigBuilder::ConfigBuilder::addCustomise | ( | self | ) |
Include the customise code
Definition at line 498 of file ConfigBuilder.py.
00499 : 00500 """Include the customise code """ 00501 00502 custOpt=self._options.customisation_file.split(",") 00503 custMap={} 00504 for opt in custOpt: 00505 if opt.count('.')>1: 00506 raise Exception("more than . in the specification:"+opt) 00507 fileName=opt.split('.')[0] 00508 if opt.count('.')==0: rest='customise' 00509 else: 00510 rest=opt.split('.')[1] 00511 if rest=='py': rest='customise' #catch the case of --customise file.py 00512 00513 if fileName in custMap: 00514 custMap[fileName].extend(rest.split('+')) 00515 else: 00516 custMap[fileName]=rest.split('+') 00517 00518 if len(custMap)==0: 00519 final_snippet='\n' 00520 else: 00521 final_snippet='\n# customisation of the process.\n' 00522 00523 allFcn=[] 00524 for opt in custMap: 00525 allFcn.extend(custMap[opt]) 00526 for fcn in allFcn: 00527 if allFcn.count(fcn)!=1: 00528 raise Exception("cannot specify twice "+fcn+" as a customisation method") 00529 00530 for f in custMap: 00531 # let python search for that package and do syntax checking at the same time 00532 packageName = f.replace(".py","").replace("/",".") 00533 __import__(packageName) 00534 package = sys.modules[packageName] 00535 00536 # now ask the package for its definition and pick .py instead of .pyc 00537 customiseFile = re.sub(r'\.pyc$', '.py', package.__file__) 00538 00539 final_snippet+='\n# Automatic addition of the customisation function from '+packageName+'\n' 00540 if self._options.inline_custom: 00541 for line in file(customiseFile,'r'): 00542 if "import FWCore.ParameterSet.Config" in line: 00543 continue 00544 final_snippet += line 00545 else: 00546 final_snippet += 'from %s import %s \n'%(packageName,','.join(custMap[f])) 00547 for fcn in custMap[f]: 00548 print "customising the process with",fcn,"from",f 00549 if not hasattr(package,fcn): 00550 #bound to fail at run time 00551 raise Exception("config "+f+" has no function "+fcn) 00552 final_snippet += "\n#call to customisation function "+fcn+" imported from "+packageName 00553 final_snippet += "\nprocess = %s(process)\n"%(fcn,) 00554 00555 final_snippet += '\n# End of customisation functions\n' 00556 00557 return final_snippet
def ConfigBuilder::ConfigBuilder::addExtraStream | ( | self, | |
name, | |||
stream, | |||
workflow = 'full' |
|||
) |
Definition at line 738 of file ConfigBuilder.py.
00739 : 00740 # define output module and go from there 00741 output = cms.OutputModule("PoolOutputModule") 00742 if stream.selectEvents.parameters_().__len__()!=0: 00743 output.SelectEvents = stream.selectEvents 00744 else: 00745 output.SelectEvents = cms.untracked.PSet() 00746 output.SelectEvents.SelectEvents=cms.vstring() 00747 if isinstance(stream.paths,tuple): 00748 for path in stream.paths: 00749 output.SelectEvents.SelectEvents.append(path.label()) 00750 else: 00751 output.SelectEvents.SelectEvents.append(stream.paths.label()) 00752 00753 00754 00755 if isinstance(stream.content,str): 00756 evtPset=getattr(self.process,stream.content) 00757 for p in evtPset.parameters_(): 00758 setattr(output,p,getattr(evtPset,p)) 00759 if not self._options.inlineEventContent: 00760 def doNotInlineEventContent(instance,label = "process."+stream.content+".outputCommands"): 00761 return label 00762 output.outputCommands.__dict__["dumpPython"] = doNotInlineEventContent 00763 else: 00764 output.outputCommands = stream.content 00765 00766 00767 output.fileName = cms.untracked.string(self._options.dirout+stream.name+'.root') 00768 00769 output.dataset = cms.untracked.PSet( dataTier = stream.dataTier, 00770 filterName = cms.untracked.string(stream.name)) 00771 00772 if self._options.filtername: 00773 output.dataset.filterName= cms.untracked.string(self._options.filtername+"_"+stream.name) 00774 00775 #add an automatic flushing to limit memory consumption 00776 output.eventAutoFlushCompressedSize=cms.untracked.int32(5*1024*1024) 00777 00778 if workflow in ("producers,full"): 00779 if isinstance(stream.paths,tuple): 00780 for path in stream.paths: 00781 self.schedule.append(path) 00782 else: 00783 self.schedule.append(stream.paths) 00784 00785 # in case of relvals we don't want to have additional outputs 00786 if (not self._options.relval) and workflow in ("full","output"): 00787 self.additionalOutputs[name] = output 00788 setattr(self.process,name,output) 00789 00790 if workflow == 'output': 00791 # adjust the select events to the proper trigger results from previous process 00792 filterList = output.SelectEvents.SelectEvents 00793 for i, filter in enumerate(filterList): 00794 filterList[i] = filter+":"+self._options.triggerResultsProcess 00795 00796 return output
def ConfigBuilder::ConfigBuilder::addMaxEvents | ( | self | ) |
Here we decide how many evts will be processed
Definition at line 160 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::addOutput | ( | self | ) |
Add output module to the process
Definition at line 231 of file ConfigBuilder.py.
00232 : 00233 """ Add output module to the process """ 00234 result="" 00235 streamTypes=self.eventcontent.split(',') 00236 tiers=self._options.datatier.split(',') 00237 if not self._options.outputDefinition and len(streamTypes)!=len(tiers): 00238 raise Exception("number of event content arguments does not match number of datatier arguments") 00239 if self._options.outputDefinition: 00240 if self._options.datatier: 00241 print "--datatier & --eventcontent options ignored" 00242 00243 def anyOf(listOfKeys,dict,opt=None): 00244 for k in listOfKeys: 00245 if k in dict: 00246 toReturn=dict[k] 00247 dict.pop(k) 00248 return toReturn 00249 if opt!=None: 00250 return opt 00251 else: 00252 raise Exception("any of "+','.join(listOfKeys)+" are mandatory entries of --output options") 00253 00254 #new output convention with a list of dict 00255 outList = eval(self._options.outputDefinition) 00256 for outDefDict in outList: 00257 outDefDictStr=outDefDict.__str__() 00258 if not isinstance(outDefDict,dict): 00259 raise Exception("--output needs to be passed a list of dict"+self._options.outputDefinition+" is invalid") 00260 #requires option: tier 00261 theTier=anyOf(['t','tier','dataTier'],outDefDict) 00262 #optional option: eventcontent, filtername, selectEvents, moduleLabel, filename 00263 ## event content 00264 theStreamType=anyOf(['e','ec','eventContent','streamType'],outDefDict,theTier) 00265 theFilterName=anyOf(['f','ftN','filterName'],outDefDict,'') 00266 theSelectEvent=anyOf(['s','sE','selectEvents'],outDefDict,'') 00267 theModuleLabel=anyOf(['l','mL','moduleLabel'],outDefDict,'') 00268 theExtraOutputCommands=anyOf(['o','oC','outputCommands'],outDefDict,'') 00269 # module label has a particular role 00270 if not theModuleLabel: 00271 tryNames=[theStreamType.replace(theTier.replace('-',''),'')+theTier.replace('-','')+'output', 00272 theStreamType.replace(theTier.replace('-',''),'')+theTier.replace('-','')+theFilterName+'output', 00273 theStreamType.replace(theTier.replace('-',''),'')+theTier.replace('-','')+theFilterName+theSelectEvent.split(',')[0].replace(':','for').replace(' ','')+'output' 00274 ] 00275 for name in tryNames: 00276 if not hasattr(self.process,name): 00277 theModuleLabel=name 00278 break 00279 if not theModuleLabel: 00280 raise Exception("cannot find a module label for specification: "+outDefDictStr) 00281 00282 theFileName=self._options.dirout+anyOf(['fn','fileName'],outDefDict,theModuleLabel+'.root') 00283 if not theFileName.endswith('.root'): 00284 theFileName+='.root' 00285 if len(outDefDict.keys()): 00286 raise Exception("unused keys from --output options: "+','.join(outDefDict.keys())) 00287 if theStreamType=='ALL': 00288 theEventContent = cms.PSet(outputCommands = cms.untracked.vstring('keep *')) 00289 else: 00290 theEventContent = getattr(self.process, theStreamType+"EventContent") 00291 00292 if theStreamType=='ALCARECO' and not theFilterName: 00293 theFilterName='StreamALCACombined' 00294 output = cms.OutputModule("PoolOutputModule", 00295 theEventContent.clone(), 00296 fileName = cms.untracked.string(theFileName), 00297 dataset = cms.untracked.PSet( 00298 dataTier = cms.untracked.string(theTier), 00299 filterName = cms.untracked.string(theFilterName)) 00300 ) 00301 if not theSelectEvent and hasattr(self.process,'generation_step'): 00302 output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring('generation_step')) 00303 if theSelectEvent: 00304 output.SelectEvents =cms.untracked.PSet(SelectEvents = cms.vstring(theSelectEvent)) 00305 00306 if hasattr(self.process,theModuleLabel): 00307 raise Exception("the current process already has a module "+theModuleLabel+" defined") 00308 #print "creating output module ",theModuleLabel 00309 setattr(self.process,theModuleLabel,output) 00310 outputModule=getattr(self.process,theModuleLabel) 00311 setattr(self.process,theModuleLabel+'_step',cms.EndPath(outputModule)) 00312 path=getattr(self.process,theModuleLabel+'_step') 00313 self.schedule.append(path) 00314 00315 if not self._options.inlineEventContent and hasattr(self.process,theStreamType+"EventContent"): 00316 def doNotInlineEventContent(instance,label = "cms.untracked.vstring(process."+theStreamType+"EventContent.outputCommands)"): 00317 return label 00318 outputModule.outputCommands.__dict__["dumpPython"] = doNotInlineEventContent 00319 if theExtraOutputCommands: 00320 if not isinstance(theExtraOutputCommands,list): 00321 raise Exception("extra ouput command in --option must be a list of strings") 00322 if hasattr(self.process,theStreamType+"EventContent"): 00323 self.executeAndRemember('process.%s.outputCommands.extend(%s)'%(theModuleLabel,theExtraOutputCommands)) 00324 else: 00325 outputModule.outputCommands.extend(theExtraOutputCommands) 00326 00327 result+="\nprocess."+theModuleLabel+" = "+outputModule.dumpPython() 00328 00329 ##ends the --output options model 00330 return result 00331 00332 # if the only step is alca we don't need to put in an output 00333 if self._options.step.split(',')[0].split(':')[0] == 'ALCA': 00334 return "\n" 00335 00336 for i,(streamType,tier) in enumerate(zip(streamTypes,tiers)): 00337 if streamType=='': continue 00338 theEventContent = getattr(self.process, streamType+"EventContent") 00339 if i==0: 00340 theFileName=self._options.outfile_name 00341 theFilterName=self._options.filtername 00342 else: 00343 theFileName=self._options.outfile_name.replace('.root','_in'+streamType+'.root') 00344 theFilterName=self._options.filtername 00345 00346 output = cms.OutputModule("PoolOutputModule", 00347 theEventContent, 00348 fileName = cms.untracked.string(theFileName), 00349 dataset = cms.untracked.PSet(dataTier = cms.untracked.string(tier), 00350 filterName = cms.untracked.string(theFilterName) 00351 ) 00352 ) 00353 if hasattr(self.process,"generation_step"): 00354 output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring('generation_step')) 00355 00356 if streamType=='ALCARECO': 00357 output.dataset.filterName = cms.untracked.string('StreamALCACombined') 00358 00359 outputModuleName=streamType+'output' 00360 setattr(self.process,outputModuleName,output) 00361 outputModule=getattr(self.process,outputModuleName) 00362 setattr(self.process,outputModuleName+'_step',cms.EndPath(outputModule)) 00363 path=getattr(self.process,outputModuleName+'_step') 00364 self.schedule.append(path) 00365 00366 if not self._options.inlineEventContent: 00367 def doNotInlineEventContent(instance,label = "process."+streamType+"EventContent.outputCommands"): 00368 return label 00369 outputModule.outputCommands.__dict__["dumpPython"] = doNotInlineEventContent 00370 00371 result+="\nprocess."+outputModuleName+" = "+outputModule.dumpPython() 00372 00373 return result
def ConfigBuilder::ConfigBuilder::addSource | ( | self | ) |
Here the source is built. Priority: file, generator
Definition at line 165 of file ConfigBuilder.py.
00166 : 00167 """Here the source is built. Priority: file, generator""" 00168 self.addedObjects.append(("Input source","source")) 00169 if self._options.filein: 00170 if self._options.filetype == "EDM": 00171 self.process.source=cms.Source("PoolSource", 00172 fileNames = cms.untracked.vstring()) 00173 for entry in self._options.filein.split(','): 00174 self.process.source.fileNames.append(entry) 00175 if self._options.secondfilein: 00176 for entry in self._options.secondfilein.split(','): 00177 self.process.source.secondaryFileNames = cms.untracked.vstring(entry) 00178 elif self._options.filetype == "LHE": 00179 self.process.source=cms.Source("LHESource", fileNames = cms.untracked.vstring(self._options.filein)) 00180 elif self._options.filetype == "MCDB": 00181 self.process.source=cms.Source("MCDBSource", articleID = cms.uint32(int(self._options.filein)), supportedProtocols = cms.untracked.vstring("rfio")) 00182 00183 if 'HARVESTING' in self.stepMap.keys() or 'ALCAHARVEST' in self.stepMap.keys(): 00184 self.process.source.processingMode = cms.untracked.string("RunsAndLumis") 00185 00186 if self._options.dbsquery!='': 00187 self.process.source=cms.Source("PoolSource", fileNames = cms.untracked.vstring(),secondaryFileNames = cms.untracked.vstring()) 00188 import os 00189 print "the query is",self._options.dbsquery 00190 for line in os.popen('dbs search --query "%s"'%(self._options.dbsquery,)): 00191 if line.count(".root")>=2: 00192 #two files solution... 00193 entries=line.replace("\n","").split() 00194 if not entries[0] in self.process.source.fileNames.value(): 00195 self.process.source.fileNames.append(entries[0]) 00196 if not entries[1] in self.process.source.secondaryFileNames.value(): 00197 self.process.source.secondaryFileNames.append(entries[1]) 00198 00199 elif (line.find(".root")!=-1): 00200 entry=line.replace("\n","") 00201 if not entry in self.process.source.fileNames.value(): 00202 self.process.source.fileNames.append(entry) 00203 print "found files: ",self.process.source.fileNames.value() 00204 if self.process.source.secondaryFileNames.__len__()!=0: 00205 print "found parent files:",self.process.source.secondaryFileNames.value() 00206 00207 if self._options.inputCommands: 00208 self.process.source.inputCommands = cms.untracked.vstring() 00209 for command in self._options.inputCommands.split(','): 00210 self.process.source.inputCommands.append(command) 00211 #I do not want to drop descendants 00212 self.process.source.dropDescendantsOfDroppedBranches = cms.untracked.bool(False) 00213 00214 if self._options.inputEventContent: 00215 import copy 00216 theEventContent = getattr(self.process, self._options.inputEventContent+"EventContent") 00217 if hasattr(theEventContent,'outputCommands'): 00218 self.process.source.inputCommands=copy.copy(theEventContent.outputCommands) 00219 if hasattr(theEventContent,'inputCommands'): 00220 self.process.source.inputCommands=copy.copy(theEventContent.inputCommands) 00221 00222 if 'GEN' in self.stepMap.keys() or (not self._options.filein and hasattr(self._options, "evt_type")): 00223 if self.process.source is None: 00224 self.process.source=cms.Source("EmptySource") 00225 # if option himix is active, drop possibly duplicate DIGI-RAW info: 00226 if self._options.himix==True: 00227 self.process.source.inputCommands = cms.untracked.vstring('drop *','keep *_generator_*_*','keep *_g4SimHits_*_*') 00228 self.process.source.dropDescendantsOfDroppedBranches=cms.untracked.bool(False) 00229 00230 return
def ConfigBuilder::ConfigBuilder::addStandardSequences | ( | self | ) |
Add selected standard sequences to the process
Definition at line 374 of file ConfigBuilder.py.
00375 : 00376 """ 00377 Add selected standard sequences to the process 00378 """ 00379 # load the pile up file 00380 if self._options.pileup: 00381 pileupSpec=self._options.pileup.split(',')[0] 00382 from Configuration.StandardSequences.Mixing import Mixing,defineMixing 00383 if not pileupSpec in Mixing and '.' not in pileupSpec: 00384 raise Exception(pileupSpec+' is not a know mixing scenario:\n available are: '+'\n'.join(Mixing.keys())) 00385 if '.' in pileupSpec: 00386 mixingDict={'file':pileupSpec} 00387 else: 00388 mixingDict=Mixing[pileupSpec] 00389 if len(self._options.pileup.split(','))>1: 00390 mixingDict.update(eval(self._options.pileup[self._options.pileup.find(',')+1:])) 00391 self.loadAndRemember(mixingDict['file']) 00392 mixingDict.pop('file') 00393 if self._options.pileup_input: 00394 mixingDict['F']=self._options.pileup_input.split(',') 00395 specialization=defineMixing(mixingDict,'FASTSIM' in self.stepMap) 00396 for command in specialization: 00397 self.executeAndRemember(command) 00398 if len(mixingDict)!=0: 00399 raise Exception('unused mixing specification: '+mixingDict.keys().__str__()) 00400 00401 00402 # load the geometry file 00403 try: 00404 self.loadAndRemember(self.GeometryCFF) 00405 except ImportError: 00406 print "Geometry option",self._options.geometry,"unknown." 00407 raise 00408 00409 self.loadAndRemember(self.magFieldCFF) 00410 00411 00412 # what steps are provided by this class? 00413 stepList = [re.sub(r'^prepare_', '', methodName) for methodName in ConfigBuilder.__dict__ if methodName.startswith('prepare_')] 00414 00415 ### Benedikt can we add here a check that assure that we are going to generate a correct config file? 00416 ### i.e. the harvesting do not have to include other step...... 00417 00418 # look which steps are requested and invoke the corresponding method 00419 for step in self._options.step.split(","): 00420 if step == "": 00421 continue 00422 print step 00423 stepParts = step.split(":") # for format STEP:alternativeSequence 00424 stepName = stepParts[0] 00425 if stepName not in stepList: 00426 raise ValueError("Step "+stepName+" unknown") 00427 if len(stepParts)==1: 00428 getattr(self,"prepare_"+step)(sequence = getattr(self,step+"DefaultSeq")) 00429 elif len(stepParts)==2: 00430 getattr(self,"prepare_"+stepName)(sequence = stepParts[1]) 00431 elif len(stepParts)==3: 00432 getattr(self,"prepare_"+stepName)(sequence = stepParts[1]+','+stepParts[2]) 00433 00434 else: 00435 raise ValueError("Step definition "+step+" invalid")
def ConfigBuilder::ConfigBuilder::build_production_info | ( | self, | |
evt_type, | |||
evtnumber | |||
) |
Add useful info for the production.
Definition at line 1408 of file ConfigBuilder.py.
01409 : 01410 """ Add useful info for the production. """ 01411 self.process.configurationMetadata=cms.untracked.PSet\ 01412 (version=cms.untracked.string("$Revision: 1.303.2.7 $"), 01413 name=cms.untracked.string("PyReleaseValidation"), 01414 annotation=cms.untracked.string(evt_type+ " nevts:"+str(evtnumber)) 01415 ) 01416 01417 self.addedObjects.append(("Production Info","configurationMetadata")) 01418
def ConfigBuilder::ConfigBuilder::define_Configs | ( | self | ) |
Definition at line 562 of file ConfigBuilder.py.
00563 : 00564 if ( self._options.scenario not in defaultOptions.scenarioOptions): 00565 print 'Invalid scenario provided. Options are:' 00566 print defaultOptions.scenarioOptions 00567 sys.exit(-1) 00568 00569 self.loadAndRemember('Configuration/StandardSequences/Services_cff') 00570 if self._options.particleTable not in defaultOptions.particleTableList: 00571 print 'Invalid particle table provided. Options are:' 00572 print defaultOptions.particleTable 00573 sys.exit(-1) 00574 else: 00575 self.loadAndRemember('SimGeneral.HepPDTESSource.'+self._options.particleTable+'_cfi') 00576 00577 self.loadAndRemember('FWCore/MessageService/MessageLogger_cfi') 00578 00579 self.ALCADefaultCFF="Configuration/StandardSequences/AlCaRecoStreams_cff" 00580 self.GENDefaultCFF="Configuration/StandardSequences/Generator_cff" 00581 self.SIMDefaultCFF="Configuration/StandardSequences/Sim_cff" 00582 self.DIGIDefaultCFF="Configuration/StandardSequences/Digi_cff" 00583 self.DIGI2RAWDefaultCFF="Configuration/StandardSequences/DigiToRaw_cff" 00584 self.L1EMDefaultCFF='Configuration/StandardSequences/SimL1Emulator_cff' 00585 self.L1MENUDefaultCFF="Configuration/StandardSequences/L1TriggerDefaultMenu_cff" 00586 self.HLTDefaultCFF="Configuration/StandardSequences/HLTtable_cff" 00587 self.RAW2DIGIDefaultCFF="Configuration/StandardSequences/RawToDigi_Data_cff" 00588 self.L1RecoDefaultCFF="Configuration/StandardSequences/L1Reco_cff" 00589 self.RECODefaultCFF="Configuration/StandardSequences/Reconstruction_cff" 00590 self.SKIMDefaultCFF="Configuration/StandardSequences/Skims_cff" 00591 self.POSTRECODefaultCFF="Configuration/StandardSequences/PostRecoGenerator_cff" 00592 self.VALIDATIONDefaultCFF="Configuration/StandardSequences/Validation_cff" 00593 self.L1HwValDefaultCFF = "Configuration/StandardSequences/L1HwVal_cff" 00594 self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOffline_cff" 00595 self.HARVESTINGDefaultCFF="Configuration/StandardSequences/Harvesting_cff" 00596 self.ALCAHARVESTDefaultCFF="Configuration/StandardSequences/AlCaHarvesting_cff" 00597 self.ENDJOBDefaultCFF="Configuration/StandardSequences/EndOfProcess_cff" 00598 self.ConditionsDefaultCFF = "Configuration/StandardSequences/FrontierConditions_GlobalTag_cff" 00599 self.CFWRITERDefaultCFF = "Configuration/StandardSequences/CrossingFrameWriter_cff" 00600 self.REPACKDefaultCFF="Configuration/StandardSequences/DigiToRaw_Repack_cff" 00601 00602 # synchronize the geometry configuration and the FullSimulation sequence to be used 00603 if self._options.geometry not in defaultOptions.geometryExtendedOptions: 00604 self.SIMDefaultCFF="Configuration/StandardSequences/SimIdeal_cff" 00605 00606 if "DATAMIX" in self.stepMap.keys(): 00607 self.DATAMIXDefaultCFF="Configuration/StandardSequences/DataMixer"+self._options.datamix+"_cff" 00608 self.DIGIDefaultCFF="Configuration/StandardSequences/DigiDM_cff" 00609 self.DIGI2RAWDefaultCFF="Configuration/StandardSequences/DigiToRawDM_cff" 00610 self.L1EMDefaultCFF='Configuration/StandardSequences/SimL1EmulatorDM_cff' 00611 00612 self.ALCADefaultSeq=None 00613 self.SIMDefaultSeq=None 00614 self.GENDefaultSeq='pgen' 00615 self.DIGIDefaultSeq='pdigi' 00616 self.DATAMIXDefaultSeq=None 00617 self.DIGI2RAWDefaultSeq='DigiToRaw' 00618 self.HLTDefaultSeq='GRun' 00619 self.L1DefaultSeq=None 00620 self.HARVESTINGDefaultSeq=None 00621 self.ALCAHARVESTDefaultSeq=None 00622 self.CFWRITERDefaultSeq=None 00623 self.RAW2DIGIDefaultSeq='RawToDigi' 00624 self.L1RecoDefaultSeq='L1Reco' 00625 if 'RAW2DIGI' in self.stepMap and 'RECO' in self.stepMap: 00626 self.RECODefaultSeq='reconstruction' 00627 else: 00628 self.RECODefaultSeq='reconstruction_fromRECO' 00629 00630 self.POSTRECODefaultSeq=None 00631 self.L1HwValDefaultSeq='L1HwVal' 00632 self.DQMDefaultSeq='DQMOffline' 00633 self.FASTSIMDefaultSeq='all' 00634 self.VALIDATIONDefaultSeq='' 00635 self.PATLayer0DefaultSeq='all' 00636 self.ENDJOBDefaultSeq='endOfProcess' 00637 self.REPACKDefaultSeq='DigiToRawRepack' 00638 00639 self.EVTCONTDefaultCFF="Configuration/EventContent/EventContent_cff" 00640 00641 # if fastsim switch event content 00642 if "FASTSIM" in self.stepMap.keys(): 00643 self.GENDefaultSeq='pgen_genonly' 00644 self.EVTCONTDefaultCFF = "FastSimulation/Configuration/EventContent_cff" 00645 self.VALIDATIONDefaultCFF = "FastSimulation.Configuration.Validation_cff" 00646 00647 # if its MC then change the raw2digi 00648 if self._options.isMC==True: 00649 self.RAW2DIGIDefaultCFF="Configuration/StandardSequences/RawToDigi_cff" 00650 self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineMC_cff" 00651 self.ALCADefaultCFF="Configuration/StandardSequences/AlCaRecoStreamsMC_cff" 00652 00653 if hasattr(self._options,"isRepacked") and self._options.isRepacked: 00654 self.RAW2DIGIDefaultCFF="Configuration/StandardSequences/RawToDigi_Repacked_cff" 00655 00656 # now for #%#$#! different scenarios 00657 00658 if self._options.scenario=='nocoll' or self._options.scenario=='cosmics': 00659 self.SIMDefaultCFF="Configuration/StandardSequences/SimNOBEAM_cff" 00660 self._options.beamspot='NoSmear' 00661 00662 if self._options.scenario=='cosmics': 00663 self.DIGIDefaultCFF="Configuration/StandardSequences/DigiCosmics_cff" 00664 self.RECODefaultCFF="Configuration/StandardSequences/ReconstructionCosmics_cff" 00665 self.SKIMDefaultCFF="Configuration/StandardSequences/SkimsCosmics_cff" 00666 self.EVTCONTDefaultCFF="Configuration/EventContent/EventContentCosmics_cff" 00667 self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineCosmics_cff" 00668 if self._options.isMC==True: 00669 self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineCosmicsMC_cff" 00670 self.HARVESTINGDefaultCFF="Configuration/StandardSequences/HarvestingCosmics_cff" 00671 self.RECODefaultSeq='reconstructionCosmics' 00672 self.DQMDefaultSeq='DQMOfflineCosmics' 00673 self.eventcontent='FEVT' 00674 00675 if self._options.himix: 00676 print "From the presence of the himix option, we have determined that this is heavy ions and will use '--scenario HeavyIons'." 00677 self._options.scenario='HeavyIons' 00678 00679 if self._options.scenario=='HeavyIons': 00680 self.HLTDefaultSeq = 'HIon' 00681 if not self._options.himix: 00682 self.GENDefaultSeq='pgen_hi' 00683 else: 00684 self.GENDefaultSeq='pgen_himix' 00685 self.VALIDATIONDefaultCFF="Configuration/StandardSequences/ValidationHeavyIons_cff" 00686 self.VALIDATIONDefaultSeq='' 00687 self.EVTCONTDefaultCFF="Configuration/EventContent/EventContentHeavyIons_cff" 00688 self.RECODefaultCFF="Configuration/StandardSequences/ReconstructionHeavyIons_cff" 00689 self.RECODefaultSeq='reconstructionHeavyIons' 00690 self.ALCADefaultCFF = "Configuration/StandardSequences/AlCaRecoStreamsHeavyIons_cff" 00691 self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineHeavyIons_cff" 00692 self.DQMDefaultSeq='DQMOfflineHeavyIons' 00693 self.SKIMDefaultCFF="Configuration/StandardSequences/SkimsHeavyIons_cff" 00694 self.HARVESTINGDefaultCFF="Configuration/StandardSequences/HarvestingHeavyIons_cff" 00695 if self._options.isMC==True: 00696 self.DQMOFFLINEDefaultCFF="DQMOffline/Configuration/DQMOfflineHeavyIonsMC_cff" 00697 00698 00699 self.RAW2RECODefaultSeq=','.join([self.RAW2DIGIDefaultSeq,self.RECODefaultSeq]) 00700 00701 00702 # the magnetic field 00703 self.magFieldCFF = 'Configuration/StandardSequences/MagneticField_'+self._options.magField.replace('.','')+'_cff' 00704 self.magFieldCFF = self.magFieldCFF.replace("__",'_') 00705 00706 # the geometry 00707 if 'FASTSIM' in self.stepMap: 00708 if 'start' in self._options.conditions.lower(): 00709 self.GeometryCFF='FastSimulation/Configuration/Geometries_START_cff' 00710 else: 00711 self.GeometryCFF='FastSimulation/Configuration/Geometries_MC_cff' 00712 else: 00713 if self._options.gflash==True: 00714 self.GeometryCFF='Configuration/StandardSequences/Geometry'+self._options.geometry+'GFlash_cff' 00715 else: 00716 self.GeometryCFF='Configuration/StandardSequences/Geometry'+self._options.geometry+'_cff' 00717 00718 # Mixing 00719 #not driven by a default cff anymore 00720 if self._options.isData: 00721 self._options.pileup=None 00722 if self._options.isMC==True and self._options.himix==False: 00723 if 'FASTSIM' in self.stepMap: 00724 self._options.pileup='FS_'+self._options.pileup 00725 elif self._options.isMC==True and self._options.himix==True: 00726 self._options.pileup='HiMix' 00727 00728 if self._options.eventcontent != None: 00729 self.eventcontent=self._options.eventcontent 00730 00731 if self._options.slhc: 00732 if 'stdgeom' not in self._options.slhc: 00733 self.GeometryCFF='SLHCUpgradeSimulations.Geometry.%s_cmsSimIdealGeometryXML_cff'%(self._options.slhc,) 00734 self.DIGIDefaultCFF='SLHCUpgradeSimulations/Geometry/Digi_%s_cff'%(self._options.slhc,) 00735 if self._options.pileup!=defaultOptions.pileup: 00736 self._options.pileup='SLHC_%s_%s'%(self._options.pileup,self._options.slhc)
def ConfigBuilder::ConfigBuilder::executeAndRemember | ( | self, | |
command | |||
) |
helper routine to remember replace statements
Definition at line 134 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::finalizeFastSimHLT | ( | self | ) |
Definition at line 1360 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::loadAndRemember | ( | self, | |
includeFile | |||
) |
helper routine to load am memorize imports
Definition at line 125 of file ConfigBuilder.py.
00126 : 00127 """helper routine to load am memorize imports""" 00128 # we could make the imports a on-the-fly data method of the process instance itself 00129 # not sure if the latter is a good idea 00130 includeFile = includeFile.replace('/','.') 00131 self.imports.append(includeFile) 00132 self.process.load(includeFile) 00133 return sys.modules[includeFile]
def ConfigBuilder::ConfigBuilder::loadDefaultOrSpecifiedCFF | ( | self, | |
sequence, | |||
defaultCFF | |||
) |
Definition at line 802 of file ConfigBuilder.py.
00803 : 00804 if ( len(sequence.split('.'))==1 ): 00805 l=self.loadAndRemember(defaultCFF) 00806 elif ( len(sequence.split('.'))==2 ): 00807 l=self.loadAndRemember(sequence.split('.')[0]) 00808 sequence=sequence.split('.')[1] 00809 else: 00810 print "sub sequence configuration must be of the form dir/subdir/cff.a+b+c or cff.a" 00811 print sequence,"not recognized" 00812 raise 00813 return l
def ConfigBuilder::ConfigBuilder::prepare | ( | self, | |
doChecking = False |
|||
) |
Prepare the configuration string and add missing pieces.
Definition at line 1419 of file ConfigBuilder.py.
01420 : 01421 """ Prepare the configuration string and add missing pieces.""" 01422 01423 self.loadAndRemember(self.EVTCONTDefaultCFF) #load the event contents regardless 01424 self.addMaxEvents() 01425 if self.with_input: 01426 self.addSource() 01427 self.addStandardSequences() 01428 self.addConditions() 01429 01430 01431 outputModuleCfgCode="" 01432 if not 'HARVESTING' in self.stepMap.keys() and not 'SKIM' in self.stepMap.keys() and not 'ALCAHARVEST' in self.stepMap.keys() and not 'ALCAOUTPUT' in self.stepMap.keys() and self.with_output: 01433 outputModuleCfgCode=self.addOutput() 01434 01435 self.addCommon() 01436 01437 self.pythonCfgCode = "# Auto generated configuration file\n" 01438 self.pythonCfgCode += "# using: \n# "+__version__[1:-1]+"\n# "+__source__[1:-1]+'\n' 01439 self.pythonCfgCode += "# with command line options: "+self._options.arguments+'\n' 01440 self.pythonCfgCode += "import FWCore.ParameterSet.Config as cms\n\n" 01441 self.pythonCfgCode += "process = cms.Process('"+self._options.name+"')\n\n" 01442 01443 self.pythonCfgCode += "# import of standard configurations\n" 01444 for module in self.imports: 01445 self.pythonCfgCode += ("process.load('"+module+"')\n") 01446 01447 # production info 01448 if not hasattr(self.process,"configurationMetadata"): 01449 self.build_production_info(self._options.evt_type, self._options.number) 01450 else: 01451 #the PSet was added via a load 01452 self.addedObjects.append(("Production Info","configurationMetadata")) 01453 01454 self.pythonCfgCode +="\n" 01455 for comment,object in self.addedObjects: 01456 if comment!="": 01457 self.pythonCfgCode += "\n# "+comment+"\n" 01458 self.pythonCfgCode += dumpPython(self.process,object) 01459 01460 # dump the output definition 01461 self.pythonCfgCode += "\n# Output definition\n" 01462 self.pythonCfgCode += outputModuleCfgCode 01463 01464 # dump all additional outputs (e.g. alca or skim streams) 01465 self.pythonCfgCode += "\n# Additional output definition\n" 01466 #I do not understand why the keys are not normally ordered. 01467 nl=self.additionalOutputs.keys() 01468 nl.sort() 01469 for name in nl: 01470 output = self.additionalOutputs[name] 01471 self.pythonCfgCode += "process.%s = %s" %(name, output.dumpPython()) 01472 tmpOut = cms.EndPath(output) 01473 setattr(self.process,name+'OutPath',tmpOut) 01474 self.schedule.append(tmpOut) 01475 01476 # dump all additional commands 01477 self.pythonCfgCode += "\n# Other statements\n" 01478 for command in self.additionalCommands: 01479 self.pythonCfgCode += command + "\n" 01480 01481 #comma separated list of objects that deserve to be inlined in the configuration (typically from a modified config deep down) 01482 for object in self._options.inlineObjets.split(','): 01483 if not object: 01484 continue 01485 if not hasattr(self.process,object): 01486 print 'cannot inline -'+object+'- : not known' 01487 else: 01488 self.pythonCfgCode +='\n' 01489 self.pythonCfgCode +=dumpPython(self.process,object) 01490 01491 # dump all paths 01492 self.pythonCfgCode += "\n# Path and EndPath definitions\n" 01493 for path in self.process.paths: 01494 if getattr(self.process,path) not in self.blacklist_paths: 01495 self.pythonCfgCode += dumpPython(self.process,path) 01496 for endpath in self.process.endpaths: 01497 if getattr(self.process,endpath) not in self.blacklist_paths: 01498 self.pythonCfgCode += dumpPython(self.process,endpath) 01499 01500 # dump the schedule 01501 self.pythonCfgCode += "\n# Schedule definition\n" 01502 result = "process.schedule = cms.Schedule(" 01503 01504 # handling of the schedule 01505 self.process.schedule = cms.Schedule() 01506 for item in self.schedule: 01507 if not isinstance(item, cms.Schedule): 01508 self.process.schedule.append(item) 01509 else: 01510 self.process.schedule.extend(item) 01511 01512 if hasattr(self.process,"HLTSchedule"): 01513 beforeHLT = self.schedule[:self.schedule.index(self.process.HLTSchedule)] 01514 afterHLT = self.schedule[self.schedule.index(self.process.HLTSchedule)+1:] 01515 pathNames = ['process.'+p.label_() for p in beforeHLT] 01516 result += ','.join(pathNames)+')\n' 01517 result += 'process.schedule.extend(process.HLTSchedule)\n' 01518 pathNames = ['process.'+p.label_() for p in afterHLT] 01519 result += 'process.schedule.extend(['+','.join(pathNames)+'])\n' 01520 else: 01521 pathNames = ['process.'+p.label_() for p in self.schedule] 01522 result ='process.schedule = cms.Schedule('+','.join(pathNames)+')\n' 01523 01524 self.pythonCfgCode += result 01525 01526 # special treatment in case of production filter sequence 2/2 01527 if self.productionFilterSequence: 01528 self.pythonCfgCode +='# filter all path with the production filter sequence\n' 01529 self.pythonCfgCode +='for path in process.paths:\n' 01530 self.pythonCfgCode +='\tgetattr(process,path)._seq = process.%s * getattr(process,path)._seq \n'%(self.productionFilterSequence,) 01531 01532 # dump customise fragment 01533 if self._options.customisation_file: 01534 self.pythonCfgCode += self.addCustomise() 01535 return 01536
def ConfigBuilder::ConfigBuilder::prepare_ALCA | ( | self, | |
sequence = None , |
|||
workflow = 'full' |
|||
) |
Enrich the process with alca streams
Definition at line 847 of file ConfigBuilder.py.
00848 : 00849 """ Enrich the process with alca streams """ 00850 alcaConfig=self.loadDefaultOrSpecifiedCFF(sequence,self.ALCADefaultCFF) 00851 sequence = sequence.split('.')[-1] 00852 00853 # decide which ALCA paths to use 00854 alcaList = sequence.split("+") 00855 maxLevel=0 00856 from Configuration.PyReleaseValidation.autoAlca import autoAlca 00857 # support @X from autoAlca.py, and recursion support: i.e T0:@Mu+@EG+... 00858 while '@' in repr(alcaList) and maxLevel<10: 00859 maxLevel+=1 00860 for specifiedCommand in alcaList: 00861 if specifiedCommand[0]=="@": 00862 location=specifiedCommand[1:] 00863 alcaSequence = autoAlca[location] 00864 alcaList.remove(specifiedCommand) 00865 alcaList.extend(alcaSequence.split('+')) 00866 break 00867 00868 for name in alcaConfig.__dict__: 00869 alcastream = getattr(alcaConfig,name) 00870 shortName = name.replace('ALCARECOStream','') 00871 if shortName in alcaList and isinstance(alcastream,cms.FilteredStream): 00872 output = self.addExtraStream(name,alcastream, workflow = workflow) 00873 if 'DQM' in alcaList: 00874 if not self._options.inlineEventContent and hasattr(self.process,name): 00875 self.executeAndRemember('process.' + name + '.outputCommands.append("keep *_MEtoEDMConverter_*_*")') 00876 else: 00877 output.outputCommands.append("keep *_MEtoEDMConverter_*_*") 00878 00879 #rename the HLT process name in the alca modules 00880 if self._options.hltProcess or 'HLT' in self.stepMap: 00881 if isinstance(alcastream.paths,tuple): 00882 for path in alcastream.paths: 00883 self.renameHLTprocessInSequence(path.label()) 00884 else: 00885 self.renameHLTprocessInSequence(alcastream.paths.label()) 00886 00887 for i in range(alcaList.count(shortName)): 00888 alcaList.remove(shortName) 00889 00890 # DQM needs a special handling 00891 elif name == 'pathALCARECODQM' and 'DQM' in alcaList: 00892 path = getattr(alcaConfig,name) 00893 self.schedule.append(path) 00894 alcaList.remove('DQM') 00895 00896 if isinstance(alcastream,cms.Path): 00897 #black list the alca path so that they do not appear in the cfg 00898 self.blacklist_paths.append(alcastream) 00899 00900 00901 if len(alcaList) != 0: 00902 available=[] 00903 for name in alcaConfig.__dict__: 00904 alcastream = getattr(alcaConfig,name) 00905 if isinstance(alcastream,cms.FilteredStream): 00906 available.append(name.replace('ALCARECOStream','')) 00907 print "The following alcas could not be found "+str(alcaList) 00908 print "available ",available 00909 #print "verify your configuration, ignoring for now" 00910 raise Exception("The following alcas could not be found "+str(alcaList))
def ConfigBuilder::ConfigBuilder::prepare_ALCAHARVEST | ( | self, | |
sequence = None |
|||
) |
Enrich the process with AlCaHarvesting step
Definition at line 1331 of file ConfigBuilder.py.
01332 : 01333 """ Enrich the process with AlCaHarvesting step """ 01334 harvestingConfig = self.loadAndRemember(self.ALCAHARVESTDefaultCFF) 01335 sequence=sequence.split(".")[-1] 01336 01337 # decide which AlcaHARVESTING paths to use 01338 harvestingList = sequence.split("+") 01339 for name in harvestingConfig.__dict__: 01340 harvestingstream = getattr(harvestingConfig,name) 01341 if name in harvestingList and isinstance(harvestingstream,cms.Path): 01342 self.schedule.append(harvestingstream) 01343 self.executeAndRemember("process.PoolDBOutputService.toPut.append(process.ALCAHARVEST" + name + "_dbOutput)") 01344 self.executeAndRemember("process.pclMetadataWriter.recordsToMap.append(process.ALCAHARVEST" + name + "_metadata)") 01345 harvestingList.remove(name) 01346 # append the common part at the end of the sequence 01347 lastStep = getattr(harvestingConfig,"ALCAHARVESTDQMSaveAndMetadataWriter") 01348 self.schedule.append(lastStep) 01349 01350 if len(harvestingList) != 0 and 'dummyHarvesting' not in harvestingList : 01351 print "The following harvesting could not be found : ", harvestingList 01352 raise 01353 01354
def ConfigBuilder::ConfigBuilder::prepare_ALCAOUTPUT | ( | self, | |
sequence = None |
|||
) |
Definition at line 844 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_ALCAPRODUCER | ( | self, | |
sequence = None |
|||
) |
Definition at line 841 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_CFWRITER | ( | self, | |
sequence = None |
|||
) |
Enrich the schedule with the crossing frame writer step
Definition at line 1006 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_DATAMIX | ( | self, | |
sequence = None |
|||
) |
Enrich the schedule with the digitisation step
Definition at line 1012 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_DIGI | ( | self, | |
sequence = None |
|||
) |
Enrich the schedule with the digitisation step
Definition at line 993 of file ConfigBuilder.py.
00994 : 00995 """ Enrich the schedule with the digitisation step""" 00996 self.loadDefaultOrSpecifiedCFF(sequence,self.DIGIDefaultCFF) 00997 00998 if self._options.gflash==True: 00999 self.loadAndRemember("Configuration/StandardSequences/GFlashDIGI_cff") 01000 01001 if self._options.himix==True: 01002 self.loadAndRemember("SimGeneral/MixingModule/himixDIGI_cff") 01003 01004 self.scheduleSequence(sequence.split('.')[-1],'digitisation_step') 01005 return
def ConfigBuilder::ConfigBuilder::prepare_DIGI2RAW | ( | self, | |
sequence = None |
|||
) |
Definition at line 1018 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_DQM | ( | self, | |
sequence = 'DQMOffline' |
|||
) |
Definition at line 1278 of file ConfigBuilder.py.
01279 : 01280 # this one needs replacement 01281 01282 self.loadDefaultOrSpecifiedCFF(sequence,self.DQMOFFLINEDefaultCFF) 01283 sequence=sequence.split('.')[-1] 01284 01285 if 'HLT' in self.stepMap.keys() or self._options.hltProcess: 01286 self.renameHLTprocessInSequence(sequence) 01287 01288 # if both HLT and DQM are run in the same process, schedule [HLT]DQM in an EndPath 01289 if 'HLT' in self.stepMap.keys(): 01290 # need to put [HLT]DQM in an EndPath, to access the HLT trigger results 01291 self.process.dqmoffline_step = cms.EndPath( getattr(self.process, sequence ) ) 01292 else: 01293 # schedule DQM as a standard Path 01294 self.process.dqmoffline_step = cms.Path( getattr(self.process, sequence) ) 01295 self.schedule.append(self.process.dqmoffline_step)
def ConfigBuilder::ConfigBuilder::prepare_ENDJOB | ( | self, | |
sequence = 'endOfProcess' |
|||
) |
Definition at line 1355 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_FASTSIM | ( | self, | |
sequence = "all" |
|||
) |
Enrich the schedule with fastsim
Definition at line 1364 of file ConfigBuilder.py.
01365 : 01366 """Enrich the schedule with fastsim""" 01367 self.loadAndRemember("FastSimulation/Configuration/FamosSequences_cff") 01368 01369 if sequence in ('all','allWithHLTFiltering',''): 01370 if not 'HLT' in self.stepMap.keys(): 01371 self.prepare_HLT(sequence=None) 01372 01373 self.executeAndRemember("process.famosSimHits.SimulateCalorimetry = True") 01374 self.executeAndRemember("process.famosSimHits.SimulateTracking = True") 01375 01376 self.executeAndRemember("process.simulation = cms.Sequence(process.simulationWithFamos)") 01377 self.executeAndRemember("process.HLTEndSequence = cms.Sequence(process.reconstructionWithFamos)") 01378 01379 # since we have HLT here, the process should be called HLT 01380 self._options.name = "HLT" 01381 01382 # if we don't want to filter after HLT but simulate everything regardless of what HLT tells, we have to add reconstruction explicitly 01383 if sequence == 'all' and not 'HLT' in self.stepMap.keys(): #(a) 01384 self.finalizeFastSimHLT() 01385 elif sequence == 'famosWithEverything': 01386 self.process.fastsim_step = cms.Path( getattr(self.process, "famosWithEverything") ) 01387 self.schedule.append(self.process.fastsim_step) 01388 01389 # now the additional commands we need to make the config work 01390 self.executeAndRemember("process.VolumeBasedMagneticFieldESProducer.useParametrizedTrackerField = True") 01391 else: 01392 print "FastSim setting", sequence, "unknown." 01393 raise ValueError 01394 01395 if 'Flat' in self._options.beamspot: 01396 beamspotType = 'Flat' 01397 elif 'Gauss' in self._options.beamspot: 01398 beamspotType = 'Gaussian' 01399 else: 01400 beamspotType = 'BetaFunc' 01401 self.loadAndRemember('IOMC.EventVertexGenerators.VtxSmearedParameters_cfi') 01402 beamspotName = 'process.%sVtxSmearingParameters' %(self._options.beamspot) 01403 self.executeAndRemember(beamspotName+'.type = cms.string("%s")'%(beamspotType)) 01404 self.executeAndRemember('process.famosSimHits.VertexGenerator = '+beamspotName) 01405 self.executeAndRemember('process.famosPileUp.VertexGenerator = '+beamspotName) 01406 01407
def ConfigBuilder::ConfigBuilder::prepare_GEN | ( | self, | |
sequence = None |
|||
) |
load the fragment of generator configuration
Definition at line 911 of file ConfigBuilder.py.
00912 : 00913 """ load the fragment of generator configuration """ 00914 loadFailure=False 00915 #remove trailing .py 00916 #support old style .cfi by changing into something.cfi into something_cfi 00917 #remove python/ from the name 00918 loadFragment = self._options.evt_type.replace('.py','',).replace('.','_').replace('python/','') 00919 #standard location of fragments 00920 if not '/' in loadFragment: 00921 loadFragment='Configuration.Generator.'+loadFragment 00922 else: 00923 loadFragment=loadFragment.replace('/','.') 00924 try: 00925 __import__(loadFragment) 00926 except: 00927 loadFailure=True 00928 if self.process.source and self.process.source.type_()=='EmptySource': 00929 raise Exception("Neither gen fragment nor input files provided: this is an inconsistent GEN step configuration") 00930 00931 if not loadFailure: 00932 generatorModule=sys.modules[loadFragment] 00933 genModules=generatorModule.__dict__ 00934 if self._options.hideGen: 00935 self.loadAndRemember(loadFragment) 00936 else: 00937 self.process.load(loadFragment) 00938 # expose the objects from that fragment to the configuration 00939 import FWCore.ParameterSet.Modules as cmstypes 00940 for name in genModules: 00941 theObject = getattr(generatorModule,name) 00942 if isinstance(theObject, cmstypes._Module): 00943 self._options.inlineObjets=name+','+self._options.inlineObjets 00944 elif isinstance(theObject, cms.Sequence) or isinstance(theObject, cmstypes.ESProducer): 00945 self._options.inlineObjets+=','+name 00946 00947 if sequence == self.GENDefaultSeq or sequence == 'pgen_genonly': 00948 if 'ProductionFilterSequence' in genModules and ('generator' in genModules or 'hiSignal' in genModules): 00949 self.productionFilterSequence = 'ProductionFilterSequence' 00950 elif 'generator' in genModules: 00951 self.productionFilterSequence = 'generator' 00952 00953 """ Enrich the schedule with the rest of the generation step """ 00954 self.loadDefaultOrSpecifiedCFF(sequence,self.GENDefaultCFF) 00955 genSeqName=sequence.split('.')[-1] 00956 00957 if not 'FASTSIM' in self.stepMap: 00958 try: 00959 from Configuration.StandardSequences.VtxSmeared import VtxSmeared 00960 self.loadAndRemember(VtxSmeared[self._options.beamspot]) 00961 except ImportError: 00962 raise Exception("VertexSmearing type or beamspot "+self._options.beamspot+" unknown.") 00963 00964 if self._options.scenario == 'HeavyIons' and self._options.himix: 00965 self.loadAndRemember("SimGeneral/MixingModule/himixGEN_cff") 00966 00967 self.process.generation_step = cms.Path( getattr(self.process,genSeqName) ) 00968 self.schedule.append(self.process.generation_step) 00969 00970 """ Enrich the schedule with the summary of the filter step """ 00971 #the gen filter in the endpath 00972 self.loadAndRemember("GeneratorInterface/Core/genFilterSummary_cff") 00973 self.scheduleSequenceAtEnd('genFilterSummary','genfiltersummary_step') 00974 return
def ConfigBuilder::ConfigBuilder::prepare_HARVESTING | ( | self, | |
sequence = None |
|||
) |
Enrich the process with harvesting step
Definition at line 1296 of file ConfigBuilder.py.
01297 : 01298 """ Enrich the process with harvesting step """ 01299 self.EDMtoMECFF='Configuration/StandardSequences/EDMtoME'+self._options.harvesting+'_cff' 01300 self.loadAndRemember(self.EDMtoMECFF) 01301 self.scheduleSequence('EDMtoME','edmtome_step') 01302 01303 harvestingConfig = self.loadDefaultOrSpecifiedCFF(sequence,self.HARVESTINGDefaultCFF) 01304 sequence = sequence.split('.')[-1] 01305 01306 # decide which HARVESTING paths to use 01307 harvestingList = sequence.split("+") 01308 for name in harvestingConfig.__dict__: 01309 harvestingstream = getattr(harvestingConfig,name) 01310 if name in harvestingList and isinstance(harvestingstream,cms.Path): 01311 self.schedule.append(harvestingstream) 01312 harvestingList.remove(name) 01313 if name in harvestingList and isinstance(harvestingstream,cms.Sequence): 01314 setattr(self.process,name+"_step",cms.Path(harvestingstream)) 01315 self.schedule.append(getattr(self.process,name+"_step")) 01316 harvestingList.remove(name) 01317 if isinstance(harvestingstream,cms.Path): 01318 self.blacklist_paths.append(harvestingstream) 01319 01320 01321 # This if statment must disappears once some config happens in the alca harvesting step 01322 if 'alcaHarvesting' in harvestingList: 01323 harvestingList.remove('alcaHarvesting') 01324 01325 if len(harvestingList) != 0 and 'dummyHarvesting' not in harvestingList : 01326 print "The following harvesting could not be found : ", harvestingList 01327 raise 01328 01329 self.scheduleSequence('DQMSaver','dqmsave_step') 01330 return
def ConfigBuilder::ConfigBuilder::prepare_HLT | ( | self, | |
sequence = None |
|||
) |
Enrich the schedule with the HLT simulation step
Definition at line 1041 of file ConfigBuilder.py.
01042 : 01043 """ Enrich the schedule with the HLT simulation step""" 01044 loadDir='HLTrigger' 01045 fastSim=False 01046 if 'FASTSIM' in self.stepMap.keys(): 01047 fastSim=True 01048 loadDir='FastSimulation' 01049 if not sequence: 01050 print "no specification of the hlt menu has been given, should never happen" 01051 raise Exception('no HLT sequence provided') 01052 else: 01053 if ',' in sequence: 01054 #case where HLT:something:something was provided 01055 self.executeAndRemember('import HLTrigger.Configuration.Utilities') 01056 optionsForHLT = {} 01057 optionsForHLT['data'] = self._options.isData 01058 optionsForHLT['type'] = 'GRun' 01059 if self._options.scenario == 'HeavyIons': optionsForHLT['type'] = 'HIon' 01060 optionsForHLTConfig = ', '.join('%s=%s' % (key, repr(val)) for (key, val) in optionsForHLT.iteritems()) 01061 self.executeAndRemember('process.loadHltConfiguration("%s",%s)'%(sequence.replace(',',':'),optionsForHLTConfig)) 01062 else: 01063 dataSpec='' 01064 if self._options.isData: 01065 dataSpec='_data' 01066 self.loadAndRemember('%s/Configuration/HLT_%s%s_cff'%(loadDir,sequence,dataSpec)) 01067 01068 self.schedule.append(self.process.HLTSchedule) 01069 [self.blacklist_paths.append(path) for path in self.process.HLTSchedule if isinstance(path,(cms.Path,cms.EndPath))] 01070 if (fastSim and 'HLT' in self.stepMap.keys()): 01071 self.finalizeFastSimHLT() 01072
def ConfigBuilder::ConfigBuilder::prepare_L1 | ( | self, | |
sequence = None |
|||
) |
Enrich the schedule with the L1 simulation step
Definition at line 1028 of file ConfigBuilder.py.
01029 : 01030 """ Enrich the schedule with the L1 simulation step""" 01031 if not sequence: 01032 self.loadAndRemember(self.L1EMDefaultCFF) 01033 else: 01034 # let the L1 package decide for the scenarios available 01035 from L1Trigger.Configuration.ConfigBuilder import getConfigsForScenario 01036 listOfImports = getConfigsForScenario(sequence) 01037 for file in listOfImports: 01038 self.loadAndRemember(file) 01039 self.scheduleSequence('SimL1Emulator','L1simulation_step') 01040 return
def ConfigBuilder::ConfigBuilder::prepare_L1HwVal | ( | self, | |
sequence = 'L1HwVal' |
|||
) |
Enrich the schedule with L1 HW validation
Definition at line 1089 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_L1Reco | ( | self, | |
sequence = "L1Reco" |
|||
) |
Enrich the schedule with L1 reconstruction
Definition at line 1095 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_POSTRECO | ( | self, | |
sequence = None |
|||
) |
Enrich the schedule with the postreco step
Definition at line 1157 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_RAW2DIGI | ( | self, | |
sequence = "RawToDigi" |
|||
) |
Definition at line 1084 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_RAW2RECO | ( | self, | |
sequence = None |
|||
) |
Definition at line 1073 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_RECO | ( | self, | |
sequence = "reconstruction" |
|||
) |
Enrich the schedule with reconstruction
Definition at line 1101 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_REPACK | ( | self, | |
sequence = None |
|||
) |
Definition at line 1023 of file ConfigBuilder.py.
def ConfigBuilder::ConfigBuilder::prepare_SIM | ( | self, | |
sequence = None |
|||
) |
Enrich the schedule with the simulation step
Definition at line 975 of file ConfigBuilder.py.
00976 : 00977 """ Enrich the schedule with the simulation step""" 00978 self.loadAndRemember(self.SIMDefaultCFF) 00979 if self._options.gflash==True: 00980 self.loadAndRemember("Configuration/StandardSequences/GFlashSIM_cff") 00981 00982 if self._options.magField=='0T': 00983 self.executeAndRemember("process.g4SimHits.UseMagneticField = cms.bool(False)") 00984 00985 if self._options.himix==True: 00986 if self._options.geometry in defaultOptions.geometryExtendedOptions: 00987 self.loadAndRemember("SimGeneral/MixingModule/himixSIMExtended_cff") 00988 else: 00989 self.loadAndRemember("SimGeneral/MixingModule/himixSIMIdeal_cff") 00990 00991 self.scheduleSequence('psim','simulation_step') 00992 return
def ConfigBuilder::ConfigBuilder::prepare_SKIM | ( | self, | |
sequence = "all" |
|||
) |
Enrich the schedule with skimming fragments
Definition at line 1107 of file ConfigBuilder.py.
01108 : 01109 ''' Enrich the schedule with skimming fragments''' 01110 skimConfig = self.loadDefaultOrSpecifiedCFF(sequence,self.SKIMDefaultCFF) 01111 sequence = sequence.split('.')[-1] 01112 01113 skimlist=[] 01114 ## support @Mu+DiJet+@Electron configuration via autoSkim.py 01115 for specifiedCommand in sequence.split('+'): 01116 if specifiedCommand[0]=="@": 01117 from Configuration.Skimming.autoSkim import autoSkim 01118 location=specifiedCommand[1:] 01119 skimSequence = autoSkim[location] 01120 skimlist.extend(skimSequence.split('+')) 01121 else: 01122 skimlist.append(specifiedCommand) 01123 01124 #print "dictionnary for skims:",skimConfig.__dict__ 01125 for skim in skimConfig.__dict__: 01126 skimstream = getattr(skimConfig,skim) 01127 if isinstance(skimstream,cms.Path): 01128 #black list the alca path so that they do not appear in the cfg 01129 self.blacklist_paths.append(skimstream) 01130 if (not isinstance(skimstream,cms.FilteredStream)): 01131 continue 01132 shortname = skim.replace('SKIMStream','') 01133 if (sequence=="all"): 01134 self.addExtraStream(skim,skimstream) 01135 elif (shortname in skimlist): 01136 self.addExtraStream(skim,skimstream) 01137 #add a DQM eventcontent for this guy 01138 if self._options.datatier!="": 01139 self.process.load(self.EVTCONTDefaultCFF) 01140 skimstreamDQM = cms.FilteredStream( 01141 responsible = skimstream.responsible, 01142 name = skimstream.name+'DQM', 01143 paths = skimstream.paths, 01144 selectEvents = skimstream.selectEvents, 01145 content = self._options.datatier+'EventContent', 01146 dataTier = cms.untracked.string(self._options.datatier) 01147 ) 01148 self.addExtraStream(skim+'DQM',skimstreamDQM) 01149 for i in range(skimlist.count(shortname)): 01150 skimlist.remove(shortname) 01151 01152 01153 01154 if (skimlist.__len__()!=0 and sequence!="all"): 01155 print 'WARNING, possible typo with SKIM:'+'+'.join(skimlist) 01156 raise Exception('WARNING, possible typo with SKIM:'+'+'.join(skimlist))
def ConfigBuilder::ConfigBuilder::prepare_VALIDATION | ( | self, | |
sequence = 'validation' |
|||
) |
Definition at line 1164 of file ConfigBuilder.py.
01165 : 01166 self.loadDefaultOrSpecifiedCFF(sequence,self.VALIDATIONDefaultCFF) 01167 #in case VALIDATION:something:somethingelse -> something,somethingelse 01168 sequence=sequence.split('.')[-1] 01169 if sequence.find(',')!=-1: 01170 prevalSeqName=sequence.split(',')[0] 01171 valSeqName=sequence.split(',')[1] 01172 else: 01173 postfix='' 01174 if sequence: 01175 postfix='_'+sequence 01176 prevalSeqName='prevalidation'+postfix 01177 valSeqName='validation'+postfix 01178 if not hasattr(self.process,valSeqName): 01179 prevalSeqName='' 01180 valSeqName=sequence 01181 01182 if not 'DIGI' in self.stepMap and not 'FASTSIM' in self.stepMap: 01183 self.loadAndRemember('Configuration.StandardSequences.ReMixingSeeds_cff') 01184 #rename the HLT process in validation steps 01185 if ('HLT' in self.stepMap and not 'FASTSIM' in self.stepMap) or self._options.hltProcess: 01186 self.renameHLTprocessInSequence(valSeqName) 01187 if prevalSeqName: 01188 self.renameHLTprocessInSequence(prevalSeqName) 01189 01190 if prevalSeqName: 01191 self.process.prevalidation_step = cms.Path( getattr(self.process, prevalSeqName ) ) 01192 self.schedule.append(self.process.prevalidation_step) 01193 if valSeqName.startswith('genvalid'): 01194 self.loadAndRemember("IOMC.RandomEngine.IOMC_cff") 01195 self.process.validation_step = cms.Path( getattr(self.process,valSeqName ) ) 01196 else: 01197 self.process.validation_step = cms.EndPath( getattr(self.process,valSeqName ) ) 01198 self.schedule.append(self.process.validation_step) 01199 01200 01201 if not 'DIGI' in self.stepMap: 01202 self.executeAndRemember("process.mix.playback = True") 01203 return 01204
def ConfigBuilder::ConfigBuilder::renameHLTprocessInSequence | ( | self, | |
sequence, | |||
proc = None , |
|||
HLTprocess = 'HLT' |
|||
) |
Definition at line 1264 of file ConfigBuilder.py.
01265 : 01266 if self._options.hltProcess: 01267 proc=self._options.hltProcess 01268 else: 01269 proc=self.process.name_() 01270 if proc==HLTprocess: return 01271 # look up all module in dqm sequence 01272 print "replacing %s process name - sequence %s will use '%s'" % (HLTprocess,sequence, proc) 01273 getattr(self.process,sequence).visit(ConfigBuilder.MassSearchReplaceProcessNameVisitor(HLTprocess,proc,whitelist = ("subSystemFolder",))) 01274 if 'from Configuration.PyReleaseValidation.ConfigBuilder import ConfigBuilder' not in self.additionalCommands: 01275 self.additionalCommands.append('from Configuration.PyReleaseValidation.ConfigBuilder import ConfigBuilder') 01276 self.additionalCommands.append('process.%s.visit(ConfigBuilder.MassSearchReplaceProcessNameVisitor("%s", "%s", whitelist = ("subSystemFolder",)))'% (sequence,HLTprocess, proc)) 01277
def ConfigBuilder::ConfigBuilder::scheduleSequence | ( | self, | |
seq, | |||
prefix, | |||
what = 'Path' |
|||
) |
Definition at line 814 of file ConfigBuilder.py.
00815 : 00816 if '*' in seq: 00817 #create only one path with all sequences in it 00818 for i,s in enumerate(seq.split('*')): 00819 if i==0: 00820 setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, s) )) 00821 else: 00822 p=getattr(self.process,prefix) 00823 p+=getattr(self.process, s) 00824 self.schedule.append(getattr(self.process,prefix)) 00825 return 00826 else: 00827 #create as many path as many sequences 00828 if not '+' in seq: 00829 setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, seq) )) 00830 self.schedule.append(getattr(self.process,prefix)) 00831 else: 00832 for i,s in enumerate(seq.split('+')): 00833 sn=prefix+'%d'%(i) 00834 setattr(self.process,sn,getattr(cms,what)( getattr(self.process, s) )) 00835 self.schedule.append(getattr(self.process,sn)) 00836 return
def ConfigBuilder::ConfigBuilder::scheduleSequenceAtEnd | ( | self, | |
seq, | |||
prefix | |||
) |
Definition at line 837 of file ConfigBuilder.py.
ConfigBuilder::ConfigBuilder::_options [private] |
Definition at line 68 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 1296 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 1419 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 562 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.
Definition at line 68 of file ConfigBuilder.py.