mx-bluesky 1.4.9__py3-none-any.whl → 1.5.0__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 (37) hide show
  1. mx_bluesky/_version.py +2 -2
  2. mx_bluesky/beamlines/i24/serial/__init__.py +4 -2
  3. mx_bluesky/beamlines/i24/serial/blueapi_config.yaml +4 -0
  4. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Collect_py3v1.py +32 -0
  5. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Manager_py3v1.py +2 -1
  6. mx_bluesky/beamlines/i24/serial/web_gui_plans/general_plans.py +77 -8
  7. mx_bluesky/common/device_setup_plans/manipulate_sample.py +4 -1
  8. mx_bluesky/common/device_setup_plans/utils.py +49 -0
  9. mx_bluesky/common/{plans → experiment_plans}/common_flyscan_xray_centre_plan.py +11 -19
  10. mx_bluesky/{hyperion/experiment_plans/grid_detect_then_xray_centre_plan.py → common/experiment_plans/common_grid_detect_then_xray_centre_plan.py} +108 -136
  11. mx_bluesky/common/{plans → experiment_plans}/inner_plans/do_fgs.py +1 -1
  12. mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py +5 -13
  13. mx_bluesky/{hyperion → common}/experiment_plans/oav_snapshot_plan.py +5 -2
  14. mx_bluesky/common/parameters/components.py +1 -1
  15. mx_bluesky/common/parameters/device_composites.py +65 -0
  16. mx_bluesky/common/utils/__init__.py +0 -0
  17. mx_bluesky/hyperion/device_setup_plans/utils.py +0 -48
  18. mx_bluesky/hyperion/experiment_plans/__init__.py +3 -3
  19. mx_bluesky/hyperion/experiment_plans/experiment_registry.py +3 -3
  20. mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py +40 -41
  21. mx_bluesky/hyperion/experiment_plans/hyperion_grid_detect_then_xray_centre_plan.py +60 -0
  22. mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py +26 -15
  23. mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py +8 -6
  24. mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py +11 -11
  25. mx_bluesky/hyperion/parameters/constants.py +0 -1
  26. mx_bluesky/hyperion/parameters/device_composites.py +5 -27
  27. mx_bluesky/hyperion/utils/validation.py +1 -1
  28. {mx_bluesky-1.4.9.dist-info → mx_bluesky-1.5.0.dist-info}/METADATA +3 -3
  29. {mx_bluesky-1.4.9.dist-info → mx_bluesky-1.5.0.dist-info}/RECORD +37 -33
  30. /mx_bluesky/common/{plans → experiment_plans}/__init__.py +0 -0
  31. /mx_bluesky/common/{plans → experiment_plans}/inner_plans/__init__ .py +0 -0
  32. /mx_bluesky/common/{plans → experiment_plans}/read_hardware.py +0 -0
  33. /mx_bluesky/common/{plans → experiment_plans}/write_sample_status.py +0 -0
  34. {mx_bluesky-1.4.9.dist-info → mx_bluesky-1.5.0.dist-info}/WHEEL +0 -0
  35. {mx_bluesky-1.4.9.dist-info → mx_bluesky-1.5.0.dist-info}/entry_points.txt +0 -0
  36. {mx_bluesky-1.4.9.dist-info → mx_bluesky-1.5.0.dist-info}/licenses/LICENSE +0 -0
  37. {mx_bluesky-1.4.9.dist-info → mx_bluesky-1.5.0.dist-info}/top_level.txt +0 -0
mx_bluesky/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '1.4.9'
21
- __version_tuple__ = version_tuple = (1, 4, 9)
20
+ __version__ = version = '1.5.0'
21
+ __version_tuple__ = version_tuple = (1, 5, 0)
@@ -2,7 +2,8 @@ from mx_bluesky.beamlines.i24.serial.web_gui_plans.general_plans import (
2
2
  gui_gonio_move_on_click,
3
3
  gui_move_backlight,
4
4
  gui_move_detector,
5
- gui_set_parameters,
5
+ gui_run_chip_collection,
6
+ gui_set_zoom_level,
6
7
  gui_sleep,
7
8
  gui_stage_move_on_click,
8
9
  )
@@ -57,6 +58,7 @@ __all__ = [
57
58
  "gui_gonio_move_on_click",
58
59
  "gui_sleep",
59
60
  "gui_move_detector",
60
- "gui_set_parameters",
61
+ "gui_run_chip_collection",
61
62
  "gui_move_backlight",
63
+ "gui_set_zoom_level",
62
64
  ]
