Validation & evidence

VectaBind is a compound-triage workbench: batch scoring across 19,134 structures spanning 4,541 distinct proteins, RDKit physicochemical filters, ChEMBL analog cross-referencing, AutoDock Vina docking poses, a 3D pocket viewer, and CSV in and out. Most of that is deterministic and independently checkable — it does not depend on any model being right.

The affinity scorer is the part that does, so we benchmark it against structures released after its training data and publish the result in full: 1.70× enrichment over random on first-pass triage, MAE 1.22 against a 1.32 constant baseline. It is a useful filter for shortening a long list and a poor one for choosing between close analogs. Everything below is the evidence for both halves of that sentence, including the measurements that do not flatter us — and including an August 2026 correction that moved these numbers up after we found an error in our own benchmark.

Reproduce in the app: Open Pathfinder demo for a pre-scored 10-compound EGFR library (200 RL steps), or paste any SMILES into the workbench. Scores use VectaBind API v1.0.0 · same Stage 6 model for all targets. EGFR scoring pocket: PDB 2ITK (PDBBind co-crystal); 3D viewer may show PDB 1M17.

Scorer validation status

Updated August 2026. We previously showed a JAK2 spot-check reporting MAE ~0.55 pKd. That table has been removed because the comparison it invited was not a fair one, and we would rather say so than leave it up.

What we found. Measured against the correct baseline — predicting the mean literature value for every compound — the scorer does not yet earn its absolute-accuracy claims:
External checkModel MAEConstant-predictor MAERank correlation (Spearman)
JAK2 · 2b7a · 8 marketed inhibitors0.5510.388+0.62
EGFR · 2ITK · 9 marketed inhibitors2.0660.445+0.12

How to read the small tables above. Both are marketed-inhibitor spot-checks at n=8 and n=9. At that size a rank correlation is barely distinguishable from noise, and marketed drugs of one class all sit in a narrow potency band — which is exactly the situation where predicting a constant wins. They are published for transparency, but they are too small to settle anything. The larger test below is what we now rely on.

External validation on unseen structures

The decisive question is whether the scorer works on proteins it has never encountered. We took 516 PDB complexes with measured binding affinities, released between 2022-06-08 and 2024-10-23 — after the PDBBind 2020 data the model was trained on, so none can have been in training. Measured pKd spans 1.05–11.00, so a constant prediction cannot win by default.

These numbers were revised upward in August 2026 after we found a preprocessing error in our own benchmark.

An earlier version of this page stated that the external pockets were built with “the identical 6.5 Å ligand-centroid procedure used to build the training set.” That was wrong, and it was our error, not a rounding difference. The training pockets are whole residues with hydrogens and hand the model a median of 34 residues; the 6.5 Å centroid cut we used for the benchmark handed it a median of 9. We were measuring the model on roughly a quarter of the context it was built for.

Re-carving the same 516 complexes at 6.0 Å whole-residue — chosen to match the training residue count, not to maximise any score — raises rank correlation from ρ = 0.296 to ρ = 0.392. A paired bootstrap over 2,000 resamples puts the gap at +0.095, 95% CI [+0.023, +0.167], with the corrected carve winning 99.2% of resamples. A third arm carved deliberately too large (median 59 residues) scores worse (ρ = 0.319), so this is not “bigger pockets help” — accuracy peaks where the input matches training and falls away on both sides.

Every figure in this section is the corrected measurement. The catalog targets served by the API were always carved the training way (median 34 residues), so this changes what we published, not what you were getting. We are recording the correction rather than quietly restating the numbers.

ScoringMAE (pKd)RMSEBeats constant?
Raw model head (uncalibrated)1.3531.710No
Offset-corrected (+0.28)1.3441.686No
Linearly recalibrated — served by the API1.2221.523Yes
Constant predictor (baseline)1.3151.611

The recalibrated row is what the API now serves. Broken out by measurement type, it beats the constant baseline on each independently:

MeasurementnMAE (live)Constant MAESpearman ρ
All5161.2221.3150.392
Kd651.1431.1500.634
Ki1471.4501.4740.338
IC503041.1291.2460.371

Kd carries the least assay noise and shows much the strongest correlation (ρ = 0.63 on n = 65); Ki and IC50 are assay-dependent, so some of their error sits in the labels rather than the model. The gap between 0.63 on clean Kd and 0.34 on Ki is a reasonable indication of how much label noise is costing us. The calibration coefficients were fitted on the external set and are the ones the API ships; they were not refitted after the pocket correction, so the improvement above comes from the inputs rather than from a retuned output layer.

The MAE figure alone overstates the model. Read this too.

