Paraganglioma point wise
paraganglioma
| Site | Name | Key Feature |
|---|---|---|
| Carotid bifurcation | Carotid body tumor | Most common H&N paraganglioma |
| Jugular bulb | Glomus jugulare | Cranial nerve deficits |
| Cochlear promontory | Glomus tympanicum | Pulsatile tinnitus |
| Vagus nerve | Vagal paraganglioma | Cervical mass, voice change |
| Aortic bodies | Aortico-pulmonary chain | - |
| Larynx | Laryngeal paraganglioma | Supraglottic, 3rd most common neuroendocrine tumor of larynx |
| Syndrome | Gene | Associated Tumor | Other Features |
|---|---|---|---|
| MEN-2A | RET | Pheo/PGL | Medullary thyroid Ca, parathyroid hyperplasia |
| MEN-2B | RET | Pheo/PGL | Medullary thyroid Ca, marfanoid habitus, mucosal GNs |
| NF-1 | NF1 | Pheochromocytoma | Neurofibromas, café-au-lait spots |
| von Hippel-Lindau | VHL | Pheo/PGL | RCC, hemangioblastoma, pancreatic NET |
| Hereditary PGL-1 | SDHD | Pheo + PGL | GIST |
| Hereditary PGL-3 | SDHC | PGL only | GIST |
| Hereditary PGL-4 | SDHB | Pheo + PGL | GIST |
| Polycythemia-PGL syndrome | EPAS1 (HIF-2α) | Pheo/PGL | Polycythemia |
| Marker | Cell | Result |
|---|---|---|
| Chromogranin | Chief cells | Positive |
| Synaptophysin | Chief cells | Positive |
| INSM1 | Chief cells | Positive |
| CD56 | Chief cells | Positive |
| S-100 | Sustentacular cells | Positive |

