I need an complete comparison between mitral, tricuspid, aortic, pulmonary stenosis and regurgitation
| Feature | Mitral Stenosis | Mitral Regurgitation | Aortic Stenosis | Aortic Regurgitation | Tricuspid Stenosis | Tricuspid Regurgitation | Pulmonary Stenosis | Pulmonary Regurgitation |
|---|---|---|---|---|---|---|---|---|
| Side | Left | Left | Left | Left | Right | Right | Right | Right |
| Phase affected | Diastolic filling | Systolic ejection | Systolic ejection | Diastolic refill | Diastolic filling | Systolic ejection | Systolic ejection | Diastolic refill |
| Pressure gradient | LA > LV (diastole) | LV > LA (systole, backward) | LV > Ao (systole) | Ao > LV (diastole, backward) | RA > RV (diastole) | RV > RA (systole, backward) | RV > PA (systole) | PA > RV (diastole, backward) |
| Grade | Peak velocity | Mean gradient | AVA |
|---|---|---|---|
| Mild | <3 m/s | <20 mmHg | >1.5 cm² |
| Moderate | 3-4 m/s | 20-40 mmHg | 1.0-1.5 cm² |
| Severe | >4 m/s | >40 mmHg | <1.0 cm² |
| Very severe | >5 m/s | >60 mmHg | <0.6 cm² |
| Valve Lesion | #1 Cause | Other Key Causes |
|---|---|---|
| Mitral Stenosis | Rheumatic fever | Congenital, MAC |
| Mitral Regurgitation | MVP/degenerative | Ischemic, endocarditis, rheumatic |
| Aortic Stenosis | Calcific/degenerative | Bicuspid AV, rheumatic |
| Aortic Regurgitation | Annular dilation (HTN) | Bicuspid AV, endocarditis, Marfan's, dissection |
| Tricuspid Stenosis | Rheumatic fever | Carcinoid, congenital |
| Tricuspid Regurgitation | Functional (RV/annular dilation) | Endocarditis, Ebstein's, carcinoid, CIED |
| Pulmonary Stenosis | Congenital | Carcinoid |
| Pulmonary Regurgitation | Post-ToF repair (iatrogenic) | Pulmonary HTN, endocarditis, carcinoid |
| Lesion | Type | Location | Radiation | Key Features |
|---|---|---|---|---|
| MS | Mid-diastolic rumble | Apex | None | Low-pitched, bell; pre-systolic accentuation; opening snap |
| MR | Holosystolic | Apex | Axilla/back | Soft S1; S3 gallop; MVP = click + late systolic murmur |
| AS | Ejection systolic | RUSB | Carotids | Crescendo-decrescendo; parvus et tardus; reduced A2; S4 |
| AR | Early diastolic | LLSB | None | Blowing, decrescendo; Austin Flint murmur; wide pulse pressure |
| TS | Mid-diastolic | LLSB | None | Louder on inspiration; opening snap |
| TR | Holosystolic | LLSB | None | Louder on inspiration (Carvallo's); cv wave in JVP |
| PS | Ejection systolic | ULSB | L shoulder | Ejection click (decreases with inspiration); split S2 |
| PR | Early diastolic | ULSB | None | Graham Steell murmur if from PA HTN; RBBB on ECG |
| Lesion | Primary Chamber Affected | Type of Overload | LV/RV Response | Pulse Character |
|---|---|---|---|---|
| MS | Left atrium | Pressure | LVH absent; LA dilation | Small volume |
| MR | Left ventricle | Volume | Eccentric LVH; LA dilation | Hyperdynamic |
| AS | Left ventricle | Pressure | Concentric LVH | Parvus et tardus |
| AR | Left ventricle | Volume | Eccentric LVH | Wide pulse pressure |
| TS | Right atrium | Pressure (upstream) | RVH absent; RA dilation | Normal or small |
| TR | Right ventricle | Volume | RV + RA dilation | Normal |
| PS | Right ventricle | Pressure | Concentric RVH | Normal |
| PR | Right ventricle | Volume | Eccentric RVH + RV dilation | Normal or bounding |
| Lesion | Echo Key Finding | ECG | CXR |
|---|---|---|---|
| MS | Hockey-stick AML; MVA by PHT; Wilkins score | P mitrale; AF | LA enlargement; pulm edema; Kerley B |
| MR | Flail/prolapsing leaflet; PISA; EF + LVESD | LVH; AF | Cardiomegaly; LA + LV enlargement |
| AS | Calcified valve; AVA by continuity eq; gradient | LVH with strain | Cardiomegaly; aortic calcification; post-stenotic dilation |
| AR | Regurgitant jet; LV size/EF; pressure half-time | LVH | LV enlargement; aortic root dilation |
| TS | Thickened leaflets; diastolic gradient; MVA by PHT | RA enlargement (tall P) | RA enlargement; no pulm HTN changes |
| TR | RA+RV dilation; tricuspid jet; hepatic vein reversal | RVH or RBBB; RA enlargement; AF | RA + RV enlargement |
| PS | Domed/thickened valve; peak gradient | RVH | Normal or RV enlargement |
| PR | Regurgitant jet; RV size/function | RBBB | RV enlargement |
| Lesion | Medical | Interventional | Notes |
|---|---|---|---|
| MS | Rate control; diuretics; anticoagulation (AF) | PMBV (Wilkins ≤8); MVR if anatomy unfavorable | Rheumatic fever prophylaxis |
| MR | Vasodilators; HF therapy (secondary MR) | Mitral valve repair > replacement; MitraClip for high-risk | EF < 60% or LVESD > 40 mm = surgery |
| AS | Symptom management only | AVR (SAVR or TAVR); no balloon in adults | Angina/syncope/HF = replace urgently |
| AR | ACEi/ARB if hypertensive | AVR; emergency surgery for acute AR | EF < 50% or LVESD > 50 mm = replace |
| TS | Diuretics; salt restriction | Balloon valvuloplasty; TV repair/replacement at mitral surgery | Bioprosthetic valve preferred |
| TR | Diuretics (spironolactone); treat cause | Annuloplasty at left-sided surgery; TEER (high-risk) | CIED-related TR may require lead extraction |
| PS | Observation (mild) | Balloon valvuloplasty (first-line, congenital); surgical for dysplastic | Excellent results with balloon |
| PR | Observation (mild/asymptomatic) | PVR (surgical or transcatheter TPVR); Melody/SAPIEN valve | Post-ToF repair: timing is critical |
Need in pdf
ls -la /home/daytona/workspace/
mkdir -p /home/daytona/workspace/valvular-heart-disease
~/valvular-heart-disease/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
OUTPUT = "/home/daytona/workspace/valvular-heart-disease/Valvular_Heart_Disease_Comparison.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=2*cm, leftMargin=2*cm,
topMargin=2.2*cm, bottomMargin=2.2*cm,
title="Valvular Heart Disease – Complete Comparison",
author="Orris Medical Reference"
)
W = A4[0] - 4*cm # usable width
# ── Colour palette ───────────────────────────────────────────────────────────
C_DARK = colors.HexColor("#1a2a4a") # navy
C_MID = colors.HexColor("#2c5f8a") # medium blue
C_LIGHT = colors.HexColor("#d6e4f0") # pale blue
C_ACCENT = colors.HexColor("#e8f4fd") # very light blue
C_RED = colors.HexColor("#c0392b") # section accent
C_ORANGE = colors.HexColor("#e67e22")
C_GREEN = colors.HexColor("#27ae60")
C_GREY = colors.HexColor("#ecf0f1")
C_WHITE = colors.white
C_BLACK = colors.HexColor("#1c1c1c")
styles = getSampleStyleSheet()
# Custom styles
def make_style(name, parent="Normal", **kw):
s = ParagraphStyle(name, parent=styles[parent], **kw)
return s
title_style = make_style("DocTitle",
fontSize=22, textColor=C_WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", spaceAfter=6, leading=28)
subtitle_style = make_style("DocSubtitle",
fontSize=12, textColor=C_LIGHT, alignment=TA_CENTER,
fontName="Helvetica", spaceAfter=4)
h1_style = make_style("H1",
fontSize=15, textColor=C_WHITE, fontName="Helvetica-Bold",
alignment=TA_LEFT, spaceAfter=4, spaceBefore=2, leading=20)
h2_style = make_style("H2",
fontSize=12, textColor=C_DARK, fontName="Helvetica-Bold",
spaceBefore=10, spaceAfter=4, leading=16)
h3_style = make_style("H3",
fontSize=10.5, textColor=C_MID, fontName="Helvetica-Bold",
spaceBefore=6, spaceAfter=3, leading=14)
body_style = make_style("Body",
fontSize=9, textColor=C_BLACK, fontName="Helvetica",
leading=13, spaceAfter=4, alignment=TA_JUSTIFY)
bullet_style = make_style("Bullet",
fontSize=9, textColor=C_BLACK, fontName="Helvetica",
leading=13, spaceAfter=2, leftIndent=14, bulletIndent=4)
label_style = make_style("Label",
fontSize=8.5, textColor=C_MID, fontName="Helvetica-Bold",
leading=12, spaceAfter=1)
small_style = make_style("Small",
fontSize=7.5, textColor=colors.HexColor("#555555"),
fontName="Helvetica", leading=11, alignment=TA_CENTER)
tbl_header_style = make_style("TblH",
fontSize=8, textColor=C_WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=11)
tbl_body_style = make_style("TblB",
fontSize=7.5, textColor=C_BLACK, fontName="Helvetica",
alignment=TA_LEFT, leading=11)
tbl_body_center = make_style("TblBC",
fontSize=7.5, textColor=C_BLACK, fontName="Helvetica",
alignment=TA_CENTER, leading=11)
# ── Helper builders ──────────────────────────────────────────────────────────
def title_banner(text, sub=""):
"""Full-width coloured banner for section heading."""
banner_data = [[Paragraph(text, h1_style)]]
t = Table(banner_data, colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_DARK),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
items = [t]
if sub:
items.append(Paragraph(sub, make_style("sub2", fontSize=8.5,
textColor=colors.HexColor("#666666"), fontName="Helvetica-Oblique",
spaceAfter=4, spaceBefore=2)))
return items
def bullet(text, indent=0):
extra = " " * (indent * 4)
return Paragraph(f"<bullet>•</bullet> {extra}{text}", bullet_style)
def kv(key, value):
return Paragraph(f"<b><font color='#2c5f8a'>{key}:</font></b> {value}", body_style)
def section_box(title, rows_data, col_widths, header_colors=None):
"""
rows_data: list of lists of Paragraph or str
Returns a styled Table.
"""
header = rows_data[0]
body = rows_data[1:]
hc = header_colors or [C_MID] * len(header)
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), C_MID),
("TEXTCOLOR", (0,0), (-1,0), C_WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8),
("ALIGN", (0,0), (-1,0), "CENTER"),
("VALIGN", (0,0), (-1,-1), "TOP"),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 7.5),
("ROWBACKGROUNDS", (0,1), (-1,-1), [C_ACCENT, C_WHITE]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#b0c4d8")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
])
t = Table(rows_data, colWidths=col_widths, repeatRows=1)
t.setStyle(ts)
return t
def p(text, style=None):
return Paragraph(text, style or body_style)
def sp(h=6):
return Spacer(1, h)
def hr():
return HRFlowable(width="100%", thickness=0.5, color=C_LIGHT, spaceAfter=4, spaceBefore=4)
# ─────────────────────────────────────────────────────────────────────────────
# BUILD CONTENT
# ─────────────────────────────────────────────────────────────────────────────
story = []
# ══ COVER PAGE ═══════════════════════════════════════════════════════════════
cover_data = [[
Paragraph("Valvular Heart Disease", title_style),
Paragraph("Complete Clinical Comparison", subtitle_style),
Paragraph("Mitral · Tricuspid · Aortic · Pulmonary", subtitle_style),
Spacer(1, 6),
Paragraph("Stenosis & Regurgitation — All 8 Lesions", make_style("cs3",
fontSize=10, textColor=C_LIGHT, alignment=TA_CENTER,
fontName="Helvetica-Oblique")),
Spacer(1, 10),
Paragraph("Sources: Braunwald's Heart Disease 11e · Harrison's Principles of Internal Medicine 22e · Grainger & Allison's Diagnostic Radiology",
make_style("src", fontSize=8, textColor=colors.HexColor("#aac8e0"),
alignment=TA_CENTER, fontName="Helvetica")),
]]
cover_tbl = Table(cover_data, colWidths=[W])
cover_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_DARK),
("TOPPADDING", (0,0), (-1,-1), 30),
("BOTTOMPADDING", (0,0), (-1,-1), 30),
("LEFTPADDING", (0,0), (-1,-1), 20),
("RIGHTPADDING", (0,0), (-1,-1), 20),
]))
story.append(cover_tbl)
story.append(sp(12))
# Quick intro
story.append(p(
"There are four cardiac valves — mitral, tricuspid, aortic, and pulmonary — each capable "
"of two major pathological states: <b>stenosis</b> (failure to open, obstructing forward flow) "
"and <b>regurgitation</b> (failure to close, allowing backward flow). This document provides a "
"complete side-by-side clinical reference for all eight valvular lesions, covering etiology, "
"pathophysiology, symptoms, physical signs, investigations, and management."
))
story.append(sp(4))
story.append(hr())
story.append(sp(4))
# ══ SECTION 1 — MITRAL STENOSIS ══════════════════════════════════════════════
story += title_banner("1. MITRAL STENOSIS (MS)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
story.append(bullet("<b>Rheumatic fever</b> — dominant cause worldwide; commissural fusion, leaflet thickening, chordal shortening"))
story.append(bullet("Rare: congenital, radiation, severe mitral annular calcification (MAC), carcinoid"))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Obstruction of LV diastolic filling → LA pressure ↑ → pulmonary venous HTN → pulmonary arterial HTN"))
story.append(bullet("Normal MVA: 4–6 cm²; symptomatic < 2 cm²; severe < 1.5 cm²; critical < 1.0 cm²"))
story.append(bullet("Reduced LV preload → reduced cardiac output"))
story.append(bullet("Chronically elevated LA pressure → AF (30–40% of patients)"))
story.append(sp(4))
story.append(p("<b>Symptoms</b>", h3_style))
for s in ["Dyspnea on exertion (earliest) → orthopnea, PND",
"Fatigue (low CO)",
"Hemoptysis (pulmonary venous HTN)",
"Palpitations (AF — common)",
"Systemic emboli (LA thrombus, especially in AF)",
"Hoarseness — Ortner's syndrome (enlarged LA compressing recurrent laryngeal nerve)"]:
story.append(bullet(s))
story.append(sp(4))
story.append(p("<b>Physical Examination</b>", h3_style))
for s in ["<b>Loud S1</b> (delayed mitral valve closure)",
"<b>Opening snap (OS)</b> after S2 — higher pressure gradient = shorter S2–OS interval",
"<b>Low-pitched, rumbling mid-diastolic murmur</b> at apex (best heard: left lateral decubitus with bell)",
"<b>Pre-systolic accentuation</b> (if in sinus rhythm)",
"Malar flush (mitral facies) — peripheral vasoconstriction + pulmonary HTN",
"Signs of pulmonary HTN: loud P2, RV heave, TR murmur"]:
story.append(bullet(s))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "P mitrale (bifid P in II, biphasic in V1); AF; RVH in advanced disease"))
story.append(kv("CXR", "LA enlargement (double density, splayed carina); pulmonary venous congestion; Kerley B lines"))
story.append(kv("Echo", "Hockey-stick deformity of AML; MVA by pressure half-time (220/PHT); Wilkins score; mean gradient"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("<b>Medical:</b> rate control (β-blockers, digoxin), diuretics, anticoagulation (AF), rheumatic fever prophylaxis"))
story.append(bullet("<b>PMBV (Percutaneous Mitral Balloon Valvuloplasty):</b> preferred for symptomatic MS, MVA < 1.5 cm², Wilkins score ≤ 8"))
story.append(bullet("<b>Surgery (commissurotomy or MVR):</b> unfavorable anatomy, significant MR, or failed PMBV"))
story.append(sp(8))
# ══ SECTION 2 — MITRAL REGURGITATION ════════════════════════════════════════
story += title_banner("2. MITRAL REGURGITATION (MR)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
story.append(bullet("<b>Primary (organic):</b> MVP (most common in developed world), rheumatic fever, infective endocarditis, connective tissue disease (Marfan's), chordal rupture, radiation, congenital"))
story.append(bullet("<b>Secondary (functional):</b> Ischemic papillary muscle dysfunction, dilated cardiomyopathy (annular dilation), AF (atrial functional MR)"))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Systolic backflow LV → LA → LA volume overload → LA dilation (chronic) or acute pulmonary edema (acute)"))
story.append(bullet("LV receives pulmonary venous return + regurgitant volume → eccentric LVH"))
story.append(bullet("EF initially supra-normal (misleading) — falls as LV contractile dysfunction develops"))
story.append(bullet("Acute MR (chordal rupture, endocarditis, papillary muscle rupture in MI): surgical emergency"))
story.append(sp(4))
story.append(p("<b>Symptoms</b>", h3_style))
for s in ["Chronic: often asymptomatic for years; then exertional dyspnea, fatigue",
"Acute: sudden severe pulmonary edema — medical/surgical emergency"]:
story.append(bullet(s))
story.append(sp(4))
story.append(p("<b>Physical Examination</b>", h3_style))
for s in ["<b>Holosystolic murmur</b> at apex, radiating to axilla/back",
"Soft or absent S1",
"<b>S3 gallop</b> (volume overload)",
"Displaced, hyperdynamic apex beat",
"<b>MVP:</b> mid-systolic click + late systolic murmur (Barlow's syndrome)"]:
story.append(bullet(s))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "LA enlargement; LVH; AF"))
story.append(kv("CXR", "Cardiomegaly; LA + LV enlargement"))
story.append(kv("Echo", "Carpentier classification; PISA method; EF + LVESD (surgery thresholds: EF <60% or LVESD >40 mm)"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("<b>Medical:</b> vasodilators (ACEi, nifedipine); HF therapy for secondary MR"))
story.append(bullet("<b>Surgery:</b> mitral valve <i>repair preferred over replacement</i> (lower mortality, no anticoagulation); indications: symptomatic severe MR, or asymptomatic with EF <60%, LVESD >40 mm, new AF, or PA systolic >50 mmHg"))
story.append(bullet("<b>MitraClip (TEER):</b> transcatheter edge-to-edge repair; FDA-approved for primary and secondary MR at high surgical risk (EVEREST II trial)"))
story.append(sp(8))
story.append(PageBreak())
# ══ SECTION 3 — AORTIC STENOSIS ═════════════════════════════════════════════
story += title_banner("3. AORTIC STENOSIS (AS)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
for s in ["<b>Calcific/degenerative:</b> most common in adults >65 years; progressive calcification of normal tricuspid valve (presents 70–80s) or bicuspid AV (presents 50–60s; 1–2% of population)",
"<b>Bicuspid aortic valve</b> — most common congenital heart defect in adults",
"<b>Rheumatic:</b> now rare in developed countries",
"Congenital: unicuspid, hypoplastic annulus (presents in infancy/childhood)"]:
story.append(bullet(s))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Obstruction to LV outflow → LV pressure overload → concentric LVH (compensatory)"))
story.append(bullet("CO preserved for years while LV hypertrophies; eventually fails when symptoms appear"))
story.append(bullet("<b>Classic symptom triad + prognosis:</b>"))
story.append(bullet("Angina → mean survival 5 years", indent=1))
story.append(bullet("Syncope → mean survival 3 years", indent=1))
story.append(bullet("Heart failure (dyspnea) → mean survival 1–2 years", indent=1))
story.append(sp(4))
# Severity table
sev_data = [
[p("Grade", tbl_header_style), p("Peak Velocity", tbl_header_style),
p("Mean Gradient", tbl_header_style), p("AVA", tbl_header_style)],
[p("Mild", tbl_body_center), p("< 3 m/s", tbl_body_center), p("< 20 mmHg", tbl_body_center), p("> 1.5 cm²", tbl_body_center)],
[p("Moderate", tbl_body_center), p("3–4 m/s", tbl_body_center), p("20–40 mmHg", tbl_body_center), p("1.0–1.5 cm²", tbl_body_center)],
[p("Severe", tbl_body_center), p("> 4 m/s", tbl_body_center), p("> 40 mmHg", tbl_body_center), p("< 1.0 cm²", tbl_body_center)],
[p("Very Severe", tbl_body_center), p("> 5 m/s", tbl_body_center), p("> 60 mmHg", tbl_body_center), p("< 0.6 cm²", tbl_body_center)],
]
cw = [W*0.22, W*0.24, W*0.27, W*0.27]
story.append(p("<b>Severity Classification (Doppler Echo)</b>", h3_style))
story.append(section_box("AS Severity", sev_data, cw))
story.append(sp(4))
story.append(p("<b>Physical Examination</b>", h3_style))
for s in ["<b>Harsh, crescendo-decrescendo ejection systolic murmur</b> at right 2nd ICS, radiating to carotids",
"<b>Parvus et tardus</b> pulse (slow-rising, low-amplitude carotid) — unreliable in elderly with stiff arteries",
"Sustained, forceful undisplaced apex beat (pressure overload)",
"<b>Diminished or absent A2</b> (calcification)",
"<b>S4 gallop</b> (stiff, hypertrophied LV)"]:
story.append(bullet(s))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "LVH with strain (ST depression, T-wave inversion in I, aVL, V4–V6); LBBB in advanced disease"))
story.append(kv("CXR", "Rounded cardiac apex (LVH); aortic calcification; post-stenotic ascending aortic dilation"))
story.append(kv("Echo", "Calcified, restricted leaflets; LV wall thickness; Doppler gradients; AVA by continuity equation; low-flow low-gradient: dobutamine stress echo"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("<b>Medical:</b> no medication slows progression; manage comorbidities (hypertension, HF)"))
story.append(bullet("<b>AVR — only definitive treatment:</b>"))
story.append(bullet("SAVR (surgical): standard for low/intermediate risk, younger patients (<65); mechanical valve for <60 years", indent=1))
story.append(bullet("TAVR (transcatheter): now recommended across all risk categories; preferred >80 years; bioprosthetic", indent=1))
story.append(bullet("Indications: symptomatic severe AS (Class I); asymptomatic severe AS + EF <50% (Class I); very severe AS (Class IIa)", indent=1))
story.append(bullet("<b>No role for balloon valvuloplasty in adults</b> (high restenosis) — only as bridge to AVR"))
story.append(sp(8))
# ══ SECTION 4 — AORTIC REGURGITATION ════════════════════════════════════════
story += title_banner("4. AORTIC REGURGITATION (AR)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
story.append(bullet("<b>Valve leaflet disease:</b> bicuspid AV, infective endocarditis, rheumatic fever, myxomatous degeneration, radiation"))
story.append(bullet("<b>Aortic root/annular disease:</b> hypertensive aortic root dilation (most common in elderly), Marfan syndrome, aortic dissection (acute AR), syphilitic aortitis, ankylosing spondylitis"))
story.append(bullet("<b>Acute AR:</b> aortic dissection, infective endocarditis — surgical emergency"))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Diastolic backflow Ao → LV → LV volume overload → eccentric LVH"))
story.append(bullet("Wide pulse pressure: ↑ systolic (increased stroke volume) + ↓ diastolic (regurgitation)"))
story.append(bullet("LV compensates for years; eventually irreversible contractile dysfunction if surgery is delayed"))
story.append(bullet("<b>Acute AR:</b> LV not dilated → sudden high diastolic pressure → acute pulmonary edema + shock"))
story.append(sp(4))
story.append(p("<b>Classic Eponymous Signs (Wide Pulse Pressure)</b>", h3_style))
signs_data = [
[p("Sign", tbl_header_style), p("Description", tbl_header_style)],
[p("Corrigan's pulse", tbl_body_style), p("Water-hammer pulse — rapid rise and collapse of carotid", tbl_body_style)],
[p("De Musset's sign", tbl_body_style), p("Head bobbing with each heartbeat", tbl_body_style)],
[p("Quincke's sign", tbl_body_style), p("Visible capillary pulsations in nailbeds", tbl_body_style)],
[p("Duroziez's sign", tbl_body_style), p("Femoral systolic + diastolic murmur with compression", tbl_body_style)],
[p("Hill's sign", tbl_body_style), p("Popliteal BP > 20 mmHg higher than brachial BP", tbl_body_style)],
[p("Austin Flint murmur", tbl_body_style), p("Mid-diastolic rumble at apex (AR jet causes functional MS of anterior mitral leaflet)", tbl_body_style)],
]
story.append(section_box("AR Signs", signs_data, [W*0.3, W*0.7]))
story.append(sp(4))
story.append(p("<b>Murmur</b>", h3_style))
story.append(bullet("<b>Early diastolic decrescendo murmur</b> at left sternal border (3rd–4th ICS); best heard sitting forward, held expiration"))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "LVH; ST changes"))
story.append(kv("CXR", "LV enlargement; aortic root dilation"))
story.append(kv("Echo", "Regurgitant jet; LV size and EF; aortic root dimensions; pressure half-time"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("<b>Medical:</b> ACEi/ARB if hypertensive; vasodilators (amlodipine, nifedipine) for symptomatic chronic AR; no benefit in normotensive asymptomatic patients"))
story.append(bullet("<b>AVR (surgery):</b> symptomatic severe AR (Class I); asymptomatic with EF <50% (Class I); LVESD >50 mm or LVEDD >65 mm (Class IIa)"))
story.append(bullet("<b>Acute severe AR:</b> emergency surgical AVR"))
story.append(sp(8))
story.append(PageBreak())
# ══ SECTION 5 — TRICUSPID STENOSIS ══════════════════════════════════════════
story += title_banner("5. TRICUSPID STENOSIS (TS)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
story.append(bullet("<b>Rheumatic fever</b> — almost exclusively; rarely occurs in isolation; almost always associated with MS"))
story.append(bullet("More common in women; hemodynamically significant TS in 5–10% of patients with severe MS"))
story.append(bullet("Rare: carcinoid syndrome, congenital, right atrial myxoma, lupus"))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Diastolic pressure gradient RA > RV"))
story.append(bullet("Mean gradient of <b>4 mmHg</b> sufficient to cause systemic venous congestion"))
story.append(bullet("Elevated RA pressure → hepatomegaly, ascites, peripheral edema (systemic venous HTN)"))
story.append(bullet("CO depressed at rest, fails to rise with exercise"))
story.append(bullet("<b>TS can mask coexisting MS</b> — low CO reduces pulmonary pressures, masking hemodynamic features of MS"))
story.append(bullet("Giant 'a' wave in JVP (sinus rhythm); prolonged y descent"))
story.append(sp(4))
story.append(p("<b>Symptoms</b>", h3_style))
story.append(bullet("Relatively <b>little dyspnea</b> for degree of systemic congestion (pulmonary circulation protected by low CO)"))
story.append(bullet("Fatigue (low CO)"))
story.append(bullet("Hepatomegaly, abdominal discomfort, ascites"))
story.append(bullet("Severe peripheral edema, anasarca"))
story.append(sp(4))
story.append(p("<b>Physical Examination</b>", h3_style))
story.append(bullet("<b>Opening snap</b> at lower left sternal border (vs. apex for MS)"))
story.append(bullet("<b>Mid-diastolic murmur</b> at lower left sternal border — <b>louder on inspiration (Carvallo's sign)</b>"))
story.append(bullet("Elevated JVP with prominent 'a' wave, slow 'y' descent"))
story.append(bullet("Hepatomegaly, ascites, peripheral edema"))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "RA enlargement (tall peaked P waves in II and V1 — P pulmonale); no RVH (RV protected)"))
story.append(kv("CXR", "RA enlargement; no pulmonary HTN changes"))
story.append(kv("Echo", "Thickened leaflets with limited motion; diastolic gradient; no significant pulmonary HTN"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("Diuretics (reduce systemic congestion); salt restriction"))
story.append(bullet("<b>Percutaneous balloon valvuloplasty</b> — less effective than for MS (valve calcification)"))
story.append(bullet("<b>TV repair or replacement</b> — usually performed simultaneously with mitral valve surgery"))
story.append(bullet("Bioprosthetic valve preferred in tricuspid position (mechanical valves have high thrombosis rate due to lower right-sided pressures)"))
story.append(sp(8))
# ══ SECTION 6 — TRICUSPID REGURGITATION ═════════════════════════════════════
story += title_banner("6. TRICUSPID REGURGITATION (TR)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
story.append(bullet("<b>Secondary (functional) — >85% of cases:</b>"))
story.append(bullet("RV dilation from pulmonary HTN, left-sided disease, cardiomyopathy, RV MI", indent=1))
story.append(bullet("Atrial functional TR (dilated annulus from AF, without RV dilation)", indent=1))
story.append(bullet("CIED (pacemaker/ICD) lead-related injury", indent=1))
story.append(bullet("<b>Primary (organic):</b> rheumatic fever, infective endocarditis (IV drug users), carcinoid syndrome, myxomatous (TVP), Ebstein's anomaly, radiation, trauma"))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Systolic backflow RV → RA → RA volume overload → RA dilation + elevated RA pressure"))
story.append(bullet("Systemic venous congestion: JVD, hepatic congestion, ascites, edema"))
story.append(bullet("Hepatic vein systolic flow reversal on Doppler (severe TR)"))
story.append(bullet("Secondary hyperaldosteronism from hepatic congestion"))
story.append(sp(4))
story.append(p("<b>Physical Examination</b>", h3_style))
story.append(bullet("<b>Holosystolic murmur</b> at lower left sternal border — <b>louder on inspiration (Carvallo's sign)</b>"))
story.append(bullet("<b>Prominent c-v wave</b> in JVP with rapid y descent (systolic regurgitant wave)"))
story.append(bullet("Pulsatile enlarged liver"))
story.append(bullet("Positive hepatojugular reflux"))
story.append(bullet("Peripheral edema, ascites"))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "RVH or RBBB; RA enlargement (P pulmonale); AF common"))
story.append(kv("CXR", "RA + RV enlargement"))
story.append(kv("Echo", "RA + RV dilation; TR jet by color Doppler; hepatic vein systolic reversal; estimate PA systolic pressure via TR velocity (modified Bernoulli)"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("<b>Medical:</b> treat underlying cause (reduce pulmonary HTN, treat left-sided disease); diuretics; aldosterone antagonist (secondary hyperaldosteronism)"))
story.append(bullet("<b>TV repair/annuloplasty:</b> recommended for severe TR at time of left-sided valve surgery; also for moderate TR with annular dilation >40 mm"))
story.append(bullet("<b>TV replacement:</b> for non-reparable valves (carcinoid, severe Ebstein's)"))
story.append(bullet("<b>Transcatheter TEER:</b> FDA-approved (2024) for high surgical risk — reduces TR severity and improves QoL; mortality benefit not yet established"))
story.append(bullet("Isolated tricuspid surgery has high perioperative mortality (~8–9%) due to advanced RV dysfunction"))
story.append(sp(8))
story.append(PageBreak())
# ══ SECTION 7 — PULMONARY STENOSIS ══════════════════════════════════════════
story += title_banner("7. PULMONARY STENOSIS (PS)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
story.append(bullet("<b>Congenital — most common (~90%):</b> isolated, or part of tetralogy of Fallot, Noonan syndrome (dysplastic valve)"))
story.append(bullet("<b>Carcinoid syndrome:</b> fibrous plaques on RV side of pulmonary and tricuspid valves"))
story.append(bullet("Rare: rheumatic, post-radiation"))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Obstruction to RV outflow → RV pressure overload → concentric RVH"))
ps_sev_data = [
[p("Grade", tbl_header_style), p("Peak Gradient", tbl_header_style), p("Peak Velocity", tbl_header_style)],
[p("Mild", tbl_body_center), p("< 36 mmHg", tbl_body_center), p("< 3 m/s", tbl_body_center)],
[p("Moderate", tbl_body_center), p("36–64 mmHg", tbl_body_center), p("3–4 m/s", tbl_body_center)],
[p("Severe", tbl_body_center), p("> 64 mmHg", tbl_body_center), p("> 4 m/s", tbl_body_center)],
]
story.append(section_box("PS Severity", ps_sev_data, [W*0.33, W*0.34, W*0.33]))
story.append(sp(4))
story.append(bullet("Right-to-left shunt if patent foramen ovale (PFO) present with elevated RV pressures → cyanosis"))
story.append(sp(4))
story.append(p("<b>Symptoms</b>", h3_style))
story.append(bullet("Often <b>asymptomatic</b> (mild–moderate)"))
story.append(bullet("Severe: exertional dyspnea, fatigue; right heart failure; exertional syncope"))
story.append(bullet("Cyanosis if associated ASD/PFO with right-to-left shunting"))
story.append(sp(4))
story.append(p("<b>Physical Examination</b>", h3_style))
story.append(bullet("<b>Ejection click</b> (early systolic) — <b>uniquely decreases with inspiration</b> (unlike all other right-sided sounds)"))
story.append(bullet("<b>Harsh ejection systolic murmur</b> at upper left sternal border (2nd ICS), radiating to left shoulder/clavicle"))
story.append(bullet("Loud P2 in mild PS; <b>soft or absent P2</b> in severe PS"))
story.append(bullet("<b>RV heave</b> (pressure overload)"))
story.append(bullet("Wide split S2 (delayed pulmonic closure)"))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "RVH (tall R in V1, deep S in V6); RA enlargement (P pulmonale); RBBB"))
story.append(kv("CXR", "Normal or RV enlargement; post-stenotic pulmonary artery dilation"))
story.append(kv("Echo", "Domed/thickened valve; peak gradient by Doppler; RV wall thickness"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("Mild PS: observation only"))
story.append(bullet("<b>Percutaneous balloon pulmonary valvuloplasty (BPVP):</b> treatment of choice for symptomatic or severe congenital PS (gradient >50 mmHg) — excellent long-term results"))
story.append(bullet("<b>Surgical valvotomy:</b> if balloon not feasible (dysplastic valve in Noonan syndrome)"))
story.append(bullet("Carcinoid PS: valve replacement (fibrous/rigid valves not amenable to balloon)"))
story.append(sp(8))
# ══ SECTION 8 — PULMONARY REGURGITATION ═════════════════════════════════════
story += title_banner("8. PULMONARY REGURGITATION (PR)")
story.append(sp(6))
story.append(p("<b>Etiology</b>", h3_style))
story.append(bullet("<b>Iatrogenic — most common:</b> following repair of tetralogy of Fallot (pulmonary valvotomy/homograft)"))
story.append(bullet("<b>Secondary/functional:</b> pulmonary arterial hypertension → annular dilation ('Graham Steell murmur' context)"))
story.append(bullet("Post-balloon valvuloplasty for PS"))
story.append(bullet("Primary: infective endocarditis (IVDU), carcinoid, rheumatic (rare), congenital (absent pulmonary valve)"))
story.append(sp(4))
story.append(p("<b>Pathophysiology</b>", h3_style))
story.append(bullet("Diastolic backflow PA → RV → RV volume overload → RV dilation + eccentric RVH"))
story.append(bullet("RV initially tolerates volume overload well; progressive dilation → TR (annular dilation) → RV systolic dysfunction → right heart failure"))
story.append(bullet("Post-ToF repair: severe PR + RV dilation → arrhythmias, reduced exercise capacity, sudden cardiac death"))
story.append(sp(4))
story.append(p("<b>Symptoms</b>", h3_style))
story.append(bullet("Often asymptomatic for decades"))
story.append(bullet("Reduced exercise tolerance"))
story.append(bullet("Progressive right heart failure (edema, ascites)"))
story.append(bullet("Palpitations/arrhythmias (RV dilation — ventricular tachycardia in post-ToF patients)"))
story.append(bullet("Sudden cardiac death (post-ToF with severe PR + RV dilation)"))
story.append(sp(4))
story.append(p("<b>Physical Examination</b>", h3_style))
story.append(bullet("<b>Early diastolic murmur</b> at upper left sternal border (2nd–3rd ICS)"))
story.append(bullet("<b>Graham Steell murmur:</b> high-pitched early diastolic murmur from pulmonary HTN-related PR (resembles AR but at upper left sternal border)"))
story.append(bullet("RV heave (volume overload)"))
story.append(bullet("Wide split S2; loud P2 if pulmonary HTN is cause"))
story.append(bullet("Signs of RV failure in advanced disease"))
story.append(sp(4))
story.append(p("<b>Investigations</b>", h3_style))
story.append(kv("ECG", "RBBB (rsR' in V1) — RV volume overload; RVH if PA HTN; RA enlargement"))
story.append(kv("CXR", "RV enlargement; dilated pulmonary trunk"))
story.append(kv("Echo/CMR", "RV volume overload; PR regurgitant fraction; RV size and systolic function"))
story.append(sp(4))
story.append(p("<b>Management</b>", h3_style))
story.append(bullet("Mild PR + normal RV: observation only"))
story.append(bullet("PR with pulmonary HTN: treat underlying cause"))
story.append(bullet("<b>Pulmonary valve replacement (PVR):</b> symptomatic severe PR, or asymptomatic with RVEDV index >150–160 mL/m² or declining RV function"))
story.append(bullet("<b>Transcatheter PVR (Melody valve, SAPIEN valve):</b> FDA-approved for suitable conduit/dilated RVOT — becoming first-line in appropriate anatomy"))
story.append(bullet("Bioprosthetic valves preferred in pulmonary position"))
story.append(sp(8))
story.append(PageBreak())
# ══ COMPARATIVE TABLES ═══════════════════════════════════════════════════════
story.append(p("COMPARATIVE SUMMARY TABLES", make_style("CompTitle",
fontSize=16, textColor=C_DARK, fontName="Helvetica-Bold",
alignment=TA_CENTER, spaceAfter=4, spaceBefore=6)))
story.append(hr())
story.append(sp(6))
# TABLE A: Etiology Summary
story.append(p("<b>Table A — Etiology at a Glance</b>", h2_style))
etio_data = [
[p("Valve Lesion", tbl_header_style), p("Primary Cause", tbl_header_style), p("Other Key Causes", tbl_header_style)],
[p("Mitral Stenosis", tbl_body_style), p("Rheumatic fever", tbl_body_style), p("Congenital, MAC", tbl_body_style)],
[p("Mitral Regurgitation", tbl_body_style), p("MVP/degenerative", tbl_body_style), p("Ischemic, endocarditis, rheumatic", tbl_body_style)],
[p("Aortic Stenosis", tbl_body_style), p("Calcific/degenerative", tbl_body_style), p("Bicuspid AV, rheumatic", tbl_body_style)],
[p("Aortic Regurgitation", tbl_body_style), p("Annular dilation (HTN)", tbl_body_style), p("Bicuspid AV, endocarditis, Marfan's, dissection", tbl_body_style)],
[p("Tricuspid Stenosis", tbl_body_style), p("Rheumatic fever", tbl_body_style), p("Carcinoid, congenital", tbl_body_style)],
[p("Tricuspid Regurgitation", tbl_body_style), p("Functional (RV/annular dilation)", tbl_body_style), p("Endocarditis, Ebstein's, carcinoid, CIED", tbl_body_style)],
[p("Pulmonary Stenosis", tbl_body_style), p("Congenital", tbl_body_style), p("Carcinoid", tbl_body_style)],
[p("Pulmonary Regurgitation", tbl_body_style), p("Post-ToF repair (iatrogenic)", tbl_body_style), p("Pulmonary HTN, endocarditis, carcinoid", tbl_body_style)],
]
story.append(section_box("Etiology", etio_data, [W*0.28, W*0.3, W*0.42]))
story.append(sp(8))
# TABLE B: Murmur Comparison
story.append(p("<b>Table B — Murmur Comparison</b>", h2_style))
murmur_data = [
[p("Lesion", tbl_header_style), p("Type", tbl_header_style), p("Location", tbl_header_style),
p("Radiation", tbl_header_style), p("Key Features", tbl_header_style)],
[p("MS", tbl_body_style), p("Mid-diastolic rumble", tbl_body_style), p("Apex", tbl_body_style),
p("None", tbl_body_style), p("Low-pitched, bell; opening snap; pre-systolic accentuation", tbl_body_style)],
[p("MR", tbl_body_style), p("Holosystolic", tbl_body_style), p("Apex", tbl_body_style),
p("Axilla/back", tbl_body_style), p("Soft S1; S3 gallop; click + late murmur in MVP", tbl_body_style)],
[p("AS", tbl_body_style), p("Ejection systolic", tbl_body_style), p("RUSB", tbl_body_style),
p("Carotids", tbl_body_style), p("Crescendo-decrescendo; parvus et tardus; reduced A2; S4", tbl_body_style)],
[p("AR", tbl_body_style), p("Early diastolic", tbl_body_style), p("LLSB", tbl_body_style),
p("None", tbl_body_style), p("Blowing, decrescendo; Austin Flint murmur; wide pulse pressure", tbl_body_style)],
[p("TS", tbl_body_style), p("Mid-diastolic", tbl_body_style), p("LLSB", tbl_body_style),
p("None", tbl_body_style), p("Louder on inspiration; opening snap", tbl_body_style)],
[p("TR", tbl_body_style), p("Holosystolic", tbl_body_style), p("LLSB", tbl_body_style),
p("None", tbl_body_style), p("Louder on inspiration (Carvallo's sign); cv wave in JVP", tbl_body_style)],
[p("PS", tbl_body_style), p("Ejection systolic", tbl_body_style), p("ULSB", tbl_body_style),
p("L shoulder", tbl_body_style), p("Ejection click decreases on inspiration; wide split S2", tbl_body_style)],
[p("PR", tbl_body_style), p("Early diastolic", tbl_body_style), p("ULSB", tbl_body_style),
p("None", tbl_body_style), p("Graham Steell if PA HTN; RBBB on ECG", tbl_body_style)],
]
story.append(section_box("Murmurs", murmur_data, [W*0.08, W*0.17, W*0.09, W*0.12, W*0.54]))
story.append(sp(4))
story.append(p(
"<i>RUSB = right upper sternal border; LLSB = lower left sternal border; ULSB = upper left sternal border. "
"All right-sided murmurs (TS, TR, PS, PR) increase with inspiration (Carvallo's sign), except the pulmonary "
"ejection click which uniquely decreases with inspiration.</i>", small_style))
story.append(sp(8))
# TABLE C: Hemodynamics
story.append(p("<b>Table C — Hemodynamic Consequences</b>", h2_style))
hemo_data = [
[p("Lesion", tbl_header_style), p("Chamber Affected", tbl_header_style),
p("Overload Type", tbl_header_style), p("Chamber Response", tbl_header_style), p("Pulse Character", tbl_header_style)],
[p("MS", tbl_body_style), p("Left atrium", tbl_body_style), p("Pressure (upstream)", tbl_body_style), p("LA dilation; LVH absent", tbl_body_style), p("Small volume", tbl_body_style)],
[p("MR", tbl_body_style), p("Left ventricle", tbl_body_style), p("Volume", tbl_body_style), p("Eccentric LVH + LA dilation", tbl_body_style), p("Hyperdynamic", tbl_body_style)],
[p("AS", tbl_body_style), p("Left ventricle", tbl_body_style), p("Pressure", tbl_body_style), p("Concentric LVH", tbl_body_style), p("Parvus et tardus", tbl_body_style)],
[p("AR", tbl_body_style), p("Left ventricle", tbl_body_style), p("Volume", tbl_body_style), p("Eccentric LVH", tbl_body_style), p("Wide pulse pressure", tbl_body_style)],
[p("TS", tbl_body_style), p("Right atrium", tbl_body_style), p("Pressure (upstream)", tbl_body_style), p("RA dilation; RVH absent", tbl_body_style), p("Normal or small", tbl_body_style)],
[p("TR", tbl_body_style), p("Right ventricle", tbl_body_style), p("Volume", tbl_body_style), p("RV + RA dilation", tbl_body_style), p("Normal", tbl_body_style)],
[p("PS", tbl_body_style), p("Right ventricle", tbl_body_style), p("Pressure", tbl_body_style), p("Concentric RVH", tbl_body_style), p("Normal", tbl_body_style)],
[p("PR", tbl_body_style), p("Right ventricle", tbl_body_style), p("Volume", tbl_body_style), p("Eccentric RVH + RV dilation", tbl_body_style), p("Normal or bounding", tbl_body_style)],
]
story.append(section_box("Hemodynamics", hemo_data, [W*0.08, W*0.18, W*0.18, W*0.3, W*0.26]))
story.append(sp(8))
# TABLE D: Investigations
story.append(p("<b>Table D — Key Investigations</b>", h2_style))
inv_data = [
[p("Lesion", tbl_header_style), p("Echo Key Finding", tbl_header_style),
p("ECG", tbl_header_style), p("CXR", tbl_header_style)],
[p("MS", tbl_body_style), p("Hockey-stick AML; MVA by PHT; Wilkins score", tbl_body_style),
p("P mitrale; AF", tbl_body_style), p("LA enlargement; Kerley B; pulm edema", tbl_body_style)],
[p("MR", tbl_body_style), p("Flail/prolapsing leaflet; PISA; EF + LVESD", tbl_body_style),
p("LVH; AF", tbl_body_style), p("Cardiomegaly; LA + LV enlargement", tbl_body_style)],
[p("AS", tbl_body_style), p("Calcified valve; AVA by continuity equation; gradient", tbl_body_style),
p("LVH with strain", tbl_body_style), p("Aortic calcification; post-stenotic dilation", tbl_body_style)],
[p("AR", tbl_body_style), p("Regurgitant jet; LV size/EF; aortic root", tbl_body_style),
p("LVH", tbl_body_style), p("LV enlargement; aortic root dilation", tbl_body_style)],
[p("TS", tbl_body_style), p("Thickened leaflets; diastolic gradient; no pulm HTN", tbl_body_style),
p("RA enlargement (tall P; P pulmonale)", tbl_body_style), p("RA enlargement; no pulm HTN", tbl_body_style)],
[p("TR", tbl_body_style), p("RA+RV dilation; TR jet; hepatic vein reversal; PA pressure", tbl_body_style),
p("RVH/RBBB; RA enlargement; AF", tbl_body_style), p("RA + RV enlargement", tbl_body_style)],
[p("PS", tbl_body_style), p("Domed valve; peak gradient; RV wall thickness", tbl_body_style),
p("RVH; RA enlargement; RBBB", tbl_body_style), p("Normal or RV enlargement", tbl_body_style)],
[p("PR", tbl_body_style), p("RV volume overload; PR jet; RV size/function (CMR ideal)", tbl_body_style),
p("RBBB; RVH if PA HTN", tbl_body_style), p("RV enlargement; dilated PA", tbl_body_style)],
]
story.append(section_box("Investigations", inv_data, [W*0.08, W*0.37, W*0.25, W*0.30]))
story.append(sp(8))
story.append(PageBreak())
# TABLE E: Treatment Summary
story.append(p("<b>Table E — Management Summary</b>", h2_style))
mgmt_data = [
[p("Lesion", tbl_header_style), p("Medical", tbl_header_style),
p("Interventional", tbl_header_style), p("Key Notes", tbl_header_style)],
[p("MS", tbl_body_style), p("Rate control; diuretics; anticoagulation (AF)", tbl_body_style),
p("PMBV (Wilkins ≤8); MVR if unfavorable", tbl_body_style),
p("Rheumatic fever prophylaxis; PMBV safe in pregnancy", tbl_body_style)],
[p("MR", tbl_body_style), p("Vasodilators; HF therapy (secondary)", tbl_body_style),
p("Repair > replacement; MitraClip (high-risk)", tbl_body_style),
p("EF <60% or LVESD >40 mm = surgery threshold", tbl_body_style)],
[p("AS", tbl_body_style), p("Symptom management only", tbl_body_style),
p("SAVR or TAVR; no balloon in adults", tbl_body_style),
p("Angina/syncope/HF = urgent replacement", tbl_body_style)],
[p("AR", tbl_body_style), p("ACEi/ARB if hypertensive; vasodilators", tbl_body_style),
p("AVR; emergency surgery for acute AR", tbl_body_style),
p("EF <50% or LVESD >50 mm = replace", tbl_body_style)],
[p("TS", tbl_body_style), p("Diuretics; salt restriction", tbl_body_style),
p("Balloon valvuloplasty; TV repair/replacement at mitral surgery", tbl_body_style),
p("Bioprosthetic valve preferred in TV position", tbl_body_style)],
[p("TR", tbl_body_style), p("Diuretics (spironolactone); treat cause", tbl_body_style),
p("Annuloplasty at left-sided surgery; TEER (high-risk, FDA 2024)", tbl_body_style),
p("Isolated TV surgery: high perioperative mortality (~8–9%)", tbl_body_style)],
[p("PS", tbl_body_style), p("Observation (mild)", tbl_body_style),
p("Balloon valvuloplasty (first-line); surgical for dysplastic (Noonan)", tbl_body_style),
p("Excellent long-term results with balloon", tbl_body_style)],
[p("PR", tbl_body_style), p("Observation (mild/asymptomatic)", tbl_body_style),
p("PVR (surgical or TPVR — Melody/SAPIEN valve)", tbl_body_style),
p("Post-ToF: timing of PVR critical for RV preservation", tbl_body_style)],
]
story.append(section_box("Management", mgmt_data, [W*0.09, W*0.25, W*0.33, W*0.33]))
story.append(sp(8))
# Clinical Pearls Box
story.append(p("<b>Clinical Pearls</b>", h2_style))
pearls = [
("Inspiration rule", "All right-sided murmurs <i>increase</i> with inspiration (Carvallo's sign): TS, TR, PS, PR. Exception: the pulmonary ejection <i>click</i> uniquely <i>decreases</i> with inspiration."),
("Stenosis vs. Regurgitation overload", "Stenosis causes <b>pressure overload</b> (concentric hypertrophy); Regurgitation causes <b>volume overload</b> (eccentric hypertrophy/dilation)."),
("Masking effect of TS", "Tricuspid stenosis can mask coexisting MS by reducing cardiac output and thereby lowering pulmonary artery pressures."),
("AS symptom triad timing", "Once AS symptoms appear: angina (5 yr survival), syncope (3 yr), heart failure (1–2 yr) — replace urgently."),
("Acute vs. Chronic AR", "Acute AR has no time for LV dilation → sudden severe pulmonary edema with <i>normal</i> heart size on CXR (no cardiomegaly) — a key diagnostic clue."),
("EF in MR", "A 'normal' EF of 55–60% in severe MR may already represent LV dysfunction — use stricter threshold (EF <60%) for surgery."),
("Pregnancy", "MS is poorly tolerated in pregnancy (tachycardia reduces diastolic filling time, elevating LA pressure). PMBV can be safely performed. MR/AR are better tolerated."),
("Mechanical vs. bioprosthetic valve", "Mechanical valves: durable but require lifelong anticoagulation. Bioprosthetic: no anticoagulation needed but deteriorate faster (more slowly in elderly). Avoid mechanical in tricuspid position (high thrombosis risk)."),
]
for title_t, desc in pearls:
story.append(p(f"<b>{title_t}:</b> {desc}", body_style))
story.append(sp(2))
story.append(sp(10))
story.append(hr())
story.append(p(
"<i>Sources: Braunwald's Heart Disease, 11th Ed. (ISBN 9780323722193) · Harrison's Principles of Internal Medicine, 22nd Ed. (ISBN 9781265977061) · "
"Grainger & Allison's Diagnostic Radiology (ISBN 9780323760751). Compiled by Orris Medical Reference.</i>",
small_style
))
# ── BUILD ────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {OUTPUT}")
cd /home/daytona/workspace/valvular-heart-disease && python generate_pdf.py 2>&1
ls -lh /home/daytona/workspace/valvular-heart-disease/Valvular_Heart_Disease_Com…
Valvular Heart Disease Comparison
PDF Document · PDF