mx-bluesky 1.5.2__py3-none-any.whl → 1.5.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 (40) hide show
  1. mx_bluesky/_version.py +16 -3
  2. mx_bluesky/beamlines/i04/__init__.py +7 -3
  3. mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py +3 -0
  4. mx_bluesky/beamlines/i24/serial/blueapi_config.yaml +2 -2
  5. mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py +12 -2
  6. mx_bluesky/common/external_interaction/alerting/__init__.py +13 -0
  7. mx_bluesky/common/external_interaction/alerting/_service.py +82 -0
  8. mx_bluesky/common/external_interaction/alerting/log_based_service.py +57 -0
  9. mx_bluesky/common/external_interaction/callbacks/sample_handling/sample_handling_callback.py +28 -4
  10. mx_bluesky/common/external_interaction/config_server.py +151 -54
  11. mx_bluesky/common/parameters/constants.py +26 -8
  12. mx_bluesky/common/parameters/gridscan.py +1 -1
  13. mx_bluesky/hyperion/__main__.py +50 -178
  14. mx_bluesky/hyperion/baton_handler.py +125 -69
  15. mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py +29 -24
  16. mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py +4 -1
  17. mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py +12 -4
  18. mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py +1 -1
  19. mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py +2 -3
  20. mx_bluesky/hyperion/external_interaction/agamemnon.py +128 -73
  21. mx_bluesky/hyperion/external_interaction/alerting/__init__.py +0 -0
  22. mx_bluesky/hyperion/external_interaction/alerting/constants.py +12 -0
  23. mx_bluesky/hyperion/external_interaction/callbacks/__main__.py +5 -0
  24. mx_bluesky/hyperion/external_interaction/callbacks/rotation/nexus_callback.py +2 -2
  25. mx_bluesky/hyperion/external_interaction/config_server.py +12 -31
  26. mx_bluesky/hyperion/parameters/cli.py +15 -3
  27. mx_bluesky/hyperion/parameters/components.py +7 -5
  28. mx_bluesky/hyperion/parameters/constants.py +20 -4
  29. mx_bluesky/hyperion/parameters/gridscan.py +22 -14
  30. mx_bluesky/hyperion/parameters/load_centre_collect.py +1 -14
  31. mx_bluesky/hyperion/parameters/robot_load.py +1 -4
  32. mx_bluesky/hyperion/parameters/rotation.py +1 -2
  33. mx_bluesky/hyperion/plan_runner.py +78 -0
  34. mx_bluesky/hyperion/runner.py +189 -0
  35. {mx_bluesky-1.5.2.dist-info → mx_bluesky-1.5.3.dist-info}/METADATA +4 -3
  36. {mx_bluesky-1.5.2.dist-info → mx_bluesky-1.5.3.dist-info}/RECORD +40 -33
  37. {mx_bluesky-1.5.2.dist-info → mx_bluesky-1.5.3.dist-info}/entry_points.txt +0 -2
  38. {mx_bluesky-1.5.2.dist-info → mx_bluesky-1.5.3.dist-info}/WHEEL +0 -0
  39. {mx_bluesky-1.5.2.dist-info → mx_bluesky-1.5.3.dist-info}/licenses/LICENSE +0 -0
  40. {mx_bluesky-1.5.2.dist-info → mx_bluesky-1.5.3.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,6 @@ from mx_bluesky.common.parameters.components import (
8
8
  WithSample,
9
9
  WithVisit,
10
10
  )
11
- from mx_bluesky.hyperion.parameters.components import WithHyperionUDCFeatures
12
11
  from mx_bluesky.hyperion.parameters.robot_load import (
13
12
  RobotLoadThenCentre,
14
13
  )
@@ -28,7 +27,6 @@ class LoadCentreCollect(
28
27
  WithVisit,
29
28
  WithSample,
30
29
  WithCentreSelection,
31
- WithHyperionUDCFeatures,
32
30
  ):
33
31
  """Experiment parameters to perform the combined robot load,
34
32
  pin-tip centre and rotation scan operations."""
@@ -39,6 +37,7 @@ class LoadCentreCollect(
39
37
  @model_validator(mode="before")
40
38
  @classmethod
41
39
  def validate_model(cls, values):
40
+ values = values.copy()
42
41
  allowed_keys = (
43
42
  LoadCentreCollect.model_fields.keys()
44
43
  | RobotLoadThenCentre.model_fields.keys()
@@ -50,12 +49,6 @@ class LoadCentreCollect(
50
49
  f"Unexpected fields found in LoadCentreCollect {disallowed_keys}"
51
50
  )
52
51
 
53
- assert "features" not in values["robot_load_then_centre"], (
54
- "Features flags must be specified at top-level in LoadCentreCollect"
55
- )
56
- assert "features" not in values["multi_rotation_scan"], (
57
- "Features flags must be specified at top-level in LoadCentreCollect"
58
- )
59
52
  keys_from_outer_load_centre_collect = (
60
53
  MxBlueskyParameters.model_fields.keys()
61
54
  | WithSample.model_fields.keys()
@@ -89,12 +82,6 @@ class LoadCentreCollect(
89
82
  values["robot_load_then_centre"] = new_robot_load_then_centre_params
90
83
  return values
91
84
 
92
- @model_validator(mode="after")
93
- def _ensure_features_are_internally_consistent(self) -> Self:
94
- self.robot_load_then_centre.features = self.features
95
- self.multi_rotation_scan.features = self.features
96
- return self
97
-
98
85
  @model_validator(mode="after")
99
86
  def _check_rotation_start_xyz_is_not_specified(self) -> Self:
100
87
  for scan in self.multi_rotation_scan.single_rotation_scans:
@@ -10,7 +10,6 @@ from mx_bluesky.common.parameters.components import (
10
10
  from mx_bluesky.common.parameters.constants import (
11
11
  HardwareConstants,
12
12
  )
13
- from mx_bluesky.hyperion.parameters.components import WithHyperionUDCFeatures
14
13
  from mx_bluesky.hyperion.parameters.gridscan import (
15
14
  GridCommonWithHyperionDetectorParams,
16
15
  PinTipCentreThenXrayCentre,
@@ -23,9 +22,7 @@ class RobotLoadAndEnergyChange(
23
22
  thawing_time: float = Field(default=HardwareConstants.THAWING_TIME)
24
23
 
25
24
 
26
- class RobotLoadThenCentre(
27
- GridCommonWithHyperionDetectorParams, WithHyperionUDCFeatures
28
- ):
25
+ class RobotLoadThenCentre(GridCommonWithHyperionDetectorParams):
29
26
  thawing_time: float = Field(default=HardwareConstants.THAWING_TIME)
30
27
 
31
28
  @property
@@ -28,7 +28,6 @@ from mx_bluesky.common.parameters.components import (
28
28
  WithSample,
29
29
  WithScan,
30
30
  )
31
- from mx_bluesky.hyperion.parameters.components import WithHyperionUDCFeatures
32
31
  from mx_bluesky.hyperion.parameters.constants import (
33
32
  CONST,
34
33
  I03Constants,
@@ -56,7 +55,7 @@ class RotationScanPerSweep(OptionalGonioAngleStarts, OptionalXyzStarts, WithSamp
56
55
  nexus_vds_start_img: int = Field(default=0, ge=0)
57
56
 
58
57
 
59
- class RotationExperiment(DiffractionExperiment, WithHyperionUDCFeatures):
58
+ class RotationExperiment(DiffractionExperiment):
60
59
  shutter_opening_time_s: float = Field(default=CONST.I03.SHUTTER_TIME_S)
61
60
  rotation_increment_deg: float = Field(default=0.1, gt=0)
62
61
  ispyb_experiment_type: IspybExperimentType = Field(
@@ -0,0 +1,78 @@
1
+ import threading
2
+ from collections.abc import Callable
3
+
4
+ from blueapi.core import BlueskyContext
5
+ from bluesky.utils import MsgGenerator, RequestAbort
6
+
7
+ from mx_bluesky.common.parameters.constants import Status
8
+ from mx_bluesky.common.utils.exceptions import WarningException
9
+ from mx_bluesky.common.utils.log import LOGGER
10
+ from mx_bluesky.hyperion.runner import BaseRunner
11
+
12
+
13
+ class PlanException(Exception):
14
+ """Identifies an exception that was encountered during plan execution."""
15
+
16
+ pass
17
+
18
+
19
+ class PlanRunner(BaseRunner):
20
+ """Runner that executes experiments from inside a running Bluesky plan"""
21
+
22
+ def __init__(
23
+ self,
24
+ context: BlueskyContext,
25
+ ) -> None:
26
+ super().__init__(context)
27
+ self.current_status: Status = Status.IDLE
28
+
29
+ def execute_plan(
30
+ self,
31
+ experiment: Callable[[], MsgGenerator],
32
+ ) -> MsgGenerator:
33
+ """Execute the specified experiment plan.
34
+ Args:
35
+ experiment: The experiment to run
36
+ Raises:
37
+ PlanException: If the plan raised an exception
38
+ RequestAbort: If the RunEngine aborted during execution"""
39
+
40
+ self.current_status = Status.BUSY
41
+
42
+ try:
43
+ yield from experiment()
44
+ self.current_status = Status.IDLE
45
+ except WarningException as e:
46
+ LOGGER.warning("Plan failed with warning", exc_info=e)
47
+ self.current_status = Status.FAILED
48
+ except RequestAbort:
49
+ # This will occur when the run engine processes an abort when we shut down
50
+ LOGGER.info("UDC Runner aborting")
51
+ raise
52
+ except Exception as e:
53
+ LOGGER.error("Plan failed with exception", exc_info=e)
54
+ self.current_status = Status.FAILED
55
+ raise PlanException("Exception thrown in plan execution") from e
56
+
57
+ def shutdown(self):
58
+ """Performs a prompt shutdown. Aborts the run engine and terminates the loop
59
+ waiting for messages."""
60
+
61
+ def issue_abort():
62
+ try:
63
+ # abort() causes the run engine to throw a RequestAbort exception
64
+ # inside the plan, which will propagate through the contingency wrappers.
65
+ # When the plan returns, the run engine will raise RunEngineInterrupted
66
+ self.RE.abort()
67
+ except Exception as e:
68
+ LOGGER.warning(
69
+ "Exception encountered when issuing abort() to RunEngine:",
70
+ exc_info=e,
71
+ )
72
+
73
+ LOGGER.info("Shutting down: Stopping the run engine gracefully")
74
+ if self.current_status != Status.ABORTING:
75
+ self.current_status = Status.ABORTING
76
+ stopping_thread = threading.Thread(target=issue_abort)
77
+ stopping_thread.start()
78
+ return
@@ -0,0 +1,189 @@
1
+ import threading
2
+ from abc import abstractmethod
3
+ from collections.abc import Callable
4
+ from dataclasses import dataclass
5
+ from queue import Empty, Queue
6
+ from typing import Any
7
+
8
+ from blueapi.core import BlueskyContext
9
+ from bluesky.callbacks.zmq import Publisher
10
+ from bluesky.utils import MsgGenerator
11
+
12
+ from mx_bluesky.common.external_interaction.callbacks.common.log_uid_tag_callback import (
13
+ LogUidTaggingCallback,
14
+ )
15
+ from mx_bluesky.common.parameters.components import MxBlueskyParameters
16
+ from mx_bluesky.common.parameters.constants import Actions, Status
17
+ from mx_bluesky.common.utils.exceptions import WarningException
18
+ from mx_bluesky.common.utils.log import LOGGER
19
+ from mx_bluesky.common.utils.tracing import TRACER
20
+ from mx_bluesky.hyperion.experiment_plans.experiment_registry import PLAN_REGISTRY
21
+ from mx_bluesky.hyperion.parameters.constants import CONST
22
+
23
+
24
+ @dataclass
25
+ class Command:
26
+ action: Actions
27
+ devices: Any | None = None
28
+ experiment: Callable[[Any, Any], MsgGenerator] | None = None
29
+
30
+ def __str__(self):
31
+ return f"Command({self.action}, {self.parameters}"
32
+
33
+ parameters: MxBlueskyParameters | None = None
34
+
35
+
36
+ @dataclass
37
+ class StatusAndMessage:
38
+ status: str
39
+ message: str = ""
40
+
41
+ def __init__(self, status: Status, message: str = "") -> None:
42
+ self.status = status.value
43
+ self.message = message
44
+
45
+
46
+ @dataclass
47
+ class ErrorStatusAndMessage(StatusAndMessage):
48
+ exception_type: str = ""
49
+
50
+
51
+ def make_error_status_and_message(exception: Exception):
52
+ return ErrorStatusAndMessage(
53
+ status=Status.FAILED.value,
54
+ message=repr(exception),
55
+ exception_type=type(exception).__name__,
56
+ )
57
+
58
+
59
+ class BaseRunner:
60
+ @abstractmethod
61
+ def shutdown(self):
62
+ """Performs orderly prompt shutdown.
63
+ Aborts the run engine and terminates the loop waiting for messages."""
64
+ pass
65
+
66
+ def __init__(self, context: BlueskyContext):
67
+ self.context: BlueskyContext = context
68
+ self.RE = context.run_engine
69
+ # These references are necessary to maintain liveness of callbacks because RE
70
+ # only keeps a weakref
71
+ self._logging_uid_tag_callback = LogUidTaggingCallback()
72
+ self._publisher = Publisher(f"localhost:{CONST.CALLBACK_0MQ_PROXY_PORTS[0]}")
73
+
74
+ self.RE.subscribe(self._logging_uid_tag_callback)
75
+ LOGGER.info("Connecting to external callback ZMQ proxy...")
76
+ self.RE.subscribe(self._publisher)
77
+
78
+
79
+ class GDARunner(BaseRunner):
80
+ """Runner that executes plans submitted by Flask requests from GDA."""
81
+
82
+ def __init__(
83
+ self,
84
+ context: BlueskyContext,
85
+ ) -> None:
86
+ super().__init__(context)
87
+ self.current_status: StatusAndMessage = StatusAndMessage(Status.IDLE)
88
+ self._last_run_aborted: bool = False
89
+ self._command_queue: Queue[Command] = Queue()
90
+
91
+ def start(
92
+ self,
93
+ experiment: Callable,
94
+ parameters: MxBlueskyParameters,
95
+ plan_name: str | None = None,
96
+ ) -> StatusAndMessage:
97
+ """Start a new bluesky plan
98
+ Args:
99
+ experiment: A bluesky plan
100
+ parameters: The parameters to be submitted
101
+ plan_name: Name of the plan that will be used to resolve the composite factory
102
+ to supply devices for the plan, if any are needed"""
103
+ LOGGER.info(f"Started with parameters: {parameters.model_dump_json(indent=2)}")
104
+
105
+ devices: Any = (
106
+ PLAN_REGISTRY[plan_name]["setup"](self.context) if plan_name else None
107
+ )
108
+
109
+ if (
110
+ self.current_status.status == Status.BUSY.value
111
+ or self.current_status.status == Status.ABORTING.value
112
+ ):
113
+ return StatusAndMessage(Status.FAILED, "Bluesky already running")
114
+ else:
115
+ self.current_status = StatusAndMessage(Status.BUSY)
116
+ self._command_queue.put(
117
+ Command(
118
+ action=Actions.START,
119
+ devices=devices,
120
+ experiment=experiment,
121
+ parameters=parameters,
122
+ )
123
+ )
124
+ return StatusAndMessage(Status.SUCCESS)
125
+
126
+ def stop(self) -> StatusAndMessage:
127
+ """Stop the currently executing plan."""
128
+ if self.current_status.status == Status.ABORTING.value:
129
+ return StatusAndMessage(Status.FAILED, "Bluesky already stopping")
130
+ else:
131
+ self.current_status = StatusAndMessage(Status.ABORTING)
132
+ stopping_thread = threading.Thread(target=self._stopping_thread)
133
+ stopping_thread.start()
134
+ self._last_run_aborted = True
135
+ return StatusAndMessage(Status.ABORTING)
136
+
137
+ def shutdown(self):
138
+ """Stops the run engine and the loop waiting for messages."""
139
+ print("Shutting down: Stopping the run engine gracefully")
140
+ self.stop()
141
+ self._command_queue.put(Command(action=Actions.SHUTDOWN))
142
+
143
+ def _stopping_thread(self):
144
+ try:
145
+ # abort() causes the run engine to throw a RequestAbort exception
146
+ # inside the plan, which will propagate through the contingency wrappers.
147
+ # When the plan returns, the run engine will raise RunEngineInterrupted
148
+ self.RE.abort()
149
+ self.current_status = StatusAndMessage(Status.IDLE)
150
+ except Exception as e:
151
+ self.current_status = make_error_status_and_message(e)
152
+
153
+ def fetch_next_command(self) -> Command:
154
+ """Fetch the next command from the queue, blocks if queue is empty."""
155
+ return self._command_queue.get()
156
+
157
+ def try_fetch_next_command(self) -> Command | None:
158
+ """Fetch the next command from the queue or return None if no command available."""
159
+ try:
160
+ return self._command_queue.get(block=False)
161
+ except Empty:
162
+ return None
163
+
164
+ def wait_on_queue(self):
165
+ while True:
166
+ command = self.fetch_next_command()
167
+ if command.action == Actions.SHUTDOWN:
168
+ return
169
+ elif command.action == Actions.START:
170
+ if command.experiment is None:
171
+ raise ValueError("No experiment provided for START")
172
+ try:
173
+ with TRACER.start_span("do_run"):
174
+ self.RE(command.experiment(command.devices, command.parameters))
175
+
176
+ self.current_status = StatusAndMessage(Status.IDLE)
177
+
178
+ self._last_run_aborted = False
179
+ except WarningException as exception:
180
+ LOGGER.warning("Warning Exception", exc_info=True)
181
+ self.current_status = make_error_status_and_message(exception)
182
+ except Exception as exception:
183
+ LOGGER.error("Exception on running plan", exc_info=True)
184
+
185
+ if self._last_run_aborted:
186
+ # Aborting will cause an exception here that we want to swallow
187
+ self._last_run_aborted = False
188
+ else:
189
+ self.current_status = make_error_status_and_message(exception)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mx-bluesky
3
- Version: 1.5.2
3
+ Version: 1.5.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
@@ -235,12 +235,13 @@ Requires-Dist: scipy
235
235
  Requires-Dist: semver
236
236
  Requires-Dist: deepdiff
237
237
  Requires-Dist: matplotlib
238
+ Requires-Dist: cachetools
239
+ Requires-Dist: daq-config-server>=v1.0.0-rc.2
238
240
  Requires-Dist: blueapi>=0.15.0
239
- Requires-Dist: daq-config-server==0.1.1
240
241
  Requires-Dist: ophyd>=1.10.5
241
242
  Requires-Dist: ophyd-async>=0.10.0a2
242
243
  Requires-Dist: bluesky>=1.13.1
243
- Requires-Dist: dls-dodal==1.52.0
244
+ Requires-Dist: dls-dodal>=1.55.0
244
245
  Provides-Extra: dev
245
246
  Requires-Dist: black; extra == "dev"
246
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=ULxoARbzjBMKCLCwFpnGZ1a36HS9SymijR2WGye0UeQ,511
3
+ mx_bluesky/_version.py,sha256=YmPxci9z5OdhwvwXu2qOrZdFU4K4N2lTtMkI0KAJCh0,704
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
@@ -8,17 +8,17 @@ mx_bluesky/beamlines/aithre_lasershaping/__init__.py,sha256=A0dlifkBYPlCiMkTEovT
8
8
  mx_bluesky/beamlines/aithre_lasershaping/beamline_safe.py,sha256=-GTu2w7dIKtssZB8vXwE2f1zF-Pg1zC_jwBbB-r2Goo,1233
9
9
  mx_bluesky/beamlines/aithre_lasershaping/check_goniometer_performance.py,sha256=AqWAFey_Ih1JcRxVNiZDGFsVg4kvA9LH2p5SJeXfe2I,834
10
10
  mx_bluesky/beamlines/aithre_lasershaping/goniometer_controls.py,sha256=1La4vJmQdKp3_Ib1DMgavJBdYLTxp7S7dEr_lqNknV0,1828
11
- mx_bluesky/beamlines/i04/__init__.py,sha256=5ainxns2EcIh7EXqdZJRLI8yYDCBpY1-Dflqn7JDm-c,271
11
+ mx_bluesky/beamlines/i04/__init__.py,sha256=-BuArzFeDA4T3QsT6TWrGnHk6ICX8gOVk_q8whBUt6Y,314
12
12
  mx_bluesky/beamlines/i04/redis_to_murko_forwarder.py,sha256=T6K0LOwwGxB05YvS6FV-UU4O2N2GMQdEM2vj9BSow_U,6618
13
13
  mx_bluesky/beamlines/i04/thawing_plan.py,sha256=uvm1wfp012GN5yE7TcURSQeDtC9nWnW5X__6UCXazjA,5085
14
14
  mx_bluesky/beamlines/i04/callbacks/murko_callback.py,sha256=C2KoIxwMIWxD46utmq1-69SIc8MspocXJ1sccO1lwAY,4458
15
15
  mx_bluesky/beamlines/i04/experiment_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
- mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py,sha256=hWMnQSnmCrlVQgxi4qyqD0WtFt65_rSpSwYB_9bHMXY,9236
16
+ mx_bluesky/beamlines/i04/experiment_plans/i04_grid_detect_then_xray_centre_plan.py,sha256=SEQzhIInTpAYyag3ncPbaBj_M3AC0TzDNG_BbB31LQo,9401
17
17
  mx_bluesky/beamlines/i23/__init__.py,sha256=7nwQiKBZAXLnvPhCqaI2VC1k4TOzQalOUvwF6SQ3Yd4,95
18
18
  mx_bluesky/beamlines/i23/serial.py,sha256=XVbHM8NevnJMFAJD9jkxG-VnPaWX6t_k-wlipRw0pmY,2055
19
19
  mx_bluesky/beamlines/i24/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
20
20
  mx_bluesky/beamlines/i24/serial/__init__.py,sha256=r8v9V48TMrNxOcwBZ6lzeCCuPulq5rg8m-mwH_KkOnI,1533
21
- mx_bluesky/beamlines/i24/serial/blueapi_config.yaml,sha256=kQIOqltl-rW-iKgtWlcABQ5E_QdBW_CHt1cnfcBchpg,323
21
+ mx_bluesky/beamlines/i24/serial/blueapi_config.yaml,sha256=QqsOP_CfyIbf8HbGVdo2pYiVVVVgw5cFC3RFwsmT3t8,351
22
22
  mx_bluesky/beamlines/i24/serial/dcid.py,sha256=ab48UFmZT6Zuv9RNoqOLkmAgmaIr0G6UDjqr_bE0vF8,14564
23
23
  mx_bluesky/beamlines/i24/serial/log.py,sha256=76-bKjjxLZEITTcALpvuwCy3KU5pTq0blnVFD9wT5cY,4798
24
24
  mx_bluesky/beamlines/i24/serial/run_extruder.sh,sha256=FXYsqdTpVgxB1-QrY4Tg5pl5Ex7PgUoXnuAcr9iDZTE,1078
@@ -81,14 +81,17 @@ mx_bluesky/common/experiment_plans/__init__.py,sha256=FMA-4VN1TJCPcyURKF0qPIQ8uo
81
81
  mx_bluesky/common/experiment_plans/change_aperture_then_move_plan.py,sha256=407E9rp0yGWWIU1fJrgqK_hC19mVwRK-Und7fMlGNDc,3062
82
82
  mx_bluesky/common/experiment_plans/common_flyscan_xray_centre_plan.py,sha256=jLo9nrd8CW85Px7t3I6QlnfD71VhApyVJMfWB6-gJgk,13245
83
83
  mx_bluesky/common/experiment_plans/common_grid_detect_then_xray_centre_plan.py,sha256=BxBKc9cn843eoMlmlV7j0tqIG-DRPL6A0n-S6JLyDjg,7057
84
- mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py,sha256=Djfqfny7Bs-PlpxJUXLDZv-n3uWnk_99YQjAvlvqm8k,6733
84
+ mx_bluesky/common/experiment_plans/oav_grid_detection_plan.py,sha256=gkRpRb3USUx7xDJk-1GghV-sxPp7wy5clubwhlx1v80,7162
85
85
  mx_bluesky/common/experiment_plans/oav_snapshot_plan.py,sha256=Zvz8j9ZgK6hIYRTkSjYBr1ARLyMRixOsou_wSuR97U4,3647
86
86
  mx_bluesky/common/experiment_plans/inner_plans/__init__ .py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
87
  mx_bluesky/common/experiment_plans/inner_plans/do_fgs.py,sha256=WjtoyMxpTFSrfFzxxoYKRlRbwRHfEBeEItq82mad0Pw,4807
88
88
  mx_bluesky/common/experiment_plans/inner_plans/read_hardware.py,sha256=Og7Uz8lAB1_Z6puN6ws_2kwOqCvgQMqfmyZPFZMRneY,2351
89
89
  mx_bluesky/common/experiment_plans/inner_plans/write_sample_status.py,sha256=pmS4Lsndp90CCIKzD_wssvbzt1qu7rEzfXgxvDwDrQ8,1313
90
90
  mx_bluesky/common/external_interaction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- mx_bluesky/common/external_interaction/config_server.py,sha256=EmvLfOkvoJlnKa0sffAKNICkY26YsQQqY9sYHKmOGzw,2441
91
+ mx_bluesky/common/external_interaction/config_server.py,sha256=FgQ0vnKVqX-MZRIKWcW7wAL_is63JvHQoazjxSJnf1o,6545
92
+ mx_bluesky/common/external_interaction/alerting/__init__.py,sha256=Di6vVslmB_3v5r7qsGezm7Iln4dA-T60_9USo_8y-P0,264
93
+ mx_bluesky/common/external_interaction/alerting/_service.py,sha256=5GLXKETg8o0d4coIv17hOoAI-rFGldIF2SIVmKW0QUQ,2632
94
+ mx_bluesky/common/external_interaction/alerting/log_based_service.py,sha256=KCTUcuk4lGzTOWaOUcUEXzTo5-vVAdRtMy0a5Kq2fso,2130
92
95
  mx_bluesky/common/external_interaction/callbacks/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
93
96
  mx_bluesky/common/external_interaction/callbacks/common/abstract_event.py,sha256=iBj4WNK5ikieZzTePBZ9AEu6ehlnpew1nDK3ONJqibI,2093
94
97
  mx_bluesky/common/external_interaction/callbacks/common/grid_detection_callback.py,sha256=JmF5FssUqNPgsnxqrgxB9Pmw5Dd7W6GCPb9Mur8DHCo,4017
@@ -99,7 +102,7 @@ mx_bluesky/common/external_interaction/callbacks/common/logging_callback.py,sha2
99
102
  mx_bluesky/common/external_interaction/callbacks/common/plan_reactive_callback.py,sha256=3TYQXibOWIKnvM2PMTIjE2IOoX2Jkt9b2KpDCytQtYE,4088
100
103
  mx_bluesky/common/external_interaction/callbacks/common/zocalo_callback.py,sha256=5Sjl2VU57huKkNtEExvypoSVb0I8nVItIJ4vH1vrp48,3930
101
104
  mx_bluesky/common/external_interaction/callbacks/sample_handling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
102
- mx_bluesky/common/external_interaction/callbacks/sample_handling/sample_handling_callback.py,sha256=niZ7CG1vqbp0MUjRfchevmLwJMg-puMz4i_HDPQavI0,2880
105
+ mx_bluesky/common/external_interaction/callbacks/sample_handling/sample_handling_callback.py,sha256=v6FG7uOw62Vd6gKxGYdG-CBrrVDlxrCWGQETHtc4bCU,3832
103
106
  mx_bluesky/common/external_interaction/callbacks/xray_centre/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
104
107
  mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_callback.py,sha256=niNZLRO3iEFIM6PFnS5byl4n9X6GwZR0NRzDmy9IFyQ,12634
105
108
  mx_bluesky/common/external_interaction/callbacks/xray_centre/ispyb_mapping.py,sha256=fOYJkqaXEfCdLGQwGhTrzfGOj6Ed3t2wcRgv68DOOHc,1790
@@ -114,9 +117,9 @@ mx_bluesky/common/external_interaction/nexus/nexus_utils.py,sha256=n97KHJJd_C59S
114
117
  mx_bluesky/common/external_interaction/nexus/write_nexus.py,sha256=s8xT05_Fn_s64KbPOnR5cm-AooklMKRj2cXxLstl7e0,4067
115
118
  mx_bluesky/common/parameters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
116
119
  mx_bluesky/common/parameters/components.py,sha256=LKkFiGWEzU3dPHGG_M9gzNu4XUA-0nc7Q3ceRiWJFTk,8536
117
- mx_bluesky/common/parameters/constants.py,sha256=dEq6rRbifNgX23yIH26ul1KH3_CquMXr7OPPFhuWLpI,4493
120
+ mx_bluesky/common/parameters/constants.py,sha256=lBUJsS1UeaetuuwqjtXm1w2Q2zmgyfQyoDBtO5SJ0XM,5094
118
121
  mx_bluesky/common/parameters/device_composites.py,sha256=F_msgzMTzwIYXufkBwRCg47f5-Z4sJlQVbsWnUqjXSw,2253
119
- mx_bluesky/common/parameters/gridscan.py,sha256=vcSKOBKfAAq1ONTanmzWxm37w48y7WY22Z-xr2ZxqYQ,7064
122
+ mx_bluesky/common/parameters/gridscan.py,sha256=zTSFnOI6skbj2aX8YnbcbEYk67MnOWIaaukIST5KkBk,7048
120
123
  mx_bluesky/common/preprocessors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
121
124
  mx_bluesky/common/preprocessors/preprocessors.py,sha256=BNpSM7S9gxhVbG39rjH14k89sOmKiII0cqApH3pF_H0,4476
122
125
  mx_bluesky/common/protocols/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -128,55 +131,59 @@ mx_bluesky/common/utils/log.py,sha256=CepibF7U5GnN-ICl4bmhbEwqRzWsSFyfNtBDJejK0e
128
131
  mx_bluesky/common/utils/tracing.py,sha256=stnBZIvPuKiAm2wVc8lFr3ns7V5C52rUigULi9V-IFs,1171
129
132
  mx_bluesky/common/utils/utils.py,sha256=q2uCaK1E8zLVk1BFmj7qlTnQf3JRKjCjyadIVnL1-4M,1180
130
133
  mx_bluesky/hyperion/__init__.py,sha256=f4E8wInL1Ll4eeFtAiyKmipOBTPlUtKmVK-m_LOQG4M,35
131
- mx_bluesky/hyperion/__main__.py,sha256=zRAkEuHCAcVyQrTHr9myJ37AmW1q9Fez5sd2lxddFSw,11415
132
- mx_bluesky/hyperion/baton_handler.py,sha256=2xcaDuxNOjuqhFMj9EiD_x3P3K7nt1vj8uA0d1mp-to,4429
134
+ mx_bluesky/hyperion/__main__.py,sha256=Hyt3vdy2aC5lrikaptvKcMqK0P-bPV2h91fXb_CGpB8,6742
135
+ mx_bluesky/hyperion/baton_handler.py,sha256=T3LDXAJiObc_kO84flXa1sfAE6mDMK_8BP7H98rnWWQ,6801
136
+ mx_bluesky/hyperion/plan_runner.py,sha256=kQn93lBSxiWi4ZGLOCx5IfFTCYx_L6NsIXAT_7Phpk4,2799
137
+ mx_bluesky/hyperion/runner.py,sha256=x683wuzL-XO1Ws4N2fpPO__TLhlep0br_-8ubml1qG0,7073
133
138
  mx_bluesky/hyperion/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
134
- mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py,sha256=iQawC-nIOVSoMMSYl4mleIkVYs-BaKKMTgOWX4efHTg,4723
139
+ mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py,sha256=ciNdz_r9XGvghehpejdziL-aMw60oUsIJdVR3yz3nOo,5010
135
140
  mx_bluesky/hyperion/device_setup_plans/setup_panda.py,sha256=96eFp4acQLOthe1PA-S14uv635uGVP71DpP7qy_uo40,8509
136
141
  mx_bluesky/hyperion/device_setup_plans/setup_zebra.py,sha256=e3ocVsncImQIrfL6d0UoH5fCl8AR0pM_4AIXSxc8dgQ,5749
137
142
  mx_bluesky/hyperion/device_setup_plans/smargon.py,sha256=9znQLGF8Uqif1SZ_H4GyqcnhR3xCI1FIniCaGLRY3zM,758
138
143
  mx_bluesky/hyperion/device_setup_plans/utils.py,sha256=96JlzyikMhWN7LzdiMx8URZInXoGR3OjoxYmCIp9tts,425
139
144
  mx_bluesky/hyperion/experiment_plans/__init__.py,sha256=dJjwLk0EQP-1hKhbs8aRxTF_LxUXgB7kcgDlaP-tMnk,787
140
145
  mx_bluesky/hyperion/experiment_plans/experiment_registry.py,sha256=bGp2c3nKutqHMnDxuqjp6yCF-JKykSzX-IUfxk3oVlM,1701
141
- mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py,sha256=OZq6cYajQEbCXuOFzw2h-YoGju3J0nYzitgFW5mCc9U,5908
146
+ mx_bluesky/hyperion/experiment_plans/hyperion_flyscan_xray_centre_plan.py,sha256=aaDnO_fWOesB7IUMtedinBaJUdliWZe47wxq9ECFoFY,6036
142
147
  mx_bluesky/hyperion/experiment_plans/hyperion_grid_detect_then_xray_centre_plan.py,sha256=e4w4226ONSGQF2dnXzxOfcJ9i57CZIJrqQ1YCLlaBNo,2153
143
- mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py,sha256=G_r8NIHkvRpC8jGYPYZAtG6uVPTwzlH1P2Akd2ykP4o,6877
148
+ mx_bluesky/hyperion/experiment_plans/load_centre_collect_full_plan.py,sha256=adXdbKxrLw8lSaFIeBwWj4LdmyIYObnqmOCU_IOSX0c,7114
144
149
  mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py,sha256=5ZAH17F5T1YyVgA2ML0NEf4ufrD1G0jPRU0_5pINdTg,16195
145
150
  mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py,sha256=oErbq4ffTZVNR_LeiSJP8_q4cwdZWB-bdbrO3ZwKg20,5397
146
- mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py,sha256=FP_tAhq7Txljbxvvr3eEMoapDtXj8siPyWd9qcYevBg,6247
151
+ mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py,sha256=1g3vs2hSgEYGhwDoqB8VsWTZ4q_Hd37493n_csoLnI8,6248
147
152
  mx_bluesky/hyperion/experiment_plans/robot_load_and_change_energy.py,sha256=AFQtQ-goN7cbMXiYaxd3-PSDKG2llnMr0dKkYdbCIB4,5942
148
153
  mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py,sha256=II-4v2AOyC7QbCqLZFSq1fT1OjWSg8P5MmSQFzQI0D0,6892
149
- mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=ymYtfLvB2A4Ux_FV_kIRtY35IFF8OoE4Iv9zSpTpyWI,15925
154
+ mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py,sha256=jyJMN9atG99hmYG0i3lgrBK9Jx1SR4QVPFhZgA6Dl8s,15886
150
155
  mx_bluesky/hyperion/experiment_plans/set_energy_plan.py,sha256=8FAqN-aJgRwZSiCX-hNdeGmaijt0l8owdShVBwNchfE,2643
151
156
  mx_bluesky/hyperion/external_interaction/__init__.py,sha256=95DwXDmKsx36RgAL-AtLZl2LQoLPKbzeYdlkkP_4Coc,559
152
- mx_bluesky/hyperion/external_interaction/agamemnon.py,sha256=y80qaZ43fwUdDBDkRYs7yJH1I8zXVla_7GTnRkXBOnQ,9959
153
- mx_bluesky/hyperion/external_interaction/config_server.py,sha256=mVBSrqFCnyW92QN1Jeiljm1QbyYH1IJE5QZwARuHu08,1592
157
+ mx_bluesky/hyperion/external_interaction/agamemnon.py,sha256=oZzkoLi_b-278asr_f-vMvZxPFKfEUYrTvhFqfMIu6A,11942
158
+ mx_bluesky/hyperion/external_interaction/config_server.py,sha256=UpxjOH0U3vm0R_RTPt00uYfQ2HiALGWRZgs8EHJO2os,491
159
+ mx_bluesky/hyperion/external_interaction/alerting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
160
+ mx_bluesky/hyperion/external_interaction/alerting/constants.py,sha256=0lrZbr8qsbTpF74pSOvPCCWIz07GLEKxl8Dw0OuiYNM,475
154
161
  mx_bluesky/hyperion/external_interaction/callbacks/__init__.py,sha256=1XHaxDljMveu_DYIlk7n963gHffyC6r4C_RhF6HA-N8,283
155
- mx_bluesky/hyperion/external_interaction/callbacks/__main__.py,sha256=QS4XSLH2KEFWINzs1BweIbDO_gxSfp8tEMa6Y83mSRY,6158
162
+ mx_bluesky/hyperion/external_interaction/callbacks/__main__.py,sha256=AjuzycdV7rMvlDBVY73aYB1TaLUCivLL6s23z2xWYok,6421
156
163
  mx_bluesky/hyperion/external_interaction/callbacks/snapshot_callback.py,sha256=ee1ZIJGp8RQakMDYRfflXjSwi-UgxqdZNkZ1azBIDGQ,11705
157
164
  mx_bluesky/hyperion/external_interaction/callbacks/robot_actions/ispyb_callback.py,sha256=Ta8w0W_3LI0PGpwxKlQsS7X0B_hsfJoZdzR2K3J0KHo,4467
158
165
  mx_bluesky/hyperion/external_interaction/callbacks/rotation/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
159
166
  mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_callback.py,sha256=-0fz1Fw2zm8JXvZWkHTNRPirO2q3Ha0rb3Ug7eJ-xI4,7456
160
167
  mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_mapping.py,sha256=bba5ZHoOMqvSCUXJIxbx55HGhaoC_Jqhyxxb-ttqt5g,801
161
- mx_bluesky/hyperion/external_interaction/callbacks/rotation/nexus_callback.py,sha256=QxLjRqoKSmEC9TbTK6mufbWXRcmzLfe9xZclEhUbxIw,4736
168
+ mx_bluesky/hyperion/external_interaction/callbacks/rotation/nexus_callback.py,sha256=0aG1Kakyxyz6PE3fxDNKRARRG4xwej486PfmphvWwtM,4743
162
169
  mx_bluesky/hyperion/parameters/__init__.py,sha256=kf2wfcILBUBpT0tJ8-W39BywQUkn67yxl9IVsfrr1LE,115
163
- mx_bluesky/hyperion/parameters/cli.py,sha256=zciAE1-7Ahx0B8-RNNk25hB40xBMrmrR7cK1GbEDgaM,1177
164
- mx_bluesky/hyperion/parameters/components.py,sha256=uXxdW6nIE1VZnh4ZXe5O-LOwsx4MbENEWfLGm2ACvsI,313
165
- mx_bluesky/hyperion/parameters/constants.py,sha256=_-8nlAGAWDBAFRauk2G9rQjE3raSvES6QzdIUKQDKBM,1645
170
+ mx_bluesky/hyperion/parameters/cli.py,sha256=I-NY3Kt3la5HNUB4qRA6NtuxbJSr78yx-sM_cRx_pY4,1514
171
+ mx_bluesky/hyperion/parameters/components.py,sha256=eIUEcFNqcEad21IThSDatoX-NRa9GdfBOwt6ZUwb88U,292
172
+ mx_bluesky/hyperion/parameters/constants.py,sha256=O9SWJwZLIj1IUap-6uuahCaQFvHYVEAzwloerSelumg,2240
166
173
  mx_bluesky/hyperion/parameters/device_composites.py,sha256=wXr0VH66Qm5xT0WBBy4hmXjONrAxieP3aAFdt0rM6kY,2139
167
- mx_bluesky/hyperion/parameters/gridscan.py,sha256=snER6auUYTdj31Qa_sjp7zPIpXMo_lwLq7Ugn-YlG6k,3663
168
- mx_bluesky/hyperion/parameters/load_centre_collect.py,sha256=bT4jXBPKeOTfi3U2lECJ-bbKLkmlCz_MMydqdbCE4xI,4361
169
- mx_bluesky/hyperion/parameters/robot_load.py,sha256=DSOwIosO629WoXbVFokEjmgqKZz3xzv0feRQHC_ZgpI,1233
170
- mx_bluesky/hyperion/parameters/rotation.py,sha256=Ws3iic17Btmleatc5PStL_N8iO41kVe2UtZ1I8F2Uz8,7546
174
+ mx_bluesky/hyperion/parameters/gridscan.py,sha256=DTHIo75xE2vU4iP0eXymGKoQARA1fd9fp2apKFU4C_I,3886
175
+ mx_bluesky/hyperion/parameters/load_centre_collect.py,sha256=8dlKwb7WmgDeohQ9QsdMWQMMM73EaC2cZ0wKg6vOP60,3727
176
+ mx_bluesky/hyperion/parameters/robot_load.py,sha256=Iktni3r6LFRnlM51hpdpv3QrD6QPhx2rAeyB8Gv6ML4,1124
177
+ mx_bluesky/hyperion/parameters/rotation.py,sha256=OwZFvoswCFn4Y3lB-JVYP_5fvuAZB5yrtKUiCYAzQRQ,7443
171
178
  mx_bluesky/hyperion/resources/panda/panda-gridscan.yaml,sha256=mhLBJTSjHCkM9F6mjtqbhNmmrV8qSctbCUfhb0q7pYo,28085
172
179
  mx_bluesky/hyperion/utils/__init__.py,sha256=f4E8wInL1Ll4eeFtAiyKmipOBTPlUtKmVK-m_LOQG4M,35
173
180
  mx_bluesky/hyperion/utils/context.py,sha256=yxMYn3YFET6SanFZ4YWXDmZDdp3WkaXhDc3ySxHYpAE,1033
174
181
  mx_bluesky/phase1_zebra/__init__.py,sha256=Edhhn2L9MVXnjJhyD5_yKQVUDo7XW98rvuT7dlzIn58,132
175
182
  mx_bluesky/phase1_zebra/device_setup_plans/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
183
  mx_bluesky/phase1_zebra/device_setup_plans/setup_zebra.py,sha256=zfEnDvh5Rh9cPmg_Q_0EnJOZNIwIGmHeIDiJ9kg9Z4c,4129
177
- mx_bluesky-1.5.2.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
178
- mx_bluesky-1.5.2.dist-info/METADATA,sha256=Ao71REUS-SrRGSViHIXTrKwF-wP1MRp5e5eG_H6uAoM,17392
179
- mx_bluesky-1.5.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
180
- mx_bluesky-1.5.2.dist-info/entry_points.txt,sha256=-hM2jXf6TAwgqnUHaEVx02j7sdB0L_WaeHW_tIRuj6o,600
181
- mx_bluesky-1.5.2.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
182
- mx_bluesky-1.5.2.dist-info/RECORD,,
184
+ mx_bluesky-1.5.3.dist-info/licenses/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
185
+ mx_bluesky-1.5.3.dist-info/METADATA,sha256=36t0IAie1aZHxkEOcfdOJPttxsvNwU0NRtNGY19wmBY,17424
186
+ mx_bluesky-1.5.3.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
187
+ mx_bluesky-1.5.3.dist-info/entry_points.txt,sha256=HgVtwgWoMRn9-X6rxCcSY3Jz_paspJTIlc-t2NFzWpo,409
188
+ mx_bluesky-1.5.3.dist-info/top_level.txt,sha256=S4rrzXIUef58ulf_04wn01XGZ3xeJjXs4LPEJ_xoF-I,11
189
+ mx_bluesky-1.5.3.dist-info/RECORD,,
@@ -1,8 +1,6 @@
1
1
  [console_scripts]
2
2
  hyperion = mx_bluesky.hyperion.__main__:main
3
3
  hyperion-callbacks = mx_bluesky.hyperion.external_interaction.callbacks.__main__:main
4
- hyperion-generate-test-nexus = mx_bluesky.hyperion.utils.validation:generate_test_nexus
5
- hyperion-populate-test-and-meta-files = mx_bluesky.hyperion.utils.validation:copy_test_meta_data_files
6
4
  mx-bluesky = mx_bluesky.__main__:main
7
5
  redis_to_murko = mx_bluesky.beamlines.i04.redis_to_murko_forwarder:main
8
6
  run_extruder = mx_bluesky.beamlines.i24.serial.run_serial:run_extruder