Source code for multiassayexperiment.io.interface

from collections import OrderedDict
from typing import Any, Dict

from ..MultiAssayExperiment import MultiAssayExperiment, _create_smap_from_experiments

__author__ = "jkanche"
__copyright__ = "jkanche"
__license__ = "MIT"


[docs] def make_mae(experiments: Dict[str, Any]) -> MultiAssayExperiment: """Create an :py:class:`~multiassayexperiment.MultiAssayExperiment.MultiAssayExperiment` from a dictionary of experiment objects. Each experiment is either an :py:class:`~anndata.AnnData` object or a subclass of :py:class:`~summarizedexperiment.SummarizedExperiment.SummarizedExperiment`. :py:class:`~anndata.AnnData` objects will be converted to a :py:class:`~singlecellexperiment.SingleCellExperiment.SingleCellExperiment`. The import naively creates sample mapping, with each ``experiment`` considered to be a independent `sample`. We add a sample to :py:attr:`~multiassayexperiment.MultiAssayExperiment.MultiAssayExperiment.col_data` in this pattern - ``unknown_sample_{experiment_name}``. All cells from the same experiment are considered to be from the same sample and is reflected in :py:attr:`~multiassayexperiment.MultiAssayExperiment.MultiAssayExperiment.sample_map`. Args: experiments: A dictionary of experiments with experiment names as keys and the experiments as values. Each ``experiment`` can be either a :py:class:`~anndata.AnnData` object or a subclass of :py:class:`~summarizedexperiment.SummarizedExperiment.SummarizedExperiment`. Raises: TypeError: - If any of the provided objects are not an expected types. - If ``experiments`` is not a dictionary. Returns: An MAE from the experiments. """ from singlecellexperiment import SingleCellExperiment from anndata import AnnData from summarizedexperiment import SummarizedExperiment if not isinstance(experiments, dict): raise TypeError("'experiments' is not a dictionary.") failedExpts = [] for expname, expt in experiments.items(): if not (isinstance(expt, AnnData) or issubclass(type(expt), SummarizedExperiment)): failedExpts.append(expname) if len(failedExpts) > 0: raise TypeError( f"Experiments '{', '.join(failedExpts)}' are not compatible, Must be either an " "AnnData, or a subclass derived from `SummarizedExperiment`." ) newExpts = OrderedDict() for expname, expt in experiments.items(): if isinstance(expt, AnnData): newExpts[expname] = SingleCellExperiment.from_anndata(expt) else: newExpts[expname] = expt col_data, sample_map = _create_smap_from_experiments(newExpts) return MultiAssayExperiment( experiments=newExpts, column_data=col_data, sample_map=sample_map, )