예제 #1
0
def getInstLumiPerLS(dbsession,c,runList,selectionDict,beamstatus=None,beamenergy=None,beamenergyfluctuation=0.09,finecorrections=None):
    '''
    input: runList[runnum], selectionDict{runnum:[ls]}
    output:[[runnumber,lsnumber,deliveredInst,recordedInst,norbit,startorbit,runstarttime,runstoptime]]
    '''
    result=[]
    selectedRunlist=runList
    if len(selectionDict)!=0:
        selectedRunlist=[]
        allruns=runlist+selectionDict.keys()
        dups=CommonUtil.count_dups(allruns)
        for runnum,dupcount in dups:
            if dupcount==2:
                selectedRunlist.append(runnum)
    dbsession.transaction().start(True)
    for run in selectedRunlist:
        q=dbsession.nominalSchema().newQuery()
        runsummary=lumiQueryAPI.runsummaryByrun(q,run)
        del q
        runstarttime=runsummary[3]
        runstoptime=runsummary[4]
        q=dbsession.nominalSchema().newQuery()
        if finecorrections and finecorrections[run]:            
            lumiperrun=lumiQueryAPI.lumisummaryByrun(q,run,c.LUMIVERSION,beamstatus,beamenergy,beamenergyfluctuation,finecorrections=finecorrections[run])
        else:
            lumiperrun=lumiQueryAPI.lumisummaryByrun(q,run,c.LUMIVERSION,beamstatus,beamenergy,beamenergyfluctuation)
        del q
        if len(lumiperrun)==0: #no result for this run
            result.append([run,1,0.0,0.0,0,0,runstarttime,runstoptime])
        else:
            for lumiperls in lumiperrun:
                cmslsnum=lumiperls[0]
                instlumi=lumiperls[1]
                recordedlumi=0.0
                numorbit=lumiperls[2]
                startorbit=lumiperls[3]
                deadcount=0
                bitzero=0
                result.append([run,cmslsnum,instlumi,recordedlumi,numorbit,startorbit,runstarttime,runstoptime])
    dbsession.transaction().commit()
    if c.VERBOSE:
        print result
    return result              
예제 #2
0
def main(*args):
    runnum = 0
    try:
        runnum = args[1]
        report = csvReporter.csvReporter('instlumibytime-' + str(runnum) +
                                         '.csv')
        msg = coral.MessageStream('')
        msg.setMsgVerbosity(coral.message_Level_Error)
        os.environ['CORAL_AUTH_PATH'] = '/afs/cern.ch/cms/lumi'
        svc = coral.ConnectionService()
        connectstr = 'oracle://cms_orcoff_prod/cms_lumi_prod'
        session = svc.connect(connectstr, accessMode=coral.access_ReadOnly)
        session.typeConverter().setCppTypeForSqlType("unsigned int",
                                                     "NUMBER(10)")
        session.typeConverter().setCppTypeForSqlType("unsigned long long",
                                                     "NUMBER(20)")
        session.transaction().start(True)
        schema = session.nominalSchema()
        q = schema.newQuery()
        runsummaryOut = lumiQueryAPI.runsummaryByrun(q, runnum)
        del q
        q = schema.newQuery()
        lumisummaryOut = lumiQueryAPI.lumisummaryByrun(q, runnum, '0001')
        del q
        session.transaction().commit()
        del session
        del svc
        #print runsummaryOut
        starttimestr = runsummaryOut[3]
        t = lumiTime.lumiTime()
        report.writeRow(['cmslsnum', 'utctime', 'unixtimestamp', 'instlumi'])
        for dataperls in lumisummaryOut:
            cmslsnum = dataperls[0]
            instlumi = dataperls[1]
            startorbit = dataperls[3]
            orbittime = t.OrbitToTime(starttimestr, startorbit)
            orbittimestamp = time.mktime(
                orbittime.timetuple()) + orbittime.microsecond / 1e6
            report.writeRow([cmslsnum, orbittime, orbittimestamp, instlumi])

    except IndexError:
        print 'runnumber should be provided'
        return 1
    except Exception as er:
        print str(er)
        return 2
    else:
        return 0
