1 from __future__
import print_function
10 MAXWORKFLOWLENGTH = 81
14 print(
'Not injecting to wmagent in --show mode. Need to run the worklfows.')
16 if opt.wmcontrol==
'init':
19 if opt.wmcontrol==
'test':
22 if opt.wmcontrol==
'submit' and opt.nProcs==0:
23 print(
'Not injecting to wmagent in -j 0 mode. Need to run the worklfows.')
25 if opt.wmcontrol==
'force':
26 print(
"This is an expert setting, you'd better know what you're doing")
30 from modules.wma
import upload_to_couch
31 (filePath,labelInCouch,user,group,where) = arguments
32 cacheId=upload_to_couch(filePath,
48 for k
in options.split(
','):
49 if k.startswith(
'dqm:'):
50 self.
dqmgui=k.split(
':',1)[-1]
51 elif k.startswith(
'wma:'):
54 self.
testMode=((mode!=
'submit')
and (mode!=
'force'))
70 self.
wmagent=os.getenv(
'WMAGENT_REQMGR')
76 self.
wmagent =
'cmsweb-testbed.cern.ch'
77 self.
DbsUrl =
"https://"+self.
wmagent+
"/dbs/int/global/DBSReader"
80 self.
dqmgui=
"https://cmsweb.cern.ch/dqm/relval"
85 self.
user = os.getenv(
'USER')
93 if not os.getenv(
'WMCORE_ROOT'):
94 print(
'\n\twmclient is not setup properly. Will not be able to upload or submit requests.\n')
99 print(
'\n\tFound wmclient\n')
102 "RequestType" :
"TaskChain",
103 "SubRequestType" :
"RelVal",
104 "RequestPriority": 500000,
105 "Requestor": self.
user,
107 "CMSSWVersion": os.getenv(
'CMSSW_VERSION'),
108 "Campaign": os.getenv(
'CMSSW_VERSION'),
109 "ScramArch": os.getenv(
'SCRAM_ARCH'),
110 "ProcessingVersion": self.
version,
112 "ConfigCacheUrl": self.
couch,
120 "SizePerEvent" : 1234,
122 "PrepID": os.getenv(
'CMSSW_VERSION')
126 "EnableHarvesting" :
"True",
127 "DQMUploadUrl" : self.
dqmgui,
128 "DQMConfigCacheID" :
None,
134 "ConfigCacheID" :
None,
136 "SplittingAlgo" :
"EventBased",
137 "EventsPerJob" :
None,
138 "EventsPerLumi" :
None,
139 "RequestNumEvents" :
None,
140 "Seeding" :
"AutomaticSeeding",
141 "PrimaryDataset" :
None,
143 "Multicore" : opt.nThreads,
148 "TaskName" :
"DigiHLT",
149 "ConfigCacheID" :
None,
151 "InputDataset" :
None,
152 "SplittingAlgo" :
"LumiBased",
155 "Multicore" : opt.nThreads,
162 "InputFromOutputModule" :
None,
163 "ConfigCacheID" :
None,
165 "SplittingAlgo" :
"LumiBased",
168 "Multicore" : opt.nThreads,
178 Return a "wmsplit" dictionary that contain non-default LumisPerJob values
182 wmsplit[
'DIGIHI'] = 5
183 wmsplit[
'RECOHI'] = 5
185 wmsplit[
'RECODreHLT'] = 2
186 wmsplit[
'DIGIPU'] = 4
187 wmsplit[
'DIGIPU1'] = 4
188 wmsplit[
'RECOPU1'] = 1
189 wmsplit[
'DIGIUP15_PU50'] = 1
190 wmsplit[
'RECOUP15_PU50'] = 1
191 wmsplit[
'DIGIUP15_PU25'] = 1
192 wmsplit[
'RECOUP15_PU25'] = 1
193 wmsplit[
'DIGIUP15_PU25HS'] = 1
194 wmsplit[
'RECOUP15_PU25HS'] = 1
195 wmsplit[
'DIGIHIMIX'] = 5
196 wmsplit[
'RECOHIMIX'] = 5
197 wmsplit[
'RECODSplit'] = 1
198 wmsplit[
'SingleMuPt10_UP15_ID'] = 1
199 wmsplit[
'DIGIUP15_ID'] = 1
200 wmsplit[
'RECOUP15_ID'] = 1
201 wmsplit[
'TTbar_13_ID'] = 1
202 wmsplit[
'SingleMuPt10FS_ID'] = 1
203 wmsplit[
'TTbarFS_ID'] = 1
204 wmsplit[
'RECODR2_50nsreHLT'] = 5
205 wmsplit[
'RECODR2_25nsreHLT'] = 5
206 wmsplit[
'RECODR2_2016reHLT'] = 5
207 wmsplit[
'RECODR2_50nsreHLT_HIPM'] = 5
208 wmsplit[
'RECODR2_25nsreHLT_HIPM'] = 5
209 wmsplit[
'RECODR2_2016reHLT_HIPM'] = 1
210 wmsplit[
'RECODR2_2016reHLT_skimSingleMu'] = 1
211 wmsplit[
'RECODR2_2016reHLT_skimDoubleEG'] = 1
212 wmsplit[
'RECODR2_2016reHLT_skimMuonEG'] = 1
213 wmsplit[
'RECODR2_2016reHLT_skimJetHT'] = 1
214 wmsplit[
'RECODR2_2016reHLT_skimMET'] = 1
215 wmsplit[
'RECODR2_2016reHLT_skimSinglePh'] = 1
216 wmsplit[
'RECODR2_2016reHLT_skimMuOnia'] = 1
217 wmsplit[
'RECODR2_2016reHLT_skimSingleMu_HIPM'] = 1
218 wmsplit[
'RECODR2_2016reHLT_skimDoubleEG_HIPM'] = 1
219 wmsplit[
'RECODR2_2016reHLT_skimMuonEG_HIPM'] = 1
220 wmsplit[
'RECODR2_2016reHLT_skimJetHT_HIPM'] = 1
221 wmsplit[
'RECODR2_2016reHLT_skimMET_HIPM'] = 1
222 wmsplit[
'RECODR2_2016reHLT_skimSinglePh_HIPM'] = 1
223 wmsplit[
'RECODR2_2016reHLT_skimMuOnia_HIPM'] = 1
224 wmsplit[
'RECODR2_2017reHLT_Prompt'] = 1
225 wmsplit[
'RECODR2_2017reHLT_skimSingleMu_Prompt_Lumi'] = 1
226 wmsplit[
'RECODR2_2017reHLT_skimDoubleEG_Prompt'] = 1
227 wmsplit[
'RECODR2_2017reHLT_skimMET_Prompt'] = 1
228 wmsplit[
'RECODR2_2017reHLT_skimMuOnia_Prompt'] = 1
229 wmsplit[
'RECODR2_2017reHLT_Prompt_L1TEgDQM'] = 1
230 wmsplit[
'RECODR2_2018reHLT_Prompt'] = 1
231 wmsplit[
'RECODR2_2018reHLT_skimSingleMu_Prompt_Lumi'] = 1
232 wmsplit[
'RECODR2_2018reHLT_skimDoubleEG_Prompt'] = 1
233 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Prompt'] = 1
234 wmsplit[
'RECODR2_2018reHLT_skimMET_Prompt'] = 1
235 wmsplit[
'RECODR2_2018reHLT_skimMuOnia_Prompt'] = 1
236 wmsplit[
'RECODR2_2018reHLT_skimEGamma_Prompt_L1TEgDQM'] = 1
237 wmsplit[
'RECODR2_2018reHLT_skimMuonEG_Prompt'] = 1
238 wmsplit[
'RECODR2_2018reHLT_skimCharmonium_Prompt'] = 1
239 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Prompt_HEfail'] = 1
240 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Prompt_BadHcalMitig'] = 1
241 wmsplit[
'RECODR2_2018reHLTAlCaTkCosmics_Prompt'] = 1
242 wmsplit[
'RECODR2_2018reHLT_skimDisplacedJet_Prompt'] = 1
243 wmsplit[
'RECODR2_2018reHLT_ZBPrompt'] = 1
244 wmsplit[
'RECODR2_2018reHLT_Offline'] = 1
245 wmsplit[
'RECODR2_2018reHLT_skimSingleMu_Offline_Lumi'] = 1
246 wmsplit[
'RECODR2_2018reHLT_skimDoubleEG_Offline'] = 1
247 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Offline'] = 1
248 wmsplit[
'RECODR2_2018reHLT_skimMET_Offline'] = 1
249 wmsplit[
'RECODR2_2018reHLT_skimMuOnia_Offline'] = 1
250 wmsplit[
'RECODR2_2018reHLT_skimEGamma_Offline_L1TEgDQM'] = 1
251 wmsplit[
'RECODR2_2018reHLT_skimMuonEG_Offline'] = 1
252 wmsplit[
'RECODR2_2018reHLT_skimCharmonium_Offline'] = 1
253 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Offline_HEfail'] = 1
254 wmsplit[
'RECODR2_2018reHLT_skimJetHT_Offline_BadHcalMitig'] = 1
255 wmsplit[
'RECODR2_2018reHLTAlCaTkCosmics_Offline'] = 1
256 wmsplit[
'RECODR2_2018reHLT_skimDisplacedJet_Offline'] = 1
257 wmsplit[
'RECODR2_2018reHLT_ZBOffline'] = 1
258 wmsplit[
'HLTDR2_50ns'] = 1
259 wmsplit[
'HLTDR2_25ns'] = 1
260 wmsplit[
'HLTDR2_2016'] = 1
261 wmsplit[
'HLTDR2_2017'] = 1
262 wmsplit[
'HLTDR2_2018'] = 1
263 wmsplit[
'HLTDR2_2018_BadHcalMitig'] = 1
264 wmsplit[
'Hadronizer'] = 1
265 wmsplit[
'DIGIUP15'] = 1
266 wmsplit[
'RECOUP15'] = 1
267 wmsplit[
'RECOAODUP15'] = 5
268 wmsplit[
'DBLMINIAODMCUP15NODQM'] = 5
271 wmsplit[
'DigiPU'] = 1
272 wmsplit[
'RecoPU'] = 1
273 wmsplit[
'RECOHID11'] = 1
274 wmsplit[
'DIGIUP17'] = 1
275 wmsplit[
'RECOUP17'] = 1
276 wmsplit[
'DIGIUP17_PU25'] = 1
277 wmsplit[
'RECOUP17_PU25'] = 1
278 wmsplit[
'DIGICOS_UP16'] = 1
279 wmsplit[
'RECOCOS_UP16'] = 1
280 wmsplit[
'DIGICOS_UP17'] = 1
281 wmsplit[
'RECOCOS_UP17'] = 1
282 wmsplit[
'DIGICOS_UP18'] = 1
283 wmsplit[
'RECOCOS_UP18'] = 1
284 wmsplit[
'DIGICOS_UP21'] = 1
285 wmsplit[
'RECOCOS_UP21'] = 1
286 wmsplit[
'HYBRIDRepackHI2015VR'] = 1
287 wmsplit[
'HYBRIDZSHI2015'] = 1
288 wmsplit[
'RECOHID15'] = 1
289 wmsplit[
'RECOHID18'] = 1
291 from .upgradeWorkflowComponents
import upgradeKeys
292 for key
in upgradeKeys[2026]:
296 wmsplit[
'DigiTriggerPU_' + key] = 1
297 wmsplit[
'RecoGlobalPU_' + key] = 1
299 except Exception
as ex:
300 print(
'Exception while building a wmsplit dictionary: %s' % (
str(ex)))
305 def prepare(self, mReader, directories, mode='init'):
306 wmsplit = MatrixInjector.get_wmsplit()
308 for (n,dir)
in directories.items():
310 print(
"inspecting",dir)
312 for (x,s)
in mReader.workFlowSteps.items():
322 if len( [step
for step
in s[3]
if "HARVESTGEN" in step] )>0:
323 chainDict[
'TimePerEvent']=0.01
324 thisLabel=thisLabel+
"_gen"
326 if len( [step
for step
in s[3]
if "DBLMINIAODMCUP15NODQM" in step] )>0:
327 thisLabel=thisLabel+
"_dblMiniAOD"
333 if 'INPUT' in step
or (
not isinstance(s[2][index],str)):
334 nextHasDSInput=s[2][index]
342 chainDict[
'nowmTasklist'][-1][
'nowmIO']=json.loads(open(
'%s/%s.io'%(dir,step)).
read())
344 print(
"Failed to find",
'%s/%s.io'%(dir,step),
".The workflows were probably not run on cfg not created")
347 chainDict[
'nowmTasklist'][-1][
'PrimaryDataset']=
'RelVal'+s[1].
split(
'+')[0]
348 if not '--relval' in s[2][index]:
349 print(
'Impossible to create task from scratch without splitting information with --relval')
352 arg=s[2][index].
split()
353 ns=list(
map(int,arg[len(arg) - arg[-1::-1].
index(
'--relval')].
split(
',')))
354 chainDict[
'nowmTasklist'][-1][
'RequestNumEvents'] = ns[0]
355 chainDict[
'nowmTasklist'][-1][
'EventsPerJob'] = ns[1]
356 chainDict[
'nowmTasklist'][-1][
'EventsPerLumi'] = ns[1]
358 if 'numberEventsInLuminosityBlock' in s[2][index]:
359 nEventsInLuminosityBlock = re.findall(
'process.source.numberEventsInLuminosityBlock=cms.untracked.uint32\(([ 0-9 ]*)\)', s[2][index],re.DOTALL)
360 if nEventsInLuminosityBlock[-1].isdigit()
and int(nEventsInLuminosityBlock[-1]) < ns[1]:
361 chainDict[
'nowmTasklist'][-1][
'EventsPerLumi'] =
int(nEventsInLuminosityBlock[-1])
364 if 'FASTSIM' in s[2][index]
or '--fast' in s[2][index]:
365 thisLabel+=
'_FastSim'
366 if 'lhe' in s[2][index]
in s[2][index]:
367 chainDict[
'nowmTasklist'][-1][
'LheInputFiles'] =
True
372 chainDict[
'nowmTasklist'][-1][
'nowmIO']=json.loads(open(
'%s/%s.io'%(dir,step)).
read())
374 print(
"Failed to find",
'%s/%s.io'%(dir,step),
".The workflows were probably not run on cfg not created")
376 chainDict[
'nowmTasklist'][-1][
'InputDataset']=nextHasDSInput.dataSet
377 if (
'DQMHLTonRAWAOD' in step) :
378 chainDict[
'nowmTasklist'][-1][
'IncludeParents']=
True
379 splitForThisWf=nextHasDSInput.split
380 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=splitForThisWf
382 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=wmsplit[step]
384 if len(nextHasDSInput.run):
385 chainDict[
'nowmTasklist'][-1][
'RunWhitelist']=nextHasDSInput.run
386 if len(nextHasDSInput.ls):
387 chainDict[
'nowmTasklist'][-1][
'LumiList']=nextHasDSInput.ls
389 if '--data' in s[2][index]
and nextHasDSInput.label:
390 thisLabel+=
'_RelVal_%s'%nextHasDSInput.label
391 if 'filter' in chainDict[
'nowmTasklist'][-1][
'nowmIO']:
392 print(
"This has an input DS and a filter sequence: very likely to be the PyQuen sample")
393 processStrPrefix=
'PU_'
394 setPrimaryDs =
'RelVal'+s[1].
split(
'+')[0]
396 chainDict[
'nowmTasklist'][-1][
'PrimaryDataset']=setPrimaryDs
402 chainDict[
'nowmTasklist'][-1][
'nowmIO']=json.loads(open(
'%s/%s.io'%(dir,step)).
read())
404 print(
"Failed to find",
'%s/%s.io'%(dir,step),
".The workflows were probably not run on cfg not created")
407 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=splitForThisWf
409 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=wmsplit[step]
412 if 'Hadronizer' in step:
413 chainDict[
'nowmTasklist'][-1][
'LumisPerJob']=wmsplit[
'Hadronizer']
416 chainDict[
'nowmTasklist'][-1][
'TaskName']=step
418 chainDict[
'nowmTasklist'][-1][
'PrimaryDataset']=setPrimaryDs
419 chainDict[
'nowmTasklist'][-1][
'ConfigCacheID']=
'%s/%s.py'%(dir,step)
420 chainDict[
'nowmTasklist'][-1][
'GlobalTag']=chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'GT']
421 chainDict[
'GlobalTag']=chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'GT']
422 if 'NANOEDM' in step :
423 nanoedmGT = chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'GT']
424 if 'NANOMERGE' in step :
425 chainDict[
'GlobalTag'] = nanoedmGT
426 if 'pileup' in chainDict[
'nowmTasklist'][-1][
'nowmIO']:
427 chainDict[
'nowmTasklist'][-1][
'MCPileup']=chainDict[
'nowmTasklist'][-1][
'nowmIO'][
'pileup']
428 if '--pileup ' in s[2][index]:
429 processStrPrefix=
'PU_'
431 processStrPrefix=
'PU25ns_'
433 processStrPrefix=
'PU50ns_'
434 if 'premix_stage2' in s[2][index]
and '--pileup_input' in s[2][index]:
436 processStrPrefix=
'PUpmx25ns_'
437 elif s[2][index].
split()[ s[2][index].
split().
index(
'--pileup_input')+1 ].
find(
'50ns') > 0 :
438 processStrPrefix=
'PUpmx50ns_'
442 chainDict[
'AcquisitionEra'][step]=chainDict[
'CMSSWVersion']
443 chainDict[
'ProcessingString'][step]=processStrPrefix+chainDict[
'nowmTasklist'][-1][
'GlobalTag'].
replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
444 if 'NANOMERGE' in step :
445 chainDict[
'ProcessingString'][step]=processStrPrefix+nanoedmGT.replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
448 chainDict[
'nowmTasklist'][-1][
'AcquisitionEra']=chainDict[
'CMSSWVersion']
449 chainDict[
'nowmTasklist'][-1][
'ProcessingString']=processStrPrefix+chainDict[
'nowmTasklist'][-1][
'GlobalTag'].
replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
450 if 'NANOMERGE' in step :
451 chainDict[
'nowmTasklist'][-1][
'ProcessingString']=processStrPrefix+nanoedmGT.replace(
'::All',
'').
replace(
'-',
'_')+thisLabel
454 chainDict[
'nowmTasklist'][-1][
'Campaign'] = chainDict[
'nowmTasklist'][-1][
'AcquisitionEra']+self.
batchName
457 if (
'DBLMINIAODMCUP15NODQM' in step):
458 chainDict[
'nowmTasklist'][-1][
'ProcessingString']=chainDict[
'nowmTasklist'][-1][
'ProcessingString']+
'_miniAOD'
460 if( chainDict[
'nowmTasklist'][-1][
'Multicore'] ):
467 chainDict[
'nowmTasklist'][-1][
'Memory'] = self.
memoryOffset +
int( chainDict[
'nowmTasklist'][-1][
'Multicore'] -1 ) * self.
memPerCore
471 chainDict[
'RequestString']=
'RV'+chainDict[
'CMSSWVersion']+s[1].
split(
'+')[0]
472 if processStrPrefix
or thisLabel:
473 chainDict[
'RequestString']+=
'_'+processStrPrefix+thisLabel
480 chainDict[
'PrepID'] = chainDict[
'CMSSWVersion']+
'__'+self.
batchTime+
'-'+s[1].
split(
'+')[0]
482 chainDict[
'PrepID'] = chainDict[
'CMSSWVersion']+self.
batchName+
'-'+s[1].
split(
'+')[0]
484 chainDict[
'SubRequestType'] =
"HIRelVal"
491 for i_second
in reversed(
range(len(chainDict[
'nowmTasklist']))):
492 t_second=chainDict[
'nowmTasklist'][i_second]
494 if 'primary' in t_second[
'nowmIO']:
496 primary=t_second[
'nowmIO'][
'primary'][0].
replace(
'file:',
'')
497 for i_input
in reversed(
range(0,i_second)):
498 t_input=chainDict[
'nowmTasklist'][i_input]
499 for (om,o)
in t_input[
'nowmIO'].
items():
503 if (len(t_input[
'TaskName'])>50):
504 if (t_input[
'TaskName'].
find(
'GenSim') != -1):
505 t_input[
'TaskName'] =
'GenSimFull'
506 if (t_input[
'TaskName'].
find(
'Hadronizer') != -1):
507 t_input[
'TaskName'] =
'HadronizerFull'
508 t_second[
'InputTask'] = t_input[
'TaskName']
509 t_second[
'InputFromOutputModule'] = om
511 if t_second[
'TaskName'].startswith(
'HARVEST'):
513 if "_RD" in t_second[
'TaskName']:
514 chainDict[
'DQMHarvestUnit'] =
"multiRun"
515 chainDict[
'DQMConfigCacheID']=t_second[
'ConfigCacheID']
535 chainDict[
'AcquisitionEra'] = chainDict[
'AcquisitionEra'].
values()[0]
536 chainDict[
'ProcessingString'] = chainDict[
'ProcessingString'].
values()[0]
538 chainDict[
'AcquisitionEra'] = chainDict[
'nowmTasklist'][0][
'AcquisitionEra']
539 chainDict[
'ProcessingString'] = chainDict[
'nowmTasklist'][0][
'ProcessingString']
543 chainDict[
'Campaign'] = chainDict[
'AcquisitionEra']+self.
batchName
549 if isinstance(i, int)
and i < len(chainDict[
'nowmTasklist']):
550 chainDict[
'nowmTasklist'][i][
'KeepOutput']=
True
551 for (i,t)
in enumerate(chainDict[
'nowmTasklist']):
552 if t[
'TaskName'].startswith(
'HARVEST'):
556 elif t[
'TaskName']
in self.
keep:
558 if t[
'TaskName'].startswith(
'HYBRIDRepackHI2015VR'):
559 t[
'KeepOutput']=
False
562 chainDict[
'Task%d'%(itask)]=t
569 chainDict[
'TaskChain']=itask
571 chainDict.pop(
'nowmTasklist')
578 labelInCouch=self.
label+
'_'+label
579 cacheName=filePath.split(
'/')[-1]
582 print(
'\tFake upload of',filePath,
'to couch with label',labelInCouch)
586 from modules.wma
import upload_to_couch,DATABASE_NAME
588 print(
'\n\tUnable to find wmcontrol modules. Please include it in your python path\n')
593 print(
"Not re-uploading",filePath,
"to",where,
"for",label)
596 print(
"Loading",filePath,
"to",where,
"for",label)
598 pool = multiprocessing.Pool(1)
599 cacheIds = pool.map( upload_to_couch_oneArg, [(filePath,labelInCouch,self.
user,self.
group,where)] )
600 cacheId = cacheIds[0]
607 if it.startswith(
"Task")
and it!=
'TaskChain':
609 couchID=self.
uploadConf(d[it][
'ConfigCacheID'],
610 str(n)+d[it][
'TaskName'],
613 print(d[it][
'ConfigCacheID'],
" uploaded to couchDB for",
str(n),
"with ID",couchID)
614 d[it][
'ConfigCacheID']=couchID
615 if it ==
'DQMConfigCacheID':
616 couchID=self.
uploadConf(d[
'DQMConfigCacheID'],
620 print(d[
'DQMConfigCacheID'],
"uploaded to couchDB for",
str(n),
"with ID",couchID)
621 d[
'DQMConfigCacheID']=couchID
626 from modules.wma
import makeRequest,approveRequest
627 from wmcontrol
import random_sleep
628 print(
'\n\tFound wmcontrol\n')
630 print(
'\n\tUnable to find wmcontrol modules. Please include it in your python path\n')
638 print(
"Only viewing request",n)
639 print(pprint.pprint(d))
642 print(
"For eyes before submitting",n)
643 print(pprint.pprint(d))
644 print(
"Submitting",n,
"...........")
645 workFlow=makeRequest(self.
wmagent,d,encodeDict=
True)
646 print(
"...........",n,
"submitted")
649 print(
"\n*** WARNING: "+
str(len(self.
longWFName))+
" workflows have too long names for submission (>"+
str(MAXWORKFLOWLENGTH)+
"characters) ***")