TEZv commited on
Commit
c443c56
·
verified ·
1 Parent(s): 73a1ee1

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +338 -188
app.py CHANGED
@@ -593,6 +593,8 @@ def plot_corona():
593
  # ========== CSS ==========
594
  css = f"""
595
  body, .gradio-container {{ background: {BG} !important; color: {TXT} !important; }}
 
 
596
  .outer-tabs .tab-nav button {{
597
  color: {TXT} !important;
598
  background: {CARD} !important;
@@ -606,6 +608,8 @@ body, .gradio-container {{ background: {BG} !important; color: {TXT} !important;
606
  color: {ACC} !important;
607
  background: {BG} !important;
608
  }}
 
 
609
  .inner-tabs .tab-nav button {{
610
  color: {DIM} !important;
611
  background: {BG} !important;
@@ -629,6 +633,20 @@ body, .gradio-container {{ background: {BG} !important; color: {TXT} !important;
629
  border-radius: 0 6px 6px 6px !important;
630
  padding: 14px !important;
631
  }}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
632
  h1, h2, h3 {{ color: {ACC} !important; }}
633
  .gr-button-primary {{ background: {ACC} !important; border: none !important; }}
634
  footer {{ display: none !important; }}
@@ -665,11 +683,15 @@ MAP_HTML = f"""
665
  &nbsp;&nbsp;&nbsp;├─ <b>S1-F · R1a</b> DIPG toolkit (H3K27M + CSF LNP + Circadian) <span style="color:#f59e0b"> 🔶</span><br>
666
  &nbsp;&nbsp;&nbsp;├─ <b>S1-F · R2a</b> UVM toolkit (GNAQ/GNA11 + vitreous + m6A) <span style="color:#f59e0b"> 🔶</span><br>
667
  &nbsp;&nbsp;&nbsp;└─ <b>S1-F · R3a</b> pAML toolkit (FLT3-ITD + BM niche + ferroptosis) <span style="color:#f59e0b"> 🔶</span><br><br>
 
 
 
 
668
  <span style="color:{DIM};font-size:11px">✅ Active · 🔶 In progress · 🔴 Planned</span>
669
  </div>
