diff --git a/src/ophyd_async/epics/areadetector/controllers/pilatus_controller.py b/src/ophyd_async/epics/areadetector/controllers/pilatus_controller.py index 0835780d65..9fda8f8133 100644 --- a/src/ophyd_async/epics/areadetector/controllers/pilatus_controller.py +++ b/src/ophyd_async/epics/areadetector/controllers/pilatus_controller.py @@ -24,14 +24,13 @@ class PilatusController(DetectorControl): def __init__( self, driver: PilatusDriver, + readout_time: float, ) -> None: self._drv = driver + self._readout_time = readout_time def get_deadtime(self, exposure: float) -> float: - # Cite: https://media.dectris.com/User_Manual-PILATUS2-V1_4.pdf - """The required minimum time difference between ExpPeriod and ExpTime - (readout time) is 2.28 ms""" - return 2.28e-3 + return self._readout_time async def arm( self, diff --git a/src/ophyd_async/epics/areadetector/pilatus.py b/src/ophyd_async/epics/areadetector/pilatus.py index 1a76a20671..ecaf31dacb 100644 --- a/src/ophyd_async/epics/areadetector/pilatus.py +++ b/src/ophyd_async/epics/areadetector/pilatus.py @@ -1,3 +1,5 @@ +from enum import Enum + from bluesky.protocols import Hints from ophyd_async.core import DirectoryProvider @@ -11,6 +13,20 @@ from ophyd_async.epics.areadetector.writers.nd_file_hdf import NDFileHDF +#: Cite: https://media.dectris.com/User_Manual-PILATUS2-V1_4.pdf +#: The required minimum time difference between ExpPeriod and ExpTime +#: (readout time) is 2.28 ms +#: We provide an option to override for newer Pilatus models +class PilatusReadoutTime(float, Enum): + """Pilatus readout time per model in ms""" + + # Cite: https://media.dectris.com/User_Manual-PILATUS2-V1_4.pdf + pilatus2 = 2.28e-3 + + # Cite: https://media.dectris.com/user-manual-pilatus3-2020.pdf + pilatus3 = 0.95e-3 + + class PilatusDetector(StandardDetector): """A Pilatus StandardDetector writing HDF files""" @@ -21,15 +37,16 @@ def __init__( self, prefix: str, directory_provider: DirectoryProvider, - drv_suffix="cam1:", - hdf_suffix="HDF1:", - name="", + readout_time: PilatusReadoutTime = PilatusReadoutTime.pilatus3, + drv_suffix: str = "cam1:", + hdf_suffix: str = "HDF1:", + name: str = "", ): self.drv = PilatusDriver(prefix + drv_suffix) self.hdf = NDFileHDF(prefix + hdf_suffix) super().__init__( - PilatusController(self.drv), + PilatusController(self.drv, readout_time=readout_time.value), HDFWriter( self.hdf, directory_provider, diff --git a/tests/epics/areadetector/test_controllers.py b/tests/epics/areadetector/test_controllers.py index fbef4ceaf4..60b82bea5c 100644 --- a/tests/epics/areadetector/test_controllers.py +++ b/tests/epics/areadetector/test_controllers.py @@ -23,7 +23,7 @@ async def pilatus_driver(RE) -> PilatusDriver: @pytest.fixture async def pilatus(RE, pilatus_driver: PilatusDriver) -> PilatusController: async with DeviceCollector(mock=True): - controller = PilatusController(pilatus_driver) + controller = PilatusController(pilatus_driver, readout_time=2.28) return controller diff --git a/tests/epics/areadetector/test_pilatus.py b/tests/epics/areadetector/test_pilatus.py index 7260c58202..342a72a3ef 100644 --- a/tests/epics/areadetector/test_pilatus.py +++ b/tests/epics/areadetector/test_pilatus.py @@ -12,7 +12,7 @@ set_mock_value, ) from ophyd_async.epics.areadetector.drivers.pilatus_driver import PilatusTriggerMode -from ophyd_async.epics.areadetector.pilatus import PilatusDetector +from ophyd_async.epics.areadetector.pilatus import PilatusDetector, PilatusReadoutTime @pytest.fixture @@ -26,13 +26,25 @@ async def pilatus( return adpilatus +async def test_deadtime_overridable(static_directory_provider: DirectoryProvider): + async with DeviceCollector(mock=True): + pilatus = PilatusDetector( + "PILATUS:", + static_directory_provider, + readout_time=PilatusReadoutTime.pilatus2, + ) + pilatus_controller = pilatus.controller + # deadtime invariant with exposure time + assert pilatus_controller.get_deadtime(0) == 2.28e-3 + + async def test_deadtime_invariant( pilatus: PilatusDetector, ): pilatus_controller = pilatus.controller # deadtime invariant with exposure time - assert pilatus_controller.get_deadtime(0) == 2.28e-3 - assert pilatus_controller.get_deadtime(500) == 2.28e-3 + assert pilatus_controller.get_deadtime(0) == 0.95e-3 + assert pilatus_controller.get_deadtime(500) == 0.95e-3 @pytest.mark.parametrize(