TEZv commited on
Commit
b7a89ab
·
verified ·
1 Parent(s): 2bd2b65

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +287 -263
app.py CHANGED
@@ -146,6 +146,47 @@ PROTEINS = ["albumin","apolipoprotein","fibrinogen","vitronectin",
146
  "clusterin","igm","iga","igg","complement","transferrin",
147
  "alpha-2-macroglobulin"]
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
  # ── LOGIC ─────────────────────────────────────────────────────────────────────
150
  def predict_mirna(gene):
151
  df = pd.DataFrame(MIRNA_DB.get(gene, []))
@@ -168,7 +209,7 @@ def predict_drug(pocket):
168
  ax.barh(df["Compound"], df["Final_score"], color=ACC)
169
  ax.set_xlabel("Final Score", color=TXT); ax.tick_params(colors=TXT)
170
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
171
- ax.set_title(f"Top compounds — {pocket}", color=TXT, fontsize=10)
172
  plt.tight_layout()
173
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
174
  log_entry("S1-C | S1-R5 | Drug", pocket, f"Top: {df.iloc[0]['Compound'] if len(df) else 'none'}")
@@ -187,17 +228,18 @@ def predict_variant(hgvs, sift, polyphen, gnomad):
187
  cls = "Pathogenic" if score > 0.6 else "Likely Pathogenic" if score > 0.4 else "Benign"
188
  conf = "High" if (sift < 0.01 or sift > 0.9) else "Moderate"
189
  colour = RED if "Pathogenic" in cls else GRN
190
- icon = "⚠️ WARNING" if "Pathogenic" in cls else "✅ OK"
191
  log_entry("S1-A | S1-R1 | OpenVariant", hgvs or f"SIFT={sift}", f"{cls} score={score}")
 
192
  return (
193
- f"<div style=\'background:{CARD};padding:16px;border-radius:8px;font-family:sans-serif;color:{TXT}\'>"
194
- f"<p style=\'font-size:11px;color:{DIM};margin:0 0 8px\'>S1-A · PHYLO-GENOMICS · S1-R1</p>"
195
- f"<h3 style=\'color:{colour};margin:0 0 8px\'>{icon} {cls}</h3>"
196
- f"<p>Score: <b>{score:.3f}</b> &nbsp;|&nbsp; Confidence: <b>{conf}</b></p>"
197
- f"<div style=\'background:{BORDER};border-radius:4px;height:14px\'>"
198
- f"<div style=\'background:{colour};height:14px;border-radius:4px;width:{int(score*100)}%\'></div></div>"
199
- f"<p style=\'margin-top:12px\'>{PLAIN.get(cls,'')}</p>"
200
- f"<p style=\'font-size:11px;color:{DIM}\'>Research only. Not clinical advice.</p></div>"
201
  )
202
 
203
  def predict_corona(size, zeta, peg, lipid):
@@ -232,10 +274,10 @@ def predict_cancer(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10):
232
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
233
  log_entry("S1-E | S1-R9 | LiquidBiopsy", f"CTHRC1={c1},FHL2={c2}", f"{label} {prob:.2f}")
234
  return (
235
- f"<div style=\'background:{CARD};padding:14px;border-radius:8px;font-family:sans-serif;\'>"
236
- f"<p style=\'font-size:11px;color:{DIM};margin:0 0 6px\'>S1-E · PHYLO-BIOMARKERS · S1-R9</p>"
237
- f"<span style=\'color:{colour};font-size:24px;font-weight:bold\'>{label}</span><br>"
238
- f"<span style=\'color:{TXT};font-size:14px\'>Probability: {prob:.2f}</span></div>"
239
  ), Image.open(buf)
240
 
241
  def predict_flow(size, zeta, peg, charge, flow_rate):
@@ -252,11 +294,11 @@ def predict_flow(size, zeta, peg, charge, flow_rate):
252
  ax.set_xlabel("Time (min)", color=TXT); ax.set_ylabel("% Corona", color=TXT)
253
  ax.tick_params(colors=TXT); ax.legend(fontsize=7, labelcolor=TXT, facecolor=CARD)
254
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
255
- ax.set_title("Vroman Effect — flow vs static", color=TXT, fontsize=9)
256
  plt.tight_layout()
257
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
258
  log_entry("S1-D | S1-R7 | FlowCorona", f"flow={flow_rate}", f"CSI={csi}")
259
- return f"**Corona Shift Index: {csi}** — {stability}", Image.open(buf)
260
 
261
  def predict_bbb(smiles, pka, zeta):
262
  logp = smiles.count("C")*0.3 - smiles.count("O")*0.5 + 1.5
@@ -275,7 +317,7 @@ def predict_bbb(smiles, pka, zeta):
275
  plt.tight_layout()
276
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
277
  log_entry("S1-D | S1-R8 | LNPBrain", f"pka={pka},zeta={zeta}", f"ApoE={apoe_pct:.1f}%")
278
- return f"**Predicted ApoE:** {apoe_pct:.1f}% — {tier}\n\n**BBB Probability:** {bbb_prob:.2f}", Image.open(buf)
279
 
280
  def extract_corona(text):
