6  Mammella — Casi MTB (HR+/HER2− e TNBC)

library(readr); library(dplyr); library(gt); library(stringr); library(tidyr)

# ===== Helpers per robustezza =====
standardize_cols <- function(df) {
  mapping <- list(
    case                = c("case","Case","cohort","subset","Group","group"),
    gene                = c("gene","Gene","Hugo_Symbol","Symbol"),
    variant             = c("variant","Variant","cDNA","cdna_change","hgvsc","hgvsc_short","c_change","mutation","c_variant","c_hgvs"),
    protein_change      = c("protein_change","Protein","hgvsp","hgvsp_short","p_change","aa_change","p_hgvs","protein"),
    effect              = c("consequence","effect","variant_effect","Consequence"),
    classification      = c("classification","class","pathogenicity","clin_sig","clinical_significance","significance"),
    escat               = c("escat","ESCAT"),
    tier_amp_asco_cap   = c("tier_amp_asco_cap","tier","tier_amp","amp_asco_cap_tier","amp_asco_cap"),
    vaf                 = c("vaf","VAF","allele_fraction","variant_allele_frequency","AF"),
    depth               = c("depth","coverage","dp","read_depth","DP"),
    pd_l1_cps           = c("pd_l1_cps","PDL1_CPS","PDL1","pd-l1","pdl1"),
    msi_status          = c("msi_status","MSI","msi","mismatch_repair"),
    tmb                 = c("tmb","TMB","tumor_mutational_burden","mutational_burden"),
    her2_ihc            = c("her2_ihc","HER2_IHC","ihc_her2"),
    her2_ish            = c("her2_ish","HER2_ISH","fish_her2"),
    notes               = c("notes","note","comment","comments","interpretation","report_note")
  )
  for (tgt in names(mapping)) {
    hit <- mapping[[tgt]][mapping[[tgt]] %in% names(df)]
    if (length(hit) >= 1) df[[tgt]] <- df[[hit[1]]] else df[[tgt]] <- NA
  }
  df
}

# carica dati
som1  <- read_csv("data/breast_variants_somatic.csv", show_col_types = FALSE) 
som <- som1 %>%
  rename(
    variant         = variant_cDNA,
    protein_change  = variant_protein,
    tier_amp_asco_cap = tier_amp_ascocap,   # corregge il typo
    notes           = evidence_summary
  ) %>%
  mutate(
    VAF        = suppressWarnings(as.numeric(vaf)),
    Copertura  = suppressWarnings(as.numeric(depth))
  )

# (opzionale) se vuoi tenere anche le copy-number in tabella
# le rinominiamo in "CN" per chiarezza:
if ("copy_number" %in% names(som)) {
  som <- som %>% rename(CN = copy_number)
}

# ---- FUNZIONE TABELLA ROBUSTA ----
mk_table <- function(df, caption) {
  # seleziona solo le colonne che esistono
  disp <- df %>%
    select(any_of(c(
      "gene","variant","protein_change","effect","CN",
      "escat","tier_amp_asco_cap","VAF","Copertura","notes"
    ))) %>%
    rename(
      Gene      = gene,
      Variante  = variant,
      Proteina  = protein_change,
      Effetto   = effect,
      ESCAT     = escat,
      Tier      = tier_amp_asco_cap,
      Note      = notes
    )

  gt(disp) |>
    tab_caption(caption) |>
    fmt_number(columns = any_of(c("VAF")), decimals = 3) |>
    tab_spanner(label = "Qualità", columns = intersect(c("VAF","Copertura"), names(disp))) |>
    tab_source_note(md("**Nota**: VAF/Copertura mostrate solo se presenti."))
}

som<-som |> standardize_cols()

germ <- read_csv("data/breast_variants_germline.csv", show_col_types = FALSE) |> standardize_cols()