670
  """
671
 
672
- # ========== ІНТЕРФЕЙС ==========
673
  with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
674
  gr.Markdown(
675
  "# 🔬 K R&D Lab · Science Sphere — S1 Biomedical\n"
@@ -683,202 +705,330 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
683
  gr.HTML(MAP_HTML)
684
 
685
  # === S1-A · PHYLO-GENOMICS ===
686
- with gr.TabItem("S1-A · R1a · OpenVariant"):
687
- gr.HTML(proj_badge("S1-A · R1a", "OpenVariant — SNV Pathogenicity Classifier", "AUC = 0.939"))
688
- hgvs = gr.Textbox(label="HGVS notation", placeholder="BRCA1:p.R1699Q")
689
- gr.Markdown("**Or enter functional scores manually:**")
690
- with gr.Row():
691
- sift = gr.Slider(0,1,value=0.5,step=0.01,label="SIFT (0=damaging)")
692
- pp = gr.Slider(0,1,value=0.5,step=0.01,label="PolyPhen-2")
693
- gn = gr.Slider(0,0.01,value=0.001,step=0.0001,label="gnomAD AF")
694
- b_v = gr.Button("Predict Pathogenicity", variant="primary")
695
- o_v = gr.HTML()
696
- gr.Examples([["BRCA1:p.R1699Q",0.82,0.05,0.0012],
697
- ["TP53:p.R248W",0.00,1.00,0.0],
698
- ["BRCA2:p.D2723A",0.01,0.98,0.0]], inputs=[hgvs,sift,pp,gn], cache_examples=False)
699
- b_v.click(predict_variant, [hgvs,sift,pp,gn], o_v)
700
-
701
- with gr.TabItem("S1-A · R1b · Somatic Classifier 🔶"):
702
- gr.HTML(proj_badge("S1-A · R1b", "Somatic Mutation Classifier", "🔶 In progress"))
703
- gr.Markdown("> This module is in active development. Coming in the next release.")
 
 
 
 
 
 
 
 
 
704
 
705
  # === S1-B · PHYLO-RNA ===
706
- with gr.TabItem("S1-B · R1a · BRCA2 miRNA"):
707
- gr.HTML(proj_badge("S1-B · R1a", "miRNA Silencing — BRCA1/2 · TP53"))
708
- g1 = gr.Dropdown(["BRCA2","BRCA1","TP53"], value="BRCA2", label="Gene")
709
- b1 = gr.Button("Find miRNAs", variant="primary")
710
- o1 = gr.Dataframe(label="Top 5 downregulated miRNAs")
711
- gr.Examples([["BRCA2"],["BRCA1"],["TP53"]], inputs=[g1])
712
- b1.click(predict_mirna, [g1], o1)
713
-
714
- with gr.TabItem("S1-B · R2a · TP53 siRNA"):
715
- gr.HTML(proj_badge("S1-B · R2a", "siRNA Synthetic Lethal — TP53-null"))
716
- g2 = gr.Dropdown(["LUAD","BRCA","COAD"], value="LUAD", label="Cancer type")
717
- b2 = gr.Button("Find Targets", variant="primary")
718
- o2 = gr.Dataframe(label="Top 5 synthetic lethal targets")
719
- gr.Examples([["LUAD"],["BRCA"],["COAD"]], inputs=[g2], cache_examples=False)
720
- b2.click(predict_sirna, [g2], o2)
721
-
722
- with gr.TabItem("S1-B · R3a · lncRNA-TREM2"):
723
- gr.HTML(proj_badge("S1-B · R3a", "lncRNA-TREM2 ceRNA Network"))
724
- b3 = gr.Button("Load Network", variant="primary")
725
- o3 = gr.Dataframe(label="ceRNA Network")
726
- b3.click(get_lncrna, [], o3)
727
-
728
- with gr.TabItem("S1-B · R3b · ASO Designer"):
729
- gr.HTML(proj_badge("S1-B · R3b", "ASO Candidates"))
730
- b4 = gr.Button("Show ASOs", variant="primary")
731
- o4 = gr.Dataframe(label="ASO Candidates")
732
- b4.click(get_aso, [], o4)
 
 
 
 
 
 
 
 
 
 
 
 
733
 
734
  # === S1-C · PHYLO-DRUG ===
735
- # Розкоментовано проблемну вкладку "оце" - FGFR3
736
- with gr.TabItem("S1-C · R1a · FGFR3 RNA Drug"):
737
- gr.HTML(proj_badge("S1-C · R1a", "FGFR3 RNA-Directed Drug Discovery", "top score 0.793"))
738
- g4 = gr.Radio(["P1 (hairpin loop)","P10 (G-quadruplex)"],
739
- value="P1 (hairpin loop)", label="Target pocket")
740
- b4_drug = gr.Button("Screen Compounds", variant="primary")
741
- o4t = gr.Dataframe(label="Top 5 candidates")
742
- o4p = gr.Image(label="Binding scores")
743
- gr.Examples([["P1 (hairpin loop)"],["P10 (G-quadruplex)"]], inputs=[g4])
744
- b4_drug.click(predict_drug, [g4], [o4t, o4p])
745
-
746
- with gr.TabItem("S1-C · R1b · SL Drug Mapping 🔶"):
747
- gr.HTML(proj_badge("S1-C · R1b", "Synthetic Lethal Drug Mapping", "🔶 In progress"))
748
- gr.Markdown("> Coming soon.")
749
-
750
- with gr.TabItem("S1-C · R2a · Frontier 🔴"):
751
- gr.HTML(proj_badge("S1-C · R2a", "m6A × Ferroptosis × Circadian", "🔴 Frontier"))
752
- gr.Markdown("> Planned for Q3 2026")
 
 
 
 
 
 
 
 
 
 
 
 
 
753
 
754
  # === S1-D · PHYLO-LNP ===
755
- with gr.TabItem("S1-D · R1a · LNP Corona"):
756
- gr.HTML(proj_badge("S1-D · R1a", "LNP Protein Corona (Serum)", "AUC = 0.791"))
757
- with gr.Row():
758
- sz = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
759
- zt = gr.Slider(-40,10,value=-5,step=1,label="Zeta (mV)")
760
- with gr.Row():
761
- pg = gr.Slider(0,5,value=1.5,step=0.1,label="PEG mol%")
762
- lp = gr.Dropdown(["Ionizable","Cationic","Anionic","Neutral"],value="Ionizable",label="Lipid type")
763
- b6 = gr.Button("Predict", variant="primary")
764
- o6 = gr.Markdown()
765
- gr.Examples([[100,-5,1.5,"Ionizable"],[80,5,0.5,"Cationic"]], inputs=[sz,zt,pg,lp])
766
- b6.click(predict_corona, [sz,zt,pg,lp], o6)
767
-
768
- # Розкоментовано проблемну вкладку "оце" - Flow Corona
769
- with gr.TabItem("S1-D · R2a · Flow Corona"):
770
- gr.HTML(proj_badge("S1-D · R2a", "Flow Corona — Vroman Effect"))
771
- with gr.Row():
772
- s8 = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
773
- z8 = gr.Slider(-40,10,value=-5,step=1,label="Zeta (mV)")
774
- pg8 = gr.Slider(0,5,value=1.5,step=0.1,label="PEG mol%")
775
- with gr.Row():
776
- ch8 = gr.Dropdown(["Ionizable","Cationic","Anionic","Neutral"],value="Ionizable",label="Charge")
777
- fl8 = gr.Slider(0,40,value=20,step=1,label="Flow cm/s")
778
- b8 = gr.Button("Model Vroman Effect", variant="primary")
779
- o8t = gr.Markdown()
780
- o8p = gr.Image(label="Kinetics")
781
- gr.Examples([[100,-5,1.5,"Ionizable",40],[150,5,0.5,"Cationic",10]], inputs=[s8,z8,pg8,ch8,fl8])
782
- b8.click(predict_flow, [s8,z8,pg8,ch8,fl8], [o8t,o8p])
783
-
784
- # Розкоментовано проблемну вкладку "оце" - LNP Brain
785
- with gr.TabItem("S1-D · R3a · LNP Brain"):
786
- gr.HTML(proj_badge("S1-D · R3a", "LNP Brain Delivery — ApoE% + BBB probability"))
787
- smi = gr.Textbox(label="Ionizable lipid SMILES",
788
- value="CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C")
789
- with gr.Row():
790
- pk = gr.Slider(4,8,value=6.5,step=0.1,label="pKa")
791
- zt9 = gr.Slider(-20,10,value=-3,step=1,label="Zeta (mV)")
792
- b9 = gr.Button("Predict BBB Crossing", variant="primary")
793
- o9t = gr.Markdown()
794
- o9p = gr.Image(label="Radar profile")
795
- gr.Examples([["CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C",6.5,-3]], inputs=[smi,pk,zt9])
796
- b9.click(predict_bbb, [smi,pk,zt9], [o9t,o9p])
797
-
798
- # Розкоментовано проблемну вкладку "оце" - AutoCorona NLP
799
- with gr.TabItem("S1-D · R4a · AutoCorona NLP"):
800
- gr.HTML(proj_badge("S1-D · R4a", "AutoCorona NLP — from abstracts", "F1 = 0.71"))
801
- txt = gr.Textbox(lines=5,label="Paper abstract",placeholder="Paste abstract here...")
802
- b10 = gr.Button("Extract Data", variant="primary")
803
- o10j = gr.Code(label="Extracted JSON", language="json")
804
- o10f = gr.Textbox(label="Validation flags")
805
- gr.Examples([[
806
- "LNPs composed of MC3, DSPC, Cholesterol (50:10:40 mol%) with 1.5% PEG-DMG. "
807
- "Hydrodynamic diameter was 98 nm, zeta potential -3.2 mV, PDI 0.12. "
808
- "Incubated in human plasma. Corona: albumin, apolipoprotein E, fibrinogen."
809
- ]], inputs=[txt])
810
- b10.click(extract_corona, txt, [o10j, o10f])
811
-
812
- with gr.TabItem("S1-D · R5a · CSF/BM 🔴"):
813
- gr.HTML(proj_badge("S1-D · R5a", "LNP Corona in CSF · Vitreous · Bone Marrow", "🔴 0 prior studies"))
814
- gr.Markdown("> Planned for Q2–Q3 2026")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
815
  # === S1-E · PHYLO-BIOMARKERS ===
816
- # Розкоментовано проблемну вкладку "оце" - Liquid Biopsy
817
- with gr.TabItem("S1-E · R1a · Liquid Biopsy"):
818
- gr.HTML(proj_badge("S1-E · R1a", "Liquid Biopsy Classifier", "AUC = 0.992*"))
819
- with gr.Row():
820
- p1=gr.Slider(-3,3,value=0,step=0.1,label="CTHRC1")
821
- p2=gr.Slider(-3,3,value=0,step=0.1,label="FHL2")
822
- p3=gr.Slider(-3,3,value=0,step=0.1,label="LDHA")
823
- p4=gr.Slider(-3,3,value=0,step=0.1,label="P4HA1")
824
- p5=gr.Slider(-3,3,value=0,step=0.1,label="SERPINH1")
825
- with gr.Row():
826
- p6=gr.Slider(-3,3,value=0,step=0.1,label="ABCA8")
827
- p7=gr.Slider(-3,3,value=0,step=0.1,label="CA4")
828
- p8=gr.Slider(-3,3,value=0,step=0.1,label="CKB")
829
- p9=gr.Slider(-3,3,value=0,step=0.1,label="NNMT")
830
- p10=gr.Slider(-3,3,value=0,step=0.1,label="CACNA2D2")
831
- b7=gr.Button("Classify", variant="primary")
832
- o7t=gr.HTML()
833
- o7p=gr.Image(label="Feature contributions")
834
- gr.Examples([[2,2,1.5,1.8,1.6,-1,-1.2,-0.8,1.4,-1.1],[0]*10],
835
- inputs=[p1,p2,p3,p4,p5,p6,p7,p8,p9,p10])
836
- b7.click(predict_cancer, [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10], [o7t,o7p])
837
-
838
- with gr.TabItem("S1-E · R1b · Validator 🔶"):
839
- gr.HTML(proj_badge("S1-E · R1b", "Protein Panel Validator", "🔶 In progress"))
840
- gr.Markdown("> Coming next.")
 
 
 
 
 
 
841
 
842
  # === S1-F · PHYLO-RARE ===
843
- # Розкоментовано проблемну вкладку "оце" - DIPG
844
- with gr.TabItem("S1-F · R1a · DIPG Toolkit"):
845
- gr.HTML(proj_badge("S1-F · R1a", "DIPG: H3K27M + CSF LNP + Circadian", "PBTA"))
846
- sort_d = gr.Radio(["Frequency", "Drug status"], value="Frequency", label="Sort by")
847
- b_dv = gr.Button("Load DIPG Variants", variant="primary")
848
- o_dv = gr.Dataframe(label="H3K27M co-mutations")
849
- b_dv.click(dipg_variants, [sort_d], o_dv)
850
- gr.Markdown("---")
851
- with gr.Row():
852
- d_peg = gr.Slider(0.5, 3.0, value=1.5, step=0.1, label="PEG mol%")
853
- d_size = gr.Slider(60, 150, value=90, step=5, label="Target size (nm)")
854
- b_dc = gr.Button("Rank CSF Formulations", variant="primary")
855
- o_dct = gr.Dataframe(label="CSF LNP ranking")
856
- o_dcp = gr.Image(label="ApoE% in CSF corona")
857
- b_dc.click(dipg_csf, [d_peg, d_size], [o_dct, o_dcp])
858
-
859
- # Розкоментовано проблемну вкладку "оце" - UVM
860
- with gr.TabItem("S1-F · R2a · UVM Toolkit"):
861
- gr.HTML(proj_badge("S1-F · R2a", "UVM: GNAQ/GNA11 + vitreous + m6A", "TCGA-UVM"))
862
- b_uv = gr.Button("Load UVM Variants", variant="primary")
863
- o_uv = gr.Dataframe(label="GNAQ/GNA11 map")
864
- b_uv.click(uvm_variants, [], o_uv)
865
- b_uw = gr.Button("Rank Vitreous Formulations", variant="primary")
866
- o_uwt = gr.Dataframe(label="Vitreous LNP retention ranking")
867
- o_uwp = gr.Image(label="Retention (hours)")
868
- b_uw.click(uvm_vitreous, [], [o_uwt, o_uwp])
869
-
870
- # Розкоментовано проблемну вкладку "оце" - pAML
871
- with gr.TabItem("S1-F · R3a · pAML Toolkit"):
872
- gr.HTML(proj_badge("S1-F · R3a", "pAML: FLT3-ITD + BM niche + ferroptosis", "TARGET-AML"))
873
- var_sel = gr.Dropdown(
874
- ["FLT3-ITD", "NPM1 c.860_863dupTCAG", "DNMT3A p.R882H",
875
- "CEBPA biallelic", "IDH1/2 mutation"],
876
- value="FLT3-ITD", label="Select variant"
877
- )
878
- b_pf = gr.Button("Analyze Ferroptosis Profile", variant="primary")
879
- o_pft = gr.HTML()
880
- o_pfp = gr.Image(label="Target radar")
881
- b_pf.click(paml_ferroptosis, var_sel, [o_pft, o_pfp])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
882
 
883
  # === S1-G · 3D Lab (НОВА ВКЛАДКА) ===
884
  with gr.TabItem("🧊 3D Lab"):
 
593
  # ========== CSS ==========
594
  css = f"""
