Skip to content

Commit 3b064fe

Browse files
committed
Add code to register metadata
1 parent 74e0c7d commit 3b064fe

5 files changed

Lines changed: 144 additions & 20 deletions

File tree

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ TomographyMetadataContext = "murfey.client.contexts.tomo_metadata:TomographyMeta
127127
"spa.flush_spa_preprocess" = "murfey.workflows.spa.flush_spa_preprocess:flush_spa_preprocess"
128128
"spa.motion_corrected" = "murfey.workflows.spa.motion_correction:motion_corrected"
129129
"sxt.process_tilt_series" = "murfey.workflows.sxt.process_sxt_tilt_series:run"
130+
"sxt.register_roi" = "murfey.workflows.sxt.sxt_metadata:run"
130131

131132
[tool.setuptools]
132133
package-dir = {"" = "src"}

src/murfey/client/contexts/sxt.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,11 +303,10 @@ def post_transfer(
303303
function_name="register_sxt_roi",
304304
token=self._token,
305305
instrument_name=environment.instrument_name,
306-
visit_name=environment.visit,
307306
session_id=environment.murfey_session,
307+
roi_name=transferred_file.stem,
308308
data={
309309
"tag": dcg_tag,
310-
"name": transferred_file.stem,
311310
"x_stage_position": metadata.get("x_position", None),
312311
"y_stage_position": metadata.get("y_position", None),
313312
"pixel_size": round(metadata.get("pixel_size", 0), 2),

src/murfey/server/api/workflow_sxt.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
validate_instrument_token,
1111
)
1212
from murfey.server.murfey_db import murfey_db
13+
from murfey.util.models import SearchMapParameters
1314
from murfey.workflows.sxt.process_sxt_tilt_series import SXTTiltSeriesInfo
1415

1516
logger = getLogger("murfey.server.api.workflow_sxt")
@@ -62,23 +63,22 @@ def convert_xrm_to_tiff(xrm_file: XrmFile, db=murfey_db):
6263
)
6364

6465

65-
class SxtRoiInfo(BaseModel):
66-
tag: str
67-
name: str
68-
x_stage_position: float
69-
y_stage_position: float
70-
pixel_size: float
71-
height: int
72-
width: int
73-
image: Path
74-
75-
76-
@router.post("/visits/{visit_name}/sessions/{session_id}/register_sxt_roi")
66+
@router.post("/sessions/{session_id}/sxt_roi/{roi_name}")
7767
def register_sxt_roi(
78-
visit_name: str,
7968
session_id: MurfeySessionID,
80-
tilt_series_info: SXTTiltSeriesInfo,
69+
roi_name: str,
70+
roi_info: SearchMapParameters,
8171
db=murfey_db,
8272
):
83-
# TODO
84-
return
73+
if _transport_object:
74+
logger.info(f"Registering SXT region {roi_info.name}")
75+
_transport_object.send(
76+
_transport_object.feedback_queue,
77+
{
78+
"register": "sxt.register_roi",
79+
"session_id": session_id,
80+
"roi_name": roi_name,
81+
"roi_info": roi_info.model_dump(mode="json"),
82+
},
83+
new_connection=True,
84+
)

