mx-bluesky 1.5.9__py3-none-any.whl → 1.5.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. mx_bluesky/_version.py +2 -2
  2. mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py +2 -2
  3. mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/do_darks.py +78 -0
  4. mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/__init__.py +1 -0
  5. mx_bluesky/beamlines/i24/jungfrau_commissioning/{do_external_acquisition.py → plan_stubs/do_external_acquisition.py} +7 -6
  6. mx_bluesky/beamlines/i24/jungfrau_commissioning/{do_internal_acquisition.py → plan_stubs/do_internal_acquisition.py} +4 -3
  7. mx_bluesky/beamlines/i24/jungfrau_commissioning/{plan_utils.py → plan_stubs/plan_utils.py} +21 -28
  8. mx_bluesky/common/device_setup_plans/robot_load_unload.py +2 -2
  9. mx_bluesky/common/device_setup_plans/setup_oav.py +1 -1
  10. mx_bluesky/common/device_setup_plans/xbpm_feedback.py +4 -4
  11. mx_bluesky/common/experiment_plans/common_flyscan_xray_centre_plan.py +3 -3
  12. mx_bluesky/common/experiment_plans/inner_plans/do_fgs.py +1 -1
  13. mx_bluesky/common/experiment_plans/inner_plans/read_hardware.py +3 -3
  14. mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py +2 -2
  15. mx_bluesky/common/parameters/device_composites.py +2 -2
  16. mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py +6 -7
  17. mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py +52 -38
  18. mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py +2 -2
  19. mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py +1 -1
  20. mx_bluesky/hyperion/parameters/device_composites.py +2 -2
  21. mx_bluesky/hyperion/parameters/rotation.py +4 -6
  22. mx_bluesky/hyperion/utils/context.py +6 -1
  23. {mx_bluesky-1.5.9.dist-info → mx_bluesky-1.5.10.dist-info}/METADATA +4 -4
  24. {mx_bluesky-1.5.9.dist-info → mx_bluesky-1.5.10.dist-info}/RECORD +29 -27
  25. /mx_bluesky/beamlines/i24/jungfrau_commissioning/{__init__.py → experiment_plans/__init__.py} +0 -0
  26. {mx_bluesky-1.5.9.dist-info → mx_bluesky-1.5.10.dist-info}/WHEEL +0 -0
  27. {mx_bluesky-1.5.9.dist-info → mx_bluesky-1.5.10.dist-info}/entry_points.txt +0 -0
  28. {mx_bluesky-1.5.9.dist-info → mx_bluesky-1.5.10.dist-info}/licenses/LICENSE +0 -0
  29. {mx_bluesky-1.5.9.dist-info → mx_bluesky-1.5.10.dist-info}/top_level.txt +0 -0
mx_bluesky/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '1.5.9'
32
- __version_tuple__ = version_tuple = (1, 5, 9)
31
+ __version__ = version = '1.5.10'
32
+ __version_tuple__ = version_tuple = (1, 5, 10)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -9,7 +9,7 @@ from dodal.common import inject
9
9
  from dodal.devices.aperturescatterguard import ApertureScatterguard, ApertureValue
10
10
  from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator
11
11
  from dodal.devices.backlight import Backlight
12
- from dodal.devices.common_dcm import BaseDCM
12
+ from dodal.devices.common_dcm import DoubleCrystalMonochromator
13
13
  from dodal.devices.detector.detector_motion import DetectorMotion
14
14
  from dodal.devices.eiger import EigerDetector
