BayraktarLab / cell2location

Comprehensive mapping of tissue cell architecture via integrated single cell and spatial transcriptomics (cell2location model)
https://cell2location.readthedocs.io/en/latest/
Apache License 2.0
313 stars 57 forks source link

Can not save results with h5ad #307

Open Zifeng-L opened 1 year ago

Zifeng-L commented 1 year ago

Following the tutorial, I met some trouble when saving results. I tried the sample data, it worked well. When I used my own spatial data and reference, it didn't seem to work.

# In this section, we export the estimated cell abundance (summary of the posterior distribution).
adata_vis = mod.export_posterior(
    adata_vis, sample_kwargs={'num_samples': 1000, 'batch_size': mod.adata.n_obs, 'use_gpu': False}
)

# Save model
mod.save(f"{run_name}", overwrite=True)

# mod = cell2location.models.Cell2location.load(f"{run_name}", adata_vis)

# Save anndata object with results
adata_file = f"{run_name}/sp_sckidneyref.h5ad"
adata_vis.write(adata_file)
adata_file
Sampling local variables, batch: 100%|██████████| 1/1 [03:00<00:00, 180.86s/it]
Sampling global variables, sample: 100%|██████████| 999/999 [02:53<00:00,  5.75it/s]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/utils.py:214, in report_write_key_on_error.<locals>.func_wrapper(elem, key, val, *args, **kwargs)
    213 try:
--> 214     return func(elem, key, val, *args, **kwargs)
    215 except Exception as e:

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/registry.py:175, in write_elem(f, k, elem, modifiers, *args, **kwargs)
    174 else:
--> 175     _REGISTRY.get_writer(dest_type, t, modifiers)(f, k, elem, *args, **kwargs)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/registry.py:24, in write_spec.<locals>.decorator.<locals>.wrapper(g, k, *args, **kwargs)
     22 @wraps(func)
     23 def wrapper(g, k, *args, **kwargs):
---> 24     result = func(g, k, *args, **kwargs)
     25     g[k].attrs.setdefault("encoding-type", spec.encoding_type)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/methods.py:307, in write_basic(f, k, elem, dataset_kwargs)
    306 """Write methods which underlying library handles nativley."""
--> 307 f.create_dataset(k, data=elem, **dataset_kwargs)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/h5py/_hl/group.py:159, in Group.create_dataset(self, name, shape, dtype, data, **kwds)
    158         parent_path, name = name.rsplit(b'/', 1)
--> 159         group = self.require_group(parent_path)
    161 dsid = dataset.make_new_dset(group, shape, dtype, data, name, **kwds)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/h5py/_hl/group.py:316, in Group.require_group(self, name)
    315 if not isinstance(grp, Group):
--> 316     raise TypeError("Incompatible object (%s) already exists" % grp.__class__.__name__)
    317 return grp

TypeError: Incompatible object (Dataset) already exists

The above exception was the direct cause of the following exception:

TypeError                                 Traceback (most recent call last)
Cell In[33], line 13
      9 # mod = cell2location.models.Cell2location.load(f"{run_name}", adata_vis)
     10 
     11 # Save anndata object with results
     12 adata_file = f"{run_name}/sp_sckidneyref.h5ad"
---> 13 adata_vis.write(adata_file)
     14 adata_file

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_core/anndata.py:1918, in AnnData.write_h5ad(self, filename, compression, compression_opts, force_dense, as_dense)
   1915 if filename is None:
   1916     filename = self.filename
-> 1918 _write_h5ad(
   1919     Path(filename),
   1920     self,
   1921     compression=compression,
   1922     compression_opts=compression_opts,
   1923     force_dense=force_dense,
   1924     as_dense=as_dense,
   1925 )
   1927 if self.isbacked:
   1928     self.file.filename = filename

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/h5ad.py:100, in write_h5ad(filepath, adata, force_dense, as_dense, dataset_kwargs, **kwargs)
     98 write_elem(f, "obs", adata.obs, dataset_kwargs=dataset_kwargs)
     99 write_elem(f, "var", adata.var, dataset_kwargs=dataset_kwargs)
