Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from rdkit import Chem | |
| from rdkit.Chem import Descriptors | |
| import pandas as pd | |
| import io | |
| import base64 | |
| # تحليل ADMET | |
| def get_admet(smiles): | |
| mol = Chem.MolFromSmiles(smiles) | |
| if not mol: | |
| return pd.Series([None]*7, index=["MW", "LogP", "TPSA", "HBA", "HBD", "RotB", "Lipinski"]) | |
| mw = Descriptors.MolWt(mol) | |
| logp = Descriptors.MolLogP(mol) | |
| tpsa = Descriptors.TPSA(mol) | |
| hba = Descriptors.NumHAcceptors(mol) | |
| hbd = Descriptors.NumHDonors(mol) | |
| rotb = Descriptors.NumRotatableBonds(mol) | |
| lipinski = "✅" if (mw <= 500 and logp <= 5 and hba <= 10 and hbd <= 5) else "❌" | |
| return pd.Series([mw, logp, tpsa, hba, hbd, rotb, lipinski], | |
| index=["MW", "LogP", "TPSA", "HBA", "HBD", "RotB", "Lipinski"]) | |
| # المعالجة الرئيسية | |
| def analyze_smiles(file): | |
| try: | |
| with open(file.name, "r", encoding="utf-8") as f: | |
| content = f.read() | |
| smiles_list = [line.strip() for line in content.splitlines() if line.strip()] | |
| df = pd.DataFrame({"SMILES": smiles_list}) | |
| admet_df = df["SMILES"].apply(get_admet) | |
| final_df = pd.concat([df, admet_df], axis=1) | |
| # Excel file | |
| excel_buffer = io.BytesIO() | |
| final_df.to_excel(excel_buffer, index=False, engine="openpyxl") | |
| excel_data = excel_buffer.getvalue() | |
| excel_b64 = base64.b64encode(excel_data).decode() | |
| # Markdown table | |
| try: | |
| import tabulate # Try to import it explicitly | |
| table_md = final_df.to_markdown(index=False) | |
| except ImportError: | |
| table_md = "❌ مكتبة 'tabulate' مطلوبة لعرض الجدول. استخدم: pip install tabulate" | |
| return ( | |
| "✅ التحليل ناجح!", | |
| table_md, | |
| f'<a download="ADMET_Analysis.xlsx" href="data:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;base64,{excel_b64}">⬇️ تحميل ملف Excel</a>' | |
| ) | |
| except Exception as e: | |
| return f"❌ خطأ أثناء المعالجة: {str(e)}", "", "" | |
| # واجهة Gradio | |
| with gr.Blocks() as demo: | |
| gr.Markdown("## 🧪 تحليل ADMET من قائمة SMILES") | |
| with gr.Row(): | |
| smiles_file = gr.File(label="📄 ارفع ملف .txt يحتوي على SMILES") | |
| run_btn = gr.Button("🚀 تحليل ADMET") | |
| status = gr.Textbox(label="📢 الحالة") | |
| table = gr.Textbox(label="📊 جدول النتائج (Markdown)", lines=12) | |
| download = gr.HTML() | |
| run_btn.click(fn=analyze_smiles, inputs=[smiles_file], outputs=[status, table, download]) | |
| demo.launch() | |