From e7411a1c1fbd63a7880bd02fa40790fb43dd3f0d Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Thu, 11 Jun 2026 09:06:29 +0100 Subject: [PATCH 1/3] Update image path for grid squares in smartem --- src/murfey/server/api/session_control.py | 34 +++++++++++++++++------- src/murfey/util/route_manifest.yaml | 2 +- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/murfey/server/api/session_control.py b/src/murfey/server/api/session_control.py index bbc62a496..87ae43336 100644 --- a/src/murfey/server/api/session_control.py +++ b/src/murfey/server/api/session_control.py @@ -3,6 +3,7 @@ from pathlib import Path from typing import Dict, List, Optional +import requests from fastapi import APIRouter, Depends from fastapi.responses import FileResponse from ispyb.sqlalchemy import AutoProcProgram as ISPyBAutoProcProgram @@ -417,24 +418,31 @@ def register_atlas( class SquareRegistration(BaseModel): tag: str + image_path: str | None = None count: int | None = None + serialem: bool = False @spa_router.post("/sessions/{session_id}/register_square/{gsid}") def register_square( session_id: MurfeySessionID, - gsid: int, + gsid: int | str, square_registration_data: SquareRegistration, db=murfey_db, ): if SMARTEM_ACTIVE: - gs = db.exec( - select(GridSquare) - .where(GridSquare.name == gsid) - .where(GridSquare.tag == square_registration_data.tag) - .where(GridSquare.session_id == session_id) - ).one_or_none() - if gs and gs.smartem_uuid: + logger.info(f"smartem active for square {gsid}") + if square_registration_data.serialem: + smartem_uuid: int | str | None = gsid + else: + gs = db.exec( + select(GridSquare) + .where(GridSquare.name == gsid) + .where(GridSquare.tag == square_registration_data.tag) + .where(GridSquare.session_id == session_id) + ).one_or_none() + smartem_uuid = gs.smartem_uuid if gs else None + if smartem_uuid is not None: session = db.exec(select(Session).where(Session.id == session_id)).one() machine_config = get_machine_config(session.instrument_name)[ session.instrument_name @@ -444,8 +452,16 @@ def register_square( base_url=machine_config.smartem_api_url, logger=logger ) smartem_client.gridsquare_registered( - gs.smartem_uuid, count=square_registration_data.count + smartem_uuid, count=square_registration_data.count + ) + result = requests.put( + f"{machine_config.smartem_api_url}/gridsquares/{smartem_uuid}", + json={"image_path": square_registration_data.image_path}, ) + if not result.status_code == 200: + logger.warning( + f"Post to smartem gridsquares returned {result.status_code}" + ) else: logger.info("smartem deactivated so did not register square") diff --git a/src/murfey/util/route_manifest.yaml b/src/murfey/util/route_manifest.yaml index ffdccaa51..4fd3b9985 100644 --- a/src/murfey/util/route_manifest.yaml +++ b/src/murfey/util/route_manifest.yaml @@ -920,7 +920,7 @@ murfey.server.api.session_control.spa_router: function: register_square path_params: - name: gsid - type: int + type: int | str - name: session_id type: int methods: From 32c9a7e73a6cea2c3a748f24050c49ba136c1786 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Thu, 11 Jun 2026 09:08:13 +0100 Subject: [PATCH 2/3] Register items in gridsquares folder as serialem metadata --- src/murfey/client/analyser.py | 11 ++++++++--- src/murfey/client/contexts/spa_metadata.py | 8 ++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/murfey/client/analyser.py b/src/murfey/client/analyser.py index 3fe96be9c..9d9182f47 100644 --- a/src/murfey/client/analyser.py +++ b/src/murfey/client/analyser.py @@ -243,11 +243,15 @@ def _find_context(self, file_path: Path) -> bool: ) return True - if "Metadata" in file_path.parts or file_path.name == "EpuSession.dm": + if ( + "Metadata" in file_path.parts + or "gridsquares" in file_path.parts + or file_path.name == "EpuSession.dm" + ): if (context := _get_context("SPAMetadataContext")) is None: return False self._context = context.load()( - "epu", + "serialem" if self._serialem else "epu", self._basepath, self._murfey_config, self._token, @@ -357,12 +361,13 @@ def _analyse(self, transferred_file: Path): if self._limited: if ( "Metadata" in transferred_file.parts + or "gridsquares" in transferred_file.parts or transferred_file.name == "EpuSession.dm" ) and not self._context: if not (context := _get_context("SPAMetadataContext")): return None self._context = context.load()( - "epu", + "serialem" if self._serialem else "epu", self._basepath, self._murfey_config, self._token, diff --git a/src/murfey/client/contexts/spa_metadata.py b/src/murfey/client/contexts/spa_metadata.py index 2b389d4f3..7f2e68b3f 100644 --- a/src/murfey/client/contexts/spa_metadata.py +++ b/src/murfey/client/contexts/spa_metadata.py @@ -138,6 +138,12 @@ def post_transfer_serialem( visitless_source = _get_visitless_source( source, environment, skip_search=True ) + destination_file = _file_transferred_to( + environment, + source, + transferred_file, + Path(self._machine_config.get("rsync_basepath", "")), + ) capture_post( base_url=str(environment.url.geturl()), router_name="session_control.spa_router", @@ -148,7 +154,9 @@ def post_transfer_serialem( gsid=transferred_file.stem, data={ "tag": visitless_source, + "image_path": str(destination_file), "count": len(self._registered_squares_serialem) + 1, + "serialem": self._acquisition_software == "serialem", }, ) self._registered_squares_serialem.add(transferred_file.stem) From 26fbd0c8c63b20326de2bb20b0bf86d701ec5317 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Fri, 12 Jun 2026 16:10:00 +0100 Subject: [PATCH 3/3] Sanitise gsid --- src/murfey/server/api/session_control.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/murfey/server/api/session_control.py b/src/murfey/server/api/session_control.py index 87ae43336..2faff232f 100644 --- a/src/murfey/server/api/session_control.py +++ b/src/murfey/server/api/session_control.py @@ -431,7 +431,7 @@ def register_square( db=murfey_db, ): if SMARTEM_ACTIVE: - logger.info(f"smartem active for square {gsid}") + logger.info(f"smartem active for square {sanitise(str(gsid))}") if square_registration_data.serialem: smartem_uuid: int | str | None = gsid else: