Create a ppt presentation for migraine therapy for pharmacology subject
mkdir -p /tmp/workspace/migraine-ppt && ls /tmp/workspace/migraine-ppt/
~/migraine-ppt/build_ppt.py
"""
Migraine Therapy - Pharmacology Presentation
Target: Undergraduate pharmacy/medical students
Slides: ~18 slides, moderate depth
"""
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
import subprocess, json, base64
from io import BytesIO
# ─── Color Palette ───────────────────────────────────────────────────────────
DEEP_PURPLE = RGBColor(0x4A, 0x14, 0x86) # slide header / title bg
MED_PURPLE = RGBColor(0x7B, 0x2D, 0xBF) # accent bars
LIGHT_PURPLE = RGBColor(0xEE, 0xE5, 0xF8) # light bg tint
GOLD = RGBColor(0xF5, 0xC5, 0x18) # highlight accent
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GRAY = RGBColor(0x22, 0x22, 0x22)
MID_GRAY = RGBColor(0x55, 0x55, 0x55)
TEAL = RGBColor(0x00, 0x8B, 0x8B)
RED_WARN = RGBColor(0xCC, 0x22, 0x22)
GREEN_OK = RGBColor(0x1A, 0x7A, 0x3C)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6] # fully blank
# ─── Helper functions ─────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_color, alpha=None):
from pptx.util import Inches
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE = 1
Inches(x), Inches(y), Inches(w), Inches(h)
)
shape.line.fill.background()
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
return shape
def add_text(slide, text, x, y, w, h, font_size=18, bold=False, color=DARK_GRAY,
align=PP_ALIGN.LEFT, italic=False, wrap=True):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = Pt(0)
tf.margin_right = Pt(0)
tf.margin_top = Pt(0)
tf.margin_bottom= Pt(0)
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.size = Pt(font_size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
r.font.name = "Calibri"
return tb
def add_bullet_slide(slide, title_text, bullets, note=None):
"""Add title bar + bullet list to a slide."""
# Top purple banner
add_rect(slide, 0, 0, 13.333, 1.1, DEEP_PURPLE)
add_text(slide, title_text, 0.35, 0.12, 12.5, 0.85,
font_size=30, bold=True, color=WHITE)
# Gold accent line
add_rect(slide, 0, 1.1, 13.333, 0.06, GOLD)
# White body
add_rect(slide, 0, 1.16, 13.333, 6.34, WHITE)
y_cur = 1.35
for bullet in bullets:
if isinstance(bullet, dict):
# section sub-header
if bullet.get("type") == "header":
add_text(slide, bullet["text"], 0.5, y_cur, 12.5, 0.45,
font_size=17, bold=True, color=MED_PURPLE)
y_cur += 0.45
elif bullet.get("type") == "sub":
tb = slide.shapes.add_textbox(Inches(1.0), Inches(y_cur),
Inches(11.8), Inches(0.42))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left=tf.margin_right=tf.margin_top=tf.margin_bottom=Pt(0)
p = tf.paragraphs[0]; p.alignment = PP_ALIGN.LEFT
r = p.add_run(); r.text = bullet["text"]
r.font.size = Pt(15); r.font.color.rgb = MID_GRAY
r.font.name = "Calibri"
y_cur += 0.42
else:
# Normal bullet
tb = slide.shapes.add_textbox(Inches(0.5), Inches(y_cur),
Inches(12.3), Inches(0.48))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left=tf.margin_right=tf.margin_top=tf.margin_bottom=Pt(0)
p = tf.paragraphs[0]; p.alignment = PP_ALIGN.LEFT
r1 = p.add_run(); r1.text = " \u2022 "
r1.font.size = Pt(16); r1.font.color.rgb = MED_PURPLE
r1.font.bold = True; r1.font.name = "Calibri"
r2 = p.add_run(); r2.text = bullet
r2.font.size = Pt(16); r2.font.color.rgb = DARK_GRAY
r2.font.name = "Calibri"
y_cur += 0.47
if note:
add_rect(slide, 0.4, 6.8, 12.5, 0.45, LIGHT_PURPLE)
add_text(slide, note, 0.55, 6.82, 12.2, 0.4,
font_size=12, italic=True, color=MID_GRAY)
def add_two_col_slide(slide, title_text, left_header, left_items,
right_header, right_items, col_color_l=LIGHT_PURPLE,
col_color_r=RGBColor(0xE8, 0xF6, 0xEE)):
add_rect(slide, 0, 0, 13.333, 1.1, DEEP_PURPLE)
add_text(slide, title_text, 0.35, 0.12, 12.5, 0.85,
font_size=30, bold=True, color=WHITE)
add_rect(slide, 0, 1.1, 13.333, 0.06, GOLD)
add_rect(slide, 0, 1.16, 13.333, 6.34, WHITE)
# Left column
add_rect(slide, 0.3, 1.35, 6.0, 0.5, MED_PURPLE)
add_text(slide, left_header, 0.35, 1.38, 5.9, 0.44,
font_size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(slide, 0.3, 1.85, 6.0, 5.3, col_color_l)
y = 2.0
for item in left_items:
tb = slide.shapes.add_textbox(Inches(0.55), Inches(y), Inches(5.6), Inches(0.5))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left=tf.margin_right=tf.margin_top=tf.margin_bottom=Pt(0)
p = tf.paragraphs[0]
r1=p.add_run(); r1.text=" \u2022 "
r1.font.size=Pt(15); r1.font.color.rgb=MED_PURPLE; r1.font.bold=True
r1.font.name="Calibri"
r2=p.add_run(); r2.text=item
r2.font.size=Pt(14); r2.font.color.rgb=DARK_GRAY; r2.font.name="Calibri"
y += 0.5
# Right column
add_rect(slide, 6.85, 1.35, 6.2, 0.5, TEAL)
add_text(slide, right_header, 6.9, 1.38, 6.1, 0.44,
font_size=16, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_rect(slide, 6.85, 1.85, 6.2, 5.3, col_color_r)
y = 2.0
for item in right_items:
tb = slide.shapes.add_textbox(Inches(7.1), Inches(y), Inches(5.7), Inches(0.5))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left=tf.margin_right=tf.margin_top=tf.margin_bottom=Pt(0)
p = tf.paragraphs[0]
r1=p.add_run(); r1.text=" \u2022 "
r1.font.size=Pt(15); r1.font.color.rgb=TEAL; r1.font.bold=True
r1.font.name="Calibri"
r2=p.add_run(); r2.text=item
r2.font.size=Pt(14); r2.font.color.rgb=DARK_GRAY; r2.font.name="Calibri"
y += 0.5
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE SLIDE
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
# Full bg gradient-like with rectangle layers
add_rect(slide, 0, 0, 13.333, 7.5, DEEP_PURPLE)
add_rect(slide, 0, 4.5, 13.333, 3.0, MED_PURPLE)
add_rect(slide, 0, 3.2, 13.333, 0.08, GOLD)
# Central white card
add_rect(slide, 1.2, 1.0, 10.9, 4.8, WHITE)
add_rect(slide, 1.2, 1.0, 0.12, 4.8, GOLD) # left accent bar
add_text(slide, "PHARMACOLOGY", 1.5, 1.15, 10.5, 0.6,
font_size=16, bold=False, color=MED_PURPLE, align=PP_ALIGN.CENTER)
add_text(slide, "Migraine Therapy", 1.5, 1.7, 10.5, 1.3,
font_size=48, bold=True, color=DEEP_PURPLE, align=PP_ALIGN.CENTER)
add_rect(slide, 3.0, 3.05, 7.3, 0.05, LIGHT_PURPLE)
add_text(slide, "Pathophysiology | Drug Classes | Acute Treatment | Prophylaxis",
1.5, 3.15, 10.5, 0.55,
font_size=16, italic=True, color=MID_GRAY, align=PP_ALIGN.CENTER)
add_text(slide, "For Undergraduate Pharmacy & Medical Students", 1.5, 3.85, 10.5, 0.5,
font_size=15, color=MID_GRAY, align=PP_ALIGN.CENTER)
add_text(slide, "Source: Goodman & Gilman's | Lippincott Pharmacology | Katzung",
1.5, 4.35, 10.5, 0.35,
font_size=11, italic=True, color=RGBColor(0x99,0x99,0x99), align=PP_ALIGN.CENTER)
# Bottom watermark
add_text(slide, "Department of Pharmacology", 0, 6.95, 13.333, 0.4,
font_size=12, color=WHITE, align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 2 — OUTLINE / CONTENTS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, RGBColor(0xF7,0xF4,0xFF))
add_rect(slide, 0, 0, 13.333, 1.1, DEEP_PURPLE)
add_text(slide, "Lecture Outline", 0.35, 0.12, 12.5, 0.85,
font_size=30, bold=True, color=WHITE)
add_rect(slide, 0, 1.1, 13.333, 0.06, GOLD)
topics = [
("01", "Introduction & Epidemiology"),
("02", "Classification of Migraine"),
("03", "Pathophysiology"),
("04", "Role of Serotonin (5-HT)"),
("05", "Role of CGRP"),
("06", "Acute Treatment — Overview"),
("07", "Triptans (5-HT1B/1D Agonists)"),
("08", "Ergot Alkaloids"),
("09", "Ditans & CGRP Antagonists (Gepants)"),
("10", "Non-Specific Analgesics & Antiemetics"),
("11", "Migraine Prophylaxis — Overview"),
("12", "Prophylactic Agents (Beta-blockers, AEDs, Antidepressants)"),
("13", "CGRP Monoclonal Antibodies"),
("14", "Special Populations"),
("15", "Treatment Algorithm"),
("16", "Summary & Key Points"),
]
# Two columns
col1 = topics[:8]
col2 = topics[8:]
for i, (num, text) in enumerate(col1):
y = 1.35 + i * 0.73
add_rect(slide, 0.4, y, 0.55, 0.52, MED_PURPLE)
add_text(slide, num, 0.41, y+0.03, 0.52, 0.46,
font_size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, text, 1.05, y+0.05, 5.5, 0.45, font_size=15, color=DARK_GRAY)
for i, (num, text) in enumerate(col2):
y = 1.35 + i * 0.73
add_rect(slide, 7.0, y, 0.55, 0.52, TEAL)
add_text(slide, num, 7.01, y+0.03, 0.52, 0.46,
font_size=14, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, text, 7.65, y+0.05, 5.5, 0.45, font_size=15, color=DARK_GRAY)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 3 — INTRODUCTION & EPIDEMIOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Introduction & Epidemiology", [
"Migraine affects 10–20% of the general population (Goodman & Gilman's)",
"One of the most disabling neurological disorders worldwide",
"More common in women (3:1 female:male ratio); peak prevalence ages 25–55",
"Characterized by recurrent, episodic, often unilateral throbbing headache",
"Attacks last 4–72 hours if untreated; frequency highly variable between patients",
"Often accompanied by nausea, vomiting, photophobia, and phonophobia",
"Genetic predisposition identified; familial hemiplegic migraine linked to ion channel mutations",
"Significant socioeconomic burden — one of the top causes of years lived with disability (YLD)",
], note="Ref: Goodman & Gilman's Pharmacological Basis of Therapeutics, 13e")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 4 — CLASSIFICATION
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Classification of Migraine (IHS/ICHD-3)", [
{"type": "header", "text": "Primary Types:"},
"Migraine Without Aura (Common Migraine) — ~80% of cases",
"Migraine With Aura (Classic Migraine) — transient focal neurological symptoms precede headache",
{"type": "header", "text": "Subtypes of Migraine With Aura:"},
{"type": "sub", "text": " - Typical aura with migraine headache"},
{"type": "sub", "text": " - Migraine with prolonged aura"},
{"type": "sub", "text": " - Migraine aura without headache (acephalgic migraine)"},
{"type": "sub", "text": " - Migraine with acute-onset aura"},
{"type": "header", "text": "Other Forms:"},
"Chronic Migraine: headache on ≥15 days/month for >3 months",
"Hemiplegic Migraine, Retinal Migraine, Vestibular Migraine",
{"type": "header", "text": "Phases of a Migraine Attack:"},
{"type": "sub", "text": " Prodrome → Aura (if present) → Headache → Postdrome"},
], note="Aura typically lasts 20–60 min; visual, sensory or speech disturbances most common")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 5 — PATHOPHYSIOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Pathophysiology of Migraine", [
"Complex interaction of neural and vascular elements — no single unifying theory",
{"type": "header", "text": "Cortical Spreading Depression (CSD):"},
{"type": "sub", "text": " - Wave of neuronal depolarization across cortex, correlates with aura"},
{"type": "sub", "text": " - Triggers activation of trigeminal pain pathways"},
{"type": "header", "text": "Trigeminovascular Hypothesis:"},
{"type": "sub", "text": " - Activation of trigeminal nerve → release of vasoactive neuropeptides"},
{"type": "sub", "text": " - CGRP, Substance P, Neurokinin A → neurogenic inflammation + vasodilation"},
{"type": "sub", "text": " - Central sensitization leads to allodynia and prolonged headache"},
{"type": "header", "text": "Vascular Component:"},
{"type": "sub", "text": " - Dilation of intracranial vessels and arteriovenous anastomoses"},
{"type": "sub", "text": " - Vasoconstriction agents (triptans) provide acute relief"},
{"type": "header", "text": "Genetic Factors:"},
{"type": "sub", "text": " - Mutations in CACNA1A (Ca2+ channel), ATP1A2 (Na/K-ATPase) in familial forms"},
])
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 6 — ROLE OF SEROTONIN
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Role of Serotonin (5-HT) in Migraine", [
"Serotonin is a key mediator in migraine pathogenesis (5-HT hypothesis)",
{"type": "header", "text": "Evidence for 5-HT involvement:"},
{"type": "sub", "text": " 1. Plasma & platelet 5-HT levels vary across different phases of the migraine attack"},
{"type": "sub", "text": " 2. Urinary 5-HT and its metabolites are elevated during most attacks"},
{"type": "sub", "text": " 3. Reserpine & fenfluramine (agents that release 5-HT) can precipitate migraine"},
{"type": "sub", "text": " 4. 5-HT receptor agonists (triptans) are highly effective in aborting attacks"},
{"type": "header", "text": "Key Receptor Subtypes:"},
"5-HT1B/1D — agonism causes vasoconstriction + blocks proinflammatory neuropeptide release",
"5-HT1F — agonism modulates trigeminal pain pathways (no vasoconstriction) — target for ditans",
"5-HT2A — antagonism involved in prophylactic effects of some drugs (e.g., methysergide)",
{"type": "header", "text": "Drugs acting via 5-HT receptors:"},
{"type": "sub", "text": " Acute: Triptans (5-HT1B/1D), Ergots (5-HT1B/1D + others), Lasmiditan (5-HT1F)"},
{"type": "sub", "text": " Prophylaxis: Beta-blockers (indirect), Amitriptyline (5-HT reuptake inhibition)"},
], note="Ref: Goodman & Gilman's, 13e — Chapter on Serotonin")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 7 — ROLE OF CGRP
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Role of CGRP in Migraine", [
"Calcitonin Gene-Related Peptide (CGRP) — potent vasodilatory & proinflammatory neuropeptide",
"Released from trigeminal nerve terminals during a migraine attack",
"Plasma CGRP levels are elevated during acute migraine; normalize after sumatriptan treatment",
{"type": "header", "text": "CGRP Actions:"},
{"type": "sub", "text": " - Causes dilation of dural blood vessels"},
{"type": "sub", "text": " - Promotes neurogenic inflammation and pain sensitization"},
{"type": "sub", "text": " - Activates CGRP receptors on trigeminal neurons (central sensitization)"},
{"type": "header", "text": "Drugs Targeting CGRP:"},
"Small-molecule CGRP receptor antagonists (Gepants): rimegepant, ubrogepant — ACUTE",
"Oral gepants for prevention: rimegepant (also), atogepant",
"Monoclonal antibodies targeting CGRP or its receptor — PROPHYLAXIS:",
{"type": "sub", "text": " Erenumab (anti-receptor), Fremanezumab, Galcanezumab, Eptinezumab (anti-CGRP)"},
], note="CGRP-based therapies represent the first migraine-specific class developed for prevention")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 8 — ACUTE TREATMENT OVERVIEW
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Acute (Abortive) Treatment — Overview", [
"Goal: rapidly abort the migraine attack, restore normal function",
"Treatment should begin as early as possible after attack onset",
{"type": "header", "text": "Step-Care Approach (stratified by severity):"},
{"type": "sub", "text": " Mild-Moderate: Simple analgesics (NSAIDs, aspirin, acetaminophen ± caffeine)"},
{"type": "sub", "text": " Moderate-Severe: Migraine-specific drugs — triptans (first-line)"},
{"type": "sub", "text": " Severe/refractory: DHE, IV medications, opioids (last resort)"},
{"type": "header", "text": "Drug Classes for Acute Treatment:"},
"1. Triptans (5-HT1B/1D agonists) — FIRST-LINE for moderate-severe migraine",
"2. Ergot alkaloids — ergotamine, dihydroergotamine (DHE)",
"3. Ditans — lasmiditan (5-HT1F agonist)",
"4. Gepants (CGRP receptor antagonists) — rimegepant, ubrogepant",
"5. Non-specific analgesics — NSAIDs, acetaminophen, combination products",
"6. Antiemetics — metoclopramide, prochlorperazine (adjunct + analgesic effect)",
], note="Medication overuse headache (MOH) is a major risk — limit acute medications to <10-15 days/month")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 9 — TRIPTANS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Triptans — 5-HT1B/1D Receptor Agonists", [
{"type": "header", "text": "Drugs: Sumatriptan (prototype), Rizatriptan, Zolmitriptan, Eletriptan, Naratriptan, Frovatriptan, Almotriptan"},
{"type": "header", "text": "Mechanism of Action:"},
{"type": "sub", "text": " - Potent 5-HT1B/1D receptor agonists"},
{"type": "sub", "text": " - Cause vasoconstriction of dilated intracranial vessels"},
{"type": "sub", "text": " - Block release of pro-inflammatory neuropeptides (CGRP, Substance P) from trigeminal nerve"},
{"type": "header", "text": "Pharmacokinetics:"},
{"type": "sub", "text": " - Sumatriptan: SC (onset 20 min), oral (1–2 hr), intranasal; t½ = 2 hr"},
{"type": "sub", "text": " - Frovatriptan: longest t½ >24 hr — preferred in menstrual migraine"},
{"type": "sub", "text": " - Eletriptan: most effective at 2-hr and 24-hr endpoints (meta-analysis)"},
{"type": "header", "text": "Adverse Effects:"},
{"type": "sub", "text": " - 'Triptan sensations': chest tightness, pressure in neck/jaw, flushing"},
{"type": "sub", "text": " - Nausea, dizziness; headache recurrence within 24–48 hr common"},
{"type": "header", "text": "Contraindications:"},
{"type": "sub", "text": " - CAD, uncontrolled HTN, cerebrovascular disease, hemiplegic/basilar migraine"},
{"type": "sub", "text": " - Do NOT combine with ergots (within 24 hr) or MAOIs"},
], note="~70% of patients report significant relief with sumatriptan 6 mg SC (Goodman & Gilman's)")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 10 — ERGOT ALKALOIDS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Ergot Alkaloids", [
"Derived from Claviceps purpurea (fungus on rye grain) — historically the mainstay of therapy",
{"type": "header", "text": "Drugs: Ergotamine, Dihydroergotamine (DHE)"},
{"type": "header", "text": "Mechanism of Action:"},
{"type": "sub", "text": " - Partial agonist/antagonist at 5-HT1B/1D, alpha-adrenergic & dopamine receptors"},
{"type": "sub", "text": " - Vasoconstriction of intracranial blood vessels (main antimigraine effect)"},
{"type": "header", "text": "Clinical Use:"},
{"type": "sub", "text": " - Ergotamine: oral/sublingual/suppository (+ caffeine); effective early in attack"},
{"type": "sub", "text": " - DHE: IV or intranasal; indicated for severe migraine; efficacy similar to sumatriptan"},
{"type": "header", "text": "Adverse Effects:"},
{"type": "sub", "text": " - Nausea & vomiting (common), vasoconstriction, rebound headache with overuse"},
{"type": "sub", "text": " - Long-term: pulmonary/retroperitoneal/endocardial fibrosis (methysergide — withdrawn)"},
{"type": "header", "text": "Contraindications:"},
{"type": "sub", "text": " - Angina, PVD, pregnancy, uncontrolled HTN, hepatic/renal disease"},
{"type": "sub", "text": " - Do NOT combine with potent CYP3A4 inhibitors (risk: peripheral ischemia)"},
"NOTE: EMA has recommended ergot derivatives no longer be used for migraine",
], note="Ergots have been largely supplanted by triptans due to adverse effect profile")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 11 — DITANS & GEPANTS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_two_col_slide(
slide,
"Newer Acute Agents: Ditans & Gepants",
"Ditans (5-HT1F Agonists)",
[
"Drug: Lasmiditan",
"MOA: Selective 5-HT1F receptor agonist",
"Inhibits trigeminal pain pathway activation",
"Does NOT cause vasoconstriction",
"Advantage: safe in CVD patients",
"Adverse effects: dizziness, sedation, CNS effects",
"Classified as controlled substance (abuse potential)",
"Patients MUST NOT drive for 8 hrs after use",
],
"Gepants (CGRP Receptor Antagonists)",
[
"Drugs: Ubrogepant, Rimegepant",
"MOA: Block CGRP receptor → reduce neurogenic inflammation",
"No vasoconstriction — safe in CVD",
"Oral agents; well-tolerated",
"Ubrogepant: acute migraine Rx",
"Rimegepant: acute Rx AND prevention",
"Atogepant: prevention only",
"SE: nausea, somnolence (low incidence)",
]
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 12 — NON-SPECIFIC ANALGESICS & ANTIEMETICS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Non-Specific Analgesics & Adjuncts", [
{"type": "header", "text": "NSAIDs (First-line for mild-moderate migraine):"},
{"type": "sub", "text": " - Ibuprofen, Naproxen sodium, Diclofenac — effective and widely available"},
{"type": "sub", "text": " - Aspirin 900–1000 mg ± metoclopramide — comparable to sumatriptan 50 mg"},
{"type": "header", "text": "Acetaminophen (Paracetamol):"},
{"type": "sub", "text": " - Useful when NSAIDs contraindicated; modest efficacy alone"},
{"type": "header", "text": "Combination Products:"},
{"type": "sub", "text": " - Aspirin + Acetaminophen + Caffeine (Excedrin Migraine) — OTC, widely used"},
{"type": "sub", "text": " - Sumatriptan + Naproxen (Treximet) — improved efficacy over either alone"},
{"type": "sub", "text": " - Caffeine enhances analgesic absorption and has mild vasoconstrictive effects"},
{"type": "header", "text": "Antiemetics (Adjuncts):"},
{"type": "sub", "text": " - Metoclopramide: enhances gastric motility (improving drug absorption) + analgesic"},
{"type": "sub", "text": " - Prochlorperazine: IV/IM — analgesic and antiemetic, useful in ED setting"},
{"type": "sub", "text": " - Domperidone: antiemetic, improves NSAID absorption"},
], note="Medication overuse headache (MOH): limit analgesic use to <15 days/month, triptans <10 days/month")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 13 — PROPHYLAXIS OVERVIEW
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Migraine Prophylaxis — Overview", [
{"type": "header", "text": "Indications for Prophylactic Therapy:"},
{"type": "sub", "text": " - Migraine attacks ≥2 per month causing significant disability"},
{"type": "sub", "text": " - Severe or complicated attacks with neurological signs"},
{"type": "sub", "text": " - Inadequate response/contraindication to acute therapies"},
{"type": "sub", "text": " - Medication overuse headache (MOH) pattern"},
{"type": "sub", "text": " - Special forms: hemiplegic migraine, migraine with prolonged aura"},
{"type": "header", "text": "Goals of Prophylaxis:"},
"Reduce attack frequency, severity, and duration",
"Improve responsiveness to acute treatment",
"Reduce disability and medication overuse",
{"type": "header", "text": "Drug Classes Used in Prophylaxis:"},
"1. Beta-blockers (FIRST-LINE) — propranolol, metoprolol, timolol",
"2. Antiepileptics — topiramate, valproate (divalproex)",
"3. Antidepressants — amitriptyline, venlafaxine",
"4. Calcium channel blockers — verapamil",
"5. CGRP monoclonal antibodies — erenumab, galcanezumab, fremanezumab, eptinezumab",
"6. Botulinum toxin (OnabotulinumtoxinA) — for chronic migraine",
], note="Trial period of at least 2–3 months needed to assess efficacy; gradual dose titration recommended")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 14 — PROPHYLACTIC AGENTS DETAILS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_two_col_slide(
slide,
"Prophylactic Drug Classes — Details",
"Beta-blockers & AEDs",
[
"Propranolol: 40–240 mg/day — DOC",
"Metoprolol: 50–200 mg/day",
"Mechanism: unclear; reduce cortical excitability",
"SE: fatigue, bradycardia, cold extremities",
"CI: asthma, heart block, depression",
"",
"Topiramate: 25–100 mg/day",
"Valproate/Divalproex: 500–1500 mg/day",
"AED MOA: Na+ channel block, GABA enhancement",
"Topiramate SE: cognitive impairment, weight loss",
"Valproate SE: weight gain, teratogenic (CI in pregnancy)",
],
"Antidepressants & CCBs",
[
"Amitriptyline: 10–100 mg/day (TCA)",
"Venlafaxine: 75–150 mg/day (SNRI)",
"MOA: 5-HT/NE reuptake inhibition",
"SE (amitriptyline): anticholinergic, sedation",
"Useful if comorbid depression/insomnia",
"",
"Verapamil: 240–480 mg/day (CCB)",
"Less evidence than beta-blockers",
"Useful with cardiac contraindications to BB",
"",
"OnabotulinumtoxinA (Botox):",
"31 injections Q12 weeks — chronic migraine only",
],
col_color_r=RGBColor(0xE0, 0xF0, 0xFF)
)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 15 — CGRP MONOCLONAL ANTIBODIES
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "CGRP Monoclonal Antibodies — Preventive Therapy", [
"First drug class specifically developed FOR migraine prevention",
{"type": "header", "text": "Drugs & Targets:"},
{"type": "sub", "text": " Erenumab — targets CGRP receptor (monthly SC injection)"},
{"type": "sub", "text": " Fremanezumab — targets CGRP peptide (monthly or quarterly SC)"},
{"type": "sub", "text": " Galcanezumab — targets CGRP peptide (monthly SC)"},
{"type": "sub", "text": " Eptinezumab — targets CGRP peptide (quarterly IV infusion)"},
{"type": "header", "text": "Mechanism:"},
"Antibodies bind CGRP or its receptor → block CGRP-mediated vasodilation and neurogenic inflammation",
"Reduce trigeminal sensitization at both peripheral and central levels",
{"type": "header", "text": "Efficacy:"},
"Reduce migraine days by ~50% in majority of patients; ~25% achieve ≥75% reduction",
{"type": "header", "text": "Adverse Effects:"},
{"type": "sub", "text": " - Injection site reactions, constipation, nasopharyngitis"},
{"type": "sub", "text": " - Generally well-tolerated; no hepatotoxicity or CNS effects"},
{"type": "header", "text": "Advantage over traditional prophylactics:"},
"No CNS side effects; once-monthly/quarterly dosing improves adherence",
], note="Indicated for episodic or chronic migraine with ≥4 headache days/month")
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 16 — SPECIAL POPULATIONS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_bullet_slide(slide, "Special Populations", [
{"type": "header", "text": "Pregnancy:"},
{"type": "sub", "text": " - Migraine often improves in 2nd/3rd trimester (estrogen stabilization)"},
{"type": "sub", "text": " - Safest acute drugs: acetaminophen, metoclopramide"},
{"type": "sub", "text": " - Triptans: use only if benefit outweighs risk; sumatriptan has most safety data"},
{"type": "sub", "text": " - AVOID: ergots (oxytocic risk), valproate (teratogen), triptans in 1st trimester"},
{"type": "header", "text": "Menstrual Migraine:"},
{"type": "sub", "text": " - Linked to estrogen withdrawal; timed frovatriptan mini-prophylaxis used"},
{"type": "header", "text": "Pediatric:"},
{"type": "sub", "text": " - Attacks often shorter; ibuprofen or acetaminophen first"},
{"type": "sub", "text": " - Sumatriptan nasal spray approved ≥12 years in some guidelines"},
{"type": "header", "text": "Cardiovascular Disease:"},
{"type": "sub", "text": " - AVOID triptans (vasoconstriction risk); ergots also contraindicated"},
{"type": "sub", "text": " - Prefer: lasmiditan or gepants (no vasoconstriction)"},
{"type": "header", "text": "Hepatic/Renal Impairment:"},
{"type": "sub", "text": " - Eletriptan CI in hepatic disease; naratriptan CI in severe renal/hepatic impairment"},
{"type": "sub", "text": " - Gepants: ubrogepant CI with strong CYP3A4 inhibitors"},
])
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 17 — TREATMENT ALGORITHM
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, WHITE)
add_rect(slide, 0, 0, 13.333, 1.1, DEEP_PURPLE)
add_text(slide, "Migraine Treatment Algorithm", 0.35, 0.12, 12.5, 0.85,
font_size=30, bold=True, color=WHITE)
add_rect(slide, 0, 1.1, 13.333, 0.06, GOLD)
# ACUTE flowchart blocks
def flow_box(slide, x, y, w, h, text, bg, fg=WHITE, fsize=13):
add_rect(slide, x, y, w, h, bg)
add_text(slide, text, x+0.05, y+0.04, w-0.1, h-0.08,
font_size=fsize, bold=True, color=fg, align=PP_ALIGN.CENTER)
def arrow(slide, x, y):
add_text(slide, "▼", x, y, 0.4, 0.35, font_size=18, bold=True,
color=MED_PURPLE, align=PP_ALIGN.CENTER)
# Acute pathway
add_text(slide, "ACUTE TREATMENT", 0.3, 1.25, 6.1, 0.4,
font_size=14, bold=True, color=DEEP_PURPLE, align=PP_ALIGN.CENTER)
flow_box(slide, 0.3, 1.65, 6.1, 0.6, "Migraine Attack Onset", DEEP_PURPLE)
arrow(slide, 3.0, 2.28)
flow_box(slide, 0.3, 2.6, 2.7, 0.7, "Mild–Moderate\nNSAIDs / Acetaminophen\n± Antiemetic",
TEAL, fsize=11)
flow_box(slide, 3.3, 2.6, 3.1, 0.7, "Moderate–Severe\nTriptans (1st line)\nor Ergots (DHE)",
MED_PURPLE, fsize=11)
arrow(slide, 2.0, 3.34)
flow_box(slide, 0.3, 3.65, 6.1, 0.6, "If CVD / Triptan contraindicated:\nLasmiditan or Gepants (Rimegepant / Ubrogepant)",
TEAL, fsize=11)
arrow(slide, 3.0, 4.28)
flow_box(slide, 0.3, 4.6, 6.1, 0.55, "Refractory: IV Prochlorperazine / DHE / Steroids",
RED_WARN, fsize=12)
# Prophylaxis pathway
add_text(slide, "PROPHYLAXIS", 6.9, 1.25, 6.1, 0.4,
font_size=14, bold=True, color=DEEP_PURPLE, align=PP_ALIGN.CENTER)
flow_box(slide, 6.9, 1.65, 6.1, 0.6, "≥2 Migraines/Month or Significant Disability", DEEP_PURPLE)
arrow(slide, 9.5, 2.28)
flow_box(slide, 6.9, 2.6, 6.1, 0.65, "First-Line:\nPropranolol / Topiramate / Amitriptyline",
MED_PURPLE, fsize=12)
arrow(slide, 9.5, 3.28)
flow_box(slide, 6.9, 3.6, 6.1, 0.65, "Inadequate Response:\nCGRP mAbs (Erenumab / Galcanezumab)",
GREEN_OK, fsize=12)
arrow(slide, 9.5, 4.28)
flow_box(slide, 6.9, 4.6, 6.1, 0.55, "Chronic Migraine: + OnabotulinumtoxinA",
TEAL, fsize=12)
add_rect(slide, 0.3, 5.5, 12.7, 1.6, LIGHT_PURPLE)
add_text(slide,
"Key Reminders: Start acute treatment early | Limit analgesics <15 days/month (triptans <10) | "
"Reassess prophylaxis after 3 months | Treat comorbidities (depression, anxiety, sleep disorders)",
0.4, 5.55, 12.5, 1.4, font_size=13, color=DEEP_PURPLE, wrap=True)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 18 — SUMMARY TABLE
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, WHITE)
add_rect(slide, 0, 0, 13.333, 1.1, DEEP_PURPLE)
add_text(slide, "Summary: Drugs Used in Migraine Therapy", 0.35, 0.12, 12.5, 0.85,
font_size=28, bold=True, color=WHITE)
add_rect(slide, 0, 1.1, 13.333, 0.06, GOLD)
from pptx.util import Inches, Pt
# Table headers
headers = ["Drug Class", "Examples", "Use", "MOA", "Key Notes"]
col_widths = [2.1, 2.8, 1.3, 3.5, 3.3]
col_x = [0.2, 2.3, 5.1, 6.4, 9.9]
# Header row
for i, (hdr, cx, cw) in enumerate(zip(headers, col_x, col_widths)):
add_rect(slide, cx, 1.2, cw-0.05, 0.45, DEEP_PURPLE)
add_text(slide, hdr, cx+0.05, 1.22, cw-0.1, 0.4,
font_size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
rows = [
("Triptans", "Sumatriptan\nRizatriptan\nEletriptan", "Acute\n(1st line)",
"5-HT1B/1D agonist\nVasoconstriction +\nneuropeptide block",
"CI: CAD, HTN\nDo not use with ergots\n70% response rate"),
("Ergots", "Ergotamine\nDHE", "Acute\n(2nd line)",
"5-HT1B/1D, α, DA\nreceptor agonist",
"Rebound headache\nCI: pregnancy, PVD\nLargely replaced by triptans"),
("Ditans", "Lasmiditan", "Acute\n(alternative)",
"5-HT1F agonist\n(no vasoconstriction)",
"Safe in CVD\nControlled substance\nAvoid driving 8h"),
("Gepants", "Ubrogepant\nRimegepant", "Acute ±\nPrevention",
"CGRP receptor\nantagonist",
"Safe in CVD\nRimegepant also\nfor prevention"),
("Beta-blockers", "Propranolol\nMetoprolol", "Prevention\n(1st line)",
"Unknown; reduces\ncortical excitability",
"CI: asthma, heart block\nDOC for prophylaxis"),
("AEDs", "Topiramate\nValproate", "Prevention",
"Na+ channel block\nGABA enhancement",
"Topiramate: wt loss\nValproate: teratogenic"),
("CGRP mAbs", "Erenumab\nGalcanezumab\nFremanezumab", "Prevention",
"Bind CGRP or\nCGRP receptor",
"Monthly/quarterly SC\nFewest CNS SE\nMigraine-specific"),
]
row_colors = [LIGHT_PURPLE, WHITE, LIGHT_PURPLE, WHITE, LIGHT_PURPLE, WHITE, LIGHT_PURPLE]
row_height = 0.73
for r_idx, (row_data, bg) in enumerate(zip(rows, row_colors)):
y = 1.65 + r_idx * row_height
for i, (cell_text, cx, cw) in enumerate(zip(row_data, col_x, col_widths)):
add_rect(slide, cx, y, cw-0.05, row_height-0.03, bg)
add_text(slide, cell_text, cx+0.05, y+0.02, cw-0.1, row_height-0.07,
font_size=10, color=DARK_GRAY, wrap=True)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 19 — KEY POINTS & REFERENCES
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, RGBColor(0xF7,0xF4,0xFF))
add_rect(slide, 0, 0, 13.333, 1.1, DEEP_PURPLE)
add_text(slide, "Key Points & References", 0.35, 0.12, 12.5, 0.85,
font_size=30, bold=True, color=WHITE)
add_rect(slide, 0, 1.1, 13.333, 0.06, GOLD)
key_points = [
"Migraine is a complex neurovascular disorder — both 5-HT and CGRP are key mediators",
"Triptans (5-HT1B/1D agonists) are first-line for acute moderate-severe migraine",
"CGRP-based drugs (gepants, mAbs) are the most recent class with cardiovascular safety",
"Prophylaxis indicated when attacks occur ≥2/month; propranolol & topiramate are first-line",
"Medication overuse headache (MOH) is a key complication to monitor and prevent",
"Drug selection must consider comorbidities, pregnancy, and cardiovascular risk",
"CGRP monoclonal antibodies represent the first migraine-specific preventive drug class",
]
add_text(slide, "Key Take-Away Points:", 0.4, 1.25, 12.5, 0.45,
font_size=17, bold=True, color=DEEP_PURPLE)
y = 1.7
for pt in key_points:
add_rect(slide, 0.4, y, 0.45, 0.4, MED_PURPLE)
add_text(slide, "✓", 0.41, y+0.03, 0.43, 0.34, font_size=14, bold=True,
color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, pt, 0.95, y+0.03, 12.0, 0.38, font_size=14, color=DARK_GRAY)
y += 0.46
add_rect(slide, 0.4, 5.25, 12.5, 1.05, WHITE)
add_text(slide, "References:", 0.55, 5.28, 12.0, 0.35,
font_size=13, bold=True, color=DEEP_PURPLE)
refs = [
"1. Brunton LL et al. Goodman & Gilman's Pharmacological Basis of Therapeutics, 13e. McGraw-Hill, 2018",
"2. Lippincott Illustrated Reviews: Pharmacology, 8e. Wolters Kluwer, 2023",
"3. Katzung BG. Basic and Clinical Pharmacology, 16e. McGraw-Hill, 2021",
]
for i, ref in enumerate(refs):
add_text(slide, ref, 0.55, 5.6 + i*0.23, 12.2, 0.22,
font_size=10, italic=True, color=MID_GRAY)
# Thank you banner
add_rect(slide, 0, 6.65, 13.333, 0.85, DEEP_PURPLE)
add_text(slide, "Thank You | Questions?", 0, 6.7, 13.333, 0.6,
font_size=22, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
# ─── Save ─────────────────────────────────────────────────────────────────────
out_path = "/tmp/workspace/migraine-ppt/Migraine_Therapy_Pharmacology.pptx"
buf = BytesIO()
prs.save(buf)
with open(out_path, "wb") as f:
f.write(buf.getvalue())
print(f"Saved: {out_path}")
print(f"Total slides: {len(prs.slides)}")
cd /tmp/workspace/migraine-ppt && python build_ppt.py 2>&1
ls -lh /tmp/workspace/migraine-ppt/Migraine_Therapy_Pharmacology.pptx
Migraine Therapy Pharmacology
Presentation · PPTX
| # | Slide Title |
|---|---|
| 1 | Title Slide |
| 2 | Lecture Outline |
| 3 | Introduction & Epidemiology |
| 4 | Classification of Migraine (ICHD-3) |
| 5 | Pathophysiology (CSD, Trigeminovascular hypothesis) |
| 6 | Role of Serotonin (5-HT) |
| 7 | Role of CGRP |
| 8 | Acute Treatment - Overview & Step-Care |
| 9 | Triptans - MOA, PK, ADRs, Contraindications |
| 10 | Ergot Alkaloids |
| 11 | Newer Agents: Ditans (Lasmiditan) & Gepants (Rimegepant/Ubrogepant) - two-column layout |
| 12 | Non-Specific Analgesics & Antiemetics |
| 13 | Prophylaxis - Indications & Drug Classes |
| 14 | Prophylactic Agents Details - two-column layout |
| 15 | CGRP Monoclonal Antibodies (erenumab, galcanezumab, etc.) |
| 16 | Special Populations (pregnancy, CVD, paediatrics) |
| 17 | Treatment Algorithm (visual flowchart) |
| 18 | Summary Table - all drug classes at a glance |
| 19 | Key Points & References |