Metadata-Version: 2.4
Name: OTMODE
Version: 0.1.0
Summary: OTMODE is a computational framework built on Optimal Transport (OT) theory for improving cell-type annotation accuracy and for identifying differential features across conditions in single-cell multi-omics data.
Home-page: https://github.com/Eggong/OTMODE
Author: Lanks Huidong Su
Author-email: u3010549@conect.hku.hk
License: MIT
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Operating System :: OS Independent
Requires-Python: >=3.8
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: absl-py>=2.1.0
Requires-Dist: adjustText>=1.3.0
Requires-Dist: aiohappyeyeballs>=2.4.3
Requires-Dist: aiohttp>=3.10.10
Requires-Dist: aiosignal>=1.3.1
Requires-Dist: anndata>=0.10.9
Requires-Dist: anndata2ri>=1.3.2
Requires-Dist: annoy>=1.17.3
Requires-Dist: anyio>=4.6.2.post1
Requires-Dist: appnope>=0.1.4
Requires-Dist: argon2-cffi>=23.1.0
Requires-Dist: argon2-cffi-bindings>=21.2.0
Requires-Dist: array_api_compat>=1.9.1
Requires-Dist: arrow>=1.3.0
Requires-Dist: asttokens>=2.4.1
Requires-Dist: async-lru>=2.0.4
Requires-Dist: attrs>=24.2.0
Requires-Dist: babel>=2.16.0
Requires-Dist: bbknn>=1.6.0
Requires-Dist: beautifulsoup4>=4.12.3
Requires-Dist: bleach>=6.2.0
Requires-Dist: Brotli>=1.1.0
Requires-Dist: cached-property>=1.5.2
Requires-Dist: celltypist>=1.6.3
Requires-Dist: certifi>=2024.8.30
Requires-Dist: cffi>=1.17.1
Requires-Dist: cfgv>=3.4.0
Requires-Dist: charset-normalizer>=3.4.0
Requires-Dist: chex>=0.1.87
Requires-Dist: click>=8.1.7
Requires-Dist: colorcet>=3.1.0
Requires-Dist: comm>=0.2.2
Requires-Dist: contourpy>=1.3.0
Requires-Dist: cycler>=0.12.1
Requires-Dist: cykhash>=2.0.1
Requires-Dist: Cython>=3.0.12
Requires-Dist: debugpy>=1.8.8
Requires-Dist: decorator>=5.1.1
Requires-Dist: decoupler>=1.8.0
Requires-Dist: defusedxml>=0.7.1
Requires-Dist: dill>=0.3.9
Requires-Dist: distlib>=0.3.9
Requires-Dist: docrep>=0.3.2
Requires-Dist: dunamai>=1.23.0
Requires-Dist: dynamo-release>=1.4.1
Requires-Dist: entrypoints>=0.4
Requires-Dist: et_xmlfile>=2.0.0
Requires-Dist: etils>=1.10.0
Requires-Dist: exceptiongroup>=1.2.2
Requires-Dist: executing>=2.1.0
Requires-Dist: fastjsonschema>=2.20.0
Requires-Dist: filelock>=3.16.1
Requires-Dist: flax>=0.10.1
Requires-Dist: fonttools>=4.54.1
Requires-Dist: fqdn>=1.5.1
Requires-Dist: frozenlist>=1.5.0
Requires-Dist: fsspec>=2024.10.0
Requires-Dist: get_version>=3.5.5
Requires-Dist: graphviz>=0.20.3
Requires-Dist: grpcio>=1.67.1
Requires-Dist: h11>=0.14.0
Requires-Dist: h2>=4.1.0
Requires-Dist: h5py>=3.12.1
Requires-Dist: harmonypy>=0.0.10
Requires-Dist: hmmlearn>=0.3.3
Requires-Dist: hpack>=4.0.0
Requires-Dist: httpcore>=1.0.6
Requires-Dist: httpx>=0.27.2
Requires-Dist: humanize>=4.11.0
Requires-Dist: hyperframe>=6.0.1
Requires-Dist: identify>=2.6.3
Requires-Dist: idna>=3.10
Requires-Dist: igraph>=0.11.8
Requires-Dist: imageio>=2.37.0
Requires-Dist: importlib_metadata>=8.5.0
Requires-Dist: importlib_resources>=6.4.5
Requires-Dist: inflect>=7.5.0
Requires-Dist: ipykernel>=6.29.5
Requires-Dist: ipython>=8.29.0
Requires-Dist: isoduration>=20.11.0
Requires-Dist: jax>=0.4.35
Requires-Dist: jaxlib>=0.4.35
Requires-Dist: jedi>=0.19.2
Requires-Dist: Jinja2>=3.1.4
Requires-Dist: joblib>=1.4.2
Requires-Dist: json5>=0.9.28
Requires-Dist: jsonpointer>=3.0.0
Requires-Dist: jsonschema>=4.23.0
Requires-Dist: jsonschema-specifications>=2024.10.1
Requires-Dist: jupyter_client>=8.6.3
Requires-Dist: jupyter_core>=5.7.2
Requires-Dist: jupyter-events>=0.10.0
Requires-Dist: jupyter-lsp>=2.2.5
Requires-Dist: jupyter_server>=2.14.2
Requires-Dist: jupyter_server_terminals>=0.5.3
Requires-Dist: jupyterlab>=4.2.5
Requires-Dist: jupyterlab_pygments>=0.3.0
Requires-Dist: jupyterlab_server>=2.27.3
Requires-Dist: kaleido>=0.2.1
Requires-Dist: kiwisolver>=1.4.7
Requires-Dist: lazy_loader>=0.4
Requires-Dist: legacy-api-wrap>=1.4
Requires-Dist: leidenalg>=0.10.2
Requires-Dist: lightning>=2.4.0
Requires-Dist: lightning-utilities>=0.11.8
Requires-Dist: llvmlite>=0.43.0
Requires-Dist: loompy>=3.0.7
Requires-Dist: MACS3>=3.0.2
Requires-Dist: Markdown>=3.7
Requires-Dist: markdown-it-py>=3.0.0
Requires-Dist: MarkupSafe>=3.0.2
Requires-Dist: matplotlib>=3.9.2
Requires-Dist: matplotlib-inline>=0.1.7
Requires-Dist: matplotlib-venn>=1.1.1
Requires-Dist: mdurl>=0.1.2
Requires-Dist: mistune>=3.0.2
Requires-Dist: ml_collections>=1.0.0
Requires-Dist: ml_dtypes>=0.5.0
Requires-Dist: more-itertools>=10.5.0
Requires-Dist: mpmath>=1.3.0
Requires-Dist: msgpack>=1.1.0
Requires-Dist: mudata>=0.3.1
Requires-Dist: multidict>=6.1.0
Requires-Dist: multipledispatch>=1.0.0
Requires-Dist: multiprocess>=0.70.17
Requires-Dist: natsort>=8.4.0
Requires-Dist: nbclient>=0.10.0
Requires-Dist: nbconvert>=7.16.4
Requires-Dist: nbformat>=5.10.4
Requires-Dist: nest_asyncio>=1.6.0
Requires-Dist: networkx>=3.4.2
Requires-Dist: nodeenv>=1.9.1
Requires-Dist: notebook>=7.2.2
Requires-Dist: notebook_shim>=0.2.4
Requires-Dist: numba>=0.60.0
Requires-Dist: numdifftools>=0.9.41
Requires-Dist: numpy>=1.26.4
Requires-Dist: numpy-groupies>=0.11.2
Requires-Dist: numpyro>=0.15.3
Requires-Dist: omnipath>=1.0.8
Requires-Dist: openpyxl>=3.1.5
Requires-Dist: opt_einsum>=3.4.0
Requires-Dist: optax>=0.2.3
Requires-Dist: orbax-checkpoint>=0.9.1
Requires-Dist: overrides>=7.7.0
Requires-Dist: packaging>=24.1
Requires-Dist: pandas>=2.2.3
Requires-Dist: pandocfilters>=1.5.0
Requires-Dist: parso>=0.8.4
Requires-Dist: patsy>=1.0.0
Requires-Dist: pexpect>=4.9.0
Requires-Dist: pickleshare>=0.7.5
Requires-Dist: pillow>=11.0.0
Requires-Dist: pip>=24.3.1
Requires-Dist: pkgutil_resolve_name>=1.3.10
Requires-Dist: platformdirs>=4.3.6
Requires-Dist: plotly>=5.24.1
Requires-Dist: polars>=1.15.0
Requires-Dist: pooch>=1.8.2
Requires-Dist: POT>=0.9.5
Requires-Dist: pre_commit>=4.0.1
Requires-Dist: prometheus_client>=0.21.0
Requires-Dist: prompt_toolkit>=3.0.48
Requires-Dist: propcache>=0.2.0
Requires-Dist: protobuf>=5.28.3
Requires-Dist: psutil>=6.1.0
Requires-Dist: ptyprocess>=0.7.0
Requires-Dist: pure_eval>=0.2.3
Requires-Dist: pyarrow>=18.1.0
Requires-Dist: pycparser>=2.22
Requires-Dist: pydeseq2>=0.4.12
Requires-Dist: pydot>=3.0.4
Requires-Dist: pyfaidx>=0.7.2.2
Requires-Dist: Pygments>=2.18.0
Requires-Dist: pynndescent>=0.5.13
Requires-Dist: pyobjc-core>=10.3.1
Requires-Dist: pyobjc-framework-Cocoa>=10.3.1
Requires-Dist: pyparsing>=3.2.0
Requires-Dist: pyro-api>=0.1.2
Requires-Dist: pyro-ppl>=1.9.1
Requires-Dist: PySocks>=1.7.1
Requires-Dist: python-dateutil>=2.9.0
Requires-Dist: python-json-logger>=2.0.7
Requires-Dist: pytorch-lightning>=2.4.0
Requires-Dist: pytz>=2024.2
Requires-Dist: PyYAML>=6.0.2
Requires-Dist: pyzmq>=26.2.0
Requires-Dist: referencing>=0.35.1
Requires-Dist: requests>=2.32.3
Requires-Dist: rfc3339-validator>=0.1.4
Requires-Dist: rfc3986-validator>=0.1.1
Requires-Dist: rich>=13.9.4
Requires-Dist: rpds-py>=0.21.0
Requires-Dist: rpy2>=3.5.16
Requires-Dist: rustworkx>=0.15.1
Requires-Dist: scanpy>=1.10.3
Requires-Dist: scikit-image>=0.25.1
Requires-Dist: scikit-learn>=1.4.2
Requires-Dist: scipy>=1.14.1
Requires-Dist: scvi-tools>=1.2.0
Requires-Dist: seaborn>=0.13.2
Requires-Dist: Send2Trash>=1.8.3
Requires-Dist: session-info>=1.0.0
Requires-Dist: setuptools>=75.3.0
Requires-Dist: six>=1.16.0
Requires-Dist: snapatac2>=2.7.1
Requires-Dist: sniffio>=1.3.1
Requires-Dist: soupsieve>=2.5
Requires-Dist: sparse>=0.15.4
Requires-Dist: stack-data>=0.6.2
Requires-Dist: statsmodels>=0.14.4
Requires-Dist: stdlib-list>=0.11.0
Requires-Dist: sympy>=1.13.1
Requires-Dist: tenacity>=9.0.0
Requires-Dist: tensorboard>=2.18.0
Requires-Dist: tensorboard-data-server>=0.7.2
Requires-Dist: tensorstore>=0.1.67
Requires-Dist: terminado>=0.18.1
Requires-Dist: texttable>=1.7.0
Requires-Dist: threadpoolctl>=3.5.0
Requires-Dist: tifffile>=2025.1.10
Requires-Dist: tinycss2>=1.4.0
Requires-Dist: tomli>=2.0.2
Requires-Dist: toolz>=1.0.0
Requires-Dist: torch==2.5.1
Requires-Dist: torchmetrics>=1.5.2
Requires-Dist: tornado>=6.4.1
Requires-Dist: tqdm>=4.67.0
Requires-Dist: traitlets>=5.14.3
Requires-Dist: typeguard>=4.4.1
Requires-Dist: types-python-dateutil>=2.9.0.20241003
Requires-Dist: typing_extensions>=4.12.2
Requires-Dist: typing-utils>=0.1.0
Requires-Dist: tzdata>=2024.2
Requires-Dist: tzlocal>=5.2
Requires-Dist: umap-learn>=0.5.7
Requires-Dist: uri-template>=1.3.0
Requires-Dist: urllib3>=2.2.3
Requires-Dist: virtualenv>=20.28.0
Requires-Dist: wcwidth>=0.2.13
Requires-Dist: webcolors>=24.8.0
Requires-Dist: webencodings>=0.5.1
Requires-Dist: websocket-client>=1.8.0
Requires-Dist: Werkzeug>=3.1.3
Requires-Dist: wheel>=0.45.0
Requires-Dist: wrapt>=1.17.0
Requires-Dist: xarray>=2024.10.0
Requires-Dist: yarl>=1.17.1
Requires-Dist: zipp>=3.21.0
Requires-Dist: zstandard>=0.23.0
Provides-Extra: dev
Requires-Dist: build; extra == "dev"
Requires-Dist: twine; extra == "dev"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