Beating the constant baseline by 7% is a marginal win on absolute error, and the pocket correction barely moved it — MAE went 1.233 → 1.222 while ρ went 0.296 → 0.392. What improved is ordering, not accuracy. Split by potency band, the ranking signal still largely disappears:

Potency bandnMAESpearman ρ
Weak (pKd < 6)1841.8470.150
Mid (pKd 6–8)2140.5000.259
Potent (pKd ≥ 8)1181.557−0.012

Within a single potency band the model still barely orders compounds — and among strong binders the correlation is −0.012, which is zero. The overall ρ = 0.39 comes from separating broad regimes, not from fine discrimination. The pocket correction did not fix this: it improved the mid band from 0.158 to 0.259 and left the potent band flat. The potent band is where lead optimisation happens, so we state it prominently rather than in a footnote.

What it can actually do: enrichment

The honest performance claim is enrichment on a diverse library, not absolute accuracy. Across the 516 external complexes:

MeasureValue
Mean true pKd, predicted top 20%7.49
Mean true pKd, predicted bottom 20%5.67
Separation+1.82 pKd
Base rate of potent compounds (pKd ≥ 8)23% (118/516)
Potent compounds within predicted top 20%39%
Enrichment over random selection (top 20%)1.70×
Enrichment at the top decile2.23× (51% hit rate)

In practice: screening the predicted top fifth of a diverse library surfaces about 1.7× as many potent compounds as choosing at random, and tightening to the top decile roughly doubles the hit rate against base rate. That is a modest, real advantage for first-pass triage — and it is the strongest claim the evidence supports. It is not a substitute for docking, FEP, or an assay.

Three things this establishes. First, the previously reported 0.2046 pKd internal figure was a product of leakage: raw external MAE is roughly seven times worse. The training split was randomised per complex rather than per target, leaving a validation set dominated by near neighbours of training examples (median nearest-train pocket identity 67.8%; 15.8% with a ≥90%-identical training pocket). Second, the model carries real transferable signal — ρ = 0.39 across 516 unseen complexes is still weak, but at that sample size it is unambiguously not zero, and on clean Kd labels it reaches 0.63. Third, we previously wrote that the dominant defect was calibration, citing a raw head sitting 1.43 pKd low. That was mostly an artefact of the undersized pockets. Fed the input it was built for, the raw head sits only 0.28 pKd low, and an offset correction buys almost nothing (MAE 1.353 → 1.344). The remaining gain from recalibration is variance shrinkage, not offset removal.

Why the served predictions have a narrow spread. The fitted slope is 0.279, so calibrated values cluster between about 5.7 and 8.0 rather than spanning 1.8–10.1 as the raw head does. This is deliberate and it is what a correctly calibrated weak predictor looks like: at ρ ≈ 0.4, hedging toward the mean is the accuracy-optimal response, and the wide raw spread was overconfidence rather than information. Rank order is essentially unaffected — the mapping is monotone, and 508 of 516 compounds hold the same position — so library triage behaves identically. The uncalibrated score remains available as raw_affinity in the API for anyone who wants the wider relative spread.

A correction to an earlier version of this page. We previously stated that raw predictions were roughly 2.6× compressed relative to reality. On unseen structures that was false: the raw head's spread (SD 1.63) matched label spread (SD 1.61) almost exactly. The apparent compression was an artefact of testing only on marketed drugs, which occupy a narrow potency range by construction. We are recording the error rather than quietly deleting it.

What the scorer is, stated plainly. A first-pass enrichment filter, roughly 1.7× better than random on a diverse library at the top quintile. It separates broad potency regimes; it does not order compounds within one. Use it to shorten a long list before docking. Do not use it to choose between two similar compounds, do not use it for lead optimisation within a series, and do not read the absolute pKd as a predicted Ki. The August 2026 correction moved the ranking metrics up; it did not change what the tool is for.

What this does not affect. Deterministic workbench signals are unchanged and independently verifiable: RDKit physicochemical properties (MW, LogP, TPSA, HBD/HBA, QED, Lipinski), ChEMBL similarity and clinical-analog flags, AutoDock Vina docking poses, and the 3D pocket viewer. None of these depend on the affinity model.

Reproducing this. The external set is every single-protein PDB entry carrying an rcsb_binding_affinity record released after 2022-06-01 and absent from our training corpus, queried through the RCSB search API. Pockets are whole residues having any atom within 6.0 Å of any ligand atom, which reproduces the training set's median of 34 residues per pocket. Structures, pockets, labels and per-complex predictions are available on request — including the cases we get wrong, and including the superseded 6.5 Å-centroid predictions behind the older numbers.

