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 |
You've uploaded the Postgraduate Manual of Pathology 9th ed. What would you like to do with it?
What would you like me to do with this PDF?
Which chapter or section would you like me to summarize?
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" && python3 -c " from pypdf import PdfReader reader = PdfReader('Postgraduate Manual of Pathology 9th ed. 2025 (1).pdf') print(f'Total pages: {len(reader.pages)}') # Search for renal in first 30 pages (likely TOC) for i in range(min(30, len(reader.pages))): text = reader.pages[i].extract_text() or '' if 'renal' in text.lower() or 'kidney' in text.lower(): print(f'--- Page {i+1} ---') print(text[:2000]) print() "
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" && python3 -c " from pypdf import PdfReader reader = PdfReader('Postgraduate Manual of Pathology 9th ed. 2025 (1).pdf') # Look through all pages for 'renal' section heading or chapter renal_pages = [] for i in range(len(reader.pages)): text = reader.pages[i].extract_text() or '' if 'renal' in text.lower() or 'kidney' in text.lower() or 'nephro' in text.lower(): renal_pages.append(i+1) print('Pages with renal/kidney/nephro content:', renal_pages) " 2>/dev/null
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" && python3 -c " from pypdf import PdfReader reader = PdfReader('Postgraduate Manual of Pathology 9th ed. 2025 (1).pdf') # Check pages 84-100 which seem to be the main renal chapter for pg in [84, 85, 86, 87, 88, 89, 90]: text = reader.pages[pg-1].extract_text() or '' print(f'=== PAGE {pg} ===') print(text[:3000]) print() " 2>/dev/null
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" && python3 -c " from pypdf import PdfReader reader = PdfReader('Postgraduate Manual of Pathology 9th ed. 2025 (1).pdf') # Extract all text from pages with renal content and get context around renal mentions renal_pages = [15, 21, 32, 33, 36, 37, 44, 47, 48, 50, 51, 64, 70, 72, 76, 82, 84, 85, 87, 89, 90, 91, 93, 94, 95, 97, 98, 99, 100, 103] for pg in renal_pages: text = reader.pages[pg-1].extract_text() or '' # Find lines with renal/kidney content lines = text.split('\n') relevant = [] for i, line in enumerate(lines): if any(kw in line.lower() for kw in ['renal', 'kidney', 'nephro', 'glomerul', 'nephrotic', 'nephritic', 'tubul', 'anca', 'polycyst']): # Get context - a few lines before and after start = max(0, i-1) end = min(len(lines), i+2) relevant.extend(lines[start:end]) if relevant: print(f'=== PAGE {pg} ===') for r in relevant: print(r) print() " 2>/dev/null
cd "/home/daytona/workspace/attachments/380d64ac-34ee-4853-96c1-7650d4e84f05/" && python3 -c " from pypdf import PdfReader reader = PdfReader('Postgraduate Manual of Pathology 9th ed. 2025 (1).pdf') # Read pages 1-14 to see book structure/TOC for pg in range(1, 15): text = reader.pages[pg-1].extract_text() or '' print(f'=== PAGE {pg} ===') print(text[:2500]) print() " 2>/dev/null
| 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/workspace/renal-if-study-guide/
~/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 |