<p align="center">
  <img src="https://github.com/Eggong/OTMODE/blob/main/figure/logo.png" height="150">
</p>

<p align="center">
  <strong>OTMODE: Optimal Transport-Based Framework for Differential Feature Identification in Single-Cell Multi-Omics</strong>
</p>

<p align="center">
  <a href="https://github.com/Eggong/OTMODE/actions">
    <img src="https://img.shields.io/github/workflow/status/Eggong/OTMODE/CI?label=build" alt="Build Status">
  </a>
  <a href="https://github.com/Eggong/OTMODE/blob/main/LICENSE">
    <img src="https://img.shields.io/github/license/Eggong/OTMODE" alt="License">
  </a>
  <a href="https://pypi.org/project/otmode/">
    <img src="https://img.shields.io/pypi/v/otmode?color=brightgreen&label=pypi" alt="PyPI version">
  </a>
  <img src="https://img.shields.io/pypi/pyversions/otmode" alt="Python Versions">
</p>

---
## 🧬 Overview

**OTMODE** is a computational framework built on **Optimal Transport (OT)** theory for improving cell-type annotation accuracy and for identifying **differential features** across conditions in **single-cell multi-omics** data.

It provides interpretable metrics, including **Sinkhorn distances**, to compare cell types and clusters across predicted and true annotations. Please see our architecture of the OTMODE framework for more details!

