Thyriod function test
thyroid function tests TSH T3 T4 interpretation clinical guide
Small changes in free T3 and T4 produce large changes in serum TSH - this amplification makes TSH a very sensitive marker. - Quick Compendium of Clinical Pathology, 5th ed.
| Parameter | Details |
|---|---|
| Normal range | ~0.4 - 4.0 mIU/L (lab-dependent) |
| Best use | First-line screening for thyroid dysfunction |
| Key principle | Inversely reflects thyroid hormone levels |
| Condition | TSH | Free T4 | Free T3 | rT3 |
|---|---|---|---|---|
| Primary hyperthyroidism | ↓ | ↑ | ↑ | → |
| Primary hypothyroidism | ↑ | ↓ | ↓ | →/↓ |
| Euthyroid sick syndrome | → (or ↓) | →/↓ | ↓ | ↑ |
| T3 toxicosis | ↓ | → | ↑ | → |
| Secondary (central) hypothyroidism | →/↓ | ↓ | ↓ | - |
| Subclinical hypothyroidism | ↑ | → | → | - |
| Subclinical hyperthyroidism | ↓ | → | → | - |
| Effect | Drug |
|---|---|
| ↓ fT4 + ↑ TSH (true hypothyroidism) | Iodine (amiodarone, contrast media), lithium, tyrosine kinase inhibitors, interferon-α, checkpoint inhibitors |
| ↓ TSH (suppress secretion) | Glucocorticoids, dopamine |
| Multiple mechanisms, TSH normal | Phenytoin |
| ↓ Total T4 only (↓ TBG) | Androgens |
| Inhibit T4 binding to TBG | High-dose furosemide, salicylates |
| ↑ fT4 + ↓ TSH (true hyperthyroidism) | Iodine (amiodarone), some immune modulators |
| Clinical Question | Best Test |
|---|---|
| Screen for thyroid dysfunction | TSH |
| Confirm hypo/hyperthyroidism | TSH + Free T4 |
| Suspect T3 toxicosis | TSH + Free T3 |
| Monitor levothyroxine therapy | TSH (after steady state ~2 months) |
| Suspect central hypothyroidism | TSH + Free T4 combined |
| TBG abnormality suspected | Free T4/T3 (not total) |
| Differentiate thyroiditis from Graves | RAIU |
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" &…
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" &…
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" &…
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" &…
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" &…
| Question | Exam Year |
|---|---|
| Clearance tests to assess renal function | June 2023 |
| Blood and urine abnormalities of chronic kidney disease | Dec. 2022 |
| Hepatorenal syndrome | Nov. 2021 |
| Renal calculi | Oct. 2019 |
| Etiopathology and lab diagnosis of acute renal failure | Oct. 2014 |
| Etiopathology and lab diagnosis of chronic renal failure | April 2014 |
| Describe renal function tests | April 2011 |
| Laboratory diagnosis of renal failure | Nov. 2009 |
| Creatinine clearance tests | Sep/Oct 2004 |
| Rank | Topic | No. of Times Asked |
|---|---|---|
| 1 | Immunofluorescence in renal/glomerular diseases | 10+ times |
| 2 | Mechanisms/pathogenesis of glomerular injury | 8+ times |
| 3 | Urinary sediment/casts examination | 8+ times |
| 4 | Cystic diseases of kidney / ADPKD | 6+ times |
| 5 | Lupus nephritis - classification and morphology | 5+ times |
| 6 | Renal cell carcinoma - classification/variants | 5+ times |
| 7 | Pediatric renal tumors (Wilms, etc.) | 5+ times |
| 8 | Diabetic nephropathy | 5+ times |
| 9 | Renal failure - lab diagnosis | 4+ times |
| 10 | Podocytopathies | 3+ times |
| 11 | Hereditary/familial nephritis (Alport) | 3+ times |
| 12 | MPGN | 3+ times |
Create a study guide PDF on immunofluorescence in renal diseases
mkdir -p /home/daytona/workspace/renal-if-study-guide && ls /home/daytona/worksp…
~/renal-if-study-guide/create_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame
OUTPUT = "/home/daytona/workspace/renal-if-study-guide/Immunofluorescence_Renal_Diseases_Study_Guide.pdf"
# ─── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1a3a5c")
MID_BLUE = colors.HexColor("#2c5f8a")
LIGHT_BLUE = colors.HexColor("#d6e8f7")
ACCENT = colors.HexColor("#e8a020")
LIGHT_GREY = colors.HexColor("#f5f5f5")
MID_GREY = colors.HexColor("#cccccc")
GREEN = colors.HexColor("#2d6a4f")
LIGHT_GREEN = colors.HexColor("#d8f3dc")
RED = colors.HexColor("#9b2226")
LIGHT_RED = colors.HexColor("#fde8e8")
PURPLE = colors.HexColor("#5c3d8f")
LIGHT_PURP = colors.HexColor("#ede0ff")
WHITE = colors.white
BLACK = colors.black
# ─── Styles ──────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
TITLE = S("TITLE", fontSize=28, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, spaceAfter=4)
SUBTITLE = S("SUBTITLE", fontSize=14, textColor=LIGHT_BLUE, fontName="Helvetica",
alignment=TA_CENTER, spaceAfter=8)
META = S("META", fontSize=10, textColor=LIGHT_BLUE, fontName="Helvetica",
alignment=TA_CENTER, spaceAfter=4)
H1 = S("H1", fontSize=18, textColor=WHITE, fontName="Helvetica-Bold",
spaceAfter=6, spaceBefore=12)
H2 = S("H2", fontSize=13, textColor=DARK_BLUE, fontName="Helvetica-Bold",
spaceAfter=4, spaceBefore=10)
H3 = S("H3", fontSize=11, textColor=MID_BLUE, fontName="Helvetica-Bold",
spaceAfter=3, spaceBefore=8)
BODY = S("BODY", fontSize=9.5, textColor=BLACK, fontName="Helvetica",
spaceAfter=4, leading=14, alignment=TA_JUSTIFY)
BODY_SM = S("BODY_SM", fontSize=9, textColor=BLACK, fontName="Helvetica",
spaceAfter=3, leading=13)
BULLET = S("BULLET", fontSize=9.5, textColor=BLACK, fontName="Helvetica",
spaceAfter=3, leftIndent=14, leading=14,
bulletText="\u2022", bulletIndent=4)
BULLET2 = S("BULLET2", fontSize=9, textColor=colors.HexColor("#333333"),
fontName="Helvetica", spaceAfter=2, leftIndent=28, leading=13,
bulletText="\u25e6", bulletIndent=18)
KEY = S("KEY", fontSize=10, textColor=RED, fontName="Helvetica-Bold",
spaceAfter=3, leading=14)
NOTE = S("NOTE", fontSize=9, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique", spaceAfter=3, leading=13)
TBL_HDR = S("TBL_HDR", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=12)
TBL_CELL = S("TBL_CELL", fontSize=8.5, textColor=BLACK, fontName="Helvetica",
alignment=TA_CENTER, leading=11)
TBL_CELL_L = S("TBL_CELL_L", fontSize=8.5, textColor=BLACK, fontName="Helvetica",
alignment=TA_LEFT, leading=11)
BOX_TXT = S("BOX_TXT", fontSize=9.5, textColor=DARK_BLUE, fontName="Helvetica",
spaceAfter=4, leading=14)
BOX_BOLD = S("BOX_BOLD", fontSize=10, textColor=DARK_BLUE, fontName="Helvetica-Bold",
spaceAfter=4, leading=14)
# ─── Helper builders ─────────────────────────────────────────────────────────
def hr(color=MID_BLUE, thickness=1):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4, spaceBefore=2)
def section_banner(text, bg=DARK_BLUE, fg=WHITE):
data = [[Paragraph(text, S("_bh", fontSize=14, textColor=fg,
fontName="Helvetica-Bold", alignment=TA_LEFT))]]
t = Table(data, colWidths=["100%"])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [4, 4, 4, 4]),
]))
return t
def info_box(title, content_paras, bg=LIGHT_BLUE, border=MID_BLUE):
rows = []
if title:
rows.append([Paragraph(title, BOX_BOLD)])
for p in content_paras:
rows.append([p])
t = Table([[r[0]] for r in rows], colWidths=["100%"])
ts = [
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.2, border),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]
t.setStyle(TableStyle(ts))
return t
def two_col(left_items, right_items, widths=None):
if widths is None:
widths = [9*cm, 9*cm]
left_tbl = [[p] for p in left_items]
right_tbl = [[p] for p in right_items]
left_t = Table(left_tbl, colWidths=[widths[0]])
right_t = Table(right_tbl, colWidths=[widths[1]])
left_t.setStyle(TableStyle([("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
right_t.setStyle(TableStyle([("TOPPADDING",(0,0),(-1,-1),1),("BOTTOMPADDING",(0,0),(-1,-1),1)]))
outer = Table([[left_t, right_t]], colWidths=widths)
outer.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0),(-1,-1),0),
("BOTTOMPADDING",(0,0),(-1,-1),0),
("LEFTPADDING",(0,0),(-1,-1),0),
("RIGHTPADDING",(0,0),(-1,-1),4),
]))
return outer
# ─── Document setup ──────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2*cm,
title="Immunofluorescence in Renal Diseases - Study Guide",
author="Orris Medical Education"
)
story = []
W = 17*cm # usable width
# ═══════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ═══════════════════════════════════════════════════════════════════════════
cover_bg = Table(
[[Paragraph("IMMUNOFLUORESCENCE", TITLE)],
[Paragraph("IN RENAL DISEASES", TITLE)],
[Spacer(1, 0.3*cm)],
[Paragraph("Comprehensive Study Guide for MD Pathology", SUBTITLE)],
[Paragraph("Postgraduate Examination Series", META)],
[Spacer(1, 0.5*cm)],
[hr(ACCENT, 2)],
[Spacer(1, 0.3*cm)],
[Paragraph("Topics Covered:", META)],
[Paragraph("Principles • IF Patterns • Disease-wise Summary • Quick Reference Tables", META)],
[Spacer(1, 0.3*cm)],
[Paragraph("Aligned with Dr. NTR UHS (AP) & KNRUHS (Telangana) Exam Syllabus", META)],
],
colWidths=[W]
)
cover_bg.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 18),
("BOTTOMPADDING", (0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
]))
story.append(cover_bg)
story.append(Spacer(1, 1*cm))
# Accent strip
strip = Table([[""]], colWidths=[W])
strip.setStyle(TableStyle([("BACKGROUND",(0,0),(-1,-1),ACCENT),
("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3)]))
story.append(strip)
story.append(Spacer(1, 0.6*cm))
# Intro blurb on cover
story.append(info_box(
"Why Immunofluorescence?",
[Paragraph("Immunofluorescence (IF) microscopy is the CORNERSTONE of renal biopsy interpretation. "
"It identifies the type, location, and pattern of immune deposits - directly guiding diagnosis "
"and treatment. Along with light microscopy (LM) and electron microscopy (EM), it forms the "
"TRIAD of renal biopsy evaluation.", BOX_TXT),
Paragraph("IF has been asked in EVERY AP/Telangana MD Pathology exam since 1996. "
"Master it thoroughly.", BOX_BOLD)],
bg=LIGHT_BLUE, border=MID_BLUE
))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 1: PRINCIPLES OF IMMUNOFLUORESCENCE
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 1: PRINCIPLES OF IMMUNOFLUORESCENCE IN RENAL BIOPSY"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("What is Immunofluorescence?", H2))
story.append(Paragraph(
"Immunofluorescence (IF) microscopy uses fluorochrome-labelled antibodies to detect and localize specific "
"proteins (immunoglobulins, complement components) in tissue sections. In renal pathology, it identifies "
"immune deposits in the glomerulus, tubular basement membranes (TBM), and interstitium.", BODY))
story.append(Paragraph("Types of IF Used in Renal Pathology", H2))
data = [
[Paragraph("Type", TBL_HDR), Paragraph("Technique", TBL_HDR), Paragraph("Tissue Required", TBL_HDR), Paragraph("Notes", TBL_HDR)],
[Paragraph("Direct IF (DIF)", TBL_CELL_L), Paragraph("Fluorescent Ab directly applied to tissue", TBL_CELL_L),
Paragraph("Fresh-frozen (snap frozen)", TBL_CELL_L), Paragraph("Gold standard for renal biopsy", TBL_CELL_L)],
[Paragraph("Indirect IF (IIF)", TBL_CELL_L), Paragraph("Unlabelled primary Ab + fluorescent secondary Ab", TBL_CELL_L),
Paragraph("Serum (for ANCA, anti-GBM)", TBL_CELL_L), Paragraph("Used in systemic disease workup", TBL_CELL_L)],
[Paragraph("Paraffin IF", TBL_CELL_L), Paragraph("IF after pronase digestion of paraffin sections", TBL_CELL_L),
Paragraph("Formalin-fixed paraffin", TBL_CELL_L), Paragraph("Useful when fresh tissue unavailable; unmasks light-chain restriction", TBL_CELL_L)],
]
t = Table(data, colWidths=[3.5*cm, 4.5*cm, 4*cm, 5*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("BACKGROUND", (0,1), (-1,1), LIGHT_BLUE),
("BACKGROUND", (0,2), (-1,2), WHITE),
("BACKGROUND", (0,3), (-1,3), LIGHT_BLUE),
("BOX", (0,0), (-1,-1), 0.8, MID_BLUE),
("INNERGRID", (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), ("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t)
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Standard Panel of Antibodies Used in Renal IF", H2))
story.append(Paragraph("A standard renal biopsy IF panel stains for:", BODY))
panel_data = [
[Paragraph("Antibody", TBL_HDR), Paragraph("What it detects", TBL_HDR), Paragraph("Clinical significance", TBL_HDR)],
[Paragraph("IgG", TBL_CELL_L), Paragraph("Immunoglobulin G", TBL_CELL_L), Paragraph("Membranous nephropathy, post-infectious GN, lupus nephritis", TBL_CELL_L)],
[Paragraph("IgA", TBL_CELL_L), Paragraph("Immunoglobulin A", TBL_CELL_L), Paragraph("IgA nephropathy (dominant), lupus nephritis", TBL_CELL_L)],
[Paragraph("IgM", TBL_CELL_L), Paragraph("Immunoglobulin M", TBL_CELL_L), Paragraph("IgM nephropathy, part of full-house pattern in lupus", TBL_CELL_L)],
[Paragraph("C3", TBL_CELL_L), Paragraph("Complement component 3", TBL_CELL_L), Paragraph("C3 glomerulopathy, post-infectious GN, MPGN", TBL_CELL_L)],
[Paragraph("C1q", TBL_CELL_L), Paragraph("Complement component 1q", TBL_CELL_L), Paragraph("Lupus nephritis (classical pathway), C1q nephropathy", TBL_CELL_L)],
[Paragraph("C4", TBL_CELL_L), Paragraph("Complement component 4", TBL_CELL_L), Paragraph("Classical pathway activation (lupus, infection)", TBL_CELL_L)],
[Paragraph("Kappa (κ)", TBL_CELL_L), Paragraph("Light chain kappa", TBL_CELL_L), Paragraph("Light chain cast nephropathy, AL amyloid, monoclonal GN", TBL_CELL_L)],
[Paragraph("Lambda (λ)", TBL_CELL_L), Paragraph("Light chain lambda", TBL_CELL_L), Paragraph("Light chain restriction assessment", TBL_CELL_L)],
[Paragraph("Fibrinogen", TBL_CELL_L), Paragraph("Fibrin", TBL_CELL_L), Paragraph("Crescents, TMA, fibrinoid necrosis", TBL_CELL_L)],
[Paragraph("Albumin", TBL_CELL_L), Paragraph("Serum albumin", TBL_CELL_L), Paragraph("Non-specific trapping; control", TBL_CELL_L)],
]
t2 = Table(panel_data, colWidths=[2.8*cm, 4*cm, 10.2*cm])
t2.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, WHITE]),
("BOX", (0,0), (-1,-1), 0.8, MID_BLUE),
("INNERGRID", (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), ("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t2)
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Key IF Patterns - The Big Three", H2))
pattern_data = [
[Paragraph("Pattern", TBL_HDR), Paragraph("Appearance", TBL_HDR), Paragraph("Mechanism", TBL_HDR), Paragraph("Classic Example", TBL_HDR)],
[Paragraph("LINEAR", TBL_CELL), Paragraph("Smooth, continuous fluorescence along GBM", TBL_CELL),
Paragraph("Anti-GBM antibody binding uniformly across entire GBM", TBL_CELL), Paragraph("Anti-GBM disease (Goodpasture syndrome)", TBL_CELL)],
[Paragraph("GRANULAR", TBL_CELL), Paragraph("Lumpy, discontinuous, coarse or fine granules", TBL_CELL),
Paragraph("Immune complex deposition - in situ or circulating complexes", TBL_CELL), Paragraph("Membranous nephropathy, Post-infectious GN, IgA nephropathy", TBL_CELL)],
[Paragraph("NEGATIVE / PAUCI-IMMUNE", TBL_CELL), Paragraph("No staining or minimal (<2+ trace)", TBL_CELL),
Paragraph("No immune complexes; neutrophil-mediated injury (ANCA)", TBL_CELL), Paragraph("ANCA-associated GN (GPA, MPA, EGPA)", TBL_CELL)],
]
t3 = Table(pattern_data, colWidths=[3*cm, 4.2*cm, 5*cm, 4.8*cm])
t3.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("BACKGROUND", (0,1), (-1,1), LIGHT_RED),
("BACKGROUND", (0,2), (-1,2), LIGHT_GREEN),
("BACKGROUND", (0,3), (-1,3), LIGHT_PURP),
("BOX", (0,0), (-1,-1), 1, MID_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.5, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 5), ("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t3)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Location of Deposits - Key Terms", H2))
loc_data = [
[Paragraph("Location", TBL_HDR), Paragraph("Abbreviation", TBL_HDR), Paragraph("Position", TBL_HDR), Paragraph("Key Disease", TBL_HDR)],
[Paragraph("Subepithelial", TBL_CELL), Paragraph("SE", TBL_CELL), Paragraph("Between GBM and podocyte (epithelium)", TBL_CELL),
Paragraph("Membranous nephropathy; 'Humps' in post-infectious GN", TBL_CELL)],
[Paragraph("Subendothelial", TBL_CELL), Paragraph("SEN", TBL_CELL), Paragraph("Between GBM and endothelium", TBL_CELL),
Paragraph("MPGN type I, Lupus class III/IV, Diffuse proliferative GN", TBL_CELL)],
[Paragraph("Mesangial", TBL_CELL), Paragraph("Mes", TBL_CELL), Paragraph("Within mesangium", TBL_CELL),
Paragraph("IgA nephropathy, lupus class I/II", TBL_CELL)],
[Paragraph("Intramembranous", TBL_CELL), Paragraph("IM", TBL_CELL), Paragraph("Within GBM", TBL_CELL),
Paragraph("Dense deposit disease (MPGN type II)", TBL_CELL)],
[Paragraph("TBM (tubular)", TBL_CELL), Paragraph("TBM", TBL_CELL), Paragraph("Along tubular basement membranes", TBL_CELL),
Paragraph("Lupus nephritis, anti-TBM disease, drug injury", TBL_CELL)],
]
t4 = Table(loc_data, colWidths=[3.5*cm, 2.5*cm, 5*cm, 6*cm])
t4.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, WHITE]),
("BOX", (0,0), (-1,-1), 0.8, MID_BLUE),
("INNERGRID", (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), ("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(t4)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 2: DISEASE-WISE IF PATTERNS
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 2: DISEASE-WISE IMMUNOFLUORESCENCE PATTERNS"))
story.append(Spacer(1, 0.3*cm))
# ── 2A: MASTER REFERENCE TABLE ──────────────────────────────────────────────
story.append(Paragraph("Master Reference Table - IF in Primary Glomerulonephritides", H2))
story.append(Paragraph("Source: Robbins, Cotran & Kumar Pathologic Basis of Disease; Comprehensive Clinical Nephrology 7th Ed.", NOTE))
story.append(Spacer(1, 0.2*cm))
master_data = [
[Paragraph("Disease", TBL_HDR),
Paragraph("Clinical Syndrome", TBL_HDR),
Paragraph("IF Pattern", TBL_HDR),
Paragraph("Key Deposits", TBL_HDR),
Paragraph("Location", TBL_HDR)],
# Row 1
[Paragraph("Post-infectious GN\n(Post-streptococcal)", TBL_CELL_L),
Paragraph("Nephritic syndrome", TBL_CELL),
Paragraph("GRANULAR", TBL_CELL),
Paragraph("IgG + C3\n(±IgA)", TBL_CELL),
Paragraph("GBM + Mesangium; subepithelial 'humps'", TBL_CELL_L)],
# Row 2
[Paragraph("Crescentic (RPGN)\nType I - Anti-GBM", TBL_CELL_L),
Paragraph("Nephritic + rapid progression", TBL_CELL),
Paragraph("LINEAR", TBL_CELL),
Paragraph("IgG + C3", TBL_CELL),
Paragraph("Along entire GBM", TBL_CELL_L)],
# Row 3
[Paragraph("Crescentic (RPGN)\nType II - Immune complex", TBL_CELL_L),
Paragraph("Nephritic + rapid progression", TBL_CELL),
Paragraph("GRANULAR", TBL_CELL),
Paragraph("IgG + C3\n(varies by cause)", TBL_CELL),
Paragraph("GBM / mesangium (varies)", TBL_CELL_L)],
# Row 4
[Paragraph("Crescentic (RPGN)\nType III - ANCA", TBL_CELL_L),
Paragraph("Nephritic + rapid progression", TBL_CELL),
Paragraph("NEGATIVE\n(Pauci-immune)", TBL_CELL),
Paragraph("No significant deposits", TBL_CELL),
Paragraph("No immune deposits", TBL_CELL_L)],
# Row 5
[Paragraph("Membranous Nephropathy", TBL_CELL_L),
Paragraph("Nephrotic syndrome", TBL_CELL),
Paragraph("GRANULAR\n(diffuse)", TBL_CELL),
Paragraph("IgG + C3", TBL_CELL),
Paragraph("Subepithelial (along capillary wall)", TBL_CELL_L)],
# Row 6
[Paragraph("Minimal Change Disease\n(MCD)", TBL_CELL_L),
Paragraph("Nephrotic syndrome", TBL_CELL),
Paragraph("NEGATIVE\nor fine granular IgG (podocyte)", TBL_CELL),
Paragraph("No deposits\n(or trace IgM)", TBL_CELL),
Paragraph("No deposits on EM; foot process effacement only", TBL_CELL_L)],
# Row 7
[Paragraph("Focal Segmental\nGlomerulosclerosis (FSGS)", TBL_CELL_L),
Paragraph("Nephrotic syndrome", TBL_CELL),
Paragraph("IgM + C3\n(nonspecific)", TBL_CELL),
Paragraph("IgM + C3\n(segmental)", TBL_CELL),
Paragraph("Sclerotic segments (non-specific trapping)", TBL_CELL_L)],
# Row 8
[Paragraph("MPGN Type I\n(Immune complex)", TBL_CELL_L),
Paragraph("Nephritic / Nephrotic", TBL_CELL),
Paragraph("GRANULAR", TBL_CELL),
Paragraph("IgG + C3\n+ C1q + C4", TBL_CELL),
Paragraph("Subendothelial + mesangium", TBL_CELL_L)],
# Row 9
[Paragraph("Dense Deposit Disease\n(MPGN Type II / C3GN)", TBL_CELL_L),
Paragraph("Hematuria / Nephritic", TBL_CELL),
Paragraph("C3 ONLY\n(no Ig, no C1q/C4)", TBL_CELL),
Paragraph("C3 (dominant)", TBL_CELL),
Paragraph("Intramembranous dense deposits on EM", TBL_CELL_L)],
# Row 10
[Paragraph("IgA Nephropathy\n(Berger Disease)", TBL_CELL_L),
Paragraph("Recurrent hematuria / proteinuria", TBL_CELL),
Paragraph("GRANULAR\nmesangial", TBL_CELL),
Paragraph("IgA (dominant)\n+ IgG, IgM, C3", TBL_CELL),
Paragraph("Mesangium (±paramesangial)", TBL_CELL_L)],
]
t_master = Table(master_data, colWidths=[3.8*cm, 3*cm, 3*cm, 3*cm, 4.2*cm])
ts_master = [
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS", (0,1), (-1,-1), [LIGHT_GREY, WHITE]),
("BOX", (0,0), (-1,-1), 1, MID_BLUE),
("INNERGRID", (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), 4), ("RIGHTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
# Colour-code the IF pattern column
("BACKGROUND", (2,2), (2,2), LIGHT_GREEN), # post-infectious = granular
("BACKGROUND", (2,3), (2,3), LIGHT_RED), # anti-GBM = linear (red warning)
("BACKGROUND", (2,4), (2,4), LIGHT_GREEN), # immune complex RPGN
("BACKGROUND", (2,5), (2,5), LIGHT_PURP), # ANCA negative = purple
("BACKGROUND", (2,6), (2,6), LIGHT_GREEN), # MN granular
("BACKGROUND", (2,7), (2,7), LIGHT_PURP), # MCD negative
("BACKGROUND", (2,9), (2,9), LIGHT_BLUE), # C3 only
("BACKGROUND", (2,10), (2,10), LIGHT_GREEN), # IgA
]
t_master.setStyle(TableStyle(ts_master))
story.append(t_master)
story.append(Spacer(1, 0.4*cm))
# colour key
key_data = [[
Paragraph("<font color='#2d6a4f'><b>GREEN</b></font> = Granular (immune complex)", BODY_SM),
Paragraph("<font color='#9b2226'><b>RED</b></font> = Linear (anti-GBM)", BODY_SM),
Paragraph("<font color='#5c3d8f'><b>PURPLE</b></font> = Negative/pauci-immune", BODY_SM),
Paragraph("<font color='#2c5f8a'><b>BLUE</b></font> = Complement-dominant", BODY_SM),
]]
key_t = Table(key_data, colWidths=[4.25*cm, 4.25*cm, 4.25*cm, 4.25*cm])
key_t.setStyle(TableStyle([("TOPPADDING",(0,0),(-1,-1),2),("BOTTOMPADDING",(0,0),(-1,-1),2)]))
story.append(key_t)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 3: DISEASE-SPECIFIC DETAILED NOTES
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 3: DISEASE-SPECIFIC DETAILED NOTES"))
story.append(Spacer(1, 0.3*cm))
# ── IgA Nephropathy ──────────────────────────────────────────────────────
story.append(Paragraph("1. IgA Nephropathy (Berger Disease)", H2))
story.append(hr(ACCENT))
story.append(info_box(
"HALLMARK: Dominant mesangial IgA deposits",
[Paragraph("Diagnosis requires <b>dominant or codominant IgA</b> on IF - this is the DEFINING criterion.", BOX_TXT),
Paragraph("No other primary glomerular disease shows dominant IgA staining.", BOX_TXT)],
bg=LIGHT_GREEN, border=GREEN
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("IF Findings:", H3))
items = [
("IgA", "2-3+ (dominant/codominant)", "Mesangium (±paramesangial)"),
("IgG", "0 to 1+ (minor)", "Mesangium"),
("IgM", "0 to 1+ (minor)", "Mesangium"),
("C3", "1-2+", "Mesangium"),
("C1q", "Absent or trace", ""),
("C4", "Absent or trace", "Classical pathway NOT activated"),
]
ifdata = [[Paragraph("Antibody", TBL_HDR), Paragraph("Intensity", TBL_HDR), Paragraph("Location / Note", TBL_HDR)]]
for ab, inten, loc in items:
ifdata.append([Paragraph(ab, TBL_CELL_L), Paragraph(inten, TBL_CELL), Paragraph(loc, TBL_CELL_L)])
t_iga = Table(ifdata, colWidths=[3*cm, 5*cm, 9*cm])
t_iga.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),MID_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("BOX",(0,0),(-1,-1),0.8,MID_BLUE),("INNERGRID",(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),("RIGHTPADDING",(0,0),(-1,-1),5),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_iga)
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("LM: Focal mesangial proliferative GN; mesangial widening", BODY_SM))
story.append(Paragraph("EM: Mesangial and paramesangial electron-dense deposits; no subendothelial or subepithelial deposits", BODY_SM))
story.append(Paragraph("Key point: Absence of subendothelial deposits distinguishes IgA nephropathy from lupus class III/IV. "
"Very large mesangial deposits on EM can suggest IgA nephropathy even without IF.", NOTE))
story.append(Spacer(1, 0.4*cm))
# ── Membranous Nephropathy ──────────────────────────────────────────────────
story.append(Paragraph("2. Membranous Nephropathy (MN)", H2))
story.append(hr(ACCENT))
story.append(info_box(
"HALLMARK: Granular subepithelial IgG + C3 in a 'string of pearls' pattern along capillary walls",
[Paragraph("Most common cause of nephrotic syndrome in adults. PLA2R antibody positive in ~70% of primary MN.", BOX_TXT)],
bg=LIGHT_GREEN, border=GREEN
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("IF Findings:", H3))
story.append(Paragraph("IgG: 3-4+ granular, diffuse along capillary walls (subepithelial)", BODY))
story.append(Paragraph("C3: 2-3+ granular, same pattern as IgG", BODY))
story.append(Paragraph("IgA + IgM: Absent in primary MN; presence suggests secondary MN (lupus, HBV, drugs)", BODY))
story.append(Paragraph("C1q: Usually absent in primary; present in secondary (lupus)", BODY))
story.append(Paragraph("Light chains: Polyclonal kappa and lambda", BODY))
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph("Stages of MN (Jones silver stain + IF):", H3))
stages = [
("Stage I", "Small, scattered subepithelial deposits; spikes not visible on LM; IF positive"),
("Stage II", "Spike formation on GBM (Jones silver); deposits between spikes; IF strongly positive"),
("Stage III", "Deposits enclosed within GBM ('dome' formation); thickened GBM; IF still positive"),
("Stage IV", "Sclerosis; deposits may become pale/negative; GBM irregularly thickened"),
]
for stg, desc in stages:
story.append(Paragraph(f"<b>{stg}:</b> {desc}", BULLET))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Primary vs Secondary MN on IF:", H3))
pvsdata = [
[Paragraph("Feature", TBL_HDR), Paragraph("Primary MN", TBL_HDR), Paragraph("Secondary MN", TBL_HDR)],
[Paragraph("IgA, IgM", TBL_CELL_L), Paragraph("Absent", TBL_CELL), Paragraph("May be present", TBL_CELL)],
[Paragraph("C1q", TBL_CELL_L), Paragraph("Absent", TBL_CELL), Paragraph("May be present (lupus)", TBL_CELL)],
[Paragraph("Light chains", TBL_CELL_L), Paragraph("Polyclonal", TBL_CELL), Paragraph("Monotypic if MGRS", TBL_CELL)],
[Paragraph("PLA2R IHC", TBL_CELL_L), Paragraph("Positive ~70%", TBL_CELL), Paragraph("Negative", TBL_CELL)],
]
t_pvs = Table(pvsdata, colWidths=[5*cm, 6*cm, 6*cm])
t_pvs.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),MID_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("BOX",(0,0),(-1,-1),0.8,MID_BLUE),("INNERGRID",(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),("RIGHTPADDING",(0,0),(-1,-1),5),
]))
story.append(t_pvs)
story.append(Spacer(1, 0.4*cm))
# ── Lupus Nephritis ──────────────────────────────────────────────────────
story.append(Paragraph("3. Lupus Nephritis (LN)", H2))
story.append(hr(ACCENT))
story.append(info_box(
"HALLMARK: 'Full-House' pattern - IgG, IgA, IgM, C3, and C1q ALL positive",
[Paragraph("This simultaneous positivity of all 5 markers is virtually pathognomonic of Lupus Nephritis. "
"Classical pathway complement activation (C1q present) is the key distinguishing feature.", BOX_TXT),
Paragraph("Tubuloreticular inclusions (TRI) on EM - 'interferon footprints' - are characteristic of lupus.", BOX_TXT)],
bg=LIGHT_RED, border=RED
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("ISN/RPS Classification of Lupus Nephritis - IF Correlation:", H3))
ln_class = [
[Paragraph("Class", TBL_HDR), Paragraph("LM", TBL_HDR), Paragraph("IF Pattern", TBL_HDR), Paragraph("EM Deposits", TBL_HDR)],
[Paragraph("Class I\nMinimal mesangial", TBL_CELL), Paragraph("Normal", TBL_CELL),
Paragraph("Mesangial IgG (full-house pattern)", TBL_CELL), Paragraph("Mesangial", TBL_CELL)],
[Paragraph("Class II\nMesangial proliferative", TBL_CELL), Paragraph("Mesangial hypercellularity", TBL_CELL),
Paragraph("Mesangial IgG, IgA, IgM, C3, C1q", TBL_CELL), Paragraph("Mesangial", TBL_CELL)],
[Paragraph("Class III\nFocal proliferative\n(<50% glomeruli)", TBL_CELL), Paragraph("Focal endocapillary proliferation, necrosis", TBL_CELL),
Paragraph("Subendothelial + mesangial; full-house", TBL_CELL), Paragraph("Subendothelial + mesangial", TBL_CELL)],
[Paragraph("Class IV\nDiffuse proliferative\n(>50% glomeruli)", TBL_CELL), Paragraph("Diffuse proliferation, wire-loop lesions", TBL_CELL),
Paragraph("Subendothelial (dominant); full-house pattern; 'wire-loop' = massive subendothelial deposits", TBL_CELL), Paragraph("Subendothelial (massive)", TBL_CELL)],
[Paragraph("Class V\nMembranous LN", TBL_CELL), Paragraph("Thickened capillary walls", TBL_CELL),
Paragraph("Subepithelial granular IgG; full-house", TBL_CELL), Paragraph("Subepithelial", TBL_CELL)],
[Paragraph("Class VI\nAdvanced sclerosing\n(>90% sclerosis)", TBL_CELL), Paragraph("Global sclerosis", TBL_CELL),
Paragraph("Pale/negative (burnt out)", TBL_CELL), Paragraph("Non-specific", TBL_CELL)],
]
t_ln = Table(ln_class, colWidths=[3.2*cm, 3.5*cm, 5.5*cm, 4.8*cm])
t_ln.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),RED),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_RED, WHITE]),
("BOX",(0,0),(-1,-1),1,RED),("INNERGRID",(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),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_ln)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Wire-loop lesions = massive subendothelial deposits of IgG seen on LM (PAS/silver stain) corresponding to "
"intense granular subendothelial staining on IF - pathognomonic of Class IV LN.", NOTE))
story.append(PageBreak())
# ── Post-infectious GN ──────────────────────────────────────────────────
story.append(Paragraph("4. Post-infectious (Post-streptococcal) GN", H2))
story.append(hr(ACCENT))
story.append(info_box(
"HALLMARK: Coarse granular 'starry sky' IgG + C3 in GBM and mesangium; subepithelial 'humps' on EM",
[Paragraph("Group A beta-hemolytic streptococcus (nephritogenic strains: types 1, 4, 12). "
"Latent period: 1-4 weeks post-pharyngitis, 2-6 weeks post-skin infection.", BOX_TXT)],
bg=LIGHT_GREEN, border=GREEN
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Temporal sequence of IF findings:", H3))
story.append(Paragraph("Early: Subendothelial deposits (C3, IgG) - before 'humps' form", BULLET))
story.append(Paragraph("Classic: Coarse granular IgG + C3 in mesangium and GBM (capillary walls)", BULLET))
story.append(Paragraph("Late (healing): Deposits disappear; C3 persists longer than IgG", BULLET))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Complement profile: Low serum C3 (consumed by alternative pathway activation) with normal C4 - "
"distinguishes from lupus where both C3 and C4 are low.", BODY))
story.append(Spacer(1, 0.4*cm))
# ── RPGN / Crescentic GN ──────────────────────────────────────────────────
story.append(Paragraph("5. Rapidly Progressive (Crescentic) GN - RPGN", H2))
story.append(hr(ACCENT))
story.append(Paragraph("RPGN is classified into 3 types based on IF - this is the MOST IMPORTANT IF-based classification in nephropathology:", BODY))
story.append(Spacer(1, 0.2*cm))
rpgn_data = [
[Paragraph("Type", TBL_HDR), Paragraph("IF Pattern", TBL_HDR), Paragraph("Pathogenesis", TBL_HDR),
Paragraph("Disease Examples", TBL_HDR), Paragraph("Serology", TBL_HDR)],
[Paragraph("Type I", TBL_CELL), Paragraph("LINEAR IgG + C3 along GBM", TBL_CELL),
Paragraph("Anti-GBM antibody (antibody vs type IV collagen alpha-3 chain)", TBL_CELL),
Paragraph("Goodpasture syndrome\n(lung + kidney)\nAnti-GBM GN (kidney only)", TBL_CELL),
Paragraph("Anti-GBM Ab positive\nANCA negative", TBL_CELL)],
[Paragraph("Type II", TBL_CELL), Paragraph("GRANULAR IgG + C3\n(immune complex)", TBL_CELL),
Paragraph("Immune complex-mediated injury (various antigens)", TBL_CELL),
Paragraph("Post-infectious GN\nLupus nephritis\nIgA nephropathy\nIgA vasculitis", TBL_CELL),
Paragraph("Varies by cause\n(e.g. ANA, dsDNA)", TBL_CELL)],
[Paragraph("Type III", TBL_CELL), Paragraph("NEGATIVE / PAUCI-IMMUNE\n(<2+ by IF)", TBL_CELL),
Paragraph("ANCA-mediated neutrophil degranulation - no immune complex formation", TBL_CELL),
Paragraph("GPA (Wegener)\nMPA\nEGPA (Churg-Strauss)", TBL_CELL),
Paragraph("c-ANCA (PR3) or p-ANCA (MPO) positive", TBL_CELL)],
[Paragraph("Type IV\n(Double-positive)", TBL_CELL), Paragraph("LINEAR + ANCA positive", TBL_CELL),
Paragraph("Anti-GBM Ab + ANCA (both present)", TBL_CELL),
Paragraph("Overlap syndrome", TBL_CELL),
Paragraph("Both anti-GBM and ANCA positive", TBL_CELL)],
]
t_rpgn = Table(rpgn_data, colWidths=[1.8*cm, 3.5*cm, 4*cm, 4.2*cm, 3.5*cm])
t_rpgn.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),DARK_BLUE),
("BACKGROUND",(0,1),(-1,1),LIGHT_RED),
("BACKGROUND",(0,2),(-1,2),LIGHT_GREEN),
("BACKGROUND",(0,3),(-1,3),LIGHT_PURP),
("BACKGROUND",(0,4),(-1,4),LIGHT_BLUE),
("BOX",(0,0),(-1,-1),1,DARK_BLUE),("INNERGRID",(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),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_rpgn)
story.append(Spacer(1, 0.3*cm))
story.append(info_box(
"Memory Aid: IF = the KEY to RPGN classification",
[Paragraph("Type I = LINEAR (1 straight line = linear)", BOX_TXT),
Paragraph("Type II = GRANULAR (2 = immune complex clusters)", BOX_TXT),
Paragraph("Type III = NEGATIVE / PAUCI-IMMUNE (3 = nothing to see)", BOX_TXT)],
bg=LIGHT_BLUE, border=MID_BLUE
))
story.append(Spacer(1, 0.4*cm))
# ── MPGN and C3 Glomerulopathy ──────────────────────────────────────────────
story.append(Paragraph("6. MPGN / C3 Glomerulopathy", H2))
story.append(hr(ACCENT))
story.append(Paragraph("The MPGN pattern on LM is classified by IF into immunoglobulin-mediated vs complement-mediated:", BODY))
story.append(Spacer(1, 0.2*cm))
mpgn_data = [
[Paragraph("Type", TBL_HDR), Paragraph("IF Findings", TBL_HDR), Paragraph("EM", TBL_HDR), Paragraph("Pathogenesis", TBL_HDR)],
[Paragraph("MPGN Type I\n(Immune complex)", TBL_CELL_L), Paragraph("IgG + C3 + C1q + C4\n(classical pathway)", TBL_CELL_L),
Paragraph("Subendothelial deposits; double contour of GBM", TBL_CELL_L),
Paragraph("Chronic infections (HBV, HCV, endocarditis)\nAutoimmune diseases, MGRS", TBL_CELL_L)],
[Paragraph("MPGN Type III\n(Mixed deposits)", TBL_CELL_L), Paragraph("IgG + C3; subendothelial AND subepithelial", TBL_CELL_L),
Paragraph("Subendothelial + subepithelial deposits", TBL_CELL_L),
Paragraph("Immune complex-mediated", TBL_CELL_L)],
[Paragraph("Dense Deposit Disease\n(C3 GN Type II)", TBL_CELL_L), Paragraph("C3 only (3+ dominant)\nNo IgG/IgA/IgM\nNo C1q/C4", TBL_CELL_L),
Paragraph("Dense intramembranous deposits (sausage-shaped) - PATHOGNOMONIC", TBL_CELL_L),
Paragraph("Alternative complement pathway dysregulation\n(C3 nephritic factor, Factor H deficiency)", TBL_CELL_L)],
[Paragraph("C3 Glomerulonephritis\n(C3 GN)", TBL_CELL_L), Paragraph("C3 dominant (3+)\nTrace or absent Ig\nNo C1q/C4", TBL_CELL_L),
Paragraph("Mesangial / subendothelial deposits (less dense than DDD)", TBL_CELL_L),
Paragraph("Alternative pathway dysregulation\n(autoantibodies to Factor B/C3 convertase)", TBL_CELL_L)],
]
t_mpgn = Table(mpgn_data, colWidths=[3.5*cm, 4*cm, 5*cm, 4.5*cm])
t_mpgn.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),PURPLE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_PURP, WHITE]),
("BOX",(0,0),(-1,-1),0.8,PURPLE),("INNERGRID",(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),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_mpgn)
story.append(Spacer(1, 0.3*cm))
story.append(info_box(
"Key Rule: IF guides MPGN classification",
[Paragraph("Immunoglobulin-mediated (IgG/IgA/IgM present) → search for chronic infection, autoimmune disease, or monoclonal protein", BOX_TXT),
Paragraph("Complement-mediated only (C3 dominant, no Ig, no C1q/C4) → C3 glomerulopathy → work up for complement dysregulation", BOX_TXT),
Paragraph("No Ig AND no complement → consider thrombotic microangiopathy (TMA) or vascular disease", BOX_TXT)],
bg=LIGHT_PURP, border=PURPLE
))
story.append(PageBreak())
# ── Minimal Change & FSGS ──────────────────────────────────────────────────
story.append(Paragraph("7. Minimal Change Disease (MCD) and FSGS", H2))
story.append(hr(ACCENT))
story.append(two_col(
[Paragraph("Minimal Change Disease", H3),
info_box("IF: NEGATIVE (characteristic)",
[Paragraph("No IgG, IgA, IgM, C3 deposits on IF", BOX_TXT),
Paragraph("Occasional fine granular IgM (non-specific trapping)", BOX_TXT),
Paragraph("Recent: Fine granular podocyte IgG (anti-nephrin antibodies) may be seen with special techniques", BOX_TXT),
Paragraph("EM: Diffuse foot process effacement - NO immune deposits", BOX_TXT)],
bg=LIGHT_PURP, border=PURPLE),
Spacer(1, 0.2*cm),
Paragraph("Negative IF on a kidney biopsy with nephrotic syndrome = think MCD first!", KEY),
],
[Paragraph("FSGS", H3),
info_box("IF: Non-specific (IgM + C3)",
[Paragraph("IgM 2+ and C3 2+ in sclerotic segments (non-specific trapping in scar)", BOX_TXT),
Paragraph("In some cases: fine granular podocyte IgG (anti-nephrin) similar to MCD", BOX_TXT),
Paragraph("No immune complex deposits in non-sclerotic areas", BOX_TXT),
Paragraph("EM: Focal foot process effacement + epithelial denudation", BOX_TXT)],
bg=LIGHT_BLUE, border=MID_BLUE),
Spacer(1, 0.2*cm),
Paragraph("FSGS is a podocytopathy - scars trap Ig non-specifically. The IF is NOT diagnostic but helps exclude GN.", NOTE),
],
))
story.append(Spacer(1, 0.4*cm))
# ── Goodpasture / anti-GBM ──────────────────────────────────────────────────
story.append(Paragraph("8. Anti-GBM Disease / Goodpasture Syndrome", H2))
story.append(hr(ACCENT))
story.append(info_box(
"HALLMARK: Smooth linear IgG along the entire GBM",
[Paragraph("Antibody targets the alpha-3 chain of type IV collagen in GBM. The linear pattern reflects "
"uniform binding along the entire length of the GBM - unlike the focal deposits in immune complex GN.", BOX_TXT),
Paragraph("Goodpasture syndrome = anti-GBM GN + pulmonary hemorrhage. Anti-GBM Ab also stains "
"alveolar basement membranes linearly on lung biopsy.", BOX_TXT)],
bg=LIGHT_RED, border=RED
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("IF Findings: IgG (3-4+, linear) along GBM; C3 may be linear or segmental; NO mesangial deposits", BODY))
story.append(Paragraph("Serology: Anti-GBM antibodies in serum (ELISA); ANCA negative (unless Type IV RPGN overlap)", BODY))
story.append(Spacer(1, 0.4*cm))
# ── Diabetic Nephropathy ──────────────────────────────────────────────────
story.append(Paragraph("9. Diabetic Nephropathy", H2))
story.append(hr(ACCENT))
story.append(info_box(
"IF: 'Linear' IgG and albumin along GBM and TBM - but NOT due to immune complexes",
[Paragraph("In diabetic nephropathy, IgG stains linearly along GBM and TBM due to NON-SPECIFIC "
"insudation of plasma proteins into the thickened basement membranes (NOT antibody-mediated). "
"This is a pitfall - must distinguish from anti-GBM disease!", BOX_TXT),
Paragraph("True diagnostic IF: Usually NEGATIVE for specific immune deposits. The linear IgG is non-specific.", BOX_TXT),
Paragraph("Albumin is also linear (confirms non-specific protein trapping, not anti-GBM).", BOX_TXT)],
bg=LIGHT_BLUE, border=MID_BLUE
))
story.append(Spacer(1, 0.4*cm))
# ── Amyloidosis ──────────────────────────────────────────────────────
story.append(Paragraph("10. Renal Amyloidosis", H2))
story.append(hr(ACCENT))
story.append(Paragraph("IF: Positive for the specific amyloid type (lambda or kappa light chains in AL amyloid; "
"SAA in AA amyloid). Congo red stain shows apple-green birefringence under polarized light.", BODY))
story.append(Paragraph("EM: Non-branching fibrils, 8-12 nm diameter, randomly arranged", BODY))
story.append(Spacer(1, 0.4*cm))
# ── Hereditary Nephritis ──────────────────────────────────────────────────
story.append(Paragraph("11. Alport Syndrome (Hereditary Nephritis)", H2))
story.append(hr(ACCENT))
story.append(Paragraph("IF: Typically NEGATIVE for IgG, IgA, IgM, C3 in the glomerulus", BODY))
story.append(Paragraph("IHC for alpha-3, alpha-4, alpha-5 chains of type IV collagen: ABSENT (negative IHC) on GBM - "
"this is the KEY diagnostic finding in X-linked Alport syndrome", BODY))
story.append(Paragraph("EM: Irregular thickening, thinning, and splitting of GBM with lamellation - the 'basket-weave' appearance", BODY))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 4: IF IN SECONDARY GLOMERULAR DISEASES
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 4: IF IN SECONDARY GLOMERULAR DISEASES"))
story.append(Spacer(1, 0.3*cm))
sec_data = [
[Paragraph("Condition", TBL_HDR), Paragraph("IF Findings", TBL_HDR), Paragraph("Key Notes", TBL_HDR)],
[Paragraph("Lupus Nephritis", TBL_CELL_L),
Paragraph("Full-house: IgG, IgA, IgM, C3, C1q all positive", TBL_CELL_L),
Paragraph("Wire-loop lesions in Class IV = massive subendothelial IgG deposits", TBL_CELL_L)],
[Paragraph("Diabetic Nephropathy", TBL_CELL_L),
Paragraph("Linear IgG + albumin (non-specific)", TBL_CELL_L),
Paragraph("NOT immune-mediated; pitfall vs anti-GBM", TBL_CELL_L)],
[Paragraph("Henoch-Schonlein Purpura\n(IgA Vasculitis)", TBL_CELL_L),
Paragraph("IgA dominant in mesangium\n(identical to IgA nephropathy)", TBL_CELL_L),
Paragraph("Clinical context differentiates (purpura, arthritis, abdominal pain in children)", TBL_CELL_L)],
[Paragraph("ANCA-associated GN", TBL_CELL_L),
Paragraph("Negative / Pauci-immune", TBL_CELL_L),
Paragraph("Serum ANCA positive; fibrin in crescents (fibrinogen+)", TBL_CELL_L)],
[Paragraph("HIV Nephropathy (HIVAN)", TBL_CELL_L),
Paragraph("Non-specific IgM + C3\n(FSGS variant)", TBL_CELL_L),
Paragraph("Collapsing FSGS; EM shows TRI (tubuloreticular inclusions)", TBL_CELL_L)],
[Paragraph("Fibrillary GN", TBL_CELL_L),
Paragraph("IgG + C3 + kappa + lambda\n(polyclonal)", TBL_CELL_L),
Paragraph("EM: non-branching fibrils ~20 nm; DNAJB9 positive on IHC", TBL_CELL_L)],
[Paragraph("Monoclonal GN (MGRS)", TBL_CELL_L),
Paragraph("Monotypic IgG or IgM\n+ single light chain (kappa OR lambda)", TBL_CELL_L),
Paragraph("Light chain restriction = monoclonal; requires paraffin IF for accuracy", TBL_CELL_L)],
[Paragraph("Renal Amyloidosis (AL)", TBL_CELL_L),
Paragraph("Kappa or Lambda positive\n(monotypic)", TBL_CELL_L),
Paragraph("Congo red +; EM shows 8-12 nm fibrils", TBL_CELL_L)],
[Paragraph("Hypertensive Nephrosclerosis", TBL_CELL_L),
Paragraph("Negative or non-specific", TBL_CELL_L),
Paragraph("Vascular disease; no immune deposits", TBL_CELL_L)],
[Paragraph("TMA (Thrombotic Microangiopathy)", TBL_CELL_L),
Paragraph("Negative (no immune deposits)\nFibrinogen+ in capillaries", TBL_CELL_L),
Paragraph("TTP/HUS/scleroderma; IF helps exclude immune GN", TBL_CELL_L)],
]
t_sec = Table(sec_data, colWidths=[4*cm, 5.5*cm, 7.5*cm])
t_sec.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),MID_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("BOX",(0,0),(-1,-1),0.8,MID_BLUE),("INNERGRID",(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),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_sec)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 5: MESANGIAL PROLIFERATIVE GN - IF PATTERNS TABLE
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 5: IF PATTERNS IN MESANGIAL PROLIFERATIVE GN"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Source: Comprehensive Clinical Nephrology 7th Edition (Table 29.1)", NOTE))
story.append(Spacer(1, 0.2*cm))
mes_data = [
[Paragraph("IF Pattern", TBL_HDR), Paragraph("Associated Disorder", TBL_HDR)],
[Paragraph("Predominantly mesangial IgA deposits (± IgM, C3)", TBL_CELL_L), Paragraph("IgA nephropathy", TBL_CELL_L)],
[Paragraph("Predominantly mesangial IgG deposits (± IgM, C1q, C3)", TBL_CELL_L), Paragraph("Often associated with lupus nephritis", TBL_CELL_L)],
[Paragraph("Predominantly mesangial IgM deposits (± C1q, C3)", TBL_CELL_L), Paragraph("IgM nephropathy", TBL_CELL_L)],
[Paragraph("C1q dominant mesangial deposits", TBL_CELL_L), Paragraph("C1q nephropathy", TBL_CELL_L)],
[Paragraph("C3 dominant (no Ig)", TBL_CELL_L), Paragraph("C3 glomerulopathy (mild form)", TBL_CELL_L)],
[Paragraph("No deposits (negative IF)", TBL_CELL_L), Paragraph("Idiopathic mesangial proliferative GN; look for other causes", TBL_CELL_L)],
]
t_mes = Table(mes_data, colWidths=[9*cm, 8*cm])
t_mes.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),MID_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_BLUE, WHITE]),
("BOX",(0,0),(-1,-1),0.8,MID_BLUE),("INNERGRID",(0,0),(-1,-1),0.5,MID_GREY),
("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),6),
("LEFTPADDING",(0,0),(-1,-1),6),("RIGHTPADDING",(0,0),(-1,-1),6),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_mes)
story.append(Spacer(1, 0.5*cm))
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 6: CLINICAL CORRELATIONS
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 6: CLINICAL CORRELATIONS & EXAM HIGH-YIELD POINTS"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Complement Pathway Clues on IF", H2))
comp_data = [
[Paragraph("C1q Present?", TBL_HDR), Paragraph("C4 Present?", TBL_HDR), Paragraph("C3 Present?", TBL_HDR),
Paragraph("Pathway Activated", TBL_HDR), Paragraph("Key Diagnosis", TBL_HDR)],
[Paragraph("YES", TBL_CELL), Paragraph("YES", TBL_CELL), Paragraph("YES", TBL_CELL),
Paragraph("Classical pathway", TBL_CELL), Paragraph("Lupus nephritis; Post-infectious GN", TBL_CELL)],
[Paragraph("NO", TBL_CELL), Paragraph("NO", TBL_CELL), Paragraph("YES (dominant)", TBL_CELL),
Paragraph("Alternative pathway", TBL_CELL), Paragraph("C3 glomerulopathy; Dense deposit disease", TBL_CELL)],
[Paragraph("NO", TBL_CELL), Paragraph("NO", TBL_CELL), Paragraph("NO", TBL_CELL),
Paragraph("None", TBL_CELL), Paragraph("ANCA GN (pauci-immune); TMA; Diabetic nephropathy; MCD; Alport", TBL_CELL)],
[Paragraph("YES", TBL_CELL), Paragraph("NO", TBL_CELL), Paragraph("YES", TBL_CELL),
Paragraph("Lectin pathway", TBL_CELL), Paragraph("Some IgA nephropathy; Infection-related", TBL_CELL)],
]
t_comp = Table(comp_data, colWidths=[2.5*cm, 2.5*cm, 2.5*cm, 4*cm, 5.5*cm])
t_comp.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("BOX",(0,0),(-1,-1),0.8,MID_BLUE),("INNERGRID",(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),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_comp)
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Serum Complement Levels - IF Correlation", H2))
serum_data = [
[Paragraph("Condition", TBL_HDR), Paragraph("Serum C3", TBL_HDR), Paragraph("Serum C4", TBL_HDR), Paragraph("IF Complement", TBL_HDR)],
[Paragraph("Post-infectious GN", TBL_CELL_L), Paragraph("Low", TBL_CELL), Paragraph("Normal", TBL_CELL),
Paragraph("C3+ in GBM (alternative + classical late)", TBL_CELL_L)],
[Paragraph("Lupus nephritis", TBL_CELL_L), Paragraph("Low", TBL_CELL), Paragraph("Low", TBL_CELL),
Paragraph("C3+, C4+, C1q+ (full classical pathway)", TBL_CELL_L)],
[Paragraph("Dense deposit disease", TBL_CELL_L), Paragraph("Very low", TBL_CELL), Paragraph("Normal", TBL_CELL),
Paragraph("C3 only; C3 nephritic factor present", TBL_CELL_L)],
[Paragraph("Membranous nephropathy", TBL_CELL_L), Paragraph("Normal", TBL_CELL), Paragraph("Normal", TBL_CELL),
Paragraph("C3+, IgG+ subepithelial", TBL_CELL_L)],
[Paragraph("MPGN Type I", TBL_CELL_L), Paragraph("Low", TBL_CELL), Paragraph("Normal/Low", TBL_CELL),
Paragraph("C3+, IgG+, C1q+, C4+", TBL_CELL_L)],
[Paragraph("IgA nephropathy", TBL_CELL_L), Paragraph("Normal", TBL_CELL), Paragraph("Normal", TBL_CELL),
Paragraph("IgA dominant; C3 mesangial", TBL_CELL_L)],
]
t_serum = Table(serum_data, colWidths=[4.5*cm, 2.5*cm, 2.5*cm, 7.5*cm])
t_serum.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("BOX",(0,0),(-1,-1),0.8,MID_BLUE),("INNERGRID",(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),4),("RIGHTPADDING",(0,0),(-1,-1),4),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_serum)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 7: EXAM-FOCUSED QUICK REVISION
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 7: EXAM QUICK REVISION - MNEMONICS & HIGH-YIELD FACTS"))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Top 10 Exam-Tested IF Facts", H2))
facts = [
("1", "LINEAR IgG = Anti-GBM disease (Goodpasture). No other common GN produces linear IF."),
("2", "NEGATIVE IF (pauci-immune) + crescents = ANCA-associated GN (Type III RPGN)."),
("3", "DOMINANT IgA in mesangium = IgA nephropathy. This is the DIAGNOSTIC criterion."),
("4", "FULL-HOUSE (IgG+IgA+IgM+C3+C1q) = Lupus nephritis. Virtually pathognomonic."),
("5", "NEGATIVE IF + nephrotic syndrome = Minimal Change Disease (or FSGS with negative areas)."),
("6", "C3 ONLY (no Ig, no C1q, no C4) = C3 glomerulopathy (Dense deposit disease or C3 GN)."),
("7", "Granular SUBEPITHELIAL IgG + C3 = Membranous nephropathy."),
("8", "Wire-loop lesions on LM = massive SUBENDOTHELIAL IgG deposits on IF = Lupus Class IV."),
("9", "Linear IgG + ALBUMIN along GBM in diabetic nephropathy = NON-SPECIFIC (NOT anti-GBM)."),
("10", "Alport syndrome: IF negative but IHC for type IV collagen alpha chains is absent (diagnostic)."),
]
for num, fact in facts:
story.append(Paragraph(f"<b>{num}.</b> {fact}", BULLET))
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("Mnemonics", H2))
story.append(info_box(
"FULL HOUSE = Lupus Nephritis",
[Paragraph("Like a poker hand - you have EVERYTHING:", BOX_TXT),
Paragraph("IgG + IgA + IgM + C3 + C1q = 5 cards = FULL HOUSE", BOX_BOLD)],
bg=LIGHT_RED, border=RED
))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
"RPGN IF Classification: 1-2-3",
[Paragraph("Type 1 = LINEAR (one line)", BOX_TXT),
Paragraph("Type 2 = GRANULAR (two = complex = granular)", BOX_TXT),
Paragraph("Type 3 = NEGATIVE (three = pauci = ANCA = nothing to see)", BOX_TXT)],
bg=LIGHT_GREEN, border=GREEN
))
story.append(Spacer(1, 0.2*cm))
story.append(info_box(
"The IF 'Triad of Renal Biopsy'",
[Paragraph("LM: Identifies the PATTERN of injury (proliferative/membranous/sclerosing)", BOX_TXT),
Paragraph("IF: Identifies the TYPE and MECHANISM of injury (immune vs non-immune; type of deposits)", BOX_TXT),
Paragraph("EM: Identifies the LOCATION of deposits (sub-epithelial/sub-endothelial/mesangial/intramembranous)", BOX_TXT)],
bg=LIGHT_BLUE, border=MID_BLUE
))
story.append(Spacer(1, 0.4*cm))
# ── One-liner Quick Reference ──────────────────────────────────────────────
story.append(Paragraph("One-Line IF Summary - Quick Reference", H2))
oneliner_data = [
[Paragraph("Disease", TBL_HDR), Paragraph("One-line IF Summary", TBL_HDR)],
[Paragraph("Post-infectious GN", TBL_CELL_L), Paragraph("Coarse granular IgG+C3 in GBM/mesangium; subepithelial humps on EM", TBL_CELL_L)],
[Paragraph("Membranous nephropathy", TBL_CELL_L), Paragraph("Fine granular IgG+C3 subepithelial, capillary walls diffuse", TBL_CELL_L)],
[Paragraph("Minimal change disease", TBL_CELL_L), Paragraph("IF NEGATIVE (no deposits)", TBL_CELL_L)],
[Paragraph("FSGS", TBL_CELL_L), Paragraph("IgM+C3 segmental (non-specific trapping)", TBL_CELL_L)],
[Paragraph("IgA nephropathy", TBL_CELL_L), Paragraph("Dominant IgA mesangial (±IgG, IgM, C3)", TBL_CELL_L)],
[Paragraph("MPGN Type I", TBL_CELL_L), Paragraph("IgG+C3+C1q+C4 subendothelial+mesangial", TBL_CELL_L)],
[Paragraph("Dense deposit disease", TBL_CELL_L), Paragraph("C3 ONLY (intramembranous ribbon deposits on EM)", TBL_CELL_L)],
[Paragraph("Lupus nephritis", TBL_CELL_L), Paragraph("Full-house: IgG+IgA+IgM+C3+C1q", TBL_CELL_L)],
[Paragraph("Anti-GBM (Goodpasture)", TBL_CELL_L), Paragraph("LINEAR IgG+C3 along entire GBM", TBL_CELL_L)],
[Paragraph("ANCA-associated GN", TBL_CELL_L), Paragraph("NEGATIVE (pauci-immune)", TBL_CELL_L)],
[Paragraph("Diabetic nephropathy", TBL_CELL_L), Paragraph("Linear IgG+albumin (non-specific, NOT immune)", TBL_CELL_L)],
[Paragraph("Alport syndrome", TBL_CELL_L), Paragraph("IF negative; IHC type IV collagen alpha chains absent", TBL_CELL_L)],
[Paragraph("Amyloidosis", TBL_CELL_L), Paragraph("Lambda or kappa (monotypic in AL); Congo red apple-green", TBL_CELL_L)],
[Paragraph("IgA Vasculitis (HSP)", TBL_CELL_L), Paragraph("Same as IgA nephropathy - dominant mesangial IgA", TBL_CELL_L)],
]
t_one = Table(oneliner_data, colWidths=[5*cm, 12*cm])
t_one.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1),[LIGHT_GREY, WHITE]),
("BOX",(0,0),(-1,-1),0.8,MID_BLUE),("INNERGRID",(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),("RIGHTPADDING",(0,0),(-1,-1),5),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_one)
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 8: PAST EXAM QUESTIONS
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 8: PAST EXAM QUESTIONS (AP / TELANGANA MD PATHOLOGY)", bg=ACCENT, fg=DARK_BLUE))
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("Questions from Postgraduate Manual of Pathology, 9th Ed. 2025 (Dr. Shiva M.D.)", NOTE))
story.append(Spacer(1, 0.2*cm))
pq_data = [
[Paragraph("Exam / Year", TBL_HDR), Paragraph("Question", TBL_HDR)],
[Paragraph("May 2025", TBL_CELL), Paragraph("Role of immunofluorescence in renal pathology", TBL_CELL_L)],
[Paragraph("Int. Exam: March 2024", TBL_CELL), Paragraph("Role of immunofluorescence in understanding glomerular diseases", TBL_CELL_L)],
[Paragraph("June 2023", TBL_CELL), Paragraph("Role of immunofluorescence in renal biopsy", TBL_CELL_L)],
[Paragraph("July/Aug 2021", TBL_CELL), Paragraph("Discuss the role of immunofluorescence and electron microscopy in the diagnosis of glomerular diseases of kidney", TBL_CELL_L)],
[Paragraph("July/Aug 2021", TBL_CELL), Paragraph("Discuss briefly the role of immunofluorescence in glomerular pathology", TBL_CELL_L)],
[Paragraph("June 2020", TBL_CELL), Paragraph("Discuss role of immunofluorescence in renal diseases", TBL_CELL_L)],
[Paragraph("May 2025 / Dec. 2023", TBL_CELL), Paragraph("Role of immunofluorescence in glomerular lesions of kidney (Recent Advances paper)", TBL_CELL_L)],
[Paragraph("Dec. 2022", TBL_CELL), Paragraph("Discuss the morphology of lupus nephritis (IF correlation expected)", TBL_CELL_L)],
[Paragraph("Int. Exam: Dec. 2021", TBL_CELL), Paragraph("Describe the mechanisms in progression of glomerular diseases", TBL_CELL_L)],
[Paragraph("Oct. 2019", TBL_CELL), Paragraph("Describe the histopathology, ultrastructural features and IF patterns in glomerular diseases presenting as nephritic syndrome", TBL_CELL_L)],
[Paragraph("Int. Exam: Dec. 2016", TBL_CELL), Paragraph("Role of immunofluorescence in understanding glomerular diseases", TBL_CELL_L)],
[Paragraph("Int. Exam: Dec. 2012", TBL_CELL), Paragraph("Light chain immunofluorescence in various nephropathies", TBL_CELL_L)],
[Paragraph("April 1996", TBL_CELL), Paragraph("Discuss the role of immunofluorescence in the understanding of glomerular diseases", TBL_CELL_L)],
]
t_pq = Table(pq_data, colWidths=[4.5*cm, 12.5*cm])
t_pq.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),ACCENT),
("ROWBACKGROUNDS",(0,1),(-1,-1),[colors.HexColor("#fff8ee"), WHITE]),
("BOX",(0,0),(-1,-1),0.8,ACCENT),("INNERGRID",(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),("RIGHTPADDING",(0,0),(-1,-1),5),
("VALIGN",(0,0),(-1,-1),"TOP"),
]))
story.append(t_pq)
story.append(Spacer(1, 0.4*cm))
story.append(info_box(
"Exam Tip: How to Structure Your IF Answer",
[Paragraph("1. INTRODUCTION: Define IF; explain why it is used (identifies deposits, mechanism of injury)", BOX_TXT),
Paragraph("2. TECHNICAL ASPECTS: Direct vs indirect IF; tissue requirements (snap-frozen); standard panel (IgG, IgA, IgM, C3, C1q, kappa, lambda, fibrinogen)", BOX_TXT),
Paragraph("3. PATTERNS: Linear / Granular / Negative - with clinical meaning", BOX_TXT),
Paragraph("4. LOCATION: Subepithelial / Subendothelial / Mesangial / Intramembranous", BOX_TXT),
Paragraph("5. DISEASE-WISE TABLE: List each disease with its specific IF pattern", BOX_TXT),
Paragraph("6. CONCLUSION: IF as cornerstone of the LM + IF + EM diagnostic triad", BOX_TXT)],
bg=colors.HexColor("#fff8ee"), border=ACCENT
))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════
# SECTION 9: REFERENCES
# ═══════════════════════════════════════════════════════════════════════════
story.append(section_banner("REFERENCES & SOURCES", bg=MID_GREY, fg=DARK_BLUE))
story.append(Spacer(1, 0.3*cm))
refs = [
"Robbins, Cotran & Kumar Pathologic Basis of Disease, 10th Edition - Chapter 20: The Kidney",
"Comprehensive Clinical Nephrology, 7th Edition - Chapters 21-31",
"National Kidney Foundation Primer on Kidney Diseases, 8th Edition - Chapter 16-22",
"Brenner and Rector's The Kidney, 11th Edition - Chapter 31",
"Postgraduate Manual of Pathology, 9th Edition (2025) - Dr. Shiva M.D. [AP/Telangana Exam Bank]",
"Washington Manual of Medical Therapeutics - Chapter 24: Thyroid and Renal",
"Quick Compendium of Clinical Pathology, 5th Edition",
]
for r in refs:
story.append(Paragraph(f"\u2022 {r}", BODY_SM))
story.append(Spacer(1, 0.6*cm))
# footer note
footer = Table([[Paragraph(
"This study guide is compiled for educational purposes for MD Pathology postgraduate exam preparation. "
"Content sourced from standard medical textbooks. Always refer to original textbooks for complete information.",
NOTE)]], colWidths=[W])
footer.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),LIGHT_GREY),
("BOX",(0,0),(-1,-1),0.5,MID_GREY),
("TOPPADDING",(0,0),(-1,-1),8),("BOTTOMPADDING",(0,0),(-1,-1),8),
("LEFTPADDING",(0,0),(-1,-1),10),("RIGHTPADDING",(0,0),(-1,-1),10),
]))
story.append(footer)
# ─── Build ────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/renal-if-study-guide && python3 create_pdf.py 2>&1
ls -lh /home/daytona/workspace/renal-if-study-guide/
Immunofluorescence Renal Diseases Study Guide
PDF Document · PDF
| Section | Content |
|---|---|
| 1 - Principles | Types of IF (direct/indirect/paraffin), standard antibody panel, the 3 core patterns (linear/granular/negative), deposit location terminology |
| 2 - Master Table | Complete IF pattern table for all primary GN - color-coded by pattern type |
| 3 - Disease-Specific Notes | Detailed breakdowns for IgA nephropathy, Membranous nephropathy, Lupus nephritis (ISN/RPS class I-VI), Post-infectious GN, RPGN (types I-IV), MPGN/C3G, MCD, FSGS, Anti-GBM, Diabetic nephropathy, Amyloidosis, Alport |
| 4 - Secondary GN | IF in lupus, HSP, ANCA-GN, HIVAN, Fibrillary GN, MGRS, Amyloid, TMA |
| 5 - Mesangial GN | IF pattern table for mesangial proliferative GN classification (from Comprehensive Clinical Nephrology) |
| 6 - Clinical Correlations | Complement pathway IF clues; serum C3/C4 + IF correlation table |
| 7 - Quick Revision | Top 10 exam facts, mnemonics (Full-House, RPGN 1-2-3), one-line IF summary for 14 diseases |
| 8 - Past Exam Questions | All IF questions from AP/Telangana MD Pathology exams (1996-2025), answer structure guide |
| 9 - References | Robbins, Comprehensive Nephrology, NKF Primer, Brenner's Kidney, Dr. Shiva's Manual |