Source code for sccellfie.io.load_data
import os
import warnings
import scanpy as sc
import networkx as nx
import pandas as pd
[docs]
def load_adata(folder, filename, reactions_filename=None, metabolic_tasks_filename=None, spatial_network_key='spatial_network', verbose=True):
"""
Loads an AnnData object and its scCellFie attributes from a folder.
Parameters
----------
folder: str
The folder to load the AnnData object.
filename: str
The name of the file to load the AnnData object.
reactions_filename: str, optional (default: None)
The name of the file (without extension) to load the reactions object.
If None, the default name is filename_reactions.
metabolic_tasks_filename: str, optional (default: None)
The name of the file (without extension) to load the metabolic_tasks object.
If None, the default name is filename_metabolic_tasks.
spatial_network_key: str, optional (default: 'spatial_network')
The key in adata.uns or a scCellFie_attribute.uns where the spatial
knn graph is stored if exists.
verbose: bool, optional (default: True)
Whether to print the file names that were loaded.
Returns
-------
adata: AnnData object
Annotated data matrix.
If scCellFie attributes are found, they are also loaded
into adata.reactions and adata.metabolic_tasks.
"""
if reactions_filename is not None:
rxn_filename = f'{folder}/{reactions_filename}.h5ad'
else:
rxn_filename = f'{folder}/{filename}_reactions.h5ad'
if metabolic_tasks_filename is not None:
mt_filename = f'{folder}/{metabolic_tasks_filename}.h5ad'
else:
mt_filename = f'{folder}/{filename}_metabolic_tasks.h5ad'
# Load AnnData objects
adata = sc.read_h5ad(f'{folder}/{filename}.h5ad')
if verbose: print(f'{folder}/{filename}.h5ad was correctly loaded')
if os.path.exists(rxn_filename):
reactions = sc.read_h5ad(rxn_filename)
if verbose: print(f'{rxn_filename} was correctly loaded')
else:
warnings.warn(f'{rxn_filename} not found. Skipping loading reactions.')
reactions = None
if os.path.exists(mt_filename):
metabolic_tasks = sc.read_h5ad(mt_filename)
if verbose: print(f'{mt_filename} was correctly loaded')
else:
warnings.warn(f'{mt_filename} not found. Skipping loading metabolic_tasks.')
metabolic_tasks = None
# Merge into adata
if reactions is not None:
adata.reactions = reactions
if metabolic_tasks is not None:
adata.metabolic_tasks = metabolic_tasks
# Restore KNN graphs
if spatial_network_key in adata.uns.keys():
if isinstance(adata.uns[spatial_network_key]['graph'], pd.DataFrame):
adata.uns[spatial_network_key]['graph'] = nx.from_pandas_adjacency(adata.uns[spatial_network_key]['graph'])
if verbose: print(f"The graph in adata.uns['{spatial_network_key}']['graph'] was correctly loaded as a networkx.Graph object")
if hasattr(adata, 'reactions'):
if spatial_network_key in adata.reactions.uns.keys():
if isinstance(adata.reactions.uns[spatial_network_key]['graph'], pd.DataFrame):
adata.reactions.uns[spatial_network_key]['graph'] = nx.from_pandas_adjacency(adata.reactions.uns[spatial_network_key]['graph'])
if verbose: print(f"The graph in adata.reactions.uns['{spatial_network_key}']['graph'] was correctly loaded as a networkx.Graph object")
if hasattr(adata, 'metabolic_tasks'):
if spatial_network_key in adata.metabolic_tasks.uns.keys():
if isinstance(adata.metabolic_tasks.uns[spatial_network_key]['graph'], pd.DataFrame):
adata.metabolic_tasks.uns[spatial_network_key]['graph'] = nx.from_pandas_adjacency(adata.metabolic_tasks.uns[spatial_network_key]['graph'])
if verbose: print(f"The graph in adata.metabolic_tasks.uns['{spatial_network_key}']['graph'] was correctly loaded as a networkx.Graph object")
return adata