hematology malignancies 101
hematology malignancies 101
| Lineage | Origin | Major Diseases |
|---|---|---|
| Myeloid | Myeloid progenitors (bone marrow) | AML, MDS, CML, PV, ET, MF |
| Lymphoid | B, T, or NK cells | ALL, CLL, lymphomas, myeloma |
| Histiocytic | Dendritic cells / macrophages | Langerhans cell histiocytosis |
| Disease | Key Mutation | Hallmark | Risk |
|---|---|---|---|
| CML | BCR-ABL1 (Ph chr) | Leukocytosis, splenomegaly, basophilia | Blast crisis |
| Polycythemia Vera (PV) | JAK2 V617F (>95%) | Erythrocytosis, hyperviscosity, pruritus after bathing | Thrombosis, MF transformation |
| Essential Thrombocythemia (ET) | JAK2, CALR, or MPL | Thrombocytosis (>450 × 10⁹/L) | Thrombosis or bleeding |
| Primary Myelofibrosis (MF) | JAK2, CALR, or MPL | Fibrotic marrow, extramedullary hematopoiesis, leukoerythroblastic smear | Transformation to AML |
| Approach | Examples |
|---|---|
| Cytotoxic chemotherapy | 7+3 (AML), R-CHOP (DLBCL), ABVD (HL) |
| Targeted therapy | Imatinib (CML), ATRA (APL), BTK inhibitors (CLL/MCL) |
| Immunotherapy | Rituximab (anti-CD20), blinatumomab (BiTE), CAR-T cells |
| Stem cell transplant | Autologous (myeloma), allogeneic (AML, ALL, MDS, MF) |
| Hypomethylating agents | Azacitidine, decitabine (MDS, AML elderly) |
| Finding | Diagnosis |
|---|---|
| Reed-Sternberg cells (owl-eye) | Hodgkin lymphoma |
| Philadelphia chromosome t(9;22) | CML (or high-risk ALL) |
| t(15;17) + DIC in AML | APL - treat with ATRA STAT |
| t(14;18) BCL-2 overexpression | Follicular lymphoma |
| t(8;14) MYC overexpression | Burkitt lymphoma |
| Starry sky histology | Burkitt lymphoma |
| Smudge cells + CD5+/CD23+ | CLL |
| Lytic bone lesions + M-protein | Multiple myeloma |
| JAK2 V617F + erythrocytosis | Polycythemia vera |
| AUER rods in blasts | AML (esp. t(8;21) or APL) |
| TdT+ lymphoblasts | ALL |
| del(5q) + anemia | MDS (lenalidomide-responsive) |
i have a presentation on Plasma Cell Disorders MGUS Smouldering myeloma Multiple Myeloma Pathophysiology Clinical Features - specific CRAB criteria Recurrent infections Bone pain Renal impairment Investigations - specific Management - specific prepare slides please
mkdir -p /tmp/workspace/plasma-cell-disorders && ls /tmp/workspace/plasma-cell-disorders/
~/plasma-cell-disorders/build_pptx.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.oxml.ns import qn
from lxml import etree
from io import BytesIO
# ── Colour palette ─────────────────────────────────────────────────────────────
NAVY = RGBColor(0x0D, 0x2D, 0x6B) # deep navy – headers / accents
TEAL = RGBColor(0x00, 0x7B, 0x8A) # teal – sub-accents / bullets
LIGHT_BLUE = RGBColor(0xD6, 0xEA, 0xF8) # sky blue – content bg
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GREY = RGBColor(0x22, 0x22, 0x22)
MID_GREY = RGBColor(0x55, 0x55, 0x55)
GOLD = RGBColor(0xE6, 0xAC, 0x00)
RED_ACCENT = RGBColor(0xC0, 0x39, 0x2B)
GREEN = RGBColor(0x1A, 0x7A, 0x3C)
AMBER = RGBColor(0xD4, 0x6F, 0x00)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ── Helper utilities ────────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_color=None, line_color=None, line_width=None):
shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h))
if fill_color:
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
else:
shape.fill.background()
if line_color:
shape.line.color.rgb = line_color
if line_width:
shape.line.width = Pt(line_width)
else:
shape.line.fill.background()
return shape
def add_tb(slide, x, y, w, h, text="", font_size=18, bold=False, color=DARK_GREY,
align=PP_ALIGN.LEFT, wrap=True, italic=False):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
p = tf.paragraphs[0]
p.alignment = align
if text:
run = p.add_run()
run.text = text
run.font.size = Pt(font_size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
run.font.name = "Calibri"
return tf
def add_bullet_tb(slide, x, y, w, h, items, font_size=15, color=DARK_GREY,
bullet_color=TEAL, bold_first=False, line_spacing=1.15):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
for i, item in enumerate(items):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.space_before = Pt(2)
run = p.add_run()
run.text = f" • {item}"
run.font.size = Pt(font_size)
run.font.name = "Calibri"
run.font.bold = (bold_first and i == 0)
run.font.color.rgb = color
return tf
def header_bar(slide, title, subtitle=None):
"""Navy top bar with title + optional subtitle"""
add_rect(slide, 0, 0, 13.333, 1.15, fill_color=NAVY)
add_tb(slide, 0.4, 0.08, 12.5, 0.65, title, font_size=30, bold=True,
color=WHITE, align=PP_ALIGN.LEFT)
if subtitle:
add_tb(slide, 0.4, 0.72, 12.5, 0.38, subtitle, font_size=14,
color=RGBColor(0xAD, 0xD8, 0xE6), align=PP_ALIGN.LEFT, italic=True)
def footer_bar(slide, text="Plasma Cell Disorders | Hematology"):
add_rect(slide, 0, 7.2, 13.333, 0.3, fill_color=NAVY)
add_tb(slide, 0.3, 7.21, 12.5, 0.27, text, font_size=9,
color=RGBColor(0xAD, 0xD8, 0xE6), align=PP_ALIGN.LEFT)
def divider(slide, y):
add_rect(slide, 0.4, y, 12.5, 0.03, fill_color=TEAL)
def card(slide, x, y, w, h, bg=LIGHT_BLUE, border=TEAL, border_w=1.2):
add_rect(slide, x, y, w, h, fill_color=bg, line_color=border, line_width=border_w)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 – TITLE
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=NAVY)
# diagonal accent strip
add_rect(s, 0, 5.8, 13.333, 1.7, fill_color=TEAL)
add_rect(s, 0, 5.6, 13.333, 0.25, fill_color=GOLD)
add_tb(s, 1, 1.2, 11, 1.0, "PLASMA CELL DISORDERS", font_size=42, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_tb(s, 1, 2.3, 11, 0.5, "MGUS · Smouldering Myeloma · Multiple Myeloma",
font_size=20, color=GOLD, align=PP_ALIGN.CENTER, italic=True)
divider_line = s.shapes.add_shape(1, Inches(3.5), Inches(2.95), Inches(6.3), Inches(0.04))
divider_line.fill.solid(); divider_line.fill.fore_color.rgb = GOLD
divider_line.line.fill.background()
add_tb(s, 1, 3.1, 11, 0.45,
"Pathophysiology · Clinical Features · Investigations · Management",
font_size=16, color=RGBColor(0xAD, 0xD8, 0xE6), align=PP_ALIGN.CENTER)
add_tb(s, 1, 5.95, 11, 0.5, "Hematology Oncology Presentation", font_size=14,
color=WHITE, align=PP_ALIGN.CENTER, italic=True)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 – OVERVIEW / SPECTRUM
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "The Plasma Cell Disorder Spectrum",
"A continuum of clonal plasma cell proliferation")
footer_bar(s)
# Spectrum arrow bar
add_rect(s, 0.4, 1.4, 12.5, 0.55, fill_color=RGBColor(0xE8, 0xF4, 0xFD))
for x_pos, lbl, clr in [
(0.5, "MGUS", GREEN),
(3.8, "Smouldering MM", AMBER),
(7.6, "Multiple Myeloma", RED_ACCENT),
]:
add_rect(s, x_pos, 1.4, 3.0, 0.55, fill_color=clr)
add_tb(s, x_pos, 1.4, 3.0, 0.55, lbl, font_size=16, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
# arrow connectors text
add_tb(s, 3.5, 1.48, 0.6, 0.4, "➜", font_size=22, color=NAVY, align=PP_ALIGN.CENTER)
add_tb(s, 7.3, 1.48, 0.6, 0.4, "➜", font_size=22, color=NAVY, align=PP_ALIGN.CENTER)
add_tb(s, 10.6, 1.45, 2.3, 0.55, "~1%/yr risk", font_size=11,
color=AMBER, align=PP_ALIGN.CENTER, italic=True)
# Three columns
cols = [
(0.35, "MGUS", GREEN, [
"M-protein < 3 g/dL",
"Clonal BM plasma cells < 10%",
"No CRAB criteria",
"No end-organ damage",
"~1% per year risk of progression",
"Prevalence: ~3% in adults >50 yrs",
]),
(4.55, "Smouldering MM", AMBER, [
"M-protein ≥ 3 g/dL OR",
"Clonal BM plasma cells 10–60%",
"No CRAB / myeloma defining events",
"2-year risk: ~10% in standard risk",
"High-risk: up to 50% in 2 years",
"Active surveillance mandatory",
]),
(8.75, "Multiple Myeloma", RED_ACCENT, [
"Clonal BM plasma cells ≥ 10%",
"CRAB criteria present OR",
"Any myeloma-defining event",
"Biopsy-proven plasmacytoma",
"Requires immediate treatment",
"Median survival: 5–7 years",
]),
]
for cx, ctitle, cclr, citems in cols:
card(s, cx, 2.1, 4.05, 0.45, bg=cclr, border=cclr)
add_tb(s, cx+0.05, 2.1, 3.95, 0.45, ctitle, font_size=14, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
card(s, cx, 2.55, 4.05, 4.3, bg=RGBColor(0xF5, 0xF9, 0xFF), border=cclr, border_w=1.5)
add_bullet_tb(s, cx+0.1, 2.62, 3.85, 4.1, citems, font_size=13, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 – PATHOPHYSIOLOGY
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Pathophysiology of Multiple Myeloma",
"Clonal plasma cell expansion driving multi-organ dysfunction")
footer_bar(s)
# Left column – molecular basis
card(s, 0.35, 1.3, 5.8, 5.65, bg=RGBColor(0xEA, 0xF4, 0xFF), border=NAVY, border_w=1.5)
add_tb(s, 0.45, 1.35, 5.6, 0.4, "Molecular Basis", font_size=15, bold=True, color=NAVY)
divider(s, 1.77)
mol_items = [
"HSC → B-cell → germinal centre → plasma cell",
"Initiating hit: Ig gene translocations (t(4;14), t(14;16), t(11;14))",
"Secondary hits: MYC dysregulation, RAS/MAPK mutations, del(17p) TP53",
"RANKL upregulation → osteoclast activation → bone destruction",
"IL-6 (myeloma growth factor) secreted by stromal cells",
"DKK1 inhibits Wnt → suppresses osteoblasts",
"Excess M-protein → renal tubular injury (cast nephropathy)",
"BM infiltration → cytopenias (anaemia, thrombocytopenia)",
"Suppressed normal Ig → hypogammaglobulinaemia → infections",
]
add_bullet_tb(s, 0.45, 1.85, 5.6, 5.1, mol_items, font_size=12.5, color=DARK_GREY)
# Right column – bone marrow microenvironment
card(s, 6.5, 1.3, 6.48, 5.65, bg=RGBColor(0xFD, 0xF0, 0xF0), border=RED_ACCENT, border_w=1.5)
add_tb(s, 6.6, 1.35, 6.3, 0.4, "The Myeloma Bone Marrow Niche", font_size=15,
bold=True, color=RED_ACCENT)
divider(s, 1.77)
bm_items = [
"Myeloma cells interact with BM stromal cells via adhesion molecules (VLA-4, VCAM-1)",
"Stromal contact triggers NF-κB, PI3K/AKT, RAS/MAPK → survival & drug resistance",
"Angiogenesis increased (VEGF secretion)",
"Immunosuppressive milieu: Tregs, MDSCs, PD-L1 expression",
"Osteolytic cycle: M-cells → ↑RANKL + ↓OPG → osteoclasts → bone destruction",
"Calcium released from bone → hypercalcaemia",
"Bence Jones proteins (free light chains) filtered → tubular damage → AKI/CKD",
"Amyloid deposits possible (AL amyloidosis) with systemic infiltration",
]
add_bullet_tb(s, 6.6, 1.85, 6.2, 5.1, bm_items, font_size=12.5, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 – CLINICAL FEATURES + CRAB
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Clinical Features — CRAB Criteria & Myeloma-Defining Events",
"End-organ damage requiring initiation of therapy")
footer_bar(s)
# CRAB boxes
crab_data = [
("C", "HyperCalcaemia", RED_ACCENT,
["Serum Ca > 0.25 mmol/L above ULN or > 2.75 mmol/L",
"Mechanism: RANKL-mediated osteoclast activation",
"Features: Nausea, polyuria, polydipsia, confusion",
"'Bones, Groans, Moans, Psychic Overtones'"]),
("R", "Renal Failure", AMBER,
["Creatinine > 177 µmol/L or CrCl < 40 mL/min",
"Mechanisms: Cast nephropathy (commonest), amyloid,",
" hypercalcaemia, hyperuricaemia, drug toxicity",
"Light chains precipitate with Tamm-Horsfall protein"]),
("A", "Anaemia", TEAL,
["Hb < 100 g/L or > 20 g/L below LLN",
"Mechanism: BM infiltration + cytokine suppression",
"Normocytic normochromic; Rouleaux on blood film",
"Raised ESR due to M-protein"]),
("B", "Bone Lesions", NAVY,
["Lytic bone lesions on skeletal survey / WB-MRI",
"Mechanism: Osteoclast activation, osteoblast suppression",
"Sites: Skull, spine, ribs, pelvis, proximal long bones",
"Vertebral fractures → back pain, cord compression"]),
]
box_w = 3.1
for i, (letter, title, clr, pts) in enumerate(crab_data):
xpos = 0.25 + i * 3.27
# Coloured letter box
add_rect(s, xpos, 1.3, 0.7, 0.7, fill_color=clr)
add_tb(s, xpos, 1.3, 0.7, 0.7, letter, font_size=32, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_rect(s, xpos+0.7, 1.3, 2.5, 0.7, fill_color=clr)
add_tb(s, xpos+0.72, 1.32, 2.4, 0.65, title, font_size=14, bold=True,
color=WHITE, align=PP_ALIGN.LEFT)
card(s, xpos, 2.0, 3.2, 3.2, bg=RGBColor(0xF7, 0xF9, 0xFF), border=clr, border_w=1.2)
add_bullet_tb(s, xpos+0.1, 2.08, 3.0, 3.0, pts, font_size=11.5, color=DARK_GREY)
# SLiM criteria bar
add_rect(s, 0.25, 5.3, 12.83, 1.65, fill_color=RGBColor(0xF0, 0xF0, 0xFF))
add_tb(s, 0.4, 5.32, 12.5, 0.35,
"SLiM — Myeloma-Defining Events (trigger treatment even without CRAB)",
font_size=13, bold=True, color=NAVY)
slim_items = [
"S – Sixty percent (≥60%) clonal plasma cells in bone marrow",
"Li – Light chain ratio: involved/uninvolved FLC ratio ≥ 100",
"M – MRI: >1 focal lesion (≥5 mm) on whole-body MRI",
]
add_bullet_tb(s, 0.4, 5.7, 12.5, 1.1, slim_items, font_size=12.5, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 – CLINICAL FEATURES: RECURRENT INFECTIONS, BONE PAIN, RENAL
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Key Clinical Features in Detail",
"Recurrent Infections · Bone Pain · Renal Impairment")
footer_bar(s)
panels = [
(0.3, "🦠 Recurrent Infections", TEAL,
["Hypogammaglobulinaemia: clonal Ig suppresses normal B-cell function",
"CD4+ T-cell and NK-cell dysfunction",
"Neutropenia from BM infiltration ± chemotherapy",
"Organisms: Streptococcus pneumoniae, H. influenzae (encapsulated bacteria)",
"Viral reactivation: Herpes zoster, CMV in transplant patients",
"Prophylaxis: IVIG replacement, cotrimoxazole (PCP), antiviral cover",
"Pneumococcal & flu vaccines recommended at diagnosis",
"Common presentation: recurrent pneumonia, sinusitis, UTI",
]),
(4.6, "🦴 Bone Pain", RED_ACCENT,
["Presenting symptom in ~70% of patients",
"Mechanism: Osteoclast activation (RANKL/OPG imbalance) + loss of osteoblast function",
"Sites: Back (vertebrae), ribs, skull, sternum, long bones",
"Pathological fractures: vertebral collapse → acute severe back pain",
"Spinal cord compression: emergency! (5%) → paraplegia if untreated",
"'Punched-out' lytic lesions on plain X-ray (skeletal survey)",
"Whole-body low-dose CT or WB-MRI preferred over plain films",
"Bisphosphonates (zoledronic acid) or denosumab for bone protection",
]),
(8.9, "🩺 Renal Impairment", AMBER,
["Present in ~50% at diagnosis; 20% require dialysis",
"Cast nephropathy (myeloma kidney): FLC + Tamm-Horsfall protein → tubular obstruction",
"Direct tubular toxicity of free light chains (proximal tubular injury)",
"Hypercalcaemia → nephrocalcinosis + volume depletion → AKI",
"AL amyloidosis: glomerular deposits → nephrotic syndrome",
"NSAID use + dehydration worsens renal function",
"Reversible with hydration + prompt myeloma treatment",
"Daratumumab-based regimens preferred in renal failure",
]),
]
for px, ptitle, pclr, pitems in panels:
card(s, px, 1.3, 4.1, 5.7, bg=RGBColor(0xF5, 0xF8, 0xFF), border=pclr, border_w=2.0)
add_rect(s, px, 1.3, 4.1, 0.52, fill_color=pclr)
add_tb(s, px+0.1, 1.3, 3.9, 0.52, ptitle, font_size=14, bold=True,
color=WHITE, align=PP_ALIGN.LEFT)
add_bullet_tb(s, px+0.12, 1.9, 3.86, 5.0, pitems, font_size=11.5, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 – INVESTIGATIONS
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Investigations",
"Establishing diagnosis, staging & risk stratification")
footer_bar(s)
inv_cols = [
(0.3, "Blood Tests", NAVY, [
"FBC: normocytic anaemia, Rouleaux on film, raised ESR",
"U&E / LFTs: renal impairment, raised Ca²⁺, LDH",
"Serum protein electrophoresis (SPEP): M-protein band",
"Serum immunofixation: identifies Ig class (IgG, IgA, light chain)",
"Serum free light chain (FLC) assay: κ/λ ratio",
"β₂-microglobulin (ISS staging), albumin (ISS staging)",
"LDH: correlates with tumour burden",
"Uric acid, coagulation screen",
]),
(4.55, "Urine Tests", TEAL, [
"24-hour urine: protein quantification",
"Urine electrophoresis (UPEP): Bence Jones protein (monoclonal FLC)",
"Urine immunofixation: confirms light chain type",
"Urine FLC: serial monitoring of response",
" ",
"Bone Marrow",
"Trephine biopsy + aspirate: ≥10% clonal plasma cells",
"Flow cytometry: CD138+, CD38+, CD19-, CD56+",
"FISH / cytogenetics: del(17p), t(4;14), t(14;16), t(11;14), del(1p), gain 1q",
]),
(8.8, "Imaging", RED_ACCENT, [
"Whole-body low-dose CT (WBLDCT): first-line imaging",
" → Lytic lesions, fractures, soft tissue masses",
"Whole-body MRI (WB-MRI): bone marrow involvement,",
" sensitivity for smouldering MM / cord compression",
"PET-CT: disease extent, treatment response, extramedullary",
"Skeletal survey (plain X-ray): historic; less sensitive",
"Echocardiogram: if AL amyloidosis suspected",
"Bone density (DEXA): baseline for bisphosphonate monitoring",
]),
]
for cx, ctitle, cclr, citems in inv_cols:
add_rect(s, cx, 1.3, 4.15, 0.48, fill_color=cclr)
add_tb(s, cx+0.1, 1.3, 3.95, 0.48, ctitle, font_size=15, bold=True,
color=WHITE, align=PP_ALIGN.LEFT)
card(s, cx, 1.78, 4.15, 5.12, bg=RGBColor(0xF5, 0xF9, 0xFF), border=cclr, border_w=1.2)
add_bullet_tb(s, cx+0.12, 1.88, 3.92, 4.9, citems, font_size=12, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 – STAGING
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Staging & Risk Stratification",
"International Staging System (ISS) and Revised ISS (R-ISS)")
footer_bar(s)
# ISS table
add_tb(s, 0.4, 1.28, 6.0, 0.38, "International Staging System (ISS)",
font_size=14, bold=True, color=NAVY)
iss_rows = [
("Stage", "Criteria", "Median OS", NAVY, WHITE),
("I", "β₂M < 3.5 mg/L AND Albumin ≥ 35 g/L", "62 months", GREEN, WHITE),
("II", "Neither Stage I nor Stage III", "44 months", AMBER, WHITE),
("III", "β₂M ≥ 5.5 mg/L", "29 months", RED_ACCENT, WHITE),
]
row_h = 0.56
for ri, (s1, s2, s3, rbg, rtxt) in enumerate(iss_rows):
y = 1.68 + ri * row_h
add_rect(s, 0.4, y, 0.9, row_h, fill_color=rbg, line_color=WHITE, line_width=0.5)
add_rect(s, 1.3, y, 4.5, row_h, fill_color=rbg, line_color=WHITE, line_width=0.5)
add_rect(s, 5.8, y, 1.8, row_h, fill_color=rbg, line_color=WHITE, line_width=0.5)
add_tb(s, 0.42, y+0.06, 0.86, row_h-0.1, s1, font_size=13 if ri>0 else 12,
bold=(ri==0), color=rtxt, align=PP_ALIGN.CENTER)
add_tb(s, 1.32, y+0.06, 4.45, row_h-0.1, s2, font_size=12 if ri>0 else 12,
bold=(ri==0), color=rtxt)
add_tb(s, 5.82, y+0.06, 1.75, row_h-0.1, s3, font_size=12 if ri>0 else 12,
bold=(ri==0), color=rtxt, align=PP_ALIGN.CENTER)
# R-ISS
add_tb(s, 7.9, 1.28, 5.0, 0.38, "Revised ISS (R-ISS)",
font_size=14, bold=True, color=NAVY)
r_iss = [
("R-ISS I", "ISS I + standard cytogenetics + LDH ≤ ULN", "Not reached", GREEN),
("R-ISS II", "Not R-ISS I or III", "83 months", AMBER),
("R-ISS III", "ISS III + high-risk cytogenetics OR LDH > ULN", "43 months", RED_ACCENT),
]
for ri2, (st, crit, os, clr) in enumerate(r_iss):
y2 = 1.68 + ri2 * 1.0
add_rect(s, 7.9, y2, 5.0, 0.95, fill_color=RGBColor(0xF5, 0xF9, 0xFF),
line_color=clr, line_width=1.5)
add_rect(s, 7.9, y2, 2.0, 0.95, fill_color=clr)
add_tb(s, 7.92, y2+0.12, 1.96, 0.7, st, font_size=13, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_tb(s, 9.93, y2+0.04, 2.9, 0.45, crit, font_size=11, color=DARK_GREY, wrap=True)
add_tb(s, 9.93, y2+0.5, 2.9, 0.38, f"Median OS: {os}", font_size=11,
color=MID_GREY, italic=True)
# High-risk cytogenetics
add_rect(s, 7.9, 4.75, 5.0, 2.1, fill_color=RGBColor(0xFF, 0xF0, 0xF0),
line_color=RED_ACCENT, line_width=1.5)
add_tb(s, 8.0, 4.78, 4.8, 0.38, "High-Risk Cytogenetics", font_size=13,
bold=True, color=RED_ACCENT)
hrc = ["del(17p) / TP53 mutation", "t(4;14) – FGFR3/MMSET",
"t(14;16) – MAF", "t(14;20) – MAFB", "Gain 1q / del 1p"]
add_bullet_tb(s, 8.0, 5.18, 4.8, 1.5, hrc, font_size=12, color=DARK_GREY)
# Amyloid / other note
add_rect(s, 0.4, 4.75, 7.1, 2.1, fill_color=RGBColor(0xF0, 0xF5, 0xFF),
line_color=NAVY, line_width=1.2)
add_tb(s, 0.55, 4.78, 6.8, 0.38, "Myeloma Defining Events (MDEs) — SLiM Criteria",
font_size=13, bold=True, color=NAVY)
slim2 = [
"≥60% clonal plasma cells in BM (regardless of M-protein level)",
"Serum FLC ratio ≥100 (involved ÷ uninvolved)",
">1 focal lesion on WB-MRI (≥5 mm each)",
"Any of the above → diagnosis of MM + treatment required",
]
add_bullet_tb(s, 0.55, 5.18, 6.8, 1.5, slim2, font_size=12, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 – MANAGEMENT OVERVIEW
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Management Overview",
"MGUS · Smouldering MM · Active Myeloma")
footer_bar(s)
mgmt_cols = [
(0.3, "MGUS", GREEN, [
"NO treatment required",
"Baseline investigations to confirm no end-organ damage",
"Monitor M-protein & FLC ratio every 6–12 months",
"Repeat BM biopsy only if progression suspected",
"Patient education: symptoms to report",
"Lifestyle: stay hydrated, avoid nephrotoxins",
"Annual review lifelong",
"Risk stratification guides monitoring intensity:",
" – Low risk: M-protein <1.5 g/dL, IgG, normal FLC → q12m",
" – High risk: IgA/IgM, M-protein >1.5 g/dL → q6m",
]),
(4.6, "Smouldering MM", AMBER, [
"Standard risk: close observation (no treatment)",
"High-risk SMM: lenalidomide ± dexamethasone considered",
"QUIREDEX / E3A06 trials support early Rx for high-risk",
"Daratumumab monotherapy (AQUILA trial) approved high-risk",
"Definition of high-risk SMM (Mayo 2018):",
" – BM plasma cells ≥20%",
" – M-protein ≥2 g/dL",
" – FLC ratio ≥20",
"Monitoring: CBC, chemistry, SPEP q3–4 months",
"WB-MRI at baseline and q12–24 months",
]),
(8.9, "Active MM — Goals", RED_ACCENT, [
"Reduce tumour burden & achieve deep remission",
"Prevent/treat complications (bone, renal, infection)",
"Assess transplant eligibility first",
"Response categories (IMWG):",
" – sCR → CR → VGPR → PR → SD → PD",
"MRD negativity (10⁻⁵ by NGF/NGS) = best predictor",
"Novel targets: BCMA, GPRC5D, FcRH5",
"CAR-T cell therapy: ide-cel, cilta-cel (relapsed/refractory)",
"Bispecifics: teclistamab, elranatamab",
"Allogeneic SCT: investigational",
]),
]
for cx, ctitle, cclr, citems in mgmt_cols:
add_rect(s, cx, 1.3, 4.1, 0.48, fill_color=cclr)
add_tb(s, cx+0.1, 1.3, 3.9, 0.48, ctitle, font_size=15, bold=True,
color=WHITE, align=PP_ALIGN.LEFT)
card(s, cx, 1.78, 4.1, 5.12, bg=RGBColor(0xF5, 0xF9, 0xFF), border=cclr, border_w=1.2)
add_bullet_tb(s, cx+0.12, 1.88, 3.86, 4.9, citems, font_size=11.5, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 – INDUCTION & TRANSPLANT
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Active Myeloma — Induction Therapy & Stem Cell Transplant",
"Treatment stratified by transplant eligibility")
footer_bar(s)
# Transplant eligible
card(s, 0.3, 1.3, 6.1, 5.7, bg=RGBColor(0xE8, 0xF8, 0xF5), border=GREEN, border_w=2.0)
add_rect(s, 0.3, 1.3, 6.1, 0.5, fill_color=GREEN)
add_tb(s, 0.4, 1.3, 5.9, 0.5, "Transplant-Eligible (<65–70 yrs, good PS)",
font_size=14, bold=True, color=WHITE)
te_items = [
"Induction (3–4 cycles): VRd (Bortezomib + Lenalidomide + Dexamethasone)",
" OR DRd (Daratumumab + Lenalidomide + Dexamethasone) — preferred in high risk",
" OR VCd (Bortezomib + Cyclophosphamide + Dexamethasone)",
"",
"Stem Cell Collection:",
" G-CSF ± plerixafor for mobilisation",
" Collect peripheral blood stem cells (minimum 2 × 10⁶ CD34+/kg)",
"",
"High-Dose Chemotherapy: Melphalan 200 mg/m²",
"",
"Autologous SCT — improves PFS and OS vs. conventional chemo",
"",
"Consolidation: additional VRd cycles (optional)",
"Maintenance: Lenalidomide until progression (standard)",
" Bortezomib added for t(4;14) or del(17p) (high-risk)",
"",
"Tandem transplant: considered for high-risk disease",
]
add_bullet_tb(s, 0.4, 1.85, 5.9, 5.1, te_items, font_size=11.5, color=DARK_GREY)
# Transplant ineligible
card(s, 6.8, 1.3, 6.2, 5.7, bg=RGBColor(0xFD, 0xF5, 0xE6), border=AMBER, border_w=2.0)
add_rect(s, 6.8, 1.3, 6.2, 0.5, fill_color=AMBER)
add_tb(s, 6.9, 1.3, 6.0, 0.5, "Transplant-Ineligible (>70 yrs or significant comorbidity)",
font_size=14, bold=True, color=WHITE)
ti_items = [
"Preferred regimen: DRd (Daratumumab + Lenalidomide + Dex)",
" – MAIA trial: significant OS benefit vs. Rd alone",
"",
"Alternative: DVd (Daratumumab + Bortezomib + Melphalan + Pred)",
" – ALCYONE trial: OS benefit in elderly patients",
"",
"VMP (Bortezomib + Melphalan + Prednisone): older standard",
"Rd (Lenalidomide + low-dose Dexamethasone): well-tolerated",
"",
"Dose modifications required for:",
" – Renal impairment (lenalidomide dose reduce per CrCl)",
" – Peripheral neuropathy (bortezomib → switch to ixazomib)",
"",
"Maintenance: Lenalidomide until progression",
" Daratumumab SC maintenance also an option",
"",
"Supportive: bisphosphonate (zoledronic acid q4w x 2 yrs)",
"DVT prophylaxis with lenalidomide (aspirin or LMWH)",
]
add_bullet_tb(s, 6.9, 1.85, 5.9, 5.1, ti_items, font_size=11.5, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 – SUPPORTIVE CARE
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Supportive Care & Complication Management",
"Treating the consequences of myeloma")
footer_bar(s)
supp = [
(0.3, 1.3, "Bone Disease", NAVY, [
"Bisphosphonates: Zoledronic acid 4 mg IV q4w (2 yrs min)",
"Denosumab (anti-RANKL): preferred in renal impairment",
"Kyphoplasty / vertebroplasty for painful vertebral fractures",
"Radiotherapy (8–10 Gy) for localised painful bone lesions",
"Orthopaedic surgery for impending pathological fractures",
"Dental review before bisphosphonate (osteonecrosis risk)",
]),
(0.3, 4.55, "Renal Support", TEAL, [
"IV hydration: maintain UO >3 L/day",
"Avoid NSAIDs, contrast, nephrotoxins",
"Treat hypercalcaemia (IVF + furosemide ± bisphosphonate)",
"Haemodialysis if severe AKI / chronic renal failure",
"Bortezomib-based regimens: safe in renal failure",
"Lenalidomide: dose-reduce per CrCl",
]),
(6.8, 1.3, "Infection Prevention", TEAL, [
"Pneumococcal & influenza vaccination",
"Cotrimoxazole (PCP prophylaxis during high-dose steroids)",
"Aciclovir / valaciclovir (VZV prophylaxis with bortezomib)",
"IVIG replacement if severe hypogammaglobulinaemia",
"G-CSF for neutropenia (chemotherapy-induced)",
"Central venous catheter care protocols",
]),
(6.8, 4.55, "Anaemia & Haematological", RED_ACCENT, [
"Blood transfusion for symptomatic anaemia",
"Erythropoiesis-stimulating agents (ESAs) in selected patients",
"Thromboprophylaxis: aspirin/LMWH with IMiD-based therapy",
"Treat hypercalcaemia promptly (bisphosphonate IV + IVF)",
"Allopurinol for tumour lysis syndrome risk",
"Plasmapheresis for hyperviscosity (rare, Waldenstrom's more)",
]),
]
for sx, sy, stitle, sclr, sitems in supp:
card(s, sx, sy, 6.1, 3.05, bg=RGBColor(0xF5, 0xF8, 0xFF), border=sclr, border_w=1.5)
add_rect(s, sx, sy, 6.1, 0.4, fill_color=sclr)
add_tb(s, sx+0.1, sy, 5.9, 0.4, stitle, font_size=13, bold=True, color=WHITE)
add_bullet_tb(s, sx+0.12, sy+0.45, 5.86, 2.5, sitems, font_size=11.5, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 – RELAPSED / REFRACTORY + NOVEL THERAPIES
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=WHITE)
header_bar(s, "Relapsed & Refractory Myeloma — Novel Therapies",
"Emerging agents transforming outcomes")
footer_bar(s)
therapy_classes = [
(0.3, 1.3, "IMiDs", TEAL, ["Thalidomide (historic)", "Lenalidomide (Revlimid)", "Pomalidomide (Imnovid)", "Mechanism: Cereblon-mediated degradation of IKZF1/3"]),
(3.55, 1.3, "Proteasome Inhibitors", NAVY, ["Bortezomib (IV/SC) – 1st gen", "Carfilzomib (Kyprolis) – 2nd gen", "Ixazomib (Ninlaro) – oral", "Mechanism: Inhibit 26S proteasome → UPR → apoptosis"]),
(6.8, 1.3, "Monoclonal Antibodies", RED_ACCENT, ["Daratumumab (anti-CD38)", "Isatuximab (anti-CD38)", "Elotuzumab (anti-SLAMF7)", "Mechanism: ADCC, CDC, phagocytosis"]),
(10.05,1.3, "Alkylating / Steroids", MID_GREY, ["Melphalan (HD conditioning)", "Cyclophosphamide (VCD)", "Dexamethasone (backbone)", "Bendamustine (salvage)"]),
(0.3, 4.3, "CAR-T Cell Therapy", RGBColor(0x6A,0x0D,0xAD), ["Ide-cel (idecabtagene vicleucei)", "Cilta-cel (ciltacabtagene autoleucel)", "Target: BCMA (B-cell maturation antigen)", "Deep MRD-negative responses; FDA approved RRMM"]),
(3.55, 4.3, "Bispecific Antibodies", RGBColor(0x00,0x66,0x00), ["Teclistamab (BCMA × CD3)", "Elranatamab (BCMA × CD3)", "Talquetamab (GPRC5D × CD3)", "Linvoseltamab (BCMA × CD3)"]),
(6.8, 4.3, "Exportin-1 Inhibitor", AMBER, ["Selinexor (Xpovio)", "Blocks nuclear export of TSPs", "Used in penta-refractory disease", "Oral agent, combined with dexamethasone"]),
(10.05,4.3, "Antibody-Drug Conjugates", RGBColor(0x8B,0x00,0x00), ["Belantamab mafodotin (BCMA-ADC)", "Target: BCMA + MMAF cytotoxin", "Corneal microdeposits (keratopathy)", "Re-evaluated post KarMMa-3 trial data"]),
]
for tx, ty, ttitle, tclr, titems in therapy_classes:
card(s, tx, ty, 2.9, 2.85, bg=RGBColor(0xF5, 0xF8, 0xFF), border=tclr, border_w=1.5)
add_rect(s, tx, ty, 2.9, 0.4, fill_color=tclr)
add_tb(s, tx+0.08, ty, 2.74, 0.4, ttitle, font_size=11.5, bold=True, color=WHITE)
add_bullet_tb(s, tx+0.1, ty+0.45, 2.7, 2.3, titems, font_size=10.5, color=DARK_GREY)
# ══════════════════════════════════════════════════════════════════════════════
# SLIDE 12 – SUMMARY / KEY TAKE-AWAYS
# ══════════════════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, 13.333, 7.5, fill_color=NAVY)
add_rect(s, 0, 1.1, 13.333, 6.4, fill_color=WHITE)
header_bar(s, "Summary & Key Take-Aways", "Plasma Cell Disorders at a Glance")
footer_bar(s)
takeaways = [
("1", "Spectrum", "MGUS → Smouldering MM → Active MM represents a continuous biological spectrum of clonal plasma cell evolution."),
("2", "Pathophysiology","M-protein, osteoclast activation, marrow infiltration and immune suppression drive all the key features."),
("3", "Diagnose MM", "≥10% clonal BM plasma cells + CRAB criteria OR SLiM myeloma-defining events."),
("4", "Work-up", "SPEP + immunofixation + FLC assay + BM biopsy + FISH + WB-CT/MRI. β₂M + albumin for ISS staging."),
("5", "Treatment", "Triplet induction (VRd or DRd) → ASCT in eligible → maintenance lenalidomide. Daratumumab backbone for most."),
("6", "Complications", "Manage bone disease (bisphosphonates), renal failure (hydration, avoid nephrotoxins), infections (prophylaxis)."),
("7", "Novel Rx", "CAR-T (ide-cel, cilta-cel) and bispecifics (teclistamab) are transforming outcomes in RRMM."),
("8", "Prognosis", "R-ISS III: ~43-month median OS. MRD-negativity is the best surrogate for prolonged survival."),
]
cols_per_row = 4
row_h2 = 2.55
for i, (num, title, body) in enumerate(takeaways):
col = i % cols_per_row
row = i // cols_per_row
bx = 0.3 + col * 3.23
by = 1.3 + row * row_h2
add_rect(s, bx, by, 3.0, row_h2 - 0.12,
fill_color=RGBColor(0xF0, 0xF5, 0xFF), line_color=TEAL, line_width=1.0)
add_rect(s, bx, by, 0.5, row_h2 - 0.12, fill_color=TEAL)
add_tb(s, bx, by + 0.4, 0.5, 0.7, num, font_size=18, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_tb(s, bx+0.55, by+0.06, 2.4, 0.38, title, font_size=12, bold=True, color=NAVY)
add_tb(s, bx+0.55, by+0.45, 2.4, 1.9, body, font_size=10.5, color=DARK_GREY, wrap=True)
# ── Save ───────────────────────────────────────────────────────────────────────
out = "/tmp/workspace/plasma-cell-disorders/Plasma_Cell_Disorders.pptx"
buf = BytesIO()
prs.save(buf)
with open(out, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out}")
cd /tmp/workspace/plasma-cell-disorders && python build_pptx.py 2>&1
python -c " from pptx import Presentation prs = Presentation('/tmp/workspace/plasma-cell-disorders/Plasma_Cell_Disorders.pptx') print(f'Slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text.strip().split('\n')[0][:60] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f' Slide {i}: {texts[0] if texts else \"(no text)\"}') "
Plasma Cell Disorders
Presentation · PPTX
| # | Slide | Content |
|---|---|---|
| 1 | Title | Cover slide with topic and subtopic overview |
| 2 | The Spectrum | Side-by-side MGUS / Smouldering / Active MM comparison with diagnostic thresholds |
| 3 | Pathophysiology | Molecular basis (Ig translocations, IL-6, RANKL/OPG), BM microenvironment, how M-protein causes each complication |
| 4 | CRAB + SLiM Criteria | Full CRAB boxes with mechanisms + SLiM myeloma-defining events |
| 5 | Clinical Features | Deep-dive panels on Recurrent Infections, Bone Pain, and Renal Impairment |
| 6 | Investigations | Blood tests (SPEP, FLC, β₂M), Urine tests (BJP, UPEP), BM biopsy, Imaging (WB-CT, MRI, PET) |
| 7 | Staging | ISS + R-ISS tables with OS data; high-risk cytogenetics; SLiM recap |
| 8 | Management Overview | MGUS monitoring, Smouldering MM (watch vs. treat), Active MM goals/response criteria |
| 9 | Induction & Transplant | Transplant-eligible (VRd → ASCT → lenalidomide maintenance) vs. ineligible (DRd/DVd) |
| 10 | Supportive Care | Bone (bisphosphonates), Renal (hydration), Infections (prophylaxis), Haematological |
| 11 | Novel Therapies | 8-panel grid: IMiDs, PIs, anti-CD38, alkylators, CAR-T (ide-cel/cilta-cel), Bispecifics, Selinexor, ADCs |
| 12 | Summary | 8 key take-away cards |