mx-bluesky 1.5.8__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 (40) hide show
  1. mx_bluesky/_version.py +2 -2
  2. mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py +35 -12
  3. mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/__init__.py +0 -0
  4. mx_bluesky/beamlines/i24/jungfrau_commissioning/experiment_plans/do_darks.py +78 -0
  5. mx_bluesky/beamlines/i24/jungfrau_commissioning/plan_stubs/__init__.py +1 -0
  6. mx_bluesky/beamlines/i24/jungfrau_commissioning/{do_external_acquisition.py → plan_stubs/do_external_acquisition.py} +7 -6
  7. mx_bluesky/beamlines/i24/jungfrau_commissioning/{do_internal_acquisition.py → plan_stubs/do_internal_acquisition.py} +4 -3
  8. mx_bluesky/beamlines/i24/jungfrau_commissioning/{plan_utils.py → plan_stubs/plan_utils.py} +21 -28
  9. mx_bluesky/common/device_setup_plans/__init__.py +0 -0
  10. mx_bluesky/common/device_setup_plans/manipulate_sample.py +2 -2
  11. mx_bluesky/common/device_setup_plans/robot_load_unload.py +10 -6
  12. mx_bluesky/common/device_setup_plans/setup_oav.py +1 -1
  13. mx_bluesky/common/device_setup_plans/setup_zebra_and_shutter.py +245 -0
  14. mx_bluesky/common/device_setup_plans/xbpm_feedback.py +4 -4
  15. mx_bluesky/common/experiment_plans/common_flyscan_xray_centre_plan.py +10 -22
  16. mx_bluesky/common/experiment_plans/inner_plans/__init__.py +0 -0
  17. mx_bluesky/common/experiment_plans/inner_plans/do_fgs.py +5 -3
  18. mx_bluesky/common/experiment_plans/inner_plans/read_hardware.py +3 -3
  19. mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py +2 -2
  20. mx_bluesky/common/external_interaction/callbacks/common/ispyb_mapping.py +4 -3
  21. mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_callback.py +34 -25
  22. mx_bluesky/common/parameters/device_composites.py +2 -2
  23. mx_bluesky/hyperion/device_setup_plans/setup_zebra.py +2 -100
  24. mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py +13 -12
  25. mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py +52 -38
  26. mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py +2 -2
  27. mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py +5 -3
  28. mx_bluesky/hyperion/external_interaction/callbacks/alert_on_container_change.py +14 -5
  29. mx_bluesky/hyperion/external_interaction/callbacks/robot_actions/__init__.py +0 -0
  30. mx_bluesky/hyperion/parameters/device_composites.py +2 -2
  31. mx_bluesky/hyperion/parameters/rotation.py +4 -6
  32. mx_bluesky/hyperion/utils/context.py +6 -1
  33. {mx_bluesky-1.5.8.dist-info → mx_bluesky-1.5.10.dist-info}/METADATA +4 -4
  34. {mx_bluesky-1.5.8.dist-info → mx_bluesky-1.5.10.dist-info}/RECORD +39 -33
  35. mx_bluesky/phase1_zebra/device_setup_plans/setup_zebra.py +0 -112
  36. /mx_bluesky/{common/experiment_plans/inner_plans/__init__ .py → beamlines/i04/callbacks/__init__.py} +0 -0
  37. {mx_bluesky-1.5.8.dist-info → mx_bluesky-1.5.10.dist-info}/WHEEL +0 -0
  38. {mx_bluesky-1.5.8.dist-info → mx_bluesky-1.5.10.dist-info}/entry_points.txt +0 -0
  39. {mx_bluesky-1.5.8.dist-info → mx_bluesky-1.5.10.dist-info}/licenses/LICENSE +0 -0
  40. {mx_bluesky-1.5.8.dist-info → mx_bluesky-1.5.10.dist-info}/top_level.txt +0 -0
@@ -10,6 +10,10 @@ from dodal.devices.fast_grid_scan import (
10
10
  set_fast_grid_scan_params,
11
11
  )
12
12
 
13
+ from mx_bluesky.common.device_setup_plans.setup_zebra_and_shutter import (
14
+ setup_zebra_for_gridscan,
15
+ tidy_up_zebra_after_gridscan,
16
+ )
13
17
  from mx_bluesky.common.experiment_plans.common_flyscan_xray_centre_plan import (
14
18
  construct_beamline_specific_FGS_features,
15
19
  )
@@ -29,10 +33,6 @@ from mx_bluesky.hyperion.parameters.device_composites import (
29
33
  HyperionFlyScanXRayCentreComposite,
30
34
  )
31
35
  from mx_bluesky.hyperion.parameters.gridscan import HyperionSpecifiedThreeDGridScan
