A newly diagnosed patient with type 2 diabetes mellitus have HbA1c of 8.6. Uh, he's also a known case of hypertension and is suffering from CKD. So what should be the first choice of antidiabetic drug for this patient?
"SGLT2 inhibitor" AND "chronic kidney disease" AND "type 2 diabetes"

| eGFR | Metformin guidance |
|---|---|
| ≥45 mL/min/1.73 m² | Full dose acceptable |
| 30-44 mL/min/1.73 m² | Reduce to 500 mg twice daily; use cautiously |
| <30 mL/min/1.73 m² | Contraindicated (risk of lactic acidosis) |
| Drug class | Role |
|---|---|
| SGLT2 inhibitor (empagliflozin/dapagliflozin/canagliflozin) | 1st-line antidiabetic + renoprotection + BP lowering |
| ACE inhibitor or ARB | 1st-line antihypertensive in diabetic CKD + antiproteinuric |
| Metformin (if eGFR ≥30) | Add for additional glycemic control if needed |
| GLP-1 RA | Add if HbA1c target not met with SGLT2i ± metformin |
| Moderate/high-intensity statin | Cardiovascular risk reduction |
Note: With HbA1c 8.6%, this patient will likely need both SGLT2i and metformin (if eGFR permits) for adequate glycemic control, as SGLT2i alone typically reduces HbA1c by only 0.6-0.9%. GLP-1 RA (e.g., semaglutide) can be added if needed.
Rai and Binet classification of cll
| Stage | Features | Risk Group | Median Survival |
|---|---|---|---|
| 0 | Lymphocytosis only (lymphocytes >5 × 10⁹/L in blood + >40% in marrow) | Low risk | >10 years |
| I | Lymphocytosis + lymphadenopathy | Intermediate risk | ~7 years |
| II | Lymphocytosis + splenomegaly and/or hepatomegaly (with or without lymphadenopathy) | Intermediate risk | ~7 years |
| III | Lymphocytosis + anemia (Hgb <11 g/dL) due to bone marrow involvement | High risk | ~1.5 years |
| IV | Lymphocytosis + thrombocytopenia (platelets <100,000/μL) due to bone marrow involvement | High risk | ~1.5 years |
| Stage | Criteria | Median Survival |
|---|---|---|
| A | <3 lymphoid areas involved; no anemia or thrombocytopenia | >10 years |
| B | ≥3 lymphoid areas involved; no anemia or thrombocytopenia | ~7 years |
| C | Hgb ≤10 g/dL and/or platelets <100,000/μL (regardless of areas involved) | ~2 years |
| Feature | Rai | Binet |
|---|---|---|
| Number of stages | 5 (0-IV) | 3 (A, B, C) |
| Used predominantly in | USA | Europe |
| Lymphocytosis criterion | Yes (baseline for all stages) | Implied |
| Lymphadenopathy | Stage I (any area) | Stage A vs B (counts areas) |
| Organomegaly | Stage II | Counted as one of 5 areas |
| Anemia | Stage III (Hgb <11) | Stage C (Hgb ≤10) |
| Thrombocytopenia | Stage IV (<100,000/μL) | Stage C (<100,000/μL) |
Note: Anemia/thrombocytopenia in CLL staging must be due to bone marrow involvement, not autoimmune causes (AIHA or ITP), to be counted for staging purposes.
| Variable | Adverse factor | Score |
|---|---|---|
| TP53 status | Deleted or mutated | 4 |
| IGHV mutational status | Unmutated | 2 |
| β2-microglobulin | >3.5 mg/L | 2 |
| Clinical stage | Rai I-IV or Binet B-C | 1 |
| Age | >65 years | 1 |
| Total Score | Risk | 5-year Survival |
|---|---|---|
| 0-1 | Low | 93.2% |
| 2-3 | Intermediate | 79.3% |
| 4-6 | High | 63.3% |
| 7-10 | Very high | 23.3% |
Create a visual comparison table of Rai vs Binet staging
A clean, professional medical comparison table titled "CLL Staging Systems: Rai vs Binet" with two columns side by side on a white background. Left column header: "RAI STAGING SYSTEM (USA)" in dark blue Right column header: "BINET STAGING SYSTEM (Europe)" in dark teal Left column rows: - Stage 0 | Low Risk | Lymphocytosis only | Survival >10 yrs - Stage I | Intermediate Risk | Lymphocytosis + Lymphadenopathy | Survival ~7 yrs - Stage II | Intermediate Risk | Lymphocytosis + Splenomegaly/Hepatomegaly | Survival ~7 yrs - Stage III | High Risk | Lymphocytosis + Anemia (Hgb <11 g/dL) | Survival ~1.5 yrs - Stage IV | High Risk | Lymphocytosis + Thrombocytopenia (Plt <100k) | Survival ~1.5 yrs Right column rows aligned to match risk: - Stage A | <3 lymphoid areas, no cytopenias | Survival >10 yrs - Stage B | ≥3 lymphoid areas, no cytopenias | Survival ~7 yrs - Stage C | Hgb ≤10 g/dL and/or Plt <100k | Survival ~2 yrs Color coding: Low risk rows in green, Intermediate risk in yellow/amber, High risk in red. A connecting bracket on the right side shows: Rai 0 = Binet A (green), Rai I+II = Binet B (amber), Rai III+IV = Binet C (red). Bottom note: "5 Lymphoid Areas counted in Binet: Cervical, Axillary, Inguinal nodes + Spleen + Liver" Footer note: "Cytopenias must be due to bone marrow involvement, NOT autoimmune causes" Clean medical infographic style, modern fonts, high contrast, easy to read.

