Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
e8e2ceb
Add GridScanParams, initial fixups
rtuck99 Jun 12, 2026
485bdd8
Refactor grid scan params - separate grid scan and grid detect params
rtuck99 Jun 15, 2026
f2df956
Fixup axis bounds checking on xrc results
rtuck99 Jul 1, 2026
b15560d
Additional docs for GridScanParams
rtuck99 Jul 1, 2026
47e0535
Remove unneeded full parameters from run_gridscan
rtuck99 Jul 1, 2026
64dba77
WIP - src is refactored, tests still all broken
rtuck99 Jul 2, 2026
41bbfc0
WIP external callbacks refactored, tests still broken
rtuck99 Jul 3, 2026
c4c63dd
WIP some unit tests refactored
rtuck99 Jul 3, 2026
0ebe805
Type-checking for unit tests now passes, system tests still failing
rtuck99 Jul 7, 2026
5431552
WIP DetectorParams changes
rtuck99 Jul 8, 2026
570217e
WIP more unit tests working
rtuck99 Jul 8, 2026
4e68fed
WIP only 3 unit tests failing
rtuck99 Jul 9, 2026
8fdfeaa
Unit tests passing
rtuck99 Jul 9, 2026
0f60b5c
Removed redundant grid classes, test files
rtuck99 Jul 9, 2026
9df24fd
Fix nexus tests for full_num_of_images
rtuck99 Jul 9, 2026
5668c9d
Prevent directory reads in CI
rtuck99 Jul 9, 2026
300b228
Remove a couple of minor unused things
rtuck99 Jul 9, 2026
ed65857
System tests fixed for type correctness
rtuck99 Jul 9, 2026
e6495d1
All system tests passing
rtuck99 Jul 13, 2026
ddf7183
Fixup unit tests
rtuck99 Jul 13, 2026
a3fa3df
Fixup system tests to find the correct oav
rtuck99 Jul 13, 2026
e984d83
Add new parameter plantUML drawings
rtuck99 Jul 13, 2026
06939a0
Remove call to generate plantuml
rtuck99 Jul 13, 2026
d43f66c
Remove generate_plantuml script
rtuck99 Jul 13, 2026
7f87b8f
Fixup images
rtuck99 Jul 13, 2026
931932c
Tidy up various TODOs
rtuck99 Jul 14, 2026
13f8a46
Make pyright happy
rtuck99 Jul 14, 2026
0ef0ae4
Add some package-related TODOs
rtuck99 Jul 14, 2026
40d0e7b
Update set_panda_directory to use path provider registry
rtuck99 Jul 20, 2026
f8e9bf3
WIP - refactoring beamline specific features to accept variable detec…
rtuck99 Jul 20, 2026
a727122
Change pin_centre_then_gridscan_plan signatures for generics
rtuck99 Jul 21, 2026
da3e4e5
WIP panda/zebra refactor
rtuck99 Jul 22, 2026
683bd9b
WIP refactoring detector
rtuck99 Jul 23, 2026
0bd78d6
WIP extending generics
rtuck99 Jul 27, 2026
ada532e
WIP src now passes type-checking
rtuck99 Jul 28, 2026
0e06749
WIP system tests passing type-checking
rtuck99 Jul 28, 2026
7f57620
WIP - some detector and gridscan functions relocated
rtuck99 Jul 28, 2026
726a82f
Most type-checking fixed, some unit tests fixed
rtuck99 Jul 29, 2026
1c5eed8
Unit tests passing
rtuck99 Jul 30, 2026
60d8350
Fixup remaining unit tests
rtuck99 Jul 30, 2026
2c78d11
System tests passing
rtuck99 Jul 30, 2026
57ed44d
Fix remaining type-checking issues
rtuck99 Jul 30, 2026
c06583e
Remove call to set_detector_parameters
rtuck99 Jul 30, 2026
be51b5d
Change DiffractionEssentialDevices to a Protocol
rtuck99 Jul 30, 2026
82f8c9b
Update uv.lock
rtuck99 Jul 30, 2026
0d418b8
Make type-checking happy
rtuck99 Jul 30, 2026
dd7a92b
Change DiffractionExtendedDevices to a protocol
rtuck99 Jul 30, 2026
0ef5097
Convert GridDetectAndGridScanExtendedDevices into a Protocol
rtuck99 Jul 30, 2026
525f681
Add GH issue links to TODOs
rtuck99 Jul 30, 2026
a38ad3e
Add a GH issue reference for config server switch
rtuck99 Jul 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions docs/developer/hyperion/reference/common_params.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package mx_bluesky.common.parameters {
together {
class WithSample{
int sample_id
int | None sample_puck
int | None sample_pin
}
class WithVisit{
str beamline
str visit
float | None detector_distance_mm
}
class WithSnapshot {
Path snapshot_directory
list[float] snapshot_omegas_deg
bool use_grid_snapshots
}
class WithOptionalEnergyChange {
float | None demand_energy_ev
}
class OptionalGonioAngleStarts {
list[int] omega_starts_deg
float | None phi_start_deg
float | None chi_start_deg
float | None kappa_start_deg
}
}
class MxBlueskyParameters{
SemanticVersion parameter_model_version
}
together {
class DiffractionExperiment {
str file_name
float exposure_time_s
str comment
TriggerMode trigger_mode
int run_number
ApertureValue selected_aperture
float transmission_frac
IspybExperimentType ispyb_experiment_type
str storage_directory
bool use_roi_mode
}
class DiffractionExperimentWithSample
}
}