예제 #3
0
def main(*args):
    runnum=0
    try:
        runnum=args[1]
        report=csvReporter.csvReporter('instlumibytime-'+str(runnum)+'.csv')
        msg=coral.MessageStream('')
        msg.setMsgVerbosity(coral.message_Level_Error)
        os.environ['CORAL_AUTH_PATH']='/afs/cern.ch/cms/lumi'
        svc = coral.ConnectionService()
        connectstr='oracle://cms_orcoff_prod/cms_lumi_prod'
        session=svc.connect(connectstr,accessMode=coral.access_ReadOnly)
        session.typeConverter().setCppTypeForSqlType("unsigned int","NUMBER(10)")
        session.typeConverter().setCppTypeForSqlType("unsigned long long","NUMBER(20)")
        session.transaction().start(True)
        schema=session.nominalSchema()
        q=schema.newQuery()
        runsummaryOut=lumiQueryAPI.runsummaryByrun(q,runnum)
        del q
        q=schema.newQuery()
        lumisummaryOut=lumiQueryAPI.lumisummaryByrun(q,runnum,'0001')
        del q
        session.transaction().commit()  
        del session
        del svc
        #print runsummaryOut
        starttimestr=runsummaryOut[3]
        t=lumiTime.lumiTime()
        report.writeRow(['cmslsnum','utctime','unixtimestamp','instlumi'])
        for dataperls in lumisummaryOut:
            cmslsnum=dataperls[0]
            instlumi=dataperls[1]
            startorbit=dataperls[3]
            orbittime=t.OrbitToTime(starttimestr,startorbit)
            orbittimestamp=time.mktime(orbittime.timetuple())+orbittime.microsecond/1e6
            report.writeRow([cmslsnum,orbittime,orbittimestamp,instlumi])

    except IndexError:
        print('runnumber should be provided')
        return 1
    except Exception as er:
        print(str(er))
        return 2
    else:
        return 0
예제 #4
0
def getLumiPerRun(dbsession,c,run,beamstatus=None,beamenergy=None,beamenergyfluctuation=0.09,finecorrections=None):
    '''
    input: run
    output:{runnumber:[[lsnumber,deliveredInst,recordedInst,norbit,startorbit,runstarttime,runstoptime]]}
    '''
    result=[]
    dbsession.transaction().start(True)
    q=dbsession.nominalSchema().newQuery()
    runsummary=lumiQueryAPI.runsummaryByrun(q,run)
    del q
    runstarttime=runsummary[3]
    runstoptime=runsummary[4]
    fillnum=runsummary[0]
    q=dbsession.nominalSchema().newQuery()
    lumiperrun=lumiQueryAPI.lumisummaryByrun(q,run,c.LUMIVERSION,beamstatus,beamenergy,beamenergyfluctuation,finecorrections=finecorrections)
    del q
    q=dbsession.nominalSchema().newQuery()
    trgperrun=lumiQueryAPI.trgbitzeroByrun(q,run) # {cmslsnum:[trgcount,deadtime,bitname,prescale]}
    del q
        
    for lumiperls in lumiperrun:
        cmslsnum=lumiperls[0]
        instlumi=lumiperls[1]
        recordedlumi=0.0
        numorbit=lumiperls[2]
        startorbit=lumiperls[3]
        deadcount=0
        bitzero=0
        if trgperrun.has_key(cmslsnum):
            bitzero=trgperrun[cmslsnum][0]
            deadcount=trgperrun[cmslsnum][1]
            bitzeroprescale=trgperrun[cmslsnum][-1]
            try:
                recordedlumi=instlumi*(1.0-float(deadcount)/(float(bitzero)*float(bitzeroprescale)))
            except ZeroDivisionError:
                recordedlumi=-0.1 #           
        result.append([cmslsnum,instlumi,recordedlumi,numorbit,startorbit,fillnum,runstarttime,runstoptime])
    dbsession.transaction().commit()
    if c.VERBOSE:
        print result
    return result          
