Skip to content
Open
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
28 changes: 0 additions & 28 deletions src/i19_bluesky/eh2/move_detector_stage.py

This file was deleted.

8 changes: 6 additions & 2 deletions src/i19_bluesky/serial/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
"""All things serial go here."""

from i19_bluesky.serial.example_trigger_plan_zebra_vs_panda import run_zebra_test
from i19_bluesky.serial.run_serial_with_panda import run_serial_with_panda
from i19_bluesky.serial.example_zebra_plans.example_trigger_plan_zebra_vs_panda import (
run_zebra_test,
)
from i19_bluesky.serial.run_panda_plans.run_serial_with_panda import (
run_serial_with_panda,
)

__all__ = ["run_zebra_test", "run_serial_with_panda"]
78 changes: 78 additions & 0 deletions src/i19_bluesky/serial/device_setup_plans/diffractometer_plans.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import bluesky.plan_stubs as bps
from bluesky.utils import MsgGenerator
from dodal.devices.beamlines.i19.diffractometer import (
DetectorMotion,
FourCircleDiffractometer,
)

from i19_bluesky.log import LOGGER


def setup_diffractometer(
diffractometer: FourCircleDiffractometer,
phi_start: float,
phi_steps: int,
exposure_time: float,
) -> MsgGenerator:
"""Setup phi start posistion and velocity on the diffractometer.

Args:
diffractometer (FourCircleDiffractometer): The diffractometer ophyd device.
phi_start (float): Starting phi position.
phi_steps (int): Number of images to take.
exposure_time(float): Time between images, in seconds."""
yield from bps.abs_set(diffractometer.phi, phi_start)
velocity = phi_steps / exposure_time
yield from bps.abs_set(diffractometer.phi.velocity, velocity)


def move_diffractometer_back(
diffractometer: FourCircleDiffractometer, phi_start: float
) -> MsgGenerator:
LOGGER.info("Move diffractometer back to start position")
yield from bps.abs_set(diffractometer.phi, phi_start, wait=True)


def move_stage_x_and_z(
well_x: float,
well_z: float,
diffractometer: FourCircleDiffractometer,
):
"""Moves the sample stage a distance of well_x and well_z in the respective\
directions. Order dependant on position of detector when \
called.
Args:
well_x : Float
Distance to move in X axis
well_z : Float
Distance to move in Z axis
diffractometer : FourCircleDiffractometer object
"""
yield from bps.mv(diffractometer.x, well_x)
yield from bps.mv(diffractometer.z, well_z)


def move_detector_stage(
detector_stage: DetectorMotion, det_z: float, two_theta: float = 0.0
):
"""Moves the Detector a distance of det_z and two_theta in the respective\
directions. Order dependant on position of detector when \
called.
Args:
detector_stage : DetectorMotion object
det_z : Float
Distance to move in Z axis
two_theta : Float
(default 0.0)
Distance to move in Two-Theta axis
"""
current_location = yield from bps.rd(detector_stage.det_z)
if current_location >= det_z:
# if the current value is higher than the requested one, first attempt to move
# 2theta and then det_z
yield from bps.mv(detector_stage.two_theta, two_theta)
yield from bps.mv(detector_stage.det_z, det_z)
else:
# otherwise first move det_z and then 2theta
yield from bps.mv(detector_stage.det_z, det_z)
yield from bps.mv(detector_stage.two_theta, two_theta)
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,15 @@

from i19_bluesky.eh2.zebra_arming_plan import arm_zebra, disarm_zebra
from i19_bluesky.log import LOGGER
from i19_bluesky.serial.panda_serial_collection import setup_diffractometer
from i19_bluesky.serial.run_serial_with_panda import move_diffractometer_back
from i19_bluesky.serial.zebra_collection_setup_plan import setup_zebra_for_collection
from i19_bluesky.serial.device_setup_plans.diffractometer_plans import (
move_diffractometer_back,
)
from i19_bluesky.serial.example_zebra_plans.zebra_collection_setup_plan import (
setup_zebra_for_collection,
)
from i19_bluesky.serial.run_panda_plans.panda_serial_collection import (
setup_diffractometer,
)

RAMP = 0.5

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from ophyd_async.fastcs.panda import HDFPanda

