tough vivaquestionsand answersfor A SCAN in opthalmology for residency
A-scan biometry ophthalmology residency viva questions axial length IOL power calculation
https://eyewiki.org/Biometry_for_Intra-Ocular_Lens_(IOL)_Pow…
A-scan biometry viva questions ophthalmology immersion vs contact technique spike pattern errors
Distance = Time × Velocity / 2
| Medium | Velocity |
|---|---|
| Cornea + Lens | 1641 m/s |
| Aqueous + Vitreous | 1532 m/s |
| Normal phakic eye (average) | 1550-1555 m/s |
| Aphakic eye | 1532 m/s |
| Pseudophakic eye | 1532 m/s + correction for IOL material |
| Condition | Axial Length |
|---|---|
| Nanophthalmos | < 20 mm |
| Microphthalmos (clinical) | < 21 mm |
| Short eye (prone to error) | < 22 mm |
| Emmetropia | ~24 mm |
| Long eye (myopia prone) | > 26 mm |
| High myopia (staphyloma risk) | > 26-28 mm |
| Eye | Axial Length | Recommended Formulae |
|---|---|---|
| Short | < 22 mm | Hoffer Q, Haigis, Hill-RBF, Kane |
| Average | 22-26 mm | SRK/T, Holladay 1, any 3rd gen |
| Long | > 26 mm | Barrett Universal II, Holladay (with optimized constants), Haigis, Kane |
P = a0 + a1 × ACD (measured) + a2 × AL
| IOL Material | Correction (add to aphakic measurement) |
|---|---|
| PMMA | +0.4 mm |
| Acrylic | +0.2 mm |
| Silicone (high-velocity) | -0.4 to -0.8 mm |
| Feature | Optical Biometry | A-scan Ultrasound |
|---|---|---|
| Method | Partial coherence interferometry (laser) | Ultrasound pulses |
| Contact | Non-contact | Contact or immersion |
| Accuracy | Higher (gold standard) | Slightly lower |
| Dense cataracts | May fail | Works (sound penetrates) |
| Posterior staphyloma | Handles better | Problematic |
| Silicone oil | Unaffected | Significant error |
| Technician skill needed | Less | More (contact) |
| Also measures | K, ACD, LT, WTW | Mainly AL |
Create a study guide or flashcard PDF for A-scan viva review
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"
mkdir -p /home/daytona/workspace/ascan-viva && python3 -c "from reportlab.lib.pa…
~/ascan-viva/build_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.pdfgen import canvas
from reportlab.platypus import BaseDocTemplate, PageTemplate, Frame
OUTPUT = "/home/daytona/workspace/ascan-viva/AScan_Viva_StudyGuide.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
NAVY = colors.HexColor("#0D2B55")
TEAL = colors.HexColor("#1A7A8C")
GOLD = colors.HexColor("#E8A020")
LIGHT_BLUE = colors.HexColor("#D6EAF8")
LIGHT_TEAL = colors.HexColor("#D0EDE9")
LIGHT_GOLD = colors.HexColor("#FEF3DC")
WHITE = colors.white
DARK_GREY = colors.HexColor("#333333")
MID_GREY = colors.HexColor("#666666")
LIGHT_GREY = colors.HexColor("#F5F5F5")
RED_HL = colors.HexColor("#C0392B")
GREEN_HL = colors.HexColor("#1E8449")
W, H = A4
# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
def S(name, **kw):
return ParagraphStyle(name, **kw)
cover_title = S("CoverTitle",
fontSize=32, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_CENTER, leading=40, spaceAfter=8)
cover_sub = S("CoverSub",
fontSize=16, fontName="Helvetica", textColor=LIGHT_BLUE,
alignment=TA_CENTER, leading=22, spaceAfter=4)
cover_badge = S("CoverBadge",
fontSize=12, fontName="Helvetica-Bold", textColor=GOLD,
alignment=TA_CENTER, leading=18)
sec_header = S("SecHeader",
fontSize=14, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_LEFT, leading=18, spaceBefore=4, spaceAfter=4)
q_style = S("Question",
fontSize=11, fontName="Helvetica-Bold", textColor=NAVY,
alignment=TA_LEFT, leading=15, spaceBefore=6, spaceAfter=3)
a_style = S("Answer",
fontSize=10, fontName="Helvetica", textColor=DARK_GREY,
alignment=TA_JUSTIFY, leading=14, spaceAfter=4,
leftIndent=12)
bullet_style = S("Bullet",
fontSize=10, fontName="Helvetica", textColor=DARK_GREY,
alignment=TA_LEFT, leading=14, leftIndent=20, spaceAfter=2,
bulletIndent=8)
highlight_style = S("Highlight",
fontSize=10, fontName="Helvetica-Bold", textColor=RED_HL,
alignment=TA_LEFT, leading=14, leftIndent=12, spaceAfter=3)
mnemo_style = S("Mnemo",
fontSize=10, fontName="Helvetica-Oblique", textColor=GREEN_HL,
alignment=TA_LEFT, leading=14, leftIndent=12, spaceAfter=3)
table_hdr = S("TableHdr",
fontSize=9, fontName="Helvetica-Bold", textColor=WHITE,
alignment=TA_CENTER, leading=12)
table_cell = S("TableCell",
fontSize=9, fontName="Helvetica", textColor=DARK_GREY,
alignment=TA_LEFT, leading=12)
table_cell_c = S("TableCellC",
fontSize=9, fontName="Helvetica", textColor=DARK_GREY,
alignment=TA_CENTER, leading=12)
note_style = S("Note",
fontSize=9, fontName="Helvetica-Oblique", textColor=MID_GREY,
alignment=TA_LEFT, leading=13, leftIndent=12)
def P(text, style=a_style): return Paragraph(text, style)
def Q(text): return Paragraph(f"Q: {text}", q_style)
def A(text): return Paragraph(text, a_style)
def B(text): return Paragraph(f"• {text}", bullet_style)
def HL(text): return Paragraph(f"⚠ {text}", highlight_style)
def MN(text): return Paragraph(f"💡 {text}", mnemo_style)
def SP(h=4): return Spacer(1, h*mm)
def HR(): return HRFlowable(width="100%", thickness=0.5, color=colors.HexColor("#CCCCCC"), spaceAfter=3)
def section_banner(title, color=NAVY):
tbl = Table([[Paragraph(title, sec_header)]], colWidths=[W - 2*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return tbl
def qa_box(question, answer_elements, bg=LIGHT_TEAL):
"""Wraps a Q+A block in a coloured box."""
inner = [P(f"<b>Q: {question}</b>", q_style)] + answer_elements
tbl = Table([[inner]], colWidths=[W - 2*cm])
tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 0.5, TEAL),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
return tbl
def make_table(headers, rows, col_widths=None):
data = [[Paragraph(h, table_hdr) for h in headers]]
for row in rows:
data.append([Paragraph(str(c), table_cell_c) for c in row])
if not col_widths:
col_widths = [(W - 2*cm) / len(headers)] * len(headers)
tbl = Table(data, colWidths=col_widths)
style = [
("BACKGROUND", (0,0), (-1,0), NAVY),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GREY]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#BBBBBB")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
tbl.setStyle(TableStyle(style))
return tbl
# ── Page decorators ──────────────────────────────────────────────────────────
def draw_cover(c, doc):
c.saveState()
# Navy background
c.setFillColor(NAVY)
c.rect(0, 0, W, H, fill=1, stroke=0)
# Gold accent bar top
c.setFillColor(GOLD)
c.rect(0, H - 16*mm, W, 16*mm, fill=1, stroke=0)
# Teal accent bar bottom
c.setFillColor(TEAL)
c.rect(0, 0, W, 12*mm, fill=1, stroke=0)
# Decorative circles
c.setFillColor(colors.HexColor("#163A6E"))
c.circle(W - 50, H - 80, 110, fill=1, stroke=0)
c.circle(40, 100, 70, fill=1, stroke=0)
c.restoreState()
def draw_page(c, doc):
c.saveState()
# Top stripe
c.setFillColor(NAVY)
c.rect(0, H - 12*mm, W, 12*mm, fill=1, stroke=0)
# Bottom stripe
c.setFillColor(TEAL)
c.rect(0, 0, W, 8*mm, fill=1, stroke=0)
# Page number
c.setFillColor(WHITE)
c.setFont("Helvetica", 8)
c.drawCentredString(W/2, 2.5*mm, f"A-Scan Biometry Viva Guide | Page {doc.page}")
# Header text
c.setFont("Helvetica-Bold", 8)
c.setFillColor(GOLD)
c.drawString(1*cm, H - 8.5*mm, "A-SCAN BIOMETRY")
c.setFillColor(WHITE)
c.setFont("Helvetica", 8)
c.drawRightString(W - 1*cm, H - 8.5*mm, "Ophthalmology Residency Viva")
c.restoreState()
# ── Build document ────────────────────────────────────────────────────────────
doc = BaseDocTemplate(OUTPUT, pagesize=A4,
leftMargin=1*cm, rightMargin=1*cm,
topMargin=1.5*cm, bottomMargin=1.5*cm)
cover_frame = Frame(0, 0, W, H, id="cover", leftPadding=0, rightPadding=0,
topPadding=0, bottomPadding=0)
body_frame = Frame(1*cm, 1.5*cm, W - 2*cm, H - 3*cm, id="body")
cover_template = PageTemplate(id="Cover", frames=[cover_frame], onPage=draw_cover)
body_template = PageTemplate(id="Body", frames=[body_frame], onPage=draw_page)
doc.addPageTemplates([cover_template, body_template])
story = []
# ═══════════════════════════════════════════════════════════════════════════════
# COVER PAGE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(Spacer(1, 55*mm))
story.append(Paragraph("A-SCAN BIOMETRY", cover_title))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("Viva Study Guide", cover_sub))
story.append(Spacer(1, 8*mm))
story.append(Paragraph("Ophthalmology Residency Exam Preparation", cover_badge))
story.append(Spacer(1, 14*mm))
# Quick-reference box on cover
cover_qr_data = [
[Paragraph("KEY NUMBERS TO REMEMBER", ParagraphStyle("ch", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY, alignment=TA_CENTER))],
[Paragraph(
"Normal AL: <b>24 mm</b> | Phakic velocity: <b>1555 m/s</b> | Aphakic velocity: <b>1532 m/s</b><br/>"
"AL error impact: <b>2.5–3 D / mm</b> | K error impact: <b>1 D / D</b><br/>"
"Contact spikes: <b>5</b> | Immersion spikes: <b>6</b> | Sulcus ACD reduction: <b>0.25 mm</b>",
ParagraphStyle("cv", fontSize=10, fontName="Helvetica", textColor=DARK_GREY,
alignment=TA_CENTER, leading=17))],
]
cover_tbl = Table(cover_qr_data, colWidths=[14*cm])
cover_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), GOLD),
("BACKGROUND", (0,1), (-1,1), WHITE),
("BOX", (0,0), (-1,-1), 1.5, GOLD),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("ROUNDEDCORNERS", [6,6,6,6]),
]))
story.append(cover_tbl)
story.append(Spacer(1, 18*mm))
story.append(Paragraph("28 High-Yield Questions | 7 Topics | Clinical Pearls", cover_sub))
# Switch to body template
from reportlab.platypus import NextPageTemplate
story.append(NextPageTemplate("Body"))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 1: PHYSICS & PRINCIPLES
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 1 — Physics & Principles", NAVY))
story.append(SP(4))
# Q1
story.append(KeepTogether([
Q("What is the fundamental principle of A-scan ultrasonography?"),
A("A-scan uses <b>10 MHz</b> high-frequency sound waves. The probe emits a pulse that "
"reflects off each acoustic interface in the eye (cornea, anterior lens, posterior lens, retina). "
"Time-of-flight is converted to distance:"),
A("<b>Distance = Time × Velocity / 2</b>"),
A("Result is a 1-D amplitude display — reflecting surfaces appear as vertical spikes. "
"'A' = <i>Amplitude</i> modulation."),
SP(3),
]))
# Q2 - Velocity table
story.append(KeepTogether([
Q("What are the standard sound velocities used in A-scan biometry?"),
SP(2),
make_table(
["Medium", "Velocity (m/s)"],
[
["Cornea + Crystalline lens", "1641"],
["Aqueous humour + Vitreous", "1532"],
["Normal phakic eye (average)", "1555"],
["Aphakic eye", "1532"],
["Pseudophakic eye", "1532 + IOL correction"],
],
col_widths=[10*cm, 5.5*cm]
),
SP(2),
MN("Memory: 1641 (solid structures) → 1555 (phakic average) → 1532 (fluid/aphakic)"),
SP(3),
]))
# Q3
story.append(KeepTogether([
Q("Why does sound travel faster through the lens than vitreous?"),
A("The crystalline lens is a denser, more solid structure. Acoustic velocity increases "
"with the elasticity-to-density ratio of a medium. Greater molecular density and structural "
"rigidity → faster sound propagation. Aqueous and vitreous are watery liquids — lower density."),
SP(3),
]))
# Q4 - spike pattern
story.append(KeepTogether([
Q("Describe the A-scan spike pattern in a normal phakic eye (contact method)."),
A("<b>5 spikes</b> in the contact technique:"),
B("1. Probe tip + Cornea (combined — single spike)"),
B("2. Anterior lens capsule"),
B("3. Posterior lens capsule"),
B("4. Retina (steep 90° rise — most critical)"),
B("5. Sclera / Orbital fat"),
A("Ideal scan: all spikes at maximum amplitude, retinal spike steeply rising and "
"clearly separated from scleral spike."),
SP(3),
]))
# Q5 - immersion
story.append(KeepTogether([
Q("How does the immersion technique differ from contact in terms of spike count?"),
A("Immersion produces <b>6 spikes</b> because the probe does not touch the cornea — "
"probe tip and cornea are now separate acoustic interfaces:"),
B("1. Probe tip (in saline)"),
B("2. Cornea (separate spike)"),
B("3. Anterior lens"),
B("4. Posterior lens"),
B("5. Retina"),
B("6. Sclera"),
MN("Contact = 5 spikes. Immersion = 6 spikes. Extra spike = separate cornea."),
SP(3),
]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 2: CONTACT vs IMMERSION
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 2 — Contact vs Immersion Technique", TEAL))
story.append(SP(4))
story.append(KeepTogether([
Q("What is the most common and most important error in contact A-scan biometry?"),
A("<b>Corneal compression (applanation artifact)</b>. Even minimal probe pressure "
"indents the soft cornea, causing:"),
B("Falsely <b>shortened</b> axial length"),
B("Shallower ACD on scan"),
B("Leads to underpowered IOL → residual <b>hyperopia</b> postoperatively"),
HL("Rule: Delete readings with unexpectedly shallow ACD even if spikes look good."),
SP(3),
]))
story.append(KeepTogether([
Q("By how much does immersion A-scan differ from contact A-scan for axial length?"),
A("Immersion eyes measure <b>0.1–0.3 mm longer</b> than contact eyes. This is NOT an "
"overestimation — it is the accurate value. Contact underestimates due to corneal indentation."),
SP(3),
]))
story.append(KeepTogether([
Q("What is the Prager shell and what does it do?"),
A("A small scleral cup placed between the lids over the anesthetized eye, filled with saline. "
"The A-scan probe is immersed in the fluid bath — avoids any corneal contact, eliminating "
"compression artifact. Enables the immersion technique of biometry."),
SP(3),
]))
# Comparison table
story.append(KeepTogether([
Q("Compare contact vs immersion A-scan vs optical biometry."),
SP(2),
make_table(
["Feature", "Contact A-scan", "Immersion A-scan", "Optical Biometry"],
[
["Corneal contact", "Yes", "No", "No"],
["Main error", "Compression", "None significant", "Dense cataract block"],
["Spikes", "5", "6", "N/A (laser)"],
["Technician skill", "High", "Moderate", "Low"],
["Accuracy", "Lowest", "Good", "Best"],
["Dense cataract", "Works", "Works", "May fail"],
["Silicone oil", "Error", "Error", "Unaffected"],
],
col_widths=[4.5*cm, 4*cm, 4*cm, 3.5*cm]
),
SP(3),
]))
story.append(KeepTogether([
Q("List advantages of immersion over contact A-scan."),
B("Avoids corneal compression → more accurate axial length"),
B("Less technician-dependent, reproducible between operators"),
B("Faster when proficient"),
B("Preferred in soft eyes (low IOP) where compression is worst"),
B("Gold standard for paediatric biometry under anaesthesia"),
SP(3),
]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 3: AXIAL LENGTH
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 3 — Axial Length & Normal Values", NAVY))
story.append(SP(4))
story.append(KeepTogether([
Q("What is the average axial length of a normal adult phakic eye?"),
A("Average: <b>24 mm</b> (range ~22–26 mm in emmetropia)."),
A("Clinical significance: <b>Each 1 mm change in AL = ~2.5–3 D change in IOL power</b>. "
"Effect is greater in short eyes than long eyes. AL is the single most important variable "
"in IOL power calculation."),
SP(3),
]))
story.append(KeepTogether([
Q("What axial lengths define microphthalmos and high myopia?"),
SP(2),
make_table(
["Condition", "Axial Length"],
[
["Nanophthalmos", "< 20 mm"],
["Microphthalmos (clinical)", "< 21 mm"],
["Short eye (formula caution)", "< 22 mm"],
["Emmetropia", "~24 mm"],
["Long eye (myopia prone)", "> 26 mm"],
["High myopia / staphyloma risk", "> 26–28 mm"],
],
col_widths=[10*cm, 5.5*cm]
),
SP(3),
]))
story.append(KeepTogether([
Q("From where to where is axial length measured?"),
A("From the <b>anterior corneal epithelial surface</b> to the "
"<b>retinal pigment epithelium (RPE) at the macula (fovea)</b>. "
"Alignment must be along the <b>visual axis</b>, not the optic nerve axis. "
"Beam hitting the optic nerve → absent scleral spike (recognisable error pattern)."),
SP(3),
]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 4: IOL POWER CALCULATION FORMULAE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 4 — IOL Power Calculation Formulae", TEAL))
story.append(SP(4))
story.append(KeepTogether([
Q("Write the basic SRK formula. State its limitations."),
A("<b>P = A − 0.9K − 2.5(AL)</b>"),
A("Where: P = IOL power (D), A = A-constant, K = average keratometry (D), AL = axial length (mm)"),
A("<b>Limitations:</b>"),
B("1st-generation empirical regression formula — least accurate"),
B("Inaccurate for extreme axial lengths (short/long eyes)"),
B("Superseded by SRK II → SRK/T"),
B("Use only for manual calculation when no software is available"),
SP(3),
]))
story.append(KeepTogether([
Q("Which IOL formula to use for short vs long eyes?"),
SP(2),
make_table(
["Eye Type", "Axial Length", "Recommended Formulae"],
[
["Short", "< 22 mm", "Hoffer Q, Haigis, Hill-RBF, Kane"],
["Average", "22–26 mm", "SRK/T, Holladay 1, Haigis, any 3rd gen"],
["Long", "> 26 mm", "Barrett Universal II, Holladay, Haigis (optimised), Kane"],
],
col_widths=[3.5*cm, 4*cm, 8*cm]
),
SP(2),
HL("Short eyes are MOST prone to unexpected mean spherical error after surgery."),
SP(3),
]))
story.append(KeepTogether([
Q("What is ELP and why is it the most critical variable in modern formulae?"),
A("<b>Effective Lens Position (ELP)</b> = predicted distance from the anterior corneal surface "
"to the principal plane of the implanted IOL."),
A("All formulae try to optimize ELP prediction:"),
B("3rd gen (SRK/T, Holladay 1, Hoffer Q): predict ELP from K + AL"),
B("4th gen (Haigis, Holladay 2): add ACD, lens thickness, white-to-white"),
B("5th gen (Barrett, Kane): AI/regression-enhanced ELP prediction"),
SP(3),
]))
story.append(KeepTogether([
Q("What makes the Haigis formula unique?"),
A("<b>Three IOL constants (a0, a1, a2)</b> instead of a single A-constant:"),
A("<b>P = a0 + a1 × ACD (measured) + a2 × AL</b>"),
A("Separates contribution of ACD from AL → superior for abnormal eyes. "
"Allows personalised optimisation per surgeon per IOL."),
SP(3),
]))
story.append(KeepTogether([
Q("What is the A-constant? What factors affect it?"),
A("IOL-specific empirical constant representing predicted IOL position (ELP). "
"Provided by the manufacturer."),
A("<b>Factors affecting it:</b>"),
B("IOL design (single-piece vs 3-piece)"),
B("IOL material (PMMA / acrylic / silicone)"),
B("IOL position: sulcus → reduce ACD by <b>0.25 mm</b>; posterior iris fixation → further 0.25 mm"),
B("Surgeon's own technique — should personalise using ≥ 20–50 own cases"),
SP(3),
]))
story.append(KeepTogether([
Q("How does a keratometry error compare to an axial length error in terms of IOL impact?"),
SP(2),
make_table(
["Error Source", "Magnitude", "IOL Power Impact"],
[
["Axial Length error", "1 mm", "2.5–3 D"],
["Keratometry error", "1 D", "~1 D"],
],
col_widths=[5*cm, 4*cm, 6.5*cm]
),
SP(2),
HL("Axial length error has 2.5–3× greater impact than keratometry error — most consequential mistake."),
SP(3),
]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 5: SPECIAL SITUATIONS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 5 — Special Situations", NAVY))
story.append(SP(4))
story.append(KeepTogether([
Q("How do you perform biometry in silicone oil-filled eyes?"),
A("Silicone oil velocity (~980–1040 m/s) is far lower than normal vitreous (1532 m/s). "
"A-scan significantly <b>overestimates</b> axial length (falsely long)."),
A("<b>Solutions:</b>"),
B("Use optical biometry (IOL Master) — unaffected by silicone oil"),
B("A-scan: use silicone oil-specific velocity setting"),
B("Apply Okulix calculation or correction: <b>CF = CT × (1 − 1532/vel)</b>"),
HL("Silicone oil = use optical biometry as first choice."),
SP(3),
]))
story.append(KeepTogether([
Q("What are the pseudophakic A-scan correction factors for different IOL materials?"),
A("Use aphakic mode (1532 m/s), then <b>add correction</b>:"),
SP(2),
make_table(
["IOL Material", "Correction to Add"],
[
["PMMA", "+0.4 mm"],
["Acrylic", "+0.2 mm"],
["Silicone (high velocity)", "−0.4 to −0.8 mm"],
],
col_widths=[8*cm, 7.5*cm]
),
SP(2),
A("Formula: <b>CF = CT × (1 − 1532 / velocity of material)</b>"),
SP(3),
]))
story.append(KeepTogether([
Q("How does aphakia affect A-scan biometry?"),
B("Sound velocity = <b>1532 m/s</b> (no lens, all fluid)"),
B("Two lens spikes are <b>absent</b>; single spike from anterior vitreous face / posterior capsule"),
B("Biometer must be set to <b>aphakic mode</b>"),
B("Immersion technique strongly preferred"),
SP(3),
]))
story.append(KeepTogether([
Q("How do you manage biometry after previous LASIK/PRK?"),
A("Standard IOL formulas FAIL because:"),
B("Keratometry underestimates corneal power (altered index of refraction assumptions)"),
B("ELP prediction errors (formulae assume normal corneal shape)"),
A("<b>Approaches:</b>"),
B("Clinical history method: pre-LASIK refraction + K values"),
B("Contact lens method: plano lens to derive true corneal power"),
B("Haigis-L formula: statistical regression, no historical data needed"),
B("Barrett True K / Masket formula"),
HL("Always target mild myopia (−0.5 to −1.0 D) as safety buffer. Warn patient of refractive surprise."),
SP(3),
]))
story.append(KeepTogether([
Q("A contact lens wearer needs biometry. What precaution is required?"),
B("Soft contact lenses: withhold for <b>≥ 1 week</b> before biometry"),
B("Rigid gas permeable (RGP) lenses: longer period needed — corneal re-stabilisation"),
B("Purpose: allow corneal curvature to return to natural state to avoid false K readings"),
SP(3),
]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 6: ERRORS & QUALITY CONTROL
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 6 — Errors & Quality Control", TEAL))
story.append(SP(4))
story.append(KeepTogether([
Q("List the sources of error in A-scan biometry."),
A("<b>Technical errors:</b>"),
B("Corneal compression (contact) → underestimates AL → hyperopic surprise"),
B("Misalignment (off visual axis) → underestimates AL"),
B("Sloped retinal spike (beam not perpendicular to macula)"),
B("Beam directed at optic nerve instead of macula → absent scleral spike"),
A("<b>Patient factors:</b>"),
B("Poor fixation — dense cataract, nystagmus, macular disease"),
B("Posterior staphyloma — variable readings from same eye"),
B("Silicone oil in vitreous"),
B("Previous corneal refractive surgery"),
A("<b>Formula selection errors:</b>"),
B("Wrong formula for extreme AL"),
B("Unoptimised A-constants"),
SP(3),
]))
story.append(KeepTogether([
Q("What does the ideal retinal spike look like and why does it matter?"),
A("The ideal retinal spike must:"),
B("Rise <b>steeply at 90°</b> to the baseline"),
B("Be at <b>maximum height</b>"),
B("Be <b>clearly separated</b> from the scleral spike"),
HL("A sloped retinal spike = off-axis measurement. That reading MUST be rejected — "
"it represents a longer-than-true path through the vitreous."),
SP(3),
]))
story.append(KeepTogether([
Q("What is posterior staphyloma and why is it problematic for biometry?"),
A("Posterior staphyloma is an outpouching of the posterior sclera seen in high myopia. "
"The macula may be at the bottom of the staphyloma, resulting in:"),
B("Multiple different axial length readings from the same eye"),
B("Difficulty identifying the true macular point"),
B("Optical biometry (IOL Master) is preferred as it targets the RPE directly"),
B("A-scan: use the reading corresponding to the longest reproducible measurement"),
SP(3),
]))
story.append(PageBreak())
# ═══════════════════════════════════════════════════════════════════════════════
# SECTION 7: CLINICAL VIVA SCENARIOS
# ═══════════════════════════════════════════════════════════════════════════════
story.append(section_banner("SECTION 7 — Clinical Viva Scenarios", NAVY))
story.append(SP(4))
story.append(KeepTogether([
Q("A dense white cataract — contact A-scan gives AL = 21.8 mm. What do you do?"),
HL("Red flags: dense cataract (poor fixation), very short AL, contact method used."),
A("<b>Steps:</b>"),
B("1. Repeat with <b>immersion technique</b> (Prager shell + saline bath)"),
B("2. Measure fellow eye — bilateral AL should be within 0.3 mm"),
B("3. Select formula for short eye: <b>Hoffer Q or Haigis</b>"),
B("4. Target slight myopia (−0.5 D) to avoid aphakia from underpowered IOL"),
B("5. If optical biometry was tried but failed: A-scan immersion is the gold standard backup"),
SP(3),
]))
story.append(KeepTogether([
Q("IOL Master K readings post-LASIK show 36.5 D. What is the concern?"),
HL("Post-myopic LASIK: central ablation makes cornea flatter → IOL Master "
"underestimates true corneal power using standard index (1.3375)."),
A("<b>Approach:</b>"),
B("Use Haigis-L or Barrett True K (no pre-LASIK data needed)"),
B("If historical data available: clinical history method"),
B("Target −0.5 to −1.0 D as safety buffer"),
B("Counsel patient: higher risk of refractive surprise, possible piggyback IOL later"),
SP(3),
]))
story.append(KeepTogether([
Q("Why does optical biometry (IOL Master) fail in some cases and what is the backup?"),
A("Optical biometry (partial coherence interferometry) uses laser — blocked by:"),
B("Very dense posterior subcapsular cataracts"),
B("Dense nuclear or cortical opacities where the signal cannot penetrate"),
B("Corneal scarring / opacification"),
A("<b>Backup:</b> Immersion A-scan ultrasonography — sound penetrates opaque media."),
SP(3),
]))
story.append(KeepTogether([
Q("A patient reports −6.0 D residual hyperopia after cataract surgery. "
"What went wrong and how?"),
A("Most likely cause: <b>corneal compression during contact A-scan biometry</b>. "
"Compressed cornea → falsely short AL → IOL power calculated too low → "
"insufficient refractive power implanted → hyperopic outcome."),
A("Other possibilities: formula error for short eye, wrong A-constant, wrong IOL implanted."),
B("Prevention: immersion A-scan or optical biometry; check fellow eye symmetry"),
B("Management: spectacles, contact lens, IOL exchange, piggyback IOL, or LASIK correction"),
SP(3),
]))
# ═══════════════════════════════════════════════════════════════════════════════
# QUICK REFERENCE FLASHCARD TABLE
# ═══════════════════════════════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_banner("QUICK REFERENCE — High-Yield Numbers & Facts", GOLD))
story.append(SP(4))
qr_data = [
[Paragraph("<b>Parameter</b>", table_hdr), Paragraph("<b>Value / Fact</b>", table_hdr)],
[P("Normal adult axial length", table_cell), P("<b>24 mm</b>", table_cell)],
[P("AL impact on IOL power", table_cell), P("<b>2.5–3 D per mm</b>", table_cell)],
[P("K impact on IOL power", table_cell), P("<b>~1 D per 1 D</b>", table_cell)],
[P("Sound velocity — phakic eye", table_cell), P("<b>1555 m/s</b>", table_cell)],
[P("Sound velocity — aphakic eye", table_cell), P("<b>1532 m/s</b>", table_cell)],
[P("Sound velocity — cornea + lens", table_cell), P("<b>1641 m/s</b>", table_cell)],
[P("Contact A-scan spikes", table_cell), P("<b>5 spikes</b>", table_cell)],
[P("Immersion A-scan spikes", table_cell), P("<b>6 spikes</b> (cornea + probe separate)", table_cell)],
[P("Immersion vs contact AL difference", table_cell), P("<b>0.1–0.3 mm longer</b> on immersion (no compression)", table_cell)],
[P("Sulcus ACD reduction", table_cell), P("<b>−0.25 mm</b> from in-bag value", table_cell)],
[P("PMMA pseudophakic correction", table_cell), P("<b>+0.4 mm</b> from aphakic mode", table_cell)],
[P("Acrylic IOL correction", table_cell), P("<b>+0.2 mm</b> from aphakic mode", table_cell)],
[P("Silicone IOL correction", table_cell), P("<b>−0.4 to −0.8 mm</b> from aphakic mode", table_cell)],
[P("Short eye formula choice (AL < 22 mm)", table_cell), P("<b>Hoffer Q, Haigis, Hill-RBF, Kane</b>", table_cell)],
[P("Long eye formula choice (AL > 26 mm)", table_cell), P("<b>Barrett Universal II, Holladay, Haigis, Kane</b>", table_cell)],
[P("Nanophthalmos", table_cell), P("<b>AL < 20 mm</b>", table_cell)],
[P("A-constant unique to", table_cell), P("IOL design, material, position, surgeon technique", table_cell)],
[P("Haigis formula constants", table_cell), P("<b>3 constants: a0, a1, a2</b>", table_cell)],
[P("Soft CL: withhold before biometry", table_cell), P("<b>≥ 1 week</b>", table_cell)],
]
qr_tbl = Table(qr_data, colWidths=[8*cm, 7.5*cm])
qr_tbl.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), NAVY),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GOLD]),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]))
story.append(qr_tbl)
story.append(SP(5))
story.append(P("Good luck in your viva! Review the high-yield numbers daily in the week before your exam.", note_style))
# ── Build ─────────────────────────────────────────────────────────────────────
doc.build(story)
print("PDF built successfully:", OUTPUT)
cd /home/daytona/workspace/ascan-viva && python3 build_pdf.py 2>&1
ls -lh /home/daytona/workspace/ascan-viva/AScan_Viva_StudyGuide.pdf
AScan Viva StudyGuide
PDF Document · PDF
| Section | Content |
|---|---|
| Cover page | Key numbers at a glance (navy/gold design) |
| Section 1 | Physics & Principles — 5 Q&As with velocity table |
| Section 2 | Contact vs Immersion — comparison table, Prager shell, 5 vs 6 spikes |
| Section 3 | Axial Length & Normal Values — AL ranges table |
| Section 4 | IOL Power Formulae — SRK, ELP, Haigis, formula selection by AL |
| Section 5 | Special Situations — silicone oil, pseudophakic corrections, post-LASIK, aphakia |
| Section 6 | Errors & Quality Control — retinal spike criteria, staphyloma |
| Section 7 | Clinical Viva Scenarios — 4 case-based questions |
| Quick Ref | Full high-yield numbers table (gold header) |
Panopthalmitis case presentation for ophthalmology residency
panophthalmitis case presentation clinical features management ophthalmology residency
https://eyewiki.org/Panophthalmitis
| Term | Extent of Inflammation |
|---|---|
| Endophthalmitis | Vitreous cavity ± anterior segment |
| Panophthalmitis | All above + uvea + sclera + Tenon's capsule + orbit |
| Finding | Description |
|---|---|
| Eyelids | Marked oedema, hyperaemia, warm to touch |
| Conjunctiva | Intense chemosis, 360° ciliary + conjunctival congestion |
| Discharge | Profuse mucopurulent/purulent |
| Proptosis | ~4 mm by Hertel exophthalmometry |
| Ocular motility | Severely restricted in all directions; painful on attempted movement |
| Cornea | Oedematous, cloudy, yellowish infiltration; impending perforation centrally |
| Structure | Finding |
|---|---|
| Cornea | Dense oedema, stromal infiltration, Descemet's folds |
| Anterior chamber | Hypopyon (2 mm level), intense flare |
| Iris | Congested, muddy, posterior synechiae |
| Pupil | Mid-dilated, sluggish, irregular |
| Lens | Hazy view |
| Fundus | No red reflex; no fundal view |
| Investigation | Result |
|---|---|
| CBC | WBC 18,400/μL (neutrophilia) |
| CRP | 86 mg/L (elevated) |
| ESR | 68 mm/hr |
| Blood cultures (×2 sets) | Pending |
| Blood glucose (random) | 89 mg/dL |
| Chest X-ray | No focal consolidation |
| ECG | Normal sinus rhythm |
| CT orbit (axial + coronal, with contrast) | Right globe: diffuse scleral thickening, subtenon enhancement, periorbital fat stranding; no subperiosteal abscess; no intracranial extension |

| Category | Organisms |
|---|---|
| Gram-positive cocci (most common post-surgical) | S. epidermidis, S. aureus, Streptococcus spp. |
| Post-traumatic (especially organic FB) | Bacillus cereus, Bacillus anthracis |
| Endogenous sepsis | S. aureus, Streptococci, Klebsiella, Neisseria meningitidis, H. influenzae |
| IV drug users | Bacillus cereus (classic association) |
| Post-cataract surgery | S. epidermidis, S. aureus, Pseudomonas |
| Anaerobes | Propionibacterium acnes (delayed post-op), Clostridium |
| Condition | Key Differentiating Features |
|---|---|
| Endophthalmitis (without orbital extension) | No proptosis, no restricted EOM, no Tenon's involvement on imaging |
| Orbital cellulitis | No hypopyon, anterior segment usually normal, no fundal involvement |
| Acute angle-closure glaucoma | Corneal haze but no discharge, no hypopyon, IOP very elevated |
| Perforated corneal ulcer with iris prolapse | Flat AC, prolapsed iris plug, no orbital signs |
| Acute dacryocystitis with orbital spread | Medial canthal swelling, nasolacrimal system origin |
| Retinoblastoma with secondary inflammation | Child, leukocoria history, imaging shows mass |
| Sympathetic ophthalmia | History of trauma to fellow eye, bilateral granulomatous uveitis |
| Drug | Dose (intravitreal) |
|---|---|
| Vancomycin (Gram-positive cover) | 1 mg in 0.1 mL |
| Ceftazidime (Gram-negative cover) | 2.25 mg in 0.1 mL |
| Clindamycin (anaerobe / Bacillus cover) | 1 mg in 0.1 mL |
| Amikacin (if Bacillus / penicillin allergy) | 0.4 mg in 0.1 mL |
Caution: Intravitreal aminoglycosides (amikacin, gentamicin) risk macular infarction - use selectively.
| Procedure | Description | Preferred when |
|---|---|---|
| Evisceration | Removal of ocular contents, scleral shell preserved | Panophthalmitis (scleral shell limits orbital spread debate; better cosmesis with implant) |
| Enucleation | Removal of entire globe | Suspected intraocular tumour; sympathetic ophthalmia risk; orbital invasion |
Sympathetic ophthalmia caveat: Evisceration in panophthalmitis is generally safe but classical teaching recommends enucleation within 14 days of penetrating injury if there is risk of sympathetic ophthalmia. In practice, evisceration is widely performed.
| Domain | Key Point |
|---|---|
| Definition | Inflammation of entire globe extending to Tenon's/orbit |
| Aetiology (most common) | Penetrating trauma (exogenous); sepsis (endogenous) |
| Organisms | Bacteria (Staph, Bacillus, Streptococcus, Pseudomonas) |
| Symptoms | Severe pain, NLP/severe VL, swelling, discharge, fever |
| Signs | Hypopyon, NLP, proptosis, restricted EOM, chemosis, absent red reflex |
| Key investigation | B-scan US, vitreous tap for C&S, blood cultures, CT orbit |
| Intravitreal Rx | Vancomycin 1mg + Ceftazidime 2.25 mg |
| Systemic Rx | IV broad-spectrum antibiotics (meningitis-dose) |
| Surgical escalation | PPV → Evisceration (if NLP + failed Rx) |
| Prognosis | Very poor for vision; systemic complications can be fatal |