All about Loop diuretics in pointer form for my pharma exam

Reading File
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
I now have comprehensive information from Goodman & Gilman, Katzung, and Lippincott. Let me compile the complete exam-ready pointer notes.

Loop Diuretics - Complete Exam Notes


1. CLASSIFICATION / DRUGS

  • Also called "high-ceiling diuretics" - most potent diuretics available
  • Four clinically used agents:
    • Furosemide (most commonly used)
    • Bumetanide (most potent - 40x relative to furosemide)
    • Torsemide
    • Ethacrynic acid (only non-sulfonamide)

2. CHEMISTRY

DrugChemical Class
FurosemideSulfonamide
BumetanideSulfonamide
TorsemideSulfonylurea
Ethacrynic acidPhenoxyacetic acid derivative (NOT a sulfonamide)
  • Ethacrynic acid is the only loop diuretic safe in patients with sulfonamide allergy

3. SITE OF ACTION

  • Act on the thick ascending limb (TAL) of the loop of Henle - luminal side
  • Specifically inhibit the NKCC2 (Na+/K+/2Cl- cotransporter/symporter) on the apical/luminal membrane
  • TAL normally reabsorbs ~25% of filtered Na+ load
  • Segments distal to TAL cannot compensate - hence maximum diuretic effect
  • Must be secreted into tubular lumen (proximal tubule) to act - act from inside the lumen

4. MECHANISM OF ACTION

  • Block NKCC2 → prevent Na+, K+, Cl- reabsorption from lumen into epithelial cells
  • Elimination of lumen-positive electrical potential (normally generated by K+ recycling back into lumen via ROMK channels)
  • This lumen-positive potential normally drives reabsorption of divalent cations (Ca2+, Mg2+) paracellularly → its loss increases Ca2+ and Mg2+ excretion
  • Block the concentrating ability of the kidney (TAL is essential for building hyperosmotic medullary interstitium)
  • Also block diluting ability (TAL is part of the diluting segment)
  • Furosemide also has weak carbonic anhydrase-inhibiting activity → mild increase in HCO3- and phosphate excretion

5. PHARMACOKINETICS

ParameterFurosemideBumetanideTorsemideEthacrynic acid
Oral bioavailability~60% (variable)~80%~80% (rapid, near 100%)~100%
t1/2~1.5 hr~0.8 hr~3.5 hr~1 hr
Duration of action2-3 hrSimilar to torsemide4-6 hr-
Elimination~65% renal, ~35% metabolism~62% renal, ~38% hepatic~20% renal, ~80% hepatic~67% renal, ~33% metabolism
Equivalent dose20 mg0.5 mg10 mg~50 mg
Key pharmacokinetics points:
  • All are highly protein-bound → reach tubules mainly by active secretion (not filtration)
  • NSAIDs and probenecid compete with loop diuretics for organic acid secretion in the proximal tubule → reduce diuretic effect
  • Torsemide has the most consistent (reliable) oral absorption and longer duration - preferred in heart failure for fewer hospitalizations
  • Furosemide absorption is most variable
  • Furosemide is mainly eliminated by the kidney; torsemide mainly by the liver

6. EFFECTS ON URINARY EXCRETION (What is excreted MORE)

  • Na+ - up to 25% of filtered load (maximum of all diuretics)
  • Cl- - markedly increased
  • K+ - increased (due to increased distal Na+ delivery → Na-K exchange; also flow-dependent secretion, vasopressin release, RAS activation)
  • H+ - increased (H+ secretion at collecting duct)
  • Ca2+ - increased (hypercalciuric) - opposite of thiazides
  • Mg2+ - increased (can cause hypomagnesemia)
  • HCO3- - slightly increased (furosemide only - carbonic anhydrase inhibition)
  • Uric acid - acutely increased; chronically decreased/retained (hyperuricemia with chronic use)

7. EFFECTS ON RENAL HEMODYNAMICS

  • Increase total renal blood flow (RBF) - via prostaglandin (PG)-mediated vasodilation
  • NSAIDs blunt the diuretic response by blocking PG synthesis
  • Block tubuloglomerular feedback (TGF) - by inhibiting NaCl transport at macula densa → do NOT decrease GFR (unlike carbonic anhydrase inhibitors)
  • Are powerful stimulators of renin release - via macula densa NaCl transport blockade + sympathetic activation + baroreceptor stimulation

8. OTHER ACTIONS

  • Venodilation - furosemide acutely increases systemic venous capacitance → decreases left ventricular filling pressure → relieves pulmonary edema even before diuresis begins (mediated by PGs, requires intact kidneys)
  • Reduce pulmonary congestion before any measurable urine output - important in acute pulmonary edema management

9. THERAPEUTIC USES (Indications)

  1. Acute pulmonary edema - drug of choice; rapid venodilation + natriuresis
  2. Chronic congestive heart failure - reduce extracellular fluid overload, venous/pulmonary congestion; reduce mortality and hospitalizations
  3. Edematous states - nephrotic syndrome edema (often refractory to other diuretics), hepatic cirrhosis (ascites - careful to avoid volume contraction), peripheral edema
  4. Hypertension - NOT first-line in normal renal function; drug of choice when GFR <30 mL/min or in resistant hypertension
  5. Hypercalcemia - loop diuretics + IV saline infusion (prevents volume depletion while promoting Ca2+ excretion)
  6. Hyperkalemia - enhance urinary K+ excretion (along with other measures)
  7. Acute renal failure - can increase urine flow and K+ excretion, but do NOT prevent or shorten duration of renal failure
  8. Hyponatremia (severe/life-threatening) - loop diuretics + hypertonic saline
  9. Anion overdose (bromide, fluoride, iodide) - these anions are reabsorbed in TAL; loop diuretics promote their excretion
  10. Forced diuresis in drug overdose
  11. Chronic kidney disease (CKD) edema - effective even in poor renal function (unlike thiazides which fail at GFR <30)

