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
Schiotz tonometer intraocular pressure measurement
| Category | Type | Examples |
|---|---|---|
| Indentation / Impression | Measures depth of corneal indentation by a fixed force | Schiotz tonometer |
| Applanation | Measures force needed to flatten a fixed area of cornea | Goldmann (slit-lamp), Perkins (hand-held), Tono-Pen |
| Non-contact | Air-puff flattens cornea; no corneal contact | Pneumotonometer (Pulsair) |
| Rebound | Magnetized probe rebounds off cornea | iCare |
| Dynamic Contour | Contour-matching sensor, IOP independent of cornea | PASCAL (DCT) |
P = F / A

| Error | Effect on Reading |
|---|---|
| Ocular rigidity variation (e.g., after scleral buckle, extreme myopia) | Inaccurate conversion |
| Patient not supine / instrument not vertical | False reading |
| Footplate not centred on cornea | False reading |
| Scale reading < 3 (insufficient weight) | Unreliable; use heavier weight |
| Pressure on the globe by eyelid retraction | Artificially raised IOP |
| Corneal oedema | Can lower reading |
| High/low ocular rigidity (e.g., thyroid eye disease) | Overestimate/underestimate |
| Repeated measurements | Progressive decrease due to massage effect |

| Feature | Schiotz | Goldmann (GAT) | Non-Contact (NCT) | Tono-Pen | iCare (Rebound) | Perkins | PASCAL (DCT) |
|---|---|---|---|---|---|---|---|
| Principle | Indentation | Applanation (Imbert-Fick) | Air-puff applanation | Electronic indentation (MacKay-Marg) | Rebound/magnetic probe | Applanation | Dynamic contour |
| Corneal contact | Yes | Yes | No | Yes | Yes (brief) | Yes | Yes |
| Anaesthesia needed | Yes | Yes | No | No | No | Yes | Yes |
| Slit lamp needed | No | Yes | No | No | No | No | Yes |
| Portable | Yes | No | No | Yes | Yes | Yes | No |
| Accuracy | Moderate | Highest (Gold standard) | Good (screening) | Good | Good | Good | High (CCT independent) |
| Affected by CCT | Yes (+ rigidity) | Yes | Yes | Less | Less | Yes | Minimal |
| Ideal use | ED, primary care, field | Clinic, ophthalmology | Screening, paediatrics | Ward, ICU, unusual corneas | Self-monitoring, children | Bedridden, anaesthetised patients | Post-refractive surgery, NTG |
Make it in pdf format
ls -la /tmp/workspace/ 2>/dev/null || mkdir -p /tmp/workspace && ls -la /tmp/workspace/
mkdir -p /tmp/workspace/tonometry-pdf
~/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 & Practical Exam Notes", cover_sub)],
[Spacer(1, 8)],
[Paragraph("Types · Principles · Advantages & 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}")
cd /tmp/workspace/tonometry-pdf && python build_pdf.py 2>&1
ls -lh /tmp/workspace/tonometry-pdf/Tonometry_MS_Ophthalmology.pdf
Tonometry MS Ophthalmology
PDF Document · PDF
| Section | Content |
|---|---|
| Cover page | Title banner with quick-reference IOP values |
| 1. Definition & History | Timeline table from von Graefe to iCare HOME |
| 2. Classification | All 6 categories of tonometers with principles and examples |
| 3. Principles | All 6 principles (Indentation, Imbert-Fick, MacKay-Marg, Air-puff, Rebound, DCT) with the P=F/A formula highlighted |
| 4. Schiotz — Detailed | Labelled 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 Table | All tonometers side-by-side across 9 features |
| 7. Other Tonometers | Perkins, Tono-Pen, NCT, iCare, PASCAL |
| 8. Contraindications | Table with alternatives |
| 9. Clinical Significance | IOP values table with interpretation and action |
| 10. Viva Q&A | 12 exam-style questions with model answers |
| 11. Practical Checklist | 12-point tick-box checklist for Schiotz practical exam |
| References | Kanski 10th ed., Pfenninger & Fowler, Roberts & Hedges |