4 from Configuration.PyReleaseValidation.MatrixReader
import MatrixReader
5 from Configuration.PyReleaseValidation.MatrixRunner
import MatrixRunner
6 from Configuration.PyReleaseValidation.MatrixInjector
import MatrixInjector,performInjectionOptionTest
13 mrd.showRaw(opt.useInput, opt.refRel, opt.fromScratch, opt.raw, opt.step1Only, selected=opt.testList)
22 mrd.prepare(opt.useInput, opt.refRel, opt.fromScratch)
26 mrd.show(opt.testList, opt.extended, opt.cafVeto)
27 if opt.testList :
print 'testListected items:', opt.testList
29 mRunnerHi =
MatrixRunner(mrd.workFlows, opt.nProcs, opt.nThreads)
30 ret = mRunnerHi.runTests(opt)
34 print 'Cannot go on with wmagent injection with failing workflows' 36 wfInjector =
MatrixInjector(opt,mode=opt.wmcontrol,options=opt.wmoptions)
37 ret= wfInjector.prepare(mrd,
46 if __name__ ==
'__main__':
75 'jetmc': [5.1, 13, 15, 25, 38, 39],
76 'metmc' : [5.1, 15, 25, 37, 38, 39],
77 'muonmc' : [5.1, 124.4, 124.5, 20, 21, 22, 23, 25, 30],
82 usage =
'usage: runTheMatrix.py --show -s ' 84 parser = optparse.OptionParser(usage)
86 parser.add_option(
'-b',
'--batchName',
87 help=
'relval batch: suffix to be appended to Campaign name',
92 parser.add_option(
'-m',
'--memoryOffset',
93 help=
'memory of the wf for single core',
97 parser.add_option(
'--addMemPerCore',
98 help=
'increase of memory per each n > 1 core: memory(n_core) = memoryOffset + (n_core-1) * memPerCore',
102 parser.add_option(
'-j',
'--nproc',
103 help=
'number of processes. 0 Will use 4 processes, not execute anything but create the wfs',
107 parser.add_option(
'-t',
'--nThreads',
108 help=
'number of threads per process to use in cmsRun.',
113 parser.add_option(
'-n',
'--showMatrix',
114 help=
'Only show the worflows. Use --ext to show more',
119 parser.add_option(
'-e',
'--extended',
120 help=
'Show details of workflows, used with --show',
125 parser.add_option(
'-s',
'--selected',
126 help=
'Run a pre-defined selected matrix of wf. Deprecated, please use -l limited',
131 parser.add_option(
'-l',
'--list',
132 help=
'Coma separated list of workflow to be shown or ran. Possible keys are also '+
str(predefinedSet.keys())+
'. and wild card like muon, or mc',
136 parser.add_option(
'-r',
'--raw',
137 help=
'Temporary dump the .txt needed for prodAgent interface. To be discontinued soon. Argument must be the name of the set (standard, pileup,...)',
140 parser.add_option(
'-i',
'--useInput',
141 help=
'Use recyling where available. Either all, or a coma separated list of wf number.',
145 parser.add_option(
'-w',
'--what',
146 help=
'Specify the set to be used. Argument must be the name of the set (standard, pileup,...)',
150 parser.add_option(
'--step1',
151 help=
'Used with --raw. Limit the production to step1',
155 parser.add_option(
'--maxSteps',
156 help=
'Only run maximum on maxSteps. Used when we are only interested in first n steps.',
161 parser.add_option(
'--fromScratch',
162 help=
'Coma separated list of wf to be run without recycling. all is not supported as default.',
166 parser.add_option(
'--refRelease',
167 help=
'Allow to modify the recycling dataset version',
171 parser.add_option(
'--wmcontrol',
172 help=
'Create the workflows for injection to WMAgent. In the WORKING. -wmcontrol init will create the the workflows, -wmcontrol test will dryRun a test, -wmcontrol submit will submit to wmagent',
173 choices=[
'init',
'test',
'submit',
'force'],
177 parser.add_option(
'--revertDqmio',
178 help=
'When submitting workflows to wmcontrol, force DQM outout to use pool and not DQMIO',
179 choices=[
'yes',
'no'],
183 parser.add_option(
'--optionswm',
184 help=
'Specify a few things for wm injection',
187 parser.add_option(
'--keep',
188 help=
'allow to specify for which coma separated steps the output is needed',
190 parser.add_option(
'--label',
191 help=
'allow to give a special label to the output dataset name',
193 parser.add_option(
'--command',
194 help=
'provide a way to add additional command to all of the cmsDriver commands in the matrix',
198 parser.add_option(
'--apply',
199 help=
'allow to use the --command only for 1 coma separeated',
202 parser.add_option(
'--workflow',
203 help=
'define a workflow to be created or altered from the matrix',
208 parser.add_option(
'--dryRun',
209 help=
'do not run the wf at all',
214 parser.add_option(
'--testbed',
215 help=
'workflow injection to cmswebtest (you need dedicated rqmgr account)',
220 parser.add_option(
'--noCafVeto',
221 help=
'Run from any source, ignoring the CAF label',
226 parser.add_option(
'--overWrite',
227 help=
'Change the content of a step for another. List of pairs.',
231 parser.add_option(
'--noRun',
232 help=
'Remove all run list selection from wfs',
237 parser.add_option(
'--das-options',
238 help=
'Options to be passed to dasgoclient.',
243 parser.add_option(
'--job-reports',
244 help=
'Dump framework job reports',
249 parser.add_option(
'--ibeos',
250 help=
'Use IB EOS site configuration',
255 opt,args = parser.parse_args()
258 from commands
import getstatusoutput
as run_cmd
259 ibeos_cache = os.path.join(os.getenv(
"LOCALRT"),
"ibeos_cache.txt")
260 if not os.path.exists(ibeos_cache):
261 err, out = run_cmd(
"curl -L -s -o %s https://raw.githubusercontent.com/cms-sw/cms-sw.github.io/master/das_queries/ibeos.txt" % ibeos_cache)
263 run_cmd(
"rm -f %s" % ibeos_cache)
264 print "Error: Unable to download ibeos cache information" 268 for cmssw_env
in [
"CMSSW_BASE",
"CMSSW_RELEASE_BASE" ]:
269 cmssw_base = os.getenv(cmssw_env,
None)
270 if not cmssw_base:
continue 271 cmssw_base = os.path.join(cmssw_base,
"src/Utilities/General/ibeos")
272 if os.path.exists(cmssw_base):
273 os.environ[
"PATH"]=cmssw_base+
":"+os.getenv(
"PATH")
274 os.environ[
"CMS_PATH"]=
"/cvmfs/cms-ib.cern.ch" 275 os.environ[
"CMSSW_USE_IBEOS"]=
"true" 276 print ">> WARNING: You are using SITECONF from /cvmfs/cms-ib.cern.ch" 279 print 'Deprecated, please use -l limited' 280 if opt.testList: opt.testList+=
',limited' 281 else: opt.testList=
'limited' 289 opt.apply=
map(stepOrIndex,opt.apply.split(
','))
291 opt.keep=
map(stepOrIndex,opt.keep.split(
','))
297 for entry
in opt.testList.split(
','):
298 if not entry:
continue 300 for k
in predefinedSet:
301 if k.lower().startswith(entry.lower())
or k.lower().endswith(entry.lower()):
302 testList.extend(predefinedSet[k])
307 testList.append(
float(entry))
309 print entry,
'is not a possible selected entry' 311 opt.testList =
list(set(testList))
314 if opt.useInput: opt.useInput = opt.useInput.split(
',')
315 if opt.fromScratch: opt.fromScratch = opt.fromScratch.split(
',')
316 if opt.nProcs: opt.nProcs=
int(opt.nProcs)
317 if opt.nThreads: opt.nThreads=
int(opt.nThreads)
318 if (opt.memoryOffset): opt.memoryOffset=
int(opt.memoryOffset)
319 if (opt.memPerCore): opt.memPerCore=
int(opt.memPerCore)
324 opt.overWrite=eval(opt.overWrite)
326 if opt.raw
and opt.show:
def performInjectionOptionTest(opt)
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