| Modality | Role |
|---|---|
| CT (high-resolution) | Best for bony involvement, temporal bone erosion |
| MRI | Best for soft tissue extent, intracranial invasion; "salt and pepper" appearance on T2 |
| Intra-arterial angiography | Very specific - shows enlarged feeding arteries, early intense blush, centripetally oriented arterioles; done as pre-embolization evaluation |
| Octreotide scan | Useful pre-op to confirm diagnosis, avoid biopsy |
| MIBG scan | For functional tumors; catecholamine-secreting PGLs |
| Feature | Detail |
|---|---|
| Origin | Neural crest, neuroendocrine cells |
| Most common | Adrenal pheochromocytoma (80-85%) |
| Histology hallmark | Zellballen pattern |
| IHC markers | Chromogranin, synaptophysin (chief cells); S-100 (sustentacular cells) |
| Most common germline mutations | SDH subunits (SDHB, SDHC, SDHD) |
| Highest malignancy risk | SDHB mutation (30-50% metastatic) |
| H&N most common site | Carotid body (35%), temporal bone (50%) |
| Functional secretion in H&N | ~5% secrete catecholamines |
| Malignancy assessment | Based on metastasis ONLY (not histology) |
| Preferred imaging | CT (bone) + MRI (soft tissue) |
| Laryngeal PGL | 3x more in women; supraglottic; avoid biopsy |
Make pdf
mkdir -p /home/daytona/workspace/paraganglioma && ls /home/daytona/workspace/
~/paraganglioma/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
OUTPUT = "/home/daytona/workspace/paraganglioma/Paraganglioma.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=18*mm, rightMargin=18*mm,
topMargin=20*mm, bottomMargin=20*mm,
title="Paraganglioma - Point Wise Notes",
author="Orris Medical"
)
W = A4[0] - 36*mm # usable width
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1a3c5e")
TEAL = colors.HexColor("#1d7a8a")
LTBLUE = colors.HexColor("#ddeef6")
CREAM = colors.HexColor("#f8f4ef")
GOLD = colors.HexColor("#c9830a")
RED = colors.HexColor("#b03030")
LGREY = colors.HexColor("#f0f0f0")
WHITE = colors.white
BLACK = colors.black
# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, **kw):
s = ParagraphStyle(name, **kw)
return s
TITLE_S = S("Title",
fontName="Helvetica-Bold", fontSize=22, textColor=WHITE,
alignment=TA_CENTER, spaceAfter=4, leading=28)
SUBTITLE_S = S("Subtitle",
fontName="Helvetica", fontSize=11, textColor=colors.HexColor("#c8dff0"),
alignment=TA_CENTER, spaceAfter=0, leading=16)
H1 = S("H1",
fontName="Helvetica-Bold", fontSize=13, textColor=WHITE,
backColor=NAVY, leftIndent=0, rightIndent=0,
spaceBefore=10, spaceAfter=4, leading=18,
borderPad=(5, 6, 5, 6))
H2 = S("H2",
fontName="Helvetica-Bold", fontSize=11, textColor=NAVY,
spaceBefore=6, spaceAfter=3, leading=15)
H3 = S("H3",
fontName="Helvetica-BoldOblique", fontSize=10, textColor=TEAL,
spaceBefore=4, spaceAfter=2, leading=13)
BODY = S("Body",
fontName="Helvetica", fontSize=9.5, textColor=BLACK,
leading=14, spaceAfter=3, alignment=TA_JUSTIFY)
BULLET = S("Bullet",
fontName="Helvetica", fontSize=9.5, textColor=BLACK,
leading=13, leftIndent=12, spaceAfter=2,
bulletIndent=2, bulletFontName="Helvetica", bulletFontSize=9)
SUBBULLET = S("SubBullet",
fontName="Helvetica", fontSize=9, textColor=colors.HexColor("#333333"),
leading=12, leftIndent=24, spaceAfter=1.5,
bulletIndent=14, bulletFontName="Helvetica", bulletFontSize=8)
NOTE = S("Note",
fontName="Helvetica-Oblique", fontSize=8.5, textColor=colors.HexColor("#555555"),
leading=12, spaceAfter=4, leftIndent=8)
TABLE_HEAD = S("TH",
fontName="Helvetica-Bold", fontSize=8.5, textColor=WHITE,
alignment=TA_CENTER, leading=11)
TABLE_CELL = S("TC",
fontName="Helvetica", fontSize=8.5, textColor=BLACK,
alignment=TA_LEFT, leading=11)
TABLE_CELL_C = S("TCC",
fontName="Helvetica", fontSize=8.5, textColor=BLACK,
alignment=TA_CENTER, leading=11)
# ── Helpers ──────────────────────────────────────────────────────────────────
def h1(txt):
return Paragraph(f" {txt}", H1)
def h2(txt):
return Paragraph(txt, H2)
def h3(txt):
return Paragraph(txt, H3)
def body(txt):
return Paragraph(txt, BODY)
def bullet(txt, sub=False):
style = SUBBULLET if sub else BULLET
marker = "–" if sub else "•"
return Paragraph(f"{marker} {txt}", style)
def note(txt):
return Paragraph(f"<i>{txt}</i>", NOTE)
def sp(h=4):
return Spacer(1, h*mm)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#cccccc"), spaceAfter=3)
def make_table(headers, rows, col_widths=None, stripe=True):
head_row = [Paragraph(h, TABLE_HEAD) for h in headers]
data = [head_row]
for i, row in enumerate(rows):
data.append([Paragraph(str(c), TABLE_CELL) for c in row])
if col_widths is None:
col_widths = [W / len(headers)] * len(headers)
style = [
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("ROWBACKGROUND",(0,1), (-1,-1), [LGREY, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#bbbbbb")),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING",(0,0),(-1,-1), 5),
]
if stripe:
for r in range(1, len(data)):
bg = LGREY if r % 2 == 1 else WHITE
style.append(("BACKGROUND", (0,r), (-1,r), bg))
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle(style))
return t
# ── Cover banner ─────────────────────────────────────────────────────────────
def cover_banner():
banner_data = [[
Paragraph("<b><font size=22 color='#FFFFFF'>PARAGANGLIOMA</font></b><br/>"
"<font size=11 color='#c8dff0'>Comprehensive Point-Wise Notes</font>",
S("btext", fontName="Helvetica-Bold", fontSize=22, textColor=WHITE,
alignment=TA_CENTER, leading=28, spaceAfter=0))
]]
banner = Table(banner_data, colWidths=[W])
banner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING",(0,0),(-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING",(0,0),(-1,-1), 10),
]))
return banner
def source_box(txt):
d = [[Paragraph(f"<i><font size=8 color='#555555'>{txt}</font></i>",
S("src", fontName="Helvetica-Oblique", fontSize=8,
textColor=colors.HexColor("#555555"), leading=11,
leftIndent=0, spaceAfter=0))]]
t = Table(d, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), CREAM),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING",(0,0),(-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING",(0,0),(-1,-1), 8),
("LINEBELOW", (0,0), (-1,-1), 0.5, TEAL),
("LINEABOVE", (0,0), (-1,-1), 0.5, TEAL),
]))
return t
# ═══════════════════════════════════════════════════════════════════════════
# BUILD STORY
# ═══════════════════════════════════════════════════════════════════════════
story = []
story.append(cover_banner())
story.append(sp(5))
story.append(note("Sources: Robbins & Cotran Pathologic Basis of Disease | "
"Cummings Otolaryngology | Scott-Brown's Otorhinolaryngology | "
"Campbell Walsh Wein Urology"))
story.append(sp(3))
# ── 1. Definition & Origin ───────────────────────────────────────────────────
story.append(h1("1. Definition & Origin"))
story.append(sp(2))
story.append(bullet("Neoplasms arising from <b>neuroendocrine cells</b> (chromaffin/chief cells) of the sympathetic and parasympathetic nervous systems"))
story.append(bullet("Originate from <b>neural crest-derived</b> paraganglionic cells distributed throughout the body"))
story.append(bullet("<b>Adrenal medullary pheochromocytoma</b> = most common paraganglioma → accounts for <b>80–85%</b> of all cases"))
story.append(bullet("Extra-adrenal paragangliomas = remaining 15–20%; approximately <b>70%</b> of these occur in the <b>head and neck</b>"))
story.append(bullet("Incidence is higher in people living at <b>high altitudes</b> (hypoxic stimulus)"))
story.append(sp(2))
# ── 2. Classification ────────────────────────────────────────────────────────
story.append(h1("2. Classification by Location"))
story.append(sp(2))
story.append(h2("A. Paravertebral (Sympathetic) Paragangliomas"))
story.append(bullet("Arise from paravertebral sympathetic ganglia and the <b>organ of Zückerkandl</b> (near aortic bifurcation)"))
story.append(bullet("Have <b>sympathetic</b> connections"))
story.append(bullet("Stain <b>positively for chromaffin</b> → indicate catecholamine production"))
story.append(bullet("More likely to be <b>functionally active</b> (secrete catecholamines)"))
story.append(sp(2))
story.append(h2("B. Head & Neck (Parasympathetic) Paragangliomas"))
story.append(bullet("Innervated by the <b>parasympathetic</b> system; only <b>~5%</b> produce catecholamines"))
story.append(sp(2))
hn_table = make_table(
["Site", "Common Name", "Key Feature"],
[
["Carotid bifurcation", "Carotid body tumor", "Most common H&N paraganglioma; 35% of H&N PGLs"],
["Jugular bulb", "Glomus jugulare", "Cranial nerve deficits (CN IX–XII); temporal bone ~50%"],
["Cochlear promontory", "Glomus tympanicum", "Pulsatile tinnitus; red mass behind TM"],
["Vagus nerve (CN X)", "Vagal paraganglioma", "High cervical mass; hoarseness; voice change"],
["Aortic bodies", "Aortico-pulmonary chain", "Rare; near great vessels"],
["Larynx", "Laryngeal paraganglioma", "Supraglottic; 3rd most common laryngeal NET; 3x more in women"],
],
col_widths=[W*0.28, W*0.28, W*0.44]
)
story.append(hn_table)
story.append(sp(2))
# ── 3. Epidemiology ──────────────────────────────────────────────────────────
story.append(h1("3. Epidemiology"))
story.append(sp(2))
story.append(bullet("Rare, <b>slow-growing, painless masses</b>"))
story.append(bullet("Peak incidence: <b>5th and 6th decades</b> of life"))
story.append(bullet("Laryngeal paragangliomas: <b>3× more common in women</b>"))
story.append(bullet("Usually <b>solitary and sporadic</b>; ~10% are multifocal"))
story.append(bullet("Familial inheritance: <b>autosomal dominant</b>"))
story.append(bullet("~1–3% of glomus jugulare tumors secrete catecholamines"))
story.append(sp(2))
# ── 4. Genetics ──────────────────────────────────────────────────────────────
story.append(h1("4. Genetics & Hereditary Syndromes"))
story.append(sp(2))
story.append(bullet("<b>30–40%</b> of all pheochromocytomas/paragangliomas harbor an <b>oncogenic germline mutation</b>"))
story.append(bullet("Hereditary cases: younger at presentation, more often bilateral"))
story.append(bullet("Two broad mutation classes:"))
story.append(bullet("Enhance <b>growth factor receptor pathway signaling</b> (e.g., RET, NF1)", sub=True))
story.append(bullet("Increase activity of <b>HIF-1α / HIF-2α</b> → 'pseudohypoxia' phenotype (e.g., VHL, SDH genes, EPAS1)", sub=True))
story.append(sp(2))
gen_table = make_table(
["Syndrome", "Gene", "Tumor", "Other Features"],
[
["MEN-2A", "RET", "Pheo / PGL", "Medullary thyroid Ca, parathyroid hyperplasia"],
["MEN-2B", "RET", "Pheo / PGL", "Medullary thyroid Ca, marfanoid habitus, mucosal GNs"],
["Neurofibromatosis type 1", "NF1", "Pheochromocytoma", "Café-au-lait spots, optic nerve glioma"],
["von Hippel-Lindau (VHL)", "VHL", "Pheo / PGL", "RCC, hemangioblastoma, pancreatic NET"],
["Hereditary PGL-1", "SDHD", "Pheo + PGL", "GIST"],
["Hereditary PGL-3", "SDHC", "PGL only", "GIST"],
["Hereditary PGL-4", "SDHB", "Pheo + PGL", "GIST — HIGHEST metastatic risk (30–50%)"],
["Polycythemia-PGL syndrome", "EPAS1 (HIF-2α)", "Pheo / PGL", "Polycythemia"],
],
col_widths=[W*0.25, W*0.12, W*0.18, W*0.45]
)
story.append(gen_table)
story.append(sp(1))
# highlight box
highlight_data = [[
Paragraph("⚠ <b>SDHB mutation</b> carries the <b>highest metastatic risk (30–50%)</b>. "
"SDH gene syndromes (PGL 1–4) typically involve head & neck PGLs. "
"~1/3 of H&N paragangliomas are associated with germline mutations.",
S("hl", fontName="Helvetica", fontSize=9, textColor=NAVY,
leading=13, spaceAfter=0))
]]
hl_table = Table(highlight_data, colWidths=[W])
hl_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#fff3cd")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING",(0,0),(-1,-1), 10),
("LINEBELOW", (0,0), (-1,-1), 1.5, GOLD),
("LINEABOVE", (0,0), (-1,-1), 1.5, GOLD),
]))
story.append(hl_table)
story.append(sp(2))
# ── 5. Pathology ─────────────────────────────────────────────────────────────
story.append(h1("5. Pathology / Morphology"))
story.append(sp(2))
story.append(h2("Gross"))
story.append(bullet("Well-circumscribed, red-pink to brown; highly vascular"))
story.append(bullet("Carotid body tumor: rarely exceeds <b>6 cm</b>; arises at or envelops the carotid bifurcation"))
story.append(bullet("Pheochromocytoma: average weight ~100 g; larger tumors can be hemorrhagic/necrotic"))
story.append(sp(2))
story.append(h2("Microscopy — Hallmark: Zellballen Pattern"))
story.append(bullet("<b>Chief cells</b>: round to oval, abundant clear/granular eosinophilic cytoplasm, uniform nuclei, scant mitoses"))
story.append(bullet("Arranged in characteristic <b>nests (Zellballen)</b> surrounded by delicate fibrovascular septa"))
story.append(bullet("<b>Sustentacular cells</b>: spindle-shaped supporting stromal cells at nest periphery"))
story.append(bullet("Little cellular pleomorphism; neuroendocrine granules on EM (more in sympathetic tumors)"))
story.append(sp(2))
story.append(h2("Immunohistochemistry"))
ihc_table = make_table(
["Marker", "Cell Type", "Result"],
[
["Chromogranin", "Chief cells", "Positive ✓"],
["Synaptophysin", "Chief cells", "Positive ✓"],
["INSM1", "Chief cells", "Positive ✓"],
["CD56", "Chief cells", "Positive ✓"],
["S-100 protein", "Sustentacular cells", "Positive ✓ (key distinguishing marker)"],
],
col_widths=[W*0.30, W*0.30, W*0.40]
)
story.append(ihc_table)
story.append(sp(2))
# ── 6. Clinical Features ─────────────────────────────────────────────────────
story.append(h1("6. Clinical Features"))
story.append(sp(2))
story.append(h2("By Location"))
clin_table = make_table(
["Tumor", "Key Symptoms"],
[
["Glomus tympanicum", "Pulsatile tinnitus, conductive hearing loss, red pulsatile mass behind tympanic membrane"],
["Glomus jugulare", "Cranial nerve palsies (CN IX–XII), pulsatile tinnitus, hearing loss"],
["Carotid body tumor", "Painless lateral neck mass at carotid bifurcation; 'lyre sign' on angiography; splays carotid vessels"],
["Vagal paraganglioma", "High cervical mass, CN X palsy, hoarseness, Horner syndrome"],
["Laryngeal PGL", "Submucosal supraglottic mass; avoid biopsy due to high vascularity"],
["Functional (any site)", "Paroxysmal hypertension, palpitations, headache, diaphoresis, sweating"],
],
col_widths=[W*0.32, W*0.68]
)
story.append(clin_table)
story.append(sp(2))
story.append(h2("General"))
story.append(bullet("Most are painless and slow-growing; symptoms due to <b>compression of adjacent structures</b>"))
story.append(bullet("~10% of adrenal pheochromocytomas are <b>not associated</b> with hypertension"))
story.append(bullet("Of the 90% with hypertension: ~2/3 have <b>paroxysmal</b> hypertensive episodes"))
story.append(sp(2))
# ── 7. Malignancy ────────────────────────────────────────────────────────────
story.append(h1("7. Malignancy"))
story.append(sp(2))
mal_data = [[
Paragraph("⚠ <b>All paragangliomas should be considered potentially malignant.</b> "
"The terms 'benign' and 'malignant' are no longer recommended. "
"Use <b>'metastatic paraganglioma'</b> when metastatic disease is present.",
S("mal", fontName="Helvetica", fontSize=9, textColor=RED,
leading=13, spaceAfter=0))
]]
mal_table = Table(mal_data, colWidths=[W])
mal_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#fdecea")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING",(0,0),(-1,-1), 10),
("LINEBELOW", (0,0), (-1,-1), 1.5, RED),
("LINEABOVE", (0,0), (-1,-1), 1.5, RED),
]))
story.append(mal_table)
story.append(sp(2))
story.append(bullet("Histologic features (<b>mitoses, pleomorphism, vascular invasion</b>) do <b>NOT</b> reliably predict metastatic behavior"))
story.append(bullet("<b>SDHB mutation</b>: highest metastatic risk — <b>30–50%</b>"))
story.append(bullet("Metastatic behavior more common in <b>extra-adrenal</b> PGLs (20–40%)"))
story.append(bullet("Up to <b>50% of metastatic PGLs are ultimately fatal</b>, mainly due to infiltrative growth"))
story.append(bullet("Malignancy is diagnosed by presence of <b>metastasis ONLY</b> (not histologic features)"))
story.append(sp(2))
# ── 8. Imaging ───────────────────────────────────────────────────────────────
story.append(h1("8. Imaging"))
story.append(sp(2))
img_table = make_table(
["Modality", "Role / Finding"],
[
["CT (high-resolution)", "Best for bony involvement and temporal bone erosion"],
["MRI", "Best for soft tissue extent and intracranial invasion; 'salt and pepper' on T2"],
["Intra-arterial angiography", "Very specific: enlarged feeding arteries, early intense blush, centripetal arterioles (90–600 µm); done as pre-embolization evaluation, not primary diagnosis"],
["Octreotide scan", "Confirms diagnosis pre-operatively; helps avoid biopsy of vascular lesions"],
["MIBG scan", "For functional tumors (catecholamine-secreting PGLs); adrenal pheochromocytomas"],
["68Ga-DOTATATE PET/CT", "High sensitivity for SDH-mutated PGLs; staging and metastatic disease"],
],
col_widths=[W*0.30, W*0.70]
)
story.append(img_table)
story.append(sp(1))
story.append(bullet("<b>Avoid biopsy</b> of suspected PGLs due to high vascularity → risk of massive hemorrhage"))
story.append(bullet("Assess for <b>carotid artery involvement</b> and <b>intracranial invasion</b> on CT/MRI"))
story.append(bullet("Angiography shows <b>multi-compartment blood supply</b> with arteriovenous shunts"))
story.append(sp(2))
# ── 9. Treatment ─────────────────────────────────────────────────────────────
story.append(h1("9. Treatment"))
story.append(sp(2))
story.append(h2("Surgery (Definitive)"))
story.append(bullet("Surgical excision with <b>vascular control</b> is the standard of care"))
story.append(bullet("Laryngeal PGLs: <b>lateral thyrotomy or lateral pharyngotomy</b> preferred (hemostasis)"))
story.append(bullet("Transoral CO₂ laser: NOT recommended due to hemostasis difficulty + increased recurrence"))
story.append(bullet("<b>Neck dissection NOT indicated</b> for laryngeal PGLs (do not metastasize to cervical nodes)"))
story.append(bullet("Incomplete resection → frequent local recurrence"))
story.append(sp(2))
story.append(h2("Radiation / Stereotactic Radiosurgery (SRS)"))
story.append(bullet("Glomus jugulare — <b>Fisch class C/D</b>: SRS is <b>preferred</b> treatment"))
story.append(bullet("Better cranial nerve preservation vs. surgery; similar or better local control"))
story.append(bullet("Fisch class A/B (confined to middle ear): <b>surgery preferred</b> (limited morbidity)"))
story.append(bullet("PGLs respond to RT but <b>incompletely</b> → mainly for growth control"))
story.append(sp(2))
story.append(h2("Pre-operative Embolization"))
story.append(bullet("Performed as <b>adjuvant to surgical resection</b> to reduce intraoperative blood loss"))
story.append(bullet("Embolic particles sized ~90 µm (periphery) to 300–600 µm (center); <b>multi-compartment supply</b> requires separate injections per feeding artery"))
story.append(bullet("Percutaneous direct puncture with liquid embolic agent used when AV shunts present"))
story.append(bullet("Embolization alone (without surgery/RT) can <b>stabilize growth and provide symptomatic relief</b>"))
story.append(sp(2))
story.append(h2("Functional Tumor Management"))
story.append(bullet("Pre-operative <b>alpha-adrenergic blockade</b> (phenoxybenzamine) → then beta-blockade"))
story.append(bullet("Prevents <b>hypertensive crisis</b> during surgery"))
story.append(sp(2))
# ── 10. Key Concepts Summary ─────────────────────────────────────────────────
story.append(h1("10. Key Concepts Summary"))
story.append(sp(2))
summary_table = make_table(
["Feature", "Detail"],
[
["Origin", "Neural crest; neuroendocrine cells"],
["Most common PGL", "Adrenal pheochromocytoma (80–85%)"],
["H&N sites", "Temporal bone ~50%, carotid body ~35%, vagal ~12%"],
["Histology hallmark", "Zellballen (nests of chief cells)"],
["IHC - Chief cells", "Chromogranin, Synaptophysin, INSM1, CD56 — Positive"],
["IHC - Sustentacular cells", "S-100 — Positive"],
["Germline mutations", "30–40% of all PGLs; SDH subunits most common"],
["Highest malignancy risk", "SDHB mutation (30–50% metastatic)"],
["Malignancy diagnosis", "Based on metastasis ONLY — histology not reliable"],
["H&N catecholamine secretion", "Only ~5% of H&N PGLs"],
["Preferred imaging", "CT (bone) + MRI (soft tissue); avoid biopsy"],
["Laryngeal PGL", "3× more in women; supraglottic; Zellballen; avoid biopsy"],
["Glomus jugulare C/D", "SRS preferred over surgery (better CN preservation)"],
["Pre-op preparation", "Alpha-blocker then beta-blocker for functional tumors"],
],
col_widths=[W*0.40, W*0.60]
)
story.append(summary_table)
story.append(sp(3))
# ── Footer / References ───────────────────────────────────────────────────────
story.append(hr())
story.append(note(
"Sources: Robbins, Cotran & Kumar Pathologic Basis of Disease (Ch. 16 & 24) | "
"Cummings Otolaryngology Head and Neck Surgery | "
"Scott-Brown's Otorhinolaryngology Head & Neck Surgery | "
"Campbell Walsh Wein Urology | "
"Recent evidence: PMID 38605204 (SDHB outcomes, 2024) | PMID 38942141 (embolization meta-analysis, 2024)"
))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /home/daytona/workspace/paraganglioma && python generate_pdf.py
Paraganglioma
PDF Document · PDF