Tell me some pedogogy topics for final year postgraduates
for ms general surgery practical’s exams
| Station | Key Assessment Focus |
|---|---|
| Long case | History, examination, diagnosis, management plan |
| Short cases | Focused clinical signs (hernia, thyroid, varicose veins, etc.) |
| Operative surgery viva | Steps, anatomy, complications, decision-making |
| Instruments/specimens | Identification, indications, technique |
| X-ray/imaging | Systematic interpretation, surgical relevance |
| Suturing/skills | Technique, knot-tying, wound closure |
| Radiology/histopathology | Integration with clinical context |
Generate a study guide PDF for MS surgery OSCE stations
mkdir -p /tmp/workspace/ms-surgery-osce && ls /tmp/workspace/ms-surgery-osce/
~/ms-surgery-osce/generate_guide.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
PageBreak, HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate
from reportlab.pdfgen import canvas as canv_module
OUTPUT = "/tmp/workspace/ms-surgery-osce/MS_Surgery_OSCE_Study_Guide.pdf"
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1B3A6B")
MED_BLUE = colors.HexColor("#2E6DA4")
LIGHT_BLUE = colors.HexColor("#D6E4F0")
ACCENT_RED = colors.HexColor("#C0392B")
ACCENT_GREEN= colors.HexColor("#1A7F4B")
GOLD = colors.HexColor("#D4AC0D")
LIGHT_GREY = colors.HexColor("#F4F6F7")
MID_GREY = colors.HexColor("#BDC3C7")
WHITE = colors.white
BLACK = colors.black
# ── Page numbering ───────────────────────────────────────────────────────────
class NumberedCanvas(canv_module.Canvas):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._saved_page_states = []
def showPage(self):
self._saved_page_states.append(dict(self.__dict__))
self._startPage()
def save(self):
num_pages = len(self._saved_page_states)
for state in self._saved_page_states:
self.__dict__.update(state)
self.draw_page_number(num_pages)
canv_module.Canvas.showPage(self)
canv_module.Canvas.save(self)
def draw_page_number(self, page_count):
self.setFont("Helvetica", 8)
self.setFillColor(MID_GREY)
self.drawRightString(A4[0] - 1.5*cm, 1*cm,
f"Page {self._pageNumber} of {page_count}")
self.drawString(1.5*cm, 1*cm,
"MS General Surgery - OSCE Study Guide 2026")
# ── Header/Footer on each page ───────────────────────────────────────────────
def header_footer(canvas, doc):
canvas.saveState()
# Top bar
canvas.setFillColor(DARK_BLUE)
canvas.rect(0, A4[1] - 1.2*cm, A4[0], 1.2*cm, fill=1, stroke=0)
canvas.setFont("Helvetica-Bold", 10)
canvas.setFillColor(WHITE)
canvas.drawString(1.5*cm, A4[1] - 0.85*cm,
"MS General Surgery | OSCE Clinical Study Guide")
canvas.restoreState()
# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()
title_style = ParagraphStyle("Title", parent=styles["Title"],
fontSize=28, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", spaceAfter=8)
subtitle_style = ParagraphStyle("Subtitle", parent=styles["Normal"],
fontSize=14, textColor=LIGHT_BLUE, alignment=TA_CENTER,
fontName="Helvetica", spaceAfter=6)
h1 = ParagraphStyle("H1", parent=styles["Heading1"],
fontSize=16, textColor=WHITE, fontName="Helvetica-Bold",
spaceBefore=14, spaceAfter=6, backColor=MED_BLUE,
leftIndent=-10, rightIndent=-10, borderPadding=(6, 10, 6, 10))
h2 = ParagraphStyle("H2", parent=styles["Heading2"],
fontSize=13, textColor=DARK_BLUE, fontName="Helvetica-Bold",
spaceBefore=10, spaceAfter=4, borderPadding=(0,0,2,0),
borderColor=DARK_BLUE, borderWidth=0)
h3 = ParagraphStyle("H3", parent=styles["Heading3"],
fontSize=11, textColor=MED_BLUE, fontName="Helvetica-Bold",
spaceBefore=8, spaceAfter=3)
body = ParagraphStyle("Body", parent=styles["Normal"],
fontSize=9.5, textColor=BLACK, fontName="Helvetica",
leading=14, spaceAfter=4, alignment=TA_JUSTIFY)
bullet = ParagraphStyle("Bullet", parent=styles["Normal"],
fontSize=9.5, textColor=BLACK, fontName="Helvetica",
leading=13, spaceAfter=3, leftIndent=14,
bulletIndent=4)
small = ParagraphStyle("Small", parent=styles["Normal"],
fontSize=8.5, textColor=colors.HexColor("#555555"),
fontName="Helvetica-Italic", leading=12)
tip_style = ParagraphStyle("Tip", parent=styles["Normal"],
fontSize=9, textColor=ACCENT_GREEN, fontName="Helvetica-Bold",
leading=13, leftIndent=10)
warn_style = ParagraphStyle("Warn", parent=styles["Normal"],
fontSize=9, textColor=ACCENT_RED, fontName="Helvetica-Bold",
leading=13, leftIndent=10)
# ── Helper builders ──────────────────────────────────────────────────────────
def section_header(text):
return [
Spacer(1, 0.3*cm),
Table([[Paragraph(text, ParagraphStyle("SH", parent=h1,
fontSize=14, textColor=WHITE, fontName="Helvetica-Bold",
alignment=TA_LEFT, spaceBefore=0, spaceAfter=0))]],
colWidths=[17*cm],
style=TableStyle([
("BACKGROUND", (0,0), (-1,-1), MED_BLUE),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING",(0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 12),
("ROWBACKGROUNDS", (0,0), (-1,-1), [MED_BLUE]),
])),
Spacer(1, 0.2*cm),
]
def sub_header(text):
return [
Spacer(1, 0.15*cm),
Paragraph(text, h2),
HRFlowable(width="100%", thickness=1.5, color=MED_BLUE, spaceAfter=4),
]
def b(text):
return Paragraph(f"<b>{text}</b>", body)
def bp(text):
return Paragraph(f"• {text}", bullet)
def tip(text):
return Table([[Paragraph(f"✅ EXAMINER TIP: {text}", tip_style)]],
colWidths=[17*cm],
style=TableStyle([
("BACKGROUND",(0,0),(-1,-1), colors.HexColor("#E9F7EF")),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),10),
("BOX",(0,0),(-1,-1),1,ACCENT_GREEN),
]))
def warn(text):
return Table([[Paragraph(f"⚠ WATCH OUT: {text}", warn_style)]],
colWidths=[17*cm],
style=TableStyle([
("BACKGROUND",(0,0),(-1,-1), colors.HexColor("#FDEDEC")),
("TOPPADDING",(0,0),(-1,-1),5),
("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),10),
("BOX",(0,0),(-1,-1),1,ACCENT_RED),
]))
def make_table(headers, rows, col_widths=None):
data = [[Paragraph(f"<b>{h}</b>",
ParagraphStyle("TH", parent=body, fontSize=9,
textColor=WHITE, fontName="Helvetica-Bold"))
for h in headers]]
for row in rows:
data.append([Paragraph(str(c),
ParagraphStyle("TD", parent=body, fontSize=9))
for c in row])
if col_widths is None:
col_widths = [17*cm / len(headers)] * len(headers)
t = Table(data, colWidths=col_widths, repeatRows=1)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), DARK_BLUE),
("ROWBACKGROUNDS",(0,1),(-1,-1), [LIGHT_GREY, WHITE]),
("GRID", (0,0), (-1,-1), 0.4, MID_GREY),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
# ════════════════════════════════════════════════════════════════════════════
# CONTENT
# ════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ───────────────────────────────────────────────────────────────
cover_table = Table([[
Paragraph("MS GENERAL SURGERY", title_style),
]],
colWidths=[17*cm])
cover_table.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1), DARK_BLUE),
("TOPPADDING",(0,0),(-1,-1),30),
("BOTTOMPADDING",(0,0),(-1,-1),10),
("LEFTPADDING",(0,0),(-1,-1),20),
("RIGHTPADDING",(0,0),(-1,-1),20),
("BOX",(0,0),(-1,-1),2,GOLD),
]))
story.append(Spacer(1, 3.5*cm))
story.append(cover_table)
story.append(Spacer(1, 0.4*cm))
sub_box = Table([[
Paragraph("OSCE CLINICAL EXAMINATION", subtitle_style),
Paragraph("Comprehensive Study Guide for Final Year Postgraduates", subtitle_style),
Paragraph("2026 Edition", ParagraphStyle("Ed", parent=subtitle_style,
fontSize=11, textColor=GOLD)),
]],colWidths=[17*cm])
sub_box.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),MED_BLUE),
("TOPPADDING",(0,0),(-1,-1),8),
("BOTTOMPADDING",(0,0),(-1,-1),10),
("LEFTPADDING",(0,0),(-1,-1),20),
]))
story.append(sub_box)
story.append(Spacer(1, 1.5*cm))
# Quick info box
info_data = [
["Examination", "MS General Surgery Practical Examination"],
["Guide Coverage", "10 Core OSCE Station Types"],
["Standard", "NBE / University PG Curriculum"],
["Year", "Final Year (3rd Year MS)"],
]
info_t = Table(info_data, colWidths=[5*cm, 12*cm])
info_t.setStyle(TableStyle([
("BACKGROUND",(0,0),(0,-1),LIGHT_BLUE),
("ROWBACKGROUNDS",(1,0),(1,-1),[WHITE, LIGHT_GREY]*5),
("GRID",(0,0),(-1,-1),0.5,MID_GREY),
("FONTNAME",(0,0),(0,-1),"Helvetica-Bold"),
("FONTSIZE",(0,0),(-1,-1),9.5),
("TOPPADDING",(0,0),(-1,-1),7),
("BOTTOMPADDING",(0,0),(-1,-1),7),
("LEFTPADDING",(0,0),(-1,-1),10),
]))
story.append(info_t)
story.append(PageBreak())
# ── HOW TO USE THIS GUIDE ────────────────────────────────────────────────────
story += section_header("How to Use This Guide")
story.append(Paragraph(
"This study guide covers the <b>10 core OSCE station types</b> you will encounter in the "
"MS General Surgery final examination. Each station section includes: the clinical scenario "
"format, a structured response framework, key clinical content, examiner tips, and common "
"pitfalls to avoid. Use this alongside your operative logbook and case-based revision.", body))
story.append(Spacer(1, 0.3*cm))
overview_data = [
["#", "Station Type", "Duration", "Marks"],
["1", "Long Case - History & Clinical Examination", "30 min", "30"],
["2", "Short Cases - Clinical Signs", "5-7 min each", "20"],
["3", "Operative Surgery Viva", "10-15 min", "20"],
["4", "Surgical Instruments & Specimens", "5 min", "10"],
["5", "Radiology / Imaging Interpretation", "5-7 min", "10"],
["6", "Procedural Skills / Suturing", "10 min", "15"],
["7", "Histopathology Specimens", "5 min", "10"],
["8", "Pre-operative Assessment Station", "5-7 min", "10"],
["9", "Communication & Consent Station", "7-10 min", "10"],
["10","Emergency Scenario / Critical Appraisal", "10 min", "15"],
]
story.append(make_table(overview_data[0], overview_data[1:],
col_widths=[1*cm, 8.5*cm, 3.5*cm, 4*cm]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 1: LONG CASE
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 1: Long Case - History & Clinical Examination")
story.append(Paragraph(
"The long case is the cornerstone of the MS Surgery practical. You are given 30 minutes "
"alone with the patient, followed by 15-20 minutes of examination by two examiners. "
"It tests integrated clinical skills: history-taking, physical examination, differential "
"diagnosis, investigation planning, and surgical management.", body))
story += sub_header("Structured Approach: SOAP Framework")
soap = [
["S - Subjective", "Chief complaint, history of presenting illness, past surgical/medical history, drug history, family history, social history"],
["O - Objective", "General examination, vital signs, systemic examination, local surgical examination (inspection, palpation, percussion, auscultation)"],
["A - Assessment", "Most likely diagnosis, differential diagnoses ranked by probability, complications present"],
["P - Plan", "Investigations needed, pre-op workup, surgical options, perioperative care, prognosis"],
]
story.append(make_table(["Component", "What to Cover"], soap, col_widths=[4*cm, 13*cm]))
story.append(Spacer(1, 0.3*cm))
story += sub_header("Common Long Case Conditions")
lc_conditions = [
"Carcinoma of the colon / rectum - staging, management algorithm",
"Carcinoma of the stomach - presentation, TNM staging, surgical options",
"Carcinoma of the thyroid - types, workup (FNAC, TFTs, USG), surgery",
"Carcinoma of the breast - triple assessment, staging, modified radical mastectomy",
"Portal hypertension / cirrhosis with complications",
"Obstructive jaundice - benign vs malignant causes, Whipple's procedure",
"Chronic pancreatitis / pancreatic pseudocyst",
"Large bowel obstruction / pseudo-obstruction",
"Peripheral arterial disease / critical limb ischaemia",
"Diabetic foot - Wagner grading, vascular vs neuropathic, management",
]
for c in lc_conditions:
story.append(bp(c))
story.append(Spacer(1, 0.3*cm))
story.append(tip("Always present your case as if to a senior colleague: 'I reviewed a 55-year-old male with a 3-month history of altered bowel habits and weight loss. On examination...' Structure saves marks."))
story.append(Spacer(1,0.2*cm))
story.append(warn("Never skip the RECTAL EXAMINATION in colorectal cases. Examiners will specifically ask if you performed it."))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 2: SHORT CASES
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 2: Short Cases - Clinical Signs")
story.append(Paragraph(
"Short cases test your ability to rapidly identify and describe surgical signs. "
"You will be shown 4-6 patients/models and asked to examine a specific region and "
"give a diagnosis with brief management. Time is limited - be systematic and fast.", body))
story += sub_header("High-Yield Short Case Topics by System")
sc_data = [
["System", "Key Short Case Topics"],
["Neck & Thyroid", "Goitre (solitary nodule vs MNG), thyroglossal cyst, branchial cyst, cervical lymphadenopathy, carotid body tumour"],
["Breast", "Fibroadenoma, breast abscess, carcinoma (skin tethering, peau d'orange), Paget's disease of nipple"],
["Hernia", "Inguinal (direct vs indirect), femoral, umbilical, incisional, Spigelian hernia"],
["Abdomen", "Hepatomegaly, splenomegaly, ascites, abdominal mass (kidney vs other), stomas"],
["Peripheral Vascular", "Varicose veins (Trendelenburg test, tourniquet test), arterial ulcer vs venous ulcer, DVT signs"],
["Skin & Soft Tissue", "Sebaceous cyst, lipoma, dermoid cyst, ganglion, pyogenic granuloma, malignant melanoma"],
["Anorectal", "Haemorrhoids, fissure-in-ano, fistula-in-ano, pilonidal sinus, rectal prolapse"],
["Scrotum", "Hydrocele, epididymo-orchitis, testicular tumour, varicocele, epididymal cyst"],
["Paediatric", "Inguinal hernia in child, undescended testis, hypospadias, Hirschsprung's disease"],
]
story.append(make_table(sc_data[0], sc_data[1:], col_widths=[4.5*cm, 12.5*cm]))
story.append(Spacer(1, 0.3*cm))
story += sub_header("Short Case Response Template")
for step in [
"<b>Step 1 - General inspection:</b> 'On inspection, I see a swelling in the right groin region, approximately 4x3 cm, with no overlying skin changes...'",
"<b>Step 2 - Specific findings:</b> Describe site, size, shape, surface, edge, consistency, reducibility, transillumination, pulsatility, bruit",
"<b>Step 3 - Diagnosis:</b> 'My diagnosis is an indirect inguinal hernia based on...'",
"<b>Step 4 - Differentials:</b> Offer 1-2 alternatives with reasoning",
"<b>Step 5 - Management outline:</b> 'I would manage this with...' (conservative / surgical)",
]:
story.append(bp(step))
story.append(Spacer(1,0.2*cm))
story.append(tip("For any neck swelling - always say you would assess MOVEMENT WITH SWALLOWING and ON TONGUE PROTRUSION before touching the patient."))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 3: OPERATIVE VIVA
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 3: Operative Surgery Viva")
story.append(Paragraph(
"The operative viva assesses your theoretical and practical knowledge of standard surgical "
"procedures. Questions follow a standard pattern: indications, anatomy, steps of operation, "
"complications, and postoperative care. You must know your index procedures perfectly.", body))
story += sub_header("Index Procedures - Must Know in Full Detail")
ops_data = [
["Operation", "Key Points to Know"],
["Appendicectomy (open & lap)", "McBurney's incision, layers, stump handling, normal appendix - what to do"],
["Inguinal hernia repair (Lichtenstein)", "Anatomy of inguinal canal, mesh placement, ilioinguinal nerve, recurrence"],
["Cholecystectomy (laparoscopic)", "Critical view of safety, Calot's triangle, bile duct injury, port sites"],
["Whipple's (Pancreaticoduodenectomy)", "Indications, resection, 3 anastomoses, complications (POPF, DGE)"],
["Right hemicolectomy", "Landmarks, high ligation of ileocolic vessels, lymphadenectomy, anastomosis"],
["Anterior resection of rectum", "Total mesorectal excision (TME), autonomic nerve preservation, anastomosis"],
["Thyroidectomy (total/hemi)", "RLN identification, parathyroid preservation, Berry's ligament"],
["Modified Radical Mastectomy", "Patey vs Madden, axillary dissection levels, serratus anterior"],
["Splenectomy", "Short gastric vessels, tail of pancreas, overwhelming post-splenectomy infection (OPSI)"],
["Hartmann's procedure", "Indications (perforated sigmoid), reversal considerations"],
]
story.append(make_table(ops_data[0], ops_data[1:], col_widths=[6*cm, 11*cm]))
story.append(Spacer(1, 0.3*cm))
story += sub_header("Operative Viva Answer Framework - '5-Step Template'")
for s in [
"<b>1. Indications:</b> 'This operation is indicated for...' (include elective and emergency)",
"<b>2. Pre-operative preparation:</b> Consent, anaesthesia type, patient positioning, bowel prep if needed",
"<b>3. Steps of the operation:</b> Incision - exposure - key anatomy - critical steps - closure",
"<b>4. Complications:</b> Intraoperative / early postoperative / late (use this classification always)",
"<b>5. Post-operative care:</b> Drains, diet, DVT prophylaxis, discharge criteria, follow-up",
]:
story.append(bp(s))
story.append(Spacer(1,0.2*cm))
story.append(tip("When asked about complications, classify as: Immediate (0-24h), Early (1-30 days), Late (>30 days). Examiners love this structured answer."))
story.append(warn("Never say 'I would cut here' - always use anatomical landmarks. 'I would divide at the level of the inferior mesenteric artery origin' scores better."))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 4: INSTRUMENTS & SPECIMENS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 4: Surgical Instruments & Specimens")
story.append(Paragraph(
"You will be shown 5-10 instruments or surgical specimens and asked to identify, describe, "
"and discuss their clinical use. Answer in a structured format: name, type, material, "
"specific features, uses, and technique.", body))
story += sub_header("High-Yield Instruments by Category")
instr_data = [
["Category", "Key Instruments"],
["Retractors", "Langenbeck, Deaver, Morris, Self-retaining (Balfour, Weitlaner, Travers), Doyen"],
["Artery Forceps", "Kocher's, Dunhill, Spencer Wells, Roberts, Mosquito, Mixter right-angle"],
["Bowel Clamps", "Lane's, Doyen intestinal, Kocher crushing clamp"],
["Thyroid Surgery", "Lahey's thyroid forceps, Maingot artery forceps"],
["Anorectal", "Proctoscope, sigmoidoscope, Parks retractor, Lockhart-Mummery fistula probe"],
["Vascular", "Bulldog clamp, Satinsky clamp, vascular needle holders"],
["Laparoscopic", "Veress needle, trocar & cannula, clip applicator, harmonic scalpel"],
["Sutures", "Prolene, Vicryl, PDS, Monocryl, Nylon - know absorbable vs non-absorbable"],
["Miscellaneous", "Ryles tube, Foley catheter, chest drain, Sengstaken-Blakemore tube"],
]
story.append(make_table(instr_data[0], instr_data[1:], col_widths=[4.5*cm, 12.5*cm]))
story.append(Spacer(1, 0.3*cm))
story += sub_header("Specimen Identification Framework")
for s in [
"<b>Organ:</b> Name the organ and part (e.g., 'This is a segment of large bowel, likely sigmoid colon')",
"<b>Pathology:</b> Describe the lesion - ulcerating/proliferating/infiltrating, size, location in wall",
"<b>Staging clue:</b> Note any lymph nodes in the mesentery, depth of invasion visible",
"<b>Operation:</b> Name the operation this would come from",
"<b>Important associations:</b> Mention relevant management (e.g., adjuvant chemotherapy for Dukes C)",
]:
story.append(bp(s))
story.append(Spacer(1,0.2*cm))
story.append(tip("Pick up every instrument confidently and state: 'This is a [name], it is a [type] made of [material], with [specific feature], used for [purpose].'"))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 5: RADIOLOGY
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 5: Radiology & Imaging Interpretation")
story.append(Paragraph(
"Imaging stations assess your ability to identify key radiological findings and correlate "
"them with clinical management. Always use a systematic approach - never jump straight "
"to the diagnosis without stating patient details and image quality.", body))
story += sub_header("Systematic Reporting Template")
for s in [
"<b>1. Type of study:</b> 'This is a [PA chest X-ray / CT abdomen with contrast / USG abdomen]'",
"<b>2. Patient demographics:</b> 'Taken of a [adult/child], [date if visible]'",
"<b>3. Technical adequacy:</b> Rotation, exposure, inspiratory effort (for CXR)",
"<b>4. Systematic review:</b> Go through all zones methodically",
"<b>5. Diagnosis:</b> 'The main finding is... consistent with a diagnosis of...'",
"<b>6. Surgical relevance:</b> 'This would require...' (immediate management / operation)",
]:
story.append(bp(s))
story += sub_header("High-Yield Imaging Findings")
rad_data = [
["Modality", "Finding", "Diagnosis", "Surgical Action"],
["CXR", "Air under diaphragm", "Hollow viscus perforation", "Emergency laparotomy"],
["CXR", "Mediastinal widening", "Aortic dissection / oesophageal perforation", "CT aortogram / surgery"],
["CT Abdomen", "Double bubble sign (paeds)", "Duodenal atresia", "Duodeno-duodenostomy"],
["CT Abdomen", "Target sign in bowel wall", "Intussusception", "Barium reduction / surgery"],
["CT Abdomen", "Whirlpool sign", "Volvulus (sigmoid/caecal)", "Emergency laparotomy"],
["CT Abdomen", "Portal venous gas", "Mesenteric ischaemia", "Emergency laparotomy"],
["USG Abdomen", "Dilated CBD >8mm + stones", "Choledocholithiasis", "ERCP + LC"],
["USG Abdomen", "Non-compressible tubular structure in RIF", "Appendicitis", "Appendicectomy"],
["CECT Abdomen", "Pancreatic necrosis >30%", "Severe acute pancreatitis", "ITU, delayed necrosectomy"],
["Barium Enema", "Apple-core deformity", "Carcinoma colon", "Hemicolectomy"],
["IVU/CT Urogram", "Filling defect in pelvis", "Renal pelvis TCC", "Nephroureterectomy"],
["Angiogram", "Pooling of contrast in bowel", "GI haemorrhage", "Embolization / surgery"],
]
story.append(make_table(rad_data[0], rad_data[1:],
col_widths=[3.5*cm, 4.5*cm, 4.5*cm, 4.5*cm]))
story.append(Spacer(1,0.2*cm))
story.append(tip("For CT scans, always mention: 'I note the scan is [with/without contrast], and I would ideally review all three phases (arterial, portal venous, delayed) for a complete assessment.'"))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 6: PROCEDURAL SKILLS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 6: Procedural Skills & Suturing")
story.append(Paragraph(
"Procedural stations test your technical skills on models or simulators. You will be "
"assessed on your sterile technique, instrument handling, efficiency, and communication "
"with the 'scrub nurse'. Common stations include wound closure, drain insertion, "
"and catheterisation.", body))
story += sub_header("Suturing: Key Techniques")
suture_data = [
["Technique", "Type", "Use", "Key Feature"],
["Simple interrupted", "Non-continuous", "Skin closure, tension sutures", "Easy to remove; infection containment"],
["Mattress suture (vertical/horizontal)", "Non-continuous", "Wound under tension", "Reduces dead space"],
["Continuous over-and-over", "Continuous", "Subcuticular closure", "Cosmetic result"],
["Figure-of-eight", "Non-continuous", "Fascia closure, haemostasis", "Strong hold"],
["Purse-string suture", "Continuous", "Appendix stump, colostomy", "Invaginates tissue"],
["Connell suture", "Continuous inverting", "Bowel anastomosis inner layer", "Mucosal inversion"],
["Lembert suture", "Interrupted inverting", "Bowel seromuscular layer", "Serosal apposition"],
["Subcuticular suture", "Continuous intradermal", "Skin closure", "No stitch marks"],
]
story.append(make_table(suture_data[0], suture_data[1:],
col_widths=[4*cm, 3.5*cm, 5*cm, 4.5*cm]))
story.append(Spacer(1, 0.3*cm))
story += sub_header("Knot-Tying Principles")
for s in [
"Always use a <b>square knot</b> (reef knot) - never a granny knot",
"Minimum <b>3 throws</b> for synthetic monofilament; 2 for braided sutures",
"Keep suture taut during tying - avoid slack between throws",
"Cut suture tails to <b>3-5 mm</b> for deep sutures; 2-3 mm subcuticular",
"For laparoscopic knots: intracorporeal or extracorporeal (Roeder's knot)",
]:
story.append(bp(s))
story.append(Spacer(1,0.2*cm))
story.append(tip("Before starting any procedure station: state 'I would confirm patient identity, obtain consent, ensure sterile field, and wear appropriate PPE.' This alone earns process marks."))
story.append(warn("Never cut the needle off the suture before finishing - keep the needle holder, suture, and needle organised on the trolley at all times."))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 7: HISTOPATHOLOGY
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 7: Histopathology Specimens")
story.append(Paragraph(
"Histopathology stations test your ability to identify gross pathological specimens "
"and discuss their microscopic features, staging, and management implications. "
"You may be shown wet specimens, photographs, or actual histology slides.", body))
story += sub_header("High-Yield Histopathology Specimens")
histo_data = [
["Specimen", "Key Gross Features", "Histology", "Staging/Grade"],
["Colorectal carcinoma", "Ulcerating annular lesion, 'rolled everted edges'", "Adenocarcinoma (mucin-secreting)", "Dukes / TNM staging"],
["Carcinoma stomach", "Linitis plastica OR fungating growth at cardia/antrum", "Intestinal or diffuse type (Lauren)", "Siewert classification for GOJ"],
["Carcinoma thyroid", "Papillary: sand-like calcified nodule; Follicular: encapsulated", "Orphan Annie nuclei (papillary)", "MACIS score; TNM"],
["Carcinoma breast", "Irregular, spiculate, gritty on cut section", "IDC (ductal) vs ILC (lobular)", "Nottingham Grade I-III"],
["Cholecystitis/gallstones", "Thickened wall, pigment/cholesterol stones", "Chronic inflammatory infiltrate", "Rokitansky-Aschoff sinuses"],
["Appendix", "Faecalith, gangrenous tip, perforation", "Neutrophilic infiltrate of muscularis", "Note: carcinoid at tip (1%)"],
["Hydatid cyst (liver)", "Daughter cysts, germinal layer, pericyst", "Laminated membrane, scolices", "WHO classification"],
["HCC", "Cirrhotic background, greenish tumour", "Trabecular or acinar pattern, AFP", "Barcelona (BCLC) staging"],
]
story.append(make_table(histo_data[0], histo_data[1:],
col_widths=[4*cm, 4.5*cm, 4.5*cm, 4*cm]))
story.append(Spacer(1,0.2*cm))
story.append(tip("Always mention: 'I would correlate with the patient's clinical presentation, tumour markers, and radiology before finalising the diagnosis and management plan.'"))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 8: PRE-OPERATIVE ASSESSMENT
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 8: Pre-operative Assessment")
story.append(Paragraph(
"This station presents a patient scenario (or actor) requiring pre-operative evaluation. "
"You must demonstrate systematic assessment of fitness for surgery, risk stratification, "
"and optimisation planning.", body))
story += sub_header("Pre-operative Assessment Framework")
for s in [
"<b>History:</b> Functional capacity (METs), co-morbidities (cardiac, respiratory, renal, DM), medications, allergies, previous anaesthesia",
"<b>Examination:</b> Airway assessment (Mallampati), cardiorespiratory status, BMI, peripheral access",
"<b>Investigations:</b> Stratify by ASA and procedure risk (low/intermediate/high)",
"<b>Risk scoring:</b> ASA classification, POSSUM score, Lee's Revised Cardiac Risk Index, P-POSSUM",
"<b>Optimisation:</b> HbA1c <8.5%, BP control, anaemia correction, prehabilitation",
"<b>Consent discussion:</b> Operation, alternatives, specific risks, anaesthetic risks",
]:
story.append(bp(s))
story.append(Spacer(1, 0.3*cm))
asa_data = [
["ASA Class", "Definition", "Example"],
["ASA I", "Normal healthy patient", "Young adult, no co-morbidities"],
["ASA II", "Mild systemic disease", "Controlled DM, mild HTN, smoker"],
["ASA III", "Severe systemic disease", "Poorly controlled DM, COPD, obesity BMI>40"],
["ASA IV", "Life-threatening disease", "Recent MI, severe CHF, liver failure"],
["ASA V", "Moribund - not expected to survive", "Ruptured AAA, massive stroke"],
["ASA VI", "Brain-dead for organ donation", "Donor surgery"],
["E suffix", "Emergency operation", "Any above class + E (e.g., ASA IIE)"],
]
story.append(make_table(asa_data[0], asa_data[1:], col_widths=[3*cm, 7*cm, 7*cm]))
story.append(Spacer(1,0.2*cm))
story.append(tip("Quote ACTUAL numbers: 'A patient with HbA1c of 11% would have an elevated risk of surgical site infection. Optimisation to <8.5% reduces SSI by approximately 50%.'"))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 9: COMMUNICATION & CONSENT
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 9: Communication & Consent")
story.append(Paragraph(
"This station uses a standardised patient (actor) and tests your ability to communicate "
"complex surgical information clearly, obtain valid informed consent, and handle "
"difficult conversations. It is worth significant marks and is often underprepped.", body))
story += sub_header("SPIKES Protocol - Breaking Bad News")
spikes = [
["S", "Setting Up", "Private room, tissues, supportive person present, no bleeps"],
["P", "Perception", "'What do you already know about your condition?'"],
["I", "Invitation", "'Would you like me to share the results with you now?'"],
["K", "Knowledge", "Use plain language; avoid jargon; give in small chunks"],
["E", "Emotions", "Acknowledge, name, and validate: 'That must be very hard to hear'"],
["S", "Strategy & Summary", "Plan next steps; offer written info; arrange follow-up"],
]
story.append(make_table(["Letter", "Step", "Key Action"], spikes, col_widths=[1.5*cm, 4.5*cm, 11*cm]))
story.append(Spacer(1, 0.3*cm))
story += sub_header("Valid Informed Consent - Legal Requirements")
for s in [
"<b>Voluntariness:</b> Patient must consent freely without coercion",
"<b>Capacity:</b> Patient must understand, retain, weigh, and communicate the decision (Mental Capacity Act criteria)",
"<b>Information:</b> Procedure, expected benefits, significant/common risks (>1%), alternatives including no treatment",
"<b>Documentation:</b> Signed consent form PLUS verbal discussion recorded in notes",
"<b>Who can consent:</b> The operating surgeon should ideally take consent; can be delegated to a trained trainee",
]:
story.append(bp(s))
story.append(Spacer(1, 0.3*cm))
story += sub_header("Common Consent Scenarios in OSCE")
consent_data = [
["Scenario", "Key Risks to Mention"],
["Laparoscopic cholecystectomy", "Bile duct injury (0.3-0.5%), conversion to open, bleeding, visceral injury, port site hernia"],
["Total thyroidectomy", "RLN injury (1-2%), hypoparathyroidism (1-2%), bleeding/haematoma, hypothyroidism (permanent)"],
["Inguinal hernia repair", "Recurrence (1-2% mesh), chronic pain, ischaemic orchitis (0.3%), ilioinguinal nerve damage"],
["Anterior resection", "Anastomotic leak (5-10%), temporary stoma, bowel dysfunction, sexual dysfunction, permanent stoma"],
["Mastectomy", "Lymphoedema, seroma, numbness, body image issues, reconstruction options"],
]
story.append(make_table(consent_data[0], consent_data[1:], col_widths=[5*cm, 12*cm]))
story.append(Spacer(1,0.2*cm))
story.append(tip("In communication stations: maintain eye contact with the actor, not your notes. Use open-ended questions. Pause and give silence when the patient is emotional."))
story.append(warn("Never dismiss a patient's fears as trivial. Even if a risk is rare, if the patient considers it significant (e.g., hoarse voice in a singer) it MUST be discussed."))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# STATION 10: EMERGENCY SCENARIOS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Station 10: Emergency Scenarios & Critical Appraisal")
story.append(Paragraph(
"Emergency stations present an acute surgical scenario and test your ability to "
"prioritise, resuscitate, investigate, and manage a critically unwell patient. "
"Always start with ABCDE before jumping to diagnosis.", body))
story += sub_header("ABCDE Resuscitation Framework (Mandatory Starting Point)")
for s in [
"<b>A - Airway:</b> Patent? Stridor? Jaw thrust / chin lift / intubation if needed",
"<b>B - Breathing:</b> RR, SpO2, chest movement, added sounds - O2 15L via NRB mask",
"<b>C - Circulation:</b> HR, BP, CRT, skin colour - 2 large bore IVs, fluid bolus, bloods",
"<b>D - Disability:</b> GCS, AVPU, blood glucose, pupils",
"<b>E - Exposure:</b> Full examination, temperature, look for source of sepsis / bleeding",
]:
story.append(bp(s))
story.append(Spacer(1, 0.3*cm))
story += sub_header("High-Yield Emergency Scenarios")
em_data = [
["Scenario", "Immediate Action", "Key Investigation", "Definitive Treatment"],
["Ruptured AAA", "O negative blood, vascular surgery team", "FAST USS / CECT (if stable)", "Emergency EVAR or open repair"],
["Acute mesenteric ischaemia", "Anticoagulate, resuscitate", "CT angiogram", "Laparotomy, bowel resection"],
["Perforated peptic ulcer", "NGT, urinary catheter, IV PPI+ABx", "Erect CXR (air under diaphragm)", "Laparoscopic/open repair (Graham patch)"],
["Sigmoid volvulus", "Rigid sigmoidoscopy + flatus tube", "AXR (coffee bean sign)", "Elective sigmoid resection"],
["Obstructed + strangulated hernia", "Resuscitate, NBM, Foley", "Clinical diagnosis", "Emergency hernia repair +/- bowel resection"],
["Massive lower GI bleed", "Resuscitate, cross-match 6 units", "CT angiogram (active bleed)", "Interventional radiology / surgery"],
["Acute pancreatitis", "Fluids 250-500ml/hr, analgesia, NBM", "CT severity index (Balthazar)", "ITU if severe; ERCP if gallstone"],
["Postoperative haemorrhage", "Check drain, BP trend, Hb", "Bedside USS, return to OT", "Surgical re-exploration"],
]
story.append(make_table(em_data[0], em_data[1:],
col_widths=[4*cm, 4.5*cm, 4*cm, 4.5*cm]))
story.append(Spacer(1,0.2*cm))
story.append(tip("Examiners want to hear: 'I would activate the Major Haemorrhage Protocol / call for senior help IMMEDIATELY' - showing you know your limitations is a POSITIVE attribute."))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# QUICK REFERENCE: SURGICAL SCORES & CLASSIFICATIONS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Quick Reference: Surgical Scores & Classifications")
story += sub_header("Essential Scoring Systems")
score_data = [
["Score/Classification", "Used For", "Key Parameters"],
["Ranson's Criteria", "Acute pancreatitis severity", "5 at admission + 6 at 48h; >3 = severe"],
["BISAP Score", "Acute pancreatitis mortality", "BUN, Impaired sensorium, SIRS, Age>60, Pleural effusion"],
["TNM Staging", "All solid tumours", "T (tumour), N (nodes), M (metastasis)"],
["Dukes Classification", "Colorectal cancer", "A (mucosa), B (muscularis/pericolorectal), C (nodes), D (distant)"],
["Child-Pugh Score", "Liver cirrhosis surgical risk", "Bilirubin, Albumin, PT, Ascites, Encephalopathy"],
["MELD Score", "Liver disease mortality / transplant listing", "Creatinine, Bilirubin, INR"],
["Clavien-Dindo", "Surgical complication grading", "Grade I-V (V = death)"],
["Wagner Grade", "Diabetic foot ulcer depth", "Grade 0-5"],
["Rutherford Classification", "Peripheral arterial disease", "Category 0-6"],
["ASA Classification", "Anaesthetic risk", "Class I-VI"],
["P-POSSUM", "Operative mortality prediction", "Physiological + Operative severity score"],
["Glasgow Blatchford", "Upper GI bleed - need for intervention", "BUN, Hb, SBP, HR, melena, syncope"],
["Nottingham Grade", "Breast cancer histology", "Tubule formation + nuclear pleomorphism + mitosis (Grade 1-3)"],
]
story.append(make_table(score_data[0], score_data[1:],
col_widths=[5.5*cm, 5.5*cm, 6*cm]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════
# EXAM DAY TIPS
# ════════════════════════════════════════════════════════════════════════════
story += section_header("Exam Day Strategy & Final Tips")
story += sub_header("The 5 Golden Rules")
golden = [
"Always <b>THINK ALOUD</b> - examiners cannot mark what they cannot hear. Narrate your clinical reasoning.",
"Never say <b>'I don't know'</b> without an attempt. Say: 'I would approach this systematically by...'",
"<b>Admit uncertainty gracefully:</b> 'I would seek senior advice for this intraoperative finding' is safer than guessing.",
"Be <b>patient-centred</b> in communication stations. Use the patient's name. Sit at eye level.",
"Dress professionally, maintain <b>eye contact</b> with examiners, and project confidence - even when unsure.",
]
for g in golden:
story.append(bp(g))
story.append(Spacer(1,0.3*cm))
story += sub_header("Last-Week Revision Checklist")
checklist_data = [
["Task", "Done?"],
["Revise all 10 index operations with steps + complications", "[ ]"],
["Practice knot-tying and suturing on a pad or model", "[ ]"],
["Review 20 plain X-rays (CXR + AXR) and 10 CT abdomen scans", "[ ]"],
["Identify 30 surgical instruments by sight", "[ ]"],
["Practice one full long case with a colleague (30 min + 15 min viva)", "[ ]"],
["Review consent discussion for top 5 operations", "[ ]"],
["Memorise Ranson's, Child-Pugh, TNM for colon, thyroid, breast", "[ ]"],
["Review your operative logbook - know your case numbers", "[ ]"],
["Practice ABCDE approach out loud for 3 emergency scenarios", "[ ]"],
["Read NICE/NBE guidelines summary for hernia, gallstones, colorectal cancer", "[ ]"],
]
story.append(make_table(checklist_data[0], checklist_data[1:], col_widths=[14*cm, 3*cm]))
story.append(Spacer(1, 0.3*cm))
# Final encouragement box
final_box = Table([[
Paragraph(
"Best of luck with your MS General Surgery examination. "
"Systematic preparation, clinical exposure, and confident communication "
"are the three pillars of success. You have trained for 3 years - trust your knowledge.",
ParagraphStyle("Final", parent=body, fontSize=10,
textColor=DARK_BLUE, fontName="Helvetica-Bold",
alignment=TA_CENTER))
]], colWidths=[17*cm])
final_box.setStyle(TableStyle([
("BACKGROUND",(0,0),(-1,-1),LIGHT_BLUE),
("BOX",(0,0),(-1,-1),2,DARK_BLUE),
("TOPPADDING",(0,0),(-1,-1),15),
("BOTTOMPADDING",(0,0),(-1,-1),15),
("LEFTPADDING",(0,0),(-1,-1),20),
("RIGHTPADDING",(0,0),(-1,-1),20),
]))
story.append(Spacer(1, 0.5*cm))
story.append(final_box)
# ── Build PDF ────────────────────────────────────────────────────────────────
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2*cm, bottomMargin=1.8*cm,
title="MS General Surgery OSCE Study Guide",
author="Orris AI",
subject="OSCE Clinical Examination Study Guide",
)
doc.build(story, onFirstPage=header_footer, onLaterPages=header_footer,
canvasmaker=NumberedCanvas)
print(f"PDF generated: {OUTPUT}")
cd /tmp/workspace/ms-surgery-osce && python generate_guide.py 2>&1
ls -lh /tmp/workspace/ms-surgery-osce/MS_Surgery_OSCE_Study_Guide.pdf
MS Surgery OSCE Study Guide
PDF Document · PDF
| Station | Content |
|---|---|
| 1. Long Case | SOAP framework, common conditions (CRC, thyroid, breast, PAD), presentation tips |
| 2. Short Cases | System-by-system topic list, 5-step response template |
| 3. Operative Viva | 10 index operations, 5-step answer framework, complications classification |
| 4. Instruments & Specimens | Categorised instrument list, specimen identification framework |
| 5. Radiology | Systematic reporting template, 12 high-yield imaging findings with actions |
| 6. Procedural Skills | Suturing techniques table, knot-tying principles |
| 7. Histopathology | 8 key specimens with gross features, histology, and staging |
| 8. Pre-op Assessment | ASA classification table, optimisation targets |
| 9. Communication & Consent | SPIKES protocol, legal consent requirements, 5 consent scenarios with specific risks |
| 10. Emergency Scenarios | ABCDE framework, 8 emergency conditions with immediate actions |
Investigations for Ranula
ranula sublingual cyst oral floor of mouth

Clinical photograph of a pediatric patient's oral cavity showing a simple ranula. The image displays a large, well-circumscribed sublingual mass located on the floor of the mouth, originating from the base of the tongue near the midline. The mass is characterized by a distinctive translucent, bluish hue, indicative of an underlying mucocele or fluid collection, specifically a mucous extravasation cyst arising from the sublingual gland. The overlying mucosa appears thin but otherwise intact and non-inflamed. The tongue is visibly elevated and displaced superiorly by the cyst's volume. A white arrow points to the lateral aspect of the lesion, highlighting its tense, cystic morphology and significant size relative to the oral space. This visual serves as a classic diagnostic example of a ranula in an adolescent, illustrating the hallmark physical findings that differentiate sublingual cystic lesions from other floor-of-the-mouth pathologies.

Clinical photograph of an open oral cavity in a pediatric patient, demonstrating a large, cystic swelling in the floor of the mouth. The lesion is located sublingually and is primarily situated on the left side, though it appears to cross the midline. The swelling exhibits a translucent, bluish, or 'frog-belly' hue, characteristic of a ranula (mucous extravasation cyst). Superficial vascularity is visible on the stretched mucosal surface covering the cyst. The tongue is displaced superiorly and posteriorly by the mass. The image highlights the typical intraoral presentation of a sublingual gland mucocele, which can extend into deeper cervical spaces as a 'plunging ranula.' Clinical relevance includes differential diagnosis of oral floor masses such as dermoid cysts or hemangiomas, and educational focus is on the visual identification of salivary gland pathologies in pediatric dentistry and oral surgery.

This composite of clinical and diagnostic images documents a sublingual ranula in a 38-year-old patient. Figure (a) is a clinical photograph of the floor of the mouth showing a dome-shaped, translucent blue-tinted swelling consistent with a mucous extravasation cyst or ranula, adjacent to the lower dentition. Figure (b) is a coronal T2-weighted MRI scan demonstrating a well-circumscribed, hyperintense (bright) cystic lesion in the right sublingual space, which indicates high fluid content and confirms the extent of the ranula. Figure (c) depicts the clinical procedure of fine-needle aspiration. A syringe is shown extracting yellowish, mucinous fluid from the lesion, a hallmark diagnostic feature of saliva-containing cysts. The collection of images illustrates the diagnostic pathway from clinical presentation and radiological imaging to procedural confirmation of a sublingual ranula, relevant for oral and maxillofacial surgery and dental education.
"Imaging is unnecessary for confirming the clinical diagnosis of a simple intraoral ranula. However, if there is a history of previous surgery, if the ranula has a cervical component, or if the diagnosis is uncertain clinically, then MRI is preferred."
- Scott-Brown's Otorhinolaryngology Head & Neck Surgery Vol. 2
| Feature | Simple Ranula | Plunging Ranula |
|---|---|---|
| Location | Sublingual space, above mylohyoid | Submandibular/submental, below mylohyoid |
| Appearance | Unilocular, well-defined, anechoic cystic mass | Cystic with possible extension into neck |
| Internal echoes | May have fine echoes (debris from prior inflammation) | Variable |
| Walls | Thin, smooth | May show some irregularity |
| Sequence | Appearance |
|---|---|
| T1-weighted | Low signal (hypointense) |
| T2-weighted | High signal (hyperintense) - due to high fluid content |
| Post-contrast | No enhancement of cyst content (simple ranula) |
| Fat-suppressed T1 + contrast | No enhancement of cyst wall |
| Feature | Appearance |
|---|---|
| Density | Low attenuation (near-fluid density) |
| Enhancement | Non-enhancing, thin wall (simple) |
| Wall | Smooth, thin-walled mass |
| Extent | Defines relationship to anatomical spaces |
"On CT a simple ranula will appear as a solitary, low-attenuation, non-enhancing thin-walled mass."
- Scott-Brown's Otorhinolaryngology Vol. 2
| Investigation | Role | When to Use |
|---|---|---|
| Clinical examination + transillumination | Primary diagnosis of simple ranula | Always first |
| Aspiration / FNA | Confirms mucoid fluid (high amylase) | If diagnosis uncertain; differentiates from lymphangioma |
| Ultrasonography | First-line imaging; defines sublingual vs. submandibular extent | Plunging ranula, recurrent cases |
| MRI (preferred) | Best delineates anatomy, extent, and type; no radiation | Previous surgery, cervical component, diagnostic uncertainty |
| CECT neck | Defines anatomical boundaries | When MRI unavailable; surgical planning |
| Lesion | Distinguishing Feature on Imaging/FNA |
|---|---|
| Lymphangioma | Multilocular on USS; watery FNA (no amylase); epithelial lining on histology |
| Dermoid cyst | Echogenic fat content on USS; high T1 signal on MRI |
| Branchial cyst | Lateral neck location; no sublingual connection |
| Thyroglossal cyst | Midline, moves with tongue protrusion; related to hyoid |
| Cystic hygroma | Multilocular, trans-spatial |