32
- from mx_bluesky.phase1_zebra.device_setup_plans.setup_zebra import (
33
- setup_zebra_for_gridscan,
34
- tidy_up_zebra_after_gridscan,
35
- )
36
36
 
37
37
 
38
38
  class SmargonSpeedException(Exception):
@@ -78,7 +78,9 @@ def construct_hyperion_specific_features(
78
78
  fgs_motors = xrc_composite.panda_fast_grid_scan
79
79
 
80
80
  else:
81
- setup_trigger_plan = setup_zebra_for_gridscan
81
+ setup_trigger_plan = partial(
82
+ setup_zebra_for_gridscan,
83
+ )
82
84
  tidy_plan = partial(
83
85
  tidy_up_zebra_after_gridscan,
84
86
  xrc_composite.zebra,
@@ -110,8 +112,8 @@ def _panda_tidy(xrc_composite: HyperionFlyScanXRayCentreComposite):
110
112
  yield from tidy_up_zebra_after_gridscan(
111
113
  xrc_composite.zebra, xrc_composite.sample_shutter, group=group, wait=False
112
114
  )
115
+ yield from bps.unstage(xrc_composite.panda, group=group)
113
116
  yield from bps.wait(group, timeout=10)
114
- yield from bps.unstage(xrc_composite.panda)
115
117
 
116
118
 
117
119
  def _panda_triggering_setup(
@@ -124,10 +126,9 @@ def _panda_triggering_setup(
124
126
  xrc_composite.panda_fast_grid_scan.run_up_distance_mm
125
127
  )
126
128
 
127
- # Set the time between x steps pv
128
- 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
129
130
 
130
- 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
131
132
 
132
133
  smargon_speed_limit_mm_per_s = yield from bps.rd(
133
134
  xrc_composite.smargon.x.max_velocity
@@ -146,13 +147,13 @@ def _panda_triggering_setup(
146
147
  )
147
148
  else:
148
149
  LOGGER.info(
149
- 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"
150
151
  f" and using a run-up distance of {run_up_distance_mm}"
151
152
  )
152
153
 
153
154
  yield from bps.mv(
154
- xrc_composite.panda_fast_grid_scan.time_between_x_steps_ms, # type: ignore # See: https://github.com/bluesky/bluesky/issues/1809
155
- 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,
156
157
  )
157
158
 
158
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)
@@ -34,6 +34,10 @@ from mx_bluesky.common.device_setup_plans.manipulate_sample import (
34
34
  cleanup_sample_environment,
35
35
  setup_sample_environment,
36
36
  )
37
+ from mx_bluesky.common.device_setup_plans.setup_zebra_and_shutter import (
38
+ setup_zebra_for_rotation,
39
+ tidy_up_zebra_after_rotation_scan,
40
+ )
37
41
  from mx_bluesky.common.device_setup_plans.utils import (
38
42
  start_preparing_data_collection_then_do_plan,
39
43
  )
@@ -55,8 +59,6 @@ from mx_bluesky.common.utils.context import device_composite_from_context
55
59
  from mx_bluesky.common.utils.log import LOGGER
56
60
  from mx_bluesky.hyperion.device_setup_plans.setup_zebra import (
57
61
  arm_zebra,
58
- setup_zebra_for_rotation,
59
- tidy_up_zebra_after_rotation_scan,
60
62
  )
61
63
  from mx_bluesky.hyperion.parameters.constants import CONST, I03Constants
62
64
  from mx_bluesky.hyperion.parameters.rotation import (
@@ -426,7 +428,7 @@ def rotation_scan_internal(
426
428
 
427
429
  yield from rotation_scan_core(single_scan)
428
430
 
429
- yield from bps.unstage(eiger)
431
+ yield from bps.unstage(eiger, wait=True)
430
432
 
431
433
  LOGGER.info("setting up and staging eiger...")
432
434
  yield from start_preparing_data_collection_then_do_plan(
@@ -1,5 +1,5 @@
1
1
  from dodal.utils import get_beamline_name
2
- from event_model import Event, EventDescriptor, RunStart
2
+ from event_model import Event, EventDescriptor, RunStart, RunStop
3
3
 
4
4
  from mx_bluesky.common.external_interaction.alerting import (
5
5
  Metadata,
@@ -48,7 +48,16 @@ class AlertOnContainerChange(PlanReactiveCallback):
48
48
  return doc
49
49
 
50
50
  def activity_gated_start(self, doc: RunStart):
51
- metadata = doc.get("metadata", {})
52
- self._new_container = metadata.get("container")
53
- self._sample_id = metadata.get("sample_id")
54
- self._visit = metadata.get("visit")
51
+ if not self._sample_id:
52
+ ISPYB_ZOCALO_CALLBACK_LOGGER.info("Capturing container info for alerts")
53
+ metadata = doc.get("metadata", {})
54
+ self._new_container = metadata.get("container")
55
+ self._sample_id = metadata.get("sample_id")
56
+ self._visit = metadata.get("visit")
57
+
58
+ def activity_gated_stop(self, doc: RunStop):
59
+ if not self.active:
60
+ ISPYB_ZOCALO_CALLBACK_LOGGER.info("Resetting state")
61
+ self._new_container = None
62
+ self._sample_id = None
63
+ self._visit = None
@@ -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.8
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.61.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=QlBPCHWJHsKOjOT6a1pMTyQvJ4_hi1jBIVqdqRIdaR0,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
@@ -13,15 +13,19 @@ mx_bluesky/beamlines/i02_1/parameters/gridscan.py,sha256=P-WBnYSKcFQxMyeziIlWPht
13
13
  mx_bluesky/beamlines/i04/__init__.py,sha256=DM5-pkoPb2jill-VmKdhEylsV1jryA92gygCIFSv3Fo,383
14
14
  mx_bluesky/beamlines/i04/redis_to_murko_forwarder.py,sha256=LViC4Dql47EXIDnI2hkt9CMtIyF1_e8h0s4GyIAllmA,6656
15
15
  mx_bluesky/beamlines/i04/thawing_plan.py,sha256=eSqX3VKHKw_KDGxjpszDifRpdb_RkwQxMKAZlOgl_7c,9759
16
+ mx_bluesky/beamlines/i04/callbacks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
17
  mx_bluesky/beamlines/i04/callbacks/murko_callback.py,sha256=C2KoIxwMIWxD46utmq1-69SIc8MspocXJ1sccO1lwAY,4458
17
18
  mx_bluesky/beamlines/i04/experiment_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py,sha256=NYbJfC8sksF-H8m1fCmQTWHBLQKzzpIqBJVjihYp4ew,9232
19
+ mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py,sha256=Z77NSnds9mFVRnea5z_aySgs7vJxKRvzbpNNit2AeZM,10206
19
20
  mx_bluesky/beamlines/i23/__init__.py,sha256=7nwQiKBZAXLnvPhCqaI2VC1k4TOzQalOUvwF6SQ3Yd4,95
20
21
  mx_bluesky/beamlines/i23/serial.py,sha256=XVbHM8NevnJMFAJD9jkxG-VnPaWX6t_k-wlipRw0pmY,2055
21
22
  mx_bluesky/beamlines/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- mx_bluesky/beamlines/i24/jungfrau_commissioning/do_external_acquisition.py,sha256=p5ZOhM3COwiBjolMzHs8HNZGbTiIBjys4iUNQtUMKI0,1573
23
- mx_bluesky/beamlines/i24/jungfrau_commissioning/do_internal_acquisition.py,sha256=cNj4z3TFv8UgtDJax-v8Di74-gKLsTVKtwbCya-wwcw,1744
24
- 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
25
29
  mx_bluesky/beamlines/i24/serial/__init__.py,sha256=r8v9V48TMrNxOcwBZ6lzeCCuPulq5rg8m-mwH_KkOnI,1533
26
30
  mx_bluesky/beamlines/i24/serial/blueapi_config.yaml,sha256=P0saF1bqt4ANU-2mtS_ZHO4NYr_ierUJN-gf6cspic8,350
27
31
  mx_bluesky/beamlines/i24/serial/dcid.py,sha256=7NkpMFF3obTVt0aHBbw5J7DqhOEg-zz5otNjdgDMlFg,13819
@@ -75,22 +79,24 @@ mx_bluesky/beamlines/i24/serial/web_gui_plans/__init__.py,sha256=47DEQpj8HBSa-_T
75
79
  mx_bluesky/beamlines/i24/serial/web_gui_plans/general_plans.py,sha256=4Cn7B-ZaNdcBkpsBg3BNLaNW5YZ-YkTSiJ4iJV-k4Y8,8471
76
80
  mx_bluesky/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
81
  mx_bluesky/common/xrc_result.py,sha256=tUJ6qkDTTB6H1F71IvVAKtmHCRyHSU_tj9GRzVmnE7w,3219
78
- mx_bluesky/common/device_setup_plans/manipulate_sample.py,sha256=bM4D0ezAqCJqclN5-hIVUoN_X55F8Yiv_ap6_ChKCA0,3091
82
+ mx_bluesky/common/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
+ mx_bluesky/common/device_setup_plans/manipulate_sample.py,sha256=bKVWiXQnibXEjKjCNvy9PX4kUSh1CsBQCkqO5tUgrOU,3130
79
84
  mx_bluesky/common/device_setup_plans/position_detector.py,sha256=S49ml0KNZ6wXPQqOxNJ2whKTCyRTcKdBXBhyeEyFDQQ,635
80
- mx_bluesky/common/device_setup_plans/robot_load_unload.py,sha256=k3JSKBznJQWfYTlM6QO26BmpK5D3w4GJkvcJHLlujIw,4416
81
- 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
82
87
  mx_bluesky/common/device_setup_plans/setup_panda.py,sha256=OF-ZygZyAyQEUdrAWiIxWZ6QhAsVx4Mm9ngRYB1mzKI,433
88
+ mx_bluesky/common/device_setup_plans/setup_zebra_and_shutter.py,sha256=y83Szce7QxXdpLeGXpgyhceOr1HCE6fs6zmZr77IYAE,10066
83
89
  mx_bluesky/common/device_setup_plans/utils.py,sha256=S_Us1KfLkyaRzWxmqnoVxHj2Suq-Vs0n5fMRygHgrTw,1859
84
- 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
85
91
  mx_bluesky/common/experiment_plans/__init__.py,sha256=FMA-4VN1TJCPcyURKF0qPIQ8uo8YBbtHPRdJokVF4MA,129
86
92
  mx_bluesky/common/experiment_plans/change_aperture_then_move_plan.py,sha256=407E9rp0yGWWIU1fJrgqK_hC19mVwRK-Und7fMlGNDc,3062
87
- mx_bluesky/common/experiment_plans/common_flyscan_xray_centre_plan.py,sha256=wf22Xwx79UXg_kKG8cD9IeIP_4gY0-p2aNhrUn37eFI,14213
93
+ mx_bluesky/common/experiment_plans/common_flyscan_xray_centre_plan.py,sha256=2Ieb7156ujAGVuybPUMjJEm_7-Z77NYeIGyjDagi0Nw,13546
88
94
  mx_bluesky/common/experiment_plans/common_grid_detect_then_xray_centre_plan.py,sha256=jspOKPc3uxvG-a5-LXs7Yfwy8HTvGXBj4snke9j5gYE,7033
89
- 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
90
96
  mx_bluesky/common/experiment_plans/oav_snapshot_plan.py,sha256=8TRAvHG2W9bn1xb06bYZTWkfhT2q1EtfyxyiMMKmWcw,3623
91
- mx_bluesky/common/experiment_plans/inner_plans/__init__ .py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
92
- mx_bluesky/common/experiment_plans/inner_plans/do_fgs.py,sha256=J8SF-ejb9PpB_wpL1QuS7_FIB5YxDN70odokc5dSIXY,4717
93
- mx_bluesky/common/experiment_plans/inner_plans/read_hardware.py,sha256=Og7Uz8lAB1_Z6puN6ws_2kwOqCvgQMqfmyZPFZMRneY,2351
97
+ mx_bluesky/common/experiment_plans/inner_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
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
94
100
  mx_bluesky/common/experiment_plans/inner_plans/udc_default_state.py,sha256=TnO5hv1I_UWlB1Vz7dCQ-nGj4LLsu9nQgetaK6hc_YM,2704
95
101
  mx_bluesky/common/experiment_plans/inner_plans/write_sample_status.py,sha256=pmS4Lsndp90CCIKzD_wssvbzt1qu7rEzfXgxvDwDrQ8,1313
96
102
  mx_bluesky/common/external_interaction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -102,7 +108,7 @@ mx_bluesky/common/external_interaction/callbacks/common/__init__.py,sha256=47DEQ
102
108
  mx_bluesky/common/external_interaction/callbacks/common/abstract_event.py,sha256=iBj4WNK5ikieZzTePBZ9AEu6ehlnpew1nDK3ONJqibI,2093
103
109
  mx_bluesky/common/external_interaction/callbacks/common/grid_detection_callback.py,sha256=hfFJjICMer26TowK5Nq-AEjDe1TAHIgJAvTFhs-o-Zg,4901
104
110
  mx_bluesky/common/external_interaction/callbacks/common/ispyb_callback_base.py,sha256=--eZl4flvtrKZQz5ZhLO87Z1kDboQevIkujrXCADZEI,9869
105
- mx_bluesky/common/external_interaction/callbacks/common/ispyb_mapping.py,sha256=bHtnDZfxIR5zzSRiBSehZ51y42wzkEcCJ7rFg93aONA,2578
111
+ mx_bluesky/common/external_interaction/callbacks/common/ispyb_mapping.py,sha256=pzDlNEGhXACc5MyO_FAT2PlCYz6r_bnz_S08hXEGjdk,2707
106
112
  mx_bluesky/common/external_interaction/callbacks/common/log_uid_tag_callback.py,sha256=pfZxQfS9SnXep3F2YAPptDX5bjjWvbXtgy5fINfsoTU,626
107
113
  mx_bluesky/common/external_interaction/callbacks/common/logging_callback.py,sha256=NHb8Gp86TAk6PRTV3inWrlW-Lj96LmnZda7ZGewlrFA,712
108
114
  mx_bluesky/common/external_interaction/callbacks/common/plan_reactive_callback.py,sha256=567fx-ONKTZ7V5y5dk0YthxxDJt0s6dZtqrYA0AkfAk,4088
@@ -110,7 +116,7 @@ mx_bluesky/common/external_interaction/callbacks/common/zocalo_callback.py,sha25
110
116
  mx_bluesky/common/external_interaction/callbacks/sample_handling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
117
  mx_bluesky/common/external_interaction/callbacks/sample_handling/sample_handling_callback.py,sha256=BfUru03fRYmndjiWHpnqBIWPc5kRIy4PTmG94bz3gLw,3886
112
118
  mx_bluesky/common/external_interaction/callbacks/xray_centre/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
113
- mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_callback.py,sha256=ezC3bbz84NLSPswHeUNVZr1eJEt_X6aPr7sn-IxdI9I,14879
119
+ mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_callback.py,sha256=fwPPwOvy1yGC8D5KOlpZitBWtVNzfNjK2yz-ZTT6q9Q,15398
114
120
  mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_mapping.py,sha256=yElqODhPm2HZlpF7vNOX0SQNjwJ_m8kNMS-c_cp4KUU,1163
115
121
  mx_bluesky/common/external_interaction/callbacks/xray_centre/nexus_callback.py,sha256=bxFMkTsMvZZJyp4zeGlZkThgZnQqT6dgflKRpqkT1Vc,4709
116
122
  mx_bluesky/common/external_interaction/ispyb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -124,7 +130,7 @@ mx_bluesky/common/external_interaction/nexus/write_nexus.py,sha256=s8xT05_Fn_s64
124
130
  mx_bluesky/common/parameters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
131
  mx_bluesky/common/parameters/components.py,sha256=wyejnv6DxSOrGzcMVRHZVHnund3pj6cTxTMU5v7JW5Q,8576
126
132
  mx_bluesky/common/parameters/constants.py,sha256=iNv55VTv4QPu96z58pbnMiAE1RGsFKsTs4wahrlGihw,5139
127
- mx_bluesky/common/parameters/device_composites.py,sha256=r9e06CEXcW9wyjthHxhSv41ZlUzaI3xqV1DhmW_iZnw,2265
133
+ mx_bluesky/common/parameters/device_composites.py,sha256=H-SEn1BNme7ucBRRoo90Qr5YdVX0ooPAQPtrzxB6ZAg,2303
128
134
  mx_bluesky/common/parameters/gridscan.py,sha256=Y4xZpMhzWN58gnAYKZyVbtN8uW4pBVC68KTGGmYpb2A,7632
129
135
  mx_bluesky/common/preprocessors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
130
136
  mx_bluesky/common/preprocessors/preprocessors.py,sha256=BNpSM7S9gxhVbG39rjH14k89sOmKiII0cqApH3pF_H0,4476
@@ -145,20 +151,20 @@ mx_bluesky/hyperion/runner.py,sha256=x683wuzL-XO1Ws4N2fpPO__TLhlep0br_-8ubml1qG0
145
151
  mx_bluesky/hyperion/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
146
152
  mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py,sha256=ciNdz_r9XGvghehpejdziL-aMw60oUsIJdVR3yz3nOo,5010
147
153
  mx_bluesky/hyperion/device_setup_plans/setup_panda.py,sha256=96eFp4acQLOthe1PA-S14uv635uGVP71DpP7qy_uo40,8509
148
- mx_bluesky/hyperion/device_setup_plans/setup_zebra.py,sha256=e3ocVsncImQIrfL6d0UoH5fCl8AR0pM_4AIXSxc8dgQ,5749
154
+ mx_bluesky/hyperion/device_setup_plans/setup_zebra.py,sha256=dOfBQMibyH3CjSh_m5RJKsxs2DtaM3jtwEs7lkqQppo,1525
149
155
  mx_bluesky/hyperion/device_setup_plans/smargon.py,sha256=eb3TCXg33SW6TlfElh5KjYwCXhELDprj0B27CwYcd9c,967
150
156
  mx_bluesky/hyperion/device_setup_plans/utils.py,sha256=96JlzyikMhWN7LzdiMx8URZInXoGR3OjoxYmCIp9tts,425
151
157
  mx_bluesky/hyperion/experiment_plans/__init__.py,sha256=dJjwLk0EQP-1hKhbs8aRxTF_LxUXgB7kcgDlaP-tMnk,787
152
158
  mx_bluesky/hyperion/experiment_plans/experiment_registry.py,sha256=bGp2c3nKutqHMnDxuqjp6yCF-JKykSzX-IUfxk3oVlM,1701
153
- mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py,sha256=aaDnO_fWOesB7IUMtedinBaJUdliWZe47wxq9ECFoFY,6036
159
+ mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py,sha256=CMy6NR0rrLeyS8SU0jN7xOthYcpxxy9n9XXi39s4is0,5910
154
160
  mx_bluesky/hyperion/experiment_plans/hyperion_grid_detect_then_xray_centre_plan.py,sha256=e4w4226ONSGQF2dnXzxOfcJ9i57CZIJrqQ1YCLlaBNo,2153
155
- 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
156
162
  mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py,sha256=5ZAH17F5T1YyVgA2ML0NEf4ufrD1G0jPRU0_5pINdTg,16195
157
163
  mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py,sha256=oErbq4ffTZVNR_LeiSJP8_q4cwdZWB-bdbrO3ZwKg20,5397
158
- 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
159
165
  mx_bluesky/hyperion/experiment_plans/robot_load_and_change_energy.py,sha256=bqG4enP2bZQ6ND0c5XqwDySQTkQRBdK7gvWf61VEnWM,6051
160
166
  mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py,sha256=samWAztWJU9sRo1FtIicWWQZ7TjUwg7Y9y9oqhkcb5o,6904
161
- mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=jyJMN9atG99hmYG0i3lgrBK9Jx1SR4QVPFhZgA6Dl8s,15886
167
+ mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=LZv6QbBMNpC54mM8fYX7ZTzSxVP2quxpCNubfb8kuy4,15974
162
168
  mx_bluesky/hyperion/experiment_plans/set_energy_plan.py,sha256=8FAqN-aJgRwZSiCX-hNdeGmaijt0l8owdShVBwNchfE,2643
163
169
  mx_bluesky/hyperion/external_interaction/__init__.py,sha256=95DwXDmKsx36RgAL-AtLZl2LQoLPKbzeYdlkkP_4Coc,559
164
170
  mx_bluesky/hyperion/external_interaction/agamemnon.py,sha256=B2Q7NR1VSRoCGg4hlCiZDrh2Fa0s4B4ZIws1H7oBfOk,12020
@@ -167,8 +173,9 @@ mx_bluesky/hyperion/external_interaction/alerting/__init__.py,sha256=47DEQpj8HBS
167
173
  mx_bluesky/hyperion/external_interaction/alerting/constants.py,sha256=8wE_MDF8vOqomQ6SBiwZKb1W4NRO_hmrBLVfLVnKdSg,170
168
174
  mx_bluesky/hyperion/external_interaction/callbacks/__init__.py,sha256=1XHaxDljMveu_DYIlk7n963gHffyC6r4C_RhF6HA-N8,283
169
175
  mx_bluesky/hyperion/external_interaction/callbacks/__main__.py,sha256=6-CqBh3uIi-mu_eWSJQ0hBQhoQaC7m8mSi8cHmyrjK0,6827
170
- mx_bluesky/hyperion/external_interaction/callbacks/alert_on_container_change.py,sha256=QnA8P8QFDRr1XHyx6Qdd4uJal2GhQVcqSTbkLOEjw-Q,2299
176
+ mx_bluesky/hyperion/external_interaction/callbacks/alert_on_container_change.py,sha256=54RU20RuwKHYwB6DtAc0aWg6hz3TXFhwDzTmSC2XYVE,2689
171
177
  mx_bluesky/hyperion/external_interaction/callbacks/snapshot_callback.py,sha256=ee1ZIJGp8RQakMDYRfflXjSwi-UgxqdZNkZ1azBIDGQ,11705
178
+ mx_bluesky/hyperion/external_interaction/callbacks/robot_actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
172
179
  mx_bluesky/hyperion/external_interaction/callbacks/robot_actions/ispyb_callback.py,sha256=Ta8w0W_3LI0PGpwxKlQsS7X0B_hsfJoZdzR2K3J0KHo,4467
173
180
  mx_bluesky/hyperion/external_interaction/callbacks/rotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
174
181
  mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_callback.py,sha256=4XW5eTwlPKGLk3MS76QRu5U6DOYAQHBEUBKqaNDnVhs,8885
@@ -178,20 +185,19 @@ mx_bluesky/hyperion/parameters/__init__.py,sha256=kf2wfcILBUBpT0tJ8-W39BywQUkn67
178
185
  mx_bluesky/hyperion/parameters/cli.py,sha256=I-NY3Kt3la5HNUB4qRA6NtuxbJSr78yx-sM_cRx_pY4,1514
179
186
  mx_bluesky/hyperion/parameters/components.py,sha256=eIUEcFNqcEad21IThSDatoX-NRa9GdfBOwt6ZUwb88U,292
180
187
  mx_bluesky/hyperion/parameters/constants.py,sha256=aCACWCp670o9U3AKfON-ntqkxIH-99gWNZvEN1G2rPc,2265
181
- mx_bluesky/hyperion/parameters/device_composites.py,sha256=g9tdA_vImJ89AltxzGY04fCiIXHG1WKPAnoF6b_veag,2151
188
+ mx_bluesky/hyperion/parameters/device_composites.py,sha256=B37k4J8qtBetL3s16Fu9jlBkJwjpdz02SQ9LW1TZmBE,2213
182
189
  mx_bluesky/hyperion/parameters/gridscan.py,sha256=DMldH8UJwvcKTUh26Ntg-qgNAP4h6iCrxjFX_kkcvW0,3904
183
190
  mx_bluesky/hyperion/parameters/load_centre_collect.py,sha256=8dlKwb7WmgDeohQ9QsdMWQMMM73EaC2cZ0wKg6vOP60,3727
184
191
  mx_bluesky/hyperion/parameters/robot_load.py,sha256=Iktni3r6LFRnlM51hpdpv3QrD6QPhx2rAeyB8Gv6ML4,1124
185
- mx_bluesky/hyperion/parameters/rotation.py,sha256=OwZFvoswCFn4Y3lB-JVYP_5fvuAZB5yrtKUiCYAzQRQ,7443
192
+ mx_bluesky/hyperion/parameters/rotation.py,sha256=0QNov3jykC__iIHMxdTq3znBsKLyQGk-vzSVMf7rSyA,7360
186
193
  mx_bluesky/hyperion/resources/panda/panda-gridscan.yaml,sha256=mhLBJTSjHCkM9F6mjtqbhNmmrV8qSctbCUfhb0q7pYo,28085
187
194
  mx_bluesky/hyperion/utils/__init__.py,sha256=f4E8wInL1Ll4eeFtAiyKmipOBTPlUtKmVK-m_LOQG4M,35
188
- mx_bluesky/hyperion/utils/context.py,sha256=yxMYn3YFET6SanFZ4YWXDmZDdp3WkaXhDc3ySxHYpAE,1033
195
+ mx_bluesky/hyperion/utils/context.py,sha256=VYAu1yxhDBrI98ul7UErotuquF64s1EDHtqPQLRpyvY,1227
189
196
  mx_bluesky/phase1_zebra/__init__.py,sha256=Edhhn2L9MVXnjJhyD5_yKQVUDo7XW98rvuT7dlzIn58,132
190
197
  mx_bluesky/phase1_zebra/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
- mx_bluesky/phase1_zebra/device_setup_plans/setup_zebra.py,sha256=zfEnDvh5Rh9cPmg_Q_0EnJOZNIwIGmHeIDiJ9kg9Z4c,4129
192
- mx_bluesky-1.5.8.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
193
- mx_bluesky-1.5.8.dist-info/METADATA,sha256=Sgd23MlRNkDX8FybwhVs0WYSqmA7Elx1hCMuSps2fJw,17424
194
- mx_bluesky-1.5.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
195
- mx_bluesky-1.5.8.dist-info/entry_points.txt,sha256=HgVtwgWoMRn9-X6rxCcSY3Jz_paspJTIlc-t2NFzWpo,409
196
- mx_bluesky-1.5.8.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
197
- mx_bluesky-1.5.8.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,,
@@ -1,112 +0,0 @@
1
- from typing import Protocol, runtime_checkable
2
-
3
- import bluesky.plan_stubs as bps
4
- from bluesky.utils import MsgGenerator
5
- from dodal.devices.zebra.zebra import (
6
- Zebra,
7
- )
8
- from dodal.devices.zebra.zebra_controlled_shutter import (
9
- ZebraShutter,
10
- ZebraShutterControl,
11
- )
12
-
13
- from mx_bluesky.common.parameters.constants import ZEBRA_STATUS_TIMEOUT
14
- from mx_bluesky.common.utils.log import LOGGER
15
-
16
-
17
- @runtime_checkable
18
- class GridscanSetupDevices(Protocol):
19
- zebra: Zebra
20
- sample_shutter: ZebraShutter
21
-
22
-
23
- def setup_zebra_for_gridscan(
24
- composite: GridscanSetupDevices, # XRC gridscan's generic trigger setup expects a composite rather than individual devices
25
- group="setup_zebra_for_gridscan",
26
- wait=True,
27
- ) -> MsgGenerator:
28
- zebra = composite.zebra
29
- # Set shutter to automatic and to trigger via motion controller GPIO signal (IN4_TTL)
30
- yield from configure_zebra_and_shutter_for_auto_shutter(
31
- zebra, composite.sample_shutter, zebra.mapping.sources.IN4_TTL, group=group
32
- )
33
-
34
- yield from bps.abs_set(
35
- zebra.output.out_pvs[zebra.mapping.outputs.TTL_DETECTOR],
36
- zebra.mapping.sources.IN3_TTL,
37
- group=group,
38
- )
39
- yield from bps.abs_set(
40
- zebra.output.out_pvs[zebra.mapping.outputs.TTL_XSPRESS3],
41
- zebra.mapping.sources.DISCONNECT,
42
- group=group,
43
- )
44
- yield from bps.abs_set(
45
- zebra.output.pulse_1.input, zebra.mapping.sources.DISCONNECT, group=group
46
- )
47
-
48
- if wait:
49
- yield from bps.wait(group, timeout=ZEBRA_STATUS_TIMEOUT)
50
-
51
-
52
- def set_shutter_auto_input(zebra: Zebra, input: int, group="set_shutter_trigger"):
53
- """Set the signal that controls the shutter. We use the second input to the
54
- Zebra's AND2 gate for this input. ZebraShutter control mode must be in auto for this input to take control
55
-
56
- For more details see the ZebraShutter device."""
57
- auto_gate = zebra.mapping.AND_GATE_FOR_AUTO_SHUTTER
58
- auto_shutter_control = zebra.logic_gates.and_gates[auto_gate]
59
- yield from bps.abs_set(auto_shutter_control.sources[2], input, group)
60
-
61
-
62
- def configure_zebra_and_shutter_for_auto_shutter(
63
- zebra: Zebra, zebra_shutter: ZebraShutter, input: int, group="use_automatic_shutter"
64
- ):
65
- """Set the shutter to auto mode, and configure the zebra to trigger the shutter on
66
- an input source. For the input, use one of the source constants in zebra.py
67
-
68
- When the shutter is in auto/manual, logic in EPICS sets the Zebra's
69
- SOFT_IN1 to low/high respectively. The Zebra's AND2 gate should be used to control the shutter while in auto mode.
70
- To do this, we need (AND2 = SOFT_IN1 AND input), where input is the zebra signal we want to control the shutter when in auto mode.
71
- """
72
- # See https://github.com/DiamondLightSource/dodal/issues/813 for better typing here.
73
-
74
- # Set shutter to auto mode
75
- yield from bps.abs_set(
76
- zebra_shutter.control_mode, ZebraShutterControl.AUTO, group=group
77
- )
78
-
79
- auto_gate = zebra.mapping.AND_GATE_FOR_AUTO_SHUTTER
80
-
81
- # Set first input of AND2 gate to SOFT_IN1, which is high when shutter is in auto mode
82
- # Note the Zebra should ALWAYS be setup this way. See https://github.com/DiamondLightSource/mx-bluesky/issues/551
83
- yield from bps.abs_set(
84
- zebra.logic_gates.and_gates[auto_gate].sources[1],
85
- zebra.mapping.sources.SOFT_IN1,
86
- group=group,
87
- )
88
-
89
- # Set the second input of AND2 gate to the requested zebra input source
90
- yield from set_shutter_auto_input(zebra, input, group=group)
91
-
92
-
93
- def tidy_up_zebra_after_gridscan(
94
- zebra: Zebra,
95
- zebra_shutter: ZebraShutter,
96
- group="tidy_up_zebra_after_gridscan",
97
- wait=True,
98
- ) -> MsgGenerator:
99
- LOGGER.info("Tidying up Zebra")
100
-
101
- yield from bps.abs_set(
102
- zebra.output.out_pvs[zebra.mapping.outputs.TTL_DETECTOR],
103
- zebra.mapping.sources.PC_PULSE,
104
- group=group,
105
- )
106
- yield from bps.abs_set(
107
- zebra_shutter.control_mode, ZebraShutterControl.MANUAL, group=group
108
- )
109
- yield from set_shutter_auto_input(zebra, zebra.mapping.sources.PC_GATE, group=group)
110
-
111
- if wait:
112
- yield from bps.wait(group, timeout=ZEBRA_STATUS_TIMEOUT)