Make a master differentiating table between as ar ps pr ms mr ts tr
heart murmurs AND auscultation
Merck Manual cardiac murmurs aortic stenosis mitral regurgitation auscultation table
| Lesion | Timing and murmur | Best heard | Radiation | Key auscultatory clues | Classic peripheral / examination findings |
|---|---|---|---|---|---|
| AS | Harsh ejection systolic, crescendo-decrescendo | Right 2nd intercostal space | Carotids | Soft/absent A2 in severe AS; delayed peak indicates severe obstruction; systolic thrill may be present | Slow-rising, low-volume pulse (pulsus parvus et tardus); narrow pulse pressure; sustained heaving apex |
| AR | High-pitched, blowing early diastolic decrescendo | Left sternal border, 3rd-4th intercostal spaces, sitting forward in end-expiration | Usually none | May have Austin Flint murmur: low-pitched mid-diastolic apical murmur from severe AR | Wide pulse pressure, bounding or collapsing pulse, head bobbing, Quincke nail-bed pulsation; displaced hyperdynamic apex |
| PS | Harsh ejection systolic, crescendo-decrescendo | Left upper sternal border, 2nd intercostal space | Left shoulder / neck, sometimes back | Ejection click that decreases with inspiration; wide split S2 with soft/delayed P2 in severe disease | RV heave; raised JVP if advanced RV failure |
| PR | High-pitched early diastolic decrescendo | Left upper sternal border | Usually none | Graham Steell murmur in pulmonary hypertension: high-pitched PR murmur that becomes louder on inspiration | Signs of pulmonary hypertension or RV failure, such as raised JVP and RV heave |
| MS | Low-pitched rumbling mid-diastolic murmur, often presystolic accentuation if sinus rhythm | Apex, with bell in left lateral position | Localized | Loud S1, opening snap after A2; shorter A2-OS interval suggests more severe MS; presystolic accentuation disappears in AF | Malar flush, tapping apex; AF and pulmonary hypertension features in later disease |
| MR | Blowing pansystolic murmur | Apex | Axilla and sometimes back | Soft S1; may have S3 from volume overload. Acute MR may be early decrescendo rather than pansystolic | Displaced, hyperdynamic apex; pulmonary edema if acute/severe |
| TS | Low-pitched rumbling mid-diastolic murmur | Lower left sternal border / xiphisternum | Localized | Opening snap may occur; murmur increases with inspiration | Raised JVP with prominent a waves, hepatomegaly, ascites, peripheral edema |
| TR | Blowing pansystolic murmur | Lower left sternal border | Right sternal border / epigastrium | Increases with inspiration: Carvallo sign; may have pulsatile liver | Raised JVP with prominent v waves, pulsatile hepatomegaly, ascites, edema |
| Systolic murmurs | Diastolic murmurs |
|---|---|
| AS, PS, MR, TR | AR, PR, MS, TS |
| Ejection systolic: AS, PS | Early diastolic: AR, PR |
| Pansystolic: MR, TR | Mid-diastolic: MS, TS |
| Maneuver | Murmurs that become louder | Murmurs that become softer |
|---|---|---|
| Inspiration | Right-sided: PS, PR, TS, TR | Most left-sided murmurs relatively soften |
| Expiration | Left-sided: AS, AR, MS, MR | Right-sided murmurs relatively soften |
| Handgrip - increased afterload | MR, AR; may increase MS flow murmur | AS, PS; also HCM and MVP |
| Standing / strain phase of Valsalva - reduced preload | Most murmurs decrease | AS, AR, MR, MS, PS, PR, TS, TR all generally decrease |
| Squatting / passive leg raise - increased preload and afterload | AS, MR, AR and most flow-dependent murmurs | HCM and MVP become softer / later |
| Release of Valsalva | Right-sided murmurs rise first; left-sided murmurs rise a few beats later | - |
| Lesion | Typical cause | Chamber consequences | Main symptoms / complications |
|---|---|---|---|
| AS | Degenerative calcification, bicuspid valve, rheumatic disease | Pressure overload LVH | Exertional angina, syncope, dyspnea; late heart failure |
| AR | Aortic root dilatation, bicuspid valve, endocarditis, rheumatic disease | LV volume overload and eccentric LVH | Palpitations, exertional dyspnea, heart failure; acute AR causes pulmonary edema and shock |
| PS | Usually congenital | RV pressure overload, RVH | Often asymptomatic if mild; exertional dyspnea, syncope, RV failure if severe |
| PR | Pulmonary hypertension, repaired congenital heart disease, endocarditis | RV volume overload | Usually asymptomatic initially; severe PR causes RV failure |
| MS | Usually rheumatic heart disease | LA enlargement, pulmonary venous hypertension, later RV failure | Dyspnea, hemoptysis, AF, systemic embolism, pulmonary hypertension |
| MR | Degenerative prolapse, ischemia/papillary muscle dysfunction, dilated LV, endocarditis | LA and LV volume overload | Dyspnea, fatigue, AF, pulmonary hypertension, heart failure |
| TS | Usually rheumatic, often with MS | RA enlargement and systemic venous congestion | Fatigue, edema, ascites, hepatic congestion, AF |
| TR | Usually functional from RV dilatation/pulmonary hypertension; also endocarditis | RA/RV dilatation, systemic venous congestion | Pulsatile liver, ascites, peripheral edema, fatigue |
Create a one-page PDF of this valvular lesion table
~/
mkdir -p "/tmp/workspace/valvular-lesions-pdf/src" "/tmp/workspace/valvular-lesions-pdf/output"
~/valvular-lesions-pdf/src/create_valvular_table.py
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER
from reportlab.lib.units import mm
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, KeepTogether
from reportlab.pdfbase.pdfmetrics import stringWidth
from pypdf import PdfReader
OUT = '/tmp/workspace/valvular-lesions-pdf/output/Valvular_Lesion_Differentiating_Table.pdf'
PAGE = landscape(A4)
W, H = PAGE
M = 9 * mm
styles = getSampleStyleSheet()
title = ParagraphStyle('TitleSmall', parent=styles['Title'], fontName='Helvetica-Bold', fontSize=15, leading=17, alignment=TA_CENTER, textColor=colors.HexColor('#17365D'), spaceAfter=2)
sub = ParagraphStyle('Sub', parent=styles['Normal'], fontName='Helvetica', fontSize=6.8, leading=8.1, alignment=TA_CENTER, textColor=colors.HexColor('#4F4F4F'), spaceAfter=5)
head = ParagraphStyle('Head', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.4, leading=7.3, alignment=TA_CENTER, textColor=colors.white)
cell = ParagraphStyle('Cell', parent=styles['Normal'], fontName='Helvetica', fontSize=6.0, leading=7.05, spaceAfter=0)
lesion = ParagraphStyle('Lesion', parent=cell, fontName='Helvetica-Bold', fontSize=7.0, leading=8.0, textColor=colors.HexColor('#17365D'))
small_head = ParagraphStyle('SmallHead', parent=styles['Normal'], fontName='Helvetica-Bold', fontSize=6.5, leading=7.4, textColor=colors.white, alignment=TA_CENTER)
small = ParagraphStyle('Small', parent=styles['Normal'], fontName='Helvetica', fontSize=6.0, leading=7.0)
foot = ParagraphStyle('Foot', parent=styles['Normal'], fontName='Helvetica-Oblique', fontSize=5.5, leading=6.2, alignment=TA_CENTER, textColor=colors.HexColor('#555555'))
def p(text, style=cell):
return Paragraph(text, style)
rows = [
['Lesion', 'Murmur timing and character', 'Best heard / radiation', 'Key auscultatory clues', 'Clinical findings and associations'],
['<b>AS</b><br/>Aortic stenosis', '<b>Harsh ejection systolic</b><br/>Crescendo-decrescendo', '<b>R 2nd ICS</b><br/>Radiates to carotids', 'Soft or absent A2; late peaking suggests severe disease; systolic thrill', '<b>Pulsus parvus et tardus</b>, narrow pulse pressure, heaving apex<br/>Degenerative, bicuspid, rheumatic'],
['<b>AR</b><br/>Aortic regurgitation', '<b>High-pitched early diastolic</b><br/>Blowing decrescendo', '<b>L sternal edge</b>, 3rd-4th ICS<br/>Sitting forward, end-expiration', 'Austin Flint murmur at apex in severe AR', '<b>Wide pulse pressure</b>, collapsing pulse, displaced hyperdynamic apex<br/>Aortic-root disease, endocarditis'],
['<b>PS</b><br/>Pulmonary stenosis', '<b>Harsh ejection systolic</b><br/>Crescendo-decrescendo', '<b>L upper sternal border</b><br/>May radiate to left shoulder/back', 'Ejection click decreases with inspiration; wide split S2, soft/delayed P2', 'RV heave; raised JVP if advanced<br/>Usually congenital'],
['<b>PR</b><br/>Pulmonary regurgitation', '<b>Early diastolic</b><br/>High-pitched decrescendo', '<b>L upper sternal border</b>', 'Graham Steell murmur in pulmonary hypertension; louder with inspiration', 'Pulmonary hypertension or RV failure signs<br/>Often secondary to pulmonary hypertension'],
['<b>MS</b><br/>Mitral stenosis', '<b>Low-pitched mid-diastolic</b><br/>Rumbling; presystolic accentuation in sinus rhythm', '<b>Apex</b>, bell<br/>Left lateral position', '<b>Loud S1 + opening snap</b>; shorter A2-OS interval = more severe; accentuation lost in AF', 'Malar flush, tapping apex<br/>AF, embolism, pulmonary hypertension<br/>Usually rheumatic'],
['<b>MR</b><br/>Mitral regurgitation', '<b>Blowing pansystolic</b>', '<b>Apex</b><br/>Radiates to axilla', 'Soft S1; S3 with volume overload; acute MR may be early decrescendo', 'Displaced hyperdynamic apex; pulmonary edema if acute<br/>MVP, ischemia, dilated LV, endocarditis'],
['<b>TS</b><br/>Tricuspid stenosis', '<b>Low-pitched mid-diastolic</b><br/>Rumbling', '<b>Lower L sternal border</b> / xiphisternum', 'May have opening snap; <b>increases with inspiration</b>', 'Raised JVP with giant <b>a</b> waves, hepatomegaly, ascites, edema<br/>Often rheumatic'],
['<b>TR</b><br/>Tricuspid regurgitation', '<b>Blowing pansystolic</b>', '<b>Lower L sternal border</b>', '<b>Carvallo sign:</b> louder with inspiration', 'Raised JVP with giant <b>v</b> waves, pulsatile liver, ascites, edema<br/>Often functional from RV dilatation'],
]
data = [[p(x, head) for x in rows[0]]]
for r in rows[1:]:
data.append([p(r[0], lesion)] + [p(x) for x in r[1:]])
main = Table(data, colWidths=[27*mm, 50*mm, 49*mm, 65*mm, 76*mm], repeatRows=1)
main.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),colors.HexColor('#17365D')),
('GRID',(0,0),(-1,-1),0.28,colors.HexColor('#B9C7D8')),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('LEFTPADDING',(0,0),(-1,-1),2.5),('RIGHTPADDING',(0,0),(-1,-1),2.5),
('TOPPADDING',(0,0),(-1,-1),2.2),('BOTTOMPADDING',(0,0),(-1,-1),2.2),
('BACKGROUND',(0,1),(-1,-1),colors.white),
('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.white,colors.HexColor('#F2F6FA')]),
]))
man = [
[p('Maneuver', small_head), p('Murmur response', small_head)],
[p('<b>Inspiration</b>', small), p('<b>Right-sided</b> murmurs increase: PS, PR, TS, TR.', small)],
[p('<b>Expiration</b>', small), p('<b>Left-sided</b> murmurs become more apparent: AS, AR, MS, MR.', small)],
[p('<b>Handgrip</b>', small), p('<b>Increases MR and AR</b>; decreases AS and PS.', small)],
[p('<b>Standing / Valsalva strain</b>', small), p('Decreases most murmurs. (Exception outside this table: HCM increases; MVP click occurs earlier.)', small)],
]
man_tbl = Table(man, colWidths=[49*mm, 218*mm])
man_tbl.setStyle(TableStyle([
('BACKGROUND',(0,0),(-1,0),colors.HexColor('#2F6B82')),
('GRID',(0,0),(-1,-1),0.28,colors.HexColor('#B9C7D8')),
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
('ROWBACKGROUNDS',(0,1),(-1,-1),[colors.HexColor('#EDF5F7'), colors.white]),
('LEFTPADDING',(0,0),(-1,-1),3),('RIGHTPADDING',(0,0),(-1,-1),3),
('TOPPADDING',(0,0),(-1,-1),1.8),('BOTTOMPADDING',(0,0),(-1,-1),1.8),
]))
memory = Table([[p('<b>Fast pattern:</b> systolic = AS, PS, MR, TR. Diastolic = AR, PR, MS, TS. Ejection systolic = AS/PS. Pansystolic = MR/TR. Early diastolic = AR/PR. Mid-diastolic = MS/TS.', foot)]], colWidths=[267*mm])
memory.setStyle(TableStyle([('BACKGROUND',(0,0),(-1,-1),colors.HexColor('#FFF4D6')),('BOX',(0,0),(-1,-1),0.3,colors.HexColor('#E3C875')),('LEFTPADDING',(0,0),(-1,-1),3),('RIGHTPADDING',(0,0),(-1,-1),3),('TOPPADDING',(0,0),(-1,-1),2),('BOTTOMPADDING',(0,0),(-1,-1),2)]))
doc = SimpleDocTemplate(OUT, pagesize=PAGE, leftMargin=M, rightMargin=M, topMargin=7*mm, bottomMargin=7*mm, title='Valvular Lesion Differentiating Table', author='Orris')
story = [Paragraph('VALVULAR LESIONS: MASTER DIFFERENTIATING TABLE', title), Paragraph('Auscultation, key signs, and bedside maneuvers', sub), main, Spacer(1, 3.5*mm), man_tbl, Spacer(1, 2.3*mm), memory]
doc.build(story)
reader = PdfReader(OUT)
assert len(reader.pages) == 1, f'Expected 1 page, got {len(reader.pages)}'
text = reader.pages[0].extract_text()
assert 'VALVULAR LESIONS' in text and 'Carvallo' in text
print(f'Created {OUT} | pages={len(reader.pages)} | bytes={__import__("os").path.getsize(OUT)}')
python "/tmp/workspace/valvular-lesions-pdf/src/create_valvular_table.py" && python -c "from pypdf import PdfReader; p='/tmp/workspace/valvular-lesions-pdf/output/Valvular_Lesion_Differentiating_Table.pdf'; r=PdfReader(p); print('verified_pages=',len(r.pages)); print('page_size=',float(r.pages[0].mediabox.width),float(r.pages[0].mediabox.height))"
Valvular Lesion Differentiating Table
PDF Document · PDF
Create a one-page PDF of this valvular lesion table
Valvular Lesion Differentiating Table
PDF Document · PDF