Skip to content
This repository has been archived by the owner on Sep 2, 2024. It is now read-only.

Commit

Permalink
Merge pull request #1349 from DiamondLightSource/dodal_397_update_to_…
Browse files Browse the repository at this point in the history
…use_ophyd_async_undulator

Update to use ophyd_async undulator_dcm
  • Loading branch information
DominicOram authored May 7, 2024
2 parents f55ac3f + 6e7cd29 commit cf2873b
Show file tree
Hide file tree
Showing 20 changed files with 69 additions and 67 deletions.
2 changes: 1 addition & 1 deletion setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ install_requires =
xarray
doct
databroker
dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@af32f10f9536af91c69f1770f93754fa4220d766
dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@6864607ad8cf5415fa63cafa0a8a7ff955471eeb
pydantic<2.0 # See https://github.com/DiamondLightSource/hyperion/issues/774
scipy
pyzmq<25 # See https://github.com/DiamondLightSource/hyperion/issues/1103
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import json

import bluesky.plan_stubs as bps
from dodal.devices.DCM import DCM
from dodal.devices.focusing_mirror import (
FocusingMirror,
MirrorStripe,
VFMMirrorVoltages,
)
from dodal.devices.undulator_dcm import UndulatorDCM
from dodal.devices.util.adjuster_plans import lookup_table_adjuster
from dodal.devices.util.lookup_tables import (
linear_interpolation_lut,
Expand Down Expand Up @@ -68,7 +68,7 @@ def adjust_mirror_stripe(


def adjust_dcm_pitch_roll_vfm_from_lut(
dcm: DCM,
undulator_dcm: UndulatorDCM,
vfm: FocusingMirror,
vfm_mirror_voltages: VFMMirrorVoltages,
energy_kev,
Expand All @@ -80,11 +80,12 @@ def adjust_dcm_pitch_roll_vfm_from_lut(
feedback from making unnecessary corrections while beam is being adjusted."""

# DCM Pitch
dcm = undulator_dcm.dcm
LOGGER.info(f"Adjusting DCM and VFM for {energy_kev} keV")
bragg_deg = yield from bps.rd(dcm.bragg_in_degrees.user_readback)
LOGGER.info(f"Read Bragg angle = {bragg_deg} degrees")
dcm_pitch_adjuster = lookup_table_adjuster(
linear_interpolation_lut(dcm.dcm_pitch_converter_lookup_table_path),
linear_interpolation_lut(undulator_dcm.dcm_pitch_converter_lookup_table_path),
dcm.pitch_in_mrad,
bragg_deg,
)
Expand All @@ -94,15 +95,15 @@ def adjust_dcm_pitch_roll_vfm_from_lut(

# DCM Roll
dcm_roll_adjuster = lookup_table_adjuster(
linear_interpolation_lut(dcm.dcm_roll_converter_lookup_table_path),
linear_interpolation_lut(undulator_dcm.dcm_roll_converter_lookup_table_path),
dcm.roll_in_mrad,
bragg_deg,
)
yield from dcm_roll_adjuster(DCM_GROUP)
LOGGER.info("Waiting for DCM roll adjust to complete...")

# DCM Perp pitch
offset_mm = dcm.fixed_offset_mm
offset_mm = undulator_dcm.dcm_fixed_offset_mm
LOGGER.info(f"Adjusting DCM offset to {offset_mm} mm")
yield from bps.abs_set(dcm.offset_in_mm, offset_mm, group=DCM_GROUP)

Expand Down
2 changes: 1 addition & 1 deletion src/hyperion/device_setup_plans/read_hardware_for_setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import bluesky.plan_stubs as bps
from dodal.devices.aperturescatterguard import ApertureScatterguard
from dodal.devices.attenuator import Attenuator
from dodal.devices.DCM import DCM
from dodal.devices.dcm import DCM
from dodal.devices.eiger import EigerDetector
from dodal.devices.flux import Flux
from dodal.devices.robot import BartRobot
Expand Down
2 changes: 1 addition & 1 deletion src/hyperion/experiment_plans/flyscan_xray_centre_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
)
from dodal.devices.attenuator import Attenuator
from dodal.devices.backlight import Backlight
from dodal.devices.DCM import DCM
from dodal.devices.dcm import DCM
from dodal.devices.eiger import EigerDetector
from dodal.devices.fast_grid_scan import FastGridScan
from dodal.devices.fast_grid_scan import set_fast_grid_scan_params as set_flyscan_params
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from dodal.devices.aperturescatterguard import ApertureScatterguard
from dodal.devices.attenuator import Attenuator
from dodal.devices.backlight import Backlight
from dodal.devices.DCM import DCM
from dodal.devices.dcm import DCM
from dodal.devices.detector.detector_motion import DetectorMotion
from dodal.devices.eiger import EigerDetector
from dodal.devices.fast_grid_scan import FastGridScan
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from dodal.devices.aperturescatterguard import AperturePositions, ApertureScatterguard
from dodal.devices.attenuator import Attenuator
from dodal.devices.backlight import Backlight
from dodal.devices.DCM import DCM
from dodal.devices.dcm import DCM
from dodal.devices.detector.det_resolution import resolution
from dodal.devices.detector.detector_motion import DetectorMotion
from dodal.devices.eiger import EigerDetector
Expand Down
2 changes: 1 addition & 1 deletion src/hyperion/experiment_plans/rotation_scan_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from dodal.devices.aperturescatterguard import ApertureScatterguard
from dodal.devices.attenuator import Attenuator
from dodal.devices.backlight import Backlight
from dodal.devices.DCM import DCM
from dodal.devices.dcm import DCM
from dodal.devices.detector import DetectorParams
from dodal.devices.detector.detector_motion import DetectorMotion
from dodal.devices.eiger import EigerDetector
Expand Down
12 changes: 6 additions & 6 deletions src/hyperion/experiment_plans/set_energy_plan.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
"""Plan that comprises:
* Disable feedback
* Set undulator energy to the requested amount
* Adjust DCM and mirrors for the new energy
* reenable feedback
* Disable feedback
* Set undulator energy to the requested amount
* Adjust DCM and mirrors for the new energy
* reenable feedback
"""

import dataclasses
Expand All @@ -11,7 +11,7 @@
from bluesky import plan_stubs as bps
from bluesky.utils import Msg
from dodal.devices.attenuator import Attenuator
from dodal.devices.DCM import DCM
from dodal.devices.dcm import DCM
from dodal.devices.focusing_mirror import FocusingMirror, VFMMirrorVoltages
from dodal.devices.undulator_dcm import UndulatorDCM
from dodal.devices.xbpm_feedback import XBPMFeedback
Expand Down Expand Up @@ -42,7 +42,7 @@ def _set_energy_plan(
):
yield from bps.abs_set(composite.undulator_dcm, energy_kev, group=UNDULATOR_GROUP)
yield from dcm_pitch_roll_mirror_adjuster.adjust_dcm_pitch_roll_vfm_from_lut(
composite.dcm,
composite.undulator_dcm,
composite.vfm,
composite.vfm_mirror_voltages,
energy_kev,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ def _handle_ispyb_hardware_read(self, doc) -> Sequence[ScanDataInfo]:
SynchrotronMode,
)
hwscan_data_collection_info = DataCollectionInfo(
undulator_gap1=doc["data"]["undulator_current_gap"],
undulator_gap1=doc["data"]["undulator-current_gap"],
synchrotron_mode=synchrotron_mode.value,
slitgap_horizontal=doc["data"]["s4_slit_gaps_xgap"],
slitgap_vertical=doc["data"]["s4_slit_gaps_ygap"],
Expand Down Expand Up @@ -177,8 +177,8 @@ def _handle_ispyb_transmission_flux_read(self, doc) -> Sequence[ScanDataInfo]:
if transmission := doc["data"]["attenuator_actual_transmission"]:
# Ispyb wants the transmission in a percentage, we use fractions
hwscan_data_collection_info.transmission = transmission * 100
if doc["data"]["dcm_energy_in_kev"]:
energy_ev = doc["data"]["dcm_energy_in_kev"] * 1000
if doc["data"]["dcm-energy_in_kev"]:
energy_ev = doc["data"]["dcm-energy_in_kev"] * 1000
hwscan_data_collection_info.wavelength = convert_eV_to_angstrom(energy_ev)
scan_data_infos = self.populate_info_for_update(
hwscan_data_collection_info, self.params
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ def activity_gated_event(self, doc: Event):
self.writer.beam,
self.writer.attenuator,
) = create_beam_and_attenuator_parameters(
data["dcm_energy_in_kev"],
data["dcm-energy_in_kev"],
data["flux_flux_reading"],
data["attenuator_actual_transmission"],
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def activity_gated_event(self, doc: Event) -> Event | None:
nexus_writer.beam,
nexus_writer.attenuator,
) = create_beam_and_attenuator_parameters(
data["dcm_energy_in_kev"],
data["dcm-energy_in_kev"],
data["flux_flux_reading"],
data["attenuator_actual_transmission"],
)
Expand Down
26 changes: 14 additions & 12 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
)
from dodal.devices.attenuator import Attenuator
from dodal.devices.backlight import Backlight
from dodal.devices.DCM import DCM
from dodal.devices.dcm import DCM
from dodal.devices.detector.detector_motion import DetectorMotion
from dodal.devices.eiger import EigerDetector
from dodal.devices.fast_grid_scan import GridScanCompleteStatus
Expand Down Expand Up @@ -382,16 +382,10 @@ def xbpm_feedback(done_status):


@pytest.fixture
def dcm():
def dcm(RE):
dcm = i03.dcm(fake_with_ophyd_sim=True)
dcm.energy_in_kev.user_readback.sim_put(12.7) # type: ignore
dcm.pitch_in_mrad.user_setpoint._use_limits = False
dcm.dcm_roll_converter_lookup_table_path = (
"tests/test_data/test_beamline_dcm_roll_converter.txt"
)
dcm.dcm_pitch_converter_lookup_table_path = (
"tests/test_data/test_beamline_dcm_pitch_converter.txt"
)
set_sim_value(dcm.energy_in_kev.user_readback, 12.7)
set_sim_value(dcm.pitch_in_mrad.user_readback, 1)
return dcm


Expand All @@ -418,8 +412,16 @@ def vfm_mirror_voltages():


@pytest.fixture
def undulator_dcm():
yield i03.undulator_dcm(fake_with_ophyd_sim=True)
def undulator_dcm(RE, dcm):
undulator_dcm = i03.undulator_dcm(fake_with_ophyd_sim=True)
undulator_dcm.dcm = dcm
undulator_dcm.dcm_roll_converter_lookup_table_path = (
"tests/test_data/test_beamline_dcm_roll_converter.txt"
)
undulator_dcm.dcm_pitch_converter_lookup_table_path = (
"tests/test_data/test_beamline_dcm_pitch_converter.txt"
)
yield undulator_dcm
beamline_utils.clear_devices()


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
import pytest
from bluesky.run_engine import RunEngine
from dodal.beamlines.beamline_parameters import GDABeamlineParameters
from dodal.devices.DCM import DCM
from dodal.devices.focusing_mirror import (
FocusingMirror,
MirrorStripe,
MirrorVoltageDemand,
VFMMirrorVoltages,
)
from dodal.devices.undulator_dcm import UndulatorDCM
from ophyd import EpicsSignal
from ophyd.sim import NullStatus
from ophyd.status import Status
Expand Down Expand Up @@ -154,7 +154,7 @@ def test_adjust_mirror_stripe(


def test_adjust_dcm_pitch_roll_vfm_from_lut(
dcm: DCM,
undulator_dcm: UndulatorDCM,
vfm: FocusingMirror,
vfm_mirror_voltages: VFMMirrorVoltages,
beamline_parameters: GDABeamlineParameters,
Expand All @@ -163,32 +163,32 @@ def test_adjust_dcm_pitch_roll_vfm_from_lut(
sim_run_engine.add_handler_for_callback_subscribes()
sim_run_engine.add_handler(
"read",
"dcm_bragg_in_degrees",
lambda msg: {"dcm_bragg_in_degrees": {"value": 5.0}},
"dcm-bragg_in_degrees",
lambda msg: {"dcm-bragg_in_degrees": {"value": 5.0}},
)

messages = sim_run_engine.simulate_plan(
adjust_dcm_pitch_roll_vfm_from_lut(dcm, vfm, vfm_mirror_voltages, 7.5)
adjust_dcm_pitch_roll_vfm_from_lut(undulator_dcm, vfm, vfm_mirror_voltages, 7.5)
)

messages = sim_run_engine.assert_message_and_return_remaining(
messages,
lambda msg: msg.command == "set"
and msg.obj.name == "dcm_pitch_in_mrad"
and msg.obj.name == "dcm-pitch_in_mrad"
and abs(msg.args[0] - -0.75859) < 1e-5
and msg.kwargs["group"] == "DCM_GROUP",
)
messages = sim_run_engine.assert_message_and_return_remaining(
messages[1:],
lambda msg: msg.command == "set"
and msg.obj.name == "dcm_roll_in_mrad"
and msg.obj.name == "dcm-roll_in_mrad"
and abs(msg.args[0] - 4.0) < 1e-5
and msg.kwargs["group"] == "DCM_GROUP",
)
messages = sim_run_engine.assert_message_and_return_remaining(
messages[1:],
lambda msg: msg.command == "set"
and msg.obj.name == "dcm_offset_in_mm"
and msg.obj.name == "dcm-offset_in_mm"
and msg.args == (25.6,)
and msg.kwargs["group"] == "DCM_GROUP",
)
Expand Down
4 changes: 2 additions & 2 deletions tests/unit_tests/experiment_plans/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ def make_event_doc(data, descriptor="abc123") -> Event:


BASIC_PRE_SETUP_DOC = {
"undulator_current_gap": 0,
"undulator-current_gap": 0,
"synchrotron-synchrotron_mode": SynchrotronMode.USER,
"s4_slit_gaps_xgap": 0,
"s4_slit_gaps_ygap": 0,
Expand All @@ -52,7 +52,7 @@ def make_event_doc(data, descriptor="abc123") -> Event:
BASIC_POST_SETUP_DOC = {
"attenuator_actual_transmission": 0,
"flux_flux_reading": 10,
"dcm_energy_in_kev": 11.105,
"dcm-energy_in_kev": 11.105,
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ def test_read_hardware_for_ispyb_updates_from_ophyd_devices(
):
undulator_test_value = 1.234

fake_fgs_composite.undulator.current_gap.sim_put(undulator_test_value) # type: ignore
set_sim_value(fake_fgs_composite.undulator.current_gap, undulator_test_value)

synchrotron_test_value = SynchrotronMode.USER
set_sim_value(
Expand All @@ -200,8 +200,9 @@ def test_read_hardware_for_ispyb_updates_from_ophyd_devices(
)

current_energy_kev_test_value = 12.05
fake_fgs_composite.dcm.energy_in_kev.user_readback.sim_put( # type: ignore
current_energy_kev_test_value
set_sim_value(
fake_fgs_composite.dcm.energy_in_kev.user_readback,
current_energy_kev_test_value,
)

xgap_test_value = 0.1234
Expand Down Expand Up @@ -248,7 +249,7 @@ def test_read_hardware_for_ispyb_updates_from_ophyd_devices(
assert_event(
test_ispyb_callback.activity_gated_event.mock_calls[0], # pyright: ignore
{
"undulator_current_gap": undulator_test_value,
"undulator-current_gap": undulator_test_value,
"synchrotron-synchrotron_mode": synchrotron_test_value.value,
"s4_slit_gaps_xgap": xgap_test_value,
"s4_slit_gaps_ygap": ygap_test_value,
Expand All @@ -259,7 +260,7 @@ def test_read_hardware_for_ispyb_updates_from_ophyd_devices(
{
"attenuator_actual_transmission": transmission_test_value,
"flux_flux_reading": flux_test_value,
"dcm_energy_in_kev": current_energy_kev_test_value,
"dcm-energy_in_kev": current_energy_kev_test_value,
},
)
# fmt: on
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ def test_read_hardware_for_ispyb_updates_from_ophyd_devices(
):
undulator_test_value = 1.234

fake_fgs_composite.undulator.current_gap.sim_put(undulator_test_value) # type: ignore
set_sim_value(fake_fgs_composite.undulator.current_gap, undulator_test_value)

synchrotron_test_value = SynchrotronMode.USER
set_sim_value(
Expand Down Expand Up @@ -193,7 +193,7 @@ def test_read_hardware_for_ispyb_updates_from_ophyd_devices(
assert_event(
test_ispyb_callback.activity_gated_event.mock_calls[0], # pyright: ignore
{
"undulator_current_gap": undulator_test_value,
"undulator-current_gap": undulator_test_value,
"synchrotron-synchrotron_mode": synchrotron_test_value.value,
"s4_slit_gaps_xgap": xgap_test_value,
"s4_slit_gaps_ygap": ygap_test_value,
Expand Down
Loading

0 comments on commit cf2873b

Please sign in to comment.