mx-bluesky 1.4.1a0__py3-none-any.whl → 1.4.3__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 (105) hide show
  1. mx_bluesky/_version.py +2 -2
  2. mx_bluesky/beamlines/i04/redis_to_murko_forwarder.py +178 -0
  3. mx_bluesky/beamlines/i24/serial/__init__.py +0 -6
  4. mx_bluesky/beamlines/i24/serial/dcid.py +125 -151
  5. mx_bluesky/beamlines/i24/serial/extruder/EX-gui-edm/DiamondExtruder-I24-py3v1.edl +1 -1
  6. mx_bluesky/beamlines/i24/serial/extruder/i24ssx_Extruder_Collect_py3v2.py +88 -43
  7. mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/DiamondChipI24-py3v1.edl +1 -1
  8. mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/MappingLite-oxford_py3v1.edl +2 -46
  9. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Collect_py3v1.py +85 -122
  10. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Manager_py3v1.py +58 -66
  11. mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_StartUp_py3v1.py +1 -19
  12. mx_bluesky/beamlines/i24/serial/parameters/__init__.py +11 -2
  13. mx_bluesky/beamlines/i24/serial/parameters/constants.py +16 -2
  14. mx_bluesky/beamlines/i24/serial/parameters/experiment_parameters.py +94 -19
  15. mx_bluesky/beamlines/i24/serial/parameters/utils.py +19 -0
  16. mx_bluesky/beamlines/i24/serial/setup_beamline/pv.py +2 -0
  17. mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py +61 -8
  18. mx_bluesky/beamlines/i24/serial/setup_beamline/setup_zebra_plans.py +81 -40
  19. mx_bluesky/beamlines/i24/serial/write_nexus.py +66 -67
  20. mx_bluesky/{hyperion/external_interaction/callbacks → common/external_interaction/callbacks/common}/aperture_change_callback.py +1 -1
  21. mx_bluesky/{hyperion/external_interaction/callbacks → common/external_interaction/callbacks/common}/grid_detection_callback.py +19 -1
  22. mx_bluesky/{hyperion/external_interaction/callbacks → common/external_interaction/callbacks/common}/ispyb_callback_base.py +40 -34
  23. mx_bluesky/{hyperion → common}/external_interaction/callbacks/common/ispyb_mapping.py +4 -4
  24. mx_bluesky/{hyperion/external_interaction/callbacks → common/external_interaction/callbacks/common}/logging_callback.py +1 -1
  25. mx_bluesky/{hyperion/external_interaction/callbacks → common/external_interaction/callbacks/common}/zocalo_callback.py +14 -9
  26. mx_bluesky/{hyperion → common}/external_interaction/callbacks/xray_centre/ispyb_callback.py +46 -38
  27. mx_bluesky/{hyperion → common}/external_interaction/callbacks/xray_centre/ispyb_mapping.py +2 -2
  28. mx_bluesky/{hyperion → common}/external_interaction/callbacks/xray_centre/nexus_callback.py +20 -15
  29. mx_bluesky/common/external_interaction/config_server.py +11 -0
  30. mx_bluesky/common/external_interaction/ispyb/__init__.py +0 -0
  31. mx_bluesky/{hyperion → common}/external_interaction/ispyb/data_model.py +2 -0
  32. mx_bluesky/{hyperion → common}/external_interaction/ispyb/exp_eye_store.py +67 -17
  33. mx_bluesky/{hyperion → common}/external_interaction/ispyb/ispyb_store.py +20 -18
  34. mx_bluesky/{hyperion → common}/external_interaction/ispyb/ispyb_utils.py +2 -2
  35. mx_bluesky/common/external_interaction/nexus/__init__.py +0 -0
  36. mx_bluesky/{hyperion → common}/external_interaction/nexus/nexus_utils.py +21 -6
  37. mx_bluesky/{hyperion → common}/external_interaction/nexus/write_nexus.py +5 -5
  38. mx_bluesky/common/external_interaction/test_config_server.py +38 -0
  39. mx_bluesky/common/parameters/components.py +10 -8
  40. mx_bluesky/common/parameters/constants.py +6 -0
  41. mx_bluesky/common/parameters/gridscan.py +102 -53
  42. mx_bluesky/common/plans/do_fgs.py +4 -4
  43. mx_bluesky/{hyperion → common/utils}/exceptions.py +27 -1
  44. mx_bluesky/common/utils/log.py +17 -7
  45. mx_bluesky/hyperion/__main__.py +15 -14
  46. mx_bluesky/hyperion/device_setup_plans/check_beamstop.py +27 -0
  47. mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py +34 -37
  48. mx_bluesky/hyperion/device_setup_plans/manipulate_sample.py +7 -7
  49. mx_bluesky/hyperion/device_setup_plans/position_detector.py +1 -1
  50. mx_bluesky/hyperion/device_setup_plans/read_hardware_for_setup.py +3 -3
  51. mx_bluesky/hyperion/device_setup_plans/setup_panda.py +21 -4
  52. mx_bluesky/hyperion/device_setup_plans/setup_zebra.py +62 -36
  53. mx_bluesky/hyperion/device_setup_plans/smargon.py +3 -3
  54. mx_bluesky/hyperion/device_setup_plans/utils.py +4 -0
  55. mx_bluesky/hyperion/device_setup_plans/xbpm_feedback.py +8 -8
  56. mx_bluesky/hyperion/experiment_plans/change_aperture_then_move_plan.py +28 -17
  57. mx_bluesky/hyperion/experiment_plans/common/xrc_result.py +10 -1
  58. mx_bluesky/hyperion/experiment_plans/experiment_registry.py +9 -9
  59. mx_bluesky/hyperion/experiment_plans/flyscan_xray_centre_plan.py +54 -58
  60. mx_bluesky/hyperion/experiment_plans/grid_detect_then_xray_centre_plan.py +22 -31
  61. mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py +57 -40
  62. mx_bluesky/hyperion/experiment_plans/oav_grid_detection_plan.py +3 -3
  63. mx_bluesky/hyperion/experiment_plans/oav_snapshot_plan.py +8 -2
  64. mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py +6 -14
  65. mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py +12 -11
  66. mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py +4 -4
  67. mx_bluesky/hyperion/experiment_plans/robot_load_and_change_energy.py +39 -30
  68. mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py +36 -18
  69. mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py +33 -21
  70. mx_bluesky/hyperion/experiment_plans/set_energy_plan.py +10 -9
  71. mx_bluesky/hyperion/external_interaction/callbacks/__init__.py +0 -4
  72. mx_bluesky/hyperion/external_interaction/callbacks/__main__.py +31 -20
  73. mx_bluesky/hyperion/external_interaction/callbacks/common/callback_util.py +46 -30
  74. mx_bluesky/hyperion/external_interaction/callbacks/robot_load/ispyb_callback.py +39 -24
  75. mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_callback.py +25 -24
  76. mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_mapping.py +1 -1
  77. mx_bluesky/hyperion/external_interaction/callbacks/rotation/nexus_callback.py +13 -9
  78. mx_bluesky/hyperion/external_interaction/callbacks/sample_handling/__init__.py +0 -0
  79. mx_bluesky/hyperion/external_interaction/callbacks/sample_handling/sample_handling_callback.py +50 -0
  80. mx_bluesky/hyperion/external_interaction/config_server.py +15 -1
  81. mx_bluesky/hyperion/parameters/components.py +3 -2
  82. mx_bluesky/hyperion/parameters/constants.py +1 -0
  83. mx_bluesky/hyperion/parameters/gridscan.py +56 -89
  84. mx_bluesky/hyperion/parameters/load_centre_collect.py +51 -6
  85. mx_bluesky/hyperion/parameters/robot_load.py +40 -0
  86. mx_bluesky/hyperion/parameters/rotation.py +28 -3
  87. mx_bluesky/hyperion/utils/context.py +1 -1
  88. mx_bluesky/hyperion/utils/validation.py +5 -3
  89. {mx_bluesky-1.4.1a0.dist-info → mx_bluesky-1.4.3.dist-info}/METADATA +6 -6
  90. mx_bluesky-1.4.3.dist-info/RECORD +155 -0
  91. {mx_bluesky-1.4.1a0.dist-info → mx_bluesky-1.4.3.dist-info}/WHEEL +1 -1
  92. mx_bluesky/common/parameters/robot_load.py +0 -16
  93. mx_bluesky/hyperion/external_interaction/exceptions.py +0 -13
  94. mx_bluesky/hyperion/log.py +0 -15
  95. mx_bluesky-1.4.1a0.dist-info/RECORD +0 -150
  96. /mx_bluesky/{hyperion/external_interaction/callbacks/xray_centre → common/external_interaction}/__init__.py +0 -0
  97. /mx_bluesky/{hyperion/external_interaction/ispyb → common/external_interaction/callbacks/common}/__init__.py +0 -0
  98. /mx_bluesky/{hyperion → common}/external_interaction/callbacks/common/abstract_event.py +0 -0
  99. /mx_bluesky/{hyperion/external_interaction/callbacks → common/external_interaction/callbacks/common}/log_uid_tag_callback.py +0 -0
  100. /mx_bluesky/{hyperion/external_interaction/callbacks → common/external_interaction/callbacks/common}/plan_reactive_callback.py +0 -0
  101. /mx_bluesky/{hyperion/external_interaction/nexus → common/external_interaction/callbacks/xray_centre}/__init__.py +0 -0
  102. /mx_bluesky/{hyperion → common}/utils/utils.py +0 -0
  103. {mx_bluesky-1.4.1a0.dist-info → mx_bluesky-1.4.3.dist-info}/LICENSE +0 -0
  104. {mx_bluesky-1.4.1a0.dist-info → mx_bluesky-1.4.3.dist-info}/entry_points.txt +0 -0
  105. {mx_bluesky-1.4.1a0.dist-info → mx_bluesky-1.4.3.dist-info}/top_level.txt +0 -0
