GNINA CNN score vs CNN affinity: what each number means
How to read the scores GNINA writes for every docked pose
Matic Broz, PhD15 min

TL;DR
- CNNscore, the CNN pose score, is the probability from 0 to 1 that a pose lies within 2 Å RMSD of the true binding pose. GNINA ranks poses by it by default.
- CNNaffinity is a predicted binding affinity in pK units, so 7 means a nominal Kd of 100 nM. Its typical error is about 1.4 pK units, a factor of 25 in Kd.
- minimizedAffinity is the empirical score in kcal/mol, by default the same scoring function AutoDock Vina uses. CNN_VS is CNNscore multiplied by CNNaffinity.
- Use CNNscore to decide whether a pose is right, CNNaffinity or CNN_VS to rank compounds against one receptor, and the empirical score as a physical sanity check.
Two GNINA runs on ProteinIQ show why its score columns have to be read separately. Docking benzene into the buried cavity of T4 lysozyme L99A returns six poses with CNN scores between 0.91 and 0.92, and every one of them sits within 0.8 Å of the benzene in the crystal structure. Docking the BET inhibitor JQ1 into BRD4 returns a top pose with a Vina-style score of −8.96 kcal/mol and a predicted affinity of 6.3 pK, and all eight of its poses are about 5 Å from where JQ1 binds in the crystal.
Nothing about the JQ1 numbers looks alarming at first. The one column that warned of the problem was the CNN pose score, which never rose above 0.53.
GNINA writes three scores for every pose. CNNscore, the CNN pose score, is a neural network's probability, from 0 to 1, that the pose lies within 2 Å RMSD of the true binding pose. CNNaffinity is a predicted binding affinity in pK units. minimizedAffinity is an empirical score in kcal/mol, by default from the same scoring function AutoDock Vina uses. GNINA also writes CNN_VS, the product of CNNscore and CNNaffinity, for ranking compounds in a screen.[1][6]
The scores in a GNINA output file
GNINA stores its scores as data fields on each pose in the output SDF file and prints the first three in its log. ProteinIQ shows the same values in the results table under the names in the second column.
| SDF field | ProteinIQ column | Units | What it estimates | Better is |
|---|---|---|---|---|
| CNNscore | CNN Score | Probability, 0 to 1 | Whether the pose is within 2 Å of the true binding pose | Higher |
| CNNaffinity | CNN Affinity (pK) | pK | How strongly the ligand binds, given this pose | Higher |
| CNN_VS | CNN VS | CNNscore × CNNaffinity | A combined score for ranking compounds | Higher |
| CNNaffinity_variance | CNN Affinity Variance | pK² | Spread of the affinity predictions being averaged | Lower |
| minimizedAffinity | Empirical Score | kcal/mol | Empirical score of the minimized pose, Vina by default | More negative |
The CNN values are averages. GNINA 1.3 scores each pose with an ensemble of three networks by default, and when CNN rotations are switched on it also scores rotated copies of the complex; the reported CNNscore and CNNaffinity are the means over every model and rotation. The variance is the spread of those individual affinity predictions around their mean, so a single model with no rotations reports none.[2][6]
CNNscore: the probability that a pose is right
The networks read the complex as a three-dimensional grid of atom-type densities around the ligand, much as an image network reads pixels. The pose output is a classifier. In GNINA 1.3 it was trained to tell poses within 2 Å RMSD of the experimental pose from poses further away, on the CrossDocked2020 v1.3 set of ligands docked into many related structures of each pocket.[2][3]
The approach comes from Ragoza and colleagues, who in 2017 trained CNN scoring functions to separate correct from incorrect poses and binders from nonbinders.[5] That training target is why GNINA ranks poses by CNNscore unless told otherwise, and why the pose score drives all of its pose optimization.[1]
It answers the question docking is usually asked: which of these poses is the real one? In the GNINA 1.0 benchmark, rescoring with the CNN ensemble raised the share of targets whose top pose was within 2 Å of the crystal pose from 58% to 73% in redocking and from 27% to 37% in cross-docking, compared with Vina scoring.[1]
The score also behaves roughly like a probability. The GNINA 1.0 authors found that when the top pose scored above 0.8, the chance that it was within 2 Å was 79% in redocking and at least 56% in cross-docking.[1] High scores were much rarer in the harder task: 87% of redocked systems had a top pose above 0.8, against about 15% of cross-docked ligands. A low top score is therefore common when the receptor was solved with a different ligand, and it means GNINA is not confident, not that docking has certainly failed.
Treat 0.8 as a useful line rather than a calibrated one. The probabilities come from benchmark sets drawn from the PDB, and a target unlike anything in training can produce confident wrong poses. Reading the 2 Å threshold needs the same care as any ligand RMSD: it is measured in the receptor frame, without superimposing the ligands.
CNNaffinity: a predicted pK
The affinity output is a regression head on the same network. It was trained on the binding affinities PDBbind reports, as pK values, which is the negative base-10 logarithm of a molar Kd or Ki.[3] One pK unit is a factor of ten in Kd, so a CNNaffinity of 7 means a nominal Kd of 100 nM and 9 means 1 nM. Converting to kcal/mol at 25 °C multiplies by −1.364.
| CNNaffinity (pK) | Nominal Kd | Equivalent ΔG |
|---|---|---|
| 4 | 100 µM | −5.5 kcal/mol |
| 5 | 10 µM | −6.8 kcal/mol |
| 6 | 1 µM | −8.2 kcal/mol |
| 7 | 100 nM | −9.5 kcal/mol |
| 8 | 10 nM | −10.9 kcal/mol |
| 9 | 1 nM | −12.3 kcal/mol |
The training had one twist that shapes how the number behaves. For poses more than 2 Å from the experimental pose, the network was penalized only for predicting too high an affinity, so it learned to give wrong poses lower values.[3] CNNaffinity is therefore pose-sensitive: it predicts the affinity of the ligand in this pose, not of the molecule in general. Francoeur and colleagues found that picking the pose with the highest CNNaffinity recovered most of the pose-selection accuracy of picking by CNNscore.[3]
Accuracy is moderate. On CrossDocked2020 with clustered cross-validation, the best ensemble predicted affinity with a root-mean-square error of 1.42 pK units and a Pearson R of 0.612.[3] An error of 1.42 pK is a factor of about 26 in Kd, so a prediction of 100 nM is consistent with anything from about 4 nM to 2.6 µM. The same paper showed why the often-quoted results on the PDBbind core set look better: on clustered splits that keep similar proteins out of the test set, Pearson R dropped from 0.78 to 0.56.[3]
CNNaffinity_variance offers a rough check on agreement. Its square root is a standard deviation in pK units, so the default ensemble's variance of 0.66 on benzene, below, means the three models' predictions spread by about 0.8 pK around their mean. GNINA does not publish thresholds for it, and low variance only means the models agree, not that they are right.
CNN_VS for virtual screening
GNINA computes CNN_VS when it writes the output file, as CNNscore multiplied by CNNaffinity.[6] It has no physical unit. A pose that GNINA thinks is both correct and tightly bound scores high; a confident affinity on a doubtful pose is discounted.
The product came from screening benchmarks. Sunseri and Koes found that CNNaffinity separated actives from decoys better than CNNscore did, and that multiplying the two gave only a modest further boost, with p = 0.053 against the affinity score alone.[4]
GNINA's default scoring beat Vina on 89 of the 117 targets in the DUD-E and LIT-PCBA benchmarks, with a median 1% early enrichment factor more than twice Vina's. The same paper warned that part of that performance may come from ligand properties that differ between actives and decoys in these sets rather than from reading the interactions.[4]
For a screen, take each compound's best pose, rank compounds by CNN_VS or CNNaffinity, and calibrate against known actives docked with the same receptor and settings. The Vina score guide describes how to set that kind of target-specific cutoff, and the reasoning carries over unchanged.
How GNINA's scores differ from the AutoDock Vina score
minimizedAffinity is not a new kind of number. GNINA is a fork of smina, which is a fork of AutoDock Vina, and with the default scoring function the empirical score is the Vina score of the pose after GNINA's final minimization.[6] GNINA can also report it with Vinardo, AutoDock4 or the Dkoes functions, and those values are on different scales.
| Vina score (minimizedAffinity) | CNNscore | CNNaffinity | |
|---|---|---|---|
| Question answered | How favorable is this pose under a fitted energy function? | Is this pose within 2 Å of the true one? | How strongly does the ligand bind in this pose? |
| Model | Five distance-dependent pair terms and a flexibility penalty | 3D convolutional network, classification output | 3D convolutional network, regression output |
| Units | kcal/mol, more negative is better | 0 to 1, higher is better | pK, higher is better |
| Fitted to | Measured affinities of crystal complexes | Correct and incorrect docked poses | Measured affinities attached to docked poses |
| Reported error | Standard error of 2.85 kcal/mol on 190 complexes | About 79% of top poses above 0.8 are correct in redocking | RMSE 1.42 pK on clustered CrossDocked2020 |
The practical difference is in what each score can see. The Vina function sums contacts, so it rewards a ligand that fills the pocket whichever way round it sits, and it grows with ligand size. CNNscore was trained on exactly that failure, poses that look tight but are wrong.
The two also work at different stages. In the default rescore mode, GNINA searches and minimizes with the empirical function, then applies the CNN only to the final poses.[1] The CNN changes which pose comes first, not which poses exist, so neither score can rescue a binding mode the search never produced. That limit belongs to sampling, which exhaustiveness and the search box control.
Worked example: benzene and JQ1
The two runs from the opening are public GNINA examples on ProteinIQ, and both search a box built from the crystal ligand. The benzene run uses the default three-model ensemble on T4 lysozyme L99A (PDB 4W52). The JQ1 run uses the single fast dense_1_3_PT_KD_3 model with four CNN rotations on BRD4 bromodomain 1 (PDB 3MXF) and sorts poses by CNNaffinity.
We measured each pose's heavy-atom RMSD to the crystal ligand in the receptor frame, and the scores and RMSDs are available to download.
| Rank | CNNscore | CNNaffinity (pK) | CNN_VS | Vina score | RMSD to crystal |
|---|---|---|---|---|---|
| 1 | 0.469 | 6.31 | 2.96 | −8.96 kcal/mol | 5.1 Å |
| 2 | 0.483 | 6.30 | 3.04 | −6.25 kcal/mol | 4.9 Å |
| 3 | 0.526 | 6.26 | 3.29 | −8.88 kcal/mol | 5.0 Å |
| 4 | 0.494 | 6.16 | 3.04 | −5.95 kcal/mol | 4.7 Å |
| 5 | 0.216 | 6.10 | 1.32 | −6.54 kcal/mol | 5.1 Å |
| 6 | 0.174 | 6.08 | 1.06 | −6.46 kcal/mol | 5.3 Å |
| 7 | 0.230 | 5.97 | 1.37 | −5.51 kcal/mol | 4.7 Å |
| 8 | 0.192 | 5.88 | 1.13 | −6.97 kcal/mol | 5.3 Å |
Every JQ1 pose has its center within about 2 Å of the crystal ligand's but is turned around inside the pocket, which is why all eight RMSDs fall between 4.7 and 5.3 Å. CNNaffinity barely moves across them, from 5.88 to 6.31, and the best Vina score belongs to a wrong pose. Only CNNscore stayed low throughout, with nothing above 0.53. We did not test why this run missed. It used a single fast model rather than the default ensemble, and the receptor file contained no crystal waters.
The benzene run is the opposite case. All six poses have CNNscores of 0.91 or 0.92 and RMSDs of 0.80 to 0.82 Å, so the high pose score was right. Its CNNaffinity of 3.96 pK is close to the measured value: Morton and colleagues measured a binding free energy of −5.19 kcal/mol, which is 3.80 pK or a Kd of about 160 µM.[9][10] The top Vina score of −5.43 kcal/mol is close too.
Read together, the two runs separate the questions. Benzene has a correct pose and a weak affinity, and the scores say so: CNNscore high, CNNaffinity low. JQ1 binds BRD4 bromodomain 1 with a Kd of about 50 nM, or 7.3 pK, by calorimetry.[8] GNINA's 6.3 underestimates it by about a factor of ten, within the model's usual error, and the right response to the JQ1 run is to fix the docking before reading any affinity at all.
Which score to trust for which question
Each score answers its own question, and the order of reading matters. Confirm the pose before ranking on affinity, because CNNaffinity on a wrong pose predicts the binding of something that does not happen.
| Question | Read first | Then check |
|---|---|---|
| Is this pose the binding mode? | CNNscore of the top poses | RMSD to a known ligand, contacts with PLIP, geometry with PoseBusters |
| Which compound binds best to this receptor? | CNNaffinity or CNN_VS of each compound's best pose | Known actives docked with the same setup |
| Is the pose physically reasonable? | Empirical score; a positive value usually means a clash | PoseBusters |
| Do the models agree? | CNNaffinity_variance | Repeat runs with new seeds |
Disagreements are informative. A good empirical score with a low CNNscore, as in the JQ1 run, says the ligand fits the pocket but probably not this way round; switch to the default ensemble, keep structural waters and cofactors that the ligand depends on, raise exhaustiveness, and check the pose against a reference if one exists.
A high CNNscore with a modest CNNaffinity, as for benzene, usually means a correct pose of a weak binder. When CNNscore stays low across every pose of every compound, doubt the setup before the compounds.
When a reference ligand is available, measure the distance directly. The RMSD Calculator reports pose RMSD against a crystal ligand, and DockQ v2 reports a pocket-aligned ligand RMSD for protein and small-molecule complexes, as the DockQ guide explains. The minimizedRMSD that GNINA writes in its minimization mode measures how far a pose moved during minimization, not its distance from any experimental structure.
GNINA scores on ProteinIQ
| Tool | What it reports |
|---|---|
| GNINA | Ranked poses with CNNscore, CNNaffinity, CNN_VS, affinity variance and the empirical score |
| AutoDock Vina | Vina, Vinardo or AutoDock4 scores per pose and the energy terms behind them |
| smina | Vina-family docking with custom scoring terms |
| PoseBusters | Physical and chemical plausibility checks for docked poses |
| ProLIF | Interaction fingerprints shared across a set of poses |
| RMSD Calculator | Pose RMSD against a reference ligand |
| DiffDock | Diffusion-based pose generation when the pocket is unknown |
| Boltz-2 | Co-folded complexes with a predicted affinity and binder probability |
The GNINA docs cover inputs, the CNN model and scoring-mode settings, and pricing. The molecular docking and structure-based virtual screening use cases compare GNINA with the other docking methods.
Frequently asked questions
What does the GNINA CNN pose score represent?
CNNscore is the network's probability that the pose lies within 2 Å RMSD of the true binding pose. It was trained as a classifier on correct and incorrect docked poses, so it measures pose quality, not binding strength.[1][2]
What is the difference between CNN score and CNN affinity?
CNNscore asks whether the pose is right and runs from 0 to 1. CNNaffinity asks how tightly the ligand binds in that pose and is a pK value, where higher means tighter binding. A correct pose of a weak binder has a high CNNscore and a low CNNaffinity.[3]
What is a good GNINA CNN score?
Above 0.8 is strong: in the GNINA 1.0 benchmark, top poses above 0.8 were within 2 Å of the crystal pose 79% of the time in redocking and at least 56% of the time in cross-docking.[1] Below about 0.5 for every pose, treat the binding mode as unknown.
Is CNNaffinity a Kd?
It is a predicted pK on the same scale as −log10 Kd, so 6 corresponds to a nominal 1 µM. Its typical error of about 1.4 pK units is a factor of roughly 25 in Kd, so use it to rank compounds rather than to report an affinity.[3]
Why is GNINA's top pose not the one with the best Vina score?
GNINA sorts poses by CNNscore by default, not by the empirical score.[1] The pose with the most negative minimizedAffinity often ranks lower because the CNN judged it less likely to be correct. Sorting by empirical energy is available and is what GNINA uses when CNN scoring is turned off.
What changed in GNINA 1.3?
GNINA 1.3 moved the networks to PyTorch, retrained them on CrossDocked2020 v1.3, made a three-model ensemble the default, added faster knowledge-distilled models and added covalent docking. Cross-docking top-pose accuracy rose from 37% to 40% over GNINA 1.0.[2]


