#!/usr/bin/env python import copy import time from dmObject import DmObject from dm.common.utility.dictUtility import DictUtility class DaqInfo(DmObject): DEFAULT_KEY_LIST = [ 'id', 'experimentName', 'dataDirectory', 'status', 'nProcessedFiles', 'nProcessingErrors', 'nFiles', 'startTime', 'endTime', 'runTime', 'startTimestamp', 'endTimestamp' ] def __init__(self, dict={}): DmObject.__init__(self, dict) self.originalKeys = dict.keys() self['fileDict'] = self.get('fileDict', {}) def updateStatus(self): 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 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)