|
from __future__ import annotations |
|
from pathlib import Path |
|
import time |
|
from biotite.application.autodock import VinaApp |
|
|
|
import gradio as gr |
|
|
|
from gradio_molecule3d import Molecule3D |
|
from gradio_molecule2d import molecule2d |
|
import numpy as np |
|
from rdkit import Chem |
|
from rdkit.Chem import AllChem |
|
import pandas as pd |
|
from biotite.structure import centroid, from_template |
|
from biotite.structure.io import load_structure |
|
from biotite.structure.io.mol import MOLFile, SDFile |
|
from biotite.structure.io.pdb import PDBFile |
|
|
|
from plinder.eval.docking.write_scores import evaluate |
|
|
|
|
|
EVAL_METRICS = ["system", "LDDT-PLI", "LDDT-LP", "BISY-RMSD"] |
|
|
|
EVAL_METRICS_PINDER = ["system","L_rms", "I_rms", "F_nat", "DOCKQ", "CAPRI_class"] |
|
|
|
|
|
|
|
|
|
|
|
def get_metrics( |
|
system_id: str, |
|
receptor_file: Path, |
|
ligand_file: Path, |
|
flexible: bool = True, |
|
posebusters: bool = True, |
|
methodname: str = "", |
|
store:bool =True |
|
) -> tuple[pd.DataFrame, float]: |
|
start_time = time.time() |
|
metrics = pd.DataFrame( |
|
[ |
|
evaluate( |
|
model_system_id=system_id, |
|
reference_system_id=system_id, |
|
receptor_file=receptor_file, |
|
ligand_file_list=[Path(ligand_file)], |
|
flexible=flexible, |
|
posebusters=posebusters, |
|
posebusters_full=False, |
|
).get("LIG_0", {}) |
|
] |
|
) |
|
if posebusters: |
|
metrics["posebusters"] = metrics[ |
|
[col for col in metrics.columns if col.startswith("posebusters_")] |
|
].sum(axis=1) |
|
metrics["posebusters_valid"] = metrics[ |
|
[col for col in metrics.columns if col.startswith("posebusters_")] |
|
].sum(axis=1) == 20 |
|
columns = ["reference", "lddt_pli_ave", "lddt_lp_ave", "bisy_rmsd_ave"] |
|
if flexible: |
|
columns.extend(["lddt", "bb_lddt"]) |
|
if posebusters: |
|
columns.extend([col for col in metrics.columns if col.startswith("posebusters")]) |
|
|
|
metrics = metrics[columns].copy() |
|
mapping = { |
|
"lddt_pli_ave": "LDDT-PLI", |
|
"lddt_lp_ave": "LDDT-LP", |
|
"bisy_rmsd_ave": "BISY-RMSD", |
|
"reference": "system", |
|
} |
|
if flexible: |
|
mapping["lddt"] = "LDDT" |
|
mapping["bb_lddt"] = "Backbone LDDT" |
|
if posebusters: |
|
mapping["posebusters"] = "PoseBusters #checks" |
|
mapping["posebusters_valid"] = "PoseBusters valid" |
|
metrics.rename( |
|
columns=mapping, |
|
inplace=True, |
|
) |
|
end_time = time.time() |
|
run_time = end_time - start_time |
|
return metrics, run_time |
|
|
|
|
|
def get_metrics_pinder( |
|
system_id: str, |
|
receptor_file: Path, |
|
ligand_file: Path, |
|
flexible: bool = True, |
|
posebusters: bool = True, |
|
methodname: str = "", |
|
store:bool =True |
|
) -> tuple[pd.DataFrame, float]: |
|
return pd.DataFrame(), 0 |
|
|
|
with gr.Blocks() as app: |
|
with gr.Tab("🧬 PINDER evaluation template"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
input_system_id_pinder = gr.Textbox(label="PINDER system ID") |
|
input_receptor_file_pinder = gr.File(label="Receptor file") |
|
input_ligand_file_pinder = gr.File(label="Ligand file") |
|
methodname_pinder = gr.Textbox(label="Name of your method in the format mlsb/spacename") |
|
store_pinder = gr.Checkbox(label="Store on huggingface for leaderboard", value=False) |
|
eval_btn_pinder = gr.Button("Run Evaluation") |
|
|
|
|
|
|
|
|
|
with gr.Tab("⚖️ PLINDER evaluation template"): |
|
with gr.Row(): |
|
with gr.Column(): |
|
input_system_id = gr.Textbox(label="PLINDER system ID") |
|
input_receptor_file = gr.File(label="Receptor file (CIF)") |
|
input_ligand_file = gr.File(label="Ligand file (SDF)") |
|
flexible = gr.Checkbox(label="Flexible docking", value=True) |
|
posebusters = gr.Checkbox(label="PoseBusters", value=True) |
|
methodname = gr.Textbox(label="Name of your method in the format mlsb/spacename") |
|
store = gr.Checkbox(label="Store on huggingface for leaderboard", value=False) |
|
|
|
eval_btn = gr.Button("Run Evaluation") |
|
gr.Examples( |
|
[ |
|
[ |
|
"4neh__1__1.B__1.H", |
|
"input_protein_test.cif", |
|
"input_ligand_test.sdf", |
|
True, |
|
True, |
|
], |
|
], |
|
[input_system_id, input_receptor_file, input_ligand_file, flexible, posebusters, methodname, store], |
|
) |
|
eval_run_time = gr.Textbox(label="Evaluation runtime") |
|
metric_table = gr.DataFrame( |
|
pd.DataFrame([], columns=EVAL_METRICS), label="Evaluation metrics" |
|
) |
|
|
|
metric_table_pinder = gr.DataFrame( |
|
pd.DataFrame([], columns=EVAL_METRICS_PINDER), label="Evaluation metrics" |
|
) |
|
|
|
eval_btn.click( |
|
get_metrics, |
|
inputs=[input_system_id, input_receptor_file, input_ligand_file, flexible, posebusters], |
|
outputs=[metric_table, eval_run_time], |
|
) |
|
eval_btn_pinder.click( |
|
get_metrics_pinder, |
|
inputs=[input_system_id_pinder, input_receptor_file_pinder, input_ligand_file_pinder, methodname_pinder, store_pinder], |
|
outputs=[metric_table_pinder, eval_run_time], |
|
) |
|
|
|
app.launch() |