External spot-check: known EGFR inhibitors

Same scorer, different target. Literature pKd from ChEMBL kinase assays (rounded). Scored live against EGFR pocket 2ITK, June 2026. Viewer may show PDB 1M17. Use for transparency, not as a global MAE claim.

CompoundScaffoldChEMBLLiterature pKdVectaBind pKd|Δ|
ErlotinibQuinazoline Type ICHEMBL5539.005.743.26
GefitinibQuinazoline Type ICHEMBL9399.005.653.35
LapatinibDual kinaseCHEMBL5548.527.291.23
OsimertinibCovalent 3rd-genCHEMBL33534109.707.422.28
AfatinibIrreversibleCHEMBL11736559.307.961.34
VandetanibMulti-kinaseCHEMBL9417.407.470.07
NeratinibIrreversibleCHEMBL2093868.705.563.14
DacomitinibIrreversibleCHEMBL39899598.827.541.28
CanertinibQuinazoline Type ICHEMBL30358.435.792.64
How to read this: Stratified on this table, the quinazoline subset (erlotinib, gefitinib, canertinib, neratinib) shows MAE ~3.1 pKd with compression to ~5.6–5.8; the non-quinazoline subset is closer (~1.3 pKd MAE). Across the whole table, rank correlation with literature is +0.12 — effectively no ordering signal — and a constant prediction of the mean scores a lower error (0.45) than the model (2.07). Published here in full because it is the honest picture; see Scorer validation status above.

Generated libraries (Pathfinder exports)

These tables show RL-optimized candidates ranked by the same Stage 6 scorer. RL steps (200 vs 500 here) control how long generation searches — not how the affinity model was trained. Higher top pKd after 500 steps partly reflects more optimization time, not a different model. Do not compare raw top pKd across runs with different step counts as proof one target is “better.”

EGFR library · 200 RL steps

Default Pathfinder demo — 10 compounds from a 200-step generation run, batch-scored and ranked by predicted pKd on pocket 2ITK.

RankIDpKdQEDLogPLipinskiChEMBL top simConfidence
1GEN-168.180.921.82yeshigh
2GEN-118.160.942.95yeshigh
3GEN-188.090.921.97yes61%high
4GEN-208.090.922.37yeshigh
5GEN-138.070.942.26yeshigh
6GEN-128.060.943.06yes80%high
7GEN-157.860.942.44yeshigh
8GEN-147.850.952.52yeshigh
9GEN-197.800.943.85yeshigh
10GEN-177.670.943.15yesmedium

GEN-12 ChEMBL top hit: CHEMBL551595 (80% Tanimoto).

Spotlight: GEN-12 · EGFR hit #6

Example of orthogonal signals med chem teams expect — not a single opaque score.

EGFR · 200 RL steps · rank #6 Strong binder
GEN-12 · Gen-EGFR
Predicted pKd8.06
QED0.94
ChEMBL similarity80%
LipinskiCompliant
LogP3.06
ConfidenceHigh

Drug-like · MW 317 · bind 76.5% · verify analogs in ChEMBL yourself

JAK2 library · 500 RL steps

Separate 500-step generation run — same scorer, more RL optimization time. Top pKd ~9.25 vs ~8.18 on EGFR (200 steps) is not apples-to-apples; use external spot-checks above for cross-target comparison.

RankIDpKdQEDLogPLipinskiChEMBL top simConfidence
1GEN-19.250.942.56yes100%high
2GEN-29.150.953.31yes64%high
3GEN-39.140.942.17yeshigh
4GEN-69.140.942.39yeshigh
5GEN-79.120.943.14yeshigh
6GEN-89.120.943.71yes90%high
7GEN-49.100.943.32yes62%high
8GEN-59.040.943.18yes90%high
9GEN-99.000.943.18yes100%high
10GEN-108.920.953.00yes76%high

Top hit GEN-1 ChEMBL analog: CHEMBL175030 (100% Tanimoto). Scoring pocket: PDB 2b7a.

Within-library vs external benchmark

External spot-checks test the scorer on approved drugs. Generated libraries test rank-ordering within your series on a fixed pocket. A higher top pKd after 500 RL steps does not mean one target is better than another; it means generation had more steps to climb the same scorer — so cross-run pKd comparisons are not meaningful.

Open question, stated honestly: we have previously suggested that a series can still rank usefully relative to itself even where absolute values are off. We do not currently have evidence for that. On the one external series where it can be checked (EGFR, 9 marketed inhibitors) rank correlation is +0.12. Until a target-disjoint revalidation is complete, treat within-library ordering as unverified rather than as a supported claim.

