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__':
86 'jetmc': [5.1, 13, 15, 25, 38, 39],
87 'metmc' : [5.1, 15, 25, 37, 38, 39],
88 'muonmc' : [5.1, 124.4, 124.5, 20, 21, 22, 23, 25, 30],
93 usage =
'usage: runTheMatrix.py --show -s ' 95 parser = optparse.OptionParser(usage)
97 parser.add_option(
'-b',
'--batchName',
98 help=
'relval batch: suffix to be appended to Campaign name',
103 parser.add_option(
'-m',
'--memoryOffset',
104 help=
'memory of the wf for single core',
108 parser.add_option(
'--addMemPerCore',
109 help=
'increase of memory per each n > 1 core: memory(n_core) = memoryOffset + (n_core-1) * memPerCore',
113 parser.add_option(
'-j',
'--nproc',
114 help=
'number of processes. 0 Will use 4 processes, not execute anything but create the wfs',
118 parser.add_option(
'-t',
'--nThreads',
119 help=
'number of threads per process to use in cmsRun.',
124 parser.add_option(
'-n',
'--showMatrix',
125 help=
'Only show the worflows. Use --ext to show more',
130 parser.add_option(
'-e',
'--extended',
131 help=
'Show details of workflows, used with --show',
136 parser.add_option(
'-s',
'--selected',
137 help=
'Run a pre-defined selected matrix of wf. Deprecated, please use -l limited',
142 parser.add_option(
'-l',
'--list',
143 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',
147 parser.add_option(
'-r',
'--raw',
148 help=
'Temporary dump the .txt needed for prodAgent interface. To be discontinued soon. Argument must be the name of the set (standard, pileup,...)',
151 parser.add_option(
'-i',
'--useInput',
152 help=
'Use recyling where available. Either all, or a coma separated list of wf number.',
156 parser.add_option(
'-w',
'--what',
157 help=
'Specify the set to be used. Argument must be the name of the set (standard, pileup,...)',
161 parser.add_option(
'--step1',
162 help=
'Used with --raw. Limit the production to step1',
166 parser.add_option(
'--maxSteps',
167 help=
'Only run maximum on maxSteps. Used when we are only interested in first n steps.',
172 parser.add_option(
'--fromScratch',
173 help=
'Coma separated list of wf to be run without recycling. all is not supported as default.',
177 parser.add_option(
'--refRelease',
178 help=
'Allow to modify the recycling dataset version',
182 parser.add_option(
'--wmcontrol',
183 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',
184 choices=[
'init',
'test',
'submit',
'force'],
188 parser.add_option(
'--revertDqmio',
189 help=
'When submitting workflows to wmcontrol, force DQM outout to use pool and not DQMIO',
190 choices=[
'yes',
'no'],
194 parser.add_option(
'--optionswm',
195 help=
'Specify a few things for wm injection',
198 parser.add_option(
'--keep',
199 help=
'allow to specify for which coma separated steps the output is needed',
201 parser.add_option(
'--label',
202 help=
'allow to give a special label to the output dataset name',
204 parser.add_option(
'--command',
205 help=
'provide a way to add additional command to all of the cmsDriver commands in the matrix',
209 parser.add_option(
'--apply',
210 help=
'allow to use the --command only for 1 coma separeated',
213 parser.add_option(
'--workflow',
214 help=
'define a workflow to be created or altered from the matrix',
219 parser.add_option(
'--dryRun',
220 help=
'do not run the wf at all',
225 parser.add_option(
'--testbed',
226 help=
'workflow injection to cmswebtest (you need dedicated rqmgr account)',
231 parser.add_option(
'--noCafVeto',
232 help=
'Run from any source, ignoring the CAF label',
237 parser.add_option(
'--overWrite',
238 help=
'Change the content of a step for another. List of pairs.',
242 parser.add_option(
'--noRun',
243 help=
'Remove all run list selection from wfs',
248 parser.add_option(
'--das-options',
249 help=
'Options to be passed to dasgoclient.',
254 parser.add_option(
'--job-reports',
255 help=
'Dump framework job reports',
260 parser.add_option(
'--ibeos',
261 help=
'Use IB EOS site configuration',
266 opt,args = parser.parse_args()
269 from commands
import getstatusoutput
as run_cmd
270 ibeos_cache = os.path.join(os.getenv(
"LOCALRT"),
"ibeos_cache.txt")
271 if not os.path.exists(ibeos_cache):
272 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)
274 run_cmd(
"rm -f %s" % ibeos_cache)
275 print(
"Error: Unable to download ibeos cache information")
279 for cmssw_env
in [
"CMSSW_BASE",
"CMSSW_RELEASE_BASE" ]:
280 cmssw_base = os.getenv(cmssw_env,
None)
281 if not cmssw_base:
continue 282 cmssw_base = os.path.join(cmssw_base,
"src/Utilities/General/ibeos")
283 if os.path.exists(cmssw_base):
284 os.environ[
"PATH"]=cmssw_base+
":"+os.getenv(
"PATH")
285 os.environ[
"CMS_PATH"]=
"/cvmfs/cms-ib.cern.ch" 286 os.environ[
"CMSSW_USE_IBEOS"]=
"true" 287 print(
">> WARNING: You are using SITECONF from /cvmfs/cms-ib.cern.ch")
290 print(
'Deprecated, please use -l limited')
291 if opt.testList: opt.testList+=
',limited' 292 else: opt.testList=
'limited' 300 opt.apply=
map(stepOrIndex,opt.apply.split(
','))
302 opt.keep=
map(stepOrIndex,opt.keep.split(
','))
308 for entry
in opt.testList.split(
','):
309 if not entry:
continue 311 for k
in predefinedSet:
312 if k.lower().startswith(entry.lower())
or k.lower().endswith(entry.lower()):
313 testList.extend(predefinedSet[k])
318 testList.append(
float(entry))
320 print(entry,
'is not a possible selected entry')
322 opt.testList =
list(set(testList))
325 if opt.useInput: opt.useInput = opt.useInput.split(
',')
326 if opt.fromScratch: opt.fromScratch = opt.fromScratch.split(
',')
327 if opt.nProcs: opt.nProcs=
int(opt.nProcs)
328 if opt.nThreads: opt.nThreads=
int(opt.nThreads)
329 if (opt.memoryOffset): opt.memoryOffset=
int(opt.memoryOffset)
330 if (opt.memPerCore): opt.memPerCore=
int(opt.memPerCore)
335 opt.overWrite=eval(opt.overWrite)
337 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