glomerular filtration barrier and its clinical aspect with UTI
"glomerular filtration barrier" AND proteinuria



| Component | Pore/Slit Size | Function |
|---|---|---|
| Endothelial fenestrae | 70-100 nm | Bars blood cells |
| GBM (lamina densa) | ~8 nm effective radius | Bars large proteins |
| Filtration slits | 25-60 nm | Additional barrier |
| Disease | Mechanism of GFB Disruption | Key Feature |
|---|---|---|
| Minimal Change Disease (MCD) | Loss of anionic charges (HSP loss), podocyte foot process effacement via CD80, c-mip, and angiopoietin-like 4 activation | Nephrotic range proteinuria; foot processes effaced on EM |
| Focal Segmental Glomerulosclerosis (FSGS) | Mutations in NPHS1 (nephrin), NPHS2 (podocin), ACTN4 (α-actinin-4), TRPC6 | Segmental scarring, massive proteinuria |
| Membranous Nephropathy | Anti-PLA2R antibodies attacking podocyte antigens; immune complex deposition in subepithelial space | "Spike and dome" on EM; complement activation |
| Diabetic Nephropathy | GBM thickening (increased synthesis), loss of HSPGs, mesangial expansion | Microalbuminuria → proteinuria |
| Alport Syndrome | Mutations in COL4A3/A4/A5 (type IV collagen α-chains) → "basket-weave" GBM appearance | Hematuria, sensorineural deafness, renal failure |
| Condition | Treatment |
|---|---|
| ASB/Cystitis (pregnant) | Cephalexin 500 mg BID × 3-7 days, OR nitrofurantoin 100 mg BID × 3-7 days, OR amoxicillin 500 mg TID × 7 days (avoid nitrofurantoin near term) |
| Pyelonephritis (outpatient) | Oral fluoroquinolone × 7 days (if not pregnant); guided by local susceptibilities |
| Pyelonephritis (pregnant/inpatient) | IV ceftriaxone 1 g daily; adjust per culture; IV hydration + obstetric consultation |
| Recurrent UTI | Identify and treat anatomical abnormalities (VUR, obstruction); low-dose antibiotic prophylaxis |
| GFB Impairment Mechanism | Resulting Condition | Clinical Link to UTI |
|---|---|---|
| Charge loss (HSP depletion) | Proteinuria (MCD-like) | Infections can trigger MCD relapse via TLR ligands (LPS from gram-negative bacteria, poly-IC from viruses) |
| GBM inflammation/breach | Post-infectious GN | Group A Streptococcal infections - both pharyngeal and skin infections; urinary infections less commonly implicated |
| Reflux nephropathy from recurrent UTI | Renal scarring → reduced GFR | Progressive loss of filtration surface area |
| Septic AKI from pyelonephritis | Reduced GFR (intrinsic + pre-renal) | Hemodynamic compromise + direct tubular toxicity |
| Allograft pyelonephritis | Acute graft dysfunction | Transient GFR reduction; long-term graft function may be preserved |
Recent evidence note: A 2025 systematic review (PMID: 41368354) confirms that genetic and environmental factors altering filtration slit proteins (nephrin, podocin) play a significant role in proteinuric kidney diseases - consistent with the above textbook content.
now make 4 slides content on this topic, 3 slide should focus on GFB only and last slide about corelation on uti.
**/SKILL.md in /tmp/skills
ls /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && echo "ready"
mkdir -p /tmp/workspace/gfb-slides && python /tmp/skills/shared/scripts/fetch_images.py "https://cdn.orris.care/cdss_images/28c78c7afc9cffef0292ca68e59f2fc9dec02cf03a15db6f08038b3e316e1d57.png" "https://cdn.orris.care/cdss_images/6e8164abf32463bb1f42fcb5be4234153348d699743a3993d9420cc4fdf1d4b9.png" "https://cdn.orris.care/cdss_images/e49a35294b6460315647b8c10d91c4241e04a1cea7d9642169973d3456f696bb.png" > /tmp/workspace/gfb-slides/images.json && echo "done"
~/gfb-slides/make_slides.py
import json, base64
from io import BytesIO
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
# ── colour palette ──────────────────────────────────────────────────────────
NAVY = RGBColor(0x0D, 0x2B, 0x55) # deep navy - title BG
TEAL = RGBColor(0x00, 0x7B, 0x83) # accent bar / headings
LIGHT_BG = RGBColor(0xF0, 0xF6, 0xF7) # slide background
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_TXT = RGBColor(0x1A, 0x1A, 0x2E)
ACCENT = RGBColor(0xE8, 0x6A, 0x10) # orange accent
LIGHT_TEAL= RGBColor(0xD6, 0xF0, 0xF2) # light teal fill for boxes
# ── load images ──────────────────────────────────────────────────────────────
with open("/tmp/workspace/gfb-slides/images.json") as f:
imgs = json.load(f)
def img_stream(idx):
b64 = imgs[idx]["base64"]
if b64 and "," in b64:
b64 = b64.split(",", 1)[1]
return BytesIO(base64.b64decode(b64))
# ── helpers ──────────────────────────────────────────────────────────────────
def new_prs():
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
return prs
def blank_slide(prs):
return prs.slides.add_slide(prs.slide_layouts[6])
def fill_bg(slide, color):
from pptx.oxml.ns import qn
from lxml import etree
bg = slide.background
fill = bg.fill
fill.solid()
fill.fore_color.rgb = color
def add_rect(slide, l, t, w, h, fill_color, line_color=None, line_w=Pt(0)):
shape = slide.shapes.add_shape(1, Inches(l), Inches(t), Inches(w), Inches(h))
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
if line_color:
shape.line.color.rgb = line_color
shape.line.width = line_w
else:
shape.line.fill.background()
return shape
def add_tb(slide, l, t, w, h, text, size, bold=False, color=DARK_TXT,
align=PP_ALIGN.LEFT, wrap=True, italic=False):
tb = slide.shapes.add_textbox(Inches(l), Inches(t), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.margin_left = tf.margin_right = tf.margin_top = tf.margin_bottom = 0
p = tf.paragraphs[0]
p.alignment = align
r = p.add_run()
r.text = text
r.font.name = "Calibri"
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
return tb
def add_para(tf, text, size, bold=False, color=DARK_TXT,
align=PP_ALIGN.LEFT, italic=False, bullet=False, space_before=0):
p = tf.add_paragraph()
p.alignment = align
p.space_before = Pt(space_before)
if bullet:
from pptx.oxml.ns import qn
from lxml import etree
pPr = p._p.get_or_add_pPr()
buChar = etree.SubElement(pPr, qn('a:buChar'))
buChar.set('char', '•')
r = p.add_run()
r.text = text
r.font.name = "Calibri"
r.font.size = Pt(size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
return p
def title_bar(slide, title, subtitle=None):
"""Navy top bar with white title."""
add_rect(slide, 0, 0, 13.333, 1.25, NAVY)
# teal left accent strip
add_rect(slide, 0, 0, 0.18, 1.25, TEAL)
add_tb(slide, 0.3, 0.1, 12.5, 0.8, title, 30, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
if subtitle:
add_tb(slide, 0.3, 0.88, 12.5, 0.4, subtitle, 14, bold=False,
color=RGBColor(0xC8, 0xE6, 0xF0), align=PP_ALIGN.LEFT)
# ════════════════════════════════════════════════════════════════════════════
prs = new_prs()
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 1 — Layers of the GFB
# ─────────────────────────────────────────────────────────────────────────────
s1 = blank_slide(prs)
fill_bg(s1, LIGHT_BG)
title_bar(s1, "Glomerular Filtration Barrier — Structural Layers",
"Three-layered ultrafiltration unit separating capillary blood from Bowman's space")
# Main image (capillary wall diagram) — right column
s1.shapes.add_picture(img_stream(0), Inches(7.5), Inches(1.4), Inches(5.5), Inches(5.6))
# Left content column
# Layer boxes
layers = [
("1. Fenestrated Endothelium",
"Pores 70–100 nm in diameter • Allow fluid, solutes & plasma proteins\n"
"Block blood cells • Coated by negatively charged glycocalyx",
TEAL),
("2. Glomerular Basement Membrane (GBM)",
"Trilaminar: Lamina rara interna → Lamina densa → Lamina rara externa\n"
"Most significant protein barrier • Contains Type IV collagen, Laminin,\n"
"Agrin & Perlecan (heparan sulfate proteoglycans)",
NAVY),
("3. Podocytes & Slit Diaphragm",
"Foot processes interdigitate in zipper pattern • Filtration slits 25–60 nm\n"
"Slit diaphragm: Nephrin, Podocin, CD2AP, α-actinin-4\n"
"Podocalyxin on apical surface — negative charge keeps slits open",
TEAL),
]
y = 1.45
for title_l, body, col in layers:
# colored header strip
add_rect(s1, 0.25, y, 7.0, 0.35, col)
add_tb(s1, 0.35, y+0.03, 6.8, 0.3, title_l, 12, bold=True, color=WHITE)
# body box
add_rect(s1, 0.25, y+0.35, 7.0, 0.9, WHITE, line_color=col, line_w=Pt(1))
tb = s1.shapes.add_textbox(Inches(0.35), Inches(y+0.37), Inches(6.8), Inches(0.88))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.05)
tf.margin_top = tf.margin_bottom = 0
p = tf.paragraphs[0]
r = p.add_run()
r.text = body
r.font.name = "Calibri"
r.font.size = Pt(11)
r.font.color.rgb = DARK_TXT
y += 1.5
# Caption
add_tb(s1, 7.5, 7.05, 5.5, 0.4,
"Fig. Structure of the glomerular capillary wall (Costanzo Physiology 7th Ed.)",
9, italic=True, color=RGBColor(0x55,0x55,0x55), align=PP_ALIGN.CENTER)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 2 — Filtration Selectivity (Size + Charge) & GBM Composition
# ─────────────────────────────────────────────────────────────────────────────
s2 = blank_slide(prs)
fill_bg(s2, LIGHT_BG)
title_bar(s2, "GFB — Filtration Selectivity: Size & Charge Barriers",
"Dual mechanism restricts macromolecule passage across the filtration barrier")
# GBM composition image — right top
s2.shapes.add_picture(img_stream(2), Inches(7.4), Inches(1.35), Inches(5.6), Inches(3.5))
add_tb(s2, 7.4, 4.9, 5.6, 0.35,
"Fig. GBM composition: Collagen IV, Laminin, Agrin, Perlecan, Nidogen\n(Robbins Pathologic Basis of Disease)",
9, italic=True, color=RGBColor(0x55,0x55,0x55), align=PP_ALIGN.CENTER)
# Slit diaphragm image — right bottom
s2.shapes.add_picture(img_stream(1), Inches(7.4), Inches(5.3), Inches(5.6), Inches(2.0))
add_tb(s2, 7.4, 7.15, 5.6, 0.3,
"Fig. Slit diaphragm proteins — Nephrin, Podocin, CD2AP (Robbins)",
9, italic=True, color=RGBColor(0x55,0x55,0x55), align=PP_ALIGN.CENTER)
# LEFT: two side-by-side sub-boxes
# SIZE box
add_rect(s2, 0.25, 1.35, 3.4, 0.38, TEAL)
add_tb(s2, 0.35, 1.37, 3.2, 0.33, "SIZE SELECTIVITY", 13, bold=True, color=WHITE)
add_rect(s2, 0.25, 1.73, 3.4, 2.6, WHITE, line_color=TEAL, line_w=Pt(1.5))
tb = s2.shapes.add_textbox(Inches(0.35), Inches(1.76), Inches(3.2), Inches(2.5))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left = Inches(0.04); tf.margin_top = tf.margin_bottom = 0
size_rows = [
("Endothelial pores", "70–100 nm", "Bar blood cells"),
("GBM (lamina densa)", "~8 nm radius", "Primary protein barrier"),
("Filtration slits", "25–60 nm", "Additional barrier"),
]
header_p = tf.paragraphs[0]
header_p.alignment = PP_ALIGN.CENTER
hr = header_p.add_run()
hr.text = "Component Pore/Slit Size Role"
hr.font.name = "Calibri"; hr.font.size = Pt(9.5); hr.font.bold = True; hr.font.color.rgb = TEAL
for comp, sz, role in size_rows:
add_para(tf, f"{comp:<22} {sz:<16} {role}", 9.5, color=DARK_TXT, space_before=4)
add_para(tf, "\nSmall ions (Na⁺, K⁺, Cl⁻) freely filtered regardless of size.",
9.5, italic=True, color=TEAL)
# CHARGE box
add_rect(s2, 3.85, 1.35, 3.35, 0.38, NAVY)
add_tb(s2, 3.95, 1.37, 3.15, 0.33, "CHARGE SELECTIVITY", 13, bold=True, color=WHITE)
add_rect(s2, 3.85, 1.73, 3.35, 2.6, WHITE, line_color=NAVY, line_w=Pt(1.5))
tb2 = s2.shapes.add_textbox(Inches(3.95), Inches(1.76), Inches(3.15), Inches(2.5))
tf2 = tb2.text_frame; tf2.word_wrap = True
tf2.margin_left = Inches(0.04); tf2.margin_top = tf2.margin_bottom = 0
charge_lines = [
("Fixed –ve charges on all 3 layers", False),
("Sources: HSPGs (Agrin, Perlecan),", False),
(" Podocalyxin, Glycocalyx", False),
("", False),
("• Repel albumin (net –ve at pH 7.4)", True),
("• Attract +ve solutes", True),
("• Cationic dextran > neutral > anionic", True),
(" dextran filtration (classic experiment)", False),
("", False),
("Disease: Loss of anionic charges →", False),
(" proteinuria (MCD, Diabetic nephropathy)", False),
]
p0 = tf2.paragraphs[0]
r0 = p0.add_run()
r0.text = charge_lines[0][0]
r0.font.name = "Calibri"; r0.font.size = Pt(9.5); r0.font.color.rgb = DARK_TXT
for txt, blt in charge_lines[1:]:
add_para(tf2, txt, 9.5, color=DARK_TXT, space_before=2)
# Bottom note
add_rect(s2, 0.25, 4.55, 7.0, 0.55, LIGHT_TEAL)
add_tb(s2, 0.35, 4.6, 6.8, 0.45,
"Key concept: For large solutes (proteins), BOTH size AND charge determine filterability. "
"Charge selectivity is negligible for small ions but critical for albumin-sized molecules.",
10, italic=True, color=NAVY, wrap=True)
# Starling forces note
add_rect(s2, 0.25, 5.3, 7.0, 1.9, WHITE, line_color=TEAL, line_w=Pt(1))
add_tb(s2, 0.35, 5.35, 6.8, 0.3, "Starling Forces Driving GFR", 12, bold=True, color=TEAL)
tb3 = s2.shapes.add_textbox(Inches(0.35), Inches(5.68), Inches(6.8), Inches(1.4))
tf3 = tb3.text_frame; tf3.word_wrap = True
tf3.margin_left = Inches(0.04); tf3.margin_top = 0
p3 = tf3.paragraphs[0]
r3 = p3.add_run()
r3.text = "GFR = Kf [(PGC − PBS) − (πGC − πBS)]"
r3.font.name = "Calibri"; r3.font.size = Pt(11); r3.font.bold = True; r3.font.color.rgb = NAVY
starling_lines = [
"PGC = glomerular capillary hydrostatic pressure (favours filtration)",
"PBS = Bowman's space hydrostatic pressure (opposes filtration)",
"πGC = glomerular oncotic pressure (opposes filtration) | πBS ≈ 0",
"Kf = ultrafiltration coefficient (permeability × surface area)",
]
for ln in starling_lines:
add_para(tf3, ln, 9.5, color=DARK_TXT, space_before=3)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 3 — Clinical Diseases of the GFB
# ─────────────────────────────────────────────────────────────────────────────
s3 = blank_slide(prs)
fill_bg(s3, LIGHT_BG)
title_bar(s3, "GFB — Clinical Diseases & Pathological Mechanisms",
"Disruption of the filtration barrier leads to characteristic nephropathies")
diseases = [
("Minimal Change Disease (MCD)",
TEAL,
[
"Loss of anionic charges (heparan sulfate proteoglycans)",
"Podocyte CD80 activation → actin reorganisation → foot process effacement",
"Circulating factors: IL-13, hemopexin, anti-nephrin antibodies",
"EM: diffuse foot process effacement | LM: normal glomeruli",
"Result: Nephrotic syndrome — massive proteinuria, hypoalbuminaemia",
]),
("Focal Segmental Glomerulosclerosis (FSGS)",
NAVY,
[
"Mutations: NPHS1 (nephrin), NPHS2 (podocin), ACTN4 (α-actinin-4), TRPC6",
"Podocin anchors nephrin to membrane; TRPC6 regulates Ca²⁺ entry",
"Focal & segmental scarring of glomeruli",
"Primary (circulating permeability factor) vs Secondary (obesity, HIV, drugs)",
"Result: Nephrotic syndrome — steroid-resistant proteinuria",
]),
("Diabetic Nephropathy",
RGBColor(0x1A, 0x6B, 0x3A),
[
"GBM thickening (increased Type IV collagen synthesis)",
"Loss of heparan sulfate proteoglycans → reduced anionic charge",
"Mesangial expansion → reduced filtration surface area (reduced Kf)",
"Microalbuminuria → overt proteinuria → progressive GFR decline",
"Advanced glycation end-products (AGEs) further injure podocytes & endothelium",
]),
("Alport Syndrome",
ACCENT,
[
"Mutations in COL4A3 / COL4A4 / COL4A5 → abnormal Type IV collagen α-chains",
"GBM shows 'basket-weave' appearance on EM",
"Triad: haematuria + sensorineural deafness + ocular defects",
"X-linked (COL4A5), autosomal recessive/dominant (COL4A3/A4)",
"Progressive → ESRD in males by 3rd decade",
]),
]
# 2×2 grid
positions = [(0.25, 1.35), (6.85, 1.35), (0.25, 4.45), (6.85, 4.45)]
box_w, box_h = 6.3, 2.85
for i, (dis_name, col, bullets) in enumerate(diseases):
lx, ty = positions[i]
# header bar
add_rect(s3, lx, ty, box_w, 0.38, col)
add_tb(s3, lx+0.1, ty+0.04, box_w-0.2, 0.32, dis_name, 12, bold=True, color=WHITE)
# body
add_rect(s3, lx, ty+0.38, box_w, box_h-0.38, WHITE, line_color=col, line_w=Pt(1))
tb = s3.shapes.add_textbox(Inches(lx+0.12), Inches(ty+0.42), Inches(box_w-0.25), Inches(box_h-0.5))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left = Inches(0.02); tf.margin_top = 0
p_first = tf.paragraphs[0]
r_first = p_first.add_run()
r_first.text = "• " + bullets[0]
r_first.font.name = "Calibri"; r_first.font.size = Pt(9.5); r_first.font.color.rgb = DARK_TXT
for b in bullets[1:]:
add_para(tf, "• " + b, 9.5, color=DARK_TXT, space_before=3)
# bottom footnote
add_rect(s3, 0.25, 7.2, 12.9, 0.27, LIGHT_TEAL)
add_tb(s3, 0.4, 7.22, 12.7, 0.23,
"Nephrotic features = massive proteinuria, hypoalbuminaemia, oedema, hyperlipidaemia | "
"Nephritic features = haematuria, RBC casts, oliguria, hypertension",
9, italic=True, color=NAVY)
# ─────────────────────────────────────────────────────────────────────────────
# SLIDE 4 — GFB Correlation with UTI
# ─────────────────────────────────────────────────────────────────────────────
s4 = blank_slide(prs)
fill_bg(s4, LIGHT_BG)
title_bar(s4, "UTI & the Glomerular Filtration Barrier — Clinical Correlation",
"How urinary tract infections impact glomerular filtration and renal function")
# ── UTI definitions strip ──
add_rect(s4, 0.25, 1.38, 12.85, 0.35, NAVY)
add_tb(s4, 0.35, 1.41, 12.6, 0.3, "UTI Spectrum: Definitions", 11, bold=True, color=WHITE)
add_rect(s4, 0.25, 1.73, 12.85, 0.45, WHITE, line_color=NAVY, line_w=Pt(1))
def_tb = s4.shapes.add_textbox(Inches(0.35), Inches(1.75), Inches(12.6), Inches(0.42))
def_tf = def_tb.text_frame; def_tf.word_wrap = True
def_tf.margin_left = Inches(0.04); def_tf.margin_top = 0
dp = def_tf.paragraphs[0]; dr = dp.add_run()
dr.text = ("ASB: >10⁵ org/mL without symptoms | "
"Cystitis: >10² org/mL + lower tract symptoms (dysuria, frequency) | "
"Pyelonephritis: >10⁵ org/mL + parenchymal infiltration + fever + loin pain → may → sepsis")
dr.font.name = "Calibri"; dr.font.size = Pt(9.5); dr.font.color.rgb = DARK_TXT
# ── 3-column correlation section ──
cols_data = [
("DIRECT GFB IMPACT",
TEAL,
[
"Ascending pyelonephritis → bacterial infiltration of renal parenchyma",
"Inflammatory mediators (IL-6, TNF-α) damage podocytes → transient proteinuria",
"Gram-negative LPS binds TLR-4 on podocytes → foot process injury",
"Viral-like products (poly-IC) bind TLR-3 → MCD-like proteinuria",
"Septic AKI from severe pyelonephritis → ↓ GFR via haemodynamic compromise",
"Direct tubular toxicity compounds filtration defects",
]),
("REFLUX & CHRONIC DAMAGE",
NAVY,
[
"Vesicoureteral Reflux (VUR) + recurrent UTI → reflux nephropathy",
"Repeated infection → renal cortical scarring → nephron loss",
"Reduced filtration surface area (↓ Kf) → progressive CKD",
"Post-transplant UTI (especially with stents/VUR) → allograft pyelonephritis",
"Transient graft dysfunction during acute episode",
"Recurrent UTI post-transplant: address VUR; TMP-SMX prophylaxis",
]),
("PREGNANCY: HIGH-RISK UTI",
ACCENT,
[
"Progesterone → ureteral dilation & stasis → ↑ ascending infection risk",
"ASB affects 2–9% pregnant women; 30% progress to pyelonephritis if untreated",
"Pyelonephritis → sepsis → permanent renal injury → ↓ long-term GFR",
"Screen: Urine culture at 12–16 weeks (USPSTF Grade A)",
"Tx ASB: Cephalexin / Nitrofurantoin × 3–7 days",
"Pyelonephritis: IV Ceftriaxone 1 g daily + hydration + obstetric review",
]),
]
col_w = 4.2
starts_x = [0.25, 4.65, 9.05]
for j, (col_title, col_color, bullets) in enumerate(cols_data):
lx = starts_x[j]
add_rect(s4, lx, 2.28, col_w, 0.38, col_color)
add_tb(s4, lx+0.08, 2.3, col_w-0.16, 0.34, col_title, 10.5, bold=True, color=WHITE)
add_rect(s4, lx, 2.66, col_w, 3.6, WHITE, line_color=col_color, line_w=Pt(1))
tb = s4.shapes.add_textbox(Inches(lx+0.1), Inches(2.7), Inches(col_w-0.2), Inches(3.5))
tf = tb.text_frame; tf.word_wrap = True
tf.margin_left = Inches(0.03); tf.margin_top = 0
p0 = tf.paragraphs[0]; r0 = p0.add_run()
r0.text = "• " + bullets[0]
r0.font.name = "Calibri"; r0.font.size = Pt(9.5); r0.font.color.rgb = DARK_TXT
for b in bullets[1:]:
add_para(tf, "• " + b, 9.5, color=DARK_TXT, space_before=4)
# ── Summary table ──
add_rect(s4, 0.25, 6.4, 12.85, 0.3, TEAL)
add_tb(s4, 0.35, 6.42, 12.6, 0.26, "GFB Damage Pathway Summary", 10, bold=True, color=WHITE)
add_rect(s4, 0.25, 6.7, 12.85, 0.75, WHITE, line_color=TEAL, line_w=Pt(1))
sum_tb = s4.shapes.add_textbox(Inches(0.35), Inches(6.73), Inches(12.6), Inches(0.7))
sum_tf = sum_tb.text_frame; sum_tf.word_wrap = True
sum_tf.margin_left = Inches(0.04); sum_tf.margin_top = 0
sp = sum_tf.paragraphs[0]; sr = sp.add_run()
sr.text = ("Gram-negative UTI (LPS) → TLR-4 activation on podocytes → foot process effacement → proteinuria | "
"Recurrent UTI + VUR → reflux nephropathy → ↓ GFR | "
"Severe pyelonephritis → sepsis → AKI (↓ PGC, ↓ Kf) → acute GFR fall")
sr.font.name = "Calibri"; sr.font.size = Pt(9.5); sr.font.bold = False; sr.font.color.rgb = DARK_TXT
# ── Save ──────────────────────────────────────────────────────────────────────
out = "/tmp/workspace/gfb-slides/GFB_and_UTI.pptx"
prs.save(out)
print(f"Saved → {out}")
cd /tmp/workspace/gfb-slides && python make_slides.py 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/tmp/workspace/gfb-slides/GFB_and_UTI.pptx') print(f'Slides: {len(prs.slides)}') print(f'Dimensions: {prs.slide_width.inches:.2f}\" x {prs.slide_height.inches:.2f}\"') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text[:60] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f'Slide {i}: {texts[0] if texts else \"(no text)\"}') import os print(f'File size: {os.path.getsize(\"/tmp/workspace/gfb-slides/GFB_and_UTI.pptx\")/1024:.1f} KB') "
GFB and UTI
Presentation · PPTX