10. ADVERSE EFFECTS / TOXICITY

Electrolyte / Fluid Disturbances

  • Hypokalemia - most common; increased distal Na+ delivery → K+ secretion; risk of cardiac arrhythmias (especially with digoxin)
  • Hyponatremia - less common than with thiazides; volume depletion triggers thirst → water intake can cause it
  • Hypomagnesemia - predictable with chronic use; K replacement fails without Mg replacement; risk of arrhythmias
  • Hypocalcemia - from hypercalciuria; loop diuretics are hypercalciuric (opposite of thiazides); rarely causes tetany
  • Metabolic alkalosis (hypochloremic) - increased H+ secretion distally; also Cl- loss
  • Volume depletion / dehydration - overzealous use → hypotension, reduced GFR, circulatory collapse, thromboembolic episodes
  • Hyperuricemia - chronic use; enhanced proximal tubular uric acid reabsorption due to volume depletion; can precipitate gout

Ototoxicity

  • Tinnitus, hearing impairment, deafness (usually but not always reversible), vertigo, sense of fullness in ears
  • Most common with rapid IV administration and in patients with renal impairment
  • Mechanism: inhibition of NKCC1 in the inner ear → disturbance of endolymph ion composition
  • Ethacrynic acid causes ototoxicity more often than other loop diuretics - reserved for sulfonamide-allergic patients
  • Risk increased with concurrent aminoglycoside antibiotics

Allergic Reactions (Sulfonamide drugs only)

  • Skin rash, eosinophilia, interstitial nephritis
  • Rare DRESS syndrome (furosemide)
  • Ethacrynic acid - much fewer allergic reactions (not a sulfonamide)

Others

  • Hyperglycemia (mild)
  • Furosemide: pseudoporphyria; chronic use may increase fracture risk (via hypercalciuria/bone effects)
  • Loop diuretics may worsen thiamine deficiency in heart failure patients
  • Avoid in postmenopausal osteopenic women (increased Ca2+ excretion harmful to bone)
  • Hepatic encephalopathy in liver disease patients (from electrolyte disturbances)

11. CONTRAINDICATIONS

  • Anuria / severe oliguria (sulfonamide-containing agents - use ethacrynic acid only if needed)
  • Sulfonamide hypersensitivity (for furosemide, bumetanide, torsemide - use ethacrynic acid instead)
  • Overzealous use in hepatic cirrhosis, borderline renal failure, or heart failure (risk of volume collapse)
  • Caution in patients with gout, diabetes, postmenopausal osteopenia

12. DRUG INTERACTIONS

DrugInteraction
NSAIDsReduce diuretic effect (block PG synthesis + compete for tubular secretion)
ProbenecidReduces tubular secretion of loop diuretics → reduced effect
AminoglycosidesAdditive ototoxicity
Digoxin/cardiac glycosidesHypokalemia from loop diuretics increases digoxin toxicity
CorticosteroidsAdditive hypokalemia
AntidiabeticsLoop diuretics may impair glucose tolerance
Other diuretics (K+-sparing)Combined to offset hypokalemia

13. COMPARISON - LOOP vs THIAZIDE DIURETICS (High-Yield)

FeatureLoop DiureticsThiazide Diuretics
SiteTAL of loop of HenleDistal convoluted tubule
Transporter blockedNKCC2NCC (Na+/Cl- cotransporter)
PotencyHigh (up to 25% Na+ excreted)Moderate
Effective in GFR <30YesNo (except metolazone)
Calcium excretionIncreased (hypercalciuric)Decreased (hypocalciuric)
Use in hypercalcemiaYesNo
Hypertension (1st line)No (unless GFR <30 or resistant)Yes

14. QUICK-RECALL MNEMONICS

  • "BEAT" - Bumetanide, Ethacrynic acid, Azosemide (not in US), Torsemide, (Furosemide - F for Free / most common)
  • Loop diuretics LOSE - Losing K+, Ca2+, Mg2+, Na+, Cl-; Ototoxicity; Sulfonamide allergy risk; Excrete uric acid acutely (retain chronically)
  • Ethacrynic acid is "different" - not a sulfonamide, highest ototoxicity, use in sulfa-allergic patients

Sources: Goodman & Gilman's The Pharmacological Basis of Therapeutics; Katzung's Basic and Clinical Pharmacology, 16th Edition; Lippincott Illustrated Reviews: Pharmacology

Is there any trick related to pharmacokinetics which will apply on every drug ...

Asking for Preferences
Here are all the universal pharmacokinetics tricks that apply to every drug - master these and you can answer PK questions for any drug in your exam:

Universal Pharmacokinetics Tricks


TRICK 1 - The 5 Half-Life Rule (Most Exam-Tested)

"It takes exactly 5 half-lives to reach steady state AND to fully eliminate a drug."
This applies to every single drug, no exceptions.
Half-lives elapsed% Steady State reached% Drug eliminated
150%50%
275%75%
387.5%87.5%
493.75%~94%
5~97% (≈ 100%)~97% (≈ 100%)
Exam tricks from this rule:
  • If a drug has t1/2 = 6 hours → steady state reached in 30 hours
  • If a drug has t1/2 = 2 days → fully eliminated in 10 days (important before switching drugs)
  • Loading dose bypasses the 5 half-life wait - instantly achieves steady state concentration
  • If you double the dose, steady state level doubles but time to reach it does NOT change

TRICK 2 - Hepatic vs Renal Elimination = Dose Adjustment Rule