# coerenza tipi numerici dove esistono
som <- som |>
  mutate(vaf_num = suppressWarnings(as.numeric(vaf)),
         depth_num = suppressWarnings(as.numeric(depth)),
         tmb_num = suppressWarnings(as.numeric(tmb)),
         pd_l1_cps_num = suppressWarnings(as.numeric(pd_l1_cps)))

germ <- germ %>%
  # crea le colonne numeriche solo se quelle originali esistono
  mutate(across(any_of(c("vaf","depth")),
                ~ suppressWarnings(as.numeric(.x)),
                .names = "{.col}_num"))  #suppressWarnings(as.numeric(depth)) else NA_real_)

# utility per rendering tabella pulita (funziona anche se VAF/Depth non esistono)
mk_table <- function(df, caption) {
  # assicura colonne opzionali
  if (!("vaf_num" %in% names(df)))   df$vaf_num <- NA_real_
  if (!("depth_num" %in% names(df))) df$depth_num <- NA_real_
  disp <- df |>
    select(any_of(c("gene","variant","protein_change","effect","classification",
                    "escat","tier_amp_asco_cap","vaf_num","depth_num","notes"))) |>
    rename(Gene = gene, Variante = variant, Proteina = protein_change, Effetto = effect,
           Classe = classification, ESCAT = escat, Tier = tier_amp_asco_cap,
           VAF = vaf_num, Copertura = depth_num, Note = notes)
  gt(disp) |>
    tab_caption(caption) |>
    fmt_number(columns = c("VAF"), decimals = 3) |>
    tab_spanner(label = "Qualità", columns = c("VAF","Copertura")) |>
    tab_source_note(md("**Nota**: VAF e copertura sono riportate solo se presenti nei file sorgente."))
}

6.1 HR+/HER2− — Varianti di interesse

som %>% filter(case %in% c("HRpos_HER2neg","HR+_HER2-","HRpos")) %>% select(-any_of("case")) %>%
  mk_table("HR+/HER2− — Varianti somatiche")
HR+/HER2− — Varianti somatiche
Gene Variante Proteina Effetto Classe ESCAT Tier
Qualità
Note
VAF Copertura
PIK3CA c.3140A>G p.H1047R Activating NA I-A Tier IA 0.310 480 Enables PI3K inhibitor (alpelisib) with endocrine therapy.
ESR1 c.1610A>C p.Y537S Activating NA II Tier IIA 0.120 420 Resistance marker; SERD consideration.
Nota: VAF e copertura sono riportate solo se presenti nei file sorgente.

6.1.1 Suggerimenti clinici (HR+/HER2−, aggiornati al 2025)

  • ESR1 mutatoelacestrant (SERD orale) in progressione a ET/CDK4/6 se ESR1+ (test liquido o tessuto con CDx). [FDA 27-01-2023]
    Note: utilità maggiore dopo CDK4/6i e in malattia sensibile all’ET.
  • PIK3CA/AKT1/PTEN alteraticapivasertib + fulvestrant (post-ET) o alpelisib + ET per PIK3CA mut selezionate.
  • HER2-low (IHC 1+ o 2+/ISH−) → nelle linee successive, considerare trastuzumab deruxtecan (T‑DXd).
  • MSI‑H/TMB‑high (raro) → opzione pembrolizumab tissue‑agnostic.
  • NTRK fusion (rarissimo) → larotrectinib o entrectinib.

Razionale/Fonti principali: ESMO Living Guideline 2025 HR+/HER2−; FDA label elacestrant; FDA label capivasertib; DESTINY‑Breast04 per T‑DXd.


6.2 TNBC — Varianti di interesse

som %>% filter(case %in% c("TNBC","TripleNegative")) %>% select(-any_of("case")) %>%
  mk_table("TNBC — Varianti somatiche")
