Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ description = "Ophyd devices and other utils that could be used across DLS beaml
dependencies = [
"click",
"ophyd",
"ophyd-async[ca,pva]>=0.19.3",
"ophyd-async[ca,pva]>=0.20.0",
"bluesky>=1.14.5",
"pyepics",
"pillow",
Expand Down Expand Up @@ -51,7 +51,7 @@ dev = [
# Commented out due to dependency version conflict with pydantic 1.x
# "copier",
"myst-parser",
"ophyd_async[sim]>=v0.19.3",
"ophyd_async[sim]>=0.20.0",
"pre-commit",
"psutil",
"pydata-sphinx-theme>=0.12",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ def __init__(
read_pv=prefix + "RBV:SETPOINTFIELD",
write_pv=prefix + "SET:SETPOINTFIELD",
)
self._set_success = True
self._fly_info: FlyMagInfo | None = None
self._fly_status: WatchableAsyncStatus | None = None

Expand Down
2 changes: 0 additions & 2 deletions src/dodal/devices/electron_analyser/mbs/mbs_detector.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ def __init__(
driver.slices,
driver.iterations,
driver.total_steps,
driver.acquire_time,
driver.acquire_period,
driver.total_time,
driver.energy_axis,
driver.angle_axis,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ def __init__(
driver.energy_step,
driver.pass_energy,
driver.slices,
driver.acquire_time,
driver.iterations,
driver.total_steps,
driver.total_time,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,6 @@ def __init__(
driver.slices,
driver.iterations,
driver.total_steps,
driver.acquire_time,
driver.total_time,
driver.energy_axis,
driver.angle_axis,
Expand Down
3 changes: 1 addition & 2 deletions src/dodal/devices/insertion_device/apple2_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,10 @@ def __init__(
btm_outer = phase.btm_outer.user_readback
else:
# If locked phase axes make the locked phase 0.
top_inner = btm_outer = soft_signal_rw(float, initial_value=0.0)
top_inner = btm_outer = 0.0

with self.add_children_as_readables(StandardReadableFormat.HINTED_SIGNAL):
# Hardware backed read/write for polarisation.

self.polarisation = derived_signal_rw(
raw_to_derived=self._read_pol,
set_derived=self._set_pol,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def configure_arm_trigger_and_disarm_detector(
yield from bps.kickoff(eiger, wait=True)
LOGGER.info(f"Kickoff Eiger: {time.time() - start}s")
start = time.time()
yield from bps.trigger(eiger.detector.trigger, wait=True)
yield from bps.trigger(eiger.detector.trigger_, wait=True)
LOGGER.info(f"Triggering Eiger: {time.time() - start}s")
start = time.time()
yield from bps.complete(eiger, wait=True)
Expand Down
13 changes: 8 additions & 5 deletions src/dodal/testing/fixtures/devices/apple2.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,9 @@ def mock_config_client() -> ConfigClient:

mock_config_client.get_file_contents = MagicMock(spec=["get_file_contents"])

def my_side_effect(file_path, reset_cached_result) -> str:
def my_side_effect(
file_path, desired_return_type, reset_cached_result, force_parser
) -> str:
assert reset_cached_result is True
with open(file_path) as f:
return f.read()
Expand Down Expand Up @@ -109,8 +111,9 @@ async def mock_locked_apple2(
mock_id_gap: UndulatorGap,
mock_locked_phase_axes: UndulatorLockedPhaseAxes,
) -> Apple2[UndulatorLockedPhaseAxes]:
mock_locked_apple2 = Apple2[UndulatorLockedPhaseAxes](
id_gap=mock_id_gap,
id_phase=mock_locked_phase_axes,
)
with init_devices(mock=True):
mock_locked_apple2 = Apple2[UndulatorLockedPhaseAxes](
id_gap=mock_id_gap,
id_phase=mock_locked_phase_axes,
)
return mock_locked_apple2
12 changes: 12 additions & 0 deletions tests/devices/beamlines/b07_1/test_ccmc.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,24 @@ async def test_read_config_includes(mock_ccmc: ChannelCutMonochromator):
f"{mock_ccmc.name}-_xyz-x-motor_egu": partial_reading(""),
f"{mock_ccmc.name}-_xyz-x-offset": partial_reading(0.0),
f"{mock_ccmc.name}-_xyz-x-velocity": partial_reading(1000.0),
f"{mock_ccmc.name}-_xyz-x-encoder_resolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-x-motor_resolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-x-steps_per_revolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-x-units_per_revolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-y-motor_egu": partial_reading(""),
f"{mock_ccmc.name}-_xyz-y-offset": partial_reading(0.0),
f"{mock_ccmc.name}-_xyz-y-velocity": partial_reading(1000.0),
f"{mock_ccmc.name}-_xyz-y-encoder_resolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-y-motor_resolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-y-steps_per_revolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-y-units_per_revolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-z-motor_egu": partial_reading(""),
f"{mock_ccmc.name}-_xyz-z-offset": partial_reading(0.0),
f"{mock_ccmc.name}-_xyz-z-velocity": partial_reading(1000.0),
f"{mock_ccmc.name}-_xyz-z-encoder_resolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-z-motor_resolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-z-steps_per_revolution": partial_reading(0),
f"{mock_ccmc.name}-_xyz-z-units_per_revolution": partial_reading(0),
},
)

Expand Down
25 changes: 15 additions & 10 deletions tests/devices/beamlines/i06_shared/test_i06_apple2controller.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from unittest.mock import AsyncMock, MagicMock

import pytest
from ophyd_async.core import init_devices

from dodal.devices.beamlines.i06_shared import I06Apple2Controller
from dodal.devices.insertion_device import (
Expand All @@ -13,16 +14,19 @@
)
from dodal.devices.insertion_device.energy_motor_lookup import EnergyMotorLookup

# add mock_id_gap, mock_phase and mock_phase_axes
pytest_plugins = ["dodal.testing.fixtures.devices.apple2"]


@pytest.fixture
async def mock_apple2(
mock_id_gap: UndulatorGap,
mock_phase_axes: UndulatorPhaseAxes,
) -> Apple2[UndulatorPhaseAxes]:
mock_apple2 = Apple2[UndulatorPhaseAxes](
id_gap=mock_id_gap,
id_phase=mock_phase_axes,
)
with init_devices(mock=True):
mock_apple2 = Apple2[UndulatorPhaseAxes](
id_gap=mock_id_gap, id_phase=mock_phase_axes
)
return mock_apple2


Expand All @@ -38,12 +42,13 @@ async def mock_i06_controller(
mock_inverse_gap_energy_motor_lut.find_value_in_lookup_table = MagicMock(
return_value=100
)
mock_i06_controller = I06Apple2Controller(
apple2=mock_apple2,
gap_energy_motor_lut=mock_gap_energy_motor_lut,
phase_energy_motor_lut=mock_phase_energy_motor_lut,
inverse_gap_energy_motor_lut=mock_inverse_gap_energy_motor_lut,
)
with init_devices(mock=True):
mock_i06_controller = I06Apple2Controller(
apple2=mock_apple2,
gap_energy_motor_lut=mock_gap_energy_motor_lut,
phase_energy_motor_lut=mock_phase_energy_motor_lut,
inverse_gap_energy_motor_lut=mock_inverse_gap_energy_motor_lut,
)
return mock_i06_controller


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
from ophyd_async.core import (
DEFAULT_TIMEOUT,
AsyncStatus,
get_mock_put,
init_devices,
set_mock_value,
)
Expand Down Expand Up @@ -36,11 +37,9 @@ async def test_locate(high_field_magnet: HighFieldMagnet):


async def test_stop_success(high_field_magnet: HighFieldMagnet):
set_mock_value(high_field_magnet.user_readback, 7.5)
set_mock_value(high_field_magnet.user_readback, 1.5)
initial_val = await high_field_magnet.user_readback.get_value()
await high_field_magnet.stop()
assert high_field_magnet._set_success is False
assert await high_field_magnet.user_setpoint.get_value() == 1.5
get_mock_put(high_field_magnet.user_setpoint).assert_awaited_once_with(initial_val)


async def test_set_raises_runtime_error_when_stopped(
Expand Down Expand Up @@ -151,15 +150,6 @@ async def test_read(high_field_magnet: HighFieldMagnet):
)


async def test_tolerance_logic_stop_clears_set_success_and_restores_setpoint(
high_field_magnet: HighFieldMagnet,
):
set_mock_value(high_field_magnet.movable_logic.readback, 1.5)
await high_field_magnet.stop()
assert high_field_magnet._set_success is False
assert await high_field_magnet.movable_logic.setpoint.get_value() == 1.5


async def test_tolerance_logic_calculate_timeout_with_zero_speed(
high_field_magnet: HighFieldMagnet,
):
Expand Down
32 changes: 32 additions & 0 deletions tests/devices/beamlines/i22/test_dcm.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ async def test_configuration(dcm: DCM):
"dcm-bragg_in_degrees-motor_egu": partial_reading(""),
"dcm-bragg_in_degrees-offset": partial_reading(0.0),
"dcm-bragg_in_degrees-velocity": partial_reading(1000.0),
"dcm-bragg_in_degrees-encoder_resolution": partial_reading(0),
"dcm-bragg_in_degrees-motor_resolution": partial_reading(0),
"dcm-bragg_in_degrees-steps_per_revolution": partial_reading(0),
"dcm-bragg_in_degrees-units_per_revolution": partial_reading(0),
"dcm-crystal_1_d_spacing": partial_reading(0.31356),
"dcm-crystal_1_reflection": partial_reading([1, 1, 1]),
"dcm-crystal_1_type": partial_reading("silicon"),
Expand All @@ -106,23 +110,51 @@ async def test_configuration(dcm: DCM):
"dcm-energy_in_keV-motor_egu": partial_reading(""),
"dcm-energy_in_keV-offset": partial_reading(0.0),
"dcm-energy_in_keV-velocity": partial_reading(1000.0),
"dcm-energy_in_keV-encoder_resolution": partial_reading(0),
"dcm-energy_in_keV-motor_resolution": partial_reading(0),
"dcm-energy_in_keV-steps_per_revolution": partial_reading(0),
"dcm-energy_in_keV-units_per_revolution": partial_reading(0),
"dcm-offset_in_mm-motor_egu": partial_reading(""),
"dcm-offset_in_mm-offset": partial_reading(0.0),
"dcm-offset_in_mm-velocity": partial_reading(1000.0),
"dcm-offset_in_mm-encoder_resolution": partial_reading(0),
"dcm-offset_in_mm-motor_resolution": partial_reading(0),
"dcm-offset_in_mm-steps_per_revolution": partial_reading(0),
"dcm-offset_in_mm-units_per_revolution": partial_reading(0),
"dcm-perp-motor_egu": partial_reading(""),
"dcm-perp-offset": partial_reading(0.0),
"dcm-perp-velocity": partial_reading(1000.0),
"dcm-perp-encoder_resolution": partial_reading(0),
"dcm-perp-motor_resolution": partial_reading(0),
"dcm-perp-steps_per_revolution": partial_reading(0),
"dcm-perp-units_per_revolution": partial_reading(0),
"dcm-wavelength_in_a-motor_egu": partial_reading(""),
"dcm-wavelength_in_a-offset": partial_reading(0.0),
"dcm-wavelength_in_a-velocity": partial_reading(1000.0),
"dcm-wavelength_in_a-encoder_resolution": partial_reading(0),
"dcm-wavelength_in_a-motor_resolution": partial_reading(0),
"dcm-wavelength_in_a-steps_per_revolution": partial_reading(0),
"dcm-wavelength_in_a-units_per_revolution": partial_reading(0),
"dcm-xtal_1-roll_in_mrad-motor_egu": partial_reading(""),
"dcm-xtal_1-roll_in_mrad-offset": partial_reading(0.0),
"dcm-xtal_1-roll_in_mrad-velocity": partial_reading(1000.0),
"dcm-xtal_1-roll_in_mrad-encoder_resolution": partial_reading(0),
"dcm-xtal_1-roll_in_mrad-motor_resolution": partial_reading(0),
"dcm-xtal_1-roll_in_mrad-steps_per_revolution": partial_reading(0),
"dcm-xtal_1-roll_in_mrad-units_per_revolution": partial_reading(0),
"dcm-xtal_2-pitch_in_mrad-motor_egu": partial_reading(""),
"dcm-xtal_2-pitch_in_mrad-offset": partial_reading(0.0),
"dcm-xtal_2-pitch_in_mrad-velocity": partial_reading(1000.0),
"dcm-xtal_2-pitch_in_mrad-encoder_resolution": partial_reading(0),
"dcm-xtal_2-pitch_in_mrad-motor_resolution": partial_reading(0),
"dcm-xtal_2-pitch_in_mrad-steps_per_revolution": partial_reading(0),
"dcm-xtal_2-pitch_in_mrad-units_per_revolution": partial_reading(0),
"dcm-xtal_2-roll_in_mrad-motor_egu": partial_reading(""),
"dcm-xtal_2-roll_in_mrad-offset": partial_reading(0.0),
"dcm-xtal_2-roll_in_mrad-velocity": partial_reading(1000.0),
"dcm-xtal_2-roll_in_mrad-encoder_resolution": partial_reading(0),
"dcm-xtal_2-roll_in_mrad-motor_resolution": partial_reading(0),
"dcm-xtal_2-roll_in_mrad-steps_per_revolution": partial_reading(0),
"dcm-xtal_2-roll_in_mrad-units_per_revolution": partial_reading(0),
},
)
2 changes: 2 additions & 0 deletions tests/devices/electron_analyser/base/test_base_detector.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from tests.devices.electron_analyser.helper_util import (
generate_fixture_regions_pair,
load_b07_specs_test_seq,
load_i05_mbs_test_xml_seq,
load_i09_vgscienta_test_seq,
)

Expand Down Expand Up @@ -81,6 +82,7 @@ def test_analyser_detector_set_called_region_logic_setup_with_region(
[
pytest.param("ew4000", load_i09_vgscienta_test_seq()),
pytest.param("b07b_specs150", load_b07_specs_test_seq()),
pytest.param("i05_mbs_analyser", load_i05_mbs_test_xml_seq()),
],
indirect=["sim_detector"],
)
Expand Down
13 changes: 7 additions & 6 deletions tests/devices/insertion_device/test_apple2_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,12 +135,13 @@ async def mock_energy_readback_controller(
configured_phase: float,
configured_energy: float,
) -> DummyEnergyReadbackApple2Controller:
mock_locked_controller = DummyEnergyReadbackApple2Controller(
apple2=mock_locked_apple2,
gap_energy_motor_converter=lambda value, pol: configured_gap,
phase_energy_motor_converter=lambda value, pol: configured_phase,
inverse_gap_energy_motor_converter=lambda value, pol: configured_energy,
)
with init_devices(mock=True):
mock_locked_controller = DummyEnergyReadbackApple2Controller(
apple2=mock_locked_apple2,
gap_energy_motor_converter=lambda value, pol: configured_gap,
phase_energy_motor_converter=lambda value, pol: configured_phase,
inverse_gap_energy_motor_converter=lambda value, pol: configured_energy,
)
return mock_locked_controller


Expand Down
11 changes: 6 additions & 5 deletions tests/devices/insertion_device/test_apple2_undulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -422,11 +422,12 @@ async def mock_locked_controller(
configured_gap: float,
configured_phase: float,
) -> DummyLockedApple2Controller:
mock_locked_controller = DummyLockedApple2Controller(
apple2=mock_locked_apple2,
gap_energy_motor_converter=lambda value, pol: configured_gap,
phase_energy_motor_converter=lambda value, pol: configured_phase,
)
with init_devices(mock=True):
mock_locked_controller = DummyLockedApple2Controller(
apple2=mock_locked_apple2,
gap_energy_motor_converter=lambda value, pol: configured_gap,
phase_energy_motor_converter=lambda value, pol: configured_phase,
)
return mock_locked_controller


Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import pytest
from ophyd_async.core import (
init_devices,
set_mock_value,
)
from ophyd_async.core import init_devices, set_mock_value

from dodal.devices.beamlines.i05_shared import (
energy_to_gap_converter,
Expand Down
10 changes: 9 additions & 1 deletion tests/devices/test_undulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,10 @@ async def test_undulator_mm_config_default_parameters(undulator_in_mm: Undulator
"undulator_mm-gap_motor-motor_egu": partial_reading(""),
"undulator_mm-gap_motor-offset": partial_reading(0.0),
"undulator_mm-gap_motor-velocity": partial_reading(1000.0),
"undulator_mm-gap_motor-encoder_resolution": partial_reading(0),
"undulator_mm-gap_motor-motor_resolution": partial_reading(0),
"undulator_mm-gap_motor-steps_per_revolution": partial_reading(0),
"undulator_mm-gap_motor-units_per_revolution": partial_reading(0),
},
)

Expand Down Expand Up @@ -104,10 +108,14 @@ async def test_configuration_includes_configuration_fields(undulator: UndulatorI
{
"undulator-gap_motor-motor_egu": partial_reading(""),
"undulator-gap_motor-velocity": partial_reading(1000.0),
"undulator-gap_motor-offset": partial_reading(0.0),
"undulator-gap_motor-encoder_resolution": partial_reading(0),
"undulator-gap_motor-motor_resolution": partial_reading(0),
"undulator-gap_motor-steps_per_revolution": partial_reading(0),
"undulator-gap_motor-units_per_revolution": partial_reading(0),
"undulator-length": partial_reading(2.0),
"undulator-poles": partial_reading(80),
"undulator-gap_discrepancy_tolerance_mm": partial_reading(0.002),
"undulator-gap_motor-offset": partial_reading(0.0),
"undulator-undulator_period": partial_reading(27),
},
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
TriggerInfo,
callback_on_mock_execute,
get_mock,
init_devices,
set_mock_value,
)
from ophyd_async.fastcs.eiger import EigerDetector as FastEiger
Expand All @@ -21,8 +22,8 @@

@pytest.fixture
async def fake_eiger() -> FastEiger:
fake_eiger = FastEiger("", MagicMock())
await fake_eiger.connect(mock=True)
with init_devices(mock=True):
fake_eiger = FastEiger("", MagicMock())
set_mock_value(fake_eiger.detector.bit_depth_image, 32)
return fake_eiger

Expand Down Expand Up @@ -55,7 +56,7 @@ def set_detector_into_writing_state(*args, **kwargs) -> None:
def set_frames_written(*args, **kwargs) -> None:
set_mock_value(fake_eiger.od.fp.frames_written, 1)

callback_on_mock_execute(fake_eiger.detector.trigger, set_frames_written)
callback_on_mock_execute(fake_eiger.arm_when_ready, set_frames_written)

run_engine(
configure_arm_trigger_and_disarm_detector(
Expand Down
Loading
Loading