"Renally eliminated drugs need dose reduction in renal failure. Hepatically eliminated drugs need dose reduction in liver failure."
Universal formula to remember:
  • Drug mainly excreted unchanged in urinerenally eliminated → dose ↓ in renal failure, safe in liver disease
  • Drug mainly metabolized by liverhepatically eliminated → dose ↓ in liver failure, safe in renal disease
Applied to loop diuretics you just learned:
  • Furosemide: ~65% renal → dose adjust in renal failure
  • Torsemide: ~80% hepatic → dose adjust in liver failure, safer in renal failure
  • Bumetanide: 50/50 → adjust in both
Universal exam pattern:
  • Aminoglycosides, digoxin, lithium, metformin → renal elimination → contraindicated/dose reduce in renal failure
  • Warfarin, most statins, most benzodiazepines → hepatic → avoid in liver failure

TRICK 3 - Volume of Distribution (Vd) Trick

"Vd tells you WHERE the drug goes, not how much blood contains it."
VdWhere drug distributesExamples
Small (< 1 L/kg)Stays in plasma/ECFWarfarin, heparin, aminoglycosides
Medium (1-20 L/kg)Distributes to tissuesMost drugs
Large (> 20 L/kg)Concentrates in deep tissues/fatChloroquine, amiodarone, digoxin
Universal tricks:
  • Large Vd → longer t1/2 → harder to dialyze (drug is "hiding" in tissues, not in blood)
  • Small Vd → dialyzable (drug stays in blood, dialysis can remove it)
  • Loading dose = Vd × Target plasma concentration (universal formula)
  • Lipid-soluble drugs → large Vd; Water-soluble drugs → small Vd

TRICK 4 - Protein Binding Trick

"Only FREE (unbound) drug is pharmacologically active, metabolized, and excreted."
Universal consequences:
  • High protein binding → long duration of action (drug is "stored" in plasma, released slowly)
  • Two highly protein-bound drugs given together → displacement interaction → free drug of displaced drug shoots up → toxicity
    • Classic exam example: Warfarin + aspirin → warfarin displaced → bleeding risk
  • In hypoalbuminemia (cirrhosis, nephrotic syndrome, malnutrition) → less binding → more free drug → toxicity at "normal" doses
  • Loop diuretics are highly protein-bound → delivered to tubules by active secretion, not filtration

TRICK 5 - First-Pass Effect (Oral Bioavailability) Trick

"Drugs with high first-pass effect have low oral bioavailability and need higher oral doses vs IV doses."
  • First-pass = drug absorbed from gut → portal vein → liver → metabolized before reaching systemic circulation
  • High first-pass drugs (low oral bioavailability): morphine, lidocaine, propranolol, nitroglycerin, testosterone
  • No first-pass: IV drugs, sublingual drugs (nitroglycerin SL), transdermal drugs, inhaled drugs
  • Universal exam trick: "Why give nitroglycerin sublingually?" → bypasses first-pass → rapid effect

TRICK 6 - Zero-Order vs First-Order Kinetics

"Most drugs follow first-order kinetics (constant %). A few saturate enzymes and switch to zero-order (constant amount) - those are the dangerous ones."
First-OrderZero-Order
EliminationConstant % per unit timeConstant amount per unit time
t1/2FixedNo fixed t1/2
DrugsAlmost all drugsPHenytoin, Ethanol, Aspirin (high dose)
RiskPredictableSmall dose increase → huge toxicity
Mnemonic: "PEA" goes zero-order - Phenytoin, Ethanol, Aspirin (at toxic doses)
At therapeutic doses phenytoin follows first-order, but at higher levels enzymes saturate → switches to zero-order → tiny dose increase causes massive plasma level spike → toxicity.

TRICK 7 - The Clearance Master Formula

"Clearance = Vd × Ke = Vd × 0.693 / t1/2"
And the most useful derived formula:
Maintenance dose rate = Target Css × Clearance / Bioavailability (F)
Universal shortcuts:
  • Increased clearance (enzyme inducers like rifampicin, phenytoin, carbamazepine) → lower drug levels → need higher doses
  • Decreased clearance (enzyme inhibitors like erythromycin, ketoconazole, ciprofloxacin) → higher drug levels → reduce dose to avoid toxicity
  • Renal failure = reduced clearance of renally excreted drugs → accumulation → toxicity

TRICK 8 - CYP450 Inducers vs Inhibitors (Universal Drug Interaction Trick)

"Inducers increase metabolism → decrease drug levels. Inhibitors decrease metabolism → increase drug levels."
Inducers (RASCAL-GP)Inhibitors (SICKFACES.COM)
RifampicinSodium valproate
Alcohol (chronic)Isoniazid
St John's WortCimetidine
CarbamazepineKetoconazole/fluconazole
Anti-epileptics (phenytoin, phenobarb)Fluoxetine/fluvoxamine
GriseofulvinAmiodarone
PhenytoinCiprofloxacin / clarithromycin
Erythromycin
Sulfonamides
Omeprazole
Metronidazole

Putting It All Together - The Universal PK Question Strategy

When any exam question gives you a patient scenario with pharmacokinetics, run through this checklist:
  1. Renal or liver failure? → Which drugs accumulate? (Trick 2)
  2. Low albumin? → More free drug → toxicity risk (Trick 4)
  3. Two drugs together? → Protein displacement or CYP interaction? (Tricks 4 & 8)
  4. How long to washout before switching drugs? → 5 half-lives (Trick 1)
  5. Narrow therapeutic index drug? (Digoxin, warfarin, lithium, phenytoin) → Any of the above = danger
Master these 8 tricks and you can decode the PK of any drug your examiner throws at you.

Create a pharmacokinetics quick reference PDF for exams

Reading File
Running Command

