From d4406373a9b01be606a37224373973abda754849 Mon Sep 17 00:00:00 2001 From: wang_x1 Date: Thu, 7 Nov 2024 09:28:08 +0100 Subject: [PATCH] Feat/areadetector updates --- .../devices/areadetector/__init__.py | 0 ophyd_devices/devices/areadetector/cam.py | 130 ++++++++++ ophyd_devices/devices/areadetector/plugins.py | 222 ++++++++++++++++++ ophyd_devices/devices/sls_detector.py | 45 ---- 4 files changed, 352 insertions(+), 45 deletions(-) create mode 100644 ophyd_devices/devices/areadetector/__init__.py create mode 100644 ophyd_devices/devices/areadetector/cam.py create mode 100644 ophyd_devices/devices/areadetector/plugins.py delete mode 100644 ophyd_devices/devices/sls_detector.py diff --git a/ophyd_devices/devices/areadetector/__init__.py b/ophyd_devices/devices/areadetector/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ophyd_devices/devices/areadetector/cam.py b/ophyd_devices/devices/areadetector/cam.py new file mode 100644 index 0000000..74fa74b --- /dev/null +++ b/ophyd_devices/devices/areadetector/cam.py @@ -0,0 +1,130 @@ +"""AreaDetector Devices +""" + +# isort: skip_file +from ophyd import EpicsSignal, EpicsSignalRO, EpicsSignalWithRBV +from ophyd.areadetector import ADComponent as ADCpt +from ophyd.areadetector.cam import ( + CamBase as _CamBase, + FileBase as _FileBase, + Andor3DetectorCam as _Andor3DetectorCam, + PilatusDetectorCam as _PilatusDetectorCam, + EigerDetectorCam as _EigerDetectorCam, + ProsilicaDetectorCam as _ProsilicaDetectorCam, + SimDetectorCam as _SimDetectorCam, + URLDetectorCam as _URLDetectorCam, +) + +__all__ = [ + "CamBase", + "FileBase", + "Andor3DetectorCam", + "EigerDetectorCam", + "PilatusDetectorCam", + "ProsilicaDetectorCam", + "URLDetectorCam", + "AravisDetectorCam", + "PylonDetectorCam", + "VimbaDetectorCam", +] + + +class CamBase(_CamBase): + pool_max_buffers = None + + +class FileBase(_FileBase): + file_number_sync = None + file_number_write = None + + +class Andor3DetectorCam(CamBase, _Andor3DetectorCam): + gate_mode = ADCpt(EpicsSignalWithRBV, "GateMode") + insertion_delay = ADCpt(EpicsSignalWithRBV, "InsertionDelay") + mcp_gain = ADCpt(EpicsSignalWithRBV, "MCPGain") + mcp_intelligate = ADCpt(EpicsSignalWithRBV, "MCPIntelligate") + + +class EigerDetectorCam(CamBase, _EigerDetectorCam): ... + + +class PilatusDetectorCam(CamBase, _PilatusDetectorCam): ... + + +class ProsilicaDetectorCam(CamBase, _ProsilicaDetectorCam): ... + + +class SimDetectorCam(CamBase, _SimDetectorCam): ... + + +class URLDetectorCam(CamBase, _URLDetectorCam): ... + + +class GenICam(CamBase): + frame_rate = ADCpt(EpicsSignalWithRBV, "FrameRate") + frame_rate_enable = ADCpt(EpicsSignalWithRBV, "FrameRateEnable") + trigger_source = ADCpt(EpicsSignalWithRBV, "TriggerSource") + trigger_overlay = ADCpt(EpicsSignalWithRBV, "TriggerOverlay") + trigger_software = ADCpt(EpicsSignal, "TriggerSoftware") + exposure_mode = ADCpt(EpicsSignalWithRBV, "ExposureMode") + exposure_auto = ADCpt(EpicsSignalWithRBV, "ExposureAuto") + gain_auto = ADCpt(EpicsSignalWithRBV, "GainAuto") + pixel_format = ADCpt(EpicsSignalWithRBV, "PixelFormat") + + +class AravisDetectorCam(GenICam): + ar_convert_pixel_format = ADCpt(EpicsSignalWithRBV, "ARConvertPixelFormat") + ar_shift_dir = ADCpt(EpicsSignalWithRBV, "ARShiftDir") + ar_shift_bits = ADCpt(EpicsSignalWithRBV, "ARShiftBits") + + +class VimbaDetectorCam(GenICam): + time_stamp_mode = ADCpt(EpicsSignalWithRBV, "TimeStampMode") + unique_id_mode = ADCpt(EpicsSignalWithRBV, "UniqueIdMode") + convert_pixel_format = ADCpt(EpicsSignalWithRBV, "ConvertPixelFormat") + + +class PylonDetectorCam(GenICam): + time_stamp_mode = ADCpt(EpicsSignalWithRBV, "TimeStampMode") + unique_id_mode = ADCpt(EpicsSignalWithRBV, "UniqueIdMode") + convert_pixel_format = ADCpt(EpicsSignalWithRBV, "ConvertPixelFormat") + convert_bit_align = ADCpt(EpicsSignalWithRBV, "ConvertBitAlign") + convert_shift_bits = ADCpt(EpicsSignalWithRBV, "ConvertShiftBits") + + +class SLSDetectorCam(CamBase, FileBase): + detector_type = ADCpt(EpicsSignalRO, "DetectorType_RBV") + setting = ADCpt(EpicsSignalWithRBV, "Setting") + delay_time = ADCpt(EpicsSignalWithRBV, "DelayTime") + threshold_energy = ADCpt(EpicsSignalWithRBV, "ThresholdEnergy") + enable_trimbits = ADCpt(EpicsSignalWithRBV, "Trimbits") + bit_depth = ADCpt(EpicsSignalWithRBV, "BitDepth") + num_gates = ADCpt(EpicsSignalWithRBV, "NumGates") + num_cycles = num_images = ADCpt(EpicsSignalWithRBV, "NumCycles") + num_frames = ADCpt(EpicsSignalWithRBV, "NumFrames") + trigger_mode = timing_mode = ADCpt(EpicsSignalWithRBV, "TimingMode") + trigger_software = ADCpt(EpicsSignal, "TriggerSoftware") + high_voltage = ADCpt(EpicsSignalWithRBV, "HighVoltage") + # Receiver and data callback + receiver_mode = ADCpt(EpicsSignalWithRBV, "ReceiverMode") + receiver_stream = ADCpt(EpicsSignalWithRBV, "ReceiverStream") + enable_data = ADCpt(EpicsSignalWithRBV, "UseDataCallback") + missed_packets = ADCpt(EpicsSignalRO, "ReceiverMissedPackets_RBV") + # Direct settings access + setup_file = ADCpt(EpicsSignal, "SetupFile") + load_setup = ADCpt(EpicsSignal, "LoadSetup") + command = ADCpt(EpicsSignal, "Command") + # Mythen 3 + counter_mask = ADCpt(EpicsSignalWithRBV, "CounterMask") + counter1_threshold = ADCpt(EpicsSignalWithRBV, "Counter1Threshold") + counter2_threshold = ADCpt(EpicsSignalWithRBV, "Counter2Threshold") + counter3_threshold = ADCpt(EpicsSignalWithRBV, "Counter3Threshold") + gate1_delay = ADCpt(EpicsSignalWithRBV, "Gate1Delay") + gate1_width = ADCpt(EpicsSignalWithRBV, "Gate1Width") + gate2_delay = ADCpt(EpicsSignalWithRBV, "Gate2Delay") + gate2_width = ADCpt(EpicsSignalWithRBV, "Gate2Width") + gate3_delay = ADCpt(EpicsSignalWithRBV, "Gate3Delay") + gate3_width = ADCpt(EpicsSignalWithRBV, "Gate3Width") + # Moench + json_frame_mode = ADCpt(EpicsSignalWithRBV, "JsonFrameMode") + json_detector_mode = ADCpt(EpicsSignalWithRBV, "JsonDetectorMode") diff --git a/ophyd_devices/devices/areadetector/plugins.py b/ophyd_devices/devices/areadetector/plugins.py new file mode 100644 index 0000000..d738d67 --- /dev/null +++ b/ophyd_devices/devices/areadetector/plugins.py @@ -0,0 +1,222 @@ +# vi: ts=4 sw=4 +"""AreaDetector up-to-date plugins. + +.. _areaDetector: http://cars.uchicago.edu/software/epics/areaDetector.html +""" +# This module contains: +# - Classes like `StatsPlugin_V{X}{Y}` that are design to be counterparts to +# AreaDetector verion X.Y. +# +# isort: skip_file + +from ophyd import Component as Cpt, Device, EpicsSignal, EpicsSignalRO, EpicsSignalWithRBV + +# fmt: off +from ophyd.areadetector.plugins import ( + PluginBase, PluginBase_V34, + FilePlugin, FilePlugin_V34, + AttributePlugin, AttributePlugin_V34, + AttrPlotPlugin, AttrPlotPlugin_V34, + CircularBuffPlugin, CircularBuffPlugin_V34, + CodecPlugin, CodecPlugin_V34, + ColorConvPlugin, ColorConvPlugin_V34, + FFTPlugin, FFTPlugin_V34, + HDF5Plugin, HDF5Plugin_V34, + ImagePlugin, ImagePlugin_V34, + JPEGPlugin, JPEGPlugin_V34, + MagickPlugin, MagickPlugin_V34, + NetCDFPlugin, NetCDFPlugin_V34, + NexusPlugin, NexusPlugin_V34, + OverlayPlugin, OverlayPlugin_V34, + PosPlugin, PosPluginPlugin_V34, + PvaPlugin, PvaPlugin_V34, + ProcessPlugin, ProcessPlugin_V34, + ROIPlugin, ROIPlugin_V34, + ROIStatPlugin, ROIStatPlugin_V34, + ROIStatNPlugin, ROIStatNPlugin_V25, + ScatterPlugin, ScatterPlugin_V34, + StatsPlugin, StatsPlugin_V34, + TIFFPlugin, TIFFPlugin_V34, + TimeSeriesPlugin, TimeSeriesPlugin_V34, + TransformPlugin, TransformPlugin_V34, +) + +class PluginBase_V35(PluginBase_V34, version=(3, 5), version_of=PluginBase): + codec = Cpt(EpicsSignalRO, "Codec_RBV", string=True) + compressed_size = Cpt(EpicsSignalRO, "CompressedSize_RBV") + + def read_configuration(self): + ret = Device.read_configuration(self) + source_plugin = self.source_plugin + if source_plugin: + ret.update(source_plugin.read_configuration()) + + return ret + + def describe_configuration(self): + ret = Device.describe_configuration(self) + + source_plugin = self.source_plugin + if source_plugin: + ret.update(source_plugin.describe_configuration()) + + return ret + + +class FilePlugin_V35( + PluginBase_V35, FilePlugin_V34, version=(3, 5), version_of=FilePlugin +): + ... + + +class ColorConvPlugin_V35( + PluginBase_V35, ColorConvPlugin_V34, version=(3, 5), version_of=ColorConvPlugin +): + ... + + +class HDF5Plugin_V35( + FilePlugin_V35, HDF5Plugin_V34, version=(3, 5), version_of=HDF5Plugin +): + flush_now = Cpt( + EpicsSignal, + "FlushNow", + string=True, + doc="0=Done 1=Flush") + + +class ImagePlugin_V35( + PluginBase_V35, ImagePlugin_V34, version=(3, 5), version_of=ImagePlugin +): + ... + + +class JPEGPlugin_V35( + FilePlugin_V35, JPEGPlugin_V34, version=(3, 5), version_of=JPEGPlugin +): + ... + + +class MagickPlugin_V35( + FilePlugin_V35, MagickPlugin_V34, version=(3, 5), version_of=MagickPlugin +): + ... + + +class NetCDFPlugin_V35( + FilePlugin_V35, NetCDFPlugin_V34, version=(3, 5), version_of=NetCDFPlugin +): + ... + + +class NexusPlugin_V35( + FilePlugin_V35, NexusPlugin_V34, version=(3, 5), version_of=NexusPlugin +): + ... + + +class OverlayPlugin_V35( + PluginBase_V35, OverlayPlugin_V34, version=(3, 5), version_of=OverlayPlugin +): + ... + + +class ProcessPlugin_V35( + PluginBase_V35, ProcessPlugin_V34, version=(3, 5), version_of=ProcessPlugin +): + ... + + +class ROIPlugin_V35( + PluginBase_V35, ROIPlugin_V34, version=(3, 5), version_of=ROIPlugin +): + ... + + +class ROIStatPlugin_V35( + PluginBase_V35, ROIStatPlugin_V34, version=(3, 5), version_of=ROIStatPlugin +): + ... + +class ROIStatNPlugin_V35(ROIStatNPlugin_V25, version=(3, 5), version_of=ROIStatNPlugin): + ... + +class StatsPlugin_V35( + PluginBase_V35, StatsPlugin_V34, version=(3, 5), version_of=StatsPlugin +): + ... + + +class TIFFPlugin_V35( + FilePlugin_V35, TIFFPlugin_V34, version=(3, 5), version_of=TIFFPlugin +): + ... + + +class TransformPlugin_V35( + PluginBase_V35, TransformPlugin_V34, version=(3, 5), version_of=TransformPlugin +): + ... + + +class PvaPlugin_V35( + PluginBase_V35, PvaPlugin_V34, version=(3, 5), version_of=PvaPlugin +): + ... + + +class FFTPlugin_V35( + PluginBase_V35, FFTPlugin_V34, version=(3, 5), version_of=FFTPlugin +): + ... + + +class ScatterPlugin_V35( + PluginBase_V35, ScatterPlugin_V34, version=(3, 5), version_of=ScatterPlugin +): + ... + + +class PosPluginPlugin_V35( + PluginBase_V35, PosPluginPlugin_V34, version=(3, 5), version_of=PosPlugin +): + ... + + +class CircularBuffPlugin_V35( + PluginBase_V35, + CircularBuffPlugin_V34, + version=(3, 5), + version_of=CircularBuffPlugin +): + ... + + +class AttrPlotPlugin_V35( + PluginBase_V35, AttrPlotPlugin_V34, version=(3, 5), version_of=AttrPlotPlugin +): + ... + + +class TimeSeriesPlugin_V35( + PluginBase_V35, TimeSeriesPlugin_V34, version=(3, 5), version_of=TimeSeriesPlugin +): + ... + + +class CodecPlugin_V35( + PluginBase_V35, CodecPlugin_V34, version=(3, 5), version_of=CodecPlugin +): + blosc_shuffle = Cpt( + EpicsSignalWithRBV, "BloscShuffle", string=True, doc="0=None 1=Byte 2=Bit" + ) + + +class AttributePlugin_V35( + PluginBase_V35, AttributePlugin_V34, version=(3, 5), version_of=AttributePlugin +): + ts_acquiring = None + ts_control = None + ts_current_point = None + ts_num_points = None + ts_read = None diff --git a/ophyd_devices/devices/sls_detector.py b/ophyd_devices/devices/sls_detector.py deleted file mode 100644 index 0dca8bc..0000000 --- a/ophyd_devices/devices/sls_detector.py +++ /dev/null @@ -1,45 +0,0 @@ -from ophyd import ADComponent as ADCpt -from ophyd import CamBase, DetectorBase, EpicsSignal, EpicsSignalRO, EpicsSignalWithRBV -from ophyd.areadetector.plugins import FileBase - - -class SLSDetectorCam(CamBase, FileBase): - detector_type = ADCpt(EpicsSignalRO, "DetectorType_RBV") - setting = ADCpt(EpicsSignalWithRBV, "Setting") - delay_time = ADCpt(EpicsSignalWithRBV, "DelayTime") - threshold_energy = ADCpt(EpicsSignalWithRBV, "ThresholdEnergy") - enable_trimbits = ADCpt(EpicsSignalWithRBV, "Trimbits") - bit_depth = ADCpt(EpicsSignalWithRBV, "BitDepth") - num_gates = ADCpt(EpicsSignalWithRBV, "NumGates") - num_cycles = ADCpt(EpicsSignalWithRBV, "NumCycles") - num_frames = ADCpt(EpicsSignalWithRBV, "NumFrames") - timing_mode = ADCpt(EpicsSignalWithRBV, "TimingMode") - trigger_software = ADCpt(EpicsSignal, "TriggerSoftware") - high_voltage = ADCpt(EpicsSignalWithRBV, "HighVoltage") - # Receiver and data callback - receiver_mode = ADCpt(EpicsSignalWithRBV, "ReceiverMode") - receiver_stream = ADCpt(EpicsSignalWithRBV, "ReceiverStream") - enable_data = ADCpt(EpicsSignalWithRBV, "UseDataCallback") - missed_packets = ADCpt(EpicsSignalRO, "ReceiverMissedPackets_RBV") - # Direct settings access - setup_file = ADCpt(EpicsSignal, "SetupFile") - load_setup = ADCpt(EpicsSignal, "LoadSetup") - command = ADCpt(EpicsSignal, "Command") - # Mythen 3 - counter_mask = ADCpt(EpicsSignalWithRBV, "CounterMask") - counter1_threshold = ADCpt(EpicsSignalWithRBV, "Counter1Threshold") - counter2_threshold = ADCpt(EpicsSignalWithRBV, "Counter2Threshold") - counter3_threshold = ADCpt(EpicsSignalWithRBV, "Counter3Threshold") - gate1_delay = ADCpt(EpicsSignalWithRBV, "Gate1Delay") - gate1_width = ADCpt(EpicsSignalWithRBV, "Gate1Width") - gate2_delay = ADCpt(EpicsSignalWithRBV, "Gate2Delay") - gate2_width = ADCpt(EpicsSignalWithRBV, "Gate2Width") - gate3_delay = ADCpt(EpicsSignalWithRBV, "Gate3Delay") - gate3_width = ADCpt(EpicsSignalWithRBV, "Gate3Width") - # Moench - json_frame_mode = ADCpt(EpicsSignalWithRBV, "JsonFrameMode") - json_detector_mode = ADCpt(EpicsSignalWithRBV, "JsonDetectorMode") - - -class SLSDetector(DetectorBase): - cam = ADCpt(SLSDetectorCam, "cam1:")