Give me the explanation for all questions
python3 << 'EOF' import pdfplumber with pdfplumber.open("/tmp/workspace/attachments/8735522d-3e4e-4b98-8b55-8a99a501cffe/MGR_BPT_Clinical_Ortho_QuickRef.pdf") as pdf: print(f"Total pages: {len(pdf.pages)}") # Extract first few pages to understand structure for i, page in enumerate(pdf.pages[:5]): text = page.extract_text() print(f"\n===== PAGE {i+1} =====") print(text) EOF
| Gait Deviation | Cause | Management |
|---|---|---|
| Trendelenburg gait (lurching to affected side) | Weak hip abductors (gluteus medius) | Hip abductor strengthening |
| Scissor gait | Spastic hip adductors (CP) | Stretching, botulinum toxin |
| Hemiplegic gait | Stroke, UMN lesion | Spasticity management, AFO |
| Antalgic gait | Pain | Treat underlying cause |
| High-stepping gait | Foot drop (LMN) | AFO, tibialis anterior strengthening |
| Waddling gait | Bilateral hip abductor weakness / CDH | Strengthening, treat cause |
| Steppage gait | Bilateral foot drop | Bilateral AFO |
Create a study guide PDF for exam revision
mkdir -p /tmp/workspace/ortho-study-guide && ls /tmp/workspace/ortho-study-guide/
~/ortho-study-guide/build_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import BalancedColumns
# ── Output path ─────────────────────────────────────────────────────────────
OUTPUT = "/tmp/workspace/ortho-study-guide/MGR_BPT_ClinicalOrtho_StudyGuide.pdf"
# ── Colour palette ───────────────────────────────────────────────────────────
C_NAVY = colors.HexColor("#1A3A5C")
C_TEAL = colors.HexColor("#0E7C7B")
C_AMBER = colors.HexColor("#F4A300")
C_LIGHT = colors.HexColor("#EBF4FA")
C_PALE = colors.HexColor("#FFF9EC")
C_WHITE = colors.white
C_LGREY = colors.HexColor("#F5F5F5")
C_DGREY = colors.HexColor("#444444")
C_RED = colors.HexColor("#C0392B")
C_GREEN = colors.HexColor("#1A7A4A")
C_BORDER = colors.HexColor("#AACFE8")
doc = SimpleDocTemplate(
OUTPUT, pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=2*cm, bottomMargin=2*cm
)
styles = getSampleStyleSheet()
# ── Custom styles ─────────────────────────────────────────────────────────────
def S(name, **kw):
return ParagraphStyle(name, **kw)
sTitle = S("sTitle",
fontName="Helvetica-Bold", fontSize=22, textColor=C_WHITE,
alignment=TA_CENTER, spaceAfter=4, leading=28)
sSubtitle = S("sSubtitle",
fontName="Helvetica", fontSize=11, textColor=colors.HexColor("#DDEEFF"),
alignment=TA_CENTER, spaceAfter=2)
sBadge = S("sBadge",
fontName="Helvetica-Bold", fontSize=9, textColor=C_WHITE,
alignment=TA_CENTER)
sCh = S("sCh", # chapter heading
fontName="Helvetica-Bold", fontSize=14, textColor=C_WHITE,
spaceBefore=8, spaceAfter=4, leading=18, leftIndent=0)
sH1 = S("sH1",
fontName="Helvetica-Bold", fontSize=12, textColor=C_NAVY,
spaceBefore=10, spaceAfter=3, leading=15)
sH2 = S("sH2",
fontName="Helvetica-Bold", fontSize=10.5, textColor=C_TEAL,
spaceBefore=7, spaceAfter=2, leading=13)
sH3 = S("sH3",
fontName="Helvetica-Bold", fontSize=9.5, textColor=C_DGREY,
spaceBefore=5, spaceAfter=1, leading=12)
sBody = S("sBody",
fontName="Helvetica", fontSize=9, textColor=C_DGREY,
spaceAfter=2, leading=13, alignment=TA_JUSTIFY)
sBullet = S("sBullet",
fontName="Helvetica", fontSize=9, textColor=C_DGREY,
spaceAfter=1, leading=12, leftIndent=14, bulletIndent=4)
sNote = S("sNote",
fontName="Helvetica-Oblique", fontSize=8.5, textColor=C_TEAL,
spaceAfter=2, leading=11, leftIndent=8)
sKeyword = S("sKeyword",
fontName="Helvetica-Bold", fontSize=9, textColor=C_RED,
spaceAfter=1, leading=12)
sTip = S("sTip",
fontName="Helvetica-Oblique", fontSize=8.5, textColor=C_GREEN,
spaceAfter=2, leading=12, leftIndent=8)
sFooter = S("sFooter",
fontName="Helvetica", fontSize=7.5, textColor=colors.grey,
alignment=TA_CENTER)
sTocH = S("sTocH",
fontName="Helvetica-Bold", fontSize=11, textColor=C_NAVY,
spaceBefore=4, spaceAfter=2)
sTocE = S("sTocE",
fontName="Helvetica", fontSize=9, textColor=C_DGREY,
spaceAfter=1, leftIndent=12)
# ── Helper builders ───────────────────────────────────────────────────────────
def cover_banner(lines):
"""Dark navy banner for cover / chapter headers."""
data = [[Paragraph(l[0], l[1])] for l in lines]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING", (0,0), (-1,-1), 10),
("LEFTPADDING", (0,0), (-1,-1), 18),
("RIGHTPADDING", (0,0), (-1,-1), 18),
]))
return t
def chapter_header(text, subtitle=""):
items = []
data = [[Paragraph(text, sCh)]]
if subtitle:
data.append([Paragraph(subtitle, sNote)])
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 14),
("ROUNDEDCORNERS", [4,4,4,4]),
]))
items.append(t)
items.append(Spacer(1, 6))
return items
def section_box(heading, body_paras, accent=C_TEAL):
"""Teal-left-border box for a section."""
inner = [[Paragraph(heading, sH1)]] + [[p] for p in body_paras]
t = Table(inner, colWidths=[doc.width - 0.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_LIGHT),
("LINEAFTER", (0,0), (0,-1), 3, accent),
("LINEBEFORE", (0,0), (0,-1), 3, accent),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
return t
def amber_box(heading, body_paras):
inner = [[Paragraph(heading, S("_ah", fontName="Helvetica-Bold",
fontSize=9.5, textColor=C_NAVY))]] \
+ [[p] for p in body_paras]
t = Table(inner, colWidths=[doc.width - 0.6*cm])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_PALE),
("LINEBEFORE", (0,0), (0,-1), 3, C_AMBER),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
return t
def two_col_table(rows, col1_w=4*cm):
data = [[Paragraph(f"<b>{r[0]}</b>", S("_tc1", fontName="Helvetica-Bold",
fontSize=8.5, textColor=C_NAVY, leading=12)),
Paragraph(r[1], S("_tc2", fontName="Helvetica",
fontSize=8.5, textColor=C_DGREY, leading=12))]
for r in rows]
t = Table(data, colWidths=[col1_w, doc.width - col1_w])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_LGREY),
("ROWBACKGROUNDS",(0,0), (-1,-1), [C_WHITE, C_LGREY]),
("GRID", (0,0), (-1,-1), 0.5, C_BORDER),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def header_table(cols, data_rows, col_widths=None):
if col_widths is None:
w = doc.width / len(cols)
col_widths = [w] * len(cols)
header = [Paragraph(f"<b>{c}</b>", S("_th", fontName="Helvetica-Bold",
fontSize=8.5, textColor=C_WHITE)) for c in cols]
body = [[Paragraph(str(cell), S("_td", fontName="Helvetica",
fontSize=8, textColor=C_DGREY, leading=11)) for cell in row]
for row in data_rows]
t = Table([header]+body, colWidths=col_widths)
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1, 0), C_TEAL),
("ROWBACKGROUNDS",(0,1), (-1,-1), [C_WHITE, C_LGREY]),
("GRID", (0,0), (-1,-1), 0.5, C_BORDER),
("TOPPADDING", (0,0), (-1,-1), 3),
("BOTTOMPADDING", (0,0), (-1,-1), 3),
("LEFTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
]))
return t
def B(text): return Paragraph(f"<b>{text}</b>", sBody)
def P(text): return Paragraph(text, sBody)
def Bl(text): return Paragraph(f"• {text}", sBullet)
def H1(text): return Paragraph(text, sH1)
def H2(text): return Paragraph(text, sH2)
def H3(text): return Paragraph(text, sH3)
def N(text): return Paragraph(text, sNote)
def Tip(text):return Paragraph(f"✔ {text}", sTip)
def KW(text): return Paragraph(text, sKeyword)
def SP(n=4): return Spacer(1, n)
def HR(): return HRFlowable(width="100%", thickness=0.5, color=C_BORDER, spaceAfter=4)
# ════════════════════════════════════════════════════════════════════════════════
# BUILD CONTENT
# ════════════════════════════════════════════════════════════════════════════════
story = []
# ── COVER PAGE ────────────────────────────────────────────────────────────────
cover_data = [
[Paragraph("CLINICAL ORTHOPAEDICS", sTitle)],
[Paragraph("Complete Study Guide for Exam Revision", sSubtitle)],
[Paragraph("Bachelor of Physiotherapy (BPT) — 3rd & 4th Year", sSubtitle)],
[Paragraph("Tamil Nadu Dr. M.G.R. Medical University", sSubtitle)],
[Paragraph("2010 & 2018 Regulations", S("_reg", fontName="Helvetica",
fontSize=9, textColor=colors.HexColor("#AACFE8"), alignment=TA_CENTER))],
]
cover_t = Table(cover_data, colWidths=[doc.width])
cover_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), C_NAVY),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 20),
("ROUNDEDCORNERS",[6,6,6,6]),
]))
story.append(cover_t)
story.append(SP(12))
# Badge row
badge_data = [
[Paragraph("15-MARK ESSAYS", sBadge),
Paragraph("5-MARK SHORT NOTES", sBadge),
Paragraph("2-MARK ANSWERS", sBadge),
Paragraph("EXAM STRATEGIES", sBadge)]
]
badge_t = Table(badge_data, colWidths=[doc.width/4]*4)
badge_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), C_TEAL),
("BACKGROUND", (1,0), (1,0), C_RED),
("BACKGROUND", (2,0), (2,0), colors.HexColor("#6A1F8A")),
("BACKGROUND", (3,0), (3,0), C_AMBER),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("ROUNDEDCORNERS",[4,4,4,4]),
]))
story.append(badge_t)
story.append(SP(10))
# Guaranteed repeat topics mini-table
story.append(P("<b>GUARANTEED HIGH-PRIORITY TOPICS:</b>"))
story.append(SP(4))
story.append(header_table(
["Topic", "Expected Marks", "Priority"],
[
["PIVD / Prolapsed Lumbar Disc", "15 marks", "★★★"],
["Osteoarthritis of Knee", "15 marks", "★★★"],
["Rheumatoid Arthritis", "15 marks", "★★★"],
["Fracture Neck of Femur", "15 marks", "★★★"],
["Low Back Pain", "15 marks", "★★★"],
["Ankylosing Spondylitis", "5 or 15 marks", "★★★"],
["CTEV / Club Foot", "5 or 15 marks", "★★"],
["Colles' Fracture", "5 marks", "★★★"],
["Frozen Shoulder", "5 marks", "★★★"],
["Carpal Tunnel Syndrome", "5 marks", "★★"],
],
col_widths=[8*cm, 3.5*cm, 3*cm]
))
story.append(SP(10))
story.append(amber_box("📋 EXAM PATTERN", [
P("Duration: 3 Hours | Total: 100 Marks | 3rd Year Subject"),
two_col_table([
("Section A – Long Essay (15M)", "2 questions, attempt ALL — 30 marks total"),
("Section B – Short Notes (5M)", "10 questions, attempt ALL — 50 marks total"),
("Section C – Short Answers (2M)","10 questions, attempt ALL — 20 marks total"),
], col1_w=6*cm),
]))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════════
# SECTION A — 15-MARK LONG ESSAYS
# ════════════════════════════════════════════════════════════════════════════════
story += chapter_header("SECTION A — 15-MARK LONG ESSAY QUESTIONS",
"Structure each answer: Definition → Aetiology → Pathology → Clinical Features → Investigations → Management → PT Management → Complications")
# ── Q1: Fractures ─────────────────────────────────────────────────────────────
story.append(H1("Q1. Fractures — Pathology, Types, Clinical Features, Complications & Bone Healing"))
story.append(SP(3))
story.append(H2("Definition & Types"))
story.append(P("A <b>fracture</b> is a break in the continuity of bone, caused by direct/indirect trauma, pathological conditions, or stress."))
story.append(two_col_table([
("Transverse", "90° to long axis — stable"),
("Oblique", "Angled — less stable"),
("Spiral", "Twisting force — also oblique"),
("Comminuted", "Multiple fragments"),
("Greenstick", "Incomplete — children only"),
("Impacted", "Fragments driven together"),
("Stress", "Repetitive loading (march fracture)"),
("Pathological", "Through diseased bone"),
("Open", "Bone communicates with skin"),
("Closed", "Intact skin"),
], col1_w=3.5*cm))
story.append(SP(5))
story.append(H2("Stages of Bone Healing"))
story.append(header_table(
["Stage", "Timing", "Events"],
[
["1. Haematoma", "0–72 hrs", "Clot forms; inflammation; growth factors released"],
["2. Inflammatory", "Days 1–7", "Macrophages, fibroblasts invade; granulation tissue"],
["3. Soft Callus", "Weeks 2–3", "Fibrocartilage bridges gap (provisional callus)"],
["4. Hard Callus", "Weeks 3–12", "Endochondral ossification → woven bone"],
["5. Remodelling", "Months–years", "Woven → lamellar bone along stress lines (Wolff's Law)"],
],
col_widths=[3.5*cm, 3*cm, 8*cm]
))
story.append(SP(5))
story.append(H2("Clinical Features"))
for f in ["Pain & point tenderness","Swelling & bruising/ecchymosis","Deformity (shortening, angulation, rotation)",
"Loss of function","Abnormal mobility & crepitus","Neurovascular deficit (if vessels/nerves injured)"]:
story.append(Bl(f))
story.append(SP(4))
story.append(H2("Complications"))
story.append(header_table(
["Timing", "Complication", "Notes"],
[
["Immediate", "Haemorrhage, nerve/vessel injury, visceral injury", "Femur fracture → 1–2 L blood loss"],
["Early", "Compartment syndrome, fat embolism, DVT, infection", "Fat embolism: days 3–5, hypoxia + petechiae"],
["Late", "Delayed union, non-union, malunion, AVN, myositis ossificans, CRPS", "Myositis: avoid aggressive passive ROM"],
],
col_widths=[2.5*cm, 6*cm, 6*cm]
))
story.append(SP(5))
story.append(H2("PT Management"))
story.append(two_col_table([
("During immobilization", "Isometrics (quads, hams), breathing exercises, distal joint mobilization, elevation, oedema control"),
("Post-immobilization", "ROM exercises, progressive strengthening (isotonic → isokinetic), gait training, functional re-education"),
("Goals", "Prevent wasting, maintain mobility, restore function, prevent complications"),
], col1_w=4.5*cm))
story.append(SP(8))
# ── Q2: Femoral Shaft Fracture ────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q2. Fracture of Femur (Shaft) — PT Assessment & Management"))
story.append(P("<b>Clinical Features:</b> Severe thigh pain and swelling, shortening and lateral rotation, inability to weight-bear, significant blood loss (1–2 litres into thigh), haemodynamic instability possible."))
story.append(SP(3))
story.append(P("<b>Management:</b> Traction (skin/skeletal), ORIF with intramedullary nail (most common), external fixation for open fractures."))
story.append(SP(3))
story.append(H2("PT Assessment"))
for item in ["Pain — VAS scale", "ROM — hip, knee, ankle", "Muscle strength — MRC grading",
"Limb girth measurement (swelling)", "Gait analysis", "Vascular & neurological status"]:
story.append(Bl(item))
story.append(H2("PT Management — During Immobilization"))
for item in ["Foot and ankle pumps (DVT prevention)", "Isometric quadriceps, hamstring, gluteal sets",
"Deep breathing, coughing exercises", "Positioning to prevent contractures",
"Upper limb strengthening for crutch preparation"]:
story.append(Bl(item))
story.append(H2("PT Management — Post-Immobilization"))
story.append(two_col_table([
("Week 1–2", "AROM exercises, transfers, standing with frame (NWB)"),
("Week 2–6", "Progressive weight-bearing (NWB → PWB → FWB), stair training"),
("Week 6+", "Strengthening, proprioception, return to functional activities"),
("Hydrotherapy","Early weight-bearing in buoyancy-assisted environment"),
], col1_w=3.5*cm))
story.append(SP(8))
# ── Q3: Colles' Fracture ──────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q3. Colles' Fracture"))
story.append(two_col_table([
("Definition", "Fracture of distal radius within 2.5 cm of wrist joint with dorsal displacement — 'dinner fork' deformity"),
("Mechanism", "FOOSH (Fall On OutStretched Hand) with wrist in dorsiflexion; most common in post-menopausal women (osteoporosis)"),
("Deformity", "Dorsal displacement & tilt, radial shortening, radial deviation of hand"),
], col1_w=3.5*cm))
story.append(SP(4))
story.append(H2("Complications (CAVE mnemonic — Colles')"))
for c in ["Malunion (most common)", "Carpal Tunnel Syndrome (median nerve compression)",
"Sudeck's dystrophy / CRPS", "Stiffness of fingers and shoulder",
"Rupture of Extensor Pollicis Longus tendon", "Wrist instability"]:
story.append(Bl(c))
story.append(H2("Management"))
story.append(two_col_table([
("Undisplaced", "Below-elbow POP cast for 6 weeks"),
("Displaced", "Closed reduction under anaesthesia + cast"),
("Unstable/comm.", "ORIF with volar locking plate or external fixator"),
], col1_w=3.5*cm))
story.append(H2("PT Management"))
story.append(two_col_table([
("Immediately", "Finger exercises, shoulder & elbow mobilization, elevation, oedema control"),
("After cast off", "Wrist ROM (flexion/extension, pronation/supination), grip strengthening"),
("Advanced", "Functional retraining, ADL rehabilitation, ergonomics"),
("Electrotherapy", "TENS, ultrasound for pain & oedema"),
], col1_w=3.5*cm))
story.append(SP(8))
# ── Q4: Fracture Neck of Femur ────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q4. Fracture Neck of Femur"))
story.append(H2("Garden's Classification"))
story.append(header_table(
["Grade", "Description", "Treatment"],
[
["I", "Incomplete, impacted (valgus)", "Internal fixation (cannulated screws)"],
["II", "Complete, undisplaced", "Internal fixation (DHS/cannulated screws)"],
["III","Complete, partial displacement", "Hemiarthroplasty (Austin Moore/bipolar)"],
["IV", "Complete, full displacement", "THR (younger) or Hemiarthroplasty (elderly)"],
],
col_widths=[1.5*cm, 7*cm, 6*cm]
))
story.append(SP(4))
story.append(P("<b>Key concern:</b> Blood supply to femoral head (medial circumflex femoral artery — retinacular vessels) is disrupted → risk of AVN."))
story.append(P("<b>Clinical features:</b> Hip pain, <b>shortening and external rotation</b> of limb, inability to weight-bear."))
story.append(SP(4))
story.append(H2("Post-op PT Precautions (THR/Hemiarthroplasty — Posterior Approach)"))
for p in ["No hip flexion > 90°", "No internal rotation", "No adduction beyond midline",
"Use raised toilet seat, long-handled shoe horn, abduction pillow"]:
story.append(Bl(p))
story.append(H2("Post-op PT Protocol"))
story.append(two_col_table([
("Day 1–2", "Ankle pumps, isometrics, breathing exercises, bed mobility"),
("Day 3–5", "Transfers, standing with frame, NWB/TTWB"),
("Week 2", "Progressive gait training, hip ROM (within precautions)"),
("Week 6–12", "Strengthening, stairs, functional activities, return to community"),
], col1_w=3.5*cm))
story.append(SP(8))
# ── Q5: SCI ───────────────────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q5. Spinal Cord Injury — PT Management of Paraplegia / Quadriplegia"))
story.append(H2("ASIA Impairment Scale"))
story.append(header_table(
["Grade", "Description"],
[
["A – Complete", "No motor/sensory function below injury level"],
["B – Sensory Inc.", "Sensory preserved, no motor below S4–S5"],
["C – Motor Inc.", "Motor preserved but < 3/5 in key muscles below"],
["D – Motor Inc.", "Motor preserved, ≥ 3/5 in key muscles below"],
["E – Normal", "Normal motor and sensory function"],
],
col_widths=[4*cm, 10.5*cm]
))
story.append(SP(4))
story.append(H2("Functional Levels"))
story.append(two_col_table([
("C1–C4", "Ventilator-dependent; require power wheelchair, no independent transfers"),
("C5–C6", "Shoulder & elbow function; manual wheelchair with adapted equipment"),
("C7–C8", "Near-independent with wheelchair; hand function limited"),
("T1–T9", "Complete paraplegia; independent wheelchair; KAFO gait with crutches possible"),
("T10–L1","Lower paraplegia; household ambulation with KAFOs"),
("L2–S5", "Variable lower limb; community ambulation with AFOs or crutches"),
], col1_w=2*cm))
story.append(SP(4))
story.append(H2("Complications to Monitor"))
for c in ["Pressure sores (reposition every 2 hours)","Autonomic dysreflexia (above T6) — emergency",
"Respiratory compromise (cervical injuries)","Neurogenic bladder/UTI","DVT/PE",
"Spasticity, heterotopic ossification, contractures","Depression, adjustment disorder"]:
story.append(Bl(c))
story.append(H2("PT Management"))
story.append(two_col_table([
("Acute", "Positioning, passive ROM, respiratory PT, skin care, family education"),
("Rehab", "Strengthening (preserved muscles), bed mobility, transfers, wheelchair skills, gait training"),
("Quadriplegics","Mobile arm supports, tenodesis splints, BFO, power wheelchair"),
("Advanced", "FES, hydrotherapy, vocational rehabilitation, community integration"),
], col1_w=3.5*cm))
story.append(PageBreak())
# ── Q6: OA Knee ───────────────────────────────────────────────────────────────
story += chapter_header("SECTION A — JOINTS & DEGENERATIVE CONDITIONS (Continued)")
story.append(H1("Q6. Osteoarthritis of Knee"))
story.append(H2("Pathology (Sequential Steps)"))
story.append(two_col_table([
("Step 1","Cartilage matrix degradation — loss of proteoglycans, collagen breakdown"),
("Step 2","Chondrocyte death"),
("Step 3","Subchondral bone sclerosis and cyst formation"),
("Step 4","Osteophyte (bone spur) formation at joint margins"),
("Step 5","Secondary synovial membrane inflammation"),
], col1_w=2*cm))
story.append(SP(4))
story.append(H2("Clinical Features"))
for f in ["Insidious knee pain worse on activity, better with rest",
"Morning stiffness < 30 minutes (distinguishes from RA)",
"Crepitus, joint line tenderness, bony enlargement",
"Varus deformity (medial compartment most common)",
"Quadriceps wasting, joint effusion, restricted ROM"]:
story.append(Bl(f))
story.append(SP(3))
story.append(H2("Kellgren-Lawrence X-ray Grading"))
story.append(header_table(
["Grade", "X-ray Findings"],
[
["0","Normal"],
["1","Doubtful narrowing, possible osteophytes"],
["2","Definite osteophytes, possible joint space narrowing"],
["3","Multiple osteophytes, definite narrowing, sclerosis"],
["4","Large osteophytes, severe narrowing, bone-on-bone"],
],
col_widths=[2.5*cm, 12*cm]
))
story.append(SP(4))
story.append(H2("PT Management"))
story.append(two_col_table([
("Pain relief", "TENS, ultrasound, SWD, hot packs, ice for acute flare"),
("Exercise", "Quad sets, SLR, terminal knee extension, cycling, hydrotherapy, VMO strengthening"),
("Manual therapy","Patellar mobilization, tibiofemoral joint mobilization"),
("Education", "Joint protection, activity modification, weight management, knee hygiene"),
("Orthoses", "Knee brace, medial wedge insoles for varus deformity"),
], col1_w=3.5*cm))
story.append(SP(8))
# ── Q7: Rheumatoid Arthritis ──────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q7. Rheumatoid Arthritis (RA)"))
story.append(two_col_table([
("Definition", "Systemic autoimmune inflammatory disease primarily affecting synovial joints symmetrically"),
("Genetics", "HLA-DR4, HLA-DR1 associated"),
("Serology", "RA factor (70-80%), Anti-CCP (>95% specific — gold standard)"),
], col1_w=3.5*cm))
story.append(SP(3))
story.append(H2("Pathology"))
for step in ["Synovial membrane inflammation (synovitis)",
"Pannus formation (aggressive granulation tissue covers cartilage)",
"Pannus erodes cartilage and bone",
"Fibrous then bony ankylosis",
"Characteristic joint deformities"]:
story.append(Bl(step))
story.append(H2("Characteristic Deformities"))
story.append(header_table(
["Deformity", "Description", "Cause"],
[
["Ulnar deviation", "Fingers deviate ulnarly at MCP joints", "Intrinsic muscle imbalance"],
["Swan neck", "PIP hyperextension + DIP flexion", "Intrinsic tightness / volar plate laxity"],
["Boutonniere", "PIP flexion + DIP hyperextension", "Central slip rupture"],
["Z-deformity (thumb)", "IP hyperextension + MCP flexion", "Intrinsic + extrinsic imbalance"],
],
col_widths=[3.5*cm, 5.5*cm, 5.5*cm]
))
story.append(SP(4))
story.append(H2("Medical Management"))
story.append(two_col_table([
("NSAIDs", "Symptom relief only"),
("DMARDs", "Methotrexate (first line), Sulfasalazine, Hydroxychloroquine"),
("Biologics", "Anti-TNF (Etanercept, Infliximab), Rituximab, Abatacept — for DMARDs failure"),
("Steroids", "Short-term bridges to DMARD effect"),
], col1_w=3.5*cm))
story.append(H2("PT Management"))
story.append(two_col_table([
("Acute phase", "Rest, resting splints, gentle ROM, ice/heat"),
("Subacute", "Active ROM, strengthening, hydrotherapy"),
("Joint protection","Avoid prolonged grip, use larger joints, ergonomic tools, pacing"),
("Splints", "Resting wrist splints (night), working splints (day)"),
("ADL", "Adaptive devices, energy conservation techniques"),
], col1_w=3.5*cm))
story.append(SP(8))
# ── Q8: PIVD ─────────────────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q8. PIVD / Prolapsed Lumbar Disc (PLID) — High Priority ★★★"))
story.append(H2("Neurological Signs by Level"))
story.append(header_table(
["Disc Level", "Nerve Root", "Motor Loss", "Sensory Loss", "Reflex Lost"],
[
["L3–L4", "L4", "Tibialis anterior, quadriceps", "Medial leg & foot", "Knee jerk"],
["L4–L5", "L5", "EHL (big toe extension)", "Dorsum of foot", "No reflex change"],
["L5–S1", "S1", "Plantar flexors (gastrocnemius)", "Lateral foot & sole", "Ankle jerk"],
],
col_widths=[2.5*cm, 2.5*cm, 4*cm, 4*cm, 2.5*cm]
))
story.append(SP(4))
story.append(H2("Clinical Diagnosis"))
for item in ["SLR (Lasegue's test) positive < 60° = nerve root irritation",
"Crossed SLR positive = severe central disc protrusion",
"Bowstring sign: popliteal pressure reproduces sciatica",
"Neurological deficits (motor weakness, sensory loss, reflexes)"]:
story.append(Bl(item))
story.append(SP(3))
story.append(amber_box("⚠ CAUDA EQUINA SYNDROME — SURGICAL EMERGENCY", [
P("Bilateral leg pain/weakness + <b>saddle area anaesthesia</b> + <b>urinary retention</b> + bowel dysfunction"),
P("→ Immediate MRI + emergency discectomy. DO NOT delay."),
]))
story.append(SP(4))
story.append(H2("PT Management"))
story.append(two_col_table([
("Acute phase", "McKenzie extension exercises, lumbar traction, hot/cold, TENS, relative rest"),
("Subacute/Chronic", "Core stabilization (TA, multifidus), pelvic tilts, neural mobilization"),
("Education", "Lumbar support, ergonomics, proper lifting technique, posture correction"),
("McKenzie approach", "Repeated end-range movements based on centralization of symptoms"),
], col1_w=4*cm))
story.append(PageBreak())
# ── Q9: Ankylosing Spondylitis ────────────────────────────────────────────────
story += chapter_header("SECTION A — SPINE CONDITIONS (Continued)")
story.append(H1("Q9. Ankylosing Spondylitis (AS)"))
story.append(two_col_table([
("Definition", "Chronic seronegative inflammatory arthropathy primarily of axial skeleton"),
("Key feature", "HLA-B27 positive in 90-95% of patients"),
("Onset", "Young males < 30 years; insidious onset"),
("Starts at", "Sacroiliac joints (sacroiliitis) → progresses up the spine"),
], col1_w=3.5*cm))
story.append(SP(3))
story.append(H2("Progression of Pathology"))
for s in ["Sacroiliac joint inflammation (sacroiliitis)",
"Enthesitis at ligament-bone junctions of spine",
"Ossification of annulus fibrosus → syndesmophytes",
"Complete ossification → BAMBOO SPINE",
"Total loss of spinal mobility"]:
story.append(Bl(s))
story.append(SP(3))
story.append(H2("Clinical Features & Investigations"))
story.append(two_col_table([
("Symptom", "Inflammatory back pain: worse at rest/morning, better with activity"),
("Morning stiffness", "> 1 hour"),
("Schober's test", "< 5 cm lumbar flexion increase = positive (abnormal)"),
("Chest expansion", "< 5 cm = reduced (rib cage involvement)"),
("Posture", "'Question mark' posture in advanced cases"),
("Extra-articular", "Anterior uveitis (25%), aortitis, pulmonary fibrosis"),
("X-ray", "Sacroiliac erosion/fusion, bamboo spine, squaring of vertebral bodies"),
("MRI", "Early sacroiliitis before X-ray changes"),
], col1_w=4*cm))
story.append(SP(4))
story.append(amber_box("★ PT IS THE CORNERSTONE OF AS MANAGEMENT", [
two_col_table([
("Breathing", "Diaphragmatic + lateral costal expansion — DAILY"),
("Extension ex.", "Spinal extension exercises to counteract flexion deformity"),
("Posture", "Chin tucks, wall standing, daily postural correction"),
("Swimming", "Excellent — non-weight bearing, promotes extension"),
("Sleeping", "Firm mattress, no pillow under head, prone lying"),
("Avoid", "Prolonged flexed postures, contact sports"),
], col1_w=4*cm),
]))
story.append(SP(8))
# ── Q10: Low Back Pain ────────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q10. Low Back Pain (LBP)"))
story.append(H2("Red Flags — TUNA FISH"))
story.append(header_table(
["Letter", "Red Flag"],
[
["T", "Trauma"],
["U", "Under 20 / Over 55 years age"],
["N", "Night pain (constant, progressive)"],
["A", "Age-related risk factors"],
["F", "Fever, weight loss"],
["I", "Incontinence (cauda equina — emergency)"],
["S", "Systemic illness, steroids use"],
["H", "History of cancer"],
],
col_widths=[2*cm, 12.5*cm]
))
story.append(SP(4))
story.append(H2("Common Causes"))
story.append(two_col_table([
("Mechanical (85%)", "Muscle strain, ligament sprain, disc herniation, facet arthropathy, spondylolisthesis"),
("Inflammatory", "Ankylosing spondylitis, reactive arthritis"),
("Infective", "Pott's disease (TB), osteomyelitis, discitis"),
("Neoplastic", "Metastases (most common malignant), multiple myeloma"),
("Metabolic", "Osteoporosis, Paget's disease"),
("Referred", "Renal stones, aortic aneurysm, gynaecological causes"),
], col1_w=3.5*cm))
story.append(SP(4))
story.append(H2("Conservative PT Management"))
story.append(two_col_table([
("Acute (0–6 wk)", "Relative rest, NSAIDs, TENS, IFT, gentle movement — NO strict bed rest"),
("Subacute/Chronic", "Core stabilization, McKenzie approach, manual therapy (if no contraindications)"),
("Education", "Back hygiene, posture, ergonomics, lifting technique"),
("Psychological", "CBT-based approach for chronic LBP with fear-avoidance beliefs"),
("Exercise", "Aerobic conditioning, lumbar stabilization, neural mobilization"),
], col1_w=4*cm))
story.append(PageBreak())
# ── Q11: Cervical Spondylosis ─────────────────────────────────────────────────
story += chapter_header("SECTION A — SPINE & BONE CONDITIONS (Continued)")
story.append(H1("Q11. Cervical Spondylosis"))
story.append(H2("Radiculopathy vs Myelopathy"))
story.append(header_table(
["Feature", "Radiculopathy", "Myelopathy"],
[
["Cause", "Neural foraminal narrowing", "Spinal canal narrowing"],
["Symptoms", "Arm pain, dermatomal tingling", "Clumsy hands, gait disturbance"],
["Signs", "Reduced reflexes (LMN)", "Hyperreflexia, Babinski positive (UMN)"],
["Treatment","Conservative / injections", "Usually surgical (laminectomy/ACDF)"],
],
col_widths=[3*cm, 6.5*cm, 6*cm]
))
story.append(SP(4))
story.append(H2("Nerve Root Levels"))
story.append(two_col_table([
("C5–C6 (C6 root)", "Lateral forearm, thumb, index; reduced biceps jerk"),
("C6–C7 (C7 root)", "Middle finger; reduced triceps jerk"),
("C7–T1 (C8 root)", "Medial forearm, little finger; no standard reflex change"),
], col1_w=4.5*cm))
story.append(H2("PT Management"))
for item in ["Intermittent cervical traction (for radiculopathy)",
"Isometric neck exercises, cervical ROM exercises",
"Postural correction (chin tuck, thoracic extension)",
"Neural mobilization (median, radial nerve mobilization)",
"Heat, TENS, ultrasound for pain relief",
"Cervical stabilization program",
"Ergonomic advice (workstation, pillow height)"]:
story.append(Bl(item))
story.append(SP(8))
# ── Q12: Scoliosis ───────────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q12. Scoliosis"))
story.append(two_col_table([
("Definition", "Lateral spinal curvature > 10° on Cobb's angle measurement, with vertebral rotation"),
("Structural", "True vertebral rotation + rib hump; does NOT correct on forward bending"),
("Non-structural","No vertebral rotation; corrects on bending/lying; caused by leg length discrepancy or muscle spasm"),
], col1_w=3.5*cm))
story.append(SP(3))
story.append(H2("Cobb's Angle Measurement"))
story.append(P("1. Identify the most tilted vertebra at TOP (upper end vertebra) and BOTTOM (lower end vertebra)."))
story.append(P("2. Draw lines parallel to their end-plates."))
story.append(P("3. Measure the angle between perpendiculars to these lines = Cobb's angle."))
story.append(SP(3))
story.append(H2("Bracing Guidelines"))
story.append(header_table(
["Cobb's Angle", "Skeletal Maturity", "Management"],
[
["< 25°", "Any", "Observation, exercises"],
["25–45°", "Risser 0–2 (immature)", "Bracing 18–23 hrs/day (Boston/Milwaukee)"],
["45–50°+", "Any", "Surgical spinal fusion with instrumentation"],
],
col_widths=[3*cm, 5*cm, 6.5*cm]
))
story.append(SP(3))
story.append(H2("Braces"))
story.append(two_col_table([
("Milwaukee brace", "CTLSO — for high thoracic curves (apex T7 or above)"),
("Boston/TLSO", "For thoracolumbar/lumbar curves — more cosmetically accepted"),
], col1_w=4*cm))
story.append(H2("PT Management (Schroth Method)"))
for item in ["3D scoliosis-specific breathing and postural correction exercises",
"Rotational breathing into concavity",
"Postural awareness and muscle activation",
"Core stabilization, proprioceptive training",
"Brace compliance education and monitoring"]:
story.append(Bl(item))
story.append(SP(8))
# ── Q13: Pott's Disease ──────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q13. Tuberculosis of Spine (Pott's Disease)"))
story.append(two_col_table([
("Common level", "T10–L1 (thoracolumbar junction), then lumbar spine"),
("Spread", "Haematogenous from primary focus (lungs, lymph nodes)"),
("Deformity", "Gibbus deformity (angular kyphosis from vertebral collapse)"),
("Cold abscess", "Pus tracks to paravertebral → psoas abscess → groin/thigh swelling"),
("Complication", "Pott's paraplegia (UMN signs if cord compression)"),
], col1_w=3.5*cm))
story.append(SP(3))
story.append(H2("Anti-TB Treatment"))
story.append(P("<b>H</b>isoniazid + <b>R</b>ifampicin + <b>Z</b>yrazinamide + <b>E</b>thambutol"))
story.append(P("2 months HRZE (intensive) → 10–16 months HR (continuation phase)"))
story.append(H2("PT Management"))
for item in ["Respiratory physiotherapy (pulmonary TB component)",
"Postural exercises — prevent increasing kyphosis",
"Spinal extension exercises (after brace period)",
"SCI-protocol rehabilitation if Pott's paraplegia present",
"Core and paraspinal muscle strengthening",
"Activity modification and patient education"]:
story.append(Bl(item))
story.append(SP(8))
# ── Q14: Osteomyelitis ───────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q14. Osteomyelitis"))
story.append(H2("Key Pathological Terms"))
story.append(header_table(
["Term", "Definition"],
[
["Sequestrum", "Dead (avascular) bone segment that becomes separated"],
["Involucrum", "New periosteal bone formed surrounding the sequestrum"],
["Cloaca", "Opening in involucrum through which pus discharges"],
["Sinus tract","Chronic discharging track from bone to skin surface"],
],
col_widths=[3.5*cm, 11*cm]
))
story.append(SP(3))
story.append(H2("Clinical Features"))
story.append(two_col_table([
("Acute", "High fever, severe localized bone pain and tenderness, swelling, warmth, child refuses to use limb; metaphysis (distal femur, proximal tibia most common)"),
("Chronic", "Low-grade pain, discharging sinus, palpable sequestrum, systemic features mild"),
], col1_w=2.5*cm))
story.append(H2("PT Management"))
story.append(two_col_table([
("Acute", "Splint in functional position, elevation, pain management, respiratory PT for bedridden"),
("Recovery", "Gentle ROM, progressive weight-bearing once healing confirmed, contralateral limb maintenance"),
("Chronic", "Post-surgery ROM, strengthening, gait rehabilitation, scar management"),
], col1_w=3*cm))
story.append(PageBreak())
# ── Q15: Bone Tumours ────────────────────────────────────────────────────────
story += chapter_header("SECTION A — PAEDIATRIC & CONGENITAL CONDITIONS (Continued)")
story.append(H1("Q15. Bone Tumours"))
story.append(H2("Osteosarcoma vs Ewing's Sarcoma"))
story.append(header_table(
["Feature", "Osteosarcoma", "Ewing's Sarcoma"],
[
["Age", "2nd decade (adolescents)", "5–15 years"],
["Location", "Metaphysis — distal femur, proximal tibia (around knee)", "Diaphysis — long bones, flat bones (pelvis, ribs)"],
["X-ray", "'Sunburst' pattern + Codman's triangle", "'Onion peel' periosteal reaction"],
["Mimics", "—", "Can mimic osteomyelitis (fever, swelling)"],
["Treatment", "Chemo (neoadjuvant) + wide resection + chemo (adjuvant)", "Chemo + radiation +/- surgery"],
],
col_widths=[3*cm, 6*cm, 6*cm]
))
story.append(SP(4))
story.append(H2("Metastatic Bone Tumours (Most Common)"))
story.append(P("<b>Mnemonic — BPL Thank God:</b> <b>B</b>reast, <b>P</b>rostate, <b>L</b>ung, <b>T</b>hyroid, <b>K</b>idney"))
story.append(H2("PT Management"))
story.append(two_col_table([
("Pre-operative", "Strengthen adjacent muscles, ROM, respiratory PT"),
("Post-op (limb salvage)", "Progressive ROM + strengthening, scar management, oedema control"),
("Post-amputation", "Stump care, desensitization, prosthetic training, gait training"),
("All patients", "Fall prevention, assistive devices, pain management, psychological support"),
], col1_w=4.5*cm))
story.append(SP(8))
# ── Q16: CTEV ────────────────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q16. CTEV / Club Foot (Congenital Talipes Equinovarus)"))
story.append(amber_box("CAVE Mnemonic — 4 Components of Club Foot", [
two_col_table([
("C — Cavus", "High arch of the foot"),
("A — Adductus", "Forefoot adduction (medial deviation)"),
("V — Varus", "Hindfoot varus / inversion"),
("E — Equinus", "Plantar flexion — inability to dorsiflex"),
], col1_w=4*cm),
]))
story.append(SP(4))
story.append(H2("Ponseti Method (Gold Standard)"))
story.append(header_table(
["Step", "Action"],
[
["1. Serial casting", "Weekly casts for 5–8 weeks — correct deformities in order: Cavus → Adductus → Varus → Equinus"],
["2. Achilles tenotomy", "Percutaneous tenotomy in 90% of cases to correct residual equinus"],
["3. Bracing", "Dennis Browne bar / foot abduction brace: 3 months full-time, then nights/naps until age 4–5 years"],
],
col_widths=[3.5*cm, 11*cm]
))
story.append(SP(4))
story.append(H2("PT Management"))
story.append(two_col_table([
("Infants", "Stretching (dorsiflexion, abduction, eversion), gentle manipulation before each cast"),
("After casting", "Passive stretching, peroneal muscle stimulation"),
("Post-operative", "Wound care, splinting, gradual ROM"),
("Older children", "Gait training, strengthening, balance exercises"),
("Parent education","Brace compliance (critical for relapse prevention), home stretching"),
], col1_w=4*cm))
story.append(SP(8))
# ── Q17: DDH ─────────────────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q17. CDH / DDH — Congenital/Developmental Dysplasia of Hip"))
story.append(H2("Clinical Tests"))
story.append(header_table(
["Test", "Technique", "Positive Finding"],
[
["Ortolani (Reduction)", "Gentle abduction + forward trochanter pressure", "'Clunk' as dislocated head reduces back"],
["Barlow (Provocation)", "Adduction + gentle posterior pressure", "Dislocatable hip — 'clunk' as head dislocates"],
["Galeazzi / Allis", "Hips & knees flexed supine — compare knee heights","Asymmetric knee height (shorter on affected side)"],
["Trendelenburg", "Single-leg stance on affected side", "Pelvis drops on contralateral side"],
],
col_widths=[4*cm, 5.5*cm, 5*cm]
))
story.append(SP(4))
story.append(H2("Management by Age"))
story.append(two_col_table([
("0–6 months", "Pavlik harness — 90° flexion, 50–70° abduction (Ramsey position)"),
("6–18 months", "Closed reduction under GA + hip spica cast"),
("18 months–3 yr", "Open reduction + Salter/Pemberton osteotomy + hip spica"),
("> 3 years", "Complex reconstructive surgery; poor outcome if untreated"),
], col1_w=4*cm))
story.append(PageBreak())
# ── Q18: Polio ────────────────────────────────────────────────────────────────
story += chapter_header("SECTION A — POLIOMYELITIS & GAIT (Continued)")
story.append(H1("Q18. Poliomyelitis"))
story.append(H2("Key Characteristics"))
story.append(two_col_table([
("Causative agent", "Poliovirus (Enterovirus) — oral–fecal transmission"),
("Pathology", "Destruction of anterior horn cells (LMN) → flaccid paralysis"),
("Paralysis type", "Flaccid, asymmetric, spotty; sensation PRESERVED; bladder/bowel spared"),
], col1_w=4*cm))
story.append(H2("Stages"))
story.append(header_table(
["Stage", "Features"],
[
["Pre-paralytic", "Fever, headache, vomiting, neck stiffness (meningeal irritation)"],
["Paralytic", "Asymmetric flaccid paralysis; LMN signs (hypotonia, areflexia, wasting)"],
["Convalescent", "Recovery of unaffected neurons (up to 24 months); muscle recovery possible"],
["Residual paralysis","Permanent deficits; deformities develop over time"],
],
col_widths=[4*cm, 10.5*cm]
))
story.append(SP(4))
story.append(H2("Tendon Transfer Prerequisites"))
for p in ["Donor muscle must be grade ≥ 4/5 strength (loses one grade after transfer)",
"Joint must have adequate passive ROM",
"At least one functional antagonist must be present",
"One tendon transfer = one function only",
"Synergistic muscles work better than antagonistic"]:
story.append(Bl(p))
story.append(H2("PT Management"))
story.append(two_col_table([
("Acute", "Rest, splinting to prevent deformity, passive ROM, pain management"),
("Convalescent", "Hydrotherapy, active exercises, EMG biofeedback"),
("Residual", "Strengthen preserved muscles, orthotic prescription (AFO/KAFO), gait training"),
("Post-transfer","Motor re-education, progressive strengthening of new tendon function"),
("Post-polio", "Energy conservation, pacing, avoid overuse of preserved muscles"),
], col1_w=3.5*cm))
story.append(SP(8))
# ── Q19: Gait ────────────────────────────────────────────────────────────────
story.append(HR())
story.append(H1("Q19. Gait Analysis"))
story.append(H2("Normal Gait Cycle"))
story.append(P("One complete gait cycle = heel strike of the SAME foot to the next heel strike of the SAME foot"))
story.append(header_table(
["Phase", "% of Cycle", "Sub-phases"],
[
["Stance", "60%", "Initial contact → Loading response → Midstance → Terminal stance → Pre-swing"],
["Swing", "40%", "Initial swing (acceleration) → Mid swing → Terminal swing (deceleration)"],
],
col_widths=[3*cm, 2.5*cm, 9*cm]
))
story.append(SP(4))
story.append(H2("Common Gait Deviations"))
story.append(header_table(
["Gait Deviation", "Cause", "PT Management"],
[
["Trendelenburg (trunk lurch to affected)", "Weak gluteus medius (hip abductors)", "Hip abductor strengthening"],
["High-stepping / Steppage", "Foot drop (LMN — peroneal nerve)", "AFO, tibialis anterior ex."],
["Antalgic (limp)", "Pain in limb", "Treat underlying cause"],
["Scissor gait", "Spastic hip adductors (CP, MS)", "Stretching, BTX-A"],
["Hemiplegic", "UMN lesion (stroke)", "Spasticity management, AFO"],
["Waddling (bilateral lurch)", "Bilateral hip abductor weakness", "Strengthening, treat cause"],
],
col_widths=[4.5*cm, 4.5*cm, 5.5*cm]
))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════════
# SECTION B — 5-MARK SHORT NOTES
# ════════════════════════════════════════════════════════════════════════════════
story += chapter_header("SECTION B — 5-MARK SHORT NOTES",
"Each answer: Definition → Pathology/Mechanism → Clinical Features → Management/PT")
story.append(H1("FRACTURES & RELATED"))
story.append(H2("Monteggia Fracture-Dislocation"))
story.append(P("<b>Definition:</b> Fracture of proximal ulna with dislocation of the radial head. Bado classification: Type I (anterior), II (posterior), III (lateral), IV (both bones fracture). Management: ORIF of ulna + closed reduction of radial head."))
story.append(SP(3))
story.append(H2("Galeazzi Fracture"))
story.append(P("<b>Definition:</b> Fracture of distal radius + dislocation of distal radioulnar joint (DRUJ). Called 'Reverse Monteggia.' Management: ORIF of radius + DRUJ stabilization."))
story.append(SP(3))
story.append(H2("Compartment Syndrome"))
story.append(two_col_table([
("Definition", "Raised pressure within closed fascial compartment compromising blood flow"),
("Classic 5 P's","Pain (disproportionate, on passive stretch), Paresthesia, Paralysis, Pallor, Pulselessness"),
("Normal ICP", "< 30 mmHg; treat if > 30 mmHg or within 30 mmHg of diastolic BP"),
("Management", "EMERGENCY FASCIOTOMY — do not delay"),
("PT (post-fasciotomy)", "ROM exercises, scar management, strengthening, oedema control"),
], col1_w=4.5*cm))
story.append(SP(3))
story.append(H2("Stress Fracture"))
story.append(P("<b>Definition:</b> Fracture from repetitive mechanical loading (fatigue) in normal bone. Common sites: 2nd metatarsal (march fracture), tibia, fibula, navicular. Diagnosis: Bone scan / MRI (X-ray often normal early). Management: Rest, activity modification, gradual return."))
story.append(SP(3))
story.append(H2("Pathological Fracture"))
story.append(P("<b>Definition:</b> Fracture through abnormal/diseased bone with minimal trauma. Causes: Metastases (most common), osteoporosis, primary tumour, Paget's, osteomyelitis. Management: Fix underlying cause + fracture stabilization (IM nail if > 50% cortical involvement)."))
story.append(SP(5))
story.append(H1("UPPER LIMB CONDITIONS"))
story.append(H2("Frozen Shoulder (Adhesive Capsulitis)"))
story.append(two_col_table([
("Phases", "Freezing (pain) → Frozen (stiffness) → Thawing (resolution)"),
("Key feature", "Global restriction of all shoulder movements; ER most restricted first"),
("Risk factors", "Diabetes (most common association), thyroid disease, immobilization"),
("X-ray", "Normal — important to rule out other pathology"),
("Management", "NSAIDs, steroid injection, MUA; PT: pendular exercises, Maitland mobilizations, stretching"),
], col1_w=3.5*cm))
story.append(SP(3))
story.append(H2("Tennis Elbow (Lateral Epicondylitis)"))
story.append(P("<b>Structure:</b> ECRB (Extensor Carpi Radialis Brevis) most commonly affected at lateral epicondyle. <b>Tests:</b> Cozen's test, Mill's test. <b>PT:</b> Eccentric wrist extensor exercises, counterforce brace, TENS, ultrasound."))
story.append(SP(3))
story.append(H2("Carpal Tunnel Syndrome"))
story.append(two_col_table([
("Nerve", "Median nerve compressed in carpal tunnel"),
("Common causes", "Pregnancy, hypothyroidism, diabetes, RA, wrist fracture"),
("Features", "Tingling at night in lateral 3.5 fingers, thenar wasting (late), weak pinch"),
("Phalen's test", "Wrist flexion for 60 sec → tingling in median distribution"),
("Tinel's sign", "Percussion over carpal tunnel → distal tingling"),
("Gold standard Dx","NCS — prolonged distal motor latency"),
("Management", "Neutral wrist splint (night), steroid injection; Surgical carpal tunnel release"),
("PT", "Nerve gliding exercises, tendon gliding, ergonomics"),
], col1_w=4*cm))
story.append(SP(5))
story.append(H1("LOWER LIMB CONDITIONS"))
story.append(H2("Meniscal Injuries"))
story.append(two_col_table([
("Mechanism", "Twisting on flexed weight-bearing knee; medial more common (less mobile)"),
("Features", "Joint line pain, locking (bucket handle), clicking, effusion, restricted extension"),
("McMurray's test","Flex + extend while rotating tibia → click/pain at joint line"),
("Apley's grind", "Prone, knee 90°, compression + rotation → meniscal pain"),
("MRI", "Gold standard for diagnosis"),
("Management", "Small peripheral — conservative; Bucket handle — arthroscopic repair/meniscectomy"),
], col1_w=4*cm))
story.append(SP(3))
story.append(H2("ACL Injury"))
story.append(two_col_table([
("Mechanism", "Non-contact cutting/twisting, deceleration; valgus + external rotation"),
("Features", "'Pop' + immediate haemarthrosis + instability"),
("Lachman test", "Knee 20–30° flexion, anterior tibial draw — most sensitive test"),
("Pivot shift", "Most specific test for functional instability"),
("Management", "Conservative (lower demand) / ACL reconstruction with autograft (active)"),
], col1_w=4*cm))
story.append(SP(3))
story.append(H2("Plantar Fasciitis"))
story.append(P("<b>Features:</b> Heel pain worst with first steps in morning, improves with activity (post-static dyskinesia). Tender at medial calcaneal tubercle. Management: Plantar fascia + Achilles stretching, orthotics, night splints, ESWT, steroid injection."))
story.append(SP(3))
story.append(H2("Legg-Calve-Perthes Disease"))
story.append(P("<b>Definition:</b> Idiopathic AVN of femoral head in children (age 4–10, males 4:1). Features: Limp, hip pain, restricted IR and abduction. Management: Containment (Petrie cast, osteotomy); PT: ROM, NWB, hydrotherapy."))
story.append(SP(3))
story.append(H2("Osgood-Schlatter Disease"))
story.append(P("<b>Definition:</b> Traction apophysitis of tibial tubercle by patellar tendon. Active adolescents (10–15 yrs). Self-limiting. Management: Activity modification, ice, quadriceps and hamstring stretching."))
story.append(PageBreak())
story += chapter_header("SECTION B — NERVE INJURIES & SPINE (Continued)")
story.append(H1("NERVE INJURIES"))
story.append(H2("Radial Nerve Palsy — Wrist Drop"))
story.append(two_col_table([
("Common cause", "Humeral shaft fracture (radial groove), Saturday night palsy"),
("Features", "Wrist drop, finger drop, weak supination; sensory loss dorsal hand/1st web space"),
("Triceps", "Spared if injury at humeral shaft (innervated above radial groove)"),
("Splint", "Dynamic wrist extension splint"),
("Recovery", "Nerve repair/tendon transfer if no recovery by 3–4 months"),
], col1_w=4*cm))
story.append(SP(3))
story.append(H2("Ulnar Nerve Injury — Claw Hand"))
story.append(two_col_table([
("Level", "Elbow (medial epicondyle) or wrist (Guyon's canal)"),
("Claw deformity", "Ring + little fingers: MCP hyperextension + IP flexion"),
("Ulnar paradox", "More pronounced claw in LOW lesion (FDP partially intact)"),
("Features", "Weak grip, hypothenar wasting, sensory loss medial 1.5 fingers"),
("Splint", "Anti-claw splint; Zancolli lasso procedure"),
], col1_w=4*cm))
story.append(SP(3))
story.append(H2("Median Nerve — Ape Hand"))
story.append(P("<b>Ape hand:</b> Thenar wasting (APB, OP, FPB) with thumb lying in plane of palm — loss of opposition. Sensory loss: lateral 3.5 fingers. Management: Opponens splint; nerve repair/tendon transfer."))
story.append(SP(3))
story.append(H2("Common Peroneal Nerve — Foot Drop"))
story.append(P("<b>Common injury site:</b> Fibular neck (plaster pressure, cross-legged sitting). Features: Foot drop, high-stepping gait, sensory loss dorsal foot. Management: AFO for immediate function; nerve exploration if no recovery."))
story.append(SP(3))
story.append(H2("Erb's Palsy (Brachial Plexus — C5, C6)"))
story.append(P("<b>'Waiter's tip'</b> deformity: arm adducted, IR, elbow extended, forearm pronated. Muscles affected: Deltoid, biceps, supraspinatus, infraspinatus, brachioradialis. Management: Physiotherapy, splinting; surgery if no recovery 3–6 months."))
story.append(SP(5))
story.append(H1("SPINE SHORT NOTES"))
story.append(H2("Spondylolisthesis"))
story.append(two_col_table([
("Definition", "Forward displacement of one vertebra on the vertebra below"),
("Meyerding grade", "I: <25%, II: 25–50%, III: 50–75%, IV: >75%, V: spondyloptosis"),
("Common type", "Isthmic (pars defect) at L5–S1; Degenerative at L4–L5"),
("Features", "LBP, radiculopathy; 'step deformity' at high grades"),
("Management", "PT (core stabilization) for most; Surgical fusion for high-grade/neurological deficit"),
], col1_w=4*cm))
story.append(SP(3))
story.append(H2("Lumbar Canal Stenosis"))
story.append(two_col_table([
("Definition", "Narrowing of spinal canal/foramina causing cauda equina/root compression"),
("Cause", "Degenerative — osteophytes, hypertrophied ligamentum flavum, disc herniation"),
("Neurogenic claudication","Bilateral leg pain/paresthesia ON WALKING, relieved by sitting/forward bending"),
("Vs vascular claud.","Vascular: relieved by standing still; Neurogenic: needs to sit/flex spine"),
("Management", "PT (flexion exercises, cycling); Surgical decompression (laminectomy) if severe"),
], col1_w=4.5*cm))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════════
# SECTION C — 2-MARK ANSWERS
# ════════════════════════════════════════════════════════════════════════════════
story += chapter_header("SECTION C — 2-MARK SHORT ANSWER QUESTIONS",
"2–3 crisp lines only. State the definition or describe the test/sign precisely.")
story.append(H1("DEFINITIONS & TERMINOLOGY"))
defs = [
("Fracture","Break in continuity of bone from trauma, pathological condition, or stress."),
("Dislocation","Complete loss of contact between two articular surfaces of a joint."),
("Subluxation","Partial / incomplete loss of articular contact — joint surfaces still partially in contact."),
("Coxa Vara","NSA (neck-shaft angle of femur) < 120° (normal 125–135°). Limb appears short; abductors are lax."),
("Coxa Valga","NSA > 135°. Associated with hip dislocation and instability."),
("Varus deformity","Distal segment of limb directed toward midline. Example: genu varum (bow legs)."),
("Valgus deformity","Distal segment directed away from midline. Example: genu valgum (knock knees)."),
("Osteotomy","Surgical cutting of bone to correct deformity, realign joint, or redistribute load."),
("Arthrodesis","Surgical fusion of a joint to eliminate pain by eliminating movement."),
("Arthroplasty","Surgical reshaping or replacement of a joint surface (partial or total replacement)."),
("Bone graft","Transplantation of bone to repair skeletal defects. Types: autograft (self), allograft (cadaver), synthetic."),
("Tenodesis","Fixation of a tendon to bone. Also: passive tenodesis effect in C6 SCI (wrist extension → passive finger flexion)."),
("Wolff's Law","Bone remodels in response to mechanical stresses — laid down where needed, resorbed where not."),
("Hilton's Law","The nerve supplying a joint also supplies the muscles moving it and the overlying skin."),
("Provisional callus","Fibrocartilaginous tissue bridging fracture gap at 2–3 weeks (soft callus)."),
("Non-union","Fracture that has ceased healing without achieving bony union (> 6 months)."),
("Malunion","Fracture that heals in an unacceptable position (shortening, angulation, or rotation)."),
("Delayed union","Fracture taking longer than expected but still progressing toward union."),
("AVN","Death of bone tissue due to interruption of blood supply → collapse of articular surface."),
]
story.append(two_col_table(defs, col1_w=4*cm))
story.append(SP(8))
story.append(H1("CLINICAL SIGNS & SPECIAL TESTS"))
tests = [
("Trendelenburg sign","Pelvis drops to contralateral (non-WB) side on single-leg stance = weak ipsilateral hip abductors (glut. medius)."),
("Thomas test","With opposite hip fully flexed (lumbar lordosis eliminated), affected hip lifts off bed = fixed flexion deformity present."),
("Lachman's test","Knee at 20–30°, anterior tibial draw; soft end-point = ACL rupture. Most sensitive ACL test."),
("McMurray's test","Flex knee then extend with tibial rotation; click/pain at joint line = meniscal tear."),
("Anterior drawer","Knee 90°, pull tibia anteriorly; > 6 mm = ACL injury."),
("Posterior drawer","Knee 90°, push tibia posteriorly; > 6 mm = PCL injury."),
("Ortolani test","Abduction + anterior pressure on dislocated hip → 'clunk' of reduction = DDH."),
("Barlow test","Adduction + posterior pressure → 'clunk' of dislocation = dislocatable hip."),
("Phalen's test","Maximal wrist flexion × 60 sec → tingling in median distribution = CTS."),
("Tinel's sign","Percussion over nerve trunk → distal tingling = nerve regeneration or compression."),
("SLR / Lasegue","Passive leg raise; pain < 60° = L4/L5/S1 nerve root irritation (PIVD)."),
("Schober's test","< 5 cm increase in L-spine on forward bending = restricted lumbar flexion (AS, LBP)."),
("Finkelstein's test","Thumb in fist + ulnar deviation → radial pain = De Quervain's tenosynovitis."),
("Apley's grind","Prone knee 90°, axial compression + rotation → pain = meniscal pathology."),
("Apley's distraction","Prone knee 90°, distraction + rotation → pain = ligamentous injury."),
("Speed's test","Resisted shoulder flexion (elbow ext, supinated forearm) → bicipital groove pain = bicipital tendinitis."),
("Yergason's test","Resisted supination with elbow at 90° → bicipital groove pain = bicipital tendinitis."),
("Hawkins-Kennedy","Shoulder/elbow at 90° flexion, then IR shoulder → pain = subacromial impingement."),
("Cobb's angle","Angle between perpendiculars to end-plates of most tilted vertebrae on AP spine X-ray. Measures scoliosis."),
("Gaenslen's test","One hip hyperextended off table + other maximally flexed → SI joint pain = sacroiliitis."),
]
story.append(two_col_table(tests, col1_w=4.5*cm))
story.append(PageBreak())
story.append(H1("DEFORMITIES & SHORT CONCEPTS"))
deformities = [
("Wrist drop","Inability to extend wrist due to radial nerve palsy; hand hangs in flexion."),
("Foot drop","Inability to dorsiflex foot due to common peroneal nerve injury or weak tibialis anterior."),
("Ape hand","Thenar wasting + thumb in plane of palm from median nerve injury — loss of opposition."),
("Claw hand","MCP hyperextension + IP flexion in ring & little fingers due to ulnar nerve palsy (intrinsic minus)."),
("Swan neck","PIP hyperextension + DIP flexion. Cause: intrinsic tightness, volar plate laxity. Seen in RA."),
("Boutonniere","PIP flexion + DIP hyperextension. Cause: central slip disruption. Seen in RA, trauma."),
("Mallet finger","DIP flexion deformity from extensor tendon rupture at distal phalanx. Treat: extension splint × 6–8 wk."),
("Trigger finger","Stenosing tenosynovitis of flexor tendon at A1 pulley; finger catches/locks in flexion."),
("Heberden's node","Osteophytes at DIP joints — seen in osteoarthritis."),
("Bouchard's node","Osteophytes at PIP joints — seen in osteoarthritis."),
("RICE","Rest, Ice, Compression, Elevation — for acute soft tissue injury."),
("PRICES","Protection, Rest, Ice, Compression, Elevation, Support."),
("Spinal shock","Temporary loss of all spinal cord function below injury level immediately after acute SCI; ends with return of bulbocavernosus reflex."),
("Brown-Sequard","Spinal cord hemisection: ipsilateral motor loss + proprioception loss; contralateral pain/temperature loss."),
("Cauda equina syndrome","Bilateral leg weakness + saddle anaesthesia + urinary retention = surgical emergency."),
("Meralgia paraesthetica","Lateral femoral cutaneous nerve (L2–3) entrapment at inguinal ligament → anterolateral thigh burning/numbness; no motor loss."),
("Tarsal tunnel","Posterior tibial nerve compression behind medial malleolus → sole pain/tingling."),
("Crutch palsy","Radial nerve compression in axilla from crutch → wrist drop; triceps usually spared."),
("Erb's palsy","C5–C6 upper plexus injury → 'waiter's tip' posture."),
("Klumpke's palsy","C8–T1 lower plexus injury → claw hand + sensory loss medial forearm + Horner's syndrome."),
]
story.append(two_col_table(deformities, col1_w=4.5*cm))
story.append(SP(8))
story.append(H1("APPLIANCES & EQUIPMENT"))
appliances = [
("Axillary crutches","Placed in axilla; NOT for weight through axilla (crutch palsy risk). Full weight through hands."),
("Elbow crutches","Forearm cuff + handgrip (Lofstrand). Most commonly used crutch type."),
("Gutter crutches","Forearm rests in gutter trough; for patients unable to grip (RA, wrist injury)."),
("Thomas splint","Half-ring around thigh at ischial tuberosity; used for femoral shaft fractures with traction. Used with Pearson flexion piece."),
("Hip spica","POP cast encasing pelvis and leg(s). Used for DDH (post-reduction), paediatric hip fractures, osteotomies."),
("Skin traction","Applied via adhesive/foam strapping. Max weight 4–5 kg. Short-term use. Risk: skin breakdown."),
("Skeletal traction","Pin through bone (Steinmann/K-wire). Heavier weights, long-term, more accurate."),
("AFO","Ankle-Foot Orthosis. Controls ankle/foot. For foot drop, equinus. Types: solid, hinged, posterior leaf spring."),
("KAFO","Knee-Ankle-Foot Orthosis. Controls knee + ankle + foot. Used in polio, SCI, severe OA."),
("TLSO","Thoracolumbar-Sacral Orthosis (Boston brace). Used for scoliosis (Cobb 25–45°), compression fractures."),
("Milwaukee brace","CTLSO with pelvic girdle, uprights, cervical ring. For high thoracic scoliosis (apex T7 or above). Worn 18–23 hrs/day."),
]
story.append(two_col_table(appliances, col1_w=4*cm))
story.append(PageBreak())
# ════════════════════════════════════════════════════════════════════════════════
# EXAM STRATEGY PAGE
# ════════════════════════════════════════════════════════════════════════════════
story += chapter_header("EXAM WRITING STRATEGY")
story.append(H1("Answer Structure Templates"))
story.append(SP(4))
story.append(header_table(
["Section", "Structure", "Tips"],
[
["15-mark Essay",
"Introduction (1M) → Definition/Aetiology (2M) → Pathology (2M) → Clinical Features (3M) → Investigations (2M) → Medical + Surgical Management (2M) → PT Management Goals + Techniques (3M)",
"Use subheadings with bullet points. Draw labelled diagrams for fractures, deformities, anatomy. Always include PT goals — differentiates BPT from MBBS answer."],
["5-mark Short Note",
"Definition (0.5M) → Pathology/Mechanism (1M) → Clinical Features (1.5M) → Management/PT (2M)",
"1–2 paragraphs. Include key investigations. Mention PT relevance."],
["2-mark Short Answer",
"2–3 crisp lines only. State definition or describe test/sign precisely.",
"Avoid padding. No long introductions. State the most important point first."],
],
col_widths=[3*cm, 7.5*cm, 4*cm]
))
story.append(SP(6))
story.append(H1("Investigations to Always Mention"))
story.append(two_col_table([
("Imaging", "X-ray (AP + Lateral views) — always first; MRI (soft tissue, nerve, disc); CT scan (complex fractures, bony detail)"),
("Blood tests", "CBC, ESR, CRP (for infection/inflammation); RA factor + Anti-CCP (for RA); HLA-B27 (for AS); Serum uric acid (gout)"),
("Special", "EMG/NCS (nerve injuries, CTS, radiculopathy); Bone scan (stress fractures, osteomyelitis early); DEXA scan (osteoporosis)"),
("Joint aspiration", "Turbid/white (septic arthritis); Urate crystals (gout); Clear viscous (OA)"),
], col1_w=3.5*cm))
story.append(SP(6))
story.append(H1("High-Yield Mnemonics"))
story.append(header_table(
["Topic", "Mnemonic", "Meaning"],
[
["Club Foot", "CAVE", "Cavus, Adductus, Varus, Equinus"],
["Bone metastases","BPL TK", "Breast, Prostate, Lung, Thyroid, Kidney"],
["LBP Red Flags", "TUNA FISH","Trauma, Under/Over age, Night pain, Age; Fever, Incontinence, Systemic illness, History of cancer"],
["Compartment syn.","5 P's", "Pain, Paresthesia, Paralysis, Pallor, Pulselessness"],
["CTEV treatment","Ponseti 1-2-3","Casting → Tenotomy → Bracing"],
["Colles' fracture","FOOSH", "Fall On OutStretched Hand"],
["Rotator cuff", "SITS", "Supraspinatus, Infraspinatus, Teres minor, Subscapularis"],
],
col_widths=[3.5*cm, 3*cm, 8*cm]
))
story.append(SP(6))
story.append(amber_box("★ GOLDEN RULES FOR BPT EXAM", [
Bl("Always include physiotherapy goals AND specific techniques in EVERY answer — this is what makes a BPT answer"),
Bl("Draw labelled diagrams where applicable (fractures, deformities, anatomy) — they earn extra marks"),
Bl("Use subheadings with bullet points — examiners skim for keywords"),
Bl("Mention complications in 15-mark answers — often worth 2-3 marks"),
Bl("PT management should cover: Acute phase, Rehabilitation phase, Goals, Specific exercises, Electrotherapy"),
Bl("For orthopaedic conditions: always mention precautions/weight-bearing status"),
Tip("Supplement this guide with class notes, clinical experience, and faculty guidance. Good luck!"),
]))
story.append(SP(8))
story.append(HR())
story.append(Paragraph("MGR University BPT | Clinical Orthopaedics Complete Study Guide | For Academic Use Only",
sFooter))
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /tmp/workspace/ortho-study-guide && python3 build_pdf.py 2>&1
python3 -c " import pdfplumber with pdfplumber.open('/tmp/workspace/ortho-study-guide/MGR_BPT_ClinicalOrtho_StudyGuide.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') import os size = os.path.getsize('/tmp/workspace/ortho-study-guide/MGR_BPT_ClinicalOrtho_StudyGuide.pdf') print(f'File size: {size/1024:.1f} KB') # Check first and last page print('--- Page 1 snippet ---') print(pdf.pages[0].extract_text()[:300]) print('--- Last page snippet ---') print(pdf.pages[-1].extract_text()[:300]) "
MGR BPT ClinicalOrtho StudyGuide
PDF Document · PDF