15
15
  from dodal.devices.fast_grid_scan import (
@@ -97,7 +97,7 @@ def i04_grid_detect_then_xray_centre(
97
97
  attenuator: BinaryFilterAttenuator = inject("attenuator"),
98
98
  backlight: Backlight = inject("backlight"),
99
99
  beamstop: Beamstop = inject("beamstop"),
100
- dcm: BaseDCM = inject("dcm"),
100
+ dcm: DoubleCrystalMonochromator = inject("dcm"),
101
101
  zebra_fast_grid_scan: ZebraFastGridScanThreeD = inject("zebra_fast_grid_scan"),
102
102
  flux: Flux = inject("flux"),
103
103
  oav: OAV = inject("oav"),
@@ -0,0 +1,78 @@
1
+ import bluesky.preprocessors as bpp
2
+ from bluesky import plan_stubs as bps
3
+ from bluesky.utils import MsgGenerator
4
+ from dodal.common import inject
5
+ from dodal.devices.i24.commissioning_jungfrau import CommissioningJungfrau
6
+ from ophyd_async.core import WatchableAsyncStatus
7
+ from ophyd_async.fastcs.jungfrau import (
8
+ AcquisitionType,
9
+ GainMode,
10
+ create_jungfrau_pedestal_triggering_info,
11
+ )
12
+ from pydantic import PositiveInt
13
+
14
+ from mx_bluesky.beamlines.i24.jungfrau_commissioning.plan_stubs.plan_utils import (
15
+ fly_jungfrau,
16
+ override_file_path,
17
+ )
18
+ from mx_bluesky.common.utils.log import LOGGER
19
+
20
+ PEDESTAL_DARKS_RUN = "PEDESTAL DARKS RUN"
21
+
22
+
23
+ def do_pedestal_darks(
24
+ exp_time_s: float = 0.001,
25
+ pedestal_frames: PositiveInt = 20,
26
+ pedestal_loops: PositiveInt = 200,
27
+ jungfrau: CommissioningJungfrau = inject("jungfrau"),
28
+ path_of_output_file: str | None = None,
29
+ ) -> MsgGenerator[WatchableAsyncStatus]:
30
+ """Acquire darks in pedestal mode, using dynamic gain mode. This calibrates the offsets
31
+ for the jungfrau, and must be performed before acquiring real data in dynamic gain mode.
32
+
33
+ When Bluesky triggers the detector in pedestal mode, with pedestal frames F and pedestal loops L,
34
+ the acquisition is managed at the driver level to:
35
+ 1. Acquire F-1 frames in dynamic gain mode
36
+ 2. Acquire 1 frame in ForceSwitchG1 gain mode
37
+ 3. Repeat steps 1-2 L times
38
+ 4. Do the first three steps a second time, except use ForceSwitchG2 instead of ForceSwitchG1
39
+ during step 2.
40
+
41
+ Args:
42
+ exp_time_s: Length of detector exposure for each frame.
43
+ pedestal_frames: Number of frames acquired per pedestal loop.
44
+ pedestal_loops: Number of times to acquire a set of pedestal_frames
45
+ jungfrau: Jungfrau device
46
+ path_of_output_file: Absolute path of the detector file output, including file name. If None, then use the PathProvider
47
+ set during Jungfrau device instantiation
48
+ """
49
+
50
+ @bpp.set_run_key_decorator(PEDESTAL_DARKS_RUN)
51
+ @bpp.run_decorator(md={"subplan_name": PEDESTAL_DARKS_RUN})
52
+ @bpp.stage_decorator([jungfrau])
53
+ def _do_decorated_plan():
54
+ if path_of_output_file:
55
+ override_file_path(jungfrau, path_of_output_file)
56
+
57
+ trigger_info = create_jungfrau_pedestal_triggering_info(
58
+ exp_time_s, pedestal_frames, pedestal_loops
59
+ )
60
+ LOGGER.info(
61
+ "Jungfrau will be triggered in pedestal mode and in dynamic gain mode"
62
+ )
63
+ yield from bps.mv(
64
+ jungfrau.drv.acquisition_type,
65
+ AcquisitionType.PEDESTAL,
66
+ jungfrau.drv.gain_mode,
67
+ GainMode.DYNAMIC,
68
+ )
69
+ return (
70
+ yield from fly_jungfrau(
71
+ jungfrau,
72
+ trigger_info,
73
+ wait=True,
74
+ log_on_percentage_prefix="Jungfrau pedestal dynamic gain mode darks triggers recieved",
75
+ )
76
+ )
77
+
78
+ return (yield from _do_decorated_plan())
@@ -0,0 +1 @@
1
+ """Jungfrau plan stubs should be used as part of Jungfrau experiment plans, and should not be run in isolation."""
@@ -9,7 +9,7 @@ from ophyd_async.fastcs.jungfrau import (
9
9
  )
10
10
  from pydantic import PositiveInt
11
11
 
12
- from mx_bluesky.beamlines.i24.jungfrau_commissioning.plan_utils import (
12
+ from mx_bluesky.beamlines.i24.jungfrau_commissioning.plan_stubs.plan_utils import (
13
13
  fly_jungfrau,
14
14
  override_file_path,
15
15
  )
@@ -18,14 +18,15 @@ from mx_bluesky.beamlines.i24.jungfrau_commissioning.plan_utils import (
18
18
  def do_external_acquisition(
19
19
  exp_time_s: float,
20
20
  total_triggers: PositiveInt = 1,
21
- output_file_name: str | None = None,
21
+ output_file_path: str | None = None,
22
22
  wait: bool = False,
23
23
  jungfrau: CommissioningJungfrau = inject("commissioning_jungfrau"),
24
24
  ) -> MsgGenerator[WatchableAsyncStatus]:
25
25
  """
26
26
  Kickoff external triggering on the Jungfrau, and optionally wait for completion.
27
27
 
28
- Must be used within an open Bluesky run.
28
+ Any plan using this stub MUST stage the Jungfrau with the stage_decorator and open a run,
29
+ ideally using the run_decorator.
29
30
 
30
31
  Args:
31
32
  exp_time_s: Length of detector exposure for each frame.
@@ -36,9 +37,9 @@ def do_external_acquisition(
36
37
  wait: Optionally block until data collection is complete.
37
38
  """
38
39
 
39
- if output_file_name:
40
- override_file_path(jungfrau, output_file_name)
40
+ if output_file_path:
41
+ override_file_path(jungfrau, output_file_path)
41
42
 
42
43
  trigger_info = create_jungfrau_external_triggering_info(total_triggers, exp_time_s)
43
- status = yield from fly_jungfrau(jungfrau, trigger_info, wait)
44
+ status = yield from fly_jungfrau(jungfrau, trigger_info, wait=wait)
44
45
  return status
@@ -9,7 +9,7 @@ from ophyd_async.fastcs.jungfrau import (
9
9
  )
10
10
  from pydantic import PositiveInt
11
11
 
12
- from mx_bluesky.beamlines.i24.jungfrau_commissioning.plan_utils import (
12
+ from mx_bluesky.beamlines.i24.jungfrau_commissioning.plan_stubs.plan_utils import (
13
13
  fly_jungfrau,
14
14
  override_file_path,
15
15
  )
@@ -26,7 +26,8 @@ def do_internal_acquisition(
26
26
  Kickoff internal triggering on the Jungfrau, and optionally wait for completion. Frames
27
27
  per trigger will trigger as rapidly as possible according to the Jungfrau deadtime.
28
28
 
29
- Must be used within an open Bluesky run.
29
+ Any plan using this stub MUST stage the Jungfrau with the stage_decorator and open a run,
30
+ ideally using the run_decorator.
30
31
 
31
32
  Args:
32
33
  exp_time_s: Length of detector exposure for each frame.
@@ -42,5 +43,5 @@ def do_internal_acquisition(
42
43
  override_file_path(jungfrau, path_of_output_file)
43
44
 
44
45
  trigger_info = create_jungfrau_internal_triggering_info(total_frames, exp_time_s)
45
- status = yield from fly_jungfrau(jungfrau, trigger_info, wait)
46
+ status = yield from fly_jungfrau(jungfrau, trigger_info, wait=wait)
46
47
  return status
@@ -2,7 +2,6 @@ from pathlib import PurePath
2
2
  from typing import cast
3
3
 
4
4
  import bluesky.plan_stubs as bps
5
- import bluesky.preprocessors as bpp
6
5
  from bluesky.utils import MsgGenerator
7
6
  from dodal.common.watcher_utils import log_on_percentage_complete
8
7
  from dodal.devices.i24.commissioning_jungfrau import CommissioningJungfrau
@@ -19,44 +18,38 @@ JF_COMPLETE_GROUP = "JF complete"
19
18
 
20
19
 
21
20
  def fly_jungfrau(
22
- jungfrau: CommissioningJungfrau, trigger_info: TriggerInfo, wait: bool = False
21
+ jungfrau: CommissioningJungfrau,
22
+ trigger_info: TriggerInfo,
23
+ wait: bool = False,
24
+ log_on_percentage_prefix="Jungfrau data collection triggers recieved",
23
25
  ) -> MsgGenerator[WatchableAsyncStatus]:
24
26
  """Stage, prepare, and kickoff Jungfrau with a configured TriggerInfo. Optionally wait
25
27
  for completion.
26
28
 
27
- Note that this plan doesn't include unstaging of the Jungfrau, and a run must be open
28
- before this plan is called.
29
+ Any plan using this stub MUST stage the Jungfrau with the stage_decorator and open a run,
30
+ ideally using the run_decorator.
29
31
 
30
32
  Args:
31
33
  jungfrau: Jungfrau device.
32
- trigger_info: TriggerInfo which should be acquired using jungfrau util functions create_jungfrau_internal_triggering_info
33
- or create_jungfrau_external_triggering_info.
34
+ trigger_info: TriggerInfo which should be acquired using jungfrau util functions.
34
35
  wait: Optionally block until data collection is complete.
36
+ log_on_percentage_prefix: String that will be appended to the "percentage completion" logging message.
35
37
  """
36
38
 
37
- @bpp.contingency_decorator(
38
- except_plan=lambda _: (yield from bps.unstage(jungfrau, wait=True))
39
- )
40
- def _fly_with_unstage_contingency():
41
- yield from bps.stage(jungfrau)
42
- LOGGER.info("Setting up detector...")
43
- yield from bps.prepare(jungfrau, trigger_info, wait=True)
44
- LOGGER.info("Detector prepared. Starting acquisition")
45
- yield from bps.kickoff(jungfrau, wait=True)
46
- LOGGER.info("Waiting for acquisition to complete...")
47
- status = yield from bps.complete(jungfrau, group=JF_COMPLETE_GROUP)
48
-
49
- # StandardDetector.complete converts regular status to watchable status,
50
- # but bluesky plan stubs can't see this currently
51
- status = cast(WatchableAsyncStatus, status)
52
- log_on_percentage_complete(
53
- status, "Jungfrau data collection triggers recieved", 10
54
- )
55
- if wait:
56
- yield from bps.wait(JF_COMPLETE_GROUP)
57
- return status
39
+ LOGGER.info("Preparing detector...")
40
+ yield from bps.prepare(jungfrau, trigger_info, wait=True)
41
+ LOGGER.info("Detector prepared. Starting acquisition")
42
+ yield from bps.kickoff(jungfrau, wait=True)
43
+ LOGGER.info("Waiting for acquisition to complete...")
44
+ status = yield from bps.complete(jungfrau, group=JF_COMPLETE_GROUP)
58
45
 
59
- return (yield from _fly_with_unstage_contingency())
46
+ # StandardDetector.complete converts regular status to watchable status,
47
+ # but bluesky plan stubs can't see this currently
48
+ status = cast(WatchableAsyncStatus, status)
49
+ log_on_percentage_complete(status, log_on_percentage_prefix, 10)
50
+ if wait:
51
+ yield from bps.wait(JF_COMPLETE_GROUP)
52
+ return status
60
53
 
61
54
 
62
55
  def override_file_path(jungfrau: CommissioningJungfrau, path_of_output_file: str):
@@ -7,7 +7,7 @@ from dodal.devices.aperturescatterguard import ApertureScatterguard, ApertureVal
7
7
  from dodal.devices.motors import XYZStage
8
8
  from dodal.devices.robot import BartRobot
9
9
  from dodal.devices.smargon import CombinedMove, Smargon, StubPosition
10
- from dodal.plan_stubs.motor_utils import MoveTooLarge, home_and_reset_wrapper
10
+ from dodal.plan_stubs.motor_utils import MoveTooLargeError, home_and_reset_wrapper
11
11
 
12
12
  from mx_bluesky.common.parameters.constants import (
13
13
  DocDescriptorNames,
@@ -39,7 +39,7 @@ def wait_for_smargon_not_disabled(smargon: Smargon, timeout=60):
39
39
 
40
40
  def _raise_exception_if_moved_out_of_cryojet(exception):
41
41
  yield from bps.null()
42
- if isinstance(exception, MoveTooLarge):
42
+ if isinstance(exception, MoveTooLargeError):
43
43
  raise Exception(
44
44
  f"Moving {exception.axis} back to {exception.position} after \
45
45
  robot load would move it out of the cryojet. The max safe \
@@ -1,7 +1,7 @@
1
1
  from functools import partial
2
2
 
3
3
  import bluesky.plan_stubs as bps
4
- from dodal.devices.areadetector.plugins.CAM import ColorMode
4
+ from dodal.devices.areadetector.plugins.cam import ColorMode
5
5
  from dodal.devices.oav.oav_detector import OAV
6
6
  from dodal.devices.oav.oav_parameters import OAVParameters
7
7
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
@@ -16,7 +16,7 @@ def unpause_xbpm_feedback_and_set_transmission_to_1(
16
16
  the beam in position
17
17
  attenuator (BinaryFilterAttenuator): The attenuator used to set transmission
18
18
  """
19
- yield from bps.mv(xbpm_feedback.pause_feedback, Pause.RUN, attenuator, 1.0) # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
19
+ yield from bps.mv(xbpm_feedback.pause_feedback, Pause.RUN, attenuator, 1.0)
20
20
 
21
21
 
22
22
  def check_and_pause_feedback(
@@ -35,11 +35,11 @@ def check_and_pause_feedback(
35
35
  turning XBPM feedback off.
36
36
 
37
37
  """
38
- yield from bps.mv(attenuator, 1.0) # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
38
+ yield from bps.mv(attenuator, 1.0)
39
39
  LOGGER.info("Waiting for XBPM feedback to be stable")
40
40
  yield from bps.trigger(xbpm_feedback, wait=True)
41
41
  LOGGER.info(
42
42
  f"XPBM feedback in position, pausing and setting transmission to {desired_transmission_fraction}"
43
43
  )
44
- yield from bps.mv(xbpm_feedback.pause_feedback, Pause.PAUSE) # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
45
- yield from bps.mv(attenuator, desired_transmission_fraction) # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
44
+ yield from bps.mv(xbpm_feedback.pause_feedback, Pause.PAUSE)
45
+ yield from bps.mv(attenuator, desired_transmission_fraction)
@@ -13,7 +13,7 @@ from dodal.common.beamlines.commissioning_mode import read_commissioning_mode
13
13
  from dodal.devices.fast_grid_scan import (
14
14
  FastGridScanCommon,
15
15
  FastGridScanThreeD,
16
- GridScanInvalidException,
16
+ GridScanInvalidError,
17
17
  )
18
18
  from dodal.devices.zocalo import ZocaloResults
19
19
  from dodal.devices.zocalo.zocalo_results import (
@@ -275,14 +275,14 @@ def run_gridscan(
275
275
  try:
276
276
  yield from beamline_specific.set_flyscan_params_plan()
277
277
  except FailedStatus as e:
278
- if isinstance(e.__cause__, GridScanInvalidException):
278
+ if isinstance(e.__cause__, GridScanInvalidError):
279
279
  raise SampleException(
280
280
  "Scan invalid - gridscan not valid for detected pin position"
281
281
  ) from e
282
282
 
283
283
  LOGGER.info("Waiting for arming to finish")
284
284
  yield from bps.wait(PlanGroupCheckpointConstants.GRID_READY_FOR_DC)
285
- yield from bps.stage(fgs_composite.eiger) # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
285
+ yield from bps.stage(fgs_composite.eiger, wait=True)
286
286
 
287
287
  yield from kickoff_and_complete_gridscan(
288
288
  beamline_specific.fgs_motors,
@@ -103,7 +103,7 @@ def kickoff_and_complete_gridscan(
103
103
  )
104
104
  @bpp.contingency_decorator(
105
105
  except_plan=lambda e: (yield from bps.stop(detector)), # type: ignore # Fix types in ophyd-async (https://github.com/DiamondLightSource/mx-bluesky/issues/855)
106
- else_plan=lambda: (yield from bps.unstage(detector)),
106
+ else_plan=lambda: (yield from bps.unstage(detector, wait=True)),
107
107
  )
108
108
  def _decorated_do_fgs():
109
109
  yield from _wait_for_zocalo_to_stage_then_do_fgs(
@@ -4,7 +4,7 @@ import bluesky.plan_stubs as bps
4
4
  from bluesky.protocols import Readable
5
5
  from dodal.devices.aperturescatterguard import ApertureScatterguard
6
6
  from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator
7
- from dodal.devices.common_dcm import BaseDCM
7
+ from dodal.devices.common_dcm import DoubleCrystalMonochromator
8
8
  from dodal.devices.eiger import EigerDetector
9
9
  from dodal.devices.flux import Flux
10
10
  from dodal.devices.s4_slit_gaps import S4SlitGaps
@@ -43,7 +43,7 @@ def standard_read_hardware_pre_collection(
43
43
  undulator: Undulator,
44
44
  synchrotron: Synchrotron,
45
45
  s4_slit_gaps: S4SlitGaps,
46
- dcm: BaseDCM,
46
+ dcm: DoubleCrystalMonochromator,
47
47
  smargon: Smargon,
48
48
  ):
49
49
  LOGGER.info("Reading status of beamline for callbacks, pre collection.")
@@ -63,7 +63,7 @@ def standard_read_hardware_during_collection(
63
63
  aperture_scatterguard: ApertureScatterguard,
64
64
  attenuator: BinaryFilterAttenuator,
65
65
  flux: Flux,
66
- dcm: BaseDCM,
66
+ dcm: DoubleCrystalMonochromator,
67
67
  detector: EigerDetector,
68
68
  ):
69
69
  signals_to_read_during_collection = [
@@ -10,7 +10,7 @@ from bluesky.utils import MsgGenerator
10
10
  from dodal.devices.oav.oav_detector import OAV
11
11
  from dodal.devices.oav.pin_image_recognition import PinTipDetection
12
12
  from dodal.devices.oav.pin_image_recognition.utils import NONE_VALUE
13
- from dodal.devices.oav.utils import PinNotFoundException, wait_for_tip_to_be_found
13
+ from dodal.devices.oav.utils import PinNotFoundError, wait_for_tip_to_be_found
14
14
  from dodal.devices.smargon import Smargon
15
15
 
16
16
  from mx_bluesky.common.device_setup_plans.setup_oav import (
@@ -108,7 +108,7 @@ def grid_detection_plan(
108
108
  yield from bps.sleep(HardwareConstants.OAV_REFRESH_DELAY)
109
109
 
110
110
  tip_x_px, tip_y_px = yield from catch_exception_and_warn(
111
- PinNotFoundException, wait_for_tip_to_be_found, pin_tip_detection
111
+ PinNotFoundError, wait_for_tip_to_be_found, pin_tip_detection
112
112
  )
113
113
 
114
114
  LOGGER.info(f"Tip is at x,y: {tip_x_px},{tip_y_px}")
@@ -4,7 +4,7 @@ from dodal.devices.aperturescatterguard import (
4
4
  )
5
5
  from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator
6
6
  from dodal.devices.backlight import Backlight
7
- from dodal.devices.common_dcm import BaseDCM
7
+ from dodal.devices.common_dcm import DoubleCrystalMonochromator
8
8
  from dodal.devices.detector.detector_motion import DetectorMotion
9
9
  from dodal.devices.eiger import EigerDetector
10
10
  from dodal.devices.fast_grid_scan import (
@@ -51,7 +51,7 @@ class GridDetectThenXRayCentreComposite(FlyScanEssentialDevices):
51
51
  attenuator: BinaryFilterAttenuator
52
52
  backlight: Backlight
53
53
  beamstop: Beamstop
54
- dcm: BaseDCM
54
+ dcm: DoubleCrystalMonochromator
55
55
  detector_motion: DetectorMotion
56
56
  zebra_fast_grid_scan: ZebraFastGridScanThreeD
57
57
  flux: Flux
@@ -112,8 +112,8 @@ def _panda_tidy(xrc_composite: HyperionFlyScanXRayCentreComposite):
112
112
  yield from tidy_up_zebra_after_gridscan(
113
113
  xrc_composite.zebra, xrc_composite.sample_shutter, group=group, wait=False
114
114
  )
115
+ yield from bps.unstage(xrc_composite.panda, group=group)
115
116
  yield from bps.wait(group, timeout=10)
116
- yield from bps.unstage(xrc_composite.panda)
117
117
 
118
118
 
119
119
  def _panda_triggering_setup(
@@ -126,10 +126,9 @@ def _panda_triggering_setup(
126
126
  xrc_composite.panda_fast_grid_scan.run_up_distance_mm
127
127
  )
128
128
 
129
- # Set the time between x steps pv
130
- DEADTIME_S = 1e-6 # according to https://www.dectris.com/en/detectors/x-ray-detectors/eiger2/eiger2-for-synchrotrons/eiger2-x/
129
+ DETECTOR_DEADTIME_S = 1e-4 # This value was empirically found to be safer than the documented deadtime in the Eiger manual
131
130
 
132
- time_between_x_steps_ms = (DEADTIME_S + parameters.exposure_time_s) * 1e3
131
+ time_between_x_steps_ms = (DETECTOR_DEADTIME_S + parameters.exposure_time_s) * 1e3
133
132
 
134
133
  smargon_speed_limit_mm_per_s = yield from bps.rd(
135
134
  xrc_composite.smargon.x.max_velocity
@@ -148,13 +147,13 @@ def _panda_triggering_setup(
148
147
  )
149
148
  else:
150
149
  LOGGER.info(
151
- f"Panda grid scan: Smargon speed set to {smargon_speed_limit_mm_per_s} mm/s"
150
+ f"Panda grid scan: Smargon speed set to {sample_velocity_mm_per_s} mm/s"
152
151
  f" and using a run-up distance of {run_up_distance_mm}"
153
152
  )
154
153
 
155
154
  yield from bps.mv(
156
- xrc_composite.panda_fast_grid_scan.time_between_x_steps_ms, # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
157
- time_between_x_steps_ms, # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
155
+ xrc_composite.panda_fast_grid_scan.time_between_x_steps_ms,
156
+ time_between_x_steps_ms,
158
157
  )
159
158
 
160
159
  directory_provider_root = Path(parameters.storage_directory)
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from collections.abc import Generator
3
+ from collections.abc import Generator, Sequence
4
4
 
5
5
  import bluesky.plan_stubs as bps
6
6
  import numpy as np
@@ -99,41 +99,12 @@ def load_centre_collect_full(
99
99
  else:
100
100
  raise
101
101
 
102
- locations_to_collect_um: list[np.ndarray]
103
- samples_to_collect: list[int]
104
-
105
- if flyscan_event_handler.xray_centre_results:
106
- selection_func = flyscan_result.resolve_selection_fn(
107
- parameters.selection_params
108
- )
109
- hits = selection_func(flyscan_event_handler.xray_centre_results)
110
- hits_to_collect = []
111
- for hit in hits:
112
- if hit.sample_id is None:
113
- LOGGER.warning(
114
- f"Diffracting centre {hit} not collected because no sample id was assigned."
115
- )
116
- else:
117
- hits_to_collect.append(hit)
118
-
119
- locations_to_collect_um = [
120
- hit.centre_of_mass_mm * 1000 for hit in hits_to_collect
121
- ]
122
- samples_to_collect = [hit.sample_id for hit in hits_to_collect]
123
- LOGGER.info(
124
- f"Selected hits {hits_to_collect} using {selection_func}, args={parameters.selection_params}"
102
+ sample_ids_and_locations = yield from (
103
+ _samples_and_locations_to_collect(
104
+ flyscan_event_handler.xray_centre_results, parameters, composite
125
105
  )
126
- else:
127
- # If the xray centring hasn't found a result but has not thrown an error it
128
- # means that we do not need to recentre and can collect where we are
129
- initial_x_mm = yield from bps.rd(composite.smargon.x.user_readback)
130
- initial_y_mm = yield from bps.rd(composite.smargon.y.user_readback)
131
- initial_z_mm = yield from bps.rd(composite.smargon.z.user_readback)
132
-
133
- locations_to_collect_um = [
134
- np.array([initial_x_mm, initial_y_mm, initial_z_mm]) * 1000
135
- ]
136
- samples_to_collect = [parameters.sample_id]
106
+ )
107
+ sample_ids_and_locations.sort(key=_x_coordinate)
137
108
 
138
109
  multi_rotation = parameters.multi_rotation_scan
139
110
  rotation_template = multi_rotation.rotation_scans.copy()
@@ -144,9 +115,7 @@ def load_centre_collect_full(
144
115
 
145
116
  generator = rotation_scan_generator(is_alternating)
146
117
  next(generator)
147
- for location, sample_id in zip(
148
- locations_to_collect_um, samples_to_collect, strict=True
149
- ):
118
+ for sample_id, location in sample_ids_and_locations:
150
119
  for rot in rotation_template:
151
120
  combination = generator.send((rot, location, sample_id))
152
121
  multi_rotation.rotation_scans.append(combination)
@@ -161,6 +130,51 @@ def load_centre_collect_full(
161
130
  yield from plan_with_callback_subs()
162
131
 
163
132
 
133
+ def _samples_and_locations_to_collect(
134
+ xrc_results: Sequence[flyscan_result.XRayCentreResult] | None,
135
+ parameters: LoadCentreCollect,
136
+ composite: LoadCentreCollectComposite,
137
+ ) -> MsgGenerator[list[tuple[int, np.ndarray]]]:
138
+ if xrc_results:
139
+ selection_func = flyscan_result.resolve_selection_fn(
140
+ parameters.selection_params
141
+ )
142
+ hits = selection_func(xrc_results)
143
+ hits_to_collect = []
144
+ for hit in hits:
145
+ if hit.sample_id is None:
146
+ LOGGER.warning(
147
+ f"Diffracting centre {hit} not collected because no sample id was assigned."
148
+ )
149
+ else:
150
+ hits_to_collect.append(hit)
151
+
152
+ samples_and_locations = [
153
+ (hit.sample_id, hit.centre_of_mass_mm * 1000) for hit in hits_to_collect
154
+ ]
155
+ LOGGER.info(
156
+ f"Selected hits {hits_to_collect} using {selection_func}, args={parameters.selection_params}"
157
+ )
158
+ return samples_and_locations
159
+ else:
160
+ # If the xray centring hasn't found a result but has not thrown an error it
161
+ # means that we do not need to recentre and can collect where we are
162
+ initial_x_mm = yield from bps.rd(composite.smargon.x.user_readback)
163
+ initial_y_mm = yield from bps.rd(composite.smargon.y.user_readback)
164
+ initial_z_mm = yield from bps.rd(composite.smargon.z.user_readback)
165
+
166
+ return [
167
+ (
168
+ parameters.sample_id,
169
+ np.array([initial_x_mm, initial_y_mm, initial_z_mm]) * 1000,
170
+ )
171
+ ]
172
+
173
+
174
+ def _x_coordinate(sample_and_location: tuple[int, np.ndarray]) -> float:
175
+ return sample_and_location[1][0] # type: ignore
176
+
177
+
164
178
  def rotation_scan_generator(
165
179
  is_alternating: bool,
166
180
  ) -> Generator[
@@ -9,7 +9,7 @@ from dodal.devices.oav.oav_detector import OAV
9
9
  from dodal.devices.oav.oav_parameters import OAV_CONFIG_JSON, OAVParameters
10
10
  from dodal.devices.oav.pin_image_recognition import PinTipDetection, Tip
11
11
  from dodal.devices.oav.utils import (
12
- PinNotFoundException,
12
+ PinNotFoundError,
13
13
  Pixel,
14
14
  get_move_required_so_that_beam_is_at_pixel,
15
15
  wait_for_tip_to_be_found,
@@ -161,6 +161,6 @@ def pin_tip_centre_plan(
161
161
  # See #673 for improvements
162
162
  yield from bps.sleep(0.3)
163
163
  tip = yield from catch_exception_and_warn(
164
- PinNotFoundException, wait_for_tip_to_be_found, pin_tip_detect
164
+ PinNotFoundError, wait_for_tip_to_be_found, pin_tip_detect
165
165
  )
166
166
  yield from offset_and_move(tip)
@@ -428,7 +428,7 @@ def rotation_scan_internal(
428
428
 
429
429
  yield from rotation_scan_core(single_scan)
430
430
 
431
- yield from bps.unstage(eiger)
431
+ yield from bps.unstage(eiger, wait=True)
432
432
 
433
433
  LOGGER.info("setting up and staging eiger...")
434
434
  yield from start_preparing_data_collection_then_do_plan(
@@ -6,7 +6,7 @@ from dodal.devices.aperturescatterguard import (
6
6
  )
7
7
  from dodal.devices.attenuator.attenuator import BinaryFilterAttenuator
8
8
  from dodal.devices.backlight import Backlight
9
- from dodal.devices.common_dcm import BaseDCM
9
+ from dodal.devices.common_dcm import DoubleCrystalMonochromatorWithDSpacing
10
10
  from dodal.devices.eiger import EigerDetector
11
11
  from dodal.devices.fast_grid_scan import (
12
12
  PandAFastGridScan,
@@ -37,7 +37,7 @@ class HyperionFlyScanXRayCentreComposite(FlyScanEssentialDevices):
37
37
 
38
38
  aperture_scatterguard: ApertureScatterguard
39
39
  attenuator: BinaryFilterAttenuator
40
- dcm: BaseDCM
40
+ dcm: DoubleCrystalMonochromatorWithDSpacing
41
41
  eiger: EigerDetector
42
42
  flux: Flux
43
43
  s4_slit_gaps: S4SlitGaps
@@ -150,14 +150,12 @@ class RotationScan(RotationExperiment, SplitScan):
150
150
  return rotation_scan
151
151
 
152
152
  @model_validator(mode="after")
153
- @classmethod
154
- def correct_start_vds(cls, values: Any) -> Any:
155
- assert isinstance(values, RotationScan)
153
+ def correct_start_vds(self) -> Any:
156
154
  start_img = 0.0
157
- for scan in values.rotation_scans:
155
+ for scan in self.rotation_scans:
158
156
  scan.nexus_vds_start_img = int(start_img)
159
- start_img += scan.scan_width_deg / values.rotation_increment_deg
160
- return values
157
+ start_img += scan.scan_width_deg / self.rotation_increment_deg
158
+ return self
161
159
 
162
160
  @model_validator(mode="after")
163
161
  def _check_valid_for_single_arm_multiple_sweep(self) -> Self:
@@ -27,7 +27,12 @@ def clear_all_device_caches(context: BlueskyContext):
27
27
 
28
28
 
29
29
  def setup_devices(context: BlueskyContext, dev_mode: bool):
30
- context.with_dodal_module(
30
+ _, exceptions = context.with_dodal_module(
31
31
  get_beamline_based_on_environment_variable(),
32
32
  mock=dev_mode,
33
33
  )
34
+ if exceptions:
35
+ raise ExceptionGroup(
36
+ f"Unable to connect to beamline devices {list(exceptions.keys())}",
37
+ list(exceptions.values()),
38
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mx-bluesky
3
- Version: 1.5.9
3
+ Version: 1.5.10
4
4
  Summary: Bluesky tools for MX Beamlines at DLS
5
5
  Author-email: Dominic Oram <dominic.oram@diamond.ac.uk>
6
6
  License: Apache License
@@ -237,11 +237,11 @@ Requires-Dist: deepdiff
237
237
  Requires-Dist: matplotlib
238
238
  Requires-Dist: cachetools
239
239
  Requires-Dist: daq-config-server>=v1.0.0-rc.2
240
- Requires-Dist: blueapi>=0.15.0
240
+ Requires-Dist: blueapi>=1.5.0
241
241
  Requires-Dist: ophyd>=1.10.5
242
242
  Requires-Dist: ophyd-async>=0.10.0a2
243
- Requires-Dist: bluesky>=1.13.1
244
- Requires-Dist: dls-dodal==1.62.0
243
+ Requires-Dist: bluesky>=1.14.6
244
+ Requires-Dist: dls-dodal==1.63.0
245
245
  Provides-Extra: dev
246
246
  Requires-Dist: black; extra == "dev"
247
247
  Requires-Dist: build; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  mx_bluesky/__init__.py,sha256=Ksms_WJF8LTkbm38gEpm1jBpGqcQ8NGvmb2ZJlOE1j8,198
2
2
  mx_bluesky/__main__.py,sha256=RVqPnxDisFMIn_aoEi0drlThNHgKTJULnSrotouIKI0,480
3
- mx_bluesky/_version.py,sha256=R8NtNnDKq3ku-8r0RS1XECjtWqIXXUTnvgF1AljQn-k,704
3
+ mx_bluesky/_version.py,sha256=GHx1c9DDnT0tx1ian8L-pn_ij2Y5L7Dx0xAenE6ixKE,706
4
4
  mx_bluesky/definitions.py,sha256=ULpEYAUzdQiEbBoTgYTMxfUf3DDDjhYtvDxofs7Qxqw,168
5
5
  mx_bluesky/jupyter_example.ipynb,sha256=wpwvPrBvwtRMS5AIFk8F54cIlUoD0o4ji8tKK5cZHA4,1672
6
6
  mx_bluesky/beamlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -16,14 +16,16 @@ mx_bluesky/beamlines/i04/thawing_plan.py,sha256=eSqX3VKHKw_KDGxjpszDifRpdb_RkwQx
16
16
  mx_bluesky/beamlines/i04/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  mx_bluesky/beamlines/i04/callbacks/murko_callback.py,sha256=C2KoIxwMIWxD46utmq1-69SIc8MspocXJ1sccO1lwAY,4458
18
18
  mx_bluesky/beamlines/i04/experiment_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py,sha256=3Nv3EFNS5k5ivMMo15aR9br7mfz9WQ0S9_Olphe9D4Y,10168
19
+ mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py,sha256=Z77NSnds9mFVRnea5z_aySgs7vJxKRvzbpNNit2AeZM,10206
20
20
  mx_bluesky/beamlines/i23/__init__.py,sha256=7nwQiKBZAXLnvPhCqaI2VC1k4TOzQalOUvwF6SQ3Yd4,95
21
21
  mx_bluesky/beamlines/i23/serial.py,sha256=XVbHM8NevnJMFAJD9jkxG-VnPaWX6t_k-wlipRw0pmY,2055
22
22
  mx_bluesky/beamlines/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
- mx_bluesky/beamlines/i24/jungfrau_commissioning/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
- mx_bluesky/beamlines/i24/jungfrau_commissioning/do_external_acquisition.py,sha256=p5ZOhM3COwiBjolMzHs8HNZGbTiIBjys4iUNQtUMKI0,1573
25
- mx_bluesky/beamlines/i24/jungfrau_commissioning/do_internal_acquisition.py,sha256=cNj4z3TFv8UgtDJax-v8Di74-gKLsTVKtwbCya-wwcw,1744
26
- mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_utils.py,sha256=IaOw0pX8os-14EoLTwGTrFsl4PUZdL0ymbvdS7lhTto,2789
23
+ mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/do_darks.py,sha256=la0jGZDHt48nsRAe8Gq6uL5LoQ1WszF4LmSo1tp03S8,2974
25
+ mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/__init__.py,sha256=yxc_V5DfWKXtOmuX-U9YEdkn05ZriD9My65lpEYTuRo,115
26
+ mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_external_acquisition.py,sha256=DmtGT_zS_bOKjOKCLypWh13sZUF-zp6PPZzky6MkPcc,1675
27
+ mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/do_internal_acquisition.py,sha256=_wmQExT0A-3k_6B8ghtfpspz9vZ2f6QLwcUZlW8jzE8,1846
28
+ mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/plan_utils.py,sha256=q3KN2oN9k4IptL0vpjaH3l0NZobekPSsNUIJi736l9w,2514
27
29
  mx_bluesky/beamlines/i24/serial/__init__.py,sha256=r8v9V48TMrNxOcwBZ6lzeCCuPulq5rg8m-mwH_KkOnI,1533
28
30
  mx_bluesky/beamlines/i24/serial/blueapi_config.yaml,sha256=P0saF1bqt4ANU-2mtS_ZHO4NYr_ierUJN-gf6cspic8,350
29
31
  mx_bluesky/beamlines/i24/serial/dcid.py,sha256=7NkpMFF3obTVt0aHBbw5J7DqhOEg-zz5otNjdgDMlFg,13819
@@ -80,21 +82,21 @@ mx_bluesky/common/xrc_result.py,sha256=tUJ6qkDTTB6H1F71IvVAKtmHCRyHSU_tj9GRzVmnE
80
82
  mx_bluesky/common/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
83
  mx_bluesky/common/device_setup_plans/manipulate_sample.py,sha256=bKVWiXQnibXEjKjCNvy9PX4kUSh1CsBQCkqO5tUgrOU,3130
82
84
  mx_bluesky/common/device_setup_plans/position_detector.py,sha256=S49ml0KNZ6wXPQqOxNJ2whKTCyRTcKdBXBhyeEyFDQQ,635
83
- mx_bluesky/common/device_setup_plans/robot_load_unload.py,sha256=_pUrKEm34qSVdaUM83ypu3i2bAOdYqRLPU1ONhPowD4,4493
84
- mx_bluesky/common/device_setup_plans/setup_oav.py,sha256=7WLElZZU5mWq9g2WP86p3P81uiSPuj2V4kIkqXlap3o,2692
85
+ mx_bluesky/common/device_setup_plans/robot_load_unload.py,sha256=vbkH9pGu3ZHYrzsMJlEB38eLTP-eSNEbnB6svC_KP2Q,4503
86
+ mx_bluesky/common/device_setup_plans/setup_oav.py,sha256=10lo4c7k-OHI2i5F3OsC318ZXG3N8BtjKMFFSflVFR0,2692
85
87
  mx_bluesky/common/device_setup_plans/setup_panda.py,sha256=OF-ZygZyAyQEUdrAWiIxWZ6QhAsVx4Mm9ngRYB1mzKI,433
86
88
  mx_bluesky/common/device_setup_plans/setup_zebra_and_shutter.py,sha256=y83Szce7QxXdpLeGXpgyhceOr1HCE6fs6zmZr77IYAE,10066
87
89
  mx_bluesky/common/device_setup_plans/utils.py,sha256=S_Us1KfLkyaRzWxmqnoVxHj2Suq-Vs0n5fMRygHgrTw,1859
88
- mx_bluesky/common/device_setup_plans/xbpm_feedback.py,sha256=WsUMdeOZBgbj-bFp7x66aHp2oWffQmjyp61-qmtQAmI,2153
90
+ mx_bluesky/common/device_setup_plans/xbpm_feedback.py,sha256=EY1CwACPfts4otAjF15uLrMDyRGwmHz2khh8WicK6cY,1873
89
91
  mx_bluesky/common/experiment_plans/__init__.py,sha256=FMA-4VN1TJCPcyURKF0qPIQ8uo8YBbtHPRdJokVF4MA,129
90
92
  mx_bluesky/common/experiment_plans/change_aperture_then_move_plan.py,sha256=407E9rp0yGWWIU1fJrgqK_hC19mVwRK-Und7fMlGNDc,3062
91
- mx_bluesky/common/experiment_plans/common_flyscan_xray_centre_plan.py,sha256=JIRgSYqhgGu3I8lY3Oq2cyFNjcf_duRuWf0bhMgtOiU,13613
93
+ mx_bluesky/common/experiment_plans/common_flyscan_xray_centre_plan.py,sha256=2Ieb7156ujAGVuybPUMjJEm_7-Z77NYeIGyjDagi0Nw,13546
92
94
  mx_bluesky/common/experiment_plans/common_grid_detect_then_xray_centre_plan.py,sha256=jspOKPc3uxvG-a5-LXs7Yfwy8HTvGXBj4snke9j5gYE,7033
93
- mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py,sha256=gkRpRb3USUx7xDJk-1GghV-sxPp7wy5clubwhlx1v80,7162
95
+ mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py,sha256=SOX6eyPNm7hLJaRJ8esd4DOE2nBjT_2gbmAz1Ozc57g,7154
94
96
  mx_bluesky/common/experiment_plans/oav_snapshot_plan.py,sha256=8TRAvHG2W9bn1xb06bYZTWkfhT2q1EtfyxyiMMKmWcw,3623
95
97
  mx_bluesky/common/experiment_plans/inner_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- mx_bluesky/common/experiment_plans/inner_plans/do_fgs.py,sha256=8Umn101RqCbtSKuw6duHKShPG2Cu3gYi_Cc51d29g7U,4865
97
- mx_bluesky/common/experiment_plans/inner_plans/read_hardware.py,sha256=Og7Uz8lAB1_Z6puN6ws_2kwOqCvgQMqfmyZPFZMRneY,2351
98
+ mx_bluesky/common/experiment_plans/inner_plans/do_fgs.py,sha256=dTO9YuvbSzYaMUTs51x0Vuv9-jZ333jIcP51PS10JRw,4876
99
+ mx_bluesky/common/experiment_plans/inner_plans/read_hardware.py,sha256=jwGgzBPyUN4_FKNe5J8vmuLsvSGmEwk73LGBUu-Jy00,2408
98
100
  mx_bluesky/common/experiment_plans/inner_plans/udc_default_state.py,sha256=TnO5hv1I_UWlB1Vz7dCQ-nGj4LLsu9nQgetaK6hc_YM,2704
99
101
  mx_bluesky/common/experiment_plans/inner_plans/write_sample_status.py,sha256=pmS4Lsndp90CCIKzD_wssvbzt1qu7rEzfXgxvDwDrQ8,1313
100
102
  mx_bluesky/common/external_interaction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -128,7 +130,7 @@ mx_bluesky/common/external_interaction/nexus/write_nexus.py,sha256=s8xT05_Fn_s64
128
130
  mx_bluesky/common/parameters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
129
131
  mx_bluesky/common/parameters/components.py,sha256=wyejnv6DxSOrGzcMVRHZVHnund3pj6cTxTMU5v7JW5Q,8576
130
132
  mx_bluesky/common/parameters/constants.py,sha256=iNv55VTv4QPu96z58pbnMiAE1RGsFKsTs4wahrlGihw,5139
131
- mx_bluesky/common/parameters/device_composites.py,sha256=r9e06CEXcW9wyjthHxhSv41ZlUzaI3xqV1DhmW_iZnw,2265
133
+ mx_bluesky/common/parameters/device_composites.py,sha256=H-SEn1BNme7ucBRRoo90Qr5YdVX0ooPAQPtrzxB6ZAg,2303
132
134
  mx_bluesky/common/parameters/gridscan.py,sha256=Y4xZpMhzWN58gnAYKZyVbtN8uW4pBVC68KTGGmYpb2A,7632
133
135
  mx_bluesky/common/preprocessors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
136
  mx_bluesky/common/preprocessors/preprocessors.py,sha256=BNpSM7S9gxhVbG39rjH14k89sOmKiII0cqApH3pF_H0,4476
@@ -154,15 +156,15 @@ mx_bluesky/hyperion/device_setup_plans/smargon.py,sha256=eb3TCXg33SW6TlfElh5KjYw
154
156
  mx_bluesky/hyperion/device_setup_plans/utils.py,sha256=96JlzyikMhWN7LzdiMx8URZInXoGR3OjoxYmCIp9tts,425
155
157
  mx_bluesky/hyperion/experiment_plans/__init__.py,sha256=dJjwLk0EQP-1hKhbs8aRxTF_LxUXgB7kcgDlaP-tMnk,787
156
158
  mx_bluesky/hyperion/experiment_plans/experiment_registry.py,sha256=bGp2c3nKutqHMnDxuqjp6yCF-JKykSzX-IUfxk3oVlM,1701
157
- mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py,sha256=qYDI39ic1kOfy8GL9_744kjuEzwPUBji65okxbOpWEE,6074
159
+ mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py,sha256=CMy6NR0rrLeyS8SU0jN7xOthYcpxxy9n9XXi39s4is0,5910
158
160
  mx_bluesky/hyperion/experiment_plans/hyperion_grid_detect_then_xray_centre_plan.py,sha256=e4w4226ONSGQF2dnXzxOfcJ9i57CZIJrqQ1YCLlaBNo,2153
159
- mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py,sha256=obUMizdLRGt-uCLnEzwiCGHn8wqHt0OVo1uvVvivWr4,7675
161
+ mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py,sha256=z-RS1MUf1A9aGkmJLcM9zF3G-c0wyI-MoVVXXGB0-lE,7957
160
162
  mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py,sha256=5ZAH17F5T1YyVgA2ML0NEf4ufrD1G0jPRU0_5pINdTg,16195
161
163
  mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py,sha256=oErbq4ffTZVNR_LeiSJP8_q4cwdZWB-bdbrO3ZwKg20,5397
162
- mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py,sha256=1g3vs2hSgEYGhwDoqB8VsWTZ4q_Hd37493n_csoLnI8,6248
164
+ mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py,sha256=-5iUaM6f4uaUrKQtcufcE_CLQf--zSJ6noGWHFK-6wI,6240
163
165
  mx_bluesky/hyperion/experiment_plans/robot_load_and_change_energy.py,sha256=bqG4enP2bZQ6ND0c5XqwDySQTkQRBdK7gvWf61VEnWM,6051
164
166
  mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py,sha256=samWAztWJU9sRo1FtIicWWQZ7TjUwg7Y9y9oqhkcb5o,6904
165
- mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=oFZ3HoWfgVRnuz2crTzSPUvdM2l7wz7RPbygUcTeo0Q,15963
167
+ mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=LZv6QbBMNpC54mM8fYX7ZTzSxVP2quxpCNubfb8kuy4,15974
166
168
  mx_bluesky/hyperion/experiment_plans/set_energy_plan.py,sha256=8FAqN-aJgRwZSiCX-hNdeGmaijt0l8owdShVBwNchfE,2643
167
169
  mx_bluesky/hyperion/external_interaction/__init__.py,sha256=95DwXDmKsx36RgAL-AtLZl2LQoLPKbzeYdlkkP_4Coc,559
168
170
  mx_bluesky/hyperion/external_interaction/agamemnon.py,sha256=B2Q7NR1VSRoCGg4hlCiZDrh2Fa0s4B4ZIws1H7oBfOk,12020
@@ -183,19 +185,19 @@ mx_bluesky/hyperion/parameters/__init__.py,sha256=kf2wfcILBUBpT0tJ8-W39BywQUkn67
183
185
  mx_bluesky/hyperion/parameters/cli.py,sha256=I-NY3Kt3la5HNUB4qRA6NtuxbJSr78yx-sM_cRx_pY4,1514
184
186
  mx_bluesky/hyperion/parameters/components.py,sha256=eIUEcFNqcEad21IThSDatoX-NRa9GdfBOwt6ZUwb88U,292
185
187
  mx_bluesky/hyperion/parameters/constants.py,sha256=aCACWCp670o9U3AKfON-ntqkxIH-99gWNZvEN1G2rPc,2265
186
- mx_bluesky/hyperion/parameters/device_composites.py,sha256=g9tdA_vImJ89AltxzGY04fCiIXHG1WKPAnoF6b_veag,2151
188
+ mx_bluesky/hyperion/parameters/device_composites.py,sha256=B37k4J8qtBetL3s16Fu9jlBkJwjpdz02SQ9LW1TZmBE,2213
187
189
  mx_bluesky/hyperion/parameters/gridscan.py,sha256=DMldH8UJwvcKTUh26Ntg-qgNAP4h6iCrxjFX_kkcvW0,3904
188
190
  mx_bluesky/hyperion/parameters/load_centre_collect.py,sha256=8dlKwb7WmgDeohQ9QsdMWQMMM73EaC2cZ0wKg6vOP60,3727
189
191
  mx_bluesky/hyperion/parameters/robot_load.py,sha256=Iktni3r6LFRnlM51hpdpv3QrD6QPhx2rAeyB8Gv6ML4,1124
190
- mx_bluesky/hyperion/parameters/rotation.py,sha256=OwZFvoswCFn4Y3lB-JVYP_5fvuAZB5yrtKUiCYAzQRQ,7443
192
+ mx_bluesky/hyperion/parameters/rotation.py,sha256=0QNov3jykC__iIHMxdTq3znBsKLyQGk-vzSVMf7rSyA,7360
191
193
  mx_bluesky/hyperion/resources/panda/panda-gridscan.yaml,sha256=mhLBJTSjHCkM9F6mjtqbhNmmrV8qSctbCUfhb0q7pYo,28085
192
194
  mx_bluesky/hyperion/utils/__init__.py,sha256=f4E8wInL1Ll4eeFtAiyKmipOBTPlUtKmVK-m_LOQG4M,35
193
- mx_bluesky/hyperion/utils/context.py,sha256=yxMYn3YFET6SanFZ4YWXDmZDdp3WkaXhDc3ySxHYpAE,1033
195
+ mx_bluesky/hyperion/utils/context.py,sha256=VYAu1yxhDBrI98ul7UErotuquF64s1EDHtqPQLRpyvY,1227
194
196
  mx_bluesky/phase1_zebra/__init__.py,sha256=Edhhn2L9MVXnjJhyD5_yKQVUDo7XW98rvuT7dlzIn58,132
195
197
  mx_bluesky/phase1_zebra/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
- mx_bluesky-1.5.9.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
197
- mx_bluesky-1.5.9.dist-info/METADATA,sha256=cLEcoIhuVwQrVcBG0-AWiw3LdWaXVDPX4WE9dTtOPXU,17424
198
- mx_bluesky-1.5.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
199
- mx_bluesky-1.5.9.dist-info/entry_points.txt,sha256=HgVtwgWoMRn9-X6rxCcSY3Jz_paspJTIlc-t2NFzWpo,409
200
- mx_bluesky-1.5.9.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
201
- mx_bluesky-1.5.9.dist-info/RECORD,,
198
+ mx_bluesky-1.5.10.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
199
+ mx_bluesky-1.5.10.dist-info/METADATA,sha256=D4I5k3VrZ9WGcMFtohiAyJSUuuukebOs3yepLqhXQ14,17424
200
+ mx_bluesky-1.5.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
201
+ mx_bluesky-1.5.10.dist-info/entry_points.txt,sha256=HgVtwgWoMRn9-X6rxCcSY3Jz_paspJTIlc-t2NFzWpo,409
202
+ mx_bluesky-1.5.10.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
203
+ mx_bluesky-1.5.10.dist-info/RECORD,,