mkdir -p /home/daytona/workspace/pk-reference && ls /home/daytona/workspace/

Writing File

~/pk-reference/generate_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, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate

OUTPUT = "/home/daytona/workspace/pk-reference/PK_Quick_Reference.pdf"

# ── Colour palette ──────────────────────────────────────────────────
DARK_BLUE   = colors.HexColor("#1A3A5C")
MED_BLUE    = colors.HexColor("#2563A8")
LIGHT_BLUE  = colors.HexColor("#D6E4F7")
ACCENT      = colors.HexColor("#E8530A")   # orange accent
ACCENT2     = colors.HexColor("#16A34A")   # green
YELLOW_BG   = colors.HexColor("#FFFBEB")
GREY_BG     = colors.HexColor("#F3F4F6")
WHITE       = colors.white
BLACK       = colors.HexColor("#111827")
MUTED       = colors.HexColor("#6B7280")
RED         = colors.HexColor("#DC2626")

# ── Doc setup ───────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT, pagesize=A4,
    leftMargin=15*mm, rightMargin=15*mm,
    topMargin=14*mm, bottomMargin=14*mm,
    title="Pharmacokinetics Quick Reference",
    author="Orris AI"
)
W = A4[0] - 30*mm   # usable width

# ── Styles ──────────────────────────────────────────────────────────
base = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, **kw)

sTitle = S("sTitle", fontSize=22, textColor=WHITE, alignment=TA_CENTER,
           fontName="Helvetica-Bold", spaceAfter=2)
sSubtitle = S("sSubtitle", fontSize=10, textColor=colors.HexColor("#BFD7F5"),
              alignment=TA_CENTER, fontName="Helvetica", spaceAfter=0)

sSectionHead = S("sSectionHead", fontSize=12, textColor=WHITE,
                 fontName="Helvetica-Bold", alignment=TA_LEFT,
                 leftIndent=4, spaceBefore=6, spaceAfter=2)

sBullet = S("sBullet", fontSize=8.5, textColor=BLACK, fontName="Helvetica",
            leftIndent=10, firstLineIndent=-10, spaceAfter=2.5, leading=12)
sBulletBold = S("sBulletBold", fontSize=8.5, textColor=DARK_BLUE,
                fontName="Helvetica-Bold", leftIndent=10, firstLineIndent=-10,
                spaceAfter=2.5, leading=12)
sSub = S("sSub", fontSize=7.8, textColor=MUTED, fontName="Helvetica",
         leftIndent=20, firstLineIndent=-10, spaceAfter=1.5, leading=11)
sNote = S("sNote", fontSize=7.5, textColor=colors.HexColor("#92400E"),
          fontName="Helvetica-Oblique", leftIndent=6, spaceAfter=3, leading=10)
sFormula = S("sFormula", fontSize=8.5, textColor=DARK_BLUE,
             fontName="Helvetica-Bold", alignment=TA_CENTER,
             spaceBefore=3, spaceAfter=3, leading=13,
             backColor=LIGHT_BLUE, borderPad=4)
sTH = S("sTH", fontSize=8, textColor=WHITE, fontName="Helvetica-Bold",
        alignment=TA_CENTER, leading=10)
sTD = S("sTD", fontSize=7.8, textColor=BLACK, fontName="Helvetica",
        alignment=TA_CENTER, leading=10)
sTDL = S("sTDL", fontSize=7.8, textColor=BLACK, fontName="Helvetica",
         alignment=TA_LEFT, leading=10)
sMnemonic = S("sMnemonic", fontSize=8.5, textColor=colors.HexColor("#7C3AED"),
              fontName="Helvetica-Bold", alignment=TA_CENTER,
              spaceBefore=2, spaceAfter=2, leading=12)
sCaption = S("sCaption", fontSize=7.2, textColor=MUTED, fontName="Helvetica-Oblique",
             alignment=TA_CENTER, spaceAfter=4)

# ── Helper builders ─────────────────────────────────────────────────
def section_header(text, color=DARK_BLUE):
    bg = Table([[Paragraph(text, sSectionHead)]], colWidths=[W])
    bg.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),
        ("RIGHTPADDING",(0,0), (-1,-1), 8),
        ("ROUNDEDCORNERS", [4, 4, 4, 4]),
    ]))
    return bg

def bullet(text, bold=False):
    style = sBulletBold if bold else sBullet
    return Paragraph(f"• {text}", style)

def sub_bullet(text):
    return Paragraph(f"  ◦ {text}", sSub)

def note(text):
    bg = Table([[Paragraph(f"💡 {text}", sNote)]], colWidths=[W])
    bg.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), YELLOW_BG),
        ("TOPPADDING",  (0,0), (-1,-1), 4),
        ("BOTTOMPADDING",(0,0),(-1,-1), 4),
        ("LEFTPADDING", (0,0), (-1,-1), 8),
        ("BOX", (0,0), (-1,-1), 0.5, colors.HexColor("#F59E0B")),
    ]))
    return bg

def formula_box(text):
    bg = Table([[Paragraph(text, sFormula)]], colWidths=[W])
    bg.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
        ("TOPPADDING",  (0,0), (-1,-1), 6),
        ("BOTTOMPADDING",(0,0),(-1,-1), 6),
        ("BOX", (0,0), (-1,-1), 1, MED_BLUE),
    ]))
    return bg

def mnemonic_box(text):
    bg = Table([[Paragraph(text, sMnemonic)]], colWidths=[W])
    bg.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#EDE9FE")),
        ("TOPPADDING",  (0,0), (-1,-1), 6),
        ("BOTTOMPADDING",(0,0),(-1,-1), 6),
        ("BOX", (0,0), (-1,-1), 1, colors.HexColor("#7C3AED")),
    ]))
    return bg

