mx-bluesky 0.3.1__py3-none-any.whl → 1.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mx_bluesky/_version.py +2 -2
- mx_bluesky/beamlines/i04/__init__.py +3 -0
- mx_bluesky/{i04 → beamlines/i04}/thawing_plan.py +5 -4
- mx_bluesky/{i24 → beamlines/i24}/serial/blueapi_config.yaml +1 -1
- mx_bluesky/{i24 → beamlines/i24}/serial/dcid.py +2 -2
- mx_bluesky/{i24 → beamlines/i24}/serial/extruder/EX-gui-edm/DetStage.edl +3 -3
- mx_bluesky/{i24 → beamlines/i24}/serial/extruder/EX-gui-edm/DiamondExtruder-I24-py3v1.edl +7 -7
- mx_bluesky/{i24 → beamlines/i24}/serial/extruder/i24ssx_Extruder_Collect_py3v2.py +12 -9
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/CustomChip_py3v1.edl +3 -3
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/DetStage.edl +3 -3
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/DiamondChipI24-py3v1.edl +245 -200
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/MappingLite-oxford_py3v1.edl +4 -4
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/pumpprobe-py3v1.edl +8 -8
- mx_bluesky/beamlines/i24/serial/fixed_target/__init__.py +0 -0
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/i24ssx_Chip_Collect_py3v1.py +80 -70
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/i24ssx_Chip_Manager_py3v1.py +20 -21
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/i24ssx_Chip_Mapping_py3v1.py +5 -5
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/i24ssx_Chip_StartUp_py3v1.py +7 -4
- mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/i24ssx_moveonclick.py +59 -39
- mx_bluesky/{i24 → beamlines/i24}/serial/log.py +1 -9
- mx_bluesky/beamlines/i24/serial/parameters/__init__.py +15 -0
- mx_bluesky/{i24 → beamlines/i24}/serial/parameters/constants.py +1 -1
- mx_bluesky/{i24 → beamlines/i24}/serial/parameters/experiment_parameters.py +4 -25
- mx_bluesky/{i24 → beamlines/i24}/serial/parameters/utils.py +5 -3
- mx_bluesky/{i24 → beamlines/i24}/serial/run_serial.py +1 -1
- mx_bluesky/{i24 → beamlines/i24}/serial/setup_beamline/pv_abstract.py +1 -1
- mx_bluesky/{i24 → beamlines/i24}/serial/setup_beamline/setup_beamline.py +2 -2
- mx_bluesky/{i24 → beamlines/i24}/serial/setup_beamline/setup_detector.py +5 -5
- mx_bluesky/{i24 → beamlines/i24}/serial/write_nexus.py +6 -3
- mx_bluesky/hyperion/__init__.py +1 -0
- mx_bluesky/hyperion/__main__.py +374 -0
- mx_bluesky/hyperion/device_setup_plans/__init__.py +0 -0
- mx_bluesky/hyperion/device_setup_plans/dcm_pitch_roll_mirror_adjuster.py +134 -0
- mx_bluesky/hyperion/device_setup_plans/manipulate_sample.py +110 -0
- mx_bluesky/hyperion/device_setup_plans/position_detector.py +16 -0
- mx_bluesky/hyperion/device_setup_plans/read_hardware_for_setup.py +60 -0
- mx_bluesky/hyperion/device_setup_plans/setup_oav.py +87 -0
- mx_bluesky/hyperion/device_setup_plans/setup_panda.py +210 -0
- mx_bluesky/hyperion/device_setup_plans/setup_zebra.py +214 -0
- mx_bluesky/hyperion/device_setup_plans/smargon.py +25 -0
- mx_bluesky/hyperion/device_setup_plans/utils.py +44 -0
- mx_bluesky/hyperion/device_setup_plans/xbpm_feedback.py +93 -0
- mx_bluesky/hyperion/exceptions.py +47 -0
- mx_bluesky/hyperion/experiment_plans/__init__.py +30 -0
- mx_bluesky/hyperion/experiment_plans/experiment_registry.py +84 -0
- mx_bluesky/hyperion/experiment_plans/flyscan_xray_centre_plan.py +528 -0
- mx_bluesky/hyperion/experiment_plans/grid_detect_then_xray_centre_plan.py +209 -0
- mx_bluesky/hyperion/experiment_plans/oav_grid_detection_plan.py +173 -0
- mx_bluesky/hyperion/experiment_plans/oav_snapshot_plan.py +81 -0
- mx_bluesky/hyperion/experiment_plans/optimise_attenuation_plan.py +463 -0
- mx_bluesky/hyperion/experiment_plans/pin_centre_then_xray_centre_plan.py +119 -0
- mx_bluesky/hyperion/experiment_plans/pin_tip_centring_plan.py +164 -0
- mx_bluesky/hyperion/experiment_plans/robot_load_then_centre_plan.py +322 -0
- mx_bluesky/hyperion/experiment_plans/rotation_scan_plan.py +436 -0
- mx_bluesky/hyperion/experiment_plans/set_energy_plan.py +68 -0
- mx_bluesky/hyperion/external_interaction/__init__.py +9 -0
- mx_bluesky/hyperion/external_interaction/callbacks/__init__.py +10 -0
- mx_bluesky/hyperion/external_interaction/callbacks/__main__.py +148 -0
- mx_bluesky/hyperion/external_interaction/callbacks/aperture_change_callback.py +22 -0
- mx_bluesky/hyperion/external_interaction/callbacks/common/__init__.py +0 -0
- mx_bluesky/hyperion/external_interaction/callbacks/common/callback_util.py +46 -0
- mx_bluesky/hyperion/external_interaction/callbacks/common/ispyb_mapping.py +70 -0
- mx_bluesky/hyperion/external_interaction/callbacks/grid_detection_callback.py +88 -0
- mx_bluesky/hyperion/external_interaction/callbacks/ispyb_callback_base.py +203 -0
- mx_bluesky/hyperion/external_interaction/callbacks/log_uid_tag_callback.py +20 -0
- mx_bluesky/hyperion/external_interaction/callbacks/logging_callback.py +29 -0
- mx_bluesky/hyperion/external_interaction/callbacks/plan_reactive_callback.py +101 -0
- mx_bluesky/hyperion/external_interaction/callbacks/robot_load/ispyb_callback.py +88 -0
- mx_bluesky/hyperion/external_interaction/callbacks/rotation/__init__.py +0 -0
- mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_callback.py +174 -0
- mx_bluesky/hyperion/external_interaction/callbacks/rotation/ispyb_mapping.py +17 -0
- mx_bluesky/hyperion/external_interaction/callbacks/rotation/nexus_callback.py +102 -0
- mx_bluesky/hyperion/external_interaction/callbacks/xray_centre/__init__.py +0 -0
- mx_bluesky/hyperion/external_interaction/callbacks/xray_centre/ispyb_callback.py +269 -0
- mx_bluesky/hyperion/external_interaction/callbacks/xray_centre/ispyb_mapping.py +53 -0
- mx_bluesky/hyperion/external_interaction/callbacks/xray_centre/nexus_callback.py +95 -0
- mx_bluesky/hyperion/external_interaction/callbacks/zocalo_callback.py +92 -0
- mx_bluesky/hyperion/external_interaction/config_server.py +35 -0
- mx_bluesky/hyperion/external_interaction/exceptions.py +13 -0
- mx_bluesky/hyperion/external_interaction/ispyb/__init__.py +0 -0
- mx_bluesky/hyperion/external_interaction/ispyb/data_model.py +95 -0
- mx_bluesky/hyperion/external_interaction/ispyb/exp_eye_store.py +125 -0
- mx_bluesky/hyperion/external_interaction/ispyb/ispyb_store.py +276 -0
- mx_bluesky/hyperion/external_interaction/ispyb/ispyb_utils.py +29 -0
- mx_bluesky/hyperion/external_interaction/nexus/__init__.py +0 -0
- mx_bluesky/hyperion/external_interaction/nexus/nexus_utils.py +148 -0
- mx_bluesky/hyperion/external_interaction/nexus/write_nexus.py +114 -0
- mx_bluesky/hyperion/log.py +99 -0
- mx_bluesky/hyperion/parameters/__init__.py +2 -0
- mx_bluesky/hyperion/parameters/cli.py +68 -0
- mx_bluesky/{parameters → hyperion/parameters}/components.py +77 -24
- mx_bluesky/hyperion/parameters/constants.py +158 -0
- mx_bluesky/hyperion/parameters/gridscan.py +216 -0
- mx_bluesky/hyperion/parameters/rotation.py +160 -0
- mx_bluesky/hyperion/resources/panda/panda-gridscan.yaml +964 -0
- mx_bluesky/hyperion/tracing.py +28 -0
- mx_bluesky/hyperion/utils/context.py +84 -0
- mx_bluesky/hyperion/utils/utils.py +25 -0
- mx_bluesky/hyperion/utils/validation.py +196 -0
- mx_bluesky/jupyter_example.ipynb +3 -2
- {mx_bluesky-0.3.1.dist-info → mx_bluesky-1.1.0.dist-info}/METADATA +26 -11
- mx_bluesky-1.1.0.dist-info/RECORD +136 -0
- {mx_bluesky-0.3.1.dist-info → mx_bluesky-1.1.0.dist-info}/WHEEL +1 -1
- mx_bluesky-1.1.0.dist-info/entry_points.txt +8 -0
- mx_bluesky/i04/__init__.py +0 -3
- mx_bluesky/i24/serial/parameters/__init__.py +0 -15
- mx_bluesky/parameters/__init__.py +0 -31
- mx_bluesky-0.3.1.dist-info/RECORD +0 -67
- mx_bluesky-0.3.1.dist-info/entry_points.txt +0 -4
- /mx_bluesky/{i24 → beamlines}/__init__.py +0 -0
- /mx_bluesky/{i04 → beamlines/i04}/callbacks/murko_callback.py +0 -0
- /mx_bluesky/{i24/serial/extruder → beamlines/i24}/__init__.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/__init__.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/extruder/EX-gui-edm/microdrop_alignment.edl +0 -0
- /mx_bluesky/{i24/serial/fixed_target → beamlines/i24/serial/extruder}/__init__.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/ME14E-GeneralPurpose.edl +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/PMAC_Command.edl +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/Shutter_Control.edl +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/microdrop_alignment.edl +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/nudgechip.edl +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/short1-laser.png +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/FT-gui-edm/short2-laser.png +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/fixed_target/ft_utils.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/parameters/fixed_target/cs/cs_maker.json +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/parameters/fixed_target/cs/motor_direction.txt +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/parameters/fixed_target/pvar_files/minichip-oxford.pvar +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/parameters/fixed_target/pvar_files/oxford.pvar +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/run_extruder.sh +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/run_fixed_target.sh +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/run_ssx.sh +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/set_visit_directory.sh +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/setup_beamline/__init__.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/setup_beamline/ca.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/setup_beamline/pv.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/setup_beamline/setup_zebra_plans.py +0 -0
- /mx_bluesky/{i24 → beamlines/i24}/serial/start_blueapi.sh +0 -0
- {mx_bluesky-0.3.1.dist-info → mx_bluesky-1.1.0.dist-info}/LICENSE +0 -0
- {mx_bluesky-0.3.1.dist-info → mx_bluesky-1.1.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from collections.abc import Iterator
|
|
5
|
+
from itertools import accumulate
|
|
6
|
+
from typing import Annotated, Any
|
|
7
|
+
|
|
8
|
+
from annotated_types import Len
|
|
9
|
+
from dodal.devices.aperturescatterguard import ApertureValue
|
|
10
|
+
from dodal.devices.detector import DetectorParams
|
|
11
|
+
from dodal.devices.zebra import (
|
|
12
|
+
RotationDirection,
|
|
13
|
+
)
|
|
14
|
+
from dodal.log import LOGGER
|
|
15
|
+
from pydantic import Field, field_validator, model_validator
|
|
16
|
+
from scanspec.core import AxesPoints
|
|
17
|
+
from scanspec.core import Path as ScanPath
|
|
18
|
+
from scanspec.specs import Line
|
|
19
|
+
|
|
20
|
+
from mx_bluesky.hyperion.parameters.components import (
|
|
21
|
+
DiffractionExperimentWithSample,
|
|
22
|
+
IspybExperimentType,
|
|
23
|
+
OptionalGonioAngleStarts,
|
|
24
|
+
OptionalXyzStarts,
|
|
25
|
+
RotationAxis,
|
|
26
|
+
SplitScan,
|
|
27
|
+
WithScan,
|
|
28
|
+
)
|
|
29
|
+
from mx_bluesky.hyperion.parameters.constants import (
|
|
30
|
+
CONST,
|
|
31
|
+
I03Constants,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class RotationScanPerSweep(OptionalGonioAngleStarts, OptionalXyzStarts):
|
|
36
|
+
omega_start_deg: float = Field(default=0) # type: ignore
|
|
37
|
+
rotation_axis: RotationAxis = Field(default=RotationAxis.OMEGA)
|
|
38
|
+
scan_width_deg: float = Field(default=360, gt=0)
|
|
39
|
+
rotation_direction: RotationDirection = Field(default=RotationDirection.NEGATIVE)
|
|
40
|
+
nexus_vds_start_img: int = Field(default=0, ge=0)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class RotationExperiment(DiffractionExperimentWithSample):
|
|
44
|
+
shutter_opening_time_s: float = Field(default=CONST.I03.SHUTTER_TIME_S)
|
|
45
|
+
rotation_increment_deg: float = Field(default=0.1, gt=0)
|
|
46
|
+
ispyb_experiment_type: IspybExperimentType = Field(
|
|
47
|
+
default=IspybExperimentType.ROTATION
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
def _detector_params(self, omega_start_deg: float):
|
|
51
|
+
self.det_dist_to_beam_converter_path = (
|
|
52
|
+
self.det_dist_to_beam_converter_path
|
|
53
|
+
or CONST.PARAM.DETECTOR.BEAM_XY_LUT_PATH
|
|
54
|
+
)
|
|
55
|
+
optional_args = {}
|
|
56
|
+
if self.run_number:
|
|
57
|
+
optional_args["run_number"] = self.run_number
|
|
58
|
+
assert self.detector_distance_mm is not None
|
|
59
|
+
os.makedirs(self.storage_directory, exist_ok=True)
|
|
60
|
+
return DetectorParams(
|
|
61
|
+
detector_size_constants=I03Constants.DETECTOR,
|
|
62
|
+
expected_energy_ev=self.demand_energy_ev,
|
|
63
|
+
exposure_time=self.exposure_time_s,
|
|
64
|
+
directory=self.storage_directory,
|
|
65
|
+
prefix=self.file_name,
|
|
66
|
+
detector_distance=self.detector_distance_mm,
|
|
67
|
+
omega_start=omega_start_deg,
|
|
68
|
+
omega_increment=self.rotation_increment_deg,
|
|
69
|
+
num_images_per_trigger=self.num_images,
|
|
70
|
+
num_triggers=1,
|
|
71
|
+
use_roi_mode=False,
|
|
72
|
+
det_dist_to_beam_converter_path=self.det_dist_to_beam_converter_path,
|
|
73
|
+
**optional_args,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
@field_validator("selected_aperture")
|
|
77
|
+
@classmethod
|
|
78
|
+
def _set_default_aperture_position(cls, aperture_position: ApertureValue | None):
|
|
79
|
+
if not aperture_position:
|
|
80
|
+
default_aperture = CONST.PARAM.ROTATION.DEFAULT_APERTURE_POSITION
|
|
81
|
+
LOGGER.warning(
|
|
82
|
+
f"No aperture position selected. Defaulting to {default_aperture}"
|
|
83
|
+
)
|
|
84
|
+
return default_aperture
|
|
85
|
+
else:
|
|
86
|
+
return aperture_position
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
class RotationScan(WithScan, RotationScanPerSweep, RotationExperiment):
|
|
90
|
+
@property
|
|
91
|
+
def detector_params(self):
|
|
92
|
+
return self._detector_params(self.omega_start_deg)
|
|
93
|
+
|
|
94
|
+
@property
|
|
95
|
+
def scan_points(self) -> AxesPoints:
|
|
96
|
+
scan_spec = Line(
|
|
97
|
+
axis="omega",
|
|
98
|
+
start=self.omega_start_deg,
|
|
99
|
+
stop=(
|
|
100
|
+
self.omega_start_deg
|
|
101
|
+
+ (self.scan_width_deg - self.rotation_increment_deg)
|
|
102
|
+
),
|
|
103
|
+
num=self.num_images,
|
|
104
|
+
)
|
|
105
|
+
scan_path = ScanPath(scan_spec.calculate())
|
|
106
|
+
return scan_path.consume().midpoints
|
|
107
|
+
|
|
108
|
+
@property
|
|
109
|
+
def num_images(self) -> int:
|
|
110
|
+
return int(self.scan_width_deg / self.rotation_increment_deg)
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class MultiRotationScan(RotationExperiment, SplitScan):
|
|
114
|
+
rotation_scans: Annotated[list[RotationScanPerSweep], Len(min_length=1)]
|
|
115
|
+
|
|
116
|
+
def _single_rotation_scan(self, scan: RotationScanPerSweep) -> RotationScan:
|
|
117
|
+
# self has everything from RotationExperiment
|
|
118
|
+
params = self.model_dump()
|
|
119
|
+
del params["rotation_scans"]
|
|
120
|
+
# provided `scan` has everything from RotationScanPerSweep
|
|
121
|
+
params.update(scan.model_dump())
|
|
122
|
+
# together they have everything for RotationScan
|
|
123
|
+
return RotationScan(**params)
|
|
124
|
+
|
|
125
|
+
@model_validator(mode="after")
|
|
126
|
+
@classmethod
|
|
127
|
+
def correct_start_vds(cls, values: Any) -> Any:
|
|
128
|
+
assert isinstance(values, MultiRotationScan)
|
|
129
|
+
start_img = 0.0
|
|
130
|
+
for scan in values.rotation_scans:
|
|
131
|
+
scan.nexus_vds_start_img = int(start_img)
|
|
132
|
+
start_img += scan.scan_width_deg / values.rotation_increment_deg
|
|
133
|
+
return values
|
|
134
|
+
|
|
135
|
+
@property
|
|
136
|
+
def single_rotation_scans(self) -> Iterator[RotationScan]:
|
|
137
|
+
for scan in self.rotation_scans:
|
|
138
|
+
yield self._single_rotation_scan(scan)
|
|
139
|
+
|
|
140
|
+
def _num_images_per_scan(self):
|
|
141
|
+
return [
|
|
142
|
+
int(scan.scan_width_deg / self.rotation_increment_deg)
|
|
143
|
+
for scan in self.rotation_scans
|
|
144
|
+
]
|
|
145
|
+
|
|
146
|
+
@property
|
|
147
|
+
def num_images(self):
|
|
148
|
+
return sum(self._num_images_per_scan())
|
|
149
|
+
|
|
150
|
+
@property
|
|
151
|
+
def scan_indices(self):
|
|
152
|
+
return list(accumulate([0, *self._num_images_per_scan()]))
|
|
153
|
+
|
|
154
|
+
@property
|
|
155
|
+
def detector_params(self):
|
|
156
|
+
return self._detector_params(self.rotation_scans[0].omega_start_deg)
|
|
157
|
+
|
|
158
|
+
@property
|
|
159
|
+
def ispyb_params(self): # pyright: ignore
|
|
160
|
+
raise ValueError("Please get ispyb params from one of the individual scans")
|