GFR answer include defination machainism regulation and calculation Physiology
python -m markitdown /home/daytona/workspace/attachments/5e8f80b9-819d-478a-92f9-93d3f5f00f73/"renal system 2020.pptx" 2>/dev/null | head -300
python -m markitdown "/home/daytona/workspace/attachments/5e8f80b9-819d-478a-92f9-93d3f5f00f73/renal system 2020.pptx" 2>&1 | grep -i -A 20 "GFR\|filtration\|glomerular" | head -200
python -m markitdown "/home/daytona/workspace/attachments/5e8f80b9-819d-478a-92f9-93d3f5f00f73/renal system 2020.pptx" 2>&1 | head -500
cd /home/daytona/skills/pptx && python scripts/thumbnail.py "/home/daytona/workspace/attachments/5e8f80b9-819d-478a-92f9-93d3f5f00f73/renal system 2020.pptx" 2>&1 | head -50; python3 -c " from pptx import Presentation prs = Presentation('/home/daytona/workspace/attachments/5e8f80b9-819d-478a-92f9-93d3f5f00f73/renal system 2020.pptx') for i, slide in enumerate(prs.slides): texts = [] for shape in slide.shapes: if shape.has_text_frame: for para in shape.text_frame.paragraphs: t = para.text.strip() if t: texts.append(t) if texts: print(f'--- Slide {i+1} ---') for t in texts: print(t) " 2>&1 | head -300
cd /home/daytona/skills/pptx && python3 scripts/office/unpack.py "/home/daytona/workspace/attachments/5e8f80b9-819d-478a-92f9-93d3f5f00f73/renal system 2020.pptx" /tmp/renal_unpacked/ 2>&1 | head -20
ls /tmp/renal_unpacked/ppt/slides/ | head -20; python3 -c " import os, re slide_dir = '/tmp/renal_unpacked/ppt/slides/' files = sorted([f for f in os.listdir(slide_dir) if f.endswith('.xml') and not 'layout' in f and not 'master' in f]) for fn in files[:40]: path = os.path.join(slide_dir, fn) with open(path) as f: content = f.read() # Extract text texts = re.findall(r'<a:t[^>]*>([^<]+)</a:t>', content) if texts: print(f'=== {fn} ===') for t in texts: t = t.strip() if t: print(t) print() " 2>&1 | head -400
python3 -c " import os, re slide_dir = '/tmp/renal_unpacked/ppt/slides/' files = sorted([f for f in os.listdir(slide_dir) if f.endswith('.xml') and not 'layout' in f and not 'master' in f]) for fn in files[40:]: path = os.path.join(slide_dir, fn) with open(path) as f: content = f.read() texts = re.findall(r'<a:t[^>]*>([^<]+)</a:t>', content) if texts: print(f'=== {fn} ===') for t in texts: t = t.strip() if t: print(t) print() " 2>&1 | head -400
SNGFR = Kf × Net Ultrafiltration Pressure
Net Ultrafiltration Pressure = (P_gc - P_bs) - (π_gc - π_bs)
| Force | Value | Direction |
|---|---|---|
| P_gc (glomerular capillary hydrostatic pressure) | ~45 mmHg | Pro-filtration |
| P_bs (Bowman's space hydrostatic pressure) | ~10 mmHg | Opposes filtration |
| π_gc (glomerular capillary oncotic pressure) | ~25 mmHg | Opposes filtration |
| π_bs (Bowman's space oncotic pressure) | ~0 mmHg | (negligible - no protein in filtrate) |
Note on filtration equilibrium: As blood flows along the glomerular capillary, plasma proteins concentrate, raising π_gc progressively. Toward the efferent end, filtration pressure falls. In healthy glomeruli, filtration equilibrium is never fully reached because: (1) efferent arteriolar resistance maintains capillary hydrostatic pressure, and (2) progressive morphologic changes reduce permeability at the efferent end. - Comprehensive Clinical Nephrology, 7th Ed.
| Variable | Effect on P_gc | Effect on GFR |
|---|---|---|
| ↑ Arterial pressure | ↑ P_gc | ↑ GFR (buffered by autoregulation) |
| ↑ Afferent arteriolar resistance | ↓ P_gc | ↓ GFR |
| ↑ Efferent arteriolar resistance | ↑ P_gc (initially) | ↑ GFR at low doses; ↓ GFR at high doses (reduced RBF) |
| Factor | Mechanism | Effect on GFR |
|---|---|---|
| Sympathetic nerves (NE) | Constricts afferent arteriole | ↓ GFR |
| Angiotensin II | Constricts efferent > afferent | ↑ GFR (low dose); ↓ GFR (high dose) |
| ANP (Atrial natriuretic peptide) | Dilates afferent arteriole | ↑ GFR |
| ADH (vasopressin) | Vasoconstriction | ↓ GFR |
| Nitric oxide (NO) | Vasodilation | ↑ GFR |
| Endothelin / Adenosine / ATP | Vasoconstriction | ↓ GFR |
| Prostaglandins (PGE2, PGI2) | Vasodilation (afferent) | Maintain GFR (esp. in low-flow states) |
C_x = (U_x × V) / P_x
GFR = (U_inulin × V) / P_inulin
eGFR = [140 - Age] × Weight × (0.85 if female) / [72 × S_Cr (mg/dL)]
eGFR = 186 × (S_Cr)^-1.154 × (Age)^-0.203 × (0.742 if female) × (1.210 if African-American)
| Marker | Method | Notes |
|---|---|---|
| Inulin | Urinary clearance (IV infusion) | Gold standard |
| Iothalamate (^125I) | Urinary/plasma clearance | May overestimate (tubular secretion) |
| ^99mTc-DTPA | Plasma clearance | May underestimate (protein binding) |
| ^51Cr-EDTA | Plasma clearance | ~10% lower than inulin |
| Iohexol | Plasma clearance | Most practical non-radioactive alternative |
| Marker | Limitation |
|---|---|
| Creatinine | Partially secreted by tubules → overestimates GFR; affected by muscle mass, diet, drugs |
| Cystatin C | Less affected by muscle mass; better in elderly, amputees |
| Urea/BUN | Reabsorbed (~50%) → underestimates GFR |
| Parameter | Value |
|---|---|
| Normal GFR | 125 mL/min (men ~130, women ~120 mL/min/1.73 m²) |
| Net filtration pressure | ~10 mmHg |
| Kf | ~12.5 mL/min/mmHg |
| Glomerular capillary P | ~45 mmHg |
| Bowman's space P | ~10 mmHg |
| Plasma oncotic P | ~25 mmHg |
| Daily filtrate volume | ~180 L/day |
| Urine output | ~1.5 L/day |
| Filtration fraction (FF) | ~20% (GFR/RPF = 125/625) |
GFR INCLUDE - DEFINATION Normal value MECHANISM CALCULATION CONTENT FROM ABOVE PDF Physiology 5 marker
"GFR refers to volume of the glomerular filtrate formed each minute by all the nephrons in both the kidneys."
- Your PPTX Slide 50 (LRM VII.2 BDS Curriculum Physiology)
| Parameter | Value |
|---|---|
| GFR (normal) | 125 mL/min |
| GFR per day | 170-180 L/day |
| Men (indexed) | ~130 mL/min/1.73 m² BSA |
| Women (indexed) | ~120 mL/min/1.73 m² BSA |
| Net filtration pressure | 10 mmHg |
| Filtration coefficient (Kf) | 12.5 mL/min/mmHg |
| Daily urine output | ~1.5 L/day |
| Filtration fraction (FF) | ~20% (GFR/RPF = 125/625) |
Normal GFR in men is ~8% higher than women and declines ~0.75 mL/min/year after age 40. During pregnancy, GFR increases by ~50% in the first trimester.
GFR = Kf × Net Ultrafiltration Pressure
Net EFP = P_gc - P_bs - π_gc + π_bs
| Starling Force | Value | Direction |
|---|---|---|
| P_gc (glomerular capillary hydrostatic pressure) | 45 mmHg | ✅ Pro-filtration |
| P_bs (Bowman's space hydrostatic pressure) | 10 mmHg | ❌ Opposes filtration |
| π_gc (plasma oncotic pressure in glomerulus) | 25 mmHg | ❌ Opposes filtration |
| π_bs (oncotic pressure in Bowman's space) | 0 mmHg | Negligible (no protein) |
EFP = 45 - (10 + 25) = 10 mmHg
GFR = Kf × EFP = 12.5 × 10 = 125 mL/min ✓
Kf = Hydraulic conductivity × Capillary surface area
| Symbol | Meaning |
|---|---|
| C_x | Clearance of substance x (mL/min) |
| U_x | Urinary concentration of x |
| V | Urine flow rate (mL/min) |
| P_x | Plasma concentration of x |
| # | Marker | Clearance vs GFR | Key Facts |
|---|---|---|---|
| 1 | Creatinine | > GFR (overestimates) | Partially secreted by tubules; affected by muscle mass, drugs, diet. Most widely used clinically |
| 2 | Cystatin C | ≈ GFR | Freely filtered; not affected by muscle mass; better in elderly, amputees, extremes of weight |
| 3 | Urea (BUN) | < GFR (underestimates) | ~50% reabsorbed by tubules; affected by protein intake and hydration |
| # | Marker | Method | Key Facts |
|---|---|---|---|
| 4 | Inulin | Urinary clearance (continuous IV infusion) | GOLD STANDARD - freely filtered, not secreted/reabsorbed/metabolized. Reference against which all others are compared |
| 5 | Iohexol | Plasma clearance (IV bolus) | Most practical non-radioactive alternative; assayed by HPLC; used in research |
"The classic method for GFR measurement described by Homer Smith is the urinary clearance of inulin and remains the reference (gold standard) against which other clearance methods and filtration markers are evaluated."
- Comprehensive Clinical Nephrology, 7th Ed.
GLOMERULAR FILTRATION
│
▼
EFP = Pgc - Pbs - πgc + πbs
10 = 45 - 10 - 25 + 0 (mmHg)
│
▼
GFR = Kf × EFP
125 = 12.5 × 10 (mL/min)
│
▼
Measured by CLEARANCE
C = (U × V) / P
│
┌────┴─────┐
│ │
Inulin Creatinine
(gold (clinical
standard) standard)
Generate a pdf on that exactly how I have to write in exam for 5 marker
ls /home/daytona/workspace/ 2>/dev/null && mkdir -p /home/daytona/workspace/gfr-exam
~/gfr-exam/generate_gfr_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import Flowable
# ── Output path ──────────────────────────────────────────────────────────────
OUTPUT = "/home/daytona/workspace/gfr-exam/GFR_5_Marker_Exam_Answer.pdf"
# ── Document ─────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2.2*cm, rightMargin=2.2*cm,
topMargin=2*cm, bottomMargin=2*cm,
)
W = A4[0] - 4.4*cm # usable width
# ── Colour palette ────────────────────────────────────────────────────────────
NAVY = colors.HexColor("#1a3a5c")
TEAL = colors.HexColor("#17737a")
GOLD = colors.HexColor("#d4a017")
LGREY = colors.HexColor("#f0f4f8")
MGREY = colors.HexColor("#d0dce8")
WHITE = colors.white
BLACK = colors.black
RED = colors.HexColor("#c0392b")
GREEN = colors.HexColor("#1a6e3c")
# ── Styles ────────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()
def S(name, parent="Normal", **kw):
return ParagraphStyle(name, parent=base[parent], **kw)
sTitle = S("sTitle", fontSize=18, leading=22, textColor=WHITE,
alignment=TA_CENTER, fontName="Helvetica-Bold", spaceAfter=0)
sSubtitle = S("sSubtitle", fontSize=11, leading=14, textColor=MGREY,
alignment=TA_CENTER, fontName="Helvetica", spaceAfter=0)
sQ = S("sQ", fontSize=12, leading=15, textColor=WHITE,
fontName="Helvetica-Bold", spaceAfter=0)
sSection = S("sSection", fontSize=11, leading=14, textColor=NAVY,
fontName="Helvetica-Bold", spaceBefore=8, spaceAfter=4)
sSubSection = S("sSubSection", fontSize=10, leading=13, textColor=TEAL,
fontName="Helvetica-Bold", spaceBefore=5, spaceAfter=2)
sBody = S("sBody", fontSize=9.5, leading=14, textColor=BLACK,
fontName="Helvetica", alignment=TA_JUSTIFY, spaceAfter=3)
sBullet = S("sBullet", fontSize=9.5, leading=13, textColor=BLACK,
fontName="Helvetica", leftIndent=14, spaceAfter=2)
sFormula = S("sFormula", fontSize=10, leading=14, textColor=NAVY,
fontName="Helvetica-Bold", alignment=TA_CENTER,
backColor=LGREY, spaceBefore=4, spaceAfter=4)
sNote = S("sNote", fontSize=8.5, leading=12, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Oblique", leftIndent=10, spaceAfter=3)
sFooter = S("sFooter", fontSize=7.5, leading=10, textColor=colors.HexColor("#888888"),
alignment=TA_CENTER)
sMarkerHead = S("sMarkerHead", fontSize=9.5, leading=12, textColor=WHITE,
fontName="Helvetica-Bold")
sTableCell = S("sTableCell", fontSize=9, leading=12, textColor=BLACK,
fontName="Helvetica")
sTableHead = S("sTableHead", fontSize=9, leading=12, textColor=WHITE,
fontName="Helvetica-Bold")
# ── Helper: coloured box title ────────────────────────────────────────────────
def section_box(text, bg=NAVY):
t = Table([[Paragraph(text, sSection)]],
colWidths=[W])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TEXTCOLOR", (0,0), (-1,-1), WHITE),
("LEFTPADDING",(0,0), (-1,-1), 8),
("RIGHTPADDING",(0,0),(-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("ROUNDEDCORNERS", [3,3,3,3]),
]))
return t
def subsection_label(text):
return Paragraph(f"<font color='#17737a'><b>{text}</b></font>", sSubSection)
def body(text):
return Paragraph(text, sBody)
def bullet(text):
return Paragraph(f"• {text}", sBullet)
def note(text):
return Paragraph(f"<i>{text}</i>", sNote)
def formula(text):
return Paragraph(text, sFormula)
def sp(h=4):
return Spacer(1, h)
def hr(color=MGREY, thickness=0.5):
return HRFlowable(width="100%", thickness=thickness, color=color, spaceAfter=4, spaceBefore=4)
# ── Build story ───────────────────────────────────────────────────────────────
story = []
# ── HEADER BANNER ─────────────────────────────────────────────────────────────
header_data = [[
Paragraph("GLOMERULAR FILTRATION RATE (GFR)", sTitle),
Paragraph("Physiology | BDS / MBBS | 5-Mark Exam Answer", sSubtitle),
]]
header = Table(
[[Paragraph("GLOMERULAR FILTRATION RATE (GFR)", sTitle)],
[Paragraph("Physiology · BDS / MBBS · 5-Mark Exam Answer", sSubtitle)]],
colWidths=[W]
)
header.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING", (0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(header)
story.append(sp(10))
# ── QUESTION BOX ──────────────────────────────────────────────────────────────
q_box = Table(
[[Paragraph("Q. Write a short note on Glomerular Filtration Rate (GFR). <font color='#ffd700'>[5 marks]</font>", sQ)]],
colWidths=[W]
)
q_box.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), TEAL),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(q_box)
story.append(sp(10))
# ══════════════════════════════════════════════════════════════════════════════
# 1. DEFINITION
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_box("1. DEFINITION"))
story.append(sp(5))
story.append(body(
"GFR is defined as the <b>volume of glomerular filtrate formed per minute by all the nephrons "
"in both kidneys combined.</b>"
))
story.append(sp(3))
story.append(body(
"The filtrate produced is an <b>ultrafiltrate of plasma</b> — identical to plasma in osmolarity, "
"pH, electrolytes, and small organic molecules (glucose, urea, creatinine), but "
"<b>practically contains no protein and no cells.</b>"
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# 2. NORMAL VALUE
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_box("2. NORMAL VALUE", bg=TEAL))
story.append(sp(5))
nv_data = [
[Paragraph("<b>Parameter</b>", sTableHead), Paragraph("<b>Value</b>", sTableHead)],
[Paragraph("GFR (normal)", sTableCell), Paragraph("<b>125 mL/min</b>", sTableCell)],
[Paragraph("GFR per day", sTableCell), Paragraph("170–180 L/day", sTableCell)],
[Paragraph("Men (BSA-indexed)", sTableCell), Paragraph("~130 mL/min / 1.73 m²", sTableCell)],
[Paragraph("Women (BSA-indexed)", sTableCell),Paragraph("~120 mL/min / 1.73 m²", sTableCell)],
[Paragraph("Net filtration pressure", sTableCell), Paragraph("10 mmHg", sTableCell)],
[Paragraph("Filtration coefficient (Kf)", sTableCell), Paragraph("12.5 mL/min/mmHg", sTableCell)],
[Paragraph("Filtration fraction (FF)", sTableCell), Paragraph("~20% (GFR / RPF = 125/625)", sTableCell)],
]
nv_table = Table(nv_data, colWidths=[W*0.52, W*0.48])
nv_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("BACKGROUND", (0,1), (-1,1), LGREY),
("BACKGROUND", (0,2), (-1,2), WHITE),
("BACKGROUND", (0,3), (-1,3), LGREY),
("BACKGROUND", (0,4), (-1,4), WHITE),
("BACKGROUND", (0,5), (-1,5), LGREY),
("BACKGROUND", (0,6), (-1,6), WHITE),
("BACKGROUND", (0,7), (-1,7), LGREY),
("GRID", (0,0), (-1,-1), 0.4, MGREY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
]))
story.append(nv_table)
story.append(sp(4))
story.append(note("GFR declines ~0.75 mL/min/year after age 40. Increases ~50% during pregnancy (first trimester)."))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# 3. MECHANISM
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_box("3. MECHANISM OF GLOMERULAR FILTRATION"))
story.append(sp(5))
story.append(subsection_label("A. Glomerular Membrane — Three Layers"))
for b in [
"1. <b>Fenestrated capillary endothelium</b> — intracellular pores allow fluid transudation.",
"2. <b>Basement membrane</b> — main size and charge barrier.",
"3. <b>Bowman's epithelium (podocytes)</b> — finger-like processes with filtration slits.",
]:
story.append(bullet(b))
story.append(sp(5))
story.append(subsection_label("B. Starling Forces — The Filtration Equation"))
story.append(body("Filtration is governed by the balance of hydrostatic and oncotic pressures:"))
story.append(sp(3))
story.append(formula("GFR = Kf × Net Effective Filtration Pressure (EFP)"))
story.append(sp(2))
story.append(formula("EFP = P<sub>gc</sub> − P<sub>bs</sub> − π<sub>gc</sub> + π<sub>bs</sub>"))
story.append(sp(4))
forces_data = [
[Paragraph("<b>Force</b>", sTableHead),
Paragraph("<b>Value</b>", sTableHead),
Paragraph("<b>Direction</b>", sTableHead)],
[Paragraph("P<sub>gc</sub> Glomerular capillary hydrostatic pressure", sTableCell),
Paragraph("45 mmHg", sTableCell),
Paragraph("<font color='#1a6e3c'><b>✔ Pro-filtration</b></font>", sTableCell)],
[Paragraph("P<sub>bs</sub> Bowman's space hydrostatic pressure", sTableCell),
Paragraph("10 mmHg", sTableCell),
Paragraph("<font color='#c0392b'>✖ Opposes filtration</font>", sTableCell)],
[Paragraph("π<sub>gc</sub> Plasma oncotic pressure (glomerulus)", sTableCell),
Paragraph("25 mmHg", sTableCell),
Paragraph("<font color='#c0392b'>✖ Opposes filtration</font>", sTableCell)],
[Paragraph("π<sub>bs</sub> Bowman's space oncotic pressure", sTableCell),
Paragraph("0 mmHg", sTableCell),
Paragraph("Negligible (no protein)", sTableCell)],
]
forces_table = Table(forces_data, colWidths=[W*0.52, W*0.18, W*0.30])
forces_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("BACKGROUND", (0,1), (-1,1), colors.HexColor("#eaf7ea")),
("BACKGROUND", (0,2), (-1,2), colors.HexColor("#fdecea")),
("BACKGROUND", (0,3), (-1,3), colors.HexColor("#fdecea")),
("BACKGROUND", (0,4), (-1,4), LGREY),
("GRID", (0,0), (-1,-1), 0.4, MGREY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(forces_table)
story.append(sp(5))
story.append(formula("EFP = 45 − (10 + 25) = <b>10 mmHg</b>"))
story.append(formula("GFR = 12.5 × 10 = <b>125 mL/min ✓</b>"))
story.append(sp(4))
story.append(subsection_label("C. Filtration Coefficient (Kf)"))
story.append(body("<b>Kf = Hydraulic conductivity × Capillary surface area</b>"))
story.append(body("Normal Kf = 12.5 mL/min/mmHg (400× greater than most capillary beds)."))
story.append(body("Diseases that reduce Kf → reduce GFR:"))
for item in ["Chronic hypertension", "Obesity / Diabetes mellitus", "Glomerulonephritis"]:
story.append(bullet(item))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# 4. CALCULATION
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_box("4. CALCULATION OF GFR", bg=colors.HexColor("#2e4057")))
story.append(sp(5))
story.append(body(
"GFR <b>cannot be measured directly</b>. It is calculated from the <b>clearance</b> of "
"filtration markers using the formula:"
))
story.append(sp(3))
story.append(formula("C<sub>x</sub> = ( U<sub>x</sub> × V ) / P<sub>x</sub>"))
story.append(sp(3))
# Clearance symbols table
sym_data = [
[Paragraph("<b>Symbol</b>", sTableHead), Paragraph("<b>Meaning</b>", sTableHead)],
[Paragraph("C<sub>x</sub>", sTableCell), Paragraph("Clearance of substance x (mL/min)", sTableCell)],
[Paragraph("U<sub>x</sub>", sTableCell), Paragraph("Urinary concentration of x", sTableCell)],
[Paragraph("V", sTableCell), Paragraph("Urine flow rate (mL/min)", sTableCell)],
[Paragraph("P<sub>x</sub>", sTableCell), Paragraph("Plasma concentration of x", sTableCell)],
]
sym_table = Table(sym_data, colWidths=[W*0.2, W*0.8])
sym_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("ROWBACKGROUNDS",(0,1), (-1,-1), [LGREY, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, MGREY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("ALIGN", (0,0), (0,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(sym_table)
story.append(sp(5))
story.append(note(
"A substance is an ideal GFR marker if it is freely filtered and NOT reabsorbed, secreted, "
"synthesized, or metabolized by the kidney → then Cx = GFR exactly."
))
story.append(sp(6))
story.append(subsection_label("Clinical eGFR Equations"))
# Equations
eq_data = [
[Paragraph("<b>Equation</b>", sTableHead), Paragraph("<b>Formula</b>", sTableHead), Paragraph("<b>Use</b>", sTableHead)],
[Paragraph("Cockcroft-Gault", sTableCell),
Paragraph("[140−Age] × Wt × (0.85 if ♀) / 72 × SCr", sTableCell),
Paragraph("Drug dosing", sTableCell)],
[Paragraph("MDRD", sTableCell),
Paragraph("186 × SCr⁻¹·¹⁵⁴ × Age⁻⁰·²⁰³ × (0.742 if ♀) × (1.21 if AA)", sTableCell),
Paragraph("CKD staging", sTableCell)],
[Paragraph("CKD-EPI", sTableCell),
Paragraph("Complex formula; normalized to 1.73 m² BSA", sTableCell),
Paragraph("<b>Most accurate — preferred</b>", sTableCell)],
]
eq_table = Table(eq_data, colWidths=[W*0.22, W*0.52, W*0.26])
eq_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("ROWBACKGROUNDS",(0,1), (-1,-1), [LGREY, WHITE, LGREY]),
("GRID", (0,0), (-1,-1), 0.4, MGREY),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(eq_table)
story.append(sp(4))
story.append(note(
"Example (Cockcroft-Gault): Male, 22 yrs, 60 kg, SCr 1.0 mg/dL → "
"eGFR = (140×22×60) / (72×1.0) = 122 mL/min"
))
story.append(sp(8))
# ══════════════════════════════════════════════════════════════════════════════
# 5. FILTRATION MARKERS
# ══════════════════════════════════════════════════════════════════════════════
story.append(section_box("5. FILTRATION MARKERS (5 Key Markers)", bg=colors.HexColor("#1a5276")))
story.append(sp(6))
markers = [
{
"num": "1",
"name": "INULIN",
"tag": "GOLD STANDARD",
"tag_color": GOLD,
"type": "Exogenous",
"clearance": "= GFR (exact)",
"method": "Urinary clearance — continuous IV infusion",
"key": [
"Freely filtered at glomerulus.",
"NOT reabsorbed, secreted, synthesized, or metabolized.",
"Reference standard (Homer Smith's method) against which all others are validated.",
"Cumbersome in practice — not used routinely.",
],
},
{
"num": "2",
"name": "CREATININE",
"tag": "ROUTINE CLINICAL",
"tag_color": TEAL,
"type": "Endogenous",
"clearance": "> GFR (overestimates ~10–20%)",
"method": "24-hr urine collection or serum creatinine eGFR",
"key": [
"Freely filtered + <b>partially secreted</b> by tubules → overestimates GFR.",
"Affected by muscle mass, diet (meat), age, drugs (e.g., trimethoprim).",
"Most widely used clinically — forms basis of MDRD and CKD-EPI equations.",
"Serum creatinine is inversely proportional to GFR.",
],
},
{
"num": "3",
"name": "UREA (BUN)",
"tag": "CRUDE ESTIMATE",
"tag_color": colors.HexColor("#7d6608"),
"type": "Endogenous",
"clearance": "< GFR (underestimates ~40–50%)",
"method": "Blood urea nitrogen (BUN) level",
"key": [
"Freely filtered + <b>~50% reabsorbed</b> by tubules → underestimates GFR.",
"Affected by protein intake, hydration, liver function, catabolic state.",
"BUN : Creatinine ratio >20 suggests pre-renal cause; <10 suggests malnutrition.",
"Used alongside creatinine, not alone.",
],
},
{
"num": "4",
"name": "CYSTATIN C",
"tag": "BETTER ALTERNATIVE",
"tag_color": GREEN,
"type": "Endogenous",
"clearance": "≈ GFR",
"method": "Serum cystatin C level",
"key": [
"Freely filtered; completely reabsorbed and catabolised in proximal tubule (not excreted).",
"<b>Not affected by muscle mass</b> → better in elderly, amputees, extreme body weights.",
"Superior to creatinine in early CKD detection.",
"More expensive; less widely available than creatinine.",
],
},
{
"num": "5",
"name": "IOHEXOL",
"tag": "RESEARCH / REFERENCE",
"tag_color": colors.HexColor("#6c3483"),
"type": "Exogenous",
"clearance": "≈ GFR",
"method": "Plasma clearance after IV bolus injection",
"key": [
"Non-ionic, non-radioactive contrast agent.",
"Most practical alternative to inulin for measured GFR (mGFR).",
"Assayed by HPLC or mass spectrometry.",
"May have minor extrarenal clearance → slight overestimation.",
],
},
]
for m in markers:
# Marker header row
header_row = Table(
[[
Paragraph(f"<b>Marker {m['num']}:</b> {m['name']}", sMarkerHead),
Paragraph(f" [{m['tag']}]", ParagraphStyle(
"tag", fontSize=8, leading=10, textColor=m["tag_color"],
fontName="Helvetica-Bold",
)),
]],
colWidths=[W*0.6, W*0.4],
)
header_row.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
detail_rows = [
[Paragraph("<b>Type:</b>", sTableCell), Paragraph(m["type"], sTableCell)],
[Paragraph("<b>Clearance:</b>", sTableCell), Paragraph(m["clearance"], sTableCell)],
[Paragraph("<b>Method:</b>", sTableCell), Paragraph(m["method"], sTableCell)],
]
detail_table = Table(detail_rows, colWidths=[W*0.22, W*0.78])
detail_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LGREY),
("GRID", (0,0), (-1,-1), 0.3, MGREY),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
key_paras = [Paragraph(f"• {k}", sBullet) for k in m["key"]]
key_table = Table(
[[Paragraph("<b>Key Points:</b>", sTableCell)]] +
[[p] for p in key_paras],
colWidths=[W]
)
key_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), WHITE),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LINEBELOW", (0,-1), (-1,-1), 0.6, MGREY),
]))
story.append(KeepTogether([header_row, detail_table, key_table, sp(6)]))
# ══════════════════════════════════════════════════════════════════════════════
# QUICK RECALL BOX
# ══════════════════════════════════════════════════════════════════════════════
story.append(sp(4))
recall_data = [[
Paragraph(
"<b>QUICK RECALL ★</b><br/><br/>"
"GFR = Kf × EFP = 12.5 × 10 = <b>125 mL/min</b><br/><br/>"
"EFP = 45 − 10 − 25 + 0 = <b>10 mmHg</b><br/><br/>"
"Clearance: C = (U × V) / P<br/><br/>"
"<b>Markers:</b> Inulin (gold) · Creatinine (clinical) · Urea (crude) · Cystatin C (best endo.) · Iohexol (practical exo.)",
ParagraphStyle("recall", fontSize=9.5, leading=15, textColor=NAVY,
fontName="Helvetica", alignment=TA_LEFT),
)
]]
recall_box = Table(recall_data, colWidths=[W])
recall_box.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#fef9e7")),
("BOX", (0,0), (-1,-1), 1.5, GOLD),
("TOPPADDING", (0,0), (-1,-1), 12),
("BOTTOMPADDING", (0,0), (-1,-1), 12),
("LEFTPADDING", (0,0), (-1,-1), 14),
("RIGHTPADDING", (0,0), (-1,-1), 14),
]))
story.append(recall_box)
story.append(sp(12))
# ── FOOTER ────────────────────────────────────────────────────────────────────
story.append(hr(MGREY, 0.8))
story.append(Paragraph(
"Sources: Comprehensive Clinical Nephrology 7th Ed. · Guyton & Hall Medical Physiology · "
"Medical Physiology (Boron & Boulpaep) · NKF Primer on Kidney Diseases 8th Ed. · "
"LRM VII.2 BDS Curriculum Physiology MRDC",
sFooter
))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved → {OUTPUT}")
cd /home/daytona/workspace/gfr-exam && python3 generate_gfr_pdf.py 2>&1
GFR 5 Marker Exam Answer
PDF Document · PDF
| Section | What's included |
|---|---|
| 1. Definition | Clear one-line definition + ultrafiltrate description |
| 2. Normal Value | Table: 125 mL/min, 170-180 L/day, male/female indexed values, Kf, EFP, FF |
| 3. Mechanism | Glomerular membrane layers + Starling forces table + full EFP calculation (45-10-25=10 mmHg → GFR=125) |
| 4. Calculation | Clearance formula (C = U×V/P) + all 3 eGFR equations (Cockcroft-Gault, MDRD, CKD-EPI) with worked example |
| 5. Filtration Markers | All 5 markers with type, clearance vs GFR, method, and key exam points |
| Quick Recall Box | Golden summary box at the end for last-minute revision |