Skip to content
Snippets Groups Projects
daqInfo.py 3.18 KiB
Newer Older
sveseli's avatar
sveseli committed
#!/usr/bin/env python

sveseli's avatar
sveseli committed
import time
sveseli's avatar
sveseli committed
from dmObject import DmObject
from dm.common.utility.dictUtility import DictUtility
sveseli's avatar
sveseli committed

class DaqInfo(DmObject):

    DEFAULT_KEY_LIST = [ 'id', 'experimentName', 'dataDirectory', 'status', 'nProcessedFiles', 'nProcessingErrors', 'nFiles', 'startTime', 'endTime', 'runTime', 'startTimestamp', 'endTimestamp' ]
    
sveseli's avatar
sveseli committed

    def __init__(self, dict={}):
sveseli's avatar
sveseli committed
        DmObject.__init__(self, dict)
        self.originalKeys = dict.keys()
        self['fileDict'] = self.get('fileDict', {})
sveseli's avatar
sveseli committed

sveseli's avatar
sveseli committed
        now = time.time()
        daqStatus = self.get('status', 'running')
        if daqStatus == 'done':          
            return 
        fileDict = self.get('fileDict')
        nFiles = len(fileDict)
        nProcessedFiles = 0
        nProcessingErrors = 0
        processingErrors = {}
        for (filePath,uploadFileInfo) in fileDict.items():
            if uploadFileInfo.get('processed'):
                 nProcessedFiles += 1                
            elif uploadFileInfo.get('processingError'):
                nProcessingErrors += 1
                processingErrors[filePath] = uploadFileInfo.get('processingError')
        if len(processingErrors):
            self['processingErrors'] = processingErrors

        # need to handle 'failed' uploads
        nCompletedFiles = nProcessedFiles+nProcessingErrors
        self['nProcessedFiles'] = '%s' % (nProcessedFiles)
        self['nProcessingErrors'] = '%s' % (nProcessingErrors)
        self['nFiles'] = '%s' % (nFiles)

        percentageComplete = 100.0
        percentageProcessed = 100.0
        percentageProcessingErrors = 0.0
        if nFiles > 0:
             percentageComplete = float(nCompletedFiles)/float(nFiles)*100.0
             percentageProcessed = float(nProcessedFiles)/float(nFiles)*100.0
             percentageProcessingErrors = float(nProcessingErrors)/float(nFiles)*100.0
        self['percentageComplete'] = '%.2f' % percentageComplete
        self['percentageProcessed'] = '%.2f' % percentageProcessed
        self['percentageProcessingErrors'] = '%.2f' % percentageProcessingErrors

sveseli's avatar
sveseli committed
	runTime = now - self.get('startTime')
        self['runTime'] = runTime

        if self.get('endTime'):
            daqStatus = 'done'
            self['runTime'] = self.get('endTime') - self.get('startTime')
        self['status'] = daqStatus

    def toDictWithOriginalKeys(self):
        dict = copy.deepcopy(self.data)
        for key in dict.keys():
            if key not in self.originalKeys:
                del dict[key]
        return dict

    def scrub(self, includeFileDetails=False):
        # Remove redundant information
        daqInfo2 = DictUtility.deepCopy(self.data, excludeKeys=['fileDict'])
        if not includeFileDetails:
            return DaqInfo(daqInfo2)
        fileDict = self.get('fileDict', {})
        fileDict2 = {}
        for (filePath,fileInfo) in fileDict.items():
            fileInfo2 = {}
            for key in ['processed', 'lastUpdateTime', 'processingError']:
                if fileInfo.has_key(key):
                    fileInfo2[key] = fileInfo[key]
            fileDict2[filePath] = fileInfo2
        daqInfo2['fileDict'] = fileDict2
        return DaqInfo(daqInfo2)