@@ -8,6 +8,10 @@ env:
8
8
  broadcast_status_events: false
9
9
  api:
10
10
  port: 25565
11
+ cors:
12
+ allow_credentials: True
13
+ origins:
14
+ - "*"
11
15
  stomp:
12
16
  enabled: true
13
17
  host: i24-control.diamond.ac.uk
@@ -684,6 +684,38 @@ def run_fixed_target_plan(
684
684
  # DCID instance - do not create yet
685
685
  dcid = DCID(emit_errors=False, expt_params=parameters)
686
686
 
687
+ yield from run_plan_in_wrapper(
688
+ zebra,
689
+ pmac,
690
+ aperture,
691
+ backlight,
692
+ beamstop,
693
+ detector_stage,
694
+ shutter,
695
+ dcm,
696
+ mirrors,
697
+ beam_center_device,
698
+ parameters,
699
+ dcid,
700
+ pilatus_metadata,
701
+ )
702
+
703
+
704
+ def run_plan_in_wrapper(
705
+ zebra: Zebra,
706
+ pmac: PMAC,
707
+ aperture: Aperture,
708
+ backlight: DualBacklight,
709
+ beamstop: Beamstop,
710
+ detector_stage: DetectorMotion,
711
+ shutter: HutchShutter,
712
+ dcm: DCM,
713
+ mirrors: FocusMirrorsMode,
714
+ beam_center_device: DetectorBeamCenter,
715
+ parameters: FixedTargetParameters,
716
+ dcid: DCID,
717
+ pilatus_metadata: PilatusMetadata,
718
+ ) -> MsgGenerator:
687
719
  yield from bpp.contingency_wrapper(
688
720
  main_fixed_target_plan(
689
721
  zebra,
@@ -256,6 +256,7 @@ def upload_chip_map_to_geobrick(pmac: PMAC, chip_map: list[int]) -> MsgGenerator
256
256
  """
257
257
  SSX_LOGGER.info("Uploading Parameters for Oxford Chip to the GeoBrick")
258
258
  SSX_LOGGER.info(f"Chipid {ChipType.Oxford}, width {OXFORD_CHIP_WIDTH}")
259
+ SSX_LOGGER.warning(f"MAP TO UPLOAD: {chip_map}")
259
260
  for block in range(1, 65):
260
261
  value = 1 if block in chip_map else 0
261
262
  pvar = PVAR_TEMPLATE % block
@@ -264,7 +265,7 @@ def upload_chip_map_to_geobrick(pmac: PMAC, chip_map: list[int]) -> MsgGenerator
264
265
  yield from bps.abs_set(pmac.pmac_string, pvar_str, wait=True)
265
266
  # Wait for PMAC to be done processing PVAR string
266
267
  yield from bps.sleep(0.02)
267
- SSX_LOGGER.debug("Upload parameters done.")
268
+ SSX_LOGGER.info("Upload parameters done.")
268
269
 
269
270
 
270
271
  @log_on_entry
@@ -3,19 +3,34 @@ from typing import Literal
3
3
 
4
4
  import bluesky.plan_stubs as bps
5
5
  import bluesky.preprocessors as bpp
6
- from blueapi.core import MsgGenerator
6
+ from bluesky.utils import MsgGenerator
7
7
  from dodal.beamlines import i24
8
8
  from dodal.common import inject
9
+ from dodal.devices.hutch_shutter import HutchShutter
10
+ from dodal.devices.i24.aperture import Aperture
11
+ from dodal.devices.i24.beam_center import DetectorBeamCenter
12
+ from dodal.devices.i24.beamstop import Beamstop
13
+ from dodal.devices.i24.dcm import DCM
9
14
  from dodal.devices.i24.dual_backlight import BacklightPositions, DualBacklight
15
+ from dodal.devices.i24.focus_mirrors import FocusMirrorsMode
10
16
  from dodal.devices.i24.i24_detector_motion import DetectorMotion
17
+ from dodal.devices.i24.pilatus_metadata import PilatusMetadata
11
18
  from dodal.devices.i24.pmac import PMAC
12
- from dodal.devices.oav.oav_detector import OAV
19
+ from dodal.devices.oav.oav_detector import OAVBeamCentreFile
20
+ from dodal.devices.zebra.zebra import Zebra
13
21
 
22
+ from mx_bluesky.beamlines.i24.serial.dcid import DCID
14
23
  from mx_bluesky.beamlines.i24.serial.fixed_target.ft_utils import (
15
24
  ChipType,
16
25
  MappingType,
17
26
  PumpProbeSetting,
18
27
  )
28
+ from mx_bluesky.beamlines.i24.serial.fixed_target.i24ssx_Chip_Collect_py3v1 import (
29
+ run_plan_in_wrapper,
30
+ )
31
+ from mx_bluesky.beamlines.i24.serial.fixed_target.i24ssx_Chip_Manager_py3v1 import (
32
+ upload_chip_map_to_geobrick,
33
+ )
19
34
  from mx_bluesky.beamlines.i24.serial.fixed_target.i24ssx_moveonclick import (
20
35
  _move_on_mouse_click_plan,
21
36
  )
@@ -24,6 +39,7 @@ from mx_bluesky.beamlines.i24.serial.log import (
24
39
  _read_visit_directory_from_file,
25
40
  )
26
41
  from mx_bluesky.beamlines.i24.serial.parameters import (
42
+ DetectorName,
27
43
  FixedTargetParameters,
28
44
  get_chip_format,
29
45
  )
@@ -46,9 +62,19 @@ def gui_move_backlight(
46
62
  SSX_LOGGER.debug(f"Backlight moved to {bl_pos.value}")
47
63
 
48
64
 
65
+ @bpp.run_decorator()
66
+ def gui_set_zoom_level(
67
+ position: str, oav: OAVBeamCentreFile = inject("oav")
68
+ ) -> MsgGenerator:
69
+ yield from bps.abs_set(oav.zoom_controller, position, wait=True)
70
+ SSX_LOGGER.debug(f"Setting zoom level to {position}")
71
+
72
+
49
73
  @bpp.run_decorator()
50
74
  def gui_stage_move_on_click(
51
- position_px: tuple[int, int], oav: OAV = inject("oav"), pmac: PMAC = inject("pmac")
75
+ position_px: tuple[int, int],
76
+ oav: OAVBeamCentreFile = inject("oav"),
77
+ pmac: PMAC = inject("pmac"),
52
78
  ) -> MsgGenerator:
53
79
  yield from _move_on_mouse_click_plan(oav, pmac, position_px)
54
80
 
@@ -88,7 +114,7 @@ def gui_move_detector(
88
114
 
89
115
 
90
116
  @bpp.run_decorator()
91
- def gui_set_parameters(
117
+ def gui_run_chip_collection(
92
118
  sub_dir: str,
93
119
  chip_name: str,
94
120
  exp_time: float,
@@ -103,6 +129,18 @@ def gui_set_parameters(
103
129
  laser_dwell: float,
104
130
  laser_delay: float,
105
131
  pre_pump: float,
132
+ pmac: PMAC = inject("pmac"),
133
+ zebra: Zebra = inject("zebra"),
134
+ aperture: Aperture = inject("aperture"),
135
+ backlight: DualBacklight = inject("backlight"),
136
+ beamstop: Beamstop = inject("beamstop"),
137
+ detector_stage: DetectorMotion = inject("detector_motion"),
138
+ shutter: HutchShutter = inject("shutter"),
139
+ dcm: DCM = inject("dcm"),
140
+ mirrors: FocusMirrorsMode = inject("focus_mirrors"),
141
+ beam_center_pilatus: DetectorBeamCenter = inject("pilatus_bc"),
142
+ beam_center_eiger: DetectorBeamCenter = inject("eiger_bc"),
143
+ pilatus_metadata: PilatusMetadata = inject("pilatus_meta"),
106
144
  ) -> MsgGenerator:
107
145
  """Set the parameter model for the data collection.
108
146
 
@@ -132,7 +170,6 @@ def gui_set_parameters(
132
170
  """
133
171
  # NOTE still a work in progress, adding to it as the ui grows
134
172
  # See progression of https://github.com/DiamondLightSource/mx-daq-ui/issues/3
135
- detector_stage = i24.detector_motion()
136
173
  det_type = yield from get_detector_type(detector_stage)
137
174
  _format = chip_format if ChipType[chip_type] is ChipType.Custom else None
138
175
  chip_params = get_chip_format(ChipType[chip_type], _format)
@@ -164,6 +201,38 @@ def gui_set_parameters(
164
201
  "checker_pattern": checker_pattern,
165
202
  "pre_pump_exposure_s": pre_pump,
166
203
  }
167
- # TODO run the run_fixed_target plan once params are set (GUI not ready yet)
168
- yield from bps.sleep(0.5)
169
- return FixedTargetParameters(**params)
204
+
205
+ parameters = FixedTargetParameters(**params)
206
+
207
+ # Create collection directory
208
+ parameters.collection_directory.mkdir(parents=True, exist_ok=True)
209
+
210
+ if parameters.chip_map:
211
+ yield from upload_chip_map_to_geobrick(pmac, parameters.chip_map)
212
+
213
+ beam_center_device = (
214
+ beam_center_eiger
215
+ if parameters.detector_name is DetectorName.EIGER
216
+ else beam_center_pilatus
217
+ )
218
+ SSX_LOGGER.info("Beam center device ready")
219
+
220
+ # DCID instance - do not create yet
221
+ dcid = DCID(emit_errors=False, expt_params=parameters) # noqa
222
+ SSX_LOGGER.info("DCID created")
223
+
224
+ yield from run_plan_in_wrapper(
225
+ zebra,
226
+ pmac,
227
+ aperture,
228
+ backlight,
229
+ beamstop,
230
+ detector_stage,
231
+ shutter,
232
+ dcm,
233
+ mirrors,
234
+ beam_center_device,
235
+ parameters,
236
+ dcid,
237
+ pilatus_metadata,
238
+ )
@@ -10,6 +10,7 @@ from dodal.devices.detector.detector_motion import DetectorMotion
10
10
  from dodal.devices.smargon import CombinedMove, Smargon
11
11
 
12
12
  from mx_bluesky.common.utils.log import LOGGER
13
+ from mx_bluesky.hyperion.parameters.constants import CONST
13
14
 
14
15
  LOWER_DETECTOR_SHUTTER_AFTER_SCAN = True
15
16
 
@@ -21,6 +22,8 @@ def setup_sample_environment(
21
22
  group="setup_senv",
22
23
  ):
23
24
  """Move the aperture into required position, move out the backlight."""
25
+ yield from bps.abs_set(backlight, BacklightPosition.OUT, group=group)
26
+
24
27
  aperture_value = (
25
28
  None
26
29
  if not aperture_position_gda_name
@@ -29,7 +32,6 @@ def setup_sample_environment(
29
32
  yield from move_aperture_if_required(
30
33
  aperture_scatterguard, aperture_value, group=group
31
34
  )
32
- yield from bps.abs_set(backlight, BacklightPosition.OUT, group=group)
33
35
 
34
36
 
35
37
  def move_aperture_if_required(
@@ -46,6 +48,7 @@ def move_aperture_if_required(
46
48
 
47
49
  else:
48
50
  LOGGER.info(f"Setting aperture position to {aperture_value}")
51
+ yield from bps.wait(CONST.WAIT.PREPARE_APERTURE)
49
52
  yield from bps.abs_set(
50
53
  aperture_scatterguard.selected_aperture,
51
54
  aperture_value,
@@ -0,0 +1,49 @@
1
+ from collections.abc import Generator
2
+
3
+ from bluesky import plan_stubs as bps
4
+ from bluesky import preprocessors as bpp
5
+ from bluesky.utils import Msg
6
+ from dodal.devices.detector.detector_motion import DetectorMotion, ShutterState
7
+ from dodal.devices.eiger import EigerDetector
8
+ from dodal.devices.mx_phase1.beamstop import Beamstop, BeamstopPositions
9
+
10
+ from mx_bluesky.common.device_setup_plans.position_detector import (
11
+ set_detector_z_position,
12
+ set_shutter,
13
+ )
14
+
15
+
16
+ def start_preparing_data_collection_then_do_plan(
17
+ beamstop: Beamstop,
18
+ eiger: EigerDetector,
19
+ detector_motion: DetectorMotion,
20
+ detector_distance_mm: float | None,
21
+ plan_to_run: Generator[Msg, None, None],
22
+ group="ready_for_data_collection",
23
+ ) -> Generator[Msg, None, None]:
24
+ """Starts preparing for the next data collection and then runs the
25
+ given plan.
26
+
27
+ Preparation consists of:
28
+ * Arming the Eiger
29
+ * Moving the detector to the specified position
30
+ * Opening the detect shutter
31
+ If the plan fails it will disarm the eiger.
32
+ """
33
+
34
+ def wrapped_plan():
35
+ yield from bps.abs_set(eiger.do_arm, 1, group=group) # type: ignore # Fix types in ophyd-async (https://github.com/DiamondLightSource/mx-bluesky/issues/855)
36
+ yield from bps.abs_set(
37
+ beamstop.selected_pos, BeamstopPositions.DATA_COLLECTION, group=group
38
+ )
39
+ if detector_distance_mm:
40
+ yield from set_detector_z_position(
41
+ detector_motion, detector_distance_mm, group
42
+ )
43
+ yield from set_shutter(detector_motion, ShutterState.OPEN, group)
44
+ yield from plan_to_run
45
+
46
+ yield from bpp.contingency_wrapper(
47
+ wrapped_plan(),
48
+ except_plan=lambda e: (yield from bps.stop(eiger)), # type: ignore # Fix types in ophyd-async (https://github.com/DiamondLightSource/mx-bluesky/issues/855)
49
+ )
@@ -7,35 +7,32 @@ from functools import partial
7
7
  import bluesky.plan_stubs as bps
8
8
  import bluesky.preprocessors as bpp
9
9
  import numpy as np
10
- import pydantic
11
10
  from bluesky.protocols import Readable
12
11
  from bluesky.utils import MsgGenerator
13
- from dodal.devices.eiger import EigerDetector
14
12
  from dodal.devices.fast_grid_scan import (
15
13
  FastGridScanCommon,
16
14
  )
17
- from dodal.devices.smargon import Smargon
18
- from dodal.devices.synchrotron import Synchrotron
19
15
  from dodal.devices.zocalo import ZocaloResults
20
16
  from dodal.devices.zocalo.zocalo_results import (
21
17
  XrcResult,
22
18
  get_full_processing_results,
23
19
  )
24
20
 
21
+ from mx_bluesky.common.experiment_plans.inner_plans.do_fgs import (
22
+ ZOCALO_STAGE_GROUP,
23
+ kickoff_and_complete_gridscan,
24
+ )
25
+ from mx_bluesky.common.experiment_plans.read_hardware import (
26
+ read_hardware_plan,
27
+ )
25
28
  from mx_bluesky.common.parameters.constants import (
26
29
  DocDescriptorNames,
27
30
  GridscanParamConstants,
28
31
  PlanGroupCheckpointConstants,
29
32
  PlanNameConstants,
30
33
  )
34
+ from mx_bluesky.common.parameters.device_composites import FlyScanEssentialDevices
31
35
  from mx_bluesky.common.parameters.gridscan import SpecifiedThreeDGridScan
32
- from mx_bluesky.common.plans.inner_plans.do_fgs import (
33
- ZOCALO_STAGE_GROUP,
34
- kickoff_and_complete_gridscan,
35
- )
36
- from mx_bluesky.common.plans.read_hardware import (
37
- read_hardware_plan,
38
- )
39
36
  from mx_bluesky.common.utils.exceptions import (
40
37
  CrystalNotFoundException,
41
38
  SampleException,
@@ -45,14 +42,6 @@ from mx_bluesky.common.utils.tracing import TRACER
45
42
  from mx_bluesky.common.xrc_result import XRayCentreResult
46
43
 
47
44
 
48
- @pydantic.dataclasses.dataclass(config={"arbitrary_types_allowed": True})
49
- class FlyScanEssentialDevices:
50
- eiger: EigerDetector
51
- synchrotron: Synchrotron
52
- zocalo: ZocaloResults
53
- smargon: Smargon
54
-
55
-
56
45
  @dataclasses.dataclass
57
46
  class BeamlineSpecificFGSFeatures:
58
47
  setup_trigger_plan: Callable[..., MsgGenerator]
@@ -251,6 +240,9 @@ def run_gridscan(
251
240
  parameters.scan_indices,
252
241
  plan_during_collection=beamline_specific.read_during_collection_plan,
253
242
  )
243
+
244
+ # GDA's gridscans requires Z steps to be at 0, so make sure we leave this device
245
+ # in a GDA-happy state.
254
246
  yield from bps.abs_set(beamline_specific.fgs_motors.z_steps, 0, wait=False)
255
247
 
256
248