Skip to content

Commit fa18f21

Browse files
Read whether a search map is a lamella and request hooks (#820)
* Adds a lamella column to the search map database table * Reads lamella status from the Session.dm file when registering search maps * Runs any hooks with the name murfey.hooks.search_map, giving ispyb id, file path, lamella status and pixel size
1 parent 4bea9b4 commit fa18f21

4 files changed

Lines changed: 70 additions & 39 deletions

File tree

src/murfey/client/contexts/tomo_metadata.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,19 @@ def post_transfer(
150150
else ""
151151
)
152152

153+
# Read the session dm to find out if this is a lamella search map or not
154+
lamella = None
155+
if source and (source / "Session.dm").is_file():
156+
with open(source / "Session.dm") as xml:
157+
session_xml = xmltodict.parse(xml.read())
158+
lamella_workflow = session_xml.get("TomographySession", {}).get(
159+
"LamellaWorkflow", None
160+
)
161+
if lamella_workflow:
162+
lamella = lamella_workflow == "true"
163+
else:
164+
logger.warning("Cannot find tomography Session.dm file")
165+
153166
capture_post(
154167
base_url=str(environment.url.geturl()),
155168
router_name="session_control.tomo_router",
@@ -168,6 +181,7 @@ def post_transfer(
168181
"reference_matrix": ref_matrix,
169182
"stage_correction": stage_matrix,
170183
"image_shift_correction": image_matrix,
184+
"lamella": lamella,
171185
},
172186
)
173187

src/murfey/util/db.py

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -556,41 +556,42 @@ class SearchMap(SQLModel, table=True): # type: ignore
556556
session_id: int = Field(foreign_key="session.id")
557557
name: str
558558
tag: str
559-
x_location: Optional[float] = None
560-
y_location: Optional[float] = None
561-
x_stage_position: Optional[float] = None
562-
y_stage_position: Optional[float] = None
563-
pixel_size: Optional[float] = None
559+
lamella: bool | None = None
560+
x_location: float | None = None
561+
y_location: float | None = None
562+
x_stage_position: float | None = None
563+
y_stage_position: float | None = None
564+
pixel_size: float | None = None
564565
image: str = ""
565-
binning: Optional[float] = None
566-
reference_matrix_m11: Optional[float] = None
567-
reference_matrix_m12: Optional[float] = None
568-
reference_matrix_m21: Optional[float] = None
569-
reference_matrix_m22: Optional[float] = None
570-
stage_correction_m11: Optional[float] = None
571-
stage_correction_m12: Optional[float] = None
572-
stage_correction_m21: Optional[float] = None
573-
stage_correction_m22: Optional[float] = None
574-
image_shift_correction_m11: Optional[float] = None
575-
image_shift_correction_m12: Optional[float] = None
576-
image_shift_correction_m21: Optional[float] = None
577-
image_shift_correction_m22: Optional[float] = None
578-
width: Optional[int] = None
579-
height: Optional[int] = None
566+
binning: float | None = None
567+
reference_matrix_m11: float | None = None
568+
reference_matrix_m12: float | None = None
569+
reference_matrix_m21: float | None = None
570+
reference_matrix_m22: float | None = None
571+
stage_correction_m11: float | None = None
572+
stage_correction_m12: float | None = None
573+
stage_correction_m21: float | None = None
574+
stage_correction_m22: float | None = None
575+
image_shift_correction_m11: float | None = None
576+
image_shift_correction_m12: float | None = None
577+
image_shift_correction_m21: float | None = None
578+
image_shift_correction_m22: float | None = None
579+
width: int | None = None
580+
height: int | None = None
580581
session: Optional[Session] = Relationship(back_populates="search_maps")
581582
tilt_series: List["TiltSeries"] = Relationship(
582583
back_populates="search_map", sa_relationship_kwargs={"cascade": "delete"}
583584
)
584-
atlas_id: Optional[int] = Field(
585+
atlas_id: int | None = Field(
585586
foreign_key="datacollectiongroup.dataCollectionGroupId"
586587
)
587-
scaled_pixel_size: Optional[float] = None
588-
pixel_location_x: Optional[int] = None
589-
pixel_location_y: Optional[int] = None
590-
scaled_height: Optional[int] = None
591-
scaled_width: Optional[int] = None
592-
angle: Optional[float] = None
593-
quality_indicator: Optional[float] = None
588+
scaled_pixel_size: float | None = None
589+
pixel_location_x: int | None = None
590+
pixel_location_y: int | None = None
591+
scaled_height: int | None = None
592+
scaled_width: int | None = None
593+
angle: float | None = None
594+
quality_indicator: float | None = None
594595
data_collection_group: Optional["DataCollectionGroup"] = Relationship(
595596
back_populates="search_maps"
596597
)

src/murfey/util/models.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -317,20 +317,21 @@ class FoilHoleParameters(BaseModel):
317317

318318
class SearchMapParameters(BaseModel):
319319
tag: str
320-
x_location: Optional[float] = None
321-
y_location: Optional[float] = None
322-
x_stage_position: Optional[float] = None
323-
y_stage_position: Optional[float] = None
324-
pixel_size: Optional[float] = None
325-
image: Optional[str] = None
326-
binning: Optional[float] = None
320+
x_location: float | None = None
321+
y_location: float | None = None
322+
x_stage_position: float | None = None
323+
y_stage_position: float | None = None
324+
pixel_size: float | None = None
325+
image: str | None = None
326+
binning: float | None = None
327327
reference_matrix: Dict[str, float] = {}
328328
stage_correction: Dict[str, float] = {}
329329
image_shift_correction: Dict[str, float] = {}
330-
height: Optional[int] = None
331-
width: Optional[int] = None
332-
height_on_atlas: Optional[int] = None
333-
width_on_atlas: Optional[int] = None
330+
height: int | None = None
331+
width: int | None = None
332+
height_on_atlas: int | None = None
333+
width_on_atlas: int | None = None
334+
lamella: bool | None = None
334335

335336

336337
class BatchPositionParameters(BaseModel):

src/murfey/workflows/tomo/tomo_metadata.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import logging
2+
from importlib.metadata import entry_points
23

34
import numpy as np
45
from sqlmodel import Session, select
@@ -40,6 +41,7 @@ def register_search_map_in_database(
4041
if search_map_query:
4142
# See if there is already a search map with this name and update if so
4243
search_map = search_map_query[0]
44+
search_map.lamella = search_map_params.lamella or search_map.lamella
4345
search_map.x_stage_position = (
4446
search_map_params.x_stage_position or search_map.x_stage_position
4547
)
@@ -120,6 +122,7 @@ def register_search_map_in_database(
120122
name=search_map_name,
121123
session_id=session_id,
122124
tag=search_map_params.tag,
125+
lamella=search_map_params.lamella,
123126
x_stage_position=search_map_params.x_stage_position,
124127
y_stage_position=search_map_params.y_stage_position,
125128
pixel_size=search_map_params.pixel_size,
@@ -243,6 +246,18 @@ def register_search_map_in_database(
243246
if close_db:
244247
murfey_db.close()
245248

249+
if search_map_hooks := entry_points(group="murfey.hooks", name="search_map"):
250+
try:
251+
for hook in search_map_hooks:
252+
hook.load()(
253+
ispyb_id=search_map.id,
254+
image=search_map_params.image,
255+
pixel_size=search_map_params.pixel_size,
256+
lamella=search_map_params.lamella,
257+
)
258+
except Exception as e:
259+
logger.error(f"Call to search map hook failed with {e}", exc_info=True)
260+
246261

247262
def register_batch_position_in_database(
248263
session_id: MurfeySessionID,

0 commit comments

Comments
 (0)