예제 #5
0
def getSpecificLumi(dbsession,parameters,fillnum,inputdir,finecorrections=None):
    '''
    specific lumi in 1e-30 (ub-1s-1) unit
    lumidetail occlumi in 1e-27
    1309_lumi_401_CMS.txt
    time(in seconds since January 1,2011,00:00:00 UTC) stab(fraction of time spent in stable beams for this time bin) l(lumi in Hz/ub) dl(point-to-point error on lumi in Hz/ub) sl(specific lumi in Hz/ub) dsl(error on specific lumi)
    20800119.0 1 -0.889948 0.00475996848729 0.249009 0.005583287562 -0.68359 6.24140208607 0.0 0.0 0.0 0.0 0.0 0.0 0.0383576 0.00430892097862 0.0479095 0.00430892097862 66.6447 4.41269758764 0.0 0.0 0.0
    result [(time,beamstatusfrac,lumi,lumierror,speclumi,speclumierror)]
    '''
    #result=[]
    runtimesInFill=getFillFromFile(fillnum,inputdir)#{runnum:starttimestr}
    beamstatusDict={}#{runnum:{(startorbit,cmslsnum):beamstatus}}
    t=lumiTime.lumiTime()
    fillbypos={}#{bxidx:(lstime,beamstatusfrac,lumi,lumierror,specificlumi,specificlumierror)}
    #referencetime=time.mktime(datetime.datetime(2010,1,1,0,0,0).timetuple())
    referencetime=0
    if fillnum and len(runtimesInFill)==0:
        runtimesInFill=getFillFromDB(dbsession,parameters,fillnum)#{runnum:starttimestr}
    #precheck
    totalstablebeamLS=0
    for runnum in runtimesInFill.keys():
        q=dbsession.nominalSchema().newQuery()
        runinfo=lumiQueryAPI.lumisummaryByrun(q,runnum,'0001',beamstatus=None)
        del q
        lsbeamstatusdict={}
        for perlsdata in runinfo:
            cmslsnum=perlsdata[0]
            startorbit=perlsdata[3]
            beamstatus=perlsdata[4]
            lsbeamstatusdict[(startorbit,cmslsnum)]=beamstatus            
            #print (startorbit,cmslsnum),beamstatus
            if beamstatus=='STABLE BEAMS':
                totalstablebeamLS+=1
        beamstatusDict[runnum]=lsbeamstatusdict
    if totalstablebeamLS<10:#less than 10 LS in a fill has 'stable beam', it's no a good fill
        print 'fill ',fillnum,' , having less than 10 stable beam lS, is not good, skip'
        return fillbypos
    for runnum,starttime in runtimesInFill.items():
        #if not runtimesInFill.has_key(runnum):
        #    print 'run '+str(runnum)+' does not exist'
        #    continue
        q=dbsession.nominalSchema().newQuery()
        if finecorrections and finecorrections[runnum]:
            occlumidata=lumiQueryAPI.calibratedDetailForRunLimitresult(q,parameters,runnum,finecorrection=finecorrections[runnum])#{(startorbit,cmslsnum):[(bxidx,lumivalue,lumierr)]} #values after cut
        else:
            occlumidata=lumiQueryAPI.calibratedDetailForRunLimitresult(q,parameters,runnum)
        del q
        #print occlumidata
        q=dbsession.nominalSchema().newQuery()
        beamintensitydata=lumiQueryAPI.beamIntensityForRun(q,parameters,runnum)#{startorbit:[(bxidx,beam1intensity,beam2intensity),()]}
        #print 'beamintensity for run ',runnum,beamintensitydata
        del q
        for (startorbit,cmslsnum),lumilist in occlumidata.items():
            if len(lumilist)==0: continue
            beamstatusflag=beamstatusDict[runnum][(startorbit,cmslsnum)]
            beamstatusfrac=0.0
            if beamstatusflag=='STABLE BEAMS':
                beamstatusfrac=1.0
            lstimestamp=t.OrbitToUTCTimestamp(starttime,startorbit)
            for lumidata in lumilist:#loop over bx
                bxidx=lumidata[0]
                lumi=lumidata[1]
                lumierror=lumidata[2]
                speclumi=(0.0,0.0)
                if not fillbypos.has_key(bxidx):
                    fillbypos[bxidx]=[]
                if beamintensitydata.has_key(startorbit):
                    beaminfo=beamintensitydata[startorbit]
                    for beamintensitybx in beaminfo:
                        if beamintensitybx[0]==bxidx:                        
                            beam1intensity=beamintensitybx[1]
                            beam2intensity=beamintensitybx[2]
                            if beam1intensity<0:
                                beam1intensity=0
                            if beam2intensity<0:
                                beam2intensity=0
                            speclumi=calculateSpecificLumi(lumi,lumierror,beam1intensity,0.0,beam2intensity,0.0)
                            break
                fillbypos[bxidx].append((lstimestamp-referencetime,beamstatusfrac,lumi,lumierror,speclumi[0],speclumi[1]))

    #print 'fillbypos.keys ',fillbypos.keys()
    return fillbypos