MxBlueskyParameters <|-- DiffractionExperiment
DiffractionExperiment <|-- DiffractionExperimentWithSample
WithSample <|-- DiffractionExperimentWithSample
WithSnapshot <|-- DiffractionExperiment
WithOptionalEnergyChange <|-- DiffractionExperiment
WithVisit <|-- DiffractionExperiment
125 changes: 0 additions & 125 deletions docs/developer/hyperion/reference/gridscan.puml

This file was deleted.

36 changes: 36 additions & 0 deletions docs/developer/hyperion/reference/internal_params_gridscan.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
'This file is auto-generated by generate_plantuml.py
@startuml hyperion_parameter_model
title Hyperion Internal Parameter Model (Centring and GridScans)
set namespaceSeparator none

!include common_params.puml

package mx_bluesky.common.parameters {
together {
class GridDetectionParams {
float box_size_um
float grid_width_um
}
class GridScanParams {
list[int] omega_starts_deg
float x_start_um
list[float] y_starts_um
list[float] z_starts_um
int x_steps
list[int] y_steps
float x_step_size_um
list[float] y_step_sizes_um
}
}
}

package mx_bluesky.hyperion.parameters {
class PinTipCentreThenXrayCentre
class RobotLoadThenCentre
}

GridScanParams <|-- PinTipCentreThenXrayCentre
OptionalGonioAngleStarts <|-- PinTipCentreThenXrayCentre
DiffractionExperimentWithSample <|-- PinTipCentreThenXrayCentre
PinTipCentreThenXrayCentre <|-- RobotLoadThenCentre
@enduml
27 changes: 27 additions & 0 deletions docs/developer/hyperion/reference/internal_params_rotation.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
'This file is auto-generated by generate_plantuml.py
@startuml hyperion_parameter_model
title Hyperion Internal Parameter Model (Rotation)
set namespaceSeparator none

!include common_params.puml

package mx_bluesky.common.parameters {
together {
class RotationExperiment
class SingleRotationScan
class RotationScanPerSweep
class RotationScan
}
}
package mx_bluesky.hyperion.parameters {
}


DiffractionExperimentWithSample <|-- SingleRotationScan
DiffractionExperimentWithSample <|-- RotationScan
RotationExperiment <|-- SingleRotationScan
RotationScanPerSweep <|-- SingleRotationScan
DiffractionExperiment <|-- RotationExperiment
OptionalGonioAngleStarts <|-- RotationScanPerSweep
WithSample <|-- RotationScanPerSweep
@enduml
8 changes: 7 additions & 1 deletion docs/developer/hyperion/reference/param-hierarchy.rst
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
Hyperion Parameter class hierarchy
==================================

.. uml:: param_hierarchy.puml
Below are outline diagrams for the internal parameter models for gridscans and rotations.
Note that not all details are shown.

.. image:: ../../../images/internal_params_gridscan.png


.. image:: ../../../images/internal_params_rotation.png
Binary file added docs/images/internal_params_gridscan.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/images/internal_params_rotation.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
9 changes: 1 addition & 8 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ dependencies = [
"ophyd >= 1.10.5",
"ophyd-async >= 0.17a4",
"bluesky >= 1.14.6",
"dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@684bc381d9ea5a924ed1ab4a444e71524765602f",
"dls-dodal @ git+https://github.com/DiamondLightSource/dodal.git@use_fastcs_eiger_for_xrc",
]


