tough vivaquestionsand answersfor A SCAN in opthalmology for residency

Reading File
Finding Sources
Finding Sources
Searching the Web

A-scan biometry ophthalmology residency viva questions axial length IOL power calculation

Reading File
Finding Sources
Reading Web Page

https://eyewiki.org/Biometry_for_Intra-Ocular_Lens_(IOL)_Pow…

Reading File
Finding Sources
Searching the Web

A-scan biometry viva questions ophthalmology immersion vs contact technique spike pattern errors

I now have comprehensive data from the textbook and multiple authoritative web sources. Let me compile the full viva Q&A.

A-Scan Biometry - Tough Viva Questions & Answers (Ophthalmology Residency)


SECTION 1: PHYSICS & PRINCIPLES

Q1. What is the fundamental principle behind A-scan ultrasonography?
A-scan uses high-frequency sound waves (10 MHz). The probe emits a pulse that reflects off each acoustic interface in the eye (cornea, anterior lens, posterior lens, retina). The time taken for each echo to return is converted to distance using the formula:
Distance = Time × Velocity / 2
The result is a one-dimensional amplitude display where reflecting surfaces appear as vertical spikes from a baseline. The "A" stands for Amplitude modulation.

Q2. What are the standard sound velocities used in A-scan biometry?
MediumVelocity
Cornea + Lens1641 m/s
Aqueous + Vitreous1532 m/s
Normal phakic eye (average)1550-1555 m/s
Aphakic eye1532 m/s
Pseudophakic eye1532 m/s + correction for IOL material
The cornea is not individually corrected in practice because at ~0.5 mm thickness at 1641 m/s, it adds only ~0.04 mm - clinically negligible.

Q3. Why does sound travel faster through the lens than the vitreous?
The crystalline lens and cornea are denser, more solid structures compared to the aqueous and vitreous, which are watery liquids. Acoustic velocity increases with the elasticity-to-density ratio of a medium. Greater molecular density and structural rigidity in the lens results in faster sound propagation.

Q4. What is the A-scan spike pattern in a normal phakic eye (contact method)?
There are 5 spikes in the contact technique:
  1. Combined probe tip + cornea (initial spike)
  2. Anterior lens capsule
  3. Posterior lens capsule
  4. Retina (steep, perpendicular rise - the most important spike)
  5. Sclera + orbital fat
A high-quality scan has: all spikes at maximum amplitude, steeply rising retinal spike, and retinal spike clearly separated from the scleral spike.

Q5. How does the immersion technique differ from the contact technique in terms of spike pattern?
In the immersion technique, the probe floats in saline (Prager shell) and does NOT touch the cornea directly. This produces 6 spikes instead of 5:
  1. Probe tip
  2. Cornea (now separate from probe)
  3. Anterior lens
  4. Posterior lens
  5. Retina
  6. Sclera
The cornea and probe tip are no longer combined into one spike, hence the extra spike.

SECTION 2: CONTACT vs IMMERSION TECHNIQUE

Q6. What is the most common and important error in contact A-scan biometry?
Corneal compression (applanation artifact). Even minimal pressure from the probe tip indents the soft, pliable cornea, causing:
  • Falsely shortened axial length measurement
  • Shallower anterior chamber depth on the scan
  • Leads to underpowered IOL (residual hyperopia postoperatively)
Rule: If ACD looks unusually shallow on contact A-scan, delete those readings even if the spikes appear high quality.

Q7. By how much does immersion A-scan overestimate axial length compared to contact A-scan?
Eyes measured by immersion are 0.1 to 0.3 mm longer than contact method measurements, precisely because immersion avoids corneal compression. This difference is not a true overestimation - immersion is more accurate. The contact method underestimates true axial length.

Q8. Name the advantages of immersion A-scan over contact A-scan.
  1. Avoids corneal compression - more accurate axial length
  2. Less technician-dependent (reproducible between operators)
  3. Faster when proficient
  4. Preferred in soft eyes (low IOP), where compression artifact is worst
  5. Gold standard for pediatric biometry under anesthesia

