Reaction-pathway explorer for catalyst surfaces with ML interatomic potentials: reaction networks, NEB barriers, and cross-model uncertainty.
Project description
catpath
Reaction-pathway explorer for catalyst surfaces, driven by ML interatomic potentials. Give it an environment (a metal surface), a substrate, and a target; it builds the reaction network, relaxes every intermediate, finds the barriers with climbing-image NEB, and reports energies with honest uncertainty — pooled across random seeds and across ML potentials.
- Reaction networks — curated templates or rule-based autodetection of
intermediates (
network: auto). - Pluggable ML potentials —
mace,chgnet,fairchem(UMA),grace, orauto(best installed).emtis a dependency-free dev backend. - Barriers — climbing-image NEB with automatic retry on non-convergence.
- Cross-model comparison — run the same network under several potentials and box-plot where they agree and disagree (intermediates, barriers, and which transition state is the true rate-limiting "highest point").
- Reproducible — every run writes a provenance snapshot; unstable results are flagged low-confidence rather than reported as precise numbers.
NO→NH₃ on Pd: formation energies of every intermediate under MACE, CHGNet, and UMA — the models agree on NO activation but diverge on deep hydrogenation.
Install
pip install catpath
The default emt backend is pure numpy/ASE (no torch, no GPU) and runs the
whole pipeline anywhere — great for trying it out and for CI. For real numbers,
add exactly one ML backend (their dependencies conflict, so one per
environment):
pip install "catpath[mace]" # MACE-MP-0 universal potential (GPU)
pip install "catpath[chgnet]" # CHGNet (CPU-friendly)
pip install "catpath[fairchem]" # Meta FAIRChem / UMA (adsorbates on metals)
pip install "catpath[grace]" # GRACE foundation models
Quickstart
# whole pipeline (all seeds) on the dependency-free EMT backend:
catpath run examples/no_to_no3_pd.yaml
# let the intermediates be discovered automatically, on a real ML potential:
catpath run examples/auto_ammonia.yaml --backend auto
Outputs land in runs/<name>/:
| File | Contents |
|---|---|
graph_thumbs.png |
reaction energy-profile with active-site structure thumbnails |
graph_network.png |
node/DAG view of the network (red = low-confidence) |
energy_map.png |
substrate × intermediate heatmap; ★ = rate-limiting state |
results.json |
nodes, edges, barriers, mean ± spread, warnings |
methods.md |
a deterministic methods paragraph for your write-up |
config.snapshot.yaml |
provenance snapshot for exact reproduction |
Compare several ML potentials
Because the backends can't share an environment, run states / barriers in
each one's env, then compare the JSONs:
catpath states my.yaml --backend chgnet --out s_chgnet.json
catpath states my.yaml --backend fairchem --out s_uma.json
catpath compare --states s_*.json --out intermediates.png # box plot per state
catpath barriers my.yaml --backend chgnet --out b_chgnet.json
catpath compare --states b_*.json --out barriers.png # Ea, rate-limiting ringed
catpath compare --states b_*.json --heights s_*.json --out ts_heights.png
State energies are referenced to per-element gas-phase chemical potentials
computed in each potential, so composition-changing states are comparable
across models. See examples/README.md for the full set of
commands.
CLI
catpath run <cfg> # all seeds in-process + outputs
catpath states <cfg> # relax states only (no NEB) -> per-model JSON
catpath barriers <cfg> # NEB for every step -> per-model JSON
catpath compare --states ... # box plots (states or barriers, auto-detected)
catpath multi <cfg> # several substrates -> union energy map
catpath sweep <cfg> --elements Pd,Pt,Cu # same network across surfaces
Everything is one YAML file — see docs/CONFIG.md for every
field, and docs/USAGE.md for extension points.
Development
uv sync --extra dev
uv run ruff check src tests
uv run pytest
Contributing
Issues and PRs welcome — see CONTRIBUTING.md. Maintained by
Reto Stamm.
Acknowledgements
catpath was requested by Muhammad Umer, whose help shaping what it should do got the project off the ground.
Built with Claude (Anthropic) via Claude Code, with research assistance from Perplexity.
License
GPL-3.0-or-later. Built on ASE (LGPL) and RDKit (BSD).
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file catpath-0.1.0.tar.gz.
File metadata
- Download URL: catpath-0.1.0.tar.gz
- Upload date:
- Size: 499.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46787381fea9712984a28caf0171ac6ed937311a74c06a22ae452b9c4c1b976d
|
|
| MD5 |
48087c0068f3ef95038221fcc2af4741
|
|
| BLAKE2b-256 |
1949e4e85df521481e6b44708103db8ba4889b56ce16270273990bb2b865188e
|
Provenance
The following attestation bundles were made for catpath-0.1.0.tar.gz:
Publisher:
workflow.yml on retospect/catpath
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
catpath-0.1.0.tar.gz -
Subject digest:
46787381fea9712984a28caf0171ac6ed937311a74c06a22ae452b9c4c1b976d - Sigstore transparency entry: 2155933085
- Sigstore integration time:
-
Permalink:
retospect/catpath@05954225671ff6a8d9d7d7dad2634017b1f02afd -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/retospect
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@05954225671ff6a8d9d7d7dad2634017b1f02afd -
Trigger Event:
release
-
Statement type:
File details
Details for the file catpath-0.1.0-py3-none-any.whl.
File metadata
- Download URL: catpath-0.1.0-py3-none-any.whl
- Upload date:
- Size: 68.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8fdd7c23d7797bedcf1929b417d1560ff91f7ac3ac2c8acb5b88e89077f83318
|
|
| MD5 |
54c03d499f7edcf47c8ba0a8cb361c6c
|
|
| BLAKE2b-256 |
83c3011dc3bd1717a43e2c0f4e4d6aa6dc7679d173adee91ddefbd363831fea5
|
Provenance
The following attestation bundles were made for catpath-0.1.0-py3-none-any.whl:
Publisher:
workflow.yml on retospect/catpath
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
catpath-0.1.0-py3-none-any.whl -
Subject digest:
8fdd7c23d7797bedcf1929b417d1560ff91f7ac3ac2c8acb5b88e89077f83318 - Sigstore transparency entry: 2155933107
- Sigstore integration time:
-
Permalink:
retospect/catpath@05954225671ff6a8d9d7d7dad2634017b1f02afd -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/retospect
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
workflow.yml@05954225671ff6a8d9d7d7dad2634017b1f02afd -
Trigger Event:
release
-
Statement type: