00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 """
00016 createPayload.py
00017
00018 A very simple script to handle payload for beam spot results
00019
00020 usage: %prog -d <data file/directory> -t <tag name>
00021 -c, --copy : Only copy files from input directory to test/workflow/files/
00022 -d, --data = DATA: Data file, or directory with data files.
00023 -I, --IOVbase = IOVBASE: options: runbase(default), lumibase, timebase
00024 -o, --overwrite : Overwrite results files when copying.
00025 -O, --Output = OUTPUT: Output directory for data files (workflow directory)
00026 -m, --merged : Use when data file contains combined results.
00027 -n, --newarchive : Create a new archive directory when copying.
00028 -t, --tag = TAG: Database tag name.
00029 -T, --Test : Upload files to Test dropbox for data validation.
00030 -u, --upload : Upload files to offline drop box via scp.
00031 -z, --zlarge : Enlarge sigmaZ to 10 +/- 0.005 cm.
00032
00033 Francisco Yumiceva (yumiceva@fnal.gov)
00034 Fermilab 2010
00035
00036 """
00037
00038
00039 import sys,os
00040 import commands, re, time
00041 import datetime
00042 from CommonMethods import *
00043
00044 workflowdir = 'test/workflow/'
00045 workflowdirLastPayloads = workflowdir + 'lastPayloads/'
00046 workflowdirTmp = workflowdir + 'tmp/'
00047 workflowdirArchive = workflowdir + 'archive/'
00048 optionstring = ''
00049 tagType = ''
00050
00051 def copyToWorkflowdir(path):
00052 global workflowdirArchive
00053 lsCommand = ''
00054 cpCommand = ''
00055 listoffiles = []
00056 tmplistoffiles = []
00057 if path.find('castor') != -1:
00058 print "Getting files from castor ..."
00059 lsCommand = 'ns'
00060 cpCommand = 'rf'
00061 elif not os.path.exists(path):
00062 exit("ERROR: File or directory " + path + " doesn't exist")
00063
00064 if path[len(path)-4:len(path)] != '.txt':
00065 if path[len(path)-1] != '/':
00066 path = path + '/'
00067
00068 aCommand = lsCommand + 'ls '+ path + " | grep .txt"
00069
00070 tmpstatus = commands.getstatusoutput( aCommand )
00071 tmplistoffiles = tmpstatus[1].split('\n')
00072 if len(tmplistoffiles) == 1:
00073 if tmplistoffiles[0] == '':
00074 exit('ERROR: No files found in directory ' + path)
00075 if tmplistoffiles[0].find('No such file or directory') != -1:
00076 exit("ERROR: File or directory " + path + " doesn't exist")
00077
00078 else:
00079 tmplistoffiles.append(path[path.rfind('/')+1:len(path)])
00080 path = path[0:path.rfind('/')+1]
00081
00082
00083 archiveName = path
00084 if path == './':
00085 archiveName = os.getcwd() + '/'
00086 archiveName = archiveName[archiveName[:len(archiveName)-1].rfind('/')+1:len(archiveName)]
00087 if path[:len(path)-1].rfind('/') != -1:
00088 archiveName = path[path[:len(path)-1].rfind('/')+1:len(path)]
00089
00090 workflowdirArchive = workflowdirArchive + archiveName
00091 if tagType != '' :
00092 workflowdirArchive = workflowdirArchive[:len(workflowdirArchive)-1] + '_' + tagType + '/'
00093 if not os.path.isdir(workflowdirArchive):
00094 os.mkdir(workflowdirArchive)
00095 elif(option.newarchive):
00096
00097
00098
00099
00100
00101 for n in range(1,100000):
00102 tryDir = workflowdirArchive[:len(workflowdirArchive)-1] + '_' + str(n) + '/'
00103 if not os.path.isdir(tryDir):
00104 workflowdirArchive = tryDir
00105 os.mkdir(workflowdirArchive)
00106 break
00107 elif n == 100000-1:
00108 exit('ERROR: Unbelievable! do you ever clean ' + workflowdir + '?. I think you have to remove some directories!')
00109
00110 for ifile in tmplistoffiles:
00111 if ifile.find('.txt') != -1:
00112 if os.path.isfile(workflowdirArchive+"/"+ifile):
00113 if option.overwrite:
00114 print "File " + ifile + " already exists in destination. We will overwrite it."
00115 else:
00116 print "File " + ifile + " already exists in destination. Keep original file."
00117 listoffiles.append( workflowdirArchive + ifile )
00118 continue
00119 listoffiles.append( workflowdirArchive + ifile )
00120
00121 aCommand = cpCommand + 'cp '+ path + ifile + " " + workflowdirArchive
00122 print " >> " + aCommand
00123 tmpstatus = commands.getstatusoutput( aCommand )
00124 return listoffiles
00125
00126 def mkWorkflowdir():
00127 global workflowdir
00128 global workflowdirLastPayloads
00129 global workflowdirTmp
00130 global workflowdirArchive
00131 if not os.path.isdir(workflowdir):
00132 print "Making " + workflowdir + " directory..."
00133 os.mkdir(workflowdir)
00134
00135 if not os.path.isdir(workflowdirLastPayloads):
00136 os.mkdir(workflowdirLastPayloads)
00137 else:
00138 os.system("rm -f "+ workflowdirLastPayloads + "*")
00139
00140 if not os.path.isdir(workflowdirTmp):
00141 os.mkdir(workflowdirTmp)
00142 else:
00143 os.system("rm -f "+ workflowdirTmp + "*")
00144
00145 if not os.path.isdir(workflowdirArchive):
00146 os.mkdir(workflowdirArchive)
00147
00148
00149 if __name__ == '__main__':
00150
00151
00152
00153
00154
00155
00156
00157
00158 option,args = parse(__doc__)
00159 if not args and not option: exit()
00160
00161 workflowdir = os.getenv("CMSSW_BASE") + "/src/RecoVertex/BeamSpotProducer/test/workflow/"
00162 if option.Output:
00163 workflowdir = option.Output
00164 if workflowdir[len(workflowdir)-1] != '/':
00165 workflowdir = workflowdir + '/'
00166 workflowdirLastPayloads = workflowdir + "lastPayloads/"
00167 workflowdirTmp = workflowdir + "tmp/"
00168 workflowdirArchive = workflowdir + "archive/"
00169
00170 if ( (option.data and option.tag) or (option.data and option.copy)):
00171 mkWorkflowdir()
00172
00173 if not option.data:
00174 print "ERROR: You must provide the data file or the a directory with data files"
00175 exit()
00176
00177 if option.copy:
00178 copyToWorkflowdir(option.data)
00179 exit("Files copied in " + workflowdirArchive)
00180
00181 tagname = ''
00182 if option.tag:
00183 tagname = option.tag
00184 if tagname.find("offline") != -1:
00185 tagType = "offline"
00186 elif tagname.find("prompt") != -1:
00187 tagType = "prompt"
00188 elif tagname.find("express") != -1 :
00189 tagType = "express"
00190 elif tagname.find("hlt") != -1:
00191 tagType = "hlt"
00192 else:
00193 print "I am assuming your tag is for the offline database..."
00194 tagType = "offline"
00195
00196 else:
00197 print "ERROR: You must provide the database tag name"
00198 exit()
00199
00200 IOVbase = 'runbase'
00201 timetype = 'runnumber'
00202 if option.IOVbase:
00203 if option.IOVbase != "runbase" and option.IOVbase != "lumibase" and option.IOVbase != "timebase":
00204 print "\n\n unknown iov base option: "+ option.IOVbase +" \n\n\n"
00205 exit()
00206 IOVbase = option.IOVbase
00207
00208 listoffiles = copyToWorkflowdir(option.data)
00209
00210 sortedlist = {}
00211
00212 for beam_file in listoffiles:
00213
00214 if len(listoffiles)==1 and option.merged:
00215 mergedfile = open(beam_file)
00216 alllines = mergedfile.readlines()
00217 npayloads = len(alllines)/23
00218 for i in range(0,npayloads):
00219 block = alllines[i * 23: (i+1)*23]
00220
00221
00222 line = block[0]
00223 atime = line.split()[1]
00224 sortedlist[atime] = block
00225 break
00226
00227 tmpfile = open(beam_file)
00228 atime = ''
00229 arun = ''
00230 alumis = ''
00231 skip = False
00232 for line in tmpfile:
00233 if line.find('Runnumber') != -1:
00234 arun = line.split()[1]
00235 if line.find("EndTimeOfFit") != -1:
00236 atime = time.strptime(line.split()[1] + " " + line.split()[2] + " " + line.split()[3],"%Y.%m.%d %H:%M:%S %Z")
00237 if line.find("LumiRange") != -1:
00238 alumi = line.split()[3]
00239 if line.find('Type') != -1 and line.split()[1] == '0':
00240 skip = True
00241 if skip:
00242 print " zero fit result, skip file " + beam_file + " with time stamp:"
00243 print " run " + arun + " lumis " + alumis
00244 else:
00245 sortedlist[int(pack(int(arun), int(alumi)))] = beam_file
00246
00247 tmpfile.close()
00248
00249 keys = sortedlist.keys()
00250 keys.sort()
00251
00252
00253 if not os.path.isdir(workflowdirArchive + "AllIOVs"):
00254 os.mkdir(workflowdirArchive + "AllIOVs")
00255 allbeam_file = workflowdirArchive + "AllIOVs/" + tagname + "_all_IOVs.txt"
00256
00257
00258 allfile = open( allbeam_file, 'a')
00259 print " merging all results into file: " + allbeam_file
00260
00261
00262 if os.path.exists(workflowdirArchive+"payloads/Combined.db"):
00263 os.system("rm "+workflowdirArchive+"payloads/Combined.db")
00264
00265
00266 nfile = 0
00267 iov_since_first = '1'
00268 total_files = len(keys)
00269
00270 destDB = 'oracle://cms_orcon_prod/CMS_COND_31X_BEAMSPOT'
00271 if option.Test:
00272 destDB = 'oracle://cms_orcoff_prep/CMS_COND_BEAMSPOT'
00273
00274 iov_comment = 'Beam spot position'
00275 for key in keys:
00276
00277 iov_since = '1'
00278 iov_till = ''
00279
00280 suffix = "_" + str(nfile)
00281 writedb_template = os.getenv("CMSSW_BASE") + "/src/RecoVertex/BeamSpotProducer/test/write2DB_template.py"
00282 readdb_template = os.getenv("CMSSW_BASE") + "/src/RecoVertex/BeamSpotProducer/test/readDB_template.py"
00283 sqlite_file_name = tagname + suffix
00284 sqlite_file = workflowdirTmp + sqlite_file_name + '.db'
00285 metadata_file = workflowdirTmp + sqlite_file_name + '.txt'
00286 nfile = nfile + 1
00287
00288
00289
00290 beam_file = sortedlist[key]
00291 tmp_datafilename = workflowdirTmp+"tmp_datafile.txt"
00292 if option.merged:
00293 tmpfile = file(tmp_datafilename,'w')
00294 tmpfile.writelines(sortedlist[key])
00295 tmpfile.close()
00296 beam_file = tmp_datafilename
00297
00298 print "read input beamspot file: " + beam_file
00299 tmpfile = open(beam_file)
00300 beam_file_tmp = workflowdirTmp + beam_file[beam_file.rfind('/')+1:] + ".tmp"
00301 newtmpfile = open(beam_file_tmp,"w")
00302 tmp_run = ""
00303 tmp_lumi_since = ""
00304 tmp_lumi_till = ""
00305 for line in tmpfile:
00306 if line.find("Runnumber") != -1:
00307 iov_since = line.split()[1]
00308 iov_till = iov_since
00309 tmp_run = line.split()[1]
00310 elif line.find("LumiRange") != -1:
00311 tmp_lumi_since = line.split()[1]
00312 tmp_lumi_till = line.split()[3]
00313 elif line.find("BeginTimeOfFit") == -1 and line.find("EndTimeOfFit") == -1 and line.find("LumiRange") == -1:
00314 if line.find("sigmaZ0") != -1 and option.zlarge:
00315 line = "sigmaZ0 10\n"
00316 if line.find("Cov(3,j)") != -1 and option.zlarge:
00317 line = "Cov(3,j) 0 0 0 2.5e-05 0 0 0\n"
00318 newtmpfile.write(line)
00319 allfile.write(line)
00320
00321
00322 if IOVbase == "lumibase":
00323 timetype = "lumiid"
00324 iov_since = str( pack(int(tmp_run), int(tmp_lumi_since)) )
00325 iov_till = str( pack(int(tmp_run), int(tmp_lumi_till)) )
00326
00327 if nfile == 1:
00328 iov_since_first = iov_since
00329
00330 tmpfile.close()
00331 newtmpfile.close()
00332 if option.copy:
00333 continue
00334
00335 beam_file = beam_file_tmp
00336
00337 if not writeSqliteFile(sqlite_file,tagname,timetype,beam_file,writedb_template,workflowdirTmp):
00338 print "An error occurred while writing the sqlite file: " + sqlite_file
00339
00340 commands.getstatusoutput('rm -f ' + beam_file)
00341
00342 readSqliteFile(sqlite_file,tagname,readdb_template,workflowdirTmp)
00343
00344
00345 if not os.path.isdir(workflowdirArchive + 'payloads'):
00346 os.mkdir(workflowdirArchive + 'payloads')
00347
00348 print " merge sqlite file ..."
00349 appendSqliteFile("Combined.db", sqlite_file, tagname, iov_since, iov_till ,workflowdirTmp)
00350
00351
00352 if nfile == total_files:
00353 print " this is the last IOV. You can use this payload for express and prompt conditions."
00354 os.system("cp "+sqlite_file+ " "+workflowdirArchive+"payloads/express.db")
00355 print "a copy of this payload has been placed at:"
00356 print workflowdirArchive+"payloads/express.db"
00357
00358
00359 os.system("rm "+ sqlite_file)
00360 print " clean up done."
00361
00362 os.system("mv " + workflowdirTmp + "Combined.db " + workflowdirArchive + "payloads/")
00363 allfile.close()
00364
00365
00366
00367 print " create MERGED payload card for dropbox ..."
00368
00369 sqlite_file = workflowdirArchive+'payloads/Combined.db'
00370 metadata_file = workflowdirArchive+'payloads/Combined.txt'
00371 dfile = open(metadata_file,'w')
00372
00373 dfile.write('destDB '+ destDB +'\n')
00374 dfile.write('tag '+ tagname +'\n')
00375 dfile.write('inputtag' +'\n')
00376 dfile.write('since ' + iov_since_first +'\n')
00377
00378 if IOVbase == "runbase":
00379 dfile.write('Timetype runnumber\n')
00380 elif IOVbase == "lumibase":
00381 dfile.write('Timetype lumiid\n')
00382 checkType = tagType
00383 if tagType == "express":
00384 checkType = "hlt"
00385 dfile.write('IOVCheck ' + checkType + '\n')
00386 dfile.write('usertext ' + iov_comment +'\n')
00387
00388 dfile.close()
00389
00390 uuid = commands.getstatusoutput('uuidgen -t')[1]
00391 final_sqlite_file_name = tagname + '@' + uuid
00392
00393 if not os.path.isdir(workflowdirArchive + 'payloads'):
00394 os.mkdir(workflowdirArchive + 'payloads')
00395 commands.getstatusoutput('cp ' + sqlite_file + ' ' + workflowdirArchive + 'payloads/' + final_sqlite_file_name + '.db')
00396 commands.getstatusoutput('cp ' + metadata_file + ' ' + workflowdirArchive + 'payloads/' + final_sqlite_file_name + '.txt')
00397
00398 commands.getstatusoutput('mv ' + sqlite_file + ' ' + workflowdirLastPayloads + final_sqlite_file_name + '.db')
00399 commands.getstatusoutput('mv ' + metadata_file + ' ' + workflowdirLastPayloads + final_sqlite_file_name + '.txt')
00400
00401 print workflowdirLastPayloads + final_sqlite_file_name + '.db'
00402 print workflowdirLastPayloads + final_sqlite_file_name + '.txt'
00403
00404 if option.upload:
00405 print " scp files to offline Drop Box"
00406 dropbox = "/DropBox"
00407 if option.Test:
00408 dropbox = "/DropBox_test"
00409
00410 uploadSqliteFile(workflowdirLastPayloads,final_sqlite_file_name,dropbox)