Percutaneous tracheostomy kit Give this for 10 marks question for my assignment as anesthesia pg resident so that my HOD mam should not scold me. Provide all necessary information reference - millers, morgan, barash, baheti, dnb kaushik , all anesthesia standard textbooks
"PDT is generally performed at the bedside in the ICU... periprocedural mortality related to PDT in randomized studies appears to be less than 0.2%."
- Current Surgical Therapy 14e; Sabiston Textbook of Surgery
| INDICATIONS | CONTRAINDICATIONS (mostly relative) |
|---|---|
| Prolonged mechanical ventilation (>10-14 days) | Recent anterior neck surgery (<7 days) |
| Upper airway obstruction | High ventilatory requirements (FiO₂ >70%, PEEP >10 cmH₂O) |
| Difficult airway / Significant maxillofacial trauma | Elevated intracranial pressure |
| Neurologic conditions preventing safe extubation (brain injury, SCI, spinal fixation) | Hemodynamic instability |
| Severe agitation, prolonged altered mental status | Significant coagulopathy (platelets <50,000/mm³, PT/PTT >1.5x control) |
| Angioedema / Upper airway tumors | Local infection or malignancy at site |
| Facilitate weaning from ventilator | Morbid obesity (relative - increased risk of accidental decannulation) |
| Aid secretion clearance | Predicted early mortality |

