Write a question on Tonometry,various types ,various principles,adv and disadvantage of types of tonometer Focus on theory and practical exam as well . Detail about schiotz for MS ophthalmol theory and practical exam

Reading File
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Reading File
Searching Images

Schiotz tonometer intraocular pressure measurement

Reading File
Reading File
Loading Image
Loading Image
I now have all the material needed. Let me compose the comprehensive MS Ophthalmology exam question with detailed answer.

TONOMETRY — MS Ophthalmology Theory & Practical Exam


LONG ANSWER QUESTION (MS Theory Exam Style)

"Write a detailed note on Tonometry. Describe the various types of tonometers, their underlying principles, advantages and disadvantages. Give a detailed account of the Schiotz tonometer including its construction, mechanism of action, technique of use, sources of error, and clinical significance."
(Expected answer: 20-25 marks, 1500-2000 words)

MODEL ANSWER


DEFINITION

Tonometry is the measurement of intraocular pressure (IOP). It is obtained by measuring the resistance of the eyeball to indentation by an applied force. Normal IOP ranges from 10-21 mm Hg (mean 16 mm Hg). Sustained elevation of IOP is associated with glaucomatous optic nerve damage and visual field loss.

HISTORICAL BACKGROUND

  • 1860s: Von Graefe developed the first mechanical tonometer
  • 1885: Maklakoff introduced applanation tonometry
  • 1905: Schiötz developed the impression/indentation tonometer (modified in 1920s)
  • Goldmann improved applanation tonometry - now the gold standard
  • MacKay-Marg: electronic indentation principle (predecessor of Tono-Pen)
  • Recent: Rebound tonometry (iCare) introduced
(Roberts & Hedges' Clinical Procedures in Emergency Medicine; Pfenninger & Fowler's Procedures for Primary Care)

CLASSIFICATION OF TONOMETERS

CategoryTypeExamples
Indentation / ImpressionMeasures depth of corneal indentation by a fixed forceSchiotz tonometer
ApplanationMeasures force needed to flatten a fixed area of corneaGoldmann (slit-lamp), Perkins (hand-held), Tono-Pen
Non-contactAir-puff flattens cornea; no corneal contactPneumotonometer (Pulsair)
ReboundMagnetized probe rebounds off corneaiCare
Dynamic ContourContour-matching sensor, IOP independent of corneaPASCAL (DCT)

PRINCIPLES OF TONOMETRY

1. Indentation (Impression) Principle

A fixed load (weight) is placed on the cornea and the depth of indentation is measured. The greater the indentation, the lower the IOP, and vice versa. The tonometer measures total IOP (initial pressure + pressure added by the weight of instrument). A rigidity coefficient (Friedenwald) is applied via conversion tables to estimate true IOP.

2. Imbert-Fick Principle (Applanation)