Q9. What is the Prager shell? What does it do?
The Prager shell is a small scleral cup placed between the lids over the anesthetized eye. It is filled with saline. The probe is then immersed in the saline bath without touching the cornea, enabling immersion-technique A-scan. This design physically prevents corneal compression.

SECTION 3: AXIAL LENGTH & NORMAL VALUES

Q10. What is the average axial length of a normal adult phakic eye? What is its clinical significance?
Average axial length = 24 mm (range: 22-26 mm in emmetropic eyes).
Clinical significance:
  • Each 1 mm change in axial length changes IOL power by approximately 2.5-3 diopters
  • This effect is greater in short eyes than long eyes (inverse relationship with AL)
  • Axial length is the single most important variable in IOL power calculation

Q11. What axial length defines microphthalmos, nanophthalmos, and high myopia?
ConditionAxial 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

Q12. What is the most accurate measurement - cornea to which structure does axial length measure?
Axial length is measured from the anterior corneal epithelial surface to the retinal pigment epithelium (RPE) - specifically to the macula (fovea). Alignment along the visual axis (not the optic nerve axis) is mandatory. If the beam hits the optic nerve, the scleral spike is absent - this is a recognizable error pattern.

SECTION 4: IOL POWER CALCULATION FORMULAE

Q13. Write the basic SRK formula. What are its limitations?
P = A - 0.9K - 2.5(AL)
Where:
  • P = IOL power (D)
  • A = A-constant (IOL-specific)
  • K = Average keratometry (D)
  • AL = Axial length (mm)
Limitations:
  • First-generation empirical regression formula; least accurate
  • Notoriously inaccurate for eyes outside the normal AL range (short or long eyes)
  • Should only be used for manual calculations when no software is available
  • Superseded by SRK II, then SRK/T

Q14. Compare the recommended formulae for short vs. long eyes.
EyeAxial LengthRecommended Formulae
Short< 22 mmHoffer Q, Haigis, Hill-RBF, Kane
Average22-26 mmSRK/T, Holladay 1, any 3rd gen
Long> 26 mmBarrett Universal II, Holladay (with optimized constants), Haigis, Kane
Short eyes are most prone to unexpected mean spherical error. Formulae that use anterior chamber depth (ACD) and lens thickness perform better in extremes.

Q15. What is the A-constant? What factors affect it?
The A-constant is an IOL-specific empirical constant that accounts for the position of the IOL in the eye (effective lens position, ELP). It is provided by the IOL manufacturer.
Factors affecting it:
  • IOL design (single-piece vs. 3-piece)
  • IOL material (PMMA, acrylic, silicone)
  • IOL position (in-the-bag vs. sulcus)
  • Surgical technique (incision size, surgeon)
For sulcus placement, reduce formula ACD by 0.25 mm. For posterior iris fixation, reduce ACD by a further 0.25 mm.

Q16. What is ELP and why is it critical?
ELP (Effective Lens Position) is the predicted distance from the anterior corneal surface to the principal plane of the implanted IOL. It is the variable most formulae are trying to optimize.
Third-generation formulae (SRK/T, Holladay 1, Hoffer Q) predict ELP from keratometry and axial length. Fourth-generation formulae (Haigis, Holladay 2) also use ACD, lens thickness, and white-to-white measurements to predict ELP more accurately.

Q17. What is the Haigis formula unique feature?
Haigis uses three IOL constants (a0, a1, a2) instead of a single A-constant:
P = a0 + a1 × ACD (measured) + a2 × AL
This makes it particularly accurate for abnormal eyes because it separates the contribution of ACD from AL. The optimized a-constants are individualized per surgeon per IOL type.

SECTION 5: SPECIAL SITUATIONS

Q18. How do you manage biometry in a patient with silicone oil in the vitreous?
Silicone oil has a very different acoustic velocity (~980-1040 m/s depending on viscosity) compared to normal vitreous (1532 m/s). This causes the A-scan to significantly overestimate axial length (falsely long).
Solutions:
  1. Use optical biometry (IOL Master) - not affected by silicone oil
  2. If using A-scan: use a silicone-oil specific velocity setting
  3. Apply the Okulix or other silicone oil calculation method
  4. Correction factor formula: CT × (1 - 1532/vel of silicone)

