Capnographs
| Feature | Sidestream (Diverting) | Mainstream (Non-diverting) |
|---|---|---|
| Sensor location | At the monitor console (remote) | In-line at the airway |
| Mechanism | Pump aspirates gas via tubing | Sensor sits directly in the circuit |
| Gas withdrawal rate | 30-500 mL/min | None (no gas removed) |
| Common use | Most OR settings | NICU, infants |
| Key advantages | No added airway weight, can analyze multiple gases | No lag time, no aspiration artifacts |
| Key disadvantages | Lag time (~1 s), water condensation in tubing, gas lost from circuit | Heavier at airway, sensor can become contaminated, heated to prevent condensation |

| Phase | Segment | What it represents |
|---|---|---|
| 0 (Inspiration) | Descending to zero | Inspiratory limb; CO2 returns to zero (or baseline) |
| I | Flat at zero | Anatomical dead space gas - no CO2 |
| II | Rapid upstroke | Mixed dead space + alveolar gas emerging |
| III | Alveolar plateau | Pure alveolar gas; the peak value = PETCO2 |
| IV | Late upstroke (dashed) | Seen in some patients; reflects cardiogenic oscillations or terminal alveolar emptying |

| Pattern | What you see | Cause |
|---|---|---|
| A - Normal | Clear plateau reaching ~40 mmHg | Normal |
| B - COPD/Obstructive | No true alveolar plateau; continuously rising phase III; no distinct plateau before next inspiration | Obstructive lung disease (COPD, asthma) - uneven emptying of lung units |
| C - Spontaneous effort | A notch or dip during phase III | Patient breathing against the ventilator; spontaneous respiratory effort during phase III |
| D - CO2 rebreathing | Inspired baseline does not return to zero | Exhausted CO2 absorbent, incompetent expiratory valve, or inadequate fresh gas flow |
| E - Incompetent inspiratory valve | Exhaled gas persists into part of the inspiratory cycle; slow descent | Incompetent inspiratory valve in the breathing circuit |
ED 95 for 10 mark Question for MD anaesthesia exam
| Drug | Class | Duration | ED95 (mg/kg) | Intubating Dose (2× ED95) |
|---|---|---|---|---|
| Succinylcholine | Depolarizing | Ultra-short | 0.3 mg/kg* | 1.0-1.5 mg/kg |
| Rocuronium | Aminosteroid | Intermediate | 0.3 mg/kg | 0.6 mg/kg |
| Vecuronium | Aminosteroid | Intermediate | 0.05 mg/kg | 0.1 mg/kg |
| Cisatracurium | Benzylisoquinolinium | Intermediate | 0.05 mg/kg | 0.1-0.15 mg/kg |
| Atracurium | Benzylisoquinolinium | Intermediate | 0.23 mg/kg | 0.5 mg/kg |
| Pancuronium | Aminosteroid | Long | 0.07 mg/kg | 0.1 mg/kg |
| Mivacurium | Benzylisoquinolinium | Short | 0.08 mg/kg | 0.15-0.2 mg/kg |
| Clinical Purpose | Dose Used |
|---|---|
| Surgical relaxation only | ~0.5-1 × ED95 |
| Standard tracheal intubation | 2 × ED95 |
| Rapid sequence intubation (rocuronium) | 3-4 × ED95 (0.9-1.2 mg/kg) |
| Factor | Effect on ED95 |
|---|---|
| Volatile anesthetic agents (sevoflurane, isoflurane, desflurane) | Decrease ED95 by 20-50% (potentiate NMBDs) - so a lower dose achieves the same effect |
| Nitrous oxide | Minor potentiation |
| Hypothermia | Potentiates NMBDs (decreased metabolism, prolonged duration) |
| Acid-base status | Respiratory acidosis potentiates; alkalosis antagonizes |
| Hypermagnesaemia | Potentiates block |
| Aminoglycoside antibiotics | Potentiate block |
| Myasthenia gravis | Extreme sensitivity - ED95 much lower for NDNMBDs |
| Burns, denervation (>24h) | Resistance to NMBDs (increased ACh receptors) |
| Concept | Key Point |
|---|---|
| Definition | Median dose causing 95% twitch depression in 50% of patients |
| Standard intubating dose | 2× ED95 |
| RSI dose (rocuronium) | 4× ED95 (1.2 mg/kg) |
| Low ED95 | High potency |
| High ED95 | Low potency, but faster onset |
| Volatile agents | Reduce ED95 by ~40% |
| Monitoring | Essential due to wide interpatient variation |
Convert in PDF
ls -la /home/daytona/workspace/ 2>/dev/null || mkdir -p /home/daytona/workspace/ed95-pdf
mkdir -p /home/daytona/workspace/ed95-pdf
~/ed95-pdf/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.pdfbase import pdfmetrics
OUTPUT = "/home/daytona/workspace/ed95-pdf/ED95_NMBDs_MD_Anaesthesia.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm,
rightMargin=2*cm,
topMargin=2*cm,
bottomMargin=2*cm,
title="ED95 of Neuromuscular Blocking Drugs – MD Anaesthesia",
author="Orris Medical AI"
)
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
"CustomTitle",
parent=styles["Heading1"],
fontSize=16,
textColor=colors.HexColor("#1a3a5c"),
spaceAfter=4,
alignment=TA_CENTER,
fontName="Helvetica-Bold"
)
subtitle_style = ParagraphStyle(
"Subtitle",
parent=styles["Normal"],
fontSize=10,
textColor=colors.HexColor("#555555"),
spaceAfter=12,
alignment=TA_CENTER,
fontName="Helvetica-Oblique"
)
h2_style = ParagraphStyle(
"H2",
parent=styles["Heading2"],
fontSize=12,
textColor=colors.HexColor("#1a3a5c"),
spaceBefore=14,
spaceAfter=4,
fontName="Helvetica-Bold",
borderPad=2,
)
h3_style = ParagraphStyle(
"H3",
parent=styles["Heading3"],
fontSize=10.5,
textColor=colors.HexColor("#2c5f8a"),
spaceBefore=8,
spaceAfter=3,
fontName="Helvetica-Bold"
)
body_style = ParagraphStyle(
"Body",
parent=styles["Normal"],
fontSize=9.5,
leading=14,
spaceAfter=5,
alignment=TA_JUSTIFY,
fontName="Helvetica"
)
bullet_style = ParagraphStyle(
"Bullet",
parent=styles["Normal"],
fontSize=9.5,
leading=13,
spaceAfter=3,
leftIndent=16,
bulletIndent=6,
fontName="Helvetica"
)
mark_style = ParagraphStyle(
"MarkStyle",
parent=styles["Normal"],
fontSize=8.5,
textColor=colors.HexColor("#888888"),
spaceAfter=2,
fontName="Helvetica-Oblique"
)
source_style = ParagraphStyle(
"Source",
parent=styles["Normal"],
fontSize=8,
textColor=colors.HexColor("#777777"),
spaceBefore=4,
spaceAfter=2,
fontName="Helvetica-Oblique"
)
key_style = ParagraphStyle(
"Key",
parent=styles["Normal"],
fontSize=9.5,
leading=13,
textColor=colors.HexColor("#1a3a5c"),
spaceAfter=4,
fontName="Helvetica-Bold"
)
# Table styling helper
def styled_table(data, col_widths=None, header_color=colors.HexColor("#1a3a5c")):
tbl = Table(data, colWidths=col_widths, repeatRows=1)
style = TableStyle([
("BACKGROUND", (0, 0), (-1, 0), header_color),
("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, 0), 9),
("ALIGN", (0, 0), (-1, -1), "CENTER"),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
("FONTNAME", (0, 1), (-1, -1), "Helvetica"),
("FONTSIZE", (0, 1), (-1, -1), 8.5),
("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#eef3f8")]),
("GRID", (0, 0), (-1, -1), 0.5, colors.HexColor("#bbccdd")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("RIGHTPADDING", (0, 0), (-1, -1), 6),
])
tbl.setStyle(style)
return tbl
story = []
# ── TITLE ──────────────────────────────────────────────────────────────────
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph("ED95 of Neuromuscular Blocking Drugs", title_style))
story.append(Paragraph("Model Answer — MD Anaesthesia Examination (10 Marks)", subtitle_style))
story.append(HRFlowable(width="100%", thickness=2, color=colors.HexColor("#1a3a5c"), spaceAfter=10))
# ── SECTION 1 ──────────────────────────────────────────────────────────────
story.append(Paragraph("1. Definition", h2_style))
story.append(Paragraph("(2 Marks)", mark_style))
story.append(Paragraph(
"<b>ED95</b> stands for the <b>Effective Dose that produces 95% depression of maximal "
"muscle twitch response</b> in 50% of patients studied under defined anaesthetic conditions.",
body_style
))
story.append(Paragraph(
"Important distinction from conventional pharmacology:",
body_style
))
tbl1 = styled_table(
[
["Context", "Meaning of ED95"],
["Conventional pharmacology", "Dose effective in 95% of the population"],
["Neuromuscular pharmacology", "Median dose (effective in 50% of patients) producing 95% twitch depression"],
],
col_widths=[8*cm, 9*cm]
)
story.append(tbl1)
story.append(Spacer(1, 0.3*cm))
story.append(Paragraph(
"ED95 is derived from a <b>dose–response (quantal) sigmoid curve</b> plotting the cumulative "
"percentage of patients against dose, read at the 95% twitch-suppression point. "
"Measurement is at the <i>adductor pollicis</i> via ulnar nerve stimulation.",
body_style
))
story.append(Paragraph("Source: Barash Clinical Anesthesia 9e, p. 1604", source_style))
# ── SECTION 2 ──────────────────────────────────────────────────────────────
story.append(Paragraph("2. ED95 as a Measure of Potency", h2_style))
story.append(Paragraph("(1 Mark)", mark_style))
story.append(Paragraph(
"ED95 is the standard measure of <b>potency</b> of NMBDs:",
body_style
))
story.append(Paragraph("• Lower ED95 = More potent drug (smaller dose achieves effect)", bullet_style))
story.append(Paragraph("• Higher ED95 = Less potent drug (more molecules required)", bullet_style))
story.append(Paragraph(
"Potency and onset of action are inversely related — a key clinical concept (see Section 5).",
body_style
))
# ── SECTION 3 ──────────────────────────────────────────────────────────────
story.append(Paragraph("3. ED95 Values of Clinically Used NMBDs", h2_style))
story.append(Paragraph("(2 Marks)", mark_style))
story.append(Paragraph(
"<b>Key fact:</b> The four most commonly used NMBDs in current practice have an ED95 of either "
"<b>0.3 mg/kg</b> (succinylcholine, rocuronium) or <b>0.05 mg/kg</b> (cisatracurium, vecuronium).",
key_style
))
tbl2 = styled_table(
[
["Drug", "Class", "Duration", "ED95 (mg/kg)", "Intubating Dose (2×ED95)"],
["Succinylcholine", "Depolarizing", "Ultra-short", "0.3*", "1.0–1.5 mg/kg"],
["Rocuronium", "Aminosteroid", "Intermediate", "0.3", "0.6 mg/kg"],
["Vecuronium", "Aminosteroid", "Intermediate", "0.05", "0.1 mg/kg"],
["Cisatracurium", "Benzylisoquinolinium", "Intermediate", "0.05", "0.1–0.15 mg/kg"],
["Atracurium", "Benzylisoquinolinium", "Intermediate", "0.23", "0.5 mg/kg"],
["Pancuronium", "Aminosteroid", "Long", "0.07", "0.1 mg/kg"],
["Mivacurium", "Benzylisoquinolinium", "Short", "0.08", "0.15–0.2 mg/kg"],
],
col_widths=[3.5*cm, 4.5*cm, 3*cm, 2.5*cm, 3.5*cm]
)
story.append(tbl2)
story.append(Paragraph(
"* Succinylcholine ED95 by cumulative dose-response is <0.3 mg/kg; clinical dose of 1 mg/kg ≈ 3× ED95.",
source_style
))
story.append(Paragraph("Source: Barash Clinical Anesthesia 9e, p. 1597; Miller's Anesthesia 10e, p. 3229", source_style))
# ── SECTION 4 ──────────────────────────────────────────────────────────────
story.append(Paragraph("4. Clinical Significance: Intubating Dose", h2_style))
story.append(Paragraph("(1 Mark)", mark_style))
story.append(Paragraph(
"The standard intubating dose = <b>2× ED95</b>. This provides complete NMB in the vast "
"majority of patients with acceptable onset and reliable intubating conditions.",
body_style
))
tbl3 = styled_table(
[
["Clinical Purpose", "Dose Used"],
["Surgical relaxation only", "~0.5–1 × ED95"],
["Standard tracheal intubation", "2 × ED95"],
["RSI with rocuronium", "3–4 × ED95 (0.9–1.2 mg/kg)"],
],
col_widths=[9.5*cm, 7.5*cm]
)
story.append(tbl3)
story.append(Paragraph("Source: Miller's Anesthesia 10e, p. 3269", source_style))
# ── SECTION 5 ──────────────────────────────────────────────────────────────
story.append(Paragraph("5. Inverse Potency–Onset Relationship", h2_style))
story.append(Paragraph("(2 Marks)", mark_style))
story.append(Paragraph(
"<b>The less potent the NMBD, the faster its onset of action at equipotent doses.</b>",
key_style
))
story.append(Paragraph("<b>Mechanism:</b>", h3_style))
story.append(Paragraph(
"• At 2× ED95 doses, a less potent drug requires more molecules to achieve the same effect.",
bullet_style
))
story.append(Paragraph(
"• More molecules = higher molar concentration delivered to the NMJ.",
bullet_style
))
story.append(Paragraph(
"• Higher concentration gradient = faster diffusion and faster receptor occupancy.",
bullet_style
))
story.append(Paragraph(
"• Therefore: <b>Onset time ∝ 1 / Molar potency</b>",
bullet_style
))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("<b>Example — Rocuronium:</b>", h3_style))
story.append(Paragraph(
"Rocuronium has a molar ED95 of 0.54 μM/kg — approximately <b>13% that of vecuronium</b> and "
"<b>9% that of cisatracurium</b>. Its low potency is exploited by giving a large dose "
"(1.2 mg/kg = 4× ED95) to deliver enough molecules quickly, achieving RSI conditions in <b>60 seconds</b> "
"comparable to succinylcholine.",
body_style
))
story.append(Paragraph(
"Note: Atracurium is an exception — its onset does not follow the inverse potency rule.",
source_style
))
story.append(Paragraph("Source: Miller's Anesthesia 10e, p. 3272; Barash Clinical Anesthesia 9e, p. 1615", source_style))
# ── SECTION 6 ──────────────────────────────────────────────────────────────
story.append(Paragraph("6. Factors Affecting ED95", h2_style))
story.append(Paragraph("(1 Mark)", mark_style))
story.append(Paragraph(
"ED95 is not a fixed value — it changes under the following conditions:",
body_style
))
tbl4 = styled_table(
[
["Factor", "Effect on ED95 / Block"],
["Volatile anaesthetics (sevoflurane, isoflurane, desflurane)", "Decrease ED95 by 20–50% (potentiate NMBDs)"],
["Hypothermia", "Potentiates block (decreased metabolism)"],
["Respiratory acidosis", "Potentiates block"],
["Respiratory alkalosis", "Antagonises block"],
["Hypermagnesaemia", "Potentiates block"],
["Aminoglycoside antibiotics", "Potentiate block"],
["Myasthenia gravis", "Extreme sensitivity to NDNMBDs"],
["Burns / Denervation (>24h)", "Resistance to NMBDs (↑ ACh receptors)"],
],
col_widths=[9*cm, 8*cm]
)
story.append(tbl4)
story.append(Paragraph(
"During volatile anaesthesia, the intubating dose may be reduced by ~40% relative to "
"doses used under N₂O/O₂/opioid anaesthesia.",
body_style
))
story.append(Paragraph("Source: Miller's Anesthesia 10e, p. 3265; Barash Clinical Anesthesia 9e, p. 1615", source_style))
# ── SECTION 7 ──────────────────────────────────────────────────────────────
story.append(Paragraph("7. Interpatient Variability", h2_style))
story.append(Paragraph("(1 Mark)", mark_style))
story.append(Paragraph(
"ED95 represents the median population response, but <b>individual variation is enormous</b>:",
body_style
))
story.append(Paragraph(
"• In a classic study (Katz, 1967): 0.1 mg/kg curare caused zero twitch depression in 6% of "
"patients yet complete abolition in 7% — the same dose.",
bullet_style
))
story.append(Paragraph(
"• Duration of action at equipotent doses is equally unpredictable.",
bullet_style
))
story.append(Paragraph(
"• Age, sex, body build, and ASA status <b>cannot</b> predict individual response.",
bullet_style
))
story.append(Paragraph(
"• This variability is why <b>quantitative neuromuscular monitoring (TOF ratio)</b> is "
"essential and cannot be replaced by clinical assessment or time.",
bullet_style
))
story.append(Paragraph("Source: Barash Clinical Anesthesia 9e, p. 1606", source_style))
# ── SUMMARY TABLE ──────────────────────────────────────────────────────────
story.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor("#1a3a5c"), spaceBefore=14, spaceAfter=8))
story.append(Paragraph("Summary", h2_style))
tbl5 = styled_table(
[
["Concept", "Key Point"],
["Definition", "Median dose causing 95% twitch depression in 50% of patients"],
["Standard intubating dose", "2 × ED95"],
["RSI dose (rocuronium)", "4 × ED95 (1.2 mg/kg)"],
["Low ED95", "High potency, slower onset"],
["High ED95", "Low potency, faster onset"],
["Volatile agents", "Reduce ED95 by ~40%"],
["Monitoring", "Essential due to wide interpatient variation"],
],
col_widths=[8*cm, 9*cm]
)
story.append(tbl5)
# ── FOOTER / REFERENCES ────────────────────────────────────────────────────
story.append(Spacer(1, 0.5*cm))
story.append(HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#aaaaaa"), spaceAfter=4))
story.append(Paragraph(
"<b>References:</b> Barash, Cullen & Stoelting's Clinical Anesthesia, 9e (pp. 1597–1615) · "
"Miller's Anesthesia, 10e (pp. 3229–3275)",
source_style
))
doc.build(story)
print("PDF generated:", OUTPUT)
python /home/daytona/workspace/ed95-pdf/generate_pdf.py
ED95 NMBDs MD Anaesthesia
PDF Document · PDF
Can you explain inter patient variability better