#!/usr/bin/env python # # Implementation for experiment session controller. # import time from dm.common.objects.experiment import Experiment from dm.common.objects.dmObjectManager import DmObjectManager from dm.common.exceptions.invalidRequest import InvalidRequest from dm.common.utility.osUtility import OsUtility from dm.common.objects.observedFile import ObservedFile from dm.ds_web_service.api.dsRestApiFactory import DsRestApiFactory from experimentTracker import ExperimentTracker from fileSystemObserver import FileSystemObserver from fileProcessingManager import FileProcessingManager class ExperimentSessionControllerImpl(DmObjectManager): """ Experiment session controller implementation class. """ def __init__(self): DmObjectManager.__init__(self) self.dsExperimentApi = DsRestApiFactory.getExperimentRestApi() def startDaq(self, name, dataDirectory): experiment = self.dsExperimentApi.getExperimentByName(name) storageDirectory = experiment.get('storageDirectory') if storageDirectory is None: raise InvalidRequest('Experiment %s has not been started.' % name) startTime = time.time() experiment['daqDataDirectory'] = dataDirectory experiment['daqStartTime'] = startTime FileSystemObserver.getInstance().startObservingPath(dataDirectory, experiment) ExperimentTracker.getInstance().put(name, experiment) return experiment def stopDaq(self, name): experiment = ExperimentTracker.getInstance().get(name) if experiment is None or experiment.get('daqEndTime') is not None: raise InvalidRequest('Experiment %s is not active.' % name) dataDirectory = experiment.get('dataDirectory') experiment['daqEndTime'] = time.time() FileSystemObserver.getInstance().stopObservingPath(dataDirectory, experiment) return experiment def upload(self, name, dataDirectory): experiment = self.dsExperimentApi.getExperimentByName(name) storageDirectory = experiment.get('storageDirectory') if storageDirectory is None: raise InvalidRequest('Experiment %s has not been started.' % name) filePaths = OsUtility.findFiles(dataDirectory) fileProcessingManager = FileProcessingManager.getInstance() for filePath in filePaths: observedFile = ObservedFile(filePath=filePath, daqPath=dataDirectory, experiment=experiment) fileProcessingManager.processObservedFile(observedFile) ExperimentTracker.getInstance().put(name, experiment) return experiment