Skip to content

Commit 19baeff

Browse files
committed
support anndata 0.13 layers unification
closes #148, closes #149, closes #150
1 parent 61f35d2 commit 19baeff

4 files changed

Lines changed: 16 additions & 8 deletions

File tree

src/mudata/_core/file_backing.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def is_open(self) -> bool:
6262

6363
@AnnDataFileManager.filename.setter
6464
def filename(self, filename: PathLike | None):
65-
self._filename = None if filename is None else filename
65+
self._filename = filename
6666

6767

6868
class AnnDataFileManager(ad._core.file_backing.AnnDataFileManager):
@@ -97,9 +97,13 @@ def close(self):
9797
self._parent._close()
9898

9999
def _to_memory_mode(self):
100-
self._adata._X = self._adata.X[()]
100+
X = self._adata.X[()]
101101
self.close()
102102
self.filename = None
103+
if hasattr(self._adata, "_X"): # anndata < 0.13
104+
self._adata._X = X
105+
else:
106+
self._adata.X = X # anndata >= 0.13
103107

104108
@property
105109
def is_open(self) -> bool:

src/mudata/_core/io.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def _write_h5mu(file: h5py.File, mdata: MuData, write_data=True, **kwargs):
8080
write_elem(group, "varm", dict(adata.varm), dataset_kwargs=kwargs)
8181
write_elem(group, "obsp", dict(adata.obsp), dataset_kwargs=kwargs)
8282
write_elem(group, "varp", dict(adata.varp), dataset_kwargs=kwargs)
83-
write_elem(group, "layers", dict(adata.layers), dataset_kwargs=kwargs)
83+
write_elem(group, "layers", {k: v for k, v in adata.layers.items() if k is not None}, dataset_kwargs=kwargs)
8484
write_elem(group, "uns", dict(adata.uns), dataset_kwargs=kwargs)
8585

8686
attrs = group.attrs
@@ -186,7 +186,7 @@ def write_zarr(
186186
write_elem(group, "varm", dict(adata.varm), dataset_kwargs=kwargs)
187187
write_elem(group, "obsp", dict(adata.obsp), dataset_kwargs=kwargs)
188188
write_elem(group, "varp", dict(adata.varp), dataset_kwargs=kwargs)
189-
write_elem(group, "layers", dict(adata.layers), dataset_kwargs=kwargs)
189+
write_elem(group, "layers", {k: v for k, v in adata.layers.items() if k is not None}, dataset_kwargs=kwargs)
190190
write_elem(group, "uns", dict(adata.uns), dataset_kwargs=kwargs)
191191

192192
attrs = group.attrs
@@ -288,7 +288,7 @@ def write_h5ad(filename: str | PathLike, mod: str, data: MuData | AnnData):
288288
write_elem(fmd, "varm", dict(adata.varm))
289289
write_elem(fmd, "obsp", dict(adata.obsp))
290290
write_elem(fmd, "varp", dict(adata.varp))
291-
write_elem(fmd, "layers", dict(adata.layers))
291+
write_elem(fmd, "layers", {k: v for k, v in adata.layers.items() if k is not None})
292292
write_elem(fmd, "uns", dict(adata.uns))
293293

294294
attrs = fmd.attrs

src/mudata/_core/mudata.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from anndata.utils import convert_to_dict
2323
from scverse_misc import Deprecation, deprecated
2424

25-
from .file_backing import MuDataFileManager
25+
from .file_backing import AnnDataFileManager, MuDataFileManager
2626
from .repr import MUDATA_CSS, block_matrix, details_block_table
2727
from .settings import settings
2828
from .utils import (
@@ -787,8 +787,10 @@ def filename(self, filename: str | PathLike | None):
787787
elif filename is not None:
788788
self.write(filename)
789789
self.file.open(filename, "r+")
790-
for ad in self._mod.values():
791-
ad._X = None
790+
for modname, mod in self._mod.items():
791+
mod.X = None
792+
if not isinstance(mod.file, AnnDataFileManager):
793+
mod.file = AnnDataFileManager(mod, modname, self.file)
792794

793795
@property
794796
def obs(self) -> pd.DataFrame:

tests/test_io.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ def test_set_filename(mdata: md.MuData, filepath_h5mu: str | Path):
5555
mdata.filename = filepath_h5mu
5656
assert mdata.isbacked
5757
assert mdata.filename == filepath_h5mu
58+
for mod in mdata.mod.values():
59+
assert mod.isbacked
5860

5961

6062
def test_write_read_zarr_adata(mdata: md.MuData, filepath_zarr: str | Path):

0 commit comments

Comments
 (0)