| # | Component | Purpose |
|---|---|---|
| 1 | Introducer needle (18G) with cannula | Initial tracheal puncture and cannulation |
| 2 | 10 mL syringe (saline-filled) | Confirms intratracheal placement by air aspiration |
| 3 | J-tipped guidewire (Seldinger wire) | Guides all subsequent dilators into trachea |
| 4 | Short guiding catheter (12 Fr) | Initial small-bore dilation; stiffens the system for subsequent steps |
| 5 | Single tapered dilator - Blue Rhino (hydrophilic coated) | Single-step progressive dilation - replaces serial graduated dilators |
| 6 | Tracheostomy tube with inner cannula, cuff, and 15 mm adapter | Final airway device placed into trachea |
| 7 | Loading dilator / obturator | Mounts tracheostomy tube for smooth introduction over guidewire |
| 8 | #11 scalpel blade | Skin incision (1-1.5 cm) |
| 9 | Tracheostomy tube holder/tape | Secures tube after placement |
| 10 | Lubricant (water-soluble) | Facilitates smooth advancement of dilators |
"Serial dilation has been replaced by use of a single tapered dilator with a hydrophilic coating (Ciaglia Blue Rhino Percutaneous Tracheostomy Introducer Kit, Cook Medical), which allows for faster dilation and less instrumentation."
- Cummings Otolaryngology Head and Neck Surgery
| Technique | Kit/Device | Principle |
|---|---|---|
| Ciaglia Blue Rhino (most common) | Cook Medical | Single tapered hydrophilic dilator over guidewire |
| Ciaglia classic (original) | Cook Medical | Multiple serial graduated dilators over guidewire |
| Griggs technique | Portex GWDF set | Guidewire Dilating Forceps - spreads tissue |
| Fantoni Translaryngeal | Mallinckrodt TLT | Retrograde pull-through technique |
| PercuTwist | Rusch-Teleflex | Single-step screw-in rotating dilator |
| Rapitrac / BlueDolphin | Various | Balloon dilation technique |
| Complication | Notes |
|---|---|
| Hemorrhage | Most common; usually minor stoma bleeding; significant hemorrhage rare (~0.03% in large series) |
| Paratracheal insertion | Prevented by bronchoscopic guidance |
| Posterior tracheal wall injury / perforation | Most serious intraoperative complication |
| Accidental decannulation | Increased risk in obesity (BMI >30); if occurs, re-intubate orally first, do not blindly reinstate tube |
| Pneumothorax | ~0.85%; subcutaneous emphysema ~1.4% |
| Pneumomediastinum | Rare |
| Tracheal ring fracture | More common in PDT than open tracheostomy |
| Airway fire | Rare (more common in surgical tracheostomy using electrocautery) |
| Hypoxemia / desaturation | During bronchoscope use and tube exchange |
| False passage / esophageal placement | Avoided by bronchoscopic guidance |
| Complication | Notes |
|---|---|
| Tracheal stenosis | Most significant late complication; "corkscrew stenosis" described specific to PDT (Cummings) |
| Tracheomalacia | Weakening of tracheal cartilage |
| Tracheo-innominate artery fistula | Life-threatening; related to inferior placement or high-riding innominate artery |
| Tracheoesophageal fistula | Rare; related to posterior wall injury |
| Tracheocutaneous fistula | Stoma does not close after decannulation |
| Granulation tissue / stomal infection | Common; managed with local wound care |
| Persistent tracheal scar | Cosmetic concern |
"Periprocedural major complication rate of 0.15% and periprocedural mortality rate of less than 0.1%" - Sabiston Textbook of Surgery (3000+ consecutive PDT case series)
| Parameter | PDT | Open Surgical Tracheostomy |
|---|---|---|
| Setting | ICU bedside | Operating theatre preferred |
| Time | Faster | Longer (full surgical setup) |
| Cost | Less expensive | More expensive |
| Wound infection | Lower | Higher |
| Bleeding risk | Similar or lower | Similar (electrocautery available) |
| Tracheal ring fracture | Higher | Lower (direct visualization) |
| Posterior wall injury | Higher risk (avoided by bronchoscopy) | Lower (direct vision) |
| Paratracheal insertion | Risk present | Very rare |
| Difficult anatomy / coagulopathy | Refer to surgical | Preferred |
| Evidence | Meta-analysis shows equivalence | Equivalent outcomes |
"Meta-analysis has shown equivalence of the techniques" - Scott-Brown's Otorhinolaryngology
Give in handwritten notes
ls /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace/pdt-notes && echo "ready"
mkdir -p /tmp/workspace/pdt-notes && python3 -c " from PIL import Image, ImageDraw, ImageFont import os # Check available fonts import subprocess result = subprocess.run(['fc-list', '--format=%{file}\n'], capture_output=True, text=True) fonts = result.stdout.strip().split('\n') # Filter for something handwriting-like or at least a good font for f in fonts[:30]: print(f) "
pip install --user Pillow --quiet && python3 -c " import subprocess result = subprocess.run(['fc-list', '--format=%{file}\n'], capture_output=True, text=True) fonts = [f for f in result.stdout.strip().split('\n') if any(x in f.lower() for x in ['italic', 'oblique', 'cursive', 'noto', 'droid', 'bookman', 'nimbus'])] for f in fonts[:20]: print(f) "
~/pdt-notes/generate_notes.py
from PIL import Image, ImageDraw, ImageFont
import math, os, random
OUT = "/tmp/workspace/pdt-notes"
os.makedirs(OUT, exist_ok=True)
# ── Fonts ──────────────────────────────────────────────────────────────────
ITALIC = "/usr/share/fonts/urw-base35/P052-Italic.otf"
BOLD = "/usr/share/fonts/urw-base35/NimbusRoman-Bold.otf"
REGULAR = "/usr/share/fonts/urw-base35/NimbusRoman-Regular.otf"
SANS = "/usr/share/fonts/urw-base35/NimbusSans-Regular.otf"
SANS_B = "/usr/share/fonts/urw-base35/NimbusSans-Bold.otf"
def font(path, size):
try:
return ImageFont.truetype(path, size)
except:
return ImageFont.load_default()
# ── Colours ────────────────────────────────────────────────────────────────
BG = (255, 252, 240) # cream notepad
RULED = (180, 210, 240) # light blue rule line
MARGIN = (255, 160, 160) # red margin line
INK = (10, 30, 120) # dark navy = main handwriting
HEADING = (180, 10, 10) # red heading
SUB_HEAD = (0, 100, 50) # green subheading
HIGHLIGHT = (255, 240, 80) # yellow highlighter
HL_BLUE = (180, 230, 255) # blue highlighter
HL_GREEN = (180, 255, 180) # green highlighter
BOX_BORDER= (200, 80, 20) # orange box border
PINK_BOX = (255, 220, 230) # pink box fill
BULLET = (180, 10, 10)
STAR = (200, 120, 0)
TABLE_HDR = (220, 240, 255)
TABLE_BDR = (100, 150, 200)
W, H = 1240, 1754 # A4 @150 dpi
MARGIN_L = 110 # left margin line x
LINE_H = 46 # ruled line spacing
def new_page():
img = Image.new("RGB", (W, H), BG)
d = ImageDraw.Draw(img)
# ruled lines
for y in range(160, H - 60, LINE_H):
d.line([(MARGIN_L, y), (W - 50, y)], fill=RULED, width=1)
# red margin
d.line([(MARGIN_L, 100), (MARGIN_L, H - 50)], fill=MARGIN, width=2)
# top blue header band
d.rectangle([(0, 0), (W, 95)], fill=(40, 90, 160))
return img, d
def highlight_text(d, x, y, text, fnt, color=HIGHLIGHT, pad=4):
bbox = d.textbbox((x, y), text, font=fnt)
d.rectangle([bbox[0]-pad, bbox[1]-pad, bbox[2]+pad, bbox[3]+pad], fill=color)
d.text((x, y), text, font=fnt, fill=INK)
def write_text(d, x, y, text, fnt, color=INK):
d.text((x, y), text, font=fnt, fill=color)
def draw_box(d, x1, y1, x2, y2, fill=PINK_BOX, border=BOX_BORDER, radius=12):
d.rounded_rectangle([(x1,y1),(x2,y2)], radius=radius, fill=fill, outline=border, width=2)
def draw_arrow(d, x, y, length=40, color=HEADING):
d.polygon([(x, y), (x+length, y+10), (x+length//2, y+10)], fill=color)
def underline(d, x, y, text, fnt, color=HEADING):
d.text((x, y), text, font=fnt, fill=color)
bbox = d.textbbox((x, y), text, font=fnt)
d.line([(bbox[0], bbox[3]+2), (bbox[2], bbox[3]+2)], fill=color, width=2)
# ═══════════════════════════════════════════════════════════
# PAGE 1 — Title + Introduction + Indications/Contraindications
# ═══════════════════════════════════════════════════════════
img1, d1 = new_page()
fn_title = font(BOLD, 38)
fn_sub = font(ITALIC, 26)
fn_h1 = font(BOLD, 32)
fn_h2 = font(SANS_B, 26)
fn_body = font(ITALIC, 24)
fn_small = font(ITALIC, 21)
fn_bold_sm = font(BOLD, 24)
# Header band text
d1.text((30, 18), "PERCUTANEOUS TRACHEOSTOMY KIT", font=font(SANS_B, 32), fill=(255,255,255))
d1.text((30, 58), "Anaesthesia PG Notes | 10 Marks", font=font(SANS, 22), fill=(200, 220, 255))
y = 108
# Main title
highlight_text(d1, MARGIN_L+10, y, "PERCUTANEOUS DILATATIONAL TRACHEOSTOMY (PDT)", font(BOLD, 28), HL_BLUE)
y += 46
# Intro box
draw_box(d1, MARGIN_L+5, y, W-60, y+120, fill=(240,248,255), border=(60,100,200))
d1.text((MARGIN_L+20, y+10), "First described by Ciaglia et al. 1985 (Chest 87:715–719)", font=fn_body, fill=INK)
d1.text((MARGIN_L+20, y+40), "→ Bedside ICU procedure • Seldinger (guidewire) principle", font=fn_body, fill=(0,80,0))
d1.text((MARGIN_L+20, y+70), "→ Most common elective tracheostomy in mechanically ventilated pts", font=fn_body, fill=(0,80,0))
d1.text((MARGIN_L+20, y+98), " Periprocedural mortality < 0.2% (Sabiston)", font=fn_small, fill=(120,0,120))
y += 138
# ── Indications & Contraindications side by side ──
underline(d1, MARGIN_L+10, y, "INDICATIONS & CONTRAINDICATIONS", font(BOLD, 27), HEADING)
y += 40
col1x, col2x = MARGIN_L+10, MARGIN_L + 550
box_top = y
ind = [
"Prolonged mech. ventilation (>10–14 days)",
"Upper airway obstruction",
"Significant maxillofacial trauma",
"Difficult airway / Angioedema / UAO tumours",
"Brain injury / Spinal cord injury",
"Severe agitation / altered mental status",
"Aid secretion clearance & wean from vent",
]
contra = [
"Recent ant. neck surgery (<7 days)",
"High PEEP (>10 cmH₂O) / FiO₂ >70%",
"Elevated ICP",
"Haemodynamic instability",
"Coagulopathy (Plt <50K, INR >1.5)",
"Local infection / malignancy at site",
"Morbid obesity (relative)",
"Predicted early mortality",
]
# Left header
draw_box(d1, col1x-5, y, col1x+500, y+32, fill=(180,255,180), border=(0,160,0))
d1.text((col1x, y+4), "✓ INDICATIONS", font=font(SANS_B, 22), fill=(0,120,0))
y_ind = y + 40
for item in ind:
d1.text((col1x, y_ind), "• " + item, font=fn_small, fill=INK)
y_ind += 30
# Right header
draw_box(d1, col2x-5, box_top, col2x+620, box_top+32, fill=(255,200,200), border=(200,0,0))
d1.text((col2x, box_top+4), "✗ CONTRAINDICATIONS (mostly relative)", font=font(SANS_B, 21), fill=(180,0,0))
y_con = box_top + 40
for item in contra:
d1.text((col2x, y_con), "✘ " + item, font=fn_small, fill=(140,0,0))
y_con += 30
y = max(y_ind, y_con) + 18
# ── NOTE box ──
draw_box(d1, MARGIN_L+5, y, W-60, y+50, fill=(255,255,200), border=(200,180,0))
d1.text((MARGIN_L+20, y+8), "★ Most contraindications are RELATIVE & TEMPORARY", font=font(BOLD, 23), fill=(140, 80, 0))
d1.text((MARGIN_L+420, y+8), " Uremia → give DDAVP before procedure", font=fn_small, fill=INK)
y += 68
# Timing note
d1.text((MARGIN_L+10, y), "⏰ Timing: Early (<7 days) vs Late (>7–10 days) — TracMan trial: no survival diff in unselected ICU pts", font=fn_small, fill=(60,60,140))
# Page number
d1.text((W//2 - 15, H-42), "1", font=font(SANS_B, 26), fill=(100,100,100))
img1.save(f"{OUT}/page1.png", dpi=(150,150))
print("Page 1 done")
# ═══════════════════════════════════════════════════════════
# PAGE 2 — KIT COMPONENTS + VARIANTS
# ═══════════════════════════════════════════════════════════
img2, d2 = new_page()
d2.text((30, 18), "PERCUTANEOUS TRACHEOSTOMY KIT", font=font(SANS_B, 32), fill=(255,255,255))
d2.text((30, 58), "Components & Variants", font=font(SANS, 22), fill=(200,220,255))
y = 108
underline(d2, MARGIN_L+10, y, "THE KIT — CIAGLIA BLUE RHINO (Cook Medical) [MOST COMMON]", font(BOLD, 27), HEADING)
y += 44
# Draw stylized kit diagram area
draw_box(d2, MARGIN_L+5, y, W-60, y+52, fill=HL_BLUE, border=(40,80,180))
d2.text((MARGIN_L+20, y+12), "Kit uses SELDINGER principle → Guidewire-based sequential dilatation", font=fn_body, fill=INK)
d2.text((MARGIN_L+760, y+12), "★ Single hydrophilic dilator", font=font(BOLD,22), fill=HEADING)
y += 66
components = [
("1.", "Introducer needle (18G) + cannula", "Initial tracheal puncture & cannulation"),
("2.", "10 mL syringe (saline-filled)", "Confirms intratracheal position by free air aspiration"),
("3.", "J-tipped guidewire (Seldinger wire)", "Guides ALL subsequent dilators & tube into trachea"),
("4.", "Short guiding catheter (12 Fr)", "Initial small-bore dilation; stiffens system"),
("5.", "Ciaglia Blue Rhino dilator", "SINGLE tapered hydrophilic dilator — one-step dilatation"),
("6.", "Tracheostomy tube (cuffed, size 7–8)", "Final airway device; with inner cannula + 15mm adapter"),
("7.", "Loading dilator / obturator", "Mounts tracheostomy tube for smooth insertion over wire"),
("8.", "#11 scalpel blade", "Skin incision (1–1.5 cm horizontal/vertical)"),
("9.", "Tracheostomy neck strap / tape", "Secures tube (one finger-breadth gap)"),
("10.","Water-soluble lubricant", "Facilitates smooth dilator advancement"),
]
# Alternate row shading
row_fills = [(245,245,255), (255,248,235)]
row_h = 38
header_y = y
draw_box(d2, MARGIN_L+5, y, W-60, y+row_h, fill=TABLE_HDR, border=TABLE_BDR, radius=4)
d2.text((MARGIN_L+15, y+6), "#", font=font(SANS_B,22), fill=INK)
d2.text((MARGIN_L+55, y+6), "COMPONENT", font=font(SANS_B,22), fill=(0,0,150))
d2.text((MARGIN_L+440, y+6), "PURPOSE", font=font(SANS_B,22), fill=(0,100,0))
y += row_h
for i, (num, comp, purp) in enumerate(components):
fill = row_fills[i % 2]
if "Blue Rhino" in comp or "guidewire" in comp.lower():
fill = (255, 255, 170)
draw_box(d2, MARGIN_L+5, y, W-60, y+row_h-2, fill=fill, border=TABLE_BDR, radius=3)
d2.text((MARGIN_L+12, y+6), num, font=font(SANS_B,21), fill=HEADING)
d2.text((MARGIN_L+55, y+6), comp, font=font(ITALIC,21), fill=INK)
d2.text((MARGIN_L+440, y+6), purp, font=font(SANS,20), fill=(0,80,0))
y += row_h
y += 8
# Extra items
draw_box(d2, MARGIN_L+5, y, W-60, y+58, fill=PINK_BOX, border=BOX_BORDER)
d2.text((MARGIN_L+15, y+6), "⚠ NOT IN KIT — must arrange separately:", font=font(BOLD,22), fill=BOX_BORDER)
d2.text((MARGIN_L+15, y+30), "Flexible fibreoptic/video bronchoscope • 1% Lignocaine + Adrenaline • Sedation agents • Sterile drapes • Suction", font=fn_small, fill=INK)
y += 74
# Variants
underline(d2, MARGIN_L+10, y, "VARIANTS OF PDT KITS", font(BOLD, 26), SUB_HEAD)
y += 36
variants = [
("Ciaglia Blue Rhino (★ Gold std)", "Cook Medical", "Single tapered hydrophilic dilator"),
("Ciaglia Classic (original 1985)", "Cook Medical", "Multiple serial graduated dilators"),
("Griggs Technique", "Portex GWDF", "Guidewire Dilating Forceps — blunt spread"),
("Fantoni Translaryngeal (TLT)", "Mallinckrodt", "Retrograde pull-through technique"),
("PercuTwist", "Rusch-Teleflex", "Single-step screw-in rotating dilator"),
("BlueDolphin / Rapitrac", "Various", "Balloon dilation technique"),
]
for i, (name, brand, mech) in enumerate(variants):
fill = row_fills[i%2]
if "Gold" in name: fill = (255,255,180)
draw_box(d2, MARGIN_L+5, y, W-60, y+row_h-2, fill=fill, border=TABLE_BDR, radius=3)
d2.text((MARGIN_L+12, y+6), name, font=font(BOLD,20), fill=HEADING)
d2.text((MARGIN_L+380, y+6), brand, font=fn_small, fill=(80,0,120))
d2.text((MARGIN_L+570, y+6), mech, font=font(SANS,20), fill=(0,80,0))
y += row_h
d2.text((W//2 - 15, H-42), "2", font=font(SANS_B, 26), fill=(100,100,100))
img2.save(f"{OUT}/page2.png", dpi=(150,150))
print("Page 2 done")
# ═══════════════════════════════════════════════════════════
# PAGE 3 — STEP-BY-STEP TECHNIQUE + ANAESTHESIA ROLE
# ═══════════════════════════════════════════════════════════
img3, d3 = new_page()
d3.text((30, 18), "PERCUTANEOUS TRACHEOSTOMY KIT", font=font(SANS_B, 32), fill=(255,255,255))
d3.text((30, 58), "Step-by-Step Technique & Anaesthesia Role", font=font(SANS,22), fill=(200,220,255))
y = 108
underline(d3, MARGIN_L+10, y, "STEP-BY-STEP TECHNIQUE — CIAGLIA BLUE RHINO", font(BOLD, 27), HEADING)
y += 40
steps = [
("1", "POSITION", "Supine • Shoulder roll • Neck EXTENDED (unless C-spine injury)"),
("2", "LANDMARKS", "Identify: Hyoid → Thyroid cart. → Cricoid → Tracheal rings 1–3"),
("3", "ASEPSIS + FiO₂", "Sterile prep & drape • Increase FiO₂ to 100% • Monitors on"),
("4", "LOCAL ANAESTHESIA","5–10 mL 1% Lignocaine + 1:100,000 Adrenaline subcutaneously"),
("5", "SKIN INCISION", "1–1.5 cm HORIZONTAL incision below inferior border of cricoid"),
("6", "BLUNT DISSECTION", "Hemostat through subcutaneous tissue in midline → palpate rings"),
("7", "BRONCHOSCOPE", "Advance scope through ETT to distal end; WITHDRAW ETT to vocal cords"),
("8", "NEEDLE PUNCTURE", "18G needle on saline syringe → between rings 1–2 or 2–3, midline"),
("8a","CONFIRM POSITION", "✓ Air aspiration through saline ✓ Bronchoscopic view (10–2 o'clock)"),
("9", "GUIDEWIRE", "Needle out • Catheter stays • J-wire passed caudally into trachea"),
("10","INITIAL DILATION", "12 Fr guiding catheter over guidewire → initial tract dilation"),
("11","BLUE RHINO DILATOR","Lubricated tapered dilator → steady rotational push → single-pass dilation"),
("12","TUBE INSERTION", "Trach tube loaded on obturator → over wire → into trachea (bronchoscopic)"),
("13","CONFIRMATION", "Cuff up • Connect to vent • EtCO₂ ✓ • Auscultation ✓ • Tidal vol ✓"),
("14","SECURE", "Neck strap (one-finger gap) + sutures to neck plate"),
]
step_h = 36
colors_step = [(240,248,255),(248,255,240)]
y_step = y
for i, (num, title, detail) in enumerate(steps):
fill = colors_step[i%2]
if title in ("BRONCHOSCOPE","CONFIRM POSITION","TUBE INSERTION"):
fill = (255,255,180)
if title == "SECURE":
fill = (220,255,220)
draw_box(d3, MARGIN_L+5, y_step, W-60, y_step+step_h-2, fill=fill, border=TABLE_BDR, radius=4)
# Step circle
draw_box(d3, MARGIN_L+8, y_step+3, MARGIN_L+48, y_step+step_h-5, fill=HEADING, border=HEADING, radius=8)
d3.text((MARGIN_L+14, y_step+5), num, font=font(SANS_B,20), fill=(255,255,255))
# Title
d3.text((MARGIN_L+55, y_step+5), title, font=font(BOLD,20), fill=HEADING)
# Detail
d3.text((MARGIN_L+270, y_step+5), detail, font=font(ITALIC,20), fill=INK)
y_step += step_h
y = y_step + 14
# Anaesthesia role box
underline(d3, MARGIN_L+10, y, "ANAESTHESIOLOGIST'S ROLE (Shared Airway Concept)", font(BOLD, 26), SUB_HEAD)
y += 36
roles = [
"📍 Positioned at HEAD of bed — manages ETT, bronchoscope, medications",
"💊 Ensures adequate sedation (Propofol) + analgesia (Fentanyl/Remi) + short-acting NMB (Cisatracurium)",
"🎯 Withdraws ETT to VOCAL CORD LEVEL at step 7 — ★ critical step",
"🔭 Operates flexible bronchoscope for real-time guidance throughout",
"⚠️ Monitors: SpO₂, EtCO₂, BP, ECG, tidal volume during procedure",
"🚨 Ready for EMERGENCY RE-INTUBATION at all times",
"💨 Maintains ventilation — note: bronchoscope in situ → ↓PEEP, ↑auto-PEEP risk",
]
role_box_h = 38
for i, role in enumerate(roles):
fill = (255,248,235) if i%2==0 else (248,255,248)
if "★" in role: fill = (255,255,180)
if "EMERGENCY" in role: fill = (255,220,220)
draw_box(d3, MARGIN_L+5, y, W-60, y+role_box_h-2, fill=fill, border=(0,120,80), radius=4)
d3.text((MARGIN_L+15, y+6), role, font=font(ITALIC, 21), fill=INK)
y += role_box_h
d3.text((W//2 - 15, H-42), "3", font=font(SANS_B, 26), fill=(100,100,100))
img3.save(f"{OUT}/page3.png", dpi=(150,150))
print("Page 3 done")
# ═══════════════════════════════════════════════════════════
# PAGE 4 — COMPLICATIONS + PDT vs OPEN + PEARLS
# ═══════════════════════════════════════════════════════════
img4, d4 = new_page()
d4.text((30, 18), "PERCUTANEOUS TRACHEOSTOMY KIT", font=font(SANS_B, 32), fill=(255,255,255))
d4.text((30, 58), "Complications • PDT vs Open • Must-Know Pearls", font=font(SANS,22), fill=(200,220,255))
y = 108
underline(d4, MARGIN_L+10, y, "COMPLICATIONS", font(BOLD, 27), HEADING)
y += 40
# Two columns: EARLY | LATE
col1x_c, col2x_c = MARGIN_L+5, MARGIN_L+590
cw = 545
draw_box(d4, col1x_c, y, col1x_c+cw, y+34, fill=(255,180,180), border=HEADING, radius=6)
d4.text((col1x_c+10, y+6), "⏱ EARLY", font=font(BOLD,24), fill=HEADING)
draw_box(d4, col2x_c, y, col2x_c+cw, y+34, fill=(255,200,150), border=(180,80,0), radius=6)
d4.text((col2x_c+10, y+6), "📅 LATE", font=font(BOLD,24), fill=(160,60,0))
y += 40
early = [
("Haemorrhage", "Most common; usually minor; major <0.03%"),
("Paratracheal insertion", "Prevented by bronchoscopy"),
("Post. tracheal wall injury", "★ Most serious intraop complication"),
("Accidental decannulation", "Re-intubate ORAL first; don't blindly reinstate"),
("Pneumothorax", "~0.85%"),
("Subcutaneous emphysema", "~1.4%"),
("Pneumomediastinum", "Rare"),
("Tracheal ring fracture", "More common than in open tracheostomy"),
("Hypoxaemia", "During scope use & tube exchange"),
("False passage/oesoph. place.", "Avoided by bronchoscopic guidance"),
]
late = [
("Tracheal stenosis ★", "'Corkscrew stenosis' — specific to PDT"),
("Tracheomalacia", "Weakening of tracheal cartilage"),
("Tracheo-innominate fistula", "Life-threatening; tube placed too low"),
("Tracheoesophageal fistula", "Rare; posterior wall injury"),
("Tracheocutaneous fistula", "Stoma fails to close after decannulation"),
("Granulation / stomal infxn", "Common; local wound care"),
("Tracheal scar", "Cosmetic"),
]
rh2 = 33
y2_e = y; y2_l = y
for comp, note in early:
fill = (255,248,248) if early.index((comp,note))%2==0 else (255,235,235)
if "★" in comp or "★" in note: fill=(255,255,180)
draw_box(d4, col1x_c, y2_e, col1x_c+cw, y2_e+rh2-1, fill=fill, border=(200,150,150), radius=3)
d4.text((col1x_c+8, y2_e+4), "• "+comp, font=font(BOLD,19), fill=INK)
d4.text((col1x_c+8, y2_e+20), " "+note, font=font(SANS,17), fill=(80,80,80))
y2_e += rh2
for comp, note in late:
fill = (255,248,235) if late.index((comp,note))%2==0 else (255,235,220)
if "★" in comp: fill=(255,255,180)
draw_box(d4, col2x_c, y2_l, col2x_c+cw, y2_l+rh2-1, fill=fill, border=(200,150,100), radius=3)
d4.text((col2x_c+8, y2_l+4), "• "+comp, font=font(BOLD,19), fill=INK)
d4.text((col2x_c+8, y2_l+20), " "+note, font=font(SANS,17), fill=(80,80,80))
y2_l += rh2
y = max(y2_e, y2_l) + 12
# PDT vs Open
underline(d4, MARGIN_L+10, y, "PDT vs OPEN SURGICAL TRACHEOSTOMY", font(BOLD, 26), SUB_HEAD)
y += 36
params = [
("Setting", "ICU bedside", "OT preferred"),
("Cost", "Lower ★", "Higher"),
("Wound infection", "Lower ★", "Higher"),
("Bleeding", "Similar/lower", "Similar (cautery available)"),
("Post. wall injury", "Higher risk", "Lower — direct vision"),
("Tracheal ring Fx", "Higher risk", "Very rare"),
("Paratracheal ins.", "Risk present", "Very rare"),
("Evidence", "Meta-analysis: EQUIVALENT outcomes (Scott-Brown's)", ""),
]
ph = 31
draw_box(d4, MARGIN_L+5, y, W-60, y+ph, fill=TABLE_HDR, border=TABLE_BDR, radius=4)
d4.text((MARGIN_L+15, y+5), "PARAMETER", font=font(SANS_B,20), fill=INK)
d4.text((MARGIN_L+340, y+5), "PDT", font=font(SANS_B,20), fill=(0,100,0))
d4.text((MARGIN_L+660, y+5), "OPEN SURGICAL", font=font(SANS_B,20), fill=(160,0,0))
y += ph
for i, (par, pdt, op) in enumerate(params):
fill = row_fills[i%2]
if "EQUIVALENT" in pdt: fill=(200,255,200)
draw_box(d4, MARGIN_L+5, y, W-60, y+ph-1, fill=fill, border=TABLE_BDR, radius=3)
d4.text((MARGIN_L+12, y+5), par, font=font(ITALIC,20), fill=INK)
d4.text((MARGIN_L+340, y+5), pdt, font=font(SANS,19), fill=(0,100,0))
d4.text((MARGIN_L+660, y+5), op, font=font(SANS,19), fill=(140,0,0))
y += ph
y += 8
# ★ PEARLS box
draw_box(d4, MARGIN_L+5, y, W-60, H-65, fill=(255,255,220), border=(200,160,0), radius=12)
d4.text((MARGIN_L+20, y+8), "★ EXAM PEARLS ★", font=font(BOLD,24), fill=(160,100,0))
y += 40
pearls = [
"1. Entry site: rings 1–2 or 2–3 (above ring 1 → subglottic stenosis; below ring 4 → innominate fistula)",
"2. Bronchoscopy is MANDATORY — reduces complications from 16.8% → 8.3%",
"3. ETT withdrawn to VOCAL CORD LEVEL before guidewire insertion",
"4. Accidental decannulation → SECURE AIRWAY ORALLY FIRST, then re-attempt",
"5. Most common late complication: TRACHEAL STENOSIS",
"6. Most feared acute complication: POSTERIOR TRACHEAL WALL PERFORATION",
"7. High PEEP (>10) is relative contraindication — bronchoscopy worsens ventilation",
"8. PDT is MORE COST-EFFECTIVE than surgical tracheostomy (Sabiston)",
]
for p in pearls:
d4.text((MARGIN_L+20, y), p, font=font(ITALIC,20), fill=INK)
y += 28
d4.text((W//2 - 15, H-42), "4", font=font(SANS_B, 26), fill=(100,100,100))
img4.save(f"{OUT}/page4.png", dpi=(150,150))
print("Page 4 done")
print("ALL PAGES COMPLETE")
cd /tmp/workspace/pdt-notes && python3 generate_notes.py 2>&1
ls -lh /tmp/workspace/pdt-notes/*.png
page1
Image · PNG
page2
Image · PNG
page3
Image · PNG
page4
Image · PNG