--> 100 write_elem(f, "obsm", dict(adata.obsm), dataset_kwargs=dataset_kwargs)
    101 write_elem(f, "varm", dict(adata.varm), dataset_kwargs=dataset_kwargs)
    102 write_elem(f, "obsp", dict(adata.obsp), dataset_kwargs=dataset_kwargs)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/utils.py:214, in report_write_key_on_error.<locals>.func_wrapper(elem, key, val, *args, **kwargs)
    211 @wraps(func)
    212 def func_wrapper(elem, key, val, *args, **kwargs):
    213     try:
--> 214         return func(elem, key, val, *args, **kwargs)
    215     except Exception as e:
    216         if "Above error raised while writing key" in format(e):

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/registry.py:175, in write_elem(f, k, elem, modifiers, *args, **kwargs)
    171     _REGISTRY.get_writer(dest_type, (t, elem.dtype.kind), modifiers)(
    172         f, k, elem, *args, **kwargs
    173     )
    174 else:
--> 175     _REGISTRY.get_writer(dest_type, t, modifiers)(f, k, elem, *args, **kwargs)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/registry.py:24, in write_spec.<locals>.decorator.<locals>.wrapper(g, k, *args, **kwargs)
     22 @wraps(func)
     23 def wrapper(g, k, *args, **kwargs):
---> 24     result = func(g, k, *args, **kwargs)
     25     g[k].attrs.setdefault("encoding-type", spec.encoding_type)
     26     g[k].attrs.setdefault("encoding-version", spec.encoding_version)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/methods.py:281, in write_mapping(f, k, v, dataset_kwargs)
    279 g = f.create_group(k)
    280 for sub_k, sub_v in v.items():
--> 281     write_elem(g, sub_k, sub_v, dataset_kwargs=dataset_kwargs)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/utils.py:214, in report_write_key_on_error.<locals>.func_wrapper(elem, key, val, *args, **kwargs)
    211 @wraps(func)
    212 def func_wrapper(elem, key, val, *args, **kwargs):
    213     try:
--> 214         return func(elem, key, val, *args, **kwargs)
    215     except Exception as e:
    216         if "Above error raised while writing key" in format(e):

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/registry.py:175, in write_elem(f, k, elem, modifiers, *args, **kwargs)
    171     _REGISTRY.get_writer(dest_type, (t, elem.dtype.kind), modifiers)(
    172         f, k, elem, *args, **kwargs
    173     )
    174 else:
--> 175     _REGISTRY.get_writer(dest_type, t, modifiers)(f, k, elem, *args, **kwargs)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/registry.py:24, in write_spec.<locals>.decorator.<locals>.wrapper(g, k, *args, **kwargs)
     22 @wraps(func)
     23 def wrapper(g, k, *args, **kwargs):
---> 24     result = func(g, k, *args, **kwargs)
     25     g[k].attrs.setdefault("encoding-type", spec.encoding_type)
     26     g[k].attrs.setdefault("encoding-version", spec.encoding_version)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/specs/methods.py:514, in write_dataframe(f, key, df, dataset_kwargs)
    511 write_elem(group, index_name, df.index._values, dataset_kwargs=dataset_kwargs)
    512 for colname, series in df.items():
    513     # TODO: this should write the "true" representation of the series (i.e. the underlying array or ndarray depending)
--> 514     write_elem(group, colname, series._values, dataset_kwargs=dataset_kwargs)

File /opt/conda/envs/cell2loc/lib/python3.9/site-packages/anndata/_io/utils.py:220, in report_write_key_on_error.<locals>.func_wrapper(elem, key, val, *args, **kwargs)
    218 else:
    219     parent = _get_parent(elem)
--> 220     raise type(e)(
    221         f"{e}\n\n"
    222         f"Above error raised while writing key {key!r} of {type(elem)} "
    223         f"to {parent}"
    224     ) from e

TypeError: Incompatible object (Dataset) already exists

Above error raised while writing key 'meanscell_abundance_w_sf_dPT/DTL' of <class 'h5py._hl.group.Group'> to /

I want to know if the "adata.varm['means_cell_abundance_w_sf']" is neccesary for downtream analysis, or I can just delete it and save others.

vitkl commented 1 year ago

This is an issue with anndata not cell2location. Check the problematic columns (written in the error message).