Anotomy ke last revision point batana
FMGE upper limb anatomy high yield last minute revision points 2025
| Part | Formation |
|---|---|
| Upper Trunk | C5 + C6 |
| Middle Trunk | C7 only |
| Lower Trunk | C8 + T1 |
| Nerve | Injury Site | Deformity | Loss |
|---|---|---|---|
| Radial | Spiral groove (mid-shaft humerus fracture) | Wrist drop | Extension of wrist/fingers |
| Radial | Axilla (crutch palsy) | Wrist drop + Triceps weak | All extensors including triceps |
| Median | Wrist (Carpal Tunnel) | Ape hand | Thenar wasting, opposition lost |
| Median | Elbow (Supracondylar #) | Hand of benediction (on flexion) | LOAF muscles |
| Ulnar | Medial epicondyle | Claw hand (4th, 5th fingers) | Interossei, hypothenar |
| Ulnar | Wrist (Guyon's canal) | Claw hand without sensory loss in palm | Intrinsics only |
| Axillary | Surgical neck humerus | Flat shoulder / Sergeant's badge area numb | Deltoid paralysis |
| Long Thoracic | Mastectomy / Porter's palsy | Winged Scapula | Serratus anterior |
Median nerve = "LOAF" - Lumbricals (1, 2), Opponens pollicis, Abductor pollicis brevis, Flexor pollicis brevis (superficial head)
Note: Ulnar nerve does NOT pass through carpal tunnel - it goes through Guyon's canal
| Muscle | Action | Nerve |
|---|---|---|
| Supraspinatus | Initiation of abduction (0-15Β°) | Suprascapular (C5,C6) |
| Infraspinatus | Lateral rotation | Suprascapular (C5,C6) |
| Teres Minor | Lateral rotation | Axillary (C5,C6) |
| Subscapularis | Medial rotation | Subscapular (C5,C6) |
Most commonly torn: Supraspinatus - "Painful arc" (60Β°-120Β°)
Make a summary PDF of upper limb nerve injury mnemonics
ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"
mkdir -p /home/daytona/workspace/upper-limb-pdf && python3 -c "from reportlab.pdfgen import canvas; print('reportlab OK')"
~/upper-limb-pdf/make_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import PageBreak
OUTPUT = "/home/daytona/workspace/upper-limb-pdf/Upper_Limb_Nerve_Injuries_Mnemonics.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.8*cm,
leftMargin=1.8*cm,
topMargin=1.5*cm,
bottomMargin=1.5*cm,
)
styles = getSampleStyleSheet()
# Custom styles
TITLE_STYLE = ParagraphStyle(
"Title", parent=styles["Title"],
fontSize=22, textColor=colors.HexColor("#1a237e"),
spaceAfter=4, alignment=TA_CENTER, fontName="Helvetica-Bold"
)
SUBTITLE_STYLE = ParagraphStyle(
"Subtitle", parent=styles["Normal"],
fontSize=11, textColor=colors.HexColor("#5c6bc0"),
spaceAfter=2, alignment=TA_CENTER, fontName="Helvetica"
)
SECTION_STYLE = ParagraphStyle(
"Section", parent=styles["Normal"],
fontSize=13, textColor=colors.white,
fontName="Helvetica-Bold", alignment=TA_LEFT,
leftIndent=6, spaceAfter=2, spaceBefore=6
)
BODY_STYLE = ParagraphStyle(
"Body", parent=styles["Normal"],
fontSize=9.5, textColor=colors.HexColor("#212121"),
fontName="Helvetica", leading=14, spaceAfter=2
)
MNEMONIC_STYLE = ParagraphStyle(
"Mnemonic", parent=styles["Normal"],
fontSize=10.5, textColor=colors.HexColor("#b71c1c"),
fontName="Helvetica-Bold", leading=14, spaceAfter=2,
leftIndent=8
)
NOTE_STYLE = ParagraphStyle(
"Note", parent=styles["Normal"],
fontSize=9, textColor=colors.HexColor("#4a148c"),
fontName="Helvetica-Oblique", leading=13, spaceAfter=2,
leftIndent=8
)
FOOTER_STYLE = ParagraphStyle(
"Footer", parent=styles["Normal"],
fontSize=8, textColor=colors.grey,
alignment=TA_CENTER
)
def section_header(text, bg=colors.HexColor("#1a237e")):
data = [[Paragraph(text, SECTION_STYLE)]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("ROWBACKGROUNDS", (0,0), (-1,-1), [bg]),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
return t
def mini_header(text):
data = [[Paragraph(f"<b>{text}</b>", ParagraphStyle(
"mini", parent=styles["Normal"],
fontSize=10.5, textColor=colors.white,
fontName="Helvetica-Bold", leftIndent=4
))]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), colors.HexColor("#3949ab")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 8),
]))
return t
def colored_table(headers, rows, col_widths, header_bg=colors.HexColor("#3949ab")):
data = [[Paragraph(f"<b>{h}</b>", ParagraphStyle(
"th", parent=styles["Normal"], fontSize=9,
textColor=colors.white, fontName="Helvetica-Bold", alignment=TA_CENTER
)) for h in headers]]
for i, row in enumerate(rows):
data.append([Paragraph(str(cell), ParagraphStyle(
"td", parent=styles["Normal"], fontSize=9,
textColor=colors.HexColor("#212121"), fontName="Helvetica",
alignment=TA_LEFT, leading=13
)) for cell in row])
t = Table(data, colWidths=col_widths)
style = [
("BACKGROUND", (0,0), (-1,0), header_bg),
("ROWBACKGROUNDS", (0,1), (-1,-1), [colors.HexColor("#e8eaf6"), colors.white]),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#c5cae9")),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 4),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
]
t.setStyle(TableStyle(style))
return t
def highlight_box(text, bg=colors.HexColor("#fff9c4"), border=colors.HexColor("#f57f17")):
data = [[Paragraph(text, ParagraphStyle(
"hb", parent=styles["Normal"], fontSize=9.5,
textColor=colors.HexColor("#212121"), fontName="Helvetica",
leading=14, leftIndent=4
))]]
t = Table(data, colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("BOX", (0,0), (-1,-1), 1.2, border),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING", (0,0), (-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 10),
]))
return t
story = []
# βββ COVER βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Spacer(1, 1.2*cm))
story.append(Paragraph("Upper Limb Nerve Injuries", TITLE_STYLE))
story.append(Paragraph("Mnemonics & High-Yield Revision Summary", SUBTITLE_STYLE))
story.append(Paragraph("For FMGE / NEET PG / USMLE Step 1", ParagraphStyle(
"sub2", parent=styles["Normal"], fontSize=10, textColor=colors.HexColor("#7986cb"),
alignment=TA_CENTER, spaceAfter=4
)))
story.append(HRFlowable(width="100%", thickness=2, color=colors.HexColor("#1a237e"), spaceAfter=10))
story.append(Spacer(1, 0.3*cm))
# βββ SECTION 1: BRACHIAL PLEXUS ββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("1. BRACHIAL PLEXUS - ROOTS, TRUNKS, CORDS"))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph('<b>Roots:</b> C5, C6, C7, C8, T1', BODY_STYLE))
story.append(Paragraph(
'<b>Mnemonic (Roots):</b> "My Tea Comes From Cuba" (C5-C6-C7-C8-T1)',
MNEMONIC_STYLE
))
story.append(Spacer(1, 0.15*cm))
trunk_rows = [
["Upper Trunk", "C5 + C6", "Suprascapular n., Nerve to subclavius"],
["Middle Trunk", "C7 only", "No named branch"],
["Lower Trunk", "C8 + T1", "β"],
]
story.append(colored_table(
["Trunk", "Formation", "Key Branch"],
trunk_rows,
[5.5*cm, 4.5*cm, 8.2*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(highlight_box(
"<b>Cord Mnemonic - MLP</b>: Medial cord = C8,T1 (Ulnar + medial cutaneous nerves) | "
"Lateral cord = C5,C6,C7 (Musculocutaneous + Lateral root of Median) | "
"Posterior cord = all roots (Radial + Axillary)"
))
story.append(Spacer(1, 0.2*cm))
story.append(highlight_box(
"<b>Flexors vs Extensors Rule:</b><br/>"
"Anterior divisions β Flexors (Musculocutaneous, Median, Ulnar)<br/>"
"Posterior divisions β Extensors (Radial, Axillary)",
bg=colors.HexColor("#e8f5e9"), border=colors.HexColor("#2e7d32")
))
story.append(Spacer(1, 0.3*cm))
# βββ SECTION 2: NERVE INJURIES TABLE βββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("2. NERVE INJURY SIGNATURES - Must-Know Table"))
story.append(Spacer(1, 0.2*cm))
injury_rows = [
["Radial\n(C5-C8)", "Spiral groove\n(mid-shaft humerus #)", "Wrist Drop", "Extension wrist+fingers lost; Triceps SPARED", "Saturday night palsy"],
["Radial\n(C5-C8)", "Axilla\n(crutch palsy)", "Wrist Drop\n+ Triceps weak", "All extensors lost incl. triceps; Sensory: dorsum hand", "Crutch / Crutch palsy"],
["Axillary\n(C5-C6)", "Surgical neck\nhumerus #", "Flat shoulder\n(deltoid atrophy)", "Deltoid + Teres Minor; Badge area numb", "Shoulder dislocation"],
["Median\n(C6-T1)", "Carpal Tunnel\n(wrist)", "Ape Hand\n(thenar flat)", "LOAF muscles; Opposition thumb lost", "CTS - night pain, Tinel+, Phalen+"],
["Median\n(C6-T1)", "Supracondylar #\n(elbow)", "Hand of Benediction\n(on attempted flex)", "Ant. interosseous branch; FPL, FDP radial, PQ lost", "Most common in children"],
["Ulnar\n(C8-T1)", "Medial epicondyle\n(behind elbow)", "Claw Hand\n(4th + 5th fingers)", "Interossei, hypothenar; Sensory: little + ring finger", "Funny bone injury"],
["Ulnar\n(C8-T1)", "Wrist\n(Guyon's canal)", "Claw Hand\n(no palm numb)", "Intrinsic muscles only; Palmar branch SPARED", "Cyclist palsy"],
["Musculo-\ncutaneous\n(C5-C7)", "Coracobrachialis\npenetration", "Weak elbow flexion", "Biceps, Brachialis, Coracobrachialis; Lat. cutaneous n. forearm", "Uncommon isolated injury"],
["Long Thoracic\n(C5-C7)", "Axillary dissection\n/ mastectomy", "Winged Scapula", "Serratus anterior paralysis", "Porter's palsy"],
["Dorsal Scapular\n(C5)", "Neck trauma", "Winged Scapula\n(subtle)", "Rhomboids + Levator scapulae", "Scapula doesn't retract"],
]
story.append(colored_table(
["Nerve", "Injury Site", "Deformity", "What is Lost", "Clinical Note"],
injury_rows,
[2.5*cm, 3.5*cm, 3.5*cm, 5.0*cm, 3.7*cm]
))
story.append(Spacer(1, 0.3*cm))
# βββ SECTION 3: MNEMONICS ββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("3. MNEMONICS CHEAT SHEET", bg=colors.HexColor("#4a148c")))
story.append(Spacer(1, 0.2*cm))
mnemonics = [
("LOAF (Median nerve hand muscles)",
"L - Lumbricals 1 & 2\nO - Opponens Pollicis\nA - Abductor Pollicis Brevis\nF - Flexor Pollicis Brevis (superficial head)"),
("SITS (Rotator Cuff)",
"S - Supraspinatus (abduction initiation 0-15Β°)\nI - Infraspinatus (lateral rotation)\nT - Teres Minor (lateral rotation)\nS - Subscapularis (medial rotation)"),
("Cubital Fossa Contents - Lateral to Medial",
'"Really Be Brave Man"\nR - Radial Nerve | B - Biceps Tendon | B - Brachial Artery | M - Median Nerve'),
("Brachial Plexus Roots",
'"My Tea Comes From Cuba"\nC5 | C6 | C7 | C8 | T1'),
("Axillary Artery Branches (Parts 1-2-3 = Branches 1-2-3)",
"Part 1 (1 branch): Supreme Thoracic\nPart 2 (2 branches): Thoracoacromial, Lateral Thoracic\nPart 3 (3 branches): Subscapular, Ant. Circumflex Humeral, Post. Circumflex Humeral"),
("Ulnar vs Median Claw",
"Ulnar = 4th & 5th finger claw (ulnar paradox: wrist lesion = worse claw)\nMedian = 2nd & 3rd finger claw (hand of benediction = proximal lesion)\nRemember: More proximal injury = Weaker claw (paradox!)"),
("Radial Nerve at Different Levels",
"Axilla injury: Wrist drop + Triceps weakness + Sensory loss arm/forearm/hand\nSpiral groove: Wrist drop, Triceps NORMAL (branch given above groove)\nAnterior Interosseous syndrome: No wrist drop (pure motor, no sensory)"),
("Erb's Palsy (C5, C6) vs Klumpke's (C8, T1)",
"Erb's = Upper trunk | Waiter's tip (arm adducted, medially rotated, elbow extended)\nKlumpke's = Lower trunk | Claw hand + Horner's (if T1 ramus involved = ptosis, miosis, anhidrosis)"),
]
for title, body in mnemonics:
story.append(mini_header(title))
for line in body.split("\n"):
if line.startswith(("L -","O -","A -","F -","S -","I -","T -","R -","B -","M -","P -")):
story.append(Paragraph(f" {line}", BODY_STYLE))
elif any(line.startswith(x) for x in ['"', "C5","C6","Part","Ulnar","Median","Axilla","Spiral","Ante","Erb","Klum"]):
story.append(Paragraph(f" {line}", BODY_STYLE))
else:
story.append(Paragraph(line, MNEMONIC_STYLE if line == title else BODY_STYLE))
story.append(Spacer(1, 0.15*cm))
story.append(Spacer(1, 0.3*cm))
# βββ SECTION 4: QUICK FIRE βββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("4. QUICK-FIRE FMGE FACTS", bg=colors.HexColor("#b71c1c")))
story.append(Spacer(1, 0.2*cm))
quick = [
("Carpal Tunnel Contents", "Median nerve + 9 tendons (FDS x4, FDP x4, FPL x1). Ulnar nerve is NOT inside."),
("Anatomical Snuffbox Floor", "Scaphoid + Trapezium. Radial artery passes through it. Tenderness = Scaphoid fracture."),
("Most Common Carpal # ", "Scaphoid (waist most common). Avascular necrosis risk (proximal pole has no direct blood supply)."),
("Dupuytren's Contracture", "Palmar fascia fibrosis. Affects ring (4th) and little (5th) finger most. NOT a nerve lesion."),
("Winged Scapula - 2 causes", "Long thoracic nerve (serratus anterior) = medial winging. Spinal accessory nerve (trapezius) = lateral winging."),
("Painful Arc Syndrome", "60Β°-120Β° abduction. Supraspinatus tendon impingement under coracoacromial arch."),
("Palmaris Longus", "Most variable muscle; absent in ~15% population. Used for tendon grafts. Innervated by Median nerve."),
("Posterior Interosseous Nerve (PIN)", "Deep branch of Radial nerve. Injury = Finger/thumb drop, NO wrist drop, NO sensory loss."),
("Guyon's Canal (Ulnar tunnel)", "Contains: Ulnar nerve + Ulnar artery. Borders: Pisiform (medial), Hook of hamate (lateral), Flexor retinaculum (floor)."),
("Ulnar Paradox", "More distal ulnar lesion at wrist = Worse claw (lumbricals also paralyzed). Proximal lesion = milder claw (FDP partially works)."),
]
for fact, detail in quick:
story.append(Paragraph(
f"<b><font color='#b71c1c'>βΆ {fact}:</font></b> {detail}",
BODY_STYLE
))
story.append(Spacer(1, 0.1*cm))
story.append(Spacer(1, 0.3*cm))
# βββ SECTION 5: DERMATOMES βββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_header("5. UPPER LIMB SENSORY / DERMATOME QUICK MAP", bg=colors.HexColor("#1b5e20")))
story.append(Spacer(1, 0.15*cm))
derm_rows = [
["C5", "Lateral upper arm (axillary n. - regimental badge area)"],
["C6", "Lateral forearm + Thumb + Index (Lateral cutaneous n. forearm / Median n.)"],
["C7", "Middle finger (Median nerve)"],
["C8", "Ring + Little finger (Ulnar nerve)"],
["T1", "Medial forearm (Medial cutaneous nerve of forearm)"],
["T2", "Medial upper arm (Intercostobrachial nerve)"],
]
story.append(colored_table(
["Root", "Area Supplied"],
derm_rows,
[3*cm, 15.2*cm],
header_bg=colors.HexColor("#2e7d32")
))
story.append(Spacer(1, 0.4*cm))
story.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor("#c5cae9")))
story.append(Spacer(1, 0.1*cm))
story.append(Paragraph(
"Prepared for FMGE Revision | Based on Gray's Anatomy for Students & THIEME Atlas | Orris Medical AI",
FOOTER_STYLE
))
doc.build(story)
print("PDF created:", OUTPUT)
cd /home/daytona/workspace/upper-limb-pdf && python3 make_pdf.py 2>&1
ls -lh /home/daytona/workspace/upper-limb-pdf/
Upper Limb Nerve Injuries Mnemonics
PDF Document Β· PDF
| Section | Content |
|---|---|
| 1. Brachial Plexus | Roots/Trunks/Cords table + "My Tea Comes From Cuba" mnemonic + Flexors vs Extensors rule |
| 2. Nerve Injury Table | Radial, Axillary, Median, Ulnar, Musculocutaneous, Long Thoracic - injury site, deformity, what is lost |
| 3. Mnemonics Cheatsheet | LOAF, SITS, Cubital fossa "Really Be Brave Man", Axillary artery branches, Ulnar paradox, Erb's vs Klumpke's |
| 4. Quick-Fire FMGE Facts | Carpal tunnel, Snuffbox, Scaphoid #, Dupuytren's, PIN injury, Guyon's canal |
| 5. Dermatomes Map | C5 to T2 sensory distribution table |