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.788, #2017B Photon data
65  136.85, #2018A Egamma data
66  140.53, #2011 HI data
67  140.56, #2018 HI data
68  158.0, #2018 HI MC with pp-like reco
69  1306.0, #SingleMu Pt1 UP15
70  1325.7, #test NanoAOD from existing MINI
71  1330, #Run2 MC Zmm
72  135.4, #Run 2 Zee ttbar
73  10042.0, #2017 ZMM
74  10024.0, #2017 ttbar
75  10224.0, #2017 ttbar PU
76  10824.0, #2018 ttbar
77  11624.0, #2021 ttbar
78  20034.0, #2023D17 ttbar (TDR baseline Muon/Barrel)
79  21234.0, #2023D21 ttbar (Inner Tracker with lower radii than in TDR)
80  27434.0, #2023D35 to exercise new HGCal + new MTD
81  29034.0, #2023D41 (baseline for L1T TDR)
82  25202.0, #2016 ttbar UP15 PU
83  250202.181, #2018 ttbar stage1 + stage2 premix
84  ],
85  'jetmc': [5.1, 13, 15, 25, 38, 39], #MC
86  'metmc' : [5.1, 15, 25, 37, 38, 39], #MC
87  'muonmc' : [5.1, 124.4, 124.5, 20, 21, 22, 23, 25, 30], #MC
88  }
89 
90 
91  import optparse
92  usage = 'usage: runTheMatrix.py --show -s '
93 
94  parser = optparse.OptionParser(usage)
95 
96  parser.add_option('-b','--batchName',
97  help='relval batch: suffix to be appended to Campaign name',
98  dest='batchName',
99  default=''
100  )
101 
102  parser.add_option('-m','--memoryOffset',
103  help='memory of the wf for single core',
104  dest='memoryOffset',
105  default=3000
106  )
107  parser.add_option('--addMemPerCore',
108  help='increase of memory per each n > 1 core: memory(n_core) = memoryOffset + (n_core-1) * memPerCore',
109  dest='memPerCore',
110  default=1500
111  )
112  parser.add_option('-j','--nproc',
113  help='number of processes. 0 Will use 4 processes, not execute anything but create the wfs',
114  dest='nProcs',
115  default=4
116  )
117  parser.add_option('-t','--nThreads',
118  help='number of threads per process to use in cmsRun.',
119  dest='nThreads',
120  default=1
121  )
122 
123  parser.add_option('-n','--showMatrix',
124  help='Only show the worflows. Use --ext to show more',
125  dest='show',
126  default=False,
127  action='store_true'
128  )
129  parser.add_option('-e','--extended',
130  help='Show details of workflows, used with --show',
131  dest='extended',
132  default=False,
133  action='store_true'
134  )
135  parser.add_option('-s','--selected',
136  help='Run a pre-defined selected matrix of wf. Deprecated, please use -l limited',
137  dest='restricted',
138  default=False,
139  action='store_true'
140  )
141  parser.add_option('-l','--list',
142  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  dest='testList',
144  default=None
145  )
146  parser.add_option('-r','--raw',
147  help='Temporary dump the .txt needed for prodAgent interface. To be discontinued soon. Argument must be the name of the set (standard, pileup,...)',
148  dest='raw'
149  )
150  parser.add_option('-i','--useInput',
151  help='Use recyling where available. Either all, or a coma separated list of wf number.',
152  dest='useInput',
153  default=None
154  )
155  parser.add_option('-w','--what',
156  help='Specify the set to be used. Argument must be the name of the set (standard, pileup,...)',
157  dest='what',
158  default='all'
159  )
160  parser.add_option('--step1',
161  help='Used with --raw. Limit the production to step1',
162  dest='step1Only',
163  default=False
164  )
165  parser.add_option('--maxSteps',
166  help='Only run maximum on maxSteps. Used when we are only interested in first n steps.',
167  dest='maxSteps',
168  default=9999,
169  type="int"
170  )
171  parser.add_option('--fromScratch',
172  help='Coma separated list of wf to be run without recycling. all is not supported as default.',
173  dest='fromScratch',
174  default=None
175  )
176  parser.add_option('--refRelease',
177  help='Allow to modify the recycling dataset version',
178  dest='refRel',
179  default=None
180  )
181  parser.add_option('--wmcontrol',
182  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',
183  choices=['init','test','submit','force'],
184  dest='wmcontrol',
185  default=None,
186  )
187  parser.add_option('--revertDqmio',
188  help='When submitting workflows to wmcontrol, force DQM outout to use pool and not DQMIO',
189  choices=['yes','no'],
190  dest='revertDqmio',
191  default='no',
192  )
193  parser.add_option('--optionswm',
194  help='Specify a few things for wm injection',
195  default='',
196  dest='wmoptions')
197  parser.add_option('--keep',
198  help='allow to specify for which coma separated steps the output is needed',
199  default=None)
200  parser.add_option('--label',
201  help='allow to give a special label to the output dataset name',
202  default='')
203  parser.add_option('--command',
204  help='provide a way to add additional command to all of the cmsDriver commands in the matrix',
205  dest='command',
206  default=None
207  )
208  parser.add_option('--apply',
209  help='allow to use the --command only for 1 coma separeated',
210  dest='apply',
211  default=None)
212  parser.add_option('--workflow',
213  help='define a workflow to be created or altered from the matrix',
214  action='append',
215  dest='workflow',
216  default=None
217  )
218  parser.add_option('--dryRun',
219  help='do not run the wf at all',
220  action='store_true',
221  dest='dryRun',
222  default=False
223  )
224  parser.add_option('--testbed',
225  help='workflow injection to cmswebtest (you need dedicated rqmgr account)',
226  dest='testbed',
227  default=False,
228  action='store_true'
229  )
230  parser.add_option('--noCafVeto',
231  help='Run from any source, ignoring the CAF label',
232  dest='cafVeto',
233  default=True,
234  action='store_false'
235  )
236  parser.add_option('--overWrite',
237  help='Change the content of a step for another. List of pairs.',
238  dest='overWrite',
239  default=None
240  )
241  parser.add_option('--noRun',
242  help='Remove all run list selection from wfs',
243  dest='noRun',
244  default=False,
245  action='store_true')
246 
247  parser.add_option('--das-options',
248  help='Options to be passed to dasgoclient.',
249  dest='dasOptions',
250  default="--limit 0",
251  action='store')
252 
253  parser.add_option('--job-reports',
254  help='Dump framework job reports',
255  dest='jobReports',
256  default=False,
257  action='store_true')
258 
259  parser.add_option('--ibeos',
260  help='Use IB EOS site configuration',
261  dest='IBEos',
262  default=False,
263  action='store_true')
264 
265  opt,args = parser.parse_args()
266  if opt.IBEos:
267  import os
268  from commands import getstatusoutput as run_cmd
269  ibeos_cache = os.path.join(os.getenv("LOCALRT"), "ibeos_cache.txt")
270  if not os.path.exists(ibeos_cache):
271  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  if err:
273  run_cmd("rm -f %s" % ibeos_cache)
274  print("Error: Unable to download ibeos cache information")
275  print(out)
276  sys.exit(err)
277 
278  for cmssw_env in [ "CMSSW_BASE", "CMSSW_RELEASE_BASE" ]:
279  cmssw_base = os.getenv(cmssw_env,None)
280  if not cmssw_base: continue
281  cmssw_base = os.path.join(cmssw_base,"src/Utilities/General/ibeos")
282  if os.path.exists(cmssw_base):
283  os.environ["PATH"]=cmssw_base+":"+os.getenv("PATH")
284  os.environ["CMS_PATH"]="/cvmfs/cms-ib.cern.ch"
285  os.environ["CMSSW_USE_IBEOS"]="true"
286  print(">> WARNING: You are using SITECONF from /cvmfs/cms-ib.cern.ch")
287  break
288  if opt.restricted:
289  print('Deprecated, please use -l limited')
290  if opt.testList: opt.testList+=',limited'
291  else: opt.testList='limited'
292 
293  def stepOrIndex(s):
294  if s.isdigit():
295  return int(s)
296  else:
297  return s
298  if opt.apply:
299  opt.apply=map(stepOrIndex,opt.apply.split(','))
300  if opt.keep:
301  opt.keep=map(stepOrIndex,opt.keep.split(','))
302 
303 
304 
305  if opt.testList:
306  testList=[]
307  for entry in opt.testList.split(','):
308  if not entry: continue
309  mapped=False
310  for k in predefinedSet:
311  if k.lower().startswith(entry.lower()) or k.lower().endswith(entry.lower()):
312  testList.extend(predefinedSet[k])
313  mapped=True
314  break
315  if not mapped:
316  try:
317  testList.append(float(entry))
318  except:
319  print(entry,'is not a possible selected entry')
320 
321  opt.testList = list(set(testList))
322 
323 
324  if opt.useInput: opt.useInput = opt.useInput.split(',')
325  if opt.fromScratch: opt.fromScratch = opt.fromScratch.split(',')
326  if opt.nProcs: opt.nProcs=int(opt.nProcs)
327  if opt.nThreads: opt.nThreads=int(opt.nThreads)
328  if (opt.memoryOffset): opt.memoryOffset=int(opt.memoryOffset)
329  if (opt.memPerCore): opt.memPerCore=int(opt.memPerCore)
330 
331  if opt.wmcontrol:
333  if opt.overWrite:
334  opt.overWrite=eval(opt.overWrite)
335 
336  if opt.raw and opt.show: ###prodAgent to be discontinued
337  ret = showRaw(opt)
338  else:
339  ret = runSelected(opt)
340 
341 
342  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