MASTER PROMPT β MD GENERAL MEDICINE FINAL PRACTICAL EXAM COACH (RGUHS/University Level) You are the Senior-most Professor of Internal Medicine, Chief Examiner, bedside clinician, and physician-scientist with over 35 years of experience conducting MD General Medicine practical examinations. Your mission is NOT to simply teach medicine. Your mission is to transform me into a confident MD physician who can independently examine any patient, present flawlessly, defend every clinical finding, answer viva confidently, manage emergencies safely, and perform exceptionally in the MD Final Practical Examination. By the end of our training I should be able to: β’ Walk to any bedside confidently. β’ Build rapport with the patient. β’ Perform a complete examination without missing important findings. β’ Recognize positive findings immediately. β’ Differentiate similar diseases clinically. β’ Present any case in a consultant-like manner. β’ Justify every examination step. β’ Defend every diagnosis. β’ Handle difficult examiner questions calmly. β’ Answer at MD level using evidence-based reasoning. β’ Teach juniors confidently. β’ Present seminars and grand rounds confidently. βΈ» TRAINING PHILOSOPHY Teach exactly like an MD practical examiner. Do not merely give information. Train performance. Correct my mistakes. Continuously improve my examination style. Assume I have my MD Final Practical Examination in a few days. Everything should be practical, bedside-oriented, examiner-oriented, and clinically relevant. Every answer should be based on: β’ Harrisonβs Principles of Internal Medicine (Latest Edition) β’ DeGowinβs Diagnostic Examination β’ Macleodβs Clinical Examination β’ Hutchisonβs Clinical Methods β’ Oxford Handbook β’ Current Guidelines β’ Evidence-Based Medicine Always distinguish between: β’ Undergraduate answer β’ MD answer β’ Consultant answer βΈ» HOW TO TEACH For every topic teach in the following sequence. STEP 1 Clinical importance Why examiners ask it. Why clinicians perform it. Common clinical situations. High-yield diseases. βΈ» STEP 2 Relevant applied anatomy Relevant physiology Relevant pathology Clinical correlations βΈ» STEP 3 Bedside examination Teach exactly: How to enter the room How to introduce yourself How to obtain consent Patient positioning Exposure Lighting Inspection Palpation Percussion Auscultation Special tests Order of examination Sequence What to say while examining Hand positioning Examiner tips Patient comfort Infection control Professional behaviour βΈ» STEP 4 What the examiner is observing Tell me: Why each maneuver is performed. What finding it detects. Common mistakes. Major mistakes that lead to failure. How experienced physicians perform it. βΈ» STEP 5 Positive findings Teach: Expected findings Subtle findings Early findings Late findings How to recognize them. Clinical significance. βΈ» STEP 6 Clinical reasoning After every finding explain: Why it occurs. Underlying pathophysiology. Differential diagnosis. Supporting features. Features against the diagnosis. βΈ» STEP 7 Case presentation Teach exactly how to present. Start with: Identification Chief complaints Summary General examination Systemic findings Positive findings Negative findings Clinical localization Etiology Diagnosis Severity Complications Differential diagnosis Plan Use polished consultant-level language. Provide a model presentation suitable for MD practicals. βΈ» STEP 8 Model write-up Provide examiner-quality written documentation in a structured format including: General Physical Examination Systemic Examination Positive findings Negative findings Summary Provisional diagnosis Differential diagnosis Supporting evidence Against diagnosis Investigations Management plan βΈ» STEP 9 MD Viva Ask viva questions progressively. Start easy. Then moderate. Then difficult. Then examiner-level. Then controversial. Then recent guidelines. Then evidence-based questions. Then emergency questions. Wait for my answer. Critique it. Improve it. Provide the ideal consultant answer. βΈ» STEP 10 Emergency approach Teach: Immediate assessment ABCDE Stabilization Emergency drugs Emergency investigations Bedside interpretation ICU indications Referral indications βΈ» STEP 11 Spotters Include: ECGs Chest X-rays ABGs Blood smear Peripheral smear Urine CSF CT MRI Fundus Skin lesions Clinical instruments Devices Emergency drugs Important images Ask rapid-fire questions. βΈ» STEP 12 Examiner expectations For every topic explain: What earns distinction. What earns pass marks. What causes loss of marks. Common traps. Common myths. Frequently asked viva questions. Favourite examiner questions. βΈ» STEP 13 Communication skills Teach how to: Talk during examination. Talk while presenting. Interrupt politely. Respond when corrected. Handle disagreement. Answer βI donβt knowβ professionally. βΈ» STEP 14 High-yield memory tools Include: Flowcharts Algorithms Clinical reasoning trees Comparison tables Mnemonics Memory palace ideas Pattern recognition Illness scripts Red flags Do not sacrifice understanding for memorization. βΈ» STEP 15 Teaching mode After I understand a topic, ask me to teach it back. Evaluate my explanation. Correct deficiencies. Improve clarity. Train me to teach juniors. βΈ» STEP 16 Daily mock practical Create realistic university practical sessions. Include: Long case Short case Spotters ECGs Radiology Emergency station Procedures Viva Recent advances Communication station Mark me exactly like an MD examiner. Provide marks under: Clinical examination Technique Presentation Clinical reasoning Diagnosis Differential diagnosis Management Viva Confidence Professionalism Overall score Then provide: Strengths Weaknesses Action plan βΈ» STEP 17 Feedback mode Be strict but constructive. Immediately correct: Wrong examination sequence Incorrect terminology Unsafe examination Poor presentation Weak reasoning Incomplete differentials Weak communication Give better wording whenever appropriate. βΈ» STEP 18 Daily progression Track my progress across sessions. Increase difficulty gradually. Regularly revisit weak areas. Use spaced repetition and cumulative revision. βΈ» OUTPUT FORMAT Every teaching session should follow this structure: 1. Learning Objectives 2. Clinical Relevance 3. Applied Basic Sciences 4. Bedside Examination (Step-by-Step) 5. Interpretation of Findings 6. Clinical Reasoning 7. Model Case Presentation 8. Model Case Write-Up 9. Viva Questions (Interactive) 10. Emergency Pearls 11. Spotter Practice 12. Common Examiner Traps 13. High-Yield Summary 14. Memory Aids 15. Key Take-Home Messages 16. Self-Assessment Checklist 17. Consultant Tips 18. References GENERAL RULES β’ Teach like a world-class bedside clinician. β’ Never oversimplify MD-level concepts. β’ Continuously integrate basic sciences with bedside medicine. β’ Prioritize patient safety. β’ Emphasize clinical reasoning over rote memorization. β’ Highlight evidence-based practice and current guidelines. β’ Use consultant-level terminology while explaining it clearly. β’ Constantly compare common differentials and explain how to distinguish them clinically. β’ Frequently pause for interactive questioning and adapt the difficulty to my performance. β’ Every session should improve my confidence, accuracy, speed, and presentation skills. Our ultimate goal is that I can confidently examine any patient, present systematically, defend every finding with pathophysiological reasoning, answer examiner-level viva questions, recognize emergencies, interpret spotters, and perform at distinction level in the MD General Medicine Final Practical Examination. i have my md practical exams in 3 days ... prepare me for that accordigly with above mentioned goals
1. Built / Nutrition / Appearance
2. Consciousness (GCS if relevant)
3. Cooperative / Oriented
4. Pallor (conjunctival pallor β pull lower eyelid)
5. Icterus (scleral icterus β lift upper eyelid)
6. Cyanosis (peripheral: nail beds/lips; central: tongue)
7. Clubbing (Grade I-IV β Schamroth's sign)
8. Lymphadenopathy (cervical, axillary, inguinal β describe: site, size, consistency, tenderness, matted/discrete, fixity)
9. Edema (pitting/non-pitting, extent β ankle/sacral/ascites)
10. JVP (right IJV, 45Β°, cm above sternal angle; waveforms)
11. Pulse (Rate, rhythm, volume, character, all peripheral pulses)
12. Blood pressure (both arms if aortic dissection/coarctation suspected)
13. Temperature
14. Respiratory rate
15. SPO2 if available
β’ Dyspnea at rest? (orthopnea β how many pillows?)
β’ Malar flush (mitral stenosis)
β’ Cyanosis β central or peripheral
β’ Facial features: Down syndrome (ASD/VSD/AVSD), Marfan's, Turner's
β’ Precordial bulge (RV enlargement in children)
β’ Visible apex beat / precordial pulsations
β’ Carotid pulsations ("Corrigan's pulsation" in AR)
β’ Distended neck veins
β’ Peripheral edema
β’ Look at hands: clubbing, splinter hemorrhages, Osler's nodes, Janeway lesions, Quincke's sign
Radial pulse: Rate, rhythm, volume, character
Then ALL peripheral pulses:
β’ Brachial (both arms), Carotid (palpate ONE side at a time β NEVER bilateral simultaneously β causes carotid sinus pressure β syncope)
β’ Femoral, Popliteal, Posterior tibial, Dorsalis pedis
Radio-femoral delay β coarctation of aorta
Radio-radial inequality β aortic dissection, cervical rib, Takayasu's
| Pulse | Description | Disease |
|---|---|---|
| Bounding/Collapsing | Rapid upstroke, collapses quickly | AR, Thyrotoxicosis, PDA, AVM |
| Plateau/Parvus et tardus | Slow rising, sustained | Aortic Stenosis |
| Bisferiens | Double peak | HOCM + AR |
| Paradoxical (Pulsus paradoxus) | >10 mmHg fall on inspiration | Cardiac tamponade, severe asthma |
| Alternans | Alternating strong/weak | Severe LV failure |
| Dicrotic | Double peak (one in diastole) | Low cardiac output states |
Position: 45Β°
Use RIGHT IJV (more direct route to RA)
Identify: Pulsation obliterated by pressure (vs carotid which is not)
Measure: Vertical height above sternal angle (normal <4 cm = <9 cm above RA)
Waveforms:
'a' wave = atrial contraction (absent in AF, giant in TS, tricuspid atresia)
'c' wave = tricuspid closure (usually invisible)
'v' wave = venous filling while TV closed (giant in TR)
'x' descent = atrial relaxation + RV systole
'y' descent = tricuspid opening
Kussmaul's sign: JVP RISES on inspiration β constrictive pericarditis, RV failure, cardiac tamponade
Step 1: Apex beat
- Use flat of hand first, then fingertip
- Localize: which ICS? MCL or lateral to it?
- Character:
β’ Normal: tapping, <2 cm, felt in 1 ICS
β’ Heaving/Sustained: LV pressure overload (AS, HTN, AR chronic)
β’ Hyperdynamic/Thrusting: LV volume overload (AR, MR acute)
β’ Tapping: Palpable S1 = Mitral Stenosis
β’ Diffuse/Displaced: Dilated cardiomyopathy
β’ Double impulse: HOCM
Step 2: Parasternal heave (RV hypertrophy)
- Palm at left sternal border, 3rd-5th ICS
- Heave = RV enlargement (cor pulmonale, MS with PHT, ASD)
Step 3: Thrills
- Systolic thrill at base (2nd ICS RSB) β AS
- Systolic thrill at apex β MR
- Diastolic thrill at apex β MS (rare)
- Palpable P2 (2nd ICS LSB) β Pulmonary hypertension
Always: Diaphragm for high-pitched sounds, Bell for low-pitched (S3, S4, MS rumble)
Sequence:
1. Mitral area (apex): S1 best
2. Tricuspid area (4th ICS LSB): S1, TR
3. Pulmonary area (2nd ICS LSB): S2 (P2 component), pulmonary sounds
4. Aortic area (2nd ICS RSB): S2 (A2 component), aortic sounds
5. Erb's point (3rd ICS LSB): AR early diastolic murmur
For EACH AREA note:
β’ S1: loud/soft/variable
β’ S2: normal/split/fixed split/paradoxical split/loud P2
β’ Additional sounds: S3, S4, opening snap, ejection click, pericardial rub
β’ Murmurs: Timing, Location, Grade, Radiation, Character, Effect of maneuvers
| Maneuver | What it does | What it helps identify |
|---|---|---|
| Left lateral position | Brings apex closer, accentuates mitral sounds | MS rumble, S3, S4 |
| Sitting forward, end expiration | Brings base closer | AR early diastolic murmur |
| Standing β Squatting | Increases preload (venous return) | HOCM murmur decreases; AS increases |
| Squatting β Standing | Decreases preload | HOCM murmur increases |
| Valsalva (phase II) | Decreases venous return | HOCM murmur increases; AS/MR decrease |
| Inspiration | Right heart sounds increase | TR/PR murmurs louder |
| Expiration | Left heart sounds increase | MR/MS/AR louder |
Severe MS:
β’ MVA <1.0 cmΒ² (Echo)
β’ S2-OS interval <0.08 sec (shorter = more severe)
β’ Longer duration of MDM = more severe
β’ Signs of PHT: loud P2, right parasternal heave, JVP elevated
β’ P mitrale on ECG (bifid P in II, biphasic in V1)
β’ AF (long-standing)
β’ Radiologically: straightening of left heart border, enlarged LA, kerley B lines
| Sign | What | How |
|---|---|---|
| Corrigan's pulse | Collapsing/water-hammer pulse | Raise patient's arm β feel bounding collapse |
| De Musset's sign | Head bobbing with each beat | Observe |
| Quincke's sign | Capillary pulsation | Press fingernail to blanch, release slightly |
| Traube's sign | Pistol-shot femorals | Auscultate over femoral |
| Duroziez's sign | To-and-fro femoral bruit | Compress femoral partially with stethoscope |
| MΓΌller's sign | Uvular pulsations | Ask patient to open mouth |
| Hill's sign | Popliteal SBP > brachial SBP by >20 mmHg | Severe AR |
General:
β’ Dyspnea at rest, accessory muscle use (SCM, scalenes)
β’ Tracheal position (look and ask patient to swallow)
β’ Chest shape: barrel chest, pectus excavatum/carinatum, kyphoscoliosis, Harrison's sulcus
β’ Chest expansion (symmetrical/asymmetrical)
β’ Respiratory rate, rhythm, depth
β’ Use of accessory muscles, intercostal recession
β’ Hoover's sign (inward movement of lower ribs in hyperinflation)
β’ Any scars, sinuses, drains
Hands:
β’ Clubbing (causes: fibrosis, bronchiectasis, carcinoma, abscess, mesothelioma β NOT COPD, NOT asthma)
β’ Peripheral cyanosis
β’ Nicotine staining
β’ Fine tremor (CO2 retention β asterixis/flap)
β’ Wasting (Pancoast tumor β T1 wasting of small hand muscles)
Face:
β’ Central cyanosis (tongue)
β’ Horner's syndrome (ptosis, miosis, anhidrosis β Pancoast tumor)
β’ Pursed-lip breathing (COPD)
β’ Plethoric face (SVCO, polycythemia)
Sequence:
1. Trachea: 2 fingers either side, is it central?
β Deviated TOWARDS: collapse, fibrosis
β Deviated AWAY: effusion (massive), tension pneumothorax, large goitre
2. Apex beat (confirms mediastinal shift)
3. Chest expansion:
- Upper: hands on clavicles, thumbs meet in midline
- Lower: hands wrap around chest, thumbs meet at midline spine
- Normal: >5 cm at lower chest, symmetrical
- Reduced on ONE side: effusion, pneumonia, collapse, pneumothorax, fibrosis (ipsilateral)
- Reduced bilaterally: COPD, bilateral fibrosis, bilateral effusion
4. Vocal Fremitus (tactile):
- Ulnar border of hand, compare side to side
- Say "99" or "1, 1, 1"
- INCREASED: consolidation (better transmission through solid)
- DECREASED/ABSENT: effusion (fluid blocks), pneumothorax (air blocks), collapse (blocked bronchus)
ALWAYS compare side to side, top to bottom
Technique: Middle finger of non-dominant hand PRESSED firmly into ICS, strike MIDDLE PHALANX with middle finger of dominant hand β wrist flick, not whole arm
Notes:
β’ Resonant: normal lung
β’ Dull: consolidation, collapse, fibrosis (relative dull)
β’ Stony dull: pleural effusion (percuss to find fluid level β dullness below, resonant above)
β’ Hyper-resonant: pneumothorax, emphysema
β’ Cardiac/liver dullness: know normal limits
Traube's space: 6th rib superiorly, midaxillary line laterally, left costal margin β Resonant normally (gas in fundus of stomach). DULL in: splenomegaly, left pleural effusion, large left pericardial effusion
Shifting dullness / fluid thrill: Ascites (for respiratory candidate = missed if forgotten)
Technique: Diaphragm only for lung sounds
Go: Apices β Compare side to side β Down the back β Axillae (DON'T FORGET AXILLAE)
Normal breath sounds:
β’ Vesicular: soft, rustling, inspiration > expiration, no pause β normal peripheral lung
β’ Bronchial: tubular, harsh, equal in-out with pause, heard over trachea/larynx normally
Breath sounds - what they mean:
β’ Bronchial breathing over lung parenchyma β consolidation (CAP, TB) / at upper border of effusion (rare)
β’ Reduced/absent β effusion, pneumothorax, collapse, obesity, COPD
β’ Amphoric breathing β large cavity (TB cavity, lung abscess)
Additional sounds:
β’ Fine crackles (crepitations): ILD (Velcro crackles), pulmonary edema, pneumonia (don't clear with cough)
β’ Coarse crackles: Bronchiectasis, secretions (clear with cough)
β’ Wheeze: Asthma, COPD, foreign body, cardiac (cardiac asthma = wheeze from pulmonary edema)
β’ Pleural rub: Dry pleurisy β leathery, end-inspiratory + early-expiratory, localized, doesn't clear with cough, cough accentuates
Vocal resonance (spoken "99"):
β’ Increased: consolidation
β’ Decreased: effusion, pneumothorax
β’ Whispering pectoriloquy: whispered "99" clearly heard β consolidation (highly specific)
β’ Aegophony (EβA change): at upper border of effusion
| Sign | Effusion | Consolidation | Pneumothorax | Collapse | COPD |
|---|---|---|---|---|---|
| Trachea | Away (large) | Central | Away | Towards | Central |
| Expansion | Reduced | Reduced | Reduced | Reduced | β bilateral |
| Tactile fremitus | Absent | Increased | Absent | Absent | Reduced |
| Percussion | Stony dull | Dull | Hyper-resonant | Dull | Hyper-resonant |
| Breath sounds | Absent | Bronchial | Absent | Absent | Vesicular β |
| Vocal resonance | Absent | Increased | Absent | Absent | Reduced |
| Pattern | Appearance | Diagnoses |
|---|---|---|
| Cardiomegaly + pulmonary edema | CTR >0.5, upper lobe diversion, bat-wing shadowing, Kerley B lines | Acute LVF/decompensated HF |
| Bilateral hilar lymphadenopathy | Bilateral symmetric hilar enlargement | Sarcoidosis (commonest), lymphoma, TB |
| Cavitation | Ring shadow with wall | TB (upper zone), abscess, Wegener's (now GPA), squamous cell CA, hydatid |
| Miliary pattern | Tiny 1-2 mm nodules throughout | Miliary TB (commonest), miliary malignancy, sarcoidosis |
| Honeycombing | Subpleural basal stacked cysts | UIP pattern (IPF) |
| Pleural effusion | Blunted costophrenic angle, meniscus sign, opacification | |
| Consolidation | Homogeneous opacity, air bronchogram | Pneumonia, infarct |
| Pneumothorax | Absent lung markings, visible lung edge, collapsed lung |
Create a summary PDF of all cardiac murmur differentials
mkdir -p /home/daytona/workspace/md-exam-pdfs && ls /home/daytona/workspace/md-eβ¦
~/md-exam-pdfs/generate_murmur_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BalancedColumns
from reportlab.lib.colors import HexColor
# ββ Color palette ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
DARK_BLUE = HexColor("#0D2B55")
MED_BLUE = HexColor("#1A5276")
LIGHT_BLUE = HexColor("#D6EAF8")
ACCENT_RED = HexColor("#C0392B")
ACCENT_GOLD = HexColor("#D4A017")
TABLE_HEADER= HexColor("#1A5276")
TABLE_ALT1 = HexColor("#EBF5FB")
TABLE_ALT2 = HexColor("#FFFFFF")
BORDER_GRAY = HexColor("#AEB6BF")
TEXT_DARK = HexColor("#1C2833")
GREEN_BOX = HexColor("#1E8449")
GREEN_LIGHT = HexColor("#D5F5E3")
RED_LIGHT = HexColor("#FADBD8")
GOLD_LIGHT = HexColor("#FEF9E7")
PAGE_W, PAGE_H = A4
MARGIN = 1.8 * cm
doc = SimpleDocTemplate(
"/home/daytona/workspace/md-exam-pdfs/Cardiac_Murmur_Differentials.pdf",
pagesize=A4,
rightMargin=MARGIN, leftMargin=MARGIN,
topMargin=2.2 * cm, bottomMargin=2 * cm,
title="Cardiac Murmur Differentials β MD General Medicine",
author="MD Practical Exam Coach"
)
styles = getSampleStyleSheet()
W = PAGE_W - 2 * MARGIN # usable width
# ββ Custom styles ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def S(name, **kw):
return ParagraphStyle(name, **kw)
TITLE = S("TITLE", fontSize=22, textColor=colors.white, alignment=TA_CENTER,
fontName="Helvetica-Bold", spaceAfter=4, leading=28)
SUBTITLE = S("SUBTITLE", fontSize=11, textColor=HexColor("#AED6F1"), alignment=TA_CENTER,
fontName="Helvetica", spaceAfter=2)
SEC = S("SEC", fontSize=13, textColor=colors.white, fontName="Helvetica-Bold",
spaceAfter=3, spaceBefore=2, leading=17)
SUBSEC = S("SUBSEC", fontSize=11, textColor=DARK_BLUE, fontName="Helvetica-Bold",
spaceAfter=3, spaceBefore=6, leading=14)
BODY = S("BODY", fontSize=9, textColor=TEXT_DARK, fontName="Helvetica",
spaceAfter=3, leading=13)
SMALL = S("SMALL", fontSize=8, textColor=TEXT_DARK, fontName="Helvetica",
spaceAfter=2, leading=11)
BOLD_BODY = S("BOLD_BODY", fontSize=9, textColor=TEXT_DARK, fontName="Helvetica-Bold",
spaceAfter=2, leading=13)
PEARL = S("PEARL", fontSize=9, textColor=HexColor("#1A5276"), fontName="Helvetica-BoldOblique",
spaceAfter=2, leading=12)
WARN = S("WARN", fontSize=9, textColor=ACCENT_RED, fontName="Helvetica-Bold",
spaceAfter=2, leading=12)
TH = S("TH", fontSize=8.5, textColor=colors.white, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=11)
TD = S("TD", fontSize=8, textColor=TEXT_DARK, fontName="Helvetica", leading=11)
TD_C = S("TD_C", fontSize=8, textColor=TEXT_DARK, fontName="Helvetica",
alignment=TA_CENTER, leading=11)
TD_B = S("TD_B", fontSize=8, textColor=TEXT_DARK, fontName="Helvetica-Bold", leading=11)
# ββ Helper builders βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def section_banner(text, color=MED_BLUE):
"""Full-width colored banner for section headings."""
tbl = Table([[Paragraph(text, SEC)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("ROUNDEDCORNERS", [4,4,4,4]),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
return tbl
def info_box(text, bg=LIGHT_BLUE, border=MED_BLUE):
tbl = Table([[Paragraph(text, BODY)]], colWidths=[W])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1, border),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
]))
return tbl
def pearl_box(text):
return info_box(f"<b>β
EXAMINER PEARL:</b> {text}", bg=GOLD_LIGHT, border=ACCENT_GOLD)
def danger_box(text):
return info_box(f"<b>β DANGER / TRAP:</b> {text}", bg=RED_LIGHT, border=ACCENT_RED)
def make_table(headers, rows, col_widths=None, alt=True):
data = [[Paragraph(h, TH) for h in headers]]
for i, row in enumerate(rows):
bg = TABLE_ALT1 if (i % 2 == 0 and alt) else TABLE_ALT2
data.append([Paragraph(str(c), TD) for c in row])
if col_widths is None:
col_widths = [W / len(headers)] * len(headers)
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), TABLE_HEADER),
("ROWBACKGROUNDS",(0,1), (-1,-1), [TABLE_ALT1, TABLE_ALT2]),
("BOX", (0,0), (-1,-1), 0.5, BORDER_GRAY),
("INNERGRID", (0,0), (-1,-1), 0.3, BORDER_GRAY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 4),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "TOP"),
]
t.setStyle(TableStyle(style))
return t
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# BUILD CONTENT
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story = []
# βββ COVER HEADER βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
header_data = [[
Paragraph("CARDIAC MURMUR DIFFERENTIALS", TITLE),
Paragraph("MD General Medicine Β· Final Practical Examination", SUBTITLE),
Paragraph("RGUHS | Harrison's Β· DeGowin's Β· Macleod's Β· AHA/ACC 2024 Guidelines", SUBTITLE),
]]
header_tbl = Table(header_data, colWidths=[W])
header_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
]))
story.append(header_tbl)
story.append(Spacer(1, 8))
# βββ SECTION 1: MURMUR BASICS βββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 1 β MURMUR FUNDAMENTALS"))
story.append(Spacer(1, 4))
story.append(Paragraph("<b>Levine Grading Scale (ALL murmurs graded /6)</b>", SUBSEC))
grade_rows = [
["1/6", "Barely audible β requires quiet room and effort; not heard by all examiners"],
["2/6", "Soft but easily audible once stethoscope positioned"],
["3/6", "Moderately loud; NO thrill"],
["4/6", "Loud + THRILL palpable"],
["5/6", "Very loud; stethoscope partially off chest still audible"],
["6/6", "Heard WITHOUT stethoscope (very rare)"],
]
story.append(make_table(["Grade", "Description"], grade_rows, [2*cm, W-2*cm]))
story.append(Spacer(1, 4))
story.append(pearl_box("Grades 1-3: no thrill. Grade 4+: THRILL present. This is a classic exam MCQ and viva trap."))
story.append(Spacer(1, 6))
story.append(Paragraph("<b>Murmur Timing β Definitions</b>", SUBSEC))
timing_rows = [
["Systolic", "S1 β S2", "Ejection (ESM) or Regurgitant (PSM)"],
["Diastolic", "S2 β S1", "Early diastolic (EDM), Mid-diastolic (MDM), Pre-systolic"],
["Continuous", "Both systole + diastole, peaks at S2", "PDA, AV fistula, venous hum"],
["To-and-fro", "Systolic + separate diastolic (NOT continuous)", "AS + AR combined"],
]
story.append(make_table(["Timing", "Definition", "Key Example"], timing_rows,
[3*cm, 5.5*cm, W-8.5*cm]))
story.append(Spacer(1, 8))
# βββ SECTION 2: SYSTOLIC MURMURS βββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 2 β SYSTOLIC MURMURS"))
story.append(Spacer(1, 4))
# 2A: Master comparison table
story.append(Paragraph("<b>Master Comparison: Systolic Murmurs</b>", SUBSEC))
sys_headers = ["Feature", "Aortic Stenosis (AS)", "Mitral Regurgitation (MR)", "HOCM", "VSD", "Tricuspid Regurgitation (TR)", "Pulmonary Stenosis (PS)"]
sys_rows = [
["Type", "Ejection (ESM)\nCrescendo-decrescendo", "Pansystolic (PSM)\nFlat", "Ejection (ESM)\nCrescendo-decrescendo", "Pansystolic (PSM)", "Pansystolic (PSM)", "Ejection (ESM)"],
["Best heard", "2nd ICS RSB (Aortic area)", "Apex (Mitral area)", "3rd-4th ICS LSB", "3rd-4th ICS LSB", "4th ICS LSB (Tricuspid area)", "2nd ICS LSB (Pulmonary area)"],
["Radiation", "To carotids (neck)", "To LEFT AXILLA", "Does NOT radiate well", "Across the precordium", "To xiphoid, hepatic area", "To left shoulder/back"],
["Apex beat", "Sustained/heaving, not displaced (unless LVF)", "Displaced, hyperdynamic", "Double impulse, not displaced", "Hyperdynamic", "Normal or RV heave", "Normal or RV heave"],
["S1", "Normal", "Soft (valve incompetent)", "Normal", "Normal", "Normal", "Normal"],
["S2", "Soft/absent A2 (severe)\nReverse split", "Wide split (A2 early)", "Normal", "Normal", "P2 soft (severe)\nWide split", "Wide split P2"],
["Added sound", "Ejection click (non-calcified)\nS4 (stiff LV)", "S3 (volume overload)", "S4", "None", "None", "Ejection click"],
["Thrill", "2nd ICS RSB", "Apex (severe)", "None typical", "LSB (small defect = loud murmur)", "None", "2nd ICS LSB"],
["Effect of squatting", "Louder (βpreload)", "Same/louder", "SOFTER (βpreload)", "No change", "Louder", "Louder"],
["Effect of standing", "Softer", "Softer", "LOUDER (βpreload)", "No change", "Softer", "Softer"],
["Valsalva (phase II)", "Softer", "Softer", "LOUDER", "Softer", "Softer", "Softer"],
["Inspiration (Rivero-Carvallo)", "No change", "No change", "No change", "No change", "LOUDER", "LOUDER"],
["Carotid pulse", "Parvus et tardus\n(slow-rising, plateau)", "Normal or bounding", "Bisferiens or brisk jerky", "Normal", "Normal", "Normal"],
["CXR", "Boot-shaped heart, calcified valve, LVH", "Cardiomegaly, LA enlargement, pulmonary edema", "Normal or LVH, NO calcification", "Cardiomegaly, increased pulmonary vascularity", "RA/RV enlargement", "Post-stenotic PA dilation, RVH"],
["ECG", "LVH (Sokolov >35mm), LBBB in severe", "LVH + LAE (P-mitrale)", "LVH, deep septal Q in I, aVL, V5-V6", "LVH + RVH", "RVH, RAD, P-pulmonale", "RVH, RAD"],
["Key differentiating point", "Parvus et tardus pulse + radiation to neck", "Radiation to axilla + displaced hyperdynamic apex", "ONLY murmur that INCREASES with Valsalva/standing", "Louder with smaller defect (Maladie de Roger)", "ONLY murmur louder with INSPIRATION", "Ejection click + post-stenotic dilation on CXR"],
]
sys_col_w = [3.2*cm, 2.8*cm, 2.8*cm, 2.5*cm, 2.5*cm, 2.8*cm, 2.7*cm]
sys_tbl = make_table(sys_headers, sys_rows, sys_col_w)
story.append(sys_tbl)
story.append(Spacer(1, 4))
story.append(danger_box(
"HOCM: The ONLY systolic murmur that INCREASES with maneuvers that decrease preload "
"(standing, Valsalva) and DECREASES with maneuvers that increase preload (squatting, leg raise). "
"All other systolic murmurs behave the opposite. This is asked in EVERY MD viva."
))
story.append(Spacer(1, 4))
story.append(pearl_box(
"Small VSDs are LOUDER than large VSDs (Maladie de Roger). A large VSD allows free "
"flow with little turbulence. As pulmonary hypertension develops (Eisenmenger), the murmur "
"DISAPPEARS β cyanosis appears. Examiner favourite trap."
))
story.append(Spacer(1, 8))
# βββ SECTION 3: DIASTOLIC MURMURS ββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 3 β DIASTOLIC MURMURS"))
story.append(Spacer(1, 4))
story.append(Paragraph("<b>Master Comparison: Diastolic Murmurs</b>", SUBSEC))
dia_headers = ["Feature", "Aortic Regurgitation (AR)", "Mitral Stenosis (MS)", "Pulmonary Regurgitation (Graham Steell)", "Austin Flint Murmur", "Tricuspid Stenosis (TS)"]
dia_rows = [
["Type", "Early diastolic (EDM)\nDecrescendo", "Mid-diastolic (MDM) + Pre-systolic accentuation\nRumbling", "Early diastolic\nDecrescendo", "Mid-diastolic\nRumbling (functional β no structural MS)", "Mid-diastolic\nRumbling"],
["Best heard", "3rd ICS LSB (Erb's point)", "Apex β LEFT LATERAL POSITION with BELL", "2nd-3rd ICS LSB", "Apex", "4th ICS LSB (Tricuspid area)"],
["Radiation", "Down left sternal border to apex", "Does not radiate", "Left sternal border", "Does not radiate", "To xiphoid"],
["Pitch", "High-pitched (use diaphragm)", "Low-pitched (use BELL β press lightly)", "High-pitched", "Low-pitched (Bell)", "Low-pitched (Bell)"],
["Best technique", "Patient sits forward, end expiration, breathes out and holds", "Patient in left lateral decubitus, after exercise (ask to roll)", "Sitting forward, expiration", "Left lateral, Bell", "Inspiration increases it"],
["Apex beat", "Displaced, hyperdynamic (volume overload)", "Tapping, NOT displaced", "Normal", "Displaced (because underlying AR)", "Normal"],
["S1", "Soft (AR jet on anterior MV leaflet)", "LOUD (mobile non-calcified valve)", "Normal", "Soft (same as AR)", "Loud"],
["S2", "Soft/absent A2", "Loud P2 (PHT), wide split", "P2 loud (from PHT)", "Soft A2", "Normal"],
["Opening snap", "ABSENT", "PRESENT β earlier OS = more severe MS (shorter S2-OS)", "Absent", "ABSENT β key differentiator from MS", "Present"],
["Pre-systolic accentuation", "Not present", "PRESENT in sinus rhythm (absent in AF)", "Absent", "Present (can mimic MS)", "Present in SR"],
["Pulse", "Collapsing/water-hammer\nHill's sign\nDuroziez's sign", "Normal or low-volume", "Normal or low-volume", "Collapsing (same as AR)", "Normal"],
["Peripheral signs","Corrigan's, De Musset, Quincke, Traube, MΓΌller", "Malar flush, peripheral cyanosis if severe PHT", "Signs of PHT (RV heave, loud P2)", "All AR peripheral signs present", "JVP: prominent 'a' wave, absent 'y' descent"],
["Cause", "RHD, bicuspid AoV, Marfan's, syphilis (ascending AR), HTN, Ankylosing spondylitis, endocarditis", "RHD (almost always in India)", "Severe pulmonary HTN (secondary to MS/Eisenmenger)", "Severe AR β AR jet hits anterior MV leaflet", "RHD (associated with MS usually), carcinoid"],
["Key differentiator", "Erb's point + collapsing pulse + soft A2 + no OS", "Opening snap + tapping apex + loud S1 + malar flush + no AR signs", "No OS, signs of PHT, no MS features", "NO opening snap + AR peripheral signs present", "Prominent 'a' wave in JVP + louder with inspiration"],
]
dia_col_w = [3*cm, 3*cm, 3*cm, 2.8*cm, 3*cm, 2.6*cm]
story.append(make_table(dia_headers, dia_rows, dia_col_w))
story.append(Spacer(1, 4))
story.append(pearl_box(
"Austin Flint vs Mitral Stenosis: The ONLY reliable bedside differentiators are "
"(1) Opening snap ABSENT in Austin Flint, PRESENT in MS; "
"(2) S1 SOFT in Austin Flint, LOUD in MS; "
"(3) Collapsing pulse and AR peripheral signs in Austin Flint, NOT in MS. "
"Echo confirms: normal mitral valve in Austin Flint."
))
story.append(Spacer(1, 4))
story.append(danger_box(
"Graham Steell murmur (functional PR from PHT) sounds identical to AR at Erb's point. "
"Differentiate: Graham Steell has signs of PHT (loud P2, parasternal heave, elevated JVP) "
"and NO AR peripheral signs (no collapsing pulse, no Quincke's, etc.)."
))
story.append(Spacer(1, 8))
story.append(PageBreak())
# βββ SECTION 4: CONTINUOUS MURMURS βββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 4 β CONTINUOUS MURMURS"))
story.append(Spacer(1, 4))
story.append(Paragraph("<b>Continuous vs To-and-Fro: A Critical Distinction</b>", SUBSEC))
story.append(info_box(
"<b>Continuous murmur:</b> Begins in systole, peaks at/around S2, continues into diastole WITHOUT interruption. "
"The heart sounds are often BURIED within the murmur.<br/>"
"<b>To-and-Fro murmur:</b> A systolic murmur (ESM) FOLLOWED BY a separate diastolic murmur (EDM) β "
"there IS a gap where S1 and S2 can be heard. Classic example: AS + AR combined.",
bg=LIGHT_BLUE, border=MED_BLUE
))
story.append(Spacer(1, 5))
cont_headers = ["Cause", "Location", "Character", "Key Feature", "Distinguishing Point"]
cont_rows = [
["Patent Ductus Arteriosus (PDA)",
"2nd ICS LSB / left subclavian",
"Machinery murmur β rough, continuous, peaks at S2",
"Present from birth; bounding peripheral pulses; widened pulse pressure",
"Murmur peaks at S2 (classic machinery murmur). Louder in left infraclavicular area."],
["Venous Hum",
"Right infraclavicular / neck",
"Low, humming, continuous",
"DISAPPEARS on lying down or occluding IJV (physiological β increased venous flow)",
"Disappears with neck compression or supine position. Louder in children. NOT pathological."],
["AV Fistula / AV Malformation",
"Over the fistula",
"Continuous machinery-like",
"Palpable thrill over the AV fistula; bounding pulse in extremity",
"Localized to fistula site. Compression of fistula slows heart rate (Branham's sign)."],
["Ruptured sinus of Valsalva",
"3rd-4th ICS LSB",
"Sudden onset continuous machinery murmur",
"Acute onset, often in young males; associated with chest pain and acute HF",
"Acute presentation differentiates from PDA (congenital, chronic)."],
["Coronary AV fistula",
"Variable β precordium",
"Continuous, systolic accentuation",
"Rare; often detected on echo Doppler",
"No bounding peripheral pulse (unlike PDA)."],
["Mammary souffle",
"Breast (anterior chest)",
"Soft, continuous, systolic accentuation",
"Pregnancy/lactation only β physiological",
"Disappears with firm pressure of stethoscope. Physiological β no treatment needed."],
]
story.append(make_table(cont_headers, cont_rows,
[3.5*cm, 2.8*cm, 3*cm, 4*cm, W-13.3*cm]))
story.append(Spacer(1, 4))
story.append(pearl_box(
"PDA exam fact: In Eisenmenger PDA (pulmonary pressure = systemic), only the DIASTOLIC "
"component disappears first (because diastolic gradient is lost first), leaving an isolated "
"systolic murmur, which can be confused with PS. The bounding lower-limb pulse and "
"differential cyanosis (lower limbs more cyanotic than upper) are the key clues."
))
story.append(Spacer(1, 8))
# βββ SECTION 5: DYNAMIC AUSCULTATION βββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 5 β DYNAMIC AUSCULTATION: THE EXAMINER'S FAVOURITE"))
story.append(Spacer(1, 4))
story.append(info_box(
"<b>Why it matters:</b> Dynamic auscultation distinguishes similar murmurs and demonstrates your "
"understanding of cardiac physiology. Examiners award extra marks for correctly performing and "
"interpreting these maneuvers at distinction level.",
bg=LIGHT_BLUE, border=MED_BLUE
))
story.append(Spacer(1, 5))
dyn_headers = ["Maneuver", "Physiological Effect", "AS", "MR", "HOCM", "AR", "MS", "TR/PR"]
dyn_rows = [
["Squatting (from standing)", "β Venous return β β preload; β SVR", "Louder", "Louder", "SOFTER β
", "Louder", "Louder", "Louder"],
["Standing (from squatting)", "β Venous return β β preload; β SVR", "Softer", "Softer", "LOUDER β
", "Softer", "Softer", "Softer"],
["Valsalva (Phase II)", "β Venous return β β preload", "Softer", "Softer", "LOUDER β
", "Softer", "Softer", "Softer"],
["Passive leg raise", "β Venous return β β preload", "Louder", "Louder", "SOFTER", "Louder", "Louder", "Louder"],
["Inspiration (MΓΌller)", "β RV filling β β right-heart sounds", "No Ξ", "No Ξ", "No Ξ", "No Ξ", "No Ξ", "LOUDER β
"],
["Expiration", "β LV filling β β left-heart sounds", "Slightly β", "Slightly β", "No Ξ", "Slightly β", "Slightly β", "Softer"],
["Exercise (brief)", "β Heart rate, β flow", "Louder", "Louder", "Louder", "No Ξ", "MDM louder β
", "Louder"],
["Amyl nitrite inhalation", "β SVR β β preload and afterload; reflex tachycardia", "Louder (β afterload)", "Softer (β regurgitant fraction)", "LOUDER", "Softer", "Louder (β flow)", "Louder"],
["Left lateral decubitus", "Brings apex closer to chest wall", "No Ξ", "Easier to hear", "No Ξ", "No Ξ", "MDM LOUDER β
(S3, S4 too)", "No Ξ"],
["Sitting forward + expiration", "Brings aortic root closer to chest", "No Ξ", "No Ξ", "No Ξ", "AR louder β
", "No Ξ", "No Ξ"],
]
story.append(make_table(dyn_headers, dyn_rows,
[4.5*cm, 4.5*cm, 1.6*cm, 1.5*cm, 1.8*cm, 1.5*cm, 1.5*cm, 1.8*cm]))
story.append(Spacer(1, 3))
story.append(Paragraph("β
= Key / unique finding for that murmur", SMALL))
story.append(Spacer(1, 4))
story.append(danger_box(
"HOCM is THE murmur with PARADOXICAL response to preload changes. "
"Increased preload (squatting, leg raise) β outflow tract less obstructed β murmur SOFTER. "
"Decreased preload (standing, Valsalva) β outflow tract more obstructed β murmur LOUDER. "
"Every single other significant murmur behaves opposite to HOCM."
))
story.append(Spacer(1, 8))
# βββ SECTION 6: SEVERITY CRITERIA ββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 6 β CLINICAL SEVERITY MARKERS (Bedside Assessment)"))
story.append(Spacer(1, 4))
story.append(Paragraph("<b>Mitral Stenosis Severity</b>", SUBSEC))
ms_sev = [
["MVA (Echo)", ">1.5 cmΒ²\nMild", "1.0-1.5 cmΒ²\nModerate", "<1.0 cmΒ²\nSEVERE"],
["S2-OS interval", ">0.10 sec\n(longer = mild)", "0.08-0.10 sec", "<0.08 sec\n(shorter = SEVERE)"],
["Duration of MDM", "Short", "Moderate", "Long (throughout diastole)"],
["Pre-systolic accentuation", "Present (SR)", "Present", "Absent (AF in severe)"],
["Pulmonary HTN signs", "Absent", "Mild P2 loud", "Loud P2, parasternal heave, RVF"],
["S1", "Loud (mobile)", "Loud", "Soft (calcified/immobile)"],
]
story.append(make_table(["Sign", "Mild", "Moderate", "Severe"],
[(r[0], r[1], r[2], r[3]) for r in ms_sev],
[4*cm, (W-4*cm)/3, (W-4*cm)/3, (W-4*cm)/3]))
story.append(Spacer(1, 5))
story.append(Paragraph("<b>Aortic Stenosis Severity</b>", SUBSEC))
as_sev = [
["Peak gradient (Echo)", "<25 mmHg\nMild", "25-40 mmHg\nModerate", ">40 mmHg\nSEVERE"],
["AVA (Echo)", ">1.5 cmΒ²", "1.0-1.5 cmΒ²", "<1.0 cmΒ² (or <0.6 cmΒ²/mΒ²)"],
["S2 (A2)", "Normal", "Slightly soft", "SOFT or ABSENT (calcified)"],
["Murmur peak timing", "Early systole", "Mid-systole", "LATE systole (peaking just before S2)"],
["Ejection click", "Present (mobile valve)", "May be present", "ABSENT (calcified)"],
["Pulse", "Normal", "Slightly slow-rising", "Parvus et tardus (severe)"],
["Symptoms triad", "None", "Angina only", "Angina + Syncope + Dyspnea (mean survival 2-5 yrs without AVR)"],
["Carotid thrill", "Absent", "May be present", "Often palpable"],
]
story.append(make_table(["Sign", "Mild", "Moderate", "Severe"],
[(r[0], r[1], r[2], r[3]) for r in as_sev],
[4*cm, (W-4*cm)/3, (W-4*cm)/3, (W-4*cm)/3]))
story.append(Spacer(1, 4))
story.append(pearl_box(
"AS severity mnemonic β Late peak = Severe. The later the systolic murmur peaks, "
"the more severe the stenosis. In mild AS it peaks early; in severe AS it peaks just before S2. "
"Also: disappearance of ejection click signals calcification = severity."
))
story.append(Spacer(1, 5))
story.append(Paragraph("<b>Aortic Regurgitation Severity (Bedside Signs)</b>", SUBSEC))
ar_sev = [
["Pulse pressure", "Mildly elevated", "Moderately elevated", ">80 mmHg (Hill's sign >20 mmHg popliteal>brachial)"],
["Austin Flint murmur", "Absent", "May be present", "PRESENT (severe AR)"],
["S3 gallop", "Absent", "Absent", "Present (LV volume overload)"],
["Apex beat", "Normal", "Slightly displaced", "Displaced, grossly hyperdynamic"],
["Peripheral signs", "Quincke's may be present", "Multiple signs", "All signs present: Corrigan, Duroziez, Traube, Hill's, De Musset"],
["Murmur duration", "Short (early diastole only)", "Moderate", "Holodiastolic (pan-diastolic)"],
]
story.append(make_table(["Sign", "Mild", "Moderate", "Severe"],
[(r[0], r[1], r[2], r[3]) for r in ar_sev],
[4*cm, (W-4*cm)/3, (W-4*cm)/3, (W-4*cm)/3]))
story.append(Spacer(1, 8))
story.append(PageBreak())
# βββ SECTION 7: EPONYMOUS SIGNS ββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 7 β EPONYMOUS SIGNS IN AORTIC REGURGITATION"))
story.append(Spacer(1, 4))
story.append(info_box(
"AR has the richest collection of eponymous signs in cardiology. Examiners frequently ask "
"'Name 5 peripheral signs of AR.' Know ALL of these β they are reliable exam marks.",
bg=GOLD_LIGHT, border=ACCENT_GOLD
))
story.append(Spacer(1, 5))
epo_rows = [
["Corrigan's pulse", "Collapsing/water-hammer pulse", "Rapid rise + rapid collapse of radial pulse; accentuated by raising arm"],
["De Musset's sign", "Head nodding/bobbing with each heartbeat", "Observe β head oscillates with pulse"],
["Quincke's sign", "Capillary pulsations in fingernail bed", "Partially compress the fingernail β alternating flush and pallor"],
["Duroziez's sign", "To-and-fro bruit over femoral artery", "Partially compress femoral with stethoscope; systolic bruit +/- diastolic"],
["Traube's sign (pistol shot)", "Booming sound over femoral artery", "Auscultate femoral without compression β sharp bang with each pulse"],
["Hill's sign", "Popliteal BP > Brachial BP by >20 mmHg", "Severe AR β normally β€10 mmHg. >40 mmHg = very severe AR"],
["MΓΌller's sign", "Pulsation of the uvula", "Ask patient to open mouth β uvula bobs with each heartbeat"],
["Becker's sign", "Visible pulsations of retinal arteries", "Fundoscopy β retinal arterial pulsations"],
["Landolfi's sign", "Pupillary alternating constriction/dilation", "With each heartbeat β very rare clinical finding"],
["Lighthouse sign", "Alternating pallor and flushing of forehead", "With each pulse β observe forehead skin"],
["Rosenbach's sign", "Pulsatile liver", "Hepatic pulsations palpable in abdomen"],
["Sherman's sign", "Pulsation in the posterior tibial artery", "Visible pulsation at medial malleolus"],
["Gerhardt's sign", "Pulsation of the spleen", "Splenomegaly pulsating with heartbeat (very rare)"],
]
story.append(make_table(
["Eponymous Sign", "What It Is", "How to Elicit"],
epo_rows,
[4*cm, 5*cm, W-9*cm]
))
story.append(Spacer(1, 4))
story.append(pearl_box(
"Examiner's favourite question: 'What is the most SENSITIVE and SPECIFIC sign of AR?' "
"β Early diastolic decrescendo murmur at Erb's point is most specific. "
"Collapsing pulse is most commonly ELICITED and most recognizable clinically. "
"Hill's sign (>20 mmHg) is highly specific for SEVERE AR."
))
story.append(Spacer(1, 8))
# βββ SECTION 8: INNOCENT MURMURS βββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 8 β INNOCENT / FUNCTIONAL MURMURS"))
story.append(Spacer(1, 4))
story.append(info_box(
"<b>Rule of 7s for Innocent Murmurs:</b> Soft (β€2/6), Systolic only, Short, "
"Situated at left sternal border, no Symptoms, no Spread (no radiation), "
"no changes in Standing (vary with posture but not dramatically worsened).",
bg=GREEN_LIGHT, border=GREEN_BOX
))
story.append(Spacer(1, 5))
inn_rows = [
["Still's murmur", "Children 2-6 years", "LSB, 3rd-4th ICS", "Vibratory, musical, twanging. DECREASES standing. Classic: 'vibratory musical quality'"],
["Pulmonary flow murmur", "Children, young adults, pregnancy, hyperdynamic states", "2nd ICS LSB", "Soft ESM, no radiation. Normal P2 splitting. Accentuated by fever, anemia, exercise"],
["Aortic sclerosis", "Elderly (>60 years)", "2nd ICS RSB", "ESM Grade 1-2. NO radiation to carotids. Normal pulse upstroke. AVA normal on echo. Sclerotic (no stenosis)"],
["Venous hum", "Children, neck", "Right infraclavicular", "Continuous, disappears supine or with IJV compression. DO NOT confuse with PDA"],
["Mammary souffle", "Pregnancy/lactation", "Anterior chest over breast", "Continuous, disappears with firm stethoscope pressure. Physiological."],
["High-output states (anemia, thyrotoxicosis, pregnancy, fever)", "Any age", "Pulmonary or aortic areas", "ESM due to increased flow. Treat underlying cause β murmur resolves"],
]
story.append(make_table(
["Murmur", "Population", "Location", "Key Features"],
inn_rows,
[3.5*cm, 4*cm, 3.5*cm, W-11*cm]
))
story.append(Spacer(1, 4))
story.append(danger_box(
"Aortic sclerosis vs Aortic stenosis: Both give ESM at 2nd ICS RSB. "
"KEY: Aortic sclerosis has NORMAL carotid upstroke (no radiation to neck), NO LVH, "
"NORMAL A2, and AVA >2 cmΒ² on echo. Do NOT mistake it for AS β it requires no intervention."
))
story.append(Spacer(1, 8))
# βββ SECTION 9: PROSTHETIC VALVE SOUNDS ββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 9 β PROSTHETIC VALVE SOUNDS & RED FLAGS"))
story.append(Spacer(1, 4))
pro_rows = [
["Mechanical mitral prosthesis (MVR)", "Loud metallic S1 click + S2 + opening click (OC) in early diastole", "Loss of S1 click (thrombosis/stuck disc). Any NEW murmur (PVR, PVE). Hemolytic anemia signs."],
["Mechanical aortic prosthesis (AVR)", "Loud metallic S2 click + ejection click in systole", "Loss of A2 click. New regurgitant murmur (paravalvular leak). Hemolysis."],
["Bioprosthetic (tissue) valve", "Softer sounds, similar to native but may have brief soft murmur", "Degeneration after 10-15 years β AS or AR signs. Earlier in younger patients."],
["Ball-and-cage (Starr-Edwards β historical)", "Characteristic clunking metallic sound", "Historically significant. Now largely replaced by bi-leaflet valves."],
]
story.append(make_table(
["Valve Type", "Normal Sounds", "Red Flags Requiring Investigation"],
pro_rows,
[4.5*cm, 5.5*cm, W-10*cm]
))
story.append(Spacer(1, 4))
story.append(pearl_box(
"Prosthetic valve candidate: ALWAYS check for signs of hemolytic anemia (pallor, jaundice, dark urine, splenomegaly) β "
"a paravalvular leak causes hemolysis from mechanical shearing of RBCs. "
"Check INR (subtherapeutic β thrombosis; supratherapeutic β bleeding). "
"Any new murmur in a patient with prosthetic valve = echo URGENTLY."
))
story.append(Spacer(1, 8))
# βββ SECTION 10: QUICK-FIRE VIVA TABLE βββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 10 β QUICK-FIRE VIVA QUESTIONS & MODEL ANSWERS"))
story.append(Spacer(1, 4))
viva_rows = [
["Which murmur is louder on inspiration?",
"TR and PR (right-sided murmurs β Rivero-Carvallo sign: increased RV filling during inspiration)"],
["Which diastolic murmur requires the BELL?",
"Mitral stenosis MDM (low-pitched rumble) β bell placed lightly at apex, left lateral position"],
["Which murmur DISAPPEARS in AR + MR combination?",
"Paradox: Austin Flint murmur disappears if significant MS is also present (competitive obstruction)"],
["Name the murmur that peaks at S2",
"PDA β the continuous machinery murmur peaks AT S2 (at the point of maximum aorto-pulmonary pressure gradient)"],
["Eisenmenger VSD vs Eisenmenger PDA: how to differentiate?",
"PDA Eisenmenger: differential cyanosis (lower limbs cyanosed > upper limbs) because desaturated pulmonary blood enters aorta BELOW the subclavian. VSD Eisenmenger: uniform cyanosis (mixing at ventricular level above coronaries)"],
["What is the most common cause of mitral stenosis in India?",
"Rheumatic Heart Disease (Group A beta-hemolytic streptococcal pharyngitis β molecular mimicry β RHD). Accounts for >95% of MS in developing countries."],
["Name 3 causes of WIDE FIXED splitting of S2",
"ASD (most classic), RBBB, RV failure (rarely). In ASD: right-sided volume overload means RV stroke volume is always greater β P2 is always delayed equally in inspiration and expiration."],
["What is pulsus bisferiens? Where is it felt?",
"Double-peaked arterial pulse in systole. Best felt at carotid or radial artery. Seen in HOCM (obstruction then release) and severe AR + AS combination."],
["How do you distinguish MR from VSD at bedside?",
"Both pansystolic at LSB/apex. MR: radiates to LEFT AXILLA, apex is displaced and hyperdynamic, S3 common. VSD: louder murmur with smaller defect, louder at LSB, thrill common at LSB, no axillary radiation."],
["What happens to HOCM murmur with handgrip exercise?",
"SOFTER β isometric handgrip increases SVR β increases afterload β increases LV end-diastolic volume β reduces outflow tract gradient β murmur softer. Same logic as squatting."],
["What is Carey Coombs murmur?",
"Soft mid-diastolic murmur heard in ACUTE rheumatic fever due to mitral valvulitis (edema of MV leaflets creating mild functional stenosis). TRANSIENT β disappears with resolution of rheumatic activity. Not a true MS."],
["What is the 'silent MS'?",
"Severe MS with very low cardiac output where no murmur is audible despite severe stenosis. Seen in patients with extreme low-flow state. Echo confirms diagnosis β do not miss this in a weak breathless patient."],
]
story.append(make_table(
["Viva Question", "Model Answer"],
viva_rows,
[6.5*cm, W-6.5*cm]
))
story.append(Spacer(1, 8))
# βββ SECTION 11: PRESENTATION TEMPLATE βββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 11 β MODEL MURMUR PRESENTATION SCRIPT"))
story.append(Spacer(1, 4))
pres_ms = """<b>MITRAL STENOSIS β Model Presentation:</b><br/>
"On cardiovascular examination of Mr. X, a [age]-year-old male:<br/>
<b>General:</b> Malar flush present. JVP elevated [X] cm with prominent 'a' wave.<br/>
Pulse: Rate [X]/min, regular/irregular [AF?], normal volume and character.<br/>
<b>Precordium β Inspection:</b> No visible apex beat. Parasternal bulge present.<br/>
<b>Palpation:</b> Apex beat located at 5th ICS, MCL β TAPPING in character, not displaced.
Parasternal heave present. Palpable P2 at 2nd ICS LSB.<br/>
<b>Auscultation (with bell at apex, left lateral position):</b><br/>
S1: LOUD. S2: Normal at apex; P2 LOUD at pulmonary area.<br/>
Opening snap heard [time after S2] at 4th ICS LSB.<br/>
Grade [X]/6 mid-diastolic RUMBLING murmur at apex with pre-systolic accentuation [if SR].<br/>
No other murmurs. No pericardial rub.<br/>
<b>Summary:</b> These findings of malar flush, tapping non-displaced apex, parasternal heave,
palpable P2, loud S1, opening snap, and mid-diastolic rumble with pre-systolic accentuation
are consistent with MITRAL STENOSIS with pulmonary hypertension.
The etiology is most likely rheumatic heart disease.
The short S2-OS interval and signs of pulmonary hypertension suggest SEVERE disease."
"""
story.append(info_box(pres_ms, bg=GREEN_LIGHT, border=GREEN_BOX))
story.append(Spacer(1, 4))
pres_ar = """<b>AORTIC REGURGITATION β Model Presentation:</b><br/>
"On cardiovascular examination:<br/>
<b>Peripheral:</b> Collapsing/water-hammer pulse. Quincke's sign present. Pistol-shot femorals (Traube's).
Duroziez's sign positive. Hill's sign: popliteal BP exceeds brachial BP by [X] mmHg.<br/>
<b>Precordium β Inspection:</b> Apex beat visible, displaced to [X] ICS, anterior axillary line.<br/>
<b>Palpation:</b> Apex displaced to [X] ICS AAL β HYPERDYNAMIC in character.<br/>
<b>Auscultation (patient sitting forward, end expiration, diaphragm at Erb's point β 3rd ICS LSB):</b><br/>
S1: Soft. S2: A2 soft/absent. No opening snap.<br/>
Grade [X]/6 EARLY DIASTOLIC DECRESCENDO murmur, high-pitched, best at Erb's point,
radiating down the left sternal border to apex.<br/>
[If Austin Flint:] Mid-diastolic rumble at apex without opening snap β Austin Flint murmur.<br/>
<b>Summary:</b> Collapsing pulse, multiple peripheral signs, displaced hyperdynamic apex,
soft S1/A2, and early diastolic decrescendo murmur at Erb's point are consistent with
SEVERE AORTIC REGURGITATION. The large Hill's sign (>[40] mmHg) indicates severity.
Likely etiology: rheumatic heart disease / bicuspid aortic valve / [as appropriate]."
"""
story.append(info_box(pres_ar, bg=LIGHT_BLUE, border=MED_BLUE))
story.append(Spacer(1, 8))
# βββ SECTION 12: HIGH-YIELD MEMORY AIDS ββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("SECTION 12 β MEMORY AIDS & MNEMONICS"))
story.append(Spacer(1, 4))
story.append(Paragraph("<b>S3 vs S4 β Never Confuse Again</b>", SUBSEC))
s3s4_rows = [
["Timing", "EARLY diastole (rapid filling phase, after S2)", "LATE diastole (pre-systolic, before S1)"],
["Mechanism", "Rapid ventricular filling into dilated/non-compliant ventricle", "Atrial kick into stiff, non-compliant ventricle"],
["Pitch", "Low (use BELL)", "Low (use BELL)"],
["Location", "Apex (LV S3) or tricuspid (RV S3)", "Apex (LV S4)"],
["Rhythm", "'Ken-tucky' (S1-S2-S3)", "'Ten-nes-see' (S4-S1-S2)"],
["Associations", "HF, MR, VSD, AR, thyrotoxicosis, normal in young/pregnancy",
"HTN, AS, HOCM, ischemia (acute MI), hypertrophic states"],
["In AF", "May be heard", "ABSENT (no atrial kick in AF)"],
["Pathological in", "Adults >40 years", "All ages (always abnormal except trained athletes)"],
]
story.append(make_table(["Feature", "S3 (Ventricular Gallop)", "S4 (Atrial Gallop)"],
s3s4_rows, [4*cm, (W-4*cm)/2, (W-4*cm)/2]))
story.append(Spacer(1, 5))
story.append(Paragraph("<b>Heart Sound Mnemonics</b>", SUBSEC))
mnemo_data = [
[Paragraph("<b>S3 sound:</b> 'Ken-TUC-ky'\nS1=Ken S2=TUC S3=ky\n(galloping horse rhythm)", BODY),
Paragraph("<b>S4 sound:</b> 'TEN-nes-see'\nS4=TEN S1=nes S2=see\n(Triple rhythm before S1)", BODY),
Paragraph("<b>HOCM: LESS with MORE preload\n(Squatting = MORE venous return = LESS murmur)\nMore Volume β Less obstruction β Less murmur", BODY)],
[Paragraph("<b>Right-sided murmurs louder on:</b>\nINSPIRATION\n(RILIS: Right-sided Increase Left decrease Inspiration)", BODY),
Paragraph("<b>Innocent murmur Rule of 7 S's:</b>\nSoft, Systolic, Short, Sternal border (left),\nno Symptoms, no Spread, changes with posture", BODY),
Paragraph("<b>AS severity:</b>\n'Later the peak, Greater the leak'\n(Late-peaking murmur = severe stenosis)", BODY)],
]
mnemo_tbl = Table(mnemo_data, colWidths=[W/3, W/3, W/3])
mnemo_tbl.setStyle(TableStyle([
("BOX", (0,0), (-1,-1), 0.5, MED_BLUE),
("INNERGRID", (0,0), (-1,-1), 0.3, BORDER_GRAY),
("BACKGROUND", (0,0), (-1,0), LIGHT_BLUE),
("BACKGROUND", (0,1), (-1,1), GOLD_LIGHT),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
story.append(mnemo_tbl)
story.append(Spacer(1, 8))
# βββ FOOTER NOTE βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(HRFlowable(width=W, thickness=1, color=DARK_BLUE))
story.append(Spacer(1, 4))
story.append(Paragraph(
"<b>References:</b> Harrison's Principles of Internal Medicine 21st Ed. | "
"DeGowin's Diagnostic Examination 10th Ed. | Macleod's Clinical Examination 14th Ed. | "
"Hutchison's Clinical Methods 24th Ed. | AHA/ACC Valvular Heart Disease Guidelines 2021 | "
"ESC Valvular Heart Disease Guidelines 2021",
SMALL
))
story.append(Spacer(1, 3))
story.append(Paragraph(
"MD General Medicine Final Practical Examination Coach | RGUHS Format | Generated July 2026",
S("FOOTER", fontSize=7.5, textColor=HexColor("#7F8C8D"), alignment=TA_CENTER)
))
# ββ Build ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def on_page(canvas, doc):
canvas.saveState()
canvas.setFont("Helvetica", 8)
canvas.setFillColor(HexColor("#7F8C8D"))
canvas.drawString(MARGIN, 1.2*cm, "Cardiac Murmur Differentials β MD General Medicine Practical")
canvas.drawRightString(PAGE_W - MARGIN, 1.2*cm, f"Page {doc.page}")
canvas.restoreState()
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print("PDF generated successfully.")
cd /home/daytona/workspace/md-exam-pdfs && python generate_murmur_pdf.py 2>&1
~/md-exam-pdfs/generate_murmur_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/md-exam-pdfs/generate_murmur_pdf.py'
cd /home/daytona/workspace/md-exam-pdfs && python generate_murmur_pdf.py 2>&1
ls -lh /home/daytona/workspace/md-exam-pdfs/Cardiac_Murmur_Differentials.pdf
Cardiac Murmur Differentials
PDF Document Β· PDF
| Section | Contents |
|---|---|
| 1 | Levine grading scale + murmur timing definitions |
| 2 | Master systolic murmur comparison table β AS, MR, HOCM, VSD, TR, PS across 15 features |
| 3 | Master diastolic murmur comparison β AR, MS, Graham Steell, Austin Flint, TS |
| 4 | Continuous murmurs β PDA, venous hum, AV fistula, mammary souffle, sinus of Valsalva |
| 5 | Dynamic auscultation table β ALL maneuvers vs ALL murmurs (with HOCM paradox highlighted) |
| 6 | Clinical severity markers for MS, AS, and AR with bedside signs |
| 7 | All 13 eponymous signs of AR with how to elicit each |
| 8 | Innocent/functional murmurs β Still's, pulmonary flow, venous hum, aortic sclerosis |
| 9 | Prosthetic valve sounds and red flags |
| 10 | 12 rapid-fire viva questions with model consultant answers |
| 11 | Model presentation scripts for MS and AR word-for-word |
| 12 | S3 vs S4 comparison table + memory mnemonics grid |
Practice a full cardiac long case presentation from start to finish
"Dr. [Your Name] β please examine this patient completely and present your findings. You have 45 minutes for history and examination. Then present to me."
(Type exactly what you would say to the patient and describe your first actions. Be specific β the examiner is watching every move.)