Skip to content

Commit 386ce0a

Browse files
authored
fix: allow ingest to handle older anndata (#4516)
1 parent 50bb2b0 commit 386ce0a

3 files changed

Lines changed: 18 additions & 3 deletions

File tree

‎docs/release-notes/4516.fix.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix {func}`scanpy.tl.ingest` failing with a `KeyError` when the reference’s PCA was computed by an old scanpy version and has no `.uns["pca"]["params"]` {smaller}`P Angerer`

‎src/scanpy/tools/_ingest.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,12 @@ def _init_neighbors(self, adata: AnnData, neighbors_key: str | None) -> None:
332332
)
333333

334334
def _init_pca(self, adata: AnnData) -> None:
335-
self._pca_centered = adata.uns["pca"]["params"]["zero_center"]
335+
# PCA from old scanpy versions has no `params`, use `pp.pca`’s defaults
336+
params = adata.uns["pca"].get("params", {})
337+
self._pca_centered = params.get("zero_center", True)
336338
self._pca_mask = _check_mask(
337339
adata,
338-
_mask_arg(None, adata.uns["pca"]["params"]["mask_var"], dim="var"),
340+
_mask_arg(None, params.get("mask_var"), dim="var"),
339341
"var",
340342
)
341343

‎tests/test_ingest.py‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,20 @@ def test_neighbors_defaults(adatas, n):
174174

175175
# https://github.com/lmcinnes/umap/issues/1174
176176
@pytest.mark.filterwarnings("ignore:.*renamed to.*ensure_all_finite:FutureWarning")
177-
def test_ingest_function(adatas: tuple[sc.AnnData, sc.AnnData]) -> None:
177+
@pytest.mark.parametrize(
178+
"has_pca_params",
179+
[
180+
pytest.param(True, id="pca_params"),
181+
# PCA from old scanpy versions has no `.uns["pca"]["params"]` (#4507)
182+
pytest.param(False, id="no_pca_params"),
183+
],
184+
)
185+
def test_ingest_function(
186+
adatas: tuple[sc.AnnData, sc.AnnData], *, has_pca_params: bool
187+
) -> None:
178188
adata_ref, adata_new = (ad.copy() for ad in adatas)
189+
if not has_pca_params:
190+
del adata_ref.uns["pca"]["params"]
179191

180192
sc.tl.ingest(
181193
adata_new,

0 commit comments

Comments
 (0)