AML, ALL, Sickle cell anemia , thalasemia, CML, Microcytic hypochromic anemia and CML- Show me the histopath slides for all these conditions and in brief about each condition and suggest easy diagrams to draw in practical exam along with expected viva questions

AML PERIPHERAL SMEAR (draw these cells):
- Large blast cell: big round nucleus, 3-5 nucleoli, moderate gray cytoplasm
- AUER ROD: needle-shaped pink inclusion inside the blast cytoplasm ← label this!
- Scattered normal-looking RBCs around the blasts
- Reduced platelets
Mnemonic: AML = Auer rod, Myeloperoxidase positive, Large blasts

ALL PERIPHERAL SMEAR:
- Small-medium blasts: scant cytoplasm (thin rim), condensed chromatin
- NO Auer rods (important difference from AML!)
- Nucleoli: inconspicuous or absent
- Normal-looking RBCs in background (reduced)
Mnemonic: ALL = Affects children, Lymphoblasts, Lack Auer rods

CML PERIPHERAL SMEAR:
Draw the "left shift spectrum" in one smear:
- Myeloblast (far left) → Promyelocyte → Myelocyte → Metamyelocyte → Band → Neutrophil
- Increase in basophils (dark granular cells)
- Increase in eosinophils
- Platelets may be increased
Label: "ALL stages visible" = hallmark
Mnemonic: CML = Chromosome 22 (Philadelphia), Massive spleen, Left shift (all stages)


