3 __version__ =
"$Revision: 1.19 $" 4 __source__ =
"$Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v $" 6 import FWCore.ParameterSet.Config
as cms
7 from FWCore.ParameterSet.Modules
import _Module
11 from FWCore.ParameterSet.MassReplace
import massReplaceInputTag
as MassReplaceInputTag
16 from subprocess
import Popen,PIPE
17 import FWCore.ParameterSet.DictTypes
as DictTypes
23 defaultOptions.datamix =
'DataOnSim' 24 defaultOptions.isMC=
False 25 defaultOptions.isData=
True 26 defaultOptions.step=
'' 27 defaultOptions.pileup=
'NoPileUp' 28 defaultOptions.pileup_input =
None 29 defaultOptions.pileup_dasoption =
'' 30 defaultOptions.geometry =
'SimDB' 31 defaultOptions.geometryExtendedOptions = [
'ExtendedGFlash',
'Extended',
'NoCastor']
32 defaultOptions.magField =
'' 33 defaultOptions.conditions =
None 34 defaultOptions.scenarioOptions=[
'pp',
'cosmics',
'nocoll',
'HeavyIons']
35 defaultOptions.harvesting=
'AtRunEnd' 36 defaultOptions.gflash =
False 37 defaultOptions.number = -1
38 defaultOptions.number_out =
None 39 defaultOptions.arguments =
"" 40 defaultOptions.name =
"NO NAME GIVEN" 41 defaultOptions.evt_type =
"" 42 defaultOptions.filein =
"" 43 defaultOptions.dasquery=
"" 44 defaultOptions.dasoption=
"" 45 defaultOptions.secondfilein =
"" 46 defaultOptions.customisation_file = []
47 defaultOptions.customisation_file_unsch = []
48 defaultOptions.customise_commands =
"" 49 defaultOptions.inline_custom=
False 50 defaultOptions.particleTable =
'pythiapdt' 51 defaultOptions.particleTableList = [
'pythiapdt',
'pdt']
52 defaultOptions.dirin =
'' 53 defaultOptions.dirout =
'' 54 defaultOptions.filetype =
'EDM' 55 defaultOptions.fileout =
'output.root' 56 defaultOptions.filtername =
'' 57 defaultOptions.lazy_download =
False 58 defaultOptions.custom_conditions =
'' 59 defaultOptions.hltProcess =
'' 60 defaultOptions.eventcontent =
None 61 defaultOptions.datatier =
None 62 defaultOptions.inlineEventContent =
True 63 defaultOptions.inlineObjets =
'' 64 defaultOptions.hideGen=
False 65 from Configuration.StandardSequences.VtxSmeared
import VtxSmearedDefaultKey,VtxSmearedHIDefaultKey
66 defaultOptions.beamspot=
None 67 defaultOptions.outputDefinition =
'' 68 defaultOptions.inputCommands =
None 69 defaultOptions.outputCommands =
None 70 defaultOptions.inputEventContent =
'' 71 defaultOptions.dropDescendant =
False 72 defaultOptions.relval =
None 73 defaultOptions.profile =
None 74 defaultOptions.isRepacked =
False 75 defaultOptions.restoreRNDSeeds =
False 76 defaultOptions.donotDropOnInput =
'' 77 defaultOptions.python_filename =
'' 78 defaultOptions.io=
None 79 defaultOptions.lumiToProcess=
None 80 defaultOptions.fast=
False 81 defaultOptions.runsAndWeightsForMC =
None 82 defaultOptions.runsScenarioForMC =
None 83 defaultOptions.runUnscheduled =
False 84 defaultOptions.timeoutOutput =
False 85 defaultOptions.nThreads =
'1' 89 theObject = getattr(process,name)
90 if isinstance(theObject,cms.Path)
or isinstance(theObject,cms.EndPath)
or isinstance(theObject,cms.Sequence):
91 return "process."+name+
" = " + theObject.dumpPython(
"process")
92 elif isinstance(theObject,_Module)
or isinstance(theObject,cms.ESProducer):
93 return "process."+name+
" = " + theObject.dumpPython()+
"\n" 95 return "process."+name+
" = " + theObject.dumpPython()+
"\n" 98 import FWCore.ParameterSet.Config
as cms
101 for line
in open(fileName,
'r'): 102 if line.count(
".root")>=2:
104 entries=line.replace(
"\n",
"").
split()
105 if not entries[0]
in prim:
106 prim.append(entries[0])
107 if not entries[1]
in sec:
108 sec.append(entries[1])
109 elif (line.find(
".root")!=-1):
110 entry=line.replace(
"\n",
"")
111 if not entry
in prim:
114 if not hasattr(s,
"fileNames"):
115 s.fileNames=cms.untracked.vstring(prim)
117 s.fileNames.extend(prim)
119 if not hasattr(s,
"secondaryFileNames"):
120 s.secondaryFileNames=cms.untracked.vstring(sec)
122 s.secondaryFileNames.extend(sec)
123 print "found files: ",prim
125 raise Exception(
"There are not files in input from the file list")
127 print "found parent files:",sec
132 import FWCore.ParameterSet.Config
as cms
135 print "the query is",query
138 while eC!=0
and count<3:
140 print 'Sleeping, then retrying DAS' 142 p = Popen(
'das_client %s --query "%s"'%(option,query), stdout=PIPE,shell=
True)
144 tupleP = os.waitpid(p.pid, 0)
148 print "DAS succeeded after",count,
"attempts",eC
150 print "DAS failed 3 times- I give up" 151 for line
in pipe.split(
'\n'):
152 if line.count(
".root")>=2:
154 entries=line.replace(
"\n",
"").
split()
155 if not entries[0]
in prim:
156 prim.append(entries[0])
157 if not entries[1]
in sec:
158 sec.append(entries[1])
159 elif (line.find(
".root")!=-1):
160 entry=line.replace(
"\n",
"")
161 if not entry
in prim:
164 if not hasattr(s,
"fileNames"):
165 s.fileNames=cms.untracked.vstring(prim)
167 s.fileNames.extend(prim)
169 if not hasattr(s,
"secondaryFileNames"):
170 s.secondaryFileNames=cms.untracked.vstring(sec)
172 s.secondaryFileNames.extend(sec)
173 print "found files: ",prim
175 print "found parent files:",sec
178 def anyOf(listOfKeys,dict,opt=None):
187 raise Exception(
"any of "+
','.
join(listOfKeys)+
" are mandatory entries of --output options")
190 """The main building routines """ 192 def __init__(self, options, process = None, with_output = False, with_input = False ):
193 """options taken from old cmsDriver and optparse """ 195 options.outfile_name = options.dirout+options.fileout
199 if self._options.isData
and options.isMC:
200 raise Exception(
"ERROR: You may specify only --data or --mc, not both")
205 if 'ENDJOB' in self._options.step:
206 if (hasattr(self.
_options,
"outputDefinition")
and \
207 self._options.outputDefinition !=
'' and \
208 any(
anyOf([
't',
'tier',
'dataTier'],outdic) ==
'DQMIO' for outdic
in eval(self._options.outputDefinition)))
or \
209 (hasattr(self.
_options,
"datatier")
and \
210 self._options.datatier
and \
211 'DQMIO' in self._options.datatier):
212 print "removing ENDJOB from steps since not compatible with DQMIO dataTier" 213 self._options.step=self._options.step.replace(
',ENDJOB',
'')
218 stepList = [re.sub(
r'^prepare_',
'', methodName)
for methodName
in ConfigBuilder.__dict__
if methodName.startswith(
'prepare_')]
221 for step
in self._options.step.split(
","):
222 if step==
'':
continue 223 stepParts = step.split(
":")
224 stepName = stepParts[0]
225 if stepName
not in stepList
and not stepName.startswith(
're'):
226 raise ValueError(
"Step "+stepName+
" unknown")
227 if len(stepParts)==1:
228 self.stepMap[stepName]=
"" 229 elif len(stepParts)==2:
230 self.stepMap[stepName]=stepParts[1].
split(
'+')
231 elif len(stepParts)==3:
232 self.stepMap[stepName]=(stepParts[2].
split(
'+'),stepParts[1])
234 raise ValueError(
"Step definition "+step+
" invalid")
235 self.stepKeys.append(stepName)
239 self.with_output = with_output
240 if hasattr(self.
_options,
"no_output_flag")
and self._options.no_output_flag:
241 self.with_output =
False 242 self.with_input = with_input
244 self.process = cms.Process(self._options.name)
246 self.process = process
249 self.schedule =
list()
255 self.additionalCommands = []
257 self.blacklist_paths = []
258 self.addedObjects = []
259 self.additionalOutputs = {}
261 self.productionFilterSequence =
None 262 self.labelsToAssociate=[]
263 self.nextScheduleIsConditional=
False 264 self.conditionalPaths=[]
265 self.excludedPaths=[]
270 Function to add the igprof profile service so that you can dump in the middle 273 profileOpts = self._options.profile.split(
':')
275 profilerInterval = 100
276 profilerFormat =
None 277 profilerJobFormat =
None 283 startEvent = profileOpts.pop(0)
284 if not startEvent.isdigit():
285 raise Exception(
"%s is not a number" % startEvent)
286 profilerStart =
int(startEvent)
288 eventInterval = profileOpts.pop(0)
289 if not eventInterval.isdigit():
290 raise Exception(
"%s is not a number" % eventInterval)
291 profilerInterval =
int(eventInterval)
293 profilerFormat = profileOpts.pop(0)
296 if not profilerFormat:
297 profilerFormat =
"%s___%s___%s___%s___%s___%s___%%I.gz" % (self._options.evt_type.replace(
"_cfi",
""),
299 self._options.pileup,
300 self._options.conditions,
301 self._options.datatier,
302 self._options.profileTypeLabel)
303 if not profilerJobFormat
and profilerFormat.endswith(
".gz"):
304 profilerJobFormat = profilerFormat.replace(
".gz",
"_EndOfJob.gz")
305 elif not profilerJobFormat:
306 profilerJobFormat = profilerFormat +
"_EndOfJob.gz" 308 return (profilerStart,profilerInterval,profilerFormat,profilerJobFormat)
311 includeFile = includeFile.replace(
'/',
'.')
312 self.process.load(includeFile)
313 return sys.modules[includeFile]
316 """helper routine to load am memorize imports""" 319 includeFile = includeFile.replace(
'/',
'.')
320 self.imports.append(includeFile)
321 self.process.load(includeFile)
322 return sys.modules[includeFile]
325 """helper routine to remember replace statements""" 326 self.additionalCommands.append(command)
327 if not command.strip().startswith(
"#"):
330 exec(re.sub(
r"([^a-zA-Z_0-9]|^)(process)([^a-zA-Z_0-9])",
r"\1self.process\3",command))
334 if 'HARVESTING' in self.stepMap.keys()
or 'ALCAHARVEST' in self.stepMap.keys():
335 self.process.options = cms.untracked.PSet( Rethrow = cms.untracked.vstring(
'ProductNotFound'),fileMode = cms.untracked.string(
'FULLMERGE'))
337 self.process.options = cms.untracked.PSet( )
339 self.addedObjects.append((
"",
"options"))
341 if self._options.lazy_download:
342 self.process.AdaptorConfig = cms.Service(
"AdaptorConfig",
343 stats = cms.untracked.bool(
True),
344 enable = cms.untracked.bool(
True),
345 cacheHint = cms.untracked.string(
"lazy-download"),
346 readHint = cms.untracked.string(
"read-ahead-buffered")
348 self.addedObjects.append((
"Setup lazy download",
"AdaptorConfig"))
353 if self._options.profile:
355 self.process.IgProfService = cms.Service(
"IgProfService",
356 reportFirstEvent = cms.untracked.int32(start),
357 reportEventInterval = cms.untracked.int32(interval),
358 reportToFileAtPostEvent = cms.untracked.string(
"| gzip -c > %s"%(eventFormat)),
359 reportToFileAtPostEndJob = cms.untracked.string(
"| gzip -c > %s"%(jobFormat)))
360 self.addedObjects.append((
"Setup IGProf Service for profiling",
"IgProfService"))
363 """Here we decide how many evts will be processed""" 364 self.process.maxEvents=cms.untracked.PSet(input=cms.untracked.int32(
int(self._options.number)))
365 if self._options.number_out:
366 self.process.maxEvents.output = cms.untracked.int32(
int(self._options.number_out))
367 self.addedObjects.append((
"",
"maxEvents"))
370 """Here the source is built. Priority: file, generator""" 371 self.addedObjects.append((
"Input source",
"source"))
374 for entry
in self._options.filein.split(
','):
376 if entry.startswith(
"filelist:"):
378 elif entry.startswith(
"dbs:")
or entry.startswith(
"das:"):
379 filesFromDASQuery(
'file dataset = %s'%(entry[4:]),self._options.dasoption,self.process.source)
381 self.process.source.fileNames.append(self._options.dirin+entry)
382 if self._options.secondfilein:
383 if not hasattr(self.process.source,
"secondaryFileNames"):
384 raise Exception(
"--secondfilein not compatible with "+self._options.filetype+
"input type")
385 for entry
in self._options.secondfilein.split(
','):
387 if entry.startswith(
"filelist:"):
388 self.process.source.secondaryFileNames.extend((
filesFromList(entry[9:]))[0])
389 elif entry.startswith(
"dbs:")
or entry.startswith(
"das:"):
390 self.process.source.secondaryFileNames.extend((
filesFromDASQuery(
'file dataset = %s'%(entry[4:]),self._options.dasoption))[0])
392 self.process.source.secondaryFileNames.append(self._options.dirin+entry)
394 if self._options.filein
or self._options.dasquery:
395 if self._options.filetype ==
"EDM":
396 self.process.source=cms.Source(
"PoolSource",
397 fileNames = cms.untracked.vstring(),
398 secondaryFileNames= cms.untracked.vstring())
400 elif self._options.filetype ==
"DAT":
401 self.process.source=cms.Source(
"NewEventStreamFileReader",fileNames = cms.untracked.vstring())
403 elif self._options.filetype ==
"LHE":
404 self.process.source=cms.Source(
"LHESource", fileNames = cms.untracked.vstring())
405 if self._options.filein.startswith(
"lhe:"):
407 args=self._options.filein.split(
':')
409 print 'LHE input from article ',article
410 location=
'/store/lhe/' 412 textOfFiles=os.popen(
'cmsLHEtoEOSManager.py -l '+article)
413 for line
in textOfFiles:
414 for fileName
in [x
for x
in line.split()
if '.lhe' in x]:
415 self.process.source.fileNames.append(location+article+
'/'+fileName)
418 print 'Issue to load LHE files, please check and try again.' 421 if len(self.process.source.fileNames)==0:
422 print 'Issue with empty filename, but can pass line check' 425 self.process.source.skipEvents = cms.untracked.uint32(
int(args[2]))
429 elif self._options.filetype ==
"DQM":
430 self.process.source=cms.Source(
"DQMRootSource",
431 fileNames = cms.untracked.vstring())
434 elif self._options.filetype ==
"DQMDAQ":
436 self.process.source=cms.Source(
"DQMStreamerReader")
439 if (
'HARVESTING' in self.stepMap.keys()
or 'ALCAHARVEST' in self.stepMap.keys())
and (
not self._options.filetype ==
"DQM"):
440 self.process.source.processingMode = cms.untracked.string(
"RunsAndLumis")
442 if self._options.dasquery!=
'':
443 self.process.source=cms.Source(
"PoolSource", fileNames = cms.untracked.vstring(),secondaryFileNames = cms.untracked.vstring())
444 filesFromDASQuery(self._options.dasquery,self._options.dasoption,self.process.source)
446 if (
'HARVESTING' in self.stepMap.keys()
or 'ALCAHARVEST' in self.stepMap.keys())
and (
not self._options.filetype ==
"DQM"):
447 self.process.source.processingMode = cms.untracked.string(
"RunsAndLumis")
450 if 'GEN' in self.stepMap.keys():
451 if self._options.inputCommands:
452 self._options.inputCommands+=
',drop LHEXMLStringProduct_*_*_*,' 454 self._options.inputCommands=
'keep *, drop LHEXMLStringProduct_*_*_*,' 456 if self.process.source
and self._options.inputCommands:
457 if not hasattr(self.process.source,
'inputCommands'): self.process.source.inputCommands=cms.untracked.vstring()
458 for command
in self._options.inputCommands.split(
','):
460 command = command.strip()
461 if command==
'':
continue 462 self.process.source.inputCommands.append(command)
463 if not self._options.dropDescendant:
464 self.process.source.dropDescendantsOfDroppedBranches = cms.untracked.bool(
False)
466 if self._options.lumiToProcess:
467 import FWCore.PythonUtilities.LumiList
as LumiList
468 self.process.source.lumisToProcess = cms.untracked.VLuminosityBlockRange(
LumiList.LumiList(self._options.lumiToProcess).getCMSSWString().
split(
',') )
470 if 'GEN' in self.stepMap.keys()
or 'LHE' in self.stepMap
or (
not self._options.filein
and hasattr(self.
_options,
"evt_type")):
471 if self.process.source
is None:
472 self.process.source=cms.Source(
"EmptySource")
475 self.runsAndWeights=
None 476 if self._options.runsAndWeightsForMC
or self._options.runsScenarioForMC :
477 if not self._options.isMC :
478 raise Exception(
"options --runsAndWeightsForMC and --runsScenarioForMC are only valid for MC")
479 if self._options.runsAndWeightsForMC:
480 self.runsAndWeights = eval(self._options.runsAndWeightsForMC)
482 from Configuration.StandardSequences.RunsAndWeights
import RunsAndWeights
483 if type(RunsAndWeights[self._options.runsScenarioForMC])==str:
484 __import__(RunsAndWeights[self._options.runsScenarioForMC])
485 self.runsAndWeights = sys.modules[RunsAndWeights[self._options.runsScenarioForMC]].runProbabilityDistribution
487 self.runsAndWeights = RunsAndWeights[self._options.runsScenarioForMC]
489 if self.runsAndWeights:
490 import SimGeneral.Configuration.ThrowAndSetRandomRun
as ThrowAndSetRandomRun
492 self.additionalCommands.append(
'import SimGeneral.Configuration.ThrowAndSetRandomRun as ThrowAndSetRandomRun')
493 self.additionalCommands.append(
'ThrowAndSetRandomRun.throwAndSetRandomRun(process.source,%s)'%(self.runsAndWeights))
498 """ Add output module to the process """ 500 if self._options.outputDefinition:
501 if self._options.datatier:
502 print "--datatier & --eventcontent options ignored" 505 outList = eval(self._options.outputDefinition)
506 for (id,outDefDict)
in enumerate(outList):
507 outDefDictStr=outDefDict.__str__()
508 if not isinstance(outDefDict,dict):
509 raise Exception(
"--output needs to be passed a list of dict"+self._options.outputDefinition+
" is invalid")
511 theTier=
anyOf([
't',
'tier',
'dataTier'],outDefDict)
514 theStreamType=
anyOf([
'e',
'ec',
'eventContent',
'streamType'],outDefDict,theTier)
515 theFilterName=
anyOf([
'f',
'ftN',
'filterName'],outDefDict,
'')
516 theSelectEvent=
anyOf([
's',
'sE',
'selectEvents'],outDefDict,
'')
517 theModuleLabel=
anyOf([
'l',
'mL',
'moduleLabel'],outDefDict,
'')
518 theExtraOutputCommands=
anyOf([
'o',
'oC',
'outputCommands'],outDefDict,
'')
520 if not theModuleLabel:
521 tryNames=[theStreamType.replace(theTier.replace(
'-',
''),
'')+theTier.replace(
'-',
'')+
'output',
522 theStreamType.replace(theTier.replace(
'-',
''),
'')+theTier.replace(
'-',
'')+theFilterName+
'output',
523 theStreamType.replace(theTier.replace(
'-',
''),
'')+theTier.replace(
'-',
'')+theFilterName+theSelectEvent.split(
',')[0].
replace(
':',
'for').
replace(
' ',
'')+
'output' 525 for name
in tryNames:
526 if not hasattr(self.process,name):
529 if not theModuleLabel:
530 raise Exception(
"cannot find a module label for specification: "+outDefDictStr)
532 defaultFileName=self._options.outfile_name
534 defaultFileName=self._options.outfile_name.replace(
'.root',
'_in'+theTier+
'.root')
536 theFileName=self._options.dirout+
anyOf([
'fn',
'fileName'],outDefDict,defaultFileName)
537 if not theFileName.endswith(
'.root'):
540 if len(outDefDict.keys()):
541 raise Exception(
"unused keys from --output options: "+
','.
join(outDefDict.keys()))
542 if theStreamType==
'DQMIO': theStreamType=
'DQM' 543 if theStreamType==
'ALL':
544 theEventContent = cms.PSet(outputCommands = cms.untracked.vstring(
'keep *'))
546 theEventContent = getattr(self.process, theStreamType+
"EventContent")
550 if theStreamType==
'ALCARECO' and not theFilterName:
551 theFilterName=
'StreamALCACombined' 554 CppType=
'PoolOutputModule' 555 if self._options.timeoutOutput:
556 CppType=
'TimeoutPoolOutputModule' 557 if theStreamType==
'DQM' and theTier==
'DQMIO': CppType=
'DQMRootOutputModule' 558 output = cms.OutputModule(CppType,
559 theEventContent.clone(),
560 fileName = cms.untracked.string(theFileName),
561 dataset = cms.untracked.PSet(
562 dataTier = cms.untracked.string(theTier),
563 filterName = cms.untracked.string(theFilterName))
565 if not theSelectEvent
and hasattr(self.process,
'generation_step')
and theStreamType!=
'LHE':
566 output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring(
'generation_step'))
567 if not theSelectEvent
and hasattr(self.process,
'filtering_step'):
568 output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring(
'filtering_step'))
570 output.SelectEvents =cms.untracked.PSet(SelectEvents = cms.vstring(theSelectEvent))
573 if not hasattr(output,
'SelectEvents'):
574 output.SelectEvents=cms.untracked.PSet(SelectEvents=cms.vstring())
575 for alca
in self.AlCaPaths:
576 output.SelectEvents.SelectEvents.extend(getattr(self.process,
'OutALCARECO'+alca).SelectEvents.SelectEvents)
579 if hasattr(self.process,theModuleLabel):
580 raise Exception(
"the current process already has a module "+theModuleLabel+
" defined")
582 setattr(self.process,theModuleLabel,output)
583 outputModule=getattr(self.process,theModuleLabel)
584 setattr(self.process,theModuleLabel+
'_step',cms.EndPath(outputModule))
585 path=getattr(self.process,theModuleLabel+
'_step')
586 self.schedule.append(path)
588 if not self._options.inlineEventContent
and hasattr(self.process,theStreamType+
"EventContent"):
591 outputModule.outputCommands.__dict__[
"dumpPython"] = doNotInlineEventContent
592 if theExtraOutputCommands:
593 if not isinstance(theExtraOutputCommands,list):
594 raise Exception(
"extra ouput command in --option must be a list of strings")
595 if hasattr(self.process,theStreamType+
"EventContent"):
596 self.
executeAndRemember(
'process.%s.outputCommands.extend(%s)'%(theModuleLabel,theExtraOutputCommands))
598 outputModule.outputCommands.extend(theExtraOutputCommands)
600 result+=
"\nprocess."+theModuleLabel+
" = "+outputModule.dumpPython()
605 streamTypes=self._options.eventcontent.split(
',')
606 tiers=self._options.datatier.split(
',')
607 if not self._options.outputDefinition
and len(streamTypes)!=len(tiers):
608 raise Exception(
"number of event content arguments does not match number of datatier arguments")
611 if self._options.step.split(
',')[0].
split(
':')[0] ==
'ALCA':
614 for i,(streamType,tier)
in enumerate(
zip(streamTypes,tiers)):
615 if streamType==
'':
continue 616 if streamType ==
'ALCARECO' and not 'ALCAPRODUCER' in self._options.step:
continue 617 if streamType==
'DQMIO': streamType=
'DQM' 618 theEventContent = getattr(self.process, streamType+
"EventContent")
620 theFileName=self._options.outfile_name
621 theFilterName=self._options.filtername
623 theFileName=self._options.outfile_name.replace(
'.root',
'_in'+streamType+
'.root')
624 theFilterName=self._options.filtername
625 CppType=
'PoolOutputModule' 626 if self._options.timeoutOutput:
627 CppType=
'TimeoutPoolOutputModule' 628 if streamType==
'DQM' and tier==
'DQMIO': CppType=
'DQMRootOutputModule' 629 output = cms.OutputModule(CppType,
631 fileName = cms.untracked.string(theFileName),
632 dataset = cms.untracked.PSet(dataTier = cms.untracked.string(tier),
633 filterName = cms.untracked.string(theFilterName)
636 if hasattr(self.process,
"generation_step")
and streamType!=
'LHE':
637 output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring(
'generation_step'))
638 if hasattr(self.process,
"filtering_step"):
639 output.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring(
'filtering_step'))
641 if streamType==
'ALCARECO':
642 output.dataset.filterName = cms.untracked.string(
'StreamALCACombined')
644 if "MINIAOD" in streamType:
645 from PhysicsTools.PatAlgos.slimming.miniAOD_tools
import miniAOD_customizeOutput
648 outputModuleName=streamType+
'output' 649 setattr(self.process,outputModuleName,output)
650 outputModule=getattr(self.process,outputModuleName)
651 setattr(self.process,outputModuleName+
'_step',cms.EndPath(outputModule))
652 path=getattr(self.process,outputModuleName+
'_step')
653 self.schedule.append(path)
655 if self._options.outputCommands
and streamType!=
'DQM':
656 for evct
in self._options.outputCommands.split(
','):
657 if not evct:
continue 658 self.
executeAndRemember(
"process.%s.outputCommands.append('%s')"%(outputModuleName,evct.strip()))
660 if not self._options.inlineEventContent:
663 outputModule.outputCommands.__dict__[
"dumpPython"] = doNotInlineEventContent
665 result+=
"\nprocess."+outputModuleName+
" = "+outputModule.dumpPython()
671 Add selected standard sequences to the process 674 if self._options.pileup:
675 pileupSpec=self._options.pileup.split(
',')[0]
678 from Configuration.StandardSequences.Mixing
import Mixing,defineMixing
679 if not pileupSpec
in Mixing
and '.' not in pileupSpec
and 'file:' not in pileupSpec:
680 message = pileupSpec+
' is not a know mixing scenario:\n available are: '+
'\n'.
join(Mixing.keys())
684 if '.' in pileupSpec:
685 mixingDict={
'file':pileupSpec}
686 elif pileupSpec.startswith(
'file:'):
687 mixingDict={
'file':pileupSpec[5:]}
690 mixingDict=copy.copy(Mixing[pileupSpec])
691 if len(self._options.pileup.split(
','))>1:
692 mixingDict.update(eval(self._options.pileup[self._options.pileup.find(
',')+1:]))
695 if 'file:' in pileupSpec:
697 self.process.load(mixingDict[
'file'])
698 print "inlining mixing module configuration" 699 self._options.inlineObjets+=
',mix' 701 self.loadAndRemember(mixingDict[
'file'])
703 mixingDict.pop(
'file')
704 if not "DATAMIX" in self.stepMap.keys():
705 if self._options.pileup_input:
706 if self._options.pileup_input.startswith(
'dbs:')
or self._options.pileup_input.startswith(
'das:'):
707 mixingDict[
'F']=
filesFromDASQuery(
'file dataset = %s'%(self._options.pileup_input[4:],),self._options.pileup_dasoption)[0]
708 elif self._options.pileup_input.startswith(
"filelist:"):
709 mixingDict[
'F']=(
filesFromList(self._options.pileup_input[9:]))[0]
711 mixingDict[
'F']=self._options.pileup_input.split(
',')
713 for command
in specialization:
714 self.executeAndRemember(command)
715 if len(mixingDict)!=0:
716 raise Exception(
'unused mixing specification: '+mixingDict.keys().
__str__())
721 if len(self.stepMap):
722 self.loadAndRemember(self.GeometryCFF)
723 if (
'SIM' in self.stepMap
or 'reSIM' in self.stepMap)
and not self._options.fast:
724 self.loadAndRemember(self.SimGeometryCFF)
725 if self.geometryDBLabel:
726 self.executeAndRemember(
'process.XMLFromDBSource.label = cms.string("%s")'%(self.geometryDBLabel))
728 print "Geometry option",self._options.geometry,
"unknown." 731 if len(self.stepMap):
732 self.loadAndRemember(self.magFieldCFF)
734 for stepName
in self.stepKeys:
735 stepSpec = self.stepMap[stepName]
736 print "Step:", stepName,
"Spec:",stepSpec
737 if stepName.startswith(
're'):
739 if stepName[2:]
not in self._options.donotDropOnInput:
740 self._options.inputEventContent=
'%s,%s'%(stepName.upper(),self._options.inputEventContent)
741 stepName=stepName[2:]
743 getattr(self,
"prepare_"+stepName)(sequence = getattr(self,stepName+
"DefaultSeq"))
744 elif type(stepSpec)==list:
745 getattr(self,
"prepare_"+stepName)(sequence =
'+'.
join(stepSpec))
746 elif type(stepSpec)==tuple:
747 getattr(self,
"prepare_"+stepName)(sequence =
','.
join([stepSpec[1],
'+'.
join(stepSpec[0])]))
749 raise ValueError(
"Invalid step definition")
751 if self._options.restoreRNDSeeds!=
False:
753 if self._options.restoreRNDSeeds==
True:
754 self.executeAndRemember(
'process.RandomNumberGeneratorService.restoreStateLabel=cms.untracked.string("randomEngineStateProducer")')
756 self.executeAndRemember(
'process.RandomNumberGeneratorService.restoreStateTag=cms.untracked.InputTag("randomEngineStateProducer","","%s")'%(self._options.restoreRNDSeeds))
757 if self._options.inputEventContent
or self._options.inputCommands:
758 if self._options.inputCommands:
759 self._options.inputCommands+=
'keep *_randomEngineStateProducer_*_*,' 761 self._options.inputCommands=
'keep *_randomEngineStateProducer_*_*,' 765 if self._options.inputEventContent:
767 def dropSecondDropStar(iec):
778 if not hasattr(self.process.source,
'inputCommands'): self.process.source.inputCommands=cms.untracked.vstring()
779 for evct
in self._options.inputEventContent.split(
','):
780 if evct==
'':
continue 781 theEventContent = getattr(self.process, evct+
"EventContent")
782 if hasattr(theEventContent,
'outputCommands'):
783 self.process.source.inputCommands.extend(copy.copy(theEventContent.outputCommands))
784 if hasattr(theEventContent,
'inputCommands'):
785 self.process.source.inputCommands.extend(copy.copy(theEventContent.inputCommands))
787 dropSecondDropStar(self.process.source.inputCommands)
789 if not self._options.dropDescendant:
790 self.process.source.dropDescendantsOfDroppedBranches = cms.untracked.bool(
False)
796 """Add conditions to the process""" 797 if not self._options.conditions:
return 799 if 'FrontierConditions_GlobalTag' in self._options.conditions:
800 print 'using FrontierConditions_GlobalTag in --conditions is not necessary anymore and will be deprecated soon. please update your command line' 801 self._options.conditions = self._options.conditions.replace(
"FrontierConditions_GlobalTag,",
'')
803 self.loadAndRemember(self.ConditionsDefaultCFF)
805 self.process.GlobalTag =
GlobalTag(self.process.GlobalTag, self._options.conditions, self._options.custom_conditions)
806 self.additionalCommands.append(
'from Configuration.AlCa.GlobalTag import GlobalTag')
807 self.additionalCommands.append(
'process.GlobalTag = GlobalTag(process.GlobalTag, %s, %s)' % (repr(self._options.conditions), repr(self._options.custom_conditions)))
811 """Include the customise code """ 815 for c
in self._options.customisation_file:
816 custOpt.extend(c.split(
","))
818 for c
in self._options.customisation_file_unsch:
819 custOpt.extend(c.split(
","))
825 raise Exception(
"more than . in the specification:"+opt)
826 fileName=opt.split(
'.')[0]
827 if opt.count(
'.')==0: rest=
'customise' 829 rest=opt.split(
'.')[1]
830 if rest==
'py': rest=
'customise' 832 if fileName
in custMap:
833 custMap[fileName].extend(rest.split(
'+'))
835 custMap[fileName]=rest.split(
'+')
840 final_snippet=
'\n# customisation of the process.\n' 844 allFcn.extend(custMap[opt])
846 if allFcn.count(fcn)!=1:
847 raise Exception(
"cannot specify twice "+fcn+
" as a customisation method")
851 packageName = f.replace(
".py",
"").
replace(
"/",
".")
852 __import__(packageName)
853 package = sys.modules[packageName]
856 customiseFile = re.sub(
r'\.pyc$',
'.py', package.__file__)
858 final_snippet+=
'\n# Automatic addition of the customisation function from '+packageName+
'\n' 859 if self._options.inline_custom:
860 for line
in file(customiseFile,
'r'): 861 if "import FWCore.ParameterSet.Config" in line:
863 final_snippet += line
865 final_snippet +=
'from %s import %s \n'%(packageName,
','.
join(custMap[f]))
866 for fcn
in custMap[f]:
867 print "customising the process with",fcn,
"from",f
868 if not hasattr(package,fcn):
870 raise Exception(
"config "+f+
" has no function "+fcn)
872 self.process=getattr(package,fcn)(self.process)
874 final_snippet +=
"\n#call to customisation function "+fcn+
" imported from "+packageName
875 final_snippet +=
"\nprocess = %s(process)\n"%(fcn,)
878 final_snippet +=
'\n# End of customisation functions\n' 884 final_snippet=
'\n# Customisation from command line\n' 885 if self._options.customise_commands:
887 for com
in self._options.customise_commands.split(
'\\n'):
888 com=string.lstrip(com)
890 final_snippet +=
'\n'+com
899 if len(self.stepMap):
901 if self._options.particleTable
not in defaultOptions.particleTableList:
902 print 'Invalid particle table provided. Options are:' 903 print defaultOptions.particleTable
906 if len(self.stepMap):
907 self.
loadAndRemember(
'SimGeneral.HepPDTESSource.'+self._options.particleTable+
'_cfi')
924 self.EIDefaultCFF=
None 925 self.SKIMDefaultCFF=
"Configuration/StandardSequences/Skims_cff" 926 self.POSTRECODefaultCFF=
"Configuration/StandardSequences/PostRecoGenerator_cff" 927 self.VALIDATIONDefaultCFF=
"Configuration/StandardSequences/Validation_cff" 928 self.L1HwValDefaultCFF =
"Configuration/StandardSequences/L1HwVal_cff" 929 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOffline_cff" 930 self.HARVESTINGDefaultCFF=
"Configuration/StandardSequences/Harvesting_cff" 931 self.ALCAHARVESTDefaultCFF=
"Configuration/StandardSequences/AlCaHarvesting_cff" 932 self.ENDJOBDefaultCFF=
"Configuration/StandardSequences/EndOfProcess_cff" 933 self.ConditionsDefaultCFF =
"Configuration/StandardSequences/FrontierConditions_GlobalTag_cff" 934 self.CFWRITERDefaultCFF =
"Configuration/StandardSequences/CrossingFrameWriter_cff" 935 self.REPACKDefaultCFF=
"Configuration/StandardSequences/DigiToRaw_Repack_cff" 937 if "DATAMIX" in self.stepMap.keys():
938 self.DATAMIXDefaultCFF=
"Configuration/StandardSequences/DataMixer"+self._options.datamix+
"_cff" 939 if self._options.datamix ==
'PreMix':
940 self.
DIGIDefaultCFF=
"Configuration/StandardSequences/DigiDMPreMix_cff" 944 self.
L1EMDefaultCFF=
'Configuration/StandardSequences/SimL1EmulatorDM_cff' 946 if "DIGIPREMIX" in self.stepMap.keys():
947 self.
DIGIDefaultCFF=
"Configuration/StandardSequences/Digi_PreMix_cff" 949 self.
L1EMDefaultCFF=
"Configuration/StandardSequences/SimL1EmulatorPreMix_cff" 951 self.ALCADefaultSeq=
None 952 self.LHEDefaultSeq=
'externalLHEProducer' 953 self.GENDefaultSeq=
'pgen' 954 self.SIMDefaultSeq=
'psim' 955 self.DIGIDefaultSeq=
'pdigi' 956 self.DIGIPREMIXDefaultSeq=
'pdigi' 957 self.DIGIPREMIX_S2DefaultSeq=
'pdigi' 958 self.DATAMIXDefaultSeq=
None 959 self.DIGI2RAWDefaultSeq=
'DigiToRaw' 960 self.HLTDefaultSeq=
'GRun' 961 self.L1DefaultSeq=
None 962 self.L1REPACKDefaultSeq=
'GT' 963 self.HARVESTINGDefaultSeq=
None 964 self.ALCAHARVESTDefaultSeq=
None 965 self.CFWRITERDefaultSeq=
None 966 self.RAW2DIGIDefaultSeq=
'RawToDigi' 967 self.L1RecoDefaultSeq=
'L1Reco' 968 self.L1TrackTriggerDefaultSeq=
'L1TrackTrigger' 969 if self._options.fast
or (
'RAW2DIGI' in self.stepMap
and 'RECO' in self.stepMap):
970 self.RECODefaultSeq=
'reconstruction' 972 self.RECODefaultSeq=
'reconstruction_fromRECO' 974 self.EIDefaultSeq=
'top' 975 self.POSTRECODefaultSeq=
None 976 self.L1HwValDefaultSeq=
'L1HwVal' 977 self.DQMDefaultSeq=
'DQMOffline' 978 self.VALIDATIONDefaultSeq=
'' 979 self.ENDJOBDefaultSeq=
'endOfProcess' 980 self.REPACKDefaultSeq=
'DigiToRawRepack' 981 self.PATDefaultSeq=
'miniAOD' 983 self.EVTCONTDefaultCFF=
"Configuration/EventContent/EventContent_cff" 985 if not self._options.beamspot:
986 self._options.beamspot=VtxSmearedDefaultKey
989 if self._options.isMC==
True:
991 self.
RECODefaultCFF=
"Configuration/StandardSequences/Reconstruction_cff" 992 self.
PATDefaultCFF=
"Configuration/StandardSequences/PATMC_cff" 993 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineMC_cff" 994 self.
ALCADefaultCFF=
"Configuration/StandardSequences/AlCaRecoStreamsMC_cff" 996 self._options.beamspot =
None 999 if 'reGEN' in self.stepMap:
1000 self.GENDefaultSeq=
'fixGenInfo' 1002 if self._options.scenario==
'cosmics':
1003 self._options.pileup=
'Cosmics' 1004 self.
DIGIDefaultCFF=
"Configuration/StandardSequences/DigiCosmics_cff" 1005 self.
RECODefaultCFF=
"Configuration/StandardSequences/ReconstructionCosmics_cff" 1006 self.SKIMDefaultCFF=
"Configuration/StandardSequences/SkimsCosmics_cff" 1007 self.EVTCONTDefaultCFF=
"Configuration/EventContent/EventContentCosmics_cff" 1008 self.VALIDATIONDefaultCFF=
"Configuration/StandardSequences/ValidationCosmics_cff" 1009 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineCosmics_cff" 1010 if self._options.isMC==
True:
1011 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineCosmicsMC_cff" 1012 self.HARVESTINGDefaultCFF=
"Configuration/StandardSequences/HarvestingCosmics_cff" 1013 self.RECODefaultSeq=
'reconstructionCosmics' 1014 self.DQMDefaultSeq=
'DQMOfflineCosmics' 1016 if self._options.scenario==
'HeavyIons':
1017 if not self._options.beamspot:
1018 self._options.beamspot=VtxSmearedHIDefaultKey
1019 self.HLTDefaultSeq =
'HIon' 1020 self.VALIDATIONDefaultCFF=
"Configuration/StandardSequences/ValidationHeavyIons_cff" 1021 self.VALIDATIONDefaultSeq=
'' 1022 self.EVTCONTDefaultCFF=
"Configuration/EventContent/EventContentHeavyIons_cff" 1023 self.
RECODefaultCFF=
"Configuration/StandardSequences/ReconstructionHeavyIons_cff" 1024 self.RECODefaultSeq=
'reconstructionHeavyIons' 1025 self.
ALCADefaultCFF =
"Configuration/StandardSequences/AlCaRecoStreamsHeavyIons_cff" 1026 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineHeavyIons_cff" 1027 self.DQMDefaultSeq=
'DQMOfflineHeavyIons' 1028 self.SKIMDefaultCFF=
"Configuration/StandardSequences/SkimsHeavyIons_cff" 1029 self.HARVESTINGDefaultCFF=
"Configuration/StandardSequences/HarvestingHeavyIons_cff" 1030 if self._options.isMC==
True:
1031 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineHeavyIonsMC_cff" 1034 self.RAW2RECODefaultSeq=
','.
join([self.RAW2DIGIDefaultSeq,self.RECODefaultSeq])
1036 self.USERDefaultSeq=
'user' 1037 self.USERDefaultCFF=
None 1040 if self._options.isData:
1041 if self._options.magField==defaultOptions.magField:
1042 print "magnetic field option forced to: AutoFromDBCurrent" 1043 self._options.magField=
'AutoFromDBCurrent' 1044 self.magFieldCFF =
'Configuration/StandardSequences/MagneticField_'+self._options.magField.replace(
'.',
'')+
'_cff' 1045 self.magFieldCFF = self.magFieldCFF.replace(
"__",
'_')
1048 self.GeometryCFF=
'Configuration/StandardSequences/GeometryRecoDB_cff' 1049 self.geometryDBLabel=
None 1051 if self._options.fast:
1052 if 'start' in self._options.conditions.lower():
1053 self.GeometryCFF=
'FastSimulation/Configuration/Geometries_START_cff' 1055 self.GeometryCFF=
'FastSimulation/Configuration/Geometries_MC_cff' 1058 from Configuration.StandardSequences.GeometryConf
import GeometryConf
1059 if opt
in GeometryConf:
1060 return GeometryConf[opt]
1064 geoms=self._options.geometry.split(
',')
1068 if '/' in geoms[1]
or '_cff' in geoms[1]:
1069 self.GeometryCFF=geoms[1]
1071 self.GeometryCFF=
'Configuration/Geometry/Geometry'+geoms[1]+
'_cff' 1073 if (geoms[0].startswith(
'DB:')):
1074 self.SimGeometryCFF=
'Configuration/StandardSequences/GeometrySimDB_cff' 1075 self.geometryDBLabel=geoms[0][3:]
1078 if '/' in geoms[0]
or '_cff' in geoms[0]:
1079 self.SimGeometryCFF=geoms[0]
1081 simGeometry=geoms[0]
1082 if self._options.gflash==
True:
1083 self.SimGeometryCFF=
'Configuration/Geometry/Geometry'+geoms[0]+
'GFlash_cff' 1085 self.SimGeometryCFF=
'Configuration/Geometry/Geometry'+geoms[0]+
'_cff' 1088 if simGeometry
not in defaultOptions.geometryExtendedOptions:
1089 self.
SIMDefaultCFF=
"Configuration/StandardSequences/SimIdeal_cff" 1091 if self._options.scenario==
'nocoll' or self._options.scenario==
'cosmics':
1092 self.
SIMDefaultCFF=
"Configuration/StandardSequences/SimNOBEAM_cff" 1093 self._options.beamspot=
'NoSmear' 1096 if self._options.fast:
1097 self.
SIMDefaultCFF =
'FastSimulation.Configuration.SimIdeal_cff' 1098 self.
RECODefaultCFF=
'FastSimulation.Configuration.Reconstruction_AftMix_cff' 1099 self.RECOBEFMIXDefaultCFF =
'FastSimulation.Configuration.Reconstruction_BefMix_cff' 1100 self.RECOBEFMIXDefaultSeq =
'reconstruction_befmix' 1101 self.DQMOFFLINEDefaultCFF=
"FastSimulation.Configuration.DQMOfflineMC_cff" 1104 if self._options.pileup==
'default':
1105 from Configuration.StandardSequences.Mixing
import MixingDefaultKey
1106 self._options.pileup=MixingDefaultKey
1110 if self._options.isData:
1111 self._options.pileup=
None 1114 self.REDIGIDefaultSeq=self.DIGIDefaultSeq
1119 output = cms.OutputModule(
"PoolOutputModule")
1120 if stream.selectEvents.parameters_().__len__()!=0:
1121 output.SelectEvents = stream.selectEvents
1123 output.SelectEvents = cms.untracked.PSet()
1124 output.SelectEvents.SelectEvents=cms.vstring()
1125 if isinstance(stream.paths,tuple):
1126 for path
in stream.paths:
1127 output.SelectEvents.SelectEvents.append(path.label())
1129 output.SelectEvents.SelectEvents.append(stream.paths.label())
1133 if isinstance(stream.content,str):
1134 evtPset=getattr(self.process,stream.content)
1135 for p
in evtPset.parameters_():
1136 setattr(output,p,getattr(evtPset,p))
1137 if not self._options.inlineEventContent:
1140 output.outputCommands.__dict__[
"dumpPython"] = doNotInlineEventContent
1142 output.outputCommands = stream.content
1145 output.fileName = cms.untracked.string(self._options.dirout+stream.name+
'.root')
1147 output.dataset = cms.untracked.PSet( dataTier = stream.dataTier,
1148 filterName = cms.untracked.string(stream.name))
1150 if self._options.filtername:
1151 output.dataset.filterName= cms.untracked.string(self._options.filtername+
"_"+stream.name)
1154 output.eventAutoFlushCompressedSize=cms.untracked.int32(5*1024*1024)
1156 if workflow
in (
"producers,full"):
1157 if isinstance(stream.paths,tuple):
1158 for path
in stream.paths:
1159 self.schedule.append(path)
1161 self.schedule.append(stream.paths)
1165 if (
not self._options.relval)
and workflow
in (
"full",
"output"):
1166 self.additionalOutputs[name] = output
1167 setattr(self.process,name,output)
1169 if workflow ==
'output':
1171 filterList = output.SelectEvents.SelectEvents
1172 for i, filter
in enumerate(filterList):
1173 filterList[i] = filter+
":"+self._options.triggerResultsProcess
1183 if ( len(sequence.split(
'.'))==1 ):
1185 elif ( len(sequence.split(
'.'))==2 ):
1187 sequence=sequence.split(
'.')[1]
1189 print "sub sequence configuration must be of the form dir/subdir/cff.a+b+c or cff.a" 1190 print sequence,
"not recognized" 1197 for i,s
in enumerate(seq.split(
'*')):
1199 setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, s) ))
1201 p=getattr(self.process,prefix)
1202 p+=getattr(self.process, s)
1203 self.schedule.append(getattr(self.process,prefix))
1208 if self.nextScheduleIsConditional:
1209 self.conditionalPaths.append(prefix)
1210 setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, seq) ))
1211 self.schedule.append(getattr(self.process,prefix))
1213 for i,s
in enumerate(seq.split(
'+')):
1215 setattr(self.process,sn,getattr(cms,what)( getattr(self.process, s) ))
1216 self.schedule.append(getattr(self.process,sn))
1230 """ Enrich the process with alca streams """ 1232 sequence = sequence.split(
'.')[-1]
1235 alcaList = sequence.split(
"+")
1237 from Configuration.AlCa.autoAlca
import autoAlca
1241 for name
in alcaConfig.__dict__:
1242 alcastream = getattr(alcaConfig,name)
1243 shortName = name.replace(
'ALCARECOStream',
'')
1244 if shortName
in alcaList
and isinstance(alcastream,cms.FilteredStream):
1245 output = self.
addExtraStream(name,alcastream, workflow = workflow)
1246 self.
executeAndRemember(
'process.ALCARECOEventContent.outputCommands.extend(process.OutALCARECO'+shortName+
'_noDrop.outputCommands)')
1247 self.AlCaPaths.append(shortName)
1248 if 'DQM' in alcaList:
1249 if not self._options.inlineEventContent
and hasattr(self.process,name):
1250 self.
executeAndRemember(
'process.' + name +
'.outputCommands.append("keep *_MEtoEDMConverter_*_*")')
1252 output.outputCommands.append(
"keep *_MEtoEDMConverter_*_*")
1255 if self._options.hltProcess
or 'HLT' in self.stepMap:
1256 if isinstance(alcastream.paths,tuple):
1257 for path
in alcastream.paths:
1262 for i
in range(alcaList.count(shortName)):
1263 alcaList.remove(shortName)
1266 elif name ==
'pathALCARECODQM' and 'DQM' in alcaList:
1267 path = getattr(alcaConfig,name)
1268 self.schedule.append(path)
1269 alcaList.remove(
'DQM')
1271 if isinstance(alcastream,cms.Path):
1273 self.blacklist_paths.append(alcastream)
1276 if len(alcaList) != 0:
1278 for name
in alcaConfig.__dict__:
1279 alcastream = getattr(alcaConfig,name)
1280 if isinstance(alcastream,cms.FilteredStream):
1281 available.append(name.replace(
'ALCARECOStream',
''))
1282 print "The following alcas could not be found "+
str(alcaList)
1283 print "available ",available
1285 raise Exception(
"The following alcas could not be found "+
str(alcaList))
1290 loadFragment = self._options.evt_type.replace(
'.py',
'',).
replace(
'.',
'_').
replace(
'python/',
'').
replace(
'/',
'.')
1291 print "Loading lhe fragment from",loadFragment
1292 __import__(loadFragment)
1293 self.process.load(loadFragment)
1295 self._options.inlineObjets+=
','+sequence
1297 getattr(self.process,sequence).nEvents =
int(self._options.number)
1300 self.process.lhe_step = cms.Path( getattr( self.process,sequence) )
1301 self.excludedPaths.append(
"lhe_step")
1302 self.schedule.append( self.process.lhe_step )
1305 """ load the fragment of generator configuration """ 1310 loadFragment = self._options.evt_type.replace(
'.py',
'',).
replace(
'.',
'_').
replace(
'python/',
'')
1312 if not '/' in loadFragment:
1313 loadFragment=
'Configuration.Generator.'+loadFragment
1315 loadFragment=loadFragment.replace(
'/',
'.')
1317 print "Loading generator fragment from",loadFragment
1318 __import__(loadFragment)
1322 if not (self._options.filein
or self._options.dasquery):
1323 raise Exception(
"Neither gen fragment of input files provided: this is an inconsistent GEN step configuration")
1326 generatorModule=sys.modules[loadFragment]
1327 genModules=generatorModule.__dict__
1330 if self.LHEDefaultSeq
in genModules:
1331 del genModules[self.LHEDefaultSeq]
1333 if self._options.hideGen:
1334 self.loadAndRemember(loadFragment)
1336 self.process.load(loadFragment)
1338 import FWCore.ParameterSet.Modules
as cmstypes
1339 for name
in genModules:
1340 theObject = getattr(generatorModule,name)
1341 if isinstance(theObject, cmstypes._Module):
1342 self._options.inlineObjets=name+
','+self._options.inlineObjets
1343 elif isinstance(theObject, cms.Sequence)
or isinstance(theObject, cmstypes.ESProducer):
1344 self._options.inlineObjets+=
','+name
1346 if sequence == self.GENDefaultSeq
or sequence ==
'pgen_genonly':
1347 if 'ProductionFilterSequence' in genModules
and (
'generator' in genModules):
1348 self.productionFilterSequence =
'ProductionFilterSequence' 1349 elif 'generator' in genModules:
1350 self.productionFilterSequence =
'generator' 1352 """ Enrich the schedule with the rest of the generation step """ 1353 self.loadDefaultOrSpecifiedCFF(sequence,self.GENDefaultCFF)
1354 genSeqName=sequence.split(
'.')[-1]
1358 from Configuration.StandardSequences.VtxSmeared
import VtxSmeared
1359 cffToBeLoaded=VtxSmeared[self._options.beamspot]
1360 self.loadAndRemember(cffToBeLoaded)
1362 raise Exception(
"VertexSmearing type or beamspot "+self._options.beamspot+
" unknown.")
1364 if self._options.scenario ==
'HeavyIons':
1365 if self._options.pileup==
'HiMixGEN':
1366 self.loadAndRemember(
"Configuration/StandardSequences/GeneratorMix_cff")
1368 self.loadAndRemember(
"Configuration/StandardSequences/GeneratorHI_cff")
1370 self.process.generation_step = cms.Path( getattr(self.process,genSeqName) )
1371 self.schedule.append(self.process.generation_step)
1374 self.executeAndRemember(
'process.genstepfilter.triggerConditions=cms.vstring("generation_step")')
1376 if 'reGEN' in self.stepMap:
1380 """ Enrich the schedule with the summary of the filter step """ 1382 self.loadAndRemember(
"GeneratorInterface/Core/genFilterSummary_cff")
1383 self.scheduleSequenceAtEnd(
'genFilterSummary',
'genfiltersummary_step')
1387 """ Enrich the schedule with the simulation step""" 1388 self.loadDefaultOrSpecifiedCFF(sequence,self.SIMDefaultCFF)
1389 if not self._options.fast:
1390 if self._options.gflash==
True:
1391 self.loadAndRemember(
"Configuration/StandardSequences/GFlashSIM_cff")
1393 if self._options.magField==
'0T':
1394 self.executeAndRemember(
"process.g4SimHits.UseMagneticField = cms.bool(False)")
1396 if self._options.magField==
'0T':
1397 self.executeAndRemember(
"process.famosSimHits.UseMagneticField = cms.bool(False)")
1399 self.scheduleSequence(sequence.split(
'.')[-1],
'simulation_step')
1403 """ Enrich the schedule with the digitisation step""" 1406 if self._options.gflash==
True:
1407 self.
loadAndRemember(
"Configuration/StandardSequences/GFlashDIGI_cff")
1409 if sequence ==
'pdigi_valid' or sequence ==
'pdigi_hi':
1410 self.
executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersValid)")
1412 if sequence !=
'pdigi_nogen' and sequence !=
'pdigi_valid_nogen' and not self.process.source.type_()==
'EmptySource':
1413 if self._options.inputEventContent==
'':
1414 self._options.inputEventContent=
'REGEN' 1416 self._options.inputEventContent=self._options.inputEventContent+
',REGEN' 1423 """ Enrich the schedule with the digitisation step""" 1428 if sequence ==
'pdigi_valid':
1429 self.
executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersNoNoiseValid)")
1431 self.
executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersNoNoise)")
1437 """ Enrich the schedule with the digitisation step""" 1438 self.loadDefaultOrSpecifiedCFF(sequence,self.DIGIDefaultCFF)
1440 self.loadAndRemember(
"SimGeneral/MixingModule/digi_MixPreMix_cfi")
1443 if sequence ==
'pdigi_valid':
1444 self.executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersMixPreMixValid)")
1446 self.executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersMixPreMix)")
1448 self.scheduleSequence(sequence.split(
'.')[-1],
'digitisation_step')
1452 """ Enrich the schedule with the crossing frame writer step""" 1458 """ Enrich the schedule with the digitisation step""" 1462 if self._options.pileup_input:
1464 if self._options.pileup_input.startswith(
'dbs:')
or self._options.pileup_input.startswith(
'das:'):
1465 theFiles=
filesFromDASQuery(
'file dataset = %s'%(self._options.pileup_input[4:],),self._options.pileup_dasoption)[0]
1466 elif self._options.pileup_input.startswith(
"filelist:"):
1467 theFiles= (
filesFromList(self._options.pileup_input[9:]))[0]
1469 theFiles=self._options.pileup_input.split(
',')
1471 self.
executeAndRemember(
"process.mixData.input.fileNames = cms.untracked.vstring(%s)"%( theFiles ) )
1478 if "DIGIPREMIX" in self.stepMap.keys():
1480 self.
executeAndRemember(
"process.SiStripDigiToRaw.FedReadoutMode = cms.string('PREMIX_RAW')")
1490 """ Enrich the schedule with the L1 simulation step""" 1491 assert(sequence ==
None)
1497 """ Enrich the schedule with the L1 simulation step, running the L1 emulator on data unpacked from the RAW collection, and repacking the result in a new RAW collection""" 1498 supported = [
'GT',
'GT1',
'GT2',
'GCTGT',
'Full',
'FullSimTP',
'FullMC',
'Full2015Data',
'uGT']
1499 if sequence
in supported:
1500 self.loadAndRemember(
'Configuration/StandardSequences/SimL1EmulatorRepack_%s_cff'%sequence)
1501 if self._options.scenario ==
'HeavyIons':
1502 self.renameInputTagsInSequence(
"SimL1Emulator",
"rawDataCollector",
"rawDataRepacker")
1503 self.scheduleSequence(
'SimL1Emulator',
'L1RePack_step')
1505 print "L1REPACK with '",sequence,
"' is not supported! Supported choices are: ",supported
1510 """ Enrich the schedule with the HLT simulation step""" 1512 print "no specification of the hlt menu has been given, should never happen" 1513 raise Exception(
'no HLT sequence provided')
1517 from Configuration.HLT.autoHLT
import autoHLT
1520 sequence = autoHLT[key]
1522 raise ValueError(
'no HLT mapping key "%s" found in autoHLT' % key)
1528 if self._options.scenario ==
'HeavyIons':
1529 optionsForHLT[
'type'] =
'HIon' 1531 optionsForHLT[
'type'] =
'GRun' 1532 optionsForHLTConfig =
', '.
join(
'%s=%s' % (key, repr(val))
for (key, val)
in optionsForHLT.iteritems())
1533 if sequence ==
'run,fromSource':
1534 if hasattr(self.process.source,
'firstRun'):
1535 self.
executeAndRemember(
'process.loadHltConfiguration("run:%%d"%%(process.source.firstRun.value()),%s)'%(optionsForHLTConfig))
1536 elif hasattr(self.process.source,
'setRunNumber'):
1537 self.
executeAndRemember(
'process.loadHltConfiguration("run:%%d"%%(process.source.setRunNumber.value()),%s)'%(optionsForHLTConfig))
1539 raise Exception(
'Cannot replace menu to load %s'%(sequence))
1541 self.
executeAndRemember(
'process.loadHltConfiguration("%s",%s)'%(sequence.replace(
',',
':'),optionsForHLTConfig))
1545 if self._options.isMC:
1546 self._options.customisation_file.append(
"HLTrigger/Configuration/customizeHLTforMC.customizeHLTforMC")
1548 if self._options.name !=
'HLT':
1549 self.additionalCommands.append(
'from HLTrigger.Configuration.CustomConfigs import ProcessName')
1550 self.additionalCommands.append(
'process = ProcessName(process)')
1551 self.additionalCommands.append(
'')
1552 from HLTrigger.Configuration.CustomConfigs
import ProcessName
1555 self.schedule.append(self.process.HLTSchedule)
1556 [self.blacklist_paths.append(path)
for path
in self.process.HLTSchedule
if isinstance(path,(cms.Path,cms.EndPath))]
1559 if self._options.fast:
1560 if not hasattr(self.process,
'HLTEndSequence'):
1561 self.
executeAndRemember(
"process.HLTEndSequence = cms.Sequence( process.dummyModule )")
1566 seqReco=sequence.split(
',')[1]
1567 seqDigi=sequence.split(
',')[0]
1569 print "RAW2RECO requires two specifications",sequence,
"insufficient" 1583 self.
loadAndRemember(
"PhysicsTools/PatAlgos/slimming/metFilterPaths_cff")
1585 for filt
in allMetFilterPaths:
1586 self.schedule.append(getattr(self.process,
'Flag_'+filt))
1589 ''' Enrich the schedule with L1 HW validation ''' 1592 print '\n\n\n DEPRECATED this has no action \n\n\n' 1596 ''' Enrich the schedule with L1 reconstruction ''' 1602 ''' Enrich the schedule with L1 reconstruction ''' 1608 ''' Enrich the schedule with a user defined filter sequence ''' 1610 filterConfig=self.load(sequence.split(
'.')[0])
1611 filterSeq=sequence.split(
'.')[-1]
1619 label=visitee.label()
1627 getattr(self.process,filterSeq).
visit( expander )
1628 self._options.inlineObjets+=
','+expander.inliner
1629 self._options.inlineObjets+=
','+filterSeq
1632 self.scheduleSequence(filterSeq,
'filtering_step')
1633 self.nextScheduleIsConditional=
True 1635 self.productionFilterSequence = filterSeq
1640 ''' Enrich the schedule with reconstruction ''' 1646 ''' Enrich the schedule with the part of reconstruction that is done before mixing in FastSim''' 1647 if not self._options.fast:
1648 print "ERROR: this step is only implemented for FastSim" 1651 self.
scheduleSequence(sequence.split(
'.')[-1],
'reconstruction_befmix_step')
1655 ''' Enrich the schedule with PAT ''' 1658 self.labelsToAssociate.append(
'patTask')
1659 if not self._options.runUnscheduled:
1660 raise Exception(
"MiniAOD production can only run in unscheduled mode, please run cmsDriver with --runUnscheduled")
1661 if self._options.isData:
1662 self._options.customisation_file_unsch.insert(0,
"PhysicsTools/PatAlgos/slimming/miniAOD_tools.miniAOD_customizeAllData")
1664 self._options.customisation_file_unsch.insert(0,
"PhysicsTools/PatAlgos/slimming/miniAOD_tools.miniAOD_customizeAllMC")
1665 if self._options.fast:
1666 self._options.customisation_file_unsch.insert(1,
"PhysicsTools/PatAlgos/slimming/metFilterPaths_cff.miniAOD_customizeMETFiltersFastSim")
1668 if self._options.hltProcess:
1669 if len(self._options.customise_commands) > 1:
1670 self._options.customise_commands = self._options.customise_commands +
" \n" 1671 self._options.customise_commands = self._options.customise_commands +
"process.patTrigger.processName = \""+self._options.hltProcess+
"\"\n" 1672 self._options.customise_commands = self._options.customise_commands +
"process.slimmedPatTrigger.triggerResults= cms.InputTag( 'TriggerResults::"+self._options.hltProcess+
"' )\n" 1679 ''' Enrich the schedule with event interpretation ''' 1680 from Configuration.StandardSequences.EventInterpretation
import EventInterpretation
1681 if sequence
in EventInterpretation:
1682 self.EIDefaultCFF = EventInterpretation[sequence]
1683 sequence =
'EIsequence' 1685 raise Exception(
'Cannot set %s event interpretation'%( sequence) )
1686 self.loadDefaultOrSpecifiedCFF(sequence,self.EIDefaultCFF)
1687 self.scheduleSequence(sequence.split(
'.')[-1],
'eventinterpretaion_step')
1691 ''' Enrich the schedule with skimming fragments''' 1693 sequence = sequence.split(
'.')[-1]
1695 skimlist=sequence.split(
'+')
1697 from Configuration.Skimming.autoSkim
import autoSkim
1701 for skim
in skimConfig.__dict__:
1702 skimstream = getattr(skimConfig,skim)
1703 if isinstance(skimstream,cms.Path):
1705 self.blacklist_paths.append(skimstream)
1706 if (
not isinstance(skimstream,cms.FilteredStream)):
1708 shortname = skim.replace(
'SKIMStream',
'')
1709 if (sequence==
"all"):
1711 elif (shortname
in skimlist):
1714 if self._options.datatier==
'DQM':
1715 self.process.load(self.EVTCONTDefaultCFF)
1716 skimstreamDQM = cms.FilteredStream(
1717 responsible = skimstream.responsible,
1718 name = skimstream.name+
'DQM',
1719 paths = skimstream.paths,
1720 selectEvents = skimstream.selectEvents,
1721 content = self._options.datatier+
'EventContent',
1722 dataTier = cms.untracked.string(self._options.datatier)
1725 for i
in range(skimlist.count(shortname)):
1726 skimlist.remove(shortname)
1730 if (skimlist.__len__()!=0
and sequence!=
"all"):
1731 print 'WARNING, possible typo with SKIM:'+
'+'.
join(skimlist)
1732 raise Exception(
'WARNING, possible typo with SKIM:'+
'+'.
join(skimlist))
1735 ''' Enrich the schedule with a user defined sequence ''' 1741 """ Enrich the schedule with the postreco step """ 1748 print sequence,
"in preparing validation" 1750 from Validation.Configuration.autoValidation
import autoValidation
1752 sequence=sequence.split(
'.')[-1]
1753 if sequence.find(
',')!=-1:
1754 prevalSeqName=sequence.split(
',')[0].
split(
'+')
1755 valSeqName=sequence.split(
',')[1].
split(
'+')
1760 prevalSeqName=sequence.split(
'+')
1761 valSeqName=sequence.split(
'+')
1767 postfix=
'_'+sequence
1768 prevalSeqName=[
'prevalidation'+postfix]
1769 valSeqName=[
'validation'+postfix]
1770 if not hasattr(self.process,valSeqName[0]):
1772 valSeqName=[sequence]
1783 if (
'HLT' in self.stepMap
and not self._options.fast)
or self._options.hltProcess:
1784 for s
in valSeqName+prevalSeqName:
1787 for (i,s)
in enumerate(prevalSeqName):
1789 setattr(self.process,
'prevalidation_step%s'%NFI(i), cms.Path( getattr(self.process, s)) )
1790 self.schedule.append(getattr(self.process,
'prevalidation_step%s'%NFI(i)))
1792 for (i,s)
in enumerate(valSeqName):
1793 setattr(self.process,
'validation_step%s'%NFI(i), cms.EndPath( getattr(self.process, s)))
1794 self.schedule.append(getattr(self.process,
'validation_step%s'%NFI(i)))
1797 if 'PAT' in self.stepMap
and not 'RECO' in self.stepMap:
1800 if not 'DIGI' in self.stepMap
and not self._options.fast
and not any(
map(
lambda s : s.startswith(
'genvalid'), valSeqName)):
1801 if self._options.restoreRNDSeeds==
False and not self._options.restoreRNDSeeds==
True:
1802 self._options.restoreRNDSeeds=
True 1804 if not 'DIGI' in self.stepMap
and not self._options.fast:
1808 self._options.customisation_file.append(
"SimGeneral/MixingModule/fullMixCustomize_cff.setCrossingFrameOn")
1810 if hasattr(self.process,
"genstepfilter")
and len(self.process.genstepfilter.triggerConditions):
1812 for (i,s)
in enumerate(valSeqName):
1813 getattr(self.process,
'validation_step%s'%NFI(i))._seq = self.process.genstepfilter * getattr(self.process,
'validation_step%s'%NFI(i))._seq
1819 """Visitor that travels within a cms.Sequence, looks for a parameter and replace its value 1820 It will climb down within PSets, VPSets and VInputTags to find its target""" 1821 def __init__(self, paramSearch, paramReplace, verbose=False, whitelist=()):
1828 if isinstance(pset, cms._Parameterizable):
1829 for name
in pset.parameters_().
keys():
1835 value = getattr(pset,name)
1836 type = value.pythonTypeName()
1837 if type
in (
'cms.PSet',
'cms.untracked.PSet'):
1838 self.
doIt(value,base+
"."+name)
1839 elif type
in (
'cms.VPSet',
'cms.untracked.VPSet'):
1840 for (i,ps)
in enumerate(value): self.
doIt(ps,
"%s.%s[%d]"%(base,name,i) )
1841 elif type
in (
'cms.string',
'cms.untracked.string'):
1843 if self.
_verbose:
print "set string process name %s.%s %s ==> %s"% (base, name, value, self.
_paramReplace)
1845 elif type
in (
'cms.VInputTag',
'cms.untracked.VInputTag'):
1846 for (i,n)
in enumerate(value):
1847 if not isinstance(n, cms.InputTag):
1851 if self.
_verbose:
print "set process name %s.%s[%d] %s ==> %s " % (base, name, i, n, self.
_paramReplace)
1854 elif type
in (
'cms.vstring',
'cms.untracked.vstring'):
1855 for (i,n)
in enumerate(value):
1858 elif type
in (
'cms.InputTag',
'cms.untracked.InputTag'):
1860 if self.
_verbose:
print "set process name %s.%s %s ==> %s " % (base, name, value, self.
_paramReplace)
1861 setattr(getattr(pset, name),
"processName",self.
_paramReplace)
1866 label = visitee.label()
1867 except AttributeError:
1868 label =
'<Module not in a Process>' 1870 label =
'other execption' 1871 self.
doIt(visitee, label)
1878 print "Replacing all InputTag %s => %s"%(oldT,newT)
1881 loadMe=
'from PhysicsTools.PatAlgos.tools.helpers import massSearchReplaceAnyInputTag' 1882 if not loadMe
in self.additionalCommands:
1883 self.additionalCommands.append(loadMe)
1884 self.additionalCommands.append(
'massSearchReplaceAnyInputTag(process.%s,"%s","%s",False,True)'%(sequence,oldT,newT))
1888 if self._options.hltProcess:
1889 proc=self._options.hltProcess
1891 proc=self.process.name_()
1892 if proc==HLTprocess:
return 1894 print "replacing %s process name - sequence %s will use '%s'" % (HLTprocess,sequence, proc)
1896 if 'from Configuration.Applications.ConfigBuilder import ConfigBuilder' not in self.additionalCommands:
1897 self.additionalCommands.append(
'from Configuration.Applications.ConfigBuilder import ConfigBuilder')
1898 self.additionalCommands.append(
'process.%s.visit(ConfigBuilder.MassSearchReplaceProcessNameVisitor("%s", "%s", whitelist = ("subSystemFolder",)))'% (sequence,HLTprocess, proc))
1904 while '@' in repr(seqList)
and level<maxLevel:
1906 for specifiedCommand
in seqList:
1907 if specifiedCommand.startswith(
'@'):
1908 location=specifiedCommand[1:]
1909 if not location
in mapping:
1910 raise Exception(
"Impossible to map "+location+
" from "+repr(mapping))
1911 mappedTo=mapping[location]
1913 mappedTo=mappedTo[index]
1914 seqList.remove(specifiedCommand)
1915 seqList.extend(mappedTo.split(
'+'))
1918 raise Exception(
"Could not fully expand "+repr(seqList)+
" from "+repr(mapping))
1924 sequenceList=sequence.split(
'.')[-1].
split(
'+')
1925 postSequenceList=sequence.split(
'.')[-1].
split(
'+')
1926 from DQMOffline.Configuration.autoDQM
import autoDQM
1930 if len(set(sequenceList))!=len(sequenceList):
1931 sequenceList=
list(set(sequenceList))
1932 print "Duplicate entries for DQM:, using",sequenceList
1934 pathName=
'dqmoffline_step' 1935 for (i,sequence)
in enumerate(sequenceList):
1937 pathName=
'dqmoffline_%d_step'%(i)
1939 if 'HLT' in self.stepMap.keys()
or self._options.hltProcess:
1942 setattr(self.process,pathName, cms.EndPath( getattr(self.process,sequence ) ) )
1943 self.schedule.append(getattr(self.process,pathName))
1945 if hasattr(self.process,
"genstepfilter")
and len(self.process.genstepfilter.triggerConditions):
1947 getattr(self.process,pathName).
insert(0,self.process.genstepfilter)
1949 pathName=
'dqmofflineOnPAT_step' 1950 for (i,sequence)
in enumerate(postSequenceList):
1952 pathName=
'dqmofflineOnPAT_%d_step'%(i)
1954 setattr(self.process,pathName, cms.EndPath( getattr(self.process, sequence ) ) )
1955 self.schedule.append(getattr(self.process,pathName))
1958 """ Enrich the process with harvesting step """ 1959 self.
DQMSaverCFF=
'Configuration/StandardSequences/DQMSaver'+self._options.harvesting+
'_cff' 1963 sequence = sequence.split(
'.')[-1]
1966 harvestingList = sequence.split(
"+")
1967 from DQMOffline.Configuration.autoDQM
import autoDQM
1968 from Validation.Configuration.autoValidation
import autoValidation
1970 combined_mapping = copy.deepcopy( autoDQM )
1971 combined_mapping.update( autoValidation )
1972 self.
expandMapping(harvestingList,combined_mapping,index=-1)
1974 if len(set(harvestingList))!=len(harvestingList):
1975 harvestingList=
list(set(harvestingList))
1976 print "Duplicate entries for HARVESTING, using",harvestingList
1978 for name
in harvestingList:
1979 if not name
in harvestingConfig.__dict__:
1980 print name,
"is not a possible harvesting type. Available are",harvestingConfig.__dict__.keys()
1982 harvestingstream = getattr(harvestingConfig,name)
1983 if isinstance(harvestingstream,cms.Path):
1984 self.schedule.append(harvestingstream)
1985 self.blacklist_paths.append(harvestingstream)
1986 if isinstance(harvestingstream,cms.Sequence):
1987 setattr(self.process,name+
"_step",cms.Path(harvestingstream))
1988 self.schedule.append(getattr(self.process,name+
"_step"))
1994 """ Enrich the process with AlCaHarvesting step """ 1996 sequence=sequence.split(
".")[-1]
1999 harvestingList = sequence.split(
"+")
2003 from Configuration.AlCa.autoPCL
import autoPCL
2006 for name
in harvestingConfig.__dict__:
2007 harvestingstream = getattr(harvestingConfig,name)
2008 if name
in harvestingList
and isinstance(harvestingstream,cms.Path):
2009 self.schedule.append(harvestingstream)
2010 self.
executeAndRemember(
"process.PoolDBOutputService.toPut.append(process.ALCAHARVEST" + name +
"_dbOutput)")
2011 self.
executeAndRemember(
"process.pclMetadataWriter.recordsToMap.append(process.ALCAHARVEST" + name +
"_metadata)")
2012 harvestingList.remove(name)
2014 lastStep = getattr(harvestingConfig,
"ALCAHARVESTDQMSaveAndMetadataWriter")
2015 self.schedule.append(lastStep)
2017 if len(harvestingList) != 0
and 'dummyHarvesting' not in harvestingList :
2018 print "The following harvesting could not be found : ", harvestingList
2019 raise Exception(
"The following harvesting could not be found : "+
str(harvestingList))
2029 self.process.reconstruction = cms.Path(self.process.reconstructionWithFamos)
2030 self.schedule.append(self.process.reconstruction)
2034 """ Add useful info for the production. """ 2035 self.process.configurationMetadata=cms.untracked.PSet\
2036 (version=cms.untracked.string(
"$Revision: 1.19 $"),
2037 name=cms.untracked.string(
"Applications"),
2038 annotation=cms.untracked.string(evt_type+
" nevts:"+
str(evtnumber))
2041 self.addedObjects.append((
"Production Info",
"configurationMetadata"))
2045 """ Prepare the configuration string and add missing pieces.""" 2057 outputModuleCfgCode=
"" 2058 if not 'HARVESTING' in self.stepMap.keys()
and not 'ALCAHARVEST' in self.stepMap.keys()
and not 'ALCAOUTPUT' in self.stepMap.keys()
and self.with_output:
2063 self.pythonCfgCode =
"# Auto generated configuration file\n" 2064 self.pythonCfgCode +=
"# using: \n# "+__version__[1:-1]+
"\n# "+__source__[1:-1]+
'\n' 2065 self.pythonCfgCode +=
"# with command line options: "+self._options.arguments+
'\n' 2066 self.pythonCfgCode +=
"import FWCore.ParameterSet.Config as cms\n\n" 2067 if hasattr(self.
_options,
"era")
and self._options.era :
2068 self.pythonCfgCode +=
"from Configuration.StandardSequences.Eras import eras\n\n" 2069 self.pythonCfgCode +=
"process = cms.Process('"+self.process.name_()+
"'" 2071 for requestedEra
in self._options.era.split(
",") :
2072 self.pythonCfgCode +=
",eras."+requestedEra
2073 self.pythonCfgCode +=
")\n\n" 2075 self.pythonCfgCode +=
"process = cms.Process('"+self.process.name_()+
"')\n\n" 2077 self.pythonCfgCode +=
"# import of standard configurations\n" 2078 for module
in self.imports:
2079 self.pythonCfgCode += (
"process.load('"+module+
"')\n")
2082 if not hasattr(self.process,
"configurationMetadata"):
2086 self.addedObjects.append((
"Production Info",
"configurationMetadata"))
2088 self.pythonCfgCode +=
"\n" 2089 for comment,object
in self.addedObjects:
2091 self.pythonCfgCode +=
"\n# "+comment+
"\n" 2092 self.pythonCfgCode +=
dumpPython(self.process,object)
2095 self.pythonCfgCode +=
"\n# Output definition\n" 2096 self.pythonCfgCode += outputModuleCfgCode
2099 self.pythonCfgCode +=
"\n# Additional output definition\n" 2101 nl=self.additionalOutputs.keys()
2104 output = self.additionalOutputs[name]
2105 self.pythonCfgCode +=
"process.%s = %s" %(name, output.dumpPython())
2106 tmpOut = cms.EndPath(output)
2107 setattr(self.process,name+
'OutPath',tmpOut)
2108 self.schedule.append(tmpOut)
2111 self.pythonCfgCode +=
"\n# Other statements\n" 2112 for command
in self.additionalCommands:
2113 self.pythonCfgCode += command +
"\n" 2116 for object
in self._options.inlineObjets.split(
','):
2119 if not hasattr(self.process,object):
2120 print 'cannot inline -'+object+
'- : not known' 2122 self.pythonCfgCode +=
'\n' 2123 self.pythonCfgCode +=
dumpPython(self.process,object)
2126 self.pythonCfgCode +=
"\n# Path and EndPath definitions\n" 2127 for path
in self.process.paths:
2128 if getattr(self.process,path)
not in self.blacklist_paths:
2129 self.pythonCfgCode +=
dumpPython(self.process,path)
2131 for endpath
in self.process.endpaths:
2132 if getattr(self.process,endpath)
not in self.blacklist_paths:
2133 self.pythonCfgCode +=
dumpPython(self.process,endpath)
2136 self.pythonCfgCode +=
"\n# Schedule definition\n" 2137 result =
"process.schedule = cms.Schedule(" 2140 self.process.schedule = cms.Schedule()
2141 for item
in self.schedule:
2142 if not isinstance(item, cms.Schedule):
2143 self.process.schedule.append(item)
2145 self.process.schedule.extend(item)
2147 if hasattr(self.process,
"HLTSchedule"):
2148 beforeHLT = self.schedule[:self.schedule.index(self.process.HLTSchedule)]
2149 afterHLT = self.schedule[self.schedule.index(self.process.HLTSchedule)+1:]
2150 pathNames = [
'process.'+p.label_()
for p
in beforeHLT]
2151 result +=
','.
join(pathNames)+
')\n' 2152 result +=
'process.schedule.extend(process.HLTSchedule)\n' 2153 pathNames = [
'process.'+p.label_()
for p
in afterHLT]
2154 result +=
'process.schedule.extend(['+
','.
join(pathNames)+
'])\n' 2156 pathNames = [
'process.'+p.label_()
for p
in self.schedule]
2157 result =
'process.schedule = cms.Schedule('+
','.
join(pathNames)+
')\n' 2159 self.pythonCfgCode += result
2161 for labelToAssociate
in self.labelsToAssociate:
2162 self.process.schedule.associate(getattr(self.process, labelToAssociate))
2163 self.pythonCfgCode +=
'process.schedule.associate(process.' + labelToAssociate +
')\n' 2167 self.pythonCfgCode+=
"from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask\n" 2168 self.pythonCfgCode+=
"associatePatAlgosToolsTask(process)\n" 2170 if self._options.nThreads
is not "1":
2171 self.pythonCfgCode +=
"\n" 2172 self.pythonCfgCode +=
"#Setup FWK for multithreaded\n" 2173 self.pythonCfgCode +=
"process.options.numberOfThreads=cms.untracked.uint32("+self._options.nThreads+
")\n" 2174 self.pythonCfgCode +=
"process.options.numberOfStreams=cms.untracked.uint32(0)\n" 2176 if self._options.isRepacked:
2177 self.pythonCfgCode +=
"\n" 2178 self.pythonCfgCode +=
"from Configuration.Applications.ConfigBuilder import MassReplaceInputTag\n" 2179 self.pythonCfgCode +=
"MassReplaceInputTag(process)\n" 2180 MassReplaceInputTag(self.process)
2183 if self.productionFilterSequence:
2184 self.pythonCfgCode +=
'# filter all path with the production filter sequence\n' 2185 self.pythonCfgCode +=
'for path in process.paths:\n' 2186 if len(self.conditionalPaths):
2187 self.pythonCfgCode +=
'\tif not path in %s: continue\n'%
str(self.conditionalPaths)
2188 if len(self.excludedPaths):
2189 self.pythonCfgCode +=
'\tif path in %s: continue\n'%
str(self.excludedPaths)
2190 self.pythonCfgCode +=
'\tgetattr(process,path)._seq = process.%s * getattr(process,path)._seq \n'%(self.productionFilterSequence,)
2191 pfs = getattr(self.process,self.productionFilterSequence)
2192 for path
in self.process.paths:
2193 if not path
in self.conditionalPaths:
continue 2194 if path
in self.excludedPaths:
continue 2195 getattr(self.process,path)._seq = pfs * getattr(self.process,path)._seq
2201 if self._options.runUnscheduled:
2204 self.pythonCfgCode+=
"#do not add changes to your config after this point (unless you know what you are doing)\n" 2205 self.pythonCfgCode+=
"from FWCore.ParameterSet.Utilities import convertToUnscheduled\n" 2206 self.pythonCfgCode+=
"process=convertToUnscheduled(process)\n" 2208 from FWCore.ParameterSet.Utilities
import convertToUnscheduled
2219 self.pythonCfgCode +=
"\n# Add early deletion of temporary data products to reduce peak memory need\n" 2220 self.pythonCfgCode +=
"from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete\n" 2221 self.pythonCfgCode +=
"process = customiseEarlyDelete(process)\n" 2222 self.pythonCfgCode +=
"# End adding early deletion\n" 2223 from Configuration.StandardSequences.earlyDeleteSettings_cff
import customiseEarlyDelete
2229 if self._options.io:
2231 if not self._options.io.endswith(
'.io'): self._option.io+=
'.io' 2232 io=open(self._options.io,
'w')
2234 if hasattr(self.process.source,
"fileNames"):
2235 if len(self.process.source.fileNames.value()):
2236 ioJson[
'primary']=self.process.source.fileNames.value()
2237 if hasattr(self.process.source,
"secondaryFileNames"):
2238 if len(self.process.source.secondaryFileNames.value()):
2239 ioJson[
'secondary']=self.process.source.secondaryFileNames.value()
2240 if self._options.pileup_input
and (self._options.pileup_input.startswith(
'dbs:')
or self._options.pileup_input.startswith(
'das:')):
2241 ioJson[
'pileup']=self._options.pileup_input[4:]
2242 for (o,om)
in self.process.outputModules_().
items():
2243 ioJson[o]=om.fileName.value()
2244 ioJson[
'GT']=self.process.GlobalTag.globaltag.value()
2245 if self.productionFilterSequence:
2246 ioJson[
'filter']=self.productionFilterSequence
2248 io.write(json.dumps(ioJson))
def load(self, includeFile)
def filesFromOption(self)
def prepare_ENDJOB(self, sequence='endOfProcess')
def prepare_LHE(self, sequence=None)
def prepare_DATAMIX(self, sequence=None)
def expandMapping(self, seqList, mapping, index=None)
def prepare_SIM(self, sequence=None)
def prepare_HARVESTING(self, sequence=None)
def prepare_USER(self, sequence=None)
def prepare_GEN(self, sequence=None)
def loadDefaultOrSpecifiedCFF(self, sequence, defaultCFF)
bool any(const std::vector< T > &v, const T &what)
def massSearchReplaceAnyInputTag(sequence, oldInputTag, newInputTag, verbose=False, moduleLabelOnly=False, skipLabelTest=False)
def prepare_L1REPACK(self, sequence=None)
def finalizeFastSimHLT(self)
def renameInputTagsInSequence(self, sequence, oldT="rawDataCollector", newT="rawDataRepacker")
def prepare_POSTRECO(self, sequence=None)
def replace(string, replacements)
def prepare_REPACK(self, sequence=None)
def doNotInlineEventContent(instance, label="cms.untracked.vstring(process."+theStreamType+"EventContent.outputCommands)")
event content
def customiseEarlyDelete(process)
def prepare_EI(self, sequence=None)
def prepare_RECOBEFMIX(self, sequence="reconstruction")
def prepare_FILTER(self, sequence=None)
def filesFromDASQuery(query, option="", s=None)
def prepare_PATFILTER(self, sequence=None)
def build_production_info(self, evt_type, evtnumber)
def __init__(self, paramSearch, paramReplace, verbose=False, whitelist=())
def visit(visitdir)
Retrieve data from a perf suite output (sub) directory, only examines TimeSize at the moment...
def prepare_L1HwVal(self, sequence='L1HwVal')
def prepare_CFWRITER(self, sequence=None)
def prepare_RAW2DIGI(self, sequence="RawToDigi")
def prepare_DIGIPREMIX(self, sequence=None)
def prepare_RECO(self, sequence="reconstruction")
put the filtering path in the schedule
OutputIterator zip(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
def anyOf(listOfKeys, dict, opt=None)
def addExtraStream(self, name, stream, workflow='full')
def prepare_DQM(self, sequence='DQMOffline')
def prepare_L1Reco(self, sequence="L1Reco")
def renameHLTprocessInSequence(self, sequence, proc=None, HLTprocess='HLT')
def addCustomise(self, unsch=0)
def prepare_DIGIPREMIX_S2(self, sequence=None)
def prepare_ALCAPRODUCER(self, sequence=None)
def prepare_ALCAOUTPUT(self, sequence=None)
def addCustomiseCmdLine(self)
now for a useful command
def scheduleSequence(self, seq, prefix, what='Path')
bool insert(Storage &iStorage, ItemType *iItem, const IdTag &iIdTag)
def prepare_DIGI(self, sequence=None)
def convertToUnscheduled(proc)
def prepare_DIGI2RAW(self, sequence=None)
def loadAndRemember(self, includeFile)
def throwAndSetRandomRun(source, runsAndProbs)
inliner
needs to be in reverse order
def prepare_SKIM(self, sequence="all")
static std::string join(char **cmd)
def prepare_ALCAHARVEST(self, sequence=None)
def dumpPython(process, name)
def prepare_L1TrackTrigger(self, sequence="L1TrackTrigger")
def prepare(self, doChecking=False)
def associatePatAlgosToolsTask(process)
def prepare_ALCA(self, sequence=None, workflow='full')
def prepare_HLT(self, sequence=None)
def __init__(self, options, process=None, with_output=False, with_input=False)
def prepare_VALIDATION(self, sequence='validation')
def prepare_L1(self, sequence=None)
def scheduleSequenceAtEnd(self, seq, prefix)
def filesFromList(fileName, s=None)
def prepare_RAW2RECO(self, sequence=None)
def doIt(self, pset, base)
def completeInputCommand(self)
add the corresponding input content
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run
def executeAndRemember(self, command)
def addStandardSequences(self)
def prepare_PAT(self, sequence="miniAOD")