Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
448b211
Update for AreaDetector writer factory changes
rtuck99 Jun 8, 2026
db11b9c
Bump uv lockfile
rtuck99 Jun 8, 2026
fb5ff46
Fix some more AD factories
rtuck99 Jun 8, 2026
74240cb
Fix majority of tests by updating motors to use check_value and deriv…
oliwenmandiamond Jun 8, 2026
2bacfa3
Merge branch 'fix_for_latest_ophyd_async' of ssh://github.com/Diamond…
oliwenmandiamond Jun 8, 2026
9c5c936
Fix unstoppable motor test, use signal name rather than signal object
oliwenmandiamond Jun 8, 2026
d24f9fd
Fix p38 area detectors
rtuck99 Jun 8, 2026
f8dc870
Fix some more derived signals
rtuck99 Jun 8, 2026
a8c08cb
Standardise beamstop test to reuse as pytest fixture
oliwenmandiamond Jun 8, 2026
2f49555
Merge branch 'fix_for_latest_ophyd_async' of ssh://github.com/Diamond…
oliwenmandiamond Jun 8, 2026
06f6065
Fix toolpoint motion
oliwenmandiamond Jun 8, 2026
e1666bb
Remove changes to toolpoint
oliwenmandiamond Jun 8, 2026
3092079
Update to ophyd-async branch to see if fixes issue
oliwenmandiamond Jun 8, 2026
9ba78cc
Fixes for TriggerableCommand
rtuck99 Jun 8, 2026
35be754
Make type-checking happy
rtuck99 Jun 9, 2026
a57d097
Merge branch 'main' into fix_for_latest_ophyd_async
oliwenmandiamond Jun 9, 2026
88dd7ad
Update comments on unstoppable motor
oliwenmandiamond Jun 9, 2026
120f03e
Change triggerable PVs for i11 sample robot, i03/i04 attenuator
rtuck99 Jun 9, 2026
d351462
Revert changes for derived signals using motors
rtuck99 Jun 9, 2026
8ea4170
pin to alternative fix branch
rtuck99 Jun 9, 2026
cc0074c
update lock file
rtuck99 Jun 9, 2026
3c93e3a
Add typing support for toolpointmotion
oliwenmandiamond Jun 10, 2026
0dd01e0
Convert electron analyser detector implementations to AreaDetectors
oliwenmandiamond Jun 10, 2026
ab76ee2
Update i09-1
oliwenmandiamond Jun 10, 2026
cac13d8
Update beamline args
oliwenmandiamond Jun 10, 2026
7c89b86
Update doc str
oliwenmandiamond Jun 10, 2026
0303191
Update tests
oliwenmandiamond Jun 10, 2026
e9c67b9
Fix tests
oliwenmandiamond Jun 10, 2026
1ccabcd
Update triggerable logic type for detector
oliwenmandiamond Jun 11, 2026
6052320
Update triggerable logic attribute names and typing
oliwenmandiamond Jun 11, 2026
2089875
Remove generic typing from electron analyser trigger logic as no use …
oliwenmandiamond Jun 11, 2026
44c87eb
Correct dual_energy_source p60
oliwenmandiamond Jun 11, 2026
11e2b5c
Remove unneeded type ignore
oliwenmandiamond Jun 11, 2026
82b6b2b
Add detector_logic to base import
oliwenmandiamond Jun 11, 2026
3ee50cd
Remove unused shutter
oliwenmandiamond Jun 11, 2026
1966dfa
Move to using dataclasses for detector logic
oliwenmandiamond Jun 11, 2026
bb9b05a
Remove generic typing from ShutterCoordinatorADAcquireLogic as no use…
oliwenmandiamond Jun 11, 2026
278f652
Merge branch 'main' into areadetector_for_electron_analysers
oliwenmandiamond Jun 12, 2026
9b653a1
Undo trigger command changes from change in rebase
oliwenmandiamond Jun 12, 2026
7ce3ba3
Undo more trigger related parts
oliwenmandiamond Jun 12, 2026
7f29a9b
Undo pv change
oliwenmandiamond Jun 12, 2026
b206232
Undo test robot change
oliwenmandiamond Jun 12, 2026
77506b3
Undo adding run engine to test
oliwenmandiamond Jun 12, 2026
3ecc49b
Further remove reverts from rebase
oliwenmandiamond Jun 12, 2026
ea9bc29
Undo PV change
oliwenmandiamond Jun 12, 2026
7ad5c10
Fix remaing test
oliwenmandiamond Jun 12, 2026
1fba59e
Merge branch 'main' into areadetector_for_electron_analysers
oliwenmandiamond Jun 15, 2026
957742f
Merge branch 'main' into areadetector_for_electron_analysers
oliwenmandiamond Jun 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 14 additions & 7 deletions src/dodal/beamlines/b07.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from ophyd_async.epics.adcore import ADAcquireLogic

