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(
'dasgoclient %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' 982 self.PATGENDefaultSeq=
'miniGEN' 984 self.EVTCONTDefaultCFF=
"Configuration/EventContent/EventContent_cff" 986 if not self._options.beamspot:
987 self._options.beamspot=VtxSmearedDefaultKey
990 if self._options.isMC==
True:
992 self.
RECODefaultCFF=
"Configuration/StandardSequences/Reconstruction_cff" 993 self.
PATDefaultCFF=
"Configuration/StandardSequences/PATMC_cff" 994 self.PATGENDefaultCFF=
"Configuration/StandardSequences/PATGEN_cff" 995 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineMC_cff" 996 self.
ALCADefaultCFF=
"Configuration/StandardSequences/AlCaRecoStreamsMC_cff" 998 self._options.beamspot =
None 1001 if 'reGEN' in self.stepMap:
1002 self.GENDefaultSeq=
'fixGenInfo' 1004 if self._options.scenario==
'cosmics':
1005 self._options.pileup=
'Cosmics' 1006 self.
DIGIDefaultCFF=
"Configuration/StandardSequences/DigiCosmics_cff" 1007 self.
RECODefaultCFF=
"Configuration/StandardSequences/ReconstructionCosmics_cff" 1008 self.SKIMDefaultCFF=
"Configuration/StandardSequences/SkimsCosmics_cff" 1009 self.EVTCONTDefaultCFF=
"Configuration/EventContent/EventContentCosmics_cff" 1010 self.VALIDATIONDefaultCFF=
"Configuration/StandardSequences/ValidationCosmics_cff" 1011 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineCosmics_cff" 1012 if self._options.isMC==
True:
1013 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineCosmicsMC_cff" 1014 self.HARVESTINGDefaultCFF=
"Configuration/StandardSequences/HarvestingCosmics_cff" 1015 self.RECODefaultSeq=
'reconstructionCosmics' 1016 self.DQMDefaultSeq=
'DQMOfflineCosmics' 1018 if self._options.scenario==
'HeavyIons':
1019 if not self._options.beamspot:
1020 self._options.beamspot=VtxSmearedHIDefaultKey
1021 self.HLTDefaultSeq =
'HIon' 1022 self.VALIDATIONDefaultCFF=
"Configuration/StandardSequences/ValidationHeavyIons_cff" 1023 self.VALIDATIONDefaultSeq=
'' 1024 self.EVTCONTDefaultCFF=
"Configuration/EventContent/EventContentHeavyIons_cff" 1025 self.
RECODefaultCFF=
"Configuration/StandardSequences/ReconstructionHeavyIons_cff" 1026 self.RECODefaultSeq=
'reconstructionHeavyIons' 1027 self.
ALCADefaultCFF =
"Configuration/StandardSequences/AlCaRecoStreamsHeavyIons_cff" 1028 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineHeavyIons_cff" 1029 self.DQMDefaultSeq=
'DQMOfflineHeavyIons' 1030 self.SKIMDefaultCFF=
"Configuration/StandardSequences/SkimsHeavyIons_cff" 1031 self.HARVESTINGDefaultCFF=
"Configuration/StandardSequences/HarvestingHeavyIons_cff" 1032 if self._options.isMC==
True:
1033 self.DQMOFFLINEDefaultCFF=
"DQMOffline/Configuration/DQMOfflineHeavyIonsMC_cff" 1036 self.RAW2RECODefaultSeq=
','.
join([self.RAW2DIGIDefaultSeq,self.RECODefaultSeq])
1038 self.USERDefaultSeq=
'user' 1039 self.USERDefaultCFF=
None 1042 if self._options.isData:
1043 if self._options.magField==defaultOptions.magField:
1044 print "magnetic field option forced to: AutoFromDBCurrent" 1045 self._options.magField=
'AutoFromDBCurrent' 1046 self.magFieldCFF =
'Configuration/StandardSequences/MagneticField_'+self._options.magField.replace(
'.',
'')+
'_cff' 1047 self.magFieldCFF = self.magFieldCFF.replace(
"__",
'_')
1050 self.GeometryCFF=
'Configuration/StandardSequences/GeometryRecoDB_cff' 1051 self.geometryDBLabel=
None 1053 if self._options.fast:
1054 if 'start' in self._options.conditions.lower():
1055 self.GeometryCFF=
'FastSimulation/Configuration/Geometries_START_cff' 1057 self.GeometryCFF=
'FastSimulation/Configuration/Geometries_MC_cff' 1060 from Configuration.StandardSequences.GeometryConf
import GeometryConf
1061 if opt
in GeometryConf:
1062 return GeometryConf[opt]
1066 geoms=self._options.geometry.split(
',')
1070 if '/' in geoms[1]
or '_cff' in geoms[1]:
1071 self.GeometryCFF=geoms[1]
1073 self.GeometryCFF=
'Configuration/Geometry/Geometry'+geoms[1]+
'_cff' 1075 if (geoms[0].startswith(
'DB:')):
1076 self.SimGeometryCFF=
'Configuration/StandardSequences/GeometrySimDB_cff' 1077 self.geometryDBLabel=geoms[0][3:]
1080 if '/' in geoms[0]
or '_cff' in geoms[0]:
1081 self.SimGeometryCFF=geoms[0]
1083 simGeometry=geoms[0]
1084 if self._options.gflash==
True:
1085 self.SimGeometryCFF=
'Configuration/Geometry/Geometry'+geoms[0]+
'GFlash_cff' 1087 self.SimGeometryCFF=
'Configuration/Geometry/Geometry'+geoms[0]+
'_cff' 1090 if simGeometry
not in defaultOptions.geometryExtendedOptions:
1091 self.
SIMDefaultCFF=
"Configuration/StandardSequences/SimIdeal_cff" 1093 if self._options.scenario==
'nocoll' or self._options.scenario==
'cosmics':
1094 self.
SIMDefaultCFF=
"Configuration/StandardSequences/SimNOBEAM_cff" 1095 self._options.beamspot=
'NoSmear' 1098 if self._options.fast:
1099 self.
SIMDefaultCFF =
'FastSimulation.Configuration.SimIdeal_cff' 1100 self.
RECODefaultCFF=
'FastSimulation.Configuration.Reconstruction_AftMix_cff' 1101 self.RECOBEFMIXDefaultCFF =
'FastSimulation.Configuration.Reconstruction_BefMix_cff' 1102 self.RECOBEFMIXDefaultSeq =
'reconstruction_befmix' 1103 self.DQMOFFLINEDefaultCFF=
"FastSimulation.Configuration.DQMOfflineMC_cff" 1106 if self._options.pileup==
'default':
1107 from Configuration.StandardSequences.Mixing
import MixingDefaultKey
1108 self._options.pileup=MixingDefaultKey
1112 if self._options.isData:
1113 self._options.pileup=
None 1116 self.REDIGIDefaultSeq=self.DIGIDefaultSeq
1121 output = cms.OutputModule(
"PoolOutputModule")
1122 if stream.selectEvents.parameters_().__len__()!=0:
1123 output.SelectEvents = stream.selectEvents
1125 output.SelectEvents = cms.untracked.PSet()
1126 output.SelectEvents.SelectEvents=cms.vstring()
1127 if isinstance(stream.paths,tuple):
1128 for path
in stream.paths:
1129 output.SelectEvents.SelectEvents.append(path.label())
1131 output.SelectEvents.SelectEvents.append(stream.paths.label())
1135 if isinstance(stream.content,str):
1136 evtPset=getattr(self.process,stream.content)
1137 for p
in evtPset.parameters_():
1138 setattr(output,p,getattr(evtPset,p))
1139 if not self._options.inlineEventContent:
1142 output.outputCommands.__dict__[
"dumpPython"] = doNotInlineEventContent
1144 output.outputCommands = stream.content
1147 output.fileName = cms.untracked.string(self._options.dirout+stream.name+
'.root')
1149 output.dataset = cms.untracked.PSet( dataTier = stream.dataTier,
1150 filterName = cms.untracked.string(stream.name))
1152 if self._options.filtername:
1153 output.dataset.filterName= cms.untracked.string(self._options.filtername+
"_"+stream.name)
1156 output.eventAutoFlushCompressedSize=cms.untracked.int32(5*1024*1024)
1158 if workflow
in (
"producers,full"):
1159 if isinstance(stream.paths,tuple):
1160 for path
in stream.paths:
1161 self.schedule.append(path)
1163 self.schedule.append(stream.paths)
1167 if (
not self._options.relval)
and workflow
in (
"full",
"output"):
1168 self.additionalOutputs[name] = output
1169 setattr(self.process,name,output)
1171 if workflow ==
'output':
1173 filterList = output.SelectEvents.SelectEvents
1174 for i, filter
in enumerate(filterList):
1175 filterList[i] = filter+
":"+self._options.triggerResultsProcess
1185 if ( len(sequence.split(
'.'))==1 ):
1187 elif ( len(sequence.split(
'.'))==2 ):
1189 sequence=sequence.split(
'.')[1]
1191 print "sub sequence configuration must be of the form dir/subdir/cff.a+b+c or cff.a" 1192 print sequence,
"not recognized" 1199 for i,s
in enumerate(seq.split(
'*')):
1201 setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, s) ))
1203 p=getattr(self.process,prefix)
1204 p+=getattr(self.process, s)
1205 self.schedule.append(getattr(self.process,prefix))
1210 if self.nextScheduleIsConditional:
1211 self.conditionalPaths.append(prefix)
1212 setattr(self.process,prefix,getattr(cms,what)( getattr(self.process, seq) ))
1213 self.schedule.append(getattr(self.process,prefix))
1215 for i,s
in enumerate(seq.split(
'+')):
1217 setattr(self.process,sn,getattr(cms,what)( getattr(self.process, s) ))
1218 self.schedule.append(getattr(self.process,sn))
1232 """ Enrich the process with alca streams """ 1234 sequence = sequence.split(
'.')[-1]
1237 alcaList = sequence.split(
"+")
1239 from Configuration.AlCa.autoAlca
import autoAlca
1243 for name
in alcaConfig.__dict__:
1244 alcastream = getattr(alcaConfig,name)
1245 shortName = name.replace(
'ALCARECOStream',
'')
1246 if shortName
in alcaList
and isinstance(alcastream,cms.FilteredStream):
1247 output = self.
addExtraStream(name,alcastream, workflow = workflow)
1248 self.
executeAndRemember(
'process.ALCARECOEventContent.outputCommands.extend(process.OutALCARECO'+shortName+
'_noDrop.outputCommands)')
1249 self.AlCaPaths.append(shortName)
1250 if 'DQM' in alcaList:
1251 if not self._options.inlineEventContent
and hasattr(self.process,name):
1252 self.
executeAndRemember(
'process.' + name +
'.outputCommands.append("keep *_MEtoEDMConverter_*_*")')
1254 output.outputCommands.append(
"keep *_MEtoEDMConverter_*_*")
1257 if self._options.hltProcess
or 'HLT' in self.stepMap:
1258 if isinstance(alcastream.paths,tuple):
1259 for path
in alcastream.paths:
1264 for i
in range(alcaList.count(shortName)):
1265 alcaList.remove(shortName)
1268 elif name ==
'pathALCARECODQM' and 'DQM' in alcaList:
1269 path = getattr(alcaConfig,name)
1270 self.schedule.append(path)
1271 alcaList.remove(
'DQM')
1273 if isinstance(alcastream,cms.Path):
1275 self.blacklist_paths.append(alcastream)
1278 if len(alcaList) != 0:
1280 for name
in alcaConfig.__dict__:
1281 alcastream = getattr(alcaConfig,name)
1282 if isinstance(alcastream,cms.FilteredStream):
1283 available.append(name.replace(
'ALCARECOStream',
''))
1284 print "The following alcas could not be found "+
str(alcaList)
1285 print "available ",available
1287 raise Exception(
"The following alcas could not be found "+
str(alcaList))
1292 loadFragment = self._options.evt_type.replace(
'.py',
'',).
replace(
'.',
'_').
replace(
'python/',
'').
replace(
'/',
'.')
1293 print "Loading lhe fragment from",loadFragment
1294 __import__(loadFragment)
1295 self.process.load(loadFragment)
1297 self._options.inlineObjets+=
','+sequence
1299 getattr(self.process,sequence).nEvents =
int(self._options.number)
1302 self.process.lhe_step = cms.Path( getattr( self.process,sequence) )
1303 self.excludedPaths.append(
"lhe_step")
1304 self.schedule.append( self.process.lhe_step )
1307 """ load the fragment of generator configuration """ 1312 loadFragment = self._options.evt_type.replace(
'.py',
'',).
replace(
'.',
'_').
replace(
'python/',
'')
1314 if not '/' in loadFragment:
1315 loadFragment=
'Configuration.Generator.'+loadFragment
1317 loadFragment=loadFragment.replace(
'/',
'.')
1319 print "Loading generator fragment from",loadFragment
1320 __import__(loadFragment)
1324 if not (self._options.filein
or self._options.dasquery):
1325 raise Exception(
"Neither gen fragment of input files provided: this is an inconsistent GEN step configuration")
1328 generatorModule=sys.modules[loadFragment]
1329 genModules=generatorModule.__dict__
1332 if self.LHEDefaultSeq
in genModules:
1333 del genModules[self.LHEDefaultSeq]
1335 if self._options.hideGen:
1336 self.loadAndRemember(loadFragment)
1338 self.process.load(loadFragment)
1340 import FWCore.ParameterSet.Modules
as cmstypes
1341 for name
in genModules:
1342 theObject = getattr(generatorModule,name)
1343 if isinstance(theObject, cmstypes._Module):
1344 self._options.inlineObjets=name+
','+self._options.inlineObjets
1345 elif isinstance(theObject, cms.Sequence)
or isinstance(theObject, cmstypes.ESProducer):
1346 self._options.inlineObjets+=
','+name
1348 if sequence == self.GENDefaultSeq
or sequence ==
'pgen_genonly':
1349 if 'ProductionFilterSequence' in genModules
and (
'generator' in genModules):
1350 self.productionFilterSequence =
'ProductionFilterSequence' 1351 elif 'generator' in genModules:
1352 self.productionFilterSequence =
'generator' 1354 """ Enrich the schedule with the rest of the generation step """ 1355 self.loadDefaultOrSpecifiedCFF(sequence,self.GENDefaultCFF)
1356 genSeqName=sequence.split(
'.')[-1]
1360 from Configuration.StandardSequences.VtxSmeared
import VtxSmeared
1361 cffToBeLoaded=VtxSmeared[self._options.beamspot]
1362 self.loadAndRemember(cffToBeLoaded)
1364 raise Exception(
"VertexSmearing type or beamspot "+self._options.beamspot+
" unknown.")
1366 if self._options.scenario ==
'HeavyIons':
1367 if self._options.pileup==
'HiMixGEN':
1368 self.loadAndRemember(
"Configuration/StandardSequences/GeneratorMix_cff")
1370 self.loadAndRemember(
"Configuration/StandardSequences/GeneratorHI_cff")
1372 self.process.generation_step = cms.Path( getattr(self.process,genSeqName) )
1373 self.schedule.append(self.process.generation_step)
1376 self.executeAndRemember(
'process.genstepfilter.triggerConditions=cms.vstring("generation_step")')
1378 if 'reGEN' in self.stepMap:
1382 """ Enrich the schedule with the summary of the filter step """ 1384 self.loadAndRemember(
"GeneratorInterface/Core/genFilterSummary_cff")
1385 self.scheduleSequenceAtEnd(
'genFilterSummary',
'genfiltersummary_step')
1389 """ Enrich the schedule with the simulation step""" 1390 self.loadDefaultOrSpecifiedCFF(sequence,self.SIMDefaultCFF)
1391 if not self._options.fast:
1392 if self._options.gflash==
True:
1393 self.loadAndRemember(
"Configuration/StandardSequences/GFlashSIM_cff")
1395 if self._options.magField==
'0T':
1396 self.executeAndRemember(
"process.g4SimHits.UseMagneticField = cms.bool(False)")
1398 if self._options.magField==
'0T':
1399 self.executeAndRemember(
"process.famosSimHits.UseMagneticField = cms.bool(False)")
1401 self.scheduleSequence(sequence.split(
'.')[-1],
'simulation_step')
1405 """ Enrich the schedule with the digitisation step""" 1408 if self._options.gflash==
True:
1409 self.
loadAndRemember(
"Configuration/StandardSequences/GFlashDIGI_cff")
1411 if sequence ==
'pdigi_valid' or sequence ==
'pdigi_hi':
1412 self.
executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersValid)")
1414 if sequence !=
'pdigi_nogen' and sequence !=
'pdigi_valid_nogen' and not self.process.source.type_()==
'EmptySource':
1415 if self._options.inputEventContent==
'':
1416 self._options.inputEventContent=
'REGEN' 1418 self._options.inputEventContent=self._options.inputEventContent+
',REGEN' 1425 """ Enrich the schedule with the digitisation step""" 1430 if sequence ==
'pdigi_valid':
1431 self.
executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersNoNoiseValid)")
1433 self.
executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersNoNoise)")
1439 """ Enrich the schedule with the digitisation step""" 1440 self.loadDefaultOrSpecifiedCFF(sequence,self.DIGIDefaultCFF)
1442 self.loadAndRemember(
"SimGeneral/MixingModule/digi_MixPreMix_cfi")
1445 if sequence ==
'pdigi_valid':
1446 self.executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersMixPreMixValid)")
1448 self.executeAndRemember(
"process.mix.digitizers = cms.PSet(process.theDigitizersMixPreMix)")
1450 self.scheduleSequence(sequence.split(
'.')[-1],
'digitisation_step')
1454 """ Enrich the schedule with the crossing frame writer step""" 1460 """ Enrich the schedule with the digitisation step""" 1464 if self._options.pileup_input:
1466 if self._options.pileup_input.startswith(
'dbs:')
or self._options.pileup_input.startswith(
'das:'):
1467 theFiles=
filesFromDASQuery(
'file dataset = %s'%(self._options.pileup_input[4:],),self._options.pileup_dasoption)[0]
1468 elif self._options.pileup_input.startswith(
"filelist:"):
1469 theFiles= (
filesFromList(self._options.pileup_input[9:]))[0]
1471 theFiles=self._options.pileup_input.split(
',')
1473 self.
executeAndRemember(
"process.mixData.input.fileNames = cms.untracked.vstring(%s)"%( theFiles ) )
1480 if "DIGIPREMIX" in self.stepMap.keys():
1482 self.
executeAndRemember(
"process.SiStripDigiToRaw.FedReadoutMode = cms.string('PREMIX_RAW')")
1492 """ Enrich the schedule with the L1 simulation step""" 1493 assert(sequence ==
None)
1499 """ 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""" 1500 supported = [
'GT',
'GT1',
'GT2',
'GCTGT',
'Full',
'FullSimTP',
'FullMC',
'Full2015Data',
'uGT']
1501 if sequence
in supported:
1502 self.loadAndRemember(
'Configuration/StandardSequences/SimL1EmulatorRepack_%s_cff'%sequence)
1503 if self._options.scenario ==
'HeavyIons':
1504 self.renameInputTagsInSequence(
"SimL1Emulator",
"rawDataCollector",
"rawDataRepacker")
1505 self.scheduleSequence(
'SimL1Emulator',
'L1RePack_step')
1507 print "L1REPACK with '",sequence,
"' is not supported! Supported choices are: ",supported
1512 """ Enrich the schedule with the HLT simulation step""" 1514 print "no specification of the hlt menu has been given, should never happen" 1515 raise Exception(
'no HLT sequence provided')
1519 from Configuration.HLT.autoHLT
import autoHLT
1522 sequence = autoHLT[key]
1524 raise ValueError(
'no HLT mapping key "%s" found in autoHLT' % key)
1530 if self._options.scenario ==
'HeavyIons':
1531 optionsForHLT[
'type'] =
'HIon' 1533 optionsForHLT[
'type'] =
'GRun' 1534 optionsForHLTConfig =
', '.
join(
'%s=%s' % (key, repr(val))
for (key, val)
in optionsForHLT.iteritems())
1535 if sequence ==
'run,fromSource':
1536 if hasattr(self.process.source,
'firstRun'):
1537 self.
executeAndRemember(
'process.loadHltConfiguration("run:%%d"%%(process.source.firstRun.value()),%s)'%(optionsForHLTConfig))
1538 elif hasattr(self.process.source,
'setRunNumber'):
1539 self.
executeAndRemember(
'process.loadHltConfiguration("run:%%d"%%(process.source.setRunNumber.value()),%s)'%(optionsForHLTConfig))
1541 raise Exception(
'Cannot replace menu to load %s'%(sequence))
1543 self.
executeAndRemember(
'process.loadHltConfiguration("%s",%s)'%(sequence.replace(
',',
':'),optionsForHLTConfig))
1547 if self._options.isMC:
1548 self._options.customisation_file.append(
"HLTrigger/Configuration/customizeHLTforMC.customizeHLTforMC")
1550 if self._options.name !=
'HLT':
1551 self.additionalCommands.append(
'from HLTrigger.Configuration.CustomConfigs import ProcessName')
1552 self.additionalCommands.append(
'process = ProcessName(process)')
1553 self.additionalCommands.append(
'')
1554 from HLTrigger.Configuration.CustomConfigs
import ProcessName
1557 self.schedule.append(self.process.HLTSchedule)
1558 [self.blacklist_paths.append(path)
for path
in self.process.HLTSchedule
if isinstance(path,(cms.Path,cms.EndPath))]
1561 if self._options.fast:
1562 if not hasattr(self.process,
'HLTEndSequence'):
1563 self.
executeAndRemember(
"process.HLTEndSequence = cms.Sequence( process.dummyModule )")
1568 seqReco=sequence.split(
',')[1]
1569 seqDigi=sequence.split(
',')[0]
1571 print "RAW2RECO requires two specifications",sequence,
"insufficient" 1585 self.
loadAndRemember(
"PhysicsTools/PatAlgos/slimming/metFilterPaths_cff")
1587 for filt
in allMetFilterPaths:
1588 self.schedule.append(getattr(self.process,
'Flag_'+filt))
1591 ''' Enrich the schedule with L1 HW validation ''' 1594 print '\n\n\n DEPRECATED this has no action \n\n\n' 1598 ''' Enrich the schedule with L1 reconstruction ''' 1604 ''' Enrich the schedule with L1 reconstruction ''' 1610 ''' Enrich the schedule with a user defined filter sequence ''' 1612 filterConfig=self.load(sequence.split(
'.')[0])
1613 filterSeq=sequence.split(
'.')[-1]
1621 label=visitee.label()
1629 getattr(self.process,filterSeq).
visit( expander )
1630 self._options.inlineObjets+=
','+expander.inliner
1631 self._options.inlineObjets+=
','+filterSeq
1634 self.scheduleSequence(filterSeq,
'filtering_step')
1635 self.nextScheduleIsConditional=
True 1637 self.productionFilterSequence = filterSeq
1642 ''' Enrich the schedule with reconstruction ''' 1648 ''' Enrich the schedule with the part of reconstruction that is done before mixing in FastSim''' 1649 if not self._options.fast:
1650 print "ERROR: this step is only implemented for FastSim" 1653 self.
scheduleSequence(sequence.split(
'.')[-1],
'reconstruction_befmix_step')
1657 ''' Enrich the schedule with PAT ''' 1660 self.labelsToAssociate.append(
'patTask')
1661 if not self._options.runUnscheduled:
1662 raise Exception(
"MiniAOD production can only run in unscheduled mode, please run cmsDriver with --runUnscheduled")
1663 if self._options.isData:
1664 self._options.customisation_file_unsch.insert(0,
"PhysicsTools/PatAlgos/slimming/miniAOD_tools.miniAOD_customizeAllData")
1666 self._options.customisation_file_unsch.insert(0,
"PhysicsTools/PatAlgos/slimming/miniAOD_tools.miniAOD_customizeAllMC")
1667 if self._options.fast:
1668 self._options.customisation_file_unsch.insert(1,
"PhysicsTools/PatAlgos/slimming/metFilterPaths_cff.miniAOD_customizeMETFiltersFastSim")
1670 if self._options.hltProcess:
1671 if len(self._options.customise_commands) > 1:
1672 self._options.customise_commands = self._options.customise_commands +
" \n" 1673 self._options.customise_commands = self._options.customise_commands +
"process.patTrigger.processName = \""+self._options.hltProcess+
"\"\n" 1674 self._options.customise_commands = self._options.customise_commands +
"process.slimmedPatTrigger.triggerResults= cms.InputTag( 'TriggerResults::"+self._options.hltProcess+
"' )\n" 1681 ''' Enrich the schedule with PATGEN ''' 1683 self.labelsToAssociate.append(
'patGENTask')
1684 if not self._options.runUnscheduled:
1685 raise Exception(
"MiniGEN production can only run in unscheduled mode, please run cmsDriver with --runUnscheduled")
1686 if self._options.isData:
1687 raise Exception(
"PATGEN step can only run on MC")
1691 ''' Enrich the schedule with event interpretation ''' 1692 from Configuration.StandardSequences.EventInterpretation
import EventInterpretation
1693 if sequence
in EventInterpretation:
1694 self.EIDefaultCFF = EventInterpretation[sequence]
1695 sequence =
'EIsequence' 1697 raise Exception(
'Cannot set %s event interpretation'%( sequence) )
1698 self.loadDefaultOrSpecifiedCFF(sequence,self.EIDefaultCFF)
1699 self.scheduleSequence(sequence.split(
'.')[-1],
'eventinterpretaion_step')
1703 ''' Enrich the schedule with skimming fragments''' 1705 sequence = sequence.split(
'.')[-1]
1707 skimlist=sequence.split(
'+')
1709 from Configuration.Skimming.autoSkim
import autoSkim
1713 for skim
in skimConfig.__dict__:
1714 skimstream = getattr(skimConfig,skim)
1715 if isinstance(skimstream,cms.Path):
1717 self.blacklist_paths.append(skimstream)
1718 if (
not isinstance(skimstream,cms.FilteredStream)):
1720 shortname = skim.replace(
'SKIMStream',
'')
1721 if (sequence==
"all"):
1723 elif (shortname
in skimlist):
1726 if self._options.datatier==
'DQM':
1727 self.process.load(self.EVTCONTDefaultCFF)
1728 skimstreamDQM = cms.FilteredStream(
1729 responsible = skimstream.responsible,
1730 name = skimstream.name+
'DQM',
1731 paths = skimstream.paths,
1732 selectEvents = skimstream.selectEvents,
1733 content = self._options.datatier+
'EventContent',
1734 dataTier = cms.untracked.string(self._options.datatier)
1737 for i
in range(skimlist.count(shortname)):
1738 skimlist.remove(shortname)
1742 if (skimlist.__len__()!=0
and sequence!=
"all"):
1743 print 'WARNING, possible typo with SKIM:'+
'+'.
join(skimlist)
1744 raise Exception(
'WARNING, possible typo with SKIM:'+
'+'.
join(skimlist))
1747 ''' Enrich the schedule with a user defined sequence ''' 1753 """ Enrich the schedule with the postreco step """ 1760 print sequence,
"in preparing validation" 1762 from Validation.Configuration.autoValidation
import autoValidation
1764 sequence=sequence.split(
'.')[-1]
1765 if sequence.find(
',')!=-1:
1766 prevalSeqName=sequence.split(
',')[0].
split(
'+')
1767 valSeqName=sequence.split(
',')[1].
split(
'+')
1772 prevalSeqName=sequence.split(
'+')
1773 valSeqName=sequence.split(
'+')
1779 postfix=
'_'+sequence
1780 prevalSeqName=[
'prevalidation'+postfix]
1781 valSeqName=[
'validation'+postfix]
1782 if not hasattr(self.process,valSeqName[0]):
1784 valSeqName=[sequence]
1795 if (
'HLT' in self.stepMap
and not self._options.fast)
or self._options.hltProcess:
1796 for s
in valSeqName+prevalSeqName:
1799 for (i,s)
in enumerate(prevalSeqName):
1801 setattr(self.process,
'prevalidation_step%s'%NFI(i), cms.Path( getattr(self.process, s)) )
1802 self.schedule.append(getattr(self.process,
'prevalidation_step%s'%NFI(i)))
1804 for (i,s)
in enumerate(valSeqName):
1805 setattr(self.process,
'validation_step%s'%NFI(i), cms.EndPath( getattr(self.process, s)))
1806 self.schedule.append(getattr(self.process,
'validation_step%s'%NFI(i)))
1809 if 'PAT' in self.stepMap
and not 'RECO' in self.stepMap:
1812 if not 'DIGI' in self.stepMap
and not self._options.fast
and not any(
map(
lambda s : s.startswith(
'genvalid'), valSeqName)):
1813 if self._options.restoreRNDSeeds==
False and not self._options.restoreRNDSeeds==
True:
1814 self._options.restoreRNDSeeds=
True 1816 if not 'DIGI' in self.stepMap
and not self._options.fast:
1820 self._options.customisation_file.append(
"SimGeneral/MixingModule/fullMixCustomize_cff.setCrossingFrameOn")
1822 if hasattr(self.process,
"genstepfilter")
and len(self.process.genstepfilter.triggerConditions):
1824 for (i,s)
in enumerate(valSeqName):
1825 getattr(self.process,
'validation_step%s'%NFI(i))._seq = self.process.genstepfilter * getattr(self.process,
'validation_step%s'%NFI(i))._seq
1831 """Visitor that travels within a cms.Sequence, looks for a parameter and replace its value 1832 It will climb down within PSets, VPSets and VInputTags to find its target""" 1833 def __init__(self, paramSearch, paramReplace, verbose=False, whitelist=()):
1840 if isinstance(pset, cms._Parameterizable):
1841 for name
in pset.parameters_().
keys():
1847 value = getattr(pset,name)
1848 type = value.pythonTypeName()
1849 if type
in (
'cms.PSet',
'cms.untracked.PSet'):
1850 self.
doIt(value,base+
"."+name)
1851 elif type
in (
'cms.VPSet',
'cms.untracked.VPSet'):
1852 for (i,ps)
in enumerate(value): self.
doIt(ps,
"%s.%s[%d]"%(base,name,i) )
1853 elif type
in (
'cms.string',
'cms.untracked.string'):
1855 if self.
_verbose:
print "set string process name %s.%s %s ==> %s"% (base, name, value, self.
_paramReplace)
1857 elif type
in (
'cms.VInputTag',
'cms.untracked.VInputTag'):
1858 for (i,n)
in enumerate(value):
1859 if not isinstance(n, cms.InputTag):
1863 if self.
_verbose:
print "set process name %s.%s[%d] %s ==> %s " % (base, name, i, n, self.
_paramReplace)
1866 elif type
in (
'cms.vstring',
'cms.untracked.vstring'):
1867 for (i,n)
in enumerate(value):
1870 elif type
in (
'cms.InputTag',
'cms.untracked.InputTag'):
1872 if self.
_verbose:
print "set process name %s.%s %s ==> %s " % (base, name, value, self.
_paramReplace)
1873 setattr(getattr(pset, name),
"processName",self.
_paramReplace)
1878 label = visitee.label()
1879 except AttributeError:
1880 label =
'<Module not in a Process>' 1882 label =
'other execption' 1883 self.
doIt(visitee, label)
1890 print "Replacing all InputTag %s => %s"%(oldT,newT)
1893 loadMe=
'from PhysicsTools.PatAlgos.tools.helpers import massSearchReplaceAnyInputTag' 1894 if not loadMe
in self.additionalCommands:
1895 self.additionalCommands.append(loadMe)
1896 self.additionalCommands.append(
'massSearchReplaceAnyInputTag(process.%s,"%s","%s",False,True)'%(sequence,oldT,newT))
1900 if self._options.hltProcess:
1901 proc=self._options.hltProcess
1903 proc=self.process.name_()
1904 if proc==HLTprocess:
return 1906 print "replacing %s process name - sequence %s will use '%s'" % (HLTprocess,sequence, proc)
1908 if 'from Configuration.Applications.ConfigBuilder import ConfigBuilder' not in self.additionalCommands:
1909 self.additionalCommands.append(
'from Configuration.Applications.ConfigBuilder import ConfigBuilder')
1910 self.additionalCommands.append(
'process.%s.visit(ConfigBuilder.MassSearchReplaceProcessNameVisitor("%s", "%s", whitelist = ("subSystemFolder",)))'% (sequence,HLTprocess, proc))
1916 while '@' in repr(seqList)
and level<maxLevel:
1918 for specifiedCommand
in seqList:
1919 if specifiedCommand.startswith(
'@'):
1920 location=specifiedCommand[1:]
1921 if not location
in mapping:
1922 raise Exception(
"Impossible to map "+location+
" from "+repr(mapping))
1923 mappedTo=mapping[location]
1925 mappedTo=mappedTo[index]
1926 seqList.remove(specifiedCommand)
1927 seqList.extend(mappedTo.split(
'+'))
1930 raise Exception(
"Could not fully expand "+repr(seqList)+
" from "+repr(mapping))
1936 sequenceList=sequence.split(
'.')[-1].
split(
'+')
1937 postSequenceList=sequence.split(
'.')[-1].
split(
'+')
1938 from DQMOffline.Configuration.autoDQM
import autoDQM
1942 if len(set(sequenceList))!=len(sequenceList):
1943 sequenceList=
list(set(sequenceList))
1944 print "Duplicate entries for DQM:, using",sequenceList
1946 pathName=
'dqmoffline_step' 1947 for (i,sequence)
in enumerate(sequenceList):
1949 pathName=
'dqmoffline_%d_step'%(i)
1951 if 'HLT' in self.stepMap.keys()
or self._options.hltProcess:
1954 setattr(self.process,pathName, cms.EndPath( getattr(self.process,sequence ) ) )
1955 self.schedule.append(getattr(self.process,pathName))
1957 if hasattr(self.process,
"genstepfilter")
and len(self.process.genstepfilter.triggerConditions):
1959 getattr(self.process,pathName).
insert(0,self.process.genstepfilter)
1961 pathName=
'dqmofflineOnPAT_step' 1962 for (i,sequence)
in enumerate(postSequenceList):
1964 pathName=
'dqmofflineOnPAT_%d_step'%(i)
1966 setattr(self.process,pathName, cms.EndPath( getattr(self.process, sequence ) ) )
1967 self.schedule.append(getattr(self.process,pathName))
1970 """ Enrich the process with harvesting step """ 1971 self.
DQMSaverCFF=
'Configuration/StandardSequences/DQMSaver'+self._options.harvesting+
'_cff' 1975 sequence = sequence.split(
'.')[-1]
1978 harvestingList = sequence.split(
"+")
1979 from DQMOffline.Configuration.autoDQM
import autoDQM
1980 from Validation.Configuration.autoValidation
import autoValidation
1982 combined_mapping = copy.deepcopy( autoDQM )
1983 combined_mapping.update( autoValidation )
1984 self.
expandMapping(harvestingList,combined_mapping,index=-1)
1986 if len(set(harvestingList))!=len(harvestingList):
1987 harvestingList=
list(set(harvestingList))
1988 print "Duplicate entries for HARVESTING, using",harvestingList
1990 for name
in harvestingList:
1991 if not name
in harvestingConfig.__dict__:
1992 print name,
"is not a possible harvesting type. Available are",harvestingConfig.__dict__.keys()
1994 harvestingstream = getattr(harvestingConfig,name)
1995 if isinstance(harvestingstream,cms.Path):
1996 self.schedule.append(harvestingstream)
1997 self.blacklist_paths.append(harvestingstream)
1998 if isinstance(harvestingstream,cms.Sequence):
1999 setattr(self.process,name+
"_step",cms.Path(harvestingstream))
2000 self.schedule.append(getattr(self.process,name+
"_step"))
2006 """ Enrich the process with AlCaHarvesting step """ 2008 sequence=sequence.split(
".")[-1]
2011 harvestingList = sequence.split(
"+")
2015 from Configuration.AlCa.autoPCL
import autoPCL
2018 for name
in harvestingConfig.__dict__:
2019 harvestingstream = getattr(harvestingConfig,name)
2020 if name
in harvestingList
and isinstance(harvestingstream,cms.Path):
2021 self.schedule.append(harvestingstream)
2022 self.
executeAndRemember(
"process.PoolDBOutputService.toPut.append(process.ALCAHARVEST" + name +
"_dbOutput)")
2023 self.
executeAndRemember(
"process.pclMetadataWriter.recordsToMap.append(process.ALCAHARVEST" + name +
"_metadata)")
2024 harvestingList.remove(name)
2026 lastStep = getattr(harvestingConfig,
"ALCAHARVESTDQMSaveAndMetadataWriter")
2027 self.schedule.append(lastStep)
2029 if len(harvestingList) != 0
and 'dummyHarvesting' not in harvestingList :
2030 print "The following harvesting could not be found : ", harvestingList
2031 raise Exception(
"The following harvesting could not be found : "+
str(harvestingList))
2041 self.process.reconstruction = cms.Path(self.process.reconstructionWithFamos)
2042 self.schedule.append(self.process.reconstruction)
2046 """ Add useful info for the production. """ 2047 self.process.configurationMetadata=cms.untracked.PSet\
2048 (version=cms.untracked.string(
"$Revision: 1.19 $"),
2049 name=cms.untracked.string(
"Applications"),
2050 annotation=cms.untracked.string(evt_type+
" nevts:"+
str(evtnumber))
2053 self.addedObjects.append((
"Production Info",
"configurationMetadata"))
2057 """ Prepare the configuration string and add missing pieces.""" 2069 outputModuleCfgCode=
"" 2070 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:
2075 self.pythonCfgCode =
"# Auto generated configuration file\n" 2076 self.pythonCfgCode +=
"# using: \n# "+__version__[1:-1]+
"\n# "+__source__[1:-1]+
'\n' 2077 self.pythonCfgCode +=
"# with command line options: "+self._options.arguments+
'\n' 2078 self.pythonCfgCode +=
"import FWCore.ParameterSet.Config as cms\n\n" 2079 if hasattr(self.
_options,
"era")
and self._options.era :
2080 self.pythonCfgCode +=
"from Configuration.StandardSequences.Eras import eras\n\n" 2081 self.pythonCfgCode +=
"process = cms.Process('"+self.process.name_()+
"'" 2083 for requestedEra
in self._options.era.split(
",") :
2084 self.pythonCfgCode +=
",eras."+requestedEra
2085 self.pythonCfgCode +=
")\n\n" 2087 self.pythonCfgCode +=
"process = cms.Process('"+self.process.name_()+
"')\n\n" 2089 self.pythonCfgCode +=
"# import of standard configurations\n" 2090 for module
in self.imports:
2091 self.pythonCfgCode += (
"process.load('"+module+
"')\n")
2094 if not hasattr(self.process,
"configurationMetadata"):
2098 self.addedObjects.append((
"Production Info",
"configurationMetadata"))
2100 self.pythonCfgCode +=
"\n" 2101 for comment,object
in self.addedObjects:
2103 self.pythonCfgCode +=
"\n# "+comment+
"\n" 2104 self.pythonCfgCode +=
dumpPython(self.process,object)
2107 self.pythonCfgCode +=
"\n# Output definition\n" 2108 self.pythonCfgCode += outputModuleCfgCode
2111 self.pythonCfgCode +=
"\n# Additional output definition\n" 2113 nl=self.additionalOutputs.keys()
2116 output = self.additionalOutputs[name]
2117 self.pythonCfgCode +=
"process.%s = %s" %(name, output.dumpPython())
2118 tmpOut = cms.EndPath(output)
2119 setattr(self.process,name+
'OutPath',tmpOut)
2120 self.schedule.append(tmpOut)
2123 self.pythonCfgCode +=
"\n# Other statements\n" 2124 for command
in self.additionalCommands:
2125 self.pythonCfgCode += command +
"\n" 2128 for object
in self._options.inlineObjets.split(
','):
2131 if not hasattr(self.process,object):
2132 print 'cannot inline -'+object+
'- : not known' 2134 self.pythonCfgCode +=
'\n' 2135 self.pythonCfgCode +=
dumpPython(self.process,object)
2138 self.pythonCfgCode +=
"\n# Path and EndPath definitions\n" 2139 for path
in self.process.paths:
2140 if getattr(self.process,path)
not in self.blacklist_paths:
2141 self.pythonCfgCode +=
dumpPython(self.process,path)
2143 for endpath
in self.process.endpaths:
2144 if getattr(self.process,endpath)
not in self.blacklist_paths:
2145 self.pythonCfgCode +=
dumpPython(self.process,endpath)
2148 self.pythonCfgCode +=
"\n# Schedule definition\n" 2149 result =
"process.schedule = cms.Schedule(" 2152 self.process.schedule = cms.Schedule()
2153 for item
in self.schedule:
2154 if not isinstance(item, cms.Schedule):
2155 self.process.schedule.append(item)
2157 self.process.schedule.extend(item)
2159 if hasattr(self.process,
"HLTSchedule"):
2160 beforeHLT = self.schedule[:self.schedule.index(self.process.HLTSchedule)]
2161 afterHLT = self.schedule[self.schedule.index(self.process.HLTSchedule)+1:]
2162 pathNames = [
'process.'+p.label_()
for p
in beforeHLT]
2163 result +=
','.
join(pathNames)+
')\n' 2164 result +=
'process.schedule.extend(process.HLTSchedule)\n' 2165 pathNames = [
'process.'+p.label_()
for p
in afterHLT]
2166 result +=
'process.schedule.extend(['+
','.
join(pathNames)+
'])\n' 2168 pathNames = [
'process.'+p.label_()
for p
in self.schedule]
2169 result =
'process.schedule = cms.Schedule('+
','.
join(pathNames)+
')\n' 2171 self.pythonCfgCode += result
2173 for labelToAssociate
in self.labelsToAssociate:
2174 self.process.schedule.associate(getattr(self.process, labelToAssociate))
2175 self.pythonCfgCode +=
'process.schedule.associate(process.' + labelToAssociate +
')\n' 2179 self.pythonCfgCode+=
"from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask\n" 2180 self.pythonCfgCode+=
"associatePatAlgosToolsTask(process)\n" 2182 if self._options.nThreads
is not "1":
2183 self.pythonCfgCode +=
"\n" 2184 self.pythonCfgCode +=
"#Setup FWK for multithreaded\n" 2185 self.pythonCfgCode +=
"process.options.numberOfThreads=cms.untracked.uint32("+self._options.nThreads+
")\n" 2186 self.pythonCfgCode +=
"process.options.numberOfStreams=cms.untracked.uint32(0)\n" 2188 if self._options.isRepacked:
2189 self.pythonCfgCode +=
"\n" 2190 self.pythonCfgCode +=
"from Configuration.Applications.ConfigBuilder import MassReplaceInputTag\n" 2191 self.pythonCfgCode +=
"MassReplaceInputTag(process)\n" 2192 MassReplaceInputTag(self.process)
2195 if self.productionFilterSequence:
2196 self.pythonCfgCode +=
'# filter all path with the production filter sequence\n' 2197 self.pythonCfgCode +=
'for path in process.paths:\n' 2198 if len(self.conditionalPaths):
2199 self.pythonCfgCode +=
'\tif not path in %s: continue\n'%
str(self.conditionalPaths)
2200 if len(self.excludedPaths):
2201 self.pythonCfgCode +=
'\tif path in %s: continue\n'%
str(self.excludedPaths)
2202 self.pythonCfgCode +=
'\tgetattr(process,path)._seq = process.%s * getattr(process,path)._seq \n'%(self.productionFilterSequence,)
2203 pfs = getattr(self.process,self.productionFilterSequence)
2204 for path
in self.process.paths:
2205 if not path
in self.conditionalPaths:
continue 2206 if path
in self.excludedPaths:
continue 2207 getattr(self.process,path)._seq = pfs * getattr(self.process,path)._seq
2213 if self._options.runUnscheduled:
2216 self.pythonCfgCode+=
"#do not add changes to your config after this point (unless you know what you are doing)\n" 2217 self.pythonCfgCode+=
"from FWCore.ParameterSet.Utilities import convertToUnscheduled\n" 2218 self.pythonCfgCode+=
"process=convertToUnscheduled(process)\n" 2220 from FWCore.ParameterSet.Utilities
import convertToUnscheduled
2231 self.pythonCfgCode +=
"\n# Add early deletion of temporary data products to reduce peak memory need\n" 2232 self.pythonCfgCode +=
"from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete\n" 2233 self.pythonCfgCode +=
"process = customiseEarlyDelete(process)\n" 2234 self.pythonCfgCode +=
"# End adding early deletion\n" 2235 from Configuration.StandardSequences.earlyDeleteSettings_cff
import customiseEarlyDelete
2241 if self._options.io:
2243 if not self._options.io.endswith(
'.io'): self._option.io+=
'.io' 2244 io=open(self._options.io,
'w')
2246 if hasattr(self.process.source,
"fileNames"):
2247 if len(self.process.source.fileNames.value()):
2248 ioJson[
'primary']=self.process.source.fileNames.value()
2249 if hasattr(self.process.source,
"secondaryFileNames"):
2250 if len(self.process.source.secondaryFileNames.value()):
2251 ioJson[
'secondary']=self.process.source.secondaryFileNames.value()
2252 if self._options.pileup_input
and (self._options.pileup_input.startswith(
'dbs:')
or self._options.pileup_input.startswith(
'das:')):
2253 ioJson[
'pileup']=self._options.pileup_input[4:]
2254 for (o,om)
in self.process.outputModules_().
items():
2255 ioJson[o]=om.fileName.value()
2256 ioJson[
'GT']=self.process.GlobalTag.globaltag.value()
2257 if self.productionFilterSequence:
2258 ioJson[
'filter']=self.productionFilterSequence
2260 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 prepare_PATGEN(self, sequence="miniGEN")
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")