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

Commit

Permalink
Merge branch 'main' into dodal_398_ophyd_async_mirrors
Browse files Browse the repository at this point in the history
  • Loading branch information
DominicOram committed May 7, 2024
2 parents eedf016 + cf2873b commit 063a3ae
Show file tree
Hide file tree
Showing 26 changed files with 155 additions and 147 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@97793717bd98f2aaf274cb9ec82656a348db006a
dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@0ac0ad6131dd268b0e1693b2daf67cdc238b0e9d
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 (
FocusingMirrorWithStripes,
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 @@ -70,7 +70,7 @@ def adjust_mirror_stripe(


def adjust_dcm_pitch_roll_vfm_from_lut(
dcm: DCM,
undulator_dcm: UndulatorDCM,
vfm: FocusingMirrorWithStripes,
vfm_mirror_voltages: VFMMirrorVoltages,
energy_kev,
Expand All @@ -82,11 +82,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 @@ -96,15 +97,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
18 changes: 9 additions & 9 deletions src/hyperion/experiment_plans/oav_grid_detection_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,20 +145,20 @@ def grid_detection_plan(

upper_left = (tip_x_px, min_y)

yield from bps.abs_set(oav.snapshot.top_left_x, upper_left[0])
yield from bps.abs_set(oav.snapshot.top_left_y, upper_left[1])
yield from bps.abs_set(oav.snapshot.box_width, box_size_x_pixels)
yield from bps.abs_set(oav.snapshot.num_boxes_x, x_steps)
yield from bps.abs_set(oav.snapshot.num_boxes_y, y_steps)
yield from bps.abs_set(oav.grid_snapshot.top_left_x, upper_left[0])
yield from bps.abs_set(oav.grid_snapshot.top_left_y, upper_left[1])
yield from bps.abs_set(oav.grid_snapshot.box_width, box_size_x_pixels)
yield from bps.abs_set(oav.grid_snapshot.num_boxes_x, x_steps)
yield from bps.abs_set(oav.grid_snapshot.num_boxes_y, y_steps)

snapshot_filename = snapshot_template.format(angle=abs(angle))

yield from bps.abs_set(oav.snapshot.filename, snapshot_filename)
yield from bps.abs_set(oav.snapshot.directory, snapshot_dir)
yield from bps.trigger(oav.snapshot, wait=True)
yield from bps.abs_set(oav.grid_snapshot.filename, snapshot_filename)
yield from bps.abs_set(oav.grid_snapshot.directory, snapshot_dir)
yield from bps.trigger(oav.grid_snapshot, wait=True)
yield from bps.create(CONST.DESCRIPTORS.OAV_SNAPSHOT_TRIGGERED)

yield from bps.read(oav.snapshot)
yield from bps.read(oav.grid_snapshot)
yield from bps.read(smargon)
yield from bps.save()

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
4 changes: 2 additions & 2 deletions src/hyperion/experiment_plans/set_energy_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 FocusingMirrorWithStripes, 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 @@ -29,11 +29,11 @@ def __init__(

def event(self, doc: Event):
data = doc.get("data")
top_left_x_px = data["oav_snapshot_top_left_x"]
box_width_px = data["oav_snapshot_box_width"]
top_left_x_px = data["oav_grid_snapshot_top_left_x"]
box_width_px = data["oav_grid_snapshot_box_width"]
x_of_centre_of_first_box_px = top_left_x_px + box_width_px / 2

top_left_y_px = data["oav_snapshot_top_left_y"]
top_left_y_px = data["oav_grid_snapshot_top_left_y"]
y_of_centre_of_first_box_px = top_left_y_px + box_width_px / 2

smargon_omega = data["smargon_omega"]
Expand All @@ -54,7 +54,10 @@ def event(self, doc: Event):

self.start_positions.append(position_grid_start)
self.box_numbers.append(
(data["oav_snapshot_num_boxes_x"], data["oav_snapshot_num_boxes_y"])
(
data["oav_grid_snapshot_num_boxes_x"],
data["oav_grid_snapshot_num_boxes_y"],
)
)

self.x_step_size_mm = box_width_px * self.oav_params.micronsPerXPixel / 1000
Expand Down
31 changes: 16 additions & 15 deletions src/hyperion/external_interaction/callbacks/ispyb_callback_base.py
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 All @@ -130,24 +130,25 @@ def _handle_oav_snapshot_triggered(self, doc) -> Sequence[ScanDataInfo]:
data = doc["data"]
data_collection_id = None
data_collection_info = DataCollectionInfo(
xtal_snapshot1=data.get("oav_snapshot_last_path_full_overlay"),
xtal_snapshot2=data.get("oav_snapshot_last_path_outer"),
xtal_snapshot3=data.get("oav_snapshot_last_saved_path"),
xtal_snapshot1=data.get("oav_grid_snapshot_last_path_full_overlay"),
xtal_snapshot2=data.get("oav_grid_snapshot_last_path_outer"),
xtal_snapshot3=data.get("oav_grid_snapshot_last_saved_path"),
n_images=(
data["oav_snapshot_num_boxes_x"] * data["oav_snapshot_num_boxes_y"]
data["oav_grid_snapshot_num_boxes_x"]
* data["oav_grid_snapshot_num_boxes_y"]
),
)
microns_per_pixel_x = data["oav_snapshot_microns_per_pixel_x"]
microns_per_pixel_y = data["oav_snapshot_microns_per_pixel_y"]
microns_per_pixel_x = data["oav_grid_snapshot_microns_per_pixel_x"]
microns_per_pixel_y = data["oav_grid_snapshot_microns_per_pixel_y"]
data_collection_grid_info = DataCollectionGridInfo(
dx_in_mm=data["oav_snapshot_box_width"] * microns_per_pixel_x / 1000,
dy_in_mm=data["oav_snapshot_box_width"] * microns_per_pixel_y / 1000,
steps_x=data["oav_snapshot_num_boxes_x"],
steps_y=data["oav_snapshot_num_boxes_y"],
dx_in_mm=data["oav_grid_snapshot_box_width"] * microns_per_pixel_x / 1000,
dy_in_mm=data["oav_grid_snapshot_box_width"] * microns_per_pixel_y / 1000,
steps_x=data["oav_grid_snapshot_num_boxes_x"],
steps_y=data["oav_grid_snapshot_num_boxes_y"],
microns_per_pixel_x=microns_per_pixel_x,
microns_per_pixel_y=microns_per_pixel_y,
snapshot_offset_x_pixel=int(data["oav_snapshot_top_left_x"]),
snapshot_offset_y_pixel=int(data["oav_snapshot_top_left_y"]),
snapshot_offset_x_pixel=int(data["oav_grid_snapshot_top_left_x"]),
snapshot_offset_y_pixel=int(data["oav_grid_snapshot_top_left_y"]),
orientation=Orientation.HORIZONTAL,
snaked=True,
)
Expand Down Expand Up @@ -176,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
6 changes: 3 additions & 3 deletions src/hyperion/snapshot_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ def prepare_for_snapshot(backlight: Backlight, aperture: Aperture):

def take_snapshot(oav: OAV, snapshot_filename, snapshot_directory):
oav.wait_for_connection()
yield from bps.abs_set(oav.snapshot.filename, snapshot_filename)
yield from bps.abs_set(oav.snapshot.directory, snapshot_directory)
yield from bps.trigger(oav.snapshot, wait=True)
yield from bps.abs_set(oav.grid_snapshot.filename, snapshot_filename)
yield from bps.abs_set(oav.grid_snapshot.directory, snapshot_directory)
yield from bps.trigger(oav.grid_snapshot, wait=True)


@bpp.run_decorator()
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 (
FocusingMirrorWithStripes,
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 @@ -140,10 +140,10 @@ def test_adjust_mirror_stripe(
new_callable=_all_demands_accepted(vfm_mirror_voltages),
):
vfm.stripe.set = MagicMock(return_value=NullStatus())
vfm.apply_stripe.set = MagicMock()
vfm.apply_stripe.set = MagicMock() # type: ignore
parent = MagicMock()
parent.attach_mock(vfm.stripe.set, "stripe_set")
parent.attach_mock(vfm.apply_stripe.set, "apply_stripe")
parent.attach_mock(vfm.apply_stripe.set, "apply_stripe") # type: ignore

RE(adjust_mirror_stripe(energy_kev, vfm, vfm_mirror_voltages))

Expand All @@ -158,7 +158,7 @@ def test_adjust_mirror_stripe(


def test_adjust_dcm_pitch_roll_vfm_from_lut(
dcm: DCM,
undulator_dcm: UndulatorDCM,
vfm: FocusingMirrorWithStripes,
vfm_mirror_voltages: VFMMirrorVoltages,
beamline_parameters: GDABeamlineParameters,
Expand All @@ -167,32 +167,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
Loading

0 comments on commit 063a3ae

Please sign in to comment.