@@ -7,27 +7,22 @@ from dodal.devices.fast_grid_scan import (
7
7
  PandAGridScanParams,
8
8
  ZebraGridScanParams,
9
9
  )
10
- from pydantic import Field, PrivateAttr
11
- from scanspec.core import Path as ScanPath
12
- from scanspec.specs import Line, Static
13
-
14
- from mx_bluesky.common.parameters.components import (
15
- SplitScan,
16
- WithOptionalEnergyChange,
17
- WithPandaGridScan,
18
- )
10
+ from pydantic import Field
11
+
12
+ from mx_bluesky.common.parameters.constants import GridscanParamConstants
19
13
  from mx_bluesky.common.parameters.gridscan import (
20
14
  GridCommon,
21
- SpecifiedGrid,
15
+ SpecifiedThreeDGridScan,
22
16
  )
23
- from mx_bluesky.hyperion.parameters.components import WithHyperionFeatures
17
+ from mx_bluesky.hyperion.parameters.components import WithHyperionUDCFeatures
24
18
  from mx_bluesky.hyperion.parameters.constants import CONST, I03Constants
25
19
 
26
20
 
27
- class HyperionGridCommon(GridCommon, WithHyperionFeatures):
28
- # This class only exists so that we can properly select enable_dev_shm. Remove in
29
- # https://github.com/DiamondLightSource/hyperion/issues/1395"""
21
+ class GridCommonWithHyperionDetectorParams(GridCommon, WithHyperionUDCFeatures):
22
+ """Used by models which require detector parameters but have no specifications of the grid"""
30
23
 
24
+ # These detector params only exist so that we can properly select enable_dev_shm. Remove in
25
+ # https://github.com/DiamondLightSource/hyperion/issues/1395"""
31
26
  @property
32
27
  def detector_params(self):
