Similarity scores and representative covers#

Compare ligands and protein interfaces, explore similarity scores, and find representative clusters. Similarity scores defines the metrics and files.

import pandas as pd

from plinder.core import PlinderRelease, query_table
from plinder.core.scores import (
    reconstruct_interface_similarity_scores,
    reconstruct_similarity_scores,
)

release = PlinderRelease()
/home/runner/micromamba/envs/plinder/lib/python3.12/site-packages/vcs_versioning/_backends/_git.py:709: UserWarning: "/home/runner/work/plinder/plinder" is shallow and may cause errors
  pre_parse(wd)
ligand_system_id = "4agi__1__1.C__1.R"
ligand_id = "4agi__1__1.R"
interface_id = "7cm8__1__1.A--2.A"

Compare ligand similarities#

reconstruct_similarity_scores() reads the files needed for the requested query and target IDs. This example uses a one-pair self-comparison to keep execution small.

ligand_scores = reconstruct_similarity_scores(
    query_system_ids=[ligand_system_id],
    target_system_ids=[ligand_system_id],
    query_ligand_ids=[ligand_id],
    target_ligand_ids=[ligand_id],
)
ligand_scores
query_system query_ligand_id target_system target_ligand_id protein_mapping mapping protein_mapper source metric similarity

For larger neighborhoods, read selected columns and rows from the complete ligand score table.

def read_ligand_neighborhood(system_id, ligand_id):
    return pd.read_parquet(
        release.fetch("ligand_similarity_scores"),
        columns=[
            "query_system",
            "query_ligand_id",
            "target_system",
            "target_ligand_id",
            "pocket_qcov",
            "pocket_fident_qcov",
            "pli_qcov",
            "sucos_shape",
        ],
        filters=[
            ("query_system", "==", system_id),
            ("query_ligand_id", "==", ligand_id),
        ],
    )

Compare protein-interface similarities#

The interface API likewise accepts selected query and target IDs.

interface_scores = reconstruct_interface_similarity_scores(
    query_interface_ids=[interface_id],
    target_interface_ids=[interface_id],
)
interface_scores
query_system target_system mapping source metric iface1_qcov iface2_qcov similarity

Representative covers#

Request cover columns through query_table() just like annotation columns. Representative covers describes their construction and long-form files.

pocket_cover = "pocket_qcov__70__ligand__directed_set_cover"
ligand_cover = query_table(
    columns=[
        "system_id",
        "ligand_id",
        pocket_cover,
        f"{pocket_cover}__is_centroid",
    ],
    filters=[("ligand_id", "==", ligand_id)],
)
ligand_cover.T
0
system_id 4agi__1__1.C__1.R
ligand_id 4agi__1__1.R
pocket_qcov__70__ligand__directed_set_cover c3554
pocket_qcov__70__ligand__directed_set_cover__is_centroid False
interface_cover = query_table(
    "interface_annotations",
    columns=[
        "system_id",
        "interface_qcov__70__directed_set_cover",
    ],
    filters=[("system_id", "==", interface_id)],
)
interface_cover.T
0
system_id 7cm8__1__1.A--2.A
interface_qcov__70__directed_set_cover c2668

Matched molecular pairs#

Use ligand_mmp_pairs to look up transformations involving the selected ligand chemistry.

smiles_id = query_table(
    columns=["ligand_smiles_id"],
    filters=[("ligand_id", "==", ligand_id)],
).iloc[0, 0]
mmp_neighbors = query_table(
    "ligand_mmp_pairs",
    filters=[[
        ("ligand_smiles_id_1", "==", smiles_id),
        ("ligand_smiles_id_2", "==", smiles_id),
    ]],
)
mmp_neighbors.head()
ligand_smiles_id_1 ligand_smiles_id_2 ligand_smiles_1 ligand_smiles_2 transformation shared_core_smiles num_cuts shared_core_num_heavy_atoms ligand_1_num_heavy_atoms ligand_2_num_heavy_atoms ligand_1_shared_core_fraction ligand_2_shared_core_fraction
0 182 33748 C#CCO[C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O C[Se][C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O [*:1]OCC#C>>[*:1][Se]C [*:1][C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O 1 10 14 12 0.714286 0.833333
1 232 33748 C#C[C@@H]1N[C@@H](C)[C@@H](O)[C@H]1O C[Se][C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O [*:1][C@@H]1[C@H]([*:2])[C@H](C)N[C@H]1C#C>>[*... [*:1]O.[*:2]O 2 2 10 12 0.200000 0.166667
2 232 33748 C#C[C@@H]1N[C@@H](C)[C@@H](O)[C@H]1O C[Se][C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O [*:1][C@@H]1[C@H]([*:2])[C@H](C)N[C@H]1C#C>>[*... [*:1]O.[*:2]O 2 2 10 12 0.200000 0.166667
3 232 33748 C#C[C@@H]1N[C@@H](C)[C@@H](O)[C@H]1O C[Se][C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O [*:1][C@@H]1[C@H]([*:2])[C@H](C)N[C@H]1C#C>>[*... [*:1]O.[*:2]O 2 2 10 12 0.200000 0.166667
4 232 33748 C#C[C@@H]1N[C@@H](C)[C@@H](O)[C@H]1O C[Se][C@@H]1O[C@@H](C)[C@@H](O)[C@@H](O)[C@@H]1O [*:1][C@@H]1[C@H](O)[C@H]([*:2])N[C@H]1C#C>>[*... [*:2]C.[*:1]O 2 2 10 12 0.200000 0.166667