def make_table(headers, rows, col_widths, header_color=DARK_BLUE, stripe=True):
    data = [[Paragraph(h, sTH) for h in headers]]
    for i, row in enumerate(rows):
        data.append([Paragraph(str(c), sTDL if j == 0 else sTD)
                     for j, c in enumerate(row)])
    t = Table(data, colWidths=col_widths, repeatRows=1)
    style = [
        ("BACKGROUND",   (0,0), (-1,0),  header_color),
        ("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, GREY_BG] if stripe else [WHITE]),
        ("GRID",         (0,0), (-1,-1), 0.4, colors.HexColor("#CBD5E1")),
        ("TOPPADDING",   (0,0), (-1,-1), 4),
        ("BOTTOMPADDING",(0,0), (-1,-1), 4),
        ("LEFTPADDING",  (0,0), (-1,-1), 5),
        ("RIGHTPADDING", (0,0), (-1,-1), 5),
        ("VALIGN",       (0,0), (-1,-1), "MIDDLE"),
    ]
    t.setStyle(TableStyle(style))
    return t

def sp(h=4):
    return Spacer(1, h)

def hr():
    return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#CBD5E1"),
                      spaceAfter=3, spaceBefore=3)

# ── Cover banner ────────────────────────────────────────────────────
def cover_banner():
    banner_data = [[
        Paragraph("PHARMACOKINETICS", sTitle),
        Paragraph("Quick Reference for Exams", sSubtitle),
    ]]
    # stacked in one cell
    inner = Table([
        [Paragraph("PHARMACOKINETICS", sTitle)],
        [Paragraph("Quick Reference for Exams", sSubtitle)],
        [Paragraph("8 Universal Tricks · Formulas · Tables · Mnemonics", sSubtitle)],
    ], colWidths=[W])
    inner.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
        ("TOPPADDING",  (0,0), (-1,-1), 12),
        ("BOTTOMPADDING",(0,0),(-1,-1), 12),
        ("LEFTPADDING", (0,0), (-1,-1), 0),
    ]))
    return inner

# ════════════════════════════════════════════════════════════════════
# BUILD STORY
# ════════════════════════════════════════════════════════════════════
story = []

story.append(cover_banner())
story.append(sp(8))

# ─────────────────────────────────────────────────────────────────
# TRICK 1: 5 Half-Life Rule
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 1 — The 5 Half-Life Rule  (Steady State & Elimination)", MED_BLUE))
story.append(sp(4))
story.append(formula_box("Time to Steady State = Time to Full Elimination = 5 × t½"))
story.append(sp(4))

t1_headers = ["Half-lives", "% Steady State Reached", "% Drug Eliminated", "Remaining (%)"]
t1_rows = [
    ["1", "50%", "50%", "50%"],
    ["2", "75%", "75%", "25%"],
    ["3", "87.5%", "87.5%", "12.5%"],
    ["4", "93.75%", "93.75%", "6.25%"],
    ["5 ✓", "~97% ≈ 100%", "~97% ≈ 100%", "<3%"],
]
story.append(make_table(t1_headers, t1_rows, [W*0.2, W*0.28, W*0.28, W*0.24]))
story.append(sp(4))
story.append(bullet("Drug with t½ = 6 hrs → steady state in 30 hrs; eliminated in 30 hrs"))
story.append(bullet("Drug with t½ = 2 days → fully washed out in 10 days (critical before drug switches)"))
story.append(bullet("Loading dose bypasses the 5 half-life wait — instantly achieves target concentration"))
story.append(bullet("Doubling the dose doubles the steady-state level but does NOT change the time to reach it"))
story.append(sp(3))
story.append(note("Warfarin t½ ≈ 40 hrs → full elimination ~8 days. MAO inhibitors t½ ≈ 2 wks → washout before switching!"))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# TRICK 2: Hepatic vs Renal Elimination
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 2 — Hepatic vs. Renal Elimination = Dose Adjustment Rule", MED_BLUE))
story.append(sp(4))

t2_headers = ["Elimination Route", "Adjust Dose In", "Safe In", "Classic Examples"]
t2_rows = [
    ["Mainly RENAL\n(excreted unchanged in urine)", "Renal failure (↓ GFR)", "Liver disease",
     "Aminoglycosides, Digoxin,\nLithium, Metformin, Atenolol"],
    ["Mainly HEPATIC\n(metabolized by liver)", "Liver failure (cirrhosis)", "Renal disease",
     "Warfarin, Statins, most BZDs,\nTorsemide, Lidocaine"],
    ["BOTH (50/50)", "Both organ failures", "Neither fully",
     "Bumetanide, Morphine"],
]
story.append(make_table(t2_headers, t2_rows, [W*0.22, W*0.22, W*0.18, W*0.38]))
story.append(sp(4))
story.append(bullet("Loop diuretics: Furosemide ~65% renal · Torsemide ~80% hepatic · Bumetanide ~50/50", bold=True))
story.append(bullet("Metformin → renally eliminated → CONTRAINDICATED in renal failure (lactic acidosis risk)"))
story.append(bullet("NSAIDs + loop diuretics → compete for proximal tubule secretion → blunted diuretic response"))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# TRICK 3: Volume of Distribution
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 3 — Volume of Distribution (Vd)", MED_BLUE))
story.append(sp(4))
story.append(formula_box("Loading Dose = Vd × Target Plasma Concentration / Bioavailability (F)"))
story.append(sp(4))

