From 25713390c3b60e4b40cb9155c781c4657b35192b Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 11:24:37 +0000 Subject: [PATCH 01/10] electro magnet devices --- src/dodal/beamlines/i10_1.py | 68 ++++++++++++++++++- src/dodal/devices/i10_1/__init__.py | 11 +++ src/dodal/devices/i10_1/current_amp.py | 24 +++++++ .../devices/i10_1/electromagnet/__init__.py | 0 .../i10_1/electromagnet/current_amp.py | 33 +++++++++ .../devices/i10_1/electromagnet/magnet.py | 16 +++++ .../i10_1/electromagnet/scaler_cards.py | 12 ++++ .../devices/i10_1/electromagnet/stages.py | 14 ++++ 8 files changed, 175 insertions(+), 3 deletions(-) create mode 100644 src/dodal/devices/i10_1/__init__.py create mode 100644 src/dodal/devices/i10_1/current_amp.py create mode 100644 src/dodal/devices/i10_1/electromagnet/__init__.py create mode 100644 src/dodal/devices/i10_1/electromagnet/current_amp.py create mode 100644 src/dodal/devices/i10_1/electromagnet/magnet.py create mode 100644 src/dodal/devices/i10_1/electromagnet/scaler_cards.py create mode 100644 src/dodal/devices/i10_1/electromagnet/stages.py diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index 72be2ae75ba..243e2186979 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -1,7 +1,14 @@ from dodal.beamlines.i10_shared import devices as i10_shared_devices from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline from dodal.device_manager import DeviceManager +from dodal.devices.current_amplifiers.current_amplifier_detector import CurrentAmpDet from dodal.devices.i10 import I10JDiagnostic, I10JSlits, PiezoMirror +from dodal.devices.i10_1 import ( + I10JSR570, + ElectromagnetMagnetField, + ElectromagnetScalerCard1, + ElectromagnetSR570, +) from dodal.devices.temperture_controller.lakeshore.lakeshore import Lakeshore336 from dodal.log import set_beamline as set_log_beamline from dodal.utils import BeamlinePrefix, get_beamline_name @@ -13,11 +20,13 @@ devices = DeviceManager() devices.include(i10_shared_devices) +"""I10-1 J Beamline Devices""" + @devices.factory() -def em_temperature_controller() -> Lakeshore336: - return Lakeshore336( - prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-41:", +def mirror6_sr570() -> I10JSR570: + return I10JSR570( + prefix=f"{PREFIX.beamline_prefix}-DI-IAMP", ) @@ -36,3 +45,56 @@ def diagnostic() -> I10JDiagnostic: @devices.factory() def focusing_mirror() -> PiezoMirror: return PiezoMirror(prefix=f"{PREFIX.beamline_prefix}-OP-FOCA-01:") + + +"""I10-1 Electromagnet Devices""" + + +@devices.factory() +def electromagnet_field() -> ElectromagnetMagnetField: + return ElectromagnetMagnetField( + prefix=f"{PREFIX.beamline_prefix}-EA-MAGC-01:", + ) + + +@devices.factory() +def electromagnet_scaler_card() -> ElectromagnetScalerCard1: + return ElectromagnetScalerCard1( + prefix=f"{PREFIX.beamline_prefix}-EA-SCLR-02:SCALERJ3", + ) + + +@devices.factory() +def electromagnet_sr570() -> ElectromagnetSR570: + return ElectromagnetSR570( + prefix=f"{PREFIX.beamline_prefix}-DI-IAMP", + ) + + +@devices.factory() +def electromagnet_sr570_scaler_tey( + electromagnet_sr570: ElectromagnetSR570, + electromagnet_scaler_card: ElectromagnetScalerCard1, +) -> CurrentAmpDet: + return CurrentAmpDet( + current_amp=electromagnet_sr570.ca1, + counter=electromagnet_scaler_card.tey, + ) + + +@devices.factory() +def electromagnet_sr570_scaler_fy( + electromagnet_sr570: ElectromagnetSR570, + electromagnet_scaler_card: ElectromagnetScalerCard1, +) -> CurrentAmpDet: + return CurrentAmpDet( + current_amp=electromagnet_sr570.ca2, + counter=electromagnet_scaler_card.fy, + ) + + +@devices.factory() +def em_temperature_controller() -> Lakeshore336: + return Lakeshore336( + prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-41:", + ) diff --git a/src/dodal/devices/i10_1/__init__.py b/src/dodal/devices/i10_1/__init__.py new file mode 100644 index 00000000000..befdbca617d --- /dev/null +++ b/src/dodal/devices/i10_1/__init__.py @@ -0,0 +1,11 @@ +from .current_amp import I10JSR570 +from .electromagnet.current_amp import ElectromagnetSR570 +from .electromagnet.magnet import ElectromagnetMagnetField +from .electromagnet.scaler_cards import ElectromagnetScalerCard1 + +__all__ = [ + "I10JSR570", + "ElectromagnetSR570", + "ElectromagnetMagnetField", + "ElectromagnetScalerCard1", +] diff --git a/src/dodal/devices/i10_1/current_amp.py b/src/dodal/devices/i10_1/current_amp.py new file mode 100644 index 00000000000..c9b23060954 --- /dev/null +++ b/src/dodal/devices/i10_1/current_amp.py @@ -0,0 +1,24 @@ +from ophyd_async.core import Device + +from dodal.devices.current_amplifiers import ( + SR570, + SR570FineGainTable, + SR570FullGainTable, + SR570GainTable, + SR570GainToCurrentTable, + SR570RaiseTimeTable, +) + + +class I10JSR570(Device): + def __init__(self, prefix: str, suffix: str = "SENS:SEL", name: str = "") -> None: + self.ca1 = SR570( + prefix + "-07:", + suffix=suffix, + fine_gain_table=SR570FineGainTable, + coarse_gain_table=SR570GainTable, + combined_table=SR570FullGainTable, + gain_to_current_table=SR570GainToCurrentTable, + raise_timetable=SR570RaiseTimeTable, + ) + super().__init__(name) diff --git a/src/dodal/devices/i10_1/electromagnet/__init__.py b/src/dodal/devices/i10_1/electromagnet/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/dodal/devices/i10_1/electromagnet/current_amp.py b/src/dodal/devices/i10_1/electromagnet/current_amp.py new file mode 100644 index 00000000000..e93f2794079 --- /dev/null +++ b/src/dodal/devices/i10_1/electromagnet/current_amp.py @@ -0,0 +1,33 @@ +from ophyd_async.core import Device + +from dodal.devices.current_amplifiers import ( + SR570, + SR570FineGainTable, + SR570FullGainTable, + SR570GainTable, + SR570GainToCurrentTable, + SR570RaiseTimeTable, +) + + +class ElectromagnetSR570(Device): + def __init__(self, prefix: str, suffix: str = "SENS:SEL", name: str = "") -> None: + self.ca1 = SR570( + prefix + "-08:", + suffix=suffix, + fine_gain_table=SR570FineGainTable, + coarse_gain_table=SR570GainTable, + combined_table=SR570FullGainTable, + gain_to_current_table=SR570GainToCurrentTable, + raise_timetable=SR570RaiseTimeTable, + ) + self.ca2 = SR570( + prefix + "-09:", + suffix=suffix, + fine_gain_table=SR570FineGainTable, + coarse_gain_table=SR570GainTable, + combined_table=SR570FullGainTable, + gain_to_current_table=SR570GainToCurrentTable, + raise_timetable=SR570RaiseTimeTable, + ) + super().__init__(name) diff --git a/src/dodal/devices/i10_1/electromagnet/magnet.py b/src/dodal/devices/i10_1/electromagnet/magnet.py new file mode 100644 index 00000000000..2ce31f84f9f --- /dev/null +++ b/src/dodal/devices/i10_1/electromagnet/magnet.py @@ -0,0 +1,16 @@ +from ophyd_async.core import StandardReadable +from ophyd_async.epics.core import epics_signal_rw + + +class ElectromagnetMagnetField(StandardReadable): + def __init__( + self, + prefix: str, + name: str = "", + ): + with self.add_children_as_readables(): + self.field = epics_signal_rw( + float, write_pv=prefix + "FIELD", read_pv=prefix + "FIELD:RBV" + ) + self.current = epics_signal_rw(float, prefix + "DMD") + super().__init__(name=name) diff --git a/src/dodal/devices/i10_1/electromagnet/scaler_cards.py b/src/dodal/devices/i10_1/electromagnet/scaler_cards.py new file mode 100644 index 00000000000..ef3cf53e990 --- /dev/null +++ b/src/dodal/devices/i10_1/electromagnet/scaler_cards.py @@ -0,0 +1,12 @@ +from ophyd_async.core import Device + +from dodal.devices.current_amplifiers import StruckScaler + + +class ElectromagnetScalerCard1(Device): + def __init__(self, prefix, name: str = "") -> None: + self.mon = StruckScaler(prefix=prefix, suffix=".S17") + self.tey = StruckScaler(prefix=prefix, suffix=".S18") + self.fy = StruckScaler(prefix=prefix, suffix=".S19") + self.fy2 = StruckScaler(prefix=prefix, suffix=".S20") + super().__init__(name) diff --git a/src/dodal/devices/i10_1/electromagnet/stages.py b/src/dodal/devices/i10_1/electromagnet/stages.py new file mode 100644 index 00000000000..a8c66b12909 --- /dev/null +++ b/src/dodal/devices/i10_1/electromagnet/stages.py @@ -0,0 +1,14 @@ +from ophyd_async.core import StandardReadable +from ophyd_async.epics.motor import Motor + + +class ElectromagnetStage(StandardReadable): + def __init__( + self, + prefix: str, + name: str = "", + ): + with self.add_children_as_readables(): + self.y = Motor(prefix + "Y") + self.pitch = Motor(prefix + "PITCH") + super().__init__(name=name) From 3af23258a4c1d45a1b83a59a05f8355a70ed5272 Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 13:22:45 +0000 Subject: [PATCH 02/10] add em stage --- src/dodal/beamlines/i10_1.py | 8 ++++++++ src/dodal/devices/i10_1/__init__.py | 2 ++ 2 files changed, 10 insertions(+) diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index 243e2186979..4c4b9c8e734 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -8,6 +8,7 @@ ElectromagnetMagnetField, ElectromagnetScalerCard1, ElectromagnetSR570, + ElectromagnetStage, ) from dodal.devices.temperture_controller.lakeshore.lakeshore import Lakeshore336 from dodal.log import set_beamline as set_log_beamline @@ -98,3 +99,10 @@ def em_temperature_controller() -> Lakeshore336: return Lakeshore336( prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-41:", ) + + +@devices.factory() +def electromagnet_stage() -> ElectromagnetStage: + return ElectromagnetStage( + prefix=f"{PREFIX.beamline_prefix}-MO-CRYO-01:", + ) diff --git a/src/dodal/devices/i10_1/__init__.py b/src/dodal/devices/i10_1/__init__.py index befdbca617d..4eec3d3594c 100644 --- a/src/dodal/devices/i10_1/__init__.py +++ b/src/dodal/devices/i10_1/__init__.py @@ -2,10 +2,12 @@ from .electromagnet.current_amp import ElectromagnetSR570 from .electromagnet.magnet import ElectromagnetMagnetField from .electromagnet.scaler_cards import ElectromagnetScalerCard1 +from .electromagnet.stages import ElectromagnetStage __all__ = [ "I10JSR570", "ElectromagnetSR570", "ElectromagnetMagnetField", "ElectromagnetScalerCard1", + "ElectromagnetStage", ] From fbf8b57fdaeb65cd0b026dd757c4146e0895c94d Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 13:26:11 +0000 Subject: [PATCH 03/10] fixes docstring --- src/dodal/beamlines/i10_1.py | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index 4c4b9c8e734..cc7c34f85c2 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -21,7 +21,7 @@ devices = DeviceManager() devices.include(i10_shared_devices) -"""I10-1 J Beamline Devices""" +"""I10J Beamline Devices""" @devices.factory() @@ -48,7 +48,7 @@ def focusing_mirror() -> PiezoMirror: return PiezoMirror(prefix=f"{PREFIX.beamline_prefix}-OP-FOCA-01:") -"""I10-1 Electromagnet Devices""" +"""I10J Electromagnet Devices""" @devices.factory() @@ -58,6 +58,16 @@ def electromagnet_field() -> ElectromagnetMagnetField: ) +@devices.factory() +def electromagnet_stage() -> ElectromagnetStage: + return ElectromagnetStage( + prefix=f"{PREFIX.beamline_prefix}-MO-CRYO-01:", + ) + + +"""I10J Electromagnet Measurement Devices""" + + @devices.factory() def electromagnet_scaler_card() -> ElectromagnetScalerCard1: return ElectromagnetScalerCard1( @@ -99,10 +109,3 @@ def em_temperature_controller() -> Lakeshore336: return Lakeshore336( prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-41:", ) - - -@devices.factory() -def electromagnet_stage() -> ElectromagnetStage: - return ElectromagnetStage( - prefix=f"{PREFIX.beamline_prefix}-MO-CRYO-01:", - ) From 05025b53ce56c0b01160484e89a78bd8dcff841d Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 13:30:14 +0000 Subject: [PATCH 04/10] add auto detector for monitor --- src/dodal/beamlines/i10_1.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index cc7c34f85c2..ee849c94fe3 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -82,6 +82,16 @@ def electromagnet_sr570() -> ElectromagnetSR570: ) +@devices.factory() +def electromagnet_sr570_scaler_monitor( + mirror6_sr570: I10JSR570, + electromagnet_scaler_card: ElectromagnetScalerCard1, +) -> CurrentAmpDet: + return CurrentAmpDet( + current_amp=mirror6_sr570.ca1, counter=electromagnet_scaler_card.mon + ) + + @devices.factory() def electromagnet_sr570_scaler_tey( electromagnet_sr570: ElectromagnetSR570, From 25a165b01c114ddf69737814b1cf6cc79cb82337 Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 13:39:16 +0000 Subject: [PATCH 05/10] add default table to base class --- src/dodal/beamlines/i10_1.py | 13 ++++------ src/dodal/devices/current_amplifiers/sr570.py | 12 ++++----- .../devices/i10/rasor/rasor_current_amp.py | 25 +------------------ src/dodal/devices/i10_1/__init__.py | 2 -- src/dodal/devices/i10_1/current_amp.py | 24 ------------------ 5 files changed, 12 insertions(+), 64 deletions(-) delete mode 100644 src/dodal/devices/i10_1/current_amp.py diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index ee849c94fe3..25c0861efc4 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -1,10 +1,9 @@ from dodal.beamlines.i10_shared import devices as i10_shared_devices from dodal.common.beamlines.beamline_utils import set_beamline as set_utils_beamline from dodal.device_manager import DeviceManager -from dodal.devices.current_amplifiers.current_amplifier_detector import CurrentAmpDet +from dodal.devices.current_amplifiers import SR570, CurrentAmpDet from dodal.devices.i10 import I10JDiagnostic, I10JSlits, PiezoMirror from dodal.devices.i10_1 import ( - I10JSR570, ElectromagnetMagnetField, ElectromagnetScalerCard1, ElectromagnetSR570, @@ -25,10 +24,8 @@ @devices.factory() -def mirror6_sr570() -> I10JSR570: - return I10JSR570( - prefix=f"{PREFIX.beamline_prefix}-DI-IAMP", - ) +def mirror6_sr570() -> SR570: + return SR570(prefix=f"{PREFIX.beamline_prefix}-DI-IAMP-07:") @devices.factory() @@ -84,11 +81,11 @@ def electromagnet_sr570() -> ElectromagnetSR570: @devices.factory() def electromagnet_sr570_scaler_monitor( - mirror6_sr570: I10JSR570, + mirror6_sr570: SR570, electromagnet_scaler_card: ElectromagnetScalerCard1, ) -> CurrentAmpDet: return CurrentAmpDet( - current_amp=mirror6_sr570.ca1, counter=electromagnet_scaler_card.mon + current_amp=mirror6_sr570, counter=electromagnet_scaler_card.mon ) diff --git a/src/dodal/devices/current_amplifiers/sr570.py b/src/dodal/devices/current_amplifiers/sr570.py index 73672ac59bc..fd0db0cdebd 100644 --- a/src/dodal/devices/current_amplifiers/sr570.py +++ b/src/dodal/devices/current_amplifiers/sr570.py @@ -135,12 +135,12 @@ class SR570(CurrentAmp): def __init__( self, prefix: str, - suffix: str, - fine_gain_table: type[StrictEnum], - coarse_gain_table: type[StrictEnum], - combined_table: type[Enum], - gain_to_current_table: type[Enum], - raise_timetable: type[Enum], + suffix: str = "SENS:SEL", + fine_gain_table: type[StrictEnum] = SR570FineGainTable, + coarse_gain_table: type[StrictEnum] = SR570GainTable, + combined_table: type[Enum] = SR570FullGainTable, + gain_to_current_table: type[Enum] = SR570GainToCurrentTable, + raise_timetable: type[Enum] = SR570RaiseTimeTable, upperlimit: float = 4.8, lowerlimit: float = 0.4, timeout: float = 1, diff --git a/src/dodal/devices/i10/rasor/rasor_current_amp.py b/src/dodal/devices/i10/rasor/rasor_current_amp.py index 7179a103d89..1d592e24dd0 100644 --- a/src/dodal/devices/i10/rasor/rasor_current_amp.py +++ b/src/dodal/devices/i10/rasor/rasor_current_amp.py @@ -6,11 +6,6 @@ Femto3xxGainToCurrentTable, Femto3xxRaiseTime, FemtoDDPCA, - SR570FineGainTable, - SR570FullGainTable, - SR570GainTable, - SR570GainToCurrentTable, - SR570RaiseTimeTable, ) @@ -41,32 +36,14 @@ def __init__(self, prefix: str, suffix: str = "GAIN", name: str = "") -> None: class RasorSR570(Device): - def __init__(self, prefix: str, suffix: str = "SENS:SEL", name: str = "") -> None: + def __init__(self, prefix: str, name: str = "") -> None: self.ca1 = SR570( prefix + "-04:", - suffix=suffix, - fine_gain_table=SR570FineGainTable, - coarse_gain_table=SR570GainTable, - combined_table=SR570FullGainTable, - gain_to_current_table=SR570GainToCurrentTable, - raise_timetable=SR570RaiseTimeTable, ) self.ca2 = SR570( prefix + "-05:", - suffix=suffix, - fine_gain_table=SR570FineGainTable, - coarse_gain_table=SR570GainTable, - combined_table=SR570FullGainTable, - gain_to_current_table=SR570GainToCurrentTable, - raise_timetable=SR570RaiseTimeTable, ) self.ca3 = SR570( prefix + "-06:", - suffix=suffix, - fine_gain_table=SR570FineGainTable, - coarse_gain_table=SR570GainTable, - combined_table=SR570FullGainTable, - gain_to_current_table=SR570GainToCurrentTable, - raise_timetable=SR570RaiseTimeTable, ) super().__init__(name) diff --git a/src/dodal/devices/i10_1/__init__.py b/src/dodal/devices/i10_1/__init__.py index 4eec3d3594c..3f6b8f864ea 100644 --- a/src/dodal/devices/i10_1/__init__.py +++ b/src/dodal/devices/i10_1/__init__.py @@ -1,11 +1,9 @@ -from .current_amp import I10JSR570 from .electromagnet.current_amp import ElectromagnetSR570 from .electromagnet.magnet import ElectromagnetMagnetField from .electromagnet.scaler_cards import ElectromagnetScalerCard1 from .electromagnet.stages import ElectromagnetStage __all__ = [ - "I10JSR570", "ElectromagnetSR570", "ElectromagnetMagnetField", "ElectromagnetScalerCard1", diff --git a/src/dodal/devices/i10_1/current_amp.py b/src/dodal/devices/i10_1/current_amp.py deleted file mode 100644 index c9b23060954..00000000000 --- a/src/dodal/devices/i10_1/current_amp.py +++ /dev/null @@ -1,24 +0,0 @@ -from ophyd_async.core import Device - -from dodal.devices.current_amplifiers import ( - SR570, - SR570FineGainTable, - SR570FullGainTable, - SR570GainTable, - SR570GainToCurrentTable, - SR570RaiseTimeTable, -) - - -class I10JSR570(Device): - def __init__(self, prefix: str, suffix: str = "SENS:SEL", name: str = "") -> None: - self.ca1 = SR570( - prefix + "-07:", - suffix=suffix, - fine_gain_table=SR570FineGainTable, - coarse_gain_table=SR570GainTable, - combined_table=SR570FullGainTable, - gain_to_current_table=SR570GainToCurrentTable, - raise_timetable=SR570RaiseTimeTable, - ) - super().__init__(name) From 44267fd0f9100c2ae70852cc9db4bfbea04f8cfd Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 13:44:21 +0000 Subject: [PATCH 06/10] clean up 10j SR570 --- .../i10_1/electromagnet/current_amp.py | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/src/dodal/devices/i10_1/electromagnet/current_amp.py b/src/dodal/devices/i10_1/electromagnet/current_amp.py index e93f2794079..39f433ec5bd 100644 --- a/src/dodal/devices/i10_1/electromagnet/current_amp.py +++ b/src/dodal/devices/i10_1/electromagnet/current_amp.py @@ -2,32 +2,15 @@ from dodal.devices.current_amplifiers import ( SR570, - SR570FineGainTable, - SR570FullGainTable, - SR570GainTable, - SR570GainToCurrentTable, - SR570RaiseTimeTable, ) class ElectromagnetSR570(Device): - def __init__(self, prefix: str, suffix: str = "SENS:SEL", name: str = "") -> None: + def __init__(self, prefix: str, name: str = "") -> None: self.ca1 = SR570( prefix + "-08:", - suffix=suffix, - fine_gain_table=SR570FineGainTable, - coarse_gain_table=SR570GainTable, - combined_table=SR570FullGainTable, - gain_to_current_table=SR570GainToCurrentTable, - raise_timetable=SR570RaiseTimeTable, ) self.ca2 = SR570( prefix + "-09:", - suffix=suffix, - fine_gain_table=SR570FineGainTable, - coarse_gain_table=SR570GainTable, - combined_table=SR570FullGainTable, - gain_to_current_table=SR570GainToCurrentTable, - raise_timetable=SR570RaiseTimeTable, ) super().__init__(name) From 6e088912c3c38e7494e80b2163c9bb9c5c2f4bb7 Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 15:18:49 +0000 Subject: [PATCH 07/10] move scaler_cards out of em as high field magnet has the same format. --- src/dodal/beamlines/i10_1.py | 12 ++++++------ src/dodal/devices/i10_1/__init__.py | 4 ++-- .../i10_1/{electromagnet => }/scaler_cards.py | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) rename src/dodal/devices/i10_1/{electromagnet => }/scaler_cards.py (91%) diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index 25c0861efc4..c427180387c 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -5,9 +5,9 @@ from dodal.devices.i10 import I10JDiagnostic, I10JSlits, PiezoMirror from dodal.devices.i10_1 import ( ElectromagnetMagnetField, - ElectromagnetScalerCard1, ElectromagnetSR570, ElectromagnetStage, + I10JScalerCard, ) from dodal.devices.temperture_controller.lakeshore.lakeshore import Lakeshore336 from dodal.log import set_beamline as set_log_beamline @@ -66,8 +66,8 @@ def electromagnet_stage() -> ElectromagnetStage: @devices.factory() -def electromagnet_scaler_card() -> ElectromagnetScalerCard1: - return ElectromagnetScalerCard1( +def electromagnet_scaler_card() -> I10JScalerCard: + return I10JScalerCard( prefix=f"{PREFIX.beamline_prefix}-EA-SCLR-02:SCALERJ3", ) @@ -82,7 +82,7 @@ def electromagnet_sr570() -> ElectromagnetSR570: @devices.factory() def electromagnet_sr570_scaler_monitor( mirror6_sr570: SR570, - electromagnet_scaler_card: ElectromagnetScalerCard1, + electromagnet_scaler_card: I10JScalerCard, ) -> CurrentAmpDet: return CurrentAmpDet( current_amp=mirror6_sr570, counter=electromagnet_scaler_card.mon @@ -92,7 +92,7 @@ def electromagnet_sr570_scaler_monitor( @devices.factory() def electromagnet_sr570_scaler_tey( electromagnet_sr570: ElectromagnetSR570, - electromagnet_scaler_card: ElectromagnetScalerCard1, + electromagnet_scaler_card: I10JScalerCard, ) -> CurrentAmpDet: return CurrentAmpDet( current_amp=electromagnet_sr570.ca1, @@ -103,7 +103,7 @@ def electromagnet_sr570_scaler_tey( @devices.factory() def electromagnet_sr570_scaler_fy( electromagnet_sr570: ElectromagnetSR570, - electromagnet_scaler_card: ElectromagnetScalerCard1, + electromagnet_scaler_card: I10JScalerCard, ) -> CurrentAmpDet: return CurrentAmpDet( current_amp=electromagnet_sr570.ca2, diff --git a/src/dodal/devices/i10_1/__init__.py b/src/dodal/devices/i10_1/__init__.py index 3f6b8f864ea..c00fcca7fa5 100644 --- a/src/dodal/devices/i10_1/__init__.py +++ b/src/dodal/devices/i10_1/__init__.py @@ -1,11 +1,11 @@ from .electromagnet.current_amp import ElectromagnetSR570 from .electromagnet.magnet import ElectromagnetMagnetField -from .electromagnet.scaler_cards import ElectromagnetScalerCard1 from .electromagnet.stages import ElectromagnetStage +from .scaler_cards import I10JScalerCard __all__ = [ "ElectromagnetSR570", "ElectromagnetMagnetField", - "ElectromagnetScalerCard1", + "I10JScalerCard", "ElectromagnetStage", ] diff --git a/src/dodal/devices/i10_1/electromagnet/scaler_cards.py b/src/dodal/devices/i10_1/scaler_cards.py similarity index 91% rename from src/dodal/devices/i10_1/electromagnet/scaler_cards.py rename to src/dodal/devices/i10_1/scaler_cards.py index ef3cf53e990..f467765b088 100644 --- a/src/dodal/devices/i10_1/electromagnet/scaler_cards.py +++ b/src/dodal/devices/i10_1/scaler_cards.py @@ -3,7 +3,7 @@ from dodal.devices.current_amplifiers import StruckScaler -class ElectromagnetScalerCard1(Device): +class I10JScalerCard(Device): def __init__(self, prefix, name: str = "") -> None: self.mon = StruckScaler(prefix=prefix, suffix=".S17") self.tey = StruckScaler(prefix=prefix, suffix=".S18") From 9b0f80321f5654f79ec3543363e7b8e9d52da0f7 Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 28 Jan 2026 15:36:37 +0000 Subject: [PATCH 08/10] add stage --- src/dodal/beamlines/i10_1.py | 14 ++++++++++++++ .../devices/i10_1/high_field_magnet/__init__.py | 0 2 files changed, 14 insertions(+) create mode 100644 src/dodal/devices/i10_1/high_field_magnet/__init__.py diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index c427180387c..f3003cbcc0a 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -9,6 +9,7 @@ ElectromagnetStage, I10JScalerCard, ) +from dodal.devices.motors import XYPitchStage from dodal.devices.temperture_controller.lakeshore.lakeshore import Lakeshore336 from dodal.log import set_beamline as set_log_beamline from dodal.utils import BeamlinePrefix, get_beamline_name @@ -62,6 +63,19 @@ def electromagnet_stage() -> ElectromagnetStage: ) +"""I10J Hight Field Magnet Devices""" + + +@devices.factory() +def high_field_magnet_stage() -> XYPitchStage: + return XYPitchStage( + prefix=f"{PREFIX.beamline_prefix}-EA-MAG-01:", + x_infix="X", + y_infix="INSERT:Y", + pitch_infix="INSERT:ROTY", + ) + + """I10J Electromagnet Measurement Devices""" diff --git a/src/dodal/devices/i10_1/high_field_magnet/__init__.py b/src/dodal/devices/i10_1/high_field_magnet/__init__.py new file mode 100644 index 00000000000..e69de29bb2d From ac90851872caa6d1697b8278b78e1e7072e64703 Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Wed, 18 Feb 2026 13:33:01 +0000 Subject: [PATCH 09/10] add high_field magnet stage --- src/dodal/beamlines/i10_1.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index 92fc9f4685e..d68469b7147 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -8,6 +8,7 @@ I10JScalerCard, ) from dodal.devices.current_amplifiers import SR570, CurrentAmpDet +from dodal.devices.motors import XYPitchStage from dodal.devices.temperture_controller.lakeshore.lakeshore import Lakeshore336 from dodal.log import set_beamline as set_log_beamline from dodal.utils import BeamlinePrefix, get_beamline_name @@ -122,3 +123,16 @@ def em_temperature_controller() -> Lakeshore336: return Lakeshore336( prefix=f"{PREFIX.beamline_prefix}-EA-TCTRL-41:", ) + + +"""I10J Hight Field Magnet Devices""" + + +@devices.factory() +def high_field_magnet_stage() -> XYPitchStage: + return XYPitchStage( + prefix=f"{PREFIX.beamline_prefix}-EA-MAG-01:", + x_infix="X", + y_infix="INSERT:Y", + pitch_infix="INSERT:ROTY", + ) From 8cfeb5d6b7a9deb9e440e637749faeba8cc89a81 Mon Sep 17 00:00:00 2001 From: Relm-Arrowny Date: Thu, 19 Feb 2026 10:26:59 +0000 Subject: [PATCH 10/10] add magnet --- src/dodal/beamlines/i10_1.py | 8 ++ src/dodal/devices/beamlines/i10_1/__init__.py | 2 + .../i10_1/high_field_magnet}/__init__.py | 0 .../high_field_magnet/high_field_magnet.py | 79 +++++++++++++++++++ src/dodal/devices/i10_1/__init__.py | 11 --- .../i10_1/electromagnet/current_amp.py | 16 ---- .../devices/i10_1/electromagnet/magnet.py | 16 ---- .../devices/i10_1/electromagnet/stages.py | 14 ---- .../i10_1/high_field_magnet/__init__.py | 0 src/dodal/devices/i10_1/scaler_cards.py | 12 --- 10 files changed, 89 insertions(+), 69 deletions(-) rename src/dodal/devices/{i10_1/electromagnet => beamlines/i10_1/high_field_magnet}/__init__.py (100%) create mode 100644 src/dodal/devices/beamlines/i10_1/high_field_magnet/high_field_magnet.py delete mode 100644 src/dodal/devices/i10_1/__init__.py delete mode 100644 src/dodal/devices/i10_1/electromagnet/current_amp.py delete mode 100644 src/dodal/devices/i10_1/electromagnet/magnet.py delete mode 100644 src/dodal/devices/i10_1/electromagnet/stages.py delete mode 100644 src/dodal/devices/i10_1/high_field_magnet/__init__.py delete mode 100644 src/dodal/devices/i10_1/scaler_cards.py diff --git a/src/dodal/beamlines/i10_1.py b/src/dodal/beamlines/i10_1.py index d68469b7147..01dffe47e19 100644 --- a/src/dodal/beamlines/i10_1.py +++ b/src/dodal/beamlines/i10_1.py @@ -5,6 +5,7 @@ from dodal.devices.beamlines.i10_1 import ( ElectromagnetMagnetField, ElectromagnetStage, + HighFieldMagnet, I10JScalerCard, ) from dodal.devices.current_amplifiers import SR570, CurrentAmpDet @@ -136,3 +137,10 @@ def high_field_magnet_stage() -> XYPitchStage: y_infix="INSERT:Y", pitch_infix="INSERT:ROTY", ) + + +@devices.factory() +def high_field_magnet() -> HighFieldMagnet: + return HighFieldMagnet( + prefix=f"{PREFIX.beamline_prefix}-EA-SMC-01:", + ) diff --git a/src/dodal/devices/beamlines/i10_1/__init__.py b/src/dodal/devices/beamlines/i10_1/__init__.py index b562d0a9a59..1f6b94f0cdf 100644 --- a/src/dodal/devices/beamlines/i10_1/__init__.py +++ b/src/dodal/devices/beamlines/i10_1/__init__.py @@ -1,9 +1,11 @@ from .electromagnet.magnet import ElectromagnetMagnetField from .electromagnet.stages import ElectromagnetStage +from .high_field_magnet.high_field_magnet import HighFieldMagnet from .scaler_cards import I10JScalerCard __all__ = [ "ElectromagnetMagnetField", "I10JScalerCard", "ElectromagnetStage", + "HighFieldMagnet", ] diff --git a/src/dodal/devices/i10_1/electromagnet/__init__.py b/src/dodal/devices/beamlines/i10_1/high_field_magnet/__init__.py similarity index 100% rename from src/dodal/devices/i10_1/electromagnet/__init__.py rename to src/dodal/devices/beamlines/i10_1/high_field_magnet/__init__.py diff --git a/src/dodal/devices/beamlines/i10_1/high_field_magnet/high_field_magnet.py b/src/dodal/devices/beamlines/i10_1/high_field_magnet/high_field_magnet.py new file mode 100644 index 00000000000..d9edce66494 --- /dev/null +++ b/src/dodal/devices/beamlines/i10_1/high_field_magnet/high_field_magnet.py @@ -0,0 +1,79 @@ +from ophyd_async.core import ( + FlyMotorInfo, + StandardReadable, + StandardReadableFormat, + StrictEnum, + SubsetEnum, + WatchableAsyncStatus, +) +from ophyd_async.epics.core import epics_signal_r, epics_signal_rw, epics_signal_w + + +class HighFieldMangetSweepTypes(StrictEnum): + FAST = "Fast" + SLOW = "Slow" + + +class HighFieldMagnetStatus(SubsetEnum): + HOLD = "Hold" + TO_SETPOINT = "To Setpoint" + TO_ZERO = "To Zero" + CLAMP = "Clamp" + + +class HighFieldMagnetStatusRBV(SubsetEnum): + HOLD = "Hold" + TO_SETPOINT = "To Setpoint" + TO_ZERO = "To Zero" + CLAMPED = "Clamped" + + +class HighFieldMagnet( + StandardReadable, + # Locatable[float], + # Stoppable, + # Flyable, + # Preparable, + # Subscribable[float], +): + def __init__(self, prefix: str, name: str = "") -> None: + with self.add_children_as_readables(StandardReadableFormat.CONFIG_SIGNAL): + self.sweeprate = epics_signal_rw( + float, + read_pv=prefix + "RBV:FIELDSWEEPRATE", + write_pv=prefix + "SET:FIELDSWEEPRATE", + ) + self.sweep_type = epics_signal_rw( + HighFieldMangetSweepTypes, + read_pv=prefix + "STS:SWEEPMODE:TYPE", + write_pv=prefix + "SET:SWEEPMODE:TYPE", + ) + self.set_move_readback = epics_signal_r( + HighFieldMagnetStatusRBV, + read_pv=prefix + "STS:ACTIVITY", + ) + with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL): + self.user_readback = epics_signal_r(float, prefix + "RBV:DEMANDFIELD") + + self.set_move = epics_signal_w( + HighFieldMagnetStatus, + write_pv=prefix + "SET:ACTIVITY", + ) + self.user_setpoint = epics_signal_rw( + float, + read_pv=prefix + "RBV:SETPOINTFIELD", + write_pv=prefix + "SET:SETPOINTFIELD", + ) + + self._set_success = True + + self._fly_info: FlyMotorInfo | None = None + + self._fly_status: WatchableAsyncStatus | None = None + + super().__init__(name=name) + + def set_name(self, name: str, *, child_name_separator: str | None = None) -> None: + super().set_name(name, child_name_separator=child_name_separator) + # Readback should be named the same as its parent in read() + self.user_readback.set_name(name) diff --git a/src/dodal/devices/i10_1/__init__.py b/src/dodal/devices/i10_1/__init__.py deleted file mode 100644 index c00fcca7fa5..00000000000 --- a/src/dodal/devices/i10_1/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from .electromagnet.current_amp import ElectromagnetSR570 -from .electromagnet.magnet import ElectromagnetMagnetField -from .electromagnet.stages import ElectromagnetStage -from .scaler_cards import I10JScalerCard - -__all__ = [ - "ElectromagnetSR570", - "ElectromagnetMagnetField", - "I10JScalerCard", - "ElectromagnetStage", -] diff --git a/src/dodal/devices/i10_1/electromagnet/current_amp.py b/src/dodal/devices/i10_1/electromagnet/current_amp.py deleted file mode 100644 index 39f433ec5bd..00000000000 --- a/src/dodal/devices/i10_1/electromagnet/current_amp.py +++ /dev/null @@ -1,16 +0,0 @@ -from ophyd_async.core import Device - -from dodal.devices.current_amplifiers import ( - SR570, -) - - -class ElectromagnetSR570(Device): - def __init__(self, prefix: str, name: str = "") -> None: - self.ca1 = SR570( - prefix + "-08:", - ) - self.ca2 = SR570( - prefix + "-09:", - ) - super().__init__(name) diff --git a/src/dodal/devices/i10_1/electromagnet/magnet.py b/src/dodal/devices/i10_1/electromagnet/magnet.py deleted file mode 100644 index 2ce31f84f9f..00000000000 --- a/src/dodal/devices/i10_1/electromagnet/magnet.py +++ /dev/null @@ -1,16 +0,0 @@ -from ophyd_async.core import StandardReadable -from ophyd_async.epics.core import epics_signal_rw - - -class ElectromagnetMagnetField(StandardReadable): - def __init__( - self, - prefix: str, - name: str = "", - ): - with self.add_children_as_readables(): - self.field = epics_signal_rw( - float, write_pv=prefix + "FIELD", read_pv=prefix + "FIELD:RBV" - ) - self.current = epics_signal_rw(float, prefix + "DMD") - super().__init__(name=name) diff --git a/src/dodal/devices/i10_1/electromagnet/stages.py b/src/dodal/devices/i10_1/electromagnet/stages.py deleted file mode 100644 index a8c66b12909..00000000000 --- a/src/dodal/devices/i10_1/electromagnet/stages.py +++ /dev/null @@ -1,14 +0,0 @@ -from ophyd_async.core import StandardReadable -from ophyd_async.epics.motor import Motor - - -class ElectromagnetStage(StandardReadable): - def __init__( - self, - prefix: str, - name: str = "", - ): - with self.add_children_as_readables(): - self.y = Motor(prefix + "Y") - self.pitch = Motor(prefix + "PITCH") - super().__init__(name=name) diff --git a/src/dodal/devices/i10_1/high_field_magnet/__init__.py b/src/dodal/devices/i10_1/high_field_magnet/__init__.py deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/src/dodal/devices/i10_1/scaler_cards.py b/src/dodal/devices/i10_1/scaler_cards.py deleted file mode 100644 index f467765b088..00000000000 --- a/src/dodal/devices/i10_1/scaler_cards.py +++ /dev/null @@ -1,12 +0,0 @@ -from ophyd_async.core import Device - -from dodal.devices.current_amplifiers import StruckScaler - - -class I10JScalerCard(Device): - def __init__(self, prefix, name: str = "") -> None: - self.mon = StruckScaler(prefix=prefix, suffix=".S17") - self.tey = StruckScaler(prefix=prefix, suffix=".S18") - self.fy = StruckScaler(prefix=prefix, suffix=".S19") - self.fy2 = StruckScaler(prefix=prefix, suffix=".S20") - super().__init__(name)