Prepare a detail seminar on Bscan and ultrasound biomicroscopy with references as iam a second year resident in ophathalmology ,so kindly give acurate and detail infirmation And make ppt of this informagion
ultrasound biomicroscopy ophthalmology anterior segment
B-scan ultrasonography ocular posterior segment
PMID: 40189719
PMID: 38214059
mkdir -p /tmp/workspace/bscan-ubm-seminar && ls /tmp/workspace/
~/bscan-ubm-seminar/create_ppt.py
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.oxml.ns import qn
from lxml import etree
import copy
# ── Color palette ──────────────────────────────────────────────────────────────
DARK_BLUE = RGBColor(0x0A, 0x2E, 0x5C) # header / title background
MID_BLUE = RGBColor(0x1A, 0x5F, 0x9C) # accent bar
LIGHT_BLUE = RGBColor(0xD6, 0xE8, 0xF7) # light fill
TEAL = RGBColor(0x00, 0x7A, 0x8A) # section heading highlight
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
DARK_GRAY = RGBColor(0x33, 0x33, 0x33)
ACCENT_ORG = RGBColor(0xE8, 0x6A, 0x1A) # orange accent
LIGHT_GRAY = RGBColor(0xF4, 0xF4, 0xF4)
LIME_GREEN = RGBColor(0x2E, 0x8B, 0x57)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
BLANK = prs.slide_layouts[6]
TITLE_CONTENT = prs.slide_layouts[1]
# ── Helper: filled rectangle ───────────────────────────────────────────────────
def add_rect(slide, left, top, width, height, fill_color, line_color=None, line_width=0):
from pptx.enum.shapes import MSO_SHAPE
shp = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE, Inches(left), Inches(top),
Inches(width), Inches(height))
shp.fill.solid()
shp.fill.fore_color.rgb = fill_color
if line_color:
shp.line.color.rgb = line_color
shp.line.width = Pt(line_width)
else:
shp.line.fill.background()
shp.shadow.inherit = False
return shp
# ── Helper: text box ───────────────────────────────────────────────────────────
def add_text(slide, text, left, top, width, height,
font_name="Calibri", font_size=16, bold=False, italic=False,
color=DARK_GRAY, align=PP_ALIGN.LEFT, wrap=True, anchor=MSO_ANCHOR.TOP):
tb = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height))
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = anchor
tf.margin_left = Inches(0.05)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.03)
tf.margin_bottom= Inches(0.03)
p = tf.paragraphs[0]
p.text = text
p.alignment = align
r = p.runs[0]
r.font.name = font_name
r.font.size = Pt(font_size)
r.font.bold = bold
r.font.italic = italic
r.font.color.rgb = color
return tb
# ── Helper: multi-line text frame with optional bullets ────────────────────────
def add_bullet_text(slide, lines, left, top, width, height,
font_name="Calibri", font_size=13, color=DARK_GRAY,
title=None, title_size=15, title_color=MID_BLUE):
tb = slide.shapes.add_textbox(Inches(left), Inches(top), Inches(width), Inches(height))
tf = tb.text_frame
tf.word_wrap = True
tf.margin_left = Inches(0.08)
tf.margin_right = Inches(0.05)
tf.margin_top = Inches(0.05)
tf.margin_bottom= Inches(0.03)
first = True
if title:
p = tf.paragraphs[0] if first else tf.add_paragraph()
first = False
r = p.add_run()
r.text = title
r.font.name = font_name
r.font.size = Pt(title_size)
r.font.bold = True
r.font.color.rgb = title_color
for line in lines:
p = tf.paragraphs[0] if (first and not title) else tf.add_paragraph()
first = False
indent = line.startswith(" ")
r = p.add_run()
r.text = (" " if indent else "") + line.strip()
r.font.name = font_name
r.font.size = Pt(font_size - (1 if indent else 0))
r.font.bold = False
r.font.color.rgb = color
return tb
# ── Helper: header bar ─────────────────────────────────────────────────────────
def add_header(slide, title_text, subtitle_text=None):
add_rect(slide, 0, 0, 13.333, 1.15, DARK_BLUE)
add_rect(slide, 0, 1.15, 13.333, 0.07, ACCENT_ORG)
add_text(slide, title_text, 0.3, 0.08, 12.7, 0.75,
font_name="Calibri", font_size=26, bold=True,
color=WHITE, align=PP_ALIGN.LEFT)
if subtitle_text:
add_text(slide, subtitle_text, 0.35, 0.75, 12.5, 0.38,
font_name="Calibri", font_size=14, bold=False,
color=LIGHT_BLUE, align=PP_ALIGN.LEFT)
# ── Helper: footer ─────────────────────────────────────────────────────────────
def add_footer(slide, text="Seminar: B-Scan Ultrasonography & Ultrasound Biomicroscopy | Ophthalmology Residency 2026"):
add_rect(slide, 0, 7.18, 13.333, 0.32, DARK_BLUE)
add_text(slide, text, 0.2, 7.19, 13.0, 0.28,
font_name="Calibri", font_size=9, bold=False,
color=LIGHT_BLUE, align=PP_ALIGN.CENTER)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 1: TITLE SLIDE
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_rect(slide, 0, 0, 13.333, 7.5, DARK_BLUE)
# Decorative accent bar left
add_rect(slide, 0, 0, 0.22, 7.5, ACCENT_ORG)
# Decorative light rectangle
add_rect(slide, 0.5, 1.5, 12.333, 4.5, MID_BLUE)
add_text(slide, "OCULAR ULTRASONOGRAPHY", 0.7, 1.7, 12.0, 0.85,
font_name="Calibri", font_size=13, bold=False, color=LIGHT_BLUE,
align=PP_ALIGN.CENTER)
add_text(slide, "B-Scan Ultrasonography &\nUltrasound Biomicroscopy (UBM)", 0.7, 2.1, 12.0, 1.7,
font_name="Calibri", font_size=38, bold=True, color=WHITE,
align=PP_ALIGN.CENTER)
add_rect(slide, 3.5, 3.85, 6.333, 0.06, ACCENT_ORG)
add_text(slide, "A Comprehensive Seminar for Ophthalmology Residents",
0.7, 3.95, 12.0, 0.55,
font_name="Calibri", font_size=16, italic=True, color=LIGHT_BLUE,
align=PP_ALIGN.CENTER)
add_text(slide, "Second Year Residency • Department of Ophthalmology",
0.7, 4.5, 12.0, 0.45,
font_name="Calibri", font_size=13, color=LIGHT_BLUE,
align=PP_ALIGN.CENTER)
add_text(slide, "References: Kanski's Clinical Ophthalmology 10th Ed. • Wills Eye Manual 7th Ed. •\nWu et al. Doc Ophthalmol 2025 • Chan et al. Clin Exp Ophthalmol 2024 • Janssens et al. Acta Ophthalmol 2022",
0.7, 5.05, 12.0, 0.65,
font_name="Calibri", font_size=10, color=RGBColor(0x99,0xC4,0xE8),
align=PP_ALIGN.CENTER)
add_footer(slide)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 2: OVERVIEW / AGENDA
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Seminar Overview", "What we will cover today")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
sections = [
("01", "Introduction to Ocular Ultrasound", "Physics, instrumentation, A-scan vs B-scan vs UBM"),
("02", "B-Scan Ultrasonography", "Technique, gain, kinetic echography, interpretation"),
("03", "Clinical Applications of B-Scan", "Posterior segment disorders - RD, VH, tumors, FB"),
("04", "Ultrasound Biomicroscopy (UBM)", "Principles, 50-100 MHz imaging of anterior segment"),
("05", "Clinical Applications of UBM", "Glaucoma, angle closure, ciliary body, cataract"),
("06", "Artifacts, Limitations & Pitfalls", "What can go wrong and how to avoid errors"),
("07", "Recent Evidence & Advances", "2022-2026 meta-analyses and AI-assisted imaging"),
("08", "Case-Based Scenarios", "Practical interpretation for residents"),
]
col1_items = sections[:4]
col2_items = sections[4:]
for i, (num, title, desc) in enumerate(col1_items):
y = 1.45 + i * 1.2
add_rect(slide, 0.3, y, 0.6, 0.55, MID_BLUE)
add_text(slide, num, 0.3, y, 0.6, 0.55, font_size=14, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_text(slide, title, 1.05, y, 5.0, 0.35, font_size=13, bold=True, color=DARK_BLUE)
add_text(slide, desc, 1.05, y+0.3, 5.0, 0.35, font_size=10, italic=True, color=DARK_GRAY)
for i, (num, title, desc) in enumerate(col2_items):
y = 1.45 + i * 1.2
add_rect(slide, 6.9, y, 0.6, 0.55, TEAL)
add_text(slide, num, 6.9, y, 0.6, 0.55, font_size=14, bold=True, color=WHITE,
align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
add_text(slide, title, 7.6, y, 5.4, 0.35, font_size=13, bold=True, color=DARK_BLUE)
add_text(slide, desc, 7.6, y+0.3, 5.4, 0.35, font_size=10, italic=True, color=DARK_GRAY)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 3: PHYSICS OF ULTRASOUND
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Physics of Ocular Ultrasound", "Fundamental principles every resident must know")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
# Left column
add_rect(slide, 0.2, 1.35, 6.0, 5.8, WHITE)
add_rect(slide, 0.2, 1.35, 6.0, 0.4, MID_BLUE)
add_text(slide, "Core Physics Principles", 0.3, 1.37, 5.8, 0.36,
font_size=14, bold=True, color=WHITE)
physics = [
"Sound waves: Mechanical vibrations propagating through tissue",
"Frequency: Inverse relationship with penetration & resolution",
"Speed in ocular tissue: ~1,550 m/s",
"Piezoelectric transducer converts electrical → mechanical energy",
"Echo formation at acoustically distinct tissue interfaces",
"Attenuation: Signal loss with increasing depth",
"Gain: Amplification of echo signal (analogous to volume)",
"A-scan: 1D amplitude display - measures axial length",
"B-scan: 2D brightness-modulated image (10 MHz)",
"UBM: Very high frequency 50-100 MHz for anterior segment",
"Higher frequency = Better resolution, Less penetration",
]
for i, item in enumerate(physics):
y = 1.85 + i * 0.44
if i < len(physics):
add_rect(slide, 0.28, y+0.05, 0.18, 0.25, ACCENT_ORG)
add_text(slide, item, 0.55, y, 5.55, 0.42, font_size=11.5, color=DARK_GRAY)
# Right column
add_rect(slide, 6.8, 1.35, 6.2, 5.8, WHITE)
add_rect(slide, 6.8, 1.35, 6.2, 0.4, TEAL)
add_text(slide, "Comparison: A-Scan vs B-Scan vs UBM", 6.9, 1.37, 6.0, 0.36,
font_size=14, bold=True, color=WHITE)
table_data = [
("Feature", "A-Scan", "B-Scan", "UBM"),
("Frequency", "8–10 MHz", "10 MHz", "50–100 MHz"),
("Display", "1D amplitude", "2D cross-section", "2D anterior seg"),
("Resolution", "Moderate", "Moderate", "25 µm axial"),
("Penetration", "Full globe", "Full globe", "Anterior 1/5"),
("Primary Use", "Axial length, IOL power", "Posterior segment", "Angle, ciliary body"),
("Coupling", "Direct/immersion", "Gel/closed lid", "Water bath"),
]
col_widths = [1.8, 1.2, 1.2, 1.4]
col_starts = [6.85, 8.65, 9.85, 11.05]
row_h = 0.62
for r_idx, row in enumerate(table_data):
y = 1.85 + r_idx * row_h
for c_idx, cell in enumerate(row):
bg = MID_BLUE if r_idx == 0 else (LIGHT_BLUE if r_idx % 2 == 0 else WHITE)
fg = WHITE if r_idx == 0 else DARK_GRAY
add_rect(slide, col_starts[c_idx], y, col_widths[c_idx]-0.05, row_h-0.04,
bg, line_color=RGBColor(0xCC,0xCC,0xCC), line_width=0.5)
add_text(slide, cell, col_starts[c_idx]+0.05, y+0.05,
col_widths[c_idx]-0.1, row_h-0.12,
font_size=10.5 if r_idx > 0 else 11, bold=(r_idx == 0),
color=fg, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 4: B-SCAN TECHNIQUE
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "B-Scan Ultrasonography: Technique", "Practical step-by-step approach")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
# Equipment box
add_rect(slide, 0.2, 1.35, 4.0, 2.7, WHITE)
add_rect(slide, 0.2, 1.35, 4.0, 0.38, MID_BLUE)
add_text(slide, "Equipment & Setup", 0.3, 1.37, 3.8, 0.34, font_size=13, bold=True, color=WHITE)
equip = [
"10 MHz B-scan probe",
"Methylcellulose or ophthalmic gel (coupling agent)",
"Monitor with real-time display",
"Topical anaesthetic (if probe directly on globe)",
"Marker on probe = marker on screen (orientation)",
"Gain setting: Higher = more echo amplification",
]
for i, it in enumerate(equip):
add_rect(slide, 0.28, 1.82+i*0.36, 0.15, 0.22, MID_BLUE)
add_text(slide, it, 0.5, 1.78+i*0.36, 3.6, 0.36, font_size=11, color=DARK_GRAY)
# Scanning protocol
add_rect(slide, 4.4, 1.35, 4.5, 2.7, WHITE)
add_rect(slide, 4.4, 1.35, 4.5, 0.38, TEAL)
add_text(slide, "Scanning Protocol", 4.5, 1.37, 4.3, 0.34, font_size=13, bold=True, color=WHITE)
protocol = [
"Vertical scan: Marker pointing superiorly (toward brow)",
"Horizontal scan: Marker toward nose",
"Patient looks straight ahead, then up/down/left/right",
"Probe moves OPPOSITE to eye movement direction",
"Dynamic scan: Patient moves eye while probe is stationary",
"Axial scan: Probe perpendicular to corneal surface",
]
for i, it in enumerate(protocol):
add_rect(slide, 4.48, 1.82+i*0.36, 0.15, 0.22, TEAL)
add_text(slide, it, 4.7, 1.78+i*0.36, 4.1, 0.36, font_size=11, color=DARK_GRAY)
# Gain interpretation
add_rect(slide, 9.1, 1.35, 4.0, 2.7, WHITE)
add_rect(slide, 9.1, 1.35, 4.0, 0.38, ACCENT_ORG)
add_text(slide, "Gain & Echo Interpretation", 9.2, 1.37, 3.8, 0.34, font_size=13, bold=True, color=WHITE)
gain_items = [
"Low gain: Only high-reflectivity echoes visible",
"High gain: Low-reflectivity echoes also visible",
"Gain should be adjusted per lesion studied",
"Dense VH: Increase gain to see through opacity",
"Intraocular tumors: Both low & high gain needed",
"Normal vitreous: Optically empty (no echoes)",
]
for i, it in enumerate(gain_items):
add_rect(slide, 9.18, 1.82+i*0.36, 0.15, 0.22, ACCENT_ORG)
add_text(slide, it, 9.4, 1.78+i*0.36, 3.6, 0.36, font_size=11, color=DARK_GRAY)
# Contraindications/precautions row
add_rect(slide, 0.2, 4.2, 13.0, 2.75, WHITE)
add_rect(slide, 0.2, 4.2, 13.0, 0.38, DARK_BLUE)
add_text(slide, "Special Situations & Precautions", 0.35, 4.22, 12.5, 0.34,
font_size=14, bold=True, color=WHITE)
special = [
("Trauma / Possible Rupture", "Use CLOSED EYELID technique. Copious methylcellulose. NO pressure. Known ruptured globe = relative contraindication."),
("Silicone Oil / Intraocular Gas", "Perform scan with patient UPRIGHT to move oil/gas from posterior pole and reduce image distortion."),
("Dense Calcifications (phthisis)", "Poor image quality expected. Calcifications cause dense posterior acoustic shadowing."),
("Keratometry After Scan", "Wait at least 30 minutes after B-scan before keratometry readings to avoid corneal distortion."),
]
for i, (hd, tx) in enumerate(special):
x = 0.3 + i * 3.2
add_rect(slide, x, 4.68, 3.1, 0.28, LIGHT_BLUE)
add_text(slide, hd, x+0.05, 4.69, 3.0, 0.26, font_size=11, bold=True, color=DARK_BLUE)
add_text(slide, tx, x+0.05, 5.0, 3.0, 0.85, font_size=10, color=DARK_GRAY, wrap=True)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 5: B-SCAN CLINICAL APPLICATIONS - POSTERIOR SEGMENT
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "B-Scan: Clinical Applications", "Posterior segment disorders & diagnostic criteria")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
apps = [
("1. Media Opacities", MID_BLUE,
["Dense vitreous haemorrhage (VH)",
"Mature/hypermature cataract",
"Hyphema or corneal opacification",
"Goal: Rule out RD, choroidal pathology",
"TIP: Always scan VH eye to exclude\n RD and choroidal melanoma (Kanski 10th)"]),
("2. Retinal Detachment", TEAL,
["RD: Bright, highly reflective membrane",
"Funnel/V-shaped: Tractional RD (proliferative)",
"Rhegmatogenous: Mobile on kinetic scan",
"Taut, rigid: Tractional component",
"After-movement: Present in RD,\n absent in PVD & vitreous membranes"]),
("3. Vitreous Pathology", ACCENT_ORG,
["Incomplete PVD: Immobile retina with VH",
"Asteroid hyalosis: Dense, immobile echoes",
"Synchysis scintillans: Mobile bright echoes",
"Vitreous membranes: Low-reflectivity bands",
"After-movement: Present; distinguish\n from retinal detachment"]),
("4. Intraocular Tumors", RGBColor(0x5A,0x1B,0x8C),
["Choroidal melanoma: Dome/collar-stud shape",
" High initial, low internal reflectivity",
" Choroidal excavation pathognomonic",
" Acoustic quiet zone within lesion",
"Metastasis: Irregular, high reflectivity",
"Hemangioma: High uniform reflectivity"]),
("5. Trauma & Foreign Bodies", LIME_GREEN,
["Scleral rupture: posterior to muscle insertions",
"IOFB: Metal/glass = bright echo + posterior shadow",
"Wood: Variable, may appear isoechoic",
"B-scan only helpful in anterior orbit for IOFB",
"Use closed-lid technique in trauma"]),
("6. Other Indications", DARK_BLUE,
["Posterior scleritis: T-sign (fluid in Tenon's capsule)",
"Choroidal detachment: Smooth, bullous elevation",
"Optic disc drusen: Hyperechoic optic disc",
"Optic disc coloboma: Excavation at disc",
"Screen blind eyes before evisceration\n (rule out occult melanoma)"]),
]
for i, (title, color, items) in enumerate(apps):
col = i % 3
row = i // 3
x = 0.2 + col * 4.35
y = 1.38 + row * 2.9
add_rect(slide, x, y, 4.1, 2.7, WHITE)
add_rect(slide, x, y, 4.1, 0.36, color)
add_text(slide, title, x+0.1, y+0.03, 3.9, 0.3, font_size=12, bold=True, color=WHITE)
for j, item in enumerate(items):
is_sub = item.startswith(" ")
add_text(slide, (" " if is_sub else "• ") + item.strip(),
x+0.12, y+0.44+j*0.37, 3.85, 0.38,
font_size=10.2, color=DARK_GRAY, italic=is_sub)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 6: KINETIC ECHOGRAPHY & DIFFERENTIAL
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Kinetic Echography & Echo Interpretation", "Dynamic assessment of intraocular membranes")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
# Left panel: After-movement table
add_rect(slide, 0.2, 1.35, 6.2, 5.8, WHITE)
add_rect(slide, 0.2, 1.35, 6.2, 0.38, MID_BLUE)
add_text(slide, "After-Movement Analysis: Key Differential", 0.3, 1.37, 6.0, 0.34,
font_size=14, bold=True, color=WHITE)
diff_table = [
("Structure", "After-Movement", "Key Features", "Clinical Dx"),
("Retinal Detachment", "Present (brisk)", "Highly reflective\nConvex shape", "RD"),
("Vitreous Membranes", "Present (prolonged)", "Low reflectivity\nUndulates freely", "VH, PVD"),
("Tractional RD", "Absent/minimal", "Taut membranes\nV or funnel shape", "PDR, trauma"),
("Choroidal Det.", "None", "Smooth, bullous\nDoes NOT cross disc", "Hypotony, trauma"),
("Intraocular FB", "None / flutter", "Bright echo\nPosterior shadow", "Trauma"),
("Asteroid Hyalosis", "Present, dense", "Multiple bright dots\nIn vitreous body", "Benign"),
("PVD", "Present (brisk)", "Low-reflective line\nMobile", "No RD"),
]
cw = [2.2, 1.5, 1.6, 1.0]
cx = [0.25, 2.45, 3.95, 5.55]
rh = 0.6
for ri, row in enumerate(diff_table):
ry = 1.82 + ri * rh
for ci, cell in enumerate(row):
bg = MID_BLUE if ri == 0 else (LIGHT_BLUE if ri % 2 == 0 else WHITE)
fg = WHITE if ri == 0 else DARK_GRAY
add_rect(slide, cx[ci], ry, cw[ci]-0.04, rh-0.04,
bg, line_color=RGBColor(0xCC,0xCC,0xCC), line_width=0.5)
add_text(slide, cell, cx[ci]+0.04, ry+0.04, cw[ci]-0.1, rh-0.1,
font_size=10 if ri > 0 else 11, bold=(ri == 0),
color=fg, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
# Right panel: Echo reflectivity guide
add_rect(slide, 6.7, 1.35, 6.4, 5.8, WHITE)
add_rect(slide, 6.7, 1.35, 6.4, 0.38, ACCENT_ORG)
add_text(slide, "Acoustic Reflectivity Guide for Tumors", 6.8, 1.37, 6.2, 0.34,
font_size=14, bold=True, color=WHITE)
reflectivity = [
("CHOROIDAL MELANOMA", ACCENT_ORG, [
"Dome or collar-stud shape",
"High initial spike (surface)",
"Low internal reflectivity (acoustic quiet zone)",
"Choroidal excavation (specific sign)",
"Orbital shadowing may be present",
"Vascularity on Doppler",
]),
("CHOROIDAL METASTASIS", MID_BLUE, [
"Irregular/lobulated shape",
"High reflectivity throughout",
"No choroidal excavation",
"Often bilateral / multifocal",
"Flat or plateau-shaped lesion",
]),
("CHOROIDAL HEMANGIOMA", LIME_GREEN, [
"Dome-shaped, smooth margins",
"HIGH uniform internal reflectivity",
"Located at posterior pole",
"Brighter than melanoma",
"Diffuse type: thickened choroid on B-scan",
]),
]
ypos = 1.85
for (title, color, items) in reflectivity:
add_rect(slide, 6.75, ypos, 6.2, 0.3, color)
add_text(slide, title, 6.8, ypos+0.02, 6.1, 0.26,
font_size=12, bold=True, color=WHITE)
ypos += 0.33
for item in items:
add_rect(slide, 6.82, ypos+0.05, 0.14, 0.2, color)
add_text(slide, item, 7.02, ypos, 5.95, 0.36, font_size=11.5, color=DARK_GRAY)
ypos += 0.36
ypos += 0.1
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 7: B-SCAN SPECIFIC CONDITIONS - RETINAL DETACHMENT TYPES
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "B-Scan: Retinal & Choroidal Detachments", "Distinguishing features on ultrasonography")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
# Four panels
panels = [
("RHEGMATOGENOUS RD", MID_BLUE, [
"Caused by retinal break (hole or tear)",
"B-scan: Bright, concave/convex membrane",
"Good after-movement on kinetic scan",
"Pigment cells may be seen in vitreous",
"May see retinal break on high-gain scan",
"Sub-retinal fluid: Optically clear",
"Macula off: Thickened convex appearance",
"Treatment: Scleral buckle / PPV",
]),
("TRACTIONAL RD", TEAL, [
"PDR, sickle cell, trauma, ROP",
"B-scan: Taut, concave membrane anteriorly",
"After-movement: ABSENT or very limited",
"V-shaped or funnel configuration",
"Closed funnel = both retinas touching",
"Vitreoretinal traction bands visible",
"Associated vitreous membranes",
"Treatment: PPV with membrane peeling",
]),
("EXUDATIVE / SEROUS RD", ACCENT_ORG, [
"Uveal effusion, posterior scleritis, tumors",
"B-scan: Smooth, bullous, shifting subretinal fluid",
"After-movement: PRESENT (shifting)",
"Subretinal fluid shifts with posture",
"No retinal break identified",
"Important: Choroidal tumor may be underlying cause",
"T-sign (posterior scleritis): fluid in Tenon's",
"Treatment: Address underlying cause",
]),
("CHOROIDAL DETACHMENT", DARK_BLUE, [
"Serous or hemorrhagic type",
"B-scan: Bullous smooth elevation",
"Does NOT cross the optic nerve",
"Does NOT cross the vortex veins",
"May be bilateral and kissing configuration",
"Serous: Low-reflective sub-choroidal space",
"Hemorrhagic: High-reflective content",
"B-scan distinguishes serous from hemorrhagic",
]),
]
for i, (title, color, items) in enumerate(panels):
x = 0.2 + (i % 2) * 6.5
y = 1.38 + (i // 2) * 3.0
add_rect(slide, x, y, 6.2, 2.78, WHITE)
add_rect(slide, x, y, 6.2, 0.36, color)
add_text(slide, title, x+0.1, y+0.03, 6.0, 0.3, font_size=12, bold=True, color=WHITE)
for j, item in enumerate(items):
add_rect(slide, x+0.18, y+0.47+j*0.3, 0.12, 0.2, color)
add_text(slide, item, x+0.38, y+0.44+j*0.3, 5.7, 0.3, font_size=11, color=DARK_GRAY)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 8: UBM - PRINCIPLES & INSTRUMENTATION
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Ultrasound Biomicroscopy (UBM): Principles", "High-frequency anterior segment imaging")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
# Left: Physics & specs
add_rect(slide, 0.2, 1.35, 5.8, 5.8, WHITE)
add_rect(slide, 0.2, 1.35, 5.8, 0.38, MID_BLUE)
add_text(slide, "UBM: Technical Specifications", 0.3, 1.37, 5.6, 0.34,
font_size=14, bold=True, color=WHITE)
specs = [
("Frequency", "50–100 MHz (standard 50 MHz; research up to 100 MHz)"),
("Axial Resolution", "25–30 µm (near-microscopic)"),
("Lateral Resolution", "~50 µm"),
("Tissue Penetration", "4–5 mm (anterior 1/5 of globe only)"),
("Image Depth", "Cornea to just behind lens equator"),
("Coupling Medium", "Water bath / eyelid speculum with saline/coupling gel"),
("Structures Visible", "Cornea, AC angle, iris, ciliary body, sulcus, zonules"),
("Scanning Mode", "Real-time 2D B-mode imaging"),
("Key Advantage", "Images structures BEHIND iris — impossible with AS-OCT"),
("Key Limitation", "Cannot image posterior segment"),
]
for i, (label, value) in enumerate(specs):
y = 1.82 + i * 0.46
add_rect(slide, 0.28, y+0.06, 1.7, 0.3, LIGHT_BLUE)
add_text(slide, label, 0.3, y+0.07, 1.65, 0.26, font_size=10.5, bold=True, color=MID_BLUE)
add_text(slide, value, 2.05, y, 3.8, 0.42, font_size=11, color=DARK_GRAY)
# Middle: Technique
add_rect(slide, 6.2, 1.35, 3.6, 5.8, WHITE)
add_rect(slide, 6.2, 1.35, 3.6, 0.38, TEAL)
add_text(slide, "UBM Technique", 6.3, 1.37, 3.4, 0.34, font_size=14, bold=True, color=WHITE)
technique = [
"Patient: Supine position",
"Apply topical anesthesia",
"Insert eyelid speculum",
"Fill with coupling medium (saline/hydroxypropyl methylcellulose)",
"Probe immersed in fluid bath - no direct contact with eye",
"Transverse scan: Parallel to limbus",
"Longitudinal scan: Perpendicular to limbus",
"Gaze directed: 12 positions of gaze assessed",
"Anterior, equatorial, posterior positions",
"Images saved with labeling of clock position",
"Contraindication: Known ruptured globe",
]
for i, item in enumerate(technique):
y = 1.82 + i * 0.44
add_rect(slide, 6.28, y+0.06, 0.14, 0.22, TEAL)
add_text(slide, item, 6.48, y, 3.2, 0.44, font_size=10.5, color=DARK_GRAY)
# Right: UBM vs AS-OCT
add_rect(slide, 10.0, 1.35, 3.1, 5.8, WHITE)
add_rect(slide, 10.0, 1.35, 3.1, 0.38, DARK_BLUE)
add_text(slide, "UBM vs AS-OCT", 10.1, 1.37, 2.9, 0.34, font_size=14, bold=True, color=WHITE)
vs_table = [
("Parameter", "UBM", "AS-OCT"),
("Frequency", "50 MHz", "~1310 nm"),
("Resolution", "25 µm", "~15 µm"),
("Posterior iris", "YES", "NO"),
("Ciliary body", "YES", "NO"),
("Zonules", "YES", "NO"),
("Media opacity", "Unaffected", "Affected"),
("Patient position", "Supine", "Seated"),
("Contact needed", "YES (water)", "NO"),
("Image quality", "Good", "Excellent"),
("Quantification", "Good", "Excellent"),
]
cw2 = [1.2, 0.85, 0.85]
cx2 = [10.05, 11.25, 12.1]
rh2 = 0.44
for ri2, row2 in enumerate(vs_table):
ry2 = 1.82 + ri2 * rh2
for ci2, cell2 in enumerate(row2):
bg2 = DARK_BLUE if ri2 == 0 else (LIGHT_BLUE if ri2 % 2 == 0 else WHITE)
fg2 = WHITE if ri2 == 0 else DARK_GRAY
add_rect(slide, cx2[ci2], ry2, cw2[ci2]-0.03, rh2-0.03,
bg2, line_color=RGBColor(0xCC,0xCC,0xCC), line_width=0.5)
add_text(slide, cell2, cx2[ci2]+0.03, ry2+0.03, cw2[ci2]-0.06, rh2-0.06,
font_size=9.5 if ri2 > 0 else 10, bold=(ri2 == 0),
color=fg2, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 9: UBM CLINICAL APPLICATIONS - GLAUCOMA & ANGLE
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "UBM: Clinical Applications — Glaucoma & Angle Pathology",
"Kanski 10th Ed: UBM images structures behind iris — key advantage over AS-OCT")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
glaucoma_apps = [
("Primary Angle-Closure Glaucoma", MID_BLUE, [
"UBM is the GOLD STANDARD for angle assessment",
"Visualizes iris, ciliary body, lens equator simultaneously",
"Identifies mechanism of angle closure:",
" - Pupillary block: Iris bombe configuration",
" - Plateau iris: Anteriorly rotated ciliary body",
" - Phacomorphic: Anterior lens displacement",
" - Aqueous misdirection: Ciliary body rotation",
"Quantitative parameters: AOD500, TISA, TIA",
"AOD500: Angle opening distance at 500 µm from scleral spur",
"TISA: Trabecular-iris surface area",
]),
("Plateau Iris Syndrome", TEAL, [
"Diagnosis: Angle closes after dilation despite patent PI",
"UBM findings (pathognomonic):",
" - Anteriorly rotated ciliary processes",
" - Double hump sign on gonioscopy",
" - Ciliary body pushes peripheral iris forward",
"Treatment planning: Iridoplasty vs PI alone",
"Critical to differentiate from pupillary block",
"UBM superior to AS-OCT for this diagnosis",
]),
("Cyclodialysis Cleft", ACCENT_ORG, [
"Separation of longitudinal ciliary muscle from scleral spur",
"Causes: Trauma, post-surgical (cataract, glaucoma surgery)",
"Presents as: Hypotony after surgery/trauma",
"UBM shows: Gap between ciliary body and sclera",
"Cleft visible as communication between AC and suprachoroidal space",
"UBM: Most sensitive investigation for diagnosis",
"Also useful: Monitor response to treatment",
]),
("Other Glaucoma Applications", DARK_BLUE, [
"Ciliary body mass: Cysts vs solid tumors",
"Malignant glaucoma: Anterior vitreous face evaluation",
"Supraciliary effusion: Confirms diagnosis",
"Post-trabeculectomy: Bleb morphology & function",
"Aqueous shunt: Tube position assessment",
"Congenital glaucoma: Angle anatomy (Janssens 2022)",
"Iris/ciliary body foreign body: Anterior IOFB",
"Hypotony: Cyclitic membrane, choroidal effusion",
]),
]
for i, (title, color, items) in enumerate(glaucoma_apps):
col = i % 2
row = i // 2
x = 0.2 + col * 6.55
y = 1.38 + row * 2.95
add_rect(slide, x, y, 6.2, 2.78, WHITE)
add_rect(slide, x, y, 6.2, 0.36, color)
add_text(slide, title, x+0.1, y+0.03, 6.0, 0.3, font_size=12, bold=True, color=WHITE)
for j, item in enumerate(items):
is_sub = item.startswith(" ")
add_rect(slide, x+0.18, y+0.47+j*0.26, 0.1, 0.18,
color if not is_sub else LIGHT_BLUE)
add_text(slide, item, x+0.33, y+0.44+j*0.26, 5.7, 0.27,
font_size=10.2, color=DARK_GRAY, italic=is_sub)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 10: UBM - CATARACT, LENS & ANTERIOR SEGMENT PATHOLOGY
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "UBM: Lens, Cataract & Anterior Segment Pathology",
"Chan et al. Clin Exp Ophthalmol 2024 — UBM in complex cataract and IOL management")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
lens_apps = [
("Subluxed / Dislocated Lens", MID_BLUE, [
"Demonstrates degree of zonular weakness",
"Shows direction of lens tilt/displacement",
"Identifies extent of capsular support (crucial for IOL planning)",
"Guides decision: ACIOL vs sulcus IOL vs iris-claw IOL",
"Can identify iridozonular adhesions",
"Traumatic: Assesses posterior capsule integrity",
"Marfan syndrome: Characterizes extent of zonulolysis",
]),
("Posterior Polar Cataract", TEAL, [
"Pre-operative UBM determines posterior capsule status",
"Identifies pre-existing posterior capsule defect",
"Helps predict PCR risk during surgery",
"Can guide hydrodissection strategy",
"Reduces intraoperative surprises",
"Important for consent and surgical planning",
]),
("IOL Complications", ACCENT_ORG, [
"UGH Syndrome (Uveitis-Glaucoma-Hyphema):",
" - IOL haptic contacts iris/ciliary body",
" - UBM shows exact haptic position",
"Sulcus IOL: Confirms correct placement",
"IOL tilt: Measurable with UBM",
"Residual lens cortex: Behind iris detection",
"Capsular bag distension syndrome: Diagnosis",
"ACIOL foot-plate erosion: Monitor angle",
]),
("Ciliary Body Pathology", DARK_BLUE, [
"Ciliary body cysts: Common, usually benign",
" - Appear as smooth-walled round hyporeflective spaces",
"Ciliary body melanoma: Solid mass, variable reflectivity",
" - UBM provides extent mapping for treatment",
"Medulloepithelioma: Children; heterogeneous mass",
"Cyclitic membrane: Post-trauma or post-inflammatory",
" - UBM guides timing of surgery",
"Pars planitis: Snowbank deposits on pars plana",
]),
]
for i, (title, color, items) in enumerate(lens_apps):
col = i % 2
row_n = i // 2
x = 0.2 + col * 6.55
y = 1.38 + row_n * 2.95
add_rect(slide, x, y, 6.2, 2.78, WHITE)
add_rect(slide, x, y, 6.2, 0.36, color)
add_text(slide, title, x+0.1, y+0.03, 6.0, 0.3, font_size=12, bold=True, color=WHITE)
for j, item in enumerate(items):
is_sub = item.startswith(" ")
add_rect(slide, x+0.18, y+0.47+j*0.3, 0.12, 0.22,
color if not is_sub else LIGHT_BLUE)
add_text(slide, item, x+0.35, y+0.44+j*0.3, 5.7, 0.3,
font_size=10.5, color=DARK_GRAY, italic=is_sub)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 11: ARTIFACTS & PITFALLS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Artifacts, Limitations & Diagnostic Pitfalls",
"Recognizing and avoiding common errors in ocular ultrasound")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
# Left column: B-scan artifacts
add_rect(slide, 0.2, 1.35, 6.0, 5.8, WHITE)
add_rect(slide, 0.2, 1.35, 6.0, 0.38, MID_BLUE)
add_text(slide, "B-Scan Artifacts & Pitfalls", 0.3, 1.37, 5.8, 0.34,
font_size=14, bold=True, color=WHITE)
bscan_artefacts = [
("Posterior Acoustic Shadow", "Dense calcifications (phthisis) or metallic IOFB block sound, creating a dark shadow behind them — can obscure pathology."),
("Reverberation Artifact", "Silicone oil creates strong echoes that bounce between probe and reflector, producing false posterior segment echoes."),
("Gain Too High / Low", "Gain too high: Normal vitreous appears opaque (false VH). Gain too low: Low-reflectivity lesions (membranes) missed."),
("Choroidal Fold Mimicry", "Normal posterior sclera can mimic retinal folds on axial scan. Use transverse/kinetic scans to confirm."),
("Tangential Slice Artifact", "Posterior vitreous face can appear as a 'thick band' if scanned tangentially — adjust probe angle."),
("Silicone Oil Distortion", "Silicone oil speeds up sound transmission — posterior globe images are distorted; scan upright patient."),
("Shadowing from Iris/Lens", "Angle of probe can cause shadowing obscuring posterior pole periphery; multiple probe angles needed."),
]
for i, (art_name, art_desc) in enumerate(bscan_artefacts):
y = 1.82 + i * 0.68
add_rect(slide, 0.28, y, 0.2, 0.28, ACCENT_ORG)
add_text(slide, art_name, 0.55, y, 2.5, 0.28, font_size=11, bold=True, color=DARK_BLUE)
add_text(slide, art_desc, 0.28, y+0.3, 5.7, 0.36, font_size=10, color=DARK_GRAY)
# Right column: UBM limitations + clinical pitfalls
add_rect(slide, 6.5, 1.35, 6.6, 5.8, WHITE)
add_rect(slide, 6.5, 1.35, 6.6, 0.38, TEAL)
add_text(slide, "UBM Limitations & Clinical Cautions", 6.6, 1.37, 6.4, 0.34,
font_size=14, bold=True, color=WHITE)
ubm_limits = [
("Operator Dependence", "Image quality heavily depends on operator skill. Requires practice and anatomic knowledge of anterior segment."),
("Patient Cooperation", "Supine position with speculum and water bath is uncomfortable. Pediatric patients may require sedation."),
("Limited Posterior Reach", "Only images anterior 4–5 mm. Cannot image posterior segment (need B-scan for that)."),
("Cannot Use in Ruptured Globe", "Absolute contraindication: water bath immersion risks infection/pressure."),
("Time-Consuming", "Real-time scanning of 12 clock positions takes significant time vs AS-OCT."),
("No Color Doppler", "Standard UBM lacks Doppler capability for vascular assessment."),
("Comparison: AS-OCT Better For", "Repeatable angle quantification, corneal thickness maps, non-contact ease of use, post-LASIK screening."),
]
for i, (lim_name, lim_desc) in enumerate(ubm_limits):
y = 1.82 + i * 0.68
add_rect(slide, 6.58, y, 0.2, 0.28, TEAL)
add_text(slide, lim_name, 6.85, y, 2.4, 0.28, font_size=11, bold=True, color=DARK_BLUE)
add_text(slide, lim_desc, 6.58, y+0.3, 6.3, 0.36, font_size=10, color=DARK_GRAY)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 12: RECENT EVIDENCE
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Recent Evidence & Advances (2022–2026)",
"Key publications for evidence-based clinical practice")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
papers = [
{
"title": "Wu et al. (2025) — Meta-Analysis",
"journal": "Documenta Ophthalmologica — PMID 40189719",
"color": MID_BLUE,
"findings": [
"10 studies, 1,617 reference-tested units",
"Pooled sensitivity: 96% (95% CI 91–98%)",
"Pooled specificity: 94% (95% CI 87–98%)",
"Diagnostic OR: 363 (95% CI 94–1406)",
"AUC: 0.99 — excellent diagnostic capability",
"Confirms B-scan as reliable posterior segment diagnostic tool",
],
"verdict": "VERDICT: B-scan has excellent diagnostic accuracy for posterior segment disorders",
},
{
"title": "Chan et al. (2024) — Review",
"journal": "Clinical & Experimental Ophthalmology — PMID 38214059",
"color": TEAL,
"findings": [
"UBM is invaluable for complex cataract & IOL management",
"Operator-dependent but uniquely images behind iris",
"Visualizes: zonules, ciliary body, pars plana",
"Key applications: subluxed lens, posterior polar cataract, IOL complications",
"UGH syndrome: UBM shows exact haptic-iris contact",
"Guides surgical planning and reduces intraoperative complications",
],
"verdict": "VERDICT: UBM is the investigation of choice when posterior-iris structures must be evaluated",
},
{
"title": "Janssens et al. (2022) — Review",
"journal": "Acta Ophthalmologica — PMID 34939345",
"color": ACCENT_ORG,
"findings": [
"UBM in primary congenital glaucoma (PCG)",
"Characterizes angle anatomy when gonioscopy is difficult",
"Measures trabecular-iris distance and angle configuration",
"Identifies angle abnormalities in eyes with corneal clouding",
"Useful for follow-up after angle surgery (goniotomy/trabeculotomy)",
"Advantages over gonioscopy: No need for clear cornea",
],
"verdict": "VERDICT: UBM is superior to gonioscopy in PCG with corneal clouding",
},
{
"title": "Raharja et al. (2026) — Narrative Review",
"journal": "European Journal of Ophthalmology — PMID 42153938",
"color": DARK_BLUE,
"findings": [
"Practical applications of B-scan in vitreoretinal conditions",
"Clinical scenarios: VH, RD, PVD, intraocular tumors",
"Dynamic kinetic echography: Still gold standard for mobility",
"AI-assisted interpretation: Emerging for RD detection",
"Standardized gain protocols improving inter-observer reliability",
"Role of B-scan in post-operative monitoring of vitreoretinal surgery",
],
"verdict": "VERDICT: B-scan remains essential in vitreoretinal practice despite advances in OCT",
},
]
for i, paper in enumerate(papers):
col = i % 2
row_n = i // 2
x = 0.2 + col * 6.55
y = 1.38 + row_n * 2.95
add_rect(slide, x, y, 6.2, 2.78, WHITE)
add_rect(slide, x, y, 6.2, 0.55, paper["color"])
add_text(slide, paper["title"], x+0.1, y+0.03, 6.0, 0.3,
font_size=12, bold=True, color=WHITE)
add_text(slide, paper["journal"], x+0.1, y+0.3, 6.0, 0.24,
font_size=9.5, italic=True, color=RGBColor(0xE0,0xE0,0xE0))
for j, finding in enumerate(paper["findings"]):
add_rect(slide, x+0.18, y+0.65+j*0.27, 0.12, 0.18, paper["color"])
add_text(slide, finding, x+0.35, y+0.62+j*0.27, 5.7, 0.27,
font_size=10.2, color=DARK_GRAY)
add_rect(slide, x+0.1, y+2.38, 6.0, 0.28, LIGHT_BLUE)
add_text(slide, paper["verdict"], x+0.15, y+2.39, 5.9, 0.26,
font_size=10, bold=True, color=DARK_BLUE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 13: CASE-BASED SCENARIOS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Case-Based Scenarios for Residents",
"Applying B-scan and UBM knowledge to clinical practice")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
cases = [
{
"case": "Case 1",
"scenario": "65M, sudden painless visual loss, fundus view obscured by dense VH, IOP normal, no history",
"color": MID_BLUE,
"investigation": "B-Scan Ultrasonography",
"findings": [
"Dense mobile echoes in vitreous (VH)",
"Bright echogenic membrane at posterior pole",
"After-movement: PRESENT",
"No choroidal excavation seen",
],
"diagnosis": "Rhegmatogenous RD + VH",
"action": "Urgent PPV referral; exclude melanoma",
},
{
"case": "Case 2",
"scenario": "40F, painful red eye, IOP 38 mmHg, shallow AC, disc cupping, prior episodes. Gonioscopy: closed angle",
"color": TEAL,
"investigation": "UBM Anterior Segment",
"findings": [
"Anteriorly rotated ciliary processes",
"Iris bombe configuration absent",
"Double hump sign",
"Patent PI confirmed on UBM",
],
"diagnosis": "Plateau Iris Syndrome",
"action": "Peripheral iridoplasty; not PI alone",
},
{
"case": "Case 3",
"scenario": "55M, trauma 2 weeks ago, IOP 4 mmHg post-cataract surgery, hypotony maculopathy",
"color": ACCENT_ORG,
"investigation": "UBM (hypotony workup)",
"findings": [
"Gap between ciliary body and scleral spur",
"Communication: AC to suprachoroidal space",
"No cyclitic membrane",
"Choroidal effusion confirmed",
],
"diagnosis": "Cyclodialysis Cleft",
"action": "Surgical repair vs cyclopegia + laser",
},
{
"case": "Case 4",
"scenario": "70M, chronic smoker, fundal mass found during routine exam. Fundoscopy: pigmented elevated lesion at posterior pole",
"color": DARK_BLUE,
"investigation": "B-Scan (high & low gain)",
"findings": [
"Dome-shaped echo elevation at posterior pole",
"Choroidal excavation present",
"Acoustic quiet zone (low internal reflectivity)",
"High initial surface spike; decreasing pattern",
],
"diagnosis": "Choroidal Melanoma",
"action": "Oncology referral; A-scan standardized echography; MRI orbit",
},
]
for i, case in enumerate(cases):
col = i % 2
row_n = i // 2
x = 0.2 + col * 6.55
y = 1.38 + row_n * 2.98
add_rect(slide, x, y, 6.2, 2.8, WHITE)
add_rect(slide, x, y, 6.2, 0.36, case["color"])
add_text(slide, f"{case['case']}: {case['investigation']}", x+0.1, y+0.03, 6.0, 0.3,
font_size=12, bold=True, color=WHITE)
add_text(slide, case["scenario"], x+0.1, y+0.42, 6.0, 0.55,
font_size=10.5, italic=True, color=DARK_GRAY)
add_rect(slide, x+0.1, y+1.0, 2.9, 0.22, LIGHT_BLUE)
add_text(slide, "Key UBM/B-scan Findings:", x+0.12, y+1.01, 2.85, 0.2,
font_size=10, bold=True, color=DARK_BLUE)
for j, finding in enumerate(case["findings"]):
add_rect(slide, x+0.18, y+1.25+j*0.26, 0.1, 0.18, case["color"])
add_text(slide, finding, x+0.33, y+1.22+j*0.26, 5.75, 0.26, font_size=10, color=DARK_GRAY)
add_rect(slide, x+0.1, y+2.35, 6.0, 0.35, case["color"])
add_text(slide, f"Dx: {case['diagnosis']} | Action: {case['action']}",
x+0.15, y+2.37, 5.9, 0.3, font_size=10, bold=True, color=WHITE)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 14: SUMMARY & KEY TAKE-HOME POINTS
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "Summary & Key Take-Home Points",
"What every ophthalmology resident must remember")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
# Left: B-scan key points
add_rect(slide, 0.2, 1.35, 6.1, 5.8, WHITE)
add_rect(slide, 0.2, 1.35, 6.1, 0.38, MID_BLUE)
add_text(slide, "B-Scan Ultrasonography — Summary", 0.3, 1.37, 5.9, 0.34,
font_size=14, bold=True, color=WHITE)
bscan_points = [
("Frequency", "10 MHz; images full globe, posterior segment"),
("Resolution", "Moderate; penetrates to posterior sclera"),
("Primary Role", "Evaluate posterior segment when view is obscured"),
("Sensitivity", "96% for posterior segment disorders (Wu 2025 meta-analysis)"),
("Key sign: RD", "Bright mobile membrane with after-movement"),
("Key sign: Melanoma", "Choroidal excavation + acoustic quiet zone"),
("Key sign: T-sign", "Fluid in Tenon's space = posterior scleritis"),
("Trauma rule", "Use closed-lid technique; ruptured globe = relative CI"),
("Kinetic echo", "Dynamic scan — differentiates RD from vitreous membranes"),
("After-movement", "Present: RD, PVD, VH membranes; Absent: Tractional RD"),
("Screen before evisceration", "Rule out occult melanoma in blind eyes"),
("Silicone oil", "Scan patient upright to minimize distortion"),
]
for i, (key, val) in enumerate(bscan_points):
y = 1.82 + i * 0.42
add_rect(slide, 0.28, y+0.05, 1.55, 0.28, LIGHT_BLUE)
add_text(slide, key, 0.3, y+0.06, 1.5, 0.24, font_size=10, bold=True, color=MID_BLUE)
add_text(slide, val, 1.9, y, 4.3, 0.38, font_size=11, color=DARK_GRAY)
# Right: UBM key points
add_rect(slide, 6.5, 1.35, 6.6, 5.8, WHITE)
add_rect(slide, 6.5, 1.35, 6.6, 0.38, TEAL)
add_text(slide, "Ultrasound Biomicroscopy — Summary", 6.6, 1.37, 6.4, 0.34,
font_size=14, bold=True, color=WHITE)
ubm_points = [
("Frequency", "50–100 MHz; images anterior 1/5 of globe only"),
("Resolution", "25 µm axial (near-microscopic)"),
("Unique advantage", "Images behind iris (ciliary body, zonules) — AS-OCT cannot"),
("Angle closure", "Identifies mechanism: pupillary block vs plateau iris vs phacomorphic"),
("Plateau iris", "Anteriorly rotated ciliary body = UBM pathognomonic sign"),
("Hypotony", "Cyclodialysis cleft, cyclitic membrane, choroidal effusion"),
("Cataract surgery", "Subluxed lens, posterior polar cataract — pre-op planning"),
("IOL complications", "UGH syndrome: haptic touching iris/ciliary body"),
("Ciliary body", "Cysts vs melanoma vs medulloepithelioma"),
("Congenital glaucoma", "Angle evaluation when cornea is hazy"),
("Coupling medium", "Water bath speculum; supine patient position"),
("Contraindication", "Ruptured globe (absolute)"),
]
for i, (key, val) in enumerate(ubm_points):
y = 1.82 + i * 0.42
add_rect(slide, 6.58, y+0.05, 1.55, 0.28, RGBColor(0xCC,0xEE,0xEE))
add_text(slide, key, 6.6, y+0.06, 1.5, 0.24, font_size=10, bold=True, color=TEAL)
add_text(slide, val, 8.2, y, 4.8, 0.38, font_size=11, color=DARK_GRAY)
# ═══════════════════════════════════════════════════════════════════════════════
# SLIDE 15: REFERENCES
# ═══════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(BLANK)
add_header(slide, "References", "Evidence base for this seminar")
add_footer(slide)
add_rect(slide, 0, 1.22, 13.333, 6.0, LIGHT_GRAY)
add_rect(slide, 0.2, 1.35, 12.8, 5.8, WHITE)
references = [
"1. Kanski JJ, Bowling B. Kanski's Clinical Ophthalmology: A Systematic Approach. 10th ed. Elsevier; 2024.",
" — Imaging in glaucoma (UBM, p.372); B-scan technique (p.684); Uveitis workup (p.4255); Vitreous haemorrhage (p.779); Choroidal haemangioma (p.993).",
"",
"2. Trobe JD, Spaeth GL. The Wills Eye Manual: Office and Emergency Room Diagnosis and Treatment of Eye Disease. 7th ed. Wolters Kluwer; 2022.",
" — B-scan ultrasonography (p.1093–1094); Ultrasonographic biomicroscopy (p.1095–1096); Orbital ultrasonography/Doppler (p.1096); Plateau iris UBM (p.4192).",
"",
"3. Wu F, Wang Q, Zheng T, Wang X, Lin C. Diagnostic accuracy of B scan ultrasound for posterior segment ocular disorders: a meta-analysis.",
" Documenta Ophthalmologica. 2025 Apr. PMID: 40189719. DOI: 10.1007/s10633-025-10005-6",
" [Sensitivity 96%, Specificity 94%, AUC 0.99 — n=1,617 eyes]",
"",
"4. Chan NSW, Lim JS, Mohanram LS, Chee S-P. Ultrasound biomicroscopy in the management of complex cataract and intraocular lens: A review.",
" Clinical & Experimental Ophthalmology. 2024 Mar;52. PMID: 38214059. DOI: 10.1111/ceo.14321",
"",
"5. Janssens R, van Rijn LJ, Eggink CA. Ultrasound biomicroscopy of the anterior segment in patients with primary congenital glaucoma: a review of the literature.",
" Acta Ophthalmologica. 2022 Sep;100(6). PMID: 34939345.",
"",
"6. Raharja A, Gooch J, Diafas A. Practical applications of ultrasound B-scan in vitreoretinal conditions: A narrative review.",
" European Journal of Ophthalmology. 2026 May. PMID: 42153938.",
"",
"7. Pavlin CJ, Harasiewicz K, Foster FS. Ultrasound biomicroscopy of anterior segment structures in normal and glaucomatous eyes.",
" American Journal of Ophthalmology. 1992;113(4):381-389. [Original UBM description]",
]
ypos = 1.5
for ref in references:
is_sub = ref.startswith(" ")
if ref == "":
ypos += 0.08
continue
add_text(slide, ref, 0.35, ypos, 12.5, 0.35,
font_size=10 if not is_sub else 9.5,
bold=False, italic=is_sub,
color=DARK_GRAY if not is_sub else RGBColor(0x55,0x55,0x55))
ypos += 0.34
# ── Save ───────────────────────────────────────────────────────────────────────
output_path = "/tmp/workspace/bscan-ubm-seminar/BScan_UBM_Ophthalmology_Seminar.pptx"
prs.save(output_path)
print(f"Saved: {output_path}")
print(f"Slides: {len(prs.slides)}")
cd /tmp/workspace/bscan-ubm-seminar && python create_ppt.py 2>&1
ls -lh /tmp/workspace/bscan-ubm-seminar/
BScan UBM Ophthalmology Seminar
Presentation · PPTX
| Indication | Key Finding |
|---|---|
| Vitreous haemorrhage | Exclude RD or choroidal melanoma (always) |
| Retinal detachment | Bright, reflective membrane; after-movement present |
| Tractional RD | Rigid, V-shaped or funnel membrane; after-movement absent |
| Choroidal melanoma | Dome shape + choroidal excavation + acoustic quiet zone |
| Choroidal metastasis | Irregular, high uniform reflectivity |
| Choroidal hemangioma | Dome-shaped, HIGH internal reflectivity |
| Posterior scleritis | T-sign: fluid in Tenon's capsule |
| Choroidal detachment | Smooth bullous elevation, does not cross optic nerve |
| IOFB | Bright echo + posterior acoustic shadow |
| Optic disc drusen | Hyperechoic optic disc |
| Before evisceration | Screen blind eyes to exclude occult melanoma |
| Application | Key UBM Finding |
|---|---|
| Primary angle-closure — pupillary block | Iris bombe configuration |
| Plateau iris syndrome | Anteriorly rotated ciliary processes (pathognomonic) |
| Phacomorphic glaucoma | Anterior displacement of lens equator |
| Cyclodialysis cleft | Gap between ciliary body and scleral spur |
| Subluxed lens | Zonular weakness extent, direction of tilt |
| Posterior polar cataract | Pre-existing posterior capsule defect |
| UGH syndrome | Exact haptic-iris/ciliary body contact point |
| Ciliary body cyst | Smooth-walled hyporeflective round space |
| Ciliary body melanoma | Solid mass, variable reflectivity |
| Congenital glaucoma | Angle anatomy when cornea is hazy |
| Hypotony workup | Cyclodialysis cleft, cyclitic membrane, choroidal effusion |
| Slide | Topic |
|---|---|
| 1 | Title Slide |
| 2 | Seminar Overview / Agenda |
| 3 | Physics: A-scan vs B-scan vs UBM comparison table |
| 4 | B-scan technique, gain, special situations |
| 5 | B-scan clinical applications (6 categories) |
| 6 | Kinetic echography & acoustic reflectivity guide for tumors |
| 7 | RD types: Rhegmatogenous, Tractional, Exudative, Choroidal detachment |
| 8 | UBM principles, specs, technique, UBM vs AS-OCT table |
| 9 | UBM: Glaucoma and angle pathology |
| 10 | UBM: Lens, cataract, ciliary body pathology |
| 11 | Artifacts, limitations and pitfalls |
| 12 | Recent evidence (4 key papers, 2022-2026) |
| 13 | Case-based scenarios (4 clinical cases) |
| 14 | Summary: take-home points for B-scan and UBM |
| 15 | Full references |