00001 import os
00002 import coral,datetime
00003 from RecoLuminosity.LumiDB import nameDealer,lumiTime,CommonUtil
00004 import array
00005 from RecoLuminosity.LumiDB import argparse, nameDealer, selectionParser, hltTrgSeedMapper, \
00006 connectstrParser, cacheconfigParser, tablePrinter, csvReporter, csvSelectionParser
00007 from RecoLuminosity.LumiDB.wordWrappers import wrap_always, wrap_onspace, wrap_onspace_strict
00008 from pprint import pprint, pformat
00009
00010 '''
00011 This module defines lowlevel SQL query API for lumiDB
00012 We do not like range queries so far because of performance of range scan.Use only necessary.
00013 The principle is to query by runnumber and per each coral queryhandle
00014 Try reuse db session/transaction and just renew query handle each time to reduce metadata queries.
00015 Avoid unnecessary explicit order by
00016 Do not handle transaction in here.
00017 Do not do explicit del queryhandle in here.
00018 Note: all the returned dict format are not sorted by itself.Sort it outside if needed.
00019 '''
00020
00021
00022 class ParametersObject (object):
00023
00024 def __init__ (self):
00025 self.norm = 1.0
00026 self.lumiversion = '0001'
00027 self.NBX = 3564
00028 self.rotationRate = 11245.613
00029 self.normFactor = 6.37
00030 self.beammode = ''
00031 self.verbose = False
00032 self.noWarnings = False
00033 self.lumischema = 'CMS_LUMI_PROD'
00034
00035 self.lumisummaryname = 'LUMISUMMARY'
00036 self.lumidetailname = 'LUMIDETAIL'
00037 self.lumiXing = False
00038 self.xingMinLum = 1.0e-4
00039 self.xingIndex = 5
00040 self.minBiasXsec = 71300
00041 self.pileupHistName = 'pileup'
00042 self.maxPileupBin = 10
00043 self.calculateTimeParameters()
00044
00045 def calculateTimeParameters (self):
00046 '''Given the rotation rate, calculate lumi section length and
00047 rotation time. This should be called if rotationRate is
00048 updated.'''
00049 self.rotationTime = 1 / self.rotationRate
00050 self.lumiSectionLen = 2**18 * self.rotationTime
00051
00052 def defaultfrontierConfigString (self):
00053 return '''<frontier-connect><proxy url = "http://cmst0frontier.cern.ch:3128"/><proxy url = "http://cmst0frontier.cern.ch:3128"/><proxy url = "http://cmst0frontier1.cern.ch:3128"/><proxy url = "http://cmst0frontier2.cern.ch:3128"/><server url = "http://cmsfrontier.cern.ch:8000/FrontierInt"/><server url = "http://cmsfrontier.cern.ch:8000/FrontierInt"/><server url = "http://cmsfrontier1.cern.ch:8000/FrontierInt"/><server url = "http://cmsfrontier2.cern.ch:8000/FrontierInt"/><server url = "http://cmsfrontier3.cern.ch:8000/FrontierInt"/><server url = "http://cmsfrontier4.cern.ch:8000/FrontierInt"/></frontier-connect>'''
00054
00055 def lslengthsec (numorbit, numbx):
00056
00057 l = numorbit * numbx * 25.0e-09
00058 return l
00059
00060 def lsBylsLumi (deadtable):
00061 """
00062 input: {lsnum:[deadtime, instlumi, bit_0, norbits,prescale...]}
00063 output: {lsnum:[instlumi, recordedlumi...]}
00064 """
00065 result = {}
00066 for myls, deadArray in deadtable.items():
00067 lstime = lslengthsec (deadArray[3], 3564)
00068 instlumi = deadArray[1] * lstime
00069 if float( deadArray[2] ) == 0.0:
00070 deadfrac = 1.0
00071 else:
00072 deadfrac = float (deadArray[0]) / (float (deadArray[2])*float(deadArray[4]))
00073 recordedLumi = instlumi * (1.0 - deadfrac)
00074 myLsList = [instlumi, recordedLumi]
00075
00076 if len (deadArray) > 5:
00077 myLsList.extend (deadArray[5:])
00078 result[myls] = myLsList
00079 return result
00080
00081
00082 def deliveredLumiForRange (dbsession, parameters, inputRange):
00083 '''Takes either single run as a string or dictionary of run ranges'''
00084 lumidata = []
00085
00086 if isinstance (inputRange, str):
00087 lumidata.append( deliveredLumiForRun (dbsession, parameters, inputRange) )
00088 else:
00089
00090 for run in sorted( inputRange.runs() ):
00091 if parameters.verbose:
00092 print "run", run
00093 lumidata.append( deliveredLumiForRun (dbsession, parameters, run) )
00094
00095 return lumidata
00096
00097
00098 def recordedLumiForRange (dbsession, parameters, inputRange):
00099 '''Takes either single run as a string or dictionary of run ranges'''
00100 lumidata = []
00101
00102 if isinstance (inputRange, str):
00103 lumiDataPiece = recordedLumiForRun (dbsession, parameters, inputRange)
00104 if parameters.lumiXing:
00105
00106 xingLumiDict = xingLuminosityForRun (dbsession, inputRange,
00107 parameters)
00108 mergeXingLumi (lumiDataPiece, xingLumiDict)
00109 lumidata.append (lumiDataPiece)
00110
00111 else:
00112
00113 runLsDict = {}
00114 maxLumiSectionDict = {}
00115 for (run, lslist) in sorted (inputRange.runsandls().items() ):
00116 if(len(lslist)!=0):
00117 maxLumiSectionDict[run] = max ( max (lslist),
00118 maxLumiSectionDict.get(run,0) )
00119 runLsDict.setdefault (run, []).append (lslist)
00120 for run, metaLsList in sorted (runLsDict.iteritems()):
00121 if parameters.verbose:
00122 print "run", run
00123 runLumiData = []
00124 for lslist in metaLsList:
00125 runLumiData.append( recordedLumiForRun (dbsession, parameters,
00126 run, lslist) )
00127 if parameters.lumiXing:
00128
00129 xingLumiDict = xingLuminosityForRun (dbsession, run,
00130 parameters,
00131 maxLumiSection = \
00132 maxLumiSectionDict[run])
00133
00134 for lumiDataPiece in runLumiData:
00135 mergeXingLumi (lumiDataPiece, xingLumiDict)
00136 lumidata.append (lumiDataPiece)
00137 else:
00138 lumidata.extend( runLumiData )
00139 return lumidata
00140
00141
00142
00143 def deliveredLumiForRun (dbsession, parameters, runnum):
00144 """
00145 select sum (INSTLUMI), count (INSTLUMI) from lumisummary where runnum = 124025 and lumiversion = '0001';
00146 select INSTLUMI,NUMORBIT from lumisummary where runnum = 124025 and lumiversion = '0001'
00147 query result unit E27cm^-2 (= 1 / mb)"""
00148
00149
00150
00151 delivered = 0.0
00152 totalls = 0
00153 try:
00154 conditionstring="RUNNUM = :runnum AND LUMIVERSION = :lumiversion"
00155 dbsession.transaction().start (True)
00156 schema = dbsession.nominalSchema()
00157 query = schema.tableHandle (nameDealer.lumisummaryTableName()).newQuery()
00158
00159
00160 query.addToOutputList("INSTLUMI",'instlumi')
00161 query.addToOutputList ("NUMORBIT", "norbits")
00162 queryBind = coral.AttributeList()
00163 queryBind.extend ("runnum", "unsigned int")
00164 queryBind.extend ("lumiversion", "string")
00165 queryBind["runnum"].setData (int (runnum))
00166 queryBind["lumiversion"].setData (parameters.lumiversion)
00167
00168 if len(parameters.beammode)!=0:
00169 conditionstring=conditionstring+' and BEAMSTATUS=:beamstatus'
00170 queryBind.extend('beamstatus','string')
00171 queryBind['beamstatus'].setData(parameters.beammode)
00172 result = coral.AttributeList()
00173 result.extend ("instlumi", "float")
00174 result.extend ("norbits", "unsigned int")
00175 query.defineOutput (result)
00176 query.setCondition (conditionstring,queryBind)
00177
00178
00179 cursor = query.execute()
00180 while cursor.next():
00181 instlumi = cursor.currentRow()['instlumi'].data()
00182 norbits = cursor.currentRow()['norbits'].data()
00183
00184 if instlumi is not None and norbits is not None:
00185 lstime = lslengthsec(norbits, parameters.NBX)
00186 delivered=delivered+instlumi*parameters.norm*lstime
00187 totalls+=1
00188 del query
00189 dbsession.transaction().commit()
00190 lumidata = []
00191 if delivered == 0.0:
00192 lumidata = [str (runnum), 'N/A', 'N/A', 'N/A']
00193 else:
00194 lumidata = [str (runnum), str (totalls), '%.3f'%delivered, parameters.beammode]
00195 return lumidata
00196 except Exception, e:
00197 print str (e)
00198 dbsession.transaction().rollback()
00199 del dbsession
00200
00201 def recordedLumiForRun (dbsession, parameters, runnum, lslist = None):
00202 """
00203 lslist = [] means take none in the db
00204 lslist = None means to take all in the db
00205 output: ['runnumber', 'trgtable{}', 'deadtable{}']
00206 """
00207 recorded = 0.0
00208 lumidata = []
00209 trgtable = {}
00210 deadtable = {}
00211 lumidata.append (runnum)
00212 lumidata.append (trgtable)
00213 lumidata.append (deadtable)
00214 collectedseeds = []
00215 conditionstring='trghltmap.HLTKEY = cmsrunsummary.HLTKEY AND cmsrunsummary.RUNNUM = :runnumber'
00216 try:
00217 dbsession.transaction().start (True)
00218 schema = dbsession.nominalSchema()
00219 query = schema.newQuery()
00220 query.addToTableList (nameDealer.cmsrunsummaryTableName(), 'cmsrunsummary')
00221 query.addToTableList (nameDealer.trghltMapTableName(), 'trghltmap')
00222 queryCondition = coral.AttributeList()
00223 queryCondition.extend ("runnumber", "unsigned int")
00224 queryCondition["runnumber"].setData (int (runnum))
00225 query.setCondition (conditionstring,queryCondition)
00226 query.addToOutputList ("trghltmap.HLTPATHNAME", "hltpathname")
00227 query.addToOutputList ("trghltmap.L1SEED", "l1seed")
00228 result = coral.AttributeList()
00229 result.extend ("hltpathname", "string")
00230 result.extend ("l1seed", "string")
00231 query.defineOutput (result)
00232 cursor = query.execute()
00233 while cursor.next():
00234 hltpathname = cursor.currentRow()["hltpathname"].data()
00235 l1seed = cursor.currentRow()["l1seed"].data()
00236 collectedseeds.append ( (hltpathname, l1seed))
00237
00238 del query
00239 dbsession.transaction().commit()
00240
00241 for (hname, sname) in collectedseeds:
00242 l1bitname = hltTrgSeedMapper.findUniqueSeed (hname, sname)
00243
00244 if l1bitname:
00245 lumidata[1][hname] = []
00246 lumidata[1][hname].append (l1bitname.replace ('\"', ''))
00247 dbsession.transaction().start (True)
00248 schema = dbsession.nominalSchema()
00249 hltprescQuery = schema.tableHandle (nameDealer.hltTableName()).newQuery()
00250 hltprescQuery.addToOutputList ("PATHNAME", "hltpath")
00251 hltprescQuery.addToOutputList ("PRESCALE", "hltprescale")
00252 hltprescCondition = coral.AttributeList()
00253 hltprescCondition.extend ('runnumber', 'unsigned int')
00254 hltprescCondition.extend ('cmslsnum', 'unsigned int')
00255 hltprescCondition.extend ('inf', 'unsigned int')
00256 hltprescResult = coral.AttributeList()
00257 hltprescResult.extend ('hltpath', 'string')
00258 hltprescResult.extend ('hltprescale', 'unsigned int')
00259 hltprescQuery.defineOutput (hltprescResult)
00260 hltprescCondition['runnumber'].setData (int (runnum))
00261 hltprescCondition['cmslsnum'].setData (1)
00262 hltprescCondition['inf'].setData (0)
00263 hltprescQuery.setCondition ("RUNNUM = :runnumber and CMSLSNUM = :cmslsnum and PRESCALE != :inf",
00264 hltprescCondition)
00265 cursor = hltprescQuery.execute()
00266 while cursor.next():
00267 hltpath = cursor.currentRow()['hltpath'].data()
00268 hltprescale = cursor.currentRow()['hltprescale'].data()
00269 if lumidata[1].has_key (hltpath):
00270 lumidata[1][hltpath].append (hltprescale)
00271
00272 cursor.close()
00273 del hltprescQuery
00274 dbsession.transaction().commit()
00275 dbsession.transaction().start (True)
00276 schema = dbsession.nominalSchema()
00277 query = schema.newQuery()
00278 query.addToTableList (nameDealer.trgTableName(), 'trg')
00279 query.addToTableList (nameDealer.lumisummaryTableName(), 'lumisummary')
00280 queryCondition = coral.AttributeList()
00281 queryCondition.extend ("runnumber", "unsigned int")
00282 queryCondition.extend ("lumiversion", "string")
00283 queryCondition["runnumber"].setData (int (runnum))
00284 queryCondition["lumiversion"].setData (parameters.lumiversion)
00285 conditionstring='lumisummary.RUNNUM =:runnumber and lumisummary.LUMIVERSION =:lumiversion AND lumisummary.CMSLSNUM=trg.CMSLSNUM and lumisummary.RUNNUM=trg.RUNNUM'
00286 if len(parameters.beammode)!=0:
00287 conditionstring=conditionstring+' and lumisummary.BEAMSTATUS=:beamstatus'
00288 queryCondition.extend('beamstatus','string')
00289 queryCondition['beamstatus'].setData(parameters.beammode)
00290 query.setCondition(conditionstring,queryCondition)
00291 query.addToOutputList ("lumisummary.CMSLSNUM", "cmsls")
00292 query.addToOutputList ("lumisummary.INSTLUMI", "instlumi")
00293 query.addToOutputList ("lumisummary.NUMORBIT", "norbits")
00294 query.addToOutputList ("trg.TRGCOUNT", "trgcount")
00295 query.addToOutputList ("trg.BITNAME", "bitname")
00296 query.addToOutputList ("trg.DEADTIME", "trgdeadtime")
00297 query.addToOutputList ("trg.PRESCALE", "trgprescale")
00298 query.addToOutputList ("trg.BITNUM", "trgbitnum")
00299
00300 result = coral.AttributeList()
00301 result.extend ("cmsls", "unsigned int")
00302 result.extend ("instlumi", "float")
00303 result.extend ("norbits", "unsigned int")
00304 result.extend ("trgcount", "unsigned int")
00305 result.extend ("bitname", "string")
00306 result.extend ("trgdeadtime", "unsigned long long")
00307 result.extend ("trgprescale", "unsigned int")
00308 result.extend ("trgbitnum", "unsigned int")
00309 trgprescalemap = {}
00310 query.defineOutput (result)
00311 cursor = query.execute()
00312 while cursor.next():
00313 cmsls = cursor.currentRow()["cmsls"].data()
00314 instlumi = cursor.currentRow()["instlumi"].data()*parameters.norm
00315 norbits = cursor.currentRow()["norbits"].data()
00316 trgcount = cursor.currentRow()["trgcount"].data()
00317 trgbitname = cursor.currentRow()["bitname"].data()
00318 trgdeadtime = cursor.currentRow()["trgdeadtime"].data()
00319 trgprescale = cursor.currentRow()["trgprescale"].data()
00320 trgbitnum = cursor.currentRow()["trgbitnum"].data()
00321 if cmsls == 1:
00322 if not trgprescalemap.has_key (trgbitname):
00323 trgprescalemap[trgbitname] = trgprescale
00324 if trgbitnum == 0:
00325 if not deadtable.has_key (cmsls):
00326 deadtable[cmsls] = []
00327 deadtable[cmsls].append (trgdeadtime)
00328 deadtable[cmsls].append (instlumi)
00329 deadtable[cmsls].append (trgcount)
00330 deadtable[cmsls].append (norbits)
00331 deadtable[cmsls].append (trgprescale)
00332 cursor.close()
00333 del query
00334 dbsession.transaction().commit()
00335
00336
00337
00338
00339
00340
00341
00342 for hpath, trgdataseq in lumidata[1].items():
00343 bitn = trgdataseq[0]
00344 if trgprescalemap.has_key (bitn) and len (trgdataseq) == 2:
00345 lumidata[1][hpath].append (trgprescalemap[bitn])
00346
00347 lumidata[2] = filterDeadtable (deadtable, lslist)
00348
00349 if not parameters.noWarnings:
00350 if len(lumidata[2])!=0:
00351 for lumi, deaddata in lumidata[2].items():
00352 if deaddata[1] == 0.0 and deaddata[2]!=0 and deaddata[0]!=0:
00353 print '[Warning] : run %s :ls %d has 0 instlumi but trigger has data' % (runnum, lumi)
00354 if (deaddata[2] == 0 or deaddata[0] == 0) and deaddata[1]!=0.0:
00355 print '[Warning] : run %s :ls %d has 0 dead counts or 0 zerobias bit counts, but inst!=0' % (runnum, lumi)
00356
00357 except Exception, e:
00358 print str (e)
00359 dbsession.transaction().rollback()
00360 del dbsession
00361
00362
00363
00364
00365 return lumidata
00366
00367
00368 def filterDeadtable (inTable, lslist):
00369 result = {}
00370 if lslist is None:
00371 return inTable
00372 if len (lslist) == 0:
00373 return result
00374 for existingLS in inTable.keys():
00375 if existingLS in lslist:
00376 result[existingLS] = inTable[existingLS]
00377 return result
00378
00379
00380 def printDeliveredLumi (lumidata, mode):
00381 labels = [ ('Run', 'Delivered LS', 'Delivered'+u' (/\u03bcb)'.encode ('utf-8'), 'Beam Mode')]
00382 print tablePrinter.indent (labels+lumidata, hasHeader = True, separateRows = False,
00383 prefix = '| ', postfix = ' |', justify = 'right',
00384 delim = ' | ', wrapfunc = lambda x: wrap_onspace (x, 20) )
00385
00386 def dumpData (lumidata, filename):
00387 """
00388 input params: lumidata [{'fieldname':value}]
00389 filename csvname
00390 """
00391
00392 r = csvReporter.csvReporter(filename)
00393 r.writeRows(lumidata)
00394
00395 def calculateTotalRecorded (deadtable):
00396 """
00397 input: {lsnum:[deadtime, instlumi, bit_0, norbits,prescale]}
00398 output: recordedLumi
00399 """
00400 recordedLumi = 0.0
00401 for myls, d in deadtable.items():
00402 instLumi = d[1]
00403
00404
00405 if float (d[2]) == 0.0:
00406 deadfrac = 1.0
00407 else:
00408 deadfrac = float (d[0])/(float (d[2])*float (d[-1]))
00409 lstime = lslengthsec (d[3], 3564)
00410 recordedLumi += instLumi* (1.0-deadfrac)*lstime
00411 return recordedLumi
00412
00413
00414 def splitlistToRangeString (inPut):
00415 result = []
00416 first = inPut[0]
00417 last = inPut[0]
00418 result.append ([inPut[0]])
00419 counter = 0
00420 for i in inPut[1:]:
00421 if i == last+1:
00422 result[counter].append (i)
00423 else:
00424 counter += 1
00425 result.append ([i])
00426 last = i
00427 return ', '.join (['['+str (min (x))+'-'+str (max (x))+']' for x in result])
00428
00429
00430 def calculateEffective (trgtable, totalrecorded):
00431 """
00432 input: trgtable{hltpath:[l1seed, hltprescale, l1prescale]}, totalrecorded (float)
00433 output:{hltpath, recorded}
00434 """
00435
00436 result = {}
00437 for hltpath, data in trgtable.items():
00438 if len (data) == 3:
00439 result[hltpath] = totalrecorded/ (data[1]*data[2])
00440 else:
00441 result[hltpath] = 0.0
00442 return result
00443
00444
00445 def getDeadfractions (deadtable):
00446 """
00447 inputtable: {lsnum:[deadtime, instlumi, bit_0, norbits,bit_0_prescale]}
00448 output: {lsnum:deadfraction}
00449 """
00450 result = {}
00451 for myls, d in deadtable.items():
00452
00453 if float (d[2]) == 0.0:
00454 deadfrac = -1.0
00455 else:
00456 deadfrac = float (d[0])/ (float (d[2])*float(d[-1]))
00457 result[myls] = deadfrac
00458 return result
00459
00460 def printPerLSLumi (lumidata, isVerbose = False):
00461 '''
00462 input lumidata [['runnumber', 'trgtable{}', 'deadtable{}']]
00463 deadtable {lsnum:[deadtime, instlumi, bit_0, norbits,prescale]}
00464 '''
00465 datatoprint = []
00466 totalrow = []
00467 labels = [ ('Run', 'LS', 'Delivered', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'))]
00468 lastrowlabels = [ ('Selected LS', 'Delivered'+u' (/\u03bcb)'.encode ('utf-8'), 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'))]
00469 totalDeliveredLS = 0
00470 totalSelectedLS = 0
00471 totalDelivered = 0.0
00472 totalRecorded = 0.0
00473
00474 for perrundata in lumidata:
00475 runnumber = perrundata[0]
00476 deadtable = perrundata[2]
00477 lumiresult = lsBylsLumi (deadtable)
00478 totalSelectedLS = totalSelectedLS+len (deadtable)
00479 for lsnum, dataperls in lumiresult.items():
00480 rowdata = []
00481 if len (dataperls) == 0:
00482 rowdata += [str (runnumber), str (lsnum), 'N/A', 'N/A']
00483 else:
00484 rowdata += [str (runnumber), str (lsnum), '%.3f' % (dataperls[0]), '%.3f' % (dataperls[1])]
00485 totalDelivered = totalDelivered+dataperls[0]
00486 totalRecorded = totalRecorded+dataperls[1]
00487 datatoprint.append (rowdata)
00488 totalrow.append ([str (totalSelectedLS), '%.3f'% (totalDelivered), '%.3f'% (totalRecorded)])
00489 print ' == = '
00490 print tablePrinter.indent (labels+datatoprint, hasHeader = True, separateRows = False, prefix = '| ',
00491 postfix = ' |', justify = 'right', delim = ' | ',
00492 wrapfunc = lambda x: wrap_onspace_strict (x, 22))
00493 print ' == = Total : '
00494 print tablePrinter.indent (lastrowlabels+totalrow, hasHeader = True, separateRows = False, prefix = '| ',
00495 postfix = ' |', justify = 'right', delim = ' | ',
00496 wrapfunc = lambda x: wrap_onspace (x, 20))
00497
00498
00499 def dumpPerLSLumi (lumidata):
00500 datatodump = []
00501 for perrundata in lumidata:
00502 runnumber = perrundata[0]
00503 deadtable = perrundata[2]
00504 lumiresult = lsBylsLumi (deadtable)
00505 for lsnum, dataperls in lumiresult.items():
00506 rowdata = []
00507 if len (dataperls) == 0:
00508 rowdata += [str (runnumber), str (lsnum), 'N/A', 'N/A']
00509 else:
00510 rowdata += [str (runnumber), str (lsnum), dataperls[0], dataperls[1]]
00511 if len (dataperls) > 2:
00512 rowdata.extend ( flatten (dataperls[2:]) )
00513 datatodump.append (rowdata)
00514 return datatodump
00515
00516
00517 def printRecordedLumi (lumidata, isVerbose = False, hltpath = ''):
00518 datatoprint = []
00519 totalrow = []
00520 labels = [ ('Run', 'HLT path', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'))]
00521 lastrowlabels = [ ('Selected LS', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'))]
00522 if len (hltpath) != 0 and hltpath != 'all':
00523 lastrowlabels = [ ('Selected LS', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'),
00524 'Effective '+u' (/\u03bcb) '.encode ('utf-8')+hltpath)]
00525 if isVerbose:
00526 labels = [ ('Run', 'HLT-path', 'L1-bit', 'L1-presc', 'HLT-presc', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'))]
00527 totalSelectedLS = 0
00528 totalRecorded = 0.0
00529 totalRecordedInPath = 0.0
00530
00531 for dataperRun in lumidata:
00532 runnum = dataperRun[0]
00533 if len (dataperRun[1]) == 0:
00534 rowdata = []
00535 rowdata += [str (runnum)]+2*['N/A']
00536 datatoprint.append (rowdata)
00537 continue
00538 perlsdata = dataperRun[2]
00539 totalSelectedLS = totalSelectedLS+len (perlsdata)
00540 recordedLumi = 0.0
00541
00542 recordedLumi = calculateTotalRecorded (perlsdata)
00543 totalRecorded = totalRecorded+recordedLumi
00544 trgdict = dataperRun[1]
00545 effective = calculateEffective (trgdict, recordedLumi)
00546 if trgdict.has_key (hltpath) and effective.has_key (hltpath):
00547 rowdata = []
00548 l1bit = trgdict[hltpath][0]
00549 if len (trgdict[hltpath]) != 3:
00550 if not isVerbose:
00551 rowdata += [str (runnum), hltpath, 'N/A']
00552 else:
00553 rowdata += [str (runnum), hltpath, l1bit, 'N/A', 'N/A', 'N/A']
00554 else:
00555 if not isVerbose:
00556 rowdata += [str (runnum), hltpath, '%.3f'% (effective[hltpath])]
00557 else:
00558 hltprescale = trgdict[hltpath][1]
00559 l1prescale = trgdict[hltpath][2]
00560 rowdata += [str (runnum), hltpath, l1bit, str (l1prescale), str (hltprescale),
00561 '%.3f'% (effective[hltpath])]
00562 totalRecordedInPath = totalRecordedInPath+effective[hltpath]
00563 datatoprint.append (rowdata)
00564 continue
00565
00566 for trg, trgdata in trgdict.items():
00567
00568 rowdata = []
00569 if trg == trgdict.keys()[0]:
00570 rowdata += [str (runnum)]
00571 else:
00572 rowdata += ['']
00573 l1bit = trgdata[0]
00574 if len (trgdata) == 3:
00575 if not isVerbose:
00576 rowdata += [trg, '%.3f'% (effective[trg])]
00577 else:
00578 hltprescale = trgdata[1]
00579 l1prescale = trgdata[2]
00580 rowdata += [trg, l1bit, str (l1prescale), str (hltprescale), '%.3f'% (effective[trg])]
00581 else:
00582 if not isVerbose:
00583 rowdata += [trg, 'N/A']
00584 else:
00585 rowdata += [trg, l1bit, 'N/A', 'N/A', '%.3f'% (effective[trg])]
00586 datatoprint.append (rowdata)
00587
00588 print ' == = '
00589 print tablePrinter.indent (labels+datatoprint, hasHeader = True, separateRows = False, prefix = '| ',
00590 postfix = ' |', justify = 'right', delim = ' | ',
00591 wrapfunc = lambda x: wrap_onspace_strict (x, 22))
00592
00593 if len (hltpath) != 0 and hltpath != 'all':
00594 totalrow.append ([str (totalSelectedLS), '%.3f'% (totalRecorded), '%.3f'% (totalRecordedInPath)])
00595 else:
00596 totalrow.append ([str (totalSelectedLS), '%.3f'% (totalRecorded)])
00597 print ' == = Total : '
00598 print tablePrinter.indent (lastrowlabels+totalrow, hasHeader = True, separateRows = False, prefix = '| ',
00599 postfix = ' |', justify = 'right', delim = ' | ',
00600 wrapfunc = lambda x: wrap_onspace (x, 20))
00601 if isVerbose:
00602 deadtoprint = []
00603 deadtimelabels = [ ('Run', 'Lumi section : Dead fraction')]
00604
00605 for dataperRun in lumidata:
00606 runnum = dataperRun[0]
00607 if len (dataperRun[1]) == 0:
00608 deadtoprint.append ([str (runnum), 'N/A'])
00609 continue
00610 perlsdata = dataperRun[2]
00611
00612 deadT = getDeadfractions (perlsdata)
00613 t = ''
00614 for myls, de in deadT.items():
00615 if de<0:
00616 t += str (myls)+':nobeam '
00617 else:
00618 t += str (myls)+':'+'%.5f'% (de)+' '
00619 deadtoprint.append ([str (runnum), t])
00620 print ' == = '
00621 print tablePrinter.indent (deadtimelabels+deadtoprint, hasHeader = True, separateRows = True, prefix = '| ',
00622 postfix = ' |', justify = 'right', delim = ' | ',
00623 wrapfunc = lambda x: wrap_onspace (x, 80))
00624
00625
00626 def dumpRecordedLumi (lumidata, hltpath = ''):
00627
00628 datatodump = []
00629 for dataperRun in lumidata:
00630 runnum = dataperRun[0]
00631 if len (dataperRun[1]) == 0:
00632 rowdata = []
00633 rowdata += [str (runnum)]+2*['N/A']
00634 datatodump.append (rowdata)
00635 continue
00636 perlsdata = dataperRun[2]
00637 recordedLumi = 0.0
00638
00639 recordedLumi = calculateTotalRecorded (perlsdata)
00640 trgdict = dataperRun[1]
00641 effective = calculateEffective (trgdict, recordedLumi)
00642 if trgdict.has_key (hltpath) and effective.has_key (hltpath):
00643 rowdata = []
00644 l1bit = trgdict[hltpath][0]
00645 if len (trgdict[hltpath]) != 3:
00646 rowdata += [str (runnum), hltpath, 'N/A']
00647 else:
00648 hltprescale = trgdict[hltpath][1]
00649 l1prescale = trgdict[hltpath][2]
00650 rowdata += [str (runnum), hltpath, effective[hltpath]]
00651 datatodump.append (rowdata)
00652 continue
00653
00654 for trg, trgdata in trgdict.items():
00655
00656 rowdata = []
00657 rowdata += [str (runnum)]
00658 l1bit = trgdata[0]
00659 if len (trgdata) == 3:
00660 rowdata += [trg, effective[trg]]
00661 else:
00662 rowdata += [trg, 'N/A']
00663 datatodump.append (rowdata)
00664 return datatodump
00665
00666
00667 def printOverviewData (delivered, recorded, hltpath = ''):
00668 if len (hltpath) == 0 or hltpath == 'all':
00669 toprowlabels = [ ('Run', 'Delivered LS', 'Delivered'+u' (/\u03bcb)'.encode ('utf-8'), 'Selected LS', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8') )]
00670 lastrowlabels = [ ('Delivered LS', 'Delivered'+u' (/\u03bcb)'.encode ('utf-8'), 'Selected LS', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8') ) ]
00671 else:
00672 toprowlabels = [ ('Run', 'Delivered LS', 'Delivered'+u' (/\u03bcb)'.encode ('utf-8'), 'Selected LS', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'), 'Effective'+u' (/\u03bcb) '.encode ('utf-8')+hltpath )]
00673 lastrowlabels = [ ('Delivered LS', 'Delivered'+u' (/\u03bcb)'.encode ('utf-8'), 'Selected LS', 'Recorded'+u' (/\u03bcb)'.encode ('utf-8'), 'Effective '+u' (/\u03bcb) '.encode ('utf-8')+hltpath)]
00674 datatable = []
00675 totaldata = []
00676 totalDeliveredLS = 0
00677 totalSelectedLS = 0
00678 totalDelivered = 0.0
00679 totalRecorded = 0.0
00680 totalRecordedInPath = 0.0
00681 totaltable = []
00682 for runidx, deliveredrowdata in enumerate (delivered):
00683 rowdata = []
00684 rowdata += [deliveredrowdata[0], deliveredrowdata[1], deliveredrowdata[2]]
00685 if deliveredrowdata[1] == 'N/A':
00686 if hltpath != '' and hltpath != 'all':
00687 rowdata += ['N/A', 'N/A', 'N/A']
00688 else:
00689 rowdata += ['N/A', 'N/A']
00690 datatable.append (rowdata)
00691 continue
00692 totalDeliveredLS += int (deliveredrowdata[1])
00693 totalDelivered += float (deliveredrowdata[2])
00694 selectedls = recorded[runidx][2].keys()
00695
00696
00697 if len (selectedls) == 0:
00698 selectedlsStr = '[]'
00699 recordedLumi = 0
00700 if hltpath != '' and hltpath != 'all':
00701 rowdata += [selectedlsStr, 'N/A', 'N/A']
00702 else:
00703 rowdata += [selectedlsStr, 'N/A']
00704 else:
00705 selectedlsStr = splitlistToRangeString (selectedls)
00706 recordedLumi = calculateTotalRecorded (recorded[runidx][2])
00707 lumiinPaths = calculateEffective (recorded[runidx][1], recordedLumi)
00708 if hltpath != '' and hltpath != 'all':
00709 if lumiinPaths.has_key (hltpath):
00710 rowdata += [selectedlsStr, '%.3f'% (recordedLumi), '%.3f'% (lumiinPaths[hltpath])]
00711 totalRecordedInPath += lumiinPaths[hltpath]
00712 else:
00713 rowdata += [selectedlsStr, '%.3f'% (recordedLumi), 'N/A']
00714 else:
00715
00716 rowdata += [selectedlsStr, '%.3f'% (recordedLumi)]
00717 totalSelectedLS += len (selectedls)
00718 totalRecorded += recordedLumi
00719 datatable.append (rowdata)
00720
00721 if hltpath != '' and hltpath != 'all':
00722 totaltable = [[str (totalDeliveredLS), '%.3f'% (totalDelivered), str (totalSelectedLS),
00723 '%.3f'% (totalRecorded), '%.3f'% (totalRecordedInPath)]]
00724 else:
00725 totaltable = [[str (totalDeliveredLS), '%.3f'% (totalDelivered), str (totalSelectedLS),
00726 '%.3f'% (totalRecorded)]]
00727 print tablePrinter.indent (toprowlabels+datatable, hasHeader = True, separateRows = False, prefix = '| ',
00728 postfix = ' |', justify = 'right', delim = ' | ',
00729 wrapfunc = lambda x: wrap_onspace (x, 20))
00730 print ' == = Total : '
00731 print tablePrinter.indent (lastrowlabels+totaltable, hasHeader = True, separateRows = False, prefix = '| ',
00732 postfix = ' |', justify = 'right', delim = ' | ',
00733 wrapfunc = lambda x: wrap_onspace (x, 20))
00734
00735
00736 def dumpOverview (delivered, recorded, hltpath = ''):
00737
00738 datatable = []
00739 for runidx, deliveredrowdata in enumerate (delivered):
00740 rowdata = []
00741 rowdata += [deliveredrowdata[0], deliveredrowdata[2]]
00742 if deliveredrowdata[1] == 'N/A':
00743 rowdata += ['N/A', 'N/A']
00744 datatable.append (rowdata)
00745 continue
00746 recordedLumi = calculateTotalRecorded (recorded[runidx][2])
00747 lumiinPaths = calculateEffective (recorded[runidx][1], recordedLumi)
00748 if hltpath != '' and hltpath != 'all':
00749 if lumiinPaths.has_key (hltpath):
00750 rowdata += [recordedLumi, lumiinPaths[hltpath]]
00751 else:
00752 rowdata += [recordedLumi, 'N/A']
00753 else:
00754 rowdata += [recordedLumi, recordedLumi]
00755 datatable.append (rowdata)
00756 return datatable
00757
00758
00759 def xingLuminosityForRun (dbsession, runnum, parameters, lumiXingDict = {},
00760 maxLumiSection = None):
00761 '''Given a run number and a minimum xing luminosity value,
00762 returns a dictionary (keyed by (run, lumi section)) where the
00763 value is a list of tuples of (xingID, xingLum).
00764
00765 - For all xing luminosities, simply set minLumValue to 0.
00766
00767 - If you want one dictionary for several runs, pass it in to
00768 "lumiXingDict"
00769
00770
00771 select
00772 s.cmslsnum, d.bxlumivalue, d.bxlumierror, d.bxlumiquality, d.algoname from LUMIDETAIL d, LUMISUMMARY s where s.runnum = 133885 and d.algoname = 'OCC1' and s.lumisummary_id = d.lumisummary_id order by s.startorbit, s.cmslsnum
00773 '''
00774 try:
00775 runnum = int (runnum)
00776 dbsession.transaction().start (True)
00777 schema = dbsession.schema (parameters.lumischema)
00778 if not schema:
00779 raise 'cannot connect to schema ', parameters.lumischema
00780 detailOutput = coral.AttributeList()
00781 detailOutput.extend ('startorbit', 'unsigned int')
00782 detailOutput.extend ('cmslsnum', 'unsigned int')
00783 detailOutput.extend ('bxlumivalue', 'blob')
00784 detailOutput.extend ('bxlumierror', 'blob')
00785 detailOutput.extend ('bxlumiquality', 'blob')
00786 detailOutput.extend ('algoname', 'string')
00787 detailCondition = coral.AttributeList()
00788 detailCondition.extend ('runnum', 'unsigned int')
00789 detailCondition.extend ('algoname', 'string')
00790 detailCondition['runnum'].setData (runnum)
00791 detailCondition['algoname'].setData ('OCC1')
00792 query = schema.newQuery()
00793 query.addToTableList(nameDealer.lumisummaryTableName(), 's')
00794 query.addToTableList(nameDealer.lumidetailTableName(), 'd')
00795 query.addToOutputList ('s.STARTORBIT', 'startorbit')
00796 query.addToOutputList ('s.CMSLSNUM', 'cmslsnum')
00797 query.addToOutputList ('d.BXLUMIVALUE', 'bxlumivalue')
00798 query.addToOutputList ('d.BXLUMIERROR', 'bxlumierror')
00799 query.addToOutputList ('d.BXLUMIQUALITY', 'bxlumiquality')
00800 query.addToOutputList ('d.ALGONAME', 'algoname')
00801 query.setCondition ('s.RUNNUM =:runnum and d.ALGONAME =:algoname and s.LUMISUMMARY_ID=d.LUMISUMMARY_ID',detailCondition)
00802 query.addToOrderList ('s.CMSLSNUM')
00803 query.defineOutput (detailOutput)
00804 cursor = query.execute()
00805 count = 0
00806 while cursor.next():
00807
00808
00809
00810
00811
00812
00813
00814 cmslsnum = cursor.currentRow()['cmslsnum'].data()
00815 algoname = cursor.currentRow()['algoname'].data()
00816 bxlumivalue = cursor.currentRow()['bxlumivalue'].data()
00817 startorbit = cursor.currentRow()['startorbit'].data()
00818
00819 if maxLumiSection and maxLumiSection < cmslsnum:
00820 cursor.close()
00821 break
00822
00823 xingArray = array.array ('f')
00824 xingArray.fromstring( bxlumivalue.readline() )
00825 numPrinted = 0
00826 xingLum = []
00827 for index, lum in enumerate (xingArray):
00828 lum *= parameters.normFactor
00829 if lum < parameters.xingMinLum:
00830 continue
00831 xingLum.append( (index, lum) )
00832 lumiXingDict[ (runnum, cmslsnum) ] = xingLum
00833 del query
00834 dbsession.transaction().commit()
00835 return lumiXingDict
00836 except Exception, e:
00837 print str (e)
00838 print "whoops"
00839 dbsession.transaction().rollback()
00840 del dbsession
00841
00842
00843 def flatten (obj):
00844 '''Given nested lists or tuples, returns a single flattened list'''
00845 result = []
00846 for piece in obj:
00847 if hasattr (piece, '__iter__') and not isinstance (piece, basestring):
00848 result.extend( flatten (piece) )
00849 else:
00850 result.append (piece)
00851 return result
00852
00853
00854 def mergeXingLumi (triplet, xingLumiDict):
00855 '''Given general xing information and a xingLumiDict, the xing
00856 luminosity information is merged with the general information'''
00857 runNumber = triplet[0]
00858 deadTable = triplet[2]
00859 for lumi, lumiList in deadTable.iteritems():
00860 key = ( int(runNumber), int(lumi) )
00861 xingLumiValues = xingLumiDict.get (key)
00862 if xingLumiValues:
00863 lumiList.append( flatten (xingLumiValues) )
00864
00865
00866 def setupSession (connectString, siteconfpath, parameters, debug = False):
00867 '''returns database session'''
00868 connectparser = connectstrParser.connectstrParser (connectString)
00869 connectparser.parse()
00870 usedefaultfrontierconfig = False
00871 cacheconfigpath = ''
00872 if connectparser.needsitelocalinfo():
00873 if not siteconfpath:
00874 cacheconfigpath = os.environ['CMS_PATH']
00875 if cacheconfigpath:
00876 cacheconfigpath = os.path.join (cacheconfigpath, 'SITECONF', 'local', 'JobConfig', 'site-local-config.xml')
00877 else:
00878 usedefaultfrontierconfig = True
00879 else:
00880 cacheconfigpath = siteconfpath
00881 cacheconfigpath = os.path.join (cacheconfigpath, 'site-local-config.xml')
00882 ccp = cacheconfigParser.cacheconfigParser()
00883 if usedefaultfrontierconfig:
00884 ccp.parseString (parameters.defaultfrontierConfigString)
00885 else:
00886 ccp.parse (cacheconfigpath)
00887 connectString = connectparser.fullfrontierStr (connectparser.schemaname(), ccp.parameterdict())
00888 svc = coral.ConnectionService()
00889 if debug :
00890 msg = coral.MessageStream ('')
00891 msg.setMsgVerbosity (coral.message_Level_Debug)
00892 parameters.verbose = True
00893 session = svc.connect (connectString, accessMode = coral.access_ReadOnly)
00894 session.typeConverter().setCppTypeForSqlType ("unsigned int", "NUMBER (10)")
00895 session.typeConverter().setCppTypeForSqlType ("unsigned long long", "NUMBER (20)")
00896 return session, svc
00897
00898
00899
00900
00901
00902 def allruns(schemaHandle,requireRunsummary=True,requireLumisummary=False,requireTrg=False,requireHlt=False):
00903 '''
00904 find all runs in the DB. By default requires cmsrunsummary table contain the run. The condition can be loosed in situation where db loading failed on certain data portions.
00905 '''
00906 if not requireRunsummary and not requireLumiummary and not requireTrg and not requireHlt:
00907 print 'must require at least one table'
00908 raise
00909 runresult=[]
00910 runlist=[]
00911 numdups=0
00912 if requireRunsummary:
00913 numdups=numdups+1
00914 queryHandle=schemaHandle.newQuery()
00915 queryHandle.addToTableList(nameDealer.cmsrunsummaryTableName())
00916 queryHandle.addToOutputList("RUNNUM","run")
00917
00918 result=coral.AttributeList()
00919 result.extend("run","unsigned int")
00920 queryHandle.defineOutput(result)
00921 cursor=queryHandle.execute()
00922 while cursor.next():
00923 r=cursor.currentRow()['run'].data()
00924 runlist.append(r)
00925 del queryHandle
00926 if requireLumisummary:
00927 numdups=numdups+1
00928 queryHandle=schemaHandle.newQuery()
00929 queryHandle.addToTableList(nameDealer.lumisummaryTableName())
00930 queryHandle.addToOutputList("distinct RUNNUM","run")
00931
00932 result=coral.AttributeList()
00933 result.extend("run","unsigned int")
00934 queryHandle.defineOutput(result)
00935 cursor=queryHandle.execute()
00936 while cursor.next():
00937 r=cursor.currentRow()['run'].data()
00938 runlist.append(r)
00939 del queryHandle
00940 if requireTrg:
00941 numdups=numdups+1
00942 queryHandle=schemaHandle.newQuery()
00943 queryHandle.addToTableList(nameDealer.trgTableName())
00944 queryHandle.addToOutputList("distinct RUNNUM","run")
00945
00946 result=coral.AttributeList()
00947 result.extend("run","unsigned int")
00948 queryHandle.defineOutput(result)
00949 cursor=queryHandle.execute()
00950 while cursor.next():
00951 r=cursor.currentRow()['run'].data()
00952 runlist.append(r)
00953 del queryHandle
00954 if requireHlt:
00955 numdups=numdups+1
00956 queryHandle=schemaHandle.newQuery()
00957 queryHandle.addToTableList(nameDealer.hltTableName())
00958 queryHandle.addToOutputList("distinct RUNNUM","run")
00959
00960 result=coral.AttributeList()
00961 result.extend("run","unsigned int")
00962 queryHandle.defineOutput(result)
00963 cursor=queryHandle.execute()
00964 while cursor.next():
00965 r=cursor.currentRow()['run'].data()
00966 runlist.append(r)
00967 del queryHandle
00968 dupresult=CommonUtil.count_dups(runlist)
00969 for dup in dupresult:
00970 if dup[1]==numdups:
00971 runresult.append(dup[0])
00972 runresult.sort()
00973 return runresult
00974
00975 def validation(queryHandle,run=None,cmsls=None):
00976 '''retrieve validation data per run or all
00977 input: run. if not run, retrive all; if cmslsnum selection list pesent, filter out unselected result
00978 output: {run:[[cmslsnum,status,comment]]}
00979 '''
00980 result={}
00981 queryHandle.addToTableList(nameDealer.lumivalidationTableName())
00982 queryHandle.addToOutputList('RUNNUM','runnum')
00983 queryHandle.addToOutputList('CMSLSNUM','cmslsnum')
00984 queryHandle.addToOutputList('FLAG','flag')
00985 queryHandle.addToOutputList('COMMENT','comment')
00986 if run:
00987 queryCondition='RUNNUM=:runnum'
00988 queryBind=coral.AttributeList()
00989 queryBind.extend('runnum','unsigned int')
00990 queryBind['runnum'].setData(run)
00991 queryHandle.setCondition(queryCondition,queryBind)
00992 queryResult=coral.AttributeList()
00993 queryResult.extend('runnum','unsigned int')
00994 queryResult.extend('cmslsnum','unsigned int')
00995 queryResult.extend('flag','string')
00996 queryResult.extend('comment','string')
00997 queryHandle.defineOutput(queryResult)
00998 cursor=queryHandle.execute()
00999 while cursor.next():
01000 runnum=cursor.currentRow()['runnum'].data()
01001 if not result.has_key(runnum):
01002 result[runnum]=[]
01003 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01004 flag=cursor.currentRow()['flag'].data()
01005 comment=cursor.currentRow()['comment'].data()
01006 result[runnum].append([cmslsnum,flag,comment])
01007 if run and cmsls and len(cmsls)!=0:
01008 selectedresult={}
01009 for runnum,perrundata in result.items():
01010 for lsdata in perrundata:
01011 if lsdata[0] not in cmsls:
01012 continue
01013 if not selectedresult.has_key(runnum):
01014 selectedresult[runnum]=[]
01015 selectedresult[runnum].append(lsdata)
01016 return selectedresult
01017 else:
01018 return result
01019
01020 def allfills(queryHandle,filtercrazy=True):
01021 '''select distinct fillnum from cmsrunsummary
01022 there are crazy fill numbers. we assume they are not valid runs
01023 '''
01024 result=[]
01025 queryHandle.addToTableList(nameDealer.cmsrunsummaryTableName())
01026 queryHandle.addToOutputList('distinct FILLNUM','fillnum')
01027
01028 if filtercrazy:
01029 queryCondition='FILLNUM>:zero and FILLNUM<:crazybig'
01030 queryBind=coral.AttributeList()
01031 queryBind.extend('zero','unsigned int')
01032 queryBind.extend('crazybig','unsigned int')
01033 queryBind['zero'].setData(int(0))
01034 queryBind['crazybig'].setData(int(29701))
01035 queryHandle.setCondition(queryCondition,queryBind)
01036 queryResult=coral.AttributeList()
01037 queryResult.extend('fillnum','unsigned int')
01038 queryHandle.defineOutput(queryResult)
01039 cursor=queryHandle.execute()
01040 while cursor.next():
01041 result.append(cursor.currentRow()['fillnum'].data())
01042 result.sort()
01043 return result
01044 def runsummaryByrun(queryHandle,runnum):
01045 '''
01046 select fillnum,sequence,hltkey,to_char(starttime),to_char(stoptime) from cmsrunsummary where runnum=:runnum
01047 output: [fillnum,sequence,hltkey,starttime,stoptime]
01048 '''
01049 t=lumiTime.lumiTime()
01050 result=[]
01051 queryHandle.addToTableList(nameDealer.cmsrunsummaryTableName())
01052 queryCondition=coral.AttributeList()
01053 queryCondition.extend('runnum','unsigned int')
01054 queryCondition['runnum'].setData(int(runnum))
01055 queryHandle.addToOutputList('FILLNUM','fillnum')
01056 queryHandle.addToOutputList('SEQUENCE','sequence')
01057 queryHandle.addToOutputList('HLTKEY','hltkey')
01058 queryHandle.addToOutputList('to_char(STARTTIME,\''+t.coraltimefm+'\')','starttime')
01059 queryHandle.addToOutputList('to_char(STOPTIME,\''+t.coraltimefm+'\')','stoptime')
01060 queryHandle.setCondition('RUNNUM=:runnum',queryCondition)
01061 queryResult=coral.AttributeList()
01062 queryResult.extend('fillnum','unsigned int')
01063 queryResult.extend('sequence','string')
01064 queryResult.extend('hltkey','string')
01065 queryResult.extend('starttime','string')
01066 queryResult.extend('stoptime','string')
01067 queryHandle.defineOutput(queryResult)
01068 cursor=queryHandle.execute()
01069 while cursor.next():
01070 result.append(cursor.currentRow()['fillnum'].data())
01071 result.append(cursor.currentRow()['sequence'].data())
01072 result.append(cursor.currentRow()['hltkey'].data())
01073 result.append(cursor.currentRow()['starttime'].data())
01074 result.append(cursor.currentRow()['stoptime'].data())
01075
01076
01077
01078 return result
01079
01080 def lumisummaryByrun(queryHandle,runnum,lumiversion,beamstatus=None,beamenergy=None,beamenergyfluctuation=0.09):
01081 '''
01082 one can impose beamstatus, beamenergy selections at the SQL query level or process them later from the general result
01083 select cmslsnum,instlumi,numorbit,startorbit,beamstatus,beamenery from lumisummary where runnum=:runnum and lumiversion=:lumiversion order by startorbit;
01084 output: [[cmslsnum,instlumi,numorbit,startorbit,beamstatus,beamenergy,cmsalive]]
01085 Note: the non-cmsalive LS are included in the result
01086 '''
01087 result=[]
01088 queryHandle.addToTableList(nameDealer.lumisummaryTableName())
01089 queryCondition=coral.AttributeList()
01090 queryCondition.extend('runnum','unsigned int')
01091 queryCondition.extend('lumiversion','string')
01092 conditionstring='RUNNUM=:runnum and LUMIVERSION=:lumiversion'
01093 queryCondition['runnum'].setData(int(runnum))
01094 queryCondition['lumiversion'].setData(lumiversion)
01095 queryHandle.addToOutputList('CMSLSNUM','cmslsnum')
01096 queryHandle.addToOutputList('INSTLUMI','instlumi')
01097 queryHandle.addToOutputList('NUMORBIT','numorbit')
01098 queryHandle.addToOutputList('STARTORBIT','startorbit')
01099 queryHandle.addToOutputList('BEAMSTATUS','beamstatus')
01100 queryHandle.addToOutputList('BEAMENERGY','beamenergy')
01101 queryHandle.addToOutputList('CMSALIVE','cmsalive')
01102 if beamstatus and len(beamstatus)!=0:
01103 conditionstring=conditionstring+' and BEAMSTATUS=:beamstatus'
01104 queryCondition.extend('beamstatus','string')
01105 queryCondition['beamstatus'].setData(beamstatus)
01106 if beamenergy:
01107 minBeamenergy=float(beamenergy*(1.0-beamenergyfluctuation))
01108 maxBeamenergy=float(beamenergy*(1.0+beamenergyfluctuation))
01109 conditionstring=conditionstring+' and BEAMENERGY>:minBeamenergy and BEAMENERGY<:maxBeamenergy'
01110 queryCondition.extend('minBeamenergy','float')
01111 queryCondition.extend('maxBeamenergy','float')
01112 queryCondition['minBeamenergy'].setData(float(minBeamenergy))
01113 queryCondition['maxBeamenergy'].setData(float(maxBeamenergy))
01114 queryResult=coral.AttributeList()
01115 queryResult.extend('cmslsnum','unsigned int')
01116 queryResult.extend('instlumi','float')
01117 queryResult.extend('numorbit','unsigned int')
01118 queryResult.extend('startorbit','unsigned int')
01119 queryResult.extend('beamstatus','string')
01120 queryResult.extend('beamenergy','float')
01121 queryResult.extend('cmsalive','unsigned int')
01122 queryHandle.defineOutput(queryResult)
01123 queryHandle.setCondition(conditionstring,queryCondition)
01124 queryHandle.addToOrderList('startorbit')
01125 cursor=queryHandle.execute()
01126 while cursor.next():
01127 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01128 instlumi=cursor.currentRow()['instlumi'].data()
01129 numorbit=cursor.currentRow()['numorbit'].data()
01130 startorbit=cursor.currentRow()['startorbit'].data()
01131 beamstatus=cursor.currentRow()['beamstatus'].data()
01132 beamenergy=cursor.currentRow()['beamenergy'].data()
01133 cmsalive=cursor.currentRow()['cmsalive'].data()
01134 result.append([cmslsnum,instlumi,numorbit,startorbit,beamstatus,beamenergy,cmsalive])
01135 return result
01136
01137 def lumisumByrun(queryHandle,runnum,lumiversion,beamstatus=None,beamenergy=None,beamenergyfluctuation=0.09):
01138 '''
01139 beamenergy unit : GeV
01140 beamenergyfluctuation : fraction allowed to fluctuate around beamenergy value
01141 select sum(instlumi) from lumisummary where runnum=:runnum and lumiversion=:lumiversion
01142 output: float totallumi
01143 Note: the output is the raw result, need to apply LS length in time(sec)
01144 '''
01145 result=0.0
01146 queryHandle.addToTableList(nameDealer.lumisummaryTableName())
01147 queryCondition=coral.AttributeList()
01148 queryCondition.extend('runnum','unsigned int')
01149 queryCondition.extend('lumiversion','string')
01150
01151 queryCondition['runnum'].setData(int(runnum))
01152 queryCondition['lumiversion'].setData(lumiversion)
01153 queryHandle.addToOutputList('sum(INSTLUMI)','lumitotal')
01154 conditionstring='RUNNUM=:runnum and LUMIVERSION=:lumiversion'
01155 if beamstatus and len(beamstatus)!=0:
01156 conditionstring=conditionstring+' and BEAMSTATUS=:beamstatus'
01157 queryCondition.extend('beamstatus','string')
01158 queryCondition['beamstatus'].setData(beamstatus)
01159 if beamenergy and beamenergy!=0.0:
01160 minBeamenergy=float(beamenergy*(1.0-beamenergyfluctuation))
01161 maxBeamenergy=float(beamenergy*(1.0+beamenergyfluctuation))
01162 conditionstring=conditionstring+' and BEAMENERGY>:minBeamenergy and BEAMENERGY<:maxBeamenergy'
01163 queryCondition.extend('minBeamenergy','float')
01164 queryCondition.extend('maxBeamenergy','float')
01165 queryCondition['minBeamenergy'].setData(float(minBeamenergy))
01166 queryCondition['maxBeamenergy'].setData(float(maxBeamenergy))
01167 queryHandle.setCondition(conditionstring,queryCondition)
01168 queryResult=coral.AttributeList()
01169 queryResult.extend('lumitotal','float')
01170 queryHandle.defineOutput(queryResult)
01171 cursor=queryHandle.execute()
01172 while cursor.next():
01173 result=cursor.currentRow()['lumitotal'].data()
01174 return result
01175
01176 def trgbitzeroByrun(queryHandle,runnum):
01177 '''
01178 select cmslsnum,trgcount,deadtime,bitname,prescale from trg where runnum=:runnum and bitnum=0;
01179 output: {cmslsnum:[trgcount,deadtime,bitname,prescale]}
01180 '''
01181 result={}
01182 queryHandle.addToTableList(nameDealer.trgTableName())
01183 queryCondition=coral.AttributeList()
01184 queryCondition.extend('runnum','unsigned int')
01185 queryCondition.extend('bitnum','unsigned int')
01186 queryCondition['runnum'].setData(int(runnum))
01187 queryCondition['bitnum'].setData(int(0))
01188 queryHandle.addToOutputList('CMSLSNUM','cmslsnum')
01189 queryHandle.addToOutputList('TRGCOUNT','trgcount')
01190 queryHandle.addToOutputList('DEADTIME','deadtime')
01191 queryHandle.addToOutputList('BITNAME','bitname')
01192 queryHandle.addToOutputList('PRESCALE','prescale')
01193 queryHandle.setCondition('RUNNUM=:runnum and BITNUM=:bitnum',queryCondition)
01194 queryResult=coral.AttributeList()
01195 queryResult.extend('cmslsnum','unsigned int')
01196 queryResult.extend('trgcount','unsigned int')
01197 queryResult.extend('deadtime','unsigned int')
01198 queryResult.extend('bitname','string')
01199 queryResult.extend('prescale','unsigned int')
01200 queryHandle.defineOutput(queryResult)
01201 cursor=queryHandle.execute()
01202 while cursor.next():
01203 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01204 trgcount=cursor.currentRow()['trgcount'].data()
01205 deadtime=cursor.currentRow()['deadtime'].data()
01206 bitname=cursor.currentRow()['bitname'].data()
01207 prescale=cursor.currentRow()['prescale'].data()
01208 if not result.has_key(cmslsnum):
01209 result[cmslsnum]=[trgcount,deadtime,bitname,prescale]
01210 return result
01211
01212 def lumisummarytrgbitzeroByrun(queryHandle,runnum,lumiversion,beamstatus=None,beamenergy=None,beamenergyfluctuation=0.09):
01213 '''
01214 select l.cmslsnum,l.instlumi,l.numorbit,l.startorbit,l.beamstatus,l.beamenery,t.trgcount,t.deadtime,t.bitname,t.prescale from trg t,lumisummary l where t.bitnum=:bitnum and l.runnum=:runnum and l.lumiversion=:lumiversion and l.runnum=t.runnum and t.cmslsnum=l.cmslsnum;
01215 Everything you ever need to know about bitzero and avg luminosity. Since we do not know if joint query is better of sperate, support both.
01216 output: {cmslsnum:[instlumi,numorbit,startorbit,beamstatus,beamenergy,bitzerocount,deadtime,bitname,prescale]}
01217 Note: only cmsalive LS are included in the result. Therefore, this function cannot be used for calculating delivered!
01218 '''
01219 result={}
01220 queryHandle.addToTableList(nameDealer.trgTableName(),'t')
01221 queryHandle.addToTableList(nameDealer.lumisummaryTableName(),'l')
01222 queryCondition=coral.AttributeList()
01223 queryCondition.extend('bitnum','unsigned int')
01224 queryCondition.extend('runnum','unsigned int')
01225 queryCondition.extend('lumiversion','string')
01226 queryCondition['bitnum'].setData(int(0))
01227 queryCondition['runnum'].setData(int(runnum))
01228 queryCondition['lumiversion'].setData(lumiversion)
01229
01230 queryHandle.addToOutputList('l.CMSLSNUM','cmslsnum')
01231 queryHandle.addToOutputList('l.INSTLUMI','instlumi')
01232 queryHandle.addToOutputList('l.NUMORBIT','numorbit')
01233 queryHandle.addToOutputList('l.STARTORBIT','startorbit')
01234 queryHandle.addToOutputList('l.BEAMSTATUS','beamstatus')
01235 queryHandle.addToOutputList('l.BEAMENERGY','beamenergy')
01236 queryHandle.addToOutputList('t.TRGCOUNT','trgcount')
01237 queryHandle.addToOutputList('t.DEADTIME','deadtime')
01238 queryHandle.addToOutputList('t.BITNAME','bitname')
01239 queryHandle.addToOutputList('t.PRESCALE','prescale')
01240 conditionstring='t.BITNUM=:bitnum and l.RUNNUM=:runnum and l.LUMIVERSION=:lumiversion and l.RUNNUM=t.RUNNUM and t.CMSLSNUM=l.CMSLSNUM'
01241 if beamstatus and len(beamstatus)!=0:
01242 conditionstring=conditionstring+' and l.BEAMSTATUS=:beamstatus'
01243 queryCondition.extend('beamstatus','string')
01244 queryCondition['beamstatus'].setData(beamstatus)
01245 if beamenergy and beamenergy!=0.0:
01246 minBeamenergy=float(beamenergy*(1-beamenergyfluctuation))
01247 maxBeamenergy=float(beamenergy*(1+beamenergyfluctuation))
01248 conditionstring=conditionstring+' and l.BEAMENERGY>:minBeamenergy and l.BEAMENERGY<:maxBeamenergy'
01249 queryCondition.extend('minBeamenergy','float')
01250 queryCondition.extend('maxBeamenergy','float')
01251 queryCondition['minBeamenergy'].setData(float(minBeamenergy))
01252 queryCondition['maxBeamenergy'].setData(float(maxBeamenergy))
01253 queryHandle.setCondition(conditionstring,queryCondition)
01254 queryResult=coral.AttributeList()
01255 queryResult.extend('cmslsnum','unsigned int')
01256 queryResult.extend('instlumi','float')
01257 queryResult.extend('numorbit','unsigned int')
01258 queryResult.extend('startorbit','unsigned int')
01259 queryResult.extend('beamstatus','string')
01260 queryResult.extend('beamenergy','float')
01261 queryResult.extend('trgcount','unsigned int')
01262 queryResult.extend('deadtime','unsigned int')
01263 queryResult.extend('bitname','string')
01264 queryResult.extend('prescale','unsigned int')
01265 queryHandle.defineOutput(queryResult)
01266 cursor=queryHandle.execute()
01267 while cursor.next():
01268 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01269 instlumi=cursor.currentRow()['instlumi'].data()
01270 numorbit=cursor.currentRow()['numorbit'].data()
01271 startorbit=cursor.currentRow()['startorbit'].data()
01272 beamstatus=cursor.currentRow()['beamstatus'].data()
01273 beamenergy=cursor.currentRow()['beamenergy'].data()
01274 trgcount=cursor.currentRow()['trgcount'].data()
01275 deadtime=cursor.currentRow()['deadtime'].data()
01276 bitname=cursor.currentRow()['bitname'].data()
01277 prescale=cursor.currentRow()['prescale'].data()
01278 if not result.has_key(cmslsnum):
01279 result[cmslsnum]=[instlumi,numorbit,startorbit,beamstatus,beamenergy,trgcount,deadtime,bitname,prescale]
01280 return result
01281
01282 def trgBybitnameByrun(queryHandle,runnum,bitname):
01283 '''
01284 select cmslsnum,trgcount,deadtime,bitnum,prescale from trg where runnum=:runnum and bitname=:bitname;
01285 output: {cmslsnum:[trgcount,deadtime,bitnum,prescale]}
01286 '''
01287 result={}
01288 queryHandle.addToTableList(nameDealer.trgTableName())
01289 queryCondition=coral.AttributeList()
01290 queryCondition.extend('runnum','unsigned int')
01291 queryCondition.extend('bitname','string')
01292 queryCondition['runnum'].setData(int(runnum))
01293 queryCondition['bitname'].setData(bitname)
01294 queryHandle.addToOutputList('CMSLSNUM','cmslsnum')
01295 queryHandle.addToOutputList('TRGCOUNT','trgcount')
01296 queryHandle.addToOutputList('DEADTIME','deadtime')
01297 queryHandle.addToOutputList('BITNUM','bitnum')
01298 queryHandle.addToOutputList('PRESCALE','prescale')
01299 queryHandle.setCondition('RUNNUM=:runnum and BITNAME=:bitname',queryCondition)
01300 queryResult=coral.AttributeList()
01301 queryResult.extend('cmslsnum','unsigned int')
01302 queryResult.extend('trgcount','unsigned int')
01303 queryResult.extend('deadtime','unsigned long long')
01304 queryResult.extend('bitnum','unsigned int')
01305 queryResult.extend('prescale','unsigned int')
01306 queryHandle.defineOutput(queryResult)
01307 cursor=queryHandle.execute()
01308 while cursor.next():
01309 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01310 trgcount=cursor.currentRow()['trgcount'].data()
01311 deadtime=cursor.currentRow()['deadtime'].data()
01312 bitnum=cursor.currentRow()['bitnum'].data()
01313 prescale=cursor.currentRow()['prescale'].data()
01314 if not result.has_key(cmslsnum):
01315 result[cmslsnum]=[trgcount,deadtime,bitnum,prescale]
01316 return result
01317
01318 def trgAllbitsByrun(queryHandle,runnum):
01319 '''
01320 all you ever want to know about trigger
01321 select cmslsnum,trgcount,deadtime,bitnum,bitname,prescale from trg where runnum=:runnum order by bitnum,cmslsnum
01322 this can be changed to blob query later
01323 output: {cmslsnum:{bitname:[bitnum,trgcount,deadtime,prescale]}}
01324 '''
01325 result={}
01326 queryHandle.addToTableList(nameDealer.trgTableName())
01327 queryCondition=coral.AttributeList()
01328 queryCondition.extend('runnum','unsigned int')
01329 queryCondition['runnum'].setData(int(runnum))
01330 queryHandle.addToOutputList('cmslsnum')
01331 queryHandle.addToOutputList('trgcount')
01332 queryHandle.addToOutputList('deadtime')
01333 queryHandle.addToOutputList('bitnum')
01334 queryHandle.addToOutputList('bitname')
01335 queryHandle.addToOutputList('prescale')
01336 queryHandle.setCondition('runnum=:runnum',queryCondition)
01337 queryResult=coral.AttributeList()
01338 queryResult.extend('cmslsnum','unsigned int')
01339 queryResult.extend('trgcount','unsigned int')
01340 queryResult.extend('deadtime','unsigned long long')
01341 queryResult.extend('bitnum','unsigned int')
01342 queryResult.extend('bitname','string')
01343 queryResult.extend('prescale','unsigned int')
01344 queryHandle.defineOutput(queryResult)
01345 queryHandle.addToOrderList('bitnum')
01346 queryHandle.addToOrderList('cmslsnum')
01347 cursor=queryHandle.execute()
01348 while cursor.next():
01349 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01350 trgcount=cursor.currentRow()['trgcount'].data()
01351 deadtime=cursor.currentRow()['deadtime'].data()
01352 bitnum=cursor.currentRow()['bitnum'].data()
01353 bitname=cursor.currentRow()['bitname'].data()
01354 prescale=cursor.currentRow()['prescale'].data()
01355 if not result.has_key(cmslsnum):
01356 dataperLS={}
01357 dataperLS[bitname]=[bitnum,trgcount,deadtime,prescale]
01358 result[cmslsnum]=dataperLS
01359 else:
01360 result[cmslsnum][bitname]=[bitnum,trgcount,deadtime,prescale]
01361 return result
01362
01363
01364 def hltBypathByrun(queryHandle,runnum,hltpath):
01365 '''
01366 select cmslsnum,inputcount,acceptcount,prescale from hlt where runnum=:runnum and pathname=:pathname
01367 output: {cmslsnum:[inputcount,acceptcount,prescale]}
01368 '''
01369 result={}
01370 queryHandle.addToTableList(nameDealer.hltTableName())
01371 queryCondition=coral.AttributeList()
01372 queryCondition.extend('runnum','unsigned int')
01373 queryCondition.extend('pathname','string')
01374 queryCondition['runnum'].setData(int(runnum))
01375 queryCondition['pathname'].setData(hltpath)
01376 queryHandle.addToOutputList('CMSLSNUM','cmslsnum')
01377 queryHandle.addToOutputList('INPUTCOUNT','inputcount')
01378 queryHandle.addToOutputList('ACCEPTCOUNT','acceptcount')
01379 queryHandle.addToOutputList('PRESCALE','prescale')
01380 queryHandle.setCondition('RUNNUM=:runnum and PATHNAME=:pathname',queryCondition)
01381 queryResult=coral.AttributeList()
01382 queryResult.extend('cmslsnum','unsigned int')
01383 queryResult.extend('inputcount','unsigned int')
01384 queryResult.extend('acceptcount','unsigned int')
01385 queryResult.extend('prescale','unsigned int')
01386 queryHandle.defineOutput(queryResult)
01387 cursor=queryHandle.execute()
01388 while cursor.next():
01389 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01390 inputcount=cursor.currentRow()['inputcount'].data()
01391 acceptcount=cursor.currentRow()['acceptcount'].data()
01392 prescale=cursor.currentRow()['prescale'].data()
01393 if not result.has_key(cmslsnum):
01394 result[cmslsnum]=[inputcount,acceptcount,prescale]
01395 return result
01396
01397 def hltAllpathByrun(queryHandle,runnum):
01398 '''
01399 select cmslsnum,inputcount,acceptcount,prescale,pathname from hlt where runnum=:runnum
01400 this can be changed to blob query later
01401 output: {cmslsnum:{pathname:[inputcount,acceptcount,prescale]}}
01402 '''
01403 result={}
01404 queryHandle.addToTableList(nameDealer.hltTableName())
01405 queryCondition=coral.AttributeList()
01406 queryCondition.extend('runnum','unsigned int')
01407 queryCondition['runnum'].setData(int(runnum))
01408 queryHandle.addToOutputList('CMSLSNUM','cmslsnum')
01409 queryHandle.addToOutputList('INPUTCOUNT','inputcount')
01410 queryHandle.addToOutputList('ACCEPTCOUNT','acceptcount')
01411 queryHandle.addToOutputList('PRESCALE','prescale')
01412 queryHandle.addToOutputList('PATHNAME','pathname')
01413 queryHandle.setCondition('RUNNUM=:runnum',queryCondition)
01414 queryResult=coral.AttributeList()
01415 queryResult.extend('cmslsnum','unsigned int')
01416 queryResult.extend('inputcount','unsigned int')
01417 queryResult.extend('acceptcount','unsigned int')
01418 queryResult.extend('prescale','unsigned int')
01419 queryResult.extend('pathname','string')
01420 queryHandle.defineOutput(queryResult)
01421 cursor=queryHandle.execute()
01422 while cursor.next():
01423 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01424 inputcount=cursor.currentRow()['inputcount'].data()
01425 acceptcount=cursor.currentRow()['acceptcount'].data()
01426 prescale=cursor.currentRow()['prescale'].data()
01427 pathname=cursor.currentRow()['pathname'].data()
01428 if not result.has_key(cmslsnum):
01429 dataperLS={}
01430 dataperLS[pathname]=[inputcount,acceptcount,prescale]
01431 result[cmslsnum]=dataperLS
01432 else:
01433 result[cmslsnum][pathname]=[inputcount,acceptcount,prescale]
01434 return result
01435
01436
01437 def beamIntensityForRun(query,parameters,runnum):
01438 '''
01439 select CMSBXINDEXBLOB,BEAMINTENSITYBLOB_1,BEAMINTENSITYBLOB_2 from LUMISUMMARY where runnum=146315 and LUMIVERSION='0001'
01440
01441 output : result {startorbit: [(bxidx,beam1intensity,beam2intensity)]}
01442 '''
01443 result={}
01444
01445 lumisummaryOutput=coral.AttributeList()
01446 lumisummaryOutput.extend('cmslsnum','unsigned int')
01447 lumisummaryOutput.extend('startorbit','unsigned int')
01448 lumisummaryOutput.extend('bxindexblob','blob');
01449 lumisummaryOutput.extend('beamintensityblob1','blob');
01450 lumisummaryOutput.extend('beamintensityblob2','blob');
01451 condition=coral.AttributeList()
01452 condition.extend('runnum','unsigned int')
01453 condition.extend('lumiversion','string')
01454 condition['runnum'].setData(int(runnum))
01455 condition['lumiversion'].setData(parameters.lumiversion)
01456
01457 query.addToTableList(parameters.lumisummaryname)
01458 query.addToOutputList('CMSLSNUM','cmslsnum')
01459 query.addToOutputList('STARTORBIT','startorbit')
01460 query.addToOutputList('CMSBXINDEXBLOB','bxindexblob')
01461 query.addToOutputList('BEAMINTENSITYBLOB_1','beamintensityblob1')
01462 query.addToOutputList('BEAMINTENSITYBLOB_2','beamintensityblob2')
01463 query.setCondition('RUNNUM=:runnum AND LUMIVERSION=:lumiversion',condition)
01464 query.defineOutput(lumisummaryOutput)
01465 cursor=query.execute()
01466 while cursor.next():
01467
01468 startorbit=cursor.currentRow()['startorbit'].data()
01469 if not cursor.currentRow()["bxindexblob"].isNull():
01470 bxindexblob=cursor.currentRow()['bxindexblob'].data()
01471 beamintensityblob1=cursor.currentRow()['beamintensityblob1'].data()
01472 beamintensityblob2=cursor.currentRow()['beamintensityblob2'].data()
01473 if bxindexblob.readline() is not None and beamintensityblob1.readline() is not None and beamintensityblob2.readline() is not None:
01474 bxidx=array.array('h')
01475 bxidx.fromstring(bxindexblob.readline())
01476 bb1=array.array('f')
01477 bb1.fromstring(beamintensityblob1.readline())
01478 bb2=array.array('f')
01479 bb2.fromstring(beamintensityblob2.readline())
01480 for index,bxidxvalue in enumerate(bxidx):
01481 if not result.has_key(startorbit):
01482 result[startorbit]=[]
01483 b1intensity=bb1[index]
01484 b2intensity=bb2[index]
01485 result[startorbit].append((bxidxvalue,b1intensity,b2intensity))
01486 return result
01487
01488 def calibratedDetailForRunLimitresult(query,parameters,runnum,algoname='OCC1'):
01489 '''select
01490 s.cmslsnum,d.bxlumivalue,d.bxlumierror,d.bxlumiquality,d.algoname from LUMIDETAIL d,LUMISUMMARY s where s.runnum=133885 and d.algoname='OCC1' and s.lumisummary_id=d.lumisummary_id order by s.startorbit,s.cmslsnum
01491 result={(startorbit,cmslsnum):[(lumivalue,lumierr),]}
01492 '''
01493 result={}
01494 detailOutput=coral.AttributeList()
01495 detailOutput.extend('cmslsnum','unsigned int')
01496 detailOutput.extend('startorbit','unsigned int')
01497 detailOutput.extend('bxlumivalue','blob')
01498 detailOutput.extend('bxlumierror','blob')
01499 detailCondition=coral.AttributeList()
01500 detailCondition.extend('runnum','unsigned int')
01501 detailCondition.extend('algoname','string')
01502 detailCondition['runnum'].setData(runnum)
01503 detailCondition['algoname'].setData(algoname)
01504
01505 query.addToTableList(parameters.lumisummaryname,'s')
01506 query.addToTableList(parameters.lumidetailname,'d')
01507 query.addToOutputList('s.CMSLSNUM','cmslsnum')
01508 query.addToOutputList('s.STARTORBIT','startorbit')
01509 query.addToOutputList('d.BXLUMIVALUE','bxlumivalue')
01510 query.addToOutputList('d.BXLUMIERROR','bxlumierror')
01511 query.addToOutputList('d.BXLUMIQUALITY','bxlumiquality')
01512 query.setCondition('s.RUNNUM=:runnum and d.ALGONAME=:algoname and s.LUMISUMMARY_ID=d.LUMISUMMARY_ID',detailCondition)
01513 query.defineOutput(detailOutput)
01514 cursor=query.execute()
01515 while cursor.next():
01516 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01517 bxlumivalue=cursor.currentRow()['bxlumivalue'].data()
01518 bxlumierror=cursor.currentRow()['bxlumierror'].data()
01519 startorbit=cursor.currentRow()['startorbit'].data()
01520
01521 bxlumivalueArray=array.array('f')
01522 bxlumivalueArray.fromstring(bxlumivalue.readline())
01523 bxlumierrorArray=array.array('f')
01524 bxlumierrorArray.fromstring(bxlumierror.readline())
01525 xingLum=[]
01526
01527 maxlumi=max(bxlumivalueArray)*parameters.normFactor
01528 for index,lum in enumerate(bxlumivalueArray):
01529 lum *= parameters.normFactor
01530 lumierror = bxlumierrorArray[index]*parameters.normFactor
01531 if lum<max(parameters.xingMinLum,maxlumi*0.2):
01532 continue
01533 xingLum.append( (index,lum,lumierror) )
01534 if len(xingLum)!=0:
01535 result[(startorbit,cmslsnum)]=xingLum
01536 return result
01537
01538 def lumidetailByrunByAlgo(queryHandle,runnum,algoname='OCC1'):
01539 '''
01540 select s.cmslsnum,d.bxlumivalue,d.bxlumierror,d.bxlumiquality,s.startorbit from LUMIDETAIL d,LUMISUMMARY s where s.runnum=:runnum and d.algoname=:algoname and s.lumisummary_id=d.lumisummary_id order by s.startorbit
01541 output: [[cmslsnum,bxlumivalue,bxlumierror,bxlumiquality,startorbit]]
01542 since the output is ordered by time, it has to be in seq list format
01543 '''
01544 result=[]
01545 queryHandle.addToTableList(nameDealer.lumidetailTableName(),'d')
01546 queryHandle.addToTableList(nameDealer.lumisummaryTableName(),'s')
01547 queryCondition=coral.AttributeList()
01548 queryCondition.extend('runnum','unsigned int')
01549 queryCondition.extend('algoname','string')
01550 queryCondition['runnum'].setData(int(runnum))
01551 queryCondition['algoname'].setData(algoname)
01552 queryHandle.addToOutputList('s.CMSLSNUM','cmslsnum')
01553 queryHandle.addToOutputList('d.BXLUMIVALUE','bxlumivalue')
01554 queryHandle.addToOutputList('d.BXLUMIERROR','bxlumierror')
01555 queryHandle.addToOutputList('d.BXLUMIQUALITY','bxlumiquality')
01556 queryHandle.addToOutputList('s.STARTORBIT','startorbit')
01557 queryHandle.setCondition('s.runnum=:runnum and d.algoname=:algoname and s.lumisummary_id=d.lumisummary_id',queryCondition)
01558 queryResult=coral.AttributeList()
01559 queryResult.extend('cmslsnum','unsigned int')
01560 queryResult.extend('bxlumivalue','blob')
01561 queryResult.extend('bxlumierror','blob')
01562 queryResult.extend('bxlumiquality','blob')
01563 queryResult.extend('startorbit','unsigned int')
01564 queryHandle.addToOrderList('s.STARTORBIT')
01565 queryHandle.defineOutput(queryResult)
01566 cursor=queryHandle.execute()
01567 while cursor.next():
01568 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01569 bxlumivalue=cursor.currentRow()['bxlumivalue'].data()
01570 bxlumierror=cursor.currentRow()['bxlumierror'].data()
01571 bxlumiquality=cursor.currentRow()['bxlumiquality'].data()
01572 startorbit=cursor.currentRow()['startorbit'].data()
01573 result.append([cmslsnum,bxlumivalue,bxlumierror,bxlumiquality,startorbit])
01574 return result
01575
01576 def lumidetailAllalgosByrun(queryHandle,runnum):
01577 '''
01578 select s.cmslsnum,d.bxlumivalue,d.bxlumierror,d.bxlumiquality,d.algoname,s.startorbit from LUMIDETAIL d,LUMISUMMARY s where s.runnum=:runnumber and s.lumisummary_id=d.lumisummary_id order by s.startorbit,d.algoname
01579 output: {algoname:{cmslsnum:[bxlumivalue,bxlumierror,bxlumiquality,startorbit]}}
01580 '''
01581 result={}
01582 queryHandle.addToTableList(nameDealer.lumidetailTableName(),'d')
01583 queryHandle.addToTableList(nameDealer.lumisummaryTableName(),'s')
01584 queryCondition=coral.AttributeList()
01585 queryCondition.extend('runnum','unsigned int')
01586 queryCondition['runnum'].setData(int(runnum))
01587 queryHandle.addToOutputList('s.CMSLSNUM','cmslsnum')
01588 queryHandle.addToOutputList('d.BXLUMIVALUE','bxlumivalue')
01589 queryHandle.addToOutputList('d.BXLUMIERROR','bxlumierror')
01590 queryHandle.addToOutputList('d.BXLUMIQUALITY','bxlumiquality')
01591 queryHandle.addToOutputList('d.ALGONAME','algoname')
01592 queryHandle.addToOutputList('s.STARTORBIT','startorbit')
01593 queryHandle.setCondition('s.RUNNUM=:runnum and s.LUMISUMMARY_ID=d.LUMISUMMARY_ID',queryCondition)
01594 queryResult=coral.AttributeList()
01595 queryResult.extend('cmslsnum','unsigned int')
01596 queryResult.extend('bxlumivalue','blob')
01597 queryResult.extend('bxlumierror','blob')
01598 queryResult.extend('bxlumiquality','blob')
01599 queryResult.extend('algoname','string')
01600 queryResult.extend('startorbit','unsigned int')
01601 queryHandle.addToOrderList('startorbit')
01602 queryHandle.addToOrderList('algoname')
01603 queryHandle.defineOutput(queryResult)
01604 cursor=queryHandle.execute()
01605 while cursor.next():
01606 cmslsnum=cursor.currentRow()['cmslsnum'].data()
01607 bxlumivalue=cursor.currentRow()['bxlumivalue'].data()
01608 bxlumierror=cursor.currentRow()['bxlumierror'].data()
01609 bxlumiquality=cursor.currentRow()['bxlumiquality'].data()
01610 algoname=cursor.currentRow()['algoname'].data()
01611 startorbit=cursor.currentRow()['startorbit'].data()
01612 if not result.has_key(algoname):
01613 dataPerAlgo={}
01614 dataPerAlgo[cmslsnum]=[bxlumivalue,bxlumierror,bxlumiquality,startorbit]
01615 result[algoname]=dataPerAlgo
01616 else:
01617 result[algoname][cmslsnum]=[bxlumivalue,bxlumierror,bxlumiquality,startorbit]
01618 return result
01619
01620 def hlttrgMappingByrun(queryHandle,runnum):
01621 '''
01622 select m.hltpathname,m.l1seed from cmsrunsummary r,trghltmap m where r.runnum=:runnum and m.hltkey=r.hltkey
01623 output: {hltpath:l1seed}
01624 '''
01625 result={}
01626 queryHandle.addToTableList(nameDealer.cmsrunsummaryTableName(),'r')
01627 queryHandle.addToTableList(nameDealer.trghltMapTableName(),'m')
01628 queryCondition=coral.AttributeList()
01629 queryCondition.extend('runnum','unsigned int')
01630 queryCondition['runnum'].setData(int(runnum))
01631 queryHandle.addToOutputList('m.HLTPATHNAME','hltpathname')
01632 queryHandle.addToOutputList('m.L1SEED','l1seed')
01633 queryHandle.setCondition('r.RUNNUM=:runnum and m.HLTKEY=r.HLTKEY',queryCondition)
01634 queryResult=coral.AttributeList()
01635 queryResult.extend('hltpathname','string')
01636 queryResult.extend('l1seed','string')
01637 queryHandle.defineOutput(queryResult)
01638 cursor=queryHandle.execute()
01639 while cursor.next():
01640 hltpathname=cursor.currentRow()['hltpathname'].data()
01641 l1seed=cursor.currentRow()['l1seed'].data()
01642 if not result.has_key(hltpathname):
01643 result[hltpathname]=l1seed
01644 return result
01645
01646 def runsByfillrange(queryHandle,minFill,maxFill):
01647 '''
01648 find all runs in the fill range inclusive
01649 select runnum,fillnum from cmsrunsummary where fillnum>=:minFill and fillnum<=:maxFill
01650 output: fillDict={fillnum:[runlist]}
01651 '''
01652 result={}
01653 queryHandle.addToTableList(nameDealer.cmsrunsummaryTableName())
01654 queryCondition=coral.AttributeList()
01655 queryCondition.extend('minFill','unsigned int')
01656 queryCondition.extend('maxFill','unsigned int')
01657 queryCondition['minFill'].setData(int(minFill))
01658 queryCondition['maxFill'].setData(int(maxFill))
01659 queryHandle.addToOutputList('RUNNUM','runnum')
01660 queryHandle.addToOutputList('FILLNUM','fillnum')
01661 queryHandle.setCondition('FILLNUM>=:minFill and FILLNUM<=:maxFill',queryCondition)
01662 queryResult=coral.AttributeList()
01663 queryResult.extend('runnum','unsigned int')
01664 queryResult.extend('fillnum','unsigned int')
01665 queryHandle.defineOutput(queryResult)
01666 cursor=queryHandle.execute()
01667 while cursor.next():
01668 runnum=cursor.currentRow()['runnum'].data()
01669 fillnum=cursor.currentRow()['fillnum'].data()
01670 if not result.has_key(fillnum):
01671 result[fillnum]=[runnum]
01672 else:
01673 result[fillnum].append(runnum)
01674 return result
01675
01676 def runsByTimerange(queryHandle,minTime,maxTime):
01677 '''
01678 find all runs in the time range inclusive
01679 the selected run must have started after minTime and finished by maxTime
01680 select runnum,to_char(startTime),to_char(stopTime) from cmsrunsummary where startTime>=timestamp(minTime) and stopTime<=timestamp(maxTime);
01681 input: minTime,maxTime in python obj datetime.datetime
01682 output: {runnum:[starttime,stoptime]} return in python obj datetime.datetime
01683 '''
01684 t=lumiTime.lumiTime()
01685 result={}
01686 coralminTime=coral.TimeStamp(minTime.year,minTime.month,minTime.day,minTime.hour,minTime.minute,minTime.second,0)
01687 coralmaxTime=coral.TimeStamp(maxTime.year,maxTime.month,maxTime.day,maxTime.hour,maxTime.minute,maxTime.second,0)
01688 queryHandle.addToTableList(nameDealer.cmsrunsummaryTableName())
01689 queryCondition=coral.AttributeList()
01690 queryCondition.extend('minTime','time stamp')
01691 queryCondition.extend('maxTime','time stamp')
01692 queryCondition['minTime'].setData(coralminTime)
01693 queryCondition['maxTime'].setData(coralmaxTime)
01694 queryHandle.addToOutputList('RUNNUM','runnum')
01695 queryHandle.addToOutputList('TO_CHAR(STARTTIME,\''+t.coraltimefm+'\')','starttime')
01696 queryHandle.addToOutputList('TO_CHAR(STOPTIME,\''+t.coraltimefm+'\')','stoptime')
01697 queryHandle.setCondition('STARTTIME>=:minTime and STOPTIME<=:maxTime',queryCondition)
01698 queryResult=coral.AttributeList()
01699 queryResult.extend('runnum','unsigned int')
01700 queryResult.extend('starttime','string')
01701 queryResult.extend('stoptime','string')
01702 queryHandle.defineOutput(queryResult)
01703 cursor=queryHandle.execute()
01704 while cursor.next():
01705 runnum=cursor.currentRow()['runnum'].data()
01706 starttimeStr=cursor.currentRow()['starttime'].data()
01707 stoptimeStr=cursor.currentRow()['stoptime'].data()
01708 if not result.has_key(runnum):
01709 result[runnum]=[t.StrToDatetime(starttimeStr),t.StrToDatetime(stoptimeStr)]
01710 return result
01711
01712 if __name__=='__main__':
01713 msg=coral.MessageStream('')
01714
01715 msg.setMsgVerbosity(coral.message_Level_Error)
01716 os.environ['CORAL_AUTH_PATH']='/afs/cern.ch/cms/DB/lumi'
01717 svc = coral.ConnectionService()
01718 connectstr='oracle://cms_orcoff_prod/cms_lumi_prod'
01719 session=svc.connect(connectstr,accessMode=coral.access_ReadOnly)
01720 session.typeConverter().setCppTypeForSqlType("unsigned int","NUMBER(10)")
01721 session.typeConverter().setCppTypeForSqlType("unsigned long long","NUMBER(20)")
01722 session.transaction().start(True)
01723 schema=session.nominalSchema()
01724 allruns=allruns(schema,requireLumisummary=True,requireTrg=True,requireHlt=True)
01725 print 'allruns in runsummary and lumisummary and trg and hlt ',len(allruns)
01726
01727
01728
01729
01730
01731
01732
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757
01758
01759
01760
01761
01762
01763
01764
01765
01766
01767
01768
01769
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780
01781 q=schema.newQuery()
01782 allfills=allfills(q)
01783 del q
01784 session.transaction().commit()
01785 del session
01786 del svc
01787
01788
01789
01790
01791
01792
01793
01794
01795
01796
01797
01798
01799
01800
01801
01802
01803
01804
01805
01806
01807
01808
01809
01810
01811
01812
01813
01814
01815
01816
01817
01818
01819 print 'all fills ',allfills