t3_headers = ["Vd", "Distribution", "Property", "Examples"]
t3_rows = [
    ["Small\n< 1 L/kg", "Plasma / ECF only", "Water-soluble,\nhigh protein binding", "Heparin, Aminoglycosides,\nWarfarin (in plasma)"],
    ["Medium\n1–20 L/kg", "Tissues + plasma", "Moderate lipophilicity", "Most drugs"],
    ["Large\n> 20 L/kg", "Deep tissue / fat", "Lipid-soluble,\nhigh tissue binding", "Chloroquine, Amiodarone,\nDigoxin, TCAs"],
]
story.append(make_table(t3_headers, t3_rows, [W*0.16, W*0.22, W*0.24, W*0.38]))
story.append(sp(4))
story.append(bullet("Large Vd → longer t½ → NOT dialyzable (drug is hiding in tissues, not in blood)", bold=True))
story.append(bullet("Small Vd → drug stays in plasma → dialyzable (e.g. lithium, aminoglycosides)"))
story.append(bullet("Obesity increases Vd for lipophilic drugs → may need weight-based dose adjustment"))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# TRICK 4: Protein Binding
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 4 — Protein Binding: Only FREE Drug is Active", MED_BLUE))
story.append(sp(4))
story.append(bullet("Only UNBOUND (free) drug is: pharmacologically active · metabolized · excreted · crosses membranes", bold=True))
story.append(bullet("High protein binding → long duration (drug 'stored' in plasma, released slowly)"))
story.append(bullet("Two highly protein-bound drugs → displacement interaction → free drug ↑ → toxicity"))
story.append(sub_bullet("Classic: Warfarin + Aspirin → warfarin displaced → hemorrhage risk"))
story.append(sub_bullet("Classic: Sulfonamides + Bilirubin (neonates) → kernicterus"))
story.append(bullet("Hypoalbuminemia (cirrhosis, nephrotic syndrome, malnutrition) → less binding → more free drug → toxicity at 'normal' doses"))
story.append(sp(3))

t4_headers = ["State", "Albumin", "Free Drug", "Risk"]
t4_rows = [
    ["Normal", "Normal", "Normal", "—"],
    ["Cirrhosis / Nephrotic / Malnutrition", "↓ Low", "↑ High", "Toxicity at standard doses"],
    ["Renal failure", "↓ (uremia alters binding)", "↑ High", "Toxicity — especially phenytoin"],
]
story.append(make_table(t4_headers, t4_rows, [W*0.32, W*0.18, W*0.18, W*0.32]))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# TRICK 5: First-Pass Effect
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 5 — First-Pass Effect & Oral Bioavailability", MED_BLUE))
story.append(sp(4))
story.append(formula_box("Bioavailability (F) = AUC oral / AUC IV × 100%"))
story.append(sp(4))
story.append(bullet("First-pass = drug absorbed from gut → portal vein → LIVER → metabolized before reaching systemic circulation", bold=True))
story.append(bullet("High first-pass effect → LOW oral bioavailability → need HIGHER oral dose vs IV dose"))
story.append(sp(3))

t5_headers = ["Route", "First-Pass?", "Onset", "Examples"]
t5_rows = [
    ["Oral (PO)", "Yes (high if extensive)", "Slowest", "Most drugs — large oral dose needed"],
    ["Sublingual (SL)", "NO — absorbed into systemic veins", "Fast", "Nitroglycerin, Buprenorphine"],
    ["Transdermal", "NO", "Slow but sustained", "Fentanyl patch, Nicotine patch"],
    ["Intravenous (IV)", "NO — 100% bioavailability", "Immediate", "All drugs given IV"],
    ["Inhalation", "NO (minimal)", "Very fast", "Salbutamol, Anaesthetic gases"],
    ["Rectal (PR)", "Partial (~50% bypassed)", "Moderate", "Diazepam, Paracetamol PR"],
]
story.append(make_table(t5_headers, t5_rows, [W*0.2, W*0.28, W*0.18, W*0.34]))
story.append(sp(4))
story.append(bullet("High first-pass drugs (low bioavailability): Morphine, Lidocaine, Propranolol, Nitroglycerin, GTN, Testosterone, Progesterone"))
story.append(note("Why nitroglycerin is given sublingual / transdermal and NOT as oral tablets → bypasses liver first-pass!"))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# TRICK 6: Zero vs First Order Kinetics
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 6 — Zero-Order vs. First-Order Kinetics", MED_BLUE))
story.append(sp(4))

t6_headers = ["Feature", "First-Order Kinetics", "Zero-Order Kinetics"]
t6_rows = [
    ["Elimination rate", "Constant FRACTION (%) per unit time", "Constant AMOUNT per unit time"],
    ["Half-life", "Fixed t½", "No fixed t½ — varies with dose"],
    ["Graph (plasma vs time)", "Exponential decay", "Linear decay"],
    ["Enzyme saturation", "Not saturated", "Enzymes SATURATED"],
    ["Predictability", "Predictable — safe", "UNPREDICTABLE — DANGEROUS"],
    ["Applies to", "Almost ALL drugs", "Phenytoin, Ethanol, Aspirin (toxic doses)"],
]
story.append(make_table(t6_headers, t6_rows, [W*0.26, W*0.37, W*0.37]))
story.append(sp(4))
story.append(mnemonic_box('Mnemonic: "PEA goes Zero-Order" → Phenytoin · Ethanol · Aspirin (at high/toxic doses)'))
story.append(sp(4))
story.append(bullet("Phenytoin: at therapeutic levels → first order. At HIGH levels → enzymes saturate → zero order", bold=True))
story.append(bullet("Small dose increase in zero-order drug → MASSIVE plasma level spike → toxicity"))
story.append(bullet("Ethanol: ~10 mL pure ethanol eliminated per hour regardless of how much was consumed"))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# TRICK 7: Clearance & Key Formulas
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 7 — Clearance & Master Formulas", MED_BLUE))
story.append(sp(4))