Make a quick reference PDF of CLL staging and prognosis
mkdir -p /tmp/workspace/cll-staging && ls /tmp/workspace/cll-staging/
~/cll-staging/create_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import KeepTogether
# ── colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1A3A5C")
TEAL = colors.HexColor("#0E7490")
GREEN_BG = colors.HexColor("#D1FAE5")
GREEN_TXT = colors.HexColor("#065F46")
AMBER_BG = colors.HexColor("#FEF3C7")
AMBER_TXT = colors.HexColor("#92400E")
RED_BG = colors.HexColor("#FEE2E2")
RED_TXT = colors.HexColor("#991B1B")
BLUE_BG = colors.HexColor("#DBEAFE")
BLUE_TXT = colors.HexColor("#1E40AF")
PURPLE_BG = colors.HexColor("#EDE9FE")
PURPLE_TXT = colors.HexColor("#5B21B6")
GREY_BG = colors.HexColor("#F3F4F6")
GREY_TXT = colors.HexColor("#374151")
WHITE = colors.white
LIGHT_NAVY = colors.HexColor("#EFF6FF")
W, H = A4
doc = SimpleDocTemplate(
"/tmp/workspace/cll-staging/CLL_Staging_Quick_Reference.pdf",
pagesize=A4,
leftMargin=1.5*cm, rightMargin=1.5*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm
)
styles = getSampleStyleSheet()
def style(name="Normal", size=10, bold=False, color=colors.black,
align=TA_LEFT, leading=None):
return ParagraphStyle(
name,
fontName="Helvetica-Bold" if bold else "Helvetica",
fontSize=size,
textColor=color,
alignment=align,
leading=leading or size * 1.3,
spaceAfter=0,
)
def P(text, **kw):
return Paragraph(text, style(**kw))
def cell(text, size=9, bold=False, color=colors.black, align=TA_CENTER):
return Paragraph(text, style(size=size, bold=bold, color=color, align=align))
story = []
# ── TITLE BLOCK ─────────────────────────────────────────────────────────────
title_data = [[
Paragraph(
"<font color='white'><b>CLL STAGING & PROGNOSIS</b><br/>"
"<font size=10>Quick Reference Card · Chronic Lymphocytic Leukemia</font></font>",
ParagraphStyle("t", fontName="Helvetica-Bold", fontSize=18,
textColor=WHITE, alignment=TA_CENTER, leading=24)
)
]]
title_tbl = Table(title_data, colWidths=[W - 3*cm])
title_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING",(0,0),(-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING",(0,0), (-1,-1), 12),
("ROUNDEDCORNERS", (0,0), (-1,-1), [6,6,6,6]),
]))
story.append(title_tbl)
story.append(Spacer(1, 0.4*cm))
# ── SECTION HEADING helper ───────────────────────────────────────────────────
def section_heading(text, bg=TEAL):
t = Table([[cell(text, size=10, bold=True, color=WHITE)]],
colWidths=[W - 3*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),
]))
return t
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 1 — RAI STAGING
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_heading("① RAI STAGING SYSTEM (Commonly used in the USA)"))
story.append(Spacer(1, 0.2*cm))
rai_header = [
cell("Stage", bold=True, color=WHITE),
cell("Risk Group", bold=True, color=WHITE),
cell("Features", bold=True, color=WHITE),
cell("Median Survival", bold=True, color=WHITE),
]
rai_rows = [
rai_header,
[cell("0"), cell("Low", bold=True, color=GREEN_TXT),
cell("Lymphocytosis ONLY\n(ALC >5×10⁹/L)", align=TA_LEFT),
cell(">10 years", bold=True, color=GREEN_TXT)],
[cell("I"), cell("Intermediate", bold=True, color=AMBER_TXT),
cell("Lymphocytosis + Lymphadenopathy", align=TA_LEFT),
cell("~7 years", bold=True, color=AMBER_TXT)],
[cell("II"), cell("Intermediate", bold=True, color=AMBER_TXT),
cell("Lymphocytosis + Splenomegaly / Hepatomegaly\n(± lymphadenopathy)", align=TA_LEFT),
cell("~7 years", bold=True, color=AMBER_TXT)],
[cell("III"), cell("High", bold=True, color=RED_TXT),
cell("Lymphocytosis + Anaemia (Hgb <11 g/dL)\ndue to bone marrow involvement", align=TA_LEFT),
cell("~1.5 years", bold=True, color=RED_TXT)],
[cell("IV"), cell("High", bold=True, color=RED_TXT),
cell("Lymphocytosis + Thrombocytopenia (Plt <100×10⁹/L)\ndue to bone marrow involvement", align=TA_LEFT),
cell("~1.5 years", bold=True, color=RED_TXT)],
]
rai_col_w = [1.4*cm, 3.0*cm, 8.8*cm, 3.0*cm]
rai_tbl = Table(rai_rows, colWidths=rai_col_w, rowHeights=None)
rai_tbl.setStyle(TableStyle([
# header row
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
# stage 0 row
("BACKGROUND", (0,1), (-1,1), GREEN_BG),
# stage I & II
("BACKGROUND", (0,2), (-1,3), AMBER_BG),
# stage III & IV
("BACKGROUND", (0,4), (-1,5), RED_BG),
# grid
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CBD5E1")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (1,-1), "CENTER"),
("ALIGN", (3,0), (3,-1), "CENTER"),
]))
story.append(rai_tbl)
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 2 — BINET STAGING
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_heading("② BINET STAGING SYSTEM (Commonly used in Europe)"))
story.append(Spacer(1, 0.15*cm))
# note about 5 areas
note_tbl = Table([[
cell("5 Lymphoid Areas counted in Binet: "
"① Cervical nodes ② Axillary nodes ③ Inguinal nodes "
"④ Spleen ⑤ Liver",
size=8, color=BLUE_TXT, align=TA_LEFT)
]], colWidths=[W - 3*cm])
note_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), BLUE_BG),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0),(-1,-1), 8),
("GRID", (0,0),(-1,-1), 0.3, colors.HexColor("#BFDBFE")),
]))
story.append(note_tbl)
story.append(Spacer(1, 0.2*cm))
binet_header = [
cell("Stage", bold=True, color=WHITE),
cell("Criteria", bold=True, color=WHITE),
cell("Equivalent Rai", bold=True, color=WHITE),
cell("Median Survival", bold=True, color=WHITE),
]
binet_rows = [
binet_header,
[cell("A", bold=True, color=GREEN_TXT),
cell("<3 lymphoid areas involved\nNo anaemia, no thrombocytopenia", align=TA_LEFT),
cell("Stage 0"),
cell(">10 years", bold=True, color=GREEN_TXT)],
[cell("B", bold=True, color=AMBER_TXT),
cell("≥3 lymphoid areas involved\nNo anaemia, no thrombocytopenia", align=TA_LEFT),
cell("Stage I / II"),
cell("~7 years", bold=True, color=AMBER_TXT)],
[cell("C", bold=True, color=RED_TXT),
cell("Hgb ≤10 g/dL AND/OR Platelets <100×10⁹/L\n(regardless of nodes involved)", align=TA_LEFT),
cell("Stage III / IV"),
cell("~2 years", bold=True, color=RED_TXT)],
]
binet_col_w = [1.4*cm, 8.4*cm, 3.0*cm, 3.4*cm]
binet_tbl = Table(binet_rows, colWidths=binet_col_w)
binet_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("BACKGROUND", (0,1), (-1,1), GREEN_BG),
("BACKGROUND", (0,2), (-1,2), AMBER_BG),
("BACKGROUND", (0,3), (-1,3), RED_BG),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CBD5E1")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (0,-1), "CENTER"),
("ALIGN", (2,0), (3,-1), "CENTER"),
]))
story.append(binet_tbl)
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 3 — CLL-IPI
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_heading("③ CLL INTERNATIONAL PROGNOSTIC INDEX (CLL-IPI)",
bg=colors.HexColor("#5B21B6")))
story.append(Spacer(1, 0.2*cm))
# left: scoring variables | right: risk interpretation
ipi_var_header = [cell("Variable", bold=True, color=WHITE),
cell("Adverse Factor", bold=True, color=WHITE),
cell("Score", bold=True, color=WHITE)]
ipi_var_rows = [
ipi_var_header,
[cell("TP53 status", align=TA_LEFT),
cell("Deleted or mutated", align=TA_LEFT), cell("4", bold=True)],
[cell("IGHV mutational status", align=TA_LEFT),
cell("Unmutated", align=TA_LEFT), cell("2", bold=True)],
[cell("β2-Microglobulin", align=TA_LEFT),
cell(">3.5 mg/L", align=TA_LEFT), cell("2", bold=True)],
[cell("Clinical stage", align=TA_LEFT),
cell("Rai I–IV or Binet B–C", align=TA_LEFT), cell("1", bold=True)],
[cell("Age", align=TA_LEFT),
cell(">65 years", align=TA_LEFT), cell("1", bold=True)],
]
ipi_risk_header = [cell("Total Score", bold=True, color=WHITE),
cell("Risk", bold=True, color=WHITE),
cell("5-yr Survival", bold=True, color=WHITE)]
ipi_risk_rows = [
ipi_risk_header,
[cell("0 – 1"), cell("Low", bold=True, color=GREEN_TXT),
cell("93.2%", bold=True, color=GREEN_TXT)],
[cell("2 – 3"), cell("Intermediate", bold=True, color=AMBER_TXT),
cell("79.3%", bold=True, color=AMBER_TXT)],
[cell("4 – 6"), cell("High", bold=True, color=RED_TXT),
cell("63.3%", bold=True, color=RED_TXT)],
[cell("7 – 10"), cell("Very High", bold=True, color=colors.HexColor("#7F1D1D")),
cell("23.3%", bold=True, color=colors.HexColor("#7F1D1D"))],
]
ipi_var_tbl = Table(ipi_var_rows, colWidths=[4.2*cm, 5.0*cm, 1.4*cm])
ipi_var_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#5B21B6")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("BACKGROUND", (0,1), (-1,-1), PURPLE_BG),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#DDD6FE")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (2,0), (2,-1), "CENTER"),
]))
ipi_risk_tbl = Table(ipi_risk_rows, colWidths=[2.8*cm, 3.0*cm, 2.8*cm])
ipi_risk_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#5B21B6")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("BACKGROUND", (0,1), (-1,1), GREEN_BG),
("BACKGROUND", (0,2), (-1,2), AMBER_BG),
("BACKGROUND", (0,3), (-1,3), RED_BG),
("BACKGROUND", (0,4), (-1,4), colors.HexColor("#FEE2E2")),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#DDD6FE")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (-1,-1), "CENTER"),
]))
combined = Table([[ipi_var_tbl, Spacer(0.3*cm, 0), ipi_risk_tbl]],
colWidths=[10.6*cm, 0.3*cm, 8.6*cm])
combined.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0),(-1,-1), 0),
("RIGHTPADDING", (0,0),(-1,-1), 0),
("TOPPADDING", (0,0),(-1,-1), 0),
("BOTTOMPADDING",(0,0),(-1,-1), 0),
]))
story.append(combined)
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 4 — CYTOGENETIC MARKERS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_heading("④ KEY PROGNOSTIC MARKERS (FISH / Molecular)",
bg=colors.HexColor("#0369A1")))
story.append(Spacer(1, 0.2*cm))
cyto_header = [cell("Marker", bold=True, color=WHITE),
cell("Frequency", bold=True, color=WHITE),
cell("Prognostic Impact", bold=True, color=WHITE),
cell("Risk", bold=True, color=WHITE)]
cyto_rows = [
cyto_header,
[cell("del(13q)", align=TA_LEFT), cell("55%"),
cell("Favourable — longest survival when isolated", align=TA_LEFT),
cell("LOW", bold=True, color=GREEN_TXT)],
[cell("Trisomy 12", align=TA_LEFT), cell("15%"),
cell("Intermediate prognosis", align=TA_LEFT),
cell("LOW", bold=True, color=GREEN_TXT)],
[cell("Mutated IGHV", align=TA_LEFT), cell("~50%"),
cell("Favourable — indolent course", align=TA_LEFT),
cell("LOW", bold=True, color=GREEN_TXT)],
[cell("del(11q)", align=TA_LEFT), cell("18%"),
cell("Bulky lymphadenopathy; shorter survival", align=TA_LEFT),
cell("HIGH", bold=True, color=RED_TXT)],
[cell("del(17p) / TP53", align=TA_LEFT), cell("7%"),
cell("Worst prognosis; resistant to chemoimmunotherapy", align=TA_LEFT),
cell("HIGH", bold=True, color=RED_TXT)],
[cell("Unmutated IGHV", align=TA_LEFT), cell("~50%"),
cell("Aggressive course; higher risk of transformation", align=TA_LEFT),
cell("HIGH", bold=True, color=RED_TXT)],
]
cyto_col_w = [3.2*cm, 2.2*cm, 8.4*cm, 2.4*cm]
cyto_tbl = Table(cyto_rows, colWidths=cyto_col_w)
cyto_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), colors.HexColor("#0369A1")),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("BACKGROUND", (0,1), (-1,3), LIGHT_NAVY),
("BACKGROUND", (0,4), (-1,-1), colors.HexColor("#FFF7ED")),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BAE6FD")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (1,0), (1,-1), "CENTER"),
("ALIGN", (3,0), (3,-1), "CENTER"),
]))
story.append(cyto_tbl)
story.append(Spacer(1, 0.5*cm))
# ══════════════════════════════════════════════════════════════════════════════
# SECTION 5 — TREATMENT TRIGGERS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_heading("⑤ INDICATIONS FOR TREATMENT (iwCLL Criteria)",
bg=colors.HexColor("#B45309")))
story.append(Spacer(1, 0.2*cm))
triggers = [
"Progressive bone marrow failure (worsening anaemia or thrombocytopenia)",
"Massive or progressive splenomegaly (>6 cm below costal margin)",
"Massive lymphadenopathy (>10 cm longest diameter) or progressive symptomatic LAD",
"Progressive lymphocytosis (>50% increase in 2 months OR doubling time <6 months)",
"Autoimmune haemolytic anaemia (AIHA) or ITP poorly responsive to steroids",
"Constitutional symptoms: unintentional weight loss >10% in 6 mo, fever >38°C ≥2 wks,\n night sweats >1 month, significant fatigue (ECOG PS ≥2)",
]
trigger_rows = []
for t in triggers:
trigger_rows.append([
cell("✓", bold=True, color=colors.HexColor("#B45309")),
cell(t, align=TA_LEFT, size=9, color=GREY_TXT)
])
trigger_tbl = Table(trigger_rows, colWidths=[0.7*cm, W - 3*cm - 0.7*cm])
trigger_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#FFFBEB")),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#FDE68A")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (0,-1), "CENTER"),
]))
story.append(trigger_tbl)
story.append(Spacer(1, 0.4*cm))
# ══════════════════════════════════════════════════════════════════════════════
# IMPORTANT NOTES BOX
# ══════════════════════════════════════════════════════════════════════════════
notes = [
"<b>Watch & Wait:</b> Most CLL patients do NOT need immediate treatment — stage alone is not an indication.",
"<b>Cytopenias for staging:</b> Must be due to bone marrow involvement, NOT autoimmune causes (AIHA/ITP).",
"<b>Richter's Transformation:</b> CLL converting to DLBCL (~0.5%/yr) — suspect if rapid LAD ↑ + high LDH; confirm with PET + biopsy.",
"<b>Diagnosis requires:</b> ALC >5×10⁹/L on peripheral blood + flow cytometry (CD5⁺, CD19⁺, CD23⁺, κ/λ light chain restriction).",
]
note_rows = [[
cell("⚠", bold=True, color=NAVY, size=11),
cell(n, align=TA_LEFT, size=8.5, color=GREY_TXT)
] for n in notes]
notes_tbl = Table(note_rows, colWidths=[0.7*cm, W - 3*cm - 0.7*cm])
notes_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#EFF6FF")),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#BFDBFE")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("ALIGN", (0,0), (0,-1), "CENTER"),
]))
story.append(notes_tbl)
story.append(Spacer(1, 0.35*cm))
# ── FOOTER ───────────────────────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#CBD5E1")))
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph(
"<font size='7' color='#6B7280'>Sources: Harrison's Principles of Internal Medicine 22E (2025) · "
"The Washington Manual of Medical Therapeutics · "
"Comprehensive Clinical Nephrology 7E · "
"iwCLL 2018 Guidelines | For educational use only.</font>",
ParagraphStyle("footer", fontSize=7, textColor=colors.HexColor("#6B7280"),
alignment=TA_CENTER)
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print("PDF created successfully.")
python /tmp/workspace/cll-staging/create_pdf.py
ls -lh /tmp/workspace/cll-staging/
CLL Staging Quick Reference
PDF Document · PDF
Make a quick reference PDF of CLL staging and prognosis
CLL Staging Quick Reference
PDF Document · PDF
Tell about diagnosis
| Marker | Expression in CLL | Notes |
|---|---|---|
| CD19 | Positive | Pan B-cell marker |
| CD20 | Positive (dim) | B-cell marker |
| CD22 | Positive | B-cell marker |
| CD23 | Positive | Key distinguisher from MCL |
| CD200 | Positive | Helps differentiate from MCL |
| CD5 | Positive | T-cell antigen aberrantly expressed on CLL B-cells |
| Surface Ig (sIg) | Dim (κ or λ) | Monoclonal light chain restriction |
| CD10 | Negative | Distinguishes from follicular lymphoma |
| Cyclin D1 | Negative | Distinguishes from mantle cell lymphoma |
| FMC7 | Negative/weak | Another MCL differentiator |
The co-expression of CD5 + CD23 on B-cells is the classic CLL immunophenotype. CD5 is normally a T-cell marker - its expression on malignant B-cells is a hallmark of CLL/SLL.
| Feature | CLL | SLL | MBL |
|---|---|---|---|
| Clonal B-cells in blood | ≥5 × 10⁹/L | <5 × 10⁹/L | <5 × 10⁹/L |
| Lymphadenopathy/organomegaly | Variable | Present | Absent |
| Cytopenias | Variable | Variable | Absent |
| Immunophenotype | CLL-type | CLL-type | CLL-type (~75%) |
| Management | Haematologist | Haematologist | Primary care monitoring |
| Test | Purpose |
|---|---|
| CBC + differential | Quantify lymphocytosis |
| Peripheral blood flow cytometry | Confirm CLL immunophenotype |
| FISH panel | Detect del(13q), del(11q), del(17p)/TP53, trisomy 12 - prognostic |
| Stimulated karyotype | Detect complex karyotype (poor prognosis) |
| TP53 mutation sequencing | High-risk marker; influences treatment choice |
| IGHV mutational status | Mutated = better prognosis; unmutated = aggressive |
| β2-Microglobulin | Prognostic (used in CLL-IPI score) |
| LDH, uric acid | Baseline |
| Immunoglobulin levels | Hypogammaglobulinaemia is common (~85%) |
| CT scan | Not routine; only if symptomatic or concern for intra-abdominal nodes disproportionate to peripheral disease |
| Bone marrow biopsy | NOT required for diagnosis; only done at start of therapy or for unexplained cytopenias |
| Diagnosis | Key Distinguishing Feature |
|---|---|
| Mantle Cell Lymphoma (MCL) | CD5+, CD23-, Cyclin D1+, t(11;14) |
| Follicular Lymphoma | CD10+, CD5- |
| Hairy Cell Leukaemia | CD103+, CD11c bright, TRAP+ |
| Prolymphocytic Leukaemia (PLL) | >55% prolymphocytes, CD5 often negative, very high WBC |
| Reactive lymphocytosis | Polyclonal on flow cytometry (no light chain restriction) |