A one-command virtual screen over onepot's CORE makeable chemical space, with a docking oracle as the fitness function. Give it a target PDB + the ligand that marks the pocket; it derives the box, preps the receptor, seeds the search (from a known binder or a random draw of makeable CORE), then loops retrieve → dock → decompose → steer — concentrating docking on the building blocks that score well. It writes top-hit docked poses for PyMOL and per-round convergence metrics.
The deliverable lives in synthon_ts/ — see
synthon_ts/README.md for the full design, the two
docking backends, and how it relates to (and differs from) true Thompson Sampling.
# 1. environment
pip install onepot rowan-python rdkit # + PyMOL to view poses
# 2. keys — copy the template, fill it in (real .env is gitignored, never commit keys)
cp .env.example .env # then edit .env with your keys
set -a; source .env; set +a # load it (or: pip install python-dotenv → auto-loaded)
# 3. run — target PDB + the ligand that defines the pocket + a seed
python -m synthon_ts.run \
--pdb 1HCK --pocket-ligand ATP \
--query "CCC(CO)Nc1nc(NCc2ccccc2)c2ncn(C(C)C)c2n1" \
--backend direct --out-dir runs/trial1 \
--max-docks 8 --seed-hits 6 --round-hits 4 --anchors 1 --max-rounds 1 --top-k 3No known binder? Drop --query and add --sample-seeds 3 — it seeds from
onepot sample_space (property-filtered makeable CORE molecules).
| Flag | Meaning |
|---|---|
--pdb |
PDB id (auto-downloaded) or a local .pdb/.cif |
--pocket-ligand |
resname of the bound ligand that marks where the pocket is (only its location is used) |
--query |
seed SMILES — the molecule the chemical search grows from. Omit → seed from sample_space |
--backend |
direct (Rowan; returns poses; uses your Rowan credits) or muni (cheap batch; scores only) |
--pocket-ligand = where to dock; --query = what chemistry to start from. They're different roles (see synthon_ts/README.md).
- Drug-like window: MW ≤ 550, cLogP 1–5, TPSA ≤ 140, HBD ≤ 5, HBA ≤ 10, rot-bonds ≤ 8, QED ≥ 0.5.
Native to
sample_spacefor seeds; applied locally (RDKit) to retrieved analogs before docking. (onepot exposes cLogP, not cLogD — cLogP is used as the proxy.) - Cost/supply:
--max-price 200($125 tier only) +--max-supplier-risk low, native on every onepot search.
receptor.pdb,rank{N}_{score}.pdbdocked poses,top_hits.sdf,hits.csvview.pml— open live withpymol runs/trial1/view.pmlconvergence.json— per-round score trajectory + per-position synthon leaderboards (the space pruning to the best building blocks)
- Backend
directis the simple default: Rowan-only, one credit pool, poses native. Only usemuniif you want ultra-cheap bulk scoring of thousands of molecules (then poses cost a small Rowan re-dock of the top hits). - Direct docks are ~1–2 min each — keep
--max-dockssmall for a first trial. - The receptor is prepared to a Rowan protein UUID automatically from the PDB id; you never handle the UUID.
- Credit-free dry run of the loop logic:
python -m synthon_ts.selftest.