States that for an ideal, dry, thin-walled sphere:
P = F / A
Where P = internal pressure, F = force required to flatten the surface, A = area of flattening.
The human eye is not an ideal sphere - the cornea is rigid (resists flattening) and capillary attraction of the tear meniscus pulls the tonometer toward the cornea. These two forces cancel each other out when the flattened area has a diameter of 3.06 mm - which is exactly the design of the Goldmann prism.
(Kanski's Clinical Ophthalmology, 10th ed., p. 43)

3. MacKay-Marg Principle

A refined indentation technique where a smaller area of cornea is indented with an electronic transducer that measures applied force directly. Useful in irregular/oedematous corneas.

4. Non-Contact (Air-Puff) Principle

A jet of air flattens the central cornea. The time required to flatten a standard area is proportional to IOP. No corneal contact; no anaesthesia needed.

5. Rebound Principle

A lightweight magnetized probe (1.8 mm plastic ball on wire) is bounced off the cornea. The deceleration upon contact is proportional to IOP. No anaesthesia needed.

6. Dynamic Contour Principle (PASCAL)

Uses a solid-state pressure sensor with a contour-matching saddle surface that sits on the cornea. Measures IOP independently of corneal mechanical properties (rigidity, CCT).

THE SCHIOTZ TONOMETER - DETAILED ACCOUNT

Construction / Parts

(See diagram below)
Schiotz Tonometer - labelled diagram showing Scale, Indicator, Accessory weight, Plunger assembly, Sleeve, Footplate and Test block
Fig. Schiotz tonometer - Pfenninger & Fowler's Procedures for Primary Care
The Schiotz kit contains:
  1. Footplate - concave base that rests on the cornea
  2. Plunger assembly - a 3 mm diameter weighted rod that indents the cornea
  3. Sleeve - guides the plunger
  4. Indicator / pointer - moves over the scale as the plunger indents
  5. Scale - graduated 0-20; reads the degree of corneal indentation
  6. Accessory weights - 5.5 g (standard), 7.5 g, 10 g, 15 g additional weights
  7. Test block - convex metal block for calibration (should read "0")
  8. Conversion tables - to translate scale readings into mm Hg IOP

Principle

  • This is an indentation/impression tonometer
  • The plunger indents the cornea under the force of its own weight
  • Higher IOP = greater resistance to indentation = less indentation = lower scale reading (paradox to remember!)
  • Lower IOP = less resistance = more indentation = higher scale reading
  • Scale reading is converted to mm Hg using Friedenwald's conversion tables, which incorporate a rigidity coefficient (E = 0.0215)

Normal Values

  • Scale reading of 3-7 with 5.5 g weight corresponds to normal IOP (10-21 mm Hg)
  • IOP > 21 mm Hg = suspect glaucoma
  • If scale reading < 3 (very high IOP), switch to heavier weights (7.5 g or 10 g)
  • Accuracy is most reliable when scale reading > 5
(Roberts & Hedges' Clinical Procedures in Emergency Medicine, p. 1497)

Technique - Step by Step

(Critical for practical exam)
  1. Check visual acuity and examine the anterior segment
  2. Instil topical anaesthetic (proparacaine 0.5% or tetracaine 0.5%) - 2 drops in each eye. Wait for effect.
  3. Assemble the tonometer with the 5.5 g weight in place
  4. Test calibration on the convex metal test block - pointer must read exactly "0". If not, return for repair.
  5. Position the patient supine (lying flat) - essential for gravity-based plunger action. Ask them to stare at a fixed point on the ceiling directly above (or extend their arm and stare at their own thumb).
  6. Retract the eyelids gently - press on the orbital rim only, not on the globe.
  7. Hold the tonometer vertically and lower the footplate gently onto the centre of the cornea.
  8. Read the scale - note the pointer reading. If < 3, add heavier weights.
  9. Take 2-3 readings, calculate the average.
  10. Convert the scale reading to mm Hg using conversion tables.
  11. Record the reading (e.g., "Schiotz 5.5 g: scale 5 = IOP 17 mm Hg").
  12. Clean the footplate with a pipe cleaner and isopropyl alcohol after use.
  13. Repeat on the contralateral eye.

Sources of Error (Schiotz) - Exam Favourite

ErrorEffect on Reading
Ocular rigidity variation (e.g., after scleral buckle, extreme myopia)Inaccurate conversion
Patient not supine / instrument not verticalFalse reading
Footplate not centred on corneaFalse reading
Scale reading < 3 (insufficient weight)Unreliable; use heavier weight
Pressure on the globe by eyelid retractionArtificially raised IOP
Corneal oedemaCan lower reading
High/low ocular rigidity (e.g., thyroid eye disease)Overestimate/underestimate
Repeated measurementsProgressive decrease due to massage effect
Key point: The Schiotz uses an average rigidity coefficient - it is inaccurate when ocular rigidity is altered (e.g., high myopia, post-scleral buckle, after refractive surgery).

Advantages of Schiotz Tonometer

  • Inexpensive (~$300 vs ~$3000 for Tono-Pen)
  • Portable - can be used in emergency departments, primary care, remote settings
  • Simple to use - no slit lamp required
  • No electricity needed
  • Useful in supine/sedated patients
  • Historical standard for field use and teaching

Disadvantages of Schiotz Tonometer

  • Less accurate than Goldmann applanation - affected by scleral rigidity
  • Patient must be supine - inconvenient
  • Risk of corneal abrasion and infection transmission (contact with cornea)
  • Cannot be used in penetrating eye injury (pressure may extrude contents)
  • Inaccurate in high myopia, post-retinal detachment surgery, post-refractive surgery
  • Requires conversion tables - room for calculation error
  • Requires topical anaesthesia
  • Not recommended for use with corneal pathology (abrasion, infection)

GOLDMANN APPLANATION TONOMETRY (GAT) - Gold Standard

Goldmann applanation tonometry principle - IOP = F/A
Fig. Goldmann tonometry - physical principle of applanation (Kanski's Clinical Ophthalmology, 10th ed.)

Technique (Brief)

  • Instil proxymetacaine 0.5% (topical anaesthetic) + fluorescein into conjunctival sac
  • Position patient at slit lamp, forehead firmly on headrest
  • Switch to cobalt blue filter on slit lamp
  • Advance tonometer prism to touch cornea centrally
  • Under blue light, two semicircular fluorescein mires are visible, each with a green arc
  • Adjust the pressure dial until the inner edges of the two semicircles just touch (endpoint)
  • Read the dial: multiply reading by 10 to get mm Hg
  • Correct width: arc width = ~1/10th diameter of flattened area

Sources of Error (GAT)

  • Excessive fluorescein - mires too thick - overestimates IOP
  • Insufficient fluorescein - mires too thin - underestimates IOP
  • Corneal thickness (CCT) - assumes 520 μm. Thin cornea (post-LASIK) underestimates; thick cornea (ocular hypertension) overestimates
  • Astigmatism > 3 D - rotate prism to red line aligning minus axis
  • Corneal oedema - artificially lowers IOP
  • Lid pressure / tight collar / breath-holding - falsely raises IOP
  • Instrument calibration - must check each session with calibration arm
(Kanski's Clinical Ophthalmology, 10th ed., p. 43-44)

Advantages

  • Most accurate standard (gold standard)
  • Relatively unaffected by scleral rigidity
  • Slit-lamp integrated - easy in clinic setting

Disadvantages

  • Requires slit lamp - not portable
  • Requires topical anaesthesia and fluorescein
  • Operator-dependent
  • Affected by CCT
  • Infection risk (reusable prism)

COMPARATIVE TABLE - ALL TONOMETERS

FeatureSchiotzGoldmann (GAT)Non-Contact (NCT)Tono-PeniCare (Rebound)PerkinsPASCAL (DCT)
PrincipleIndentationApplanation (Imbert-Fick)Air-puff applanationElectronic indentation (MacKay-Marg)Rebound/magnetic probeApplanationDynamic contour
Corneal contactYesYesNoYesYes (brief)YesYes
Anaesthesia neededYesYesNoNoNoYesYes
Slit lamp neededNoYesNoNoNoNoYes
PortableYesNoNoYesYesYesNo
AccuracyModerateHighest (Gold standard)Good (screening)GoodGoodGoodHigh (CCT independent)
Affected by CCTYes (+ rigidity)YesYesLessLessYesMinimal
Ideal useED, primary care, fieldClinic, ophthalmologyScreening, paediatricsWard, ICU, unusual corneasSelf-monitoring, childrenBedridden, anaesthetised patientsPost-refractive surgery, NTG

NON-CONTACT TONOMETER (PNEUMOTONOMETER)

  • Based on the applanation principle but uses a jet of air instead of a prism
  • Time to flatten cornea ∝ IOP
  • No topical anaesthesia needed, no corneal contact - ideal for community screening and paediatrics
  • The sudden air puff can startle patients
  • Accuracy improves if average of ≥ 3 readings taken
  • Less accurate than GAT but acceptable for screening
  • Example: Keefer Pulsair pneumotonometer
(Kanski's Clinical Ophthalmology, 10th ed.)

TONO-PEN (Electronic Applanation / MacKay-Marg)

  • Hand-held portable device
  • Tip transducer measures applied force electronically
  • Uses disposable tip covers (Tonofilm) - eliminates infection risk
  • Measures IOP even in eyes with irregular or oedematous corneas and through soft contact lenses
  • Calibration: invert tip down → press button twice → "CAL" → "UP" → invert tip up → "Good"
  • More expensive (~$3000) than Schiotz
  • Correlates well with GAT in most clinical scenarios

REBOUND TONOMETER (iCare)

  • A 1.8 mm plastic ball on a magnetized wire probe bounces off the cornea
  • Deceleration upon corneal contact ∝ IOP
  • No anaesthesia needed, portable, well-tolerated
  • Useful for children, self-monitoring (iCare HOME2), community settings
  • Correlates closely with Tono-Pen XL
  • Available for home monitoring of diurnal IOP fluctuation
(Kanski's Clinical Ophthalmology, 10th ed., p. 44-45)

DYNAMIC CONTOUR TONOMETRY (PASCAL - DCT)

  • Uses a solid-state pressure sensor with a contour-matching surface
  • Mounted on slit lamp like GAT
  • IOP displayed digitally
  • Measures IOP relatively independent of corneal mechanical properties (CCT, post-LASIK, etc.)
  • Provides a more physiologically accurate measurement
  • Particularly valuable in: normal-tension glaucoma, post-refractive surgery patients, patients with thick/thin corneas

CONTRAINDICATIONS TO CONTACT TONOMETRY

  • Penetrating eye injury / open globe - pressure may extrude intraocular contents
  • Active corneal infection (defer; NCT preferable if absolutely needed)
  • Corneal abrasion (defer; Tono-Pen may be used in unaffected area)
  • Patients unable to open eyes - severe lid swelling (NCT or Tono-Pen may work)

CLINICAL SIGNIFICANCE OF IOP MEASUREMENT

  • Normal IOP: 10-21 mm Hg
  • IOP > 21 mm Hg: suspect ocular hypertension / glaucoma
  • IOP difference > 3 mm Hg between eyes: suspicious even with normal values
  • IOP in acute angle-closure glaucoma can reach 60-80 mm Hg
  • IOP < 6 mm Hg: hypotony (e.g., post-trauma, wound leak)
  • Tonometry alone is insufficient for glaucoma diagnosis - must combine with disc examination and visual field testing

SHORT ANSWER / VIVA QUESTIONS (Practical Exam Focus)

Q1. What is the principle of Schiotz tonometer? A: Indentation principle - measures depth of corneal indentation produced by a fixed load. Higher IOP = less indentation = lower scale reading. Scale reading converted to mm Hg via Friedenwald's tables using a rigidity coefficient of 0.0215.
Q2. What position is the patient kept in for Schiotz tonometry and why? A: Supine (lying flat). The instrument works by the gravity-driven weight of the plunger - it must be held vertically and the cornea must face upward.
Q3. What does the Schiotz tonometer read "0" on? A: On the convex metal test block (calibration check before every use).
Q4. Name the weights available with Schiotz tonometer. A: 5.5 g (standard), 7.5 g, 10 g, 15 g additional weights. Use heavier weight if scale reading < 3.
Q5. What is the Imbert-Fick principle? A: For an ideal dry thin-walled sphere, internal pressure P = F/A (force to flatten / area flattened). The basis of Goldmann applanation tonometry.
Q6. Why does Goldmann use a 3.06 mm diameter applanation area? A: At this diameter, corneal rigidity (which resists flattening) and capillary attraction of the tear meniscus (which pulls tonometer toward cornea) exactly cancel each other out, giving an accurate reading.
Q7. What is the endpoint of Goldmann tonometry? A: The inner edges of the two blue fluorescein semicircular mires just touch (inner margins appose). IOP is read off the dial (multiplied by 10 for mm Hg).
Q8. How does corneal thickness (CCT) affect Goldmann readings? A: GAT assumes CCT = 520 μm. Thinner cornea (post-LASIK) → underestimates IOP. Thicker cornea (ocular hypertension) → overestimates IOP.
Q9. Which tonometer is CCT-independent? A: Dynamic contour tonometry (PASCAL).
Q10. Which tonometer does not need topical anaesthesia? A: Non-contact (air-puff), rebound (iCare), and Tono-Pen (no formal anaesthesia needed though often used with it).
Q11. Why is Schiotz inaccurate after scleral buckle surgery? A: The procedure alters ocular rigidity; the conversion tables use an average rigidity coefficient and are unreliable when rigidity is abnormally high or low.
Q12. What is Friedenwald's rigidity coefficient? A: E = 0.0215 - an empirically derived constant used to convert the Schiotz scale reading to true IOP via conversion tables.

EXAMINER'S CHECKLIST (Practical VIVA)

When shown a Schiotz tonometer, be able to:
  • Name all parts (footplate, plunger, sleeve, scale, indicator, accessory weights, test block)
  • State the principle (indentation)
  • Demonstrate the correct patient position (supine)
  • Describe calibration check (read "0" on test block)
  • State starting weight (5.5 g) and when to change (scale < 3 → use heavier weight)
  • Describe how to retract lids safely (on orbital rim, not globe)
  • State the direction the instrument must be held (vertical)
  • Explain the conversion of scale reading to mm Hg (Friedenwald tables)
  • Name at least 4 sources of error
  • State contraindications (open globe, corneal infection)
  • State normal IOP (10-21 mm Hg)

Sources: Kanski's Clinical Ophthalmology: A Systematic Approach, 10th ed. (Elsevier, 2024) - Tonometry section, pp. 43-45 | Pfenninger and Fowler's Procedures for Primary Care, 3rd ed. - Chapter 68 (Tonometry) | Roberts and Hedges' Clinical Procedures in Emergency Medicine - Chapter 62 (Tonometry)

Make it in pdf format

Reading File
Running Command

ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && ls -la /tmp/workspace/

Running Command

mkdir -p /tmp/workspace/tonometry-pdf

Writing File

~/tonometry-pdf/build_pdf.py


from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, ListFlowable, ListItem, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus import Image as RLImage
import urllib.request
import io
import os

OUTPUT = "/tmp/workspace/tonometry-pdf/Tonometry_MS_Ophthalmology.pdf"

# ── Colour palette ──────────────────────────────────────────────────────────
NAVY    = colors.HexColor("#1a2e5a")
TEAL    = colors.HexColor("#1e7b8c")
GOLD    = colors.HexColor("#d4a017")
LGRAY   = colors.HexColor("#f0f4f8")
MGRAY   = colors.HexColor("#d0d8e4")
BLACK   = colors.black
WHITE   = colors.white

# ── Document ────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
    OUTPUT, pagesize=A4,
    leftMargin=2*cm, rightMargin=2*cm,
    topMargin=2.5*cm, bottomMargin=2.5*cm,
    title="Tonometry – MS Ophthalmology Exam Notes",
    author="Orris Medical AI"
)

W, H = A4
TW = W - 4*cm   # text width

# ── Styles ───────────────────────────────────────────────────────────────────
base = getSampleStyleSheet()

def PS(name, parent="Normal", **kw):
    return ParagraphStyle(name, parent=base[parent], **kw)

cover_title  = PS("coverTitle", fontSize=28, textColor=WHITE, alignment=TA_CENTER,
                  fontName="Helvetica-Bold", spaceAfter=6)
cover_sub    = PS("coverSub",   fontSize=14, textColor=MGRAY,  alignment=TA_CENTER,
                  fontName="Helvetica",      spaceAfter=4)
cover_meta   = PS("coverMeta",  fontSize=10, textColor=MGRAY,  alignment=TA_CENTER,
                  fontName="Helvetica")

h1  = PS("H1",  fontSize=15, fontName="Helvetica-Bold", textColor=WHITE,
          backColor=NAVY, borderPad=6, spaceAfter=4, spaceBefore=14, leading=20)
h2  = PS("H2",  fontSize=12, fontName="Helvetica-Bold", textColor=NAVY,
          spaceAfter=3, spaceBefore=10, borderPadding=(0,0,2,0))
h3  = PS("H3",  fontSize=11, fontName="Helvetica-Bold", textColor=TEAL,
          spaceAfter=2, spaceBefore=6)
body = PS("Body", fontSize=9.5, leading=14, spaceAfter=4, alignment=TA_JUSTIFY)
bullet = PS("Bullet", fontSize=9.5, leading=13, leftIndent=14,
             bulletIndent=4, spaceAfter=2)
small  = PS("Small", fontSize=8.5, leading=12, textColor=colors.HexColor("#555555"),
             alignment=TA_CENTER, spaceAfter=6)
box    = PS("Box", fontSize=9.5, leading=14, backColor=LGRAY,
             borderColor=TEAL, borderWidth=1, borderPad=8,
             spaceAfter=6, spaceBefore=6, alignment=TA_JUSTIFY)
formula = PS("Formula", fontSize=11, leading=16, fontName="Helvetica-Bold",
              textColor=TEAL, alignment=TA_CENTER, spaceAfter=6, spaceBefore=6)
ques   = PS("Ques", fontSize=10, fontName="Helvetica-Bold", textColor=NAVY,
             spaceAfter=2, spaceBefore=6)
ans    = PS("Ans", fontSize=9.5, leading=14, leftIndent=12, spaceAfter=4)
footer_s = PS("Footer", fontSize=7.5, textColor=colors.HexColor("#888888"),
               alignment=TA_CENTER)
warn   = PS("Warn", fontSize=9.5, leading=14, backColor=colors.HexColor("#fff8e1"),
             borderColor=GOLD, borderWidth=1, borderPad=8,
             spaceAfter=6, spaceBefore=4)

# ── Helpers ──────────────────────────────────────────────────────────────────

def hdr(text, style=h1):
    return KeepTogether([
        Paragraph(f"  {text}", style),
        Spacer(1, 2)
    ])

def h2p(text): return Paragraph(text, h2)
def h3p(text): return Paragraph(text, h3)
def bp(text):  return Paragraph(f"• {text}", bullet)
def p(text):   return Paragraph(text, body)
def sp(n=6):   return Spacer(1, n)
def hr():      return HRFlowable(width="100%", thickness=0.5, color=MGRAY, spaceAfter=4)

def boxed(text): return Paragraph(text, box)
def warn_box(text): return Paragraph(text, warn)
def formula_p(text): return Paragraph(text, formula)

def tbl(data, col_widths, header_rows=1,
        header_bg=NAVY, header_fg=WHITE,
        alt_bg=LGRAY, border=MGRAY):
    t = Table(data, colWidths=col_widths, repeatRows=header_rows)
    style = [
        ('BACKGROUND',  (0,0), (-1, header_rows-1), header_bg),
        ('TEXTCOLOR',   (0,0), (-1, header_rows-1), header_fg),
        ('FONTNAME',    (0,0), (-1, header_rows-1), 'Helvetica-Bold'),
        ('FONTSIZE',    (0,0), (-1,-1), 8.5),
        ('ALIGN',       (0,0), (-1,-1), 'LEFT'),
        ('VALIGN',      (0,0), (-1,-1), 'MIDDLE'),
        ('ROWBACKGROUNDS', (0, header_rows), (-1,-1), [WHITE, alt_bg]),
        ('GRID',        (0,0), (-1,-1), 0.4, border),
        ('LEFTPADDING', (0,0), (-1,-1), 5),
        ('RIGHTPADDING',(0,0), (-1,-1), 5),
        ('TOPPADDING',  (0,0), (-1,-1), 4),
        ('BOTTOMPADDING',(0,0),(-1,-1), 4),
        ('WORDWRAP',    (0,0), (-1,-1), True),
    ]
    t.setStyle(TableStyle(style))
    return t

def fetch_img(url, width, height=None):
    try:
        req = urllib.request.Request(url, headers={"User-Agent":"Mozilla/5.0"})
        data = urllib.request.urlopen(req, timeout=10).read()
        img = RLImage(io.BytesIO(data), width=width, height=height or width*0.75)
        img.hAlign = 'CENTER'
        return img
    except Exception as e:
        return Paragraph(f"[Image not available: {e}]", small)

# ── PAGE TEMPLATE ─────────────────────────────────────────────────────────
def on_page(canvas, doc):
    canvas.saveState()
    # Header bar
    canvas.setFillColor(NAVY)
    canvas.rect(0, H - 1.5*cm, W, 1.5*cm, fill=1, stroke=0)
    canvas.setFillColor(WHITE)
    canvas.setFont("Helvetica-Bold", 9)
    canvas.drawString(2*cm, H - 1*cm, "TONOMETRY — MS Ophthalmology Exam Notes")
    canvas.setFont("Helvetica", 8)
    canvas.drawRightString(W - 2*cm, H - 1*cm, f"Page {doc.page}")
    # Footer
    canvas.setFillColor(colors.HexColor("#888888"))
    canvas.setFont("Helvetica", 7)
    canvas.drawCentredString(W/2, 1.2*cm,
        "Sources: Kanski's Clinical Ophthalmology 10th ed. | Pfenninger & Fowler's Procedures for Primary Care | Roberts & Hedges' Clinical Procedures in Emergency Medicine")
    canvas.restoreState()

# ═══════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ═══════════════════════════════════════════════════════════════════════════
story = []

# ── COVER PAGE ────────────────────────────────────────────────────────────
cover_data = [
    [Paragraph("TONOMETRY", cover_title)],
    [Paragraph("MS Ophthalmology — Theory &amp; Practical Exam Notes", cover_sub)],
    [Spacer(1, 8)],
    [Paragraph("Types · Principles · Advantages &amp; Disadvantages", cover_sub)],
    [Paragraph("Detailed Account of Schiotz Tonometer", cover_sub)],
    [Spacer(1, 16)],
    [Paragraph("August 2026  |  Orris Medical AI", cover_meta)],
]
cover_tbl = Table(cover_data, colWidths=[TW])
cover_tbl.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), NAVY),
    ('ALIGN',      (0,0), (-1,-1), 'CENTER'),
    ('TOPPADDING', (0,0), (-1,-1), 12),
    ('BOTTOMPADDING',(0,0),(-1,-1), 12),
    ('LEFTPADDING', (0,0), (-1,-1), 24),
    ('RIGHTPADDING',(0,0), (-1,-1), 24),
    ('ROUNDEDCORNERS', [8]),
]))
story += [sp(50), cover_tbl, sp(30)]

