2 from __future__
import print_function
5 from Configuration.PyReleaseValidation.MatrixReader
import MatrixReader
6 from Configuration.PyReleaseValidation.MatrixRunner
import MatrixRunner
7 from Configuration.PyReleaseValidation.MatrixInjector
import MatrixInjector,performInjectionOptionTest
14 mrd.showRaw(opt.useInput, opt.refRel, opt.fromScratch, opt.raw, opt.step1Only, selected=opt.testList)
23 mrd.prepare(opt.useInput, opt.refRel, opt.fromScratch)
27 mrd.show(opt.testList, opt.extended, opt.cafVeto)
28 if opt.testList :
print(
'testListected items:', opt.testList)
30 mRunnerHi =
MatrixRunner(mrd.workFlows, opt.nProcs, opt.nThreads)
31 ret = mRunnerHi.runTests(opt)
35 print(
'Cannot go on with wmagent injection with failing workflows')
37 wfInjector =
MatrixInjector(opt,mode=opt.wmcontrol,options=opt.wmoptions)
38 ret= wfInjector.prepare(mrd,
47 if __name__ ==
'__main__':
87 'jetmc': [5.1, 13, 15, 25, 38, 39],
88 'metmc' : [5.1, 15, 25, 37, 38, 39],
89 'muonmc' : [5.1, 124.4, 124.5, 20, 21, 22, 23, 25, 30],
94 usage =
'usage: runTheMatrix.py --show -s ' 96 parser = optparse.OptionParser(usage)
98 parser.add_option(
'-b',
'--batchName',
99 help=
'relval batch: suffix to be appended to Campaign name',
104 parser.add_option(
'-m',
'--memoryOffset',
105 help=
'memory of the wf for single core',
109 parser.add_option(
'--addMemPerCore',
110 help=
'increase of memory per each n > 1 core: memory(n_core) = memoryOffset + (n_core-1) * memPerCore',
114 parser.add_option(
'-j',
'--nproc',
115 help=
'number of processes. 0 Will use 4 processes, not execute anything but create the wfs',
119 parser.add_option(
'-t',
'--nThreads',
120 help=
'number of threads per process to use in cmsRun.',
125 parser.add_option(
'-n',
'--showMatrix',
126 help=
'Only show the worflows. Use --ext to show more',
131 parser.add_option(
'-e',
'--extended',
132 help=
'Show details of workflows, used with --show',
137 parser.add_option(
'-s',
'--selected',
138 help=
'Run a pre-defined selected matrix of wf. Deprecated, please use -l limited',
143 parser.add_option(
'-l',
'--list',
144 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',
148 parser.add_option(
'-r',
'--raw',
149 help=
'Temporary dump the .txt needed for prodAgent interface. To be discontinued soon. Argument must be the name of the set (standard, pileup,...)',
152 parser.add_option(
'-i',
'--useInput',
153 help=
'Use recyling where available. Either all, or a coma separated list of wf number.',
157 parser.add_option(
'-w',
'--what',
158 help=
'Specify the set to be used. Argument must be the name of the set (standard, pileup,...)',
162 parser.add_option(
'--step1',
163 help=
'Used with --raw. Limit the production to step1',
167 parser.add_option(
'--maxSteps',
168 help=
'Only run maximum on maxSteps. Used when we are only interested in first n steps.',
173 parser.add_option(
'--fromScratch',
174 help=
'Coma separated list of wf to be run without recycling. all is not supported as default.',
178 parser.add_option(
'--refRelease',
179 help=
'Allow to modify the recycling dataset version',
183 parser.add_option(
'--wmcontrol',
184 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',
185 choices=[
'init',
'test',
'submit',
'force'],
189 parser.add_option(
'--revertDqmio',
190 help=
'When submitting workflows to wmcontrol, force DQM outout to use pool and not DQMIO',
191 choices=[
'yes',
'no'],
195 parser.add_option(
'--optionswm',
196 help=
'Specify a few things for wm injection',
199 parser.add_option(
'--keep',
200 help=
'allow to specify for which coma separated steps the output is needed',
202 parser.add_option(
'--label',
203 help=
'allow to give a special label to the output dataset name',
205 parser.add_option(
'--command',
206 help=
'provide a way to add additional command to all of the cmsDriver commands in the matrix',
210 parser.add_option(
'--apply',
211 help=
'allow to use the --command only for 1 coma separeated',
214 parser.add_option(
'--workflow',
215 help=
'define a workflow to be created or altered from the matrix',
220 parser.add_option(
'--dryRun',
221 help=
'do not run the wf at all',
226 parser.add_option(
'--testbed',
227 help=
'workflow injection to cmswebtest (you need dedicated rqmgr account)',
232 parser.add_option(
'--noCafVeto',
233 help=
'Run from any source, ignoring the CAF label',
238 parser.add_option(
'--overWrite',
239 help=
'Change the content of a step for another. List of pairs.',
243 parser.add_option(
'--noRun',
244 help=
'Remove all run list selection from wfs',
249 parser.add_option(
'--das-options',
250 help=
'Options to be passed to dasgoclient.',
255 parser.add_option(
'--job-reports',
256 help=
'Dump framework job reports',
261 parser.add_option(
'--ibeos',
262 help=
'Use IB EOS site configuration',
267 parser.add_option(
'--dbs-url',
268 help=
'Overwrite DbsUrl value in JSON submitted to ReqMgr2',
273 opt,args = parser.parse_args()
276 from commands
import getstatusoutput
as run_cmd
277 ibeos_cache = os.path.join(os.getenv(
"LOCALRT"),
"ibeos_cache.txt")
278 if not os.path.exists(ibeos_cache):
279 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)
281 run_cmd(
"rm -f %s" % ibeos_cache)
282 print(
"Error: Unable to download ibeos cache information")
286 for cmssw_env
in [
"CMSSW_BASE",
"CMSSW_RELEASE_BASE" ]:
287 cmssw_base = os.getenv(cmssw_env,
None)
288 if not cmssw_base:
continue 289 cmssw_base = os.path.join(cmssw_base,
"src/Utilities/General/ibeos")
290 if os.path.exists(cmssw_base):
291 os.environ[
"PATH"]=cmssw_base+
":"+os.getenv(
"PATH")
292 os.environ[
"CMS_PATH"]=
"/cvmfs/cms-ib.cern.ch" 293 os.environ[
"CMSSW_USE_IBEOS"]=
"true" 294 print(
">> WARNING: You are using SITECONF from /cvmfs/cms-ib.cern.ch")
297 print(
'Deprecated, please use -l limited')
298 if opt.testList: opt.testList+=
',limited' 299 else: opt.testList=
'limited' 307 opt.apply=
map(stepOrIndex,opt.apply.split(
','))
309 opt.keep=
map(stepOrIndex,opt.keep.split(
','))
315 for entry
in opt.testList.split(
','):
316 if not entry:
continue 318 for k
in predefinedSet:
319 if k.lower().startswith(entry.lower())
or k.lower().endswith(entry.lower()):
320 testList.extend(predefinedSet[k])
325 testList.append(
float(entry))
327 print(entry,
'is not a possible selected entry')
329 opt.testList =
list(set(testList))
332 if opt.useInput: opt.useInput = opt.useInput.split(
',')
333 if opt.fromScratch: opt.fromScratch = opt.fromScratch.split(
',')
334 if opt.nProcs: opt.nProcs=
int(opt.nProcs)
335 if opt.nThreads: opt.nThreads=
int(opt.nThreads)
336 if (opt.memoryOffset): opt.memoryOffset=
int(opt.memoryOffset)
337 if (opt.memPerCore): opt.memPerCore=
int(opt.memPerCore)
342 opt.overWrite=eval(opt.overWrite)
344 if opt.raw
and opt.show:
def performInjectionOptionTest(opt)
S & print(S &os, JobReport::InputFile const &f)
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