File indexing completed on 2023-03-17 10:40:36
0001
0002
0003 '''Script that submits CMS Tracker Alignment Primary Vertex Validation workflows
0004 '''
0005 from __future__ import print_function
0006
0007 from builtins import range
0008 __author__ = 'Marco Musich'
0009 __copyright__ = 'Copyright 2015, CERN CMS'
0010 __credits__ = ['Ernesto Migliore', 'Salvatore Di Guida', 'Javier Duarte']
0011 __license__ = 'Unknown'
0012 __maintainer__ = 'Marco Musich'
0013 __email__ = 'marco.musich@cern.ch'
0014 __version__ = 1
0015
0016 import datetime,time
0017 import os,sys
0018 import copy
0019 import string, re
0020 import configparser as ConfigParser, json
0021 from optparse import OptionParser
0022 from subprocess import Popen, PIPE
0023
0024 CopyRights = '##################################\n'
0025 CopyRights += '# submitAllJobs Script #\n'
0026 CopyRights += '# marco.musich@cern.ch #\n'
0027 CopyRights += '# December 2015 #\n'
0028 CopyRights += '##################################\n'
0029
0030
0031 def drawProgressBar(percent, barLen=40):
0032
0033 sys.stdout.write("\r")
0034 progress = ""
0035 for i in range(barLen):
0036 if i < int(barLen * percent):
0037 progress += "="
0038 else:
0039 progress += " "
0040 sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100))
0041 sys.stdout.flush()
0042
0043
0044 def getCommandOutput(command):
0045
0046 """This function executes `command` and returns it output.
0047 Arguments:
0048 - `command`: Shell command to be invoked by this function.
0049 """
0050 child = os.popen(command)
0051 data = child.read()
0052 err = child.close()
0053 if err:
0054 print('%s failed w/ exit code %d' % (command, err))
0055 return data
0056
0057
0058 def to_bool(value):
0059
0060 """
0061 Converts 'something' to boolean. Raises exception for invalid formats
0062 Possible True values: 1, True, "1", "TRue", "yes", "y", "t"
0063 Possible False values: 0, False, None, [], {}, "", "0", "faLse", "no", "n", "f", 0.0, ...
0064 """
0065 if str(value).lower() in ("yes", "y", "true", "t", "1"): return True
0066 if str(value).lower() in ("no", "n", "false", "f", "0", "0.0", "", "none", "[]", "{}"): return False
0067 raise Exception('Invalid value for boolean conversion: ' + str(value))
0068
0069
0070 class BetterConfigParser(ConfigParser.ConfigParser):
0071
0072
0073 def optionxform(self, optionstr):
0074 return optionstr
0075
0076
0077 def exists( self, section, option):
0078 try:
0079 items = self.items(section)
0080 except ConfigParser.NoSectionError:
0081 return False
0082 for item in items:
0083 if item[0] == option:
0084 return True
0085 return False
0086
0087
0088 def __updateDict( self, dictionary, section ):
0089 result = dictionary
0090 try:
0091 for option in self.options( section ):
0092 result[option] = self.get( section, option )
0093 if "local"+section.title() in self.sections():
0094 for option in self.options( "local"+section.title() ):
0095 result[option] = self.get( "local"+section.title(),option )
0096 except ConfigParser.NoSectionError as section:
0097 msg = ("%s in configuration files. This section is mandatory."
0098 %(str(section).replace(":", "", 1)))
0099
0100 return result
0101
0102
0103 def getResultingSection( self, section, defaultDict = {}, demandPars = [] ):
0104 result = copy.deepcopy(defaultDict)
0105 for option in demandPars:
0106 try:
0107 result[option] = self.get( section, option )
0108 except ConfigParser.NoOptionError as globalSectionError:
0109 globalSection = str( globalSectionError ).split( "'" )[-2]
0110 splittedSectionName = section.split( ":" )
0111 if len( splittedSectionName ) > 1:
0112 localSection = ("local"+section.split( ":" )[0].title()+":"
0113 +section.split(":")[1])
0114 else:
0115 localSection = ("local"+section.split( ":" )[0].title())
0116 if self.has_section( localSection ):
0117 try:
0118 result[option] = self.get( localSection, option )
0119 except ConfigParser.NoOptionError as option:
0120 msg = ("%s. This option is mandatory."
0121 %(str(option).replace(":", "", 1).replace(
0122 "section",
0123 "section '"+globalSection+"' or", 1)))
0124
0125 else:
0126 msg = ("%s. This option is mandatory."
0127 %(str(globalSectionError).replace(":", "", 1)))
0128
0129 result = self.__updateDict( result, section )
0130
0131 return result
0132
0133
0134 def ConfigSectionMap(config, section):
0135 the_dict = {}
0136 options = config.options(section)
0137 for option in options:
0138 try:
0139 the_dict[option] = config.get(section, option)
0140 if the_dict[option] == -1:
0141 DebugPrint("skip: %s" % option)
0142 except:
0143 print("exception on %s!" % option)
0144 the_dict[option] = None
0145 return the_dict
0146
0147
0148 def mkdir_eos(out_path):
0149 newpath='/'
0150 for dir in out_path.split('/'):
0151 newpath=os.path.join(newpath,dir)
0152
0153 if newpath.find('test_out') > 0:
0154 p = subprocess.Popen(["eos", "mkdir", newpath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
0155 (out, err) = p.communicate()
0156 p.wait()
0157
0158
0159 p = subprocess.Popen(["eos", "ls", out_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
0160 (out, err) = p.communicate()
0161 p.wait()
0162 if p.returncode !=0:
0163 print(out)
0164
0165 def split(sequence, size):
0166
0167
0168
0169
0170
0171 for i in range(0, len(sequence), size):
0172 yield sequence[i:i+size]
0173
0174
0175 class Job:
0176
0177
0178 def __init__(self, job_id, job_name, isDA, isMC, applyBOWS, applyEXTRACOND, extraconditions, runboundary, lumilist, maxevents, gt, allFromGT, alignmentDB, alignmentTAG, apeDB, apeTAG, bowDB, bowTAG, vertextype, tracktype, applyruncontrol, ptcut, CMSSW_dir ,the_dir):
0179
0180 self.job_id=job_id
0181 self.batch_job_id = None
0182 self.job_name=job_name
0183
0184 self.isDA = isDA
0185 self.isMC = isMC
0186 self.applyBOWS = applyBOWS
0187 self.applyEXTRACOND = applyEXTRACOND
0188 self.extraCondVect = extraconditions
0189 self.runboundary = runboundary
0190 self.lumilist = lumilist
0191 self.maxevents = maxevents
0192 self.gt = gt
0193 self.allFromGT = allFromGT
0194 self.alignmentDB = alignmentDB
0195 self.alignmentTAG = alignmentTAG
0196 self.apeDB = apeDB
0197 self.apeTAG = apeTAG
0198 self.bowDB = bowDB
0199 self.bowTAG = bowTAG
0200 self.vertextype = vertextype
0201 self.tracktype = tracktype
0202 self.applyruncontrol = applyruncontrol
0203 self.ptcut = ptcut
0204
0205 self.the_dir=the_dir
0206 self.CMSSW_dir=CMSSW_dir
0207
0208 self.output_full_name=self.getOutputBaseName()+"_"+str(self.job_id)
0209
0210 self.cfg_dir=None
0211 self.outputCfgName=None
0212
0213
0214 self.LSF_dir=None
0215 self.output_LSF_name=None
0216
0217 self.lfn_list=list()
0218
0219
0220
0221
0222 def __del__(self):
0223
0224 del self.lfn_list
0225
0226 def setEOSout(self,theEOSdir):
0227
0228 self.OUTDIR = theEOSdir
0229
0230 def getOutputBaseName(self):
0231
0232 return "PVValidation_"+self.job_name
0233
0234 def createTheCfgFile(self,lfn):
0235
0236
0237 global CopyRights
0238
0239
0240 self.cfg_dir = os.path.join(self.the_dir,"cfg")
0241 if not os.path.exists(self.cfg_dir):
0242 os.makedirs(self.cfg_dir)
0243
0244 self.outputCfgName=self.output_full_name+"_cfg.py"
0245 fout=open(os.path.join(self.cfg_dir,self.outputCfgName),'w+b')
0246
0247
0248 if self.isMC:
0249 template_cfg_file = os.path.join(self.the_dir,"PVValidation_TEMPL_cfg.py")
0250 else:
0251 template_cfg_file = os.path.join(self.the_dir,"PVValidation_TEMPL_cfg.py")
0252
0253 fin = open(template_cfg_file)
0254
0255 config_txt = '\n\n' + CopyRights + '\n\n'
0256 config_txt += fin.read()
0257
0258 config_txt=config_txt.replace("ISDATEMPLATE",self.isDA)
0259 config_txt=config_txt.replace("ISMCTEMPLATE",self.isMC)
0260 config_txt=config_txt.replace("APPLYBOWSTEMPLATE",self.applyBOWS)
0261 config_txt=config_txt.replace("EXTRACONDTEMPLATE",self.applyEXTRACOND)
0262 config_txt=config_txt.replace("USEFILELISTTEMPLATE","True")
0263 config_txt=config_txt.replace("RUNBOUNDARYTEMPLATE",self.runboundary)
0264 config_txt=config_txt.replace("LUMILISTTEMPLATE",self.lumilist)
0265 config_txt=config_txt.replace("MAXEVENTSTEMPLATE",self.maxevents)
0266 config_txt=config_txt.replace("GLOBALTAGTEMPLATE",self.gt)
0267 config_txt=config_txt.replace("ALLFROMGTTEMPLATE",self.allFromGT)
0268 config_txt=config_txt.replace("ALIGNOBJTEMPLATE",self.alignmentDB)
0269 config_txt=config_txt.replace("GEOMTAGTEMPLATE",self.alignmentTAG)
0270 config_txt=config_txt.replace("APEOBJTEMPLATE",self.apeDB)
0271 config_txt=config_txt.replace("ERRORTAGTEMPLATE",self.apeTAG)
0272 config_txt=config_txt.replace("BOWSOBJECTTEMPLATE",self.bowDB)
0273 config_txt=config_txt.replace("BOWSTAGTEMPLATE",self.bowTAG)
0274 config_txt=config_txt.replace("VERTEXTYPETEMPLATE",self.vertextype)
0275 config_txt=config_txt.replace("TRACKTYPETEMPLATE",self.tracktype)
0276 config_txt=config_txt.replace("PTCUTTEMPLATE",self.ptcut)
0277 config_txt=config_txt.replace("RUNCONTROLTEMPLATE",self.applyruncontrol)
0278 lfn_with_quotes = map(lambda x: "\'"+x+"\'",lfn)
0279 config_txt=config_txt.replace("FILESOURCETEMPLATE","["+",".join(lfn_with_quotes)+"]")
0280 config_txt=config_txt.replace("OUTFILETEMPLATE",self.output_full_name+".root")
0281
0282 fout.write(config_txt)
0283
0284 for line in fin.readlines():
0285
0286 if 'END OF EXTRA CONDITIONS' in line:
0287 for element in self.extraCondVect :
0288 if("Rcd" in element):
0289 params = self.extraCondVect[element].split(',')
0290
0291 fout.write(" \n")
0292 fout.write(" process.conditionsIn"+element+"= CalibTracker.Configuration.Common.PoolDBESSource_cfi.poolDBESSource.clone( \n")
0293 fout.write(" connect = cms.string('"+params[0]+"'), \n")
0294 fout.write(" toGet = cms.VPSet(cms.PSet(record = cms.string('"+element+"'), \n")
0295 fout.write(" tag = cms.string('"+params[1]+"'), \n")
0296 if (len(params)>2):
0297 fout.write(" label = cms.string('"+params[2]+"') \n")
0298 fout.write(" ) \n")
0299 fout.write(" ) \n")
0300 fout.write(" ) \n")
0301 fout.write(" process.prefer_conditionsIn"+element+" = cms.ESPrefer(\"PoolDBESSource\", \"conditionsIn"+element[0]+"\") \n \n")
0302
0303 fout.write(line)
0304
0305 fout.close()
0306
0307 def createTheLSFFile(self):
0308
0309
0310
0311 self.LSF_dir = os.path.join(self.the_dir,"LSF")
0312 if not os.path.exists(self.LSF_dir):
0313 os.makedirs(self.LSF_dir)
0314
0315 self.output_LSF_name=self.output_full_name+".lsf"
0316 fout=open(os.path.join(self.LSF_dir,self.output_LSF_name),'w')
0317
0318 job_name = self.output_full_name
0319
0320 log_dir = os.path.join(self.the_dir,"log")
0321 if not os.path.exists(log_dir):
0322 os.makedirs(log_dir)
0323
0324 fout.write("#!/bin/sh \n")
0325 fout.write("#BSUB -L /bin/sh\n")
0326 fout.write("#BSUB -J "+job_name+"\n")
0327 fout.write("#BSUB -o "+os.path.join(log_dir,job_name+".log")+"\n")
0328 fout.write("#BSUB -q cmscaf1nd \n")
0329 fout.write("JobName="+job_name+" \n")
0330 fout.write("OUT_DIR="+self.OUTDIR+" \n")
0331 fout.write("LXBATCH_DIR=`pwd` \n")
0332 fout.write("cd "+os.path.join(self.CMSSW_dir,"src")+" \n")
0333 fout.write("eval `scram runtime -sh` \n")
0334 fout.write("cd $LXBATCH_DIR \n")
0335 fout.write("cmsRun "+os.path.join(self.cfg_dir,self.outputCfgName)+" \n")
0336 fout.write("ls -lh . \n")
0337 fout.write("for RootOutputFile in $(ls *root ); do xrdcp -f ${RootOutputFile} root://eoscms//eos/cms${OUT_DIR}/${RootOutputFile} ; done \n")
0338 fout.write("for TxtOutputFile in $(ls *txt ); do xrdcp -f ${TxtOutputFile} root://eoscms//eos/cms${OUT_DIR}/${TxtOutputFile} ; done \n")
0339
0340 fout.close()
0341
0342 def getOutputFileName(self):
0343
0344 return os.path.join(self.OUTDIR,self.output_full_name+".root")
0345
0346 def submit(self):
0347
0348 print("submit job", self.job_id)
0349 job_name = self.output_full_name
0350 submitcommand1 = "chmod u+x " + os.path.join(self.LSF_dir,self.output_LSF_name)
0351 child1 = os.system(submitcommand1)
0352
0353
0354 self.batch_job_id = getCommandOutput("bsub < "+os.path.join(self.LSF_dir,self.output_LSF_name))
0355
0356 def getBatchjobId(self):
0357
0358 return self.batch_job_id.split("<")[1].split(">")[0]
0359
0360
0361 def main():
0362
0363
0364 global CopyRights
0365 print('\n'+CopyRights)
0366
0367
0368 input_CMSSW_BASE = os.environ.get('CMSSW_BASE')
0369 AnalysisStep_dir = os.path.join(input_CMSSW_BASE,"src/Alignment/OfflineValidation/test")
0370 sourceModule = os.path.join(input_CMSSW_BASE,"src/Alignment/OfflineValidation/test","PVValidation_HLTPhysics2015B_TkAlMinBias_cff.py")
0371 lib_path = os.path.abspath(AnalysisStep_dir)
0372 sys.path.append(lib_path)
0373
0374
0375 srcFiles = []
0376
0377 desc="""This is a description of %prog."""
0378 parser = OptionParser(description=desc,version='%prog version 0.1')
0379 parser.add_option('-s','--submit', help='job submitted', dest='submit', action='store_true', default=False)
0380 parser.add_option('-j','--jobname', help='task name', dest='taskname', action='store', default='')
0381 parser.add_option('-D','--dataset', help='selected dataset', dest='data', action='store' , default='')
0382 parser.add_option('-r','--doRunBased',help='selected dataset', dest='doRunBased', action='store_true' , default=False)
0383 parser.add_option('-i','--input', help='set input configuration (overrides default)', dest='inputconfig',action='store',default=None)
0384
0385 (opts, args) = parser.parse_args()
0386
0387 now = datetime.datetime.now()
0388 t = now.strftime("test_%Y_%m_%d_%H_%M_%S_DATA_")
0389 t+=opts.taskname
0390
0391 USER = os.environ.get('USER')
0392 eosdir=os.path.join("/store/caf/user",USER,"test_out",t)
0393
0394
0395
0396
0397 jobName = None
0398 isMC = None
0399 isDA = None
0400 doRunBased = False
0401 maxevents = None
0402
0403 gt = None
0404 allFromGT = None
0405 applyEXTRACOND = None
0406 extraCondVect = None
0407 alignmentDB = None
0408 alignmentTAG = None
0409 apeDB = None
0410 apeTAG = None
0411 applyBOWS = None
0412 bowDB = None
0413 bowTAG = None
0414
0415 vertextype = None
0416 tracktype = None
0417
0418 applyruncontrol = None
0419 ptcut = None
0420 runboundary = None
0421 lumilist = None
0422
0423 ConfigFile = opts.inputconfig
0424
0425 if ConfigFile is not None:
0426
0427 print("********************************************************")
0428 print("* Parsing from input file:", ConfigFile," ")
0429
0430
0431
0432
0433 config = BetterConfigParser()
0434 config.read(ConfigFile)
0435
0436
0437
0438
0439
0440
0441 jobName = [ConfigSectionMap(config,"Job")['jobname']]
0442 isDA = [ConfigSectionMap(config,"Job")['isda']]
0443 isMC = [ConfigSectionMap(config,"Job")['ismc']]
0444 doRunBased = opts.doRunBased
0445 maxevents = [ConfigSectionMap(config,"Job")['maxevents']]
0446
0447 gt = [ConfigSectionMap(config,"Conditions")['gt']]
0448 allFromGT = [ConfigSectionMap(config,"Conditions")['allFromGT']]
0449 applyEXTRACOND = [ConfigSectionMap(config,"Conditions")['applyextracond']]
0450 conditions = [config.getResultingSection("ExtraConditions")]
0451
0452 alignmentDB = [ConfigSectionMap(config,"Conditions")['alignmentdb']]
0453 alignmentTAG = [ConfigSectionMap(config,"Conditions")['alignmenttag']]
0454 apeDB = [ConfigSectionMap(config,"Conditions")['apedb']]
0455 apeTAG = [ConfigSectionMap(config,"Conditions")['apetag']]
0456 applyBOWS = [ConfigSectionMap(config,"Conditions")['applybows']]
0457 bowDB = [ConfigSectionMap(config,"Conditions")['bowdb']]
0458 bowTAG = [ConfigSectionMap(config,"Conditions")['bowtag']]
0459
0460 vertextype = [ConfigSectionMap(config,"Type")['vertextype']]
0461 tracktype = [ConfigSectionMap(config,"Type")['tracktype']]
0462
0463 applyruncontrol = [ConfigSectionMap(config,"Selection")['applyruncontrol']]
0464 ptcut = [ConfigSectionMap(config,"Selection")['ptcut']]
0465 runboundary = [ConfigSectionMap(config,"Selection")['runboundary']]
0466 lumilist = [ConfigSectionMap(config,"Selection")['lumilist']]
0467
0468 else :
0469
0470 print("********************************************************")
0471 print("* Parsing from command line *")
0472 print("********************************************************")
0473
0474 jobName = ['MinBiasQCD_CSA14Ali_CSA14APE']
0475 isDA = ['True']
0476 isMC = ['True']
0477 doRunBased = opts.doRunBased
0478 maxevents = ['10000']
0479
0480 gt = ['START53_V7A::All']
0481 allFromGT = ['False']
0482 applyEXTRACOND = ['False']
0483 conditions = [[('SiPixelTemplateDBObjectRcd','frontier://FrontierProd/CMS_COND_31X_PIXEL','SiPixelTemplates38T_2010_2011_mc'),
0484 ('SiPixelQualityFromDBRcd','frontier://FrontierProd/CMS_COND_31X_PIXEL','SiPixelQuality_v20_mc')]]
0485 alignmentDB = ['sqlite_file:/afs/cern.ch/cms/CAF/CMSALCA/ALCA_TRACKERALIGN/PayLoads/TkAl-14-02_CSA14/Alignments_CSA14_v1.db']
0486 alignmentTAG = ['TrackerCSA14Scenario']
0487 apeDB = ['sqlite_file:/afs/cern.ch/cms/CAF/CMSALCA/ALCA_TRACKERALIGN/PayLoads/TkAl-14-02_CSA14/AlignmentErrors_CSA14_v1.db']
0488 apeTAG = ['TrackerCSA14ScenarioErrors']
0489 applyBOWS = ['True']
0490 bowDB = ['frontier://FrontierProd/CMS_COND_310X_ALIGN']
0491 bowTAG = ['TrackerSurfaceDeformations_2011Realistic_v2_mc']
0492
0493 vertextype = ['offlinePrimaryVertices']
0494 tracktype = ['ALCARECOTkAlMinBias']
0495
0496 applyruncontrol = ['False']
0497 ptcut = ['3']
0498 runboundary = ['1']
0499 lumilist = ['']
0500
0501
0502
0503
0504
0505 print("********************************************************")
0506 print("* Configuration info *")
0507 print("********************************************************")
0508 print("- submitted : ",opts.submit)
0509 print("- Jobname : ",jobName)
0510 print("- use DA : ",isDA)
0511 print("- is MC : ",isMC)
0512 print("- is run-based: ",doRunBased)
0513 print("- evts/job : ",maxevents)
0514 print("- GlobatTag : ",gt)
0515 print("- allFromGT? : ",allFromGT)
0516 print("- extraCond? : ",applyEXTRACOND)
0517 print("- extraCond : ",conditions)
0518 print("- Align db : ",alignmentDB)
0519 print("- Align tag : ",alignmentTAG)
0520 print("- APE db : ",apeDB)
0521 print("- APE tag : ",apeTAG)
0522 print("- use bows? : ",applyBOWS)
0523 print("- K&B db : ",bowDB)
0524 print("- K&B tag : ",bowTAG)
0525 print("- VertexColl : ",vertextype)
0526 print("- TrackColl : ",tracktype)
0527 print("- RunControl? : ",applyruncontrol)
0528 print("- Pt> ",ptcut)
0529 print("- run= ",runboundary)
0530 print("- JSON : ",lumilist)
0531 print("********************************************************")
0532
0533 sublogging_dir = os.path.join(AnalysisStep_dir,"submissions")
0534 if not os.path.exists(sublogging_dir):
0535 os.makedirs(sublogging_dir)
0536 submission_log_file = os.path.join(sublogging_dir,"sub"+t+".log")
0537 log_fout = open(submission_log_file,'w')
0538 for iConf in range(len(jobName)):
0539 log_fout.write("============================================================ \n")
0540 log_fout.write("- timestamp : "+t.strip("test_")+"\n")
0541 log_fout.write("- submitted : "+str(opts.submit)+"\n")
0542 log_fout.write("- Jobname : "+jobName[iConf]+"\n")
0543 log_fout.write("- use DA : "+isDA[iConf]+"\n")
0544 log_fout.write("- is MC : "+isMC[iConf]+"\n")
0545 log_fout.write("- is run-based: "+str(doRunBased)+"\n")
0546 log_fout.write("- evts/job : "+maxevents[iConf]+"\n")
0547 log_fout.write("- GlobatTag : "+gt[iConf]+"\n")
0548 log_fout.write("- allFromGT? : "+allFromGT[iConf]+"\n")
0549 log_fout.write("- extraCond? : "+applyEXTRACOND[iConf]+"\n")
0550 for x in conditions:
0551 for attribute,value in x.items():
0552 log_fout.write(' - {} : {}'.format(attribute, value)+"\n")
0553 log_fout.write("- Align db : "+alignmentDB[iConf]+"\n")
0554 log_fout.write("- Align tag : "+alignmentTAG[iConf]+"\n")
0555 log_fout.write("- APE db : "+apeDB[iConf]+"\n")
0556 log_fout.write("- APE tag : "+apeTAG[iConf]+"\n")
0557 log_fout.write("- use bows? : "+applyBOWS[iConf]+"\n")
0558 log_fout.write("- K&B db : "+bowDB[iConf]+"\n")
0559 log_fout.write("- K&B tag : "+bowTAG[iConf]+"\n")
0560 log_fout.write("- VertexColl : "+vertextype[iConf]+"\n")
0561 log_fout.write("- TrackColl : "+tracktype[iConf]+"\n")
0562 log_fout.write("- RunControl? : "+applyruncontrol[iConf]+"\n")
0563 log_fout.write("- Pt> "+ptcut[iConf]+"\n")
0564 log_fout.write("- run= "+runboundary[iConf]+"\n")
0565 log_fout.write("- JSON : "+lumilist[iConf]+"\n")
0566 log_fout.write("- output EOS : "+eosdir+"\n")
0567
0568 print("Will run on ",len(jobName),"workflows")
0569
0570 for iConf in range(len(jobName)):
0571 print("Preparing",iConf," configurtion to run")
0572
0573
0574 scripts_dir = os.path.join(AnalysisStep_dir,"scripts")
0575 if not os.path.exists(scripts_dir):
0576 os.makedirs(scripts_dir)
0577 hadd_script_file = os.path.join(scripts_dir,jobName[iConf]+".sh")
0578 fout = open(hadd_script_file,'w')
0579
0580 output_file_list1=list()
0581 output_file_list2=list()
0582 output_file_list2.append("hadd ")
0583
0584 inputFiles = []
0585 myRuns = []
0586
0587 if (to_bool(isMC[iConf]) or (not to_bool(doRunBased))):
0588 if(to_bool(isMC[iConf])):
0589 print("this is MC")
0590 cmd = 'dasgoclient -query \'file dataset='+opts.data+'\''
0591 s = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
0592 out,err = s.communicate()
0593 mylist = out.split('\n')
0594 mylist.pop()
0595
0596
0597 splitList = split(mylist,10)
0598 for files in splitList:
0599 inputFiles.append(files)
0600 myRuns.append(str(1))
0601 else:
0602 print("this is DATA (not doing full run-based selection)")
0603 cmd = 'dasgoclient -query \'file dataset='+opts.data+' run='+runboundary[iConf]+'\''
0604
0605 s = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
0606 out,err = s.communicate()
0607 mylist = out.split('\n')
0608 mylist.pop()
0609
0610 print("mylist:",mylist)
0611 inputFiles.append(mylist)
0612 myRuns.append(str(runboundary[iConf]))
0613
0614 else:
0615 print("this is Data")
0616 print("doing run based selection")
0617 cmd = 'dasgoclient -query \'run dataset='+opts.data+'\''
0618 p = Popen(cmd , shell=True, stdout=PIPE, stderr=PIPE)
0619 out, err = p.communicate()
0620 listOfRuns=out.split('\n')
0621 listOfRuns.pop()
0622 listOfRuns.sort()
0623 myRuns = listOfRuns
0624 print("Will run on ",len(listOfRuns), " runs")
0625 print(listOfRuns)
0626
0627 procs = []
0628
0629 for run in listOfRuns:
0630
0631 cmd2 = ' dasgoclient -query \'file run='+run+' dataset='+opts.data+'\''
0632 q = Popen(cmd2 , shell=True, stdout=PIPE, stderr=PIPE)
0633 procs.append(q)
0634
0635
0636
0637
0638
0639 toolbar_width = len(listOfRuns)
0640
0641 print("********************************************************")
0642 print(" Retrieving run info")
0643
0644 for i,p in enumerate(procs):
0645 out2,err2 = p.communicate()
0646 mylist = out2.split('\n')
0647 mylist.pop()
0648 inputFiles.append(mylist)
0649
0650
0651 percent = float(i)/len(procs)
0652
0653 drawProgressBar(percent)
0654
0655 sys.stdout.write("\n")
0656
0657 for jobN,theSrcFiles in enumerate(inputFiles):
0658 print(jobN,"run",myRuns[jobN],theSrcFiles)
0659 thejobIndex=None
0660 batchJobIds = []
0661
0662
0663 if(to_bool(isMC[iConf])):
0664 thejobIndex=jobN
0665 else:
0666 thejobIndex=myRuns[jobN]
0667
0668 aJob = Job(thejobIndex,
0669 jobName[iConf],isDA[iConf],isMC[iConf],
0670 applyBOWS[iConf],applyEXTRACOND[iConf],conditions[iConf],
0671 myRuns[jobN], lumilist[iConf], maxevents[iConf],
0672 gt[iConf],allFromGT[iConf],
0673 alignmentDB[iConf], alignmentTAG[iConf],
0674 apeDB[iConf], apeTAG[iConf],
0675 bowDB[iConf], bowTAG[iConf],
0676 vertextype[iConf], tracktype[iConf],
0677 applyruncontrol[iConf],
0678 ptcut[iConf],input_CMSSW_BASE,AnalysisStep_dir)
0679
0680 aJob.setEOSout(eosdir)
0681 aJob.createTheCfgFile(theSrcFiles)
0682 aJob.createTheLSFFile()
0683
0684 output_file_list1.append("xrdcp root://eoscms//eos/cms"+aJob.getOutputFileName()+" /tmp/$USER/"+opts.taskname+" \n")
0685 if jobN == 0:
0686 output_file_list2.append("/tmp/$USER/"+opts.taskname+"/"+aJob.getOutputBaseName()+".root ")
0687 output_file_list2.append("/tmp/$USER/"+opts.taskname+"/"+os.path.split(aJob.getOutputFileName())[1]+" ")
0688
0689 if opts.submit:
0690 aJob.submit()
0691 batchJobIds.append(ajob.getBatchjobId())
0692 del aJob
0693
0694 if opts.submit:
0695 print("********************************************************")
0696 for theBatchJobId in batchJobIds:
0697 print("theBatchJobId is: ",theBatchJobId)
0698
0699 fout.write("#!/bin/bash \n")
0700 fout.write("MAIL = $USER@mail.cern.ch \n")
0701 fout.write("OUT_DIR = "+eosdir+ "\n")
0702 fout.write("echo $HOST | mail -s \"Harvesting job started\" $USER@mail.cern.ch \n")
0703 fout.write("cd "+os.path.join(input_CMSSW_BASE,"src")+"\n")
0704 fout.write("eval `scram r -sh` \n")
0705 fout.write("mkdir -p /tmp/$USER/"+opts.taskname+" \n")
0706 fout.writelines(output_file_list1)
0707 fout.writelines(output_file_list2)
0708 fout.write("\n")
0709 fout.write("echo \"xrdcp -f $FILE root://eoscms//eos/cms$OUT_DIR\" \n")
0710 fout.write("xrdcp -f root://eoscms//eos/cms$FILE $OUT_DIR \n")
0711 fout.write("echo \"Harvesting for complete; please find output at $OUT_DIR \" | mail -s \"Harvesting for" +opts.taskname +" compled\" $MAIL \n")
0712
0713 os.system("chmod u+x "+hadd_script_file)
0714
0715 conditions = '"' + " && ".join(["ended(" + jobId + ")" for jobId in batchJobIds]) + '"'
0716 print(conditions)
0717 lastJobCommand = "bsub -o harvester"+opts.taskname+".tmp -q 1nh -w "+conditions+" "+hadd_script_file
0718 print(lastJobCommand)
0719 if opts.submit:
0720 lastJobOutput = getCommandOutput(lastJobCommand)
0721 print(lastJobOutput)
0722
0723 fout.close()
0724 del output_file_list1
0725
0726 if __name__ == "__main__":
0727 main()