# Banner boxes on cover
story.append(
    tbl([
        [Paragraph("<b>Normal IOP</b>", PS("_", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold")),
         Paragraph("<b>Gold Standard</b>", PS("_", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold")),
         Paragraph("<b>Glaucoma Threshold</b>", PS("_", fontSize=10, textColor=WHITE, alignment=TA_CENTER, fontName="Helvetica-Bold"))],
        [Paragraph("10–21 mm Hg", PS("_", fontSize=14, textColor=GOLD, alignment=TA_CENTER, fontName="Helvetica-Bold")),
         Paragraph("Goldmann GAT", PS("_", fontSize=14, textColor=GOLD, alignment=TA_CENTER, fontName="Helvetica-Bold")),
         Paragraph("> 21 mm Hg", PS("_", fontSize=14, textColor=GOLD, alignment=TA_CENTER, fontName="Helvetica-Bold"))],
    ], [TW/3]*3, header_rows=1, header_bg=TEAL, header_fg=WHITE)
)
story.append(PageBreak())

# ── SECTION 1: DEFINITION & HISTORY ──────────────────────────────────────
story.append(hdr("1. DEFINITION & HISTORICAL BACKGROUND"))
story.append(p("Tonometry is the measurement of intraocular pressure (IOP). It quantifies the resistance of the eyeball to indentation by an applied force. Prolonged elevated IOP is associated with glaucomatous optic nerve damage and visual field loss. A sudden elevation can result from acute angle-closure glaucoma or ocular trauma."))
story.append(sp())
story.append(h2p("Historical Milestones"))
story.append(tbl([
    ["Year", "Milestone"],
    ["1860s", "Von Graefe — first mechanical tonometer"],
    ["1885",  "Maklakoff — introduced applanation tonometry"],
    ["1905",  "Schiötz — developed the indentation/impression tonometer"],
    ["1920s", "Schiötz modified his instrument (still in use today)"],
    ["1950s", "Goldmann — improved applanation tonometer (gold standard)"],
    ["1970s", "MacKay-Marg — electronic indentation principle"],
    ["2000s", "iCare rebound tonometer introduced"],
    ["2010s", "iCare HOME — self-monitoring for diurnal IOP variation"],
], [3*cm, TW - 3*cm]))
story.append(sp(8))

# ── SECTION 2: CLASSIFICATION ────────────────────────────────────────────
story.append(hdr("2. CLASSIFICATION OF TONOMETERS"))
story.append(tbl([
    ["Category", "Principle", "Examples"],
    ["Indentation / Impression", "Measures depth of corneal indentation by a fixed force", "Schiotz tonometer"],
    ["Applanation", "Measures force to flatten a fixed area (3.06 mm diameter) of cornea — Imbert-Fick principle", "Goldmann (slit-lamp), Perkins (portable), Tono-Pen"],
    ["Non-Contact (Air-puff)", "Jet of air flattens cornea; time to flatten ∝ IOP", "Pneumotonometer (Keefer Pulsair)"],
    ["Electronic Indentation", "Transducer measures applied force; MacKay-Marg principle", "Tono-Pen AVIA, Tono-Pen XL"],
    ["Rebound", "Magnetized probe bounces off cornea; deceleration ∝ IOP", "iCare IC100, iCare HOME2"],
    ["Dynamic Contour (DCT)", "Contour-matching sensor; IOP independent of corneal mechanics", "PASCAL"],
], [3.5*cm, 7*cm, TW-10.5*cm]))
story.append(sp(8))

# ── SECTION 3: PRINCIPLES ────────────────────────────────────────────────
story.append(hdr("3. PRINCIPLES OF TONOMETRY"))

story.append(h2p("3.1 Indentation (Impression) Principle — Schiotz"))
story.append(p("A fixed load (plunger weight) is placed on the cornea and the <b>depth of indentation</b> is measured on a graduated scale. The greater the IOP, the greater the resistance to indentation, and the <b>less</b> the indentation (lower scale reading). A rigidity coefficient (Friedenwald, E = 0.0215) is used via conversion tables to estimate true IOP from the scale reading."))
story.append(warn_box("⚠ Remember: Higher IOP = less indentation = LOWER scale reading. This is counter-intuitive and a common exam trap."))
story.append(sp())

story.append(h2p("3.2 Imbert-Fick Principle — Goldmann Applanation (GOLD STANDARD)"))
story.append(p("For an ideal, dry, thin-walled sphere, the internal pressure equals the force required to flatten its surface divided by the area of flattening:"))
story.append(formula_p("P = F / A"))
story.append(p("The human cornea is <b>not</b> ideal — it is rigid (resists flattening) and the tear meniscus exerts capillary attraction (pulls tonometer toward cornea). These two forces <b>exactly cancel each other</b> when the flattened area has a diameter of <b>3.06 mm</b> — the precise design of the Goldmann prism."))
story.append(boxed("<b>Key fact:</b> Central corneal thickness (CCT) assumed by GAT = 520 μm. Thin cornea (post-LASIK) → underestimates IOP. Thick cornea → overestimates IOP."))
story.append(sp())

story.append(h2p("3.3 MacKay-Marg Principle — Tono-Pen"))
story.append(p("A refined indentation technique in which a smaller area of cornea is indented by an electronic probe tip with a built-in transducer that measures applied force directly. Useful for irregular or oedematous corneas."))
story.append(sp())

story.append(h2p("3.4 Non-Contact (Air-Puff) Principle — Pneumotonometer"))
story.append(p("A calibrated jet of air is directed at the cornea. The <b>time required to flatten</b> a standard area of cornea is directly proportional to IOP. No corneal contact; no topical anaesthesia required."))
story.append(sp())

story.append(h2p("3.5 Rebound Principle — iCare"))
story.append(p("A 1.8 mm plastic ball attached to a magnetized wire probe is briefly bounced off the cornea. The <b>deceleration of the probe upon corneal contact</b> is proportional to IOP. No anaesthesia required."))
story.append(sp())

story.append(h2p("3.6 Dynamic Contour Principle — PASCAL (DCT)"))
story.append(p("A solid-state pressure sensor with a corneal contour-matching saddle surface sits on the cornea. Measures IOP relatively <b>independently of corneal mechanical properties</b> (rigidity, CCT). IOP shown on digital display. Provides more physiologically accurate measurement especially after refractive surgery."))
story.append(sp(8))

# ── SECTION 4: SCHIOTZ TONOMETER ─────────────────────────────────────────
story.append(hdr("4. SCHIOTZ TONOMETER — DETAILED ACCOUNT (MS Exam Focus)"))

story.append(h2p("4.1 Construction and Parts"))

# Schiotz image
img_url = "https://cdn.orris.care/cdss_images/ac2e2b6d795bf4450546e9036a7d93607acb45c2d6f9d983a33d3b9de907bd1a.png"
img = fetch_img(img_url, width=7*cm, height=9*cm)
parts_data = [
    [Paragraph("<b>Part</b>", PS("_", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold")),
     Paragraph("<b>Description</b>", PS("_", fontSize=9, textColor=WHITE, fontName="Helvetica-Bold"))],
    ["Footplate", "Concave base resting on the cornea; curved to match corneal curvature"],
    ["Plunger assembly", "3 mm diameter weighted rod that indents the cornea under gravity"],
    ["Sleeve", "Guides the plunger in a vertical path"],
    ["Indicator / Pointer", "Moves over the scale as the plunger indents the cornea"],
    ["Scale", "Graduated 0–20; reads degree of corneal indentation"],
    ["Accessory weights", "5.5 g (standard), 7.5 g, 10 g, 15 g; added when scale reading < 3"],
    ["Test block", "Convex metal block for pre-use calibration; must read '0'"],
    ["Conversion tables", "Friedenwald tables to convert scale reading → mm Hg IOP"],
]
parts_tbl = tbl(parts_data, [3.5*cm, TW - 3.5*cm - 7.5*cm])
parts_tbl.hAlign = 'LEFT'

img_tbl = Table([[img, parts_tbl]], colWidths=[7.5*cm, TW - 7.5*cm])
img_tbl.setStyle(TableStyle([
    ('VALIGN', (0,0), (-1,-1), 'TOP'),
    ('LEFTPADDING',(0,0),(-1,-1), 0),
    ('RIGHTPADDING',(0,0),(-1,-1), 0),
    ('TOPPADDING',(0,0),(-1,-1), 0),
]))
story.append(img_tbl)
story.append(Paragraph("Fig. Schiotz tonometer — labelled diagram (Pfenninger & Fowler's Procedures for Primary Care, 3rd ed.)", small))
story.append(sp(8))

story.append(h2p("4.2 Principle of Action"))
story.append(p("The Schiotz tonometer works on the <b>indentation (impression) principle</b>. The plunger, under the force of its own weight, indents the cornea. The degree of indentation is inversely proportional to IOP:"))
story.append(tbl([
    ["IOP", "Resistance", "Indentation", "Scale Reading"],
    ["HIGH", "Greater", "Less", "LOW (e.g., 2-3)"],
    ["NORMAL", "Moderate", "Moderate", "MODERATE (e.g., 4-7)"],
    ["LOW", "Less", "More", "HIGH (e.g., 8+)"],
], [TW/4]*4, header_bg=TEAL))
story.append(sp(6))
story.append(p("The actual IOP (true IOP) = total IOP minus the pressure contributed by the instrument. <b>Friedenwald's rigidity coefficient (E = 0.0215)</b> is incorporated in the conversion tables to derive true IOP from the scale reading."))
story.append(sp(8))

story.append(h2p("4.3 Technique — Step by Step (Practical Exam)"))
steps = [
    ("<b>Step 1:</b> Check and record visual acuity. Examine the anterior segment.", body),
    ("<b>Step 2:</b> Instil topical anaesthetic (proparacaine 0.5% or tetracaine 0.5%) — 2 drops in each eye. Allow 1–2 minutes to take effect.", body),
    ("<b>Step 3:</b> Assemble the Schiotz tonometer with the <b>5.5 g weight</b> in place.", body),
    ("<b>Step 4 — Calibration:</b> Rest the footplate on the convex metal test block. The pointer must read exactly <b>'0'</b>. If not, return for repair — do not use.", body),
    ("<b>Step 5 — Positioning:</b> Patient lies <b>supine</b> (flat). Ask to stare at a fixed point on the ceiling directly above, or extend an arm and stare at their own thumb.", body),
    ("<b>Step 6:</b> Retract eyelids gently by pressing on the <b>orbital rim only</b> — never press on the globe itself.", body),
    ("<b>Step 7:</b> Hold the tonometer <b>perfectly vertical</b> and lower the footplate gently onto the <b>centre of the cornea</b>.", body),
    ("<b>Step 8:</b> Read the scale. If scale reading < 3, remove the tonometer and add a heavier weight (7.5 g or 10 g) before repeating.", body),
    ("<b>Step 9:</b> Take 2–3 readings. Record the average scale reading and the weight used (e.g., '5.5 g / scale 5').", body),
    ("<b>Step 10:</b> Use the Friedenwald conversion table to translate scale reading → mm Hg IOP. Example: 5.5 g, scale 5 = ~17 mm Hg.", body),
    ("<b>Step 11:</b> Record: weight used, scale reading, IOP in mm Hg, time of measurement.", body),
    ("<b>Step 12:</b> Clean the footplate with a pipe cleaner and isopropyl alcohol after use. Allow to air dry.", body),
    ("<b>Step 13:</b> Repeat on the contralateral eye.", body),
]
for text, style in steps:
    story.append(Paragraph(text, style))
    story.append(sp(2))
story.append(sp(4))

story.append(h2p("4.4 Normal Values & Weight Selection"))
story.append(tbl([
    ["Weight (g)", "Scale Reading", "Approx. IOP (mm Hg)", "Significance"],
    ["5.5 (standard)", "3 – 7",    "10 – 21",  "Normal IOP range"],
    ["5.5",            "< 3",      "Very high", "Use heavier weight"],
    ["5.5",            "> 10",     "Very low",  "Hypotony suspected"],
    ["7.5",            "3 – 7",    "~15 – 30",  "High IOP range"],
    ["10.0",           "3 – 7",    "~25 – 45",  "Very high IOP (acute glaucoma)"],
], [2.5*cm, 3*cm, 4*cm, TW - 9.5*cm]))
story.append(warn_box("⚠ Accuracy is most reliable when scale reading is > 5. Never rely on readings ≤ 3 — always add a heavier weight."))
story.append(sp(8))

story.append(h2p("4.5 Sources of Error — Schiotz Tonometer (Exam Favourite)"))
story.append(tbl([
    ["Source of Error", "Effect on Reading", "How to Avoid"],
    ["Altered ocular rigidity (high myopia, scleral buckle, post-vitrectomy)", "Inaccurate IOP estimate", "Use Goldmann or Tono-Pen instead"],
    ["Instrument not held vertically", "False/inconsistent reading", "Always ensure vertical position"],
    ["Footplate not centred on cornea", "False reading", "Centre carefully under direct vision"],
    ["Scale reading < 3 (insufficient weight)", "Unreliable; IOP underestimated", "Add heavier weight before reading"],
    ["Pressure on globe during lid retraction", "Artificially raised IOP", "Press only on orbital rim"],
    ["Corneal oedema", "Artificially lowers IOP reading", "Note and document"],
    ["Repeated measurements in quick succession", "Progressive fall in IOP (massage effect)", "Allow time between readings"],
    ["Patient not truly supine", "Gravity effect altered; inaccurate plunger force", "Ensure flat lying position"],
    ["Dirty footplate / contamination", "Risk of corneal abrasion or infection", "Clean with pipe cleaner + alcohol"],
], [4*cm, 4*cm, TW - 8*cm]))
story.append(sp(8))

story.append(h2p("4.6 Advantages of Schiotz Tonometer"))
for text in [
    "Inexpensive (~$300 vs ~$3,000 for Tono-Pen; vs much more for Goldmann setup)",
    "Portable — ideal for emergency departments, primary care, rural/field settings",
    "Simple to use — no slit lamp required; minimal training needed",
    "No electricity required",
    "Useful for supine, bed-bound, or sedated patients",
    "Historical standard widely taught and assessed in postgraduate exams",
]:
    story.append(bp(text))
story.append(sp(6))

story.append(h2p("4.7 Disadvantages of Schiotz Tonometer"))
for text in [
    "Less accurate than Goldmann applanation — affected by scleral rigidity variation",
    "Patient must be supine — inconvenient in clinical settings",
    "Risk of corneal abrasion and infection transmission (direct corneal contact)",
    "Contraindicated in penetrating/open globe injury (pressure may extrude contents)",
    "Inaccurate in: high myopia, post-scleral buckle, post-vitrectomy, post-LASIK/PRK",
    "Requires conversion tables — introduces calculation errors",
    "Requires topical anaesthesia",
    "Cannot be used on corneal pathology (abrasion, active infection)",
    "Ocular rigidity not directly measured — average value assumed",
]:
    story.append(bp(text))
story.append(sp(8))

# ── SECTION 5: GOLDMANN ───────────────────────────────────────────────────
story.append(hdr("5. GOLDMANN APPLANATION TONOMETRY (Gold Standard)"))

# Goldmann principle image
gat_img = fetch_img(
    "https://cdn.orris.care/cdss_images/4a77238c72a1964a232bf40b13524dce63b13a3a02af42b2f87dab483fb2cab0.png",
    width=7*cm, height=5.5*cm
)
gat_text = [
    Paragraph("<b>Principle: Imbert-Fick</b>  P = F / A", h3),
    sp(4),
    p("• Applanation diameter: <b>3.06 mm</b>"),
    p("• Corneal rigidity and tear meniscus capillary attraction cancel at this diameter"),
    p("• Assumes CCT = <b>520 μm</b>"),
    p("• Uses cobalt blue light + fluorescein"),
    p("• Endpoint: inner edges of two semicircular mires just touch"),
    p("• IOP (mm Hg) = dial reading × 10"),
]
gat_layout = Table([[gat_img, gat_text]], colWidths=[7.5*cm, TW - 7.5*cm])
gat_layout.setStyle(TableStyle([
    ('VALIGN',(0,0),(-1,-1),'TOP'),
    ('LEFTPADDING',(0,0),(-1,-1),0),
    ('RIGHTPADDING',(0,0),(-1,-1),4),
]))
story.append(gat_layout)
story.append(Paragraph("Fig. Goldmann applanation tonometry — physical principle (Kanski's Clinical Ophthalmology, 10th ed.)", small))
story.append(sp(6))

story.append(h3p("Sources of Error — Goldmann (Exam Favourite)"))
story.append(tbl([
    ["Error", "Effect", "Correction"],
    ["Excessive fluorescein", "Mires too thick → overestimates IOP", "Use minimal fluorescein; dry excess"],
    ["Insufficient fluorescein", "Mires too thin → underestimates IOP", "Add fluorescein / ask patient to blink"],
    ["CCT > 520 μm (thick cornea)", "Overestimates IOP", "Apply CCT correction formula"],
    ["CCT < 520 μm (post-LASIK, NTG)", "Underestimates IOP", "Use DCT or Tono-Pen with correction"],
    ["Astigmatism > 3 D", "Distorted mires; mechanically induced error", "Rotate prism to minus axis (red line)"],
    ["Corneal oedema", "Artificially lowers IOP reading", "Note and document; treat oedema"],
    ["Lid/finger pressure on globe", "Falsely raises IOP", "Ensure no pressure on globe"],
    ["Tight collar / breath-holding", "Raises IOP (obstructs venous return)", "Loosen collar; ask patient to breathe"],
    ["Instrument miscalibration", "Systematic error in all readings", "Check with calibration arm each session"],
    ["Wide ocular pulse pressure", "Oscillating reading", "Take midpoint between systole/diastole"],
], [4.5*cm, 4*cm, TW - 8.5*cm]))
story.append(sp(6))

story.append(h3p("Advantages / Disadvantages — Goldmann"))
adv_dis = [
    ["Advantages", "Disadvantages"],
    ["Most accurate — international gold standard",           "Requires slit lamp — not portable"],
    ["Relatively unaffected by scleral rigidity",             "Needs topical anaesthesia + fluorescein"],
    ["Reproducible; well-validated",                          "Operator-dependent"],
    ["Integrated into routine ophthalmic clinic setup",       "Affected by CCT"],
    ["Disposable prism caps available for infection control", "Infection risk with reusable prisms"],
]
story.append(tbl(adv_dis, [TW/2, TW/2], header_bg=TEAL))
story.append(sp(8))

# ── SECTION 6: COMPARATIVE TABLE ─────────────────────────────────────────
story.append(hdr("6. COMPARATIVE TABLE — ALL TONOMETERS"))
story.append(tbl([
    ["Feature",        "Schiotz",             "Goldmann (GAT)",        "NCT (Air-puff)",          "Tono-Pen",              "iCare",                "Perkins",              "PASCAL (DCT)"],
    ["Principle",      "Indentation",         "Applanation (I-F)",     "Air-puff applanation",    "MacKay-Marg (electronic indent.)", "Rebound/magnetic", "Applanation (I-F)", "Dynamic contour"],
    ["Corneal contact","Yes",                  "Yes",                   "No",                      "Yes",                   "Yes (brief)",          "Yes",                  "Yes"],
    ["Anaesthesia",    "Yes",                  "Yes",                   "No",                      "No",                    "No",                   "Yes",                  "Yes"],
    ["Slit lamp",      "No",                   "Yes",                   "No",                      "No",                    "No",                   "No",                   "Yes"],
    ["Portable",       "Yes",                  "No",                    "No",                      "Yes",                   "Yes",                  "Yes",                  "No"],
    ["Accuracy",       "Moderate",             "Highest (Gold std.)",   "Good (screening)",        "Good",                  "Good",                 "Good",                 "High"],
    ["CCT effect",     "Yes + rigidity",       "Yes (520 μm assumed)",  "Yes",                     "Less",                  "Less",                 "Yes",                  "Minimal"],
    ["Best use",       "ED, primary care, field","Ophthalmol. clinic",  "Screening, paediatrics",  "Ward, ICU, irr. cornea","Self-monitoring, kids", "Bedridden, anaesth.", "Post-refractive, NTG"],
], [3.0*cm] + [2.3*cm]*7, header_bg=NAVY))
story.append(sp(8))

# ── SECTION 7: OTHER TONOMETERS ────────────────────────────────────────────
story.append(hdr("7. OTHER TONOMETERS"))

story.append(h2p("7.1 Perkins Applanation Tonometer"))
story.append(p("Uses a <b>Goldmann prism</b> in conjunction with a portable battery-powered light source. Hand-held; can be used in bed-bound, anaesthetised, or wheelchair-bound patients. Same technique and endpoint as Goldmann. Requires topical anaesthesia and fluorescein."))
story.append(sp(4))

story.append(h2p("7.2 Tono-Pen AVIA / Tono-Pen XL"))
story.append(p("A hand-held <b>electronic applanation tonometer</b> (modified MacKay-Marg principle). The probe tip contains a transducer. Uses <b>disposable Tonofilm covers</b> — eliminates infection risk. Measures IOP accurately even in eyes with <b>distorted or oedematous corneas</b> and through soft contact lenses. Calibration performed before each use. Correlates well with GAT. Cost ~$3,000."))
story.append(sp(4))

story.append(h2p("7.3 Non-Contact Tonometer (Pneumotonometer)"))
story.append(p("A calibrated <b>jet of air</b> flattens the central cornea. Time to flatten ∝ IOP. No corneal contact; no anaesthesia. The sudden air puff can startle patients. Accuracy improves significantly when an <b>average of at least 3 readings</b> is taken. Ideal for community screening and paediatric populations. Example: Keefer Pulsair."))
story.append(sp(4))

story.append(h2p("7.4 iCare Rebound Tonometer"))
story.append(p("A <b>1.8 mm plastic ball</b> on a magnetized wire probe bounces briefly off the cornea. Deceleration upon contact ∝ IOP. No anaesthesia required. Well-tolerated by children. Available as <b>iCare HOME2</b> for patient self-monitoring of <b>diurnal IOP fluctuation</b>. Correlates closely with Tono-Pen XL."))
story.append(sp(4))

story.append(h2p("7.5 Dynamic Contour Tonometry — PASCAL"))
story.append(p("Mounted on slit lamp. Solid-state pressure sensor with a <b>contour-matching saddle surface</b>. Measures IOP relatively independent of CCT and corneal rigidity — provides a more <b>physiological measurement</b>. Particularly valuable in <b>normal-tension glaucoma, post-LASIK patients</b>, or patients with unusually thick/thin corneas."))
story.append(sp(8))

# ── SECTION 8: CONTRAINDICATIONS ──────────────────────────────────────────
story.append(hdr("8. CONTRAINDICATIONS TO CONTACT TONOMETRY"))
story.append(tbl([
    ["Contraindication", "Reason", "Alternative"],
    ["Penetrating / open globe injury", "Pressure may extrude intraocular contents", "NCT or defer"],
    ["Active corneal infection", "Risk of spreading infection / worsening ulcer", "NCT (Tono-pen with cover if urgent)"],
    ["Corneal abrasion", "Pain; risk of worsening abrasion", "Tono-Pen to uninvolved area; or defer"],
    ["Severe blepharospasm / lid swelling", "Cannot obtain corneal access", "NCT or Tono-Pen"],
    ["Uncooperative patient / children", "Risk of corneal injury", "iCare rebound (no anaesthesia); NCT"],
], [4.5*cm, 5*cm, TW - 9.5*cm]))
story.append(sp(8))

# ── SECTION 9: CLINICAL SIGNIFICANCE ──────────────────────────────────────
story.append(hdr("9. CLINICAL SIGNIFICANCE OF IOP"))
story.append(tbl([
    ["IOP Value", "Interpretation", "Action"],
    ["10 – 21 mm Hg",    "Normal",                               "Reassure; routine follow-up if risk factors"],
    ["> 21 mm Hg",       "Ocular hypertension / suspect glaucoma","Disc exam + visual field testing + CCT"],
    ["Difference > 3 mm Hg between eyes", "Suspicious even if both 'normal'", "Investigate; check for asymmetric glaucoma"],
    ["60 – 80 mm Hg",    "Acute angle-closure glaucoma",         "Ophthalmologic emergency; immediate treatment"],
    ["< 6 mm Hg",        "Hypotony (post-trauma, wound leak)",   "Urgent surgical review"],
], [4*cm, 5*cm, TW - 9*cm]))
story.append(boxed("<b>Remember:</b> Tonometry alone is insufficient for glaucoma diagnosis. Must combine with: <b>optic disc examination</b> (cup-to-disc ratio), <b>visual field testing</b>, and <b>CCT measurement</b>."))
story.append(sp(8))

# ── SECTION 10: VIVA / PRACTICAL QUESTIONS ────────────────────────────────
story.append(hdr("10. VIVA & PRACTICAL EXAM Q&A"))

qas = [
    ("Q1. What is the principle of the Schiotz tonometer?",
     "Indentation (impression) principle. A fixed plunger weight indents the cornea; the depth of indentation (measured on scale 0–20) is inversely proportional to IOP. Friedenwald's conversion tables (rigidity coefficient E = 0.0215) translate scale reading into mm Hg."),
    ("Q2. Why must the patient be supine for Schiotz tonometry?",
     "The instrument operates by gravity — the plunger weight must act vertically downward onto the cornea. If the patient sits upright, the plunger cannot function correctly."),
    ("Q3. What should the Schiotz tonometer read on the test block, and why?",
     "'0' on the convex metal test block. This confirms that the plunger moves freely and the instrument is correctly calibrated. If it does not read zero, the instrument must be sent for repair and must not be used."),
    ("Q4. What weights are available with the Schiotz kit?",
     "5.5 g (standard/default), 7.5 g, 10 g, and 15 g additional weights. Use a heavier weight when the scale reading is < 3 (indicates very high IOP that exceeds the range of the 5.5 g weight)."),
    ("Q5. State the Imbert-Fick principle.",
     "For an ideal dry thin-walled sphere: P = F/A (internal pressure = force to flatten ÷ area of flattening). In Goldmann tonometry, corneal rigidity and tear meniscus capillary attraction cancel each other at an applanation diameter of 3.06 mm, making the principle clinically applicable."),
    ("Q6. What is the endpoint of Goldmann applanation tonometry?",
     "Under cobalt blue light with fluorescein, two blue semicircular mires are visible. The endpoint is when the <b>inner edges of the two semicircles just touch (appose)</b>. The dial reading × 10 gives IOP in mm Hg."),
    ("Q7. How does CCT affect Goldmann readings?",
     "GAT assumes CCT = 520 μm. Thin cornea (e.g., post-LASIK, normal-tension glaucoma) → underestimates IOP. Thick cornea (e.g., ocular hypertension) → overestimates IOP. Always measure CCT with pachymetry and apply correction."),
    ("Q8. Which tonometer is least affected by CCT?",
     "Dynamic contour tonometry (PASCAL). It uses a contour-matching surface and measures IOP independent of corneal mechanical properties."),
    ("Q9. Which tonometers do NOT require topical anaesthesia?",
     "Non-contact tonometer (air-puff/pneumotonometer), iCare rebound tonometer. These are preferred in children and for community screening."),
    ("Q10. Why is Schiotz inaccurate after scleral buckle surgery?",
     "Scleral buckle surgery alters ocular rigidity. Friedenwald's conversion tables use an average rigidity coefficient; when true rigidity deviates significantly (as after buckle surgery or in extreme myopia), the conversion gives an inaccurate IOP estimate."),
    ("Q11. Name four indications for tonometry in the emergency setting.",
     "(1) Suspected acute angle-closure glaucoma, (2) Blunt ocular trauma / hyphema, (3) Orbital fracture (IOP > 22 mm Hg or asymmetry > 3 mm Hg = marker of injury), (4) Iritis / uveitis with concern for secondary glaucoma."),
    ("Q12. What is Friedenwald's rigidity coefficient?",
     "E = 0.0215 — an empirically derived constant representing the average ocular rigidity, used in conversion tables to calculate true IOP from the Schiotz scale reading."),
]
for q, a in qas:
    story.append(Paragraph(q, ques))
    story.append(Paragraph(f"<b>A:</b> {a}", ans))
    story.append(sp(2))
story.append(sp(8))

# ── SECTION 11: PRACTICAL CHECKLIST ──────────────────────────────────────
story.append(hdr("11. PRACTICAL EXAM CHECKLIST — SCHIOTZ TONOMETER"))
checklist = [
    "Name all parts: footplate, plunger assembly, sleeve, scale, indicator, accessory weights, test block",
    "State the principle: indentation (impression) — depth inversely proportional to IOP",
    "State patient position: supine (flat), staring at ceiling",
    "Demonstrate calibration: read '0' on convex metal test block before every use",
    "State starting weight: 5.5 g; change to heavier weight if scale reading < 3",
    "Describe safe lid retraction: press on orbital rim ONLY — never on the globe",
    "State instrument orientation: must be held perfectly vertical throughout",
    "Explain scale reading conversion: use Friedenwald tables → mm Hg",
    "State normal IOP: 10–21 mm Hg; > 21 mm Hg = investigate for glaucoma",
    "Name 4+ sources of error (rigidity, non-vertical, lid pressure, scale < 3, corneal oedema)",
    "State absolute contraindications: open globe / penetrating injury, active corneal infection",
    "Describe post-procedure care: clean footplate with pipe cleaner + alcohol, allow to air dry",
]
for item in checklist:
    story.append(Paragraph(f"☐  {item}", bullet))
story.append(sp(8))

# ── REFERENCES ────────────────────────────────────────────────────────────
story.append(hdr("REFERENCES"))
refs = [
    "1. Kanski JW, Bowling B. <i>Kanski's Clinical Ophthalmology: A Systematic Approach</i>, 10th ed. Elsevier, 2024. Chapter 1: Tonometry, pp. 43–45.",
    "2. Pfenninger JL, Fowler GC. <i>Pfenninger and Fowler's Procedures for Primary Care</i>, 3rd ed. Elsevier. Chapter 68: Tonometry, pp. 475–477.",
    "3. Roberts JR, Hedges JR. <i>Roberts and Hedges' Clinical Procedures in Emergency Medicine</i>. Chapter 62: Tonometry, pp. 1496–1499.",
]
for ref in refs:
    story.append(Paragraph(ref, body))
    story.append(sp(3))

# ── BUILD ─────────────────────────────────────────────────────────────────
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUTPUT}")
Running Command

cd /tmp/workspace/tonometry-pdf && python build_pdf.py 2>&1

Running Command

ls -lh /tmp/workspace/tonometry-pdf/Tonometry_MS_Ophthalmology.pdf

Your PDF is ready (1.1 MB, fully formatted):

Tonometry MS Ophthalmology

PDF Document · PDF


What's inside the PDF:
SectionContent
Cover pageTitle banner with quick-reference IOP values
1. Definition & HistoryTimeline table from von Graefe to iCare HOME
2. ClassificationAll 6 categories of tonometers with principles and examples
3. PrinciplesAll 6 principles (Indentation, Imbert-Fick, MacKay-Marg, Air-puff, Rebound, DCT) with the P=F/A formula highlighted
4. Schiotz — DetailedLabelled diagram, all parts, step-by-step technique (13 steps), normal values table, sources of error table, advantages & disadvantages
5. Goldmann (Gold Standard)Principle diagram, technique, sources of error table, adv/dis
6. Comparative TableAll tonometers side-by-side across 9 features
7. Other TonometersPerkins, Tono-Pen, NCT, iCare, PASCAL
8. ContraindicationsTable with alternatives
9. Clinical SignificanceIOP values table with interpretation and action
10. Viva Q&A12 exam-style questions with model answers
11. Practical Checklist12-point tick-box checklist for Schiotz practical exam
ReferencesKanski 10th ed., Pfenninger & Fowler, Roberts & Hedges
This is a shared conversation. Sign in to Orris to start your own chat.