from i19_bluesky.log import LOGGER
from i19_bluesky.serial.panda_stubs import (
from i19_bluesky.serial.panda_setup_plans.panda_stubs import (
DeviceSettingsConstants,
arm_panda,
generate_panda_seq_table,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,47 +7,39 @@
from ophyd_async.fastcs.panda import HDFPanda

from i19_bluesky.log import LOGGER
from i19_bluesky.serial.panda_setup_plans import reset_panda, setup_panda_for_rotation
from i19_bluesky.serial.panda_stubs import arm_panda, disarm_panda


def setup_diffractometer(
diffractometer: FourCircleDiffractometer,
phi_start: float,
phi_steps: int,
exposure_time: float,
) -> MsgGenerator:
"""Setup phi start posistion and velocity on the diffractometer.

Args:
diffractometer (FourCircleDiffractometer): The diffractometer ophyd device.
phi_start (float): Starting phi position.
phi_steps (int): Number of images to take.
exposure_time(float): Time between images, in seconds."""
yield from bps.abs_set(diffractometer.phi, phi_start)
velocity = phi_steps / exposure_time
yield from bps.abs_set(diffractometer.phi.velocity, velocity)
from i19_bluesky.serial.device_setup_plans.diffractometer_plans import (
move_stage_x_and_z,
setup_diffractometer,
)
from i19_bluesky.serial.panda_setup_plans.panda_setup_plans import (
reset_panda,
setup_panda_for_rotation,
)
from i19_bluesky.serial.panda_setup_plans.panda_stubs import arm_panda, disarm_panda


def trigger_panda(
params: dict,
phi_start: float,
phi_end: float,
phi_steps: int,
exposure_time: float,
panda: HDFPanda,
diffractometer: FourCircleDiffractometer,
panda: HDFPanda,
eiger: EigerDetector,
) -> MsgGenerator:
"""Trigger panda for collection in both directions.

Args:
params (dict): Input coordinates of the selected wells
(Key=well (int), value=X,Y,Z coordinates (list of ints))
phi_start (float): Starting phi position, in degrees.
phi_end (float): Ending phi position, in degrees.
phi_steps (int): Number of images to take.
exposure_time (float): Time between images, in seconds.
panda (HDFPanda): The fastcs PandA ophyd device.
diffractometer (FourCircleDiffractometer): The diffractometer ophyd device.
eiger (EigerDriverIO): The eiger device
panda (HDFPanda): The fastcs PandA ophyd device.
eiger (EigerDetector): The eiger detector device
"""
yield from setup_diffractometer(
diffractometer,
Expand All @@ -64,11 +56,19 @@ def trigger_panda(
)
LOGGER.info("Arm panda and move phi")
yield from arm_panda(panda)
yield from bps.abs_set(diffractometer.phi, phi_end, wait=True)
LOGGER.info("Arm eiger")
yield from bps.trigger(eiger.drv.detector.arm)
yield from bps.sleep(2.0)
yield from bps.abs_set(diffractometer.phi, phi_start, wait=True)
for well_num, coords in params.items():
yield from move_stage_x_and_z(coords[0], coords[2], diffractometer)
LOGGER.info(f"Moved to well {well_num}")
if well_num % 2 == 0:
LOGGER.info(f"Rotating {phi_start} to {phi_end}")
yield from bps.abs_set(diffractometer.phi, phi_end, wait=True)
yield from bps.sleep(2.0)
else:
LOGGER.info(f"Rotating {phi_end} to {phi_start}")
yield from bps.abs_set(diffractometer.phi, phi_start, wait=True)
yield from bps.sleep(2.0)
LOGGER.info("Disarm panda")
yield from disarm_panda(panda)
LOGGER.info("Disarm eiger")
Expand All @@ -82,10 +82,3 @@ def abort_panda(
LOGGER.warning("ABORT")
yield from bps.abs_set(diffractometer.phi.motor_stop, 1, wait=True)
yield from disarm_panda(panda)


def move_diffractometer_back(
diffractometer: FourCircleDiffractometer, phi_start: float
) -> MsgGenerator:
LOGGER.info("Move diffractometer back to start position")
yield from bps.abs_set(diffractometer.phi, phi_start, wait=True)
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,20 @@
from ophyd_async.fastcs.eiger import EigerDetector
from ophyd_async.fastcs.panda import HDFPanda

from i19_bluesky.serial.panda_serial_collection import (
abort_panda,
from i19_bluesky.serial.device_setup_plans.diffractometer_plans import (
move_diffractometer_back,
)
from i19_bluesky.serial.run_panda_plans.panda_serial_collection import (
abort_panda,
trigger_panda,
)
from i19_bluesky.serial.setup_beamline_pre_collection import (
from i19_bluesky.serial.setup_beamline_plans.setup_beamline_pre_collection import (
setup_beamline_before_collection,
)


def setup_then_trigger_panda(
params: dict,
detector_z: float,
detector_two_theta: float,
phi_start: float,
Expand Down Expand Up @@ -52,6 +55,7 @@ def setup_then_trigger_panda(
backlight : Backlight controller object
pinhole_collimator : Pinhole Collimator control object
panda (HDFPanda): The fastcs PandA ophyd device.
eiger (EigerDetector): the eiger detector device.
"""
yield from setup_beamline_before_collection(
detector_z,
Expand All @@ -62,11 +66,19 @@ def setup_then_trigger_panda(
pincol,
)
yield from trigger_panda(
phi_start, phi_end, phi_steps, exposure_time, panda, eh2_diffractometer, eiger
params,
phi_start,
phi_end,
phi_steps,
exposure_time,
eh2_diffractometer,
panda,
eiger,
)


def run_serial_with_panda(
params: dict,
detector_z: float,
detector_two_theta: float,
phi_start: float,
Expand All @@ -82,6 +94,7 @@ def run_serial_with_panda(
) -> MsgGenerator:
yield from bpp.contingency_wrapper(
setup_then_trigger_panda(
params,
detector_z,
detector_two_theta,
phi_start,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
)

from i19_bluesky.eh2.backlight_plan import move_backlight_out
from i19_bluesky.eh2.move_detector_stage import move_detector_stage
from i19_bluesky.eh2.pincol_control_plans import move_pin_col_to_requested_in_position
from i19_bluesky.log import LOGGER
from i19_bluesky.serial.device_setup_plans.diffractometer_plans import (
move_detector_stage,
)


def setup_beamline_before_collection(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,32 @@
)
from ophyd_async.core import get_mock_put

from i19_bluesky.eh2.move_detector_stage import move_detector_stage
from i19_bluesky.serial.device_setup_plans.diffractometer_plans import (
move_detector_stage,
move_diffractometer_back,
setup_diffractometer,
)


async def test_move_diffractometer_back(
eh2_diffractometer: FourCircleDiffractometer,
RE: RunEngine,
):
RE(move_diffractometer_back(eh2_diffractometer, 4.0))
mock_phi = get_mock_put(eh2_diffractometer.phi.user_setpoint)
mock_phi.assert_called_once_with(4.0)


async def test_setup_diffractometer(
eh2_diffractometer: FourCircleDiffractometer,
RE: RunEngine,
):
RE(setup_diffractometer(eh2_diffractometer, 6.0, 10, 2))
mock_phi = get_mock_put(eh2_diffractometer.phi.user_setpoint)
mock_phi.assert_called_once_with(6.0)

mock_phi_velocity = get_mock_put(eh2_diffractometer.phi.velocity)
mock_phi_velocity.assert_called_once_with(5.0)


@pytest.mark.parametrize(
Expand Down
21 changes: 21 additions & 0 deletions tests/unit_tests/serial/device_setup_plans/test_move_x_and_z.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import pytest
from bluesky.run_engine import RunEngine
from dodal.devices.beamlines.i19.diffractometer import (
FourCircleDiffractometer,
)

from i19_bluesky.serial.device_setup_plans.diffractometer_plans import (
move_stage_x_and_z,
)


@pytest.mark.parametrize("detector_x,detector_z", [(200, 0), (100, 30), (80, 90)])
async def test_move_stage_x_and_z(
detector_x: float,
detector_z: float,
eh2_diffractometer: FourCircleDiffractometer,
RE: RunEngine,
):
RE(move_stage_x_and_z(detector_x, detector_z, eh2_diffractometer))
assert await eh2_diffractometer.x.user_readback.get_value() == detector_x
assert await eh2_diffractometer.z.user_readback.get_value() == detector_z
Loading