595
  body, .gradio-container {{ background: {BG} !important; color: {TXT} !important; }}
596
+
597
+ /* OUTER tab bar — PHYLO categories (S1-A, S1-B, ...) */
598
  .outer-tabs .tab-nav button {{
599
  color: {TXT} !important;
600
  background: {CARD} !important;
 
608
  color: {ACC} !important;
609
  background: {BG} !important;
610
  }}
611
+
612
+ /* INNER sub-tab bar — R1, R2, R3 (напрямки) */
613
  .inner-tabs .tab-nav button {{
614
  color: {DIM} !important;
615
  background: {BG} !important;
 
633
  border-radius: 0 6px 6px 6px !important;
634
  padding: 14px !important;
635
  }}
636
+
637
+ /* Третій рівень вкладок — a, b (експерименти) */
638
+ .sub-sub-tabs .tab-nav button {{
639
+ color: {DIM} !important;
640
+ background: {CARD} !important;
641
+ font-size: 11px !important;
642
+ padding: 3px 8px !important;
643
+ border-radius: 3px 3px 0 0 !important;
644
+ }}
645
+ .sub-sub-tabs .tab-nav button.selected {{
646
+ color: {ACC} !important;
647
+ background: {BG} !important;
648
+ }}
649
+
650
  h1, h2, h3 {{ color: {ACC} !important; }}
