October 5, 2026 · Temple Compute
Cryptic Pocket Detection: Find Hidden Binding Sites
Most structure-based projects start the same way. You take a crystal structure, run a pocket finder, and dock into whatever it returns. That works when the pocket is already there. It fails when the pocket you need only exists once something binds.
Those sites are cryptic pockets, and the standard tools are built to miss them. This post covers what cryptic pockets are, why geometric detection misses them, how ensemble detection finds them, and how to run cryptic pocket detection on your own structure.
What a cryptic pocket is
A cryptic pocket is a binding site that looks closed or shallow in an unbound (apo) structure. It only opens when a ligand binds, or when the protein moves into a conformation the crystal did not capture.
The textbook case is KRAS. The switch-II pocket that covalent G12C inhibitors bind is absent from apo KRAS structures. It forms on inhibitor binding. If you had only the apo structure, a standard pocket scan would not hand it to you.
Why fpocket-style detection misses them
Geometric pocket finders like fpocket look for concavity on a single, static surface. They propose a pocket where the surface is already concave.
That is exactly the assumption a cryptic site violates. In the apo structure, the site is flat or collapsed. There is no concavity to find. Running a geometric detector harder on the same frame does not change that. The information is not in the frame.
Running fpocket across a pre-built ensemble helps, but it still asks the same question of every frame: is this surface already concave? It does not score how much a site opens relative to the input.
Geometric detection is still the right tool for many jobs. If the site is already open, fpocket is fast and simple. Our fpocket docking workflow does exactly that. It just answers a different question.
How ensemble detection finds cryptic binding sites
Lacuna approaches cryptic binding site prediction in four steps.
1. Generate an ensemble. Lacuna perturbs the input structure into a set of
conformers. The default backend is normal mode analysis, which runs on a CPU. An
openmm backend runs short implicit-solvent MD. A boltz backend uses diffusion
sampling on a GPU. The input structure itself is always conformer 0, so a pocket
that never leaves the crystal structure is still reported.
2. Detect pockets in every conformer. Lacuna runs its detector on each frame,
not just the input. Version 1.1.0 adds a learned surface detector next to the
original geometric one. The surface-fusion mode pools both, so a candidate does
not need to be concave in the geometric sense to be proposed.
3. Cluster across the ensemble. Pockets from all conformers are clustered by location. A site that appears in only a few frames still survives as a cluster and gets reported. Each cluster carries a persistence score: the fraction of conformers it appears in.
4. Score crypticity and rank. Each cluster gets a crypticity score: how much it opens relative to the input structure. A fitted model then ranks the survivors. When both detectors are pooled, Lacuna switches to a ranker fitted on the pooled candidate set.
The pooling matters. Per the Lacuna README, combining both detectors takes held-out CryptoBench coverage from 68.5% to 86.4%, and top-five recovery from 57.1% to 73.9%, over the geometric detector alone.
The KRAS check
Our workflow ships with PDB 4LDJ: apo, GDP-bound KRAS(G12C) with no switch-II inhibitor present. KRAS is not in the benchmark Lacuna's models were fitted on.
Run against this structure, Lacuna surfaces the switch-II pocket twice in the top ten. Once as the compact groove, 4.2 Å from where sotorasib sits. Once as the wider pocket with the fuller residue overlap, opening nine-fold across the ensemble. Every site ranked above them is the GDP pocket: a real pocket with a real ligand already bound.
That is the behaviour you want from a cryptic pocket finder. It found the known site and ranked a real, occupied pocket above it.
How to find cryptic pockets in your protein
The Lacuna cryptic pocket discovery workflow wraps all of this into two stages.
The discover stage runs the full Lacuna pipeline in one CLI call: ensemble,
per-conformer detection, clustering and ranking. The report stage turns the
result into an HTML report with a 3D view of the receptor and a sortable table,
plus a flat CSV.
Install and run:
uv sync
uv run horus run workflow.yaml
The first run builds a dedicated environment with lacuna-pockets from PyPI.
No conda or container setup is needed for the defaults. The example runs on a
CPU in about one to two minutes with 20 conformers.
To use your own target, repoint the receptor artifact to any PDB or mmCIF
file. The main knobs live on the discover task:
--conformerssets the ensemble size.--backendpicksnma,openmmorboltz.--detectorpicksalpha,surface,surface-fusion,p2rankorfusion.--rank-bypickslearned,crypticity,druggability,balancedorpersistence, among others.--min-druggability,--min-persistenceand--min-crypticityfilter the output.
Scale the ensemble, not the script
The default run fits on a laptop. A bigger ensemble, or the MD or diffusion
backends, does not. With Horus you move the discover stage by giving it a
target: and a resources: block. The command does not change. The report
stage stays local, and Horus brings the pocket folder back for you.
From pocket to docked ligands
Discovery is the first half. Once you have a ranked pocket, the Lacuna + AutoDock Vina docking workflow takes the top pocket and docks a ligand library into it.
FAQ
What is a crypticity score?
It measures how much a pocket opens relative to the input structure. Lacuna reports it for every pocket cluster, next to druggability and persistence. A high crypticity means the site is much larger somewhere in the ensemble than it is in the structure you started from.
Can fpocket find cryptic pockets?
Not reliably on a single apo structure. fpocket proposes pockets where the surface is already concave, and a cryptic site is not concave until it opens. Running it across an ensemble helps. A detector that also scores how much a site opens across the ensemble is built for the job.
How do I predict cryptic binding sites without running long MD?
Use a cheap ensemble. Lacuna's default normal mode analysis backend generates
conformers on a CPU, and the bundled example finishes in about one to two
minutes. Move to the openmm or boltz backends when you need more fidelity.
Do I need a GPU to find cryptic pockets?
No. The default configuration is CPU-only. Only the boltz ensemble backend
needs a GPU. If you use it, point the discover stage at a GPU target and leave
the rest of the workflow where it is.
Try it
Cryptic pocket detection should not need a custom cluster script. Run the workflow on your laptop, then send the ensemble stage to an HPC scheduler or a cloud GPU when you need more.
Open Horus and run the Lacuna workflow on your own target.