Source code for contrast.detectors.Andor3

if __name__ == '__main__':
    from contrast.detectors.Detector import (
        Detector, SoftwareLiveDetector, TriggeredDetector, BurstDetector)
    from contrast.environment import env
    from contrast.recorders.Hdf5Recorder import Link
else:
    from .Detector import (
        Detector, SoftwareLiveDetector, TriggeredDetector, BurstDetector)
    from ..environment import env
    from ..recorders.Hdf5Recorder import Link
import os
import PyTango


[docs]class Andor3(Detector, SoftwareLiveDetector, BurstDetector): """ Provides an interface to the Andor3 Zyla streaming manager, https://github.com/maxiv-science/andor-streamer Note: hw trigger not yet implemented. """ def __init__(self, device='zyla/test/1', name=None): SoftwareLiveDetector.__init__(self) BurstDetector.__init__(self) # last so that initialize() can overwrite parent defaults: Detector.__init__(self, name=name) self.proxy = PyTango.DeviceProxy(device) def initialize(self): pass def prepare(self, acqtime, dataid, n_starts): if self.busy(): raise Exception('%s is busy!' % self.name) # saving and paths if dataid is None: # no saving self.saving_file = '' self.proxy.Filename = '' else: # saving path = env.paths.directory fn = 'scan_%06d_%s.hdf5' % (dataid, self.name) self.saving_file = os.path.join(path, fn) if os.path.exists(self.saving_file): print('%s: this hdf5 file exists, I am raising an error now' % self.name) raise Exception('%s hdf5 file already exists' % self.name) self.proxy.Filename = self.saving_file # arming and numbers of frames self.proxy.ExposureTime = acqtime if self.burst_n == 1: self.proxy.TriggerMode = 'Software' self.proxy.nTriggers = n_starts self.proxy.Arm() else: self.proxy.TriggerMode = 'Internal' self.proxy.nTriggers = self.burst_n self.frames_expected = 0 def arm(self): pass def start(self): if self.burst_n == 1: self.proxy.SoftwareTrigger() self.frames_expected += 1 else: self.proxy.Arm() self.frames_expected = self.burst_n def stop(self): self.proxy.Stop() def busy(self): st = self.proxy.State() if st in (PyTango.DevState.STANDBY, PyTango.DevState.ON): return False elif st == PyTango.DevState.RUNNING: if self.proxy.nFramesAcquired == self.frames_expected: return False return True def read(self): if self.saving_file == '': return None else: return Link( self.saving_file, 'entry/instrument/andor', universal=True)