예제 #6
0
def insertupdateValidationData(dbsession,data):
    '''
    input: data {run:[[ls,status,comment]]}
    '''
    toreplacenocomment=[]#[[('RUNNUM',runnum),('CMSLSNUM',cmslsnum),('FLAG',flag)],[]]
    toreplacewcomment=[]#[[('RUNNUM',runnum),('CMSLSNUM',cmslsnum),('FLAG',flag),('COMMENT',comment)],[]]
    toinsert=[] #[[('RUNNUM',runnum),('CMSLSNUM',cmslsnum),('FLAG',flag),('COMMENT',comment)],[]]
    try:
        dbsession.transaction().start(True)
        dbutil=dbUtil.dbUtil(dbsession.nominalSchema())
        for run,alllsdata in data.items():
            lsselection=[]
            if len(alllsdata)==0:#cross query lumisummary to get all the cmslsnum for this run,then insert all to default
                queryHandle=dbsession.nominalSchema().newQuery()
                lumisummaryData=lumiQueryAPI.lumisummaryByrun(queryHandle,run,'0001')
                del queryHandle
                for lumisummary in lumisummaryData:
                    if lumisummary[-1]==1:#cmsalive
                        lsselection.append([lumisummary[0],'UNKNOWN','NA'])
            else:
                lsselection=alllsdata
            if len(lsselection)==0:
                print 'no LS found for run '+str(run)+' do nothing'
                continue
            for lsdata in lsselection:
                condition='RUNNUM=:runnum AND CMSLSNUM=:cmslsnum'
                conditionDefDict={}
                conditionDefDict['runnum']='unsigned int'
                conditionDefDict['cmslsnum']='unsigned int'
                conditionDict={}
                conditionDict['runnum']=run
                conditionDict['cmslsnum']=lsdata[0]
                if dbutil.existRow(nameDealer.lumivalidationTableName(),condition,conditionDefDict,conditionDict):
                    if len(lsdata)>2 and lsdata[2]:
                        toreplacewcomment.append([('runnum',run),('cmslsnum',lsdata[0]),('flag',lsdata[1]),('comment',lsdata[2])])
                    else: 
                        toreplacenocomment.append([('runnum',run),('cmslsnum',lsdata[0]),('flag',lsdata[1]),('comment','')])
                else:
                    if len(lsdata)>2 and lsdata[2]:
                        toinsert.append([('RUNNUM',run),('CMSLSNUM',lsdata[0]),('FLAG',lsdata[1]),('COMMENT',lsdata[2])])
                    else:
                        toinsert.append([('RUNNUM',run),('CMSLSNUM',lsdata[0]),('FLAG',lsdata[1]),('COMMENT','N/A')])
        dbsession.transaction().commit()
        #print 'toreplace with comment ',toreplacewcomment
        #print 'toreplace without comment ',toreplacenocomment
        #print 'toinsert ',toinsert
        #perform insert
        if len(toinsert)!=0:
            dbsession.transaction().start(False)
            dbutil=dbUtil.dbUtil(dbsession.nominalSchema())
            tabrowDef=[]
            tabrowDef.append(('RUNNUM','unsigned int'))
            tabrowDef.append(('CMSLSNUM','unsigned int'))
            tabrowDef.append(('FLAG','string'))
            tabrowDef.append(('COMMENT','string'))
            dbutil.bulkInsert(nameDealer.lumivalidationTableName(),tabrowDef,toinsert)
            dbsession.transaction().commit()
        #perform update with comment
        if len(toreplacewcomment)!=0:
            dbsession.transaction().start(False)
            dbutil=dbUtil.dbUtil(dbsession.nominalSchema())
            updateAction='FLAG=:flag,COMMENT=:comment'
            updateCondition='RUNNUM=:runnum and CMSLSNUM=:cmslsnum'
            bindvarDef=[]        
            bindvarDef.append(('flag','string'))
            bindvarDef.append(('comment','string'))
            bindvarDef.append(('runnum','unsigned int'))
            bindvarDef.append(('cmslsnum','unsigned int'))
            dbutil.updateRows(nameDealer.lumivalidationTableName(),updateAction,updateCondition,bindvarDef,toreplacewcomment)
            dbsession.transaction().commit()
        #perform update with NO comment
        if len(toreplacenocomment)!=0:
            dbsession.transaction().start(False)
            dbutil=dbUtil.dbUtil(dbsession.nominalSchema())
            updateAction='FLAG=:flag'
            updateCondition='RUNNUM=:runnum and CMSLSNUM=:cmslsnum'
            bindvarDef=[]        
            bindvarDef.append(('flag','string'))
            bindvarDef.append(('runnum','unsigned int'))
            bindvarDef.append(('cmslsnum','unsigned int'))
            dbutil.updateRows(nameDealer.lumivalidationTableName(),updateAction,updateCondition,bindvarDef,toreplacenocomment)
            dbsession.transaction().commit()
    except Exception, e:
        dbsession.transaction().rollback()
        del dbsession
        raise Exception, 'lumiValidate.insertupdateValidationData:'+str(e)
