We have a competition of oral case presentation for the anesthesia day on Monday. So, give me a case which I can present, and I should get a first top in the case presentation. And give me a case.
mkdir -p /tmp/workspace/anesthesia-day-case && ls /tmp/workspace/anesthesia-day-case/
~/anesthesia-day-case/build_pptx.py
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
from io import BytesIO
# ── Colour palette ──────────────────────────────────────────────
DARK_BLUE = RGBColor(0x0D, 0x2B, 0x55) # slide header bar
MID_BLUE = RGBColor(0x1A, 0x5F, 0x9E) # accent / section bars
LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) # light fill boxes
ORANGE = RGBColor(0xE8, 0x6A, 0x10) # highlight / alert
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GRAY = RGBColor(0x33, 0x33, 0x33)
LIGHT_GRAY = RGBColor(0xF4, 0xF4, 0xF4)
RED_ALERT = RGBColor(0xC0, 0x39, 0x2B)
W = Inches(13.333)
H = Inches(7.5)
prs = Presentation()
prs.slide_width = W
prs.slide_height = H
blank = prs.slide_layouts[6]
# ── Helper functions ─────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_rgb, alpha=None):
shape = slide.shapes.add_shape(1, x, y, w, h) # MSO_SHAPE_TYPE.RECTANGLE = 1
shape.line.fill.background()
shape.line.width = 0
fill = shape.fill
fill.solid()
fill.fore_color.rgb = fill_rgb
return shape
def add_text(slide, text, x, y, w, h, size=18, bold=False, color=DARK_GRAY,
align=PP_ALIGN.LEFT, wrap=True, italic=False, anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(x, y, w, h)
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = anchor
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.03)
tf.margin_bottom = Inches(0.03)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.size = Pt(size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
return tb
def add_slide_header(slide, title, subtitle=None):
# Top dark bar
add_rect(slide, 0, 0, W, Inches(1.1), DARK_BLUE)
add_text(slide, title, Inches(0.35), Inches(0.08), Inches(11), Inches(0.75),
size=30, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
if subtitle:
add_text(slide, subtitle, Inches(0.35), Inches(0.78), Inches(11), Inches(0.35),
size=14, bold=False, color=LIGHT_BLUE, italic=True)
# Bottom accent line
add_rect(slide, 0, Inches(1.1), W, Inches(0.05), MID_BLUE)
def bullet_block(slide, items, x, y, w, h, header=None, hdr_color=MID_BLUE):
if header:
add_rect(slide, x, y, w, Inches(0.38), hdr_color)
add_text(slide, header, x + Inches(0.12), y + Inches(0.02), w - Inches(0.25),
Inches(0.36), size=15, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
y += Inches(0.38)
h -= Inches(0.38)
add_rect(slide, x, y, w, h, LIGHT_GRAY)
tb = slide.shapes.add_textbox(x + Inches(0.15), y + Inches(0.1),
w - Inches(0.3), h - Inches(0.2))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
first = True
for item in items:
if first:
p = tf.paragraphs[0]
first = False
else:
p = tf.add_paragraph()
p.space_before = Pt(4)
run = p.add_run()
run.text = f"• {item}"
run.font.size = Pt(14)
run.font.color.rgb = DARK_GRAY
# ════════════════════════════════════════════════════════════════
# SLIDE 1 – Title
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, DARK_BLUE) # full background
add_rect(s, 0, Inches(2.6), W, Inches(2.3), MID_BLUE) # centre band
add_text(s, "ANESTHESIA DAY • ORAL CASE PRESENTATION",
Inches(1), Inches(0.5), Inches(11.3), Inches(0.7),
size=16, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
add_text(s, "Malignant Hyperthermia",
Inches(0.5), Inches(2.65), Inches(12.3), Inches(1.2),
size=46, bold=True, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_text(s, "A Rare but Life-Threatening Anesthetic Emergency",
Inches(1), Inches(3.85), Inches(11.3), Inches(0.6),
size=22, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.CENTER, italic=True)
add_text(s, "Presented by: [Your Name] | Date: Monday, July 2026",
Inches(1), Inches(6.5), Inches(11.3), Inches(0.5),
size=13, bold=False, color=RGBColor(0xAA, 0xCC, 0xEE), align=PP_ALIGN.CENTER)
# ════════════════════════════════════════════════════════════════
# SLIDE 2 – Case Presentation
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, LIGHT_GRAY)
add_slide_header(s, "Case Presentation", "The Patient")
# Patient ID card
add_rect(s, Inches(0.35), Inches(1.25), Inches(4.0), Inches(5.9), WHITE)
add_rect(s, Inches(0.35), Inches(1.25), Inches(4.0), Inches(0.45), MID_BLUE)
add_text(s, "PATIENT PROFILE", Inches(0.5), Inches(1.27), Inches(3.7), Inches(0.4),
size=14, bold=True, color=WHITE)
profile_items = [
"Name: Mr. Arjun S.",
"Age: 19 years | Male",
"Weight: 72 kg | Height: 175 cm",
"ASA Physical Status: I",
"Scheduled Procedure:",
" Open reduction + internal fixation",
" of right tibial fracture",
"Anesthesia Plan: General anesthesia",
"PMH: No known allergies",
"Family Hx: Uncle — \"reaction to anesthesia\"",
"Medications: None",
]
tb = s.shapes.add_textbox(Inches(0.5), Inches(1.77), Inches(3.6), Inches(5.2))
tf = tb.text_frame
tf.word_wrap = True
first = True
for item in profile_items:
if first:
p = tf.paragraphs[0]; first = False
else:
p = tf.add_paragraph()
p.space_before = Pt(3)
run = p.add_run()
run.text = item
run.font.size = Pt(13)
run.font.color.rgb = DARK_GRAY
if "Family" in item:
run.font.bold = True
run.font.color.rgb = RED_ALERT
# Intraoperative events
add_rect(s, Inches(4.6), Inches(1.25), Inches(8.4), Inches(5.9), WHITE)
add_rect(s, Inches(4.6), Inches(1.25), Inches(8.4), Inches(0.45), ORANGE)
add_text(s, "INTRAOPERATIVE EVENTS (TIMELINE)", Inches(4.75), Inches(1.27), Inches(8.1), Inches(0.4),
size=14, bold=True, color=WHITE)
events = [
("T+0 min", "Induction: Propofol 150 mg + Succinylcholine 100 mg IV"),
("T+5 min", "Intubation achieved; sevoflurane 2% started"),
("T+20 min", "ETCO₂ rises: 45 → 62 mmHg (unexpected)"),
("T+25 min", "HR: 85 → 135 bpm; SpO₂ 97%"),
("T+30 min", "Masseter muscle rigidity noted"),
("T+35 min", "Temp 37.2°C → 38.9°C (rapid rise)"),
("T+38 min", "ABG: pH 7.18, PaCO₂ 78 mmHg, HCO₃ 16 — severe mixed acidosis"),
("T+40 min", "DIAGNOSIS: MALIGNANT HYPERTHERMIA — Emergency protocol activated"),
]
tb2 = s.shapes.add_textbox(Inches(4.75), Inches(1.8), Inches(8.1), Inches(5.2))
tf2 = tb2.text_frame
tf2.word_wrap = True
first = True
for time_pt, event in events:
if first:
p = tf2.paragraphs[0]; first = False
else:
p = tf2.add_paragraph()
p.space_before = Pt(5)
r1 = p.add_run(); r1.text = f"{time_pt} "
r1.font.size = Pt(12); r1.font.bold = True
r1.font.color.rgb = MID_BLUE if "DIAGNOSIS" not in event else RED_ALERT
r2 = p.add_run(); r2.text = event
r2.font.size = Pt(12)
r2.font.color.rgb = RED_ALERT if "DIAGNOSIS" in event else DARK_GRAY
if "DIAGNOSIS" in event:
r2.font.bold = True
# ════════════════════════════════════════════════════════════════
# SLIDE 3 – What is Malignant Hyperthermia?
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, LIGHT_GRAY)
add_slide_header(s, "What is Malignant Hyperthermia?", "Definition & Epidemiology")
left_items = [
"Pharmacogenetic clinical syndrome triggered by volatile halogenated anesthetics (halothane, isoflurane, sevoflurane, desflurane) and/or succinylcholine",
"Results in uncontrolled skeletal muscle hypermetabolism",
"Caused by sustained elevation of intracellular ionized Ca²⁺ in skeletal muscle",
"Before dantrolene era: mortality ~60%",
"With prompt dantrolene treatment: mortality <1.4%",
]
bullet_block(s, left_items, Inches(0.35), Inches(1.25), Inches(6.0), Inches(5.9),
header="DEFINITION", hdr_color=MID_BLUE)
right_data = [
"Incidence: 1:10,000 – 1:250,000 anesthetics",
"MH susceptibility mutations: ~1:2,000 in population",
"Males more susceptible than females",
"Pediatric patients: 52.1% of all MH reactions",
"Mutations in RyR1 gene (50–80% of cases)",
"Also: CACNA1S gene (L-type Ca²⁺ channel)",
"Autosomal dominant inheritance",
"Family history is a critical RED FLAG",
]
bullet_block(s, right_data, Inches(6.65), Inches(1.25), Inches(6.35), Inches(5.9),
header="EPIDEMIOLOGY & GENETICS", hdr_color=ORANGE)
# ════════════════════════════════════════════════════════════════
# SLIDE 4 – Pathophysiology
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, LIGHT_GRAY)
add_slide_header(s, "Pathophysiology", "The Molecular Cascade")
# Central arrow flow
steps = [
("TRIGGER", "Volatile anesthetic / Succinylcholine", DARK_BLUE),
("RyR1 MUTATION", "Abnormal ryanodine receptor on SR membrane", MID_BLUE),
("Ca²⁺ FLOOD", "Uncontrolled Ca²⁺ release from sarcoplasmic reticulum", MID_BLUE),
("HYPERMETABOLISM", "ATP depletion, heat production, O₂ consumption ↑↑↑", ORANGE),
("MULTI-ORGAN FAILURE", "Rhabdomyolysis, acidosis, hyperthermia, DIC, death", RED_ALERT),
]
box_w = Inches(2.3)
box_h = Inches(0.9)
gap = Inches(0.18)
start_x = Inches(0.35)
start_y = Inches(1.35)
for i, (title_s, body, col) in enumerate(steps):
bx = start_x + i * (box_w + gap)
add_rect(s, bx, start_y, box_w, box_h, col)
add_text(s, title_s, bx + Inches(0.08), start_y + Inches(0.02),
box_w - Inches(0.16), Inches(0.35), size=13, bold=True, color=WHITE)
add_text(s, body, bx + Inches(0.08), start_y + Inches(0.37),
box_w - Inches(0.16), Inches(0.5), size=10.5, color=WHITE, wrap=True)
if i < len(steps) - 1:
add_text(s, "→", bx + box_w + Inches(0.02), start_y + Inches(0.2),
Inches(0.16), Inches(0.5), size=22, bold=True, color=DARK_BLUE,
align=PP_ALIGN.CENTER)
# Downstream effects boxes
add_rect(s, Inches(0.35), Inches(2.55), W - Inches(0.7), Inches(0.04), MID_BLUE)
effects = [
("↑ ETCO₂", "First & most sensitive sign; CO₂ produced by muscle hypermetabolism"),
("Tachycardia", "Sympathetic activation; compensatory response"),
("Hyperthermia", "Up to 1°C rise per 5 min — LATE sign"),
("Rigidity", "Masseter spasm after succinylcholine is pathognomonic"),
("Acidosis", "Mixed respiratory + metabolic; pH may drop to <7.0"),
("Dark urine", "Myoglobinuria from rhabdomyolysis → renal failure risk"),
]
col_w = Inches(2.1)
for i, (sign, detail) in enumerate(effects):
bx = Inches(0.35) + i * (col_w + Inches(0.1))
add_rect(s, bx, Inches(2.65), col_w, Inches(0.38), DARK_BLUE)
add_text(s, sign, bx + Inches(0.06), Inches(2.67), col_w - Inches(0.12),
Inches(0.34), size=13, bold=True, color=WHITE, anchor=MSO_ANCHOR.MIDDLE)
add_rect(s, bx, Inches(3.03), col_w, Inches(1.0), WHITE)
add_text(s, detail, bx + Inches(0.08), Inches(3.06), col_w - Inches(0.16),
Inches(0.92), size=11, color=DARK_GRAY, wrap=True)
add_text(s, "CLINICAL SIGNS & SYMPTOMS", Inches(0.35), Inches(2.57), Inches(4), Inches(0.35),
size=12, bold=True, color=WHITE)
# Late / life-threatening
add_rect(s, Inches(0.35), Inches(4.2), W - Inches(0.7), Inches(0.45), RED_ALERT)
add_text(s, "⚠ LATE / LIFE-THREATENING: DIC • Renal failure • Cardiac arrest • Brain death",
Inches(0.5), Inches(4.22), W - Inches(1.0), Inches(0.4),
size=15, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# Grading note
note_items = [
"The Larach Clinical Grading Scale (CGS) quantifies likelihood of MH based on clinical signs.",
"Key diagnostic test: In Vitro Contracture Test (IVCT) on muscle biopsy — Gold standard.",
"Genetic testing: RyR1 and CACNA1S mutation panels available for family screening.",
]
bullet_block(s, note_items, Inches(0.35), Inches(4.82), W - Inches(0.7), Inches(2.3),
header="DIAGNOSIS", hdr_color=MID_BLUE)
# ════════════════════════════════════════════════════════════════
# SLIDE 5 – Emergency Management
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, RGBColor(0xFD, 0xF0, 0xEC)) # very light red tint
add_slide_header(s, "Emergency Management", "When Every Second Counts")
steps_mgmt = [
("STEP 1\nCALL FOR HELP", [
"Activate MH emergency protocol immediately",
"Assign roles: airway, drugs, documentation",
"Call for dantrolene — locate crash cart",
], RED_ALERT),
("STEP 2\nSTOP TRIGGERS", [
"Discontinue all volatile anesthetics NOW",
"Stop succinylcholine (if still running)",
"Change to TIVA: propofol + opioid",
"Hyperventilate with 100% O₂ at 10 L/min",
], ORANGE),
("STEP 3\nDANTROLENE", [
"2.5 mg/kg IV STAT — repeat every 5 min",
"Max initial dose: up to 10 mg/kg (or until symptoms resolve)",
"Dantrolene: inhibits RyR1, stops Ca²⁺ release",
"Continue 1 mg/kg IV q6h for 24–48 hrs",
], MID_BLUE),
("STEP 4\nSUPPORTIVE", [
"Active cooling: ice packs, cold IV saline (4°C)",
"Target core temp < 38.5°C",
"Sodium bicarbonate for severe acidosis",
"Dextrose + insulin for hyperkalemia",
"Hydration: 2 mL/kg/hr to protect kidneys",
"Avoid calcium-channel blockers (interact with dantrolene)",
], DARK_BLUE),
]
col_w = Inches(2.95)
for i, (title_s, items, col) in enumerate(steps_mgmt):
bx = Inches(0.35) + i * (col_w + Inches(0.15))
add_rect(s, bx, Inches(1.25), col_w, Inches(0.65), col)
add_text(s, title_s, bx + Inches(0.1), Inches(1.27), col_w - Inches(0.2),
Inches(0.6), size=13, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_rect(s, bx, Inches(1.9), col_w, Inches(4.8), WHITE)
tb = s.shapes.add_textbox(bx + Inches(0.12), Inches(2.0), col_w - Inches(0.24), Inches(4.6))
tf = tb.text_frame; tf.word_wrap = True
first = True
for item in items:
if first: p = tf.paragraphs[0]; first = False
else: p = tf.add_paragraph()
p.space_before = Pt(5)
run = p.add_run(); run.text = f"• {item}"
run.font.size = Pt(12.5); run.font.color.rgb = DARK_GRAY
# Bottom alert bar
add_rect(s, 0, Inches(6.9), W, Inches(0.6), RED_ALERT)
add_text(s, "DANTROLENE is the ONLY life-saving antidote — must be stocked in every OR that uses triggering agents",
Inches(0.3), Inches(6.92), W - Inches(0.6), Inches(0.55),
size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
# ════════════════════════════════════════════════════════════════
# SLIDE 6 – Our Case: Management & Outcome
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, LIGHT_GRAY)
add_slide_header(s, "Case: Management & Outcome", "What We Did")
left_actions = [
"Volatile anesthetic and succinylcholine immediately discontinued",
"Switched to TIVA: Propofol 100 mcg/kg/min + fentanyl infusion",
"Hyperventilated with 100% O₂ (FiO₂ 1.0)",
"Dantrolene 2.5 mg/kg IV stat → total 7.5 mg/kg administered",
"Active cooling: ice packs axillae & groin, cold IV saline 4°C",
"Sodium bicarbonate 100 mEq IV for metabolic acidosis",
"Foley catheter inserted — urine output monitored hourly",
"Arterial line + central line inserted",
"Serial ABGs + CK + electrolytes q1h",
"Transferred to ICU post-operatively",
]
bullet_block(s, left_actions, Inches(0.35), Inches(1.25), Inches(6.5), Inches(5.9),
header="ACTIONS TAKEN (Chronological)", hdr_color=ORANGE)
# Outcome column
add_rect(s, Inches(7.1), Inches(1.25), Inches(5.85), Inches(5.9), WHITE)
add_rect(s, Inches(7.1), Inches(1.25), Inches(5.85), Inches(0.45), MID_BLUE)
add_text(s, "OUTCOME", Inches(7.25), Inches(1.27), Inches(5.55), Inches(0.4),
size=14, bold=True, color=WHITE)
outcomes = [
("T+50 min", "ETCO₂ fell from 78 → 45 mmHg"),
("T+60 min", "Heart rate normalized to 88 bpm"),
("T+90 min", "Temperature peaked at 39.4°C, then trended down"),
("T+4 hrs", "Temperature 37.8°C; pH 7.36"),
("Day 2", "CK peak: 45,000 U/L (rhabdomyolysis confirmed)"),
("Day 3", "Urine output satisfactory; renal function preserved"),
("Day 5", "Patient extubated, fully conscious"),
("Day 7", "Discharged with MH alert bracelet + genetic counseling"),
]
tb = s.shapes.add_textbox(Inches(7.25), Inches(1.8), Inches(5.55), Inches(4.2))
tf = tb.text_frame; tf.word_wrap = True; first = True
for time_pt, event in outcomes:
if first: p = tf.paragraphs[0]; first = False
else: p = tf.add_paragraph()
p.space_before = Pt(5)
r1 = p.add_run(); r1.text = f"{time_pt} "
r1.font.size = Pt(12.5); r1.font.bold = True; r1.font.color.rgb = MID_BLUE
r2 = p.add_run(); r2.text = event
r2.font.size = Pt(12.5); r2.font.color.rgb = DARK_GRAY
# Lesson box
add_rect(s, Inches(7.1), Inches(5.5), Inches(5.85), Inches(1.65), DARK_BLUE)
add_text(s, "KEY LESSON", Inches(7.25), Inches(5.55), Inches(5.55), Inches(0.35),
size=13, bold=True, color=ORANGE)
add_text(s,
"Early recognition of rising ETCO₂ + tachycardia in the presence of triggering agents — THINK MH FIRST. "
"A positive family history of anesthetic complications is a mandatory pre-operative red flag.",
Inches(7.25), Inches(5.9), Inches(5.55), Inches(1.1),
size=12.5, color=WHITE, wrap=True)
# ════════════════════════════════════════════════════════════════
# SLIDE 7 – Anesthesia Considerations & Prevention
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, LIGHT_GRAY)
add_slide_header(s, "Anesthesia Considerations & Prevention", "The Anesthesiologist's Role")
col1 = [
"Screen all patients: ask about personal AND family history of anesthetic reactions",
"MH-susceptible patients require trigger-free anesthesia (TIVA only)",
"Purge anesthesia machine: flush for 10–30 min at 10 L/min fresh gas flow",
"Replace soda lime absorber before use",
"Use dedicated MH-safe machines where available",
"Pre-operative genetic counseling for at-risk families",
"Safe agents: propofol, ketamine, opioids, midazolam, non-depolarizing NMBs",
"AVOID: succinylcholine, all volatile agents",
]
bullet_block(s, col1, Inches(0.35), Inches(1.25), Inches(6.15), Inches(5.9),
header="PREVENTION STRATEGIES", hdr_color=DARK_BLUE)
col2_a = [
"Dantrolene 36 vials (720 mg) must be immediately available in every OR",
"Each vial: 20 mg dantrolene + 3 g mannitol — must be reconstituted with 60 mL sterile water",
"MH hotline (MHAUS USA): 1-800-MH-HYPER",
"Post-episode: report to national MH registry",
"Patient receives MH alert card/bracelet for life",
]
bullet_block(s, col2_a, Inches(6.7), Inches(1.25), Inches(6.28), Inches(2.9),
header="OR PREPAREDNESS", hdr_color=ORANGE)
col2_b = [
"Ryanodex (dantrolene sodium for injection 250 mg): newer concentrated formulation — faster reconstitution",
"Research ongoing: specific RyR1 stabilizers as future prophylaxis",
"MHAUS provides online MH simulation training for OR teams",
]
bullet_block(s, col2_b, Inches(6.7), Inches(4.35), Inches(6.28), Inches(2.8),
header="CURRENT DEVELOPMENTS", hdr_color=MID_BLUE)
# ════════════════════════════════════════════════════════════════
# SLIDE 8 – Take-Home Messages
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, DARK_BLUE)
add_rect(s, 0, 0, W, Inches(1.3), MID_BLUE)
add_text(s, "Take-Home Messages", Inches(0.35), Inches(0.08), Inches(12.6), Inches(1.1),
size=34, bold=True, color=WHITE, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
messages = [
("1", "THINK MH early", "Rising ETCO₂ + tachycardia + muscle rigidity during volatile anesthesia = MH until proven otherwise"),
("2", "HISTORY is key", "A family member who 'reacted to anesthesia' may mean MH susceptibility — ALWAYS ask"),
("3", "STOP and SWITCH", "Immediately discontinue volatile agents; convert to TIVA with 100% O₂"),
("4", "DANTROLENE saves lives", "2.5 mg/kg IV, repeat every 5 min up to 10 mg/kg — do not delay"),
("5", "COOL aggressively", "Target temperature < 38.5°C; avoid hyperthermia rebound"),
("6", "FOLLOW UP", "Genetic testing + counseling for patient and first-degree relatives"),
]
for i, (num, headline, detail) in enumerate(messages):
bx = Inches(0.4) + (i % 3) * Inches(4.28)
by = Inches(1.5) + (i // 3) * Inches(2.7)
add_rect(s, bx, by, Inches(3.9), Inches(2.4), MID_BLUE)
add_rect(s, bx, by, Inches(0.55), Inches(2.4), ORANGE)
add_text(s, num, bx + Inches(0.03), by + Inches(0.7), Inches(0.48), Inches(1.0),
size=28, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(s, headline, bx + Inches(0.65), by + Inches(0.08), Inches(3.15), Inches(0.5),
size=15, bold=True, color=WHITE)
add_text(s, detail, bx + Inches(0.65), by + Inches(0.58), Inches(3.1), Inches(1.7),
size=11.5, color=LIGHT_BLUE, wrap=True)
add_text(s, "\"In anesthesia, the price of ignorance is a life.\"",
Inches(1), Inches(6.85), Inches(11.3), Inches(0.55),
size=14, bold=False, color=RGBColor(0xAA, 0xCC, 0xEE),
align=PP_ALIGN.CENTER, italic=True)
# ════════════════════════════════════════════════════════════════
# SLIDE 9 – References
# ════════════════════════════════════════════════════════════════
s = prs.slides.add_slide(blank)
add_rect(s, 0, 0, W, H, LIGHT_GRAY)
add_slide_header(s, "References", "")
refs = [
"1. Miller RD, et al. Miller's Anesthesia, 10th ed. (2025). Chapter on Malignant Hyperthermia. Elsevier.",
"2. Morgan GE, Mikhail MS. Morgan and Mikhail's Clinical Anesthesiology, 7th ed. (2022). McGraw-Hill.",
"3. Barash PG, et al. Barash, Cullen, and Stoelting's Clinical Anesthesia, 9th ed. (2024). Wolters Kluwer.",
"4. Larach MG, et al. A clinical grading scale to predict malignant hyperthermia susceptibility. Anesthesiology. 1994;80(4):771-779.",
"5. Hopkins PM, et al. European Malignant Hyperthermia Group guidelines for investigation of MH susceptibility. Br J Anaesth. 2015;115(4):531-539.",
"6. Rosenberg H, et al. Malignant hyperthermia: a review. Orphanet J Rare Dis. 2015;10:93.",
"7. MHAUS (Malignant Hyperthermia Association of the United States). www.mhaus.org",
"8. Guyton AC, Hall JE. Textbook of Medical Physiology, 14th ed. Elsevier.",
]
tb = s.shapes.add_textbox(Inches(0.5), Inches(1.4), Inches(12.3), Inches(5.5))
tf = tb.text_frame; tf.word_wrap = True; first = True
for ref in refs:
if first: p = tf.paragraphs[0]; first = False
else: p = tf.add_paragraph()
p.space_before = Pt(8)
run = p.add_run(); run.text = ref
run.font.size = Pt(12.5); run.font.color.rgb = DARK_GRAY
# ════════════════════════════════════════════════════════════════
# SAVE
# ════════════════════════════════════════════════════════════════
out_path = "/tmp/workspace/anesthesia-day-case/Malignant_Hyperthermia_Case_Presentation.pptx"
buf = BytesIO()
prs.save(buf)
with open(out_path, "wb") as f:
f.write(buf.getvalue())
print(f"SAVED: {out_path}")
cd /tmp/workspace/anesthesia-day-case && python build_pptx.py 2>&1
python3 - <<'EOF' from pptx import Presentation prs = Presentation("/tmp/workspace/anesthesia-day-case/Malignant_Hyperthermia_Case_Presentation.pptx") print(f"Total slides: {len(prs.slides)}") for i, slide in enumerate(prs.slides, 1): texts = [] for shape in slide.shapes: if shape.has_text_frame: t = shape.text_frame.text.strip() if t: texts.append(t[:60]) print(f" Slide {i}: {texts[:3]}") EOF
Malignant Hyperthermia Case Presentation
Presentation · PPTX
| Slide | Title | Time |
|---|---|---|
| 1 | Title slide | 30 sec |
| 2 | Case Presentation - Patient profile + intraoperative timeline | 2 min |
| 3 | What is MH? - Definition + epidemiology/genetics | 1.5 min |
| 4 | Pathophysiology - Molecular cascade + clinical signs | 2.5 min |
| 5 | Emergency Management - 4-step protocol | 2.5 min |
| 6 | Our Case: Management & Outcome | 2 min |
| 7 | Prevention & Anesthesia Considerations | 1.5 min |
| 8 | Take-Home Messages | 1 min |
| 9 | References | 30 sec |