GNINA CNN score vs CNN affinity: what each number means

How to read the scores GNINA writes for every docked pose

15 min

Line drawing of JQ1 inside a square voxel grid, with the voxels under its chlorophenyl ring shaded green and magnified in a callout beside it.

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 fieldProteinIQ columnUnitsWhat it estimatesBetter is
CNNscoreCNN ScoreProbability, 0 to 1Whether the pose is within 2 Å of the true binding poseHigher
CNNaffinityCNN Affinity (pK)pKHow strongly the ligand binds, given this poseHigher
CNN_VSCNN VSCNNscore × CNNaffinityA combined score for ranking compoundsHigher
CNNaffinity_varianceCNN Affinity VariancepK²Spread of the affinity predictions being averagedLower
minimizedAffinityEmpirical Scorekcal/molEmpirical score of the minimized pose, Vina by defaultMore negative
Table 1. Scores GNINA 1.3 writes for each docked pose. CNN_VS is written only when the CNN model predicts an affinity, and the variance only when more than one prediction is averaged. Sources: McNutt et al. (2021), GNINA source code (2026).[1][6]

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 KdEquivalent ΔG
4100 µM−5.5 kcal/mol
510 µM−6.8 kcal/mol
61 µM−8.2 kcal/mol
7100 nM−9.5 kcal/mol
810 nM−10.9 kcal/mol
91 nM−12.3 kcal/mol
Table 2. CNNaffinity values as nominal Kd and binding free energy. We converted each value with Kd = 10−pK M and ΔG = −1.364 × pK kcal/mol at 298.15 K, as if the prediction were exact.

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)CNNscoreCNNaffinity
Question answeredHow 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?
ModelFive distance-dependent pair terms and a flexibility penalty3D convolutional network, classification output3D convolutional network, regression output
Unitskcal/mol, more negative is better0 to 1, higher is betterpK, higher is better
Fitted toMeasured affinities of crystal complexesCorrect and incorrect docked posesMeasured affinities attached to docked poses
Reported errorStandard error of 2.85 kcal/mol on 190 complexesAbout 79% of top poses above 0.8 are correct in redockingRMSE 1.42 pK on clustered CrossDocked2020
Table 3. The Vina score and GNINA's CNN scores compared. Sources: Trott and Olson (2010), Francoeur et al. (2020), McNutt et al. (2021, 2025).[7][3][1][2]

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.

RankCNNscoreCNNaffinity (pK)CNN_VSVina scoreRMSD to crystal
10.4696.312.96−8.96 kcal/mol5.1 Å
20.4836.303.04−6.25 kcal/mol4.9 Å
30.5266.263.29−8.88 kcal/mol5.0 Å
40.4946.163.04−5.95 kcal/mol4.7 Å
50.2166.101.32−6.54 kcal/mol5.1 Å
60.1746.081.06−6.46 kcal/mol5.3 Å
70.2305.971.37−5.51 kcal/mol4.7 Å
80.1925.881.13−6.97 kcal/mol5.3 Å
Table 4. GNINA scores and crystal-pose RMSD for JQ1 in BRD4 bromodomain 1. Ranks follow the run's CNNaffinity sort. RMSD is to the crystal JQ1 in PDB 3MXF, measured in place over heavy atoms with symmetry-equivalent atoms matched. Source: ProteinIQ GNINA example job, our RMSD calculation.

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.

QuestionRead firstThen check
Is this pose the binding mode?CNNscore of the top posesRMSD 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 poseKnown actives docked with the same setup
Is the pose physically reasonable?Empirical score; a positive value usually means a clashPoseBusters
Do the models agree?CNNaffinity_varianceRepeat runs with new seeds
Table 5. Which GNINA score answers which question.

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

ToolWhat it reports
GNINARanked poses with CNNscore, CNNaffinity, CNN_VS, affinity variance and the empirical score
AutoDock VinaVina, Vinardo or AutoDock4 scores per pose and the energy terms behind them
sminaVina-family docking with custom scoring terms
PoseBustersPhysical and chemical plausibility checks for docked poses
ProLIFInteraction fingerprints shared across a set of poses
RMSD CalculatorPose RMSD against a reference ligand
DiffDockDiffusion-based pose generation when the pocket is unknown
Boltz-2Co-folded complexes with a predicted affinity and binder probability
Table 6. Docking and pose-checking tools on ProteinIQ.

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]