Q19. How is biometry performed after previous refractive surgery (LASIK/PRK)?
Standard IOL formulas fail because:
  1. Keratometry underestimates corneal power (measures posterior curvature altered)
  2. Standard index of refraction assumptions are invalid
  3. ELP prediction errors (formulae assume normal corneal shape)
Approaches:
  • Clinical history method: Uses pre-LASIK refraction and K values
  • Contact lens method: Fitting of plano contact lens to derive true corneal power
  • Haigis-L formula: Uses statistical regression, no historical data needed
  • Barrett True K / Masket formula: Adjust for refractive history
  • Always warn patient of likely refractive surprise

Q20. What correction factors apply to pseudophakic A-scan measurements for different IOL materials?
When a biometer only has a PMMA pseudophakic setting, use aphakic mode (1532 m/s) and add the correction:
IOL MaterialCorrection (add to aphakic measurement)
PMMA+0.4 mm
Acrylic+0.2 mm
Silicone (high-velocity)-0.4 to -0.8 mm
Formula: Correction factor = CT × (1 - 1532/velocity of IOL material)

Q21. How does aphakia affect A-scan biometry?
  • Sound velocity in aphakic eye = 1532 m/s (same as aqueous/vitreous, no lens)
  • The two lens spikes are absent
  • A single spike appears from the anterior vitreous face / posterior capsule
  • Immersion technique is strongly preferred for aphakic eyes
  • Biometers must be set to aphakic mode

SECTION 6: ERRORS & QUALITY CONTROL

Q22. List the sources of error in A-scan biometry.
Technical errors:
  • Corneal compression (contact method) - underestimates AL
  • Misalignment (off visual axis) - underestimates AL
  • Incomplete retinal spike (steeply-rising retinal spike is mandatory)
  • Beam directed at optic nerve instead of macula
Patient factors:
  • Poor fixation (dense cataract, nystagmus, macular disease)
  • Staphyloma (posterior pole irregularity) - gives variable readings
  • Silicone oil in vitreous
  • Previous corneal refractive surgery
Formula selection errors:
  • Using wrong formula for extreme AL
  • Not optimizing A-constants for the surgeon's own outcomes

Q23. What does the ideal retinal spike look like and why does it matter?
The ideal retinal spike should:
  • Rise steeply at 90 degrees to the baseline
  • Be of maximum height
  • Be clearly separated from the scleral spike
A sloped retinal spike indicates off-axis measurement (probe not perpendicular to macula). If the retinal spike is absent or sloped, that reading must be rejected - it represents a longer-than-true path through the vitreous.

Q24. What is the difference between optical biometry (IOL Master/Lenstar) and A-scan ultrasound?
FeatureOptical BiometryA-scan Ultrasound
MethodPartial coherence interferometry (laser)Ultrasound pulses
ContactNon-contactContact or immersion
AccuracyHigher (gold standard)Slightly lower
Dense cataractsMay failWorks (sound penetrates)
Posterior staphylomaHandles betterProblematic
Silicone oilUnaffectedSignificant error
Technician skill neededLessMore (contact)
Also measuresK, ACD, LT, WTWMainly AL
A-scan is the backup when optical biometry fails (e.g., very dense posterior subcapsular cataract that blocks the laser beam).

SECTION 7: HIGH-YIELD CLINCHERS

Q25. A 70-year-old with a dense white cataract undergoes contact A-scan. Axial length is 21.8 mm. What do you do?
Red flags: dense cataract (poor fixation possible), short AL (nanophthalmos range - needs verification), contact method used.
Steps:
  1. Repeat with immersion technique (Prager shell + saline bath)
  2. Measure the fellow eye - bilateral symmetry is expected (within 0.3 mm)
  3. If white cataract prevents optical biometry, ensure immersion A-scan is used
  4. Use Hoffer Q or Haigis formula (short eye)
  5. Target slight myopia (-0.5 D) to avoid aphakia from underpowered IOL

