From 6b4a527e131b00fe072158c7ca91bb33137ddcce Mon Sep 17 00:00:00 2001 From: Julia Dark Date: Fri, 18 Oct 2024 16:38:29 -0400 Subject: [PATCH] Implement `get_transform_from_*` methods --- apis/python/src/tiledbsoma/_scene.py | 38 +++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/apis/python/src/tiledbsoma/_scene.py b/apis/python/src/tiledbsoma/_scene.py index 467db84984..fe4c9ec0d6 100644 --- a/apis/python/src/tiledbsoma/_scene.py +++ b/apis/python/src/tiledbsoma/_scene.py @@ -531,7 +531,10 @@ def get_transform_from_geometry_dataframe( Lifecycle: experimental """ - raise NotImplementedError() + transform = self.get_transform_to_geometry_dataframe( + key, subcollection=subcollection + ) + return transform.inverse_transform() def get_transform_from_multiscale_image( self, @@ -556,7 +559,33 @@ def get_transform_from_multiscale_image( Lifecycle: experimental """ - raise NotImplementedError() + if level is None: + transform = self.get_transform_to_multiscale_image( + key, subcollection=subcollection + ) + return transform.inverse_transform() + coll = self._open_subcollection(subcollection) + try: + transform_json = coll.metadata[f"soma_scene_registry_{key}"] + except KeyError: + raise KeyError( + f"No coordinate space registry for '{key}' in collection " + f"'{subcollection}'" + ) + base_transform = transform_from_json(transform_json) + try: + image: MultiscaleImage = coll[key] # type: ignore[assignment] + except KeyError as ke: + raise KeyError( + f"No MultiscaleImage named '{key}' in '{subcollection}'." + ) from ke + if not isinstance(image, MultiscaleImage): + raise TypeError( + f"Item at '{key}' in '{subcollection}' has an unexpected type " + f"{type(image)!r}." + ) + level_transform = image.get_transform_from_level(level) + return base_transform.inverse_transform() @ level_transform def get_transform_from_point_cloud_dataframe( self, key: str, *, subcollection: str = "obsl" @@ -574,7 +603,10 @@ def get_transform_from_point_cloud_dataframe( Lifecycle: experimental """ - raise NotImplementedError() + transform = self.get_transform_to_point_cloud_dataframe( + key, subcollection=subcollection + ) + return transform.inverse_transform() def get_transform_to_geometry_dataframe( self, key: str, *, subcollection: Union[str, Sequence[str]] = "obsl"