Expand Down Expand Up @@ -272,13 +272,6 @@ CONFIG_SERVER_URL = "http://localhost:8555"
description = "Run docs build with clean environment"
env_dir = ".venv"
skip_install = true
commands_pre = [
[
"python",
"{toxinidir}/utility_scripts/generate_plantuml.py",
"docs/developer/hyperion/reference/param_hierarchy.puml",
],
]
commands = [
[
"sphinx-build",
Expand Down
16 changes: 0 additions & 16 deletions src/mx_bluesky/beamlines/i02_1/composites.py

This file was deleted.

34 changes: 34 additions & 0 deletions src/mx_bluesky/beamlines/i02_1/device_setup_plans/gridscan.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from __future__ import annotations

from bluesky.utils import MsgGenerator
from dodal.devices.beamlines.i02_1.fast_grid_scan import ZebraGridScanParamsTwoD
from dodal.devices.fast_grid_scan import FastGridScanCommon, set_fast_grid_scan_params

from mx_bluesky.common.parameters.components import DiffractionExperiment
from mx_bluesky.common.parameters.gridscan import GridScanParams


def set_zebra_fgs_2d_params(
fast_grid_scan: FastGridScanCommon[ZebraGridScanParamsTwoD],
expt_params: DiffractionExperiment,
grid_scan_params: GridScanParams,
) -> MsgGenerator:
zebra_fgs_params = _fast_gridscan_2d_params(expt_params, grid_scan_params)
yield from set_fast_grid_scan_params(fast_grid_scan, zebra_fgs_params)


def _fast_gridscan_2d_params(
params: DiffractionExperiment, grid_scan_params: GridScanParams
) -> ZebraGridScanParamsTwoD:
return ZebraGridScanParamsTwoD(
x_steps=grid_scan_params.x_steps,
y_steps=grid_scan_params.y_steps[0],
x_step_size_mm=grid_scan_params.x_step_size_um / 1000,
y_step_size_mm=grid_scan_params.y_step_sizes_um[0] / 1000,
x_start_mm=grid_scan_params.x_start_um / 1000,
y1_start_mm=grid_scan_params.y_starts_um[0] / 1000,
z1_start_mm=grid_scan_params.z_starts_um[0] / 1000,
set_stub_offsets=False,
transmission_fraction=0.5,
dwell_time_ms=params.exposure_time_s * 1000,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from collections.abc import Sequence

from mx_bluesky.beamlines.i02_1.composites import I02_1FgsParams
from mx_bluesky.beamlines.i02_1.parameters import I02_1FgsParams
from mx_bluesky.common.external_interaction.callbacks.grid.grid_detect_and_scan.ispyb_mapping import (
construct_comment_for_gridscan,
)
Expand All @@ -26,34 +26,40 @@ def _get_scan_infos(self, doc) -> Sequence[ScanDataInfo]:
For VMXm, grid information is available immediately after the plan is triggered.
"""
assert isinstance(self.params, I02_1FgsParams)
assert self.grid_scan_params
assert self.detector_params
assert self.ispyb_ids.data_collection_ids, "No current data collection"
assert self.data_collection_group_info, "No data collection group"
data = doc["data"]
scan_data_infos = []

for grid_num in range(self.params.num_grids):
omega = data.get("gonio-omega", self.params.omega_starts_deg[grid_num])
for grid_num in range(self.grid_scan_params.num_grids):
omega = data.get(
"gonio-omega", self.grid_scan_params.omega_starts_deg[grid_num]
)

ISPYB_ZOCALO_CALLBACK_LOGGER.info(
f"Generating dc info for gridplane XY, omega {omega}"
)
data_collection_number = self.params.detector_params.run_number
file_template = f"{self.params.detector_params.prefix}_{data_collection_number}_master.h5"
data_collection_number = self.detector_params.run_number
file_template = (
f"{self.detector_params.prefix}_{data_collection_number}_master.h5"
)
# Snapshots have already been taken in GDA

data_collection_info = DataCollectionInfo(
xtal_snapshot1=str(self.params.path_to_xtal_snapshot),
xtal_snapshot2=str(self.params.path_to_xtal_snapshot),
xtal_snapshot3=str(self.params.path_to_xtal_snapshot),
n_images=self.params.num_images,
n_images=self.grid_scan_params.num_images,
data_collection_number=data_collection_number,
file_template=file_template,
)
data_collection_grid_info = DataCollectionGridInfo(
dx_in_mm=self.params.x_step_size_um / 1000,
dy_in_mm=self.params.y_step_sizes_um[grid_num] / 1000,
steps_x=self.params.x_steps,
steps_y=self.params.y_steps[grid_num],
dx_in_mm=self.grid_scan_params.x_step_size_um / 1000,
dy_in_mm=self.grid_scan_params.y_step_sizes_um[grid_num] / 1000,
steps_x=self.grid_scan_params.x_steps,
steps_y=self.grid_scan_params.y_steps[grid_num],
microns_per_pixel_x=self.params.microns_per_pixel_x,
microns_per_pixel_y=self.params.microns_per_pixel_y,
snapshot_offset_x_pixel=self.params.upper_left_x,
Expand All @@ -68,7 +74,7 @@ def _get_scan_infos(self, doc) -> Sequence[ScanDataInfo]:
data_collection_id = self.ispyb_ids.data_collection_ids[0]

self.data_collection_group_info.comments = _make_comment(
self.params.x_steps, self.params.y_steps[0]
self.grid_scan_params.x_steps, self.grid_scan_params.y_steps[0]
)

self._populate_axis_info(data_collection_info, doc["data"])
Expand Down
Loading
Loading