Q26. Patient has had LASIK 10 years ago and now needs cataract surgery. IOL Master K readings are 36.5 D. What is the concern and approach?
Concern: Post-myopic LASIK ablates central cornea, making it flatter. IOL Master measures anterior curvature and applies a fixed index (1.3375) - this underestimates true corneal power in post-myopic LASIK eyes.
Approach:
  1. Obtain pre-LASIK K values and refraction (clinical history method)
  2. Use Haigis-L or Barrett True K (no historical data needed)
  3. Target mild myopia (-0.5 to -1.0 D) as a safety buffer
  4. Warn patient of refractive uncertainty; discuss piggyback IOL option if needed

Q27. What is the relationship between A-constant and surgical technique?
The A-constant is surgeon- and technique-dependent. Phaco with small-incision will have different ELP than ECCE with large incision, which shifts the IOL position forward or backward, changing the effective power delivered. Every surgeon should optimize their personal A-constants using retrospective analysis of their own outcomes (at least 20-50 cases per IOL type) rather than relying on manufacturer defaults.

Q28. How does keratometry error affect IOL power compared to axial length error?
  • A 1 mm error in axial length = ~2.5-3 D error in IOL power
  • A 1 D error in keratometry = ~1 D error in IOL power
Axial length errors have the largest impact on IOL calculation. This is why corneal compression in contact A-scan is the most consequential and most common clinical error.

These cover the core domains an examiner will probe: physics, technique, formulae, error analysis, and special cases. The high-yield numbers to remember are: 1555 m/s (phakic average), 1532 m/s (aphakic/vitreous), 24 mm (normal AL), 2.5-3 D per mm (AL impact on IOL), and the 5 spikes / 6 spikes rule for contact vs. immersion.

Create a study guide or flashcard PDF for A-scan viva review

Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace not found"

Running Command

mkdir -p /home/daytona/workspace/ascan-viva && python3 -c "from reportlab.lib.pa…

Writing File

~/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)
Running Command

cd /home/daytona/workspace/ascan-viva && python3 build_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/ascan-viva/AScan_Viva_StudyGuide.pdf

Your study guide PDF is ready. Here's the download link:

AScan Viva StudyGuide

PDF Document · PDF


What's inside the PDF:
SectionContent
Cover pageKey numbers at a glance (navy/gold design)
Section 1Physics & Principles — 5 Q&As with velocity table
Section 2Contact vs Immersion — comparison table, Prager shell, 5 vs 6 spikes
Section 3Axial Length & Normal Values — AL ranges table
Section 4IOL Power Formulae — SRK, ELP, Haigis, formula selection by AL
Section 5Special Situations — silicone oil, pseudophakic corrections, post-LASIK, aphakia
Section 6Errors & Quality Control — retinal spike criteria, staphyloma
Section 7Clinical Viva Scenarios — 4 case-based questions
Quick RefFull high-yield numbers table (gold header)
The PDF uses colour-coded banners, boxed Q&As, embedded tables, warning callouts (⚠), and memory tips (💡) throughout - optimised for last-minute viva revision.

Panopthalmitis case presentation for ophthalmology residency

Reading File
Asking for Preferences
Finding Sources
Finding Sources
Searching the Web

panophthalmitis case presentation clinical features management ophthalmology residency

Reading File
Reading File
Reading Web Page

https://eyewiki.org/Panophthalmitis

Reading File
Finding Sources
Loading Image
Excellent - I have comprehensive data from Robbins pathology, Wills Eye Manual, and EyeWiki. Now I'll compile the full case presentation.

PANOPHTHALMITIS — Complete Case Presentation

Ophthalmology Residency Grand Rounds


DEFINITION & ANATOMICAL EXTENT

Panophthalmitis is an intense purulent (suppurative) inflammation involving the entire eyeball - retina, choroid, vitreous, sclera, uvea - that extends beyond the sclera into the Tenon's capsule and orbital tissues.
Key distinction from endophthalmitis:
TermExtent of Inflammation
EndophthalmitisVitreous cavity ± anterior segment
PanophthalmitisAll above + uvea + sclera + Tenon's capsule + orbit
Panophthalmitis = endophthalmitis that has breached the scleral barrier.

CASE PRESENTATION