from dodal.beamlines.b07_shared import devices as b07_shared_devices
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.device_manager import DeviceManager
Expand All @@ -7,7 +9,11 @@
LensMode,
)
from dodal.devices.beamlines.b07_shared import PsuMode
from dodal.devices.electron_analyser.specs import SpecsDetector
from dodal.devices.electron_analyser.base import (
ElectronAnalayserTriggerLogic,
RegionLogic,
)
from dodal.devices.electron_analyser.specs import SpecsAnalyserDriverIO, SpecsDetector
from dodal.devices.hutch_shutter import (
EXP_SHUTTER_2_INFIX,
HutchShutter,
Expand Down Expand Up @@ -47,15 +53,16 @@ def pgm() -> PlaneGratingMonochromator:
)


# CAM:IMAGE will fail to connect outside the beamline network,
# see https://github.com/DiamondLightSource/dodal/issues/1852
@devices.factory()
def analyser(pgm: PlaneGratingMonochromator) -> SpecsDetector[LensMode, PsuMode]:
prefix = f"{B_PREFIX.beamline_prefix}-EA-DET-02:CAM:"
driver = SpecsAnalyserDriverIO(prefix, LensMode, PsuMode)
return SpecsDetector[LensMode, PsuMode](
prefix=f"{B_PREFIX.beamline_prefix}-EA-DET-01:CAM:",
lens_mode_type=LensMode,
psu_mode_type=PsuMode,
energy_source=pgm.energy.user_readback,
prefix,
driver,
acquire_logic=ADAcquireLogic(driver),
trigger_logic=ElectronAnalayserTriggerLogic(driver),
region_logic=RegionLogic(driver, pgm.energy.user_readback),
)


Expand Down
28 changes: 16 additions & 12 deletions src/dodal/beamlines/b07_1.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
from ophyd_async.epics.adcore import ADAcquireLogic

from dodal.beamlines.b07_shared import devices as b07_shared_devices
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.device_manager import DeviceManager
from dodal.devices.beamlines.b07_1 import (
ChannelCutMonochromator,
Grating,
LensMode,
)
from dodal.devices.beamlines.b07 import Grating, LensMode
from dodal.devices.beamlines.b07_1 import ChannelCutMonochromator, Grating, LensMode
from dodal.devices.beamlines.b07_shared import PsuMode
from dodal.devices.electron_analyser.specs import SpecsDetector
from dodal.devices.electron_analyser.base import (
ElectronAnalayserTriggerLogic,
RegionLogic,
)
from dodal.devices.electron_analyser.specs import SpecsAnalyserDriverIO, SpecsDetector
from dodal.devices.hutch_shutter import HutchShutter
from dodal.devices.motors import XYZAzimuthPolarStage
from dodal.devices.pgm import PlaneGratingMonochromator
Expand Down Expand Up @@ -41,15 +44,16 @@ def ccmc() -> ChannelCutMonochromator:
return ChannelCutMonochromator(prefix=f"{C_PREFIX.beamline_prefix}-OP-CCM-01:")


# CAM:IMAGE will fail to connect outside the beamline network,
# see https://github.com/DiamondLightSource/dodal/issues/1852
@devices.factory()
def analyser(pgm: PlaneGratingMonochromator) -> SpecsDetector[LensMode, PsuMode]:
prefix = f"{C_PREFIX.beamline_prefix}-EA-DET-01:CAM:"
driver = SpecsAnalyserDriverIO(prefix, LensMode, PsuMode)
return SpecsDetector[LensMode, PsuMode](
prefix=f"{C_PREFIX.beamline_prefix}-EA-DET-01:CAM:",
lens_mode_type=LensMode,
psu_mode_type=PsuMode,
energy_source=pgm.energy.user_readback,
prefix,
driver,
acquire_logic=ADAcquireLogic(driver),
trigger_logic=ElectronAnalayserTriggerLogic(driver),
region_logic=RegionLogic(driver, pgm.energy.user_readback),
)


