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.11–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 products, info in rules.Hydroxylation().metabolize(Chem.MolFromSmiles("CCC")):
print(info["site"], [p.xf.csmi 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
- Rulesets and papers — every built-in ruleset, Rainbow colors, and publication BibTeX
- Usage — public API and pathway search
- Migrating to 0.7.0 —
metabolizeyield shape and other breaking changes - xenosite-predict notes — RDKit 2026 valence caches and DNA/CN conjugation vs GSH (downstream adapters)
- Path-search performance — archive BFS/DFS vs live
find_pathhead-to-head - Heuristics / divergences / dropped — design notes (
HEURISTICS,DIVERGENCES,DROPPED,PAIR_ORBITS) - Tutorial notebook — interactive walkthrough
- xenosite.org — XenoSite models for sites of metabolism and reactivity
- Source repository — code, issues, and releases
Import the package as xenosite.forest. The previous forest implementation
is the archive directory src/xenosite/_archive_forest/
on GitHub (not exercised by CI). See
docs/forest/MIGRATING_0.7.md for 0.7 API
changes. 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.
License
MIT. See LICENSE.
Metadata
Release files for xenosite-forest 0.7.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| xenosite_forest-0.7.0.tar.gz | 413.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xenosite_forest-0.7.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 615.2 kB
Release files / xenosite_forest-0.7.0.tar.gz
| Download URL | xenosite_forest-0.7.0.tar.gz |
|---|---|
| Size | 413.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e670dbf9876fb0f765d2c2047d4ddc52724f35725180f76008ca3c6e772fe5d3
|
|
BLAKE2b-256 checksum How to use checksums |
27c2b058fb4b32246f5e2fb8918da18ca10c7f81f945e163c334c55b8ec782f0
|
| 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 20, 2026.
Transparency logRelease files / xenosite_forest-0.7.0-py3-none-any.whl
| Download URL | xenosite_forest-0.7.0-py3-none-any.whl |
|---|---|
| Size | 202.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f30410fed41934f8712d7cd43086369d2257b48d39776406b227205783d08f29
|
|
BLAKE2b-256 checksum How to use checksums |
5c192a6ac8a02191c4ebd893a4458689be33a89be16cc5d98153e289080744b5
|
| 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 20, 2026.
Transparency log