From 2df656c7bef88f3ae57ee2a5e650eab6d231fb08 Mon Sep 17 00:00:00 2001 From: Dan Hatton Date: Tue, 2 Jun 2026 14:18:59 +0100 Subject: [PATCH 1/2] add a frame for analysing grid square mag images from serialem collection --- src/murfey/client/contexts/spa_metadata.py | 77 +++++++++++++++++----- 1 file changed, 62 insertions(+), 15 deletions(-) diff --git a/src/murfey/client/contexts/spa_metadata.py b/src/murfey/client/contexts/spa_metadata.py index 4f2dd262c..5dc5eaf0e 100644 --- a/src/murfey/client/contexts/spa_metadata.py +++ b/src/murfey/client/contexts/spa_metadata.py @@ -73,6 +73,23 @@ def _foil_hole_positions(xml_path: Path, grid_square: int) -> Dict[str, FoilHole return foil_holes +def _get_visitless_source(source: Path, environment: MurfeyInstanceEnvironment) -> str: + visitless_source_search_dir = "/".join( + [part for part in source.parts if part != environment.visit] + ).replace("//", "/") + visitless_source_images_dirs = sorted( + Path(visitless_source_search_dir).glob("Images-Disc*"), + key=lambda x: x.stat().st_ctime, + ) + if not visitless_source_images_dirs: + logger.warning(f"Cannot find Images-Disc* in {visitless_source_search_dir}") + visitless_source_images_dirs = [ + Path(visitless_source_search_dir) / "Images-Disc1" + ] + visitless_source = str(visitless_source_images_dirs[-1]) + return visitless_source + + class SPAMetadataContext(Context): def __init__( self, @@ -85,6 +102,7 @@ def __init__( self._basepath = basepath self._machine_config = machine_config self._registered_squares: set[int] = set() + self._registered_squares_serialem: set[str] = set() def post_transfer( self, @@ -97,6 +115,49 @@ def post_transfer( environment=environment, **kwargs, ) + if self._acquisition_software == "serialem": + self.post_transfer_serialem( + transferred_file, environment=environment, **kwargs + ) + else: + self.post_transfer_epu(transferred_file, environment=environment, **kwargs) + + def post_transfer_serialem( + self, + transferred_file: Path, + environment: Optional[MurfeyInstanceEnvironment] = None, + **kwargs, + ): + if environment and transferred_file.suffix == ".mrc": + source = _get_source(transferred_file, environment) + if source: + visitless_source = _get_visitless_source(source, environment) + capture_post( + base_url=str(environment.url.geturl()), + router_name="session_control.spa_router", + function_name="register_square", + token=self._token, + instrument_name=environment.instrument_name, + session_id=environment.murfey_session, + gsid=transferred_file.stem, + data={ + "tag": visitless_source, + "count": len(self._registered_squares_serialem) + 1, + }, + ) + self._registered_squares_serialem.add(transferred_file.stem) + + def post_transfer_epu( + self, + transferred_file: Path, + environment: Optional[MurfeyInstanceEnvironment] = None, + **kwargs, + ): + super().post_transfer( + transferred_file=transferred_file, + environment=environment, + **kwargs, + ) if transferred_file.name == "EpuSession.dm" and environment: logger.info("EPU session metadata found") @@ -194,21 +255,7 @@ def post_transfer( f"Collecting foil hole positions for {str(transferred_file)} and grid square {gs_name}" ) fh_positions = _foil_hole_positions(transferred_file, gs_name) - visitless_source_search_dir = "/".join( - [part for part in source.parts if part != environment.visit] - ).replace("//", "/") - visitless_source_images_dirs = sorted( - Path(visitless_source_search_dir).glob("Images-Disc*"), - key=lambda x: x.stat().st_ctime, - ) - if not visitless_source_images_dirs: - logger.warning( - f"Cannot find Images-Disc* in {visitless_source_search_dir}" - ) - visitless_source_images_dirs = [ - Path(visitless_source_search_dir) / "Images-Disc1" - ] - visitless_source = str(visitless_source_images_dirs[-1]) + visitless_source = _get_visitless_source(source, environment) if fh_positions: gs_info = grid_square_data( From 9cc7d232c6c67fce971ceb107b10f8d5e595705e Mon Sep 17 00:00:00 2001 From: Dan Hatton Date: Wed, 3 Jun 2026 10:22:52 +0100 Subject: [PATCH 2/2] in the serialem case there is no Images-Disc directory to worry about so need to return early when finding the source directory for the fractions --- src/murfey/client/contexts/spa_metadata.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/murfey/client/contexts/spa_metadata.py b/src/murfey/client/contexts/spa_metadata.py index 5dc5eaf0e..2b389d4f3 100644 --- a/src/murfey/client/contexts/spa_metadata.py +++ b/src/murfey/client/contexts/spa_metadata.py @@ -73,10 +73,14 @@ def _foil_hole_positions(xml_path: Path, grid_square: int) -> Dict[str, FoilHole return foil_holes -def _get_visitless_source(source: Path, environment: MurfeyInstanceEnvironment) -> str: +def _get_visitless_source( + source: Path, environment: MurfeyInstanceEnvironment, skip_search: bool = False +) -> str: visitless_source_search_dir = "/".join( [part for part in source.parts if part != environment.visit] ).replace("//", "/") + if skip_search: + return visitless_source_search_dir visitless_source_images_dirs = sorted( Path(visitless_source_search_dir).glob("Images-Disc*"), key=lambda x: x.stat().st_ctime, @@ -131,7 +135,9 @@ def post_transfer_serialem( if environment and transferred_file.suffix == ".mrc": source = _get_source(transferred_file, environment) if source: - visitless_source = _get_visitless_source(source, environment) + visitless_source = _get_visitless_source( + source, environment, skip_search=True + ) capture_post( base_url=str(environment.url.geturl()), router_name="session_control.spa_router",