Skip to content

Commit 40dad3e

Browse files
committed
debloat spatial_neighbours
1 parent 5f61dd5 commit 40dad3e

1 file changed

Lines changed: 62 additions & 47 deletions

File tree

src/squidpy/gr/_build.py

Lines changed: 62 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -142,54 +142,13 @@ def spatial_neighbors(
142142
- :attr:`anndata.AnnData.obsp` ``['{{key_added}}_distances']`` - the spatial distances.
143143
- :attr:`anndata.AnnData.uns` ``['{{key_added}}']`` - :class:`dict` containing parameters.
144144
"""
145-
if isinstance(adata, SpatialData):
146-
assert elements_to_coordinate_systems is not None, (
147-
"Since `adata` is a :class:`spatialdata.SpatialData`, `elements_to_coordinate_systems` must not be `None`."
148-
)
149-
assert table_key is not None, (
150-
"Since `adata` is a :class:`spatialdata.SpatialData`, `table_key` must not be `None`."
151-
)
152-
elements, table = match_element_to_table(adata, list(elements_to_coordinate_systems), table_key)
153-
assert table.obs_names.equals(adata.tables[table_key].obs_names), (
154-
"The spatialdata table must annotate all elements keys. Some elements are missing, please check the `elements_to_coordinate_systems` dictionary."
155-
)
156-
regions, region_key, instance_key = get_table_keys(adata.tables[table_key])
157-
regions = [regions] if isinstance(regions, str) else regions
158-
ordered_regions_in_table = adata.tables[table_key].obs[region_key].unique()
159-
160-
# TODO: remove this after https://github.com/scverse/spatialdata/issues/614
161-
remove_centroids = {}
162-
elem_instances = []
163-
for e in regions:
164-
schema = get_model(elements[e])
165-
element_instances = get_element_instances(elements[e]).to_series()
166-
if np.isin(0, element_instances.values) and (schema in (Labels2DModel, Labels3DModel)):
167-
element_instances = element_instances.drop(index=0)
168-
remove_centroids[e] = True
169-
else:
170-
remove_centroids[e] = False
171-
elem_instances.append(element_instances)
172145

173-
element_instances = pd.concat(elem_instances)
174-
if (not np.all(element_instances.values == adata.tables[table_key].obs[instance_key].values)) or (
175-
not np.all(ordered_regions_in_table == regions)
176-
):
177-
raise ValueError(
178-
"The spatialdata table must annotate all elements keys. Some elements are missing or not ordered correctly, please check the `elements_to_coordinate_systems` dictionary."
179-
)
180-
centroids = []
181-
for region_ in ordered_regions_in_table:
182-
cs = elements_to_coordinate_systems[region_]
183-
centroid = get_centroids(adata[region_], coordinate_system=cs)[["x", "y"]].compute()
184-
185-
# TODO: remove this after https://github.com/scverse/spatialdata/issues/614
186-
if remove_centroids[region_]:
187-
centroid = centroid[1:].copy()
188-
centroids.append(centroid)
189-
190-
adata.tables[table_key].obsm[spatial_key] = np.concatenate(centroids)
191-
adata = adata.tables[table_key]
192-
library_key = region_key
146+
adata, library_key = _resolve_sdata(
147+
adata=adata,
148+
elements_to_coordinate_systems=elements_to_coordinate_systems,
149+
table_key=table_key,
150+
spatial_key=spatial_key
151+
)
193152

194153
_assert_positive(n_rings, name="n_rings")
195154
_assert_positive(n_neighs, name="n_neighs")
@@ -436,6 +395,62 @@ def _build_connectivity(
436395
return Adj
437396

438397

398+
def _resolve_sdata(
399+
adata: AnnData | SpatialData,
400+
elements_to_coordinate_systems: dict[str, str],
401+
table_key: str = "table",
402+
spatial_key: str = Key.obsm.spatial,
403+
) -> tuple[AnnData, str | None]:
404+
if isinstance(adata, SpatialData):
405+
assert elements_to_coordinate_systems is not None, (
406+
"Since `adata` is a :class:`spatialdata.SpatialData`, `elements_to_coordinate_systems` must not be `None`."
407+
)
408+
assert table_key is not None, (
409+
"Since `adata` is a :class:`spatialdata.SpatialData`, `table_key` must not be `None`."
410+
)
411+
elements, table = match_element_to_table(adata, list(elements_to_coordinate_systems), table_key)
412+
assert table.obs_names.equals(adata.tables[table_key].obs_names), (
413+
"The spatialdata table must annotate all elements keys. Some elements are missing, please check the `elements_to_coordinate_systems` dictionary."
414+
)
415+
regions, region_key, instance_key = get_table_keys(adata.tables[table_key])
416+
regions = [regions] if isinstance(regions, str) else regions
417+
ordered_regions_in_table = adata.tables[table_key].obs[region_key].unique()
418+
419+
# TODO: remove this after https://github.com/scverse/spatialdata/issues/614
420+
remove_centroids = {}
421+
elem_instances = []
422+
for e in regions:
423+
schema = get_model(elements[e])
424+
element_instances = get_element_instances(elements[e]).to_series()
425+
if np.isin(0, element_instances.values) and (schema in (Labels2DModel, Labels3DModel)):
426+
element_instances = element_instances.drop(index=0)
427+
remove_centroids[e] = True
428+
else:
429+
remove_centroids[e] = False
430+
elem_instances.append(element_instances)
431+
432+
element_instances = pd.concat(elem_instances)
433+
if (not np.all(element_instances.values == adata.tables[table_key].obs[instance_key].values)) or (
434+
not np.all(ordered_regions_in_table == regions)
435+
):
436+
raise ValueError(
437+
"The spatialdata table must annotate all elements keys. Some elements are missing or not ordered correctly, please check the `elements_to_coordinate_systems` dictionary."
438+
)
439+
centroids = []
440+
for region_ in ordered_regions_in_table:
441+
cs = elements_to_coordinate_systems[region_]
442+
centroid = get_centroids(adata[region_], coordinate_system=cs)[["x", "y"]].compute()
443+
444+
# TODO: remove this after https://github.com/scverse/spatialdata/issues/614
445+
if remove_centroids[region_]:
446+
centroid = centroid[1:].copy()
447+
centroids.append(centroid)
448+
449+
adata.tables[table_key].obsm[spatial_key] = np.concatenate(centroids)
450+
adata = adata.tables[table_key]
451+
library_key = region_key
452+
return adata, library_key
453+
439454
@njit
440455
def _csr_bilateral_diag_scale_helper(
441456
mat: csr_array | csr_matrix,

0 commit comments

Comments
 (0)