Patient: 45-year-old male agricultural labourer
Chief Complaint: Severe pain, redness, and complete loss of vision in the right eye for 3 days

HISTORY OF PRESENT ILLNESS

The patient presented with:
  • Onset: Sudden onset of severe, throbbing right eye pain 5 days ago
  • Preceding event: Sustaining a penetrating injury to the right eye with a wooden twig 6 days prior while working in a field; patient initially ignored the injury
  • Progression: Progressive redness, profuse mucopurulent discharge, swelling of eyelids, and complete loss of vision over 72 hours
  • Systemic symptoms: Fever (38.9°C), malaise, severe headache
Associated symptoms:
  • Marked lid swelling and inability to open the eye
  • Purulent yellow-green discharge
  • Photophobia (prior to complete loss of light perception)
  • Nausea and vomiting (from severe pain)
  • Proptosis noted by family members

PAST HISTORY

  • No prior ocular surgery or trauma
  • No systemic illness (diabetes, hypertension, immunosuppression)
  • No intravenous drug use
  • Tetanus vaccination status: unknown

EXAMINATION

General: Ill-appearing, febrile (38.9°C), tachycardic (104/min)

External Examination - Right Eye:

FindingDescription
EyelidsMarked oedema, hyperaemia, warm to touch
ConjunctivaIntense chemosis, 360° ciliary + conjunctival congestion
DischargeProfuse mucopurulent/purulent
Proptosis~4 mm by Hertel exophthalmometry
Ocular motilitySeverely restricted in all directions; painful on attempted movement
CorneaOedematous, cloudy, yellowish infiltration; impending perforation centrally

Slit-Lamp Examination - Right Eye:

StructureFinding
CorneaDense oedema, stromal infiltration, Descemet's folds
Anterior chamberHypopyon (2 mm level), intense flare
IrisCongested, muddy, posterior synechiae
PupilMid-dilated, sluggish, irregular
LensHazy view
FundusNo red reflex; no fundal view

Left Eye: Completely normal

IOP (Right): Elevated, approximately 32 mmHg (digital palpation / tonometry)
Visual Acuity:
  • Right eye: No light perception (NLP)
  • Left eye: 6/6

INVESTIGATIONS

Ocular Investigations:

1. B-scan Ultrasonography (Right Eye):
  • Dense vitreous echoes (vitritis)
  • Choroidal thickening
  • Scleral thickening with subtenon fluid (T-sign / thickened posterior coats)
  • No retinal detachment identified