33
28
  self.det_dist_to_beam_converter_path = (
@@ -37,9 +32,9 @@ class HyperionGridCommon(GridCommon, WithHyperionFeatures):
37
32
  optional_args = {}
38
33
  if self.run_number:
39
34
  optional_args["run_number"] = self.run_number
40
- assert (
41
- self.detector_distance_mm is not None
42
- ), "Detector distance must be filled before generating DetectorParams"
35
+ assert self.detector_distance_mm is not None, (
36
+ "Detector distance must be filled before generating DetectorParams"
37
+ )
43
38
  return DetectorParams(
44
39
  detector_size_constants=I03Constants.DETECTOR,
45
40
  expected_energy_ev=self.demand_energy_ev,
@@ -59,28 +54,42 @@ class HyperionGridCommon(GridCommon, WithHyperionFeatures):
59
54
  )
60
55
 
61
56
 
62
- class HyperionThreeDGridScan(
63
- HyperionGridCommon,
64
- SpecifiedGrid,
65
- SplitScan,
66
- WithOptionalEnergyChange,
67
- WithPandaGridScan,
68
- ):
69
- """Parameters representing a so-called 3D grid scan, which consists of doing a
70
- gridscan in X and Y, followed by one in X and Z."""
71
-
72
- grid1_omega_deg: float = Field(default=CONST.PARAM.GRIDSCAN.OMEGA_1) # type: ignore
73
- grid2_omega_deg: float = Field(default=CONST.PARAM.GRIDSCAN.OMEGA_2)
74
- x_step_size_um: float = Field(default=CONST.PARAM.GRIDSCAN.BOX_WIDTH_UM)
75
- y_step_size_um: float = Field(default=CONST.PARAM.GRIDSCAN.BOX_WIDTH_UM)
76
- z_step_size_um: float = Field(default=CONST.PARAM.GRIDSCAN.BOX_WIDTH_UM)
77
- y2_start_um: float
78
- z2_start_um: float
79
- x_steps: int = Field(gt=0)
80
- y_steps: int = Field(gt=0)
81
- z_steps: int = Field(gt=0)
82
- _set_stub_offsets: bool = PrivateAttr(default_factory=lambda: False)
57
+ class HyperionSpecifiedThreeDGridScan(SpecifiedThreeDGridScan, WithHyperionUDCFeatures):
58
+ """Hyperion's 3D grid scan deviates from the common class due to: optionally using a PandA, optionally using dev_shm for GPU analysis, and using a config server for features"""
59
+
60
+ # These detector params only exist so that we can properly select enable_dev_shm. Remove in
61
+ # https://github.com/DiamondLightSource/hyperion/issues/1395"""
62
+ @property
63
+ def detector_params(self):
64
+ self.det_dist_to_beam_converter_path = (
65
+ self.det_dist_to_beam_converter_path
66
+ or CONST.PARAM.DETECTOR.BEAM_XY_LUT_PATH
67
+ )
68
+ optional_args = {}
69
+ if self.run_number:
70
+ optional_args["run_number"] = self.run_number
71
+ assert self.detector_distance_mm is not None, (
72
+ "Detector distance must be filled before generating DetectorParams"
73
+ )
74
+ return DetectorParams(
75
+ detector_size_constants=I03Constants.DETECTOR,
76
+ expected_energy_ev=self.demand_energy_ev,
77
+ exposure_time=self.exposure_time_s,
78
+ directory=self.storage_directory,
79
+ prefix=self.file_name,
80
+ detector_distance=self.detector_distance_mm,
81
+ omega_start=self.omega_start_deg or 0,
82
+ omega_increment=0,
83
+ num_images_per_trigger=1,
84
+ num_triggers=self.num_images,
85
+ use_roi_mode=self.use_roi_mode,
86
+ det_dist_to_beam_converter_path=self.det_dist_to_beam_converter_path,
87
+ trigger_mode=self.trigger_mode,
88
+ enable_dev_shm=self.features.compare_cpu_and_gpu_zocalo,
89
+ **optional_args,
90
+ )
83
91
 
92
+ # Relative to common grid scan, stub offsets are defined by config server
84
93
  @property
85
94
  def FGS_params(self) -> ZebraGridScanParams:
86
95
  return ZebraGridScanParams(
@@ -124,59 +133,17 @@ class HyperionThreeDGridScan(
124
133
  transmission_fraction=self.transmission_frac,
125
134
  )
126
135
 
127
- def do_set_stub_offsets(self, value: bool):
128
- self._set_stub_offsets = value
129
-
130
- @property
131
- def grid_1_spec(self):
132
- x_end = self.x_start_um + self.x_step_size_um * (self.x_steps - 1)
133
- y1_end = self.y_start_um + self.y_step_size_um * (self.y_steps - 1)
134
- grid_1_x = Line("sam_x", self.x_start_um, x_end, self.x_steps)
135
- grid_1_y = Line("sam_y", self.y_start_um, y1_end, self.y_steps)
136
- grid_1_z = Static("sam_z", self.z_start_um)
137
- return grid_1_y.zip(grid_1_z) * ~grid_1_x
138
-
139
- @property
140
- def grid_2_spec(self):
141
- x_end = self.x_start_um + self.x_step_size_um * (self.x_steps - 1)
142
- z2_end = self.z2_start_um + self.z_step_size_um * (self.z_steps - 1)
143
- grid_2_x = Line("sam_x", self.x_start_um, x_end, self.x_steps)
144
- grid_2_z = Line("sam_z", self.z2_start_um, z2_end, self.z_steps)
145
- grid_2_y = Static("sam_y", self.y2_start_um)
146
- return grid_2_z.zip(grid_2_y) * ~grid_2_x
147
-
148
- @property
149
- def scan_indices(self):
150
- """The first index of each gridscan, useful for writing nexus files/VDS"""
151
- return [
152
- 0,
153
- len(ScanPath(self.grid_1_spec.calculate()).consume().midpoints["sam_x"]),
154
- ]
155
-
156
- @property
157
- def scan_spec(self):
158
- """A fully specified ScanSpec object representing both grids, with x, y, z and
159
- omega positions."""
160
- return self.grid_1_spec.concat(self.grid_2_spec)
161
136
 
162
- @property
163
- def scan_points(self):
164
- """A list of all the points in the scan_spec."""
165
- return ScanPath(self.scan_spec.calculate()).consume().midpoints
166
-
167
- @property
168
- def scan_points_first_grid(self):
169
- """A list of all the points in the first grid scan."""
170
- return ScanPath(self.grid_1_spec.calculate()).consume().midpoints
137
+ class OddYStepsException(Exception): ...
171
138
 
172
- @property
173
- def scan_points_second_grid(self):
174
- """A list of all the points in the second grid scan."""
175
- return ScanPath(self.grid_2_spec.calculate()).consume().midpoints
176
139
 
177
- @property
178
- def num_images(self) -> int:
179
- return len(self.scan_points["sam_x"])
140
+ class PinTipCentreThenXrayCentre(
141
+ GridCommonWithHyperionDetectorParams, WithHyperionUDCFeatures
142
+ ):
143
+ tip_offset_um: float = 0
180
144
 
181
145
 
182
- class OddYStepsException(Exception): ...
146
+ class GridScanWithEdgeDetect(
147
+ GridCommonWithHyperionDetectorParams, WithHyperionUDCFeatures
148
+ ):
149
+ box_size_um: float = Field(default=GridscanParamConstants.BOX_WIDTH_UM)
@@ -1,4 +1,4 @@
1
- from typing import TypeVar
1
+ from typing import Self, TypeVar
2
2
 
3
3
  from pydantic import BaseModel, model_validator
4
4
 
@@ -8,7 +8,8 @@ from mx_bluesky.common.parameters.components import (
8
8
  WithSample,
9
9
  WithVisit,
10
10
  )
11
- from mx_bluesky.common.parameters.gridscan import (
11
+ from mx_bluesky.hyperion.parameters.components import WithHyperionUDCFeatures
12
+ from mx_bluesky.hyperion.parameters.robot_load import (
12
13
  RobotLoadThenCentre,
13
14
  )
14
15
  from mx_bluesky.hyperion.parameters.rotation import MultiRotationScan
@@ -23,7 +24,11 @@ def construct_from_values(parent_context: dict, child_dict: dict, t: type[T]) ->
23
24
 
24
25
 
25
26
  class LoadCentreCollect(
26
- MxBlueskyParameters, WithVisit, WithSample, WithCentreSelection
27
+ MxBlueskyParameters,
28
+ WithVisit,
29
+ WithSample,
30
+ WithCentreSelection,
31
+ WithHyperionUDCFeatures,
27
32
  ):
28
33
  """Experiment parameters to perform the combined robot load,
29
34
  pin-tip centre and rotation scan operations."""
@@ -39,10 +44,31 @@ class LoadCentreCollect(
39
44
  | RobotLoadThenCentre.model_fields.keys()
40
45
  | MultiRotationScan.model_fields.keys()
41
46
  )
47
+
42
48
  disallowed_keys = values.keys() - allowed_keys
43
- assert (
44
- disallowed_keys == set()
45
- ), f"Unexpected fields found in LoadCentreCollect {disallowed_keys}"
49
+ assert disallowed_keys == set(), (
50
+ f"Unexpected fields found in LoadCentreCollect {disallowed_keys}"
51
+ )
52
+
53
+ keys_from_outer_load_centre_collect = (
54
+ MxBlueskyParameters.model_fields.keys()
55
+ | WithSample.model_fields.keys()
56
+ | WithVisit.model_fields.keys()
57
+ )
58
+ duplicated_robot_load_then_centre_keys = (
59
+ keys_from_outer_load_centre_collect
60
+ & values["robot_load_then_centre"].keys()
61
+ )
62
+ assert not (duplicated_robot_load_then_centre_keys), (
63
+ f"Unexpected keys in robot_load_then_centre: {', '.join(duplicated_robot_load_then_centre_keys)}"
64
+ )
65
+
66
+ duplicated_multi_rotation_scan_keys = (
67
+ keys_from_outer_load_centre_collect & values["multi_rotation_scan"].keys()
68
+ )
69
+ assert not (duplicated_multi_rotation_scan_keys), (
70
+ f"Unexpected keys in multi_rotation_scan: {', '.join(duplicated_multi_rotation_scan_keys)}"
71
+ )
46
72
 
47
73
  new_robot_load_then_centre_params = construct_from_values(
48
74
  values, values["robot_load_then_centre"], RobotLoadThenCentre
@@ -53,3 +79,22 @@ class LoadCentreCollect(
53
79
  values["multi_rotation_scan"] = new_multi_rotation_scan_params
54
80
  values["robot_load_then_centre"] = new_robot_load_then_centre_params
55
81
  return values
82
+
83
+ @model_validator(mode="after")
84
+ def _check_rotation_start_xyz_is_not_specified(self) -> Self:
85
+ for scan in self.multi_rotation_scan.single_rotation_scans:
86
+ assert (
87
+ not scan.x_start_um and not scan.y_start_um and not scan.z_start_um
88
+ ), (
89
+ "Specifying start xyz for sweeps is not supported in combination with centring."
90
+ )
91
+ return self
92
+
93
+ @model_validator(mode="after")
94
+ def _check_different_gridscan_and_rotation_energy_not_specified(self) -> Self:
95
+ assert (
96
+ self.multi_rotation_scan.demand_energy_ev is None
97
+ or self.multi_rotation_scan.demand_energy_ev
98
+ == self.robot_load_then_centre.demand_energy_ev
99
+ ), "Setting a different energy for gridscan and rotation is not supported."
100
+ return self
@@ -0,0 +1,40 @@
1
+ from pydantic import Field
2
+
3
+ from mx_bluesky.common.parameters.components import (
4
+ MxBlueskyParameters,
5
+ WithOptionalEnergyChange,
6
+ WithSample,
7
+ WithSnapshot,
8
+ WithVisit,
9
+ )
10
+ from mx_bluesky.common.parameters.constants import (
11
+ HardwareConstants,
12
+ )
13
+ from mx_bluesky.hyperion.parameters.components import WithHyperionUDCFeatures
14
+ from mx_bluesky.hyperion.parameters.gridscan import (
15
+ GridCommonWithHyperionDetectorParams,
16
+ PinTipCentreThenXrayCentre,
17
+ )
18
+
19
+
20
+ class RobotLoadAndEnergyChange(
21
+ MxBlueskyParameters, WithSample, WithSnapshot, WithOptionalEnergyChange, WithVisit
22
+ ):
23
+ thawing_time: float = Field(default=HardwareConstants.THAWING_TIME)
24
+
25
+
26
+ class RobotLoadThenCentre(
27
+ GridCommonWithHyperionDetectorParams, WithHyperionUDCFeatures
28
+ ):
29
+ thawing_time: float = Field(default=HardwareConstants.THAWING_TIME)
30
+
31
+ @property
32
+ def robot_load_params(self) -> RobotLoadAndEnergyChange:
33
+ my_params = self.model_dump()
34
+ return RobotLoadAndEnergyChange(**my_params)
35
+
36
+ @property
37
+ def pin_centre_then_xray_centre_params(self) -> PinTipCentreThenXrayCentre:
38
+ my_params = self.model_dump()
39
+ del my_params["thawing_time"]
40
+ return PinTipCentreThenXrayCentre(**my_params)
@@ -3,12 +3,12 @@ from __future__ import annotations
3
3
  import os
4
4
  from collections.abc import Iterator
5
5
  from itertools import accumulate
6
- from typing import Annotated, Any
6
+ from typing import Annotated, Any, Self
7
7
 
8
8
  from annotated_types import Len
9
9
  from dodal.devices.aperturescatterguard import ApertureValue
10
10
  from dodal.devices.detector import DetectorParams
11
- from dodal.devices.zebra import (
11
+ from dodal.devices.zebra.zebra import (
12
12
  RotationDirection,
13
13
  )
14
14
  from dodal.log import LOGGER
@@ -26,6 +26,7 @@ from mx_bluesky.common.parameters.components import (
26
26
  SplitScan,
27
27
  WithScan,
28
28
  )
29
+ from mx_bluesky.hyperion.parameters.components import WithHyperionUDCFeatures
29
30
  from mx_bluesky.hyperion.parameters.constants import (
30
31
  CONST,
31
32
  I03Constants,
@@ -33,6 +34,18 @@ from mx_bluesky.hyperion.parameters.constants import (
33
34
 
34
35
 
35
36
  class RotationScanPerSweep(OptionalGonioAngleStarts, OptionalXyzStarts):
37
+ """
38
+ Describes a rotation scan about the specified axis.
39
+
40
+ Attributes:
41
+ rotation_axis: The rotation axis, by default this is the omega axis
42
+ omega_start_deg: The initial angle of the rotation in degrees (default 0)
43
+ scan_width_deg: The sweep of the rotation in degrees, this must be positive (default 360)
44
+ rotation_direction: Indicates the direction of rotation, if RotationDirection.POSITIVE
45
+ the final angle is obtained by adding scan_width_deg, otherwise by subtraction (default NEGATIVE)
46
+ nexus_vds_start_img: The frame number of the first frame captured during the rotation
47
+ """
48
+
36
49
  omega_start_deg: float = Field(default=0) # type: ignore
37
50
  rotation_axis: RotationAxis = Field(default=RotationAxis.OMEGA)
38
51
  scan_width_deg: float = Field(default=360, gt=0)
@@ -40,7 +53,7 @@ class RotationScanPerSweep(OptionalGonioAngleStarts, OptionalXyzStarts):
40
53
  nexus_vds_start_img: int = Field(default=0, ge=0)
41
54
 
42
55
 
43
- class RotationExperiment(DiffractionExperimentWithSample):
56
+ class RotationExperiment(DiffractionExperimentWithSample, WithHyperionUDCFeatures):
44
57
  shutter_opening_time_s: float = Field(default=CONST.I03.SHUTTER_TIME_S)
45
58
  rotation_increment_deg: float = Field(default=0.1, gt=0)
46
59
  ispyb_experiment_type: IspybExperimentType = Field(
@@ -98,6 +111,7 @@ class RotationScan(WithScan, RotationScanPerSweep, RotationExperiment):
98
111
 
99
112
  @property
100
113
  def scan_points(self) -> AxesPoints:
114
+ """The scan points are defined in application space"""
101
115
  scan_spec = Line(
102
116
  axis="omega",
103
117
  start=self.omega_start_deg,
@@ -141,6 +155,17 @@ class MultiRotationScan(RotationExperiment, SplitScan):
141
155
  start_img += scan.scan_width_deg / values.rotation_increment_deg
142
156
  return values
143
157
 
158
+ @model_validator(mode="after")
159
+ def _check_valid_for_single_arm_multiple_sweep(self) -> Self:
160
+ if len(self.rotation_scans) > 0:
161
+ scan_width = self.rotation_scans[0].scan_width_deg
162
+ for scan in self.rotation_scans[1:]:
163
+ assert scan.scan_width_deg == scan_width, (
164
+ "Sweeps with different numbers of frames are not supported."
165
+ )
166
+
167
+ return self
168
+
144
169
  @property
145
170
  def single_rotation_scans(self) -> Iterator[RotationScan]:
146
171
  for scan in self.rotation_scans:
@@ -6,7 +6,7 @@ from blueapi.core.bluesky_types import Device
6
6
  from dodal.utils import get_beamline_based_on_environment_variable
7
7
 
8
8
  import mx_bluesky.hyperion.experiment_plans as hyperion_plans
9
- from mx_bluesky.hyperion.log import LOGGER
9
+ from mx_bluesky.common.utils.log import LOGGER
10
10
 
11
11
  T = TypeVar("T", bound=Device)
12
12
 
@@ -9,7 +9,7 @@ import bluesky.preprocessors as bpp
9
9
  from bluesky.run_engine import RunEngine
10
10
  from dodal.beamlines import i03
11
11
  from dodal.devices.oav.oav_parameters import OAVConfig
12
- from ophyd_async.core import set_mock_value
12
+ from ophyd_async.testing import set_mock_value
13
13
 
14
14
  from mx_bluesky.hyperion.device_setup_plans.read_hardware_for_setup import (
15
15
  read_hardware_during_collection,
@@ -62,7 +62,7 @@ def fake_rotation_scan(
62
62
  @bpp.run_decorator( # attach experiment metadata to the start document
63
63
  md={
64
64
  "subplan_name": CONST.PLAN.ROTATION_OUTER,
65
- "hyperion_parameters": parameters.model_dump_json(),
65
+ "mx_bluesky_parameters": parameters.model_dump_json(),
66
66
  "activate_callbacks": "RotationNexusFileCallback",
67
67
  }
68
68
  )
@@ -79,6 +79,7 @@ def fake_rotation_scan(
79
79
 
80
80
 
81
81
  def fake_create_rotation_devices():
82
+ beamstop = i03.beamstop(fake_with_ophyd_sim=True)
82
83
  eiger = i03.eiger(fake_with_ophyd_sim=True)
83
84
  smargon = i03.smargon(fake_with_ophyd_sim=True)
84
85
  zebra = i03.zebra(fake_with_ophyd_sim=True)
@@ -106,6 +107,7 @@ def fake_create_rotation_devices():
106
107
  return RotationScanComposite(
107
108
  attenuator=attenuator,
108
109
  backlight=backlight,
110
+ beamstop=beamstop,
109
111
  dcm=dcm,
110
112
  detector_motion=detector_motion,
111
113
  eiger=eiger,
@@ -135,7 +137,7 @@ def sim_rotation_scan_to_create_nexus(
135
137
  fake_create_rotation_devices.eiger.bit_depth.sim_put(32) # type: ignore
136
138
 
137
139
  with patch(
138
- "mx_bluesky.hyperion.external_interaction.nexus.write_nexus.get_start_and_predicted_end_time",
140
+ "mx_bluesky.common.external_interaction.nexus.write_nexus.get_start_and_predicted_end_time",
139
141
  return_value=("test_time", "test_time"),
140
142
  ):
141
143
  RE(
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: mx-bluesky
3
- Version: 1.4.1a0
3
+ Version: 1.4.3
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
@@ -226,7 +226,7 @@ Requires-Dist: opencv-python
226
226
  Requires-Dist: opentelemetry-distro
227
227
  Requires-Dist: opentelemetry-exporter-otlp
228
228
  Requires-Dist: pydantic
229
- Requires-Dist: pydantic-extra-types
229
+ Requires-Dist: pydantic-extra-types>=2.10.1
230
230
  Requires-Dist: pyepics
231
231
  Requires-Dist: pyzmq
232
232
  Requires-Dist: requests
@@ -238,8 +238,8 @@ Requires-Dist: blueapi>=0.5.0
238
238
  Requires-Dist: daq-config-server>=0.1.1
239
239
  Requires-Dist: ophyd==1.9.0
240
240
  Requires-Dist: ophyd-async>=0.8a5
241
- Requires-Dist: bluesky>=1.13.0a4
242
- Requires-Dist: dls-dodal==1.36.1a
241
+ Requires-Dist: bluesky>=1.13
242
+ Requires-Dist: dls-dodal==1.38.0
243
243
  Provides-Extra: dev
244
244
  Requires-Dist: black; extra == "dev"
245
245
  Requires-Dist: build; extra == "dev"
@@ -250,6 +250,7 @@ Requires-Dist: ipython; extra == "dev"
250
250
  Requires-Dist: mypy; extra == "dev"
251
251
  Requires-Dist: myst-parser; extra == "dev"
252
252
  Requires-Dist: pipdeptree; extra == "dev"
253
+ Requires-Dist: plantweb; extra == "dev"
253
254
  Requires-Dist: pre-commit; extra == "dev"
254
255
  Requires-Dist: pydata-sphinx-theme>=0.12; extra == "dev"
255
256
  Requires-Dist: pyright; extra == "dev"
@@ -260,7 +261,6 @@ Requires-Dist: pytest; extra == "dev"
260
261
  Requires-Dist: ruff; extra == "dev"
261
262
  Requires-Dist: sphinx-autobuild; extra == "dev"
262
263
  Requires-Dist: sphinx-copybutton; extra == "dev"
263
- Requires-Dist: sphinxcontrib-plantuml; extra == "dev"
264
264
  Requires-Dist: sphinx-design; extra == "dev"
265
265
  Requires-Dist: tox-direct; extra == "dev"
266
266
  Requires-Dist: tox; extra == "dev"
@@ -0,0 +1,155 @@
1
+ mx_bluesky/__init__.py,sha256=Ksms_WJF8LTkbm38gEpm1jBpGqcQ8NGvmb2ZJlOE1j8,198
2
+ mx_bluesky/__main__.py,sha256=RVqPnxDisFMIn_aoEi0drlThNHgKTJULnSrotouIKI0,480
3
+ mx_bluesky/_version.py,sha256=cUUlK35wR7qLNaS4SMOrkRP_HG0nSHq0YEIezhPHr3c,411
4
+ mx_bluesky/jupyter_example.ipynb,sha256=wpwvPrBvwtRMS5AIFk8F54cIlUoD0o4ji8tKK5cZHA4,1672
5
+ mx_bluesky/beamlines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ mx_bluesky/beamlines/i04/__init__.py,sha256=jZjAMN5_oOEjQoR3iTrnMFW3ElxlHhQ7pEQZIv21Y4I,129
7
+ mx_bluesky/beamlines/i04/redis_to_murko_forwarder.py,sha256=10PKvDRKaaTtlOCfRG8T00XwpIFR9m8jk96QES13LpQ,5894
8
+ mx_bluesky/beamlines/i04/thawing_plan.py,sha256=YykXHXINBDnQ0wJ577v4XrXwcqlRRgoUSbaNuOKd1bc,5464
9
+ mx_bluesky/beamlines/i04/callbacks/murko_callback.py,sha256=ZIwkY6gdcmIE-aMBvehN8DVcjGRtb9wwzpgHJNMZ39Q,2125
10
+ mx_bluesky/beamlines/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ mx_bluesky/beamlines/i24/serial/__init__.py,sha256=gSP8Vu9PMDeIgzge48XS3bOdmvb_a9k8RQP98BNcdZg,1080
12
+ mx_bluesky/beamlines/i24/serial/blueapi_config.yaml,sha256=gwOfjzZMbcvpVH71CCyHaxr8hgPYCJIWWWfg1zErtmM,245
13
+ mx_bluesky/beamlines/i24/serial/dcid.py,sha256=iT2mXcS7bG1rQ1l_VlENNh47vsB0CwxRar8I_BHD4AA,14486
14
+ mx_bluesky/beamlines/i24/serial/log.py,sha256=oK7HHjIeuiWdy1vNZL6p-mU8Y3kzeCAgsifCxhAYqOQ,4799
15
+ mx_bluesky/beamlines/i24/serial/run_extruder.sh,sha256=FXYsqdTpVgxB1-QrY4Tg5pl5Ex7PgUoXnuAcr9iDZTE,1078
16
+ mx_bluesky/beamlines/i24/serial/run_fixed_target.sh,sha256=ZzxcVFoitBRvcqsJaBxjtepgkG-ZCGBW6X9xuV_Y478,1229
17
+ mx_bluesky/beamlines/i24/serial/run_serial.py,sha256=Zrudosavh2HnnBXd2CLtOPs3lyQFxaN8YyO_sradRGs,1511
18
+ mx_bluesky/beamlines/i24/serial/run_ssx.sh,sha256=0Ir5iQQ-xSN_5teHtxzht6G-mJ08mE1gxBS32vkh1eM,714
19
+ mx_bluesky/beamlines/i24/serial/set_visit_directory.sh,sha256=WuN5PUBxTofzuESk1-3gWtTcbPjOx-26JaQSVCsZhZs,1660
20
+ mx_bluesky/beamlines/i24/serial/start_blueapi.sh,sha256=4iBzQljTLXQiVIF4UO7drc9qUkP7KSRC6Mjh8hcGxpI,608
21
+ mx_bluesky/beamlines/i24/serial/write_nexus.py,sha256=wb9tQwiWL5BH_XgLH-S9TS5_M2WYMasZzyOiiwjG5z8,3950
22
+ mx_bluesky/beamlines/i24/serial/extruder/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
+ mx_bluesky/beamlines/i24/serial/extruder/i24ssx_Extruder_Collect_py3v2.py,sha256=R4Y6axJjULq9ejdRCymNABiAty-uTaZRES5cs8c0-XI,18833
24
+ mx_bluesky/beamlines/i24/serial/extruder/EX-gui-edm/DetStage.edl,sha256=9L1CgEdxZD4N3QvM5HLlAlJTcxpzd4ahB2nVJ9jHujw,2013
25
+ mx_bluesky/beamlines/i24/serial/extruder/EX-gui-edm/DiamondExtruder-I24-py3v1.edl,sha256=JaS-PvAHEOqHRuH3LbdpOk2T-TlO8Enq_uwzokQXzZU,31349
26
+ mx_bluesky/beamlines/i24/serial/extruder/EX-gui-edm/microdrop_alignment.edl,sha256=K79vmGAcf9qVEQLXTgr0g4bZDWaJ7nFoK4e0Ex7qAwM,14690
27
+ mx_bluesky/beamlines/i24/serial/fixed_target/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
+ mx_bluesky/beamlines/i24/serial/fixed_target/ft_utils.py,sha256=puO1vg0x-TPgv8FbEFg73ohJqbwDpcG50_2cLUTa2FA,1210
29
+ mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Collect_py3v1.py,sha256=NgeorAKdXxYDFEkcy4jAq2CFNdqDT--TWSul4bsGkw4,26154
30
+ mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_Manager_py3v1.py,sha256=DbdkQkZFkhGDzi_Xcu1YB2LqHzsQyf-RubphIDbQe4k,33196
31
+ mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_Chip_StartUp_py3v1.py,sha256=Vokr_Gl_lpqcUwG18C2h8TYMmyTx1HmUSDd9zgR9-7M,3275
32
+ mx_bluesky/beamlines/i24/serial/fixed_target/i24ssx_moveonclick.py,sha256=qciUnif6yd5KwJ8_XvRgafHJOFnzJIMg5Bwfjp0VOzw,6418
33
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/CustomChip_py3v1.edl,sha256=H9BVU1S3oy8tAVHtKvJvp7YTHA-4X-jtOtiu3jJ7of4,10348
34
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/DetStage.edl,sha256=WBji5SaRQ5e0KFRgrPuv6IgaFxkal1jh7MZW8SqQN88,2016
35
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/DiamondChipI24-py3v1.edl,sha256=-O_kRA5-m741Mja8OXQlGJWrRu9uBUkTvJ_uqUBjuFY,56616
36
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/ME14E-GeneralPurpose.edl,sha256=cpKpXfU668mGjIz35jUMTF8KAi0RI7WlVO2AR-EnJ8U,60868
37
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/MappingLite-oxford_py3v1.edl,sha256=LI6Z5J1ugny0hX3NrfKx0CC3QdfnohokxYwcyPW-6XU,38124
38
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/PMAC_Command.edl,sha256=2KUy2iEcX9AC07zSH3Sp97b5qauGIm8_HjvoQ4pkyCU,1417
39
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/Shutter_Control.edl,sha256=o2PDoIFzeErIUijDbGdfWdrh3wd5GFAqEsDD2at2a4k,1601
40
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/microdrop_alignment.edl,sha256=8TWQTIBnX3OLa1kjsibsCnG5wCVotPYIOHwFam7rJe4,14679
41
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/nudgechip.edl,sha256=IgLLF7gcNoG8Z4t9FTA7_4ggUccNm6-ekK5bb0V4ekY,15711
42
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/pumpprobe-py3v1.edl,sha256=CrCo1nSIzT3OcSy4OXq1vu4lz5OvI4U8-yl-ruQ57m4,22665
43
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/short1-laser.png,sha256=wDNuKCa_8hUPy4W01vdIrfdZtCyQKT8qVS5AS6kOTmo,9740
44
+ mx_bluesky/beamlines/i24/serial/fixed_target/FT-gui-edm/short2-laser.png,sha256=MrdiCFX7j-ODkfSdzc4NQ_8hj2Gs8i9gQqWyNXvdM5s,10189
45
+ mx_bluesky/beamlines/i24/serial/parameters/__init__.py,sha256=fdXGnTxNRyWV1cqVv8lQmwhUpUWDoz_VIRlo6KGwvS4,615
46
+ mx_bluesky/beamlines/i24/serial/parameters/constants.py,sha256=oFneLWl70pmA9Q9mrsFga_F0EtkFgoQRDPKg-Udhog8,1815
47
+ mx_bluesky/beamlines/i24/serial/parameters/experiment_parameters.py,sha256=n6nRgycKMp5GuxwNoU30CP9enW7vTtTKHKIcIOH9ABY,4879
48
+ mx_bluesky/beamlines/i24/serial/parameters/utils.py,sha256=VcCEBjC8WSrf85Q20A6dwnsy4IxvjcB4JSlbYKz_CVM,2673
49
+ mx_bluesky/beamlines/i24/serial/parameters/fixed_target/cs/cs_maker.json,sha256=xT3y7SSWjVTAJ58dzwNnEgBdn10A6T8umR18n5xt508,142
50
+ mx_bluesky/beamlines/i24/serial/parameters/fixed_target/cs/motor_direction.txt,sha256=oIPpcQpqCrKz5dPZ-qQ5gQ2Sdqtj6nsnf66pN8PGU50,199
51
+ mx_bluesky/beamlines/i24/serial/parameters/fixed_target/pvar_files/minichip-oxford.pvar,sha256=SN4deU199dMcA1Bcx1BF6CBMvoSszxJWZC6vt7_5fHc,284
52
+ mx_bluesky/beamlines/i24/serial/parameters/fixed_target/pvar_files/oxford.pvar,sha256=pZbFOEiN_S5yiTEtqdNHmTMtnQY-W2ImXVBYCovPCx0,1842
53
+ mx_bluesky/beamlines/i24/serial/setup_beamline/__init__.py,sha256=UhBdMcPdJMzwV0d8DKOBzvYNd6TDSwcP9GJVqfGa7Jc,261
54
+ mx_bluesky/beamlines/i24/serial/setup_beamline/ca.py,sha256=H2gPmsLheYReFlGPFa5zzWbnyqdWbCmgKiAwcpVoYfk,1516
55
+ mx_bluesky/beamlines/i24/serial/setup_beamline/pv.py,sha256=aYgIKeBck2wliQyLq-uukuPiyN7WTkNutLAM6ys3WuM,15623
56
+ mx_bluesky/beamlines/i24/serial/setup_beamline/pv_abstract.py,sha256=WbD5ghgTG0F3-MR0XYm4nkiKYswVP5a2COYx_k_cngE,1806
57
+ mx_bluesky/beamlines/i24/serial/setup_beamline/setup_beamline.py,sha256=25kO1JXPl3OVSUf1G4RdcM6ZXbfduskEaDIbZN2xIE8,20595
58
+ mx_bluesky/beamlines/i24/serial/setup_beamline/setup_detector.py,sha256=riBXkgAg3lV6dqoCng_3IF8ZfhwvOHf0zqktJC0rfn0,3241
59
+ mx_bluesky/beamlines/i24/serial/setup_beamline/setup_zebra_plans.py,sha256=2e0pWs_ZrGDzp-tnfSE9XdurFH1K9rvh_1-bNY3U0yA,18078
60
+ mx_bluesky/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
+ mx_bluesky/common/device_setup_plans/read_hardware_for_setup.py,sha256=P018shGBEdO0QWBufwITOk3p-sPUCy4P6UIkf6aUuho,583
62
+ mx_bluesky/common/external_interaction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
+ mx_bluesky/common/external_interaction/config_server.py,sha256=EmvLfOkvoJlnKa0sffAKNICkY26YsQQqY9sYHKmOGzw,2441
64
+ mx_bluesky/common/external_interaction/test_config_server.py,sha256=4wdYsOpXJfc3yNBZvdcjZGSllOHzKBTB8oYFjjSOufU,960
65
+ mx_bluesky/common/external_interaction/callbacks/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
66
+ mx_bluesky/common/external_interaction/callbacks/common/abstract_event.py,sha256=iBj4WNK5ikieZzTePBZ9AEu6ehlnpew1nDK3ONJqibI,2093
67
+ mx_bluesky/common/external_interaction/callbacks/common/aperture_change_callback.py,sha256=vrURLPOri400hQcNPyHomXBBapZ_FTRa_axvZpxmMCQ,841
68
+ mx_bluesky/common/external_interaction/callbacks/common/grid_detection_callback.py,sha256=JmF5FssUqNPgsnxqrgxB9Pmw5Dd7W6GCPb9Mur8DHCo,4017
69
+ mx_bluesky/common/external_interaction/callbacks/common/ispyb_callback_base.py,sha256=Hfjw-HVRmelVkWOKiuC28E3Wa9O-iX-9v4Jm4J5_DH4,9832
70
+ mx_bluesky/common/external_interaction/callbacks/common/ispyb_mapping.py,sha256=n4HUDvJyBmX4pmc0JAFI_pSxYbOL6QFKv2NxH3WF_Ac,2576
71
+ mx_bluesky/common/external_interaction/callbacks/common/log_uid_tag_callback.py,sha256=pfZxQfS9SnXep3F2YAPptDX5bjjWvbXtgy5fINfsoTU,626
72
+ mx_bluesky/common/external_interaction/callbacks/common/logging_callback.py,sha256=NHb8Gp86TAk6PRTV3inWrlW-Lj96LmnZda7ZGewlrFA,712
73
+ mx_bluesky/common/external_interaction/callbacks/common/plan_reactive_callback.py,sha256=7UtkXZluAag_Mx_JnESd7ODPSN3WrcNCgN8mquIpxjE,4086
74
+ mx_bluesky/common/external_interaction/callbacks/common/zocalo_callback.py,sha256=fF17sDt58h3ZbgxQr5P4jzLM1149iEDw8XsF2yiOd6Q,4085
75
+ mx_bluesky/common/external_interaction/callbacks/xray_centre/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
76
+ mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_callback.py,sha256=sHtc45hKAmxjZRlm4jKwqqoo1AiwgueO74p99Qv7vRU,11835
77
+ mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_mapping.py,sha256=dQicTEZ0qvUTkcRnegc4eHBTdQ0EaxdewJCvaZKlftw,1818
78
+ mx_bluesky/common/external_interaction/callbacks/xray_centre/nexus_callback.py,sha256=g9ovYSnb6-bB4RqG1KKuzpAArK-d80DPYTKZ6rDzQOQ,4687
79
+ mx_bluesky/common/external_interaction/ispyb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
80
+ mx_bluesky/common/external_interaction/ispyb/data_model.py,sha256=WURy8W0L4VAULzz39lTW6kYpFDLDiGU2aYO28dq-4II,2706
81
+ mx_bluesky/common/external_interaction/ispyb/exp_eye_store.py,sha256=FWc9MnBdPCvMZ6sd40ByZoR_yC98IC1SvOGvvoJfZnY,5933
82
+ mx_bluesky/common/external_interaction/ispyb/ispyb_store.py,sha256=V809aPFftVKzwk3AbFKolmjFo2CqsLwOMqqj1X_lCgc,10394
83
+ mx_bluesky/common/external_interaction/ispyb/ispyb_utils.py,sha256=Kv0JQVaT8z9Qzt6L1NJEx0U7ZYD6NeyBGF1_wGcI1Dc,728
84
+ mx_bluesky/common/external_interaction/nexus/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
85
+ mx_bluesky/common/external_interaction/nexus/nexus_utils.py,sha256=CCKQeDBEmXZvCwBy1-o5hQ6CDdwsnuAwlIK_uq0I26Y,5587
86
+ mx_bluesky/common/external_interaction/nexus/write_nexus.py,sha256=tIz9PFFSiaUs1olbMtLGHddTLj132rEuFSWBK9rOM6Y,4087
87
+ mx_bluesky/common/parameters/components.py,sha256=xbk5IPQfuhd5CW9XcwdUvhogkaTGHwj9YLphlXMBSKY,7337
88
+ mx_bluesky/common/parameters/constants.py,sha256=lO8N8XSwE9-lr4r-Q-N7dGd11pZDAQRZHlotqPi8T70,4045
89
+ mx_bluesky/common/parameters/gridscan.py,sha256=FQgrC8INTZ_XI6M-8q77lOig6Y7O0-sLCX2EyLSpOLQ,5462
90
+ mx_bluesky/common/plans/__init__.py,sha256=FMA-4VN1TJCPcyURKF0qPIQ8uo8YBbtHPRdJokVF4MA,129
91
+ mx_bluesky/common/plans/do_fgs.py,sha256=mCQ6cPwU5PbFtvZr1lDJafjXKQkG2eKEo0pydqp3P0M,5095
92
+ mx_bluesky/common/utils/exceptions.py,sha256=xz82au833TDI1wMu738l81kBFlXBTVB4-360N-05e84,2063
93
+ mx_bluesky/common/utils/log.py,sha256=ZgFZu6zSutGD5A0FDp_n9M0rJ6gU1FuZCmD-r5suchY,3913
94
+ mx_bluesky/common/utils/tracing.py,sha256=stnBZIvPuKiAm2wVc8lFr3ns7V5C52rUigULi9V-IFs,1171
95
+ mx_bluesky/common/utils/utils.py,sha256=q2uCaK1E8zLVk1BFmj7qlTnQf3JRKjCjyadIVnL1-4M,1180
96
+ mx_bluesky/hyperion/__init__.py,sha256=f4E8wInL1Ll4eeFtAiyKmipOBTPlUtKmVK-m_LOQG4M,35
97
+ mx_bluesky/hyperion/__main__.py,sha256=-bzpCpTYXCIY8ZLNsXtNd9zLpQEF-Q8WMUvyNOHQP0k,13780
98
+ mx_bluesky/hyperion/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
99
+ mx_bluesky/hyperion/device_setup_plans/check_beamstop.py,sha256=PG2AXIB_z7U0glz9MTHkapaokMgrHyYSoKYSIGaRgLE,844
100
+ mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py,sha256=68L4Fd8nvvH_VeQJfOYK_3WLrlKRt09TRsaA9T2uqU0,4703
101
+ mx_bluesky/hyperion/device_setup_plans/manipulate_sample.py,sha256=fuNRH8slknuZ0iNVv2htiuDozc9LzvxUrWuwYQTtLt8,3293
102
+ mx_bluesky/hyperion/device_setup_plans/position_detector.py,sha256=S49ml0KNZ6wXPQqOxNJ2whKTCyRTcKdBXBhyeEyFDQQ,635
103
+ mx_bluesky/hyperion/device_setup_plans/read_hardware_for_setup.py,sha256=kcnUmbQAyNZvixXtQDW40m3pORJgvSo0q1OHM-uO-iM,2225
104
+ mx_bluesky/hyperion/device_setup_plans/setup_oav.py,sha256=pIXLM3FKpf7wYMEiEAOaGTm504XAt5N7nuuu9kKraBk,2914
105
+ mx_bluesky/hyperion/device_setup_plans/setup_panda.py,sha256=bfFQG4PNE9hhjYgUykB-Ps5K1VzDQAK0YwRYC6BpkT8,8292
106
+ mx_bluesky/hyperion/device_setup_plans/setup_zebra.py,sha256=-aHDVgyX1oHOV_nwC3AetIvZ2VnpZcCJI4V5n3Xzj70,10317
107
+ mx_bluesky/hyperion/device_setup_plans/smargon.py,sha256=Tsl-wsExNopwCAEUtUgZyDUos4uhOwJ9SJ2WJRawflg,1209
108
+ mx_bluesky/hyperion/device_setup_plans/utils.py,sha256=CAsJXGmL_Gq6HsvPJ8mdQ7r2lAHf2SF72-LEqHr4-JM,2146
109
+ mx_bluesky/hyperion/device_setup_plans/xbpm_feedback.py,sha256=JgOqnPnG-zXrek1w_M_oEQPc1IET3nHeeeVDZhPXIAk,4058
110
+ mx_bluesky/hyperion/experiment_plans/__init__.py,sha256=3ldTMxgz4yKHJH9iF3nw7uueyX2zQ5Z84V0dsCzW5us,1081
111
+ mx_bluesky/hyperion/experiment_plans/change_aperture_then_move_plan.py,sha256=U-KOA8o5DLeViIVsFkYhUvDmzxUBMXFqXWzzcdljdd4,3690
112
+ mx_bluesky/hyperion/experiment_plans/experiment_registry.py,sha256=Y8MKAxsJ_hax_5Q4UzkN0SAPuXaRgMlSCPu8OZxgjNE,3090
113
+ mx_bluesky/hyperion/experiment_plans/flyscan_xray_centre_plan.py,sha256=ngz3HzwA8_eZK_ovy2xplem_iwV1ifFQbpjFi2eyTuk,19120
114
+ mx_bluesky/hyperion/experiment_plans/grid_detect_then_xray_centre_plan.py,sha256=jlrSEtCkeYLQ1Sf32Gby0fdJyETyU1l4uhMOMMfA148,8218
115
+ mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py,sha256=Yn3lOcy6pLO-GSoBMU5QzqiMzyBTG7LIDPF8DppiKUM,4117
116
+ mx_bluesky/hyperion/experiment_plans/oav_grid_detection_plan.py,sha256=IP8usGFtY7XCdxZ2RZ63EkYWYjZPpYykjhmF1u27L9g,7652
117
+ mx_bluesky/hyperion/experiment_plans/oav_snapshot_plan.py,sha256=TfhZjnc_j6sqM7eeAkVNc8KG0O2L-CDjO0xoZWGeCA4,3126
118
+ mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py,sha256=l-bZdKLCd3dyPJP5RUHSm82lGosPX9kI1vJ2FDVPU8o,16197
119
+ mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py,sha256=u6Cc5DU4XYJxmYNdvMw9cWIMWf3ayCt4GUNBnIJfC68,5050
120
+ mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py,sha256=UsZ07G8ac4SXyv9LfH7L9BSnRuO7E1tl_M15meDR5d4,6174
121
+ mx_bluesky/hyperion/experiment_plans/robot_load_and_change_energy.py,sha256=kHymdtXkxm4b6KNEBTG7pNThTg70OQYG8AkCyymmCNs,8768
122
+ mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py,sha256=NoaNddQZ_XV6hOdAFLRNqrmppKxLTjhDXZHx3Lajcmo,7787
123
+ mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=JA-6dmB7uhRi7OwgP0GspXiNZK2oo_HmHv4MKoaDLIg,16891
124
+ mx_bluesky/hyperion/experiment_plans/set_energy_plan.py,sha256=m46cVAkGHPQg7gXoTKJB3AGe4nAF-RL24yHLCWmz9S0,1858
125
+ mx_bluesky/hyperion/experiment_plans/common/xrc_result.py,sha256=dZRv4chwnLvg9Z96hFHwcPO-h0L3OgoganYLQptGHoI,1806
126
+ mx_bluesky/hyperion/external_interaction/__init__.py,sha256=95DwXDmKsx36RgAL-AtLZl2LQoLPKbzeYdlkkP_4Coc,559
127
+ mx_bluesky/hyperion/external_interaction/config_server.py,sha256=LWKWxJIEo9QliggwAU8LWVzPQTHXx5bc0KI07Ve6eGE,1311
128
+ mx_bluesky/hyperion/external_interaction/callbacks/__init__.py,sha256=1XHaxDljMveu_DYIlk7n963gHffyC6r4C_RhF6HA-N8,283
129
+ mx_bluesky/hyperion/external_interaction/callbacks/__main__.py,sha256=E3sECBq67EMwc3Q_BE8QSKB8wBp812M7GLTwE7NDsgU,5368
130
+ mx_bluesky/hyperion/external_interaction/callbacks/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
+ mx_bluesky/hyperion/external_interaction/callbacks/common/callback_util.py,sha256=OZ19hLtgc20qJFqG9opWLctMFFWWZcciHu5smS3xgXQ,2639
132
+ mx_bluesky/hyperion/external_interaction/callbacks/robot_load/ispyb_callback.py,sha256=7xSvCd95tXjvmsbFLecI1hEwJj_rm8yGuJJ1Pmg-RKU,4142
133
+ mx_bluesky/hyperion/external_interaction/callbacks/rotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
+ mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_callback.py,sha256=XtVjUdipYNqgooovgjvQeSKLlodzOgs7_kjb3wNBh9s,7465
135
+ mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_mapping.py,sha256=yz2Z_P6qH2DGlSXCi36E3Xwv7mVVcvYzqQc0NqwW4DI,716
136
+ mx_bluesky/hyperion/external_interaction/callbacks/rotation/nexus_callback.py,sha256=w86HvDMznS1wBH3mLYJMe2TgX8SghTYR4G6dajho3Pk,4724
137
+ mx_bluesky/hyperion/external_interaction/callbacks/sample_handling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
138
+ mx_bluesky/hyperion/external_interaction/callbacks/sample_handling/sample_handling_callback.py,sha256=IyWawfc0arWXYIzq5CuRwagqlJ36yMA1riM5dw0r9Ig,2117
139
+ mx_bluesky/hyperion/parameters/__init__.py,sha256=kf2wfcILBUBpT0tJ8-W39BywQUkn67yxl9IVsfrr1LE,115
140
+ mx_bluesky/hyperion/parameters/cli.py,sha256=FGzvEB76YnQvBydUMPUNHJuqxvEe7Zc627w7gA2KODY,2125
141
+ mx_bluesky/hyperion/parameters/components.py,sha256=uXxdW6nIE1VZnh4ZXe5O-LOwsx4MbENEWfLGm2ACvsI,313
142
+ mx_bluesky/hyperion/parameters/constants.py,sha256=RVrA1m39HdW5Sm1SR5Sm41YeSPG7GWcfhEomzcBnDhk,1832
143
+ mx_bluesky/hyperion/parameters/gridscan.py,sha256=BTDFKOy0n_lHLTBsFGlgLqCzPvZdt9F85cJDg5IRkKg,6092
144
+ mx_bluesky/hyperion/parameters/load_centre_collect.py,sha256=khLBCSeafuw0dNrvDTvKv4GrlBo1LXJZ87NTI1A92jw,3693
145
+ mx_bluesky/hyperion/parameters/robot_load.py,sha256=DSOwIosO629WoXbVFokEjmgqKZz3xzv0feRQHC_ZgpI,1233
146
+ mx_bluesky/hyperion/parameters/rotation.py,sha256=270m55MCYBFEK2LM5DjVqhnMJC1JupMMX-O4UulBSMc,7518
147
+ mx_bluesky/hyperion/resources/panda/panda-gridscan.yaml,sha256=xrhgok-9X2VXdyLEWiYOUEeRCBqhYM6IJFAefnNdgzw,26521
148
+ mx_bluesky/hyperion/utils/context.py,sha256=vy8D9Ygzdpu6k4teespzc_GL7MLb3AtK5vZkAZkT9UE,2714
149
+ mx_bluesky/hyperion/utils/validation.py,sha256=kBxqr-Ue_iv4zGpU3rfNdG0UACXgbQdHAVZssryEqDI,6567
150
+ mx_bluesky-1.4.3.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
151
+ mx_bluesky-1.4.3.dist-info/METADATA,sha256=koPaf0l5CIOp-WwXKPrCZKAjT9twvrmq4bPGtFFHfUU,17262
152
+ mx_bluesky-1.4.3.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
153
+ mx_bluesky-1.4.3.dist-info/entry_points.txt,sha256=Bt3iHCqzZtHYnnSKoh_qM2k3K4LbK1Uxr0gF8B34F98,528
154
+ mx_bluesky-1.4.3.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
155
+ mx_bluesky-1.4.3.dist-info/RECORD,,