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 |