Skip to main content

xenosite.forest

Python implementation of Metabolic Forest: enumerate explicit metabolite structures from reaction rules, and search pathways that connect a reactant to a putative product.

Site-of-metabolism prediction models (epoxidation, quinonation, Phase I, reactivity, and others) are on the web at xenosite.org. This package is the structure-enumeration engine, not those neural-network models.

If you use this software, please cite the Metabolic Forest paper (DOI and BibTeX below).

Install

uv add xenosite-forest

or

pip install xenosite-forest

Optional NetworkX helpers for building a metabolite graph:

uv add "xenosite-forest[network]"

Optional xenosite-predict (site-of-metabolism models; Python ≥3.11). Not installed in this repo’s CI:

uv add "xenosite-forest[predict]"

Requires Python 3.10–3.13 and RDKit 2022.03+.

Quick start

from rdkit import Chem
from xenosite.forest import bfs, rules, PhaseOneRS

# Pathway from ethanol to acetaldehyde
smiles, steps, mols = next(bfs(["CCO", "CC=O"], ruleset="PhaseOneRS"))
print(smiles)
print(steps)

# Enumerate hydroxylation products of propane
for site, products in rules.Hydroxylation().metabolites(Chem.MolFromSmiles("CCC")):
    print(site, [Chem.MolToSmiles(p) for p in products])

# Named Phase I ruleset
print(sorted({rule.name for rule in PhaseOneRS}))

A longer walkthrough is in examples/tutorial.ipynb. API notes are in docs/usage.md. Rulesets and their papers are in docs/rulesets.md.

Command line

xenosite-forest CCO CC=O --ruleset PhaseOneRS --depth 1

Useful flags: --all-paths, --depth N, --phase1 (Phase I site strings), --max N, --ruleset NAME.

Rulesets and papers

Pass these names to bfs(..., ruleset=...) or load_ruleset(...). Full rule lists, Rainbow colors/hex codes, aliases, and BibTeX are in docs/rulesets.md.

Ruleset What it enumerates Matched paper
PhaseOneRS Phase I: SO, UO, DH, HD, RD Dang et al., Metabolic Rainbow, JCIM 2020. DOI 10.1021/acs.jcim.9b00836
SO / UO / DH / HD / RD One Rainbow color each (see hex table in docs) Same Rainbow paper; Forest rule lists differ slightly for HD/RD/DH
QuinoneFormationRS (QF) Quinone, quinone-imine, and quinone-methide structures Hughes & Swamidass, Chem. Res. Toxicol. 2017. DOI 10.1021/acs.chemrestox.6b00385
Bioactivation (BA) Quinone, epoxidation, nitroaromatic reduction, thiophene S-oxidation Hughes et al., Chem. Res. Toxicol. 2021. DOI 10.1021/acs.chemrestox.0c00417
Full Complete Metabolic Forest generator (Phase I, conjugations, quinone, tautomerization) Hughes et al., Metabolic Forest, JCIM 2020. DOI 10.1021/acs.jcim.0c00360

Rainbow colorblind-safe hex (Wong / Okabe–Ito, closest to the paper figures): SO Stable Oxygenation red #D55E00, UO Unstable Oxygenation orange #E69F00, DH Dehydrogenation green #009E73, HD Hydrolysis blue #56B4E9, RD Reduction purple #CC79A7.

Related single-rule papers: epoxidation (10.1021/acscentsci.5b00131), N-dealkylation (10.1021/acs.chemrestox.7b00191), UGT glucuronidation (10.1093/bioinformatics/btw350), glutathione reactivity (10.1021/acs.chemrestox.5b00017).

Documentation

Import the package as xenosite.forest. xenosite is a PEP 420 namespace, so other xenosite.* packages can be installed alongside this one.

Citation

Please cite Metabolic Forest if you use this package:

Hughes, T. B.; Dang, N. L.; Kumar, A.; Flynn, N. R.; Swamidass, S. J. Metabolic Forest: Predicting the Diverse Structures of Drug Metabolites. J. Chem. Inf. Model. 2020, 60 (10), 4702–4716. DOI: 10.1021/acs.jcim.0c00360

BibTeX (copy and paste):

