Identifying protein-ligand binding sites (pockets) is important for understanding protein function and developing drugs. However, no public method has leveraged co-folding models for novel pocket prediction; furthermore, this task lacks a suitable benchmark as existing benchmarks are within the training distribution of co-folding models. We therefore developed PocketWatch,a curated dataset of biologically relevant ligand pockets. The PocketWatch test set consists of unseen pockets stratified by sequence similarity, structural similarity, and crypticity to enable evaluation of generalization to novel and challenging pockets. Using this dataset, we develop zPocket, a method that trains pocket-prediction heads on top of frozen features from co-folding models. We show that zPocket heads outperform baseline methods across all stratifications. Our best zPocket model achieves overall per-target AUPRC of 0.745 compared to 0.598 and 0.595 for the strongest baselines, VN-EGNN and UniSite-1D retrained on the PocketWatch split (0.559 and 0.531 when using the published weights); the widely used P2Rank reaches 0.477. We further show that zPocket can be used to outperform baseline methods on top-N+2 recall of predicted pocket centroids through clustering per-residue predictions or using zPocket to rescore centroids proposed by other models. Finally, we explore two applications of zPocket: crystallographic fragment screens and a proteome-scale scan for uncharacterized pockets on human proteins. Together these results suggest that zPocket heads built on co-folding trunk features can greatly advance ligand binding site prediction.
Figures & tables
Figure 1: zPocket predicts pocket residues from frozen co-folding features and beats baselines across different stratifications of the PocketWatch test set. (A) Method. A sequence is folded by a frozen trunk and its frozen trunk features are cached. A head is trained on these features and per-residue labels from the PocketWatch dataset, emitting a pocket probability for every residue. (B) One test target, cereblon (UniProt Q96SW2), with the predicted per-residue score painted on the fold and plotted along the canonical UniProt sequence; spheres mark each annotated site’s ligand centroid. Site S1 is already in the pre-cutoff record, so its residues are masked and not scored; S2 is novel and cryptic, first appearing after the cutoff, and is scored in full. For more details on this visualization, see Appendix B.6 . (C) zPocket (ESMFold2 pairformer2 ) against P2Rank, UniSite-1D, and VN-EGNN scored by per-pocket AUPRC against max_qcov , the largest fraction of a held-out pocket’s residues covered by a pre-cutoff pocket. UniSite-1D and VN-EGNN are both retrained on PocketWatch; Table 1 also gives their published weights. zPocket leads every baseline in every bin. Bin sizes are printed on the axis and bars are bootstrap 95% intervals.
Figure 2: PocketWatch Construction Overview (A) We start with every protein–small-molecule structure in the PDB released prior to January 2, 2026. (B) We filter to only include ligands that are biologically relevant per BioLiP2 [ 36 ] and pass our size filter; more details in Appendix A.1 . (C) Surviving pocket instances (one receptor chain paired with one ligand occurrence) are aggregated per canonical UniProt sequence, so a protein carries every pocket ever observed on it rather than one per structure. (D) Instances are placed in a common frame on a predicted fold and single-linkage clustered by ligand centroid into discrete pocket sites. (E) Sites become a per-residue binary label vector indexed by canonical UniProt position, which is what the heads are trained and scored on.
per target
per pocket
AUPRC p by multiplicity
Method
Variant
AUPRC t
AUROC t
Rp t
AUPRC p
AUROC p
Rp p
1 pocket
> 1
Baselines
P2Rank
0.477
0.859
0.449
0.455
0.855
0.425
0.466
0.430
VN-EGNN (pub)
0.559
0.862
0.513
0.516
0.846
0.472
0.567
0.409
UniSite-1D (pub)
0.531
0.878
0.507
0.497
0.870
0.474
0.533
0.421
PocketWatch
VN-EGNN (PW)
0.598
0.837
0.567
0.559
0.819
0.530
0.605
0.463
Retrained
UniSite-1D (PW)
0.595
0.898
0.568
0.552
0.883
0.529
0.598
0.458
Table 1: Per-residue results on PocketWatch, for zPocket heads on the ESMFold2 trunk against both published and re-trained baselines, scored on the 1,562 test pockets of 1,275 targets in the effective test set. All baselines are run on ESMFold2’s predicted folds when structure is needed. Table A5 compares results from both ESMFold2 and Protenix. The single row reads the final-layer ESMC-6B embedding. Rp = R-precision. Per-target metrics are computed once per target from that target’s residue ranking, then averaged over targets with equal weight. Per-pocket metrics are computed once per pocket, with positives from other pockets masked out, and averaged over pockets with equal weight. The last two columns split AUPRC p by the number of scored pockets for each protein. (pub) is the published weights; (PW) is the same architecture retrained on PocketWatch. UniSite-1D (PW) is the mean of three seeds; every other row is a single model. Bold = best per column.
Figure 3: Per-pocket AUPRC by crypticity label. Cryptic pockets are those that an experimental apo structure shows closed; not cryptic are those an experimental apo structure shows open; unlabeled those with no admissible experimental apo structure, which is 70% of the test set and not a neutral remainder; a crypticity label requires a deposited apo structure, which makes the labeled subset a harder, biased sample. Bars are bootstrap 95% intervals; the cryptic column holds 40 pockets and its intervals are wide accordingly. Appendix B.5 crosses this with predicted-fold accuracy.
Trunk
cz
pooled
pairformer2
Protenix-v2
256
0.669 [0.653, 0.684]
0.757 [0.741, 0.772]
Chai-1
256
0.668 [0.652, 0.683]
0.746 [0.729, 0.762]
ESMFold2
256
0.639 [0.623, 0.655]
0.745 [0.729, 0.761]
Protenix-v1
128
0.650 [0.634, 0.665]
0.742 [0.725, 0.758]
OpenFold3-preview
128
0.619 [0.604, 0.634]
0.742 [0.726, 0.758]
RF3
128
0.631 [0.615, 0.646]
0.741 [0.725, 0.757]
Table 2: Per-target AUPRC of zPocket heads trained with one recipe on seven frozen co-folding trunks, scored on the 1,562 test pockets of 1,275 targets as in Table 1 . cz is the trunk’s pair width. Brackets are 95% bootstrap intervals over targets. The Protenix-v2 and ESMFold2 rows repeat Table A5 . Each row is a single training run. Below the double rule, ensembles average the per-residue logits of those pairformer2 heads with equal weight; nothing is fitted. Bold = best single trunk per column. Details in Appendix A.5 .
Figure 4: Pocket centroid prediction on PocketWatch. DCC N+2 over 1,562 pockets of 1,275 targets, at 4 Å. Green is each method’s own proposals under its own ranking; orange re-ranks those same proposals with the zPocket head; blue adds the zPocket cluster proposals to them before re-ranking with the zPocket head. Behind each bar in gray is that bar’s own ceiling — the total number of true pockets detected among all of the proposals. A bar close to its ceiling is limited by what was proposed; a short bar under a tall ceiling is limited by the ranking. union pools every method’s cavities (other than zPocket clusters), so it has no ranking of its own. Error bars are 95% percentile bootstrap intervals over pockets and are unpaired : two bars whose intervals overlap can still differ significantly once the comparison is paired. By a paired 95% bootstrap over the same pockets, re-ranking lifts every method except for the PocketWatch-retrained variant of VN-EGNN (PW), and combining the zPocket clusters with any other method’s proposals then re-ranking lifts DCC N+2 further.
Figure 5: Pocket prediction on crystallographic fragment screens. (a) Per-residue AUPRC over the 35 fragment-soak sites of 12 proteins, for the zPocket head on ESMFold2 folds against three baselines, also using ESMFold2 folds when needed; the dashed line is chance. (b) The same proteins scored as in Figure 4 : each detector’s own proposals under its own ranking, those proposals re-ranked by the zPocket head, and those proposals pooled with the head’s cluster proposals before re-ranking. A site counts as found when a prediction in the top N+2 lies within 4 Å of its centroid, N being that protein’s scored-site count. Behind each bar in gray is that bar’s own ceiling, the rate with no budget at all. Error bars are 95% percentile bootstrap intervals over proteins, and they are wide: twelve proteins separate none of these methods. (c) Two targets scored by fpocket’s cavities pooled with zPocket clusters and re-ranked. Spheres mark each scored site’s centroid, drawn at the 4 Å success radius; the small black spheres are the predicted centroids inside the budget. PHIPA carries one scored site and it is found; A71EV2A carries four and two are found. Figure A5 repeats (a) and (b) using the Protenix-v2-based head and folds.
Appendix figures & tables15 assets
Supplementary material from the paper’s appendix.
Appendix
Split
Chains
Pockets
Residues
Positive Residue %
Train
11,016 (9,362)
14,331 (11,850)
4,628,164 (4,037,795)
6.32% (6.18%)
Validation
1,553 (1,266)
2,165 (1,508)
724,783 (585,943)
5.75% (5.12%)
Test
1,566 (1,283)
2,301 (1,577)
766,340 (629,524)
5.73% (4.85%)
Effective test set
1,275
1,562
625,883
4.86%
Total
14,135 (11,911)
18,797 (14,935)
6,119,287 (5,253,262)
6.18% (5.90%)
Appendix
Table A1: PocketWatch statistics. Splits are temporal and assigned per protein. The parenthesized numbers show the number of surviving chains/pockets/residues when both the seen and multi-chain-only pockets are masked. Effective test set is the set every number in this paper is computed on; it applies two further exclusions. First we mask 4 pockets that are novel by centroid but whose residues lie entirely inside an already-public pocket, leaving 1,279 chains / 1,573 pockets. Second we drop the 11 pockets on four proteins that VN-EGNN did not support due to unknown residues.
Head
Mixing before readout
Width
Params
pooled
none
—
264,449
axial
1 row+column self-attention block
32
29,537
pairformer1
1 triangular pair block
64
231,233
pairformer2
2 triangular pair blocks
64
330,177
Appendix
Table A2: zPocket head architectures. All heads share a common readout and differ only in the mixing applied to z beforehand. Parameter counts are for pair width C=256 and exclude the frozen trunk.
ESMFold2
Protenix
Proposals
Aggregate
Lining
Aggregate
Lining
fpocket
mean of top 16
5 Å shell
mean of top 32
8 Å shell
P2Rank
mean
8 Å shell
mean
8 Å shell
Lacuna
mean
8 Å shell
mean
8 Å shell
Lacuna (SF-seq)
mean
stored list
mean
stored list
VN-EGNN (PW)
mean
8 Å shell
mean of top 16
10 Å shell
Appendix
Table A3: Re-ranking configurations selected on validation. The grid spans seven aggregates (mean, max, sum, and the mean of the k highest for k∈{4,8,16,32} ) and four linings (the cavity’s stored residue list, or a 5, 8 or 10 Å heavy-atom shell around its centroid), giving 28 configurations per detector. stored list is the detector’s own lining where it publishes one — fpocket’s alpha-sphere contacts, P2Rank’s surface-point residues, Lacuna’s reported residues — and, for VN-EGNN, which emits points rather than cavities, an 8 Å shell computed around each virtual-node centroid at detection time. Configurations are determined separately for each trunk’s head; the main text uses the ESMFold2 configurations.
Trunk
Checkpoint
Cutoff
Recycles
z read from
Protenix-v1
base_default_v1.0.0
2021-09-30
10
distogram-head input
OpenFold3-preview
of3-p2-155k
2021-09-30
3
latent pair output
Boltz-1
Boltz-1
2021-09-30
3
trunk embedding
Chai-1
chai-lab 0.6.1
2021-01-12
3
trunk output
RF3
09_21_preprint
Sep. 2021 †
10
recycler output
Appendix
Table A4: Inference settings for the added trunks. Cutoff is the latest deposition date of the checkpoint’s experimental training structures. z read from is where the pair representation is captured: in every case after the last recycle and before the diffusion module. † Structures released before September 2021, as stated in the RF3 preprint [ 9 ] ; the exact day is not given.
per target
per pocket
AUPRC p by multiplicity
Trunk
Head
AUPRC t
AUROC t
Rp t
AUPRC p
AUROC p
Rp p
1 pocket
> 1
Protenix
single ( s )
0.474
0.874
0.444
0.442
0.863
0.413
0.468
0.390
pooled
0.669
0.938
0.614
0.633
0.927
0.579
0.667
0.560
axial
0.724
0.950
0.658
0.683
0.941
0.620
0.726
0.594
pairformer1
0.746
0.956
0.680
0.702
0.946
0.637
0.750
0.602
pairformer2
0.757
0.958
0.692
0.714
0.948
0.650
0.761
0.617
Appendix
Table A5: Protenix against ESMFold2 as a frozen trunk. Per-residue results on PocketWatch for every zPocket head trained on each of the two trunks, scored on the 1,562 pockets of 1,275 targets in the effective test set. Protenix leads on every matched head, but the margin is small compared to the choice of head architecture. The ranking across zPocket head architectures is the same for both trunks. The single rows are not a matched pair: Protenix uses the trunk single representation s , while ESMFold2 uses the final-layer ESMC-6B embedding. P2Rank, run on each co-folding model’s own predicted folds, is included as a structure-dependent reference point on the same folds the heads are compared over. Columns: Rp = R-precision. Per-target metrics are computed once per target from that target’s residue ranking, then averaged over targets with equal weight. Per-pocket metrics are computed once per pocket, with positives from other pockets masked out, and averaged over pockets with equal weight. The last two columns split AUPRC p by the number of scored pockets for each protein. Bold = best per column.
Figure A1: Per-target AUPRC against sequence identity to anything the model has already seen — the trunk’s pretraining sequences plus the PocketWatch training and validation sequences. Performance is roughly flat from novel through close and falls only in the near-identical ( ≥ 95%) bin. We suspect that this fall is an artifact of the seen-pocket mask rather than a generalization effect: a protein with pockets deposited before the cutoff has most of its familiar pockets masked, leaving the harder remainder to be scored. Bin sizes are printed on the axis and bars are bootstrap 95% intervals. zPocket outperforms all baselines.
Trunk
AUPRC t
AUROC t
Rp t
Δ vs ESMFold2
Δ vs Protenix-v2
pairformer2
Protenix-v2
0.757
0.958
0.692
+0.011[+0.003,+0.020]
—
Chai-1
0.746
0.955
0.680
+0.000[−0.008,+0.008]
−0.011[−0.020,−0.003]
ESMFold2
0.745
0.951
0.682
—
−0.011[−0.020,−0.003]
Protenix-v1
0.742
0.953
0.677
−0.004[−0.012,+0.004]
−0.015[−0.023,−0.007]
OpenFold3-preview
0.742
0.952
0.680
−0.003[−0.010,+0.004]
−0.015[−0.022,−0.007]
Appendix
Table A6: Per-target results for every trunk and head, as in Table 2 with AUROC, R-precision (Rp) and paired differences in AUPRC against the two main-text trunks (head minus reference, same head type, 95% CI over 4000 bootstrap samples). Each row is a single training run.
DCC success
Section
Proposals
Ranker
N
N+2
ceil.
AP
prec.
kˉ
Base methods
fpocket
fpocket
0.139
0.197
0.476
0.195
0.014
41.3
P2Rank
P2Rank
0.324
0.386
0.431
0.371
0.044
11.8
Lacuna
Lacuna
0.209
0.369
0.616
0.310
0.013
57.5
Lacuna (SF-seq)
Lacuna (SF-seq)
0.273
0.497
0.780
0.417
0.015
64.9
VN-EGNN (pub)
VN-EGNN (pub)
0.417
0.461
0.483
0.482
0.124
4.8
Appendix
Table A7: Discrete pocket prediction on PocketWatch with the ESMFold2 pairformer2 head and every detector run on ESMFold2 folds: how close a ranked list of predicted centroids lands to the real ligand centroids, over the same 1,562 pockets of 1,275 targets. A prediction succeeds within 4 Å of a ground-truth centroid. DCC N keeps each protein’s own pocket count as the budget and N+2 allows two more; ceiling is the rate with no budget at all, which the proposals fix and no ranking can exceed; prec. is the share of everything emitted that claimed a pocket, and kˉ how many centroids were emitted per protein. Every decoder is the winner of a validation sweep restricted to ranking by a single scorer, so no row mixes the head’s score with a detector’s own. union pools every detector’s cavities, folded most-selective first and deduplicated, so it has no ranking of its own to report – only a pool for the head to rank. Bold = best per column.
Figure A2: Pocket centroid prediction split by pocket familiarity. The comparison of Figure 4 , DCC N+2 at 4 Å, computed separately on unfamiliar pockets ( max_qcov below 80%: 443 pockets of 362 proteins) and familiar ones ( max_qcov at or above 80%: 1,119 pockets of 990 proteins). Colors, gray ceilings and error bars are as in Figure 4 : green is each method’s own proposals under its own ranking, orange re-ranks those proposals with the zPocket head, blue adds the zPocket cluster proposals before re-ranking, an asterisk marks a paired 95% bootstrap excluding zero, and the intervals on the bars themselves are unpaired. Every method degrades sharply on unfamiliar pockets, and the gap between each bar and its own ceiling widens, but adding the zPocket proposals and re-ranking still lifts DCC N+2 significantly for most methods in both similarity bins.
Figure A3: Per-pocket AUPRC by crypticity label, crossed with whether the ESMFold2 predicted structure comes within 2 Å of the ground-truth pocket. zPocket heads against P2Rank and both baselines, each as published ( pub ) and retrained on PocketWatch ( PW ). Bucket sizes are printed beneath each group; bars are bootstrap 95% intervals and the dashed line is the random expectation, computed per bucket from its own positive rate.
Figure A4: The main-text case study rendered from the reported model. The same target and annotated sites as Figure 1 (B), scored by the plain unweighted BCE head ( w=1 , γ=0 ) used throughout the paper. Site coloring and seen-pocket masking follow Figure 1 (B). The cartoon’s color ramp spans scores 0–1 here and 0–0.4 in Figure 1 (B), where the weighted-focal head’s scores are compressed.
Figure A5: Figure 5 on the Protenix-v2 trunk. Panels (a) and (b) of Figure 5 , with the Protenix-v2 pairformer2 head and every detector run on Protenix-v2 folds, over the same 35 sites of 12 proteins. Colors, ceilings, budget, success radius and error bars as in Figure 5 .
Filter
Pockets
Removed
Proteins
All predicted pockets
21,646
—
17,527
Direct: evidence on the query accession
Known ligand site on this protein
18,908
2,738
15,254
UniProt ACT_SITE, BINDING or SITE
15,557
3,351
12,468
Polymer interface in its own assemblies
12,480
3,077
9,995
Homology-propagated: transferred from Pfam family and clan relatives
Appendix
Table A8: Pocket filtering funnel over the reviewed human proteome, grouped by how evidence of a known site is propagated to the query: not at all, by sequence homology to Pfam family and clan relatives, or by structural-motif similarity irrespective of homology. Geometric requirements are independent of all three. Counts are pockets remaining after each successive filter; proteins are the distinct accessions those pockets lie on. Filters are conjunctive, so the survivor count is independent of their order; per-row removals are not.
Filter
Pockets
Removed
Proteins
All predicted pockets
21,646
—
17,527
Direct
Known ligand site on this protein
18,908
2,738
15,254
UniProt functional site, interactions excluded
15,602
3,306
12,501
Homology-propagated
Transferred ligand site
11,297
4,305
9,110
Appendix
Table A9: The funnel with all interface evidence removed, for comparison with Table A8 . Geometric and motif requirements are unchanged. The surviving set is a strict superset of the 155 reported there.
zPocket
P2Rank
fpocket
Lacuna
DET1
1
4 / 17 (0.71)
39 / 40 (0.70)
1 / 50 (0.42)
COP1
1
— 0000 (0.06)
— 0000 (0.16)
24 / 52 (0.42)
Appendix
Table A10: Agreement of geometric cavity detectors with the predicted site. Each tool was run natively and its own score order used. Entries give the rank of the tool’s best-overlapping proposal, out of the number it made on that protein, with the Jaccard overlap in parentheses. A dash means no proposal reached a Jaccard of 0.25, so the tool does not propose this site at any rank.
May 21, 2026·Zhaohan Meng, Zhen Bai, Ke Yuan +4Drug Discovery
School of Computing Science, University of Glasgow · School of Life Science and Technology, Institute of Science Tokyo · School of Cancer Sciences, University of Glasgow +4