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__':
84 'jetmc': [5.1, 13, 15, 25, 38, 39],
85 'metmc' : [5.1, 15, 25, 37, 38, 39],
86 'muonmc' : [5.1, 124.4, 124.5, 20, 21, 22, 23, 25, 30],
91 usage =
'usage: runTheMatrix.py --show -s ' 93 parser = optparse.OptionParser(usage)
95 parser.add_option(
'-b',
'--batchName',
96 help=
'relval batch: suffix to be appended to Campaign name',
101 parser.add_option(
'-m',
'--memoryOffset',
102 help=
'memory of the wf for single core',
106 parser.add_option(
'--addMemPerCore',
107 help=
'increase of memory per each n > 1 core: memory(n_core) = memoryOffset + (n_core-1) * memPerCore',
111 parser.add_option(
'-j',
'--nproc',
112 help=
'number of processes. 0 Will use 4 processes, not execute anything but create the wfs',
116 parser.add_option(
'-t',
'--nThreads',
117 help=
'number of threads per process to use in cmsRun.',
122 parser.add_option(
'-n',
'--showMatrix',
123 help=
'Only show the worflows. Use --ext to show more',
128 parser.add_option(
'-e',
'--extended',
129 help=
'Show details of workflows, used with --show',
134 parser.add_option(
'-s',
'--selected',
135 help=
'Run a pre-defined selected matrix of wf. Deprecated, please use -l limited',
140 parser.add_option(
'-l',
'--list',
141 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',
145 parser.add_option(
'-r',
'--raw',
146 help=
'Temporary dump the .txt needed for prodAgent interface. To be discontinued soon. Argument must be the name of the set (standard, pileup,...)',
149 parser.add_option(
'-i',
'--useInput',
150 help=
'Use recyling where available. Either all, or a coma separated list of wf number.',
154 parser.add_option(
'-w',
'--what',
155 help=
'Specify the set to be used. Argument must be the name of the set (standard, pileup,...)',
159 parser.add_option(
'--step1',
160 help=
'Used with --raw. Limit the production to step1',
164 parser.add_option(
'--maxSteps',
165 help=
'Only run maximum on maxSteps. Used when we are only interested in first n steps.',
170 parser.add_option(
'--fromScratch',
171 help=
'Coma separated list of wf to be run without recycling. all is not supported as default.',
175 parser.add_option(
'--refRelease',
176 help=
'Allow to modify the recycling dataset version',
180 parser.add_option(
'--wmcontrol',
181 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',
182 choices=[
'init',
'test',
'submit',
'force'],
186 parser.add_option(
'--revertDqmio',
187 help=
'When submitting workflows to wmcontrol, force DQM outout to use pool and not DQMIO',
188 choices=[
'yes',
'no'],
192 parser.add_option(
'--optionswm',
193 help=
'Specify a few things for wm injection',
196 parser.add_option(
'--keep',
197 help=
'allow to specify for which coma separated steps the output is needed',
199 parser.add_option(
'--label',
200 help=
'allow to give a special label to the output dataset name',
202 parser.add_option(
'--command',
203 help=
'provide a way to add additional command to all of the cmsDriver commands in the matrix',
207 parser.add_option(
'--apply',
208 help=
'allow to use the --command only for 1 coma separeated',
211 parser.add_option(
'--workflow',
212 help=
'define a workflow to be created or altered from the matrix',
217 parser.add_option(
'--dryRun',
218 help=
'do not run the wf at all',
223 parser.add_option(
'--testbed',
224 help=
'workflow injection to cmswebtest (you need dedicated rqmgr account)',
229 parser.add_option(
'--noCafVeto',
230 help=
'Run from any source, ignoring the CAF label',
235 parser.add_option(
'--overWrite',
236 help=
'Change the content of a step for another. List of pairs.',
240 parser.add_option(
'--noRun',
241 help=
'Remove all run list selection from wfs',
246 parser.add_option(
'--das-options',
247 help=
'Options to be passed to dasgoclient.',
252 parser.add_option(
'--job-reports',
253 help=
'Dump framework job reports',
258 parser.add_option(
'--ibeos',
259 help=
'Use IB EOS site configuration',
264 opt,args = parser.parse_args()
267 from commands
import getstatusoutput
as run_cmd
268 ibeos_cache = os.path.join(os.getenv(
"LOCALRT"),
"ibeos_cache.txt")
269 if not os.path.exists(ibeos_cache):
270 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)
272 run_cmd(
"rm -f %s" % ibeos_cache)
273 print(
"Error: Unable to download ibeos cache information")
277 for cmssw_env
in [
"CMSSW_BASE",
"CMSSW_RELEASE_BASE" ]:
278 cmssw_base = os.getenv(cmssw_env,
None)
279 if not cmssw_base:
continue 280 cmssw_base = os.path.join(cmssw_base,
"src/Utilities/General/ibeos")
281 if os.path.exists(cmssw_base):
282 os.environ[
"PATH"]=cmssw_base+
":"+os.getenv(
"PATH")
283 os.environ[
"CMS_PATH"]=
"/cvmfs/cms-ib.cern.ch" 284 os.environ[
"CMSSW_USE_IBEOS"]=
"true" 285 print(
">> WARNING: You are using SITECONF from /cvmfs/cms-ib.cern.ch")
288 print(
'Deprecated, please use -l limited')
289 if opt.testList: opt.testList+=
',limited' 290 else: opt.testList=
'limited' 298 opt.apply=
map(stepOrIndex,opt.apply.split(
','))
300 opt.keep=
map(stepOrIndex,opt.keep.split(
','))
306 for entry
in opt.testList.split(
','):
307 if not entry:
continue 309 for k
in predefinedSet:
310 if k.lower().startswith(entry.lower())
or k.lower().endswith(entry.lower()):
311 testList.extend(predefinedSet[k])
316 testList.append(
float(entry))
318 print(entry,
'is not a possible selected entry')
320 opt.testList =
list(set(testList))
323 if opt.useInput: opt.useInput = opt.useInput.split(
',')
324 if opt.fromScratch: opt.fromScratch = opt.fromScratch.split(
',')
325 if opt.nProcs: opt.nProcs=
int(opt.nProcs)
326 if opt.nThreads: opt.nThreads=
int(opt.nThreads)
327 if (opt.memoryOffset): opt.memoryOffset=
int(opt.memoryOffset)
328 if (opt.memPerCore): opt.memPerCore=
int(opt.memPerCore)
333 opt.overWrite=eval(opt.overWrite)
335 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