formulas = [
    "Clearance (CL) = Vd × Ke  =  Vd × 0.693 / t½",
    "Maintenance Dose Rate = Target Css × CL / F",
    "Loading Dose = Vd × Target Css / F",
    "t½ = 0.693 × Vd / CL",
]
for f in formulas:
    story.append(formula_box(f))
    story.append(sp(2))

story.append(sp(2))
story.append(bullet("Increased CL (enzyme inducers) → lower drug levels → need HIGHER dose", bold=True))
story.append(bullet("Decreased CL (enzyme inhibitors, renal/liver failure) → higher drug levels → REDUCE dose"))
story.append(bullet("Css (steady-state concentration) doubles if maintenance dose doubles — proportional in first-order drugs"))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# TRICK 8: CYP450 Inducers vs Inhibitors
# ─────────────────────────────────────────────────────────────────
story.append(section_header("TRICK 8 — CYP450 Inducers vs. Inhibitors (Drug Interaction Master Table)", MED_BLUE))
story.append(sp(4))

t8_headers = ["Type", "Effect on Metabolism", "Effect on Drug Level", "Mnemonic"]
t8_rows = [
    ["INDUCERS", "↑ Enzyme activity", "↓ Drug levels (sub-therapeutic)", "RASCAL-GP"],
    ["INHIBITORS", "↓ Enzyme activity", "↑ Drug levels (toxicity)", "SICKFACES.COM"],
]
story.append(make_table(t8_headers, t8_rows, [W*0.18, W*0.26, W*0.30, W*0.26], header_color=DARK_BLUE))
story.append(sp(5))

# Two-column table for inducers vs inhibitors
col_ind = W * 0.48
col_inh = W * 0.48
col_gap = W * 0.04