SICKLE CELL SMEAR:
- Draw several normal round RBCs
- Draw 3-4 crescent/sickle shaped elongated cells ← label "sickle cell"
- Draw 1-2 target cells (bull's eye pattern) ← label "target cell"
- Label: "Irreversibly sickled cell" for the most distorted one
Mnemonic: SCA = Sickle + Crisis + Autosplenectomy

THALASSEMIA PERIPHERAL SMEAR:
- Small, pale RBCs (microcytic, hypochromic)
- Target cells (bull's eye pattern) ← very important
- Nucleated RBCs (normoblasts) - oval cells with nucleus visible
- Anisocytosis (cells vary in size)
- Basophilic stippling (blue dots inside RBC)
Label each finding separately!
Mnemonic: THAL = Target cells, Hypochromic, Anemia (severe), Low HbA

IDA PERIPHERAL SMEAR:
- Draw RBCs that are SMALLER than normal lymphocyte
- Central pallor = MORE than 1/3 of the cell diameter (exaggerated pale center)
- Draw 1-2 "pencil cells" (elongated, thin pale cells)
- Label: Microcytic + Hypochromic + Anisocytosis (varying sizes)
Reference: Normal RBC = about the size of a small lymphocyte nucleus
Mnemonic: IDA = Increased TIBC, Decreased ferritin, Anemia microcytic
CML has been fully covered above under item 3. If you meant CLL (Chronic Lymphocytic Leukemia), please let me know and I will add that condition.
| Feature | AML | ALL | CML | Sickle Cell | Thalassemia | IDA |
|---|---|---|---|---|---|---|
| Cell type | Myeloblasts | Lymphoblasts | Mature granulocytes (all stages) | Sickled RBCs | Hypochromic RBCs | Hypochromic RBCs |
| Auer rods | Yes (pathognomonic) | No | No | No | No | No |
| Key marker | MPO, CD33, CD13 | TdT, CD10, CD19 (B) | BCR-ABL / Ph chr | HbS on electrophoresis | Reduced HbA, high HbF | Low ferritin, high TIBC |
| Spleen | Mild ↑ | Moderate ↑ | Massive ↑ | Autosplenectomy | Moderate ↑ | Normal |
| Age | Adults >60 | Children 2-10 | Adults 25-60 | Childhood onset | Childhood onset | Any |
| Key genetic | PML-RARA, IDH1/2 | t(12;21), t(9;22) | t(9;22) BCR-ABL | β-globin Glu→Val | β/α globin gene mutations | - |
| Treatment | Chemo; ATRA for APL | Chemo; TKI for Ph+ | Imatinib | Hydroxyurea, BMT | Transfusion + chelation | Oral iron |
Show me the comparision table
| Feature | AML | ALL | CML | Sickle Cell Anemia | Thalassemia (β-major) | Microcytic Hypochromic Anemia (IDA) |
|---|---|---|---|---|---|---|
| Type | Acute myeloid leukemia | Acute lymphoid leukemia | Chronic myeloproliferative | Hemoglobinopathy | Hemoglobinopathy | Nutritional/blood loss anemia |
| Cell of origin | Myeloid stem cell | Lymphoid precursor (B or T) | Pluripotent hematopoietic stem cell | RBC (structural Hb defect) | RBC (globin synthesis defect) | RBC (iron deficiency) |
| Age group | Adults >60 yrs (most common AL in adults) | Children 2-10 yrs (most common childhood cancer) | Adults 25-60 yrs; peak 4th-5th decade | Infancy onwards (after HbF falls at ~6 months) | Infancy/childhood | Any age; common in women of reproductive age |
| Genetics | PML-RARA t(15;17) in APL; IDH1/IDH2; RUNX1 | t(12;21) ETV6-RUNX1 (childhood); t(9;22) BCR-ABL (adult) | t(9;22) Philadelphia chromosome → BCR-ABL | Point mutation β-globin: Glu→Val at position 6 | β-globin point mutations (β-thal); α-globin deletions (α-thal) | No genetic mutation (usually acquired) |
| Peripheral smear - Key finding | Myeloblasts + Auer rods (pathognomonic) | Lymphoblasts (scant cytoplasm, condensed chromatin) | All granulocyte stages (left shift), basophilia, eosinophilia | Sickle/crescent cells, target cells, Howell-Jolly bodies | Microcytic hypochromic cells, target cells, nucleated RBCs, basophilic stippling | Microcytic hypochromic RBCs, pencil cells, central pallor >1/3 |
| Blast % | ≥20% blasts in marrow (diagnostic threshold) | ≥20% lymphoblasts in marrow | <10% blasts (chronic phase); ≥20% = blast crisis | Not applicable | Not applicable | Not applicable |
| Auer rods | YES - pathognomonic | NO | NO | NO | NO | NO |
| TdT | Negative | Positive (hallmark of ALL) | Negative | Negative | Negative | Negative |
| Key immunomarkers | MPO+, CD33, CD13, CD117, CD34 | B-ALL: TdT, CD10, CD19, CD22; T-ALL: TdT, CD3, CD7 | BCR-ABL protein; CD34 (stem cell) | HbS on electrophoresis | Hb electrophoresis (↓HbA, ↑HbF, ↑HbA2) | Serum ferritin ↓, TIBC ↑ |
| WBC count | Variable; may be high or normal | Variable; often markedly elevated | Markedly elevated >100,000/µL | Normal or slightly elevated | Normal or slightly elevated | Normal |
| RBC morphology | Normocytic (RBCs replaced by blasts) | Normocytic (RBCs reduced) | Normocytic | Sickle cells, target cells, anisocytosis | Microcytic, hypochromic, target cells, anisocytosis, poikilocytosis | Microcytic, hypochromic, pencil cells |
| MCV | Normal | Normal | Normal | Normal/low | Low | Low |
| Reticulocytes | Low (marrow failure) | Low (marrow failure) | Normal or elevated | Elevated (hemolytic response) | Elevated (compensation) | Low (underproduction) |
| Serum iron | Normal | Normal | Normal | Normal/high | Normal/high | Low |
| Serum ferritin | Normal | Normal | Normal | Normal/high | Normal/high (iron overload) | Low (best indicator of iron stores) |
| TIBC | Normal | Normal | Normal | Normal | Normal | High |
| Hb electrophoresis | Normal | Normal | Normal | HbS replaces HbA | ↓/absent HbA; ↑HbF; ↑HbA2 | Normal |
| LAP score | N/A | N/A | Low (key: distinguishes from leukemoid reaction where LAP is HIGH) | N/A | N/A | N/A |
| Bone marrow | Hypercellular; packed myeloblasts replacing normal elements | Hypercellular; sheets of lymphoblasts | Hypercellular; granulocytic + megakaryocytic hyperplasia | Erythroid hyperplasia | Erythroid hyperplasia; ineffective erythropoiesis | Erythroid hyperplasia; absent iron stores |
| Splenomegaly | Mild | Moderate (more pronounced than AML) | Massive (extramedullary hematopoiesis) | Children: moderate; Adults: autosplenectomy (fibrosed) | Moderate to massive | Absent |
| Lymphadenopathy | Mild | Prominent | Mild | Absent | Absent | Absent |
| CNS involvement | Rare | Yes (CNS prophylaxis required) | Rare | Stroke (vascular occlusion) | Absent | Absent |
| Mediastinal mass | No | T-ALL: Yes (thymic involvement, 50-70%) | No | No | No | No |
| Infection susceptibility | Neutropenia → gram-negative bacteria | Neutropenia → opportunistic infections | Less in chronic phase | Encapsulated bacteria (S. pneumoniae, H. influenzae) due to autosplenectomy | Yes (due to anemia-related immune compromise) | Mild |
| Bleeding risk | Yes (thrombocytopenia; DIC in APL) | Yes (thrombocytopenia) | Less common | Yes (vaso-occlusion; priapism) | Less common | No |
| Key clinical sign | Gum infiltration (monocytic AML), DIC | Bone pain, testicular enlargement | Massive spleen, dragging sensation in abdomen | Painful crises, dactylitis, jaundice | Crew-cut skull, chipmunk facies, growth retardation | Koilonychia, glossitis, pica, angular cheilitis |
| Diagnosis confirmed by | Bone marrow biopsy; cytogenetics; flow cytometry | Bone marrow biopsy; flow cytometry; cytogenetics | BCR-ABL by PCR/FISH/karyotype | Hb electrophoresis; sickling test | Hb electrophoresis; DNA analysis | Serum ferritin + iron + TIBC; bone marrow iron stain |
| Natural history | Weeks to months if untreated; aggressive | Weeks to months if untreated; aggressive | Slow progression → accelerated → blast crisis | Episodic crises; chronic hemolysis | Progressive; transfusion-dependent | Responds to treatment; iron repletion |
| Treatment | Cytarabine + anthracycline; ATRA + arsenic (APL) | Combination chemotherapy; TKI for Ph+ ALL; CAR-T for relapsed | Imatinib (TKI); 2nd gen: dasatinib, nilotinib | Hydroxyurea (↑HbF), transfusion, BMT, gene therapy | Blood transfusion + iron chelation (deferoxamine); BMT | Oral ferrous sulfate; treat underlying cause |
| Prognosis | Variable; APL >90% cure; others 40-60% | Children >80% cure; adults poorer | Excellent with imatinib (median survival >10 yrs) | Variable; chronic morbidity | β-major: shortened lifespan without BMT | Excellent with treatment |
| Mentzer Index (MCV/RBC) | N/A | N/A | N/A | N/A | <13 (thalassemia) | >13 (IDA) |
| Scenario | Answer |
|---|---|
| Auer rods seen on smear | AML |
| TdT positive blast | ALL |
| t(9;22) in adult leukemia | CML or adult B-ALL |
| Low LAP score | CML (not leukemoid reaction) |
| Blast crisis with no prior history | Think CML transforming |
| Microcytic anemia + low ferritin | IDA |
| Microcytic anemia + normal/high ferritin + target cells | Thalassemia |
| Mentzer index <13 | Thalassemia |
| Mentzer index >13 | IDA |
| Crescent-shaped RBCs + vaso-occlusive pain | Sickle cell disease |
| Crew-cut skull X-ray + chipmunk facies | β-thalassemia major |
| Howell-Jolly bodies in adult | Sickle cell (autosplenectomy) |
| Massive splenomegaly + WBC >100,000 | CML |
| Mediastinal mass + leukemia in a teenager | T-ALL |
Generate a high-yield PDF cheat sheet of these comparisons for exam prep
mkdir -p /home/daytona/workspace/hematology-cheatsheet && ls /home/daytona/workspace/
~/hematology-cheatsheet/generate_cheatsheet.py
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import FrameBreak
OUTPUT = "/home/daytona/workspace/hematology-cheatsheet/Hematology_CheatSheet.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
C_TITLE_BG = colors.HexColor("#1a237e") # deep indigo
C_TITLE_FG = colors.white
C_HEAD_BG = colors.HexColor("#283593") # indigo
C_HEAD_FG = colors.white
C_ROW_ALT = colors.HexColor("#e8eaf6") # very light indigo
C_ROW_EVEN = colors.white
C_ACCENT_RED = colors.HexColor("#c62828")
C_ACCENT_GRN = colors.HexColor("#1b5e20")
C_ACCENT_ORG = colors.HexColor("#e65100")
C_GOLD = colors.HexColor("#f9a825")
C_GOLD_BG = colors.HexColor("#fff8e1")
C_BORDER = colors.HexColor("#5c6bc0")
C_PINK_BG = colors.HexColor("#fce4ec")
C_GREEN_BG = colors.HexColor("#e8f5e9")
C_BLUE_BG = colors.HexColor("#e3f2fd")
C_ORANGE_BG = colors.HexColor("#fff3e0")
C_PURPLE_BG = colors.HexColor("#f3e5f5")
C_TEAL_BG = colors.HexColor("#e0f7fa")
# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
sTitle = S("sTitle", fontSize=22, textColor=C_TITLE_FG, alignment=TA_CENTER,
fontName="Helvetica-Bold", spaceAfter=4)
sSubtitle = S("sSubtitle", fontSize=11, textColor=colors.HexColor("#c5cae9"),
alignment=TA_CENTER, fontName="Helvetica", spaceAfter=2)
sSection = S("sSection", fontSize=13, textColor=C_TITLE_BG,
fontName="Helvetica-Bold", spaceBefore=10, spaceAfter=4)
sBody = S("sBody", fontSize=7.5, fontName="Helvetica", leading=10)
sBold = S("sBold", fontSize=7.5, fontName="Helvetica-Bold", leading=10)
sSmall = S("sSmall", fontSize=6.8, fontName="Helvetica", leading=9)
sSmallBold = S("sSmallBold", fontSize=6.8, fontName="Helvetica-Bold", leading=9)
sCell = S("sCell", fontSize=7, fontName="Helvetica", leading=9, alignment=TA_LEFT)
sCellB = S("sCellB", fontSize=7, fontName="Helvetica-Bold", leading=9, textColor=C_ACCENT_RED)
sCellH = S("sCellH", fontSize=7.5, fontName="Helvetica-Bold", leading=10,
textColor=C_TITLE_FG, alignment=TA_CENTER)
sFooter = S("sFooter", fontSize=7, fontName="Helvetica-Oblique",
textColor=colors.grey, alignment=TA_CENTER)
sMnem = S("sMnem", fontSize=8, fontName="Helvetica-Bold",
textColor=C_ACCENT_ORG, leading=11)
sViva = S("sViva", fontSize=7.5, fontName="Helvetica", leading=10,
textColor=colors.HexColor("#212121"))
sTip = S("sTip", fontSize=8, fontName="Helvetica-Bold",
textColor=C_ACCENT_GRN, leading=11)
def p(text, style=sBody):
return Paragraph(text, style)
def bold(text):
return f'<b>{text}</b>'
def red(text):
return f'<font color="#c62828"><b>{text}</b></font>'
def grn(text):
return f'<font color="#1b5e20"><b>{text}</b></font>'
def org(text):
return f'<font color="#e65100"><b>{text}</b></font>'
# ── Table helper ──────────────────────────────────────────────────────────────
def make_table(data, col_widths, row_colors=None, font_size=7):
"""data is list of lists of Paragraphs/strings."""
t = Table(data, colWidths=col_widths, repeatRows=1)
style_cmds = [
("BACKGROUND", (0, 0), (-1, 0), C_HEAD_BG),
("TEXTCOLOR", (0, 0), (-1, 0), C_HEAD_FG),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, 0), font_size),
("ALIGN", (0, 0), (-1, 0), "CENTER"),
("VALIGN", (0, 0), (-1,-1), "TOP"),
("FONTSIZE", (0, 1), (-1,-1), font_size - 0.5),
("FONTNAME", (0, 1), (-1,-1), "Helvetica"),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_ROW_EVEN, C_ROW_ALT]),
("GRID", (0, 0), (-1,-1), 0.4, C_BORDER),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING",(0,0), (-1,-1), 2),
# Highlight first column
("FONTNAME", (0, 1), (0,-1), "Helvetica-Bold"),
("BACKGROUND", (0, 1), (0,-1), colors.HexColor("#e8eaf6")),
]
if row_colors:
for row_idx, col_idx, color in row_colors:
style_cmds.append(("BACKGROUND", (col_idx, row_idx), (col_idx, row_idx), color))
t.setStyle(TableStyle(style_cmds))
return t
# ═══════════════════════════════════════════════════════════════════════════════
# BUILD DOCUMENT
# ═══════════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
OUTPUT,
pagesize=landscape(A4),
leftMargin=1.0*cm, rightMargin=1.0*cm,
topMargin=1.2*cm, bottomMargin=1.2*cm,
title="Hematology High-Yield Cheat Sheet",
author="Orris Medical Education"
)
story = []
W = landscape(A4)[0] - 2.0*cm # usable width ≈ 275 mm
# ──────────────────────────────────────────────────────────────────────────────
# PAGE 1 ▸ TITLE + MASTER COMPARISON TABLE
# ──────────────────────────────────────────────────────────────────────────────
# Title banner
banner_data = [[p("🩸 HEMATOLOGY HIGH-YIELD CHEAT SHEET", sTitle)]]
banner = Table(banner_data, colWidths=[W])
banner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_TITLE_BG),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("ROUNDEDCORNERS", [6]),
]))
story.append(banner)
sub_data = [[p("AML • ALL • CML • Sickle Cell • Thalassemia • Iron Deficiency Anemia | Practical Exam Edition", sSubtitle)]]
sub = Table(sub_data, colWidths=[W])
sub.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#283593")),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
story.append(sub)
story.append(Spacer(1, 5))
story.append(p("MASTER COMPARISON TABLE", sSection))
# Column widths (total = W)
cw = [3.6*cm, 3.7*cm, 3.7*cm, 3.7*cm, 3.9*cm, 3.9*cm, 3.9*cm]
headers = [
p("Feature", sCellH),
p("AML", sCellH),
p("ALL", sCellH),
p("CML", sCellH),
p("Sickle Cell Anemia", sCellH),
p("Thalassemia (β-major)", sCellH),
p("IDA (Microcytic)", sCellH),
]
rows = [
["Age / Incidence",
"Adults >60 yrs\nMost common AL in adults",
"Children 2-10 yrs\nMost common childhood cancer",
"Adults 25-60 yrs\nPeak 4th-5th decade",
"Infancy onwards\n(after HbF falls ~6 mo)",
"Infancy / childhood\nMediterranean, African, Asian",
"Any age\nCommon in women of reproductive age"],
["Genetics / Mutation",
"PML-RARA t(15;17) in APL\nIDH1/IDH2; FLT3; RUNX1",
"t(12;21) ETV6-RUNX1 (childhood)\nt(9;22) BCR-ABL (adult 25%)",
"t(9;22) Philadelphia chr\nBCR-ABL fusion gene",
"β-globin point mutation\nGlu→Val at position 6 (GAG→GTG)",
"β-thal: β-globin point mutations\nα-thal: α-globin gene deletions",
"No mutation (acquired)\nUsually iron loss / poor intake"],
["KEY Peripheral Smear Finding",
"MYELOBLASTS\n+ AUER RODS (pathognomonic)",
"LYMPHOBLASTS\n(scant cytoplasm, TdT+, no Auer rods)",
"ALL granulocyte stages\n(left shift) + BASOPHILIA",
"SICKLE/CRESCENT cells\nTarget cells, Howell-Jolly bodies",
"Microcytic hypochromic\nTARGET CELLS, nucleated RBCs",
"Microcytic hypochromic\nPENCIL CELLS, central pallor >1/3"],
["Blast %",
"≥20% blasts (diagnostic)",
"≥20% lymphoblasts",
"<10% chronic; ≥20% = blast crisis",
"N/A",
"N/A",
"N/A"],
["Auer Rods",
"YES — PATHOGNOMONIC",
"NO",
"NO",
"NO",
"NO",
"NO"],
["TdT",
"Negative",
"POSITIVE (hallmark)",
"Negative",
"Negative",
"Negative",
"Negative"],
["Key Markers / Lab",
"MPO+, CD33, CD13, CD117, CD34",
"B-ALL: TdT, CD10, CD19, CD22\nT-ALL: TdT, CD3, CD7",
"BCR-ABL (PCR/FISH)\nLAP score LOW",
"HbS on electrophoresis\nSickling test positive",
"↓HbA, ↑HbF, ↑HbA2\n(Hb electrophoresis)",
"↓Ferritin, ↑TIBC\n↓Serum iron, ↓Transferrin sat"],
["WBC Count",
"Variable; may be markedly ↑",
"Variable; often markedly ↑",
"MARKEDLY ↑ >100,000/µL",
"Normal / mild ↑",
"Normal / mild ↑",
"Normal"],
["MCV",
"Normal",
"Normal",
"Normal",
"Normal/low",
"LOW (microcytic)",
"LOW (microcytic)"],
["Ferritin",
"Normal",
"Normal",
"Normal",
"Normal / ↑",
"Normal / ↑ (iron overload)",
"LOW (best iron stores marker)"],
["TIBC",
"Normal",
"Normal",
"Normal",
"Normal",
"Normal",
"HIGH"],
["Splenomegaly",
"Mild",
"Moderate (> AML)",
"MASSIVE\n(extramedullary haematopoiesis)",
"Children: moderate\nAdults: AUTOSPLENECTOMY",
"Moderate to massive",
"Absent"],
["Bone Marrow",
"Hypercellular\nPacked myeloblasts",
"Hypercellular\nSheets of lymphoblasts",
"Hypercellular\nGranulocytic + megakaryocytic hyperplasia",
"Erythroid hyperplasia",
"Erythroid hyperplasia\nIneffective erythropoiesis",
"Erythroid hyperplasia\nAbsent iron stores (Perl's stain)"],
["Key Clinical Signs",
"Gum infiltration (monocytic)\nDIC in APL, pancytopenia",
"Bone pain, testicular swelling\nMediastinal mass (T-ALL)\nCNS involvement",
"Massive spleen\nDragging abdominal sensation",
"Painful vaso-occlusive crises\nDactylitis, priapism, stroke\nJaundice",
"Crew-cut skull X-ray\nChipmunk facies, growth retardation\nHepato-splenomegaly",
"Koilonychia, glossitis\nAngular cheilitis, pica\nPlummer-Vinson syndrome"],
["Mentzer Index\n(MCV ÷ RBC count)",
"N/A",
"N/A",
"N/A",
"N/A",
"< 13 → Thalassemia",
"> 13 → IDA"],
["Treatment",
"Cytarabine + anthracycline\nATRA + arsenic for APL (>90% cure)",
"Combination chemo\nTKI for Ph+ ALL; CAR-T for relapsed",
"IMATINIB (TKI)\nDasatinib / nilotinib (2nd gen)",
"Hydroxyurea (↑HbF)\nTransfusion, BMT, gene therapy",
"Blood transfusion\n+ Iron chelation (deferoxamine)\nBMT for cure",
"Oral ferrous sulfate\nTreat underlying cause"],
["Prognosis",
"Variable; APL >90% cure\nOthers 40-60%",
"Children >80% cure\nAdults poorer; Ph+ worse",
"Excellent with imatinib\n(median survival >10 yrs)",
"Chronic morbidity\nEpisodic crises; variable",
"β-major: shortened lifespan\nwithout BMT",
"Excellent with treatment"],
]
# Highlight specific cells
highlight = []
# Auer rods row (row index 4 = 5th data row = row 5 in table incl header)
AUR_ROW = 5
highlight.append((AUR_ROW, 1, colors.HexColor("#ffcdd2"))) # AML col red
for c in range(2, 7):
highlight.append((AUR_ROW, c, colors.HexColor("#e8f5e9"))) # others green
# TdT row
TDT_ROW = 6
highlight.append((TDT_ROW, 2, colors.HexColor("#ffcdd2"))) # ALL col
for c in [1,3,4,5,6]:
highlight.append((TDT_ROW, c, colors.HexColor("#e8f5e9")))
# KEY smear row
highlight.append((3, 1, colors.HexColor("#fff3e0")))
highlight.append((3, 2, colors.HexColor("#f3e5f5")))
highlight.append((3, 3, colors.HexColor("#e3f2fd")))
highlight.append((3, 4, colors.HexColor("#fce4ec")))
highlight.append((3, 5, colors.HexColor("#e0f7fa")))
highlight.append((3, 6, colors.HexColor("#fff8e1")))
table_data = [headers]
for r in rows:
table_data.append([p(str(c), sCell) for c in r])
# Apply special bold/red to Auer rod and TdT cells
table_data[AUR_ROW][1] = p(red("YES — PATHOGNOMONIC"), sCell)
for c in range(2,7):
table_data[AUR_ROW][c] = p(grn("NO"), sCell)
table_data[TDT_ROW][2] = p(red("POSITIVE (hallmark)"), sCell)
for c in [1,3,4,5,6]:
table_data[TDT_ROW][c] = p(grn("Negative"), sCell)
# LAP score
table_data[8][3] = p("MARKEDLY ↑ >100,000/µL", sCell)
table_data[12][3] = p(org("MASSIVE\n(extramedullary haematopoiesis)"), sCell)
table_data[12][4] = p(org("Children: moderate\nAdults: AUTOSPLENECTOMY"), sCell)
master_table = Table(table_data, colWidths=cw, repeatRows=1)
master_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_HEAD_BG),
("TEXTCOLOR", (0,0), (-1,0), C_HEAD_FG),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 7.5),
("ALIGN", (0,0), (-1,0), "CENTER"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTSIZE", (0,1), (-1,-1), 6.8),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_ROW_EVEN, C_ROW_ALT]),
("GRID", (0,0), (-1,-1), 0.4, C_BORDER),
("LEFTPADDING", (0,0), (-1,-1), 3),
("RIGHTPADDING", (0,0), (-1,-1), 3),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING",(0,0), (-1,-1), 2),
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
("BACKGROUND", (0,1), (0,-1), colors.HexColor("#e8eaf6")),
# Auer rod row
("BACKGROUND", (AUR_ROW,1), (AUR_ROW,1), colors.HexColor("#ffcdd2")),
("BACKGROUND", (AUR_ROW,2), (AUR_ROW,6), colors.HexColor("#e8f5e9")),
# TdT row
("BACKGROUND", (TDT_ROW,2), (TDT_ROW,2), colors.HexColor("#ffcdd2")),
("BACKGROUND", (TDT_ROW,1), (TDT_ROW,1), colors.HexColor("#e8f5e9")),
("BACKGROUND", (TDT_ROW,3), (TDT_ROW,6), colors.HexColor("#e8f5e9")),
# Key smear row
("BACKGROUND", (3,1), (3,1), colors.HexColor("#fff3e0")),
("BACKGROUND", (3,2), (3,2), colors.HexColor("#f3e5f5")),
("BACKGROUND", (3,3), (3,3), colors.HexColor("#e3f2fd")),
("BACKGROUND", (3,4), (3,4), colors.HexColor("#fce4ec")),
("BACKGROUND", (3,5), (3,5), colors.HexColor("#e0f7fa")),
("BACKGROUND", (3,6), (3,6), colors.HexColor("#fff8e1")),
]))
story.append(master_table)
story.append(Spacer(1, 4))
story.append(p("Source: Robbins & Kumar Basic Pathology | Robbins Pathologic Basis of Disease | Henry's Clinical Diagnosis | Tietz Laboratory Medicine", sFooter))
# ──────────────────────────────────────────────────────────────────────────────
# PAGE 2 ▸ QUICK DIFFERENTIATORS + MNEMONICS + VIVA QUESTIONS
# ──────────────────────────────────────────────────────────────────────────────
story.append(PageBreak())
# Second banner
banner2_data = [[p("QUICK DIFFERENTIATORS • MNEMONICS • VIVA QUESTIONS", sTitle)]]
banner2 = Table(banner2_data, colWidths=[W])
banner2.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_TITLE_BG),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
]))
story.append(banner2)
story.append(Spacer(1, 6))
# ── Row 1: Quick differentiators table + Mnemonics side by side ──────────────
story.append(p("SCENARIO-BASED QUICK DIFFERENTIATORS", sSection))
diff_headers = [p("Clinical/Lab Finding", sCellH), p("Think of...", sCellH), p("Why?", sCellH)]
diff_rows = [
["Auer rods on smear", red("AML — immediately!"), "Fused azurophilic granules; pathognomonic for myeloid lineage"],
["TdT positive blast", red("ALL"), "Pre-B and pre-T cells exclusively express TdT"],
["t(9;22) in adult leukemia", org("CML or adult B-ALL"), "Different BCR-ABL breakpoints; both use TKI"],
["Low LAP score", org("CML"), "vs. Leukemoid reaction = HIGH LAP"],
["Massive splenomegaly + WBC >100,000", org("CML"), "Extramedullary haematopoiesis"],
["Mediastinal mass + leukemia in teenager", red("T-ALL"), "Thymic involvement in T-ALL (50-70%)"],
["Blast crisis + prior indolent leukemia", org("CML → AML/ALL"), "≥20% blasts = blast crisis; treat as AML"],
["Crescent-shaped RBCs + pain crisis", red("Sickle Cell Disease"), "Irreversibly sickled cells on deoxygenation"],
["Howell-Jolly bodies in adult", org("Sickle Cell — autosplenectomy"), "Spleen fibroses; can't remove nuclear remnants"],
["Crew-cut skull X-ray + chipmunk facies", red("β-Thalassemia Major"), "Marrow expansion → bone remodelling"],
["Microcytic anemia + LOW ferritin", red("IDA"), "Ferritin = best measure of iron stores"],
["Microcytic anemia + NORMAL/HIGH ferritin + target cells", red("Thalassemia"), "Globin synthesis defect, not iron deficiency"],
["Mentzer Index < 13 (MCV ÷ RBC count)", org("Thalassemia"), "RBC count relatively preserved in thalassemia"],
["Mentzer Index > 13", org("IDA"), "Fewer, smaller RBCs in iron deficiency"],
["Infection with encapsulated bacteria (S. pneumoniae)", red("Sickle Cell"), "Autosplenectomy → opsonisation defect"],
["APL (AML-M3) + DIC + t(15;17)", red("Acute Promyelocytic Leukemia"), "PML-RARA fusion; treat with ATRA + arsenic"],
["Gum hypertrophy + leukemia", org("AML with monocytic differentiation"), "Tissue infiltration by monocytic blasts"],
["Normal spleen + microcytic anemia in a woman", org("IDA — menorrhagia/GI bleed"), "Most common cause: chronic blood loss"],
]
diff_cw = [5.0*cm, 5.0*cm, 12.8*cm]
diff_data = [diff_headers] + [[p(r[0], sCellB if i < 2 else sCell),
p(r[1], sCell),
p(r[2], sCell)] for i, r in enumerate(diff_rows)]
diff_table = Table(diff_data, colWidths=diff_cw, repeatRows=1)
diff_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), C_HEAD_BG),
("TEXTCOLOR", (0,0), (-1,0), C_HEAD_FG),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTSIZE", (0,1), (-1,-1), 7),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_ROW_EVEN, C_ROW_ALT]),
("GRID", (0,0), (-1,-1), 0.4, C_BORDER),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING",(0,0), (-1,-1), 2),
]))
story.append(diff_table)
story.append(Spacer(1, 6))
# ── Mnemonics ─────────────────────────────────────────────────────────────────
story.append(p("MEMORY AIDS & MNEMONICS", sSection))
mnem_items = [
("AML", "A = Auer rods (pathognomonic) | M = Myeloperoxidase+ | L = Large blasts with nucleoli", C_PINK_BG),
("ALL", "A = Affects children (peak 2-10 yrs) | L = Lymphoblasts | L = Lack Auer rods | TdT POSITIVE", C_PURPLE_BG),
("CML", "C = Chromosome 22 (Philadelphia) | M = Massive spleen | L = Left shift (ALL granulocyte stages)", C_BLUE_BG),
("Sickle Cell", "SCA = Sickle + Crisis + Autosplenectomy | HbS = Hb Stiff (polymerises on deoxygenation)", C_ORANGE_BG),
("Thalassemia", "THAL = Target cells + Hypochromic + Anemia (severe) + Low HbA | Crew-cut skull + Chipmunk facies", C_TEAL_BG),
("IDA", "IDA = Increased TIBC + Decreased ferritin + Anemia (microcytic) | Pencil cells + Koilonychia", C_GREEN_BG),
]
mnem_data = [[p(bold(name), sSmallBold), p(hint, sSmall)] for name, hint, _ in mnem_items]
mnem_cw = [3.2*cm, 19.5*cm]
mnem_bg = [item[2] for item in mnem_items]
mnem_table = Table(mnem_data, colWidths=mnem_cw)
mnem_style = [
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("FONTSIZE", (0,0), (-1,-1), 7.5),
("GRID", (0,0), (-1,-1), 0.4, C_BORDER),
("LEFTPADDING", (0,0), (-1,-1), 6),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING",(0,0), (-1,-1), 3),
]
for i, (_, _, bg) in enumerate(mnem_items):
mnem_style.append(("BACKGROUND", (0,i), (-1,i), bg))
mnem_table.setStyle(TableStyle(mnem_style))
story.append(mnem_table)
story.append(Spacer(1, 6))
# ── Viva Questions ────────────────────────────────────────────────────────────
story.append(p("TOP VIVA QUESTIONS — EXPECTED IN PRACTICALS", sSection))
viva_cols = [
("AML", C_PINK_BG, [
"What are Auer rods? In which condition are they pathognomonic?",
"What % blasts diagnoses AML?",
"Translocation in APL and its treatment?",
"FAB classification of AML (M0–M7)?",
"Differentiate AML from ALL on smear.",
"Role of ATRA in APL?",
"Name myeloid markers (flow cytometry).",
]),
("ALL", C_PURPLE_BG, [
"What is TdT and why important in ALL?",
"Philadelphia chromosome — in which leukemias?",
"Morphological difference: ALL vs AML blasts?",
"Significance of t(12;21) ETV6-RUNX1?",
"Why does T-ALL cause mediastinal mass?",
"Prognostic factors in childhood ALL?",
"What are CAR-T cells? When used?",
"Differentiate B-ALL from T-ALL.",
]),
("CML", C_BLUE_BG, [
"What is the Philadelphia chromosome?",
"How does BCR-ABL cause CML?",
"CML vs leukemoid reaction (LAP score!)",
"Three phases of CML?",
"What is blast crisis?",
"Name TKIs used in CML.",
"Why is basophilia a feature of CML?",
"LAP score in CML vs leukemoid reaction?",
]),
("Sickle Cell", C_ORANGE_BG, [
"Genetic mutation in sickle cell anemia?",
"Why do RBCs sickle only on deoxygenation?",
"What is autosplenectomy? Why does it occur?",
"Why prone to encapsulated bacteria?",
"What is a vaso-occlusive crisis? Triggers?",
"How does hydroxyurea help?",
"How does HbF protect against sickling?",
"Sickle cell TRAIT vs DISEASE?",
]),
("Thalassemia", C_TEAL_BG, [
"Genetic basis of α- vs β-thalassemia?",
"Why do α-globin chains cause damage?",
"What is ineffective erythropoiesis?",
"Why does iron overload occur without transfusions?",
"Role of hepcidin in iron regulation?",
"Thalassemia minor vs IDA on lab tests?",
"What is crew-cut skull X-ray?",
"What is HbH disease?",
"Why is hydrops fetalis fatal?",
]),
("IDA", C_GREEN_BG, [
"Most common cause of microcytic anemia worldwide?",
"How to differentiate IDA from thalassemia?",
"What is the Mentzer index?",
"Stages of iron deficiency?",
"What is koilonychia?",
"What is Plummer-Vinson syndrome?",
"Which test best reflects iron stores?",
"Why is TIBC elevated in IDA?",
"Role of hepcidin in iron metabolism?",
"RBC changes on blood smear in IDA?",
]),
]
viva_cw_each = W / 6
viva_row_heads = [p(bold(name), sCellH) for name, _, _ in viva_cols]
viva_head_row = [Table([[p(bold(name), sCellH)]], colWidths=[viva_cw_each]) for name, bg, _ in viva_cols]
# Build viva table: each column = one condition, rows = questions
max_q = max(len(qs) for _, _, qs in viva_cols)
viva_data = []
for qi in range(max_q):
row = []
for _, bg, qs in viva_cols:
if qi < len(qs):
row.append(p(f"{qi+1}. {qs[qi]}", sSmall))
else:
row.append(p("", sSmall))
viva_data.append(row)
viva_col_widths = [viva_cw_each] * 6
# Build header row
viva_header = [p(bold(name), sCellH) for name, _, _ in viva_cols]
full_viva = [viva_header] + viva_data
viva_table = Table(full_viva, colWidths=viva_col_widths, repeatRows=1)
viva_style_cmds = [
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTSIZE", (0,1), (-1,-1), 6.8),
("GRID", (0,0), (-1,-1), 0.4, C_BORDER),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("TOPPADDING", (0,0), (-1,-1), 2),
("BOTTOMPADDING",(0,0), (-1,-1), 2),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8),
("ALIGN", (0,0), (-1,0), "CENTER"),
]
col_bgs = [bg for _, bg, _ in viva_cols]
for ci, bg in enumerate(col_bgs):
viva_style_cmds.append(("BACKGROUND", (ci,0), (ci,0), C_HEAD_BG))
viva_style_cmds.append(("TEXTCOLOR", (ci,0), (ci,0), C_HEAD_FG))
for ri in range(1, max_q+1):
viva_style_cmds.append(("BACKGROUND", (ci,ri), (ci,ri), bg if ri % 2 == 1 else C_ROW_EVEN))
viva_table.setStyle(TableStyle(viva_style_cmds))
story.append(viva_table)
story.append(Spacer(1, 4))
# ── Key formula box ───────────────────────────────────────────────────────────
formula_text = (
f" {bold('KEY FORMULAS & THRESHOLDS:')} "
f"Mentzer Index = MCV ÷ RBC count → {red('<13')} = Thalassemia | {grn('>13')} = IDA "
f"Blast threshold for AML / ALL = {red('≥20%')} in marrow "
f"LAP score: {red('LOW')} in CML | {grn('HIGH')} in Leukemoid Reaction "
f"APL cure rate with ATRA + Arsenic: {grn('>90%')} "
f"Philadelphia chr = t(9;22) → found in {org('CML')} + {org('adult B-ALL')}"
)
formula_data = [[p(formula_text, sSmall)]]
formula_table = Table(formula_data, colWidths=[W])
formula_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_GOLD_BG),
("BOX", (0,0), (-1,-1), 1.2, C_GOLD),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
story.append(formula_table)
story.append(Spacer(1, 3))
story.append(p("Orris Medical Education | Based on: Robbins & Kumar Basic Pathology | Robbins Pathologic Basis of Disease | Henry's Clinical Diagnosis | Tietz Laboratory Medicine 7e", sFooter))
# ── Build PDF ─────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /home/daytona/workspace/hematology-cheatsheet && python generate_cheatsheet.py 2>&1
ls -lh /home/daytona/workspace/hematology-cheatsheet/Hematology_CheatSheet.pdf
Hematology CheatSheet
PDF Document · PDF