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__':
82 'jetmc': [5.1, 13, 15, 25, 38, 39],
83 'metmc' : [5.1, 15, 25, 37, 38, 39],
84 'muonmc' : [5.1, 124.4, 124.5, 20, 21, 22, 23, 25, 30],
89 usage =
'usage: runTheMatrix.py --show -s ' 91 parser = optparse.OptionParser(usage)
93 parser.add_option(
'-b',
'--batchName',
94 help=
'relval batch: suffix to be appended to Campaign name',
99 parser.add_option(
'-m',
'--memoryOffset',
100 help=
'memory of the wf for single core',
104 parser.add_option(
'--addMemPerCore',
105 help=
'increase of memory per each n > 1 core: memory(n_core) = memoryOffset + (n_core-1) * memPerCore',
109 parser.add_option(
'-j',
'--nproc',
110 help=
'number of processes. 0 Will use 4 processes, not execute anything but create the wfs',
114 parser.add_option(
'-t',
'--nThreads',
115 help=
'number of threads per process to use in cmsRun.',
120 parser.add_option(
'-n',
'--showMatrix',
121 help=
'Only show the worflows. Use --ext to show more',
126 parser.add_option(
'-e',
'--extended',
127 help=
'Show details of workflows, used with --show',
132 parser.add_option(
'-s',
'--selected',
133 help=
'Run a pre-defined selected matrix of wf. Deprecated, please use -l limited',
138 parser.add_option(
'-l',
'--list',
139 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',
143 parser.add_option(
'-r',
'--raw',
144 help=
'Temporary dump the .txt needed for prodAgent interface. To be discontinued soon. Argument must be the name of the set (standard, pileup,...)',
147 parser.add_option(
'-i',
'--useInput',
148 help=
'Use recyling where available. Either all, or a coma separated list of wf number.',
152 parser.add_option(
'-w',
'--what',
153 help=
'Specify the set to be used. Argument must be the name of the set (standard, pileup,...)',
157 parser.add_option(
'--step1',
158 help=
'Used with --raw. Limit the production to step1',
162 parser.add_option(
'--maxSteps',
163 help=
'Only run maximum on maxSteps. Used when we are only interested in first n steps.',
168 parser.add_option(
'--fromScratch',
169 help=
'Coma separated list of wf to be run without recycling. all is not supported as default.',
173 parser.add_option(
'--refRelease',
174 help=
'Allow to modify the recycling dataset version',
178 parser.add_option(
'--wmcontrol',
179 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',
180 choices=[
'init',
'test',
'submit',
'force'],
184 parser.add_option(
'--revertDqmio',
185 help=
'When submitting workflows to wmcontrol, force DQM outout to use pool and not DQMIO',
186 choices=[
'yes',
'no'],
190 parser.add_option(
'--optionswm',
191 help=
'Specify a few things for wm injection',
194 parser.add_option(
'--keep',
195 help=
'allow to specify for which coma separated steps the output is needed',
197 parser.add_option(
'--label',
198 help=
'allow to give a special label to the output dataset name',
200 parser.add_option(
'--command',
201 help=
'provide a way to add additional command to all of the cmsDriver commands in the matrix',
205 parser.add_option(
'--apply',
206 help=
'allow to use the --command only for 1 coma separeated',
209 parser.add_option(
'--workflow',
210 help=
'define a workflow to be created or altered from the matrix',
215 parser.add_option(
'--dryRun',
216 help=
'do not run the wf at all',
221 parser.add_option(
'--testbed',
222 help=
'workflow injection to cmswebtest (you need dedicated rqmgr account)',
227 parser.add_option(
'--noCafVeto',
228 help=
'Run from any source, ignoring the CAF label',
233 parser.add_option(
'--overWrite',
234 help=
'Change the content of a step for another. List of pairs.',
238 parser.add_option(
'--noRun',
239 help=
'Remove all run list selection from wfs',
244 parser.add_option(
'--das-options',
245 help=
'Options to be passed to dasgoclient.',
250 parser.add_option(
'--job-reports',
251 help=
'Dump framework job reports',
256 parser.add_option(
'--ibeos',
257 help=
'Use IB EOS site configuration',
262 opt,args = parser.parse_args()
265 from commands
import getstatusoutput
as run_cmd
266 ibeos_cache = os.path.join(os.getenv(
"LOCALRT"),
"ibeos_cache.txt")
267 if not os.path.exists(ibeos_cache):
268 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)
270 run_cmd(
"rm -f %s" % ibeos_cache)
271 print "Error: Unable to download ibeos cache information" 275 for cmssw_env
in [
"CMSSW_BASE",
"CMSSW_RELEASE_BASE" ]:
276 cmssw_base = os.getenv(cmssw_env,
None)
277 if not cmssw_base:
continue 278 cmssw_base = os.path.join(cmssw_base,
"src/Utilities/General/ibeos")
279 if os.path.exists(cmssw_base):
280 os.environ[
"PATH"]=cmssw_base+
":"+os.getenv(
"PATH")
281 os.environ[
"CMS_PATH"]=
"/cvmfs/cms-ib.cern.ch" 282 os.environ[
"CMSSW_USE_IBEOS"]=
"true" 283 print ">> WARNING: You are using SITECONF from /cvmfs/cms-ib.cern.ch" 286 print 'Deprecated, please use -l limited' 287 if opt.testList: opt.testList+=
',limited' 288 else: opt.testList=
'limited' 296 opt.apply=
map(stepOrIndex,opt.apply.split(
','))
298 opt.keep=
map(stepOrIndex,opt.keep.split(
','))
304 for entry
in opt.testList.split(
','):
305 if not entry:
continue 307 for k
in predefinedSet:
308 if k.lower().startswith(entry.lower())
or k.lower().endswith(entry.lower()):
309 testList.extend(predefinedSet[k])
314 testList.append(
float(entry))
316 print entry,
'is not a possible selected entry' 318 opt.testList =
list(set(testList))
321 if opt.useInput: opt.useInput = opt.useInput.split(
',')
322 if opt.fromScratch: opt.fromScratch = opt.fromScratch.split(
',')
323 if opt.nProcs: opt.nProcs=
int(opt.nProcs)
324 if opt.nThreads: opt.nThreads=
int(opt.nThreads)
325 if (opt.memoryOffset): opt.memoryOffset=
int(opt.memoryOffset)
326 if (opt.memPerCore): opt.memPerCore=
int(opt.memPerCore)
331 opt.overWrite=eval(opt.overWrite)
333 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