Expand Down
18 changes: 14 additions & 4 deletions src/dodal/beamlines/i05.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
from ophyd_async.epics.adcore import ADAcquireLogic

from dodal.beamlines.i05_shared import devices as i05_shared_devices
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.device_manager import DeviceManager
from dodal.devices.beamlines.i05 import I05Goniometer
from dodal.devices.beamlines.i05_shared import LensMode, M4M5Mirror, PassEnergy
from dodal.devices.common_mirror import XYZSwitchingMirror
from dodal.devices.electron_analyser.base import (
ElectronAnalayserTriggerLogic,
RegionLogic,
)
from dodal.devices.electron_analyser.mbs import (
EntranceSlitInformationDevice,
MbsAnalyserDriverIO,
MbsDetector,
)
from dodal.devices.hutch_shutter import HutchShutter
Expand Down Expand Up @@ -62,11 +69,14 @@ def analyser_slits() -> EntranceSlitInformationDevice:
def analyser(
pgm: PlaneGratingMonochromator, analyser_slits: EntranceSlitInformationDevice
) -> MbsDetector[LensMode, PassEnergy]:
prefix = f"{PREFIX.beamline_prefix}-EA-DET-02:CAM:"
driver = MbsAnalyserDriverIO(prefix, LensMode, PassEnergy)
return MbsDetector[LensMode, PassEnergy](
prefix=f"{PREFIX.beamline_prefix}-EA-DET-02:CAM:",
lens_mode_type=LensMode,
pass_energy_type=PassEnergy,
energy_source=pgm.energy.user_readback,
prefix,
driver,
acquire_logic=ADAcquireLogic(driver),
trigger_logic=ElectronAnalayserTriggerLogic(driver),
region_logic=RegionLogic(driver, pgm.energy.user_readback),
config_sigs=(
analyser_slits.direction,
analyser_slits.size,
Expand Down
18 changes: 14 additions & 4 deletions src/dodal/beamlines/i05_1.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
from ophyd_async.epics.adcore import ADAcquireLogic

from dodal.beamlines.i05_shared import devices as i05_shared_devices
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.device_manager import DeviceManager
from dodal.devices.beamlines.i05_1 import XYZAzimuthPolarDefocusStage
from dodal.devices.beamlines.i05_shared import LensMode, Mj7j8Mirror, PassEnergy
from dodal.devices.common_mirror import XYZPiezoSwitchingMirror
from dodal.devices.electron_analyser.base import (
ElectronAnalayserTriggerLogic,
RegionLogic,
)
from dodal.devices.electron_analyser.mbs import (
EntranceSlitInformationDevice,
MbsAnalyserDriverIO,
MbsDetector,
)
from dodal.devices.hutch_shutter import HutchShutter
Expand Down Expand Up @@ -52,11 +59,14 @@ def analyser_slits() -> EntranceSlitInformationDevice:
def analyser(
pgm: PlaneGratingMonochromator, analyser_slits: EntranceSlitInformationDevice
) -> MbsDetector[LensMode, PassEnergy]:
prefix = f"{PREFIX.beamline_prefix}-EA-DET-04:CAM:"
driver = MbsAnalyserDriverIO(prefix, LensMode, PassEnergy)
return MbsDetector[LensMode, PassEnergy](
prefix=f"{PREFIX.beamline_prefix}-EA-DET-04:CAM:",
lens_mode_type=LensMode,
pass_energy_type=PassEnergy,
energy_source=pgm.energy.user_readback,
prefix,
driver,
acquire_logic=ADAcquireLogic(driver),
trigger_logic=ElectronAnalayserTriggerLogic(driver),
region_logic=RegionLogic(driver, pgm.energy.user_readback),
config_sigs=(
analyser_slits.direction,
analyser_slits.size,
Expand Down
38 changes: 26 additions & 12 deletions src/dodal/beamlines/i09.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from ophyd_async.core import InOut, SignalRW
from ophyd_async.core import InOut, SignalRW, soft_signal_rw
from ophyd_async.epics.core import epics_signal_rw

from dodal.beamlines.i09_1_shared import devices as i09_1_shared_devices
Expand All @@ -13,8 +13,16 @@
)
from dodal.devices.beamlines.i09.scaler import ScalerController
from dodal.devices.common_dcm import DoubleCrystalMonochromatorWithDSpacing
from dodal.devices.electron_analyser.base import DualEnergySource
from dodal.devices.electron_analyser.vgscienta import VGScientaDetector
from dodal.devices.electron_analyser.base import (
DualEnergySource,
ElectronAnalayserTriggerLogic,
RegionLogic,
ShutterCoordinatorADAcquireLogic,
)
from dodal.devices.electron_analyser.vgscienta import (
VGScientaAnalyserDriverIO,
VGScientaDetector,
)
from dodal.devices.fast_shutter import DualFastShutter, FastShutter
from dodal.devices.hutch_shutter import EXP_SHUTTER_2_INFIX, HutchShutter
from dodal.devices.motors import XYZAzimuthPolarStage
Expand Down Expand Up @@ -106,22 +114,28 @@ def dual_fast_shutter(
return DualFastShutter[InOut](fsi1, fsj1, source_selector.selected_source)


# CAM:IMAGE will fail to connect outside the beamline network,
# see https://github.com/DiamondLightSource/dodal/issues/1852
@devices.factory()
def ew4000_close_shutter_when_idle() -> SignalRW[bool]:
return soft_signal_rw(bool, initial_value=True)


@devices.factory()
def ew4000(
dual_fast_shutter: DualFastShutter,
dual_energy_source: DualEnergySource,
source_selector: SourceSelector,
ew4000_close_shutter_when_idle: SignalRW[bool],
) -> VGScientaDetector[LensMode, PsuMode, PassEnergy]:
prefix = f"{I_PREFIX.beamline_prefix}-EA-DET-01:CAM:"
driver = VGScientaAnalyserDriverIO(prefix, LensMode, PsuMode, PassEnergy)
return VGScientaDetector[LensMode, PsuMode, PassEnergy](
prefix=f"{I_PREFIX.beamline_prefix}-EA-DET-01:CAM:",
lens_mode_type=LensMode,
psu_mode_type=PsuMode,
pass_energy_type=PassEnergy,
energy_source=dual_energy_source.energy,
shutter=dual_fast_shutter,
source_selector=source_selector,
prefix,
driver,
acquire_logic=ShutterCoordinatorADAcquireLogic(
driver, dual_fast_shutter, ew4000_close_shutter_when_idle
),
trigger_logic=ElectronAnalayserTriggerLogic(driver),
region_logic=RegionLogic(driver, dual_energy_source.energy, source_selector),
)


Expand Down
21 changes: 14 additions & 7 deletions src/dodal/beamlines/i09_1.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
from ophyd_async.epics.adcore import ADAcquireLogic

from dodal.beamlines.i09_1_shared import devices as i09_1_shared_devices
from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.device_manager import DeviceManager
from dodal.devices.beamlines.i09_1 import LensMode, PsuMode
from dodal.devices.common_dcm import DoubleCrystalMonochromatorWithDSpacing
from dodal.devices.electron_analyser.specs import SpecsDetector
from dodal.devices.electron_analyser.base import (
ElectronAnalayserTriggerLogic,
RegionLogic,
)
from dodal.devices.electron_analyser.specs import SpecsAnalyserDriverIO, SpecsDetector
from dodal.devices.motors import XYZAzimuthTiltPolarStage
from dodal.devices.synchrotron import Synchrotron
from dodal.devices.temperture_controller import Lakeshore336
Expand All @@ -24,17 +30,18 @@ def synchrotron() -> Synchrotron:
return Synchrotron()


# CAM:IMAGE will fail to connect outside the beamline network,
# see https://github.com/DiamondLightSource/dodal/issues/1852
@devices.factory()
def analyser(
dcm: DoubleCrystalMonochromatorWithDSpacing,
) -> SpecsDetector[LensMode, PsuMode]:
prefix = f"{PREFIX.beamline_prefix}-EA-DET-02:CAM:"
driver = SpecsAnalyserDriverIO(prefix, LensMode, PsuMode)
return SpecsDetector[LensMode, PsuMode](
prefix=f"{PREFIX.beamline_prefix}-EA-DET-02:CAM:",
lens_mode_type=LensMode,
psu_mode_type=PsuMode,
energy_source=dcm.energy_in_eV,
prefix,
driver,
acquire_logic=ADAcquireLogic(driver),
trigger_logic=ElectronAnalayserTriggerLogic(driver),
region_logic=RegionLogic(driver, dcm.energy_in_eV),
)


Expand Down
34 changes: 22 additions & 12 deletions src/dodal/beamlines/p60.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,24 @@
from ophyd_async.epics.adcore import ADAcquireLogic

from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline
from dodal.device_manager import DeviceManager
from dodal.devices.beamlines.i09 import LensMode, PassEnergy, PsuMode
from dodal.devices.beamlines.p60 import (
LabXraySource,
LabXraySourceReadable,
LensMode,
PassEnergy,
PsuMode,
)
from dodal.devices.electron_analyser.base import DualEnergySource
from dodal.devices.electron_analyser.vgscienta import VGScientaDetector
from dodal.devices.electron_analyser.base import (
DualEnergySource,
ElectronAnalayserTriggerLogic,
RegionLogic,
)
from dodal.devices.electron_analyser.vgscienta import (
VGScientaAnalyserDriverIO,
VGScientaDetector,
)
from dodal.devices.selectable_source import SourceSelector
from dodal.log import set_beamline as set_log_beamline
from dodal.utils import BeamlinePrefix, get_beamline_name
Expand Down Expand Up @@ -42,7 +52,7 @@ def mg_kalpha_source() -> LabXraySourceReadable:


@devices.factory()
def energy_source(
def dual_energy_source(
al_kalpha_source: LabXraySourceReadable,
mg_kalpha_source: LabXraySourceReadable,
source_selector: SourceSelector,
Expand All @@ -54,16 +64,16 @@ def energy_source(
)


# Connect will work again after this work completed
# https://jira.diamond.ac.uk/browse/P60-13
@devices.factory()
def r4000(
energy_source: DualEnergySource,
def ew4000(
dual_energy_source: DualEnergySource,
) -> VGScientaDetector[LensMode, PsuMode, PassEnergy]:
prefix = f"{PREFIX.beamline_prefix}-EA-DET-01:CAM:"
driver = VGScientaAnalyserDriverIO(prefix, LensMode, PsuMode, PassEnergy)
return VGScientaDetector[LensMode, PsuMode, PassEnergy](
prefix=f"{PREFIX.beamline_prefix}-EA-DET-01:CAM:",
lens_mode_type=LensMode,
psu_mode_type=PsuMode,
pass_energy_type=PassEnergy,
energy_source=energy_source.energy,
prefix=prefix,
driver=driver,
acquire_logic=ADAcquireLogic(driver),
trigger_logic=ElectronAnalayserTriggerLogic(driver),
region_logic=RegionLogic(driver, dual_energy_source.energy),
)
6 changes: 1 addition & 5 deletions src/dodal/devices/cryostream.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,7 @@
StandardReadableFormat,
StrictEnum,
)
from ophyd_async.epics.core import (
epics_signal_r,
epics_signal_rw,
epics_signal_x,
)
from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_x


class TurboEnum(StrictEnum):
Expand Down
8 changes: 8 additions & 0 deletions src/dodal/devices/electron_analyser/base/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@
TLensMode,
)
from .base_util import to_binding_energy, to_kinetic_energy
from .detector_logic import (
ElectronAnalayserTriggerLogic,
RegionLogic,
ShutterCoordinatorADAcquireLogic,
)
from .energy_sources import DualEnergySource

__all__ = [
Expand All @@ -35,5 +40,8 @@
"TLensMode",
"to_binding_energy",
"to_kinetic_energy",
"ElectronAnalayserTriggerLogic",
"RegionLogic",
"ShutterCoordinatorADAcquireLogic",
"DualEnergySource",
]
Loading
Loading