2. Aqueous/Vitreous Tap (Tap and Inject):
  • Vitreous aspiration performed
  • Gram stain: Gram-positive bacilli (preliminary)
  • Culture sent (blood agar, chocolate agar, Sabouraud's)

Systemic Investigations:

InvestigationResult
CBCWBC 18,400/μL (neutrophilia)
CRP86 mg/L (elevated)
ESR68 mm/hr
Blood cultures (×2 sets)Pending
Blood glucose (random)89 mg/dL
Chest X-rayNo focal consolidation
ECGNormal sinus rhythm
CT orbit (axial + coronal, with contrast)Right globe: diffuse scleral thickening, subtenon enhancement, periorbital fat stranding; no subperiosteal abscess; no intracranial extension

PATHOLOGICAL IMAGE

The following gross pathology image (from Robbins Pathology) shows an eye removed after exogenous panophthalmitis following penetrating foreign body injury. Suppurative inflammation has completely distorted the normal ocular architecture:
Gross pathology of exogenous panophthalmitis - eye removed after foreign body injury showing suppurative inflammation distorting entire ocular architecture
Fig. 29.16 - Robbins Pathologic Basis of Disease: Exogenous panophthalmitis following foreign body injury. Suppurative inflammation of the entire orbit has distorted the architecture of the eye.

DIAGNOSIS

Right Eye: Exogenous Panophthalmitis - secondary to penetrating ocular trauma with retained organic foreign body (wooden twig)

AETIOLOGY & CLASSIFICATION

Classification by Route of Infection:

1. Exogenous (most common)

  • Penetrating ocular injuries (especially organic matter: wood, vegetable matter, soil)
  • Perforating corneal ulcer
  • Post-operative infection following intraocular surgery
  • Infected corneal ulcer with scleral spread
  • Secondary from orbital cellulitis

2. Endogenous (haematogenous spread)

  • Septicaemia (any source)
  • Infective endocarditis
  • IV drug abuse (Bacillus cereus is classic)
  • Klebsiella liver abscess (especially East/Southeast Asia - Klebsiella pneumoniae endogenous endophthalmitis-panophthalmitis)
  • Dental abscess / puerperal sepsis (less common)
  • Meningococcaemia

Causative Organisms:

Bacterial (most common overall):

CategoryOrganisms
Gram-positive cocci (most common post-surgical)S. epidermidis, S. aureus, Streptococcus spp.
Post-traumatic (especially organic FB)Bacillus cereus, Bacillus anthracis
Endogenous sepsisS. aureus, Streptococci, Klebsiella, Neisseria meningitidis, H. influenzae
IV drug usersBacillus cereus (classic association)
Post-cataract surgeryS. epidermidis, S. aureus, Pseudomonas
AnaerobesPropionibacterium acnes (delayed post-op), Clostridium

Fungal:

  • Aspergillus (post-traumatic, especially agricultural soil)
  • Rhizopus / Mucor (immunocompromised, diabetics)
  • Candida (endogenous, IV drug users, immunosuppressed)
  • Fusarium

Viral (rare panophthalmitis):

  • Herpes simplex virus (HSV)
  • Varicella-zoster virus (VZV)
  • Dengue virus

DIFFERENTIAL DIAGNOSIS

ConditionKey Differentiating Features
Endophthalmitis (without orbital extension)No proptosis, no restricted EOM, no Tenon's involvement on imaging
Orbital cellulitisNo hypopyon, anterior segment usually normal, no fundal involvement
Acute angle-closure glaucomaCorneal haze but no discharge, no hypopyon, IOP very elevated
Perforated corneal ulcer with iris prolapseFlat AC, prolapsed iris plug, no orbital signs
Acute dacryocystitis with orbital spreadMedial canthal swelling, nasolacrimal system origin
Retinoblastoma with secondary inflammationChild, leukocoria history, imaging shows mass
Sympathetic ophthalmiaHistory of trauma to fellow eye, bilateral granulomatous uveitis

MANAGEMENT

Principles:

  1. Multidisciplinary approach - Ophthalmology + Infectious Disease + Internal Medicine
  2. Immediate hospitalisation
  3. Maximise globe salvage attempts before proceeding to destructive surgery
  4. Systemic cultures before initiating antibiotics

Step-by-Step Management:

STEP 1 — Cultures First (Before Any Antibiotic)

  • Vitreous tap ± anterior chamber tap
  • Blood cultures (×2 sets, different sites)
  • Culture of any discharge (Gram stain, KOH, culture)
  • Urine culture if endogenous source suspected
  • Consider transesophageal echocardiogram (rule out endocarditis)

STEP 2 — Empiric Intravitreal Antibiotics (Tap & Inject)

For bacterial panophthalmitis:
DrugDose (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.
For suspected fungal aetiology:
  • Intravitreal Voriconazole 100 μg/0.1 mL, OR
  • Intravitreal Amphotericin B 5 μg/0.1 mL

STEP 3 — Systemic (IV) Antibiotics

  • Broad-spectrum IV antibiotics at doses used for meningitis/severe infections
  • IV Vancomycin + IV Ceftriaxone/Piperacillin-tazobactam (empiric)
  • Modify based on culture sensitivity
  • IV drug users: IV aminoglycoside + clindamycin (Bacillus cereus cover)
  • Good vitreous penetration is essential - fluoroquinolones achieve best penetration

STEP 4 — Adjunctive Topical Therapy

  • Cycloplegic: Atropine 1% TID (prevents posterior synechiae, reduces ciliary spasm)
  • Topical steroids: once fungal aetiology ruled out (prednisolone acetate 1% q1-4h)
  • Topical antibiotics (fortified): Vancomycin 5% + Tobramycin/Cefazolin drops

STEP 5 — Pars Plana Vitrectomy (PPV)

Indications:
  • No response to intravitreal + IV antibiotics within 24-48 hours
  • Fungal aetiology (requires vitrectomy for adequate antifungal delivery)
  • Dense vitreous opacification
  • Early stages with potential for vision salvage
Benefits of PPV:
  • Reduces infective and inflammatory load
  • Provides adequate material for culture + histopathology
  • Permits intravitreal antibiotics at higher concentrations
  • Clears vitreous media

STEP 6 — Evisceration (if Globe Salvage Fails)

When to perform:
  • No light perception (NLP) + failure of all medical/surgical treatment
  • Threat to life (spreading orbital/intracranial infection)
  • Blind, painful, cosmetically unacceptable eye
  • Impending corneal perforation with uncontrolled infection
Evisceration vs Enucleation in panophthalmitis:
ProcedureDescriptionPreferred when
EviscerationRemoval of ocular contents, scleral shell preservedPanophthalmitis (scleral shell limits orbital spread debate; better cosmesis with implant)
EnucleationRemoval of entire globeSuspected 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.
Tetanus prophylaxis: 0.5 mL tetanus toxoid IM if not up to date (especially in soil/organic matter injuries).

PROGNOSIS

  • Visual prognosis is very poor once NLP is established
  • Retina is extremely intolerant of suppurative inflammation - irreversible injury can occur within hours
  • Even with aggressive treatment, most eyes with true panophthalmitis retain little or no useful vision
  • Life-threatening complications must be actively excluded

COMPLICATIONS

Ocular:

  • Corneal perforation
  • Phthisis bulbi (end-stage shrunken eye)
  • Hypotony or secondary glaucoma
  • Retinal detachment
  • Subretinal/choroidal abscess

Orbital & Systemic:

  • Orbital abscess
  • Orbital cellulitis
  • Cavernous sinus thrombosis (life-threatening)
  • Meningitis / intracranial extension
  • Septicaemia / multi-organ failure
  • Sympathetic ophthalmia (fellow eye)

KEY TEACHING POINTS FOR VIVA

  1. Panophthalmitis = endophthalmitis + scleral/orbital extension (Tenon's involvement distinguishes it)
  2. Most common cause exogenous: penetrating trauma, especially organic material (agricultural injuries - Bacillus, Aspergillus)
  3. IV drug users: think Bacillus cereus → treat with aminoglycoside + clindamycin
  4. Klebsiella pneumoniae endogenous panophthalmitis is classic in East Asian patients with liver abscess or DM
  5. B-scan findings: T-sign (scleral thickening + subtenon fluid), dense vitreous echoes
  6. Intravitreal vancomycin + ceftazidime = empirical first-line intravitreal therapy
  7. Retina tolerates suppuration for only a few hours - time is vision
  8. NLP + failed treatment = evisceration (don't delay surgical intervention when eye is unsalvageable)
  9. Multi-disciplinary: Ophthalmology + ID + Medicine - always do systemic workup
  10. Steroids only after fungal aetiology excluded

SUMMARY TABLE

DomainKey Point
DefinitionInflammation of entire globe extending to Tenon's/orbit
Aetiology (most common)Penetrating trauma (exogenous); sepsis (endogenous)
OrganismsBacteria (Staph, Bacillus, Streptococcus, Pseudomonas)
SymptomsSevere pain, NLP/severe VL, swelling, discharge, fever
SignsHypopyon, NLP, proptosis, restricted EOM, chemosis, absent red reflex
Key investigationB-scan US, vitreous tap for C&S, blood cultures, CT orbit
Intravitreal RxVancomycin 1mg + Ceftazidime 2.25 mg
Systemic RxIV broad-spectrum antibiotics (meningitis-dose)
Surgical escalationPPV → Evisceration (if NLP + failed Rx)
PrognosisVery poor for vision; systemic complications can be fatal

Sources: Robbins & Cotran Pathologic Basis of Disease; Wills Eye Manual 7th ed.; Kanski's Clinical Ophthalmology 10th ed.; EyeWiki Panophthalmitis
This is a shared conversation. Sign in to Orris to start your own chat.