PLINDER, the Protein & Ligand INteraction Dataset and Evaluation Resource,
extracts protein-ligand systems and protein-protein interfaces from the PDB.
PLINDER releases are identified by the month of their PDB snapshot
(YYYY-MM; the current release is 2026-09) and served from
https://cameo3d.org/plinder/PLINDER-<release-month>/. The file layout is:
Note
Historical releases remain available at gs://plinder/2024-04/v0,
gs://plinder/2024-04/v1, and gs://plinder/2024-06/v2. Their layout and APIs
differ from the current release.
plinder_download downloads the index and representative-cover tables by
default. It asks before downloading ligand archives, alignments, score files,
complete similarity tables, and search databases; --yes downloads every
group. APIs fetch missing optional files when they need them unless offline
mode is enabled. Source PDB mmCIFs are separate: they are fetched per PDB entry
during reconstruction and are not part of the bulk download.
The following are all registered release tables available through
query_table(). The main tables of interest are annotation, which has one
row per ligand, and interface_annotations, which has one row per
protein-protein interface. The remaining tables separate entry,
chain, validation, cluster, and representative data so clients only load it
when needed. query_table() can request columns across related tables in a
single query and selects the required relationships from those columns.
annotation: ligand annotations and reconstructable system IDs;
system_validation: ligand and pocket validation summaries for each
system;
entry_chains: one polymer chain in a PDB entry;
entry_biounit_chains: one chain instance in a biological assembly;
entry_metadata: experimental and entry-validation metadata;
entry_sources: the source mmCIF revision used for the release;
interface_annotations: one protein-chain interface;
alignment_chain_lookup: protein-chain search identifiers and
residue mappings;
linked_apo_structures: ranked apo chains linked to holo ligands;
interface_apo_structures: ranked apo chains linked to each side of a
protein interface;
The checked-in column reference below is generated from these release tables.
BindingDB’s PDB/ligand cross-references can include similar, rather than exact,
targets. ligand_affinity therefore requires a matching receptor sequence and
one uncensored Ki or Kd endpoint before reporting a value. The individual
records remain available in bindingdb_measurements.
The table keeps BindingDB’s curation source and DOIs so records imported from
ChEMBL can be identified. BindingDB describes different reuse terms for its
own curation and ChEMBL imports in its
data-availability statement.
alignment_chain_lookup
Loading ITables v2.9.1 from the internet...
(need help?)
RCSB PDB ID. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_entry.id.html
chain_asym_id
string
Chain asymmetric id
chain_auth_id
string
Chain author id
chain_entity_id
string
Chain entity id
chain_type
string
Raw CIF receptor polymer type
chain_receptor_type
string
Receptor polymer category: protein, dna, rna, or dna+rna
chain_sequence
string
Full polymer sequence in one-letter code, keyed by the source asymmetric-chain ID
chain_sequence_noncanonical
string
Full polymer sequence from _entity_poly.pdbx_seq_one_letter_code, with modified residues as (CCD) tokens
chain_modified_residues
list<element: string>
Non-canonical SEQRES monomers as {auth_seq}:{comp_id}:{asym}:{label_seq}>{parent} (details), the residue address of ligand_covalent_linkages (comp_id is entity_poly_seq.mon_id); unresolved positions have auth_seq ?; parent and details from _pdbx_struct_mod_residue, else the CCD parent
chain_length
int64
SEQRES length
(4 more rows not shown)
entry_metadata
Loading ITables v2.9.1 from the internet...
(need help?)
RCSB PDB ID. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_entry.id.html
entry_release_date
string
RCSB structure release date. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_database_PDB_rev.date_original.html
entry_oligomeric_state
string
Author's provided description of quaternary structure in RCSB. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_pdbx_struct_assembly.oligomeric_details.html
entry_determination_method
string
RCSB method of structure determination. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_exptl.method.html
entry_keywords
string
RCSB keywords describing the structure. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_struct_keywords.pdbx_keywords.html
entry_pH
string
pH at which structure is solved. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_exptl_crystal_grow.pH.html
entry_pH_min
double
Lowest crystallization pH parsed from _exptl_crystal_grow (pH, pdbx_pH_range, or pdbx_details); null when none parses
entry_pH_max
double
Highest crystallization pH parsed from _exptl_crystal_grow (pH, pdbx_pH_range, or pdbx_details); null when none parses
entry_resolution
double
RCSB structure resolution. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_refine.ls_d_res_high.html
entry_has_ligand_of_interest
bool
Depositor flag _pdbx_entry_details.has_ligand_of_interest (Y true, N false); null when absent, i.e. for most entries deposited before ~2019
(22 more rows not shown)
entry_sources
Loading ITables v2.9.1 from the internet...
(need help?)
Cluster ID for directed set cover built from interface_qcov with 100 threshold; each member's query-to-centroid score meets the threshold
interface_qcov__100__reciprocal_component
large_string
Full-graph component at interface_qcov 100 threshold; an edge requires similarity in both directions. Connected members may be linked through other members rather than directly
interface_qcov__30__directed_set_cover
large_string
Cluster ID for directed set cover built from interface_qcov with 30 threshold; each member's query-to-centroid score meets the threshold
interface_qcov__30__reciprocal_component
large_string
Full-graph component at interface_qcov 30 threshold; an edge requires similarity in both directions. Connected members may be linked through other members rather than directly
interface_qcov__50__directed_set_cover
large_string
Cluster ID for directed set cover built from interface_qcov with 50 threshold; each member's query-to-centroid score meets the threshold
interface_qcov__50__reciprocal_component
large_string
Full-graph component at interface_qcov 50 threshold; an edge requires similarity in both directions. Connected members may be linked through other members rather than directly
interface_qcov__70__directed_set_cover
large_string
Cluster ID for directed set cover built from interface_qcov with 70 threshold; each member's query-to-centroid score meets the threshold
interface_qcov__70__reciprocal_component
large_string
Full-graph component at interface_qcov 70 threshold; an edge requires similarity in both directions. Connected members may be linked through other members rather than directly
interface_qcov__90__directed_set_cover
large_string
Cluster ID for directed set cover built from interface_qcov with 90 threshold; each member's query-to-centroid score meets the threshold
(21 more rows not shown)
interface_half_representatives
Loading ITables v2.9.1 from the internet...
(need help?)
Unique identifier of the ligand in the annotation table
ligand_binding_affinity
double
Median pKi or pKd for uncensored BindingDB measurements with one endpoint and a target sequence matching this ligand's receptor; missing if ambiguous
ligand_binding_affinity_endpoint
string
BindingDB endpoint (Ki or Kd) used for ligand_binding_affinity
ligand_binding_affinity_measurement_count
int64
Number of BindingDB measurements used for ligand_binding_affinity
system_has_binding_affinity
bool
Whether any ligand in the system has an unambiguous, sequence-matched BindingDB affinity
ligand_clusters
Loading ITables v2.9.1 from the internet...
(need help?)
Cluster ID for ligand-level set cover built from reciprocal-minimum MHFP6/2048 MinHash-estimated Jaccard similarity (Probst & Reymond 2018) with 100 threshold; each member has a direct threshold-qualified edge to its representative
Full-graph component at jaccard_similarity_mhfp6_2048 100 threshold; an edge requires similarity in both directions. Connected members may be linked through other members rather than directly
Whether this row is the published centroid for its ligand-level set-cover cluster built from jaccard_similarity_mhfp6_2048 with 100 threshold; missing means the row is outside the clustering universe
Cluster ID for ligand-level set cover built from reciprocal-minimum MHFP6/2048 MinHash-estimated Jaccard similarity (Probst & Reymond 2018) with 30 threshold; each member has a direct threshold-qualified edge to its representative
Full-graph component at jaccard_similarity_mhfp6_2048 30 threshold; an edge requires similarity in both directions. Connected members may be linked through other members rather than directly
Whether this row is the published centroid for its ligand-level set-cover cluster built from jaccard_similarity_mhfp6_2048 with 30 threshold; missing means the row is outside the clustering universe
Cluster ID for ligand-level set cover built from reciprocal-minimum MHFP6/2048 MinHash-estimated Jaccard similarity (Probst & Reymond 2018) with 50 threshold; each member has a direct threshold-qualified edge to its representative
Full-graph component at jaccard_similarity_mhfp6_2048 50 threshold; an edge requires similarity in both directions. Connected members may be linked through other members rather than directly
Whether this row is the published centroid for its ligand-level set-cover cluster built from jaccard_similarity_mhfp6_2048 with 50 threshold; missing means the row is outside the clustering universe
(100 more rows not shown)
ligand_mmp_pairs
Loading ITables v2.9.1 from the internet...
(need help?)
RCSB PDB ID. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_entry.id.html
chain_asym_id
string
Chain asymmetric id
representative_entry_pdb_id
string
PDB entry containing the protein-cluster representative; together with representative_chain_asym_id identifies the cluster
representative_chain_asym_id
string
Source label_asym_id of the protein-cluster representative; missing when the chain could not be clustered
is_representative
bool
Whether this protein chain is its cluster representative; missing when the chain could not be clustered
status
string
Protein clustering outcome: clustered, weekly_assigned (searched against fixed representatives), missing_sequence (MMseqs), or not_in_foldseek_db (Foldseek did not extract this chain from the deposited structure)
protein_structure_clusters
Loading ITables v2.9.1 from the internet...
(need help?)
RCSB PDB ID. See https://mmcif.wwpdb.org/dictionaries/mmcif_pdbx_v50.dic/Items/_entry.id.html
chain_asym_id
string
Chain asymmetric id
representative_entry_pdb_id
string
PDB entry containing the protein-cluster representative; together with representative_chain_asym_id identifies the cluster
representative_chain_asym_id
string
Source label_asym_id of the protein-cluster representative; missing when the chain could not be clustered
is_representative
bool
Whether this protein chain is its cluster representative; missing when the chain could not be clustered
status
string
Protein clustering outcome: clustered, weekly_assigned (searched against fixed representatives), missing_sequence (MMseqs), or not_in_foldseek_db (Foldseek did not extract this chain from the deposited structure)
system_validation
Loading ITables v2.9.1 from the internet...
(need help?)
The tables can be read directly with any Parquet reader. The identifiers used
to combine them are:
entry_pdb_id for entry metadata and source revisions;
the pair (entry_pdb_id, chain_asym_id) between entry_biounit_chains
and entry_chains;
system_id for ligand systems, system validation, protein interfaces, and
interface clusters;
ligand_id for ligand annotations, pocket-representative membership, and
ligand clusters;
representative_ligand_id and representative_system_id for the compact
representative tables.
All registered relationships point from a table to rows that are unique on the
join columns. Adding entry metadata, system validation, or representative
membership therefore does not multiply the rows of the starting table. See
Query the release tables for examples that select the required
tables automatically.
interface_annotations has one row for an unordered pair of
protein-chain instances in a biological assembly. Its system_id has the form
<pdb>__<assembly>__<chain-instance-1>--<chain-instance-2>.
Assembly-chain IDs such as 1.A and 2.A distinguish repeated copies of the
same asymmetric-unit chain.
The table records both chain-instance IDs, resolved residue numbers and indices
for each side, the number of contacting residue pairs, and PRODIGY-cryst
features. Full deposited sequences and source taxonomies are in the chain and
entry tables.
interface_representatives stores the full-interface representatives,
while interface_half_representatives stores individual interface
sides. The latter is useful when one wants diverse protein surfaces without
requiring both sides of the same complex. interface_clusters provides
cover columns for query_table(), while detailed assignments are under
interface_sampling/.
PLINDER stores one asymmetric-unit SDF for each ligand chain in
ligand_archives/{two_char_code}.parquet. Assembly copies are not stored because
they have the same conformation under a rigid-body transform. The archive stores
the SDF together with the PDB entry ID and asymmetric-unit ligand ID.
PlinderSystem.reconstruct() rebuilds selected system structures from the
deposited PDB mmCIF, the ligand rows, and entry_biounit_chains.parquet.
Accessing PlinderSystem.system_cif or PlinderSystem.receptor_cif performs
reconstruction when the complete system or ligand-free receptor mmCIF is not
already cached. Reconstruction options can include additional chains from the
same PDB entry.
PlinderInterface.reconstruct() similarly rebuilds a protein-protein interface,
and PlinderInterface.interface_cif returns its standard mmCIF path. The source
revision recorded in entry_sources.parquet is fetched from the
wwPDB versioned archive and
cached separately from the bulk release. Source PDB mmCIFs are therefore not
included by plinder_download; download_pdb_mmcifs() can prefetch selected
source revisions for offline reconstruction.
The reconstructed mmCIFs contain the atom, sequence, component, assembly, and
bond information needed to read them as self-contained PDBx/mmCIF files.
Asymmetric ligand SDFs preserve the curated bond orders. Assembly-coordinate
SDFs use the same chemistry with the recorded rigid-body transforms applied.
linked_apo_structures associates a holo ligand system with ranked
deposited apo protein chains. A candidate must pass the configured pocket and
whole-chain similarity requirements for every proper ligand pocket in the holo
system. Candidates from the same PDB entry are excluded.
Ranking prefers chains with no nearby ligand-like components, then ion-only,
artifact, and other-ligand contacts. Resolution and similarity break later
ties. The release stores the assembly chain instance that was scored;
PlinderSystem.reconstruct_linked_apo() rebuilds its coordinates from the
recorded source entry and assembly membership.
interface_apo_structures applies the same idea to each side of a
protein-protein interface. Here an apo candidate is a highly similar protein
chain in a biological assembly where that chain contacts no other protein.
MMseqs alignments must cover at least 80% of both chains. The table retains
sequence identity, both coverage values, Foldseek lDDT when available, and the
exact assembly-chain instance selected for reconstruction.
exports/protein_similarity_scores/ contains the Foldseek and MMseqs
chain-pair scores, including query and target coverage, sequence identity,
sequence similarity, and Foldseek lDDT. Percentage values are stored as
integers from 0 to 100.
exports/monomer_similarity_scores/ adds query chains outside ligand pockets
and protein interfaces. Pass include_monomers=True to
query_protein_similarity() to read both sets of chain pairs.
For a custom structure or FASTA search, search() returns
result.chain_similarity_scores, a Parquet file of direct chain-level hits
with the same score fields. FASTA results retain the original sequence IDs.
By default, chain hits also include protein chains outside ligand pockets
and protein interfaces. Pocket and interface scores use their own targets.
The optional alignment_cigars/ files contain full-chain CIGARs, alignment
starts, and bit-packed residue identity flags. Holo chain-pair statistics are
read from exports/protein_similarity_scores/.
Pocket, protein-ligand interaction, and protein-interface residue mappings
are recovered from these CIGARs and alignment_chain_lookup when needed.
plinder.core.scores.query_chain_overlap() reports the overlapping and total
residue counts for either ligand pockets or protein interfaces on a requested
pair of chains. It also reports the overlap fractions and the number of
identical residues for each available alignment backend.
plinder.core.scores.map_chain_alignment() reads one chain pair and
expands its CIGARs into residue positions. MMseqs rows use one-based SEQRES
positions, while Foldseek rows use zero-based indices over the resolved
coordinate residues. Gap rows can be retained or omitted.
exports/ligand_similarity_scores.parquet stores the complete directed
ligand-pair table derived from the corresponding protein alignments and ligand
comparisons. Each row contains pocket_qcov, pocket_fident_qcov, pli_qcov,
and sucos_shape. Swapping query and target can change the values. Symmetric
Tanimoto similarities calculated from 1,024-bit Morgan fingerprints with
radius 2 (ECFP4) over unique canonical SMILES remain in ligand_scores/, which
is used to build the reciprocal chemical covers.
The Tanimoto rows contain query_ligand_id, target_ligand_id, and
tanimoto_similarity_ecfp4_1024; both ID columns refer to ligand_smiles_id
values in annotation.
exports/interface_similarity_scores.parquet contains the complete directed
interface table with iface1_qcov, iface2_qcov, and their combined
similarity value. Swapping query and target can change the coverage.
exports/interface_half_similarity_scores.parquet contains directed coverage
scores of at least 30 between individual interface sides, identified by IDs ending
in ::side=1 or ::side=2. Use query_interface_similarity() or
query_half_interface_similarity() to filter these tables from Python.
ligand_sampling/set_cover/ contains undirected set covers for reciprocal
Tanimoto (ECFP4) and Jaccard (MHFP6) similarity;
ligand_sampling/directed_set_cover/ contains directed covers for pocket,
interaction, and pocket-weighted ligand 3D metrics;
interface_sampling/directed_set_cover/ contains directed covers for whole
protein interfaces (interface_qcov) and interface sides
(interface_side_qcov).
Each metric has files named metric={metric}/threshold={threshold}.parquet.
The release also includes one row per ligand in
index/ligand_clusters.parquet and one row per interface to
index/interface_clusters.parquet. query_table() joins these columns to the
corresponding annotation table when requested. Tanimoto columns end in
__ligand__set_cover; directional ligand columns end in
__ligand__directed_set_cover.
The Tanimoto cover uses only reciprocal edges meeting the requested threshold.
For a directional cover, representative selection first maximizes residual gain
at the requested threshold. If uncovered nodes remain above a threshold of 50,
the algorithm uses 50-percent edges before assigning remaining singletons. The
detailed file records representative_selection_threshold and
assignment_threshold, so downstream selection can distinguish strict and
fallback assignments. It also records selection order, marginal gain, and each
node’s potential coverage count and fraction.
Between full clustering runs, weekly updates keep existing representatives and
cluster IDs. Changed chains, ligands, and interfaces are compared with those
representatives; a qualifying match joins an existing cluster, while an
unmatched item starts a new one. The detailed cover files describe the last
full clustering run; the index cluster tables include weekly assignments.
The cluster tables also contain __reciprocal_component IDs. Two items share
one ID when a path of similarities meeting the threshold in both directions
connects them; they need not be directly similar. Weekly additions receive
cover assignments immediately, while their component IDs await the next full
clustering run.
search_databases/ contains Foldseek structure and MMseqs sequence databases
for PLINDER receptor and interface chains, together with the chain mappings
used by custom scoring.
ligand_mmp_pairs contains compact mmpdb transformations over
unique canonical ligand SMILES. Rows identify the two ligand_smiles_id values,
both SMILES, the transformation and shared core, cut count, heavy-atom counts,
and the fraction of each ligand contained in the shared core.