Where it does not work: screening libraries

Every number above is measured on protein–ligand co-crystal structures. Those are, by construction, compounds that bind something. A screening library is not: it is roughly 99% non-binders. Those are different problems, and this page previously implied one result covered both. It does not.

Following the argument in Ahmed et al. (JCIM 2026) — that benchmarks built from curated ligand sets inflate apparent performance — the scorer was run against four real primary screens from PubChem BioAssay. 30,000 compounds each, randomly sampled so the assay's true hit rate is preserved rather than enriched. No compound failed to score.

TargetAssayHit rateEF top 1%Actives foundROC AUC
JAK2AID 1446, cell-based1.10%0.91×3 vs 3.3 expected0.519
PPARγAID 631, biochemical0.37%0.00×0 vs 1.1 expected0.418
HSP90AID 1789, biochemical0.92%1.81×5 vs 2.8 expected0.494
ThrombinAID 1046, biochemical0.21%3.23×2 vs 0.6 expected0.567

The two enrichment figures above 1.0 are not real. Thrombin's 3.23× is two compounds where chance predicts 0.6; HSP90's 1.81× is five where chance predicts 2.8. Neither is significant on its own, and pooled across all four targets the top 1% contains 10 actives against 7.8 expected (P = 0.26). Mean ROC AUC across 120,000 scored compounds is 0.499, which is the value for random ranking.

What this rules out. This scorer will not find binders in a screening library. That was previously described here as a filter for shortening a long, diverse list before committing synthesis, and that description was wrong. Thrombin and HSP90 are among the most heavily co-crystallised targets in the PDB — 177 and 169 structures respectively in this catalogue — so unfamiliarity does not explain it.

Why, and what it still does

The model is trained on PDBbind: protein–ligand complexes that have been solved. Every training example is therefore a compound that binds. It has learned to separate strong binders from weak binders and has no representation of a non-binder. Directly measured: across 1,612 diverse screening compounds its entire output range is 0.92 pKd, with 80% falling inside 0.38 pKd of one another. Rosiglitazone and pioglitazone, both marketed PPARγ drugs, score 7.00 and 6.99 against PPARγ — against a random-compound mean of 7.03 on the same target.

The co-crystal results remain valid for what they measure: ordering compounds that already bind. A ligand-scrambling control — scoring each pocket with a different complex's ligand — leaves ρ = 0.11 (mean of three seeds), so roughly 72% of the published ρ = 0.39 is genuine ligand-level signal rather than a per-target prior.

Read the claim narrowly. This is useful for ranking compounds that are already plausible binders and that span a wide potency range. It is not a hit-finding tool, and nothing on this site should be read as saying otherwise.

A separate model for screening

Everything above describes the affinity scorer behind /score, and it remains true of it. The diagnosis — that the model had never seen a chemical non-binder — suggested a fix: train the binder head on real primary-screen outcomes rather than on PDBbind. That was done, holding out one target at a time across the four assays, and it works, modestly.

Held outBinder AUC beforeAfterFingerprint baseline EF1%
Thrombin0.53270.58950.54×
JAK20.52910.59440.92×
PPARγ0.53930.65500.74×
HSP900.47040.59210.91×
Mean0.51790.6078

Improved on all four targets, significant on three. For scale, published methods on LIT-PCBA reach ROC AUC 0.53–0.61 (Glide-SP 0.5315, DrugCLIP 0.5717, GNINA 0.6093), so this is competitive with the field rather than ahead of it. It is a weak signal in absolute terms and should be read as triage, not as hit-finding.

Two caveats that limit these numbers. Checkpoints were selected on the same held-out target the figure is reported on, so they are mildly optimistic; a three-way split would be needed before treating them as final. And four targets is a narrow base — the rotation shows the effect is not one target's luck, but not that it survives a fifth protein.

Why it is a second model rather than an upgrade. The gain comes from training the shared interaction layer, which is also what the affinity head reads from. Measured pKd drift for those weights is 0.947 to 4.268, against a real post-cutoff MAE of 1.222 — folding them in would destroy absolute accuracy and the Vina result below. Restricting training to the binder head alone avoids that completely (drift 0.000, verified) but learns nothing: mean AUC 0.5179 to 0.5175. So the two run side by side, and the screening model's affinity head is never read.

A note on how these were measured