651
  .gr-button-primary {{ background: {ACC} !important; border: none !important; }}
652
  footer {{ display: none !important; }}
 
683
  &nbsp;&nbsp;&nbsp;├─ <b>S1-F · R1a</b> DIPG toolkit (H3K27M + CSF LNP + Circadian) <span style="color:#f59e0b"> 🔶</span><br>
684
  &nbsp;&nbsp;&nbsp;├─ <b>S1-F · R2a</b> UVM toolkit (GNAQ/GNA11 + vitreous + m6A) <span style="color:#f59e0b"> 🔶</span><br>
685
  &nbsp;&nbsp;&nbsp;└─ <b>S1-F · R3a</b> pAML toolkit (FLT3-ITD + BM niche + ferroptosis) <span style="color:#f59e0b"> 🔶</span><br><br>
686
+ <span style="color:{ACC2};font-weight:600">S1-G · PHYLO-SIM</span> — 3D Models & Simulations<br>
687
+ &nbsp;&nbsp;&nbsp;├─ <b>Nanoparticle</b> Interactive 3D model <span style="color:{GRN}"> ✅</span><br>
688
+ &nbsp;&nbsp;&nbsp;├─ <b>DNA Helix</b> Double helix visualization <span style="color:{GRN}"> ✅</span><br>
689
+ &nbsp;&nbsp;&nbsp;└─ <b>Protein Corona</b> Schematic corona <span style="color:{GRN}"> ✅</span><br><br>
690
  <span style="color:{DIM};font-size:11px">✅ Active · 🔶 In progress · 🔴 Planned</span>
691
  </div>
