Write 10 mark answer on t and nk cell lymphoma which consist of ethology, genetics,microscopy, cd marker and prognosis
| Subtype | Etiological Agent |
|---|---|
| Extranodal NK-/T-cell lymphoma | Epstein-Barr virus (EBV) - all tumor cells contain identical EBV episomes; clonal EBV infection from a single infected cell |
| Adult T-cell leukemia/lymphoma | HTLV-1 (Human T-cell Leukemia Virus type 1) - endemic in southern Japan, West Africa, and the Caribbean basin |
| ALCL (ALK+) | No viral association; occurs in children/young adults; chromosomal translocations drive oncogenesis |
| PTCL-NOS | No single etiology; multifactorial |
| Nodal T-follicular helper cell lymphoma | Associated with underlying clonal hematopoiesis; EBV-positive B-cell proliferations frequently co-exist |


| Subtype | Positive Markers | Negative / Variable |
|---|---|---|
| PTCL-NOS | CD2, CD3, CD5 (pan-T); CD45RO, CD43; CD4+ (more common than CD8+) | One or more pan-T antigens aberrantly lost; CD68 rarely positive |
| Extranodal NK-/T-Cell Lymphoma | CD56 (NK marker), cytoplasmic CD3ε, EBV (EBER+), cytotoxic granule proteins (TIA-1, granzyme B) | Surface CD3− (no TCR gene rearrangements), CD16−, CD21− |
| ALCL (ALK+) | CD30 (universally positive; Ki-1), ALK protein (nuclear and cytoplasmic with t(2;5)); variable CD3, CD5, CD4, CD43, CD45RO; CD25, EMA sometimes positive | CD3 often negative; surface T-cell markers often lost |
| ALCL (ALK-) | CD30 (universally positive) | ALK negative; generally similar phenotype to ALK+ |
| ATL | CD4+, CD3+, CD2+, CD25 (IL-2 receptor, strongly positive) | CD8− |
| Nodal T-follicular helper cell lymphoma | CD4+, BCL6, PD-1, CXCL13, ICOS, CD10 (Tfh markers) | - |
| Subtype | Prognosis | Notes |
|---|---|---|
| ALCL (ALK+) | Good - 5-year survival ~75-80% | Best prognosis among T-cell lymphomas; ALK inhibitors effective in chemotherapy-resistant cases |
| ALCL (ALK-) | Intermediate-poor | Substantially worse than ALK+; CD30 targeted therapy (brentuximab vedotin) effective |
| PTCL-NOS | Poor | Significantly worse than comparably aggressive B-cell lymphomas (e.g., DLBCL); cures reported but rare |
| Extranodal NK-/T-cell lymphoma | Poor (advanced disease) | Responds to radiation therapy for localized disease; relatively chemotherapy-resistant; allogeneic HSCT and immune checkpoint inhibitors offer hope in advanced disease |
| ATL | Very poor | Highly aggressive; median survival months in acute form; smoldering/chronic forms indolent |
| Nodal T-follicular helper cell lymphoma | Intermediate-poor | Median OS ~3 years with standard chemotherapy |
| Feature | PTCL-NOS | NK-/T-cell Lymphoma | ALCL (ALK+) | ATL |
|---|---|---|---|---|
| Etiology | None specific | EBV | Chromosomal t(2;5) | HTLV-1 |
| Key gene | TCR rearrangement | JAK/STAT, TP53 | NPM-ALK fusion | TP53, CDKN2A |
| Morphology | Pleomorphic, mixed cells | Angioinvasive, necrosis, azurophilic granules | Hallmark cells, horseshoe nuclei | Flower/cloverleaf cells |
| Key CD markers | CD2, CD3, CD5 (aberrant loss) | CD56+, cCD3ε+, surface CD3− | CD30+, ALK+ | CD4+, CD25+ |
| Prognosis | Poor | Poor (advanced) | Good (75-80% CR) | Very poor |
Create a 10 marker PDF for NK-cell sarcoma in md pathology exam which include types etiology microscopy cd marker and prognosis according latest who classification
NK cell neoplasms WHO 5th edition 2022 classification extranodal NK/T cell lymphoma nasal type aggressive NK cell leukemia
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && ls -la /tmp/workspace/
mkdir -p /tmp/workspace/nk-cell-lymphoma && cat > /tmp/workspace/nk-cell-lymphoma/make_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm, mm from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY from reportlab.pdfbase import pdfmetrics from reportlab.pdfbase.ttfonts import TTFont OUTPUT = "/tmp/workspace/nk-cell-lymphoma/NK_Cell_Lymphoma_10_Mark.pdf" # ── Colours ────────────────────────────────────────────────────────────────── DARK_BLUE = colors.HexColor("#0D2B55") MED_BLUE = colors.HexColor("#1A4E8C") LIGHT_BLUE = colors.HexColor("#D6E8FF") ACCENT = colors.HexColor("#C0392B") LIGHT_GREY = colors.HexColor("#F4F6F8") MID_GREY = colors.HexColor("#BDC3C7") WHITE = colors.white BLACK = colors.black doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=2*cm, rightMargin=2*cm, topMargin=2*cm, bottomMargin=2*cm ) styles = getSampleStyleSheet() # ── Custom styles ──────────────────────────────────────────────────────────── def S(name, **kw): return ParagraphStyle(name, **kw) title_style = S("Title", fontName="Helvetica-Bold", fontSize=18, textColor=WHITE, alignment=TA_CENTER, leading=22, spaceAfter=4) subtitle_style = S("Subtitle", fontName="Helvetica", fontSize=10, textColor=LIGHT_BLUE, alignment=TA_CENTER, leading=14, spaceAfter=2) badge_style = S("Badge", fontName="Helvetica-Bold", fontSize=9, textColor=WHITE, alignment=TA_CENTER) section_head = S("SectionHead", fontName="Helvetica-Bold", fontSize=12, textColor=WHITE, alignment=TA_LEFT, leading=16) body = S("Body", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=14, alignment=TA_JUSTIFY, spaceAfter=4) body_bold = S("BodyBold", fontName="Helvetica-Bold", fontSize=9.5, textColor=BLACK, leading=14, alignment=TA_LEFT) bullet_style = S("Bullet", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=13, leftIndent=12, bulletIndent=0, spaceAfter=2) sub_bullet = S("SubBullet", fontName="Helvetica", fontSize=9, textColor=colors.HexColor("#333333"), leading=12, leftIndent=24, bulletIndent=12, spaceAfter=1) table_head_style = S("TableHead", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, alignment=TA_CENTER, leading=11) table_body_style = S("TableBody", fontName="Helvetica", fontSize=8.5, textColor=BLACK, alignment=TA_LEFT, leading=11) footer_style = S("Footer", fontName="Helvetica-Oblique", fontSize=7.5, textColor=colors.HexColor("#777777"), alignment=TA_CENTER) key_point_style = S("KeyPoint", fontName="Helvetica-BoldOblique", fontSize=9, textColor=ACCENT, leading=13, leftIndent=8) # ── Helper: section header block ───────────────────────────────────────────── def section_header(text, color=MED_BLUE): tbl = Table([[Paragraph(text, section_head)]], colWidths=[17*cm]) tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), color), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 10), ("ROUNDEDCORNERS", [4,4,4,4]), ])) return tbl def note_box(text, bg=LIGHT_BLUE): tbl = Table([[Paragraph(text, S("nb", fontName="Helvetica", fontSize=9, textColor=DARK_BLUE, leading=13, leftIndent=4))]], colWidths=[17*cm]) tbl.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), 12), ("BOX", (0,0), (-1,-1), 1, MED_BLUE), ])) return tbl def sp(n=6): return Spacer(1, n) # ═══════════════════════════════════════════════════════════════════════════ # TITLE BANNER # ═══════════════════════════════════════════════════════════════════════════ def title_banner(): banner = Table( [[Paragraph("T / NK Cell Lymphoma", title_style)], [Paragraph("MD Pathology Examination • 10 Marks", subtitle_style)], [Paragraph("Based on WHO Classification of Haematolymphoid Tumours 5th Edition (2022)", subtitle_style)]], colWidths=[17*cm] ) banner.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE), ("TOPPADDING", (0,0), (-1,-1), 10), ("BOTTOMPADDING", (0,0), (-1,-1), 10), ("LEFTPADDING", (0,0), (-1,-1), 10), ("BOX", (0,0), (-1,-1), 2, MED_BLUE), ])) return banner # ═══════════════════════════════════════════════════════════════════════════ # BUILD CONTENT # ═══════════════════════════════════════════════════════════════════════════ story = [] story.append(title_banner()) story.append(sp(14)) # ── INTRO ───────────────────────────────────────────────────────────────── story.append(section_header("INTRODUCTION")) story.append(sp(5)) story.append(Paragraph( "T and NK cell lymphomas are a heterogeneous group of mature (peripheral) lymphoid neoplasms " "derived from post-thymic T lymphocytes or natural killer (NK) cells. They account for " "<b>10–15% of all Non-Hodgkin Lymphomas (NHLs)</b> in Western countries, with significantly " "higher rates (~25–35%) in Asia. As a group, they carry a worse prognosis than comparably " "aggressive B-cell neoplasms such as DLBCL.", body)) story.append(sp(8)) # ── WHO 2022 CLASSIFICATION ─────────────────────────────────────────────── story.append(section_header("WHO 5th EDITION (2022) — NK-CELL NEOPLASM TYPES", MED_BLUE)) story.append(sp(5)) who_data = [ [Paragraph("WHO 2022 Entity", table_head_style), Paragraph("Key Feature", table_head_style), Paragraph("Behaviour", table_head_style)], [Paragraph("Extranodal NK/T-cell lymphoma (ENKTL)\n[\"nasal type\" qualifier REMOVED in WHO-5]", table_body_style), Paragraph("EBV+, nasal & extranasal sites, angioinvasive", table_body_style), Paragraph("Aggressive", table_body_style)], [Paragraph("Aggressive NK-cell leukaemia (ANKL)", table_body_style), Paragraph("EBV+, systemic, leukemic picture; includes intravascular NK/T-cell lymphoma (now moved here from WHO-4R)", table_body_style), Paragraph("Very aggressive", table_body_style)], [Paragraph("Chronic lymphoproliferative disorder of NK cells (CLPD-NK)", table_body_style), Paragraph("Indolent, persistent NK-cell lymphocytosis", table_body_style), Paragraph("Indolent", table_body_style)], [Paragraph("Indolent NK-cell lymphoproliferative disorder of GI tract (provisional)", table_body_style), Paragraph("Localised GI mucosal NK-cell infiltrates", table_body_style), Paragraph("Indolent", table_body_style)], [Paragraph("EBV-positive nodal NK-cell lymphoma", table_body_style), Paragraph("NEW entity in WHO-5; nodal presentation", table_body_style), Paragraph("Aggressive", table_body_style)], [Paragraph("Hydroa vacciniforme lymphoproliferative disorder (HV-LPD)", table_body_style), Paragraph("EBV+; children in Asia/Latin America; UV-exacerbated skin lesions", table_body_style), Paragraph("Variable", table_body_style)], ] who_tbl = Table(who_data, colWidths=[6*cm, 7.5*cm, 3.5*cm]) who_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY]), ("TEXTCOLOR", (0,0), (-1,0), WHITE), ("GRID", (0,0), (-1,-1), 0.5, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(who_tbl) story.append(sp(4)) story.append(note_box( "⭐ WHO-5 KEY CHANGE: 'Nasal type' qualifier dropped from ENKTL name — disease can arise at any extranodal site. " "Intravascular NK/T-cell lymphoma reclassified under ANKL. EBV-positive nodal NK-cell lymphoma is a NEW entity." )) story.append(sp(10)) # ── ETIOLOGY ───────────────────────────────────────────────────────────── story.append(section_header("ETIOLOGY")) story.append(sp(5)) etio_data = [ [Paragraph("Entity", table_head_style), Paragraph("Etiological Agent / Mechanism", table_head_style)], [Paragraph("Extranodal NK/T-cell lymphoma (ENKTL)", table_body_style), Paragraph("Epstein-Barr Virus (EBV) — all tumor cells carry clonal EBV episomes indicating origin from a single EBV-infected cell. Entry mechanism is unclear as NK cells LACK CD21 (the EBV B-cell receptor). EBV latency type II pattern (LMP1/LMP2A expression).", table_body_style)], [Paragraph("Aggressive NK-cell leukaemia (ANKL)", table_body_style), Paragraph("EBV+ (not universal). JAK/STAT & RAS/MAPK pathway mutations. Epigenetic modifier mutations (TET2, CREBBP, KMT2D). PD-L1/PD-L2 alterations drive immune evasion.", table_body_style)], [Paragraph("HV-LPD", table_body_style), Paragraph("EBV infection in childhood. UV light exacerbates lesions. Mosquito bite hypersensitivity is associated (mosquito salivary gland antigens contain EBV-stimulating proteins).", table_body_style)], ] etio_tbl = Table(etio_data, colWidths=[5.5*cm, 11.5*cm]) etio_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY]), ("GRID", (0,0), (-1,-1), 0.5, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(etio_tbl) story.append(sp(5)) story.append(Paragraph("<b>Epidemiology:</b>", body_bold)) story.append(Paragraph( "• ENKTL: Prevalent in East Asians and Native Americans of Central/South America. " "Accounts for 2–11% of all lymphomas in East Asia vs. <1% in the West. " "Median age 52–58 years. Male:female = 1.5:1.", bullet_style)) story.append(Paragraph( "• ANKL: Rarer (~1/6th incidence of ENKTL); fulminant onset, often in young adults.", bullet_style)) story.append(Paragraph( "• Genetic predisposition: EBV-specific immune response variants (HLA-A, B, C genes) influence susceptibility.", bullet_style)) story.append(sp(10)) # ── MICROSCOPY ─────────────────────────────────────────────────────────── story.append(section_header("MICROSCOPY (HISTOPATHOLOGY)")) story.append(sp(5)) story.append(Paragraph("<b>1. Extranodal NK/T-cell Lymphoma (ENKTL)</b>", body_bold)) story.append(sp(3)) micro_items_enktl = [ ("Pattern", "Diffuse lymphoid infiltrate effacing normal tissue architecture."), ("Angioinvasion", "Tumor cells <b>surround and invade small to medium vessel walls</b> — the hallmark feature. Leads to <b>extensive ischemic (coagulative) necrosis</b>."), ("Cell morphology", "Spectrum from <b>small to large</b> neoplastic cells. Medium-sized cells predominate with irregular, angulated nuclei, moderately condensed chromatin, and pale cytoplasm."), ("Granules", "On touch preparations: <b>large azurophilic (reddish-purple) cytoplasmic granules</b> — identical to normal NK cell granules."), ("Background", "Mixed inflammatory background with neutrophils, plasma cells, histiocytes. <b>Mucosal ulceration</b> is characteristic."), ("Special stain", "EBER (EBV-encoded RNA) in-situ hybridisation (ISH) is <b>positive in virtually all cases</b> — diagnostic gold standard."), ] for label, text in micro_items_enktl: story.append(Paragraph(f"<b>{label}:</b> {text}", bullet_style)) story.append(sp(7)) story.append(Paragraph("<b>2. Aggressive NK-cell Leukaemia (ANKL)</b>", body_bold)) story.append(sp(3)) for item in [ "Peripheral blood and bone marrow infiltration by large granular lymphocytes.", "Cells have <b>irregular, folded nuclei</b> with prominent nucleoli and pale cytoplasm with azurophilic granules.", "Hemophagocytosis (macrophages engulfing blood cells) frequently seen in bone marrow — associated hemophagocytic lymphohistiocytosis (HLH).", "Liver/spleen diffusely infiltrated in sinusoids.", ]: story.append(Paragraph(f"• {item}", bullet_style)) story.append(sp(7)) story.append(Paragraph("<b>3. HV-LPD (Cutaneous NK/T-cell)</b>", body_bold)) story.append(sp(3)) for item in [ "Dermis and subcutaneous fat infiltrated by <b>intermediate-sized, atypical granular lymphocytes</b> within and around walls of small and medium vessels.", "Epidermotropism may be noted.", "Papulovesicular lesions with scarring on sun-exposed areas (face and extremities).", ]: story.append(Paragraph(f"• {item}", bullet_style)) story.append(sp(10)) # ── CD MARKERS ─────────────────────────────────────────────────────────── story.append(section_header("IMMUNOPHENOTYPE (CD MARKERS)")) story.append(sp(5)) cd_data = [ [Paragraph("Marker", table_head_style), Paragraph("ENKTL", table_head_style), Paragraph("ANKL", table_head_style), Paragraph("CLPD-NK", table_head_style), Paragraph("HV-LPD", table_head_style)], [Paragraph("CD2", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("Variable", table_body_style)], [Paragraph("Surface CD3", table_body_style), Paragraph("✗ NEGATIVE", S("n",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT,leading=11)), Paragraph("✗ Negative", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("Variable", table_body_style)], [Paragraph("Cytoplasmic CD3ε", table_body_style), Paragraph("✓ POSITIVE", S("p",fontName="Helvetica-Bold",fontSize=8.5,textColor=colors.HexColor("#1A7A1A"),leading=11)), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style)], [Paragraph("CD4", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("✗ Negative", table_body_style)], [Paragraph("CD5", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("Variable", table_body_style), Paragraph("✗ Negative", table_body_style)], [Paragraph("CD8", table_body_style), Paragraph("Variable", table_body_style), Paragraph("Variable", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("Variable", table_body_style)], [Paragraph("CD16", table_body_style), Paragraph("✗ NEGATIVE", S("n2",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT,leading=11)), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("Variable", table_body_style)], [Paragraph("CD56 ★", table_body_style), Paragraph("✓ POSITIVE", S("p2",fontName="Helvetica-Bold",fontSize=8.5,textColor=colors.HexColor("#1A7A1A"),leading=11)), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style)], [Paragraph("CD57", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("Variable", table_body_style)], [Paragraph("TIA-1 / Granzyme B / Perforin", table_body_style), Paragraph("✓ Positive (cytotoxic granules)", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style)], [Paragraph("EBV (EBER-ISH)", table_body_style), Paragraph("✓✓ ALWAYS+", S("p3",fontName="Helvetica-Bold",fontSize=8.5,textColor=colors.HexColor("#1A7A1A"),leading=11)), Paragraph("Usually+", table_body_style), Paragraph("✗ Negative", table_body_style), Paragraph("✓ Positive", table_body_style)], [Paragraph("TCR gene rearrangement", table_body_style), Paragraph("Germline (no rearrangement)", table_body_style), Paragraph("Germline", table_body_style), Paragraph("Germline", table_body_style), Paragraph("Germline", table_body_style)], [Paragraph("CD43 / CD45RO / HLA-DR", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("✓ Positive", table_body_style), Paragraph("Variable", table_body_style), Paragraph("Variable", table_body_style)], ] col_widths = [4.5*cm, 3.7*cm, 3*cm, 3*cm, 2.8*cm] cd_tbl = Table(cd_data, colWidths=col_widths) cd_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY]), ("GRID", (0,0), (-1,-1), 0.5, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 5), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), # highlight CD56 row ("BACKGROUND", (0,8), (-1,8), colors.HexColor("#FFF3CD")), # highlight EBER row ("BACKGROUND", (0,11), (-1,11), colors.HexColor("#E8F8E8")), ])) story.append(cd_tbl) story.append(sp(5)) story.append(note_box( "★ CD56 is the hallmark NK cell marker but is NOT lineage-specific. " "ENKTL classic phenotype: CD2+, surface CD3−, cytoplasmic CD3ε+, CD56+, CD16−, EBER+. " "Absence of TCR gene rearrangement confirms NK cell (not T-cell) origin." )) story.append(sp(10)) # ── GENETICS ───────────────────────────────────────────────────────────── story.append(section_header("GENETICS & MOLECULAR PATHOLOGY")) story.append(sp(5)) story.append(Paragraph("<b>Extranodal NK/T-cell Lymphoma (ENKTL)</b>", body_bold)) gen_items = [ "No specific cytogenetic abnormality; <b>del(6)(q21;q25)</b> or <b>i(6p10)</b> described occasionally", "<b>TCR genes in germline configuration</b> (no rearrangement) — confirms NK lineage", "Recurrent mutations: <b>JAK/STAT pathway</b> (STAT3, STAT5B), epigenetic regulators (TET2, ARID1A), <b>TP53</b>", "<b>PD-L1 / PD-L2 amplification</b> and 3'-UTR rearrangements of PD-L1 gene → immune evasion (important therapeutic target)", "All tumor cells contain <b>monoclonal EBV episomes</b> — proves clonal origin from single infected cell", "EBV latency pattern: <b>Type II</b> (EBNA1, LMP1, LMP2A expressed; EBER always +)", ] for item in gen_items: story.append(Paragraph(f"• {item}", bullet_style)) story.append(sp(5)) story.append(Paragraph("<b>Aggressive NK-cell Leukaemia (ANKL)</b>", body_bold)) ankl_items = [ "Mutations in <b>JAK/STAT</b> and <b>RAS/MAPK</b> signaling pathways", "Epigenetic modifier mutations: <b>TET2, CREBBP, KMT2D</b>", "Immune checkpoint molecule alterations: <b>CD274 (PD-L1), PDCD1LG2 (PD-L2)</b>", "UV-related mutational signature described in some cases", ] for item in ankl_items: story.append(Paragraph(f"• {item}", bullet_style)) story.append(sp(10)) # ── PROGNOSIS ───────────────────────────────────────────────────────────── story.append(section_header("PROGNOSIS")) story.append(sp(5)) prog_data = [ [Paragraph("Entity", table_head_style), Paragraph("Prognosis", table_head_style), Paragraph("5-Year OS", table_head_style), Paragraph("Key Prognostic Points", table_head_style)], [Paragraph("ENKTL — Stage I/II (Localised)", table_body_style), Paragraph("Intermediate", S("pg",fontName="Helvetica-Bold",fontSize=8.5,textColor=colors.HexColor("#1A7A1A"),leading=11)), Paragraph("~50–70%", table_body_style), Paragraph("Responds well to CCRT (concurrent chemoradiotherapy) + L-asparaginase-based regimens (SMILE protocol)", table_body_style)], [Paragraph("ENKTL — Stage III/IV (Advanced)", table_body_style), Paragraph("Poor", S("pg2",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT,leading=11)), Paragraph("~20–30%", table_body_style), Paragraph("Chemotherapy-resistant (P-glycoprotein over-expression). HSCT and PD-1 inhibitors (pembrolizumab/sintilimab) used for R/R disease.", table_body_style)], [Paragraph("Aggressive NK-cell Leukaemia (ANKL)", table_body_style), Paragraph("Very Poor", S("pg3",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT,leading=11)), Paragraph("<10%", table_body_style), Paragraph("Fulminant disease; median OS days–weeks. HLH, multi-organ failure. HSCT only potentially curative.", table_body_style)], [Paragraph("CLPD-NK", table_body_style), Paragraph("Good", S("pg4",fontName="Helvetica-Bold",fontSize=8.5,textColor=colors.HexColor("#1A7A1A"),leading=11)), Paragraph(">80%", table_body_style), Paragraph("Indolent course. Watch-and-wait approach. Cytopenias may need treatment.", table_body_style)], [Paragraph("HV-LPD", table_body_style), Paragraph("Variable → Poor", S("pg5",fontName="Helvetica-Bold",fontSize=8.5,textColor=colors.orange,leading=11)), Paragraph("Variable", table_body_style), Paragraph("May transform to overt ENKTL or systemic ANKL. Mosquito-bite allergy subtype has poor outlook.", table_body_style)], ] prog_tbl = Table(prog_data, colWidths=[4*cm, 2.5*cm, 2.2*cm, 8.3*cm]) prog_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY, WHITE, LIGHT_GREY, WHITE]), ("GRID", (0,0), (-1,-1), 0.5, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 5), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(prog_tbl) story.append(sp(5)) story.append(Paragraph("<b>Prognostic Scoring:</b> The Korean Prognostic Index (KPI) and PINK-E score " "(Prognostic Index for Natural Killer/T-cell Lymphoma with EBV DNA) are validated tools.", body)) story.append(Paragraph( "PINK-E factors: <b>age >60, Stage III/IV, distant lymph node involvement, non-nasal type, " "elevated EBV DNA</b>. Each factor scores 1 point; score 3–5 = high-risk group.", bullet_style)) story.append(sp(5)) story.append(note_box( "⭐ KEY EXAM POINT — Treatment rationale: ENKTL is relatively RESISTANT to CHOP " "(P-glycoprotein-mediated MDR). L-asparaginase-based regimens (SMILE: Dex/Mtx/Ifos/L-aspa/Etop) and " "radiotherapy are the backbone of treatment. PD-1/PD-L1 checkpoint inhibitors are now standard " "for relapsed/refractory ENKTL (WHO-5 era)." )) story.append(sp(10)) # ── SUMMARY TABLE ──────────────────────────────────────────────────────── story.append(section_header("QUICK SUMMARY — COMPARISON TABLE")) story.append(sp(5)) sum_data = [ [Paragraph("Feature", table_head_style), Paragraph("ENKTL", table_head_style), Paragraph("ANKL", table_head_style), Paragraph("CLPD-NK", table_head_style)], [Paragraph("Origin", table_body_style), Paragraph("NK cell (rarely γδ T)", table_body_style), Paragraph("NK cell", table_body_style), Paragraph("NK cell", table_body_style)], [Paragraph("EBV", table_body_style), Paragraph("Always +", table_body_style), Paragraph("Usually +", table_body_style), Paragraph("Negative", table_body_style)], [Paragraph("Key site", table_body_style), Paragraph("Nasal cavity/extranodal", table_body_style), Paragraph("Blood/marrow/spleen", table_body_style), Paragraph("Blood", table_body_style)], [Paragraph("Angioinvasion", table_body_style), Paragraph("Hallmark ✓", table_body_style), Paragraph("Absent", table_body_style), Paragraph("Absent", table_body_style)], [Paragraph("CD56", table_body_style), Paragraph("+", table_body_style), Paragraph("+", table_body_style), Paragraph("+", table_body_style)], [Paragraph("CD16", table_body_style), Paragraph("−", table_body_style), Paragraph("+", table_body_style), Paragraph("+", table_body_style)], [Paragraph("TCR rearrangement", table_body_style), Paragraph("Germline", table_body_style), Paragraph("Germline", table_body_style), Paragraph("Germline", table_body_style)], [Paragraph("Prognosis", table_body_style), Paragraph("Poor (Stage III/IV)", table_body_style), Paragraph("Very poor (<10% OS)", table_body_style), Paragraph("Good (indolent)", table_body_style)], ] sum_tbl = Table(sum_data, colWidths=[4.25*cm, 4.25*cm, 4.25*cm, 4.25*cm]) sum_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_BLUE), ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LIGHT_GREY]*10), ("GRID", (0,0), (-1,-1), 0.5, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) story.append(sum_tbl) story.append(sp(12)) # ── FOOTER ──────────────────────────────────────────────────────────────── story.append(HRFlowable(width="100%", thickness=1, color=MED_BLUE)) story.append(sp(4)) story.append(Paragraph( "Sources: Robbins & Cotran Pathologic Basis of Disease (10th ed.) | Henry's Clinical Diagnosis & Management by Laboratory Methods | " "Andrews' Diseases of the Skin | WHO Classification of Haematolymphoid Tumours, 5th Edition (2022) | " "Nature Leukemia 2022 (WHO-HAEM5 classification paper) | PMC 2025 review — non-B lymphoid neoplasms", footer_style)) # ── BUILD ───────────────────────────────────────────────────────────────── doc.build(story) print("PDF created:", OUTPUT) PYEOF python3 /tmp/workspace/nk-cell-lymphoma/make_pdf.py
ls -lh /tmp/workspace/nk-cell-lymphoma/NK_Cell_Lymphoma_10_Mark.pdf
NK Cell Lymphoma 10 Mark
PDF Document · PDF
Create a 10 marker Pdf on hematogones in md pathology exam which include types etiology microscopy cd marker and prognosis according latest who classification
hematogones types CD markers microscopy WHO classification 2022 pathology
https://basicmedicalkey.com/hematogones-in-bone-marrow
hematogones WHO 5th edition 2022 B lymphoblastic classification vs B-ALL flow cytometry differential
https://pmc.ncbi.nlm.nih.gov/articles/PMC10264119
mkdir -p /tmp/workspace/hematogones && cat > /tmp/workspace/hematogones/make_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.units import cm, mm from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, KeepTogether, PageBreak) from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY OUTPUT = "/tmp/workspace/hematogones/Hematogones_10_Mark_MD_Pathology.pdf" # ── Colours ────────────────────────────────────────────────────────────────── DARK_TEAL = colors.HexColor("#0B3D3A") MED_TEAL = colors.HexColor("#1A6B66") LIGHT_TEAL = colors.HexColor("#D0EEEC") GOLD = colors.HexColor("#B8860B") GOLD_LIGHT = colors.HexColor("#FFF8DC") ACCENT_RED = colors.HexColor("#B22222") LIGHT_GREY = colors.HexColor("#F5F5F5") MID_GREY = colors.HexColor("#CCCCCC") PURPLE = colors.HexColor("#5B2C8D") GREEN_DARK = colors.HexColor("#1A6B1A") WHITE = colors.white BLACK = colors.black doc = SimpleDocTemplate( OUTPUT, pagesize=A4, leftMargin=1.8*cm, rightMargin=1.8*cm, topMargin=1.8*cm, bottomMargin=1.8*cm ) # ── Styles ───────────────────────────────────────────────────────────────── def S(name, **kw): return ParagraphStyle(name, **kw) title_s = S("T", fontName="Helvetica-Bold", fontSize=20, textColor=WHITE, alignment=TA_CENTER, leading=24, spaceAfter=3) subtitle_s= S("ST", fontName="Helvetica", fontSize=10, textColor=colors.HexColor("#A8DDD8"), alignment=TA_CENTER, leading=14) sec_s = S("SH", fontName="Helvetica-Bold", fontSize=11.5, textColor=WHITE, alignment=TA_LEFT, leading=15) body_s = S("B", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=14, alignment=TA_JUSTIFY, spaceAfter=3) body_bold = S("BB", fontName="Helvetica-Bold", fontSize=9.5, textColor=BLACK, leading=14) bullet_s = S("BL", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=13, leftIndent=10, spaceAfter=2) sub_s = S("SB", fontName="Helvetica", fontSize=9, textColor=colors.HexColor("#333333"), leading=12, leftIndent=22, spaceAfter=1) th_s = S("TH", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, alignment=TA_CENTER, leading=11) tb_s = S("TB", fontName="Helvetica", fontSize=8.5, textColor=BLACK, alignment=TA_LEFT, leading=11) tb_c = S("TBC", fontName="Helvetica", fontSize=8.5, textColor=BLACK, alignment=TA_CENTER, leading=11) foot_s = S("FT", fontName="Helvetica-Oblique", fontSize=7.5, textColor=colors.HexColor("#666666"), alignment=TA_CENTER) key_s = S("KP", fontName="Helvetica-BoldOblique", fontSize=9, textColor=ACCENT_RED, leading=13, leftIndent=8) note_text = S("NT", fontName="Helvetica", fontSize=9, textColor=DARK_TEAL, leading=13, leftIndent=6) def sp(n=6): return Spacer(1, n) def sec(text, col=MED_TEAL): t = Table([[Paragraph(text, sec_s)]], colWidths=[17.4*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), col), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 10), ])) return t def note(txt, bg=LIGHT_TEAL, border=MED_TEAL): t = Table([[Paragraph(txt, note_text)]], colWidths=[17.4*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("TOPPADDING", (0,0), (-1,-1), 7), ("BOTTOMPADDING", (0,0), (-1,-1), 7), ("LEFTPADDING", (0,0), (-1,-1), 12), ("BOX", (0,0), (-1,-1), 1, border), ])) return t def tbl(data, cols, row_bg=None): t = Table(data, colWidths=cols) bg = row_bg or [WHITE, LIGHT_GREY] t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_TEAL), ("ROWBACKGROUNDS", (0,1), (-1,-1), bg), ("GRID", (0,0), (-1,-1), 0.4, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) return t # ═══════════════════════════════════════════════════════════════════════════ story = [] # ── TITLE BANNER ───────────────────────────────────────────────────────── banner = Table( [[Paragraph("HEMATOGONES", title_s)], [Paragraph("MD Pathology Examination • 10 Marks", subtitle_s)], [Paragraph("Based on WHO Classification of Haematolymphoid Tumours 5th Edition (2022)", subtitle_s)]], colWidths=[17.4*cm] ) banner.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), DARK_TEAL), ("TOPPADDING", (0,0), (-1,-1), 10), ("BOTTOMPADDING", (0,0), (-1,-1), 10), ("LEFTPADDING", (0,0), (-1,-1), 8), ("BOX", (0,0), (-1,-1), 2, MED_TEAL), ])) story.append(banner) story.append(sp(14)) # ── INTRODUCTION ───────────────────────────────────────────────────────── story.append(sec("INTRODUCTION & DEFINITION")) story.append(sp(5)) story.append(Paragraph( "<b>Hematogones (HG)</b> are <b>benign, non-neoplastic B-lymphoid precursor cells</b> normally residing in " "the bone marrow (BM). The term was coined by <b>Vogel et al. in 1937</b> to describe these unique BM cells. " "They represent successive stages in normal B-cell lymphopoiesis — from the earliest CD34+/TdT+ pro-B cell " "to a nearly mature B-lymphocyte. Hematogones are the <b>'supreme mimicker'</b> in haematopathology because " "they can be confused with neoplastic lymphoblasts, especially in the post-treatment bone marrow of " "ALL patients.", body_s)) story.append(sp(4)) for syn in [ "<b>Synonyms:</b> Benign B-lymphoid precursors | Marrow precursor cells | TdT-positive cells | " "CALLA (CD10)-positive cells | Normal B-cell precursors", "<b>WHO-5 (2022) context:</b> Hematogones are NOT classified as a neoplasm. They are encountered as a " "differential diagnosis for B-lymphoblastic leukaemia/lymphoma (B-ALL/LBL). Recognition is critical " "in the context of <b>Minimal Residual Disease (MRD) monitoring</b> and post-treatment marrow assessment.", ]: story.append(Paragraph(f"• {syn}", bullet_s)) story.append(sp(10)) # ── TYPES / STAGES ─────────────────────────────────────────────────────── story.append(sec("TYPES / MATURATION STAGES")) story.append(sp(5)) story.append(Paragraph( "Hematogones exist in a <b>continuous maturational spectrum</b>. Three operational stages are recognised " "based on immunophenotypic and morphological characteristics:", body_s)) story.append(sp(5)) types_data = [ [Paragraph("Stage", th_s), Paragraph("Alternate Name", th_s), Paragraph("Immunophenotype", th_s), Paragraph("Morphology", th_s), Paragraph("Equivalent Normal Stage", th_s)], [Paragraph("Stage 1\n(Type I)", tb_c), Paragraph("Early/Pro-B", tb_s), Paragraph("CD34+++ (bright)\nTdT+\nCD19+\nCD10+++ (bright)\nCD38++ (bright)\nCD20−\nCD45 dim\ncIgM−\nsIgM−", tb_s), Paragraph("Small to medium-sized cells. High N/C ratio. Dense/smudged chromatin. Round nuclear contour. Nucleoli absent or indistinct. Scant agranular basophilic cytoplasm.", tb_s), Paragraph("Pro-B / Early Pre-B cell", tb_s)], [Paragraph("Stage 2\n(Type II)", tb_c), Paragraph("Pre-B", tb_s), Paragraph("CD34− (lost)\nTdT+/−\nCD19+\nCD10+ (dim→mod)\nCD38+ (moderate)\nCD20+ (dim, acquired)\nCD45 intermediate\ncIgM+ (appears)\nsIgM−", tb_s), Paragraph("Similar small-to-medium size. Nuclear contour remains round to oval. Chromatin slightly less dense than Stage 1. Cytoplasm minimal. Nucleoli still absent.", tb_s), Paragraph("Pre-B cell\n(IgH rearrangement occurring)", tb_s)], [Paragraph("Stage 3\n(Type III)", tb_c), Paragraph("Immature B / Transitional", tb_s), Paragraph("CD34−\nTdT−\nCD19+\nCD10−/dim (lost)\nCD38 dim (decreasing)\nCD20++ (increasing)\nCD45 bright\nsIgM+ (acquired)\ncIgM+", tb_s), Paragraph("Slightly larger. Chromatin becomes coarser/clumped. Resembles small mature lymphocyte. Modest cytoplasm. Transitional to mature B-cell appearance.", tb_s), Paragraph("Immature/Transitional B-cell", tb_s)], ] story.append(tbl(types_data, [1.8*cm, 2*cm, 4.5*cm, 4.5*cm, 4.6*cm])) story.append(sp(5)) story.append(note( "⭐ MATURATION SEQUENCE (key exam point): CD34 lost → TdT lost → CD10 lost → CD38 decreases → " "CD20 gained → CD45 increases → surface IgM acquired. " "Flow cytometry shows a continuous 'rainbow' of antigenic expression — NOT a discrete single population." )) story.append(sp(10)) # ── ETIOLOGY ───────────────────────────────────────────────────────────── story.append(sec("ETIOLOGY / CAUSES OF HEMATOGONE HYPERPLASIA")) story.append(sp(5)) story.append(Paragraph( "Hematogones are a <b>normal constituent of BM</b> at all ages. They are most abundant in " "<b>infants and young children</b> (<5 years), declining with age. " "<b>Hematogone hyperplasia</b> (increased HG%) occurs in response to marrow stress or injury:", body_s)) story.append(sp(5)) etio_data = [ [Paragraph("Category", th_s), Paragraph("Specific Conditions", th_s), Paragraph("Mechanism", th_s)], [Paragraph("Post-chemotherapy / BM recovery ★", tb_s), Paragraph("After completion of ALL therapy; post-BMT; post-intensive chemotherapy for any malignancy", tb_s), Paragraph("Regenerative hyperplasia — BM repopulates with B-cell precursors. MOST IMPORTANT clinical scenario.", tb_s)], [Paragraph("Haematological malignancies", tb_s), Paragraph("B-ALL (background HG seen alongside blasts); immune thrombocytopenia (ITP); non-Hodgkin lymphoma; chronic lymphoproliferative disorders", tb_s), Paragraph("Reactive response to marrow injury or displacement. HG can co-exist with neoplastic blasts.", tb_s)], [Paragraph("Solid tumours (paediatric)", tb_s), Paragraph("Neuroblastoma ★★ (classic association); rhabdomyosarcoma; Ewing sarcoma", tb_s), Paragraph("Neuroblastoma displaces marrow → reactive HG hyperplasia during recovery. HG must not be mistaken for residual tumour.", tb_s)], [Paragraph("Autoimmune / Inflammatory", tb_s), Paragraph("Autoimmune cytopenias; systemic lupus erythematosus; juvenile idiopathic arthritis; Wiskott-Aldrich syndrome", tb_s), Paragraph("Chronic antigenic stimulation → B-cell precursor expansion.", tb_s)], [Paragraph("Congenital / Physiological", tb_s), Paragraph("Neonates; umbilical cord blood; preterm infants (HG = predominant BM lymphoid population)", tb_s), Paragraph("Physiological B-lymphopoiesis is maximal at birth, declining with age.", tb_s)], [Paragraph("Bone marrow transplantation", tb_s), Paragraph("Engraftment phase post-allogeneic or autologous BMT", tb_s), Paragraph("Reconstituting marrow regenerates B-cell precursors in waves — peaks at 1–3 months post-transplant.", tb_s)], [Paragraph("Viral infections", tb_s), Paragraph("Parvovirus B19 recovery; EBV; HIV-associated marrow recovery", tb_s), Paragraph("BM regeneration after viral suppression of haematopoiesis.", tb_s)], ] story.append(tbl(etio_data, [3.5*cm, 6*cm, 7.9*cm])) story.append(sp(5)) story.append(Paragraph( "★★ <b>Classic exam association:</b> Neuroblastoma with increased BM hematogones simulating B-ALL.", key_s)) story.append(sp(10)) # ── MICROSCOPY ─────────────────────────────────────────────────────────── story.append(sec("MICROSCOPY (HISTOPATHOLOGY & CYTOMORPHOLOGY)")) story.append(sp(5)) story.append(Paragraph("<b>Peripheral Blood:</b>", body_bold)) for item in [ "Rarely identified morphologically in PB (exception: neonates, umbilical cord blood)", "Detectable by sensitive flow cytometry in children (low levels) and occasionally adults", "When seen: small lymphocyte-like cells with dense chromatin — indistinguishable from small lymphocytes on smear", ]: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(6)) story.append(Paragraph("<b>Bone Marrow Aspirate (the primary diagnostic site):</b>", body_bold)) for item in [ "<b>Size:</b> Small to medium-sized cells (range variable across Stages 1–3). Twice the diameter of a red cell.", "<b>Nuclear contour:</b> Round to mildly irregular. May be slightly bilobed or notched — can simulate nuclear irregularity of blasts.", "<b>Chromatin:</b> Dense and smudged (Stage 1 & 2); condensed/clumped chromatin (Stage 3). DENSER than ALL blasts (important differentiator).", "<b>Nucleoli:</b> Absent or very indistinct — in contrast to lymphoblasts which may have visible nucleoli.", "<b>Cytoplasm:</b> Scant, pale blue, agranular. No Auer rods.", "<b>N/C ratio:</b> Very high (predominantly nuclear cell).", "<b>Mitotic figures:</b> May be seen (evidence of active proliferation during regeneration).", "<b>Pattern:</b> Scattered individually — <b>no significant clustering or aggregate formation</b> (clusters of ≥5 TdT+ cells suggest ALL relapse).", ]: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(6)) story.append(Paragraph("<b>Bone Marrow Biopsy (trephine):</b>", body_bold)) for item in [ "Usually subtle involvement; diffuse lymphocytosis may be appreciated in marked hyperplasia", "Background <b>preserved trilineage haematopoiesis</b> (distinguishes from ALL infiltration)", "May form loose clusters; dense aggregate formation is rare and should raise suspicion for lymphoma", "<b>Dense chromatin</b> (compared to blasts in ALL) on H&E", "IHC shows spectrum of CD43 and CD20 expression — characteristic maturation pattern", "<b>No significant clustering with TdT or CD34 on IHC</b> — key biopsy point", ]: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(6)) story.append(Paragraph("<b>Extramedullary Sites:</b>", body_bold)) story.append(Paragraph( "TdT+ B-cell precursors can be found in low numbers in lymph nodes and tonsils — this is physiological.", bullet_s)) story.append(sp(5)) story.append(note( "MORPHOLOGY KEY POINT: The single most useful morphological feature distinguishing hematogones from " "ALL blasts is the DENSER, more smudged chromatin of hematogones vs. the finely dispersed, immature " "chromatin of lymphoblasts. However, morphology alone is INSUFFICIENT — flow cytometry is mandatory.", bg=GOLD_LIGHT, border=GOLD)) story.append(sp(10)) # ── CD MARKERS ─────────────────────────────────────────────────────────── story.append(sec("IMMUNOPHENOTYPE (CD MARKERS) — FLOW CYTOMETRY")) story.append(sp(5)) story.append(Paragraph( "Flow cytometry is the <b>gold standard</b> for identifying and staging hematogones. " "The hallmark is a <b>continuous maturation pattern</b> — a smooth spectrum of antigen expression " "from Stage 1 to Stage 3 — seen as a 'rainbow arc' on CD45 vs. side scatter.", body_s)) story.append(sp(5)) cd_data = [ [Paragraph("Marker", th_s), Paragraph("Stage 1 (Pro-B)", th_s), Paragraph("Stage 2 (Pre-B)", th_s), Paragraph("Stage 3 (Immature B)", th_s), Paragraph("Mature B-lymphocyte", th_s), Paragraph("Significance", th_s)], [Paragraph("CD19", tb_c), Paragraph("✓ Positive", tb_c), Paragraph("✓ Positive", tb_c), Paragraph("✓ Positive", tb_c), Paragraph("✓ Positive", tb_c), Paragraph("Pan-B marker; positive throughout all stages — lineage-defining", tb_s)], [Paragraph("CD34 ★", tb_c), Paragraph("✓✓ Bright", S("g",fontName="Helvetica-Bold",fontSize=8.5,textColor=GREEN_DARK,alignment=TA_CENTER,leading=11)), Paragraph("✗ Negative\n(lost)", S("r",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT_RED,alignment=TA_CENTER,leading=11)), Paragraph("✗ Negative", S("r2",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT_RED,alignment=TA_CENTER,leading=11)), Paragraph("✗ Negative", tb_c), Paragraph("Stem cell marker; only Stage 1. Persistent/uniform CD34 bright → suspicious for B-ALL.", tb_s)], [Paragraph("TdT ★", tb_c), Paragraph("✓✓ Positive", S("g2",fontName="Helvetica-Bold",fontSize=8.5,textColor=GREEN_DARK,alignment=TA_CENTER,leading=11)), Paragraph("+/− Variable", tb_c), Paragraph("✗ Negative\n(lost)", S("r3",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT_RED,alignment=TA_CENTER,leading=11)), Paragraph("✗ Negative", tb_c), Paragraph("Nuclear enzyme; marks immaturity. Lost as HG mature. Overexpression/persistence → B-ALL.", tb_s)], [Paragraph("CD10\n(CALLA) ★", tb_c), Paragraph("✓✓✓ Bright", S("g3",fontName="Helvetica-Bold",fontSize=8.5,textColor=GREEN_DARK,alignment=TA_CENTER,leading=11)), Paragraph("✓ Dim→Mod\n(decreasing)", tb_c), Paragraph("✗/dim\n(lost/dim)", S("r4",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT_RED,alignment=TA_CENTER,leading=11)), Paragraph("✗ Negative", tb_c), Paragraph("Common ALL antigen (CALLA). Uniformly BRIGHT CD10 in a monomorphic population → B-ALL.", tb_s)], [Paragraph("CD20 ★", tb_c), Paragraph("✗ Negative", S("r5",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT_RED,alignment=TA_CENTER,leading=11)), Paragraph("✓ Dim\n(acquired)", tb_c), Paragraph("✓✓ Mod→Bright\n(increasing)", S("g4",fontName="Helvetica-Bold",fontSize=8.5,textColor=GREEN_DARK,alignment=TA_CENTER,leading=11)), Paragraph("✓✓ Bright", tb_c), Paragraph("Acquired with maturation. Aberrant co-expression of CD20+CD34+ → B-ALL.", tb_s)], [Paragraph("CD38", tb_c), Paragraph("✓✓ Bright", S("g5",fontName="Helvetica-Bold",fontSize=8.5,textColor=GREEN_DARK,alignment=TA_CENTER,leading=11)), Paragraph("✓ Moderate", tb_c), Paragraph("✓ Dim\n(decreasing)", tb_c), Paragraph("✗ Negative\n(dim)", tb_c), Paragraph("Activation marker — bright in early stages, progressively lost. Weak/absent → possible B-ALL.", tb_s)], [Paragraph("CD45 ★", tb_c), Paragraph("✗/dim\n(very dim)", S("r6",fontName="Helvetica-Bold",fontSize=8.5,textColor=ACCENT_RED,alignment=TA_CENTER,leading=11)), Paragraph("✓ Intermediate\n(increasing)", tb_c), Paragraph("✓✓ Bright\n(approaching mature)", tb_c), Paragraph("✓✓✓ Bright", tb_c), Paragraph("Leukocyte common antigen — progressive gain. TWO/THREE dim CD45 populations = HG on scatter plot.", tb_s)], [Paragraph("CD9", tb_c), Paragraph("✓✓ Bright", S("g6",fontName="Helvetica-Bold",fontSize=8.5,textColor=GREEN_DARK,alignment=TA_CENTER,leading=11)), Paragraph("✓ Moderate", tb_c), Paragraph("✗/dim\n(lost)", tb_c), Paragraph("✗ Negative", tb_c), Paragraph("Lost with maturation. Useful in MRD monitoring alongside CD58.", tb_s)], [Paragraph("CD58 ★", tb_c), Paragraph("Variable", tb_c), Paragraph("Variable", tb_c), Paragraph("Variable", tb_c), Paragraph("✗ Negative", tb_c), Paragraph("Over-expressed in B-ALL vs. HG. CD58 bright + CD38 dim = strong B-ALL indicator on 2D plot.", tb_s)], [Paragraph("CD22", tb_c), Paragraph("✓ Cytoplasmic", tb_c), Paragraph("✓ Cytoplasmic/surface", tb_c), Paragraph("✓ Surface", tb_c), Paragraph("✓✓ Surface", tb_c), Paragraph("Pan-B; consistently positive. Target of inotuzumab ozogamicin in B-ALL.", tb_s)], [Paragraph("Surface IgM\n(sIgM)", tb_c), Paragraph("✗ Negative", tb_c), Paragraph("✗ Negative\ncIgM appears", tb_c), Paragraph("✓ Acquired", tb_c), Paragraph("✓✓ Positive", tb_c), Paragraph("Acquired late; marks near-complete B-cell maturation.", tb_s)], [Paragraph("Myeloid antigens\n(CD13, CD33)", tb_c), Paragraph("✗ Negative", tb_c), Paragraph("✗ Negative", tb_c), Paragraph("✗ Negative", tb_c), Paragraph("✗ Negative", tb_c), Paragraph("ABSENT in all HG stages. Presence = aberrant expression → B-ALL or mixed-phenotype AL.", tb_s)], ] cd_tbl = Table(cd_data, colWidths=[2.2*cm, 2.5*cm, 2.5*cm, 2.5*cm, 2.5*cm, 5.2*cm]) cd_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), DARK_TEAL), ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]*20), ("GRID", (0,0), (-1,-1), 0.4, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 5), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), # highlight CD10, CD20, CD45 key rows ("BACKGROUND", (0,4), (-1,4), colors.HexColor("#E8F4E8")), ("BACKGROUND", (0,5), (-1,5), colors.HexColor("#FFF3E0")), ("BACKGROUND", (0,7), (-1,7), colors.HexColor("#E8F4FF")), ])) story.append(cd_tbl) story.append(sp(5)) story.append(note( "⭐ MOST USEFUL FLOW CYTOMETRY AXES FOR HG vs. B-ALL DISTINCTION:\n" "1) CD58 × CD38 (2D plot) — best single combination\n" "2) CD10 × CD20 — HG show inverse correlation; B-ALL shows aberrant co-expression\n" "3) CD45/side scatter gating — HG show 2–3 populations of dim CD45; B-ALL shows a SINGLE dim population\n" "4) ZAP-70 — low in normal HG; may be elevated in some B-ALL" )) story.append(sp(10)) # ── GENETICS ───────────────────────────────────────────────────────────── story.append(sec("GENETICS & MOLECULAR FEATURES")) story.append(sp(5)) for item in [ "<b>Non-clonal:</b> Hematogones are polyclonal — they carry POLYCLONAL immunoglobulin gene rearrangements reflecting normal B-cell development. This is the defining genetic distinction from B-ALL (which is monoclonal).", "<b>IgH rearrangement:</b> V(D)J recombination begins in Stage 2 (Pre-B stage). Diversity of rearrangements confirms polyclonality.", "<b>No chromosomal abnormalities</b> are found in hematogones (unlike B-ALL which shows specific translocations).", "<b>Gene expression:</b> CD19 and CD22 are statistically overexpressed in mature B-cells vs. HSCs; CD34 overexpressed in HSCs vs. mature B-cells — follows expected normal ontogeny.", "<b>No TP53, RAS, or JAK/STAT mutations</b> — absence of oncogenic driver mutations.", "<b>MRD by NGS:</b> Sensitive next-generation sequencing MRD assays can distinguish HG polyclonal B-cell precursors from residual B-ALL clones at very low levels (1 in 10⁵ cells).", ]: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(10)) # ── DIFFERENTIAL DIAGNOSIS ─────────────────────────────────────────────── story.append(sec("KEY DIFFERENTIAL DIAGNOSIS: HEMATOGONES vs. B-ALL", PURPLE)) story.append(sp(5)) diff_data = [ [Paragraph("Feature", th_s), Paragraph("Hematogones", th_s), Paragraph("B-ALL Blasts", th_s)], [Paragraph("Nature", tb_s), Paragraph("Benign, non-neoplastic, polyclonal", tb_s), Paragraph("Neoplastic, clonal, monoclonal", tb_s)], [Paragraph("Chromatin (morphology)", tb_s), Paragraph("Dense, smudged — varies across stages", tb_s), Paragraph("Finely dispersed, open/immature", tb_s)], [Paragraph("Nucleoli", tb_s), Paragraph("Absent/indistinct", tb_s), Paragraph("May be visible (especially L2 type)", tb_s)], [Paragraph("CD45 on flow", tb_s), Paragraph("2–3 DIM populations (maturation spectrum)", tb_s), Paragraph("Single dim population (uniform)", tb_s)], [Paragraph("CD10 expression", tb_s), Paragraph("Variable — bright→dim→negative (spectrum)", tb_s), Paragraph("Uniformly bright OR uniformly absent (frozen at one stage)", tb_s)], [Paragraph("CD34 expression", tb_s), Paragraph("Only Stage 1 (subset)", tb_s), Paragraph("Often uniformly positive (or negative in mature ALL)", tb_s)], [Paragraph("CD38", tb_s), Paragraph("Variable (decreases with maturation)", tb_s), Paragraph("May be weak or absent uniformly", tb_s)], [Paragraph("CD20 expression", tb_s), Paragraph("Variable (gains with maturation)", tb_s), Paragraph("May be aberrantly absent or uniformly dim/bright", tb_s)], [Paragraph("CD58 (LFA-3)", tb_s), Paragraph("Variable, generally moderate", tb_s), Paragraph("Often OVER-EXPRESSED (bright)", tb_s)], [Paragraph("Myeloid antigens (CD13/33)", tb_s), Paragraph("Always absent", tb_s), Paragraph("May be aberrantly expressed", tb_s)], [Paragraph("TCR/IgH clonality", tb_s), Paragraph("Polyclonal (germline pattern of diversity)", tb_s), Paragraph("Monoclonal rearrangement", tb_s)], [Paragraph("BM biopsy IHC", tb_s), Paragraph("No clustering of TdT/CD34+ cells", tb_s), Paragraph("Clusters ≥5 TdT+ cells strongly suggest ALL relapse", tb_s)], [Paragraph("Clinical context", tb_s), Paragraph("Post-chemo recovery; paediatric; neuroblastoma; autoimmune", tb_s), Paragraph("New diagnosis; treatment-refractory; disease relapse", tb_s)], ] diff_tbl = Table(diff_data, colWidths=[4.2*cm, 6.6*cm, 6.6*cm]) diff_tbl.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,0), PURPLE), ("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]*20), ("GRID", (0,0), (-1,-1), 0.4, MID_GREY), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "TOP"), ])) story.append(diff_tbl) story.append(sp(10)) # ── PROGNOSIS ───────────────────────────────────────────────────────────── story.append(sec("PROGNOSIS & CLINICAL SIGNIFICANCE")) story.append(sp(5)) story.append(Paragraph( "<b>Hematogones themselves are BENIGN and carry NO independent adverse prognosis.</b> " "Prognosis is entirely determined by the underlying associated condition.", body_s)) story.append(sp(5)) prog_data = [ [Paragraph("Clinical Context", th_s), Paragraph("Significance of HG", th_s), Paragraph("Clinical Implication / Outcome", th_s)], [Paragraph("Post-ALL chemotherapy (CR)", tb_s), Paragraph("HG hyperplasia = GOOD SIGN\nIndicates BM regeneration and successful treatment response", tb_s), Paragraph("HG peak at 1–3 months post-induction. Correlates with MRD-negative status. DO NOT treat — misidentification as relapse leads to unnecessary re-treatment.", tb_s)], [Paragraph("Suspected ALL relapse", tb_s), Paragraph("HG must be distinguished from residual/relapse blasts by flow cytometry", tb_s), Paragraph("MRD negativity + HG maturation pattern on flow = remission. MRD positivity = true relapse requiring therapy change.", tb_s)], [Paragraph("Post-BMT engraftment", tb_s), Paragraph("Surge in HG = normal B-cell reconstitution", tb_s), Paragraph("Peak HG 4–8 weeks post-transplant. Absence of HG recovery may indicate graft failure.", tb_s)], [Paragraph("Neuroblastoma (paediatric)", tb_s), Paragraph("HG hyperplasia can massively increase (up to 26%+), mimicking B-ALL infiltration", tb_s), Paragraph("Recognition prevents misdiagnosis and unnecessary ALL treatment. Prognosis driven by neuroblastoma stage.", tb_s)], [Paragraph("Autoimmune disease / ITP", tb_s), Paragraph("Moderate HG increase (reactive)", tb_s), Paragraph("Prognosis driven by underlying autoimmune condition. HG presence confirms reactive, not neoplastic, lymphoid proliferation.", tb_s)], [Paragraph("Isolated HG hyperplasia (no known cause)", tb_s), Paragraph("Rare; benign; self-limiting", tb_s), Paragraph("Extremely rare single case report of subsequent B-ALL development — considered coincidental. NO treatment of HG per se.", tb_s)], ] story.append(tbl(prog_data, [4*cm, 6*cm, 7.4*cm])) story.append(sp(5)) story.append(note( "⭐ KEY CLINICAL PEARL: HG hyperplasia is a FAVOURABLE sign in the post-treatment marrow of ALL patients. " "Misidentification of HG as residual leukemia = most common diagnostic pitfall in post-treatment " "bone marrow assessment in paediatric haematology. " "Always perform multiparameter flow cytometry (≥6 colours) before declaring relapse.", bg=GOLD_LIGHT, border=GOLD)) story.append(sp(10)) # ── WHO 2022 CONTEXT ───────────────────────────────────────────────────── story.append(sec("WHO 5th EDITION (2022) — CLASSIFICATION CONTEXT")) story.append(sp(5)) story.append(Paragraph( "Hematogones are <b>not classified as a WHO entity</b> — they are a normal physiological cell population. " "However, their recognition is <b>embedded within the WHO-5 framework</b> at multiple levels:", body_s)) story.append(sp(4)) for item in [ "<b>B-Lymphoblastic Leukaemia/Lymphoma (B-ALL/LBL):</b> WHO-5 emphasises immunophenotyping to distinguish " "B-ALL from HG. New entities include B-ALL with ETV6::RUNX1-like features and B-ALL with TCF3::HLF fusion.", "<b>MRD concept:</b> WHO-5 formally incorporates MRD status as a disease criterion. Understanding HG " "maturation is indispensable for accurate MRD interpretation.", "<b>≥20% blast threshold:</b> WHO-5 retains the ≥20% BM/PB blast criterion for B-ALL diagnosis. " "Flow cytometric blast counts must NOT replace morphological counts — HG can inflate apparent blast " "percentages if not properly identified.", "<b>Clonal haematopoiesis context:</b> HG are by definition non-clonal; clonality assays distinguish " "them from early B-ALL in ambiguous cases.", "<b>IHC in biopsy:</b> WHO-5 guidance emphasises that clusters of ≥5 TdT+ or CD34+ cells on trephine " "IHC are abnormal and suggest ALL involvement or relapse.", ]: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(10)) # ── FOOTER ─────────────────────────────────────────────────────────────── story.append(HRFlowable(width="100%", thickness=1, color=MED_TEAL)) story.append(sp(4)) story.append(Paragraph( "Sources: Henry's Clinical Diagnosis & Management by Laboratory Methods (Tietz Lab Medicine, 7th ed.) | " "Quick Compendium of Clinical Pathology 5th ed. | " "WHO Classification of Haematolymphoid Tumours 5th Edition (2022) | " "Basicmedical Key — Hematogones in Bone Marrow | " "PMC10264119 — Hematogones: The Supreme Mimicker (2023) | " "CAP Flow Cytometry Atlas | International Clinical Cytometry Society", foot_s)) doc.build(story) print("PDF created successfully:", OUTPUT) PYEOF python3 /tmp/workspace/hematogones/make_pdf.py
ls -lh /tmp/workspace/hematogones/Hematogones_10_Mark_MD_Pathology.pdf
Hematogones 10 Mark MD Pathology
PDF Document · PDF
| Stage | Key Immunophenotype | Equivalent Normal Cell |
|---|---|---|
| Stage 1 (Pro-B) | CD34+++ bright, TdT+, CD10+++ bright, CD20−, CD45 dim | Pro-B cell |
| Stage 2 (Pre-B) | CD34− (lost), CD10 dim, CD20 dim (acquired), cIgM appearing | Pre-B cell (IgH rearranging) |
| Stage 3 (Transitional) | CD34−, TdT−, CD10−, CD20++ bright, CD45 bright, sIgM acquired | Immature/transitional B-cell |
Create a 10 marker Pdf on hematogones in md pathology exam which include types etiology microscopy cd marker and prognosis according latest who classification
Hematogones 10 Mark MD Pathology
PDF Document · PDF
Can you make pdf on mRD in hematlogy 10 marker for RGUHS exam
minimal residual disease MRD haematology WHO 2022 methods flow cytometry PCR NGS clinical significance ALL CML AML
https://pmc.ncbi.nlm.nih.gov/articles/PMC12079024
MRD measurable residual disease RGUHS MD pathology haematology definition threshold ALL AML CML CLL myeloma 2022 2024
https://alliedhealth.lsuhsc.edu/cl/docs/MinimalResidualDisea…
mkdir -p /tmp/workspace/mrd-hematology && cat > /tmp/workspace/mrd-hematology/make_mrd_pdf.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import 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, TA_JUSTIFY OUTPUT = "/tmp/workspace/mrd-hematology/MRD_Haematology_10_Mark_RGUHS.pdf" # ── Colours ─────────────────────────────────────────────────────────────── DARK_MAROON = colors.HexColor("#5C0A14") MED_MAROON = colors.HexColor("#8B1A2A") LIGHT_MAROON = colors.HexColor("#F9E6E8") DARK_NAVY = colors.HexColor("#0D1B3E") MED_NAVY = colors.HexColor("#1A3A6B") LIGHT_BLUE = colors.HexColor("#E8EEF8") GOLD = colors.HexColor("#C9A84C") GOLD_LIGHT = colors.HexColor("#FFFBEE") GREEN_DARK = colors.HexColor("#1A6B1A") ACCENT_RED = colors.HexColor("#CC2200") MID_GREY = colors.HexColor("#CCCCCC") LIGHT_GREY = colors.HexColor("#F5F5F5") WHITE = colors.white BLACK = colors.black TEAL = colors.HexColor("#0B5563") LIGHT_TEAL = colors.HexColor("#E0F2F4") doc = SimpleDocTemplate(OUTPUT, pagesize=A4, leftMargin=1.8*cm, rightMargin=1.8*cm, topMargin=1.8*cm, bottomMargin=1.8*cm) def S(name, **kw): return ParagraphStyle(name, **kw) def sp(n=6): return Spacer(1, n) title_s = S("T", fontName="Helvetica-Bold", fontSize=20, textColor=WHITE, alignment=TA_CENTER, leading=26) sub1_s = S("S1", fontName="Helvetica-Bold", fontSize=11, textColor=colors.HexColor("#FFD580"), alignment=TA_CENTER, leading=16) sub2_s = S("S2", fontName="Helvetica", fontSize=9, textColor=colors.HexColor("#CCE0FF"), alignment=TA_CENTER, leading=13) sec_s = S("SH", fontName="Helvetica-Bold", fontSize=11, textColor=WHITE, alignment=TA_LEFT, leading=15) body_s = S("B", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=14, alignment=TA_JUSTIFY, spaceAfter=3) body_bold = S("BB", fontName="Helvetica-Bold", fontSize=9.5, textColor=BLACK, leading=14) bullet_s = S("BL", fontName="Helvetica", fontSize=9.5, textColor=BLACK, leading=13, leftIndent=10, spaceAfter=2) sub_s = S("SB", fontName="Helvetica", fontSize=9, textColor=colors.HexColor("#222222"), leading=12, leftIndent=22, spaceAfter=1) th_s = S("TH", fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE, alignment=TA_CENTER, leading=11) tb_s = S("TB", fontName="Helvetica", fontSize=8.5, textColor=BLACK, alignment=TA_LEFT, leading=11) tb_c = S("TC", fontName="Helvetica", fontSize=8.5, textColor=BLACK, alignment=TA_CENTER, leading=11) tb_b = S("TBB",fontName="Helvetica-Bold", fontSize=8.5, textColor=BLACK, alignment=TA_LEFT, leading=11) key_s = S("KP", fontName="Helvetica-BoldOblique", fontSize=9, textColor=ACCENT_RED, leading=13, leftIndent=6) note_s = S("NT", fontName="Helvetica", fontSize=9, textColor=DARK_NAVY, leading=13, leftIndent=6) foot_s = S("FT", fontName="Helvetica-Oblique", fontSize=7.5, textColor=colors.HexColor("#666666"), alignment=TA_CENTER) def sec(text, col=MED_MAROON): t = Table([[Paragraph(text, sec_s)]], colWidths=[17.4*cm]) t.setStyle(TableStyle([ ("BACKGROUND",(0,0),(-1,-1),col), ("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6), ("LEFTPADDING",(0,0),(-1,-1),10), ])) return t def note(txt, bg=LIGHT_MAROON, border=MED_MAROON): t = Table([[Paragraph(txt, note_s)]], colWidths=[17.4*cm]) t.setStyle(TableStyle([ ("BACKGROUND",(0,0),(-1,-1),bg), ("TOPPADDING",(0,0),(-1,-1),7),("BOTTOMPADDING",(0,0),(-1,-1),7), ("LEFTPADDING",(0,0),(-1,-1),12), ("BOX",(0,0),(-1,-1),1,border), ])) return t def tbl(data, cols, header_col=DARK_MAROON): t = Table(data, colWidths=cols) t.setStyle(TableStyle([ ("BACKGROUND",(0,0),(-1,0),header_col), ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,LIGHT_GREY]), ("GRID",(0,0),(-1,-1),0.4,MID_GREY), ("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5), ("LEFTPADDING",(0,0),(-1,-1),6), ("VALIGN",(0,0),(-1,-1),"TOP"), ])) return t # ═══════════════════════════════════════════════════════════ story = [] # ── TITLE BANNER ────────────────────────────────────────── banner_data = [ [Paragraph("MEASURABLE RESIDUAL DISEASE (MRD)", title_s)], [Paragraph("IN HAEMATOLOGICAL MALIGNANCIES", sub1_s)], [Paragraph("RGUHS MD Pathology Examination • 10 Marks • Based on WHO-HAEM5 (2022) & ELN Guidelines", sub2_s)], ] banner = Table(banner_data, colWidths=[17.4*cm]) banner.setStyle(TableStyle([ ("BACKGROUND",(0,0),(-1,-1),DARK_MAROON), ("TOPPADDING",(0,0),(-1,-1),10),("BOTTOMPADDING",(0,0),(-1,-1),10), ("LEFTPADDING",(0,0),(-1,-1),8), ("BOX",(0,0),(-1,-1),3,GOLD), ])) story.append(banner) story.append(sp(12)) # ── DEFINITION ──────────────────────────────────────────── story.append(sec("1. DEFINITION & NOMENCLATURE")) story.append(sp(5)) story.append(Paragraph( "<b>Minimal (Measurable) Residual Disease (MRD)</b> refers to the <b>subclinical level of residual " "neoplastic cells</b> that persist after treatment of a haematological malignancy, at a level " "BELOW the detection threshold of conventional morphology/cytogenetics (<5% blasts by " "morphology = 'complete remission' by standard criteria, yet ~10⁹ leukemic cells may remain).", body_s)) story.append(sp(4)) story.append(Paragraph("<b>Nomenclature evolution:</b>", body_bold)) for item in [ "Originally: <b>Minimal</b> Residual Disease — implied low, possibly irrelevant amounts", "Current preferred term (ELN 2018, WHO-5 2022): <b>Measurable</b> Residual Disease — emphasises " "quantifiability and clinical actionability regardless of level", "Also called: Molecular Residual Disease | Submicroscopic Residual Disease", ]: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(5)) story.append(note( "⭐ KEY CONCEPT: In morphological 'complete remission' (CR), ~10⁹–10¹⁰ leukemic cells can " "remain in the body — invisible to the naked eye and routine microscopy. Only MRD assays can " "detect these cells. MRD is now an <b>independent post-diagnosis prognostic indicator</b> " "in ALL, AML, CML, CLL, and Multiple Myeloma (ELN 2018; WHO-HAEM5 2022)." )) story.append(sp(10)) # ── WHO-5 CONTEXT ───────────────────────────────────────── story.append(sec("2. WHO 5th EDITION (2022) — MRD INTEGRATION")) story.append(sp(5)) story.append(Paragraph( "WHO Classification of Haematolymphoid Tumours 5th Edition (WHO-HAEM5, 2022) formally " "incorporates MRD status as a <b>disease criterion and response assessment tool</b> across multiple entities:", body_s)) story.append(sp(4)) who_data = [ [Paragraph("WHO-5 Entity", th_s), Paragraph("MRD Role in WHO-5 Framework", th_s), Paragraph("Key Molecular Target", th_s)], [Paragraph("B-ALL / T-ALL\n(B/T-Lymphoblastic Leukaemia)", tb_s), Paragraph("MRD status post-induction (Day 28/33) is now a formal risk stratification criterion. MRD negativity defines 'deep remission'. Integral to treatment de-escalation or escalation decisions.", tb_s), Paragraph("Ig/TCR gene rearrangements; ETV6::RUNX1, BCR::ABL1, KMT2A, TCF3::PBX1 fusion transcripts", tb_s)], [Paragraph("AML (Acute Myeloid Leukaemia)", tb_s), Paragraph("ELN-endorsed MRD incorporated into WHO-5. NPM1 mutation MRD by qPCR is the gold standard. MRD positivity after consolidation predicts relapse and indicates transplant.", tb_s), Paragraph("NPM1 mutation (qPCR) ★; CBF fusions RUNX1::RUNX1T1, CBFB::MYH11; FLT3-ITD (NGS MRD)", tb_s)], [Paragraph("CML (Chronic Myeloid Leukaemia)", tb_s), Paragraph("BCR::ABL1 PCR defines treatment milestones (EMR, MMR, DMR). TFR (treatment-free remission) requires sustained MRD4.5 (deep molecular response).", tb_s), Paragraph("BCR::ABL1 (p210/p190) transcripts by RT-qPCR on IS (International Scale)", tb_s)], [Paragraph("CLL (Chronic Lymphocytic Leukaemia)", tb_s), Paragraph("uMRD (undetectable MRD, <10⁻⁴) by flow/NGS is primary endpoint in venetoclax-based clinical trials and now guides treatment duration.", tb_s), Paragraph("IgH V(D)J clonotype sequencing; CD19/CD5 flow cytometry panels", tb_s)], [Paragraph("Multiple Myeloma (MM)", tb_s), Paragraph("MRD negativity by NGS or flow cytometry is the deepest response category (IMWG 2016 criteria, retained in WHO-5). FDA recognises MRD negativity as a surrogate drug approval endpoint.", tb_s), Paragraph("Bone marrow CD138+ plasma cell immunophenotype; IgH rearrangements by NGS", tb_s)], [Paragraph("MDS / MPN", tb_s), Paragraph("MRD use evolving; molecular MRD (TET2, DNMT3A, SF3B1 mutations) gaining traction post-treatment.", tb_s), Paragraph("Driver mutations by NGS (SF3B1, ASXL1, etc.)", tb_s)], ] story.append(tbl(who_data, [3.5*cm, 7.5*cm, 6.4*cm])) story.append(sp(10)) # ── SAMPLE TYPES & TIMING ───────────────────────────────── story.append(sec("3. SAMPLE TYPES, TIMING & SENSITIVITY THRESHOLDS")) story.append(sp(5)) samp_data = [ [Paragraph("Parameter", th_s), Paragraph("Details", th_s)], [Paragraph("Primary sample", tb_b), Paragraph("Bone marrow aspirate (BMA) — first pull of ≤3 mL to avoid haemodilution. Peripheral blood (PB) for BCR::ABL1 PCR (CML) and ctDNA.", tb_s)], [Paragraph("Timing — ALL", tb_b), Paragraph("Day 8 PB; Day 28/33 BM (end of induction); Week 12 (end of consolidation 1); pre-HSCT; post-HSCT; at relapse suspicion", tb_s)], [Paragraph("Timing — AML", tb_b), Paragraph("Post-induction CR; after each consolidation cycle; pre-/post-HSCT", tb_s)], [Paragraph("Timing — CML", tb_b), Paragraph("At diagnosis (baseline); 3 months (EMR: BCR-ABL ≤10%); 6 months; 12 months (MMR: BCR-ABL ≤0.1%); every 3 months thereafter", tb_s)], [Paragraph("Sensitivity thresholds", tb_b), Paragraph("Morphology: 1 in 20 (5%) | Cytogenetics: 1 in 20 (5%) | FISH: 1 in 100 (1%) | Conventional FC: 1 in 100–1000 | MRD by MFC: 1 in 10,000–100,000 | RT-qPCR: 1 in 100,000–1,000,000 | NGS / dPCR: 1 in 1,000,000–10,000,000", tb_s)], [Paragraph("MRD negativity definition", tb_b), Paragraph("ALL: <10⁻⁴ (1 in 10,000) by MFC or PCR | AML: <10⁻³ by MFC | CML: BCR-ABL ≤0.01% (MR4) or ≤0.0032% (MR4.5) | CLL: <10⁻⁴ (uMRD) | MM: <10⁻⁵ by NGF or NGS", tb_s)], ] story.append(tbl(samp_data, [4*cm, 13.4*cm])) story.append(sp(10)) # ── METHODS ─────────────────────────────────────────────── story.append(sec("4. METHODS OF MRD DETECTION")) story.append(sp(5)) meth_data = [ [Paragraph("Method", th_s), Paragraph("Principle", th_s), Paragraph("Sensitivity", th_s), Paragraph("Advantages", th_s), Paragraph("Limitations", th_s), Paragraph("Best Used In", th_s)], [Paragraph("Multiparameter Flow Cytometry\n(MFC / MPFC)", tb_b), Paragraph("Immunophenotyping by simultaneous multi-colour antibody staining. Two approaches:\n1) LAIP (Leukaemia-Associated ImmunoPheno-type) — detects patient-specific aberrant phenotype at diagnosis\n2) DfN (Different from Normal) — compares to normal BM maturation", tb_s), Paragraph("10⁻⁴ to 10⁻⁵\n(1 in 10,000 to 100,000)", tb_s), Paragraph("• Fast (hours)\n• No prior molecular data needed\n• High applicability\n• Relatively affordable\n• Detects phenotypic shifts\n• Used for ALL, AML, MM, CLL", tb_s), Paragraph("• Requires fresh viable cells\n• Lower sensitivity than NGS\n• High expertise needed\n• Phenotypic shift can cause false negatives (LAIP loss)\n• Limited standardisation", tb_s), Paragraph("B-ALL\nT-ALL\nAML\nMM\nCLL", tb_s)], [Paragraph("Real-Time Quantitative PCR\n(RT-qPCR / RQ-PCR)", tb_b), Paragraph("Amplification of:\n• Fusion gene transcripts (BCR::ABL1, ETV6::RUNX1, RUNX1::RUNX1T1)\n• Ig/TCR gene rearrangements (clono-specific primers)\n• Mutation-specific PCR (NPM1)\nFluorescent probes quantify product at each cycle. International Scale (IS) used for BCR-ABL.", tb_s), Paragraph("10⁻⁴ to 10⁻⁶\n(up to 1 in 1 million)", tb_s), Paragraph("• High sensitivity\n• Standardised (IS for CML)\n• Quantitative\n• Well-validated protocols\n• Applicable to ~40% of AML, nearly all CML and Ph+ALL", tb_s), Paragraph("• Limited to known targets only\n• Needs patient-specific design for Ig/TCR\n• Risk of contamination\n• Cannot detect clonal evolution\n• Not applicable without specific target", tb_s), Paragraph("CML ★★\nPh+ ALL\nCore binding factor AML\nNPM1-mutated AML\nALL Ig/TCR", tb_s)], [Paragraph("Droplet Digital PCR\n(ddPCR)", tb_b), Paragraph("Sample partitioned into thousands of nanodroplets before amplification; each droplet is an independent PCR reaction. Fluorescence detects positive droplets. Counts absolute molecule numbers without standard curve.", tb_s), Paragraph("10⁻⁵ to 10⁻⁶\n(1 in 100,000 to 1,000,000)", tb_s), Paragraph("• Absolute quantification\n• No standard curve needed\n• More precise than RT-qPCR\n• Less susceptible to inhibitors\n• Better reproducibility at low levels", tb_s), Paragraph("• Not yet fully standardised\n• Higher cost\n• Limited to known targets\n• Complex workflow", tb_s), Paragraph("CML (deep response)\nNPM1-AML\nPh+ ALL", tb_s)], [Paragraph("Next-Generation Sequencing\n(NGS) — Immunoseq / LymphoTrack", tb_b), Paragraph("Deep sequencing of Ig/TCR gene rearrangements using patient-specific clonotype identified at diagnosis as a unique molecular 'barcode'. Can also sequence somatic mutations (NPM1, FLT3, etc.) for leukaemia-specific MRD.", tb_s), Paragraph("10⁻⁵ to 10⁻⁷\n(1 in 100,000 to 10,000,000)\n★ Highest sensitivity", tb_s), Paragraph("• Highest sensitivity available\n• Can detect clonal evolution\n• Identifies novel MRD markers\n• Applicable to ALL (Ig/TCR) and MM\n• Treatment stratification potential", tb_s), Paragraph("• Expensive\n• Bioinformatics expertise required\n• Longer turnaround\n• Validation complex\n• False positives from clonal haematopoiesis", tb_s), Paragraph("ALL ★\nMM ★\nAML (evolving)\nCLL (IgH NGS)", tb_s)], [Paragraph("FISH\n(Fluorescence In-Situ Hybridisation)", tb_b), Paragraph("Fluorescent DNA probes hybridise to specific chromosomal sequences on interphase cells. Detects translocations, deletions, amplifications.", tb_s), Paragraph("10⁻² (1 in 100)\n(lower than MFC/PCR)", tb_s), Paragraph("• No viable cells needed\n• Works on fixed tissue\n• Detects structural abnormalities\n• Useful for specific lesions", tb_s), Paragraph("• Much lower sensitivity than MFC/PCR\n• Not ideal for quantitative MRD monitoring\n• Labour intensive\n• Cannot detect clonal evolution", tb_s), Paragraph("CML baseline\nAML diagnosis\nMRD monitoring only if PCR unavailable", tb_s)], ] meth_tbl = Table(meth_data, colWidths=[2.8*cm, 4.2*cm, 2*cm, 2.9*cm, 2.9*cm, 2.6*cm]) meth_tbl.setStyle(TableStyle([ ("BACKGROUND",(0,0),(-1,0),DARK_MAROON), ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,LIGHT_GREY]*10), ("GRID",(0,0),(-1,-1),0.4,MID_GREY), ("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4), ("LEFTPADDING",(0,0),(-1,-1),5), ("VALIGN",(0,0),(-1,-1),"TOP"), ])) story.append(meth_tbl) story.append(sp(5)) story.append(note( "★ SENSITIVITY LADDER: Morphology (1:20) → Cytogenetics/FISH (1:100) → " "Conventional Flow (1:1000) → MFC-MRD (1:10,000–100,000) → " "RT-qPCR (1:100,000–1,000,000) → NGS/ddPCR (1:1,000,000–10,000,000)\n" "NGS has highest sensitivity but MFC is most widely used clinically due to speed and cost.", bg=GOLD_LIGHT, border=GOLD)) story.append(sp(10)) # ── CLINICAL APPLICATIONS ───────────────────────────────── story.append(sec("5. CLINICAL APPLICATIONS OF MRD")) story.append(sp(5)) app_data = [ [Paragraph("Application", th_s), Paragraph("How MRD Is Used", th_s), Paragraph("Disease Example", th_s)], [Paragraph("Risk Stratification at Diagnosis", tb_b), Paragraph("Pre-treatment molecular profiling identifies MRD targets. Defines high-risk vs. standard-risk groups for treatment assignment.", tb_s), Paragraph("ALL — ETV6::RUNX1 (good), BCR::ABL1 (poor); AML — NPM1+/FLT3-ITD- (favourable)", tb_s)], [Paragraph("Response Assessment Post-Induction", tb_b), Paragraph("MRD at end of induction (Day 28/33) is the SINGLE MOST IMPORTANT prognostic factor in ALL. MRD positivity → treatment intensification; MRD negativity → de-escalation.", tb_s), Paragraph("ALL: MRD ≥10⁻³ post-induction = high risk; escalate to HSCT\nAML: MRD positivity after CR = transplant indication", tb_s)], [Paragraph("Monitoring During Maintenance", tb_b), Paragraph("Serial MRD measurements detect early molecular relapse (molecular relapse precedes morphological relapse by weeks-months). Allows pre-emptive treatment.", tb_s), Paragraph("CML: Monthly BCR-ABL monitoring; rising PCR triggers TKI switch\nALL: 3-monthly MRD during maintenance", tb_s)], [Paragraph("HSCT Decision-Making", tb_b), Paragraph("MRD positivity pre-HSCT strongly predicts post-transplant relapse. MRD status guides:\n• Whether to proceed to transplant\n• Conditioning intensity\n• Post-transplant intervention (DLI)", tb_s), Paragraph("ALL, AML: MRD+ pre-HSCT → higher relapse rate; may need reduced toxicity conditioning with early DLI plan\nCML: MRD detectable post-HSCT → trigger DLI", tb_s)], [Paragraph("Treatment-Free Remission (TFR) in CML", tb_b), Paragraph("TKI discontinuation attempted only if patient achieves sustained MRD4.5 (BCR-ABL ≤0.0032%) for ≥2 years. Monthly MRD monitoring after stopping TKI.", tb_s), Paragraph("CML: 40–50% of patients achieving deep MR can successfully stop imatinib/nilotinib. MRD rise → restart TKI immediately.", tb_s)], [Paragraph("Drug Approval Endpoint (Regulatory)", tb_b), Paragraph("FDA (2018) recognised MRD negativity as a clinically meaningful endpoint for accelerated drug approvals in haematological malignancies.", tb_s), Paragraph("MM: Daratumumab, carfilzomib approvals partially based on MRD negativity rates\nCLL: Venetoclax approvals based on uMRD endpoint", tb_s)], [Paragraph("MRD-Adapted Therapy (Future)", tb_b), Paragraph("Ongoing clinical trials use real-time MRD to adapt chemotherapy duration, HSCT decisions, and targeted agent use in a truly personalised approach.", tb_s), Paragraph("ALL UKALL2003 trial: MRD-guided reduction of treatment in standard-risk patients showed no loss of efficacy with reduced toxicity", tb_s)], ] story.append(tbl(app_data, [3.5*cm, 8*cm, 5.9*cm])) story.append(sp(10)) # ── DISEASE-SPECIFIC QUICK REFERENCE ────────────────────── story.append(sec("6. DISEASE-SPECIFIC MRD QUICK REFERENCE", MED_NAVY)) story.append(sp(5)) dis_data = [ [Paragraph("Disease", th_s), Paragraph("Gold Standard Method", th_s), Paragraph("MRD Negativity Threshold", th_s), Paragraph("Key Target", th_s), Paragraph("Clinical Action on MRD+", th_s)], [Paragraph("B-ALL", tb_b), Paragraph("MFC (6–8 colour) OR NGS (Ig/TCR clonotype) — comparable at ≥10⁻⁴", tb_s), Paragraph("<10⁻⁴ (1 in 10,000)", tb_s), Paragraph("Ig gene rearrangements; ETV6::RUNX1, BCR::ABL1, KMT2A", tb_s), Paragraph("Intensify therapy; proceed to HSCT; consider blinatumomab/inotuzumab", tb_s)], [Paragraph("T-ALL", tb_b), Paragraph("MFC (CD7/CD1a/TdT) or TCR NGS", tb_s), Paragraph("<10⁻⁴", tb_s), Paragraph("TCR gene rearrangements; NOTCH1 mutations", tb_s), Paragraph("Intensification; nelarabine-containing salvage; HSCT", tb_s)], [Paragraph("AML", tb_b), Paragraph("NPM1 qPCR ★ (best validated); MFC for others; NGS for FLT3-ITD", tb_s), Paragraph("<10⁻³ by MFC; <10⁻⁴ by PCR (NPM1)", tb_s), Paragraph("NPM1 mutation ★★; RUNX1::RUNX1T1; CBFB::MYH11; FLT3-ITD", tb_s), Paragraph("Proceed to allogeneic HSCT; venetoclax combinations; gilteritinib (FLT3+)", tb_s)], [Paragraph("CML", tb_b), Paragraph("RT-qPCR on IS (International Scale) — standardised globally", tb_s), Paragraph("MR4 (≤0.01% IS) or MR4.5 (≤0.0032% IS) for TFR", tb_s), Paragraph("BCR::ABL1 p210 (major), p190 (minor) transcripts", tb_s), Paragraph("Switch TKI (imatinib → nilotinib/dasatinib); HSCT if TKI failure; ponatinib for T315I", tb_s)], [Paragraph("CLL", tb_b), Paragraph("MFC (CD5/CD19/CD81/CD79b) or allele-specific PCR / NGS (IgH)", tb_s), Paragraph("uMRD: <10⁻⁴ (1 in 10,000)", tb_s), Paragraph("IgH VDJ clonotype; BCL2 (venetoclax target); TP53", tb_s), Paragraph("Extend venetoclax duration if MRD+; BTK inhibitor continuation; HSCT for high-risk", tb_s)], [Paragraph("Multiple Myeloma", tb_b), Paragraph("Next-Generation Flow (NGF, EuroFlow panel) or NGS (LymphoTrack)", tb_s), Paragraph("<10⁻⁵ (1 in 100,000) — deepest IMWG response", tb_s), Paragraph("CD138+ plasma cell clonotype; IgH rearrangement", tb_s), Paragraph("Consider maintenance lenalidomide; consolidation ASCT; daratumumab-based intensification", tb_s)], ] story.append(tbl(dis_data, [2.4*cm, 3.5*cm, 3*cm, 3.5*cm, 5*cm], header_col=DARK_NAVY)) story.append(sp(10)) # ── PROGNOSIS & LIMITATIONS ─────────────────────────────── story.append(sec("7. PROGNOSTIC SIGNIFICANCE & LIMITATIONS")) story.append(sp(5)) story.append(Paragraph("<b>Prognostic Significance of MRD Status:</b>", body_bold)) prog_items = [ "<b>ALL:</b> MRD is the <b>single most important independent prognostic factor</b>. Meta-analyses show MRD positivity triples the risk of haematological relapse or death over 10 years. MRD+ post-induction (Day 28/33) = HIGH RISK regardless of initial cytogenetics.", "<b>AML:</b> NPM1-mutated AML — rising NPM1 PCR (≥1 log increase) predicts relapse with lead time of 3–4 months. Allows pre-emptive venetoclax or HSCT.", "<b>CML:</b> 3-log reduction in BCR-ABL at 12 months predicts ~0% progression risk over the next 2 years (near-complete long-term disease control).", "<b>MM:</b> MRD negativity by NGF/NGS is the strongest predictor of PFS and OS, superior to conventional CR criteria. MRD negativity translates to improved OS across all treatment platforms.", "<b>CLL:</b> uMRD (<10⁻⁴) after venetoclax-obinutuzumab predicts prolonged PFS and permits time-limited treatment — paradigm-shifting for a previously 'incurable' disease.", ] for item in prog_items: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(6)) story.append(Paragraph("<b>Limitations & Pitfalls of MRD Testing:</b>", body_bold)) lim_items = [ "<b>Phenotypic shift (MFC):</b> Post-treatment leukemic cells may alter their surface antigen expression (LAIP loss), causing false-negative MRD by MFC — necessitates DfN approach", "<b>Clonal evolution:</b> New mutations not present at diagnosis can escape PCR/NGS-based MRD detection designed for original clone", "<b>Haemodilution:</b> BM aspirate samples after the first 3 mL draw are haemodiluted — underestimates true MRD level", "<b>Hematogones:</b> Regenerating benign B-cell precursors after ALL therapy can mimic MRD on MFC — requires expert interpretation (maturation pattern vs. frozen phenotype)", "<b>Sensitivity vs. applicability trade-off:</b> NGS has highest sensitivity but RT-qPCR applies to only ~40% of AML; NGS extends coverage to additional 40–50%", "<b>Standardisation gap:</b> MFC-MRD protocols vary widely between centres; RT-qPCR on IS (CML) is well-standardised but NGS MRD lacks universal standards", "<b>False positives from clonal haematopoiesis:</b> NGS-based MRD can detect clonal haematopoiesis mutations (DNMT3A, TET2) unrelated to leukaemia", ] for item in lim_items: story.append(Paragraph(f"• {item}", bullet_s)) story.append(sp(8)) # ── SUMMARY TABLE ───────────────────────────────────────── story.append(sec("8. QUICK COMPARISON — MRD METHODS AT A GLANCE", TEAL)) story.append(sp(5)) comp_data = [ [Paragraph("Method", th_s), Paragraph("Sensitivity", th_s), Paragraph("Speed", th_s), Paragraph("Cost", th_s), Paragraph("Standardised?", th_s), Paragraph("Best Disease", th_s)], [Paragraph("Morphology", tb_c), Paragraph("1:20 (5%)", tb_c), Paragraph("Hours", tb_c), Paragraph("Low", tb_c), Paragraph("Yes", tb_c), Paragraph("All (screening)", tb_c)], [Paragraph("FISH", tb_c), Paragraph("1:100 (1%)", tb_c), Paragraph("1–2 days", tb_c), Paragraph("Moderate", tb_c), Paragraph("Yes", tb_c), Paragraph("CML baseline", tb_c)], [Paragraph("MFC (6–8 colour)", tb_c), Paragraph("10⁻⁴–10⁻⁵", tb_c), Paragraph("Hours", tb_c), Paragraph("Moderate", tb_c), Paragraph("Partial (EuroFlow)", tb_c), Paragraph("ALL, AML, MM, CLL", tb_c)], [Paragraph("RT-qPCR", tb_c), Paragraph("10⁻⁵–10⁻⁶", tb_c), Paragraph("1 day", tb_c), Paragraph("Moderate", tb_c), Paragraph("Yes (IS for CML)", tb_c), Paragraph("CML ★★, ALL, NPM1-AML", tb_c)], [Paragraph("ddPCR", tb_c), Paragraph("10⁻⁵–10⁻⁶", tb_c), Paragraph("1–2 days", tb_c), Paragraph("High", tb_c), Paragraph("Partial", tb_c), Paragraph("CML deep response", tb_c)], [Paragraph("NGS / Immunoseq", tb_c), Paragraph("10⁻⁶–10⁻⁷ ★", tb_c), Paragraph("Days–weeks", tb_c), Paragraph("Very High", tb_c), Paragraph("Evolving", tb_c), Paragraph("ALL ★, MM, CLL", tb_c)], ] comp_tbl = Table(comp_data, colWidths=[3*cm, 2.5*cm, 2*cm, 2*cm, 3*cm, 4.9*cm]) comp_tbl.setStyle(TableStyle([ ("BACKGROUND",(0,0),(-1,0),TEAL), ("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,LIGHT_TEAL]*10), ("GRID",(0,0),(-1,-1),0.4,MID_GREY), ("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5), ("LEFTPADDING",(0,0),(-1,-1),5), ("VALIGN",(0,0),(-1,-1),"MIDDLE"), ("BACKGROUND",(0,6),(-1,6), colors.HexColor("#E8F4E8")), # NGS highlight ("BACKGROUND",(0,4),(-1,4), colors.HexColor("#FFF8E8")), # RT-qPCR highlight ])) story.append(comp_tbl) story.append(sp(5)) story.append(note( "⭐ RGUHS EXAM KEY POINTS:\n" "1. MRD = subclinical residual disease BELOW morphological detection threshold\n" "2. ~10⁹ leukemic cells can persist in morphological 'complete remission'\n" "3. MRD is now an INDEPENDENT prognostic indicator per WHO-HAEM5 (2022) and ELN guidelines\n" "4. RT-qPCR (BCR::ABL1 IS) = gold standard for CML | MFC = workhorse for ALL/AML | NGS = highest sensitivity\n" "5. Hematogones are the most important pitfall in MFC-based MRD assessment for ALL\n" "6. MRD-guided treatment decisions are now standard of care across ALL, AML, CML, CLL, and MM", bg=LIGHT_MAROON, border=DARK_MAROON)) story.append(sp(10)) # ── FOOTER ──────────────────────────────────────────────── story.append(HRFlowable(width="100%", thickness=1.5, color=DARK_MAROON)) story.append(sp(4)) story.append(Paragraph( "Sources: WHO Classification of Haematolymphoid Tumours 5th Edition (2022) | " "ELN AML MRD Consensus Document (Blood 2018) | " "Quick Compendium of Clinical Pathology 5th ed. | " "Tietz Textbook of Laboratory Medicine 7th ed. | " "Robbins & Kumar Basic Pathology 10th ed. | " "Leukemia 2024 — MRD-testing in haematological and solid cancers | " "PMC12079024 — MRD Detection: Clinical Diagnosis and Treatment (2025) | " "LSUHSC Laboratory MRD Detection Guide | ELN CML Guidelines (NCCN 2024)", foot_s)) doc.build(story) print("PDF created:", OUTPUT) PYEOF python3 /tmp/workspace/mrd-hematology/make_mrd_pdf.py
ls -lh /tmp/workspace/mrd-hematology/MRD_Haematology_10_Mark_RGUHS.pdf
MRD Haematology 10 Mark RGUHS
PDF Document · PDF
Create a 10 marker Pdf in md pathology exam which include types etiology microscopy cd marker and prognosis according latest who classification
Which topic should the 10-mark PDF cover?
Topic is mRD in hematology
MRD Haematology 10 Mark RGUHS
PDF Document · PDF
| Section | Content |
|---|---|
| Definition | Minimal vs. Measurable RD, ~10⁹ cells survive in morphological CR |
| WHO-HAEM5 (2022) | MRD role in B-ALL, AML, CML, CLL, MM, MDS/MPN |
| Types/Methods | MFC, RT-qPCR, ddPCR, NGS, FISH — full comparison table |
| Etiology/Context | When MRD arises, diseases involved, molecular targets |
| Sensitivity Ladder | Morphology (1:20) → NGS (1:10,000,000) |
| Clinical Applications | Risk stratification, HSCT decisions, TFR in CML, FDA endpoint |
| Disease-Specific Table | ALL, AML, CML, CLL, MM — gold standard, threshold, action on MRD+ |
| Prognosis | MRD tripling relapse risk in ALL, BCR-ABL 3-log reduction in CML, uMRD in CLL |
| Limitations | Phenotypic shift, hematogones pitfall, haemodilution, clonal evolution |
| RGUHS Key Points Box | 6 exam-ready bullet points highlighted |
Prepare a pdf on Bombay blood group for 10 marks for rguhs exam
Generate a Bombay blood group PDF using available web resources