Splitting by target is not sufficient on PubChem screens, because they reuse compound libraries: 30–42% of each held-out set also appeared in training as a row for a different target. The effect is large. A parameter-free ECFP4 nearest-neighbour baseline scored EF1% 5.27× on the JAK2 holdout and 2.51× on thrombin; after removing the shared compounds those fall to 0.91× and 0.33×. The entire apparent enrichment was the same molecule matching itself. Every figure in this section is measured after de-overlapping. This is the same class of defect an independent audit documents in LIT-PCBA, which is worth knowing before comparing against numbers published on it.

Head-to-head against AutoDock Vina

A correlation coefficient on its own means little. This compares the scorer against a reference every computational chemist already knows, on the same 513 protein–ligand complexes, every structure deposited after the model's training cutoff. Both predictors saw identical inputs; the comparison is paired per compound.

SubsetnVina ρVectaBind ρBoth combined
All complexes5130.4010.3890.459
Kd labels only640.3470.6240.542
Ki labels only1460.4290.3310.428
IC50 labels only3030.3610.3710.436
Top-decile enrichment (pKd ≥ 8)5131.65×2.25×

The result is a tie, and it is reported as a tie. A paired bootstrap over 2,000 resamples puts the difference at +0.011 in Vina's favour, 95% CI [−0.076, +0.094]. That interval contains zero and narrowed as the sample grew (it was [−0.107, +0.115] at n=259), so this is a genuine draw rather than a sample too small to separate them. VectaBind is not better at rank correlation. It is better at top-decile enrichment — 51% of its top tenth are potent against a 23% base rate, versus 37% for Vina — and it produces that ranking in about 0.46 s per compound against roughly 58 s for docking, without needing a dockable receptor. (Enrichment here uses the same pKd ≥ 8 threshold as the benchmark section above, so the two are directly comparable; the 2.25× and the 2.23× reported earlier differ only because three complexes failed to dock.)

Two controls, because the headline is worthless without them

1. Redocking. Before asking whether docking predicts potency, it has to reproduce poses that are already known. Each crystal ligand was docked back into its own receptor and compared with where it actually sat: median RMSD 0.99 Å across 507 structures, 76% within 2.0 Å. The field's usual bar is 50%. An earlier attempt that docked into carved pockets rather than deposited structures failed this control badly — poses landed up to 16.8 Å from the site — and every number from it was discarded.

2. Search effort. Vina ran at exhaustiveness 8, its own default but a modest setting, so 57 complexes were re-docked at 32 — four times the effort. Rank correlation moved from +0.376 to +0.404, the two settings agreed at ρ = 0.995, and the median score difference was 0.04 kcal/mol. The threshold for "this changes the conclusion" was fixed at 0.05 before the check was run. Vina was not handicapped by the default.

What this does not show. Neither method ranks within a potency band. Across compounds inside one log unit, Vina scores −0.124 (pKd 7–8) and VectaBind −0.022 (pKd 8+) — both indistinguishable from no ordering at all. Docking does not rescue the SAR limitation, and neither does this model. The subset splits also disagree with each other: VectaBind wins decisively on Kd labels (0.624 vs 0.347) and loses on Ki (0.331 vs 0.429). At n=64 and n=146 those are noisy, and no claim should be built on either.

Method and failures. Receptors were the deposited PDB entries with waters and crystallisation additives removed and cofactors retained; the search box was centred on the crystal ligand and that ligand stripped before docking. 12 of 1,032 jobs failed (1.2%) — 9 redocking controls and 3 compound docks — from no-pose returns, subprocess timeouts, and two ligand-naming mismatches. Failed jobs are excluded from the counts above rather than silently reducing the denominator. Model predictions used the same pockets and calibration as the shipping API.

Signal provenance

Every column in the workbench traces to a named source — not a black-box number.

SignalSource
pKd / bind probabilityVectaBind Stage 6 (ligand graph + pocket sequence) + calibration — all ranking and scoring
QED, MW, LogP, LipinskiRDKit (in API + app)
ChEMBL similarityChEMBL REST API (browser-side lookup)
MPO compositeWeighted pKd + QED + Lipinski (app workflow)
3D pocketScoring: EGFR PDB 2ITK · JAK2 PDB 2b7a · Viewer: the deposited PDB entry for the selected target
Docked poseAutoDock Vina 1.2.7 against the deposited structure — visualisation only, never used for ranking. Before a pose is docked the viewer shows an RDKit conformer, labelled as not docked.
CSV exportFull scored row from workbench session

Model benchmark (secondary)

Internal PDBBind 2020 validation MAE is reported in Methods. For screening workflows, rank order within your library and ChEMBL-grounded analog checks are more actionable than a single global MAE.

MetricValueNotes
PDBBind 2020 val MAE0.20 pKdModel-selection split · see Methods
Intended useRelative rankingCompare compounds on the same target in your library