| 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() |