<p align="center">
  <img src="https://github.com/Eggong/OTMODE/blob/main/figure/OTMODE_Schmatic.png" alt="OTMODE Architecture" width="900"/>
</p>


To optimize the performance of OTMODE in differential feature detection, we evaluated its behavior under various parameter settings. Our results showed that parameter values between 0.1 and 1.0 generally yielded the highest performance.

<p align="center">
  <img src="https://github.com/Eggong/OTMODE/blob/main/figure/Parameter_Tuning_Benchmarking.png" alt="OTMODE Architecture" width="900"/>
</p>

🔬 Built with Python

---

## 📘 Tutorials

We provide interactive tutorials to help users get started with applying **OTMODE** to multi-omics single-cell data. These tutorials demonstrate real use cases such as cell type annotation and differential feature detection.

All tutorials are provided as Jupyter notebooks and are located in the [`tutorials/`](./tutorials) folder.

### 🧪 Available Tutorials

| Tutorial | Description | Link |
|----------|-------------|------|
| **Application 1: Cell Type Annotation** | Learn how to use OTMODE to annotate cell types using integrated multi-omics data. | [View Notebook ›](./tutorials/OTMODE_App1_Tutorial.ipynb) |
| **Application 2: Differential Feature Detection** | Step-by-step guide to detect differentially expressed genes or features across cell groups. | [View Notebook ›](./tutorials/OTMODE_App2_Tutorial.ipynb) |

---

### 📝 Notes for Users

Each tutorial is **fully commented** and includes the following steps:

- 📂 **Data Loading and Preparation**  
  Load example or user-provided multi-omics data and prepare it for analysis.

- ⚙️ **Application of the OTMODE Algorithm**  
  Apply the OTMODE method to integrate modalities and infer latent representations.

- 📊 **Visualization of Results**  
  Generate plots such as **UMAP**, **heatmaps**, and **feature importance** to interpret results.

- 🔍 **Interpretation of Outputs**  
  Understand clustering, annotations, or differential features identified by OTMODE.

---

> ✅ **Recommended Environment**  
> - Python **≥ 3.8**  
> - Libraries: `scanpy`, `anndata`, `numpy`, `matplotlib`, `seaborn`, and others listed in `requirements.txt`


---