@article{Hughes2020MetabolicForest,
  title = {Metabolic Forest: Predicting the Diverse Structures of Drug Metabolites},
  author = {Hughes, Tyler B. and Dang, Na Le and Kumar, Ayush and Flynn, Noah R. and Swamidass, S. Joshua},
  journal = {Journal of Chemical Information and Modeling},
  volume = {60},
  number = {10},
  pages = {4702--4716},
  year = {2020},
  doi = {10.1021/acs.jcim.0c00360},
  url = {https://doi.org/10.1021/acs.jcim.0c00360},
  publisher = {American Chemical Society}
}

A machine-readable citation is also in CITATION.cff.

Development

git clone https://github.com/swamidasslab/xenosite-forest.git
cd xenosite-forest
uv sync --extra network --group dev
uv run pytest -n auto
uv run pytest --cov=xenosite.forest

Versioning comes from git tags via hatch-vcs (setuptools-scm). Tag a release as vX.Y.Z (for example v0.1.0). On that commit the version is X.Y.Z. On later untagged commits it becomes the next patch with a dev suffix and short commit, for example 0.1.1.dev3+gabc1234. Read it at runtime as xenosite.forest.__version__. User-facing notes go in changelog.d/; the tag workflow compiles them into CHANGELOG.md. See docs/release.md.

Pushing a v* tag runs .github/workflows/release.yml: tests must pass and the resolved version must be a clean X.Y.Z before a GitHub Release and PyPI upload. A red tag workflow means do not treat that tag as released. To block creating tags unless checks pass, add a GitHub Ruleset on refs/tags/v* that requires the release / test status checks.

One-time PyPI Trusted Publishing setup

No API token is stored in the repo. CI authenticates with Trusted Publishing (OIDC).

  1. Create the GitHub repo swamidasslab/xenosite-forest and push main.

  2. GitHub → Settings → Environments → create an environment named exactly pypi (optional: require reviewers before deploy).

  3. On PyPI: add a pending trusted publisher (project does not need to exist yet):

    Field Value
    PyPI project name xenosite-forest
    Owner swamidasslab
    Repository name xenosite-forest
    Workflow name release.yml
    Environment name pypi
  4. Tag a release (git tag -a v0.1.0 -m "0.1.0" && git push origin v0.1.0). The pypi-publish job uploads only after tests and build succeed.

For a dry run, register the same publisher on TestPyPI first and temporarily point the publish action at TestPyPI.

License

MIT. See LICENSE.

Metadata

Release files for xenosite-forest 0.5.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xenosite-forest 0.5.2
File Size Uploaded
xenosite_forest-0.5.2.tar.gz 182.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for xenosite-forest 0.5.2
File Interpreter ABI Platform
xenosite_forest-0.5.2-py3-none-any.whl Python 3 none any Details

Total release size: 282.7 kB

Release files / xenosite_forest-0.5.2.tar.gz

Download URL xenosite_forest-0.5.2.tar.gz
Size 182.9 kB
Tags Source
SHA-256 checksum
How to use checksums
84b3cede84abcc40c55e505c3ad489e74d8e68a353febad4b6f5eee4f384c803
BLAKE2b-256 checksum
How to use checksums
5dcffd1bdca21d00dd67eb697424c4f1740e76dbefb2f2fa0b520f1cc4fef2c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.

Transparency log

Release files / xenosite_forest-0.5.2-py3-none-any.whl

Download URL xenosite_forest-0.5.2-py3-none-any.whl
Size 99.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3537e18dbe4288b9f26755633175e56f1448672cfce161c99ce204c6f97563d8
BLAKE2b-256 checksum
How to use checksums
6d7449215e4a0873c87b1d1b318c6a2fe35eab2bcdb2d35438b3764a8a8e83bf
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 18, 2026.

Transparency log

Release history Release notifications | RSS feed

0.9.0

36 release files

0.8.1

36 release files

0.8.0

2 release files

0.7.4

2 release files

0.7.3

2 release files

0.7.2

2 release files

0.7.1

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.3

2 release files

This release

0.5.2 This release

2 release files

0.5.1

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.8

2 release files

0.2.7

2 release files

0.2.6

2 release files

0.2.5

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page