Source code for dodal.devices.beamlines.i24.focus_mirrors
from ophyd_async.core import StandardReadable, StrictEnum, derived_signal_r
from ophyd_async.epics.core import epics_signal_rw
[docs]
class HFocusMode(StrictEnum):
FOCUS_10 = "HMFMfocus10"
FOCUS_20D = "HMFMfocus20d"
FOCUS_30D = "HMFMfocus30d"
FOCUS_50D = "HMFMfocus50d"
FOCUS_1050D = "HMFMfocus1030d"
FOCUS_3010D = "HMFMfocus3010d"
[docs]
class VFocusMode(StrictEnum):
FOCUS_10 = "VMFMfocus10"
FOCUS_20D = "VMFMfocus20d"
FOCUS_30D = "VMFMfocus30d"
FOCUS_50D = "VMFMfocus50d"
FOCUS_1030D = "VMFMfocus1030d"
FOCUS_3010D = "VMFMfocus3010d"
BEAM_SIZES = {
"focus10": [7, 7],
"focus20d": [20, 20],
"focus30d": [30, 30],
"focus50d": [50, 50],
"focus1030d": [10, 30],
"focus3010d": [30, 10],
}
[docs]
class FocusMirrorsMode(StandardReadable):
"""A small device to read the focus mode and work out the beam size."""
def __init__(self, prefix: str, name: str = "") -> None:
self.horizontal = epics_signal_rw(HFocusMode, prefix + "G1:TARGETAPPLY")
self.vertical = epics_signal_rw(VFocusMode, prefix + "G0:TARGETAPPLY")
with self.add_children_as_readables():
self.beam_size_x = derived_signal_r(
self._get_beam_size_x, horizontal=self.horizontal, derived_units="um"
)
self.beam_size_y = derived_signal_r(
self._get_beam_size_y, vertical=self.vertical, derived_units="um"
)
super().__init__(name)
def _get_beam_size_x(self, horizontal: HFocusMode) -> int:
beam_x = BEAM_SIZES[horizontal.removeprefix("HMFM")][0]
return beam_x
def _get_beam_size_y(self, vertical: VFocusMode) -> int:
beam_y = BEAM_SIZES[vertical.removeprefix("VMFM")][1]
return beam_y