|
import gradio as gr |
|
from transformers import pipeline |
|
from rdkit import Chem |
|
from rdkit.Chem import AllChem |
|
from rdkit.Chem.Draw import rdMolDraw2D |
|
from rdkit.Chem import rdDepictor |
|
import base64 |
|
from io import BytesIO |
|
import py3Dmol |
|
import re |
|
|
|
|
|
def drug_discovery(disease, symptoms): |
|
|
|
bio_gpt = pipeline("text-generation", model="microsoft/BioGPT-Large") |
|
prompt = f"Recent treatments for {disease} with symptoms: {symptoms}." |
|
literature = bio_gpt(prompt, max_length=200)[0]['generated_text'] |
|
|
|
|
|
molecule_prompt = f"List 5 different valid drug-like SMILES strings that can treat {disease} with symptoms {symptoms}. Only list SMILES separated by spaces." |
|
smiles_result = bio_gpt(molecule_prompt, max_length=100)[0]['generated_text'] |
|
|
|
|
|
smiles_matches = re.findall(r"(?<![A-Za-z0-9])[A-Za-z0-9@+\-\[\]\(\)=#$]{5,}(?![A-Za-z0-9])", smiles_result) |
|
smiles = None |
|
for match in smiles_matches: |
|
mol_test = Chem.MolFromSmiles(match) |
|
if mol_test: |
|
smiles = match |
|
break |
|
if not smiles: |
|
smiles = "C1=CC=CC=C1" |
|
|
|
|
|
mol = Chem.MolFromSmiles(smiles) |
|
if not mol: |
|
return "Invalid SMILES generated", smiles, "", "" |
|
|
|
AllChem.Compute2DCoords(mol) |
|
|
|
|
|
drawer = rdMolDraw2D.MolDraw2DCairo(300, 300) |
|
drawer.DrawMolecule(mol) |
|
drawer.FinishDrawing() |
|
img_data = drawer.GetDrawingText() |
|
|
|
|
|
img_base64 = base64.b64encode(img_data).decode("utf-8") |
|
img_html = f'''<div style="text-align:center; margin-top: 10px; animation: fadeIn 2s ease-in-out;"> |
|
<img src="data:image/png;base64,{img_base64}" alt="2D Molecule" |
|
style="border-radius: 16px; box-shadow: 0 6px 20px rgba(0,255,255,0.3); border: 1px solid #444;"> |
|
<div style='font-family: Arial, sans-serif; color: #eeeeee; margin-top: 8px; animation: slideUp 1.5s ease-in-out;'>π Visualized Drug Molecule (2D)</div> |
|
</div>''' |
|
|
|
|
|
mol3d = Chem.AddHs(mol) |
|
AllChem.EmbedMolecule(mol3d) |
|
AllChem.UFFOptimizeMolecule(mol3d) |
|
mb = Chem.MolToMolBlock(mol3d) |
|
|
|
viewer = py3Dmol.view(width=420, height=420) |
|
viewer.addModel(mb, "mol") |
|
viewer.setStyle({"stick": {"colorscheme": "cyanCarbon"}}) |
|
viewer.setBackgroundColor("black") |
|
viewer.zoomTo() |
|
viewer.spin(True) |
|
viewer_html_raw = viewer._make_html() |
|
|
|
viewer_html = f''' |
|
<div style="text-align:center; margin-top: 20px; animation: zoomIn 2s ease-in-out;"> |
|
<iframe srcdoc="{viewer_html_raw.replace('"', '"')}" |
|
width="440" height="440" frameborder="0" |
|
style="border-radius: 16px; box-shadow: 0 8px 30px rgba(0,255,255,0.35);"></iframe> |
|
<div style='font-family: Arial, sans-serif; color: #eeeeee; margin-top: 8px; animation: slideUp 1.5s ease-in-out;'>𧬠Animated 3D Molecule (Stick View)</div> |
|
</div>''' |
|
|
|
return literature, smiles, img_html, viewer_html |
|
|
|
|
|
disease_input = gr.Textbox(label="π₯ Enter Disease (e.g., lung cancer)", value="lung cancer") |
|
symptom_input = gr.Textbox(label="π Enter Symptoms (e.g., cough, weight loss)", value="shortness of breath, weight loss") |
|
lit_output = gr.Textbox(label="π° Literature Insights from BioGPT") |
|
smiles_output = gr.Textbox(label="π§ͺ SMILES Representation") |
|
img_output = gr.HTML(label="πΌοΈ Molecule 2D Visualization") |
|
viewer_output = gr.HTML(label="π¬ 3D Drug Molecule Animation") |
|
|
|
custom_css = """ |
|
@keyframes fadeIn { |
|
from {opacity: 0;} |
|
to {opacity: 1;} |
|
} |
|
|
|
@keyframes slideUp { |
|
from {transform: translateY(40px); opacity: 0;} |
|
to {transform: translateY(0); opacity: 1;} |
|
} |
|
|
|
@keyframes zoomIn { |
|
from {transform: scale(0.5); opacity: 0;} |
|
to {transform: scale(1); opacity: 1;} |
|
} |
|
|
|
body { |
|
background: linear-gradient(to right, #0f2027, #203a43, #2c5364); |
|
color: #eeeeee; |
|
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; |
|
} |
|
|
|
.gradio-container { |
|
animation: fadeIn 1.5s ease-in-out; |
|
} |
|
|
|
.gradio-container .block-label { |
|
color: #ffffff; |
|
} |
|
""" |
|
|
|
iface = gr.Interface( |
|
fn=drug_discovery, |
|
inputs=[disease_input, symptom_input], |
|
outputs=[lit_output, smiles_output, img_output, viewer_output], |
|
title="π₯ AI-Powered Drug Discovery for Hospitals", |
|
description="This hospital-themed platform takes a disease and symptoms as input, retrieves biomedical insights using BioGPT, and visualizes potential drug molecules in 2D and animated 3D. Ideal for clinical research and pharma innovation.", |
|
theme="default", |
|
css=custom_css |
|
) |
|
|
|
iface.launch(share=True) |
|
|