Hybrid ML + physics binding affinity prediction. Empirical scoring, MM/GBSA rescoring, multi-method consensus, and batch virtual screening for protein-ligand complexes.
56
66%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./backend/cli/skills/chemistry/binding-affinity/SKILL.mdThis skill predicts protein-ligand binding affinity from docked poses — converting structural information into estimated ΔG (kcal/mol), pKd, and Kd (nM). It complements the molecular-docking skill's interaction analysis (score.py) which counts contacts but does NOT predict binding strength in energy units.
Key capabilities:
All predictions from this skill are computational estimates, NOT experimentally validated measurements.
The scripts include uncertainty ranges and confidence flags to help calibrate expectations.
Script outputs are RAW computational estimates. The agent MUST NOT:
The raw output IS the prediction. Report it exactly as produced.
All script invocations are automatically logged to _script_manifest.jsonl. The critique
agent uses this manifest to verify that every number in the final report traces to a real
script output.
Use the binding-affinity skill when you need to:
Trigger phrases: "predict binding affinity", "estimate Kd", "score binding strength", "rescore with MM/GBSA", "rank compounds by affinity", "virtual screening"
Do NOT use this skill for:
pocket-detection)molecular-docking)admet-prediction)# Core (required for all modes)
pip install rdkit-pypi biopython numpy scipy# MM/GBSA rescoring (full physics-based path)
pip install openmm openmmforcefields openff-toolkit
# If OpenMM is not available, rescore.py falls back to RDKit MMFFpython -c "from rdkit import Chem; print('RDKit OK')"
python -c "from Bio.PDB import PDBParser; print('BioPython OK')"
python -c "import numpy; print('NumPy OK')"
python -c "import openmm; print('OpenMM OK')" # optionalScore docked poses using the empirical descriptor-based model.
python scripts/predict.py \
--protein prepared_protein.pdb \
--poses docking_results/poses.sdf \
--output affinity.jsonPhysics-based rescoring for more accurate relative ranking.
# Full MM/GBSA (requires OpenMM)
python scripts/rescore.py \
--protein prepared_protein.pdb \
--poses poses.sdf \
--output mmgbsa.json \
--minimize-steps 100
# RDKit fallback (no OpenMM needed)
python scripts/rescore.py \
--protein prepared_protein.pdb \
--poses poses.sdf \
--output mmgbsa.jsonCombine multiple scoring methods for robust ranking.
python scripts/consensus.py \
--scores affinity.json mmgbsa.json \
--docking-scores docking_results/scores.csv \
--interactions interactions.json \
--output consensus.json \
--top-n 10Screen a compound library against a target.
python scripts/batch.py \
--protein prepared_protein.pdb \
--library compounds.sdf \
--output screening_hits.csv \
--top-n 50 \
--threshold 6.0# 1. Detect pockets
python ../pocket-detection/scripts/detect.py \
--input protein.pdb --output pockets.json
# 2. Dock ligand
python ../molecular-docking/scripts/dock.py \
--protein protein.pdb --ligand ligand.sdf \
--output-dir dock_results/ --method vina \
--center_x 10 --center_y 20 --center_z 15
# 3. Interaction analysis
python ../molecular-docking/scripts/score.py \
--protein protein.pdb --poses dock_results/poses.sdf \
--output interactions.json
# 4. Predict affinity
python scripts/predict.py \
--protein protein.pdb --poses dock_results/poses.sdf \
--output affinity.json
# 5. MM/GBSA rescore
python scripts/rescore.py \
--protein protein.pdb --poses dock_results/poses.sdf \
--output mmgbsa.json
# 6. Consensus
python scripts/consensus.py \
--scores affinity.json mmgbsa.json \
--docking-scores dock_results/scores.csv \
--interactions interactions.json \
--output final_ranking.json --top-n 5| Script | Purpose | Key Inputs | Key Outputs |
|---|---|---|---|
scripts/predict.py | Empirical affinity prediction | Protein PDB + Poses SDF | Affinity JSON |
scripts/rescore.py | MM/GBSA rescoring | Protein PDB + Poses SDF | Energy JSON |
scripts/consensus.py | Multi-method consensus | Multiple score JSONs | Consensus JSON |
scripts/batch.py | Batch virtual screening | Protein PDB + Library SDF | Hits CSV |
{
"protein": "protein.pdb",
"method": "descriptor",
"n_poses": 5,
"note": "Empirical estimate. Typical error: 1-2 log units pKd (~10-100x in Kd). Use for relative ranking only.",
"predictions": [
{
"pose_id": 1,
"pose_name": "ligand_pose_1",
"predicted_pKd": 7.2,
"pKd_uncertainty": 1.5,
"pKd_range": [5.7, 8.7],
"predicted_dG_kcal": -9.8,
"predicted_Kd_nM": 60,
"confidence": "moderate",
"features": {
"mw": 342.4,
"logp": 2.1,
"n_hbonds": 4,
"n_hydrophobic": 12,
"burial_fraction": 0.65
}
}
]
}{
"n_poses": 5,
"sources": ["predict.py", "rescore.py", "dock.py", "score.py"],
"agreement_tau": 0.72,
"agreement_class": "high",
"rankings": [
{
"pose_id": 1,
"pose_name": "ligand_pose_1",
"consensus_score": 0.85,
"consensus_rank": 1,
"individual_ranks": {"predict": 1, "rescore": 2, "docking": 1, "interactions": 3}
}
]
}| pKd | Kd (approx) | Interpretation |
|---|---|---|
| > 9 | < 1 nM | Very potent (clinical candidate range) |
| 7-9 | 1-100 nM | Potent (lead compound range) |
| 5-7 | 100 nM - 10 uM | Moderate (hit range) |
| 3-5 | 10 uM - 10 mM | Weak (fragment range) |
| < 3 | > 10 mM | Very weak / non-binder |
Critical: These are computational estimates with ~1-2 log unit uncertainty. A predicted pKd of 7.2 means the true value is likely somewhere between 5.7 and 8.7 (Kd between ~2 nM and 2 uM).
| Level | Criteria | Meaning |
|---|---|---|
| High | MW 200-600, LogP -1 to 5, >30 contacts | Within training domain, estimate more reliable |
| Moderate | Partially within domain | Use with caution |
| Low | MW <200 or >600, extreme LogP, few contacts | Outside training domain, estimate unreliable |
--threshold to filter early.52845c3
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.