From 75da69fa91a84d0a2b6044280a4c9b7eb76ff918 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 27 Jan 2026 15:17:49 +0000 Subject: [PATCH 1/2] SPA metadata source should include Images-Disc --- src/murfey/client/context.py | 3 +- src/murfey/client/contexts/spa_metadata.py | 75 ++++++++++++---------- 2 files changed, 44 insertions(+), 34 deletions(-) diff --git a/src/murfey/client/context.py b/src/murfey/client/context.py index 6edf95cb..20132a2d 100644 --- a/src/murfey/client/context.py +++ b/src/murfey/client/context.py @@ -47,7 +47,8 @@ def ensure_dcg_exists( session_file = metadata_source / "Session.dm" elif collection_type == "spa": experiment_type_id = 37 - session_file = metadata_source / "EpuSession.dm" + # For SPA the metadata source sent should include the Images-Disc + session_file = metadata_source.parent / "EpuSession.dm" for h in entry_points(group="murfey.hooks"): try: if h.name == "get_epu_session_metadata": diff --git a/src/murfey/client/contexts/spa_metadata.py b/src/murfey/client/contexts/spa_metadata.py index 52785ad9..747cc4ec 100644 --- a/src/murfey/client/contexts/spa_metadata.py +++ b/src/murfey/client/contexts/spa_metadata.py @@ -106,35 +106,39 @@ def post_transfer( return if source: - dcg_tag = ensure_dcg_exists( - collection_type="spa", - metadata_source=source, - environment=environment, - token=self._token, - ) gs_pix_positions = get_grid_square_atlas_positions( source.parent / partial_path ) - for gs, pos_data in gs_pix_positions.items(): - if pos_data: - capture_post( - base_url=str(environment.url.geturl()), - router_name="session_control.spa_router", - function_name="register_grid_square", - token=self._token, - session_id=environment.murfey_session, - gsid=int(gs), - data={ - "tag": dcg_tag, - "x_location": pos_data[0], - "y_location": pos_data[1], - "x_stage_position": pos_data[2], - "y_stage_position": pos_data[3], - "width": pos_data[4], - "height": pos_data[5], - "angle": pos_data[6], - }, - ) + for images_disc in list(source.glob("Images-Disc*")) or [ + source / "Images-Disc1" + ]: + # Do the dcg registration for every Images-Disc with this session file + dcg_tag = ensure_dcg_exists( + collection_type="spa", + metadata_source=images_disc, + environment=environment, + token=self._token, + ) + for gs, pos_data in gs_pix_positions.items(): + if pos_data: + capture_post( + base_url=str(environment.url.geturl()), + router_name="session_control.spa_router", + function_name="register_grid_square", + token=self._token, + session_id=environment.murfey_session, + gsid=int(gs), + data={ + "tag": dcg_tag, + "x_location": pos_data[0], + "y_location": pos_data[1], + "x_stage_position": pos_data[2], + "y_stage_position": pos_data[3], + "width": pos_data[4], + "height": pos_data[5], + "angle": pos_data[6], + }, + ) elif ( transferred_file.suffix == ".dm" @@ -145,12 +149,15 @@ def post_transfer( source = _get_source(transferred_file, environment=environment) if source is None: return None - ensure_dcg_exists( - collection_type="spa", - metadata_source=source, - environment=environment, - token=self._token, - ) + for images_disc in list(source.glob("Images-Disc*")) or [ + source / "Images-Disc1" + ]: + ensure_dcg_exists( + collection_type="spa", + metadata_source=images_disc, + environment=environment, + token=self._token, + ) gs_name = int(transferred_file.stem.split("_")[1]) logger.info( @@ -168,7 +175,9 @@ def post_transfer( logger.warning( f"Cannot find Images-Disc* in {visitless_source_search_dir}" ) - return + visitless_source_images_dirs = [ + Path(visitless_source_search_dir) / "Images-Disc1" + ] visitless_source = str(visitless_source_images_dirs[-1]) if fh_positions: From e900e73dab33f522228a418d36233d0b62aa3602 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 27 Jan 2026 15:51:34 +0000 Subject: [PATCH 2/2] Don't look for Images-Disc as it is sent --- src/murfey/client/context.py | 21 ++++----------------- tests/client/test_context.py | 2 +- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/murfey/client/context.py b/src/murfey/client/context.py index 20132a2d..0250bb20 100644 --- a/src/murfey/client/context.py +++ b/src/murfey/client/context.py @@ -45,10 +45,12 @@ def ensure_dcg_exists( if collection_type == "tomo": experiment_type_id = 36 session_file = metadata_source / "Session.dm" + source_visit_dir = metadata_source.parent elif collection_type == "spa": experiment_type_id = 37 # For SPA the metadata source sent should include the Images-Disc session_file = metadata_source.parent / "EpuSession.dm" + source_visit_dir = metadata_source.parent.parent for h in entry_points(group="murfey.hooks"): try: if h.name == "get_epu_session_metadata": @@ -91,7 +93,6 @@ def ensure_dcg_exists( partial_path = "/".join(windows_path.split("\\")[visit_index + 1 :]) logger.info("Partial Linux path successfully constructed from Windows path") - source_visit_dir = metadata_source.parent logger.info( f"Looking for atlas XML file in metadata directory {str((source_visit_dir / partial_path).parent)}" ) @@ -121,28 +122,14 @@ def ensure_dcg_exists( atlas=Path(partial_path), sample=sample ) - dcg_search_dir = ( + dcg_tag = ( str(metadata_source).replace(f"/{environment.visit}", "").replace("//", "/") ) - if collection_type == "tomo": - dcg_tag = dcg_search_dir - else: - dcg_images_dirs = sorted( - Path(dcg_search_dir).glob("Images-Disc*"), - key=lambda x: x.stat().st_ctime, - ) - if not dcg_images_dirs: - logger.warning( - f"Cannot find Images-Disc* in {dcg_search_dir}, falling back to Images-Disc1" - ) - dcg_images_dirs = [Path(dcg_search_dir) / "Images-Disc1"] - dcg_tag = str(dcg_images_dirs[-1]) - dcg_data = { "experiment_type_id": experiment_type_id, "tag": dcg_tag, "atlas": str( - _atlas_destination(environment, metadata_source, token) + _atlas_destination(environment, session_file.parent, token) / environment.samples[metadata_source].atlas.parent / atlas_xml_path.with_suffix(".jpg").name ).replace("//", "/"), diff --git a/tests/client/test_context.py b/tests/client/test_context.py index e61a33be..732ec0f1 100644 --- a/tests/client/test_context.py +++ b/tests/client/test_context.py @@ -99,7 +99,7 @@ def test_ensure_dcg_exists_spa(mock_capture_post, tmp_path): ensure_dcg_exists( collection_type="spa", - metadata_source=metadata_source, + metadata_source=metadata_source / "Images-Disc1", environment=env, token="token", )