Source code for contrast.detectors.Dummies

from .Detector import Detector, SoftwareLiveDetector, TriggerSource

import time
import numpy as np
import h5py
from ..recorders.Hdf5Recorder import Link


[docs]class DummyDetector(Detector, SoftwareLiveDetector): """ Dummy detector which returns a single number. """ def __init__(self, name=None): Detector.__init__(self, name=name) SoftwareLiveDetector.__init__(self) def initialize(self): pass def start(self): super(DummyDetector, self).start() try: self.val = np.random.rand() * self.acqtime self._started = time.time() except AttributeError: raise Exception('Detector not prepared!') def stop(self): try: self._started = time.time() - self.acqtime except AttributeError: return def busy(self): try: return time.time() < self._started + self.acqtime except AttributeError: return False def read(self): try: return self.val except AttributeError: raise Exception('Detector not started!')
[docs]class Dummy1dDetector(DummyDetector): """ Dummy detector which returns a 1d vector. """ def start(self): super(Dummy1dDetector, self).start() try: # reshape to (1, N) to protect the physical detector dimension # from being stacked in the hdf5 file later. self.val = (np.random.rand(100) * self.acqtime).reshape((1, -1)) self._started = time.time() except AttributeError: raise Exception('Detector not prepared!')
[docs]class DummyWritingDetector(DummyDetector): """ Hdf5 writing detector which puts sequential frames in separate files. """ def prepare(self, acqtime, dataid, n_starts): super(DummyWritingDetector, self).prepare(acqtime, dataid, n_starts) if dataid is None: self.filename_base = None else: self.filename_base = ( '/tmp/Dummy_scan_%03d_image_%%03d.hdf5' % dataid) self.next_image = -1 def start(self): super(DummyWritingDetector, self).start() if self.filename_base is None: self.latest_link = None else: self.next_image += 1 filename = self.filename_base % self.next_image datapath = 'entry/measurement/data' with h5py.File(filename, 'w') as fp: fp[datapath] = np.arange(195 * 487).reshape((195, 487)) self.latest_link = h5py.ExternalLink(filename, datapath) def read(self): return self.latest_link
[docs]class DummyWritingDetector2(DummyDetector): """ Hdf5 writing detector which puts sequential frames in a big array. """ def prepare(self, acqtime, dataid, n_starts): super().prepare(acqtime, dataid, n_starts) if dataid is None: self.link = None else: self.filename = '/tmp/Dummy2_scan_%03d.hdf5' % dataid self.datapath = 'entry/measurement/data' self.link = Link(self.filename, self.datapath, universal=True) with h5py.File(self.filename, 'w') as fp: pass def start(self): super().start() if self.link is None: return else: with h5py.File(self.filename, 'a') as fp: M, N = 195, 487 if self.datapath in fp.keys(): d = fp[self.datapath] d.resize((d.shape[0] + 1, M, N)) else: d = fp.create_dataset(self.datapath, shape=(1, M, N), maxshape=(None, M, N), dtype=np.float) d[-1] = (np.arange(M * N).reshape((M, N)) + np.random.rand(M, N) * M * N / 10) def read(self): return self.link
[docs]class DummyDictDetector(DummyDetector): """ Illustrates how multi-channel detectors can return dict values. """ def start(self): super(DummyDictDetector, self).start() try: self.val = {'ch1': np.random.rand() * self.acqtime, 'ch2': np.random.rand() * self.acqtime * 2, 'ch3': np.random.rand() * self.acqtime * 3, } self._started = time.time() except AttributeError: raise Exception('Detector not prepared!')
class DummyTriggerSource(TriggerSource): def initialize(self): pass