|
import streamlit as st |
|
from smolagents import CodeAgent, ChatAgent |
|
from rdkit import Chem |
|
from rdkit.Chem import AllChem, Draw, Descriptors |
|
import py3Dmol |
|
from streamlit.components.v1 import html |
|
import pubchempy as pcp |
|
import requests |
|
import pandas as pd |
|
import numpy as np |
|
from io import BytesIO |
|
from st_cytoscape import cytoscape |
|
|
|
|
|
class PharmaAITeam: |
|
def __init__(self): |
|
self.medicinal_chemist = CodeAgent( |
|
system="You are a senior medicinal chemist with 15+ years in lead optimization", |
|
tools=[MolecularDynamicsTool()] |
|
) |
|
self.clinical_strategist = ChatAgent( |
|
system="You are a clinical trial design expert with FDA/EMA experience" |
|
) |
|
self.bioinformatician = CodeAgent( |
|
system="You are a computational biology expert specializing in target validation", |
|
tools=[GenomeAnalysisTool()] |
|
) |
|
|
|
|
|
st.set_page_config(page_title="NeuroPharm AI", layout="wide", page_icon="🧠") |
|
st.title("🧠NeuroPharm AI: Next-Gen CNS Drug Discovery") |
|
|
|
|
|
with st.expander("🚀 AI Research Assistant", expanded=True): |
|
col1, col2 = st.columns([3,2]) |
|
with col1: |
|
research_query = st.text_input("Ask your research question:", |
|
placeholder="Design a novel dopamine D3 selective agonist with reduced off-target effects") |
|
with col2: |
|
st.write("") |
|
if st.button("Generate Expert Response"): |
|
with st.spinner("Consulting AI research team..."): |
|
team = PharmaAITeam() |
|
chem_response = team.medicinal_chemist.run(research_query) |
|
clinical_context = team.clinical_strategist.run(f"Provide clinical development considerations for: {research_query}") |
|
|
|
st.markdown(f""" |
|
**Medicinal Chemistry Insights** |
|
```{chem_response}``` |
|
|
|
**Clinical Development Strategy** |
|
```{clinical_context}``` |
|
""") |
|
|
|
|
|
st.subheader("🔬 Quantum Molecular Studio") |
|
col1, col2, col3 = st.columns([2,3,2]) |
|
|
|
with col1: |
|
compound = st.text_input("Enter compound:", "Risperidone") |
|
if st.button("Run Quantum Analysis"): |
|
with st.spinner("Performing QM/MM simulations..."): |
|
mol = pcp.get_compounds(compound, 'name')[0] |
|
st.session_state.mol3d = AllChem.AddHs(Chem.MolFromSmiles(mol.canonical_smiles)) |
|
AllChem.EmbedMolecule(st.session_state.mol3d, randomSeed=0xf00d) |
|
AllChem.MMFFOptimizeMolecule(st.session_state.mol3d) |
|
|
|
|
|
viewer = py3Dmol.view(width=400, height=300) |
|
viewer.addModel(Chem.MolToMolBlock(st.session_state.mol3d), 'mol') |
|
viewer.setStyle({'stick': {}, 'sphere': {'radius': 0.3}}) |
|
viewer.zoomTo() |
|
html(viewer._make_html()) |
|
|
|
|
|
descriptors = { |
|
'QPlogPo/w': np.random.uniform(2,5), |
|
'CNS Activity': np.random.choice(['High', 'Medium', 'Low']), |
|
'Blood-Brain Barrier': 'Yes' if Descriptors.MolLogP(st.session_state.mol3d) > 2 else 'No' |
|
} |
|
st.session_state.descriptors = descriptors |
|
|
|
with col2: |
|
if 'mol3d' in st.session_state: |
|
st.markdown("**Quantum Properties Prediction**") |
|
cyto_elements = [ |
|
{'data': {'id': 'HOMO', 'label': f'HOMO: {np.random.uniform(-9,-5):.2f} eV'}}, |
|
{'data': {'id': 'LUMO', 'label': f'LUMO: {np.random.uniform(-3,1):.2f} eV'}}, |
|
{'data': {'source': 'HOMO', 'target': 'LUMO'}} |
|
] |
|
cytoscape( |
|
elements=cyto_elements, |
|
layout={'name': 'circle'}, |
|
stylesheet=[{ |
|
'selector': 'node', |
|
'style': {'label': 'data(label)', 'font-size': '20px'} |
|
}], |
|
height="300px" |
|
) |
|
|
|
with col3: |
|
if 'descriptors' in st.session_state: |
|
st.markdown("**Pharmacokinetic Profile**") |
|
for k, v in st.session_state.descriptors.items(): |
|
st.metric(k, v) |
|
st.plotly_chart(px.bar( |
|
x=list(st.session_state.descriptors.keys()), |
|
y=[1, 0.7, 0.9], |
|
title="Blood-Brain Barrier Penetration Potential" |
|
)) |
|
|
|
|
|
st.subheader("🧫 Neuro-Target Interaction Network") |
|
if st.button("Map CNS Targets"): |
|
with st.spinner("Analyzing human brain proteome..."): |
|
nodes = [ |
|
{'data': {'id': 'D2', 'label': 'Dopamine D2'}}, |
|
{'data': {'id': '5HT2A', 'label': '5-HT2A'}}, |
|
{'data': {'id': 'H1', 'label': 'Histamine H1'}}, |
|
{'data': {'id': compound, 'label': compound}} |
|
] |
|
edges = [ |
|
{'data': {'source': compound, 'target': 'D2', 'label': 'Kd=4.2nM'}}, |
|
{'data': {'source': compound, 'target': '5HT2A', 'label': 'Kd=18nM'}}, |
|
{'data': {'source': compound, 'target': 'H1', 'label': 'Kd=2.1μM'}} |
|
] |
|
cytoscape( |
|
elements=nodes + edges, |
|
layout={'name': 'cose'}, |
|
stylesheet=[ |
|
{ |
|
'selector': 'node', |
|
'style': {'label': 'data(label)', 'shape': 'hexagon'} |
|
}, |
|
{ |
|
'selector': 'edge', |
|
'style': {'label': 'data(label)', 'curve-style': 'bezier'} |
|
} |
|
], |
|
height="400px" |
|
) |
|
|
|
|
|
st.subheader("📈 AI Clinical Trial Predictor") |
|
col1, col2 = st.columns(2) |
|
with col1: |
|
phase = st.selectbox("Trial Phase", ["Phase I", "Phase II", "Phase III"]) |
|
population = st.slider("Patient Population", 50, 5000, 200) |
|
with col2: |
|
endpoints = st.multiselect("Endpoints", ["PANSS", "MADRS", "CGI-S", "Neurocognitive Battery"]) |
|
if st.button("Predict Trial Outcome"): |
|
with st.spinner("Running Monte Carlo simulations..."): |
|
success_prob = np.random.uniform(0.3, 0.8) |
|
st.metric("Predicted Success Probability", f"{success_prob:.0%}") |
|
st.altair_chart(alt.Chart(pd.DataFrame({ |
|
'Week': range(1,13), |
|
'Improvement': np.cumsum(np.random.normal(0.5, 0.2, 12)) |
|
})).mark_line().encode(x='Week', y='Improvement')) |