ind_inh_data = [
    [Paragraph("INDUCERS — RASCAL-GP", ParagraphStyle("ind_h", fontSize=8.5, textColor=WHITE,
               fontName="Helvetica-Bold", alignment=TA_CENTER)),
     Paragraph("INHIBITORS — SICKFACES.COM", ParagraphStyle("inh_h", fontSize=8.5, textColor=WHITE,
               fontName="Helvetica-Bold", alignment=TA_CENTER))],
    [Paragraph(
        "<b>R</b>ifampicin<br/>"
        "<b>A</b>lcohol (chronic)<br/>"
        "<b>S</b>t John's Wort<br/>"
        "<b>C</b>arbamazepine<br/>"
        "<b>A</b>nti-epileptics (phenytoin, phenobarbitone)<br/>"
        "<b>L</b>––<br/>"
        "<b>G</b>riseofulvin<br/>"
        "<b>P</b>henytoin",
        ParagraphStyle("ind_body", fontSize=8, textColor=BLACK, fontName="Helvetica",
                       leading=13, leftIndent=5)),
     Paragraph(
        "<b>S</b>odium valproate<br/>"
        "<b>I</b>soniazid<br/>"
        "<b>C</b>imetidine<br/>"
        "<b>K</b>etoconazole / Fluconazole<br/>"
        "<b>F</b>luoxetine / Fluvoxamine<br/>"
        "<b>A</b>miodarone<br/>"
        "<b>C</b>iprofloxacin / Clarithromycin<br/>"
        "<b>E</b>rythromycin<br/>"
        "<b>S</b>ulfonamides<br/>"
        "<b>.</b>–– <b>C</b>hloramphenicol<br/>"
        "<b>O</b>meprazole<br/>"
        "<b>M</b>etronidazole",
        ParagraphStyle("inh_body", fontSize=8, textColor=BLACK, fontName="Helvetica",
                       leading=13, leftIndent=5))],
]
ind_inh_tbl = Table(ind_inh_data, colWidths=[col_ind, col_inh])
ind_inh_tbl.setStyle(TableStyle([
    ("BACKGROUND",    (0,0), (0,0), colors.HexColor("#059669")),
    ("BACKGROUND",    (1,0), (1,0), RED),
    ("BACKGROUND",    (0,1), (0,1), colors.HexColor("#ECFDF5")),
    ("BACKGROUND",    (1,1), (1,1), colors.HexColor("#FEF2F2")),
    ("GRID",          (0,0), (-1,-1), 0.5, colors.HexColor("#CBD5E1")),
    ("VALIGN",        (0,0), (-1,-1), "TOP"),
    ("TOPPADDING",    (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
    ("LEFTPADDING",   (0,0), (-1,-1), 8),
    ("RIGHTPADDING",  (0,0), (-1,-1), 8),
]))
story.append(ind_inh_tbl)
story.append(sp(4))
story.append(note("Remember: Inducers ↑ metabolism → need MORE drug. Inhibitors ↓ metabolism → need LESS drug. Grapefruit juice = CYP3A4 inhibitor!"))
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# BONUS: Universal PK Quick-Check Strategy
# ─────────────────────────────────────────────────────────────────
story.append(section_header("BONUS — Universal PK Question Strategy (Exam Checklist)", ACCENT))
story.append(sp(4))

checklist = [
    ("1. Renal failure?", "Which drugs accumulate? → Renally eliminated drugs (aminoglycosides, digoxin, lithium, metformin) → reduce dose or avoid"),
    ("2. Liver failure?", "Which drugs accumulate? → Hepatically metabolized drugs (warfarin, statins, benzodiazepines, torsemide) → reduce dose"),
    ("3. Low albumin?", "Hypoalbuminemia (cirrhosis, nephrotic) → more free drug → toxicity at standard doses → reduce dose"),
    ("4. Two drugs together?", "Check protein displacement + CYP interaction → which drug level rises/falls?"),
    ("5. How long to washout?", "= 5 × t½ of that drug before switching (critical for MAOIs, warfarin, amiodarone)"),
    ("6. Narrow TI drug?", "Digoxin · Warfarin · Lithium · Phenytoin · Aminoglycosides · Theophylline → any of the above = DANGER"),
    ("7. Zero-order drug?", "PEA (Phenytoin, Ethanol, Aspirin high dose) → small dose increase = disproportionate toxicity"),
    ("8. Route of administration?", "IV = 100% bioavailability. Oral with high first-pass → need higher oral dose. SL/Transdermal bypasses first-pass."),
]
check_data = [[Paragraph(f"<b>{q}</b>", sTDL), Paragraph(a, sTDL)] for q, a in checklist]
check_tbl = Table(check_data, colWidths=[W*0.26, W*0.74])
check_tbl.setStyle(TableStyle([
    ("ROWBACKGROUNDS", (0,0), (-1,-1), [colors.HexColor("#FFF7ED"), WHITE]),
    ("GRID",           (0,0), (-1,-1), 0.4, colors.HexColor("#CBD5E1")),
    ("TOPPADDING",     (0,0), (-1,-1), 5),
    ("BOTTOMPADDING",  (0,0), (-1,-1), 5),
    ("LEFTPADDING",    (0,0), (-1,-1), 6),
    ("RIGHTPADDING",   (0,0), (-1,-1), 6),
    ("VALIGN",         (0,0), (-1,-1), "TOP"),
    ("LINEAFTER",      (0,0), (0,-1), 1.5, ACCENT),
]))
story.append(check_tbl)
story.append(sp(6))

# ─────────────────────────────────────────────────────────────────
# BONUS 2: High-Yield Drug PK Summary Table
# ─────────────────────────────────────────────────────────────────
story.append(section_header("HIGH-YIELD DRUG PK SUMMARY", DARK_BLUE))
story.append(sp(4))

hyd_headers = ["Drug", "t½", "Vd", "Protein Bind.", "Elim. Route", "Key PK Point"]
hyd_rows = [
    ["Digoxin", "40 hrs", "Large (7 L/kg)", "25%", "Renal", "↓ dose in renal failure; hypokalemia ↑ toxicity"],
    ["Warfarin", "40 hrs", "Small (0.14 L/kg)", "99%", "Hepatic (CYP2C9)", "Protein displacement; CYP interactions crucial"],
    ["Lithium", "24 hrs", "Small (0.7 L/kg)", "0%", "Renal (100%)", "Contraindicated in renal failure; dialyzable"],
    ["Phenytoin", "Variable", "Medium (0.6 L/kg)", "90%", "Hepatic", "Zero-order at HIGH doses; narrow TI"],
    ["Furosemide", "1.5 hrs", "Small (0.11 L/kg)", "95%+", "65% Renal", "Must reach tubule lumen to act; NSAIDs blunt effect"],
    ["Torsemide", "3.5 hrs", "Small", "~99%", "80% Hepatic", "Most reliable absorption; preferred in heart failure"],
    ["Amiodarone", "40–55 days", "Very large (60 L/kg)", "96%", "Hepatic", "Longest washout (months); CYP3A4 inhibitor"],
    ["Aminoglycosides", "2–3 hrs", "Small (0.25 L/kg)", "<10%", "Renal (100%)", "Dialyzable; ototoxic; nephrotoxic; once-daily dosing"],
    ["Metformin", "6 hrs", "Large (63–276 L/kg)", "0%", "Renal (100%)", "Contraindicated in renal failure (lactic acidosis)"],
    ["Theophylline", "8–9 hrs", "Medium (0.45 L/kg)", "60%", "Hepatic", "Narrow TI; CYP1A2 metabolism; zero-order at high doses"],
]
story.append(make_table(hyd_headers, hyd_rows,
             [W*0.14, W*0.09, W*0.13, W*0.11, W*0.15, W*0.38]))
story.append(sp(5))

# ─────────────────────────────────────────────────────────────────
# Footer banner
# ─────────────────────────────────────────────────────────────────
footer = Table([[
    Paragraph("Pharmacokinetics Quick Reference  |  Generated by Orris AI  |  For Educational Use Only",
              ParagraphStyle("footer", fontSize=7, textColor=WHITE,
                             fontName="Helvetica", alignment=TA_CENTER))
]], colWidths=[W])
footer.setStyle(TableStyle([
    ("BACKGROUND",    (0,0), (-1,-1), DARK_BLUE),
    ("TOPPADDING",    (0,0), (-1,-1), 6),
    ("BOTTOMPADDING", (0,0), (-1,-1), 6),
]))
story.append(footer)

# ── Build ────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/pk-reference && python generate_pdf.py

Running Command

ls -lh /home/daytona/workspace/pk-reference/PK_Quick_Reference.pdf

Your PDF is ready! Here's your download link:

PK Quick Reference

PDF Document · PDF


What's inside the PDF:
SectionContent
Trick 15 Half-Life Rule table - steady state & elimination
Trick 2Hepatic vs Renal elimination with drug examples table
Trick 3Volume of Distribution (Vd) - small/medium/large with examples
Trick 4Protein binding - displacement interactions, hypoalbuminemia risks
Trick 5First-pass effect by every route of administration (table)
Trick 6Zero vs First-order kinetics + "PEA" mnemonic highlighted
Trick 7All 4 master formulas (CL, Loading dose, Maintenance dose, t½)
Trick 8CYP450 Inducers (RASCAL-GP) vs Inhibitors (SICKFACES.COM) - colour-coded
Bonus Checklist8-step universal PK question strategy for exam scenarios
Drug PK Table10 high-yield drugs - t½, Vd, protein binding, elimination, key point
This is a shared conversation. Sign in to Orris to start your own chat.