CMS 3D CMS Logo

runTheMatrix.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 from __future__ import print_function
3 import sys
4 
5 from Configuration.PyReleaseValidation.MatrixReader import MatrixReader
6 from Configuration.PyReleaseValidation.MatrixRunner import MatrixRunner
7 from Configuration.PyReleaseValidation.MatrixInjector import MatrixInjector,performInjectionOptionTest
8 
9 # ================================================================================
10 
11 def showRaw(opt):
12 
13  mrd = MatrixReader(opt)
14  mrd.showRaw(opt.useInput, opt.refRel, opt.fromScratch, opt.raw, opt.step1Only, selected=opt.testList)
15 
16  return 0
17 
18 # ================================================================================
19 
20 def runSelected(opt):
21 
22  mrd = MatrixReader(opt)
23  mrd.prepare(opt.useInput, opt.refRel, opt.fromScratch)
24 
25  ret = 0
26  if opt.show:
27  mrd.show(opt.testList, opt.extended, opt.cafVeto)
28  if opt.testList : print('testListected items:', opt.testList)
29  else:
30  mRunnerHi = MatrixRunner(mrd.workFlows, opt.nProcs, opt.nThreads)
31  ret = mRunnerHi.runTests(opt)
32 
33  if opt.wmcontrol:
34  if ret!=0:
35  print('Cannot go on with wmagent injection with failing workflows')
36  else:
37  wfInjector = MatrixInjector(opt,mode=opt.wmcontrol,options=opt.wmoptions)
38  ret= wfInjector.prepare(mrd,
39  mRunnerHi.runDirs)
40  if ret==0:
41  wfInjector.upload()
42  wfInjector.submit()
43  return ret
44 
45 # ================================================================================
46 
47 if __name__ == '__main__':
48 
49  #this can get out of here
50  predefinedSet={
51  'limited' : [5.1, #FastSim ttbar
52  7.3, #CosmicsSPLoose_UP17
53  8, #BH/Cosmic MC
54  25, #MC ttbar
55  4.22, #cosmic data
56  4.53, #run1 data + miniAOD
57  9.0, #Higgs200 charged taus
58  1000, #data+prompt
59  1001, #data+express
60  101.0, #SingleElectron120E120EHCAL
61  136.731, #2016B Photon data
62  136.7611, #2016E JetHT reMINIAOD from 80X legacy
63  136.8311, #2017F JetHT reMINIAOD from 94X reprocessing
64  136.88811,#2018D JetHT reMINIAOD from UL processing
65  136.788, #2017B Photon data
66  136.85, #2018A Egamma data
67  140.53, #2011 HI data
68  140.56, #2018 HI data
69  158.0, #2018 HI MC with pp-like reco
70  1306.0, #SingleMu Pt1 UP15
71  1325.7, #test NanoAOD from existing MINI
72  1330, #Run2 MC Zmm
73  135.4, #Run 2 Zee ttbar
74  10042.0, #2017 ZMM
75  10024.0, #2017 ttbar
76  10224.0, #2017 ttbar PU
77  10824.0, #2018 ttbar
78  11624.0, #2021 ttbar
79  20034.0, #2023D17 ttbar (TDR baseline Muon/Barrel)
80  21234.0, #2023D21 ttbar (Inner Tracker with lower radii than in TDR)
81  27434.0, #2023D35 to exercise new HGCal + new MTD
82  29034.0, #2023D41 (baseline for L1T TDR)
83  25202.0, #2016 ttbar UP15 PU
84  250202.181, #2018 ttbar stage1 + stage2 premix
85  ],
86  'jetmc': [5.1, 13, 15, 25, 38, 39], #MC
87  'metmc' : [5.1, 15, 25, 37, 38, 39], #MC
88  'muonmc' : [5.1, 124.4, 124.5, 20, 21, 22, 23, 25, 30], #MC
89  }
90 
91 
92  import optparse
93  usage = 'usage: runTheMatrix.py --show -s '
94 
95  parser = optparse.OptionParser(usage)
96 
97  parser.add_option('-b','--batchName',
98  help='relval batch: suffix to be appended to Campaign name',
99  dest='batchName',
100  default=''
101  )
102 
103  parser.add_option('-m','--memoryOffset',
104  help='memory of the wf for single core',
105  dest='memoryOffset',
106  default=3000
107  )
108  parser.add_option('--addMemPerCore',
109  help='increase of memory per each n > 1 core: memory(n_core) = memoryOffset + (n_core-1) * memPerCore',
110  dest='memPerCore',
111  default=1500
112  )
113  parser.add_option('-j','--nproc',
114  help='number of processes. 0 Will use 4 processes, not execute anything but create the wfs',
115  dest='nProcs',
116  default=4
117  )
118  parser.add_option('-t','--nThreads',
119  help='number of threads per process to use in cmsRun.',
120  dest='nThreads',
121  default=1
122  )
123 
124  parser.add_option('-n','--showMatrix',
125  help='Only show the worflows. Use --ext to show more',
126  dest='show',
127  default=False,
128  action='store_true'
129  )
130  parser.add_option('-e','--extended',
131  help='Show details of workflows, used with --show',
132  dest='extended',
133  default=False,
134  action='store_true'
135  )
136  parser.add_option('-s','--selected',
137  help='Run a pre-defined selected matrix of wf. Deprecated, please use -l limited',
138  dest='restricted',
139  default=False,
140  action='store_true'
141  )
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',
144  dest='testList',
145  default=None
146  )
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,...)',
149  dest='raw'
150  )
151  parser.add_option('-i','--useInput',
152  help='Use recyling where available. Either all, or a coma separated list of wf number.',
153  dest='useInput',
154  default=None
155  )
156  parser.add_option('-w','--what',
157  help='Specify the set to be used. Argument must be the name of the set (standard, pileup,...)',
158  dest='what',
159  default='all'
160  )
161  parser.add_option('--step1',
162  help='Used with --raw. Limit the production to step1',
163  dest='step1Only',
164  default=False
165  )
166  parser.add_option('--maxSteps',
167  help='Only run maximum on maxSteps. Used when we are only interested in first n steps.',
168  dest='maxSteps',
169  default=9999,
170  type="int"
171  )
172  parser.add_option('--fromScratch',
173  help='Coma separated list of wf to be run without recycling. all is not supported as default.',
174  dest='fromScratch',
175  default=None
176  )
177  parser.add_option('--refRelease',
178  help='Allow to modify the recycling dataset version',
179  dest='refRel',
180  default=None
181  )
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'],
185  dest='wmcontrol',
186  default=None,
187  )
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'],
191  dest='revertDqmio',
192  default='no',
193  )
194  parser.add_option('--optionswm',
195  help='Specify a few things for wm injection',
196  default='',
197  dest='wmoptions')
198  parser.add_option('--keep',
199  help='allow to specify for which coma separated steps the output is needed',
200  default=None)
201  parser.add_option('--label',
202  help='allow to give a special label to the output dataset name',
203  default='')
204  parser.add_option('--command',
205  help='provide a way to add additional command to all of the cmsDriver commands in the matrix',
206  dest='command',
207  default=None
208  )
209  parser.add_option('--apply',
210  help='allow to use the --command only for 1 coma separeated',
211  dest='apply',
212  default=None)
213  parser.add_option('--workflow',
214  help='define a workflow to be created or altered from the matrix',
215  action='append',
216  dest='workflow',
217  default=None
218  )
219  parser.add_option('--dryRun',
220  help='do not run the wf at all',
221  action='store_true',
222  dest='dryRun',
223  default=False
224  )
225  parser.add_option('--testbed',
226  help='workflow injection to cmswebtest (you need dedicated rqmgr account)',
227  dest='testbed',
228  default=False,
229  action='store_true'
230  )
231  parser.add_option('--noCafVeto',
232  help='Run from any source, ignoring the CAF label',
233  dest='cafVeto',
234  default=True,
235  action='store_false'
236  )
237  parser.add_option('--overWrite',
238  help='Change the content of a step for another. List of pairs.',
239  dest='overWrite',
240  default=None
241  )
242  parser.add_option('--noRun',
243  help='Remove all run list selection from wfs',
244  dest='noRun',
245  default=False,
246  action='store_true')
247 
248  parser.add_option('--das-options',
249  help='Options to be passed to dasgoclient.',
250  dest='dasOptions',
251  default="--limit 0",
252  action='store')
253 
254  parser.add_option('--job-reports',
255  help='Dump framework job reports',
256  dest='jobReports',
257  default=False,
258  action='store_true')
259 
260  parser.add_option('--ibeos',
261  help='Use IB EOS site configuration',
262  dest='IBEos',
263  default=False,
264  action='store_true')
265 
266  opt,args = parser.parse_args()
267  if opt.IBEos:
268  import os
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)
273  if err:
274  run_cmd("rm -f %s" % ibeos_cache)
275  print("Error: Unable to download ibeos cache information")
276  print(out)
277  sys.exit(err)
278 
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")
288  break
289  if opt.restricted:
290  print('Deprecated, please use -l limited')
291  if opt.testList: opt.testList+=',limited'
292  else: opt.testList='limited'
293 
294  def stepOrIndex(s):
295  if s.isdigit():
296  return int(s)
297  else:
298  return s
299  if opt.apply:
300  opt.apply=map(stepOrIndex,opt.apply.split(','))
301  if opt.keep:
302  opt.keep=map(stepOrIndex,opt.keep.split(','))
303 
304 
305 
306  if opt.testList:
307  testList=[]
308  for entry in opt.testList.split(','):
309  if not entry: continue
310  mapped=False
311  for k in predefinedSet:
312  if k.lower().startswith(entry.lower()) or k.lower().endswith(entry.lower()):
313  testList.extend(predefinedSet[k])
314  mapped=True
315  break
316  if not mapped:
317  try:
318  testList.append(float(entry))
319  except:
320  print(entry,'is not a possible selected entry')
321 
322  opt.testList = list(set(testList))
323 
324 
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)
331 
332  if opt.wmcontrol:
334  if opt.overWrite:
335  opt.overWrite=eval(opt.overWrite)
336 
337  if opt.raw and opt.show: ###prodAgent to be discontinued
338  ret = showRaw(opt)
339  else:
340  ret = runSelected(opt)
341 
342 
343  sys.exit(ret)
def performInjectionOptionTest(opt)
def runSelected(opt)
Definition: runTheMatrix.py:20
def showRaw(opt)
Definition: runTheMatrix.py:11
S & print(S &os, JobReport::InputFile const &f)
Definition: JobReport.cc:66
def stepOrIndex(s)
#define str(s)
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