diff --git a/src/murfey/client/contexts/spa_metadata.py b/src/murfey/client/contexts/spa_metadata.py index 34a58c925..85244e4aa 100644 --- a/src/murfey/client/contexts/spa_metadata.py +++ b/src/murfey/client/contexts/spa_metadata.py @@ -84,6 +84,7 @@ def __init__( super().__init__("SPA_metadata", acquisition_software, token) self._basepath = basepath self._machine_config = machine_config + self._registered_squares: set[int] = set() def post_transfer( self, @@ -243,39 +244,44 @@ def post_transfer( }, ) - for fh, fh_data in fh_positions.items(): - capture_post( - base_url=str(environment.url.geturl()), - router_name="session_control.spa_router", - function_name="register_foil_hole", - token=self._token, - instrument_name=environment.instrument_name, - session_id=environment.murfey_session, - gs_name=gs_name, - data={ - "name": fh, - "x_location": fh_data.x_location, - "y_location": fh_data.y_location, - "x_stage_position": fh_data.x_stage_position, - "y_stage_position": fh_data.y_stage_position, - "readout_area_x": fh_data.readout_area_x, - "readout_area_y": fh_data.readout_area_y, - "thumbnail_size_x": fh_data.thumbnail_size_x, - "thumbnail_size_y": fh_data.thumbnail_size_y, - "pixel_size": fh_data.pixel_size, - "diameter": fh_data.diameter, - "tag": visitless_source, - "image": fh_data.image, - }, - ) - if fh_positions: - 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=gs_name, - data={"tag": visitless_source}, - ) + if gs_name not in self._registered_squares: + for fh, fh_data in fh_positions.items(): + capture_post( + base_url=str(environment.url.geturl()), + router_name="session_control.spa_router", + function_name="register_foil_hole", + token=self._token, + instrument_name=environment.instrument_name, + session_id=environment.murfey_session, + gs_name=gs_name, + data={ + "name": fh, + "x_location": fh_data.x_location, + "y_location": fh_data.y_location, + "x_stage_position": fh_data.x_stage_position, + "y_stage_position": fh_data.y_stage_position, + "readout_area_x": fh_data.readout_area_x, + "readout_area_y": fh_data.readout_area_y, + "thumbnail_size_x": fh_data.thumbnail_size_x, + "thumbnail_size_y": fh_data.thumbnail_size_y, + "pixel_size": fh_data.pixel_size, + "diameter": fh_data.diameter, + "tag": visitless_source, + "image": fh_data.image, + }, + ) + if fh_positions: + 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=gs_name, + data={ + "tag": visitless_source, + "count": len(self._registered_squares) + 1, + }, + ) + self._registered_squares.add(gs_name) diff --git a/src/murfey/server/api/session_control.py b/src/murfey/server/api/session_control.py index abe4281c0..75cf39f37 100644 --- a/src/murfey/server/api/session_control.py +++ b/src/murfey/server/api/session_control.py @@ -415,6 +415,7 @@ def register_atlas( class SquareRegistration(BaseModel): tag: str + count: int | None = None @spa_router.post("/sessions/{session_id}/register_square/{gsid}") @@ -440,7 +441,9 @@ def register_square( smartem_client = SmartEMAPIClient( base_url=machine_config.smartem_api_url, logger=logger ) - smartem_client.gridsquare_registered(gs.smartem_uuid) + smartem_client.gridsquare_registered( + gs.smartem_uuid, count=square_registration_data.count + ) else: logger.info("smartem deactivated so did not register square") diff --git a/src/murfey/workflows/spa/flush_spa_preprocess.py b/src/murfey/workflows/spa/flush_spa_preprocess.py index 5ccaa73eb..64c381f3d 100644 --- a/src/murfey/workflows/spa/flush_spa_preprocess.py +++ b/src/murfey/workflows/spa/flush_spa_preprocess.py @@ -11,6 +11,7 @@ from smartem_common.schemas import ( FoilHoleData as SmartEMFoilHoleData, GridSquareData as SmartEMGridSquareData, + GridSquareMetadata as SmartEMGridSquareMetadata, ) SMARTEM_ACTIVE = True @@ -154,6 +155,21 @@ def register_grid_square( .where(DataCollectionGroup.tag == grid_square_params.tag) ).one_or_none() if dcg and dcg.smartem_grid_uuid: + secured_grid_square_image_path_full_res: Path | None = None + if grid_square_params.image: + secured_grid_square_image_path_full_res = secure_path( + Path(grid_square_params.image) + ) + if secured_grid_square_image_path_full_res.with_suffix( + ".tiff" + ).is_file(): + secured_grid_square_image_path_full_res = ( + secured_grid_square_image_path_full_res.with_suffix(".tiff") + ) + else: + secured_grid_square_image_path_full_res = ( + secured_grid_square_image_path_full_res.with_suffix(".mrc") + ) smartem_client = SmartEMAPIClient( base_url=machine_config.smartem_api_url, logger=logger ) @@ -177,6 +193,15 @@ def register_grid_square( if grid_square.smartem_uuid else {} ), + metadata=SmartEMGridSquareMetadata( + atlas_node_id=0, + stage_position=None, + state=None, + rotation=None, + image_path=secured_grid_square_image_path_full_res, + selected=False, + unusable=False, + ), ) if grid_square.smartem_uuid: smartem_client.update_gridsquare(gs_data)