692
  """
693
 
694
+ # ========== ІНТЕРФЕЙС З ТРЬОМА РІВНЯМИ ВКЛАДОК ==========
695
  with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
696
  gr.Markdown(
697
  "# 🔬 K R&D Lab · Science Sphere — S1 Biomedical\n"
 
705
  gr.HTML(MAP_HTML)
706
 
707
  # === S1-A · PHYLO-GENOMICS ===
708
+ with gr.TabItem("🧬 PHYLO-GENOMICS"):
709
+ gr.HTML(section_header(
710
+ "S1-A", "PHYLO-GENOMICS", "— What breaks in DNA",
711
+ "R1a OpenVariant &nbsp;·&nbsp; R1b Somatic classifier 🔶"
712
+ ))
713
+ with gr.Tabs(elem_classes="inner-tabs"):
714
+ with gr.TabItem("R1 · Variant classification"):
715
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
716
+ # R1a · OpenVariant
717
+ with gr.TabItem("R1a · OpenVariant"):
718
+ gr.HTML(proj_badge("S1-A · R1a", "OpenVariant — SNV Pathogenicity Classifier", "AUC=0.939"))
719
+ hgvs = gr.Textbox(label="HGVS notation", placeholder="BRCA1:p.R1699Q")
720
+ gr.Markdown("**Or enter functional scores manually:**")
721
+ with gr.Row():
722
+ sift = gr.Slider(0,1,value=0.5,step=0.01,label="SIFT (0=damaging)")
723
+ pp = gr.Slider(0,1,value=0.5,step=0.01,label="PolyPhen-2")
724
+ gn = gr.Slider(0,0.01,value=0.001,step=0.0001,label="gnomAD AF")
725
+ b_v = gr.Button("Predict Pathogenicity", variant="primary")
726
+ o_v = gr.HTML()
727
+ gr.Examples([["BRCA1:p.R1699Q",0.82,0.05,0.0012],
728
+ ["TP53:p.R248W",0.00,1.00,0.0],
729
+ ["BRCA2:p.D2723A",0.01,0.98,0.0]], inputs=[hgvs,sift,pp,gn], cache_examples=False)
730
+ b_v.click(predict_variant, [hgvs,sift,pp,gn], o_v)
731
+ # R1b · Somatic Classifier (в розробці)
732
+ with gr.TabItem("R1b · Somatic Classifier 🔶"):
733
+ gr.HTML(proj_badge("S1-A · R1b", "Somatic Mutation Classifier", "🔶 In progress"))
734
+ gr.Markdown("> This module is in active development. Coming in the next release.")
735
 
736
  # === S1-B · PHYLO-RNA ===
737
+ with gr.TabItem("🔬 PHYLO-RNA"):
738
+ gr.HTML(section_header(
739
+ "S1-B", "PHYLO-RNA", " How to silence it via RNA",
740
+ "R1a miRNA &nbsp;·&nbsp; R2a siRNA ✅ &nbsp;·&nbsp; R3a lncRNA ✅ &nbsp;·&nbsp; R3b ASO ✅"
741
+ ))
742
+ with gr.Tabs(elem_classes="inner-tabs"):
743
+ # R1 · miRNA silencing
744
+ with gr.TabItem("R1 · miRNA silencing"):
745
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
746
+ with gr.TabItem("R1a · BRCA2 miRNA"):
747
+ gr.HTML(proj_badge("S1-B · R1a", "miRNA Silencing — BRCA1/2 · TP53"))
748
+ g1 = gr.Dropdown(["BRCA2","BRCA1","TP53"], value="BRCA2", label="Gene")
749
+ b1 = gr.Button("Find miRNAs", variant="primary")
750
+ o1 = gr.Dataframe(label="Top 5 downregulated miRNAs")
751
+ gr.Examples([["BRCA2"],["BRCA1"],["TP53"]], inputs=[g1])
752
+ b1.click(predict_mirna, [g1], o1)
753
+ # R2 · siRNA SL
754
+ with gr.TabItem("R2 · siRNA SL"):
755
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
756
+ with gr.TabItem("R2a · TP53 siRNA"):
757
+ gr.HTML(proj_badge("S1-B · R2a", "siRNA Synthetic Lethal — TP53-null"))
758
+ g2 = gr.Dropdown(["LUAD","BRCA","COAD"], value="LUAD", label="Cancer type")
759
+ b2 = gr.Button("Find Targets", variant="primary")
760
+ o2 = gr.Dataframe(label="Top 5 synthetic lethal targets")
761
+ gr.Examples([["LUAD"],["BRCA"],["COAD"]], inputs=[g2], cache_examples=False)
762
+ b2.click(predict_sirna, [g2], o2)
763
+ # R3 · lncRNA + ASO
764
+ with gr.TabItem("R3 · lncRNA + ASO"):
765
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
766
+ with gr.TabItem("R3a · lncRNA-TREM2"):
767
+ gr.HTML(proj_badge("S1-B · R3a", "lncRNA-TREM2 ceRNA Network"))
768
+ b3a = gr.Button("Load ceRNA", variant="primary")
769
+ o3a = gr.Dataframe(label="ceRNA Network (R3a)")
770
+ b3a.click(lambda: pd.DataFrame(CERNA), [], o3a)
771
+ with gr.TabItem("R3b · ASO Designer"):
772
+ gr.HTML(proj_badge("S1-B · R3b", "ASO Designer"))
773
+ b3b = gr.Button("Load ASO Candidates", variant="primary")
774
+ o3b = gr.Dataframe(label="ASO Candidates (R3b)")
775
+ b3b.click(lambda: pd.DataFrame(ASO), [], o3b)
776
 
777
  # === S1-C · PHYLO-DRUG ===
778
+ with gr.TabItem("💊 PHYLO-DRUG"):
779
+ gr.HTML(section_header(
780
+ "S1-C", "PHYLO-DRUG", " Which molecule treats it",
781
+ "R1a FGFR3 &nbsp;·&nbsp; R1b SL drug mapping 🔶 &nbsp;·&nbsp; R2a m6A×Ferroptosis×Circadian 🔴⭐"
782
+ ))
783
+ with gr.Tabs(elem_classes="inner-tabs"):
784
+ # R1 · RNA-directed drug
785
+ with gr.TabItem("R1 · RNA-directed drug"):
786
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
787
+ with gr.TabItem("R1a · FGFR3 RNA Drug"):
788
+ gr.HTML(proj_badge("S1-C · R1a", "FGFR3 RNA-Directed Drug Discovery", "top score 0.793"))
789
+ g4 = gr.Radio(["P1 (hairpin loop)","P10 (G-quadruplex)"],
790
+ value="P1 (hairpin loop)", label="Target pocket")
791
+ b4_drug = gr.Button("Screen Compounds", variant="primary")
792
+ o4t = gr.Dataframe(label="Top 5 candidates")
793
+ o4p = gr.Image(label="Binding scores")
794
+ gr.Examples([["P1 (hairpin loop)"],["P10 (G-quadruplex)"]], inputs=[g4])
795
+ b4_drug.click(predict_drug, [g4], [o4t, o4p])
796
+ with gr.TabItem("R1b · SL Drug Mapping 🔶"):
797
+ gr.HTML(proj_badge("S1-C · R1b", "Synthetic Lethal Drug Mapping", "🔶 In progress"))
798
+ gr.Markdown("> In development. Coming soon.")
799
+ # R2 · Frontier
800
+ with gr.TabItem("R2 · Frontier"):
801
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
802
+ with gr.TabItem("R2a · m6A×Ferroptosis×Circadian 🔴⭐"):
803
+ gr.HTML(proj_badge("S1-C · R2a", "m6A × Ferroptosis × Circadian", "🔴 Frontier"))
804
+ gr.Markdown(
805
+ "> **Research gap:** This triple intersection has never been studied as an integrated system.\n\n"
806
+ "> **Planned datasets:** TCGA-PAAD · GEO m6A atlases · Circadian gene panels\n\n"
807
+ "> **Expected timeline:** Q3 2026"
808
+ )
809
 
810
  # === S1-D · PHYLO-LNP ===
811
+ with gr.TabItem("🧪 PHYLO-LNP"):
812
+ gr.HTML(section_header(
813
+ "S1-D", "PHYLO-LNP", "— How to deliver the drug",
814
+ "R1a Corona · R2a Flow ✅ · R3a Brain ✅ · R4a NLP ✅ · R5a CSF/BM 🔴⭐"
815
+ ))
816
+ with gr.Tabs(elem_classes="inner-tabs"):
817
+ # R1 · Serum corona
818
+ with gr.TabItem("R1 · Serum corona"):
819
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
820
+ with gr.TabItem("R1a · LNP Corona ML"):
821
+ gr.HTML(proj_badge("S1-D · R1a", "LNP Protein Corona (Serum)", "AUC=0.791"))
822
+ with gr.Row():
823
+ sz = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
824
+ zt = gr.Slider(-40,10,value=-5,step=1,label="Zeta (mV)")
825
+ with gr.Row():
826
+ pg = gr.Slider(0,5,value=1.5,step=0.1,label="PEG mol%")
827
+ lp = gr.Dropdown(["Ionizable","Cationic","Anionic","Neutral"],value="Ionizable",label="Lipid type")
828
+ b6 = gr.Button("Predict", variant="primary")
829
+ o6 = gr.Markdown()
830
+ gr.Examples([[100,-5,1.5,"Ionizable"],[80,5,0.5,"Cationic"]], inputs=[sz,zt,pg,lp])
831
+ b6.click(predict_corona, [sz,zt,pg,lp], o6)
832
+ # R2 · Flow corona
833
+ with gr.TabItem("R2 · Flow corona"):
834
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
835
+ with gr.TabItem("R2a · Flow Corona"):
836
+ gr.HTML(proj_badge("S1-D · R2a", "Flow Corona — Vroman Effect"))
837
+ with gr.Row():
838
+ s8 = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
839
+ z8 = gr.Slider(-40,10,value=-5,step=1,label="Zeta (mV)")
840
+ pg8 = gr.Slider(0,5,value=1.5,step=0.1,label="PEG mol%")
841
+ with gr.Row():
842
+ ch8 = gr.Dropdown(["Ionizable","Cationic","Anionic","Neutral"],value="Ionizable",label="Charge")
843
+ fl8 = gr.Slider(0,40,value=20,step=1,label="Flow cm/s (aorta=40)")
844
+ b8 = gr.Button("Model Vroman Effect", variant="primary")
845
+ o8t = gr.Markdown()
846
+ o8p = gr.Image(label="Kinetics")
847
+ gr.Examples([[100,-5,1.5,"Ionizable",40],[150,5,0.5,"Cationic",10]], inputs=[s8,z8,pg8,ch8,fl8])
848
+ b8.click(predict_flow, [s8,z8,pg8,ch8,fl8], [o8t,o8p])
849
+ # R3 · Brain BBB
850
+ with gr.TabItem("R3 · Brain BBB"):
851
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
852
+ with gr.TabItem("R3a · LNP Brain"):
853
+ gr.HTML(proj_badge("S1-D · R3a", "LNP Brain Delivery"))
854
+ smi = gr.Textbox(label="Ionizable lipid SMILES",
855
+ value="CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C")
856
+ with gr.Row():
857
+ pk = gr.Slider(4,8,value=6.5,step=0.1,label="pKa")
858
+ zt9 = gr.Slider(-20,10,value=-3,step=1,label="Zeta (mV)")
859
+ b9 = gr.Button("Predict BBB Crossing", variant="primary")
860
+ o9t = gr.Markdown()
861
+ o9p = gr.Image(label="Radar profile")
862
+ gr.Examples([["CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C",6.5,-3]], inputs=[smi,pk,zt9])
863
+ b9.click(predict_bbb, [smi,pk,zt9], [o9t,o9p])
864
+ # R4 · NLP
865
+ with gr.TabItem("R4 · NLP"):
866
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
867
+ with gr.TabItem("R4a · AutoCorona NLP"):
868
+ gr.HTML(proj_badge("S1-D · R4a", "AutoCorona NLP", "F1=0.71"))
869
+ txt = gr.Textbox(lines=5,label="Paper abstract",placeholder="Paste abstract here...")
870
+ b10 = gr.Button("Extract Data", variant="primary")
871
+ o10j = gr.Code(label="Extracted JSON", language="json")
872
+ o10f = gr.Textbox(label="Validation flags")
873
+ gr.Examples([[
874
+ "LNPs composed of MC3, DSPC, Cholesterol (50:10:40 mol%) with 1.5% PEG-DMG. "
875
+ "Hydrodynamic diameter was 98 nm, zeta potential -3.2 mV, PDI 0.12. "
876
+ "Incubated in human plasma. Corona: albumin, apolipoprotein E, fibrinogen."
877
+ ]], inputs=[txt])
878
+ b10.click(extract_corona, txt, [o10j, o10f])
879
+ # R5 · Exotic fluids
880
+ with gr.TabItem("R5 · Exotic fluids 🔴⭐"):
881
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
882
+ with gr.TabItem("R5a · CSF/Vitreous/BM"):
883
+ gr.HTML(proj_badge("S1-D · R5a", "LNP Corona in CSF · Vitreous · Bone Marrow", "🔴 0 prior studies"))
884
+ gr.Markdown(
885
+ "> **Research gap:** Protein corona has only been characterized in serum/plasma. "
886
+ "CSF, vitreous humor, and bone marrow interstitial fluid remain completely unstudied.\n\n"
887
+ "> **Target cancers:** DIPG (CSF) · UVM (vitreous) · pAML (bone marrow)\n\n"
888
+ "> **Expected timeline:** Q2–Q3 2026"
889
+ )
890
+
891
  # === S1-E · PHYLO-BIOMARKERS ===
892
+ with gr.TabItem("🩸 PHYLO-BIOMARKERS"):
893
+ gr.HTML(section_header(
894
+ "S1-E", "PHYLO-BIOMARKERS", " Detect without biopsy",
895
+ "R1a Liquid Biopsy ✅ &nbsp;·&nbsp; R1b Protein validator 🔶"
896
+ ))
897
+ with gr.Tabs(elem_classes="inner-tabs"):
898
+ with gr.TabItem("R1 · Liquid biopsy"):
899
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
900
+ with gr.TabItem("R1a · Liquid Biopsy"):
901
+ gr.HTML(proj_badge("S1-E · R1a", "Liquid Biopsy Classifier", "AUC=0.992*"))
902
+ with gr.Row():
903
+ p1=gr.Slider(-3,3,value=0,step=0.1,label="CTHRC1")
904
+ p2=gr.Slider(-3,3,value=0,step=0.1,label="FHL2")
905
+ p3=gr.Slider(-3,3,value=0,step=0.1,label="LDHA")
906
+ p4=gr.Slider(-3,3,value=0,step=0.1,label="P4HA1")
907
+ p5=gr.Slider(-3,3,value=0,step=0.1,label="SERPINH1")
908
+ with gr.Row():
909
+ p6=gr.Slider(-3,3,value=0,step=0.1,label="ABCA8")
910
+ p7=gr.Slider(-3,3,value=0,step=0.1,label="CA4")
911
+ p8=gr.Slider(-3,3,value=0,step=0.1,label="CKB")
912
+ p9=gr.Slider(-3,3,value=0,step=0.1,label="NNMT")
913
+ p10=gr.Slider(-3,3,value=0,step=0.1,label="CACNA2D2")
914
+ b7=gr.Button("Classify", variant="primary")
915
+ o7t=gr.HTML()
916
+ o7p=gr.Image(label="Feature contributions")
917
+ gr.Examples([[2,2,1.5,1.8,1.6,-1,-1.2,-0.8,1.4,-1.1],[0]*10],
918
+ inputs=[p1,p2,p3,p4,p5,p6,p7,p8,p9,p10])
919
+ b7.click(predict_cancer, [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10], [o7t,o7p])
920
+ with gr.TabItem("R1b · Protein Validator 🔶"):
921
+ gr.HTML(proj_badge("S1-E · R1b", "Protein Panel Validator", "🔶 In progress"))
922
+ gr.Markdown("> Coming next — validates R1a results against GEO plasma proteomics datasets.")
923
 
924
  # === S1-F · PHYLO-RARE ===
925
+ with gr.TabItem("🧠 PHYLO-RARE"):
926
+ gr.HTML(section_header(
927
+ "S1-F", "PHYLO-RARE", " Where almost nobody has looked yet",
928
+ "<b style='color:#ef4444'>⚠️ <300 cases/yr · <5% survival · 0–1 prior studies per gap</b><br>"
929
+ "R1a DIPG 🔶 &nbsp;·&nbsp; R2a UVM 🔶 &nbsp;·&nbsp; R3a pAML 🔶"
930
+ ))
931
+ with gr.Tabs(elem_classes="inner-tabs"):
932
+ # R1 · DIPG
933
+ with gr.TabItem("R1 · DIPG"):
934
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
935
+ with gr.TabItem("R1a · DIPG Toolkit"):
936
+ gr.HTML(proj_badge("S1-F · R1a", "DIPG Toolkit", "PBTA · GSE126319"))
937
+ gr.Markdown(
938
+ "> **Why DIPG?** Diffuse Intrinsic Pontine Glioma — median survival 9–11 months. "
939
+ "H3K27M oncohistone in **78%** cases. "
940
+ "CSF delivery is the only viable route past the brainstem BBB. "
941
+ "Circadian disruption (BMAL1 suppression) newly linked — **0 prior LNP studies**."
942
+ )
943
+ with gr.Tabs():
944
+ with gr.TabItem("Variants"):
945
+ sort_d = gr.Radio(["Frequency", "Drug status"], value="Frequency", label="Sort by")
946
+ b_dv = gr.Button("Load DIPG Variants", variant="primary")
947
+ o_dv = gr.Dataframe(label="H3K27M co-mutations · PBTA/GSE126319")
948
+ b_dv.click(dipg_variants, [sort_d], o_dv)
949
+ with gr.TabItem("CSF LNP"):
950
+ with gr.Row():
951
+ d_peg = gr.Slider(0.5, 3.0, value=1.5, step=0.1, label="PEG mol%")
952
+ d_size = gr.Slider(60, 150, value=90, step=5, label="Target size (nm)")
953
+ b_dc = gr.Button("Rank CSF Formulations", variant="primary")
954
+ o_dct = gr.Dataframe(label="CSF LNP ranking")
955
+ o_dcp = gr.Image(label="ApoE% in CSF corona")
956
+ b_dc.click(dipg_csf, [d_peg, d_size], [o_dct, o_dcp])
957
+ with gr.TabItem("Research Gap"):
958
+ gr.Markdown(
959
+ "**Data:** PBTA (n=240) · GSE126319 (n=28) · GTEx circadian genes\n\n"
960
+ "| Layer | Known | This study gap |\n"
961
+ "|-------|-------|----------------|\n"
962
+ "| Genomics | H3K27M freq=78% | H3K27M × BMAL1/CLOCK |\n"
963
+ "| Delivery | CED convection | LNP corona **in CSF** |\n"
964
+ "| Biology | PRC2 inhibition | Ferroptosis in H3K27M+ DIPG |"
965
+ )
966
+ # R2 · UVM
967
+ with gr.TabItem("R2 · UVM"):
968
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
969
+ with gr.TabItem("R2a · UVM Toolkit"):
970
+ gr.HTML(proj_badge("S1-F · R2a", "UVM Toolkit", "TCGA-UVM n=80"))
971
+ gr.Markdown(
972
+ "> **Why UVM?** Uveal Melanoma — metastatic 5-yr survival **15%**. "
973
+ "GNAQ/GNA11 mutations in 78% cases. "
974
+ "Vitreous humor protein corona has **never been profiled**. "
975
+ "METTL3/WTAP upregulated in GNAQ+ tumors — 0 therapeutic studies."
976
+ )
977
+ with gr.Tabs():
978
+ with gr.TabItem("Variants + m6A"):
979
+ b_uv = gr.Button("Load UVM Variants", variant="primary")
980
+ o_uv = gr.Dataframe(label="GNAQ/GNA11 map · TCGA-UVM")
981
+ b_uv.click(uvm_variants, [], o_uv)
982
+ with gr.TabItem("Vitreous LNP"):
983
+ b_uw = gr.Button("Rank Vitreous Formulations", variant="primary")
984
+ o_uwt = gr.Dataframe(label="Vitreous LNP retention ranking")
985
+ o_uwp = gr.Image(label="Retention (hours)")
986
+ b_uw.click(uvm_vitreous, [], [o_uwt, o_uwp])
987
+ with gr.TabItem("Research Gap"):
988
+ gr.Markdown(
989
+ "**Data:** TCGA-UVM (n=80) · GEO m6A atlases · Vitreous proteomics\n\n"
990
+ "| Layer | Known | This study gap |\n"
991
+ "|-------|-------|----------------|\n"
992
+ "| Genomics | GNAQ/GNA11 mutations | m6A landscape GNAQ+ vs GNA11+ |\n"
993
+ "| Delivery | Intravitreal injection | LNP corona **in vitreous humor** |\n"
994
+ "| Biology | PLCβ→PKC→MAPK | GNAQ × METTL3 × YTHDF2 axis |"
995
+ )
996
+ # R3 · pAML
997
+ with gr.TabItem("R3 · pAML"):
998
+ with gr.Tabs(elem_classes="sub-sub-tabs"):
999
+ with gr.TabItem("R3a · pAML Toolkit"):
1000
+ gr.HTML(proj_badge("S1-F · R3a", "pAML Toolkit", "TARGET-AML n≈197"))
1001
+ gr.Markdown(
1002
+ "> **Why pAML?** Pediatric AML — relapse OS **<30%**. "
1003
+ "FLT3-ITD in 25% cases. "
1004
+ "Bone marrow niche LNP corona: **never studied**. "
1005
+ "Ferroptosis–FLT3 intersection: 0 prior studies (FerrDb v2 confirmed)."
1006
+ )
1007
+ with gr.Tabs():
1008
+ with gr.TabItem("Ferroptosis Explorer"):
1009
+ var_sel = gr.Dropdown(
1010
+ ["FLT3-ITD", "NPM1 c.860_863dupTCAG", "DNMT3A p.R882H",
1011
+ "CEBPA biallelic", "IDH1/2 mutation"],
1012
+ value="FLT3-ITD", label="Select variant"
1013
+ )
1014
+ b_pf = gr.Button("Analyze Ferroptosis Profile", variant="primary")
1015
+ o_pft = gr.HTML()
1016
+ o_pfp = gr.Image(label="Target radar")
1017
+ b_pf.click(paml_ferroptosis, var_sel, [o_pft, o_pfp])
1018
+ with gr.TabItem("BM Niche LNP"):
1019
+ gr.Dataframe(
1020
+ value=pd.DataFrame(PAML_BM_LNP),
1021
+ label="Bone marrow niche LNP candidates · TARGET-AML context"
1022
+ )
1023
+ with gr.TabItem("Research Gap"):
1024
+ gr.Markdown(
1025
+ "**Data:** TARGET-AML (n=197) · BeatAML · FerrDb v2\n\n"
1026
+ "| Layer | Known | This study gap |\n"
1027
+ "|-------|-------|----------------|\n"
1028
+ "| Genomics | FLT3-ITD → Midostaurin | FLT3-ITD × GPX4/SLC7A11 |\n"
1029
+ "| Delivery | Liposomal daunorubicin | LNP corona **in bone marrow** |\n"
1030
+ "| Biology | Midostaurin inhibits FLT3 | Ferroptosis SL + FLT3i |"
1031
+ )
1032
 
1033
  # === S1-G · 3D Lab (НОВА ВКЛАДКА) ===
1034
  with gr.TabItem("🧊 3D Lab"):