Tell me the Inspection, Palpation, Percussion, Auscultation to these each conditions Consolidation Fibrosis Pleural effusion Pneumothorax Hydropneumothorax Bronchiectasis
| Findings | |
|---|---|
| Inspection | Possible lag or splinting on the affected side |
| Palpation | Increased (enhanced) tactile vocal fremitus on the affected side |
| Percussion | Dull over the affected area |
| Auscultation | Bronchial breath sounds; bronchophony, whispering pectoriloquy, egophony; fine crackles (crepitations) |
Key point: Consolidation is the one condition where fremitus is increased because solid lung transmits sound better. Dullness + increased fremitus + bronchial breathing is the classic triad. - Murray & Nadel's Textbook of Respiratory Medicine, Table 18.4
| Findings | |
|---|---|
| Inspection | Reduced chest expansion bilaterally; may show cyanosis, clubbing (especially in IPF); tachypnea |
| Palpation | Decreased chest expansion; fremitus may be reduced (diffuse disease) or slightly increased over fibrotic patches |
| Percussion | Dull or impaired resonance over the affected zones (fibrotic lung is denser) |
| Auscultation | Bilateral fine end-inspiratory crackles ("Velcro" crackles), heard best at the bases; no bronchial breathing; reduced breath sounds in advanced disease |
"Digital clubbing and bilateral fine end-inspiratory rales on auscultation of the chest" are classic features pointing to ILD such as idiopathic pulmonary fibrosis. - Frameworks for Internal Medicine, p. 272
| Findings | |
|---|---|
| Inspection | Lag on the affected side; increased size of hemithorax; trachea and apex beat shifted away from affected side in large effusions |
| Palpation | Decreased (absent) tactile fremitus; trachea and heart shifted away from affected side |
| Percussion | Stony dull (flat/dull) over the effusion; above the effusion there may be a narrow band of increased fremitus (compressed lung - Skodaic resonance) |
| Auscultation | Absent (or very reduced) breath sounds over the effusion; aegophony (bleating quality) may be heard at the upper border of the effusion |
Tactile fremitus is decreased/absent over an effusion, distinguishing it from consolidation where it is increased. - Frameworks for Internal Medicine, p. 272; Murray & Nadel's, Table 18.4
| Findings | |
|---|---|
| Inspection | Lag on the affected side; increased size of hemithorax (over-expanded); in tension PTX, trachea shifts away |
| Palpation | Absent fremitus on the affected side; trachea may deviate away in tension type |
| Percussion | Hyperresonant or tympanitic |
| Auscultation | Absent breath sounds on the affected side |
- Murray & Nadel's Textbook of Respiratory Medicine, Table 18.4; Textbook of Family Medicine 9e, Table 16-2
| Findings | |
|---|---|
| Inspection | Reduced or absent movement on affected side; mediastinal shift may be present depending on volume |
| Palpation | Absent fremitus throughout the affected side (both air and fluid suppress transmission) |
| Percussion | Upper zone: Hyperresonant/tympanitic (air above); Lower zone: Stony dull (fluid below); a horizontal air-fluid level is the hallmark |
| Auscultation | Absent or markedly reduced breath sounds throughout; a succussion splash may be heard (splashing sound on shaking the patient - fluid moving under air) |
A hydropneumothorax occurs when pneumothorax co-exists with pleural effusion. The straight horizontal air-fluid level on CXR (no meniscus) confirms air above the fluid. Causes include bronchopleural fistula, empyema, malignancy, trauma, and esophageal rupture. - Fishman's Pulmonary Diseases; Murray & Nadel's
| Findings | |
|---|---|
| Inspection | May appear normal; in severe/advanced disease: barrel chest, cyanosis, clubbing; copious purulent sputum production; weight loss |
| Palpation | Normal or reduced expansion on affected side if fibrosis co-exists; fremitus may be variable |
| Percussion | Usually resonant; may be dull over areas of consolidation or associated fibrosis |
| Auscultation | Coarse crackles (crepitations) that are persistent and change with coughing; wheezes may be present; breath sounds may be reduced in areas of collapse; bronchial breath sounds if consolidation co-exists |
"Stridor, crackles, wheezing, or diminished breath sounds can suggest the presence of a focal obstruction due to a foreign body, bronchiectasis, or pneumonia." Patients with chronic bronchitis-type airway disease exhibit coarse crackles as uncleared secretions move about the central airways. - Murray & Nadel's Textbook of Respiratory Medicine
| Condition | Fremitus | Percussion | Breath Sounds | Key Feature |
|---|---|---|---|---|
| Consolidation | ↑ Increased | Dull | Bronchial | Bronchophony, pectoriloquy |
| Fibrosis | Reduced/variable | Dull | Reduced + fine crackles | Velcro crackles at bases |
| Pleural Effusion | ↓ Decreased/absent | Stony dull | Absent | Trachea shifts away (large) |
| Pneumothorax | Absent | Hyperresonant/tympanitic | Absent | Trachea shifts away (tension) |
| Hydropneumothorax | Absent | Upper: tympanitic / Lower: dull | Absent | Succussion splash |
| Bronchiectasis | Variable | Resonant (usually) | Coarse crackles | Copious purulent sputum, clubbing |
Create a clinical reference card (PDF) comparing all six conditions
ls /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/chest-reference-card
~/chest-reference-card/generate_card.py
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib import colors
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer,
HRFlowable, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import PageBreak
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#0D2B55")
TEAL = colors.HexColor("#1A6B7C")
GOLD = colors.HexColor("#D4A017")
LIGHT_BG = colors.HexColor("#F0F4F8")
WHITE = colors.white
ROW_ALT = colors.HexColor("#E8F0F7")
ROW_NORM = colors.HexColor("#F7FAFC")
HDR_COL = colors.HexColor("#1A3A5C")
RED_ALERT = colors.HexColor("#C0392B")
GREEN_OK = colors.HexColor("#1E7E34")
# ── Document setup ───────────────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/chest-reference-card/Chest_Conditions_IPPA_Reference.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=landscape(A4),
leftMargin=1.2*cm, rightMargin=1.2*cm,
topMargin=1.2*cm, bottomMargin=1.2*cm,
title="Clinical IPPA Reference Card – Chest Conditions",
author="Orris Medical Reference"
)
# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def make_style(name, parent='Normal', **kw):
s = ParagraphStyle(name, parent=styles[parent], **kw)
return s
title_style = make_style('CardTitle', fontSize=18, textColor=WHITE,
alignment=TA_CENTER, fontName='Helvetica-Bold',
spaceAfter=0)
subtitle_style = make_style('CardSubtitle', fontSize=9, textColor=colors.HexColor("#B0C4DE"),
alignment=TA_CENTER, fontName='Helvetica')
cond_style = make_style('CondName', fontSize=9, textColor=WHITE,
fontName='Helvetica-Bold', alignment=TA_CENTER,
leading=12)
cat_style = make_style('CatLabel', fontSize=8.5, textColor=WHITE,
fontName='Helvetica-Bold', alignment=TA_CENTER,
leading=11)
cell_style = make_style('CellText', fontSize=8, textColor=colors.HexColor("#1A1A2E"),
fontName='Helvetica', leading=11, alignment=TA_LEFT)
key_style = make_style('KeyText', fontSize=7.5, textColor=colors.HexColor("#2C3E50"),
fontName='Helvetica-Oblique', leading=10, alignment=TA_LEFT)
note_style = make_style('NoteText', fontSize=7, textColor=colors.HexColor("#555555"),
fontName='Helvetica', leading=9, alignment=TA_LEFT)
footer_style = make_style('Footer', fontSize=6.5, textColor=colors.HexColor("#888888"),
alignment=TA_CENTER)
highlight_style = make_style('Highlight', fontSize=8, textColor=RED_ALERT,
fontName='Helvetica-Bold', leading=10)
# ── Data ─────────────────────────────────────────────────────────────────────
conditions = [
"Consolidation\n(Pneumonia)",
"Pulmonary\nFibrosis",
"Pleural\nEffusion",
"Pneumo-\nthorax",
"Hydro-\npneumothorax",
"Bronchi-\nectasis",
]
# Each cell: (main text, key finding flag) key=True → bold red highlight
data = {
"Inspection": [
("Lag/splinting on affected side", False),
("Bilateral reduced expansion; cyanosis; digital clubbing; tachypnea", False),
("Lag on affected side; increased hemithorax size; trachea shifted AWAY (large)", True),
("Lag on affected side; increased hemithorax; trachea shifted AWAY (tension)", True),
("Reduced movement on affected side; mediastinal shift possible", False),
("Often normal; barrel chest & clubbing in severe disease; copious purulent sputum", False),
],
"Palpation\n(Fremitus)": [
("INCREASED tactile fremitus\nApex beat/trachea – normal or minimal shift", True),
("REDUCED fremitus (diffuse); decreased expansion bilaterally", False),
("DECREASED / ABSENT fremitus\nTrachea & heart shifted AWAY", True),
("ABSENT fremitus on affected side\nTrachea shifts away (tension)", True),
("ABSENT fremitus throughout affected side (air + fluid both suppress)", True),
("Variable fremitus\nMay be reduced over consolidated segments", False),
],
"Percussion": [
("DULL over affected lobe", True),
("DULL / impaired resonance over fibrotic zones (bilaterally, bases)", False),
("STONY DULL (flat)\nSkodaic resonance just above effusion", True),
("HYPERRESONANT\nor TYMPANITIC", True),
("Upper zone: TYMPANITIC (air)\nLower zone: STONY DULL (fluid)\nHorizontal air-fluid level", True),
("Usually RESONANT\nDull if consolidation/fibrosis co-exists", False),
],
"Auscultation": [
("BRONCHIAL breath sounds\nBronchophony, whispering pectoriloquy, egophony\nFine crackles (crepitations)", True),
("Bilateral fine end-inspiratory VELCRO crackles (basal)\nReduced breath sounds in advanced disease\nNo bronchial breathing", True),
("ABSENT breath sounds over effusion\nAegophony at upper border\n(compressed lung above may give bronchial BS)", False),
("ABSENT breath sounds on affected side", True),
("ABSENT breath sounds throughout\nSUCCUSSION SPLASH on shaking patient", True),
("COARSE CRACKLES (persistent, change with coughing)\nWheeze possible\nBronchial BS if consolidation co-exists", True),
],
}
categories = list(data.keys())
# ── Build table ───────────────────────────────────────────────────────────────
def cell(text, is_key=False):
if is_key:
return Paragraph(text, highlight_style)
return Paragraph(text, cell_style)
def cond_cell(text):
return Paragraph(text, cond_style)
def cat_cell(text):
return Paragraph(text, cat_style)
# Header row: blank corner + 6 conditions
header_row = [Paragraph("", cat_style)] + [cond_cell(c) for c in conditions]
table_rows = [header_row]
for i, cat in enumerate(categories):
row = [cat_cell(cat)]
for j, (txt, is_key) in enumerate(data[cat]):
row.append(cell(txt, is_key))
table_rows.append(row)
# Column widths: label col + 6 condition cols
page_w = landscape(A4)[0] - 2.4*cm
label_w = 2.2*cm
cond_w = (page_w - label_w) / 6
col_widths = [label_w] + [cond_w]*6
tbl = Table(table_rows, colWidths=col_widths, repeatRows=1)
# Condition header background colours (alternating)
cond_colors = [
colors.HexColor("#1A3A5C"), # Consolidation – dark navy
colors.HexColor("#2E6B7C"), # Fibrosis – teal
colors.HexColor("#2C5F8A"), # Pleural effusion – medium blue
colors.HexColor("#3A3A7C"), # Pneumothorax – indigo
colors.HexColor("#5C3A6B"), # Hydropneumothorax – purple
colors.HexColor("#1E5C3A"), # Bronchiectasis – dark green
]
row_bg_even = colors.HexColor("#EBF2FA")
row_bg_odd = colors.HexColor("#F8FBFF")
style_cmds = [
# Grid
('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#BCC8D4")),
('LINEBELOW', (0,0), (-1,0), 1.5, NAVY),
# Header row
('BACKGROUND', (0,0), (0,0), NAVY),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
# Category label column
('BACKGROUND', (0,1), (0,-1), NAVY),
('ALIGN', (0,0), (0,-1), 'CENTER'),
('VALIGN', (0,0), (0,-1), 'MIDDLE'),
]
# Condition header cell colours
for j, c in enumerate(cond_colors):
style_cmds.append(('BACKGROUND', (j+1, 0), (j+1, 0), c))
# Alternating row backgrounds (data rows)
for i in range(1, len(table_rows)):
bg = row_bg_even if i % 2 == 0 else row_bg_odd
style_cmds.append(('BACKGROUND', (1, i), (-1, i), bg))
# Stronger dividers between categories
for i in range(1, len(table_rows)):
style_cmds.append(('LINEABOVE', (0, i), (-1, i), 0.8, colors.HexColor("#9BB5CC")))
tbl.setStyle(TableStyle(style_cmds))
# ── Quick-reference key box ──────────────────────────────────────────────────
key_data = [
[
Paragraph("<b>KEY FINDINGS QUICK REFERENCE</b>", make_style('KH', fontSize=8, textColor=NAVY, fontName='Helvetica-Bold')),
Paragraph("↑ Fremitus = Consolidation only | Stony dull = Effusion | Tympanitic = Pneumothorax / upper Hydropneumothorax", note_style),
],
[
Paragraph("<b>TRACHEAL DEVIATION</b>", make_style('KH2', fontSize=8, textColor=RED_ALERT, fontName='Helvetica-Bold')),
Paragraph("Toward lesion: Fibrosis / Atelectasis (lung pulls) | Away from lesion: Large Effusion / Tension Pneumothorax / Hydropneumothorax (mass pushes)", note_style),
],
[
Paragraph("<b>UNIQUE SIGNS</b>", make_style('KH3', fontSize=8, textColor=colors.HexColor("#1E7E34"), fontName='Helvetica-Bold')),
Paragraph("Consolidation: Bronchophony + Whispering Pectoriloquy + Egophony | Fibrosis: Velcro crackles | Hydropneumothorax: Succussion splash | Bronchiectasis: Coarse crackles that shift with cough", note_style),
],
]
key_tbl = Table(key_data, colWidths=[3.5*cm, page_w - 3.5*cm])
key_tbl.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), colors.HexColor("#EEF4FA")),
('BACKGROUND', (0,0), (0,-1), colors.HexColor("#D5E5F5")),
('GRID', (0,0), (-1,-1), 0.4, colors.HexColor("#AABBCC")),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
]))
# ── Header banner ────────────────────────────────────────────────────────────
banner_data = [[
Paragraph("CLINICAL REFERENCE CARD", title_style),
Paragraph("Chest Examination: Inspection · Palpation · Percussion · Auscultation", subtitle_style),
]]
banner = Table(banner_data, colWidths=[page_w])
banner.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), NAVY),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('LINEBELOW', (0,0), (-1,-1), 2, GOLD),
]))
# ── Footer ───────────────────────────────────────────────────────────────────
footer = Paragraph(
"Sources: Murray & Nadel's Textbook of Respiratory Medicine · Textbook of Family Medicine 9e · Harrison's Principles of Internal Medicine 22E · Frameworks for Internal Medicine | "
"Red bold text = KEY diagnostic finding | Generated by Orris · July 2026",
footer_style
)
# ── Assemble ─────────────────────────────────────────────────────────────────
story = [
banner,
Spacer(1, 4*mm),
tbl,
Spacer(1, 3*mm),
key_tbl,
Spacer(1, 3*mm),
footer,
]
doc.build(story)
print(f"PDF created: {OUTPUT}")
python3 /home/daytona/workspace/chest-reference-card/generate_card.py
ls -lh /home/daytona/workspace/chest-reference-card/
Chest Conditions IPPA Reference
PDF Document · PDF