src/murfey/util/route_manifest.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,10 +1460,10 @@ murfey.server.api.workflow_sxt.router:
14601460
path_params: []
14611461
methods:
14621462
- POST
1463-
- path: /workflow/sxt/visits/{visit_name}/sessions/{session_id}/register_sxt_roi
1463+
- path: /workflow/sxt/sessions/{session_id}/sxt_roi/{roi_name}
14641464
function: register_sxt_roi
14651465
path_params:
1466-
- name: visit_name
1466+
- name: roi_name
14671467
type: str
14681468
- name: session_id
14691469
type: int
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import logging
2+
3+
from sqlmodel.orm.session import Session as SQLModelSession, select
4+
5+
from murfey.server import _transport_object
6+
from murfey.util import sanitise
7+
from murfey.util.db import (
8+
DataCollectionGroup,
9+
SxtRoi,
10+
)
11+
from murfey.util.models import SearchMapParameters
12+
13+
logger = logging.getLogger("murfey.workflows.sxt.sxt_metadata")
14+
15+
16+
def register_sxt_roi(
17+
session_id: int,
18+
roi_name: str,
19+
roi_parameters: SearchMapParameters,
20+
murfey_db: SQLModelSession,
21+
) -> dict[str, bool]:
22+
dcg = murfey_db.exec(
23+
select(DataCollectionGroup)
24+
.where(DataCollectionGroup.session_id == session_id)
25+
.where(DataCollectionGroup.tag == roi_parameters.tag)
26+
).one()
27+
roi_query = murfey_db.exec(
28+
select(SxtRoi)
29+
.where(SxtRoi.name == roi_name)
30+
.where(SxtRoi.tag == roi_parameters.tag)
31+
.where(SxtRoi.session_id == SxtRoi)
32+
).all()
33+
if roi_query:
34+
# See if there is already a search map with this name and update if so
35+
roi = roi_query[0]
36+
roi.x_stage_position = roi_parameters.x_stage_position or roi.x_stage_position
37+
roi.y_stage_position = roi_parameters.y_stage_position or roi.y_stage_position
38+
roi.height = roi_parameters.height or roi.height
39+
roi.width = roi_parameters.width or roi.width
40+
roi.pixel_size = roi_parameters.pixel_size or roi.pixel_size
41+
roi.image = roi_parameters.image or roi.image
42+
if _transport_object:
43+
_transport_object.do_update_sxt_roi(roi.id, roi_parameters)
44+
else:
45+
logger.info(f"Registering new sxt roi {sanitise(roi_name)}")
46+
if _transport_object:
47+
roi_ispyb_response = _transport_object.do_insert_sxt_roi(
48+
dcg.atlas_id, roi_parameters
49+
)
50+
else:
51+
# mock up response so that below still works
52+
roi_ispyb_response = {"success": False, "return_value": None}
53+
# Register new search map
54+
roi = SxtRoi(
55+
id=(
56+
roi_ispyb_response["return_value"]
57+
if roi_ispyb_response["success"]
58+
else None
59+
),
60+
name=roi_name,
61+
session_id=session_id,
62+
tag=roi_parameters.tag,
63+
x_stage_position=roi_parameters.x_stage_position,
64+
y_stage_position=roi_parameters.y_stage_position,
65+
pixel_size=roi_parameters.pixel_size,
66+
width=roi_parameters.width,
67+
height=roi_parameters.height,
68+
thumbnail_size_x=1024,
69+
thumbnail_size_y=1024,
70+
image=roi_parameters.image or "",
71+
)
72+
73+
if all(
74+
[
75+
roi.x_stage_position,
76+
roi.y_stage_position,
77+
roi.pixel_size,
78+
dcg.atlas_pixel_size,
79+
dcg.atlas_stage_x,
80+
dcg.atlas_height,
81+
]
82+
):
83+
# Convert from stage position to pixel locations
84+
roi.x_location = (
85+
roi.x_stage_position - dcg.atlas_stage_x
86+
) / dcg.atlas_pixel_size
87+
roi.y_location = (
88+
roi.y_stage_position - dcg.atlas_stage_y
89+
) / dcg.atlas_pixel_size
90+
91+
# Scaling from different pixel size of atlas and roi, and atlas thumbnailing
92+
roi_parameters.x_location = roi.x_location
93+
roi_parameters.y_location = roi.y_location
94+
roi_parameters.height_on_atlas = (
95+
roi.height
96+
* (roi.pixel_size / dcg.atlas_pixel_size)
97+
* (1024 / dcg.atlas_height)
98+
)
99+
roi_parameters.width_on_atlas = (
100+
roi.width
101+
* (roi.pixel_size / dcg.atlas_pixel_size)
102+
* (1024 / dcg.atlas_width)
103+
)
104+
if _transport_object:
105+
_transport_object.do_update_sxt_roi(roi.id, roi_parameters)
106+
else:
107+
logger.info(
108+
f"Unable to register roi {sanitise(roi.name)} position yet: "
109+
f"roi pixel size {sanitise(str(roi.pixel_size))}, "
110+
f"atlas pixel size {sanitise(str(dcg.atlas_pixel_size))}"
111+
)
112+
murfey_db.add(roi)
113+
murfey_db.commit()
114+
murfey_db.close()
115+
return {"success": True}
116+
117+
118+
def run(message: dict, murfey_db: SQLModelSession) -> dict[str, bool]:
119+
return register_sxt_roi(
120+
message["session_id"],
121+
message["roi_name"],
122+
SearchMapParameters(**message["roi_info"]),
123+
murfey_db,
124+
)

0 commit comments

Comments
 (0)