Source code for monalisa.binning._mitosius_load

"""Port of src/mitosius/bmMitosius_load.m."""

import os

import numpy as np

from monalisa._mat import cell_from_items, squeeze
from monalisa.array._index_to_multi_index import index_to_multi_index
from monalisa.io._mat73 import loadmat73


def _load_var(path):
    try:
        data = loadmat73(path)
    except OSError:  # non-HDF5 MAT-file
        import scipy.io as sio

        data = {k: v for k, v in sio.loadmat(path).items() if not k.startswith("__")}
    return next(iter(data.values()))


[docs] def mitosius_load(mitosius_dir, arg_name, *edges): """Load the variable ``arg_name`` of every cell (or of the cells selected by ``edges``: 1-based indices or ``'all'`` per mitosius dimension).""" in_size = np.ravel(_load_var(os.path.join(mitosius_dir, "mitosius_size.mat"))).astype(np.int64) ndim = in_size.size if not edges: edge_list = [np.arange(1, n + 1) for n in in_size] else: if len(edges) != ndim: raise ValueError("The number of edges not compatible with mitosius_ndims. ") edge_list = [] for i, e in enumerate(edges): if isinstance(e, str): if e != "all": raise ValueError("Wrong input arguments. ") e = np.arange(1, in_size[i] + 1) edge_list.append(np.ravel(np.asarray(e)).astype(np.int64)) out_size = np.array([e.size for e in edge_list], dtype=np.float64) items = [] for i in range(int(np.prod(out_size))): outIdx = index_to_multi_index(i + 1, out_size).ravel().astype(np.int64) - 1 inIdx = [edge_list[j][outIdx[j]] for j in range(ndim)] name = "cell" + "".join(f"_{k}" for k in inIdx) items.append(_load_var(os.path.join(mitosius_dir, name, f"{arg_name}.mat"))) shape = [int(s) for s in out_size] if len(shape) == 1: shape = [shape[0], 1] out = cell_from_items(items, shape) sq = squeeze(np.empty(out.shape, dtype=object)) return np.reshape(out, sq.shape, order="F")