281
  out = {"nanoparticle_composition":"","size_nm":None,"zeta_mv":None,"PDI":None,
@@ -300,54 +342,6 @@ def extract_corona(text):
300
  log_entry("S1-D | S1-R10 | NLP", text[:80], f"proteins={len(out['corona_proteins'])}")
301
  return json.dumps(out, indent=2), summary
302
 
303
-
304
- # ── S1-F · PHYLO-RARE DATABASES ───────────────────────────────────────────────
305
-
306
- # S1-R12b · DIPG — H3K27M + CSF LNP + Circadian
307
- DIPG_VARIANTS = [
308
- {"Variant":"H3K27M (H3F3A)","Freq_pct":78,"Pathway":"PRC2 inhibition → global H3K27me3 loss","Drug_status":"ONC201 (clinical)","Circadian_gene":"BMAL1 suppressed"},
309
- {"Variant":"ACVR1 p.R206H","Freq_pct":21,"Pathway":"BMP/SMAD hyperactivation","Drug_status":"LDN-193189 (preclinical)","Circadian_gene":"PER1 disrupted"},
310
- {"Variant":"PIK3CA p.H1047R","Freq_pct":15,"Pathway":"PI3K/AKT/mTOR","Drug_status":"Copanlisib (clinical)","Circadian_gene":"CRY1 altered"},
311
- {"Variant":"TP53 p.R248W","Freq_pct":14,"Pathway":"DNA damage response loss","Drug_status":"APR-246 (clinical)","Circadian_gene":"p53-CLOCK axis"},
312
- {"Variant":"PDGFRA amp","Freq_pct":13,"Pathway":"RTK/RAS signalling","Drug_status":"Avapritinib (clinical)","Circadian_gene":"REV-ERB altered"},
313
- ]
314
- DIPG_CSF_LNP = [
315
- {"Formulation":"MC3-DSPC-Chol-PEG","Size_nm":92,"Zeta_mV":-4.1,"CSF_protein":"Beta2-microglobulin","ApoE_pct":12.4,"BBB_est":0.41,"Priority":"HIGH"},
316
- {"Formulation":"DLin-KC2-DSPE-PEG","Size_nm":87,"Zeta_mV":-3.8,"CSF_protein":"Cystatin C","ApoE_pct":14.1,"BBB_est":0.47,"Priority":"HIGH"},
317
- {"Formulation":"C12-200-DOPE-PEG","Size_nm":103,"Zeta_mV":-5.2,"CSF_protein":"Albumin (low)","ApoE_pct":9.8,"BBB_est":0.33,"Priority":"MEDIUM"},
318
- {"Formulation":"DODAP-DSPC-Chol","Size_nm":118,"Zeta_mV":-2.1,"CSF_protein":"Transferrin","ApoE_pct":7.2,"BBB_est":0.24,"Priority":"LOW"},
319
- ]
320
-
321
- # S1-R12c · UVM — GNAQ/GNA11 + Vitreous corona + m6A
322
- UVM_VARIANTS = [
323
- {"Variant":"GNAQ p.Q209L","Freq_pct":46,"Pathway":"PLCβ → PKC → MAPK","Drug_status":"Darovasertib (clinical)","m6A_writer":"METTL3 upregulated"},
324
- {"Variant":"GNA11 p.Q209L","Freq_pct":32,"Pathway":"PLCβ → PKC → MAPK","Drug_status":"Darovasertib (clinical)","m6A_writer":"WTAP upregulated"},
325
- {"Variant":"BAP1 loss","Freq_pct":47,"Pathway":"Chromatin remodeling → metastasis","Drug_status":"No approved (HDAC trials)","m6A_writer":"FTO overexpressed"},
326
- {"Variant":"SF3B1 p.R625H","Freq_pct":19,"Pathway":"Splicing alteration → neoepitopes","Drug_status":"H3B-8800 (clinical)","m6A_writer":"METTL14 altered"},
327
- {"Variant":"EIF1AX p.A113_splice","Freq_pct":14,"Pathway":"Translation initiation","Drug_status":"Novel — no drug","m6A_writer":"YTHDF2 suppressed"},
328
- ]
329
- UVM_VITREOUS_LNP = [
330
- {"Formulation":"SM-102-DSPC-Chol-PEG","Vitreal_protein":"Hyaluronan-binding","Size_nm":95,"Zeta_mV":-3.2,"Retention_h":18,"Priority":"HIGH"},
331
- {"Formulation":"Lipid-H-DOPE-PEG","Vitreal_protein":"Vitronectin dominant","Size_nm":88,"Zeta_mV":-4.0,"Retention_h":22,"Priority":"HIGH"},
332
- {"Formulation":"DOTAP-DSPC-PEG","Vitreal_protein":"Albumin wash-out","Size_nm":112,"Zeta_mV":+2.1,"Retention_h":6,"Priority":"LOW"},
333
- {"Formulation":"MC3-DPPC-Chol","Vitreal_protein":"Clusterin-rich","Size_nm":101,"Zeta_mV":-2.8,"Retention_h":14,"Priority":"MEDIUM"},
334
- ]
335
-
336
- # S1-R12d · pAML — FLT3-ITD + BM niche corona + Ferroptosis
337
- PAML_VARIANTS = [
338
- {"Variant":"FLT3-ITD","Freq_pct":25,"Pathway":"RTK constitutive activation → JAK/STAT","Drug_status":"Midostaurin (approved)","Ferroptosis":"GPX4 suppressed"},
339
- {"Variant":"NPM1 c.860_863dupTCAG","Freq_pct":30,"Pathway":"Nuclear export deregulation","Drug_status":"APR-548 combo (clinical)","Ferroptosis":"SLC7A11 upregulated"},
340
- {"Variant":"DNMT3A p.R882H","Freq_pct":18,"Pathway":"Epigenetic dysregulation","Drug_status":"Azacitidine (approved)","Ferroptosis":"ACSL4 altered"},
341
- {"Variant":"CEBPA biallelic","Freq_pct":8,"Pathway":"Myeloid differentiation block","Drug_status":"Novel target","Ferroptosis":"NRF2 pathway"},
342
- {"Variant":"IDH1/2 mutation","Freq_pct":15,"Pathway":"2-HG oncometabolite → TET2 inhibition","Drug_status":"Enasidenib (approved)","Ferroptosis":"Iron metabolism disrupted"},
343
- ]
344
- PAML_BM_LNP = [
345
- {"Formulation":"ALC-0315-DSPC-Chol-PEG","BM_protein":"ApoE + Clusterin","Size_nm":98,"Zeta_mV":-3.5,"Marrow_uptake_pct":34,"Priority":"HIGH"},
346
- {"Formulation":"MC3-DOPE-Chol-PEG","BM_protein":"Fibronectin dominant","Size_nm":105,"Zeta_mV":-4.2,"Marrow_uptake_pct":28,"Priority":"HIGH"},
347
- {"Formulation":"DLin-MC3-DPPC","BM_protein":"Vitronectin-rich","Size_nm":91,"Zeta_mV":-2.9,"Marrow_uptake_pct":19,"Priority":"MEDIUM"},
348
- {"Formulation":"Cationic-DOTAP-Chol","BM_protein":"Opsonin-heavy","Size_nm":132,"Zeta_mV":+8.1,"Marrow_uptake_pct":8,"Priority":"LOW"},
349
- ]
350
-
351
  # ── S1-F · PHYLO-RARE LOGIC ───────────────────────────────────────────────────
352
  def dipg_variants(sort_by):
353
  df = pd.DataFrame(DIPG_VARIANTS).sort_values(
@@ -366,7 +360,7 @@ def dipg_csf(peg, size):
366
  ax.set_xlabel("ApoE% in CSF corona", color=TXT)
367
  ax.tick_params(colors=TXT, labelsize=8)
368
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
369
- ax.set_title("DIPG — CSF LNP formulations (ApoE%)", color=TXT, fontsize=9)
370
  plt.tight_layout()
371
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
372
  log_entry("S1-F | S1-R12b | DIPG-CSF", f"peg={peg},size={size}", "formulation ranking")
@@ -386,7 +380,7 @@ def uvm_vitreous():
386
  ax.set_xlabel("Vitreous retention (hours)", color=TXT)
387
  ax.tick_params(colors=TXT, labelsize=8)
388
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
389
- ax.set_title("UVM — LNP retention in vitreous humor", color=TXT, fontsize=9)
390
  plt.tight_layout()
391
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
392
  log_entry("S1-F | S1-R12c | UVM-vitreous", "load", "vitreous LNP ranking")
@@ -394,12 +388,11 @@ def uvm_vitreous():
394
 
395
  def paml_ferroptosis(variant):
396
  row = next((r for r in PAML_VARIANTS if variant in r["Variant"]), PAML_VARIANTS[0])
397
- score = 0
398
  ferr_map = {"GPX4 suppressed": 0.85, "SLC7A11 upregulated": 0.72,
399
  "ACSL4 altered": 0.61, "NRF2 pathway": 0.55, "Iron metabolism disrupted": 0.78}
400
  ferr_score = ferr_map.get(row["Ferroptosis"], 0.5)
401
  cats = ["Ferroptosis\nsensitivity", "Drug\navailable", "BM niche\ncoverage", "Data\nmaturity", "Target\nnovelty"]
402
- has_drug = 0.9 if row["Drug_status"] not in ["Novel target"] else 0.3
403
  vals = [ferr_score, has_drug, 0.6, 0.55, 1-has_drug+0.2]
404
  angles = np.linspace(0, 2*np.pi, len(cats), endpoint=False).tolist()
405
  v2, a2 = vals+[vals[0]], angles+[angles[0]]
@@ -408,7 +401,7 @@ def paml_ferroptosis(variant):
408
  ax.plot(a2, v2, color=ACC2, linewidth=2); ax.fill(a2, v2, color=ACC2, alpha=0.2)
409
  ax.set_xticks(angles); ax.set_xticklabels(cats, color=TXT, fontsize=8)
410
  ax.tick_params(colors=TXT)
411
- ax.set_title(f"pAML · {row['Variant'][:20]}", color=TXT, fontsize=9)
412
  plt.tight_layout()
413
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
414
  log_entry("S1-F | S1-R12d | pAML-ferroptosis", variant, f"ferr={ferr_score:.2f}")
@@ -419,7 +412,7 @@ def paml_ferroptosis(variant):
419
  _fs = f"{ferr_score:.2f}"
420
  summary = (
421
  f"<div style='background:{CARD};padding:14px;border-radius:8px;font-family:sans-serif;'>"
422
- f"<p style='color:{DIM};font-size:11px;margin:0 0 6px'>S1-F · PHYLO-RARE · S1-R12d · pAML</p>"
423
  f"<b style='color:{ACC2};font-size:15px'>{_v}</b><br>"
424
  f"<p style='color:{TXT};margin:6px 0'><b>Pathway:</b> {_p}</p>"
425
  f"<p style='color:{TXT};margin:0'><b>Drug:</b> {_d}</p>"
@@ -433,24 +426,24 @@ def paml_ferroptosis(variant):
433
  # ── HELPERS ───────────────────────────────────────────────────────────────────
434
  def section_header(code, name, tagline, projects_html):
435
  return (
436
- f"<div style=\'background:{BG};border:1px solid {BORDER};padding:14px 18px;"
437
- f"border-radius:8px;margin-bottom:12px;\'>"
438
- f"<div style=\'display:flex;align-items:baseline;gap:10px;\'>"
439
- f"<span style=\'color:{ACC2};font-size:16px;font-weight:700\'>{code}</span>"
440
- f"<span style=\'color:{TXT};font-size:14px;font-weight:600\'>{name}</span>"
441
- f"<span style=\'color:{DIM};font-size:12px\'>{tagline}</span></div>"
442
- f"<div style=\'margin-top:8px;font-size:12px;color:{DIM}\'>{projects_html}</div>"
443
  f"</div>"
444
  )
445
 
446
  def proj_badge(code, title, metric=""):
447
- m = (f"<span style=\'background:#0f2a3f;color:{ACC2};padding:1px 7px;border-radius:3px;"
448
- f"font-size:10px;margin-left:6px\'>{metric}</span>") if metric else ""
449
  return (
450
- f"<div style=\'background:{CARD};border-left:3px solid {ACC};"
451
- f"padding:8px 12px;border-radius:0 6px 6px 0;margin-bottom:8px;\'>"
452
- f"<span style=\'color:{DIM};font-size:11px\'>{code}</span>{m}<br>"
453
- f"<span style=\'color:{TXT};font-size:14px;font-weight:600\'>{title}</span>"
454
  f"</div>"
455
  )
456
 
@@ -458,7 +451,6 @@ def proj_badge(code, title, metric=""):
458
  css = f"""
459
  body, .gradio-container {{ background: {BG} !important; color: {TXT} !important; }}
460
 
461
- /* OUTER tab bar — PHYLO categories */
462
  .outer-tabs .tab-nav button {{
463
  color: {TXT} !important;
464
  background: {CARD} !important;
@@ -473,7 +465,6 @@ body, .gradio-container {{ background: {BG} !important; color: {TXT} !important;
473
  background: {BG} !important;
474
  }}
475
 
476
- /* INNER sub-tab bar — individual tools */
477
  .inner-tabs .tab-nav button {{
478
  color: {DIM} !important;
479
  background: {BG} !important;
@@ -508,108 +499,84 @@ MAP_HTML = f"""
508
  <div style="background:{CARD};padding:22px;border-radius:8px;font-family:monospace;
509
  font-size:13px;line-height:2.0;color:{TXT}">
510
 
511
- <span style="color:{ACC};font-size:16px;font-weight:bold">K R&D Lab · S1 Biomedical</span>
512
- <span style="color:{DIM};font-size:11px;margin-left:12px">Science Sphere — sub-direction 1</span>
513
  <br><br>
514
 
515
- <span style="color:{ACC2};font-weight:600">S1-A · PHYLO-GENOMICS</span>
516
- <span style="color:{DIM}"> — What breaks in DNA</span><br>
517
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R1</b> &nbsp;OpenVariant
518
- <span style="color:{GRN}"> AUC=0.939 ✅</span><br>
519
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R1b</b> Somatic classifier
520
- <span style="color:#f59e0b"> 🔶 In progress</span><br>
521
- &nbsp;&nbsp;&nbsp;└─ <b>S1-R12a</b> Rare variants (DIPG · UVM)
522
- <span style="color:{DIM}"> 🔴 Planned</span><br><br>
523
-
524
- <span style="color:{ACC2};font-weight:600">S1-B · PHYLO-RNA</span>
525
- <span style="color:{DIM}"> — How to silence it via RNA</span><br>
526
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R2</b> &nbsp;miRNA silencing (BRCA1/2, TP53)
527
- <span style="color:{GRN}"> ✅</span><br>
528
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R3</b> &nbsp;siRNA synthetic lethal (LUAD · BRCA · COAD)
529
- <span style="color:{GRN}"> ✅</span><br>
530
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R4</b> &nbsp;lncRNA-TREM2 ceRNA network
531
- <span style="color:{GRN}"> ✅</span><br>
532
- &nbsp;&nbsp;&nbsp;└─ <b>S1-R4b</b> ASO designer
533
- <span style="color:{GRN}"> ✅</span><br><br>
534
-
535
- <span style="color:{ACC2};font-weight:600">S1-C · PHYLO-DRUG</span>
536
- <span style="color:{DIM}"> — Which molecule treats it</span><br>
537
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R5</b> &nbsp;FGFR3 RNA-directed compounds
538
- <span style="color:{GRN}"> ✅</span><br>
539
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R5b</b> Synthetic lethal drug mapping
540
- <span style="color:#f59e0b"> 🔶</span><br>
541
- &nbsp;&nbsp;&nbsp;└─ <b>S1-R13</b> m6A × Ferroptosis × Circadian ⭐
542
- <span style="color:{DIM}"> 🔴 Frontier</span><br><br>
543
-
544
- <span style="color:{ACC2};font-weight:600">S1-D · PHYLO-LNP</span>
545
- <span style="color:{DIM}"> — How to deliver the drug</span><br>
546
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R6</b> &nbsp;LNP corona (serum)
547
- <span style="color:{GRN}"> AUC=0.791 ✅</span><br>
548
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R7</b> &nbsp;Flow corona — Vroman effect
549
- <span style="color:{GRN}"> ✅</span><br>
550
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R8</b> &nbsp;LNP brain / BBB / ApoE
551
- <span style="color:{GRN}"> ✅</span><br>
552
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R10</b> AutoCorona NLP
553
- <span style="color:{GRN}"> F1=0.71 ✅</span><br>
554
- &nbsp;&nbsp;&nbsp;└─ <b>S1-R11</b> CSF · Vitreous · Bone Marrow ⭐
555
- <span style="color:{DIM}"> 🔴 0 prior studies</span><br><br>
556
-
557
- <span style="color:{ACC2};font-weight:600">S1-E · PHYLO-BIOMARKERS</span>
558
- <span style="color:{DIM}"> — Detect without biopsy</span><br>
559
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R9</b> &nbsp;Liquid Biopsy classifier
560
- <span style="color:{GRN}"> AUC=0.992* ✅</span><br>
561
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R9b</b> Protein panel validator
562
- <span style="color:#f59e0b"> 🔶</span><br>
563
- &nbsp;&nbsp;&nbsp;└─ <b>S1-R9c</b> ctDNA gap analysis
564
- <span style="color:{DIM}"> 🔴</span><br><br>
565
-
566
- <span style="color:{ACC2};font-weight:600">S1-F · PHYLO-RARE</span>
567
- <span style="color:{DIM}"> — Where almost nobody has looked yet (&lt;300 cases/yr)</span><br>
568
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R12b</b> DIPG toolkit (H3K27M + CSF LNP + Circadian)
569
- <span style="color:#f59e0b"> 🔶 In development</span><br>
570
- &nbsp;&nbsp;&nbsp;├─ <b>S1-R12c</b> UVM toolkit (GNAQ/GNA11 + vitreous + m6A)
571
- <span style="color:#f59e0b"> 🔶 In development</span><br>
572
- &nbsp;&nbsp;&nbsp;└─ <b>S1-R12d</b> pAML toolkit (FLT3-ITD + BM niche + ferroptosis)
573
- <span style="color:#f59e0b"> 🔶 In development</span><br><br>
574
 
575
  <span style="color:{DIM};font-size:11px">
576
- ✅ Active in this demo &nbsp;·&nbsp; 🔶 In progress &nbsp;·&nbsp; 🔴 Planned / Frontier<br>
577
- ⭐ gap research (0–1 prior studies globally) &nbsp;·&nbsp; * tissue proxy, plasma validation pending
578
  </span>
579
  </div>
580
  """
581
 
582
  # ── UI ────────────────────────────────────────────────────────────────────────
583
- with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
584
 
585
  gr.Markdown(
586
- "# 🔬 K R&D Lab · Science Sphere — S1 Biomedical\n"
587
- "**Oksana Kolisnyk** · [KOSATIKS GROUP](https://kosatiks-group.pp.ua) &nbsp;|&nbsp; "
588
- "[GitHub](https://github.com/K-RnD-Lab) &nbsp; "
589
- "[HuggingFace](https://huggingface.co/K-RnD-Lab) &nbsp;|&nbsp; "
590
  "*Research only. Not clinical advice.*"
591
  )
592
 
593
- # ═══════════════════════════════════════════════════════
594
- # OUTER TABS — one per PHYLO-* category
595
- # ═════════════════���═════════════════════════════════════
596
  with gr.Tabs(elem_classes="outer-tabs"):
597
 
598
- # ── 🗺️ MAP ─────────────────────────────────────────
599
- with gr.TabItem("🗺️ Lab Map"):
600
  gr.HTML(MAP_HTML)
601
 
602
- # ── 🧬 S1-A · PHYLO-GENOMICS ───────────────────────
603
- with gr.TabItem("🧬 PHYLO-GENOMICS"):
604
  gr.HTML(section_header(
605
- "S1-A", "PHYLO-GENOMICS", "— What breaks in DNA",
606
- "S1-R1 OpenVariant ✅ &nbsp;·&nbsp; S1-R1b Somatic classifier 🔶 &nbsp;·&nbsp; S1-R12a Rare variants 🔴"
607
  ))
608
  with gr.Tabs(elem_classes="inner-tabs"):
609
 
610
- with gr.TabItem("S1-R1 · OpenVariant"):
611
- gr.HTML(proj_badge("S1-A · PHYLO-GENOMICS · S1-R1",
612
- "OpenVariant — SNV Pathogenicity Classifier", "AUC = 0.939"))
613
  hgvs = gr.Textbox(label="HGVS notation", placeholder="BRCA1:p.R1699Q")
614
  gr.Markdown("**Or enter functional scores manually:**")
615
  with gr.Row():
@@ -623,56 +590,56 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
623
  ["BRCA2:p.D2723A",0.01,0.98,0.0]], inputs=[hgvs,sift,pp,gn])
624
  b_v.click(predict_variant, [hgvs,sift,pp,gn], o_v)
625
 
626
- with gr.TabItem("S1-R1b · Somatic 🔶"):
627
- gr.HTML(proj_badge("S1-A · PHYLO-GENOMICS · S1-R1b",
628
- "Somatic Mutation Classifier — BRCA · LUAD panels", "🔶 In progress"))
629
  gr.Markdown("> This module is in active development. Coming in the next release.")
630
 
631
- # ── 🔬 S1-B · PHYLO-RNA ────────────────────────────
632
- with gr.TabItem("🔬 PHYLO-RNA"):
633
  gr.HTML(section_header(
634
- "S1-B", "PHYLO-RNA", "— How to silence it via RNA",
635
- "S1-R2 miRNA ✅ &nbsp;·&nbsp; S1-R3 siRNA ✅ &nbsp;·&nbsp; S1-R4 lncRNA ✅ &nbsp;·&nbsp; S1-R4b ASO ✅"
636
  ))
637
  with gr.Tabs(elem_classes="inner-tabs"):
638
 
639
- with gr.TabItem("S1-R2 · miRNA"):
640
- gr.HTML(proj_badge("S1-B · PHYLO-RNA · S1-R2",
641
- "miRNA Silencing — BRCA1/2 · TP53 tumor suppressors"))
642
  g1 = gr.Dropdown(["BRCA2","BRCA1","TP53"], value="BRCA2", label="Gene")
643
  b1 = gr.Button("Find miRNAs", variant="primary")
644
  o1 = gr.Dataframe(label="Top 5 downregulated miRNAs")
645
  gr.Examples([["BRCA2"],["BRCA1"],["TP53"]], inputs=[g1])
646
  b1.click(predict_mirna, g1, o1)
647
 
648
- with gr.TabItem("S1-R3 · siRNA"):
649
- gr.HTML(proj_badge("S1-B · PHYLO-RNA · S1-R3",
650
- "siRNA Synthetic Lethal — TP53-null · LUAD · BRCA · COAD"))
651
  g2 = gr.Dropdown(["LUAD","BRCA","COAD"], value="LUAD", label="Cancer type")
652
  b2 = gr.Button("Find Targets", variant="primary")
653
  o2 = gr.Dataframe(label="Top 5 synthetic lethal targets")
654
  gr.Examples([["LUAD"],["BRCA"],["COAD"]], inputs=[g2])
655
  b2.click(predict_sirna, g2, o2)
656
 
657
- with gr.TabItem("S1-R4 · lncRNA + ASO"):
658
- gr.HTML(proj_badge("S1-B · PHYLO-RNA · S1-R4 + S1-R4b",
659
- "lncRNA-TREM2 ceRNA Network + ASO Candidates · Alzheimer neuroinflammation"))
660
  b3 = gr.Button("Load Results", variant="primary")
661
  o3a = gr.Dataframe(label="ceRNA Network (S1-R4)")
662
  o3b = gr.Dataframe(label="ASO Candidates (S1-R4b)")
663
  b3.click(get_lncrna, [], [o3a, o3b])
664
 
665
- # ── 💊 S1-C · PHYLO-DRUG ───────────────────────────
666
- with gr.TabItem("💊 PHYLO-DRUG"):
667
  gr.HTML(section_header(
668
- "S1-C", "PHYLO-DRUG", "— Which molecule treats it",
669
- "S1-R5 FGFR3 ✅ &nbsp;·&nbsp; S1-R5b SL drug mapping 🔶 &nbsp;·&nbsp; S1-R13 m6A×Ferroptosis×Circadian 🔴⭐"
670
  ))
671
  with gr.Tabs(elem_classes="inner-tabs"):
672
 
673
- with gr.TabItem("S1-R5 · FGFR3"):
674
- gr.HTML(proj_badge("S1-C · PHYLO-DRUG · S1-R5",
675
- "FGFR3 RNA-Directed Drug Discovery · ChEMBL screen",
676
  "top score 0.793"))
677
  g4 = gr.Radio(["P1 (hairpin loop)","P10 (G-quadruplex)"],
678
  value="P1 (hairpin loop)", label="Target pocket")
@@ -682,25 +649,25 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
682
  gr.Examples([["P1 (hairpin loop)"],["P10 (G-quadruplex)"]], inputs=[g4])
683
  b4.click(predict_drug, g4, [o4t, o4p])
684
 
685
- with gr.TabItem("S1-R13 · Frontier 🔴⭐"):
686
- gr.HTML(proj_badge("S1-C · PHYLO-DRUG · S1-R13",
687
- "m6A × Ferroptosis × Circadian — Pan-cancer triad", "🔴 Frontier"))
688
  gr.Markdown(
689
  "> **Research gap:** This triple intersection has never been studied as an integrated system.\n\n"
690
- "> **Planned datasets:** TCGA-PAAD · GEO m6A atlases · Circadian gene panels\n\n"
691
  "> **Expected timeline:** Q3 2026"
692
  )
693
 
694
- # ── 🧪 S1-D · PHYLO-LNP ────────────────────────────
695
- with gr.TabItem("🧪 PHYLO-LNP"):
696
  gr.HTML(section_header(
697
- "S1-D", "PHYLO-LNP", "— How to deliver the drug to the cell",
698
- "S1-R6 Corona ✅ · S1-R7 Flow ✅ · S1-R8 Brain ✅ · S1-R10 NLP ✅ · S1-R11 CSF/BM 🔴⭐"
699
  ))
700
  with gr.Tabs(elem_classes="inner-tabs"):
701
 
702
- with gr.TabItem("S1-R6 · Corona"):
703
- gr.HTML(proj_badge("S1-D · PHYLO-LNP · S1-R6",
704
  "LNP Protein Corona (Serum)", "AUC = 0.791"))
705
  with gr.Row():
706
  sz = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
@@ -712,9 +679,9 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
712
  gr.Examples([[100,-5,1.5,"Ionizable"],[80,5,0.5,"Cationic"]], inputs=[sz,zt,pg,lp])
713
  b6.click(predict_corona, [sz,zt,pg,lp], o6)
714
 
715
- with gr.TabItem("S1-R7 · Flow"):
716
- gr.HTML(proj_badge("S1-D · PHYLO-LNP · S1-R7",
717
- "Flow Corona — Vroman Effect · albumin→ApoE kinetics"))
718
  with gr.Row():
719
  s8 = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
720
  z8 = gr.Slider(-40,10,value=-5,step=1,label="Zeta (mV)")
@@ -727,9 +694,9 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
727
  gr.Examples([[100,-5,1.5,"Ionizable",40],[150,5,0.5,"Cationic",10]], inputs=[s8,z8,pg8,ch8,fl8])
728
  b8.click(predict_flow, [s8,z8,pg8,ch8,fl8], [o8t,o8p])
729
 
730
- with gr.TabItem("S1-R8 · Brain"):
731
- gr.HTML(proj_badge("S1-D · PHYLO-LNP · S1-R8",
732
- "LNP Brain Delivery — ApoE% + BBB probability"))
733
  smi = gr.Textbox(label="Ionizable lipid SMILES",
734
  value="CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C")
735
  with gr.Row():
@@ -740,9 +707,9 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
740
  gr.Examples([["CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C",6.5,-3]], inputs=[smi,pk,zt9])
741
  b9.click(predict_bbb, [smi,pk,zt9], [o9t,o9p])
742
 
743
- with gr.TabItem("S1-R10 · NLP"):
744
- gr.HTML(proj_badge("S1-D · PHYLO-LNP · S1-R10",
745
- "AutoCorona NLP — structured data from PMC abstracts", "F1 = 0.71"))
746
  txt = gr.Textbox(lines=5,label="Paper abstract",placeholder="Paste abstract here...")
747
  b10 = gr.Button("Extract Data", variant="primary")
748
  o10j = gr.Code(label="Extracted JSON", language="json")
@@ -754,27 +721,27 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
754
  ]], inputs=[txt])
755
  b10.click(extract_corona, txt, [o10j, o10f])
756
 
757
- with gr.TabItem("S1-R11 · CSF/BM 🔴⭐"):
758
- gr.HTML(proj_badge("S1-D · PHYLO-LNP · S1-R11",
759
- "LNP Corona in CSF · Vitreous · Bone Marrow", "🔴 0 prior studies"))
760
  gr.Markdown(
761
  "> **Research gap:** Protein corona has only been characterized in serum/plasma. "
762
  "CSF, vitreous humor, and bone marrow interstitial fluid remain completely unstudied.\n\n"
763
- "> **Target cancers:** DIPG (CSF) · UVM (vitreous) · pAML (bone marrow)\n\n"
764
- "> **Expected timeline:** Q2–Q3 2026"
765
  )
766
 
767
- # ── 🩸 S1-E · PHYLO-BIOMARKERS ─────────────────────
768
- with gr.TabItem("🩸 PHYLO-BIOMARKERS"):
769
  gr.HTML(section_header(
770
- "S1-E", "PHYLO-BIOMARKERS", "— Detect cancer without tissue biopsy",
771
- "S1-R9 Liquid Biopsy ✅ &nbsp;·&nbsp; S1-R9b Panel validator 🔶 &nbsp;·&nbsp; S1-R9c ctDNA gap 🔴"
772
  ))
773
  with gr.Tabs(elem_classes="inner-tabs"):
774
 
775
- with gr.TabItem("S1-R9 · Liquid Biopsy"):
776
- gr.HTML(proj_badge("S1-E · PHYLO-BIOMARKERS · S1-R9",
777
- "Liquid Biopsy Classifier — CTHRC1 · FHL2 · LDHA panel",
778
  "AUC = 0.992*"))
779
  with gr.Row():
780
  p1=gr.Slider(-3,3,value=0,step=0.1,label="CTHRC1")
@@ -794,92 +761,149 @@ with gr.Blocks(css=css, title="K R&D Lab · S1 Biomedical") as demo:
794
  inputs=[p1,p2,p3,p4,p5,p6,p7,p8,p9,p10])
795
  b7.click(predict_cancer, [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10], [o7t,o7p])
796
 
797
- with gr.TabItem("S1-R9b · Validator 🔶"):
798
- gr.HTML(proj_badge("S1-E · PHYLO-BIOMARKERS · S1-R9b",
799
- "Protein Panel Validator — multi-cancer plasma validation", "🔶 In progress"))
800
- gr.Markdown("> Coming next — validates S1-R9 results against GEO plasma proteomics datasets.")
801
 
802
- # ── 📓 JOURNAL ──────────────────────────────────────
803
- with gr.TabItem("📓 Journal"):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
804
  gr.Markdown("### Lab Journal\nEvery tool call auto-logged with project code.")
805
  with gr.Row():
806
- note_text = gr.Textbox(label="📝 Observation", placeholder="What did you discover?", lines=3)
807
  note_tab = gr.Textbox(label="Project code (e.g. S1-R1)", value="General")
808
  note_last = gr.Textbox(visible=False)
809
- save_btn = gr.Button("💾 Save", variant="primary")
810
  save_msg = gr.Markdown()
811
- journal_df = gr.Dataframe(label="📋 Full History", value=load_journal(), interactive=False)
812
- refresh_btn = gr.Button("🔄 Refresh")
813
  refresh_btn.click(load_journal, [], journal_df)
814
  save_btn.click(save_note, [note_text,note_tab,note_last], [save_msg,journal_df])
815
 
816
- # ── 📚 LEARNING ─────────────────────────────────────
817
- with gr.TabItem("📚 Learning"):
818
  gr.Markdown("""
819
- ## 🧪 Guided Investigations — S1 Biomedical
820
- > 🟢 Beginner → 🟡 Intermediate → 🔴 Advanced
821
 
822
  ---
823
- ### 🟢 Case 1 · S1-A · S1-R1
824
  **Why does the same position give two different outcomes?**
825
- 1. PHYLO-GENOMICS → OpenVariant → `BRCA1:p.R1699Q` → Benign
826
- 2. Enter `BRCA1:p.R1699W` → Pathogenic
827
- 3. Same position, different amino acid — Q (polar) vs W (bulky-aromatic)
828
 
829
  ---
830
- ### 🟢 Case 2 · S1-D · S1-R6 + S1-R8
831
  **How does PEG% control which protein coats the nanoparticle?**
832
- 1. PHYLO-LNP → Corona → Ionizable, Zeta=−5, PEG=**0.5%** → note protein
833
- 2. Change PEG=**2.5%** → compare
834
- 3. Brain tab → pKa=6.5 → check ApoE%
835
 
836
  ---
837
- ### 🟡 Case 3 · S1-D · S1-R7
838
  **Does blood flow reshape the corona over time?**
839
- 1. PHYLO-LNP → Flow → Flow=0 → observe ApoE curve
840
- 2. Flow=40 (arterial) → compare
841
  3. At what minute does ApoE dominate?
842
 
843
  ---
844
- ### 🟡 Case 4 · S1-B · S1-R3
845
  **Which cancer has the most novel (undrugged) siRNA targets?**
846
- 1. PHYLO-RNA → siRNA → LUAD → count "Novel"
847
  2. Repeat BRCA, COAD
848
 
849
  ---
850
- ### 🔴 Case 5 · S1-E · S1-R9
851
  **Minimum protein signal that flips to CANCER?**
852
- 1. PHYLO-BIOMARKERS → Liquid Biopsy → all=0 → HEALTHY
853
- 2. Set CTHRC1=2.5, FHL2=2.0, LDHA=1.8 → observe
854
  3. Reset. Increase only CTHRC1 step by step.
855
 
856
  ---
857
- ### 🔴 Case 6 · S1-B + S1-C — Cross-tool convergence
858
- 1. PHYLO-RNA → miRNA → TP53 → find top targets (BCL2, CDK6)
859
- 2. PHYLO-DRUG → FGFR3 → check CDK6 pathway overlap
860
- 3. PHYLO-RNA → siRNA → BRCA → does CDK6 appear?
861
 
862
  ---
863
- ### 📖 Tool Index
864
  | Code | Module | Tool | Metric |
865
  |------|--------|------|--------|
866
  | S1-R1 | PHYLO-GENOMICS | OpenVariant | AUC=0.939 |
867
  | S1-R2 | PHYLO-RNA | miRNA silencing | top: hsa-miR-148a |
868
  | S1-R3 | PHYLO-RNA | siRNA SL | SPC24 top LUAD |
869
- | S1-R4 | PHYLO-RNA | lncRNA-TREM2 | CYTOR→AKT1 |
870
  | S1-R5 | PHYLO-DRUG | FGFR3 drug | score=0.793 |
871
  | S1-R6 | PHYLO-LNP | Corona | AUC=0.791 |
872
- | S1-R7 | PHYLO-LNP | Flow Vroman | 3–4× faster |
873
- | S1-R8 | PHYLO-LNP | LNP Brain | pKa 6.2–6.8 |
874
  | S1-R9 | PHYLO-BIOMARKERS | Liquid Biopsy | AUC=0.992* |
875
  | S1-R10 | PHYLO-LNP | AutoCorona NLP | F1=0.71 |
 
 
 
876
  """)
877
 
878
  gr.Markdown(
879
- "---\n**K R&D Lab** · Science Sphere · S1 Biomedical · "
880
- "[GitHub](https://github.com/K-RnD-Lab) · "
881
- "[HuggingFace](https://huggingface.co/K-RnD-Lab) · "
882
- "[KOSATIKS GROUP 🦈](https://kosatiks-group.pp.ua) · MIT License"
883
  )
884
 
885
- demo.launch(server_name="0.0.0.0", server_port=7860)
 
146
  "clusterin","igm","iga","igg","complement","transferrin",
147
  "alpha-2-macroglobulin"]
148
 
149
+ # ── S1-F · PHYLO-RARE DATABASES ───────────────────────────────────────────────
150
+ DIPG_VARIANTS = [
151
+ {"Variant":"H3K27M (H3F3A)","Freq_pct":78,"Pathway":"PRC2 inhibition -> global H3K27me3 loss","Drug_status":"ONC201 (clinical)","Circadian_gene":"BMAL1 suppressed"},
152
+ {"Variant":"ACVR1 p.R206H","Freq_pct":21,"Pathway":"BMP/SMAD hyperactivation","Drug_status":"LDN-193189 (preclinical)","Circadian_gene":"PER1 disrupted"},
153
+ {"Variant":"PIK3CA p.H1047R","Freq_pct":15,"Pathway":"PI3K/AKT/mTOR","Drug_status":"Copanlisib (clinical)","Circadian_gene":"CRY1 altered"},
154
+ {"Variant":"TP53 p.R248W","Freq_pct":14,"Pathway":"DNA damage response loss","Drug_status":"APR-246 (clinical)","Circadian_gene":"p53-CLOCK axis"},
155
+ {"Variant":"PDGFRA amp","Freq_pct":13,"Pathway":"RTK/RAS signalling","Drug_status":"Avapritinib (clinical)","Circadian_gene":"REV-ERB altered"},
156
+ ]
157
+ DIPG_CSF_LNP = [
158
+ {"Formulation":"MC3-DSPC-Chol-PEG","Size_nm":92,"Zeta_mV":-4.1,"CSF_protein":"Beta2-microglobulin","ApoE_pct":12.4,"BBB_est":0.41,"Priority":"HIGH"},
159
+ {"Formulation":"DLin-KC2-DSPE-PEG","Size_nm":87,"Zeta_mV":-3.8,"CSF_protein":"Cystatin C","ApoE_pct":14.1,"BBB_est":0.47,"Priority":"HIGH"},
160
+ {"Formulation":"C12-200-DOPE-PEG","Size_nm":103,"Zeta_mV":-5.2,"CSF_protein":"Albumin (low)","ApoE_pct":9.8,"BBB_est":0.33,"Priority":"MEDIUM"},
161
+ {"Formulation":"DODAP-DSPC-Chol","Size_nm":118,"Zeta_mV":-2.1,"CSF_protein":"Transferrin","ApoE_pct":7.2,"BBB_est":0.24,"Priority":"LOW"},
162
+ ]
163
+ UVM_VARIANTS = [
164
+ {"Variant":"GNAQ p.Q209L","Freq_pct":46,"Pathway":"PLCb -> PKC -> MAPK","Drug_status":"Darovasertib (clinical)","m6A_writer":"METTL3 upregulated"},
165
+ {"Variant":"GNA11 p.Q209L","Freq_pct":32,"Pathway":"PLCb -> PKC -> MAPK","Drug_status":"Darovasertib (clinical)","m6A_writer":"WTAP upregulated"},
166
+ {"Variant":"BAP1 loss","Freq_pct":47,"Pathway":"Chromatin remodeling -> metastasis","Drug_status":"No approved (HDAC trials)","m6A_writer":"FTO overexpressed"},
167
+ {"Variant":"SF3B1 p.R625H","Freq_pct":19,"Pathway":"Splicing alteration -> neoepitopes","Drug_status":"H3B-8800 (clinical)","m6A_writer":"METTL14 altered"},
168
+ {"Variant":"EIF1AX p.A113_splice","Freq_pct":14,"Pathway":"Translation initiation","Drug_status":"Novel -- no drug","m6A_writer":"YTHDF2 suppressed"},
169
+ ]
170
+ UVM_VITREOUS_LNP = [
171
+ {"Formulation":"SM-102-DSPC-Chol-PEG","Vitreal_protein":"Hyaluronan-binding","Size_nm":95,"Zeta_mV":-3.2,"Retention_h":18,"Priority":"HIGH"},
172
+ {"Formulation":"Lipid-H-DOPE-PEG","Vitreal_protein":"Vitronectin dominant","Size_nm":88,"Zeta_mV":-4.0,"Retention_h":22,"Priority":"HIGH"},
173
+ {"Formulation":"DOTAP-DSPC-PEG","Vitreal_protein":"Albumin wash-out","Size_nm":112,"Zeta_mV":+2.1,"Retention_h":6,"Priority":"LOW"},
174
+ {"Formulation":"MC3-DPPC-Chol","Vitreal_protein":"Clusterin-rich","Size_nm":101,"Zeta_mV":-2.8,"Retention_h":14,"Priority":"MEDIUM"},
175
+ ]
176
+ PAML_VARIANTS = [
177
+ {"Variant":"FLT3-ITD","Freq_pct":25,"Pathway":"RTK constitutive activation -> JAK/STAT","Drug_status":"Midostaurin (approved)","Ferroptosis":"GPX4 suppressed"},
178
+ {"Variant":"NPM1 c.860_863dupTCAG","Freq_pct":30,"Pathway":"Nuclear export deregulation","Drug_status":"APR-548 combo (clinical)","Ferroptosis":"SLC7A11 upregulated"},
179
+ {"Variant":"DNMT3A p.R882H","Freq_pct":18,"Pathway":"Epigenetic dysregulation","Drug_status":"Azacitidine (approved)","Ferroptosis":"ACSL4 altered"},
180
+ {"Variant":"CEBPA biallelic","Freq_pct":8,"Pathway":"Myeloid differentiation block","Drug_status":"Novel target","Ferroptosis":"NRF2 pathway"},
181
+ {"Variant":"IDH1/2 mutation","Freq_pct":15,"Pathway":"2-HG oncometabolite -> TET2 inhibition","Drug_status":"Enasidenib (approved)","Ferroptosis":"Iron metabolism disrupted"},
182
+ ]
183
+ PAML_BM_LNP = [
184
+ {"Formulation":"ALC-0315-DSPC-Chol-PEG","BM_protein":"ApoE + Clusterin","Size_nm":98,"Zeta_mV":-3.5,"Marrow_uptake_pct":34,"Priority":"HIGH"},
185
+ {"Formulation":"MC3-DOPE-Chol-PEG","BM_protein":"Fibronectin dominant","Size_nm":105,"Zeta_mV":-4.2,"Marrow_uptake_pct":28,"Priority":"HIGH"},
186
+ {"Formulation":"DLin-MC3-DPPC","BM_protein":"Vitronectin-rich","Size_nm":91,"Zeta_mV":-2.9,"Marrow_uptake_pct":19,"Priority":"MEDIUM"},
187
+ {"Formulation":"Cationic-DOTAP-Chol","BM_protein":"Opsonin-heavy","Size_nm":132,"Zeta_mV":+8.1,"Marrow_uptake_pct":8,"Priority":"LOW"},
188
+ ]
189
+
190
  # ── LOGIC ─────────────────────────────────────────────────────────────────────
191
  def predict_mirna(gene):
192
  df = pd.DataFrame(MIRNA_DB.get(gene, []))
 
209
  ax.barh(df["Compound"], df["Final_score"], color=ACC)
210
  ax.set_xlabel("Final Score", color=TXT); ax.tick_params(colors=TXT)
211
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
212
+ ax.set_title(f"Top compounds - {pocket}", color=TXT, fontsize=10)
213
  plt.tight_layout()
214
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
215
  log_entry("S1-C | S1-R5 | Drug", pocket, f"Top: {df.iloc[0]['Compound'] if len(df) else 'none'}")
 
228
  cls = "Pathogenic" if score > 0.6 else "Likely Pathogenic" if score > 0.4 else "Benign"
229
  conf = "High" if (sift < 0.01 or sift > 0.9) else "Moderate"
230
  colour = RED if "Pathogenic" in cls else GRN
231
+ icon = "WARNING" if "Pathogenic" in cls else "OK"
232
  log_entry("S1-A | S1-R1 | OpenVariant", hgvs or f"SIFT={sift}", f"{cls} score={score}")
233
+ bar_w = int(score * 100)
234
  return (
235
+ f"<div style='background:{CARD};padding:16px;border-radius:8px;font-family:sans-serif;color:{TXT}'>"
236
+ f"<p style='font-size:11px;color:{DIM};margin:0 0 8px'>S1-A · PHYLO-GENOMICS · S1-R1</p>"
237
+ f"<h3 style='color:{colour};margin:0 0 8px'>{icon} {cls}</h3>"
238
+ f"<p>Score: <b>{score:.3f}</b> | Confidence: <b>{conf}</b></p>"
239
+ f"<div style='background:{BORDER};border-radius:4px;height:14px'>"
240
+ f"<div style='background:{colour};height:14px;border-radius:4px;width:{bar_w}%'></div></div>"
241
+ f"<p style='margin-top:12px'>{PLAIN.get(cls,'')}</p>"
242
+ f"<p style='font-size:11px;color:{DIM}'>Research only. Not clinical advice.</p></div>"
243
  )
244
 
245
  def predict_corona(size, zeta, peg, lipid):
 
274
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
275
  log_entry("S1-E | S1-R9 | LiquidBiopsy", f"CTHRC1={c1},FHL2={c2}", f"{label} {prob:.2f}")
276
  return (
277
+ f"<div style='background:{CARD};padding:14px;border-radius:8px;font-family:sans-serif;'>"
278
+ f"<p style='font-size:11px;color:{DIM};margin:0 0 6px'>S1-E · PHYLO-BIOMARKERS · S1-R9</p>"
279
+ f"<span style='color:{colour};font-size:24px;font-weight:bold'>{label}</span><br>"
280
+ f"<span style='color:{TXT};font-size:14px'>Probability: {prob:.2f}</span></div>"
281
  ), Image.open(buf)
282
 
283
  def predict_flow(size, zeta, peg, charge, flow_rate):
 
294
  ax.set_xlabel("Time (min)", color=TXT); ax.set_ylabel("% Corona", color=TXT)
295
  ax.tick_params(colors=TXT); ax.legend(fontsize=7, labelcolor=TXT, facecolor=CARD)
296
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
297
+ ax.set_title("Vroman Effect - flow vs static", color=TXT, fontsize=9)
298
  plt.tight_layout()
299
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
300
  log_entry("S1-D | S1-R7 | FlowCorona", f"flow={flow_rate}", f"CSI={csi}")
301
+ return f"**Corona Shift Index: {csi}** - {stability}", Image.open(buf)
302
 
303
  def predict_bbb(smiles, pka, zeta):
304
  logp = smiles.count("C")*0.3 - smiles.count("O")*0.5 + 1.5
 
317
  plt.tight_layout()
318
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
319
  log_entry("S1-D | S1-R8 | LNPBrain", f"pka={pka},zeta={zeta}", f"ApoE={apoe_pct:.1f}%")
320
+ return f"**Predicted ApoE:** {apoe_pct:.1f}% - {tier}\n\n**BBB Probability:** {bbb_prob:.2f}", Image.open(buf)
321
 
322
  def extract_corona(text):
323
  out = {"nanoparticle_composition":"","size_nm":None,"zeta_mv":None,"PDI":None,
 
342
  log_entry("S1-D | S1-R10 | NLP", text[:80], f"proteins={len(out['corona_proteins'])}")
343
  return json.dumps(out, indent=2), summary
344
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
345
  # ── S1-F · PHYLO-RARE LOGIC ───────────────────────────────────────────────────
346
  def dipg_variants(sort_by):
347
  df = pd.DataFrame(DIPG_VARIANTS).sort_values(
 
360
  ax.set_xlabel("ApoE% in CSF corona", color=TXT)
361
  ax.tick_params(colors=TXT, labelsize=8)
362
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
363
+ ax.set_title("DIPG - CSF LNP formulations (ApoE%)", color=TXT, fontsize=9)
364
  plt.tight_layout()
365
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
366
  log_entry("S1-F | S1-R12b | DIPG-CSF", f"peg={peg},size={size}", "formulation ranking")
 
380
  ax.set_xlabel("Vitreous retention (hours)", color=TXT)
381
  ax.tick_params(colors=TXT, labelsize=8)
382
  for sp in ax.spines.values(): sp.set_edgecolor(BORDER)
383
+ ax.set_title("UVM - LNP retention in vitreous humor", color=TXT, fontsize=9)
384
  plt.tight_layout()
385
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
386
  log_entry("S1-F | S1-R12c | UVM-vitreous", "load", "vitreous LNP ranking")
 
388
 
389
  def paml_ferroptosis(variant):
390
  row = next((r for r in PAML_VARIANTS if variant in r["Variant"]), PAML_VARIANTS[0])
 
391
  ferr_map = {"GPX4 suppressed": 0.85, "SLC7A11 upregulated": 0.72,
392
  "ACSL4 altered": 0.61, "NRF2 pathway": 0.55, "Iron metabolism disrupted": 0.78}
393
  ferr_score = ferr_map.get(row["Ferroptosis"], 0.5)
394
  cats = ["Ferroptosis\nsensitivity", "Drug\navailable", "BM niche\ncoverage", "Data\nmaturity", "Target\nnovelty"]
395
+ has_drug = 0.9 if row["Drug_status"] != "Novel target" else 0.3
396
  vals = [ferr_score, has_drug, 0.6, 0.55, 1-has_drug+0.2]
397
  angles = np.linspace(0, 2*np.pi, len(cats), endpoint=False).tolist()
398
  v2, a2 = vals+[vals[0]], angles+[angles[0]]
 
401
  ax.plot(a2, v2, color=ACC2, linewidth=2); ax.fill(a2, v2, color=ACC2, alpha=0.2)
402
  ax.set_xticks(angles); ax.set_xticklabels(cats, color=TXT, fontsize=8)
403
  ax.tick_params(colors=TXT)
404
+ ax.set_title(f"pAML - {row['Variant'][:20]}", color=TXT, fontsize=9)
405
  plt.tight_layout()
406
  buf = BytesIO(); plt.savefig(buf, format="png", dpi=120, facecolor=CARD); plt.close(); buf.seek(0)
407
  log_entry("S1-F | S1-R12d | pAML-ferroptosis", variant, f"ferr={ferr_score:.2f}")
 
412
  _fs = f"{ferr_score:.2f}"
413
  summary = (
414
  f"<div style='background:{CARD};padding:14px;border-radius:8px;font-family:sans-serif;'>"
415
+ f"<p style='color:{DIM};font-size:11px;margin:0 0 6px'>S1-F - PHYLO-RARE - S1-R12d - pAML</p>"
416
  f"<b style='color:{ACC2};font-size:15px'>{_v}</b><br>"
417
  f"<p style='color:{TXT};margin:6px 0'><b>Pathway:</b> {_p}</p>"
418
  f"<p style='color:{TXT};margin:0'><b>Drug:</b> {_d}</p>"
 
426
  # ── HELPERS ───────────────────────────────────────────────────────────────────
427
  def section_header(code, name, tagline, projects_html):
428
  return (
429
+ f"<div style='background:{BG};border:1px solid {BORDER};padding:14px 18px;"
430
+ f"border-radius:8px;margin-bottom:12px;'>"
431
+ f"<div style='display:flex;align-items:baseline;gap:10px;'>"
432
+ f"<span style='color:{ACC2};font-size:16px;font-weight:700'>{code}</span>"
433
+ f"<span style='color:{TXT};font-size:14px;font-weight:600'>{name}</span>"
434
+ f"<span style='color:{DIM};font-size:12px'>{tagline}</span></div>"
435
+ f"<div style='margin-top:8px;font-size:12px;color:{DIM}'>{projects_html}</div>"
436
  f"</div>"
437
  )
438
 
439
  def proj_badge(code, title, metric=""):
440
+ m = (f"<span style='background:#0f2a3f;color:{ACC2};padding:1px 7px;border-radius:3px;"
441
+ f"font-size:10px;margin-left:6px'>{metric}</span>") if metric else ""
442
  return (
443
+ f"<div style='background:{CARD};border-left:3px solid {ACC};"
444
+ f"padding:8px 12px;border-radius:0 6px 6px 0;margin-bottom:8px;'>"
445
+ f"<span style='color:{DIM};font-size:11px'>{code}</span>{m}<br>"
446
+ f"<span style='color:{TXT};font-size:14px;font-weight:600'>{title}</span>"
447
  f"</div>"
448
  )
449
 
 
451
  css = f"""
452
  body, .gradio-container {{ background: {BG} !important; color: {TXT} !important; }}
453
 
 
454
  .outer-tabs .tab-nav button {{
455
  color: {TXT} !important;
456
  background: {CARD} !important;
 
465
  background: {BG} !important;
466
  }}
467
 
 
468
  .inner-tabs .tab-nav button {{
469
  color: {DIM} !important;
470
  background: {BG} !important;
 
499
  <div style="background:{CARD};padding:22px;border-radius:8px;font-family:monospace;
500
  font-size:13px;line-height:2.0;color:{TXT}">
501
 
502
+ <span style="color:{ACC};font-size:16px;font-weight:bold">K R&D Lab - S1 Biomedical</span>
503
+ <span style="color:{DIM};font-size:11px;margin-left:12px">Science Sphere - sub-direction 1</span>
504
  <br><br>
505
 
506
+ <span style="color:{ACC2};font-weight:600">S1-A - PHYLO-GENOMICS</span>
507
+ <span style="color:{DIM}"> - What breaks in DNA</span><br>
508
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R1</b> &nbsp;OpenVariant <span style="color:{GRN}"> AUC=0.939 OK</span><br>
509
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R1b</b> Somatic classifier <span style="color:#f59e0b"> In progress</span><br>
510
+ &nbsp;&nbsp;&nbsp;+- <b>S1-R12a</b> Rare variants (DIPG / UVM) <span style="color:{DIM}"> Planned</span><br><br>
511
+
512
+ <span style="color:{ACC2};font-weight:600">S1-B - PHYLO-RNA</span>
513
+ <span style="color:{DIM}"> - How to silence it via RNA</span><br>
514
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R2</b> &nbsp;miRNA silencing (BRCA1/2, TP53) <span style="color:{GRN}"> OK</span><br>
515
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R3</b> &nbsp;siRNA synthetic lethal (LUAD / BRCA / COAD) <span style="color:{GRN}"> OK</span><br>
516
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R4</b> &nbsp;lncRNA-TREM2 ceRNA network <span style="color:{GRN}"> OK</span><br>
517
+ &nbsp;&nbsp;&nbsp;+- <b>S1-R4b</b> ASO designer <span style="color:{GRN}"> OK</span><br><br>
518
+
519
+ <span style="color:{ACC2};font-weight:600">S1-C - PHYLO-DRUG</span>
520
+ <span style="color:{DIM}"> - Which molecule treats it</span><br>
521
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R5</b> &nbsp;FGFR3 RNA-directed compounds <span style="color:{GRN}"> OK</span><br>
522
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R5b</b> Synthetic lethal drug mapping <span style="color:#f59e0b"> In progress</span><br>
523
+ &nbsp;&nbsp;&nbsp;+- <b>S1-R13</b> m6A x Ferroptosis x Circadian * <span style="color:{DIM}"> Frontier</span><br><br>
524
+
525
+ <span style="color:{ACC2};font-weight:600">S1-D - PHYLO-LNP</span>
526
+ <span style="color:{DIM}"> - How to deliver the drug</span><br>
527
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R6</b> &nbsp;LNP corona (serum) <span style="color:{GRN}"> AUC=0.791 OK</span><br>
528
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R7</b> &nbsp;Flow corona - Vroman effect <span style="color:{GRN}"> OK</span><br>
529
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R8</b> &nbsp;LNP brain / BBB / ApoE <span style="color:{GRN}"> OK</span><br>
530
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R10</b> AutoCorona NLP <span style="color:{GRN}"> F1=0.71 OK</span><br>
531
+ &nbsp;&nbsp;&nbsp;+- <b>S1-R11</b> CSF / Vitreous / Bone Marrow * <span style="color:{DIM}"> 0 prior studies</span><br><br>
532
+
533
+ <span style="color:{ACC2};font-weight:600">S1-E - PHYLO-BIOMARKERS</span>
534
+ <span style="color:{DIM}"> - Detect without biopsy</span><br>
535
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R9</b> &nbsp;Liquid Biopsy classifier <span style="color:{GRN}"> AUC=0.992* OK</span><br>
536
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R9b</b> Protein panel validator <span style="color:#f59e0b"> In progress</span><br>
537
+ &nbsp;&nbsp;&nbsp;+- <b>S1-R9c</b> ctDNA gap analysis <span style="color:{DIM}"> Planned</span><br><br>
538
+
539
+ <span style="color:{ACC2};font-weight:600">S1-F - PHYLO-RARE</span>
540
+ <span style="color:{DIM}"> - Where almost nobody has looked yet (&lt;300 cases/yr)</span><br>
541
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R12b</b> DIPG toolkit (H3K27M + CSF LNP + Circadian) <span style="color:#f59e0b"> In development</span><br>
542
+ &nbsp;&nbsp;&nbsp;|- <b>S1-R12c</b> UVM toolkit (GNAQ/GNA11 + vitreous + m6A) <span style="color:#f59e0b"> In development</span><br>
543
+ &nbsp;&nbsp;&nbsp;+- <b>S1-R12d</b> pAML toolkit (FLT3-ITD + BM niche + ferroptosis) <span style="color:#f59e0b"> In development</span><br><br>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
544
 
545
  <span style="color:{DIM};font-size:11px">
546
+ OK = Active in this demo &nbsp;|&nbsp; In progress &nbsp;|&nbsp; Planned / Frontier<br>
547
+ * gap research (0-1 prior studies globally) &nbsp;|&nbsp; * tissue proxy, plasma validation pending
548
  </span>
549
  </div>
550
  """
551
 
552
  # ── UI ────────────────────────────────────────────────────────────────────────
553
+ with gr.Blocks(css=css, title="K R&D Lab - S1 Biomedical") as demo:
554
 
555
  gr.Markdown(
556
+ "# K R&D Lab - Science Sphere - S1 Biomedical\n"
557
+ "**Oksana Kolisnyk** - [KOSATIKS GROUP](https://kosatiks-group.pp.ua) | "
558
+ "[GitHub](https://github.com/K-RnD-Lab) "
559
+ "[HuggingFace](https://huggingface.co/K-RnD-Lab) | "
560
  "*Research only. Not clinical advice.*"
561
  )
562
 
 
 
 
563
  with gr.Tabs(elem_classes="outer-tabs"):
564
 
565
+ # ── MAP ─────────────────────────────────────────────
566
+ with gr.Tab("Lab Map"):
567
  gr.HTML(MAP_HTML)
568
 
569
+ # ── S1-A PHYLO-GENOMICS ─────────────────────────────
570
+ with gr.Tab("S1-A PHYLO-GENOMICS"):
571
  gr.HTML(section_header(
572
+ "S1-A", "PHYLO-GENOMICS", "- What breaks in DNA",
573
+ "S1-R1 OpenVariant OK &nbsp;|&nbsp; S1-R1b Somatic classifier in progress &nbsp;|&nbsp; S1-R12a Rare variants planned"
574
  ))
575
  with gr.Tabs(elem_classes="inner-tabs"):
576
 
577
+ with gr.Tab("S1-R1 OpenVariant"):
578
+ gr.HTML(proj_badge("S1-A - PHYLO-GENOMICS - S1-R1",
579
+ "OpenVariant - SNV Pathogenicity Classifier", "AUC = 0.939"))
580
  hgvs = gr.Textbox(label="HGVS notation", placeholder="BRCA1:p.R1699Q")
581
  gr.Markdown("**Or enter functional scores manually:**")
582
  with gr.Row():
 
590
  ["BRCA2:p.D2723A",0.01,0.98,0.0]], inputs=[hgvs,sift,pp,gn])
591
  b_v.click(predict_variant, [hgvs,sift,pp,gn], o_v)
592
 
593
+ with gr.Tab("S1-R1b Somatic"):
594
+ gr.HTML(proj_badge("S1-A - PHYLO-GENOMICS - S1-R1b",
595
+ "Somatic Mutation Classifier - BRCA / LUAD panels", "In progress"))
596
  gr.Markdown("> This module is in active development. Coming in the next release.")
597
 
598
+ # ── S1-B PHYLO-RNA ──────────────────────────────────
599
+ with gr.Tab("S1-B PHYLO-RNA"):
600
  gr.HTML(section_header(
601
+ "S1-B", "PHYLO-RNA", "- How to silence it via RNA",
602
+ "S1-R2 miRNA OK &nbsp;|&nbsp; S1-R3 siRNA OK &nbsp;|&nbsp; S1-R4 lncRNA OK &nbsp;|&nbsp; S1-R4b ASO OK"
603
  ))
604
  with gr.Tabs(elem_classes="inner-tabs"):
605
 
606
+ with gr.Tab("S1-R2 miRNA"):
607
+ gr.HTML(proj_badge("S1-B - PHYLO-RNA - S1-R2",
608
+ "miRNA Silencing - BRCA1/2 / TP53 tumor suppressors"))
609
  g1 = gr.Dropdown(["BRCA2","BRCA1","TP53"], value="BRCA2", label="Gene")
610
  b1 = gr.Button("Find miRNAs", variant="primary")
611
  o1 = gr.Dataframe(label="Top 5 downregulated miRNAs")
612
  gr.Examples([["BRCA2"],["BRCA1"],["TP53"]], inputs=[g1])
613
  b1.click(predict_mirna, g1, o1)
614
 
615
+ with gr.Tab("S1-R3 siRNA"):
616
+ gr.HTML(proj_badge("S1-B - PHYLO-RNA - S1-R3",
617
+ "siRNA Synthetic Lethal - TP53-null / LUAD / BRCA / COAD"))
618
  g2 = gr.Dropdown(["LUAD","BRCA","COAD"], value="LUAD", label="Cancer type")
619
  b2 = gr.Button("Find Targets", variant="primary")
620
  o2 = gr.Dataframe(label="Top 5 synthetic lethal targets")
621
  gr.Examples([["LUAD"],["BRCA"],["COAD"]], inputs=[g2])
622
  b2.click(predict_sirna, g2, o2)
623
 
624
+ with gr.Tab("S1-R4 lncRNA ASO"):
625
+ gr.HTML(proj_badge("S1-B - PHYLO-RNA - S1-R4 + S1-R4b",
626
+ "lncRNA-TREM2 ceRNA Network + ASO Candidates - Alzheimer neuroinflammation"))
627
  b3 = gr.Button("Load Results", variant="primary")
628
  o3a = gr.Dataframe(label="ceRNA Network (S1-R4)")
629
  o3b = gr.Dataframe(label="ASO Candidates (S1-R4b)")
630
  b3.click(get_lncrna, [], [o3a, o3b])
631
 
632
+ # ── S1-C PHYLO-DRUG ─────────────────────────────────
633
+ with gr.Tab("S1-C PHYLO-DRUG"):
634
  gr.HTML(section_header(
635
+ "S1-C", "PHYLO-DRUG", "- Which molecule treats it",
636
+ "S1-R5 FGFR3 OK &nbsp;|&nbsp; S1-R5b SL drug mapping in progress &nbsp;|&nbsp; S1-R13 m6A x Ferroptosis x Circadian frontier"
637
  ))
638
  with gr.Tabs(elem_classes="inner-tabs"):
639
 
640
+ with gr.Tab("S1-R5 FGFR3"):
641
+ gr.HTML(proj_badge("S1-C - PHYLO-DRUG - S1-R5",
642
+ "FGFR3 RNA-Directed Drug Discovery - ChEMBL screen",
643
  "top score 0.793"))
644
  g4 = gr.Radio(["P1 (hairpin loop)","P10 (G-quadruplex)"],
645
  value="P1 (hairpin loop)", label="Target pocket")
 
649
  gr.Examples([["P1 (hairpin loop)"],["P10 (G-quadruplex)"]], inputs=[g4])
650
  b4.click(predict_drug, g4, [o4t, o4p])
651
 
652
+ with gr.Tab("S1-R13 Frontier"):
653
+ gr.HTML(proj_badge("S1-C - PHYLO-DRUG - S1-R13",
654
+ "m6A x Ferroptosis x Circadian - Pan-cancer triad", "Frontier"))
655
  gr.Markdown(
656
  "> **Research gap:** This triple intersection has never been studied as an integrated system.\n\n"
657
+ "> **Planned datasets:** TCGA-PAAD - GEO m6A atlases - Circadian gene panels\n\n"
658
  "> **Expected timeline:** Q3 2026"
659
  )
660
 
661
+ # ── S1-D PHYLO-LNP ──────────────────────────────────
662
+ with gr.Tab("S1-D PHYLO-LNP"):
663
  gr.HTML(section_header(
664
+ "S1-D", "PHYLO-LNP", "- How to deliver the drug to the cell",
665
+ "S1-R6 Corona OK | S1-R7 Flow OK | S1-R8 Brain OK | S1-R10 NLP OK | S1-R11 CSF/BM frontier"
666
  ))
667
  with gr.Tabs(elem_classes="inner-tabs"):
668
 
669
+ with gr.Tab("S1-R6 Corona"):
670
+ gr.HTML(proj_badge("S1-D - PHYLO-LNP - S1-R6",
671
  "LNP Protein Corona (Serum)", "AUC = 0.791"))
672
  with gr.Row():
673
  sz = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
 
679
  gr.Examples([[100,-5,1.5,"Ionizable"],[80,5,0.5,"Cationic"]], inputs=[sz,zt,pg,lp])
680
  b6.click(predict_corona, [sz,zt,pg,lp], o6)
681
 
682
+ with gr.Tab("S1-R7 Flow"):
683
+ gr.HTML(proj_badge("S1-D - PHYLO-LNP - S1-R7",
684
+ "Flow Corona - Vroman Effect - albumin to ApoE kinetics"))
685
  with gr.Row():
686
  s8 = gr.Slider(50,300,value=100,step=1,label="Size (nm)")
687
  z8 = gr.Slider(-40,10,value=-5,step=1,label="Zeta (mV)")
 
694
  gr.Examples([[100,-5,1.5,"Ionizable",40],[150,5,0.5,"Cationic",10]], inputs=[s8,z8,pg8,ch8,fl8])
695
  b8.click(predict_flow, [s8,z8,pg8,ch8,fl8], [o8t,o8p])
696
 
697
+ with gr.Tab("S1-R8 Brain"):
698
+ gr.HTML(proj_badge("S1-D - PHYLO-LNP - S1-R8",
699
+ "LNP Brain Delivery - ApoE% + BBB probability"))
700
  smi = gr.Textbox(label="Ionizable lipid SMILES",
701
  value="CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C")
702
  with gr.Row():
 
707
  gr.Examples([["CC(C)CC(=O)OCC(COC(=O)CC(C)C)OC(=O)CC(C)C",6.5,-3]], inputs=[smi,pk,zt9])
708
  b9.click(predict_bbb, [smi,pk,zt9], [o9t,o9p])
709
 
710
+ with gr.Tab("S1-R10 NLP"):
711
+ gr.HTML(proj_badge("S1-D - PHYLO-LNP - S1-R10",
712
+ "AutoCorona NLP - structured data from PMC abstracts", "F1 = 0.71"))
713
  txt = gr.Textbox(lines=5,label="Paper abstract",placeholder="Paste abstract here...")
714
  b10 = gr.Button("Extract Data", variant="primary")
715
  o10j = gr.Code(label="Extracted JSON", language="json")
 
721
  ]], inputs=[txt])
722
  b10.click(extract_corona, txt, [o10j, o10f])
723
 
724
+ with gr.Tab("S1-R11 CSF/BM"):
725
+ gr.HTML(proj_badge("S1-D - PHYLO-LNP - S1-R11",
726
+ "LNP Corona in CSF / Vitreous / Bone Marrow", "0 prior studies"))
727
  gr.Markdown(
728
  "> **Research gap:** Protein corona has only been characterized in serum/plasma. "
729
  "CSF, vitreous humor, and bone marrow interstitial fluid remain completely unstudied.\n\n"
730
+ "> **Target cancers:** DIPG (CSF) / UVM (vitreous) / pAML (bone marrow)\n\n"
731
+ "> **Expected timeline:** Q2-Q3 2026"
732
  )
733
 
734
+ # ── S1-E PHYLO-BIOMARKERS ───────────────────────────
735
+ with gr.Tab("S1-E PHYLO-BIOMARKERS"):
736
  gr.HTML(section_header(
737
+ "S1-E", "PHYLO-BIOMARKERS", "- Detect cancer without tissue biopsy",
738
+ "S1-R9 Liquid Biopsy OK &nbsp;|&nbsp; S1-R9b Panel validator in progress &nbsp;|&nbsp; S1-R9c ctDNA gap planned"
739
  ))
740
  with gr.Tabs(elem_classes="inner-tabs"):
741
 
742
+ with gr.Tab("S1-R9 Liquid Biopsy"):
743
+ gr.HTML(proj_badge("S1-E - PHYLO-BIOMARKERS - S1-R9",
744
+ "Liquid Biopsy Classifier - CTHRC1 / FHL2 / LDHA panel",
745
  "AUC = 0.992*"))
746
  with gr.Row():
747
  p1=gr.Slider(-3,3,value=0,step=0.1,label="CTHRC1")
 
761
  inputs=[p1,p2,p3,p4,p5,p6,p7,p8,p9,p10])
762
  b7.click(predict_cancer, [p1,p2,p3,p4,p5,p6,p7,p8,p9,p10], [o7t,o7p])
763
 
764
+ with gr.Tab("S1-R9b Validator"):
765
+ gr.HTML(proj_badge("S1-E - PHYLO-BIOMARKERS - S1-R9b",
766
+ "Protein Panel Validator - multi-cancer plasma validation", "In progress"))
767
+ gr.Markdown("> Coming next - validates S1-R9 results against GEO plasma proteomics datasets.")
768
 
769
+ # ── S1-F PHYLO-RARE ─────────────────────────────────
770
+ with gr.Tab("S1-F PHYLO-RARE"):
771
+ gr.HTML(section_header(
772
+ "S1-F", "PHYLO-RARE", "- Where almost nobody has looked yet (<300 cases/yr)",
773
+ "S1-R12b DIPG in development &nbsp;|&nbsp; S1-R12c UVM in development &nbsp;|&nbsp; S1-R12d pAML in development"
774
+ ))
775
+ with gr.Tabs(elem_classes="inner-tabs"):
776
+
777
+ with gr.Tab("S1-R12b DIPG"):
778
+ gr.HTML(proj_badge("S1-F - PHYLO-RARE - S1-R12b",
779
+ "DIPG - H3K27M + CSF LNP + Circadian clock", "In development"))
780
+ gr.Markdown("**Variant landscape:**")
781
+ sort_by = gr.Radio(["Frequency","Drug status"], value="Frequency", label="Sort by")
782
+ b_dv = gr.Button("Load DIPG Variants", variant="primary")
783
+ o_dv = gr.Dataframe(label="DIPG variants")
784
+ b_dv.click(dipg_variants, sort_by, o_dv)
785
+
786
+ gr.Markdown("**CSF LNP formulation screen:**")
787
+ with gr.Row():
788
+ dipg_peg = gr.Slider(0,5,value=1.5,step=0.1,label="PEG mol%")
789
+ dipg_size = gr.Slider(50,200,value=95,step=5,label="Target size (nm)")
790
+ b_dc = gr.Button("Rank CSF Formulations", variant="primary")
791
+ o_dc_t = gr.Dataframe(label="CSF LNP ranking")
792
+ o_dc_p = gr.Image(label="ApoE% in CSF")
793
+ b_dc.click(dipg_csf, [dipg_peg, dipg_size], [o_dc_t, o_dc_p])
794
+
795
+ with gr.Tab("S1-R12c UVM"):
796
+ gr.HTML(proj_badge("S1-F - PHYLO-RARE - S1-R12c",
797
+ "Uveal Melanoma - GNAQ/GNA11 + vitreous corona + m6A", "In development"))
798
+ b_uv = gr.Button("Load UVM Variants", variant="primary")
799
+ o_uv = gr.Dataframe(label="UVM variants + m6A writers")
800
+ b_uv.click(uvm_variants, [], o_uv)
801
+
802
+ gr.Markdown("**Vitreous LNP retention screen:**")
803
+ b_vt = gr.Button("Rank Vitreous Formulations", variant="primary")
804
+ o_vt_t = gr.Dataframe(label="Vitreous LNP ranking")
805
+ o_vt_p = gr.Image(label="Retention time (hours)")
806
+ b_vt.click(uvm_vitreous, [], [o_vt_t, o_vt_p])
807
+
808
+ with gr.Tab("S1-R12d pAML"):
809
+ gr.HTML(proj_badge("S1-F - PHYLO-RARE - S1-R12d",
810
+ "pediatric AML - FLT3-ITD + BM niche + ferroptosis sensitivity", "In development"))
811
+ paml_var = gr.Dropdown(
812
+ ["FLT3-ITD","NPM1 c.860_863dupTCAG","DNMT3A p.R882H","CEBPA biallelic","IDH1/2 mutation"],
813
+ value="FLT3-ITD", label="Select variant")
814
+ b_pf = gr.Button("Analyze Ferroptosis Profile", variant="primary")
815
+ o_pf_t = gr.HTML()
816
+ o_pf_p = gr.Image(label="Radar profile")
817
+ gr.Examples([["FLT3-ITD"],["NPM1 c.860_863dupTCAG"],["IDH1/2 mutation"]], inputs=[paml_var])
818
+ b_pf.click(paml_ferroptosis, paml_var, [o_pf_t, o_pf_p])
819
+
820
+ gr.Markdown("**Bone Marrow LNP niche formulations:**")
821
+ gr.Dataframe(value=pd.DataFrame(PAML_BM_LNP), label="BM LNP candidates")
822
+
823
+ # ── JOURNAL ─────��───────────────────────────────────
824
+ with gr.Tab("Journal"):
825
  gr.Markdown("### Lab Journal\nEvery tool call auto-logged with project code.")
826
  with gr.Row():
827
+ note_text = gr.Textbox(label="Observation", placeholder="What did you discover?", lines=3)
828
  note_tab = gr.Textbox(label="Project code (e.g. S1-R1)", value="General")
829
  note_last = gr.Textbox(visible=False)
830
+ save_btn = gr.Button("Save", variant="primary")
831
  save_msg = gr.Markdown()
832
+ journal_df = gr.Dataframe(label="Full History", value=load_journal(), interactive=False)
833
+ refresh_btn = gr.Button("Refresh")
834
  refresh_btn.click(load_journal, [], journal_df)
835
  save_btn.click(save_note, [note_text,note_tab,note_last], [save_msg,journal_df])
836
 
837
+ # ── LEARNING ────────────────────────────────────────
838
+ with gr.Tab("Learning"):
839
  gr.Markdown("""
840
+ ## Guided Investigations - S1 Biomedical
841
+ > Beginner -> Intermediate -> Advanced
842
 
843
  ---
844
+ ### Case 1 - S1-A - S1-R1
845
  **Why does the same position give two different outcomes?**
846
+ 1. PHYLO-GENOMICS -> OpenVariant -> `BRCA1:p.R1699Q` -> Benign
847
+ 2. Enter `BRCA1:p.R1699W` -> Pathogenic
848
+ 3. Same position, different amino acid - Q (polar) vs W (bulky-aromatic)
849
 
850
  ---
851
+ ### Case 2 - S1-D - S1-R6 + S1-R8
852
  **How does PEG% control which protein coats the nanoparticle?**
853
+ 1. PHYLO-LNP -> Corona -> Ionizable, Zeta=-5, PEG=0.5% -> note protein
854
+ 2. Change PEG=2.5% -> compare
855
+ 3. Brain tab -> pKa=6.5 -> check ApoE%
856
 
857
  ---
858
+ ### Case 3 - S1-D - S1-R7
859
  **Does blood flow reshape the corona over time?**
860
+ 1. PHYLO-LNP -> Flow -> Flow=0 -> observe ApoE curve
861
+ 2. Flow=40 (arterial) -> compare
862
  3. At what minute does ApoE dominate?
863
 
864
  ---
865
+ ### Case 4 - S1-B - S1-R3
866
  **Which cancer has the most novel (undrugged) siRNA targets?**
867
+ 1. PHYLO-RNA -> siRNA -> LUAD -> count Novel
868
  2. Repeat BRCA, COAD
869
 
870
  ---
871
+ ### Case 5 - S1-E - S1-R9
872
  **Minimum protein signal that flips to CANCER?**
873
+ 1. PHYLO-BIOMARKERS -> Liquid Biopsy -> all=0 -> HEALTHY
874
+ 2. Set CTHRC1=2.5, FHL2=2.0, LDHA=1.8 -> observe
875
  3. Reset. Increase only CTHRC1 step by step.
876
 
877
  ---
878
+ ### Case 6 - S1-F - S1-R12b + S1-R12d - Rare cancer cross-tool
879
+ 1. PHYLO-RARE -> DIPG -> load variants -> note H3K27M frequency (78%)
880
+ 2. PHYLO-RARE -> pAML -> FLT3-ITD -> check ferroptosis sensitivity
881
+ 3. PHYLO-RARE -> UVM -> vitreous LNP -> which formulation has highest retention?
882
 
883
  ---
884
+ ### Tool Index
885
  | Code | Module | Tool | Metric |
886
  |------|--------|------|--------|
887
  | S1-R1 | PHYLO-GENOMICS | OpenVariant | AUC=0.939 |
888
  | S1-R2 | PHYLO-RNA | miRNA silencing | top: hsa-miR-148a |
889
  | S1-R3 | PHYLO-RNA | siRNA SL | SPC24 top LUAD |
890
+ | S1-R4 | PHYLO-RNA | lncRNA-TREM2 | CYTOR->AKT1 |
891
  | S1-R5 | PHYLO-DRUG | FGFR3 drug | score=0.793 |
892
  | S1-R6 | PHYLO-LNP | Corona | AUC=0.791 |
893
+ | S1-R7 | PHYLO-LNP | Flow Vroman | 3-4x faster |
894
+ | S1-R8 | PHYLO-LNP | LNP Brain | pKa 6.2-6.8 |
895
  | S1-R9 | PHYLO-BIOMARKERS | Liquid Biopsy | AUC=0.992* |
896
  | S1-R10 | PHYLO-LNP | AutoCorona NLP | F1=0.71 |
897
+ | S1-R12b | PHYLO-RARE | DIPG + CSF LNP | H3K27M=78% |
898
+ | S1-R12c | PHYLO-RARE | UVM vitreous | GNAQ=46% |
899
+ | S1-R12d | PHYLO-RARE | pAML ferroptosis | FLT3-ITD |
900
  """)
901
 
902
  gr.Markdown(
903
+ "---\n**K R&D Lab** - Science Sphere - S1 Biomedical - "
904
+ "[GitHub](https://github.com/K-RnD-Lab) - "
905
+ "[HuggingFace](https://huggingface.co/K-RnD-Lab) - "
906
+ "[KOSATIKS GROUP](https://kosatiks-group.pp.ua) - MIT License"
907
  )
908
 
909
+ demo.launch(server_name="0.0.0.0", server_port=7860)