TNBC — Varianti somatiche
Gene Variante Proteina Effetto Classe ESCAT Tier
Qualità
Note
VAF Copertura
BRCA1 c.5266dupC p.Gln1756Profs*74 Pathogenic (LOF) NA I-A Tier IA 0.440 500 PARP inhibitor eligibility in germline carriers.
Nota: VAF e copertura sono riportate solo se presenti nei file sorgente.

6.2.1 Suggerimenti clinici (TNBC, aggiornati al 2025)

  • PD‑L1 CPS ≥10 (prima linea metastatica)pembrolizumab + chemioterapia (KEYNOTE‑355).
  • Dopo ≥1 linea (HR−/HER2−): sacituzumab govitecan (Trop‑2 ADC) ha dimostrato beneficio OS vs TPC.
  • gBRCA1/2PARP inibitori (olaparib/talazoparib).
  • HER2‑low (sottogruppo di TNBC) → candidabile a T‑DXd in linee successive.
  • NTRK fusions (raro) → larotrectinib/entrectinib.
  • MSI‑H/TMB‑highpembrolizumab tissue‑agnostic.

Razionale/Fonti principali: KEYNOTE‑355 per pembrolizumab; ASCENT/TROPiCS‑02 e aggiornamenti 2025 per sacituzumab govitecan; DESTINY‑Breast04 per T‑DXd.


6.3 Germinale

mk_table(germ, "Mammella — Varianti germinali")
Mammella — Varianti germinali
Gene Variante Proteina Effetto Classe ESCAT Tier
Qualità
Note
VAF Copertura
BRCA1 NA NA NA Pathogenic NA NA NA NA Recommend germline testing and genetic counseling.
NA NA NA No pathogenic variants suspected NA NA NA NA Germline per storia personale/familiare.
Nota: VAF e copertura sono riportate solo se presenti nei file sorgente.
Nota

Indicazioni pratiche
- PIK3CA p.H1047R → considerare alpelisib + ET (alternativa a capivasertib+fulvestrant in HR+/HER2− con PIK3CA).
- ESR1 patogena → elacestrant dopo ET/CDK4/6i.
- BRCA1/2 patogena (specialmente TNBC) → PARP; invio a genetica medica e cascade testing.
- PD‑L1 CPS ≥10 in TNBC → pembrolizumab + chemio in prima linea.
- HER2‑lowT‑DXd in setting avanzato dopo almeno una chemioterapia.


6.4 Riferimenti (principali, per pronta consultazione)

  • ESMO Living Guideline (Aprile 2025) — HR+/HER2− MBC: https://www.esmo.org/guidelines/living-guidelines/esmo-living-guideline-metastatic-breast-cancer/hr-positive-her2-negative-metastatic-breast-cancer/hr-her2-mbc-progressive-disease-candidate-for-endocrine-therapy-targeted-therapy
  • FDA — Elacestrant (ESR1‑mut, ER+/HER2−): https://www.fda.gov/drugs/resources-information-approved-drugs/fda-approves-elacestrant-er-positive-her2-negative-esr1-mutated-advanced-or-metastatic-breast-cancer
  • FDA — Capivasertib + fulvestrant (PIK3CA/AKT1/PTEN‑alter): https://www.fda.gov/drugs/resources-information-approved-drugs/fda-approves-capivasertib-fulvestrant-breast-cancer
  • DESTINY‑Breast04 — T‑DXd in HER2‑low: https://www.nejm.org/doi/full/10.1056/NEJMoa2203690
  • KEYNOTE‑355 — Pembrolizumab + chemio in TNBC PD‑L1 CPS≥10: https://pubmed.ncbi.nlm.nih.gov/35857659/
  • TROPiCS‑02 / ASCENT — Sacituzumab govitecan: https://www.thelancet.com/journals/lancet/article/PIIS0140-6736%2823%2901245-X/fulltext ; https://ascopubs.org/doi/10.1200/JCO.2023.41.16_suppl.1003 ; https://pmc.ncbi.nlm.nih.gov/articles/PMC12257498/