D/t
What does 'D/t' refer to in your context?
Pathology
What specifically would you like about 'D/t' in pathology?
What is the pathogenesis of, uh, CLL? Uh, in, um... Give it to me in a flowchart manner. Not too detailed, but having all important details.
NORMAL MATURE B-CELL
│
▼
┌─────────────────────────────────────┐
│ PRECURSOR STAGE: Monoclonal B-cell │
│ Lymphocytosis (MBL) │
│ • Lymphoid-primed HSCs → mature │
│ B-cells expand oligoclonally │
│ • Acquisition of genetic events │
│ drives progression to CLL │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ KEY DRIVER: B-CELL RECEPTOR (BCR) │
│ Signaling │
│ • CLL cells express clonal │
│ rearranged Ig heavy + light chain│
│ • ~40% carry "stereotyped BCRs" │
│ → suggests antigen stimulation │
│ drives clonal expansion │
│ │
│ IGHV mutation status: │
│ • Mutated IGHV (>2% from germline) │
│ → indolent, low BCR activation │
│ • Unmutated IGHV (≤2%) │
│ → aggressive, high BCR activation│
│ → drives survival + proliferation│
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ BCR SIGNALS → BTK │
│ (Bruton Tyrosine Kinase) │
│ • BTK upregulates pro-survival and │
│ pro-proliferative genes │
│ ← Target of ibrutinib, acalabrutinib│
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ CHROMOSOMAL ABNORMALITIES │
│ (by FISH, unbalanced - not │
│ translocations) │
│ │
│ del(13q) [most common, ~55%] │
│ → loss of miRNAs (miR-15a/16-1) │
│ → loss of negative regulation │
│ → BCL2 OVEREXPRESSION │
│ │
│ del(11q) → ATM loss → DNA repair ↓│
│ Trisomy 12 → uncertain mechanism │
│ del(17p) → TP53 loss │
│ → most aggressive, chemo-resistant │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ BCL2 OVEREXPRESSION │
│ • Blocks apoptosis │
│ • Cell survival > proliferation │
│ (CLL is an "accumulation" disease│
│ more than a proliferation disease│
│ ← Target of venetoclax │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ TUMOR MICROENVIRONMENT │
│ • CLL cells receive survival │
│ signals from stromal cells, │
│ T-cells, nurse-like cells │
│ • Epigenetic signature resembles │
│ memory B-cell developmental stage│
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ IMMUNE DYSREGULATION │
│ • Accumulation of CLL cells │
│ suppresses normal B-cell function│
│ → Hypogammaglobulinemia │
│ → Increased infection risk │
│ • ~15% develop warm autoantibodies │
│ (AIHA, ITP) - made by normal │
│ bystander B-cells (impaired │
│ immune tolerance) │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ CLONAL EVOLUTION / PROGRESSION │
│ • Acquisition of TP53 mutation │
│ (del 17p) → Richter transformation│
│ → Transformation to DLBCL │
│ (Richter Syndrome, ~5%) │
└─────────────────────────────────────┘
| Factor | Role |
|---|---|
| del(13q) | Most common; miR-15a/16-1 loss → BCL2↑ |
| BCL2 | Blocks apoptosis; cells accumulate rather than proliferate |
| BCR / Ig | Antigen-driven clonal selection; stereotyped subsets |
| BTK | Downstream of BCR; promotes survival + growth |
| Unmutated IGHV | High BCR activation → aggressive disease |
| del(17p)/TP53 | DNA damage response failure → worst prognosis |
| del(11q)/ATM | DNA repair deficiency |
We're very smart, you know? Uh... This thing. This is too detailed and I cannot understand anything. I wanted to give it to me in a very small way, like small pathway, uh, and also give me immunophenotype too. Do not confuse me. Make it easy for me.
Normal B-cell
↓
Antigen stimulation via B-Cell Receptor (BCR)
↓
BCR → BTK → pro-survival signals
↓
del(13q) → BCL2 ↑ → Apoptosis blocked
↓
B-cells ACCUMULATE (don't die)
↓
CLL
| Marker | Result |
|---|---|
| CD19 | ✅ + |
| CD20 | ✅ + (dim) |
| CD23 | ✅ + |
| CD5 | ✅ + (T-cell marker, aberrantly expressed) |
| CD10 | ❌ - |
| FMC7 | ❌ - |
| Surface Ig | ✅ + (dim) |
But you've not given, like, uh, the... What are the mutations and all in the pathogenesis?
Normal B-cell
↓
Antigen stimulation → BCR signaling → BTK activated
↓
┌─────────────────────────────────────────┐
│ KEY MUTATIONS / HITS │
│ │
│ del(13q) → loses miR-15a/16-1 │
│ → BCL2 ↑ (no apoptosis) │
│ │
│ del(11q) → loses ATM │
│ → DNA repair fails │
│ │
│ Trisomy 12 → unknown, ↑ proliferation │
│ │
│ del(17p) / TP53 mutation │
│ → worst prognosis │
│ → chemo resistance │
└─────────────────────────────────────────┘
↓
BCL2 ↑ → Apoptosis blocked → cells ACCUMULATE
↓
CLL
↓ (if del 17p acquired later)
Richter Transformation → DLBCL
| Mutation | What it does | Prognosis |
|---|---|---|
| del(13q) | BCL2 ↑, most common (~55%) | Good |
| Trisomy 12 | ↑ proliferation | Intermediate |
| del(11q) | ATM loss, DNA repair ↓ | Poor |
| del(17p) / TP53 | No DNA damage response | Worst |
Immunophenotype from Robbins
| Marker | Status | Note |
|---|---|---|
| CD19 | ✅ + | Pan B-cell marker |
| CD20 | ✅ + | Pan B-cell marker |
| CD23 | ✅ + | |
| CD5 | ✅ + | Normally a T-cell marker; expressed on a small subset of normal B-cells |
| Surface Ig (IgM or IgM+IgD) | ✅ + (low level) | |
| BCL2 | ✅ + (high level) | Anti-apoptotic protein |
"The tumor cells express the pan B-cell markers CD19 and CD20, as well as CD23 and CD5, the latter a marker that is found on T cells and a small subset of normal B cells." — Robbins, Cotran & Kumar Pathologic Basis of Disease
Um... Classification of AML. From Robbins. Uh, what should I study for, from that, uh, for my, like... For an essay question of AML in, uh, TMG University question.
| Subtype | Translocation | Prognosis | Key Feature |
|---|---|---|---|
| AML with RUNX1::RUNX1T1 | t(8;21) | Favorable | Auer rods easily found |
| AML with CBFB::MYH11 | inv(16) | Favorable | Abnormal eosinophils |
| Acute Promyelocytic Leukemia (APL) | t(15;17) PML::RARA | Very favorable | Bundles of Auer rods; high DIC risk |
| AML with KMT2A rearrangement | t(11q23) | Poor | Monocytic differentiation |
| AML with mutated NPM1 | - | Favorable | |
| AML with myelodysplasia-related changes | del 5q / 7q | Poor |
| Subtype | Key Point |
|---|---|
| Minimally differentiated | MPO negative; diagnosed by flow cytometry |
| Without maturation | >3% blasts MPO+ |
| With maturation | Full myelocytic maturation |
| Myelomonocytic | Myeloid + monocytic |
| Monocytic | Nonspecific esterase+ |
| Erythroid | >50% dysplastic erythroid precursors |
| Megakaryocytic | Most common AML in Down syndrome |
Create a summary PDF on AML classification for quick revision
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/aml-revision && python3 -c "import reportlab; print('reportlab ok')"
~/aml-revision/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
OUTPUT = "/home/daytona/workspace/aml-revision/AML_Classification_Summary.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm, leftMargin=1.8*cm,
topMargin=1.8*cm, bottomMargin=1.8*cm
)
# ── Colours ──────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MED_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E8F7")
ACCENT_RED = colors.HexColor("#C0392B")
ACCENT_GRN = colors.HexColor("#1E8449")
ACCENT_ORG = colors.HexColor("#D35400")
LIGHT_GREY = colors.HexColor("#F4F6F7")
MID_GREY = colors.HexColor("#BDC3C7")
WHITE = colors.white
YELLOW_BG = colors.HexColor("#FFF9C4")
YELLOW_BDR = colors.HexColor("#F9A825")
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
title_style = S("Title2",
fontSize=22, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", spaceAfter=4)
subtitle_style = S("Sub2",
fontSize=11, textColor=LIGHT_BLUE, alignment=TA_CENTER,
fontName="Helvetica", spaceAfter=2)
source_style = S("Src",
fontSize=8, textColor=MID_GREY, alignment=TA_CENTER,
fontName="Helvetica-Oblique")
sec_header = S("SecH",
fontSize=13, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_LEFT, spaceAfter=2, spaceBefore=8)
body = S("Body2",
fontSize=9.5, textColor=colors.HexColor("#2C3E50"),
fontName="Helvetica", spaceAfter=3, leading=14)
bold_body = S("BoldBody",
fontSize=9.5, textColor=DARK_BLUE,
fontName="Helvetica-Bold", spaceAfter=2)
note_style = S("Note",
fontSize=9, textColor=colors.HexColor("#5D4037"),
fontName="Helvetica-Oblique", spaceAfter=2, leading=13)
bullet_style = S("Bullet",
fontSize=9.5, textColor=colors.HexColor("#2C3E50"),
fontName="Helvetica", leftIndent=14, spaceAfter=2, leading=13)
def section_header(text, bg=MED_BLUE):
data = [[Paragraph(text, sec_header)]]
t = Table(data, colWidths=[17.4*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4]),
]))
return t
story = []
# ── TITLE BANNER ─────────────────────────────────────────────────────────────
banner_data = [[
Paragraph("AML Classification", title_style),
Paragraph("Quick Revision Summary", subtitle_style),
Paragraph("Source: Robbins, Cotran & Kumar – Pathologic Basis of Disease", source_style),
]]
# Stack vertically in one cell using a nested table approach
title_content = [
[Paragraph("AML Classification", title_style)],
[Paragraph("Quick Revision Summary", subtitle_style)],
[Paragraph("Source: Robbins, Cotran & Kumar – Pathologic Basis of Disease", source_style)],
]
banner = Table(title_content, colWidths=[17.4*cm])
banner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [6]),
]))
story.append(banner)
story.append(Spacer(1, 10))
# ── DEFINITION BOX ───────────────────────────────────────────────────────────
story.append(section_header("📌 Definition"))
story.append(Spacer(1, 4))
story.append(Paragraph(
"AML is a <b>tumor of hematopoietic progenitors</b> caused by acquired oncogenic mutations "
"that <b>impede differentiation</b>, leading to accumulation of immature myeloid blasts in the marrow. "
"Replacement of marrow → failure → <b>Anemia, Thrombocytopenia, Neutropenia</b>.",
body))
story.append(Paragraph(
"Incidence peaks after age <b>60 years</b>. Diagnosis requires <b>>20% blasts</b> in bone marrow.",
body))
story.append(Spacer(1, 6))
# ── WHO CLASSIFICATION TABLE ─────────────────────────────────────────────────
story.append(section_header("🔬 WHO Classification (Table 13.10, Robbins)"))
story.append(Spacer(1, 5))
# Header row
hdr = [
Paragraph("<b>Subtype</b>", S("th", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph("<b>Translocation / Mutation</b>", S("th2", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph("<b>Prognosis</b>", S("th3", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)),
Paragraph("<b>Key Feature</b>", S("th4", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER)),
]
def P(t, clr=colors.HexColor("#2C3E50"), bold=False):
fn = "Helvetica-Bold" if bold else "Helvetica"
return Paragraph(t, S("td", fontSize=8.5, textColor=clr, fontName=fn, leading=12))
def prog(text, color):
return Paragraph(f"<b>{text}</b>", S("pg", fontSize=8.5, textColor=color, fontName="Helvetica-Bold", alignment=TA_CENTER))
CAT1_ROWS = [
# subtype, mutation, prognosis, key feature
["AML with RUNX1::RUNX1T1", "t(8;21)", "Favorable", "Auer rods easily found; abnormal cytoplasmic granules"],
["AML with CBFB::MYH11", "inv(16)", "Favorable", "Myelocytic + monocytic diff.; abnormal eosinophils"],
["APL – PML::RARA\n(Acute Promyelocytic)", "t(15;17)", "VERY Favorable", "Bundles of Auer rods; HIGH DIC risk → treat with ATRA"],
["AML with KMT2A rearrangement", "t(11q23)", "Poor", "Monocytic differentiation"],
["AML with mutated NPM1", "NPM1 mut", "Favorable", "Detected by DNA sequencing"],
["AML, myelodysplasia-related", "del(5q)/del(7q)", "Poor", "SRSF2, SF3B1, ASXL1 mutations"],
]
PROG_COLOR = {
"Favorable": ACCENT_GRN,
"VERY Favorable": colors.HexColor("#0D6E3A"),
"Poor": ACCENT_RED,
"Intermediate": ACCENT_ORG,
}
cat1_label = [
[Paragraph("<b>CATEGORY I – AML with Specific Genetic Aberrations</b>",
S("cl", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold")),
"", "", ""]
]
rows = [hdr]
for r in CAT1_ROWS:
rows.append([
P(r[0], DARK_BLUE, bold=True),
P(r[1], MED_BLUE, bold=True),
prog(r[2], PROG_COLOR.get(r[2], ACCENT_ORG)),
P(r[3]),
])
# Category II
CAT2_ROWS = [
["Minimally differentiated", "—", "Intermediate", "MPO negative; diagnosed by flow cytometry"],
["Without maturation", "—", "Intermediate", ">3% blasts MPO positive"],
["With maturation", "—", "Intermediate", "Full range of myelocytic maturation"],
["Myelomonocytic", "—", "Intermediate", "Myeloid + monocytic differentiation"],
["Monocytic", "—", "Intermediate", "Nonspecific esterase positive; monoblasts"],
["Erythroid", "—", "Intermediate", ">50% dysplastic erythroid precursors"],
["Megakaryocytic", "—", "Intermediate", "Most common AML in Down syndrome; marrow fibrosis"],
]
cat2_label = [[
Paragraph("<b>CATEGORY II – AML Defined by Differentiation (all Intermediate prognosis)</b>",
S("cl2", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold")),
"", "", ""
]]
rows += cat2_label
rows += [[
P(r[0], DARK_BLUE, bold=True),
P(r[1], MED_BLUE),
prog(r[2], PROG_COLOR.get(r[2], ACCENT_ORG)),
P(r[3]),
] for r in CAT2_ROWS]
col_w = [4.5*cm, 3.2*cm, 2.5*cm, 7.2*cm]
tbl = Table(rows, colWidths=col_w, repeatRows=1)
n_cat1 = len(CAT1_ROWS)
n_cat2 = len(CAT2_ROWS)
total_rows = 1 + n_cat1 + 1 + n_cat2 # hdr + cat1 + cat2_label + cat2
cat2_label_row = 1 + n_cat1 # 0-indexed: row 7
tbl_style = TableStyle([
# Header
("BACKGROUND", (0,0), (-1,0), MED_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
# Cat 1 rows alternating
*[("BACKGROUND", (0, i), (-1, i), LIGHT_BLUE if i % 2 == 0 else WHITE)
for i in range(1, cat2_label_row)],
# Cat 2 label span
("BACKGROUND", (0, cat2_label_row), (-1, cat2_label_row), DARK_BLUE),
("SPAN", (0, cat2_label_row), (-1, cat2_label_row)),
# Cat 2 rows alternating
*[("BACKGROUND", (0, i), (-1, i), LIGHT_GREY if i % 2 == 0 else WHITE)
for i in range(cat2_label_row+1, total_rows)],
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("ROWBACKGROUNDS", (0, 1), (-1, cat2_label_row-1), [LIGHT_BLUE, WHITE]),
])
tbl.setStyle(tbl_style)
story.append(tbl)
story.append(Spacer(1, 8))
# ── PATHOGENESIS FLOW ────────────────────────────────────────────────────────
story.append(section_header("⚡ Pathogenesis – 4 Mutation Categories"))
story.append(Spacer(1, 4))
path_data = [
["1. Transcription Factor Mutations",
"t(8;21) → RUNX1 disrupted\ninv(16) → CBFB disrupted\nt(15;17) → PML-RARα fusion\n→ Block myeloid differentiation"],
["2. Epigenetic Regulator Mutations",
"IDH1/IDH2 mutations\nDNMT3A mutations\n→ Abnormal epigenetic patterns"],
["3. Signal Transduction Mutations",
"FLT3 – most common mutation in AML\n→ Drives survival & proliferation\n→ Poor prognosis"],
["4. Tumor Suppressor Loss",
"TP53 mutations\n→ No DNA damage response\n→ Worst prognosis"],
]
path_rows = []
for cat, detail in path_data:
path_rows.append([
Paragraph(f"<b>{cat}</b>", S("pc", fontSize=9, textColor=DARK_BLUE, fontName="Helvetica-Bold", leading=13)),
Paragraph(detail.replace("\n", "<br/>"),
S("pd", fontSize=9, textColor=colors.HexColor("#2C3E50"), fontName="Helvetica", leading=13)),
])
path_tbl = Table(path_rows, colWidths=[5.5*cm, 11.9*cm])
path_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), LIGHT_BLUE),
("BACKGROUND", (1,0), (1,-1), WHITE),
*[("BACKGROUND", (1,i), (1,i), LIGHT_GREY) for i in range(0, 4, 2)],
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
]))
story.append(path_tbl)
story.append(Spacer(1, 8))
# ── APL STAR BOX ─────────────────────────────────────────────────────────────
story.append(section_header("⭐ APL – Highest Yield Exam Subtype", bg=colors.HexColor("#7B241C")))
story.append(Spacer(1, 4))
apl_rows = [
["Translocation", "t(15;17) → PML::RARα fusion protein"],
["Mechanism", "Fusion protein blocks myeloid differentiation at promyelocyte stage"],
["Morphology", "Promyelocytes with BUNDLES of Auer rods (faggot cells)"],
["Complication", "HIGH risk of DIC (release of granule contents)"],
["Treatment", "ATRA (All-Trans Retinoic Acid) → forces differentiation → cures APL"],
["Prognosis", "VERY FAVORABLE with ATRA treatment"],
]
apl_tbl = Table(
[[Paragraph(f"<b>{k}</b>", S("ak", fontSize=9, textColor=colors.HexColor("#7B241C"), fontName="Helvetica-Bold")),
Paragraph(v, S("av", fontSize=9, textColor=DARK_BLUE, fontName="Helvetica", leading=13))]
for k, v in apl_rows],
colWidths=[3.5*cm, 13.9*cm]
)
apl_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,-1), colors.HexColor("#FDECEA")),
("BACKGROUND", (1,0), (1,-1), WHITE),
*[("BACKGROUND", (1,i), (1,i), YELLOW_BG) for i in range(0, 6, 2)],
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
]))
story.append(apl_tbl)
story.append(Spacer(1, 8))
# ── MORPHOLOGY ────────────────────────────────────────────────────────────────
story.append(section_header("🔍 Key Morphology Points"))
story.append(Spacer(1, 4))
morph_items = [
"<b>Blasts >20%</b> in bone marrow → diagnostic threshold for AML",
"<b>Auer rods</b> = pink needle-like cytoplasmic inclusions in myeloblasts → <b>pathognomonic for AML</b>",
"Bundles of Auer rods = <b>'faggot cells'</b> → specific to APL (M3)",
"Proliferation centers = NOT seen in AML (seen in CLL/SLL)",
"Peripheral blood smear: leukocytosis with circulating blasts",
]
for item in morph_items:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Spacer(1, 8))
# ── PROGNOSIS QUICK GUIDE ─────────────────────────────────────────────────────
story.append(section_header("📊 Prognosis Quick Guide"))
story.append(Spacer(1, 4))
prog_data = [
[Paragraph("<b>VERY FAVORABLE</b>", S("pv", fontSize=9, textColor=colors.HexColor("#0D6E3A"), fontName="Helvetica-Bold")),
Paragraph("t(15;17) APL → ATRA treatment → near cure", body)],
[Paragraph("<b>FAVORABLE</b>", S("pf", fontSize=9, textColor=ACCENT_GRN, fontName="Helvetica-Bold")),
Paragraph("t(8;21), inv(16), NPM1 mutation", body)],
[Paragraph("<b>INTERMEDIATE</b>", S("pi", fontSize=9, textColor=ACCENT_ORG, fontName="Helvetica-Bold")),
Paragraph("AML defined by differentiation (Category II)", body)],
[Paragraph("<b>POOR</b>", S("pp", fontSize=9, textColor=ACCENT_RED, fontName="Helvetica-Bold")),
Paragraph("t(11q23)/KMT2A rearrangement, myelodysplasia-related, FLT3 mutation", body)],
[Paragraph("<b>WORST</b>", S("pw", fontSize=9, textColor=colors.HexColor("#7B241C"), fontName="Helvetica-Bold")),
Paragraph("del(17p) / TP53 mutation → chemo resistant", body)],
]
prog_tbl = Table(prog_data, colWidths=[3.8*cm, 13.6*cm])
prog_tbl.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
*[("BACKGROUND", (0,i), (-1,i), LIGHT_GREY if i%2==0 else WHITE) for i in range(5)],
]))
story.append(prog_tbl)
story.append(Spacer(1, 8))
# ── MEMORY TRICKS ─────────────────────────────────────────────────────────────
story.append(section_header("💡 Memory Tricks"))
story.append(Spacer(1, 4))
tricks = [
"<b>t(15;17)</b> = <b>15 + 17 = 32</b> → Remember: APL is treatable with <b>ATRA</b> → very favorable",
"<b>Auer rods</b> = AML's signature; <b>bundles of Auer rods</b> = APL specifically",
"<b>FLT3</b> = most common mutation overall in AML → Poor prognosis (targeted by midostaurin)",
"<b>inv(16)</b> = look for abnormal <b>eosinophils</b> in the marrow",
"<b>Down syndrome + AML</b> → always think <b>Megakaryocytic</b> subtype",
"<b>DIC + leukemia</b> → always think <b>APL (M3)</b> first",
]
for trick in tricks:
story.append(Paragraph(f"✦ {trick}", bullet_style))
story.append(Spacer(1, 6))
# ── FOOTER ────────────────────────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=0.5, color=MID_GREY))
story.append(Spacer(1, 3))
story.append(Paragraph(
"Robbins, Cotran & Kumar – Pathologic Basis of Disease | Table 13.10 | Quick Revision by Orris",
S("ft", fontSize=7.5, textColor=MID_GREY, fontName="Helvetica-Oblique", alignment=TA_CENTER)
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
python3 /home/daytona/workspace/aml-revision/generate_pdf.py
AML Classification Summary
PDF Document · PDF