diff --git a/docs/release-notes/623.fix.md b/docs/release-notes/623.fix.md new file mode 100644 index 000000000..d80f8571b --- /dev/null +++ b/docs/release-notes/623.fix.md @@ -0,0 +1 @@ +Fix setting {attr}`anndata.AnnData.filename` to {obj}`None` for backed objects so {attr}`anndata.AnnData.raw` keeps {attr}`~anndata.Raw.X` in memory {user}`ehsanestaji` diff --git a/src/anndata/_core/file_backing.py b/src/anndata/_core/file_backing.py index 130ce9326..107883931 100644 --- a/src/anndata/_core/file_backing.py +++ b/src/anndata/_core/file_backing.py @@ -115,7 +115,9 @@ def close(self): def _to_memory_mode(self): """Close the backing file, forget filename, *do* change to memory mode.""" - self._adata.X = self._adata.X[()] + if self._adata.raw is not None: + self._adata.raw._X = to_memory(self._adata.raw.X) + self._adata.X = to_memory(self._adata.X) self._file.close() self._file = None self._filename = None diff --git a/tests/test_backed_hdf5.py b/tests/test_backed_hdf5.py index 34571793c..6dd0d0226 100644 --- a/tests/test_backed_hdf5.py +++ b/tests/test_backed_hdf5.py @@ -318,6 +318,19 @@ def test_return_to_memory_mode(adata: ad.AnnData, backing_h5ad: Path): bdata.filename = None +def test_return_to_memory_mode_loads_raw_X(adata: ad.AnnData, backing_h5ad: Path): + adata.raw = adata.copy() + expected_raw_X = asarray(adata.raw.X) + adata.write_h5ad(backing_h5ad) + backed = ad.read_h5ad(backing_h5ad, backed="r") + assert backed.isbacked + + backed.filename = None + assert not backed.isbacked + assert backed.raw.X is not None + assert np.array_equal(asarray(backed.raw.X), expected_raw_X) + + def test_backed_modification(adata: ad.AnnData, backing_h5ad: Path): adata.X[:, 1] = 0 # Make it a little sparse adata.X = sparse.csr_matrix(adata.X)