MAKE IT INTO A PPT FOR A MICROTEAACHING IN DETAILED EXPLANATION REGARDING THE ABOVE ATTACHED PHOTO AND ALSO ADD THE CASE MENTIONED HERE IN THE 2ND SLIDE AND ADD AIM AND OBJECTIVE IN THE 1ST SLIDE DETAILS OF THE PROCEDURE IN THE 3RD 4TH SLIDE AND SOME MORE CLINICAL IMPORTANCE AND AT LAST ADD THE QUERY IN THE MICROTEAACHING FORMAT
mkdir -p /tmp/workspace/dynamic-auscultation-ppt && ls /tmp/workspace/
~/dynamic-auscultation-ppt/create_ppt.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
import copy
from lxml import etree
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
# ─── Color Palette ────────────────────────────────────────────────
NAVY = RGBColor(0x0A, 0x2A, 0x5E) # dark navy blue
CRIMSON = RGBColor(0xC0, 0x20, 0x2F) # medical red
GOLD = RGBColor(0xF0, 0xA5, 0x00) # accent gold
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_BLUE = RGBColor(0xE8, 0xF1, 0xFB)
DARK_GRAY = RGBColor(0x2C, 0x2C, 0x2C)
MID_GRAY = RGBColor(0x55, 0x55, 0x55)
TEAL = RGBColor(0x00, 0x7B, 0x83)
GREEN = RGBColor(0x1A, 0x7A, 0x1A)
ORANGE = RGBColor(0xE0, 0x60, 0x00)
LIGHT_NAVY = RGBColor(0x1A, 0x3F, 0x8A)
blank_layout = prs.slide_layouts[6]
# ─── Helper Functions ─────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_color, border_color=None):
shape = slide.shapes.add_shape(1, Inches(x), Inches(y), Inches(w), Inches(h))
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
if border_color:
shape.line.color.rgb = border_color
shape.line.width = Pt(1)
else:
shape.line.fill.background()
return shape
def add_textbox(slide, text, x, y, w, h, font_name="Calibri", size=14, bold=False,
color=DARK_GRAY, align=PP_ALIGN.LEFT, italic=False, wrap=True):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.02)
tf.margin_bottom = Inches(0.02)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.name = font_name
run.font.size = Pt(size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
return tf
def add_para(tf, text, size=13, bold=False, color=DARK_GRAY, align=PP_ALIGN.LEFT,
italic=False, space_before=6, indent=0):
p = tf.add_paragraph()
p.alignment = align
p.space_before = Pt(space_before)
if indent:
p.level = indent
run = p.add_run()
run.text = text
run.font.name = "Calibri"
run.font.size = Pt(size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
return p
def add_bullet_para(tf, text, size=12.5, color=DARK_GRAY, bold_prefix=None, rest_text=None):
"""Add a bullet point; optionally bold_prefix + rest_text for bold+normal in one line."""
p = tf.add_paragraph()
p.alignment = PP_ALIGN.LEFT
p.space_before = Pt(4)
# bullet symbol
run_bullet = p.add_run()
run_bullet.text = " \u2022 "
run_bullet.font.size = Pt(size)
run_bullet.font.color.rgb = CRIMSON
run_bullet.font.bold = True
run_bullet.font.name = "Calibri"
if bold_prefix:
rb = p.add_run()
rb.text = bold_prefix
rb.font.size = Pt(size)
rb.font.bold = True
rb.font.color.rgb = NAVY
rb.font.name = "Calibri"
rn = p.add_run()
rn.text = rest_text if rest_text else ""
rn.font.size = Pt(size)
rn.font.color.rgb = color
rn.font.name = "Calibri"
else:
run = p.add_run()
run.text = text
run.font.size = Pt(size)
run.font.color.rgb = color
run.font.bold = False
run.font.name = "Calibri"
# ══════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE / AIM & OBJECTIVES
# ══════════════════════════════════════════════════════════════════
slide1 = prs.slides.add_slide(blank_layout)
# Full navy background
add_rect(slide1, 0, 0, 13.333, 7.5, NAVY)
# Red accent bar left
add_rect(slide1, 0, 0, 0.4, 7.5, CRIMSON)
# Gold divider line
add_rect(slide1, 0.4, 3.05, 12.933, 0.06, GOLD)
# Top label
tf_label = add_textbox(slide1, "MICROTEACHING PRESENTATION", 0.6, 0.2, 12, 0.45,
size=11, bold=True, color=GOLD, align=PP_ALIGN.LEFT)
# Heart-beat icon simulation (text)
add_textbox(slide1, "♥", 11.5, 0.15, 1.5, 0.6, size=22, color=CRIMSON, align=PP_ALIGN.RIGHT)
# Main Title
tf_title = add_textbox(slide1, "Dynamic Auscultation", 0.6, 0.75, 12.5, 1.05,
font_name="Calibri", size=46, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
# Subtitle
tf_sub = add_textbox(slide1, "The Physiological Stress Test | HOCM vs. Aortic Stenosis",
0.6, 1.85, 12.5, 0.6,
font_name="Calibri", size=20, bold=False, color=GOLD, align=PP_ALIGN.LEFT)
# Tagline
add_textbox(slide1, "Differentiating life-threatening murmurs at the bedside — without an Echo",
0.6, 2.5, 12.5, 0.5,
font_name="Calibri", size=14, bold=False, color=RGBColor(0xB0,0xC8,0xFF), align=PP_ALIGN.LEFT,
italic=True)
# ── AIM box (left panel) ──────────────────────────────────────────
add_rect(slide1, 0.55, 3.25, 5.8, 3.8, RGBColor(0x0D, 0x35, 0x70))
tf_aim = add_textbox(slide1, "AIM", 0.75, 3.3, 5.4, 0.4,
size=15, bold=True, color=GOLD, align=PP_ALIGN.LEFT)
add_para(tf_aim, "To teach PG trainees how bedside dynamic maneuvers change the intensity "
"of cardiac murmurs, enabling accurate clinical differentiation of Hypertrophic "
"Obstructive Cardiomyopathy (HOCM) from Aortic Stenosis (AS) — without echocardiography.",
size=12.5, color=WHITE)
# ── OBJECTIVES box (right panel) ──────────────────────────────────
add_rect(slide1, 6.6, 3.25, 6.4, 3.8, RGBColor(0x0D, 0x35, 0x70))
tf_obj = add_textbox(slide1, "LEARNING OBJECTIVES", 6.8, 3.3, 6.0, 0.4,
size=15, bold=True, color=GOLD, align=PP_ALIGN.LEFT)
for obj in [
"Explain the physiological basis of preload-dependent murmur changes",
"Correctly perform & interpret the Valsalva maneuver and squatting/leg-raise",
"Construct a 2×2 matrix contrasting HOCM vs. AS responses",
"Identify Wide Fixed Splitting vs. Paradoxical Splitting of S₂",
"Apply carotid-precordial synchronization to time murmurs in tachycardia",
"Answer OSCE/viva-style questions on dynamic auscultation with confidence",
]:
add_bullet_para(tf_obj, obj, size=12, color=WHITE)
# Bottom footer
add_rect(slide1, 0, 7.1, 13.333, 0.4, RGBColor(0x06, 0x19, 0x40))
add_textbox(slide1, "7-Minute High-Impact Microteaching | Cardiovascular Examination | PG Medicine",
0.4, 7.12, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 2 — CLINICAL CASE (PG HOOK)
# ══════════════════════════════════════════════════════════════════
slide2 = prs.slides.add_slide(blank_layout)
# Background
add_rect(slide2, 0, 0, 13.333, 7.5, RGBColor(0xF4, 0xF7, 0xFF))
# Header bar
add_rect(slide2, 0, 0, 13.333, 1.0, NAVY)
add_rect(slide2, 0, 0, 0.5, 1.0, CRIMSON)
add_textbox(slide2, "SLIDE 2 | CLINICAL CASE", 0.65, 0.05, 6, 0.35,
size=11, bold=True, color=GOLD)
add_textbox(slide2, "Minute 0–1: The PG Hook (Problem-Based)", 0.65, 0.45, 10, 0.45,
size=16, bold=True, color=WHITE)
add_textbox(slide2, "⏱", 12.0, 0.1, 1.0, 0.8, size=28, color=GOLD, align=PP_ALIGN.RIGHT)
# Case scenario header
add_rect(slide2, 0.5, 1.15, 12.333, 0.48, CRIMSON)
add_textbox(slide2, "🚨 RAPID-FIRE CASE SCENARIO — YOU ARE IN THE ICCU", 0.65, 1.2, 12, 0.38,
size=14, bold=True, color=WHITE)
# Case text box
add_rect(slide2, 0.5, 1.7, 12.333, 1.9, RGBColor(0xFF, 0xF0, 0xF0))
tf_case = add_textbox(slide2,
'"You are in the ICCU. A 22-year-old male athlete collapsed and syncoped on the field.',
0.7, 1.78, 11.9, 0.4, size=14.5, bold=False, color=DARK_GRAY, italic=True)
add_para(tf_case,
'On examination: Heart rate 98 bpm, BP 110/70 mmHg. You auscultate a harsh, grade 3/6 '
'crescendo-decrescendo systolic murmur, heard best at the left sternal border.',
size=14.5, italic=True, color=DARK_GRAY)
add_para(tf_case,
'ECG shows LVH with repolarization changes. Echo is NOT immediately available.',
size=14.5, italic=True, color=DARK_GRAY)
add_para(tf_case, '', size=6)
add_para(tf_case,
'Is this benign aortic sclerosis — or a life-threatening HOCM? Today, we will '
'differentiate them in 2 minutes without an Echo."',
size=15, bold=True, italic=True, color=CRIMSON)
# ── Two question boxes ────────────────────────────────────────────
add_rect(slide2, 0.5, 3.72, 5.9, 1.4, NAVY)
tf_q1 = add_textbox(slide2, "❓ THE CLINICAL DILEMMA", 0.7, 3.78, 5.5, 0.35,
size=13, bold=True, color=GOLD)
add_para(tf_q1, "Both HOCM and Aortic Stenosis produce a SYSTOLIC murmur.", size=12.5, color=WHITE)
add_para(tf_q1, "Both can cause syncope, dyspnea & angina.", size=12.5, color=WHITE)
add_para(tf_q1, "They SOUND similar on basic auscultation.", size=12.5, color=WHITE)
add_rect(slide2, 6.7, 3.72, 6.13, 1.4, TEAL)
tf_q2 = add_textbox(slide2, "💡 THE KEY DIFFERENTIATOR", 6.9, 3.78, 5.8, 0.35,
size=13, bold=True, color=GOLD)
add_para(tf_q2, "Dynamic maneuvers change PRELOAD.", size=12.5, color=WHITE)
add_para(tf_q2, "Preload change → Opposite murmur responses in HOCM vs. AS.", size=12.5, color=WHITE)
add_para(tf_q2, "Valsalva specificity for HOCM: >90% (AHA guidelines).", size=12.5, color=WHITE)
# ── Why it matters ────────────────────────────────────────────────
add_rect(slide2, 0.5, 5.28, 12.333, 1.05, RGBColor(0xFF, 0xF7, 0xE0))
tf_why = add_textbox(slide2, "WHY THIS MATTERS", 0.7, 5.32, 5, 0.35,
size=13, bold=True, color=CRIMSON)
add_para(tf_why, "HOCM is the #1 cause of sudden cardiac death in young athletes. "
"Misdiagnosis as innocent murmur or AS can be fatal. "
"β-blockers (used in HOCM) worsen symptoms in severe AS. "
"Correct bedside diagnosis guides IMMEDIATE management decisions.", size=12.5, color=DARK_GRAY)
# Footer
add_rect(slide2, 0, 6.45, 13.333, 0.05, GOLD)
add_rect(slide2, 0, 7.1, 13.333, 0.4, NAVY)
add_textbox(slide2, "Dynamic Auscultation | Microteaching | Slide 2 of 8",
0.4, 7.13, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 3 — PROCEDURE: PHYSIOLOGY & MANEUVERS (Part 1)
# ══════════════════════════════════════════════════════════════════
slide3 = prs.slides.add_slide(blank_layout)
add_rect(slide3, 0, 0, 13.333, 7.5, RGBColor(0xF4, 0xF7, 0xFF))
add_rect(slide3, 0, 0, 13.333, 1.0, NAVY)
add_rect(slide3, 0, 0, 0.5, 1.0, CRIMSON)
add_textbox(slide3, "SLIDE 3 | PROCEDURE & PHYSIOLOGY", 0.65, 0.05, 8, 0.35,
size=11, bold=True, color=GOLD)
add_textbox(slide3, "Minute 1–3: The Concept Matrix — How Preload Flips the Murmur",
0.65, 0.45, 12, 0.45, size=16, bold=True, color=WHITE)
# ── Physiology panel left ─────────────────────────────────────────
add_rect(slide3, 0.5, 1.1, 4.0, 5.95, NAVY)
tf_phys = add_textbox(slide3, "PHYSIOLOGICAL BASIS", 0.65, 1.15, 3.7, 0.4,
size=13, bold=True, color=GOLD)
add_para(tf_phys, "HOCM: Dynamic LVOT Obstruction", size=12.5, bold=True, color=WHITE)
add_para(tf_phys,
"SAM (Systolic Anterior Motion) of mitral leaflet + asymmetric septal hypertrophy "
"cause dynamic obstruction of LVOT.", size=11.5, color=RGBColor(0xC8,0xDC,0xFF))
add_para(tf_phys, "", size=4)
add_para(tf_phys, "⬇ Preload → LV cavity shrinks → LVOT narrower → Obstruction WORSENS → Murmur LOUDER",
size=12, bold=True, color=GOLD)
add_para(tf_phys, "", size=4)
add_para(tf_phys, "⬆ Preload → LV cavity enlarges → LVOT wider → Obstruction LESSENS → Murmur SOFTER",
size=12, bold=True, color=RGBColor(0x90, 0xFF, 0x90))
add_para(tf_phys, "", size=6)
add_para(tf_phys, "AORTIC STENOSIS: Fixed Valve Obstruction", size=12.5, bold=True, color=WHITE)
add_para(tf_phys,
"Calcified / congenitally bicuspid aortic valve. Obstruction is at the valve level — "
"FIXED regardless of LV size.", size=11.5, color=RGBColor(0xC8,0xDC,0xFF))
add_para(tf_phys, "", size=4)
add_para(tf_phys,
"⬆ Preload → more blood flows across the stenosed valve → Murmur LOUDER",
size=12, bold=True, color=RGBColor(0x90, 0xFF, 0x90))
add_para(tf_phys, "", size=4)
add_para(tf_phys,
"⬇ Preload → less flow across valve → Murmur SOFTER",
size=12, bold=True, color=GOLD)
# ── 2×2 Matrix center/right ───────────────────────────────────────
add_rect(slide3, 4.8, 1.1, 8.1, 0.45, CRIMSON)
add_textbox(slide3, "THE 2×2 DIAGNOSTIC MATRIX", 4.95, 1.15, 7.9, 0.35,
size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Matrix headers
add_rect(slide3, 4.8, 1.6, 3.9, 0.42, LIGHT_NAVY)
add_textbox(slide3, "MANEUVER / EFFECT", 4.85, 1.62, 3.8, 0.38,
size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(slide3, 8.75, 1.6, 2.0, 0.42, TEAL)
add_textbox(slide3, "HOCM", 8.78, 1.62, 1.95, 0.38,
size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(slide3, 10.8, 1.6, 2.1, 0.42, TEAL)
add_textbox(slide3, "Aortic Stenosis", 10.83, 1.62, 2.0, 0.38,
size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
rows = [
("Valsalva (strain phase)\n⬇ Preload", "⬆ LOUDER", "⬇ SOFTER", RGBColor(0xFF,0xF0,0xF0), RGBColor(0xFF,0xE0,0xE0), RGBColor(0xE0,0xFF,0xE0)),
("Squatting / Passive Leg Raise\n⬆ Preload", "⬇ SOFTER", "⬆ LOUDER", RGBColor(0xF0,0xFF,0xF0), RGBColor(0xE0,0xFF,0xE0), RGBColor(0xFF,0xE0,0xE0)),
("Standing from Squat\n⬇ Preload", "⬆ LOUDER", "⬇ SOFTER", RGBColor(0xFF,0xF5,0xE8), RGBColor(0xFF,0xE8,0xD0), RGBColor(0xE0,0xF5,0xE0)),
("Handgrip (⬆ Afterload)", "⬇ Slightly softer", "⬇ Slightly softer", RGBColor(0xF0,0xF4,0xFF), RGBColor(0xE0,0xEC,0xFF), RGBColor(0xE0,0xEC,0xFF)),
("Amyl Nitrite (⬇ Afterload)", "⬆ LOUDER", "⬇ SOFTER", RGBColor(0xFF,0xF0,0xFF), RGBColor(0xFF,0xE0,0xFF), RGBColor(0xE0,0xFF,0xFF)),
]
for i, (maneuver, hocm, as_, bg_m, bg_h, bg_a) in enumerate(rows):
y = 2.08 + i*0.78
add_rect(slide3, 4.8, y, 3.9, 0.72, bg_m, RGBColor(0xCC,0xCC,0xCC))
add_textbox(slide3, maneuver, 4.85, y+0.04, 3.78, 0.64, size=11, color=DARK_GRAY)
add_rect(slide3, 8.75, y, 2.0, 0.72, bg_h, RGBColor(0xCC,0xCC,0xCC))
h_color = CRIMSON if "LOUDER" in hocm else GREEN
add_textbox(slide3, hocm, 8.78, y+0.04, 1.92, 0.64, size=12, bold=True,
color=h_color, align=PP_ALIGN.CENTER)
add_rect(slide3, 10.8, y, 2.1, 0.72, bg_a, RGBColor(0xCC,0xCC,0xCC))
a_color = GREEN if "LOUDER" in as_ else CRIMSON
add_textbox(slide3, as_, 10.83, y+0.04, 2.0, 0.64, size=12, bold=True,
color=a_color, align=PP_ALIGN.CENTER)
# Memory tip
add_rect(slide3, 4.8, 6.18, 8.1, 0.85, RGBColor(0xFF, 0xF7, 0xD0))
tf_mem = add_textbox(slide3, "🧠 MEMORY TIP: ", 4.95, 6.22, 2.5, 0.35,
size=13, bold=True, color=CRIMSON)
add_para(tf_mem, '"HOCM HATES squatting" (preload increase collapses the gradient) | '
'"AS APPRECIATES squatting" (more flow = louder murmur)', size=12.5, italic=True, color=DARK_GRAY)
add_rect(slide3, 0, 7.1, 13.333, 0.4, NAVY)
add_textbox(slide3, "Dynamic Auscultation | Microteaching | Slide 3 of 8",
0.4, 7.13, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 4 — PROCEDURE: PERFORMING THE MANEUVERS (Step-by-Step)
# ══════════════════════════════════════════════════════════════════
slide4 = prs.slides.add_slide(blank_layout)
add_rect(slide4, 0, 0, 13.333, 7.5, RGBColor(0xF2, 0xF5, 0xFF))
add_rect(slide4, 0, 0, 13.333, 1.0, NAVY)
add_rect(slide4, 0, 0, 0.5, 1.0, CRIMSON)
add_textbox(slide4, "SLIDE 4 | PROCEDURE — STEP BY STEP", 0.65, 0.05, 8, 0.35,
size=11, bold=True, color=GOLD)
add_textbox(slide4, "How to Perform Dynamic Maneuvers at the Bedside",
0.65, 0.45, 12, 0.45, size=16, bold=True, color=WHITE)
# ── Valsalva Panel ────────────────────────────────────────────────
add_rect(slide4, 0.5, 1.1, 5.9, 5.6, NAVY)
add_rect(slide4, 0.5, 1.1, 5.9, 0.45, CRIMSON)
add_textbox(slide4, "VALSALVA MANEUVER", 0.65, 1.14, 5.6, 0.37,
size=14, bold=True, color=WHITE)
tf_v = add_textbox(slide4, "Definition:", 0.7, 1.62, 5.5, 0.3,
size=12.5, bold=True, color=GOLD)
add_para(tf_v, "Forced expiration against a closed glottis — straining phase.", size=12, color=WHITE)
add_para(tf_v, "", size=4)
add_para(tf_v, "TECHNIQUE (4 Phases):", size=12.5, bold=True, color=GOLD)
for step in [
("Phase 1", "Initial deep inspiration"),
("Phase 2 (key)", "Strain for 10–15 sec against closed glottis — ⬇ venous return → ⬇ preload"),
("Phase 3", "Release of strain — sudden ⬆ venous return"),
("Phase 4", "Overshoot bradycardia via baroreceptor reflex"),
]:
add_para(tf_v, f" {step[0]}: {step[1]}", size=11.5, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_v, "", size=4)
add_para(tf_v, "AUSCULTATION TIMING:", size=12.5, bold=True, color=GOLD)
add_para(tf_v, " Listen DURING Phase 2 (strain) for the murmur change.", size=12, color=WHITE)
add_para(tf_v, "", size=4)
add_para(tf_v, "INTERPRETATION:", size=12.5, bold=True, color=GOLD)
add_para(tf_v, " ⬆ Louder during strain → HOCM (specificity >90%)", size=12, bold=True, color=GOLD)
add_para(tf_v, " ⬇ Softer during strain → Aortic Stenosis", size=12, bold=True, color=RGBColor(0x90,0xFF,0x90))
add_para(tf_v, "", size=4)
add_para(tf_v, "CONTRAINDICATIONS:", size=12.5, bold=True, color=GOLD)
add_para(tf_v, " Glaucoma, severe HTN (>180/110), retinopathy, recent MI.", size=11.5, color=RGBColor(0xFF,0xC0,0xC0))
# ── Squatting / Leg Raise Panel ───────────────────────────────────
add_rect(slide4, 6.65, 1.1, 6.2, 5.6, RGBColor(0x0D, 0x35, 0x70))
add_rect(slide4, 6.65, 1.1, 6.2, 0.45, TEAL)
add_textbox(slide4, "SQUATTING / PASSIVE LEG RAISE", 6.8, 1.14, 5.9, 0.37,
size=14, bold=True, color=WHITE)
tf_s = add_textbox(slide4, "SQUATTING:", 6.8, 1.62, 5.8, 0.3,
size=12.5, bold=True, color=GOLD)
add_para(tf_s, "Ask patient to squat from standing position for 10–15 seconds.", size=12, color=WHITE)
add_para(tf_s, "Mechanism: ⬆ venous return → ⬆ preload + ⬆ afterload.", size=12, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_s, "", size=4)
add_para(tf_s, "PASSIVE LEG RAISE (PLR):", size=12.5, bold=True, color=GOLD)
add_para(tf_s, "Patient supine; raise both legs to 45° for 30–60 seconds.", size=12, color=WHITE)
add_para(tf_s, "Auto-transfuses ~300–500 mL from lower limbs → ⬆ preload.", size=12, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_s, "", size=4)
add_para(tf_s, "INTERPRETATION:", size=12.5, bold=True, color=GOLD)
add_para(tf_s, " Murmur SOFTER → HOCM (LV cavity expands, gradient collapses)", size=12, bold=True, color=RGBColor(0x90,0xFF,0x90))
add_para(tf_s, " Murmur LOUDER → Aortic Stenosis (more flow across fixed stenosis)", size=12, bold=True, color=GOLD)
add_para(tf_s, "", size=4)
add_para(tf_s, "CLINICAL PEARL:", size=12.5, bold=True, color=GOLD)
add_para(tf_s, " PLR is safer for acutely ill patients & can be reversed instantly.", size=11.5, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_s, " Combine Valsalva + PLR to confirm diagnosis at the bedside.", size=11.5, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_s, "", size=4)
add_para(tf_s, "CAROTID-PRECORDIAL SYNC:", size=12.5, bold=True, color=GOLD)
add_para(tf_s, " Palpate carotid pulse simultaneously while auscultating precordium.", size=11.5, color=WHITE)
add_para(tf_s, " Helps TIME murmur precisely (early vs. mid vs. late systolic) even at high HR.", size=11.5, color=WHITE)
# Stethoscope tip box
add_rect(slide4, 0.5, 6.78, 12.333, 0.28, GOLD)
add_textbox(slide4, "🩺 STETHOSCOPE TIPS: Use DIAPHRAGM for high-pitched murmurs (AS). "
"Use BELL (light pressure) for low-pitched sounds & S3/S4.",
0.65, 6.79, 12.0, 0.26, size=11.5, bold=True, color=DARK_GRAY, align=PP_ALIGN.CENTER)
add_rect(slide4, 0, 7.1, 13.333, 0.4, NAVY)
add_textbox(slide4, "Dynamic Auscultation | Microteaching | Slide 4 of 8",
0.4, 7.13, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 5 — S₂ SPLITTING & CAROTID-PRECORDIAL SYNCHRONIZATION
# ══════════════════════════════════════════════════════════════════
slide5 = prs.slides.add_slide(blank_layout)
add_rect(slide5, 0, 0, 13.333, 7.5, RGBColor(0xF4, 0xF7, 0xFF))
add_rect(slide5, 0, 0, 13.333, 1.0, NAVY)
add_rect(slide5, 0, 0, 0.5, 1.0, CRIMSON)
add_textbox(slide5, "SLIDE 5 | CLINICAL IMPORTANCE — ADVANCED AUSCULTATION", 0.65, 0.05, 9, 0.35,
size=11, bold=True, color=GOLD)
add_textbox(slide5, "The Art of Splitting (S₂) + Carotid-Precordial Synchronization",
0.65, 0.45, 12, 0.45, size=16, bold=True, color=WHITE)
# ── S2 Splitting left ─────────────────────────────────────────────
add_rect(slide5, 0.5, 1.1, 6.2, 5.55, NAVY)
add_rect(slide5, 0.5, 1.1, 6.2, 0.42, TEAL)
add_textbox(slide5, "THE ART OF S₂ SPLITTING", 0.65, 1.13, 6.0, 0.36,
size=14, bold=True, color=WHITE)
tf_s2 = add_textbox(slide5, "Normal Physiological Splitting:", 0.68, 1.6, 5.9, 0.32,
size=12.5, bold=True, color=GOLD)
add_para(tf_s2, "A₂ (aortic closure) → P₂ (pulmonic closure). During inspiration: increased "
"venous return delays P₂ → widens splitting.", size=11.5, color=WHITE)
add_para(tf_s2, "", size=5)
add_para(tf_s2, "WIDE FIXED SPLITTING:", size=12.5, bold=True, color=GOLD)
add_para(tf_s2, " • Cause: Atrial Septal Defect (ASD)", size=12, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_s2, " • Splitting wide AND fixed — doesn't change with breathing", size=12, color=WHITE)
add_para(tf_s2, " • Why: Constant left-to-right shunt equalizes pressures regardless of respiration", size=11.5, color=RGBColor(0xA0,0xC0,0xFF))
add_para(tf_s2, "", size=5)
add_para(tf_s2, "PARADOXICAL (REVERSED) SPLITTING:", size=12.5, bold=True, color=GOLD)
add_para(tf_s2, " • Causes: LBBB, Severe Aortic Stenosis, HCM, RV pacing", size=12, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_s2, " • P₂ comes BEFORE A₂ (LV delayed, P₂ now leads)", size=12, color=WHITE)
add_para(tf_s2, " • Splitting heard on EXPIRATION; narrows or disappears on inspiration", size=11.5, color=RGBColor(0xA0,0xC0,0xFF))
add_para(tf_s2, "", size=5)
add_para(tf_s2, "NARROW / ABSENT SPLITTING:", size=12.5, bold=True, color=GOLD)
add_para(tf_s2, " • Pulmonary HTN (loud P₂, early closure), Severe AS (soft A₂)", size=12, color=WHITE)
add_para(tf_s2, "", size=5)
add_para(tf_s2, "TEACHING INNOVATION:", size=12.5, bold=True, color=GOLD)
add_para(tf_s2, " Use voice/metronome to mimic acoustic timing. Have trainees close eyes "
"to identify blind audio patterns — multisensory audio-visual approach.", size=11.5, color=RGBColor(0xC0,0xD8,0xFF))
# ── Carotid-Precordial right ──────────────────────────────────────
add_rect(slide5, 6.95, 1.1, 5.9, 5.55, RGBColor(0x0D, 0x35, 0x70))
add_rect(slide5, 6.95, 1.1, 5.9, 0.42, CRIMSON)
add_textbox(slide5, "CAROTID-PRECORDIAL SYNCHRONIZATION", 7.1, 1.13, 5.65, 0.36,
size=13, bold=True, color=WHITE)
tf_cp = add_textbox(slide5, "The Clinical Problem:", 7.1, 1.6, 5.6, 0.32,
size=12.5, bold=True, color=GOLD)
add_para(tf_cp, "At HR >100 bpm, it is extremely difficult to time systolic vs. diastolic "
"events by ear alone.", size=11.5, color=WHITE)
add_para(tf_cp, "", size=5)
add_para(tf_cp, "THE TECHNIQUE:", size=12.5, bold=True, color=GOLD)
add_para(tf_cp, " 1. Place stethoscope on precordium at the auscultation area of interest",
size=12, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_cp, " 2. Simultaneously palpate the RIGHT carotid artery with 2 fingers",
size=12, color=RGBColor(0xC0,0xD8,0xFF))
add_para(tf_cp, " 3. Carotid upstroke = START of systole (after S₁)", size=12, color=WHITE)
add_para(tf_cp, " 4. Any murmur heard SIMULTANEOUSLY with carotid = systolic", size=12, color=WHITE)
add_para(tf_cp, " 5. Murmur heard in the PAUSE between pulses = diastolic", size=12, color=White if False else WHITE)
add_para(tf_cp, "", size=5)
add_para(tf_cp, "CLINICAL UTILITY:", size=12.5, bold=True, color=GOLD)
for pt in [
"Isolates early-systolic (innocent/HOCM) from mid-systolic (AS) murmurs",
"Identifies diastolic murmur of AR (immediately after carotid pulse)",
"Essential in AF where heart rate varies beat-to-beat",
"Helps confirm S₃ gallop (just after carotid — S1-S2-S3 sequence)",
]:
add_bullet_para(tf_cp, pt, size=11.5, color=WHITE)
add_para(tf_cp, "", size=5)
add_para(tf_cp, "TEACHING INNOVATION:", size=12.5, bold=True, color=GOLD)
add_para(tf_cp, "Pair trainees — one taps chaotic rhythm on desk, partner locates "
"own carotid pulse to practice synchronization under pressure.", size=11.5, color=RGBColor(0xC0,0xD8,0xFF))
add_rect(slide5, 0, 7.1, 13.333, 0.4, NAVY)
add_textbox(slide5, "Dynamic Auscultation | Microteaching | Slide 5 of 8",
0.4, 7.13, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 6 — CLINICAL IMPORTANCE & SPECIAL SCENARIOS
# ══════════════════════════════════════════════════════════════════
slide6 = prs.slides.add_slide(blank_layout)
add_rect(slide6, 0, 0, 13.333, 7.5, RGBColor(0xF4, 0xF7, 0xFF))
add_rect(slide6, 0, 0, 13.333, 1.0, NAVY)
add_rect(slide6, 0, 0, 0.5, 1.0, CRIMSON)
add_textbox(slide6, "SLIDE 6 | CLINICAL IMPORTANCE", 0.65, 0.05, 8, 0.35,
size=11, bold=True, color=GOLD)
add_textbox(slide6, "Why Dynamic Auscultation Is a Non-Negotiable Bedside Skill",
0.65, 0.45, 12, 0.45, size=16, bold=True, color=WHITE)
# ── 6 clinical importance boxes (3x2 grid) ───────────────────────
importance_data = [
("🏥 Avoids Misdiagnosis",
"HOCM misdiagnosed as benign murmur is the leading cause of preventable sudden "
"cardiac death in athletes under 35. Dynamic auscultation prevents this."),
("💊 Guides Drug Choice",
"β-blockers & disopyramide are first-line for HOCM. Vasodilators (used in AS) "
"are DANGEROUS in HOCM — worsen obstruction. Correct diagnosis is life-saving."),
("🏆 OSCE High-Yield",
"Dynamic auscultation is consistently tested in MD/DNB/MRCP finals. "
"Examiners specifically probe: 'What happens to the murmur on squatting?'"),
("📊 Diagnostic Accuracy",
"Valsalva specificity for HOCM: >90% (AHA). PLR sensitivity for volume "
"responsiveness: ~85%. These rival many echocardiographic parameters."),
("🚑 Emergency Decision-Making",
"In resource-limited settings (field, PHC, duty ward at night), bedside maneuvers "
"provide IMMEDIATE hemodynamic information without waiting for Echo."),
("🔬 Pathophysiology Integration",
"Maneuver responses integrate Starling's law, Frank-Starling mechanism, baroreceptor "
"reflexes, and ventricular geometry — bridging basic science to clinical medicine."),
]
for idx, (title, body) in enumerate(importance_data):
row, col = divmod(idx, 3)
x = 0.5 + col * 4.28
y = 1.18 + row * 2.2
add_rect(slide6, x, y, 4.1, 2.05, NAVY if row == 0 else RGBColor(0x0D, 0x35, 0x70))
add_rect(slide6, x, y, 4.1, 0.4, TEAL if row == 0 else CRIMSON)
add_textbox(slide6, title, x+0.1, y+0.04, 3.9, 0.32, size=12.5, bold=True, color=WHITE)
add_textbox(slide6, body, x+0.12, y+0.48, 3.86, 1.45, size=11, color=RGBColor(0xC8,0xDC,0xFF), wrap=True)
# Bottom tip
add_rect(slide6, 0.5, 5.62, 12.333, 0.65, RGBColor(0xFF, 0xF7, 0xD0))
tf_tip = add_textbox(slide6, "💡 ADVANCED TIP FOR EVALUATION: ", 0.65, 5.66, 4.5, 0.35,
size=13, bold=True, color=CRIMSON)
add_para(tf_tip,
'Avoid putting textbook definitions of S₁ and S₂ on your slides — evaluators will mark you down for '
'treating PGs like undergraduates. Instead, cite diagnostic utility stats: '
'"The specificity of the Valsalva maneuver for HOCM is over 90%." Reference current AHA/ESC cardiology guidelines.',
size=12.5, color=DARK_GRAY)
add_rect(slide6, 0, 7.1, 13.333, 0.4, NAVY)
add_textbox(slide6, "Dynamic Auscultation | Microteaching | Slide 6 of 8",
0.4, 7.13, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 7 — PEER SIMULATION & OSCE CHALLENGE
# ══════════════════════════════════════════════════════════════════
slide7 = prs.slides.add_slide(blank_layout)
add_rect(slide7, 0, 0, 13.333, 7.5, RGBColor(0xF2, 0xF5, 0xFF))
add_rect(slide7, 0, 0, 13.333, 1.0, NAVY)
add_rect(slide7, 0, 0, 0.5, 1.0, CRIMSON)
add_textbox(slide7, "SLIDE 7 | PEER SIMULATION & OSCE ASSESSMENT", 0.65, 0.05, 9, 0.35,
size=11, bold=True, color=GOLD)
add_textbox(slide7, "Minutes 3–6: Simulated Practice + OSCE Assessment Challenge",
0.65, 0.45, 12, 0.45, size=16, bold=True, color=WHITE)
# Peer Simulation section
add_rect(slide7, 0.5, 1.12, 12.333, 0.42, TEAL)
add_textbox(slide7, "⚕ MINUTE 3–5: PEER-TO-PEER SIMULATION", 0.65, 1.15, 12, 0.35,
size=13, bold=True, color=WHITE)
tf_sim = add_textbox(slide7, "Step 1: Perform Valsalva on yourself — notice the blood pressure sensation.", 0.65, 1.65, 12.5, 0.35, size=13, color=DARK_GRAY)
add_para(tf_sim, "Step 2: Instructor plays two audio clips (HOCM murmur vs. AS murmur pre/post Valsalva) over Bluetooth speaker.", size=13, color=DARK_GRAY)
add_para(tf_sim, "Step 3: Trainees identify which clip represents HOCM vs. AS based on volume change.", size=13, color=DARK_GRAY)
add_para(tf_sim, "Step 4: Pair up — one person taps chaotic heart rhythm on desk; partner locates carotid pulse to practice synchronization.", size=13, color=DARK_GRAY)
# OSCE Challenge section
add_rect(slide7, 0.5, 2.72, 12.333, 0.42, CRIMSON)
add_textbox(slide7, "🏆 MINUTE 5–6: THE OSCE ASSESSMENT CHALLENGE", 0.65, 2.75, 12, 0.35,
size=13, bold=True, color=WHITE)
tf_osce = add_textbox(slide7, "Show 60-second video clip of a clinician performing flawed auscultation technique.", 0.65, 3.25, 12.5, 0.35, size=13, color=DARK_GRAY)
add_para(tf_osce, "Ask trainees to critically evaluate:", size=13, bold=True, color=DARK_GRAY)
add_para(tf_osce, " ❶ Patient POSITIONING — is the patient in left lateral decubitus? Standing? Squatting?", size=12.5, color=DARK_GRAY)
add_para(tf_osce, " ❷ STETHOSCOPE CHOICE — bell (low-pitched) vs. diaphragm (high-pitched)?", size=12.5, color=DARK_GRAY)
add_para(tf_osce, " ❸ PATIENT INSTRUCTIONS — was the maneuver explained clearly and performed correctly?", size=12.5, color=DARK_GRAY)
add_para(tf_osce, " ❹ DOCUMENTATION — did the clinician note the maneuver response in the case records?", size=12.5, color=DARK_GRAY)
# Quick summary table
add_rect(slide7, 0.5, 4.55, 12.333, 0.38, NAVY)
tf_sum_h = add_textbox(slide7, "QUICK REVISION: COMPLETE COMPARISON TABLE", 0.65, 4.57, 12, 0.32,
size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
cols = ["Feature", "HOCM", "Aortic Stenosis"]
col_x = [0.5, 4.8, 9.1]
col_w = [4.3, 4.3, 4.2]
col_colors = [NAVY, RGBColor(0x0D,0x35,0x70), RGBColor(0x0D,0x35,0x70)]
for ci, (cx, cw, hdr) in enumerate(zip(col_x, col_w, cols)):
add_rect(slide7, cx, 4.97, cw, 0.35, TEAL if ci == 0 else (CRIMSON if ci == 1 else GREEN))
add_textbox(slide7, hdr, cx+0.08, 4.99, cw-0.1, 0.3, size=12, bold=True, color=WHITE)
table_rows = [
("Murmur type", "Crescendo-decrescendo systolic LSB", "Crescendo-decrescendo systolic RSB/RUSB"),
("Radiation", "Does not radiate to neck", "Radiates to carotids"),
("Valsalva (⬇ preload)", "⬆ LOUDER", "⬇ SOFTER"),
("Squatting (⬆ preload)", "⬇ SOFTER", "⬆ LOUDER"),
("Pulse character", "Bifid/spike-and-dome", "Pulsus parvus et tardus"),
]
for ri, row_data in enumerate(table_rows):
row_y = 5.36 + ri * 0.3
row_bg = RGBColor(0xE8,0xF1,0xFF) if ri % 2 == 0 else WHITE
for ci, (cx, cw, cell) in enumerate(zip(col_x, col_w, row_data)):
add_rect(slide7, cx, row_y, cw, 0.28, row_bg, RGBColor(0xBB,0xCC,0xDD))
c_color = DARK_GRAY
if ci == 1 and "LOUDER" in cell: c_color = CRIMSON
if ci == 1 and "SOFTER" in cell: c_color = GREEN
if ci == 2 and "LOUDER" in cell: c_color = GREEN
if ci == 2 and "SOFTER" in cell: c_color = CRIMSON
add_textbox(slide7, cell, cx+0.08, row_y+0.02, cw-0.12, 0.24, size=11, color=c_color, bold=("LOUDER" in cell or "SOFTER" in cell))
add_rect(slide7, 0, 7.1, 13.333, 0.4, NAVY)
add_textbox(slide7, "Dynamic Auscultation | Microteaching | Slide 7 of 8",
0.4, 7.13, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ══════════════════════════════════════════════════════════════════
# SLIDE 8 — QUERY / VIVA QUESTIONS (Microteaching Format)
# ══════════════════════════════════════════════════════════════════
slide8 = prs.slides.add_slide(blank_layout)
add_rect(slide8, 0, 0, 13.333, 7.5, NAVY)
add_rect(slide8, 0, 0, 0.5, 7.5, CRIMSON)
add_textbox(slide8, "SLIDE 8 | QUERY — MICROTEACHING ASSESSMENT", 0.65, 0.1, 10, 0.38,
size=11, bold=True, color=GOLD)
add_rect(slide8, 0.5, 0.6, 12.333, 0.06, GOLD)
add_textbox(slide8, "Minute 6–7: Wrap-Up & Viva Questions", 0.65, 0.72, 12, 0.45,
size=18, bold=True, color=WHITE)
# High-yield Viva question 1
add_rect(slide8, 0.65, 1.3, 12.0, 0.45, CRIMSON)
add_textbox(slide8, "❓ VIVA QUESTION 1 (From your case)", 0.8, 1.33, 11.5, 0.38,
size=13, bold=True, color=WHITE)
add_rect(slide8, 0.65, 1.78, 12.0, 0.6, RGBColor(0x12, 0x30, 0x60))
add_textbox(slide8,
'"Your patient squats and the murmur instantly softens. What is your provisional diagnosis?"',
0.8, 1.82, 11.6, 0.52, size=14.5, bold=True, color=GOLD, italic=True)
add_rect(slide8, 0.65, 2.42, 12.0, 0.38, RGBColor(0x08, 0x22, 0x50))
add_textbox(slide8,
"Expected Answer: HOCM — squatting ⬆ preload → LV cavity enlarges → dynamic LVOT gradient collapses → murmur softens",
0.8, 2.44, 11.6, 0.33, size=12, color=RGBColor(0x90, 0xFF, 0x90))
# Viva question 2
add_rect(slide8, 0.65, 2.9, 12.0, 0.42, TEAL)
add_textbox(slide8, "❓ VIVA QUESTION 2", 0.8, 2.93, 11.5, 0.35, size=13, bold=True, color=WHITE)
add_rect(slide8, 0.65, 3.35, 12.0, 0.55, RGBColor(0x12, 0x30, 0x60))
add_textbox(slide8,
'"A patient has a harsh systolic murmur that INCREASES during the strain phase of Valsalva. '
'What is the single most likely diagnosis? And what is the sensitivity of this finding?"',
0.8, 3.38, 11.6, 0.48, size=14, bold=True, color=GOLD, italic=True)
add_rect(slide8, 0.65, 3.93, 12.0, 0.38, RGBColor(0x08, 0x22, 0x50))
add_textbox(slide8,
"Expected Answer: HOCM. Specificity of Valsalva for HOCM: >90%. Murmur louder = ⬇ preload → dynamic obstruction worsens.",
0.8, 3.95, 11.6, 0.33, size=12, color=RGBColor(0x90, 0xFF, 0x90))
# Viva question 3
add_rect(slide8, 0.65, 4.42, 12.0, 0.42, CRIMSON)
add_textbox(slide8, "❓ VIVA QUESTION 3", 0.8, 4.45, 11.5, 0.35, size=13, bold=True, color=WHITE)
add_rect(slide8, 0.65, 4.87, 12.0, 0.55, RGBColor(0x12, 0x30, 0x60))
add_textbox(slide8,
'"What type of S₂ splitting would you expect in a patient with an ASD? '
'And how does it differ from paradoxical splitting seen in LBBB?"',
0.8, 4.90, 11.6, 0.48, size=14, bold=True, color=GOLD, italic=True)
add_rect(slide8, 0.65, 5.45, 12.0, 0.5, RGBColor(0x08, 0x22, 0x50))
add_textbox(slide8,
"Expected Answer: ASD → WIDE FIXED splitting (constant L-R shunt). LBBB → PARADOXICAL splitting "
"(P₂ before A₂; heard on expiration, narrows on inspiration).",
0.8, 5.48, 11.6, 0.43, size=12, color=RGBColor(0x90, 0xFF, 0x90))
# Take-home message
add_rect(slide8, 0.65, 6.05, 12.0, 0.78, RGBColor(0xF0, 0xA5, 0x00))
add_textbox(slide8,
"🏆 TAKE-HOME MESSAGE: Two maneuvers — Valsalva + Squatting — give you 90% diagnostic accuracy "
"for HOCM vs. AS at the BEDSIDE. Master them before any Echo is ordered.",
0.8, 6.1, 11.7, 0.68, size=13.5, bold=True, color=DARK_GRAY, align=PP_ALIGN.CENTER)
add_rect(slide8, 0, 7.1, 13.333, 0.4, RGBColor(0x06, 0x19, 0x40))
add_textbox(slide8, "Dynamic Auscultation | Microteaching | Slide 8 of 8 | Thank You",
0.4, 7.13, 12.5, 0.3, size=10.5, color=RGBColor(0xA0,0xB8,0xE0), align=PP_ALIGN.CENTER)
# ──────────────────────────────────────────────────────────────────
# SAVE
# ──────────────────────────────────────────────────────────────────
output_path = "/tmp/workspace/dynamic-auscultation-ppt/Dynamic_Auscultation_Microteaching.pptx"
prs.save(output_path)
print(f"Saved: {output_path}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/dynamic-auscultation-ppt && python create_ppt.py 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/dynamic-auscultation-ppt/Dynamic_Auscultation_Microteaching.pptx') print(f'Slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if shape.has_text_frame: t = shape.text_frame.text.strip() if t: texts.append(t[:60]) print(f' Slide {i}: {\" | \".join(texts[:3])}') import os size = os.path.getsize('/tmp/workspace/dynamic-auscultation-ppt/Dynamic_Auscultation_Microteaching.pptx') print(f'File size: {size:,} bytes') "
Dynamic Auscultation Microteaching
Presentation · PPTX
| Slide | Content |
|---|---|
| Slide 1 | Title slide with AIM + 6 detailed Learning Objectives |
| Slide 2 | Clinical Case - "22-year-old athlete syncoped on field, harsh systolic murmur, no Echo available" + clinical dilemma + why it matters |
| Slide 3 | Physiology + 2×2 Concept Matrix - HOCM vs. AS responses to Valsalva, Squatting, Standing, Handgrip, Amyl Nitrite, with color-coded LOUDER/SOFTER + memory tip |
| Slide 4 | Step-by-step Procedure - Valsalva (4 phases, technique, contraindications) + Squatting/PLR + Carotid-Precordial Sync + stethoscope tips |
| Slide 5 | Advanced Auscultation - S₂ splitting (Normal / Wide Fixed ASD / Paradoxical LBBB / Narrow) + Carotid-Precordial technique with clinical utility |
| Slide 6 | Clinical Importance - 6 panels covering misdiagnosis prevention, drug choice, OSCE yield, diagnostic accuracy, emergency decision-making, pathophysiology integration |
| Slide 7 | Peer Simulation (Min 3-5) + OSCE Challenge (Min 5-6) + Full comparison table for quick revision |
| Slide 8 | Query / Viva Questions - 3 high-yield viva questions with expected answers + take-home message |
Search for recent clinical guidelines on HOCM vs. Aortic Stenosis diagnosis
hypertrophic cardiomyopathy diagnosis guidelines
aortic stenosis diagnosis management guidelines
HOCM aortic stenosis differentiation dynamic auscultation Valsalva
2024 2025 AHA ACC HCM HOCM aortic stenosis clinical guidelines diagnosis update
PMID: 38718139
PMID: 33972115
PMID: 35659037
PMID: 41184097
aortic stenosis echocardiography diagnosis severity classification
| Guideline | Year | Society | Key Focus |
|---|---|---|---|
| 2024 AHA/ACC HCM Guideline | 2024 | AHA/ACC/AMSSM/HRS/PACES/SCMR | HCM diagnosis, management, SCD risk, mavacamten |
| 2020 ACC/AHA Valvular Heart Disease | 2020/2021 | ACC/AHA | Aortic stenosis grading, TAVR/SAVR |
| 2022 ASE Multimodality Imaging in HCM | 2022 | ASE/SCMR/ASNC | Echo/CMR/CT in HCM |
| 2025 EACVI/ESC Consensus on HCM Imaging | 2026 | ESC/EACVI | MMI in HCM post-2023 ESC cardiomyopathy guidelines |
| 2021 ESC Guidelines — Cardiomyopathies | 2021 | ESC | HCM diagnosis, risk, treatment |
"If the resting gradient is <50 mmHg, provocative maneuvers (e.g., Valsalva) are recommended." — ACC Key Points
| Parameter | Mild AS | Moderate AS | Severe AS |
|---|---|---|---|
| Vmax | < 3.0 m/s | 3.0–3.9 m/s | ≥ 4.0 m/s |
| Mean Gradient | < 25 mmHg | 25–39 mmHg | ≥ 40 mmHg |
| AVA | > 1.5 cm² | 1.0–1.5 cm² | < 1.0 cm² |
| Indexed AVA | > 0.85 cm²/m² | 0.60–0.85 cm²/m² | < 0.60 cm²/m² |
| Feature | HCM / HOCM | Aortic Stenosis |
|---|---|---|
| Obstruction type | Dynamic (SAM + septal hypertrophy) | Fixed (calcified/congenitally bicuspid valve) |
| Murmur location | LLSB / apex | RUSB, radiates to carotids |
| Valsalva (↓ preload) | Louder ✓ (specificity >90%) | Softer |
| Squatting / PLR (↑ preload) | Softer | Louder |
| Pulse character | Bifid / spike-and-dome | Pulsus parvus et tardus |
| Echo: key finding | Asymmetric septal hypertrophy, SAM of MV, LVOT gradient | Calcified/restricted AV, reduced AVA, ↑ Vmax |
| CMR | Patchy mid-myocardial LGE (fibrosis) | Sub-endocardial LGE |
| Genetics | Pathogenic sarcomere variants (MYH7, MYBPC3 in ~40-60%) | Mostly acquired; bicuspid AV has genetic associations |
| First-line drug | Beta-blocker, mavacamten | Watchful waiting; AVR when symptomatic |
| Dangerous drug | Vasodilators, digoxin | — |
Erratum note: An erratum for the 2024 HCM Guideline was published (PMID: 39159227) - this corrects minor errors but does not alter core diagnostic recommendations.