import gradio as gr
import plotly.graph_objects as go
import numpy as np
import pandas as pd
from model.model import DTIModel
import spaces
dt_str = "14062024_0910"
def make_spider_plot(predictions, model_names, smiles_list):
fig = go.Figure()
for i, (prediction, smiles) in enumerate(zip(predictions, smiles_list)):
fig.add_trace(go.Scatterpolar(
r=prediction,
theta=model_names,
fill='toself',
name=smiles
))
fig.update_layout(
polar=dict(
radialaxis=dict(
visible=True,
range=[0, 1]
)),
showlegend=True
)
return fig
@spaces.GPU
def predict_and_plot(amino_acid_sequence, smiles_input, datasets):
model_ensemble = {}
gbm_model_paths = {
"BindingDB": f"model/xgb_models/xgb_model_BindingDB_{dt_str}_bt_optimized_0.json",
"BioSNAP": f"model/xgb_models/xgb_model_BIOSNAP_full_data_{dt_str}_bt_optimized_0.json",
"DAVIS": f"model/xgb_models/xgb_model_DAVIS_{dt_str}_bt_optimized_0.json",
"BarlowDTI XXL": f"model/xgb_models/{dt_str}_barlowdti_xxl_model.json",
}
for model in datasets:
print(f"Loading model {model}")
model_ensemble[model] = DTIModel(
bt_model_path=f"model/stash/{dt_str}",
gbm_model_path=gbm_model_paths[model],
)
smiles_list = smiles_input.strip().split('\n')
predictions = []
for model in model_ensemble.values():
model_predictions = model.predict(smiles_list, amino_acid_sequence)
predictions.append(model_predictions)
predictions = np.array(predictions).transpose().tolist()
df = pd.DataFrame(predictions, index=smiles_list, columns=datasets).reset_index()
df.columns = ["SMILES"] + datasets
fig = make_spider_plot(predictions, datasets, smiles_list)
return fig, df
dataset_names = [
"BarlowDTI XXL",
"BindingDB",
"BioSNAP",
"DAVIS",
]
title = "Predict Drug-Target Interactions with BarlowDTI"
description = """
Enter the amino acid sequence and SMILES to get interaction predictions visualized as a spider graph and in a table.
The values can be interpreted as the probability of interaction between the drug and the target (0 = no interaction, 1 = interaction).
Thank you for using BarlowDTI!
*Note: Thanks to ZeroGPU, you can run this model on a GPU for free.*
"""
article = """
This interface lets the scientific community use BarlowDTIXXL to predict drug-target interactions.
The model ensemble consists of four models trained on different datasets: our own curated and refined dataset based on
[Golts et. al](https://doi.org/10.48550/arXiv.2401.17174)
in combination with
[BindingDB](https://doi.org/10.1093/nar/gkl999),
[BioSNAP](https://snap.stanford.edu/index.html), and
[DAVIS](https://doi.org/10.1038/nbt.1990).
If you use our model in your research, please cite our paper:
```
@misc{schuh2024barlowtwinsdeepneural,
title={Barlow Twins Deep Neural Network for Advanced 1D Drug-Target Interaction Prediction},
author={Maximilian G. Schuh and Davide Boldini and Annkathrin I. Bohne and Stephan A. Sieber},
year={2024},
eprint={2408.00040},
archivePrefix={arXiv},
primaryClass={q-bio.BM},
url={https://arxiv.org/abs/2408.00040},
}
```
"""
theme = gr.themes.Base(
primary_hue="violet",
font=[gr.themes.GoogleFont('IBM Plex Sans'), 'ui-sans-serif', 'system-ui', 'sans-serif'],
)
iface = gr.Interface(
fn=predict_and_plot,
inputs=[
gr.Textbox(label="Protein Sequence", info="Just one sequence is allowed. Remove FASTA syntax (e.g. > ABC).", placeholder="MRSWSTVMLAVLATAATVFGHDADPEMKMTTPQIIMRWGYPAMIYDVTTEDGYILELHRI"),
gr.Textbox(label="Molecule SMILES", info="One per line, multiple allowed.", placeholder="C1CSSC1CCCCC(=O)O\nCC1=CC(=C(C=C1)C(=O)O)O"),
gr.CheckboxGroup(choices=dataset_names, label="Select Models for Prediction", value="BarlowDTI XXL")
],
outputs=[
gr.Plot(label="Predictions Visualization"),
gr.DataFrame(label="Predictions DataFrame"),
],
title=title,
description=description,
article=article,
theme=theme
)
iface.launch()