Medical management of PIH or PET and intraoperative management for anaesthesia
preeclampsia management antihypertensive treatment algorithm

Summary : This figure presents a flowchart outlining the treatment algorithm for the intensive systolic blood pressure (SBP) arm (target SBP <120 mm Hg) in the SPRINT trial protocol, including decision points, required actions, and follow-up procedures for antihypertensive therapy adjustment. flowchart: # Nodes : • Start here: At randomization visit, begin with 2- or 3-drug therapy* using a combination of a thiazide-type** diuretic, and/or an ACEI or ARB (but not both) and/or a CCB (rectangle, top). • Include β-blocker or other agents as appropriate for compelling indication (rectangle, side note). • Is SBP ≥120 mm Hg this visit? (diamond). • Is this a milepost visit? (diamond). • You must: (a) Add therapy not already in use† and (b) See participant monthly until SBP <120 mm Hg‡ (rectangle). • You must: (a) Titrate or add therapy not already in use† and (b) See participant monthly until SBP <120 mm Hg‡ (rectangle). • Is DBP ≥100 mm Hg at this visit or is DBP ≥90 mm Hg on last 2 visits? (diamond). • You must: Titrate or add therapy not already in use† (rectangle). • Continue therapy (rectangle). • Monitor as designated through follow-up (rectangle, right side). # Connectors : • Downward arrow from Start to "Is SBP ≥120 mm Hg this visit?". • Yes branch from "Is SBP ≥120 mm Hg this visit?" to "Is this a milepost visit?". • Yes branch from "Is this a milepost visit?" to "You must: Add therapy not already in use and see participant monthly until SBP <120 mm Hg". • No branch from "Is this a milepost visit?" to "You must: Titrate or add therapy not already in use and see participant monthly until SBP <120 mm Hg". • No branch from "Is SBP ≥120 mm Hg this visit?" to "Is DBP ≥100 mm Hg at this visit or is DBP ≥90 mm Hg on last 2 visits?". • Yes branch from DBP decision to "You must: Titrate or add therapy not already in use". • No branch from DBP decision to "Continue therapy". • All therapy adjustment nodes connect to "Monitor as designated through follow-up". # Layout : • Top-down flow, starting with initial therapy, then branching based on SBP and DBP readings. • Decision diamonds split the flow into therapy adjustment or continuation. • Side notes and monitoring steps are placed to the right. • Monthly follow-up is required after therapy changes until SBP <120 mm Hg. # Analysis : • The algorithm prioritizes achieving SBP <120 mm Hg through stepwise therapy escalation and monthly monitoring. • Therapy is intensified at each visit if SBP or DBP thresholds are exceeded, with specific actions at "milepost" visits. • If BP is controlled, therapy is continued without adjustment. • The flowchart ensures systematic, protocol-driven management of hypertension in the intensive arm, with clear decision points and follow-up requirements.
![Summary : This flowchart presents the management algorithm for parathyroid carcinoma (PC), detailing treatment pathways based on resectability and presence of hypercalcaemia, with specific recommendations for surgery, radiotherapy, systemic and non-systemic therapies, and observation.
flowchart:
# Nodes :
• Start (rectangle): "PC"
• Decision (split into three branches): "Resectable", "Unresectable", "Hypercalcaemia"
• Resectable branch:
– "Diagnosis before surgery"
– "En bloc resection of parathyroid lesion + homolateral thyroid lobo-isthmectomy + central node dissection [IV, A]" (orange rectangle)
– "Adjuvant RT for R1-2 and/or N+ disease [V, C]" (dark green rectangle)
– "Observation [V, C]" (white rectangle)
– "Diagnosis after parathyroid resection"
– "Ipsilateral thyroid lobo-isthmectomy + central node dissection [IV, A]" (orange rectangle)
– "Adjuvant RT for R1-2 and/or N+ disease [V, C]" (dark green rectangle)
– "Observation [V, C]" (white rectangle)
• Unresectable branch:
– "Debulking surgery and locoregional therapies [V, A]" (turquoise rectangle)
– "Antiangiogenics [V, B]" (blue rectangle)
– "Alkylating agent-based ChT* [V, C]" (blue rectangle)
– "Clinical trial [V, A]" (blue rectangle)
• Hypercalcaemia branch:
– "Debulking surgery and locoregional therapies [V, A]" (turquoise rectangle)
– "Cinacalcet [II, A] + bone antiresorptive drug [II, A] + hydration [IV, A]" (turquoise rectangle)
# Connectors :
• Arrows indicate flow from "PC" to three main branches.
• Within each branch, arrows indicate sequential steps or decision points.
• Some nodes have parallel arrows leading to "Observation" as an alternative to adjuvant therapy.
• No loops; all branches terminate in observation or further therapy options.
# Layout :
• Top-level node ("PC") splits horizontally into three main branches: Resectable (left), Unresectable (center), Hypercalcaemia (right).
• Each branch is vertically oriented, with sequential steps.
• Colour coding: orange (surgery), dark green (systemic anticancer therapy), turquoise (non-systemic anticancer therapies), blue (systemic anticancer therapy or combination), white (other management/non-treatment).
# Analysis :
• The flowchart provides a clear, stepwise approach to PC management, emphasizing surgery for resectable cases, systemic and locoregional therapies for unresectable cases, and specific interventions for hypercalcaemia.
• Decision points are based on timing of diagnosis and disease status (resectable/unresectable/hypercalcaemia).
• Observation is a common endpoint after definitive therapy or adjuvant treatment.
• The chart visually distinguishes between types of interventions using colour coding and groups related therapies for clarity.](/_next/image?url=https%3A%2F%2Fcdn.orris.care%2Fcdss_images%2FGLGCA_4543429_1766517382648_d0d87aa1-c039-4269-bced-c913d65fdaf6_c912e204-618a-4ecd-8c61-31d0d2bfd973.png&w=3840&q=75)
Summary : This flowchart presents the management algorithm for parathyroid carcinoma (PC), detailing treatment pathways based on resectability and presence of hypercalcaemia, with specific recommendations for surgery, radiotherapy, systemic and non-systemic therapies, and observation. flowchart: # Nodes : • Start (rectangle): "PC" • Decision (split into three branches): "Resectable", "Unresectable", "Hypercalcaemia" • Resectable branch: – "Diagnosis before surgery" – "En bloc resection of parathyroid lesion + homolateral thyroid lobo-isthmectomy + central node dissection [IV, A]" (orange rectangle) – "Adjuvant RT for R1-2 and/or N+ disease [V, C]" (dark green rectangle) – "Observation [V, C]" (white rectangle) – "Diagnosis after parathyroid resection" – "Ipsilateral thyroid lobo-isthmectomy + central node dissection [IV, A]" (orange rectangle) – "Adjuvant RT for R1-2 and/or N+ disease [V, C]" (dark green rectangle) – "Observation [V, C]" (white rectangle) • Unresectable branch: – "Debulking surgery and locoregional therapies [V, A]" (turquoise rectangle) – "Antiangiogenics [V, B]" (blue rectangle) – "Alkylating agent-based ChT* [V, C]" (blue rectangle) – "Clinical trial [V, A]" (blue rectangle) • Hypercalcaemia branch: – "Debulking surgery and locoregional therapies [V, A]" (turquoise rectangle) – "Cinacalcet [II, A] + bone antiresorptive drug [II, A] + hydration [IV, A]" (turquoise rectangle) # Connectors : • Arrows indicate flow from "PC" to three main branches. • Within each branch, arrows indicate sequential steps or decision points. • Some nodes have parallel arrows leading to "Observation" as an alternative to adjuvant therapy. • No loops; all branches terminate in observation or further therapy options. # Layout : • Top-level node ("PC") splits horizontally into three main branches: Resectable (left), Unresectable (center), Hypercalcaemia (right). • Each branch is vertically oriented, with sequential steps. • Colour coding: orange (surgery), dark green (systemic anticancer therapy), turquoise (non-systemic anticancer therapies), blue (systemic anticancer therapy or combination), white (other management/non-treatment). # Analysis : • The flowchart provides a clear, stepwise approach to PC management, emphasizing surgery for resectable cases, systemic and locoregional therapies for unresectable cases, and specific interventions for hypercalcaemia. • Decision points are based on timing of diagnosis and disease status (resectable/unresectable/hypercalcaemia). • Observation is a common endpoint after definitive therapy or adjuvant treatment. • The chart visually distinguishes between types of interventions using colour coding and groups related therapies for clarity.
![Summary : This flowchart presents the management algorithm for nodal peripheral T-cell lymphoma (PTCL), including PTCL-NOS, TFHL, and ALCL subtypes, stratified by disease stage, ALK status, and risk features. It details systemic and non-systemic anticancer therapies, radiotherapy, and autologous stem-cell transplantation (ASCT) recommendations.
flowchart:
# Nodes :
• Nodal PTCL (start, top-level box)
• PTCL-NOS, TFHL (decision node)
• Stage I-II (decision node)
• 3-4 cycles CHO(E)P [IV, B] (treatment node)
• Consolidative ISRT [IV, B] (treatment node)
• CR (complete remission, outcome node)
• No further treatment (end node)
• Stage III-IV (decision node)
• 6 cycles CHO(E)P [II, B] (treatment node)
• CR (outcome node)
• ASCT [III, C] (treatment node)
• Stage I-II ALCL (decision node)
• ALK positive, non-bulky, IPI 0-1 / ALK negative, non-bulky, IPI 0-1 (decision node)
• 3-4 cycles BV-CHP [III, B] or CHOEP [III, B] (treatment node)
• Consolidative ISRT [IV, B] (treatment node)
• CR (outcome node)
• No further treatment (end node)
• ALK negative, bulky or IPI >1 / High-risk ALK positive (decision node)
• 6 cycles BV-CHP [II, A] or CHO(E)P [III, B] (treatment node)
• Consolidative ISRT [IV, B] (treatment node)
• CR (outcome node)
• ASCTa [II, B] (treatment node)
• Stage III-IV ALCL (decision node)
• ALK positive (decision node)
• 6 cycles BV-CHP [I, A] or CHO(E)P [III, B] (treatment node)
• CR (outcome node)
• No further treatment (end node)
• ALK negative / High-risk ALK positive (decision node)
• 6 cycles BV-CHP [I, A] or CHO(E)P [III, B] (treatment node)
• CR (outcome node)
• ASCT [II, B] (treatment node)
# Connectors :
• Top-down arrows connect each decision node to its respective treatment and outcome nodes.
• Branching occurs at each disease stage and ALK status, splitting into different treatment pathways.
• Some branches merge at common nodes (e.g., CR, ASCT, No further treatment).
• Footnotes (a, b) clarify alternative or additional recommendations for specific high-risk groups.
# Layout :
• The flowchart is organized horizontally by disease subtype and stage (PTCL-NOS/TFHL, Stage I-II ALCL, Stage III-IV ALCL).
• Each subtype/stage column flows vertically from initial diagnosis through treatment, remission, and post-remission management.
• Colour coding: purple for algorithm title, dark green for radiotherapy, blue for systemic therapy, white for non-treatment aspects.
# Analysis :
• The flowchart provides a clear, stepwise approach to managing nodal PTCL, emphasizing risk-adapted therapy.
• Early-stage disease often receives fewer cycles of chemotherapy and consolidative radiotherapy, with no further treatment if remission is achieved.
• Advanced-stage or high-risk disease typically receives more intensive therapy, with ASCT considered for consolidation.
• ALK status and IPI score are critical in determining the treatment pathway for ALCL.
• The algorithm highlights the importance of individualized therapy based on disease characteristics and response.](/_next/image?url=https%3A%2F%2Fcdn.orris.care%2Fcdss_images%2FGLGCA_4779772_1766687372936_663455a5-5e63-498d-91ab-79df6a901c83_25f47d00-8fbc-4616-843c-dcce91c28b25.png&w=3840&q=75)
Summary : This flowchart presents the management algorithm for nodal peripheral T-cell lymphoma (PTCL), including PTCL-NOS, TFHL, and ALCL subtypes, stratified by disease stage, ALK status, and risk features. It details systemic and non-systemic anticancer therapies, radiotherapy, and autologous stem-cell transplantation (ASCT) recommendations. flowchart: # Nodes : • Nodal PTCL (start, top-level box) • PTCL-NOS, TFHL (decision node) • Stage I-II (decision node) • 3-4 cycles CHO(E)P [IV, B] (treatment node) • Consolidative ISRT [IV, B] (treatment node) • CR (complete remission, outcome node) • No further treatment (end node) • Stage III-IV (decision node) • 6 cycles CHO(E)P [II, B] (treatment node) • CR (outcome node) • ASCT [III, C] (treatment node) • Stage I-II ALCL (decision node) • ALK positive, non-bulky, IPI 0-1 / ALK negative, non-bulky, IPI 0-1 (decision node) • 3-4 cycles BV-CHP [III, B] or CHOEP [III, B] (treatment node) • Consolidative ISRT [IV, B] (treatment node) • CR (outcome node) • No further treatment (end node) • ALK negative, bulky or IPI >1 / High-risk ALK positive (decision node) • 6 cycles BV-CHP [II, A] or CHO(E)P [III, B] (treatment node) • Consolidative ISRT [IV, B] (treatment node) • CR (outcome node) • ASCTa [II, B] (treatment node) • Stage III-IV ALCL (decision node) • ALK positive (decision node) • 6 cycles BV-CHP [I, A] or CHO(E)P [III, B] (treatment node) • CR (outcome node) • No further treatment (end node) • ALK negative / High-risk ALK positive (decision node) • 6 cycles BV-CHP [I, A] or CHO(E)P [III, B] (treatment node) • CR (outcome node) • ASCT [II, B] (treatment node) # Connectors : • Top-down arrows connect each decision node to its respective treatment and outcome nodes. • Branching occurs at each disease stage and ALK status, splitting into different treatment pathways. • Some branches merge at common nodes (e.g., CR, ASCT, No further treatment). • Footnotes (a, b) clarify alternative or additional recommendations for specific high-risk groups. # Layout : • The flowchart is organized horizontally by disease subtype and stage (PTCL-NOS/TFHL, Stage I-II ALCL, Stage III-IV ALCL). • Each subtype/stage column flows vertically from initial diagnosis through treatment, remission, and post-remission management. • Colour coding: purple for algorithm title, dark green for radiotherapy, blue for systemic therapy, white for non-treatment aspects. # Analysis : • The flowchart provides a clear, stepwise approach to managing nodal PTCL, emphasizing risk-adapted therapy. • Early-stage disease often receives fewer cycles of chemotherapy and consolidative radiotherapy, with no further treatment if remission is achieved. • Advanced-stage or high-risk disease typically receives more intensive therapy, with ASCT considered for consolidation. • ALK status and IPI score are critical in determining the treatment pathway for ALCL. • The algorithm highlights the importance of individualized therapy based on disease characteristics and response.
| Condition | Definition |
|---|---|
| Gestational hypertension | New-onset SBP >140 or DBP >90 mmHg after 20 weeks, without proteinuria or end-organ damage |
| Preeclampsia | As above + proteinuria (>300 mg/24h) OR end-organ dysfunction |
| Preeclampsia with severe features | SBP ≥160 or DBP ≥110 mmHg (on 2 occasions ≥4 h apart); or any end-organ criterion below |
| HELLP syndrome | Hemolysis + Elevated Liver enzymes + Low Platelets - considered severe preeclampsia |
| Eclampsia | Preeclampsia + seizures |
Note: The term "mild preeclampsia" is no longer used; it is now simply "preeclampsia" vs "preeclampsia with severe features."
| Drug | Dose | Notes |
|---|---|---|
| Methyldopa (alpha-central agonist) | 250 mg twice daily | Former FDA category B; drug of choice for non-acute use; rarely used in non-pregnant patients |
| Labetalol (alpha1 + non-selective beta blocker) | 100 mg twice daily | Reasonable safety profile in pregnancy |
| Nifedipine (CCB) | 30 mg once daily (extended release) | Reasonable evidence of safety |
| Drug | Dose | Route | Notes |
|---|---|---|---|
| Labetalol | 20 mg IV, escalate to 40 mg at 10 min if inadequate | IV | First-line; 5-10 mg increments also used; does not alter placental blood flow |
| Hydralazine | 5 or 10 mg IV or IM; repeat at 20-min intervals | IV/IM | Classic first-line; short-term use |
| Nifedipine | 10-20 mg oral | PO | Effective for acute management |
| Nicardipine / Clevidipine | IV infusion | IV | For refractory intraoperative hypertension |
| Magnesium Level | Clinical Sign |
|---|---|
| 4-6 mEq/L | Therapeutic (seizure prevention) |
| 7-10 mEq/L | Loss of patellar reflexes |
| >10 mEq/L | Respiratory paralysis |
| >15 mEq/L | Cardiac arrest |
| Hazard | Management |
|---|---|
| Difficult/failed intubation | Anticipate from edema (tongue, epiglottis, pharynx) - have video laryngoscope, smaller ETT, surgical airway plan ready; use RSI |
| Hypertensive surge at intubation/extubation | Give labetalol 5-10 mg IV increments; nicardipine or clevidipine IV infusion; avoid ketamine (increases BP) in uncontrolled hypertension |
| Pulmonary edema | Restrict fluids; optimize BP before induction |
| Coagulopathy | Laryngoscopy may provoke profuse bleeding - minimize attempts |
| Aspiration risk | RSI mandatory (sodium citrate 30 mL + metoclopramide 10 mg IV preoperatively; cricoid pressure) |
| Magnesium-NMB interaction | Mg potentiates ALL nondepolarizing muscle relaxants (NMBAs) by acting on the myoneural junction - reduce NMBA doses significantly and ALWAYS use peripheral nerve stimulator (train-of-four) monitoring |
| Succinylcholine | Can still be used for RSI; standard dose (1.5 mg/kg) |
| Emergence/extubation | Significant hypertension at extubation - treat proactively with antihypertensives |
| Monitor | Indication |
|---|---|
| Invasive arterial line | Severe hypertension (mandatory in both GA and regional anaesthesia with severe features) |
| CVP / PA catheter | Pulmonary edema, refractory oliguria, cardiomyopathy |
| Urine output | Catheter; target >0.5 mL/kg/hr |
| Peripheral nerve stimulator | Essential if on MgSO4 and receiving NMBAs |
| Continuous BP monitoring | Beat-to-beat in high-risk cases |
| Drug | Use | Key Point |
|---|---|---|
| Labetalol | Acute hypertension control | IV 20 mg then 40 mg; does not alter placental flow |
| Hydralazine | Acute hypertension | IV/IM 5-10 mg; repeat q20 min |
| Nifedipine | Oral acute/chronic | 10-20 mg oral |
| Nicardipine/Clevidipine | Intraoperative hypertension | IV infusion |
| MgSO4 | Seizure prophylaxis/treatment | 4-6 g load + 1-3 g/hr; therapeutic level 4-8 mEq/L |
| Calcium gluconate | MgSO4 antidote | 1 g IV over 10 min |
| Bupivacaine (epidural) | Neuraxial labor/CS | Dilute (0.0625-0.125%) + opioid for labor |
| Oxytocin | Uterotonic | Preferred over ergot alkaloids |
| Phenylephrine/Ephedrine | Hypotension | Use in small doses - hypersensitivity to catecholamines |
Create a quick reference PDF on PIH/PET anaesthetic management
mkdir -p /tmp/workspace/pih-pdf && ls /tmp/workspace/pih-pdf/
~/pih-pdf/create_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT
from reportlab.platypus import PageBreak
OUTPUT = "/tmp/workspace/pih-pdf/PIH_PET_Anaesthetic_Management.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3A5C")
MID_BLUE = colors.HexColor("#2B6CB0")
LIGHT_BLUE = colors.HexColor("#EBF4FF")
ACCENT_RED = colors.HexColor("#C0392B")
ACCENT_AMBER= colors.HexColor("#E67E22")
ACCENT_GREEN= colors.HexColor("#1A7A4A")
GREY_BG = colors.HexColor("#F4F6F8")
GREY_BORDER = colors.HexColor("#BDC3C7")
WHITE = colors.white
TEXT_DARK = colors.HexColor("#1C1C1C")
W, H = A4
MARGIN = 15*mm
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=MARGIN, leftMargin=MARGIN,
topMargin=18*mm, bottomMargin=15*mm,
title="PIH/PET Anaesthetic Management - Quick Reference",
author="Orris Medical"
)
styles = getSampleStyleSheet()
# Custom styles
def S(name, **kwargs):
base = kwargs.pop("base", "Normal")
s = ParagraphStyle(name, parent=styles[base], **kwargs)
return s
H1 = S("H1", fontSize=18, textColor=WHITE, fontName="Helvetica-Bold",
spaceAfter=2, alignment=TA_CENTER, leading=22)
H2 = S("H2", fontSize=11, textColor=WHITE, fontName="Helvetica-Bold",
spaceBefore=4, spaceAfter=2, leading=14)
H3 = S("H3", fontSize=9.5, textColor=DARK_BLUE, fontName="Helvetica-Bold",
spaceBefore=4, spaceAfter=2, leading=12)
BODY = S("BODY", fontSize=8.2, textColor=TEXT_DARK, fontName="Helvetica",
spaceAfter=2, leading=11)
BODY_B = S("BODY_B", fontSize=8.2, textColor=TEXT_DARK, fontName="Helvetica-Bold",
spaceAfter=2, leading=11)
SMALL = S("SMALL", fontSize=7.2, textColor=colors.HexColor("#555555"),
fontName="Helvetica", leading=10)
WARN = S("WARN", fontSize=8, textColor=ACCENT_RED, fontName="Helvetica-Bold",
spaceAfter=2, leading=11)
NOTE = S("NOTE", fontSize=7.5, textColor=ACCENT_AMBER, fontName="Helvetica-BoldOblique",
spaceAfter=1, leading=10)
TH = S("TH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=10)
TD = S("TD", fontSize=7.8, textColor=TEXT_DARK, fontName="Helvetica",
alignment=TA_LEFT, leading=10)
TD_B = S("TD_B", fontSize=7.8, textColor=TEXT_DARK, fontName="Helvetica-Bold",
alignment=TA_LEFT, leading=10)
TD_RED = S("TD_RED", fontSize=7.8, textColor=ACCENT_RED, fontName="Helvetica-Bold",
alignment=TA_LEFT, leading=10)
TD_GRN = S("TD_GRN", fontSize=7.8, textColor=ACCENT_GREEN, fontName="Helvetica-Bold",
alignment=TA_LEFT, leading=10)
FOOTER_S = S("FOOTER_S", fontSize=6.5, textColor=colors.grey,
fontName="Helvetica", alignment=TA_CENTER)
def section_header(text, color=DARK_BLUE):
tbl = Table([[Paragraph(text, H2)]], colWidths=[W - 2*MARGIN])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return tbl
def warning_box(text):
tbl = Table([[Paragraph("⚠ " + text, WARN)]], colWidths=[W - 2*MARGIN])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#FFF3CD")),
("BOX", (0,0), (-1,-1), 0.8, ACCENT_AMBER),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
return tbl
def info_box(text, bg=LIGHT_BLUE, border=MID_BLUE):
tbl = Table([[Paragraph(text, BODY)]], colWidths=[W - 2*MARGIN])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 0.8, border),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
return tbl
def make_table(headers, rows, col_widths, header_bg=DARK_BLUE):
tdata = [[Paragraph(h, TH) for h in headers]]
for row in rows:
tdata.append([Paragraph(str(c[0]), c[1]) if isinstance(c, tuple)
else Paragraph(str(c), TD) for c in row])
tbl = Table(tdata, colWidths=col_widths, repeatRows=1)
nrows = len(tdata)
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, GREY_BG]),
("BOX", (0,0), (-1,-1), 0.5, GREY_BORDER),
("GRID", (0,0), (-1,-1), 0.3, GREY_BORDER),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
]
tbl.setStyle(TableStyle(style))
return tbl
# ── Page 1 header banner ─────────────────────────────────────────────────────
def header_banner():
banner_data = [[
Paragraph("PIH / PET", S("BT", fontSize=26, textColor=WHITE,
fontName="Helvetica-Bold", leading=28)),
Paragraph("ANAESTHETIC MANAGEMENT<br/><font size=11>Quick Reference Card — Intraoperative & Medical</font>",
S("BS", fontSize=14, textColor=WHITE, fontName="Helvetica-Bold",
leading=18, alignment=TA_LEFT)),
Paragraph("Sources: Miller's, Morgan & Mikhail,<br/>Barash, Creasy & Resnik, Goodman & Gilman",
S("BREF", fontSize=7, textColor=colors.HexColor("#B0C4DE"),
fontName="Helvetica", leading=10, alignment=TA_RIGHT))
]]
banner = Table(banner_data, colWidths=[45*mm, 105*mm, 30*mm])
banner.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
return banner
# ── Build story ──────────────────────────────────────────────────────────────
story = []
CW = W - 2*MARGIN # usable content width
story.append(header_banner())
story.append(Spacer(1, 4*mm))
# ─── SECTION 1: Classification ───────────────────────────────────────────────
story.append(section_header("1. CLASSIFICATION OF HYPERTENSIVE DISORDERS IN PREGNANCY"))
story.append(Spacer(1, 2*mm))
class_rows = [
[("Gestational HTN", TD_B), "SBP ≥140 or DBP ≥90 mmHg after 20 wks, normotensive before, NO proteinuria or end-organ damage"],
[("Preeclampsia", TD_B), "Gestational HTN + proteinuria (≥300 mg/24h) OR end-organ dysfunction"],
[("Severe Features", TD_RED), "SBP ≥160 or DBP ≥110 (×2, ≥4 h apart); platelets <100k; creatinine >1.1; LFTs ×2 normal; pulmonary oedema; cerebral/visual sx"],
[("HELLP Syndrome", TD_RED), "Haemolysis + Elevated Liver enzymes + Low Platelets — subtype of severe preeclampsia"],
[("Eclampsia", TD_RED), "Preeclampsia + tonic-clonic seizures. Indication for DELIVERY (not necessarily LSCS)"],
]
story.append(make_table(
["Condition", "Diagnostic Criteria"],
class_rows,
[45*mm, CW - 45*mm]
))
story.append(Spacer(1, 1*mm))
story.append(info_box(
"⚑ Current ACOG guidance (2020): The term 'mild preeclampsia' is ABOLISHED — "
"classify as preeclampsia vs preeclampsia with SEVERE FEATURES only."
))
story.append(Spacer(1, 3*mm))
# ─── SECTION 2: Medical Management ──────────────────────────────────────────
story.append(section_header("2. MEDICAL MANAGEMENT"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("2a. Antihypertensive Therapy", H3))
anti_rows = [
# Chronic/outpatient
[("Methyldopa", TD_B), "250 mg BD oral", ("Chronic / outpatient", TD), ("FIRST choice chronic; central α-agonist; former FDA cat B", TD)],
[("Labetalol", TD_B), "100 mg BD oral", ("Chronic / outpatient", TD), ("α1 + non-selective β blocker; safe in pregnancy", TD)],
[("Nifedipine SR", TD_B), "30 mg OD oral", ("Chronic / outpatient", TD), ("CCB; reasonable safety evidence", TD)],
# Acute
[("Labetalol", TD_B), "20 mg IV → 40 mg q10 min (max 300 mg)",
("ACUTE – 1st line", TD_B),
("Does NOT alter placental blood flow; also used to blunt intubation response", TD)],
[("Hydralazine", TD_B), "5–10 mg IV/IM q20 min",
("ACUTE – 1st line", TD_B),
("Direct vasodilator; repeat dosing up to 20 mg", TD)],
[("Nifedipine", TD_B), "10–20 mg oral",
("ACUTE oral", TD_B),
("Effective for acute BP reduction", TD)],
[("Nicardipine/Clevidipine", TD_B), "IV infusion titrated",
("Intraoperative refractory", TD_B),
("Short-acting CCBs; ideal for intraop use", TD)],
]
story.append(make_table(
["Drug", "Dose", "Setting", "Notes"],
anti_rows,
[32*mm, 42*mm, 32*mm, CW - 32*mm - 42*mm - 32*mm]
))
story.append(Spacer(1, 1*mm))
story.append(warning_box(
"CONTRAINDICATED in pregnancy: ACE Inhibitors & ARBs — unequivocal teratogenicity / fetal renal failure"
))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("2b. Magnesium Sulphate — Seizure Prophylaxis & Treatment", H3))
mg_data = [
[Paragraph("Loading Dose", TH), Paragraph("Maintenance", TH),
Paragraph("Therapeutic Level", TH), Paragraph("Antidote", TH)],
[Paragraph("4–6 g IV over 20–30 min", TD_B),
Paragraph("1–3 g/hr IV infusion", TD_B),
Paragraph("4–8 mEq/L", TD_B),
Paragraph("Calcium Gluconate\n1 g IV over 10 min", TD_B)],
]
mg_tbl = Table(mg_data, colWidths=[CW/4]*4)
mg_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), ACCENT_GREEN),
("BACKGROUND", (0,1), (-1,-1), colors.HexColor("#E8F8F0")),
("BOX", (0,0), (-1,-1), 0.5, ACCENT_GREEN),
("GRID", (0,0), (-1,-1), 0.3, GREY_BORDER),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
]))
story.append(mg_tbl)
story.append(Spacer(1, 1*mm))
# Mg toxicity table
story.append(Paragraph("Magnesium Toxicity Monitoring:", BODY_B))
tox_rows = [
["4–6 mEq/L", ("Therapeutic — seizure prevention", TD_GRN)],
["7–10 mEq/L", ("Loss of patellar reflexes (early warning)", TD)],
[">10 mEq/L", ("Respiratory paralysis", TD_RED)],
[">15 mEq/L", ("Cardiac arrest", TD_RED)],
]
story.append(make_table(
["Mg Level", "Clinical Effect"],
tox_rows,
[35*mm, CW - 35*mm],
header_bg=MID_BLUE
))
story.append(Spacer(1, 3*mm))
# Investigations
story.append(Paragraph("2c. Investigations", H3))
inv_rows = [
[("CBC + differential", TD_B), "Thrombocytopenia (severe features), haemoconcentration, falling Hct"],
[("Coagulation — PT/aPTT/fibrinogen", TD_B), "Coagulopathy screen before neuraxial; HELLP may cause DIC"],
[("Serum creatinine", TD_B), ">1.1 mg/dL = severe feature; baseline essential"],
[("LFTs (ALT/AST/LDH)", TD_B), "×2 normal = severe feature; LDH ↑ in haemolysis"],
[("Urine protein", TD_B), "Spot protein:creatinine ≥0.3 or 24h ≥300 mg; dipstick ≥1+ if others unavailable"],
[("Uric acid", TD_B), "Elevated in preeclampsia; correlates with severity"],
[("Urine output", TD_B), "Target >0.5 mL/kg/hr; oliguria = severe feature risk"],
]
story.append(make_table(
["Investigation", "Significance"],
inv_rows,
[50*mm, CW - 50*mm]
))
story.append(Spacer(1, 2*mm))
story.append(info_box(
"Definitive treatment = DELIVERY of fetus + placenta. "
"If fetus very preterm: hospitalise + pharmacotherapy. "
"Give betamethasone 12 mg IM ×2 (24 h apart) if viable fetus ≤34 weeks. "
"Fluid restriction: 80–100 mL/hr total (including MgSO₄ + oxytocin infusions)."
))
story.append(PageBreak())
# ── PAGE 2 ────────────────────────────────────────────────────────────────────
story.append(header_banner())
story.append(Spacer(1, 4*mm))
# ─── SECTION 3: Anaesthetic Management ──────────────────────────────────────
story.append(section_header("3. ANAESTHETIC MANAGEMENT", color=MID_BLUE))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("3a. Pre-anaesthetic Assessment", H3))
pre_items = [
"Platelet count — MANDATORY before any neuraxial technique",
"Coagulation profile (PT/aPTT/fibrinogen / TEG)",
"Airway assessment — ANTICIPATE DIFFICULT airway (oedema of tongue, epiglottis, pharynx)",
"Review current antihypertensives and MgSO₄ infusion rate",
"Fluid balance — assess hydration and urine output",
"Degree of end-organ involvement (renal, hepatic, pulmonary, CNS)",
]
for item in pre_items:
story.append(Paragraph(" • " + item, BODY))
story.append(Spacer(1, 2*mm))
# Platelet thresholds for neuraxial
story.append(Paragraph("Platelet Count Thresholds for Neuraxial Block (SOAP Consensus):", BODY_B))
plt_rows = [
[("≥ 70,000/mm³", TD_GRN), ("SAFE — proceed with neuraxial", TD_GRN), "Very low risk of epidural haematoma"],
[("50,000–69,000/mm³", TD_B), ("CAUTION — shared decision making", TD), "Hematoma risk ~3%; consider TEG/ROTEM; stable count + normal TEG acceptable"],
[("< 50,000/mm³", TD_RED), ("HIGH RISK — generally avoid neuraxial", TD_RED), "Hematoma risk up to 11%; prefer GA unless compelling benefit"],
]
story.append(make_table(
["Platelet Count", "Decision", "Comments"],
plt_rows,
[38*mm, 50*mm, CW - 38*mm - 50*mm]
))
story.append(Spacer(1, 3*mm))
# Regional vs GA
story.append(Paragraph("3b. Regional vs General Anaesthesia — Decision", H3))
rg_data = [
[Paragraph("REGIONAL ANAESTHESIA\n(PREFERRED)", S("RH", fontSize=9,
textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12)),
Paragraph("GENERAL ANAESTHESIA\n(When neuraxial contraindicated / emergency)",
S("GH", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12))],
[
Paragraph(
"✔ Best quality pain relief\n"
"✔ Attenuates hypertensive response to pain\n"
"✔ Reduces circulating catecholamines\n"
"✔ Improves uteroplacental perfusion by up to 75%\n"
"✔ Avoids difficult airway / aspiration risks\n"
"✔ No fluid preload needed (dilute LA + opioid)\n"
"✔ Spinal ≈ Epidural — similar hypotension incidence\n"
"✔ Severe PET patients LESS hypotensive with spinal\n"
" than normotensive parturients",
BODY
),
Paragraph(
"⚠ Indications: coagulopathy (plt <50k), refusal,\n"
" failed neuraxial, true emergency\n\n"
"⚠ Key hazards:\n"
" • Difficult intubation (airway oedema)\n"
" • Hypertensive surge at laryngoscopy/extubation\n"
" • Aspiration risk — RSI MANDATORY\n"
" • Mg potentiates NMBAs — reduce dose, use TOF\n"
" • Profuse bleeding on laryngoscopy if coagulopathic\n"
" • Pulmonary oedema risk — restrict fluids",
BODY
)
]
]
rg_tbl = Table(rg_data, colWidths=[CW/2, CW/2])
rg_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), ACCENT_GREEN),
("BACKGROUND", (1,0), (1,0), ACCENT_RED),
("BACKGROUND", (0,1), (0,1), colors.HexColor("#E8F8F0")),
("BACKGROUND", (1,1), (1,1), colors.HexColor("#FFF0EE")),
("BOX", (0,0), (-1,-1), 0.8, GREY_BORDER),
("INNERGRID", (0,0), (-1,-1), 0.4, GREY_BORDER),
("VALIGN", (0,0), (-1,-1), "TOP"),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 7),
]))
story.append(rg_tbl)
story.append(Spacer(1, 3*mm))
# Intraoperative specifics
story.append(Paragraph("3c. Intraoperative Management — Key Points", H3))
# Two-column layout: Regional tips | GA tips
col1 = [
Paragraph("<b>Regional Anaesthesia Tips</b>", BODY_B),
Spacer(1, 2),
Paragraph("• Epidural: bupivacaine 0.0625–0.125% + fentanyl for labour; "
"bupivacaine 0.5% for LSCS", BODY),
Paragraph("• Spinal: hyperbaric bupivacaine 0.5% 10–12 mg ± opioid", BODY),
Paragraph("• CSE: acceptable alternative", BODY),
Paragraph("• Epinephrine test dose — AVOID or use cautiously (may exacerbate HTN)", BODY),
Paragraph("• Vasopressors (phenylephrine / ephedrine): use in SMALLER-than-usual "
"doses — patients are catecholamine-hypersensitive", BODY),
Paragraph("• Fluid preload: CONSERVATIVE — crystalloids/colloids leak through "
"damaged endothelium → pulmonary oedema", BODY),
Paragraph("• Restrict total IV fluids to 80–100 mL/hr (incl. MgSO₄ + oxytocin)", BODY),
]
col2 = [
Paragraph("<b>General Anaesthesia Protocol</b>", BODY_B),
Spacer(1, 2),
Paragraph("• Premed: Sodium citrate 30 mL + Metoclopramide 10 mg IV", BODY),
Paragraph("• RSI: Propofol / Thiopentone + Succinylcholine 1.5 mg/kg", BODY),
Paragraph("• Pre-intubation: Labetalol 5–10 mg IV to blunt pressor response", BODY),
Paragraph("• Use video laryngoscope; smaller ETT (6.0–6.5); have surgical "
"airway prepared", BODY),
Paragraph("• Maintenance: volatile agent (isoflurane/sevoflurane) + opioid; "
"AVOID ketamine in uncontrolled HTN", BODY),
Paragraph("• NMBAs (rocuronium/vecuronium): REDUCE dose by 25–50% — "
"Mg potentiates blockade", BODY),
Paragraph("• ALWAYS use TOF (train-of-four) monitoring with NMBAs on MgSO₄", BODY),
Paragraph("• Extubation: treat emergence HTN proactively with labetalol/nicardipine", BODY),
Paragraph("• AVOID Methergine/ergotamine → hypertensive crisis; use OXYTOCIN", BODY),
]
two_col = Table([[col1, col2]], colWidths=[CW/2 - 2*mm, CW/2 - 2*mm])
two_col.setStyle(TableStyle([
("VALIGN", (0,0), (-1,-1), "TOP"),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("BOX", (0,0), (-1,-1), 0.5, GREY_BORDER),
("INNERGRID", (0,0), (-1,-1), 0.3, GREY_BORDER),
("BACKGROUND", (0,0), (0,0), colors.HexColor("#F0F7FF")),
("BACKGROUND", (1,0), (1,0), colors.HexColor("#FFF5F5")),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
story.append(two_col)
story.append(Spacer(1, 3*mm))
# Monitoring table
story.append(Paragraph("3d. Intraoperative Monitoring", H3))
mon_rows = [
[("Invasive Arterial Line", TD_B), ("MANDATORY in severe features — for both GA and neuraxial", TD_B), "Beat-to-beat BP; facilitates ABG/labs"],
[("CVP / Pulmonary Artery Catheter", TD_B), "Pulmonary oedema, refractory oliguria, cardiomyopathy", "Use judiciously; risk of over-resuscitation"],
[("Foley Catheter — Urine Output", TD_B), "All cases", "Target >0.5 mL/kg/hr; oliguria = severity marker"],
[("Peripheral Nerve Stimulator (TOF)", TD_B), ("MANDATORY if on MgSO₄ + receiving NMBAs", TD_RED), "Prevents NMBA overdose from Mg potentiation"],
[("CTG — Fetal Monitoring", TD_B), "If fetus viable, pre-delivery", "FHR abnormalities common during eclampsia seizure — usually self-resolve"],
[("SpO₂, EtCO₂, Temperature", TD_B), "Standard", "Increased aspiration risk — monitor closely under GA"],
]
story.append(make_table(
["Monitor", "Indication", "Notes"],
mon_rows,
[45*mm, 55*mm, CW - 100*mm]
))
story.append(Spacer(1, 2*mm))
# Critical drug interactions
story.append(warning_box(
"CRITICAL DRUG INTERACTIONS: "
"① MgSO₄ + ALL NMBAs → prolonged neuromuscular blockade (reduce NMBA dose 25–50%, use TOF) "
"② MgSO₄ + Nifedipine → potentiates hypotension (use cautiously) "
"③ Ergot alkaloids → hypertensive crisis in preeclampsia — USE OXYTOCIN instead "
"④ Ketamine → raises BP/ICP — AVOID in uncontrolled hypertension"
))
story.append(Spacer(1, 3*mm))
# ─── SECTION 4: Postpartum ───────────────────────────────────────────────────
story.append(section_header("4. POSTPARTUM MANAGEMENT", color=colors.HexColor("#6B3A7D")))
story.append(Spacer(1, 2*mm))
pp_items = [
("Continue MgSO₄ for 24–48 h postpartum", BODY_B),
("Monitor BP closely — can worsen in first 48 h after delivery", BODY),
("~20% of eclampsia occurs >48 h postpartum — MAINTAIN vigilance", WARN),
("Beware postpartum pulmonary oedema — fluid mobilisation phase", BODY),
("Continue antihypertensives; wean slowly over days–weeks", BODY),
("Uterotonic of choice = OXYTOCIN (avoid Methergine)", BODY),
("Provide adequate analgesia — uncontrolled pain raises BP", BODY),
("Screen for postpartum depression and long-term CV risk (↑ HTN, IHD risk lifetime)", BODY),
]
for txt, style in pp_items:
story.append(Paragraph(" • " + txt, style))
story.append(Spacer(1, 3*mm))
# ─── SECTION 5: Quick Drug Reference ────────────────────────────────────────
story.append(section_header("5. QUICK DRUG SUMMARY", color=colors.HexColor("#1A5276")))
story.append(Spacer(1, 2*mm))
qd_rows = [
[("Methyldopa", TD_B), "250 mg BD PO", ("Chronic HTN", TD), ("Safe; rarely used outside pregnancy", TD)],
[("Labetalol", TD_B), "20→40 mg IV; 100 mg BD PO", ("Acute & chronic", TD_B), ("Doesn't reduce placental flow", TD)],
[("Hydralazine", TD_B), "5–10 mg IV/IM q20 min", ("Acute", TD_B), ("Direct vasodilator", TD)],
[("Nifedipine", TD_B), "10–20 mg PO (acute); 30 mg SR (chronic)", ("Acute/chronic", TD), ("CCB; potentiates Mg", TD)],
[("Nicardipine", TD_B), "IV infusion titrated", ("Intraoperative", TD), ("Short-acting; excellent for intraop use", TD)],
[("MgSO₄", TD_B), "4–6 g IV load; 1–3 g/hr", ("Seizure Rx/prophylaxis", TD_B), ("Therapeutic: 4–8 mEq/L", TD)],
[("Calcium Gluconate", TD_B), "1 g IV over 10 min", ("Antidote to Mg toxicity", TD_RED), ("Give immediately for respiratory/cardiac depression", TD)],
[("Labetalol IV", TD_B), "5–10 mg increments IV", ("Intubation pressor response", TD_B), ("Blunts sympathetic surge at laryngoscopy", TD)],
[("Oxytocin", TD_B), "10–20 IU slow IV/IM", ("Uterotonic", TD_GRN), ("Preferred over ergot alkaloids in HTN", TD_GRN)],
[("Phenylephrine/Ephedrine", TD_B), "Small doses titrated", ("Hypotension after neuraxial", TD), ("Catecholamine hypersensitivity — use min doses", TD)],
]
story.append(make_table(
["Drug", "Dose", "Indication", "Key Point"],
qd_rows,
[32*mm, 42*mm, 38*mm, CW - 32*mm - 42*mm - 38*mm]
))
story.append(Spacer(1, 3*mm))
story.append(HRFlowable(width=CW, thickness=0.5, color=GREY_BORDER))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
"Sources: Miller's Anesthesia 10e | Morgan & Mikhail's Clinical Anesthesiology 7e | "
"Barash, Cullen & Stoelting's Clinical Anesthesia 9e | "
"Creasy & Resnik's Maternal-Fetal Medicine | Goodman & Gilman's Pharmacological Basis of Therapeutics | "
"Tintinalli's Emergency Medicine | ACOG 2020 Hypertension in Pregnancy Guidelines",
FOOTER_S
))
story.append(Paragraph(
"Generated by Orris Medical AI · For educational use only · Verify all doses against current institutional protocols",
S("FW", fontSize=6, textColor=colors.HexColor("#C0392B"),
fontName="Helvetica-Oblique", alignment=TA_CENTER)
))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /tmp/workspace/pih-pdf && python create_pdf.py 2>&1
ls -lh /tmp/workspace/pih-pdf/PIH_PET_Anaesthetic_Management.pdf
PIH PET Anaesthetic Management
PDF Document · PDF
Cleft palate /cleft lip surgery - anaesthetic relevance MD Anaesthesia pg exams
~/pih-pdf/cleft_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT
OUTPUT = "/tmp/workspace/pih-pdf/Cleft_Lip_Palate_Anaesthesia.pdf"
# Palette
NAVY = colors.HexColor("#1A2F5A")
TEAL = colors.HexColor("#1A7A6E")
PURPLE = colors.HexColor("#5B2C8D")
AMBER = colors.HexColor("#D4820A")
RED = colors.HexColor("#B03A2E")
GREEN = colors.HexColor("#1A7A4A")
LT_BLUE = colors.HexColor("#EBF4FF")
LT_GREEN = colors.HexColor("#E8F8F0")
LT_AMBER = colors.HexColor("#FFF8E8")
LT_RED = colors.HexColor("#FFF0EE")
LT_PURPLE = colors.HexColor("#F5EEF8")
GREY_BG = colors.HexColor("#F4F6F8")
GREY_BD = colors.HexColor("#BDC3C7")
WHITE = colors.white
DARK = colors.HexColor("#1C1C1C")
W, H = A4
MARGIN = 14*mm
CW = W - 2*MARGIN
doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
rightMargin=MARGIN, leftMargin=MARGIN,
topMargin=16*mm, bottomMargin=14*mm,
title="Cleft Lip/Palate Anaesthesia - MD Exam Reference")
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, parent=styles["Normal"], **kw)
TH = S("TH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=10)
TD = S("TD", fontSize=7.8, textColor=DARK, fontName="Helvetica", alignment=TA_LEFT, leading=10)
TDB = S("TDB", fontSize=7.8, textColor=DARK, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
TDR = S("TDR", fontSize=7.8, textColor=RED, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
TDG = S("TDG", fontSize=7.8, textColor=GREEN, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
TDP = S("TDP", fontSize=7.8, textColor=PURPLE, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
BODY = S("BODY", fontSize=8.2, textColor=DARK, fontName="Helvetica", spaceAfter=2, leading=11)
BODYB = S("BODYB", fontSize=8.2, textColor=DARK, fontName="Helvetica-Bold", spaceAfter=2, leading=11)
H2 = S("H2", fontSize=10, textColor=WHITE, fontName="Helvetica-Bold", leading=13, spaceAfter=2)
H3 = S("H3", fontSize=9, textColor=NAVY, fontName="Helvetica-Bold", leading=12, spaceBefore=4, spaceAfter=2)
WARN = S("WARN", fontSize=8, textColor=RED, fontName="Helvetica-Bold", leading=11, spaceAfter=2)
NOTE = S("NOTE", fontSize=7.8, textColor=AMBER, fontName="Helvetica-BoldOblique", leading=10, spaceAfter=1)
SMALL = S("SMALL", fontSize=6.8, textColor=colors.grey, fontName="Helvetica", alignment=TA_CENTER, leading=9)
EXAM = S("EXAM", fontSize=8, textColor=PURPLE, fontName="Helvetica-Bold", leading=11, spaceAfter=2)
def sec_hdr(text, color=NAVY):
t = Table([[Paragraph(text, H2)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), color),
("TOPPADDING", (0,0),(-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING",(0,0),(-1,-1), 8),
]))
return t
def warn_box(txt):
t = Table([[Paragraph("⚠ " + txt, WARN)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), colors.HexColor("#FFF3CD")),
("BOX",(0,0),(-1,-1), 0.8, AMBER),
("TOPPADDING",(0,0),(-1,-1),5), ("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def info_box(txt, bg=LT_BLUE, bd=colors.HexColor("#2B6CB0")):
t = Table([[Paragraph(txt, BODY)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), bg),
("BOX",(0,0),(-1,-1), 0.7, bd),
("TOPPADDING",(0,0),(-1,-1),5), ("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def exam_box(txt):
t = Table([[Paragraph("★ EXAM POINT: " + txt, EXAM)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), LT_PURPLE),
("BOX",(0,0),(-1,-1), 0.8, PURPLE),
("TOPPADDING",(0,0),(-1,-1),5), ("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def mktable(headers, rows, cws, hbg=NAVY):
data = [[Paragraph(h, TH) for h in headers]]
for row in rows:
data.append([Paragraph(str(c[0]),c[1]) if isinstance(c,tuple) else Paragraph(str(c),TD) for c in row])
t = Table(data, colWidths=cws, repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0), hbg),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE, GREY_BG]),
("BOX",(0,0),(-1,-1),0.5,GREY_BD),
("GRID",(0,0),(-1,-1),0.3,GREY_BD),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
("TOPPADDING",(0,0),(-1,-1),4),
("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),5),
]))
return t
def banner():
d = [[
Paragraph("CLEFT LIP & PALATE", S("BT", fontSize=18, textColor=WHITE,
fontName="Helvetica-Bold", leading=22)),
Paragraph("ANAESTHESIA — MD Exam Reference<br/>"
"<font size=9>Airway · Intraoperative · Postoperative · Associated Syndromes</font>",
S("BS", fontSize=12, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_LEFT, leading=16)),
Paragraph("Miller's · Morgan & Mikhail<br/>Barash · Scott-Brown's",
S("BR", fontSize=7, textColor=colors.HexColor("#B0C4DE"),
fontName="Helvetica", alignment=TA_RIGHT, leading=10))
]]
b = Table(d, colWidths=[55*mm, 100*mm, 25*mm])
b.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), NAVY),
("TOPPADDING",(0,0),(-1,-1),10),
("BOTTOMPADDING",(0,0),(-1,-1),10),
("LEFTPADDING",(0,0),(-1,-1),8),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
]))
return b
story = []
# ── BANNER ─────────────────────────────────────────────────────────────────
story.append(banner())
story.append(Spacer(1, 4*mm))
# ── SECTION 1: OVERVIEW ─────────────────────────────────────────────────────
story.append(sec_hdr("1. OVERVIEW & SURGICAL TIMING"))
story.append(Spacer(1,2*mm))
timing_rows = [
[("Cleft Lip (Cheiloplasty)", TDB), "3–6 months of age",
"Rule of 10s: Wt >10 lb (4.5 kg), Hb >10 g/dL, Age >10 wks"],
[("Cleft Palate (Palatoplasty)", TDB), "9–12 months of age",
"Before speech development; optimises speech outcome"],
[("Alveolar Bone Graft", TDB), "8–11 years", "Before canine eruption"],
[("Secondary corrections", TDB), "Adolescence", "Rhinoplasty, pharyngoplasty, orthognathic surgery"],
]
story.append(mktable(
["Procedure", "Age", "Key Rationale"],
timing_rows, [45*mm, 30*mm, CW-75*mm]
))
story.append(Spacer(1,1*mm))
story.append(exam_box(
"RULE OF TENS (classic exam question): ≥10 weeks age, ≥10 lb (4.5 kg) weight, ≥10 g/dL haemoglobin — "
"minimum criteria before cleft lip repair."
))
story.append(Spacer(1,2*mm))
story.append(Paragraph("Classification (Veau 1931):", H3))
veau_rows = [
["Group I (A)", "Soft palate only"],
["Group II (B)", "Hard + soft palate to incisive foramen"],
["Group III (C)", "Soft palate to alveolus ± lip (unilateral)"],
["Group IV (D)", "Complete bilateral cleft (lip + alveolus + palate)"],
]
story.append(mktable(["Group", "Description"], veau_rows, [28*mm, CW-28*mm], hbg=TEAL))
story.append(Spacer(1,3*mm))
# ── SECTION 2: PREOPERATIVE ASSESSMENT ─────────────────────────────────────
story.append(sec_hdr("2. PREOPERATIVE ASSESSMENT", color=TEAL))
story.append(Spacer(1,2*mm))
story.append(Paragraph("2a. Associated Syndromes (HIGH EXAM YIELD)", H3))
syn_rows = [
[("Pierre Robin Sequence", TDR),
"Micrognathia + cleft palate + glossoptosis",
("SEVERELY DIFFICULT AIRWAY — retrognathia causes obligate nasal breathing and can completely obstruct airway", TDR)],
[("Treacher Collins (Mandibulofacial Dysostosis)", TDR),
"Malar hypoplasia, micrognathia, ear anomalies, cleft palate",
("EXTREMELY DIFFICULT intubation; hypoplastic mandible", TDR)],
[("Stickler Syndrome", TDB),
"Micrognathia, cleft palate, myopia, joint laxity",
"May have difficult airway"],
[("Van der Woude Syndrome", TD),
"Cleft lip/palate + lip pits; AD inheritance",
"Usually no additional airway difficulty"],
[("22q11.2 (DiGeorge/velocardiofacial)", TDB),
"Palatal abnormalities, cardiac defects (TOF, VSD), immune deficiency",
"Cardiac assessment mandatory; T-cell deficiency (avoid live vaccines, irradiate blood products)"],
[("Down Syndrome (Trisomy 21)", TDB),
"Cleft palate in ~1%; macroglossia, atlantoaxial instability",
"Neck flexion precautions; cardiac defects in 40-50%"],
[("Goldenhar Syndrome", TDB),
"Hemifacial microsomia, cervical vertebral anomalies, ear anomalies",
"Difficult airway + cervical spine instability"],
]
story.append(mktable(
["Syndrome", "Features", "Anaesthetic Significance"],
syn_rows, [40*mm, 50*mm, CW-90*mm]
))
story.append(Spacer(1,1*mm))
story.append(warn_box(
"ALWAYS screen for associated syndromes/cardiac defects preoperatively. "
"~30% of cleft lip/palate cases are associated with other anomalies (Miller's Anesthesia 10e). "
"Echocardiography if cardiac defect suspected."
))
story.append(Spacer(1,2*mm))
story.append(Paragraph("2b. Preoperative Checklist", H3))
checks = [
("Airway Assessment", "Mouth opening, jaw size, tongue size, retrognathia, neck mobility — predict difficult intubation"),
("Rule of 10s", "Weight ≥4.5 kg, Hb ≥10 g/dL, Age ≥10 weeks (for lip repair)"),
("Cardiac status", "ECG/Echo if murmur or associated syndrome; SBE prophylaxis if required"),
("Haematology", "Hb, TWBC, platelets; type and crossmatch"),
("Upper respiratory infection", "Postpone if active URTI; increased laryngospasm risk with ETT"),
("Fasting", "Infants: breast milk 4h, formula 6h, solids 6–8h (modified per age)"),
("Parental consent & explanation", "Including difficult airway plan"),
]
for title, detail in checks:
story.append(Paragraph(f" • <b>{title}:</b> {detail}", BODY))
story.append(Spacer(1,3*mm))
# ── SECTION 3: INTRAOPERATIVE MANAGEMENT ───────────────────────────────────
story.append(sec_hdr("3. INTRAOPERATIVE ANAESTHETIC MANAGEMENT", color=colors.HexColor("#2E4057")))
story.append(Spacer(1,2*mm))
story.append(Paragraph("3a. Airway — The CORE Challenge", H3))
story.append(info_box(
"The central anaesthetic challenge in cleft lip/palate surgery is AIRWAY MANAGEMENT. "
"The defect creates unique intubation difficulties, the surgeon requires unobstructed "
"oral/nasal field, and the pharyngeal packing/surgical manipulation poses ongoing airway risks.",
bg=LT_BLUE
))
story.append(Spacer(1,2*mm))
aw_rows = [
[("Cleft lip (unilateral, incomplete)", TDG),
"Usually straightforward; laryngoscope blade may slip into cleft",
"Roll of gauze/finger in cleft to stabilise blade"],
[("Bilateral cleft lip", TDB),
"Premaxilla protrudes; difficult mask seal and laryngoscopy",
"Careful mask fit; may need two-handed mask ventilation"],
[("Large/bilateral cleft palate", TDR),
("Tongue prolapses through cleft → airway obstruction. Laryngoscope blade may lodge in cleft", TDR),
("Keep tongue anterior; use straight blade; have LMA + videolaryngoscope ready", TDR)],
[("Retrognathia (Pierre Robin, Treacher Collins)", TDR),
("SEVERELY DIFFICULT — small jaw, large tongue relative to oral cavity", TDR),
("Awake fibreoptic intubation (>6 months) or gas induction with spontaneous ventilation + direct/video laryngoscopy", TDR)],
]
story.append(mktable(
["Cleft Type", "Airway Problem", "Management"],
aw_rows, [35*mm, 60*mm, CW-95*mm]
))
story.append(Spacer(1,2*mm))
story.append(Paragraph("3b. Induction", H3))
ind_items = [
("Preferred technique", "Inhalational induction (sevoflurane in O₂/N₂O) — smooth, avoids IV in uncooperative infant; maintain spontaneous ventilation until airway secured"),
("IV induction alternative", "If IV access established: propofol 2–3 mg/kg or thiopentone 4–5 mg/kg"),
("Atropine premedication", "0.02 mg/kg IV/IM — reduces secretions; prevents bradycardia (especially with sevoflurane/halothane); given prior to induction in infants"),
("Preoxygenation", "Mandatory — infants have low FRC, desaturate rapidly"),
("Positioning for intubation", "Supine, small shoulder roll (not neck roll); avoid neck hyperextension in Pierre Robin/Goldenhar"),
]
for title, detail in ind_items:
story.append(Paragraph(f" • <b>{title}:</b> {detail}", BODY))
story.append(Spacer(1,2*mm))
story.append(Paragraph("3c. Endotracheal Tube (ETT) — Selection & Positioning", H3))
ett_rows = [
[("ETT type — Cleft Lip", TDB), "Preformed oral RAE tube (Ring-Adair-Elwyn)",
"Contoured curve keeps tube and circuit away from surgical field; secured to CHIN/LOWER jaw"],
[("ETT type — Cleft Palate", TDB), "South-facing preformed oral RAE tube",
"Secured CENTRALLY to chin midline; allows Dingman gag/mouth gag insertion"],
[("Nasal RAE tube", TD), "Occasionally for cleft palate",
"Useful when oral field completely occupied; risk of nasal trauma"],
[("ETT size (uncuffed)", TDB), "(Age/4) + 4 mm — confirm with leak at 20–25 cmH₂O",
"Uncuffed preferred <8 yrs to reduce subglottic oedema risk"],
[("Cuffed tubes", TD), "May use cuffed 0.5 mm smaller; inflate to minimal occlusive pressure",
"Acceptable if tube change risk outweighs subglottic risk"],
[("Fixation", TDR), ("CRITICAL — tube must be VERY SECURELY fixed", TDR),
("Surgeon works directly over airway; accidental extubation in this position is life-threatening", TDR)],
]
story.append(mktable(
["Item", "Choice", "Rationale"],
ett_rows, [40*mm, 50*mm, CW-90*mm]
))
story.append(Spacer(1,1*mm))
story.append(exam_box(
"Preformed oral RAE tube: the STANDARD airway device for cleft lip/palate surgery. "
"RAE = Ring, Adair, Elwyn (named after inventors). "
"For cleft lip → tube to CHIN. For cleft palate → tube MIDLINE to chin (through Dingman mouth gag)."
))
story.append(Spacer(1,2*mm))
story.append(Paragraph("3d. Throat Pack", H3))
story.append(Paragraph(
" • A MOIST pharyngeal/throat pack is inserted by the surgeon after intubation "
"to prevent blood/secretions from being swallowed or aspirated.", BODY))
story.append(Paragraph(
" • The pack MUST be documented in the anaesthetic chart and MUST be removed before extubation.", BODY))
story.append(Paragraph(
" • RETAINED THROAT PACK = serious sentinel event → complete airway obstruction post-extubation.", BODY))
story.append(warn_box("THROAT PACK: Record insertion AND removal. Check mouth before extubation. This is a common exam question and a critical patient safety point."))
story.append(Spacer(1,2*mm))
story.append(Paragraph("3e. Maintenance", H3))
maint_items = [
("Agent", "Sevoflurane/isoflurane + O₂/air (or N₂O); or TIVA with propofol infusion"),
("Muscle relaxants", "Short/intermediate-acting (atracurium, mivacurium); allow reversal before extubation. Succinylcholine for RSI if needed"),
("Analgesia", "Multimodal: paracetamol IV/PR + infraorbital nerve block for lip repair + ketorolac/diclofenac + low-dose opioid (fentanyl 1–2 mcg/kg)"),
("Infraorbital nerve block", "Intraoral or extraoral approach; provides excellent analgesia for cleft lip repair; reduces opioid requirement"),
("Greater palatine nerve block", "Provides analgesia for palatal surgery"),
("Positioning", "Supine with head ring; surgeon at head end; table may be rotated 90° or 180° away from anaesthetist"),
("Dingman mouth gag", "Inserted by surgeon for palate surgery — can displace ETT; re-check tube position/ETCO₂/breath sounds after gag insertion"),
("Blood loss", "Usually modest; have blood available for bilateral complete clefts and revisions; IV access must be reliable"),
("Fluid management", "Maintenance fluids: 4 mL/kg/hr for first 10 kg; replace blood losses with 3:1 crystalloid or blood if Hb drops"),
("Temperature", "Neonates/infants lose heat rapidly — warm theatre, warming blanket, warm IV fluids, forced-air warmer"),
]
for title, detail in maint_items:
story.append(Paragraph(f" • <b>{title}:</b> {detail}", BODY))
story.append(Spacer(1,3*mm))
# ── PAGE 2 ──────────────────────────────────────────────────────────────────
story.append(PageBreak())
story.append(banner())
story.append(Spacer(1,4*mm))
# ── SECTION 4: EXTUBATION ───────────────────────────────────────────────────
story.append(sec_hdr("4. EXTUBATION — HIGH-RISK PHASE", color=RED))
story.append(Spacer(1,2*mm))
story.append(info_box(
"Extubation is the MOST DANGEROUS phase in cleft palate repair. "
"Postoperative airway obstruction is a recognised complication of palatoplasty "
"due to posterior displacement of the repaired palate, oedema, and haematoma. "
"Extubation should be AWAKE (not deep) to protect the airway.",
bg=LT_RED, bd=RED
))
story.append(Spacer(1,2*mm))
ext_items = [
("AWAKE extubation", "MANDATORY for cleft palate repair — extubate only when child is awake with intact reflexes (coughing, eye-opening)"),
("Deep extubation (cleft lip)", "May be considered for lip repair only (non-palate), to reduce bucking/straining on suture line"),
("Throat pack removal", "REMOVE pack and inspect oropharynx under direct vision BEFORE extubation"),
("Suction", "Gentle oropharyngeal suction under direct vision; avoid vigorous suctioning near repair"),
("Lateral/recovery position", "After extubation — 'tonsillar position' (lateral, head-down) prevents aspiration and helps tongue fall forward"),
("Oropharyngeal airway", "AVOID hard Guedel airway after palate repair — may disrupt suture line; use soft nasopharyngeal airway if needed"),
("Tongue stitch", "Some surgeons place a stay suture through the tongue in Pierre Robin — allows forward traction if obstruction occurs"),
("Post-extubation monitoring", "Continuous SpO₂ monitoring; O₂ by face mask/tent; immediate re-intubation equipment at bedside"),
]
for title, detail in ext_items:
story.append(Paragraph(f" • <b>{title}:</b> {detail}", BODY))
story.append(Spacer(1,1*mm))
story.append(exam_box(
"KEY EXAM POINT: Cleft palate → AWAKE extubation. "
"Cleft lip → deep extubation acceptable to avoid suture line stress. "
"Oropharyngeal (Guedel) airway is CONTRAINDICATED after palatoplasty."
))
story.append(Spacer(1,3*mm))
# ── SECTION 5: POSTOPERATIVE ────────────────────────────────────────────────
story.append(sec_hdr("5. POSTOPERATIVE MANAGEMENT", color=TEAL))
story.append(Spacer(1,2*mm))
post_rows = [
[("Airway obstruction", TDR), "Palatoplasty displaces soft palate posteriorly; oedema; blood clot",
("Awake extubation; lateral position; tongue suture; SpO₂ monitoring; re-intubation at bedside", TDR)],
[("Bleeding", TDB), "Palatal vascularity; adrenaline dissipation",
"Swallowed blood → vomiting/aspiration; monitor closely; return to OT if significant"],
[("Laryngospasm", TDB), "Secretions/blood around larynx on extubation",
"CPAP with 100% O₂; jaw thrust; propofol 0.5 mg/kg IV; succinylcholine 1–2 mg/kg if complete"],
[("Pain / Emergence agitation", TDB), "Common in infants post-GA",
"Multimodal analgesia (paracetamol + NSAID + opioid PRN); regional blocks reduce requirement"],
[("Vomiting", TD), "Swallowed blood; opioids",
"Ondansetron 0.1 mg/kg IV; dexamethasone 0.1 mg/kg IV at induction as prophylaxis"],
[("Hypothermia", TDB), "Small body surface area, prolonged surgery",
"Active warming from induction; warm fluids; monitor temperature; keep theatre warm"],
[("Apnoea (ex-preterm)", TDR), "Former preterm infants <60 weeks PMA",
("Admit for apnoea monitoring; caffeine prophylaxis", TDR)],
]
story.append(mktable(
["Complication", "Cause/Risk Factor", "Management"],
post_rows, [38*mm, 55*mm, CW-93*mm]
))
story.append(Spacer(1,2*mm))
# Analgesia
story.append(Paragraph("Postoperative Analgesia Protocol:", H3))
analg_rows = [
[("Paracetamol (Acetaminophen)", TDB), "15 mg/kg IV/oral q6h", "1st line; always use; reduces opioid need"],
[("NSAIDs (Ketorolac/Ibuprofen)", TDB), "0.5 mg/kg IV or 5 mg/kg oral", "Effective; avoid if bleeding risk; >3 months age"],
[("Infraorbital nerve block", TDG), "Bupivacaine 0.25% 0.5–1 mL per side",
("Bilateral for lip repair; equivalent to IV morphine for first few hours", TDG)],
[("Greater palatine block", TDB), "Bupivacaine 0.25% 0.5 mL per foramen",
"For palatal repair; reduces intraop and postop opioid requirements"],
[("Opioids (fentanyl/morphine)", TD), "Titrate IV; morphine 0.05–0.1 mg/kg PRN",
"Use judiciously — increased respiratory depression risk in infants"],
[("Dexamethasone", TD), "0.1 mg/kg IV at induction", "Reduces oedema + PONV + analgesic requirement"],
]
story.append(mktable(
["Agent", "Dose", "Notes"],
analg_rows, [45*mm, 45*mm, CW-90*mm]
))
story.append(Spacer(1,3*mm))
# ── SECTION 6: SPECIAL SCENARIOS ────────────────────────────────────────────
story.append(sec_hdr("6. SPECIAL SCENARIOS & DIFFICULT AIRWAY", color=PURPLE))
story.append(Spacer(1,2*mm))
story.append(Paragraph("Pierre Robin Sequence — Anaesthetic Protocol", H3))
story.append(info_box(
"Pierre Robin = Micrognathia + Cleft Palate + Glossoptosis (tongue falls back). "
"Neonates present with feeding difficulties and airway obstruction relieved by prone positioning. "
"This is the MOST DANGEROUS cleft-related airway scenario.",
bg=LT_RED, bd=RED
))
pr_items = [
("Prone positioning", "Preoperative: prone position relieves obstruction by gravity-forward tongue displacement"),
("Induction", "Gas induction (sevoflurane) in PRONE or lateral position; maintain spontaneous ventilation throughout"),
("Intubation options", "① Direct laryngoscopy (Miller straight blade — see epiglottis); ② Videolaryngoscopy (GlideScope); ③ Fibreoptic bronchoscope (FOB) — GOLD STANDARD for anticipated difficult airway; ④ LMA as conduit for FOB-guided intubation"),
("Surgical airway standby", "Surgeon must be scrubbed and ready for emergency tracheostomy/cricothyrotomy"),
("Tongue stitch", "Place 3-0 prolene through tongue apex before induction as safety measure"),
("NEVER", "Never give neuromuscular blocking agent until airway is SECURED"),
]
for title, detail in pr_items:
story.append(Paragraph(f" • <b>{title}:</b> {detail}", BODY))
story.append(Spacer(1,3*mm))
# ── SECTION 7: HIGH YIELD EXAM POINTS ───────────────────────────────────────
story.append(sec_hdr("7. HIGH-YIELD MD EXAM POINTS", color=colors.HexColor("#1A5276")))
story.append(Spacer(1,2*mm))
exam_points = [
"Rule of 10s: Age ≥10 wks, Weight ≥10 lb (4.5 kg), Hb ≥10 g/dL before cleft lip repair",
"~30% of cleft lip/palate associated with syndromes — thorough preoperative assessment is MANDATORY",
"Standard airway device = Preformed oral RAE tube (south-facing); secured to chin",
"Dingman mouth gag for palatoplasty: CHECK ETT position and ETCO₂ after insertion — can displace tube",
"Throat pack: document, count, and confirm removal BEFORE extubation (NEVER forget this step)",
"Cleft lip → deep extubation acceptable | Cleft palate → AWAKE extubation MANDATORY",
"Guedel (rigid) oropharyngeal airway is CONTRAINDICATED post-palatoplasty",
"Infraorbital nerve block = excellent analgesia for cleft lip repair (reduces opioid requirement significantly)",
"Pierre Robin Sequence: gas induction + maintain spontaneous ventilation; FOB gold standard; NEVER paralyse first",
"Magnesium interacts with NMBAs (relevant if used for laryngospasm treatment)",
"Ayre's T-piece (1937): first specially designed paediatric anaesthesia circuit — created for cleft lip/palate babies",
"Ex-premature infants <60 weeks PMA: admit postoperatively for apnoea monitoring regardless of procedure",
"22q11 deletion: screen for cardiac defects + immunodeficiency (irradiate blood products if required)",
"Lateral (tonsillar) position after extubation: prevents aspiration, allows drainage, tongue falls forward",
"Postoperative airway obstruction after palatoplasty: keep SpO₂ probe on, re-intubation equipment at bedside",
]
for i, pt in enumerate(exam_points, 1):
story.append(Paragraph(f" <b>{i}.</b> {pt}", BODY))
story.append(Spacer(1,2*mm))
# Drug summary
story.append(Paragraph("Quick Drug Reference:", H3))
drug_rows = [
[("Atropine", TDB), "0.02 mg/kg IV/IM", "Pre-induction; antisialogogue + prevents bradycardia"],
[("Sevoflurane", TDB), "2–8% inhalational", "Agent of choice for inhalational induction in children"],
[("Suxamethonium", TDB), "1–2 mg/kg IV", "RSI; laryngospasm treatment (full dose)"],
[("Atracurium", TDB), "0.5 mg/kg IV", "Short/intermediate NMBA; organ-independent elimination"],
[("Paracetamol", TDB), "15 mg/kg IV/PR q6h", "1st line analgesia; always use"],
[("Ketorolac", TDB), "0.5 mg/kg IV", "NSAID; >3 months; caution in bleeding"],
[("Bupivacaine (infraorbital)", TDB), "0.25% 0.5–1 mL", "Bilateral infraorbital block for lip repair"],
[("Fentanyl", TDB), "1–2 mcg/kg IV", "Intraoperative analgesia supplement"],
[("Ondansetron", TDB), "0.1 mg/kg IV", "PONV prevention (swallowed blood risk)"],
[("Dexamethasone", TDB), "0.1 mg/kg IV", "Reduces oedema, PONV, analgesic need"],
[("Neostigmine", TDB), "0.05 mg/kg + atropine 0.02 mg/kg", "NMBA reversal before awake extubation"],
]
story.append(mktable(
["Drug", "Dose", "Use"],
drug_rows, [40*mm, 42*mm, CW-82*mm]
))
story.append(Spacer(1,3*mm))
story.append(HRFlowable(width=CW, thickness=0.5, color=GREY_BD))
story.append(Spacer(1,2*mm))
story.append(Paragraph(
"Sources: Miller's Anesthesia 10e · Morgan & Mikhail's Clinical Anesthesiology 7e · "
"Barash, Cullen & Stoelting's Clinical Anesthesia 9e · "
"Scott-Brown's Otorhinolaryngology Head & Neck Surgery 8e · "
"Cummings Otolaryngology Head & Neck Surgery",
SMALL
))
story.append(Paragraph(
"Generated by Orris Medical AI · For educational use only · Verify doses against current institutional protocols and BNF for Children",
S("FW", fontSize=6.2, textColor=RED, fontName="Helvetica-Oblique", alignment=TA_CENTER)
))
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /tmp/workspace/pih-pdf && python cleft_pdf.py 2>&1
ls -lh /tmp/workspace/pih-pdf/Cleft_Lip_Palate_Anaesthesia.pdf
Cleft Lip Palate Anaesthesia
PDF Document · PDF
| Procedure | Age | Key Point |
|---|---|---|
| Cleft Lip (Cheiloplasty) | 3-6 months | Rule of 10s applies |
| Cleft Palate (Palatoplasty) | 9-12 months | Before speech development |
| Alveolar bone graft | 8-11 years | Before canine eruption |
| Secondary corrections | Adolescence | Rhinoplasty, pharyngoplasty |
★ RULE OF TENS (Classic Exam Q): Age ≥10 weeks | Weight ≥10 lbs (4.5 kg) | Hb ≥10 g/dL — minimum criteria before cleft lip repair is undertaken.
| Syndrome | Features | Anaesthetic Significance |
|---|---|---|
| Pierre Robin Sequence | Micrognathia + cleft palate + glossoptosis | SEVERELY DIFFICULT airway - tongue obstructs larynx |
| Treacher Collins | Malar hypoplasia, micrognathia, ear anomalies | EXTREMELY difficult intubation |
| Stickler Syndrome | Micrognathia, myopia, joint laxity | May have difficult airway |
| 22q11.2 (DiGeorge) | Palatal anomalies + cardiac defects (TOF, VSD) + T-cell deficiency | Cardiac assessment mandatory; irradiate blood products |
| Down Syndrome | Macroglossia, atlantoaxial instability, cardiac defects (40-50%) | Neck flexion precaution; cardiac work-up |
| Goldenhar Syndrome | Hemifacial microsomia + cervical vertebral anomalies | Difficult airway + cervical spine instability |
| Cleft Type | Problem | Solution |
|---|---|---|
| Unilateral cleft lip | Laryngoscope blade slips into cleft | Place gauze roll or finger in cleft to stabilise |
| Bilateral cleft lip | Protruding premaxilla; difficult mask seal | Two-handed mask hold; Esmarch manoeuvre |
| Large/bilateral cleft palate | Tongue prolapses through cleft → obstruction; blade lodges in cleft | Keep tongue anterior; straight blade; videolaryngoscope ready |
| Retrognathia (Pierre Robin, Treacher Collins) | Severely difficult - small jaw, anterior larynx | Gas induction + spontaneous ventilation; fibreoptic bronchoscope; videolaryngoscope |
| Item | Choice | Reason |
|---|---|---|
| Cleft lip | South-facing oral RAE tube secured to chin | Keeps circuit away from surgical field |
| Cleft palate | South-facing oral RAE tube secured midline at chin | Passes through Dingman mouth gag; gives surgeon full palatal exposure |
| ETT size | (Age/4) + 4 mm (uncuffed) | Leak at 20-25 cmH₂O; preferred <8 years |
| Fixation | Extremely secure fixation | Accidental extubation with surgeon working over airway = life-threatening |
RAE = Ring, Adair, Elwyn - named after inventors; created specifically for head and neck surgery.
Historical note: Philip Ayre (1937) invented the T-piece circuit specifically to improve anaesthesia for cleft lip/palate babies - this is why Ayre's T-piece is historically linked to paediatric anaesthesia.
Cleft Palate = AWAKE extubation (MANDATORY) Cleft Lip = Deep extubation acceptable (to prevent straining on suture line)
| Complication | Mechanism | Management |
|---|---|---|
| Airway obstruction | Posterior palatal displacement, oedema, haematoma | Awake extubation; lateral position; tongue suture; SpO₂ monitoring; re-intubation ready |
| Laryngospasm | Blood/secretions at larynx on extubation | CPAP + jaw thrust + propofol 0.5 mg/kg; succinylcholine 2 mg/kg if complete |
| Bleeding | Palatal vascularity | Swallowed blood → vomiting; return to OT if significant |
| PONV | Swallowed blood + opioids | Ondansetron 0.1 mg/kg; dexamethasone at induction |
| Hypothermia | Large surface:mass ratio | Active warming throughout |
| Postoperative apnoea | Ex-premature infant <60 weeks PMA | Admit for monitoring; caffeine prophylaxis |
Factor affecting placental transfer of drugs and anaesthesia relivent it and md anaesthesia exams
~/pih-pdf/placental_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT
OUTPUT = "/tmp/workspace/pih-pdf/Placental_Transfer_Anaesthesia.pdf"
NAVY = colors.HexColor("#1A2F5A")
TEAL = colors.HexColor("#1A7A6E")
PURPLE = colors.HexColor("#5B2C8D")
RED = colors.HexColor("#B03A2E")
GREEN = colors.HexColor("#1A7A4A")
AMBER = colors.HexColor("#C67C00")
MID_BLU = colors.HexColor("#2B6CB0")
LT_BLUE = colors.HexColor("#EBF4FF")
LT_GRN = colors.HexColor("#E8F8F0")
LT_AMB = colors.HexColor("#FFF8E8")
LT_RED = colors.HexColor("#FFF0EE")
LT_PUR = colors.HexColor("#F5EEF8")
GREY_BG = colors.HexColor("#F4F6F8")
GREY_BD = colors.HexColor("#BDC3C7")
WHITE = colors.white
DARK = colors.HexColor("#1C1C1C")
W, H = A4
MARGIN = 13*mm
CW = W - 2*MARGIN
doc = SimpleDocTemplate(OUTPUT, pagesize=A4,
rightMargin=MARGIN, leftMargin=MARGIN,
topMargin=15*mm, bottomMargin=13*mm,
title="Placental Transfer of Drugs - Anaesthesia MD Exam Reference")
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, parent=styles["Normal"], **kw)
TH = S("TH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=10)
TD = S("TD", fontSize=7.8, textColor=DARK, fontName="Helvetica", alignment=TA_LEFT, leading=10)
TDB = S("TDB", fontSize=7.8, textColor=DARK, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
TDR = S("TDR", fontSize=7.8, textColor=RED, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
TDG = S("TDG", fontSize=7.8, textColor=GREEN, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
TDA = S("TDA", fontSize=7.8, textColor=AMBER, fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
TDP = S("TDP", fontSize=7.8, textColor=PURPLE,fontName="Helvetica-Bold", alignment=TA_LEFT, leading=10)
BODY = S("BODY", fontSize=8.2, textColor=DARK, fontName="Helvetica", spaceAfter=2, leading=11)
BODYB = S("BODYB", fontSize=8.2, textColor=DARK, fontName="Helvetica-Bold", spaceAfter=2, leading=11)
H2 = S("H2", fontSize=10, textColor=WHITE, fontName="Helvetica-Bold", leading=13)
H3 = S("H3", fontSize=9, textColor=NAVY, fontName="Helvetica-Bold", leading=12, spaceBefore=4, spaceAfter=2)
EXAM = S("EXAM", fontSize=8, textColor=PURPLE, fontName="Helvetica-Bold", leading=11, spaceAfter=2)
WARN = S("WARN", fontSize=8, textColor=RED, fontName="Helvetica-Bold", leading=11, spaceAfter=2)
SMALL = S("SMALL", fontSize=6.5, textColor=colors.grey, fontName="Helvetica", alignment=TA_CENTER, leading=9)
FORMULA = S("FORM",fontSize=8.5, textColor=MID_BLU, fontName="Helvetica-Bold", alignment=TA_CENTER, leading=12)
def sec_hdr(text, color=NAVY):
t = Table([[Paragraph(text, H2)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),color),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def exam_box(txt):
t = Table([[Paragraph("★ " + txt, EXAM)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),LT_PUR),
("BOX",(0,0),(-1,-1),0.8,PURPLE),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def warn_box(txt):
t = Table([[Paragraph("⚠ " + txt, WARN)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),colors.HexColor("#FFF3CD")),
("BOX",(0,0),(-1,-1),0.8,AMBER),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def info_box(txt, bg=LT_BLUE, bd=MID_BLU):
t = Table([[Paragraph(txt, BODY)]], colWidths=[CW])
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),bg),
("BOX",(0,0),(-1,-1),0.7,bd),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),
]))
return t
def mktbl(headers, rows, cws, hbg=NAVY):
data = [[Paragraph(h, TH) for h in headers]]
for row in rows:
data.append([Paragraph(str(c[0]),c[1]) if isinstance(c,tuple) else Paragraph(str(c),TD) for c in row])
t = Table(data, colWidths=cws, repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,0),hbg),
("ROWBACKGROUNDS",(0,1),(-1,-1),[WHITE,GREY_BG]),
("BOX",(0,0),(-1,-1),0.5,GREY_BD),("GRID",(0,0),(-1,-1),0.3,GREY_BD),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
("TOPPADDING",(0,0),(-1,-1),4),("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),5),
]))
return t
def banner():
d = [[
Paragraph("PLACENTAL<br/>DRUG TRANSFER", S("BT", fontSize=16, textColor=WHITE,
fontName="Helvetica-Bold", leading=20)),
Paragraph("Factors, Mechanisms & Anaesthetic Drug Profiles<br/>"
"<font size=9>MD Anaesthesia Exam Reference | Obstetric Pharmacology</font>",
S("BS", fontSize=12, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_LEFT, leading=16)),
Paragraph("Miller's · Morgan & Mikhail<br/>Barash · Goodman & Gilman",
S("BR", fontSize=7, textColor=colors.HexColor("#B0C4DE"),
fontName="Helvetica", alignment=TA_RIGHT, leading=10))
]]
b = Table(d, colWidths=[48*mm, 110*mm, 22*mm])
b.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),NAVY),
("TOPPADDING",(0,0),(-1,-1),10),("BOTTOMPADDING",(0,0),(-1,-1),10),
("LEFTPADDING",(0,0),(-1,-1),8),("VALIGN",(0,0),(-1,-1),"MIDDLE"),
]))
return b
story = []
story.append(banner())
story.append(Spacer(1,4*mm))
# ── SECTION 1: MECHANISMS ───────────────────────────────────────────────────
story.append(sec_hdr("1. MECHANISMS OF PLACENTAL DRUG TRANSFER"))
story.append(Spacer(1,2*mm))
mech_rows = [
[("Simple (Passive) Diffusion", TDB),
("MOST COMMON mechanism", TDB),
"Follows Fick's law. Non-ionized, lipid-soluble, low-MW drugs. Driven by concentration gradient."],
[("Facilitated Diffusion", TD),
"Carrier-mediated; no energy",
"Glucose, some vitamins. Faster than simple diffusion for specific molecules."],
[("Active Transport", TD),
"ATP-dependent carriers (ABC transporters)",
"Amino acids, nucleosides. ABC efflux transporters actively REMOVE drugs from fetal circulation back to mother — protective role."],
[("Pinocytosis / Vesicular", TD),
"Endocytosis of large molecules",
"IgG, some proteins. Minor role for drugs."],
]
story.append(mktbl(
["Mechanism", "Key Feature", "Examples / Notes"],
mech_rows, [42*mm, 40*mm, CW-82*mm]
))
story.append(Spacer(1,2*mm))
# Fick's Law Box
fick_tbl = Table([[
Paragraph("FICK'S LAW OF DIFFUSION", S("FH", fontSize=8.5, textColor=NAVY,
fontName="Helvetica-Bold", alignment=TA_CENTER, leading=11)),
Paragraph("Q/t = K × A × (Cm − Cf) / D",
S("FF", fontSize=11, textColor=MID_BLU, fontName="Helvetica-Bold",
alignment=TA_CENTER, leading=14)),
Paragraph(
"Q/t = Rate of diffusion | K = Diffusion constant (depends on MW, lipophilicity) | "
"A = Placental surface area | Cm = Maternal free drug concentration | "
"Cf = Fetal free drug concentration | D = Membrane thickness",
S("FN", fontSize=7, textColor=DARK, fontName="Helvetica", leading=10))
]], colWidths=[38*mm, 60*mm, CW-98*mm])
fick_tbl.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),LT_BLUE),
("BOX",(0,0),(-1,-1),0.8,MID_BLU),
("INNERGRID",(0,0),(-1,-1),0.3,GREY_BD),
("VALIGN",(0,0),(-1,-1),"MIDDLE"),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),6),
]))
story.append(fick_tbl)
story.append(Spacer(1,3*mm))
# ── SECTION 2: FACTORS ──────────────────────────────────────────────────────
story.append(sec_hdr("2. FACTORS AFFECTING PLACENTAL DRUG TRANSFER", color=TEAL))
story.append(Spacer(1,2*mm))
# Two columns: Drug factors | Physiological/Placental factors
col1_items = [
("<b>DRUG-RELATED FACTORS</b>", BODYB),
("<b>1. Molecular Weight (MW)</b>", BODYB),
(" • MW <500 Da: freely cross placenta (most anaesthetic drugs)", BODY),
(" • MW 500–1000 Da: restricted transfer", BODY),
(" • MW >1000 Da: minimal transfer (heparin 15,000 Da, insulin 6000 Da)", BODY),
("", BODY),
("<b>2. Lipid Solubility</b>", BODYB),
(" • Higher lipophilicity = faster, greater transfer", BODY),
(" • Volatile agents, propofol, benzodiazepines: highly lipophilic → cross freely", BODY),
(" • Muscle relaxants: low lipophilicity → minimal transfer", BODY),
("", BODY),
("<b>3. Ionisation (pKa)</b>", BODYB),
(" • Only NON-IONISED form crosses placenta", BODY),
(" • Degree of ionisation determined by pKa and pH (Henderson-Hasselbalch)", BODY),
(" • Basic drugs (pKa >7.4): mostly non-ionised at maternal pH 7.4 → cross easily", BODY),
(" • Highly ionised drugs (quaternary ammonium): NMBAs, glycopyrrolate → minimal transfer", BODY),
("", BODY),
("<b>4. Protein Binding</b>", BODYB),
(" • Only FREE (unbound) drug crosses placenta", BODY),
(" • High protein binding → slower, reduced transfer", BODY),
(" • Bupivacaine: 95% protein-bound → lower fetal levels than lidocaine", BODY),
(" • Fetal albumin lower than maternal → less fetal protein binding", BODY),
("", BODY),
("<b>5. Drug Concentration Gradient</b>", BODYB),
(" • Primary determinant of fetal drug levels", BODY),
(" • Higher maternal dose/bolus → higher fetal exposure", BODY),
(" • Maternal peak blood level timing relative to delivery matters", BODY),
]
col2_items = [
("<b>PHYSIOLOGICAL & PLACENTAL FACTORS</b>", BODYB),
("<b>6. Uteroplacental Blood Flow</b>", BODYB),
(" • Decreased flow → less drug delivery AND less drug washout from fetus", BODY),
(" • Reduced by: aortocaval compression, hypotension, vasopressors (α-agonists), uterine contractions", BODY),
(" • Maintained by: left lateral tilt, adequate BP, regional analgesia (↓ catecholamines)", BODY),
("", BODY),
("<b>7. Placental Surface Area & Thickness</b>", BODYB),
(" • ↑ Surface area → ↑ transfer (increases with gestation)", BODY),
(" • ↑ Thickness → ↓ transfer (1st trimester: thicker; term: thinner)", BODY),
(" • Placental pathology (abruption, infarction) alters transfer unpredictably", BODY),
("", BODY),
("<b>8. Maternal-Fetal pH Difference</b>", BODYB),
(" • Maternal pH: 7.40 | Fetal pH: 7.32–7.35 (slightly acidic)", BODY),
(" • Creates ION TRAPPING for basic drugs (local anaesthetics, opioids)", BODY),
(" • In fetal distress (acidosis pH <7.20): MORE ion trapping → drug accumulates in fetus", BODY),
("", BODY),
("<b>9. ABC Efflux Transporters</b>", BODYB),
(" • P-glycoprotein (MDR1), BCRP in placenta: pump drugs BACK to maternal side", BODY),
(" • Protective mechanism against fetal drug accumulation", BODY),
("", BODY),
("<b>10. Timing of Administration</b>", BODYB),
(" • Single IV bolus during uterine contraction (↓ blood flow): minimal fetal levels", BODY),
(" • Drug given hours before delivery: redistribution and metabolism reduces fetal effect", BODY),
(" • Epidural/intrathecal: slower absorption → lower maternal peak → lower fetal transfer", BODY),
("", BODY),
("<b>11. Fetal Hepatic First-Pass Effect</b>", BODYB),
(" • ~75% of umbilical venous blood passes through fetal liver first", BODY),
(" • Partial metabolism before reaching fetal brain/heart", BODY),
]
def make_col(items):
return [Paragraph(t, s) for t,s in items]
two_col = Table([[make_col(col1_items), make_col(col2_items)]],
colWidths=[CW/2 - 1*mm, CW/2 - 1*mm])
two_col.setStyle(TableStyle([
("VALIGN",(0,0),(-1,-1),"TOP"),
("BOX",(0,0),(-1,-1),0.5,GREY_BD),
("INNERGRID",(0,0),(-1,-1),0.3,GREY_BD),
("BACKGROUND",(0,0),(0,0),colors.HexColor("#F0F7FF")),
("BACKGROUND",(1,0),(1,0),colors.HexColor("#F0FFF4")),
("TOPPADDING",(0,0),(-1,-1),6),("BOTTOMPADDING",(0,0),(-1,-1),4),
("LEFTPADDING",(0,0),(-1,-1),6),
]))
story.append(two_col)
story.append(Spacer(1,2*mm))
# Ion trapping box
story.append(exam_box(
"ION TRAPPING (Critical Exam Concept): Fetal pH is lower than maternal pH (7.32 vs 7.40). "
"Weakly BASIC drugs (local anaesthetics pKa 7.7–8.1, opioids) cross as non-ionised molecules, "
"then become ionised in the acidic fetal environment and CANNOT cross back → drug accumulates. "
"Fetal distress (acidosis) WORSENS ion trapping → higher fetal drug levels."
))
story.append(Spacer(1,2*mm))
# UV/MV ratio
story.append(info_box(
"MEASUREMENT OF PLACENTAL TRANSFER: "
"UV/MV ratio = Umbilical Vein / Maternal Vein drug concentration = degree of placental transfer. "
"UA/UV ratio = Umbilical Artery / Umbilical Vein = degree of fetal tissue uptake. "
"Values close to 1.0 = complete equilibration."
))
story.append(Spacer(1,3*mm))
# ── PAGE 2 ──────────────────────────────────────────────────────────────────
story.append(PageBreak())
story.append(banner())
story.append(Spacer(1,4*mm))
# ── SECTION 3: ANAESTHETIC DRUGS ────────────────────────────────────────────
story.append(sec_hdr("3. ANAESTHETIC DRUG PROFILES — PLACENTAL TRANSFER", color=colors.HexColor("#2E4057")))
story.append(Spacer(1,2*mm))
# Induction agents
story.append(Paragraph("3a. Induction Agents", H3))
ind_rows = [
[("Thiopentone", TDB), "High", "Low MW, high lipophilicity",
("Readily crosses; peaks in fetus 1–2 min", TDB),
"Induction dose (4–6 mg/kg) — fetal drug diluted by redistribution; minimal neonatal depression at usual doses"],
[("Propofol", TDB), "High", "Very high lipophilicity",
("Freely crosses; UV/MV ~0.7", TDB),
"Fetal depression possible at high doses; redistribution limits effect; can cause transient neonatal sedation"],
[("Ketamine", TDB), "High", "Moderate lipophilicity",
("Crosses readily", TDB),
"At <1.5 mg/kg: minimal neonatal effect. At >2 mg/kg: neonatal depression + uterine hypertonus"],
[("Etomidate", TD), "Moderate", "Moderate", "Crosses placenta",
"Minimal uteroplacental effect; adrenal suppression in fetus possible"],
[("Midazolam", TDA), "High", "High lipophilicity, pKa 6.2",
("Crosses freely; accumulates with repeated doses", TDA),
"Single anxiolytic dose: no measurable fetal effect. Large/repeated doses → neonatal sedation (FLIPFLOP)"],
]
story.append(mktbl(
["Drug", "Transfer", "Properties", "Fetal Level", "Clinical Note"],
ind_rows, [25*mm, 18*mm, 32*mm, 32*mm, CW-107*mm]
))
story.append(Spacer(1,2*mm))
# Volatile agents
story.append(Paragraph("3b. Volatile Anaesthetic Agents", H3))
story.append(info_box(
"ALL volatile agents (halothane, isoflurane, sevoflurane, desflurane) are highly lipophilic with "
"low molecular weights → FREELY cross placenta. At <1 MAC with delivery within 10 min of induction, "
"minimal neonatal depression occurs. Nitrous oxide also crosses freely but has minimal fetal depression at usual doses. "
"Volatile agents cause dose-dependent uterine relaxation (↑ haemorrhage risk at >1.5 MAC).",
bg=LT_GRN, bd=GREEN
))
story.append(Spacer(1,2*mm))
# Opioids
story.append(Paragraph("3c. Opioids", H3))
op_rows = [
[("Morphine", TDR), "High", ("++", TDB), ("Most respiratory depression in neonate; sensitive to morphine", TDR),
"Avoid within 4h of delivery if possible; naloxone reversal available"],
[("Pethidine (Meperidine)", TDA), "High", ("++", TDB),
("Peak neonatal depression 1–3h post maternal IV dose", TDA),
"Active metabolite norpethidine accumulates; avoid if delivery within 1–3h"],
[("Fentanyl", TDG), "High", ("+", TDB),
("Minimal neonatal effect at IV doses <1 mcg/kg", TDG),
"Epidural/intrathecal: very low fetal concentrations → safe for labour"],
[("Sufentanil", TDG), "High", ("+", TDB),
("Minimal neonatal effect (epidural doses)", TDG),
"Very high protein binding limits fetal transfer"],
[("Remifentanil", TDA),"High", ("++", TDA),
("UV/MV ~0.5; potential neonatal depression", TDA),
"Rapidly metabolised in neonate (UA/UV ~30%) — self-limiting; used for labour IV-PCA"],
[("Alfentanil", TDR), "High", ("++", TDB),
"Neonatal depression similar to pethidine",
"Avoid near delivery"],
[("Butorphanol/Nalbuphine", TD), "High", ("+", TD),
"Less respiratory depression than morphine",
"Significant neurobehavioural effects in neonate"],
]
story.append(mktbl(
["Opioid", "Transfer", "Neonatal Resp. Depression", "Key Feature", "Clinical Note"],
op_rows, [28*mm, 16*mm, 28*mm, 48*mm, CW-120*mm]
))
story.append(Spacer(1,2*mm))
# Local anaesthetics
story.append(Paragraph("3d. Local Anaesthetics (Weak Bases — pKa 7.7–8.1)", H3))
la_rows = [
[("Chloroprocaine", TDG), "LEAST", "Ester; rapidly hydrolysed by maternal plasma cholinesterase",
("Minimal fetal accumulation — short plasma half-life in mother", TDG),
"Preferred if high fetal transfer is a concern (e.g. fetal acidosis)"],
[("Bupivacaine", TDB), "Low–Moderate", "95% protein-bound to α1-acid glycoprotein",
"Lower fetal/maternal ratio than lidocaine due to high protein binding",
"Cardiotoxic to fetus at high doses; ion trapping in acidosis worsens accumulation"],
[("Ropivacaine", TDB), "Low–Moderate", "94% protein-bound; less lipophilic than bupivacaine",
"Lower fetal transfer than bupivacaine",
"Improved fetal safety profile vs bupivacaine"],
[("Lidocaine", TDA), "Moderate", "65% protein-bound; pKa 7.9",
"Higher fetal/maternal ratio than bupivacaine",
"Ion trapping in fetal acidosis — can accumulate; avoid high epidural doses near delivery"],
[("Levobupivacaine", TDB),"Low–Moderate", "97% protein-bound",
"Similar to bupivacaine but less cardiac toxicity",
"Preferred over racemic bupivacaine by many"],
]
story.append(mktbl(
["Drug", "Fetal Transfer", "Key Property", "Fetal Profile", "Clinical Note"],
la_rows, [32*mm, 26*mm, 42*mm, 38*mm, CW-138*mm]
))
story.append(Spacer(1,1*mm))
story.append(exam_box(
"LOCAL ANAESTHETIC PLACENTAL TRANSFER (rank order, least to most): "
"Chloroprocaine < Bupivacaine ≈ Ropivacaine < Lidocaine — "
"determined by protein binding (higher binding = less free drug = less transfer) "
"AND ester hydrolysis in maternal plasma (chloroprocaine)."
))
story.append(Spacer(1,2*mm))
# NMBAs
story.append(Paragraph("3e. Neuromuscular Blocking Agents (NMBAs)", H3))
nmba_rows = [
[("All NMBAs", TDG), "MINIMAL", "Highly ionised (quaternary ammonium); high MW; low lipophilicity",
("Fetus/neonate NOT paralysed after maternal GA", TDG),
"Safe to use for RSI at LSCS; succinylcholine also has minimal transfer despite low MW (highly ionised)"],
[("Sugammadex", TDG), "MINIMAL (expected)", "Large MW; negatively charged",
"Not expected to cross significantly",
"Evidence still limited; generally considered safe"],
[("Neostigmine", TD), "Some", "Quaternary amine; limited transfer",
"Some transfer but limited clinical effect",
"Maternal reversal of NMBAs acceptable"],
[("Glycopyrrolate", TDG), "MINIMAL", "Quaternary ammonium (ionised)",
("Does NOT cross — preferred anticholinergic in obstetrics", TDG),
"Use glycopyrrolate, NOT atropine, to treat bradycardia without fetal tachycardia"],
[("Atropine / Scopolamine", TDA), "Significant", "Tertiary amines, lipophilic",
"Cross placenta → fetal tachycardia",
"Atropine used for fetal bradycardia treatment (crosses intentionally)"],
]
story.append(mktbl(
["Drug", "Transfer", "Mechanism", "Fetal Effect", "Clinical Note"],
nmba_rows, [30*mm, 22*mm, 46*mm, 36*mm, CW-134*mm]
))
story.append(Spacer(1,2*mm))
# Other drugs
story.append(Paragraph("3f. Other Clinically Important Drugs", H3))
other_rows = [
[("Heparin (unfractionated)", TDG), "NONE", "MW 15,000 Da; highly charged",
("Does NOT cross — anticoagulant of choice in pregnancy", TDG)],
[("Warfarin", TDR), "Complete", "Low MW, lipophilic, non-ionised",
("Freely crosses → fetal anticoagulation, teratogenesis (Weeks 6–12), CNS anomalies", TDR)],
[("Ephedrine", TDA), "High", "Lipophilic, low MW",
"Crosses freely; fetal acidosis reported with high doses (vasopressor choice shifting to phenylephrine)"],
[("Phenylephrine", TDB), "Moderate", "Crosses but better fetal pH profile than ephedrine",
"Now preferred vasopressor for spinal hypotension at LSCS"],
[("Labetalol", TD), "High", "Crosses placenta readily",
"Neonatal bradycardia + hypoglycaemia possible; monitor neonate"],
[("Dexamethasone", TDB), "High", "Fluorinated, crosses easily",
"Intentional use: fetal lung maturation; avoid prolonged maternal use"],
[("Insulin", TDG), "NONE", "MW 6000 Da",
"Does NOT cross; maternal glucose control protects fetus indirectly"],
[("Benzodiazepines", TDR), "High", "Lipophilic; pKa ~6",
("Cross readily; neonatal withdrawal, hypotonia, temperature instability (FLIPFLOP syndrome)", TDR)],
[("Dexmedetomidine", TDA), "Stored in placenta", "Lipophilic but sequestered",
"Stored in placenta; reduced transfer to fetus; neonatal effects minimal in clinical doses"],
[("Neostigmine + pyridostigmine", TDB), "Minimal", "Quaternary ammonium",
"Pyridostigmine used in MG; minimal transfer; monitor neonate for cholinergic effects"],
]
story.append(mktbl(
["Drug", "Transfer", "Mechanism / Property", "Clinical Significance"],
other_rows, [35*mm, 20*mm, 50*mm, CW-105*mm]
))
story.append(Spacer(1,2*mm))
story.append(warn_box(
"WARFARIN crosses the placenta COMPLETELY (low MW, lipophilic) causing: "
"(1) Warfarin embryopathy (nasal hypoplasia, bone stippling) if exposed weeks 6–12; "
"(2) Fetal anticoagulation → haemorrhage; (3) CNS anomalies. "
"Use HEPARIN instead — it does NOT cross the placenta."
))
story.append(Spacer(1,3*mm))
# ── SECTION 4: HIGH-YIELD EXAM SUMMARY ──────────────────────────────────────
story.append(sec_hdr("4. HIGH-YIELD MD EXAM SUMMARY", color=colors.HexColor("#1A5276")))
story.append(Spacer(1,2*mm))
exam_pts = [
"Fick's Law: Transfer ∝ Surface area × Concentration gradient × Diffusion constant / Membrane thickness",
"Most important determinant of fetal drug level = MATERNAL BLOOD CONCENTRATION (dose given to mother)",
"Only FREE (unbound) drug crosses — protein binding reduces transfer (bupivacaine 95% bound = lower fetal levels)",
"Only NON-IONISED form crosses — ionisation prevents transfer (NMBAs, glycopyrrolate, heparin)",
"ION TRAPPING: basic drugs (LA, opioids) become ionised in acidic fetal pH (7.32) and cannot cross back",
"Fetal distress/acidosis → MORE ion trapping → HIGHER fetal levels of local anaesthetics and opioids",
"MW <500 Da: cross freely | 500–1000 Da: restricted | >1000 Da: minimal (heparin, insulin)",
"Drugs crossing blood-brain barrier ALSO cross placenta — rule of thumb for CNS-active drugs",
"Chloroprocaine = least placental transfer among LAs (rapid hydrolysis in maternal plasma)",
"Glycopyrrolate = does NOT cross (quaternary ammonium) — use over atropine to avoid fetal tachycardia",
"NMBAs (all): minimal transfer → neonates NOT paralysed after maternal GA for LSCS",
"Succinylcholine: low MW but highly ionised → minimal transfer despite small size",
"Warfarin = freely crosses → use HEPARIN in pregnancy (does NOT cross)",
"Opioid neonatal respiratory depression ranking: Morphine > Pethidine > Alfentanil > Fentanyl (epidural)",
"Pethidine peak neonatal depression: 1–3 hours after maternal IV administration",
"Remifentanil: crosses rapidly (UV/MV ~0.5) but rapidly metabolised in neonate (UA/UV ~30%)",
"Fetal hepatic first-pass: ~75% umbilical venous blood passes through fetal liver → partial metabolism",
"ABC efflux transporters (P-gp, BCRP) in placenta: pump drugs BACK to maternal side — protective",
"UV/MV ratio = measure of placental transfer | UA/UV ratio = measure of fetal tissue uptake",
"Dexmedetomidine: stored in placenta, reduced fetal transfer despite lipophilicity",
]
for i, pt in enumerate(exam_pts, 1):
story.append(Paragraph(f" <b>{i}.</b> {pt}", BODY))
story.append(Spacer(1,2*mm))
# Quick reference table: drugs that DON'T vs DO cross
story.append(Paragraph("Quick Reference — Does It Cross the Placenta?", H3))
cross_rows = [
[("ALL volatile anaesthetics", TDR), ("YES — freely", TDR), "High lipophilicity, low MW"],
[("Propofol", TDR), ("YES — freely", TDR), "Very lipophilic"],
[("Thiopentone", TDR), ("YES — freely", TDR), "Lipophilic, low MW"],
[("Ketamine", TDR), ("YES — freely", TDR), "Lipophilic"],
[("Benzodiazepines", TDR), ("YES — freely", TDR), "Lipophilic (risk: neonatal withdrawal)"],
[("Opioids (most)", TDR), ("YES — varies", TDR), "Morphine > pethidine > fentanyl (epidural)"],
[("Lidocaine", TDA), ("YES — moderate", TDA), "65% protein bound; ion trapping risk"],
[("Bupivacaine/Ropivacaine", TDB), ("YES — low", TDB), "High protein binding limits transfer"],
[("Chloroprocaine", TDG), ("MINIMAL", TDG), "Rapid hydrolysis in maternal plasma"],
[("NMBAs (all)", TDG), ("MINIMAL/NO", TDG), "Highly ionised quaternary ammonium"],
[("Succinylcholine", TDG), ("MINIMAL", TDG), "Highly ionised despite low MW"],
[("Glycopyrrolate", TDG), ("NO", TDG), "Quaternary ammonium, ionised"],
[("Heparin (UFH/LMWH)", TDG),("NO", TDG), "MW 15,000 Da, highly charged"],
[("Insulin", TDG), ("NO", TDG), "MW 6,000 Da"),
[("Warfarin", TDR), ("YES — completely", TDR), "Low MW, lipophilic — AVOID in pregnancy"],
[("Atropine/Scopolamine", TDR), ("YES", TDR), "Tertiary amines; lipophilic — fetal tachycardia"],
[("Sugammadex", TDG), ("MINIMAL (expected)", TDG), "Large MW, negatively charged"],
]
story.append(mktbl(
["Drug", "Crosses Placenta?", "Reason"],
cross_rows, [55*mm, 35*mm, CW-90*mm]
))
story.append(Spacer(1,3*mm))
story.append(HRFlowable(width=CW, thickness=0.5, color=GREY_BD))
story.append(Spacer(1,2*mm))
story.append(Paragraph(
"Sources: Miller's Anesthesia 10e · Morgan & Mikhail's Clinical Anesthesiology 7e · "
"Barash, Cullen & Stoelting's Clinical Anesthesia 9e · Goodman & Gilman's Pharmacological Basis of Therapeutics 14e",
SMALL
))
story.append(Paragraph(
"Generated by Orris Medical AI · For educational use only · Verify against current references",
S("FW", fontSize=6, textColor=RED, fontName="Helvetica-Oblique", alignment=TA_CENTER)
))
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /tmp/workspace/pih-pdf && python placental_pdf.py 2>&1
~/pih-pdf/placental_pdf.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/pih-pdf/placental_pdf.py'
cd /tmp/workspace/pih-pdf && python placental_pdf.py 2>&1
Placental Transfer Anaesthesia
PDF Document · PDF
| Mechanism | Key Feature | Notes |
|---|---|---|
| Simple (Passive) Diffusion | Most common | Follows Fick's Law; driven by concentration gradient |
| Facilitated Diffusion | Carrier-mediated, no energy | Glucose, some vitamins |
| Active Transport (ABC transporters) | ATP-dependent | ABC efflux transporters (P-gp, BCRP) pump drugs BACK to mother - protective |
| Pinocytosis | Vesicular transport | Large molecules (IgG); minor role for drugs |
Q/t = K × A × (Cm - Cf) / D
| Drug | Transfer | Key Notes |
|---|---|---|
| Thiopentone | High | Freely crosses; peaks in fetus in 1-2 min; usual induction dose - minimal neonatal depression due to redistribution |
| Propofol | High (UV/MV ~0.7) | Freely crosses; redistribution limits neonatal effect; can cause transient sedation |
| Ketamine | High | <1.5 mg/kg: minimal neonatal effect; >2 mg/kg: neonatal depression + uterine hypertonus |
| Midazolam | High | Single dose: no measurable fetal effect; repeated/large doses → neonatal sedation, hypotonia, hypothermia (FLIPFLOP syndrome) |
| Opioid | Neonatal Resp. Depression | Key Point |
|---|---|---|
| Morphine | Most (highest sensitivity) | Neonates most sensitive; avoid near delivery |
| Pethidine (Meperidine) | High | Peak neonatal effect 1-3 hours after maternal IV dose; active metabolite norpethidine accumulates |
| Alfentanil | High (similar to pethidine) | Avoid near delivery |
| Remifentanil | Moderate (UV/MV ~0.5) | Rapidly metabolised in neonate (UA/UV ~30%); self-limiting; used for IV-PCA in labour |
| Fentanyl (IV) | Low (<1 mcg/kg) | Minimal neonatal effect at analgesic doses |
| Fentanyl (epidural/IT) | Minimal | Very low systemic absorption → very low fetal levels |
| Sufentanil | Minimal | Very high protein binding limits transfer |
| Butorphanol/Nalbuphine | Low respiratory depression | Significant neurobehavioural depression still occurs |
Chloroprocaine < Bupivacaine ≈ Ropivacaine < Lidocaine
| Drug | Transfer | Reason |
|---|---|---|
| Chloroprocaine | LEAST | Rapidly hydrolysed by maternal plasma cholinesterase → minimal drug reaches placenta |
| Bupivacaine | Low-moderate | 95% protein-bound → low free drug fraction |
| Ropivacaine | Low-moderate | 94% protein-bound; less lipophilic than bupivacaine |
| Lidocaine | Moderate | Only 65% protein-bound → more free drug available; more ion trapping risk |
| Levobupivacaine | Low-moderate | 97% protein-bound; less cardiac toxicity than racemic bupivacaine |
| Drug | Transfer | Reason |
|---|---|---|
| Rocuronium, Vecuronium, Atracurium, Cisatracurium | Minimal | Quaternary ammonium + high MW |
| Succinylcholine | Minimal | Low MW BUT highly ionised - ionisation prevents transfer |
| Glycopyrrolate | NONE | Quaternary ammonium - use INSTEAD of atropine to avoid fetal tachycardia |
| Atropine / Scopolamine | Significant | Tertiary amines, lipophilic → fetal tachycardia |
| Sugammadex | Minimal (expected) | Large MW, negatively charged |
| Drug | Transfer | Significance |
|---|---|---|
| Heparin (UFH & LMWH) | NONE | MW 15,000 Da, highly charged - anticoagulant of choice in pregnancy |
| Warfarin | Complete | MW 308 Da, lipophilic - causes warfarin embryopathy (weeks 6-12), fetal anticoagulation, CNS anomalies |
| Insulin | NONE | MW 6,000 Da - does not cross |
| Ephedrine | High | Fetal acidosis with repeated doses - phenylephrine now preferred |
| Phenylephrine | Moderate | Better fetal pH profile than ephedrine for spinal hypotension at LSCS |
| Labetalol | High | Neonatal bradycardia + hypoglycaemia - monitor neonate |
| Benzodiazepines | High | Neonatal withdrawal, hypotonia, hypothermia, feeding difficulties - FLIPFLOP syndrome |
| Dexmedetomidine | Stored in placenta | Sequestered; reduced fetal transfer despite lipophilicity |
| Metoclopramide, antihistamines | Yes | Cross but limited neonatal clinical effect at standard doses |