00001
00002 VERSION='2.00'
00003 import os,sys,time
00004 import coral
00005
00006 from RecoLuminosity.LumiDB import lumiTime,inputFilesetParser,csvSelectionParser, selectionParser,csvReporter,argparse,CommonUtil,lumiQueryAPI
00007
00008
00009
00010 def getPerLSData(dbsession,inputRange,lumiversion='0001'):
00011 result={}
00012 datacollector={}
00013 if isinstance(inputRange, str):
00014 datacollector[int(inputRange)]=[]
00015 else:
00016 for run in inputRange.runs():
00017 datacollector[run]=[]
00018 try:
00019 dbsession.transaction().start(True)
00020 schema=dbsession.nominalSchema()
00021 for run in datacollector.keys():
00022 runsummaryOut=[]
00023 lumisummaryOut=[]
00024 trgOut={}
00025 q=schema.newQuery()
00026 runsummaryOut=lumiQueryAPI.runsummaryByrun(q,run)
00027 del q
00028 q=schema.newQuery()
00029 lumisummaryOut=lumiQueryAPI.lumisummaryByrun(q,run,lumiversion)
00030 del q
00031 q=schema.newQuery()
00032 trgOut=lumiQueryAPI.trgbitzeroByrun(q,run,)
00033 del q
00034 if len(runsummaryOut)!=0 and len(lumisummaryOut)!=0 and len(trgOut)!=0:
00035 datacollector[run].append(runsummaryOut)
00036 datacollector[run].append(lumisummaryOut)
00037 datacollector[run].append(trgOut)
00038 dbsession.transaction().commit()
00039 except Exception, e:
00040 dbsession.transaction().rollback()
00041 del dbsession
00042 raise Exception, 'lumiCalc.getPerLSData:'+str(e)
00043 for run,perrundata in datacollector.items():
00044 result[run]=[]
00045 if len(perrundata)==0:
00046 continue
00047 runsummary=perrundata[0]
00048 lumisummary=perrundata[1]
00049 trg=perrundata[2]
00050 starttimestr=runsummaryOut[3]
00051 t=lumiTime.lumiTime()
00052 for dataperls in lumisummary:
00053 cmslsnum=dataperls[0]
00054 instlumi=dataperls[1]
00055 numorbit=dataperls[2]
00056 dellumi=instlumi*float(numorbit)*3564.0*25.0e-09
00057 startorbit=dataperls[3]
00058 orbittime=t.OrbitToTime(starttimestr,startorbit)
00059 orbittimestamp=time.mktime(orbittime.timetuple())+orbittime.microsecond/1e6
00060 trgcount=0
00061 deadtime=0
00062 prescale=0
00063 deadfrac=1.0
00064 if trg.has_key(cmslsnum):
00065 trgcount=trg[cmslsnum][0]
00066 deadtime=trg[cmslsnum][1]
00067 prescale=trg[cmslsnum][3]
00068 if trgcount!=0 and prescale!=0:
00069 deadfrac=float(deadtime)/(float(trgcount)*float(prescale))
00070 recordedlumi=dellumi*(1.0-deadfrac)
00071 result[run].append( [cmslsnum,orbittime,orbittimestamp,dellumi,recordedlumi] )
00072 return result
00073
00074 def getValidationData(dbsession,run=None,cmsls=None):
00075 '''retrieve validation data per run or all
00076 input: runnum, if not runnum, retrive all
00077 output: {run:[[cmslsnum,flag,comment]]}
00078 '''
00079 try:
00080 dbsession.transaction().start(True)
00081 schema=dbsession.nominalSchema()
00082 queryHandle=dbsession.nominalSchema().newQuery()
00083 result=lumiQueryAPI.validation(queryHandle,run,cmsls)
00084 del queryHandle
00085 dbsession.transaction().commit()
00086 except Exception, e:
00087 dbsession.transaction().rollback()
00088 del dbsession
00089 raise Exception, 'lumiValidate.getValidationData:'+str(e)
00090 return result
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100 if __name__ == '__main__':
00101 parser = argparse.ArgumentParser(prog=os.path.basename(sys.argv[0]),description = "Lumi Calculations",formatter_class=argparse.ArgumentDefaultsHelpFormatter)
00102 allowedActions = ['overview', 'delivered', 'recorded', 'lumibyls','lumibylstime','lumibylsXing','status']
00103 beamModeChoices = [ "stable", "quiet", "either"]
00104
00105 parser.add_argument('action',choices=allowedActions,help='command actions')
00106 parser.add_argument('-c',dest='connect',action='store',required=False,help='connect string to lumiDB,optional',default='frontier://LumiCalc/CMS_LUMI_PROD')
00107 parser.add_argument('-P',dest='authpath',action='store',help='path to authentication file,optional')
00108 parser.add_argument('-n',dest='normfactor',action='store',type=float,default=1.0,help='normalization factor,optional')
00109 parser.add_argument('-r',dest='runnumber',action='store',type=int,help='run number,optional')
00110 parser.add_argument('-i',dest='inputfile',action='store',help='lumi range selection file,optional')
00111 parser.add_argument('-o',dest='outputfile',action='store',help='output to csv file,optional')
00112 parser.add_argument('-b',dest='beammode',action='store',choices=beamModeChoices,required=False,help='beam mode choice')
00113 parser.add_argument('-lumiversion',dest='lumiversion',action='store',default='0001',help='lumi data version, optional')
00114 parser.add_argument('-hltpath',dest='hltpath',action='store',default='all',help='specific hltpath to calculate the recorded luminosity,optional')
00115 parser.add_argument('-siteconfpath',dest='siteconfpath',action='store',help='specific path to site-local-config.xml file, optional. If path undefined, fallback to cern proxy&server')
00116 parser.add_argument('-xingMinLum', dest = 'xingMinLum', type=float, default=1e-3,required=False,help='Minimum luminosity considered for "lumibylsXing" action')
00117 parser.add_argument('--verbose',dest='verbose',action='store_true',help='verbose mode for printing' )
00118 parser.add_argument('--nowarning',dest='nowarning',action='store_true',help='suppress bad for lumi warnings' )
00119 parser.add_argument('--debug',dest='debug',action='store_true',help='debug')
00120 options=parser.parse_args()
00121 if options.authpath:
00122 os.environ['CORAL_AUTH_PATH'] = options.authpath
00123
00124 if not options.inputfile and not options.runnumber:
00125 print "must specify either a run (-r) or an input run selection file (-i)"
00126 sys.exit()
00127
00128
00129 parameters = lumiQueryAPI.ParametersObject()
00130 parameters.verbose = options.verbose
00131 parameters.noWarnings = options.nowarning
00132 parameters.norm = options.normfactor
00133 parameters.lumiversion = options.lumiversion
00134 if options.beammode=='stable':
00135 parameters.beammode = 'STABLE BEAMS'
00136 parameters.xingMinLum = options.xingMinLum
00137 session,svc = lumiQueryAPI.setupSession (options.connect or \
00138 'frontier://LumiCalc/CMS_LUMI_PROD',
00139 options.siteconfpath,parameters,options.debug)
00140 lumiXing = False
00141 if options.action in ['lumibylsXing','delivered','recorded','overview','lumibyls','lumibylstime']:
00142 if options.action == 'lumibylsXing':
00143
00144 parameters.lumiXing = True
00145
00146
00147
00148
00149 if options.runnumber:
00150 inputRange=str(options.runnumber)
00151 else:
00152 inputRange=inputFilesetParser.inputFilesetParser(options.inputfile)
00153 if not inputRange:
00154 print 'failed to parse the input file', options.inputfile
00155 raise
00156
00157
00158 if options.action == 'delivered':
00159 lumidata=lumiQueryAPI.deliveredLumiForRange(session, parameters, inputRange)
00160 if not options.outputfile:
00161 lumiQueryAPI.printDeliveredLumi (lumidata, '')
00162 else:
00163 lumidata.insert (0, ['run', 'nls', 'delivered', 'beammode'])
00164 lumiQueryAPI.dumpData (lumidata, options.outputfile)
00165
00166
00167 if options.action == 'recorded':
00168 hltpath = ''
00169 if options.hltpath:
00170 hltpath = options.hltpath
00171 lumidata = lumiQueryAPI.recordedLumiForRange (session, parameters, inputRange)
00172 if not options.outputfile:
00173 lumiQueryAPI.printRecordedLumi (lumidata, parameters.verbose, hltpath)
00174 else:
00175 todump = lumiQueryAPI.dumpRecordedLumi (lumidata, hltpath)
00176 todump.insert (0, ['run', 'hltpath', 'recorded'])
00177 lumiQueryAPI.dumpData (todump, options.outputfile)
00178
00179
00180 if options.action == 'overview':
00181 hltpath=''
00182 if options.hltpath:
00183 hltpath=options.hltpath
00184 delivereddata=lumiQueryAPI.deliveredLumiForRange(session, parameters, inputRange)
00185 recordeddata=lumiQueryAPI.recordedLumiForRange(session, parameters, inputRange)
00186 if not options.outputfile:
00187 lumiQueryAPI.printOverviewData (delivereddata, recordeddata, hltpath)
00188 else:
00189 todump = lumiQueryAPI.dumpOverview (delivereddata, recordeddata, hltpath)
00190 if not hltpath:
00191 hltpath = 'all'
00192 todump.insert (0, ['run', 'delivered', 'recorded', 'hltpath:'+hltpath])
00193 lumiQueryAPI.dumpData (todump, options.outputfile)
00194
00195
00196 if options.action == 'lumibylstime':
00197 lsdata=getPerLSData(session,inputRange)
00198 runs=lsdata.keys()
00199 runs.sort()
00200 if not options.outputfile:
00201 print 'run,cmslsnum, utctime, unixtimestamp, delivered, recorded'
00202 for run in runs:
00203 if len(lsdata[run])==0:continue
00204 for perlsdata in lsdata[run]:
00205 if len(perlsdata)==0:
00206 continue
00207 print run,perlsdata[0],perlsdata[1],perlsdata[2],perlsdata[3],perlsdata[4]
00208
00209 else:
00210 report=csvReporter.csvReporter(options.outputfile)
00211 report.writeRow(['run','cmslsnum','utctime','unixtimestamp','delivered','recorded'])
00212 for run in runs:
00213 if len(lsdata[run])==0:continue
00214 for perlsdata in lsdata[run]:
00215 if len(perlsdata)==0:
00216 continue
00217 report.writeRow([run,perlsdata[0],perlsdata[1],perlsdata[2],perlsdata[3],perlsdata[4]])
00218
00219 if options.action=='lumibyls' or options.action=='lumibylsXing':
00220 recordeddata=lumiQueryAPI.recordedLumiForRange(session, parameters, inputRange)
00221
00222 if not options.outputfile:
00223 lumiQueryAPI.printPerLSLumi (recordeddata, parameters.verbose)
00224 else:
00225 todump = lumiQueryAPI.dumpPerLSLumi(recordeddata)
00226 todump.insert (0, ['run', 'ls', 'delivered', 'recorded'])
00227 lumiQueryAPI.dumpData (todump, options.outputfile)
00228 if not options.nowarning:
00229 result={}
00230 if isinstance(inputRange,str):
00231 result=getValidationData(session,run=int(inputRange))
00232 else:
00233 runsandls=inputRange.runsandls()
00234 for runnum,lslist in runsandls.items():
00235 dataperrun=getValidationData(session,run=runnum,cmsls=lslist)
00236 if dataperrun.has_key(runnum):
00237 result[runnum]=dataperrun[runnum]
00238 for run,perrundata in result.items():
00239 totalsuspect=0
00240 totalbad=0
00241 totalunknown=0
00242 for lsdata in perrundata:
00243 if lsdata[1]=='UNKNOWN':
00244 totalunknown+=1
00245 if lsdata[1]=='SUSPECT':
00246 totalsuspect+=1
00247 if lsdata[1]=='BAD':
00248 totalbad+=1
00249 if totalsuspect!=0 or totalbad!=0 or totalunknown!=0:
00250 print '[WARNING] : run '+str(run)+' : total non-GOOD LS: UNKNOWN '+str(totalunknown)+', BAD '+str(totalbad)+', SUSPECT '+str(totalsuspect)
00251
00252 elif options.action=='status':
00253 result={}
00254 if options.inputfile:
00255 p=inputFilesetParser.inputFilesetParser(options.inputfile)
00256 runsandls=p.runsandls()
00257 for runnum,lslist in runsandls.items():
00258 dataperrun=getValidationData(session,run=runnum,cmsls=lslist)
00259 result[runnum]=dataperrun[runnum]
00260 else:
00261 result=getValidationData(session,run=options.runnumber)
00262 runs=result.keys()
00263 runs.sort()
00264 if options.outputfile:
00265 r=csvReporter.csvReporter(options.outputfile)
00266 for run in runs:
00267 for perrundata in result[run]:
00268 r.writeRow([str(run),str(perrundata[0]),perrundata[1],perrundata[2]])
00269 else:
00270 for run in runs:
00271 print '== ='
00272 for lsdata in result[run]:
00273 print str(run)+','+str(lsdata[0])+','+lsdata[1]+','+lsdata[2]
00274 del session
00275 del svc