예제 #7
0
def getLumiOrderByLS(dbsession,c,runList,selectionDict,hltpath='',beamstatus=None,beamenergy=None,beamfluctuation=None,finecorrections=None):
    '''
    input:  runList[runnum], selectionDict{runnum:[ls]}
    output: [[runnumber,runstarttime,lsnum,lsstarttime,delivered,recorded,recordedinpath]]
    '''
    #print 'getLumiOrderByLS selectionDict seen ',selectionDict
    t=lumiTime.lumiTime()
    result=[]#[[runnumber,runstarttime,lsnum,lsstarttime,delivered,recorded]]
    dbsession.transaction().start(True)
    sortedresult=[]
    #print 'runlist ',runList
    for runnum in runList:
        delivered=0.0
        recorded=0.0       
        #print 'looking for run ',runnum
        q=dbsession.nominalSchema().newQuery()
        runsummary=lumiQueryAPI.runsummaryByrun(q,runnum)
        del q
        runstarttimeStr=runsummary[3]
        if len(runstarttimeStr)==0:
            if c.VERBOSE: print 'warning request run ',runnum,' has no runsummary, skip'
            continue
        if len(selectionDict)!=0 and not selectionDict.has_key(runnum):
            if runnum<max(selectionDict.keys()):
                result.append([runnum,runstarttimeStr,1,t.StrToDatetime(runstarttimeStr),0.0,0.0])
            continue
        #print 'runsummary ',runsummary
        lumitrginfo={}
        q=dbsession.nominalSchema().newQuery()
        if finecorrections and finecorrections[runnum]:
            lumitrginfo=lumiQueryAPI.lumisummarytrgbitzeroByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation,finecorrections=finecorrections[runnum]) #q2
        else:
            lumitrginfo=lumiQueryAPI.lumisummarytrgbitzeroByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation) #q2
        del q
        #print 'lumitrginfo ',lumitrginfo
        if len(lumitrginfo)==0: #if no qualified cross lumi-trg found, try lumionly
            #result.append([runnum,runstarttimeStr,1,t.StrToDatetime(runstarttimeStr),0.0,0.0])
            q=dbsession.nominalSchema().newQuery()
            if finecorrections and finecorrections[runnum]:
                lumiinfobyrun=lumiQueryAPI.lumisummaryByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation,finecorrections=finecorrections[runnum]) #q3
            else:
                lumiinfobyrun=lumiQueryAPI.lumisummaryByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation)
            del q
            if len(lumiinfobyrun)!=0: #if lumionly has qualified data means trg has no data
                print 'warning request run ',runnum,' has no trigger data, calculate delivered only'
                for perlsdata in lumiinfobyrun:
                    cmslsnum=perlsdata[0]
                    instlumi=perlsdata[1]
                    norbit=perlsdata[2]
                    startorbit=perlsdata[3]
                    lsstarttime=t.OrbitToTime(runstarttimeStr,startorbit)
                    lslength=t.bunchspace_s*t.nbx*norbit
                    delivered=instlumi*lslength
                    result.append([runnum,runstarttimeStr,cmslsnum,lsstarttime,delivered,0.0])
            else:
                #print 'run '+str(runnum)+' has no qualified data '
                lsstarttime=t.OrbitToTime(runstarttimeStr,0)
                result.append([runnum,runstarttimeStr,1,lsstarttime,0.0,0.0])
        else:
            norbits=lumitrginfo.values()[0][1]
            lslength=t.bunchspace_s*t.nbx*norbits
            trgbitinfo={}
            for cmslsnum,valuelist in lumitrginfo.items():
                instlumi=valuelist[0]
                startorbit=valuelist[2]
                bitzero=valuelist[5]
                deadcount=valuelist[6]
                prescale=valuelist[-1]
                lsstarttime=t.OrbitToTime(runstarttimeStr,startorbit)        
                if len(selectionDict)!=0 and not (cmslsnum in selectionDict[runnum]):
                   #if there's a selection list but cmslsnum is not selected,set to 0
                   result.append([runnum,runstarttimeStr,cmslsnum,lsstarttime,0.0,0.0])
                   continue
                delivered=instlumi*lslength
                if valuelist[5]==0:#bitzero==0 means no beam,do nothing
                    recorded=0.0
                else:
                    deadfrac=float(deadcount)/float(float(bitzero)*float(prescale))
                    if(deadfrac<1.0):
                        recorded=delivered*(1.0-deadfrac)
                result.append([runnum,runstarttimeStr,cmslsnum,lsstarttime,delivered,recorded])
                #print 'result : ',result
    dbsession.transaction().commit()
    transposedResult=CommonUtil.transposed(result)
    lstimes=transposedResult[3]
    lstimes.sort()
    for idx,lstime in enumerate(lstimes):
        sortedresult.append(result[idx])
    if c.VERBOSE:
        print sortedresult
    return sortedresult           
예제 #8
0
def getLumiInfoForRuns(dbsession,c,runList,selectionDict,hltpath='',beamstatus=None,beamenergy=None,beamfluctuation=0.0,finecorrections=None):
    '''
    input: runList[runnum], selectionDict{runnum:[ls]}
    output:{runnumber:[delivered,recorded,recordedinpath] }
    '''
    t=lumiTime.lumiTime()
    result={}#runnumber:[lumisumoverlumils,lumisumovercmsls-deadtimecorrected,lumisumovercmsls-deadtimecorrected*hltcorrection_hltpath]
    #print 'selectionDict seen ',selectionDict
    dbsession.transaction().start(True)
    for runnum in runList:
        totallumi=0.0
        delivered=0.0
        recorded=0.0 
        recordedinpath=0.0
        if len(selectionDict)!=0 and not selectionDict.has_key(runnum):
            if runnum<max(selectionDict.keys()):
                result[runnum]=[0.0,0.0,0.0]
            continue
        q=dbsession.nominalSchema().newQuery()
        if finecorrections and finecorrections[runnum]:
            totallumi=lumiQueryAPI.lumisumByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation,finecorrections=finecorrections[runnum]) #q1
        else:
            totallumi=lumiQueryAPI.lumisumByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation)
        del q
        if not totallumi:
            result[runnum]=[0.0,0.0,0.0]
            if c.VERBOSE: print 'run ',runnum,' does not exist or has no lumi, skip'
            continue
        lumitrginfo={}
        hltinfo={}
        hlttrgmap={}
        q=dbsession.nominalSchema().newQuery()
        if finecorrections and finecorrections[runnum]:
            lumitrginfo=lumiQueryAPI.lumisummarytrgbitzeroByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation,finecorrections=finecorrections[runnum]) #q2
        else:
            lumitrginfo=lumiQueryAPI.lumisummarytrgbitzeroByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation)
        del q
        if len(lumitrginfo)==0:
            q=dbsession.nominalSchema().newQuery()
            if finecorrections and finecorrections[runnum]:
                lumiinfobyrun=lumiQueryAPI.lumisummaryByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation,finecorrections=finecorrections[runnum]) #q3
            else:
                lumiinfobyrun=lumiQueryAPI.lumisummaryByrun(q,runnum,c.LUMIVERSION,beamstatus,beamenergy,beamfluctuation)
            del q
            if len(lumiinfobyrun)!=0:
                print 'warning request run ',runnum,' has no trigger data, calculate delivered only'
            for perlsdata in lumiinfobyrun:
                cmslsnum=perlsdata[0]
                instlumi=perlsdata[1]
                norbit=perlsdata[2]
                lslength=t.bunchspace_s*t.nbx*norbit
                delivered+=instlumi*lslength
            result[runnum]=[delivered,0.0,0.0]
            #result[runnum]=[0.0,0.0,0.0]
            #if c.VERBOSE: print 'request run ',runnum,' has no trigger, skip'
        else:
            norbits=lumitrginfo.values()[0][1]
            lslength=t.bunchspace_s*t.nbx*norbits
            delivered=totallumi*lslength
            hlttrgmap={}
            trgbitinfo={}
            if len(hltpath)!=0 and hltpath!='all':
                q=dbsession.nominalSchema().newQuery() #optional q3, initiated only if you ask for a hltpath
                hlttrgmap=lumiQueryAPI.hlttrgMappingByrun(q,runnum)
                del q
                if hlttrgmap.has_key(hltpath):
                    l1bitname=hltTrgSeedMapper.findUniqueSeed(hltpath,hlttrgmap[hltpath])
                    q=dbsession.nominalSchema().newQuery() #optional q4, initiated only if you ask for a hltpath and it exists 
                    hltinfo=lumiQueryAPI.hltBypathByrun(q,runnum,hltpath)
                    del q
                    q=dbsession.nominalSchema().newQuery()
                    trgbitinfo=lumiQueryAPI.trgBybitnameByrun(q,runnum,l1bitname) #optional q5, initiated only if you ask for a hltpath and it has a unique l1bit
                    del q
        #done all possible queries. process result
            for cmslsnum,valuelist in lumitrginfo.items():
                if len(selectionDict)!=0 and not (cmslsnum in selectionDict[runnum]):
                    #if there's a selection list but cmslsnum is not selected,skip
                    continue
                if valuelist[5]==0:#bitzero==0 means no beam,do nothing
                    continue
                trgprescale=valuelist[8]            
                deadfrac=float(valuelist[6])/float(float(valuelist[5])*float(trgprescale))
                if(deadfrac<1.0):
                    recorded=recorded+valuelist[0]*(1.0-deadfrac)*lslength
                    if hlttrgmap.has_key(hltpath) and hltinfo.has_key(cmslsnum):
                        hltprescale=hltinfo[cmslsnum][2]
                        trgprescale=trgbitinfo[cmslsnum][3]
                        recordedinpath=recordedinpath+valuelist[0]*(1.0-deadfrac)*lslength*hltprescale*trgprescale
                else:
                    if deadfrac<0.0:
                        print 'warning deadfraction negative in run',runnum,' ls ',cmslsnum
                if c.VERBOSE:
                    print runnum,cmslsnum,valuelist[0]*lslength,valuelist[0]*(1.0-deadfrac)*lslength,lslength,deadfrac
            result[runnum]=[delivered,recorded,recordedinpath]
    dbsession.transaction().commit()
    #if c.VERBOSE:
    #    print result
    return result