Make me ppt for special test for shoulder joint
shoulder special clinical tests examination

Clinical photograph showing two specific orthopedic physical examination maneuvers performed for shoulder pathology. Image (a) demonstrates Speed's test, which evaluates the long head of the biceps tendon; the participant has the right arm extended anteriorly with the forearm supinated, while the left hand applies downward resistance at the distal forearm/wrist. Image (b) illustrates a modification of the Hawkins-Kennedy impingement test, used to assess for subacromial impingement; the participant's right arm is flexed to 90 degrees at the shoulder with the elbow also flexed to 90 degrees, and the arm is internally rotated. These images represent telerehabilitation or self-administered physical examination techniques where the patient uses their own limbs or surrounding environment to recreate provocative orthopedic tests. The anatomical focus is the glenohumeral joint and associated musculotendinous structures. Educational context includes musculoskeletal assessment, physical therapy, and telemedicine clinical reasoning.

A composite of two clinical photographs (A and B) demonstrating orthopedic physical examination maneuvers for shoulder instability. The patient is positioned supine on an examination table with the scapula stabilized. An examiner in a white coat is shown performing manipulative tests on the right shoulder. View A illustrates the Anterior Apprehension Test (AAT), with the shoulder abducted to 90 degrees and the elbow flexed to 90 degrees while the examiner applies an external rotation force. View B illustrates the Bony Apprehension Test (BAT), where the shoulder is positioned in approximately 45 degrees of abduction and 45 degrees of external rotation. These tests are utilized in clinical sports medicine and orthopedics to assess for glenohumeral instability, specifically evaluating for labral tears or glenoid bone loss. The objective is to identify a positive 'apprehension' sign, indicating symptomatic instability in specific ranges of motion.

This composite educational graphic illustrates clinical mobility tests and biomechanical principles of the shoulder joint complex, specifically the Stenvers shoulder examination. Panels A-D are clinical photographs showing a practitioner performing manual assessments on a male subject. These include end-range flexion and abduction maneuvers with specific hand placements on the scapula, humerus, and acromioclavicular region to evaluate joint play and movement quality. Panels E-H provide corresponding anatomical diagrams. E compares lateral scapular positioning at end-range flexion between normal (left) and restricted (right) states, showing increased protraction in the latter. F details clavicular motion, contrasting normal posterior/dorsocranial trajectories (bold) with restricted movement patterns. G illustrates scapular posterior tilting during the terminal phase of flexion, and H depicts the associated motion of the cervicothoracic junction and spinal column. The content is designed for musculoskeletal physical therapy and orthopedic education, focusing on scapulohumeral rhythm, clavicular kinematics, and the identification of restricted range of motion in shoulder pathology.

Clinical procedural photograph demonstrating physical examination techniques for assessing posterior shoulder tightness. The image is divided into two panels (a and b), showing a patient in the supine position on an examination table. In panel (a), the Combined Abduction Test (CAT) is shown: the examiner uses one hand to stabilize the lateral border of the scapula while the other hand passively abducts the patient's arm toward the head to check for restricted range of motion. In panel (b), the Horizontal Flexion Test (HFT) is depicted: the examiner maintains scapular stabilization while passively adducting the patient's arm across the torso toward the contralateral shoulder. These maneuvers are typically used in sports medicine and orthopedics to identify posterior capsule or muscle tightness, which are clinical indicators often associated with shoulder impingement or throwing-related overhead injuries. The examiner's hand placement is critical in both tests to prevent compensatory scapular motion, ensuring the assessment reflects true glenohumeral joint flexibility.

A clinical photograph demonstrating a point-of-care ultrasound (POCUS) examination of the shoulder, specifically for postoperative orthopedic assessment. A clinician in a white coat is shown holding a multi-lobed ultrasound transducer against the patient's right shoulder, positioned over the glenohumeral joint and proximal humerus region. The patient is a male with fair skin, displaying age-related changes such as mottled pigmentation, skin laxity, and multiple benign nevi across the chest and upper arm. The visual context illustrates the assessment of tendon integrity (such as the subscapularis) following shoulder arthroplasty or rotator cuff repair. This procedural image highlights the transducer's orientation and skin contact point required to evaluate musculoskeletal (MSK) structures, subacromial space, and tendon mobility during passive or active humeral rotation.

A clinical photograph illustrating a musculoskeletal physical examination technique for the shoulder. The patient is positioned supine on a red mat with the right shoulder abducted to 90 degrees and the elbow flexed to 90 degrees. A rolled white towel is placed under the distal humerus to stabilize the joint and maintain neutral alignment. An examiner's hand is placed on the anterior aspect of the patient's distal forearm, applying resistance as the patient attempts internal rotation. This maneuver is used to assess the strength and integrity of the anterior rotator cuff muscles, specifically the subscapularis, and to identify potential pathology such as tendinopathy or muscle tears. The image demonstrates proper patient positioning and hand placement for orthopedic testing in a physical therapy or clinical setting.

Educational clinical photograph compilation illustrating physical examination maneuvers for shoulder assessment. The content is organized into four main sections: 1. Shoulder (Basics): Highlights the deltoid region with a green overlay and a red dot indicating the acromioclavicular joint (ACJ). 2. Modified Scarf Test: Demonstrates cross-body adduction to assess ACJ pathology, featuring a blue directional arrow and a red dot at the ACJ. 3. Glenohumeral Joint Assessment: Displays the patient in neutral, external rotation (highlighted in green for normal range of motion), and internal rotation (highlighted in red for restricted or abnormal motion). 4. Modified Hawkins Test: Shows two variations for impingement assessment—a vertical approach with the arm abducted to 90 degrees and internally rotated, and a horizontal approach with the arm adducted across the midline. Blue arrows indicate the direction of force and rotation. This resource uses a color-coding convention where green overlays typically represent normal findings or anatomical target zones, and red signifies potential pathology or restricted range of motion. It is designed for clinical training and telemedicine frameworks.

This clinical photograph series illustrates the orthopedic physical examination of the shoulder, specifically the anterior apprehension test and the relocation test. The patient is positioned supine with the right arm abducted to 90 degrees and the elbow flexed at 90 degrees. Frames A and B demonstrate the 'Apprehension Test' phase, where the examiner applies passive external rotation to the shoulder, observing for patient discomfort or a sense of impending dislocation. Frame C depicts the 'Relocation Test' (or Jobe Relocation Test), where the examiner applies a posterior-directed pressure on the anterior aspect of the humeral head while maintaining the abducted and externally rotated position. This clinical maneuver is used to evaluate anterior glenohumeral instability and labral pathology. A positive result is indicated if the posterior pressure in frame C relieves the patient's apprehension or pain experienced during frames A and B. This educational material is relevant for sports medicine and musculoskeletal assessment training.
rotator cuff impingement test Neer Hawkins Kennedy

Clinical photograph showing two specific orthopedic physical examination maneuvers performed for shoulder pathology. Image (a) demonstrates Speed's test, which evaluates the long head of the biceps tendon; the participant has the right arm extended anteriorly with the forearm supinated, while the left hand applies downward resistance at the distal forearm/wrist. Image (b) illustrates a modification of the Hawkins-Kennedy impingement test, used to assess for subacromial impingement; the participant's right arm is flexed to 90 degrees at the shoulder with the elbow also flexed to 90 degrees, and the arm is internally rotated. These images represent telerehabilitation or self-administered physical examination techniques where the patient uses their own limbs or surrounding environment to recreate provocative orthopedic tests. The anatomical focus is the glenohumeral joint and associated musculotendinous structures. Educational context includes musculoskeletal assessment, physical therapy, and telemedicine clinical reasoning.

This clinical photograph demonstrates the Scapular Retraction Test (SRT), a physical examination maneuver used in sports medicine and orthopedics to assess scapular dyskinesis and its contribution to shoulder impingement or rotator cuff symptoms. The image shows a posterior view of a patient with their right arm in slight abduction. An examiner stands behind the patient, performing manual stabilization: one hand is placed broadly over the medial border and body of the scapula to facilitate retraction and posterior tilting, while the other hand provides stabilization at the superior aspect of the shoulder near the acromion. A black directional arrow indicates the application of a resisted downward force on the distal humerus. The educational purpose of this visual is to illustrate the correct hand placement for manual scapular assistance during strength testing, helping clinicians determine if mechanical stabilization of the scapula reduces pain or increases the strength of the supraspinatus muscle.

Multi-planar MRI of a human shoulder joint, displayed in coronal (large left panel), sagittal (top right), and transverse (bottom right) planes to illustrate internal impingement mechanisms. The imaging depicts the shoulder in the Neer position (170° elevation), which is utilized to evaluate the spatial relationship between humeral and scapular structures. In the coronal view, anatomical labels identify the acromion, clavicle, and glenoid. A red measurement marker, labeled 'M1', is positioned at the minimum distance between the greater tuberosity (gt) of the humerus and the superior glenoid rim, showing a quantified distance of 7.4 mm. The sagittal and transverse slices reinforce this spatial assessment, with the transverse view specifically identifying the anterior aspect of the humeral head and the subscapularis (SSC) tendon. This diagnostic visualization is intended to demonstrate the close proximity of the greater tuberosity to the glenoid during provocative maneuvers, relevant for studying internal shoulder impingement syndromes and rotator cuff pathology.

This clinical photograph demonstrates the procedural positioning for the lateral Jobe test, a physical examination maneuver used in orthopedic assessment of the rotator cuff. The patient is shown from the front with both shoulders abducted to 90 degrees in the coronal plane. The elbows are flexed to 90 degrees, and the shoulders are internally rotated such that the forearms and fingers are oriented inferiorly toward the ground, with the thumbs pointing medially toward the midline. A clinician in a white medical coat is visible on the right, applying an inferiorly directed force to the distal humerus to test for pain or weakness. This test is specifically designed to assess for pathology such as supraspinatus tendon tears or impingement. The background shows a clinical setting including a examination chair and wall-mounted diagnostic equipment.
shoulder apprehension test anterior instability glenohumeral

A composite of two clinical photographs (A and B) demonstrating orthopedic physical examination maneuvers for shoulder instability. The patient is positioned supine on an examination table with the scapula stabilized. An examiner in a white coat is shown performing manipulative tests on the right shoulder. View A illustrates the Anterior Apprehension Test (AAT), with the shoulder abducted to 90 degrees and the elbow flexed to 90 degrees while the examiner applies an external rotation force. View B illustrates the Bony Apprehension Test (BAT), where the shoulder is positioned in approximately 45 degrees of abduction and 45 degrees of external rotation. These tests are utilized in clinical sports medicine and orthopedics to assess for glenohumeral instability, specifically evaluating for labral tears or glenoid bone loss. The objective is to identify a positive 'apprehension' sign, indicating symptomatic instability in specific ranges of motion.

This clinical photograph series illustrates the orthopedic physical examination of the shoulder, specifically the anterior apprehension test and the relocation test. The patient is positioned supine with the right arm abducted to 90 degrees and the elbow flexed at 90 degrees. Frames A and B demonstrate the 'Apprehension Test' phase, where the examiner applies passive external rotation to the shoulder, observing for patient discomfort or a sense of impending dislocation. Frame C depicts the 'Relocation Test' (or Jobe Relocation Test), where the examiner applies a posterior-directed pressure on the anterior aspect of the humeral head while maintaining the abducted and externally rotated position. This clinical maneuver is used to evaluate anterior glenohumeral instability and labral pathology. A positive result is indicated if the posterior pressure in frame C relieves the patient's apprehension or pain experienced during frames A and B. This educational material is relevant for sports medicine and musculoskeletal assessment training.

A clinical photograph demonstrating the performance of the Anterior Drawer Test of the shoulder, a physical examination maneuver used to assess glenohumeral joint instability. The image shows a shirtless male patient seated upright on an examination table with his right arm relaxed and the hand supported by a pillow. An examiner in teal scrubs is positioned behind and to the side of the patient. The examiner's left hand is used for stabilization, with the thumb placed on the coracoid process and the fingers spanning the scapular spine to fixate the scapula. The examiner's right hand grasps the proximal humerus, ready to apply an anteriorly directed force to provoke translation of the humeral head relative to the glenoid fossa. This procedural image illustrates the proper hand placement and patient positioning required to evaluate the integrity of the anterior capsulolabral structures and the degree of shoulder laxity.
mkdir -p /tmp/workspace/shoulder-ppt && ls /tmp/workspace/shoulder-ppt/
~/shoulder-ppt/build_ppt.py
import json, subprocess, base64
from io import BytesIO
from pptx import Presentation
from pptx.util import Inches, Pt, Emu
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
from pptx.util import Inches, Pt
# ── Colour palette ──────────────────────────────────────────────────────────
DARK_BLUE = RGBColor(0x1A, 0x3A, 0x5C)
MED_BLUE = RGBColor(0x1E, 0x6B, 0xB5)
LIGHT_BLUE = RGBColor(0xD6, 0xEA, 0xF8)
ACCENT = RGBColor(0xE8, 0x5D, 0x04)
WHITE = RGBColor(0xFF, 0xFF, 0xFF)
LIGHT_GRAY = RGBColor(0xF4, 0xF6, 0xF9)
DARK_GRAY = RGBColor(0x2C, 0x3E, 0x50)
GREEN = RGBColor(0x1E, 0x8B, 0x4C)
ORANGE = RGBColor(0xE8, 0x5D, 0x04)
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
# ── Helper utilities ─────────────────────────────────────────────────────────
def add_rect(slide, x, y, w, h, fill_color=None, line_color=None, line_width=None):
from pptx.util import Pt as _Pt
shape = slide.shapes.add_shape(
1, # MSO_SHAPE_TYPE.RECTANGLE
Inches(x), Inches(y), Inches(w), Inches(h)
)
shape.line.fill.background()
if fill_color:
shape.fill.solid()
shape.fill.fore_color.rgb = fill_color
else:
shape.fill.background()
if line_color:
shape.line.color.rgb = line_color
if line_width:
shape.line.width = _Pt(line_width)
else:
shape.line.fill.background()
return shape
def add_text(slide, text, x, y, w, h, size=18, bold=False, color=DARK_GRAY,
align=PP_ALIGN.LEFT, italic=False, wrap=True, valign=MSO_ANCHOR.MIDDLE):
tb = slide.shapes.add_textbox(Inches(x), Inches(y), Inches(w), Inches(h))
tf = tb.text_frame
tf.word_wrap = wrap
tf.vertical_anchor = valign
tf.margin_left = Pt(4)
tf.margin_right = Pt(4)
tf.margin_top = Pt(2)
tf.margin_bottom = Pt(2)
p = tf.paragraphs[0]
p.alignment = align
run = p.add_run()
run.text = text
run.font.name = "Calibri"
run.font.size = Pt(size)
run.font.bold = bold
run.font.italic = italic
run.font.color.rgb = color
return tb
def add_bullet_box(slide, items, x, y, w, h, title=None, title_size=14, bullet_size=12,
bg_color=None, title_color=WHITE, bullet_color=DARK_GRAY,
title_bg=MED_BLUE):
"""Add a titled bullet box."""
if bg_color:
add_rect(slide, x, y, w, h, fill_color=bg_color)
if title:
add_rect(slide, x, y, w, 0.38, fill_color=title_bg)
add_text(slide, title, x+0.05, y+0.01, w-0.1, 0.36,
size=title_size, bold=True, color=title_color,
align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.MIDDLE)
content_y = y + 0.4
content_h = h - 0.42
else:
content_y = y + 0.05
content_h = h - 0.1
tb = slide.shapes.add_textbox(Inches(x+0.1), Inches(content_y),
Inches(w-0.2), Inches(content_h))
tf = tb.text_frame
tf.word_wrap = True
tf.vertical_anchor = MSO_ANCHOR.TOP
first = True
for item in items:
if first:
p = tf.paragraphs[0]
first = False
else:
p = tf.add_paragraph()
p.space_before = Pt(2)
run = p.add_run()
run.text = ("• " if not item.startswith("•") else "") + item.lstrip("• ")
run.font.name = "Calibri"
run.font.size = Pt(bullet_size)
run.font.color.rgb = bullet_color
def fetch_image_b64(url):
try:
result = json.loads(subprocess.check_output(
["python", "/tmp/skills/shared/scripts/fetch_images.py", url],
timeout=30
))
if result and result[0].get("base64"):
return result[0]["base64"]
except Exception as e:
print(f"Image fetch failed for {url}: {e}")
return None
def add_image_to_slide(slide, url, x, y, w, h):
b64 = fetch_image_b64(url)
if b64:
prefix, data = b64.split(",", 1) if "," in b64 else ("", b64)
raw = base64.b64decode(data)
buf = BytesIO(raw)
try:
slide.shapes.add_picture(buf, Inches(x), Inches(y), Inches(w), Inches(h))
return True
except Exception as e:
print(f"Could not add picture: {e}")
return False
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 1 – TITLE SLIDE
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
# Full background
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=DARK_BLUE)
# Accent stripe
add_rect(slide, 0, 5.8, 13.333, 0.15, fill_color=ACCENT)
# Left accent bar
add_rect(slide, 0, 0, 0.3, 7.5, fill_color=MED_BLUE)
add_text(slide, "SPECIAL TESTS FOR THE", 0.6, 1.5, 12, 0.8,
size=28, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.LEFT)
add_text(slide, "SHOULDER JOINT", 0.6, 2.2, 12, 1.2,
size=52, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
add_text(slide, "Clinical Examination • Orthopaedics & Sports Medicine",
0.6, 3.6, 12, 0.6, size=18, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.LEFT)
# Divider line
add_rect(slide, 0.6, 4.4, 6, 0.04, fill_color=ACCENT)
add_text(slide, "Topics: Impingement • Instability • Rotator Cuff • Labrum/Biceps • AC Joint • Neurovascular",
0.6, 4.6, 12, 0.5, size=13, bold=False, color=LIGHT_BLUE, align=PP_ALIGN.LEFT)
add_text(slide, "Source: Miller's Review of Orthopaedics 9th Ed • Campbell's Operative Orthopaedics 15th Ed • Bailey & Love",
0.6, 5.2, 12, 0.4, size=11, bold=False,
color=RGBColor(0xAA, 0xC4, 0xE8), align=PP_ALIGN.LEFT)
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 2 – OVERVIEW / CLASSIFICATION
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=DARK_BLUE)
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "CLASSIFICATION OF SHOULDER SPECIAL TESTS", 0.3, 0.05, 12.7, 0.8,
size=22, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
categories = [
("🔴 IMPINGEMENT /\nROTATOR CUFF", [
"Neer Impingement Sign",
"Hawkins-Kennedy Test",
"Jobe (Empty Can) Test",
"Drop-Arm Test",
"Lift-Off Test (Gerber)",
"Bear-Hug Test",
"Belly-Press Test",
"Horn-Blower Sign",
], 0.3, 1.1, 3.0, 5.6),
("🟠 INSTABILITY", [
"Apprehension Test",
"Relocation Test (Jobe)",
"Load-and-Shift Test",
"Sulcus Sign",
"Anterior Drawer Test",
"Posterior Drawer Test",
"Gagey Hyperabduction",
"Clunk Test",
], 3.5, 1.1, 3.0, 5.6),
("🟡 LABRUM / BICEPS", [
"O'Brien Active Compression",
"Speed's Test",
"Yergason Test",
"Crank Test",
"Biceps Load Test II",
"Anterior Slide Test",
"Dynamic Shear Test",
"Compression-Rotation",
], 6.7, 1.1, 3.0, 5.6),
("🟢 AC JOINT &\nOTHER", [
"Scarf (Cross-Body) Test",
"AC Resisted Extension",
"Hamilton Ruler Test",
"Bryant's Test",
"Dugas Test",
"Thoracic Outlet Tests",
"Adson Test",
"Roos Stress Test",
], 9.9, 1.1, 3.1, 5.6),
]
cat_colors = [
(RGBColor(0xC0392B), RGBColor(0xFDEDEC)),
(RGBColor(0xCA6F1E), RGBColor(0xFEF9E7)),
(RGBColor(0x1A5276), RGBColor(0xEAF2FB)),
(RGBColor(0x1E8B4C), RGBColor(0xE9F7EF)),
]
for i, (cat_title, items, cx, cy, cw, ch) in enumerate(categories):
tc, bc = cat_colors[i]
add_rect(slide, cx, cy, cw, ch, fill_color=bc,
line_color=tc, line_width=1.5)
add_rect(slide, cx, cy, cw, 0.5, fill_color=tc)
add_text(slide, cat_title, cx+0.1, cy+0.02, cw-0.2, 0.46,
size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
tb = slide.shapes.add_textbox(Inches(cx+0.15), Inches(cy+0.55),
Inches(cw-0.3), Inches(ch-0.65))
tf = tb.text_frame
tf.word_wrap = True
for j, item in enumerate(items):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(3)
run = p.add_run()
run.text = f"▸ {item}"
run.font.name = "Calibri"
run.font.size = Pt(11)
run.font.color.rgb = DARK_GRAY
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 3 – IMPINGEMENT TESTS (Neer & Hawkins)
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=RGBColor(0x7B, 0x24, 0x1C))
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "IMPINGEMENT TESTS", 0.3, 0.05, 10, 0.8,
size=26, bold=True, color=WHITE)
add_text(slide, "Neer Sign • Hawkins-Kennedy", 10, 0.1, 3, 0.7,
size=13, color=RGBColor(0xFF, 0xCC, 0xAA), align=PP_ALIGN.RIGHT)
tests = [
("NEER IMPINGEMENT SIGN", [
"Position: Patient standing/seated",
"Technique: Examiner stabilises scapula with one hand; passively forward-flexes the arm with elbow extended beyond 90°",
"Positive: Pain in anterior/lateral shoulder (subacromial region)",
"Significance: Subacromial impingement syndrome",
"Sensitivity: ~72% | Specificity: ~66%",
"Relief of pain after subacromial lidocaine injection = Neer Test (positive)",
], 0.3, 1.1, 6.1, 5.6),
("HAWKINS-KENNEDY TEST", [
"Position: Patient seated/standing",
"Technique: Arm forward-flexed to 90° with elbow at 90°; examiner forcefully internally rotates the humerus",
"Positive: Pain reproduced in subacromial space",
"Significance: Supraspinatus tendon compressed against coracoacromial arch",
"Sensitivity: ~79% | Specificity: ~59%",
"Most sensitive test for subacromial impingement",
], 6.6, 1.1, 6.4, 5.6),
]
test_colors = [RGBColor(0x9B, 0x59, 0x4B), RGBColor(0x2E, 0x86, 0xAB)]
for i, (title, bullets, tx, ty, tw, th) in enumerate(tests):
add_rect(slide, tx, ty, tw, th, fill_color=WHITE,
line_color=test_colors[i], line_width=1.5)
add_rect(slide, tx, ty, tw, 0.45, fill_color=test_colors[i])
add_text(slide, title, tx+0.1, ty+0.03, tw-0.2, 0.4,
size=14, bold=True, color=WHITE)
tb = slide.shapes.add_textbox(Inches(tx+0.2), Inches(ty+0.55),
Inches(tw-0.4), Inches(th-0.65))
tf = tb.text_frame
tf.word_wrap = True
for j, b in enumerate(bullets):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(4)
run = p.add_run()
run.text = f"• {b}"
run.font.name = "Calibri"
run.font.size = Pt(12)
run.font.color.rgb = DARK_GRAY
# Try add image
add_image_to_slide(slide,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_addda4e02e47a9c991c41069ace3cb104d5d93d4d501340d3f1e65d8e77674e6.jpg",
9.8, 2.0, 3.3, 3.5)
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 4 – ROTATOR CUFF TESTS
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=RGBColor(0x1A, 0x5C, 0x3A))
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "ROTATOR CUFF TESTS", 0.3, 0.05, 10, 0.8,
size=26, bold=True, color=WHITE)
add_text(slide, "Jobe • Drop-Arm • Lift-Off • Bear-Hug • Belly-Press", 3, 0.1, 10, 0.7,
size=12, color=RGBColor(0xAA, 0xFF, 0xCC), align=PP_ALIGN.RIGHT)
cuff_tests = [
("JOBE (EMPTY CAN) TEST", "Supraspinatus",
["Arm: 90° abduction in scapular plane, fully pronated (thumb down)",
"Examiner applies downward force",
"Positive: Pain or weakness",
"Tests supraspinatus integrity"],
RGBColor(0x1A, 0x5C, 0x3A), 0.3, 1.1, 3.05, 5.6),
("DROP-ARM TEST", "Supraspinatus",
["Arm passively raised to 90° in scapular plane",
"Patient asked to slowly lower the arm",
"Positive: Arm drops suddenly / cannot maintain position",
"Indicates complete supraspinatus tear"],
RGBColor(0x6C, 0x3A, 0x83), 3.5, 1.1, 3.05, 5.6),
("LIFT-OFF TEST (GERBER)", "Subscapularis",
["Arm placed behind back in internal rotation",
"Patient lifts hand away from back against resistance",
"Positive: Cannot lift hand or maintain position",
"Specific for subscapularis tear"],
RGBColor(0x2E, 0x4A, 0x8B), 6.7, 1.1, 3.05, 5.6),
("BEAR-HUG TEST", "Subscapularis",
["Patient places palm of affected side on opposite shoulder",
"Examiner tries to lift hand off shoulder",
"Positive: Cannot maintain contact / elbow drops",
"Tests subscapularis (upper portion)"],
RGBColor(0xB7, 0x50, 0x0F), 9.9, 1.1, 3.1, 5.6),
]
for title, muscle, bullets, col, tx, ty, tw, th in cuff_tests:
add_rect(slide, tx, ty, tw, th, fill_color=WHITE,
line_color=col, line_width=1.5)
add_rect(slide, tx, ty, tw, 0.6, fill_color=col)
add_text(slide, title, tx+0.08, ty+0.02, tw-0.16, 0.32,
size=12, bold=True, color=WHITE)
add_text(slide, f"Muscle: {muscle}", tx+0.08, ty+0.32, tw-0.16, 0.26,
size=10, bold=False, color=RGBColor(0xFF, 0xE0, 0xB0))
tb = slide.shapes.add_textbox(Inches(tx+0.15), Inches(ty+0.68),
Inches(tw-0.3), Inches(th-0.78))
tf = tb.text_frame
tf.word_wrap = True
for j, b in enumerate(bullets):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(3)
run = p.add_run()
run.text = f"▸ {b}"
run.font.name = "Calibri"
run.font.size = Pt(11)
run.font.color.rgb = DARK_GRAY
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 5 – INSTABILITY TESTS (Part 1)
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=RGBColor(0x1A, 0x36, 0x7C))
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "SHOULDER INSTABILITY TESTS – I", 0.3, 0.05, 10, 0.8,
size=26, bold=True, color=WHITE)
add_text(slide, "Apprehension • Relocation • Load-and-Shift • Sulcus Sign", 3, 0.1, 10, 0.7,
size=12, color=RGBColor(0xAA, 0xCC, 0xFF), align=PP_ALIGN.RIGHT)
instab_tests = [
("APPREHENSION TEST\n(Crank Test)", [
"Position: Supine or seated",
"Arm: Abducted 90°, elbow flexed 90°",
"Examiner applies passive external rotation",
"Positive: Patient feels apprehension / sense of impending dislocation",
"Indicates anterior glenohumeral instability",
"Sensitivity: ~50–72% | Specificity: ~96–99%",
], RGBColor(0x1A, 0x36, 0x7C), 0.3, 1.1, 6.0, 5.6),
("RELOCATION TEST (JOBE)", [
"Follows positive Apprehension Test",
"Examiner applies posterior force on humeral head",
"While maintaining 90° abd + ER position",
"Positive: Relief of apprehension/pain with posterior pressure",
"Confirms anterior glenohumeral instability",
"Most specific for anterior instability (specificity ~87%)",
], RGBColor(0x17, 0x6B, 0x3C), 6.6, 1.1, 6.4, 3.8),
("SULCUS SIGN", [
"Downward traction applied to arm at side",
"Positive: Dimple/sulcus appears below acromion",
"Grade 1: <1cm | Grade 2: 1-2cm | Grade 3: >2cm",
"Indicates inferior instability / capsular laxity",
], RGBColor(0x7D, 0x31, 0x08), 6.6, 5.1, 6.4, 1.6),
]
for title, bullets, col, tx, ty, tw, th in instab_tests:
add_rect(slide, tx, ty, tw, th, fill_color=WHITE,
line_color=col, line_width=1.5)
add_rect(slide, tx, ty, tw, 0.5, fill_color=col)
t_lines = title.count("\n") + 1
add_text(slide, title, tx+0.1, ty+0.03, tw-0.2, 0.46,
size=13, bold=True, color=WHITE)
tb = slide.shapes.add_textbox(Inches(tx+0.18), Inches(ty+0.55),
Inches(tw-0.36), Inches(th-0.65))
tf = tb.text_frame
tf.word_wrap = True
for j, b in enumerate(bullets):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(3)
run = p.add_run()
run.text = f"• {b}"
run.font.name = "Calibri"
run.font.size = Pt(12)
run.font.color.rgb = DARK_GRAY
# Add image
add_image_to_slide(slide,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a63c393126ff0cef480cf8dc504c876ebb56b64549385316dcc8d30fcfffcb90.jpg",
0.3, 3.6, 2.8, 2.8)
add_image_to_slide(slide,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a805aaa1975b204cb2110ed0276593ad20c3f2c6704b298eeb4860ae0145fefb.jpg",
3.3, 3.6, 2.8, 2.8)
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 6 – INSTABILITY TESTS (Part 2) – Load & Shift + Drawer
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=RGBColor(0x1A, 0x36, 0x7C))
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "SHOULDER INSTABILITY TESTS – II", 0.3, 0.05, 10, 0.8,
size=26, bold=True, color=WHITE)
drawer_tests = [
("LOAD-AND-SHIFT TEST", [
"Patient seated, arm at side",
"Examiner loads humeral head into glenoid, then applies anterior and posterior forces",
"Grading: 0=normal, 1=humeral head to glenoid rim, 2=over rim but reduces, 3=locks over rim",
"Assesses degree of glenohumeral laxity and instability direction",
"Performed in 0°, 45°, and 90° of abduction",
], RGBColor(0x2E, 0x4A, 0x8B), 0.3, 1.1, 6.2, 5.6),
("ANTERIOR DRAWER TEST", [
"Patient seated, arm in slight abduction",
"Examiner stabilises scapula, grasps proximal humerus",
"Applies anterior-directed force on humeral head",
"Positive: Anterior translation > 50% humeral head diameter",
"Indicates anterior capsulolabral insufficiency",
], RGBColor(0x4A, 0x23, 0x6F), 6.7, 1.1, 3.0, 5.6),
("POSTERIOR DRAWER TEST", [
"Arm forward-flexed 60–80°, elbow at 90°",
"Examiner applies posteriorly directed force on humeral head",
"Positive: Posterior subluxation or pain",
"Indicates posterior instability",
], RGBColor(0x7D, 0x31, 0x08), 9.9, 1.1, 3.1, 3.5),
("GAGEY HYPERABDUCTION TEST", [
"Examiner stabilises scapula",
"Passively abducts arm beyond 105°",
"Positive: Passive abduction > 105°",
"Indicates inferior capsule laxity",
], RGBColor(0x1A, 0x5C, 0x3A), 9.9, 4.8, 3.1, 1.9),
]
for title, bullets, col, tx, ty, tw, th in drawer_tests:
add_rect(slide, tx, ty, tw, th, fill_color=WHITE,
line_color=col, line_width=1.5)
add_rect(slide, tx, ty, tw, 0.45, fill_color=col)
add_text(slide, title, tx+0.1, ty+0.03, tw-0.2, 0.4,
size=13, bold=True, color=WHITE)
tb = slide.shapes.add_textbox(Inches(tx+0.15), Inches(ty+0.53),
Inches(tw-0.3), Inches(th-0.62))
tf = tb.text_frame
tf.word_wrap = True
for j, b in enumerate(bullets):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(3)
run = p.add_run()
run.text = f"• {b}"
run.font.name = "Calibri"
run.font.size = Pt(12)
run.font.color.rgb = DARK_GRAY
add_image_to_slide(slide,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_417149005761d26c29ccecc172cef9b904b63ee8276f44a0e193f3ec14806a5d.jpg",
0.3, 4.0, 2.8, 2.6)
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 7 – LABRUM / BICEPS TESTS
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=RGBColor(0x6C, 0x3A, 0x83))
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "LABRUM & BICEPS TESTS", 0.3, 0.05, 10, 0.8,
size=26, bold=True, color=WHITE)
add_text(slide, "SLAP Lesions • Biceps Tendon Pathology", 3, 0.1, 10, 0.7,
size=14, color=RGBColor(0xE0, 0xCC, 0xFF), align=PP_ALIGN.RIGHT)
labrum_tests = [
("O'BRIEN ACTIVE COMPRESSION TEST", [
"Arm: 90° FF, 10–15° adduction across midline, maximal internal rotation (thumb down)",
"Examiner applies downward force → patient resists",
"Repeat in supination (palm up)",
"Positive SLAP: Pain on top of shoulder, relieved in supination",
"Positive AC joint: Deep joint pain relieved in supination",
"Sensitivity ~47–67% | Specificity ~37–99%",
], RGBColor(0x6C, 0x3A, 0x83), 0.3, 1.1, 6.2, 5.6),
("SPEED'S TEST", [
"Arm: 90° FF, elbow extended, forearm supinated",
"Examiner resists further forward flexion",
"Positive: Pain in bicipital groove",
"Indicates biceps tendinopathy or SLAP lesion",
"Sensitivity ~32–69% | Specificity ~55–67%",
], RGBColor(0x1A, 0x5C, 0x87), 6.7, 1.1, 6.4, 2.85),
("YERGASON TEST", [
"Elbow at 90° flexion, forearm pronated",
"Patient resists supination + external rotation against examiner",
"Positive: Pain in bicipital groove",
"Indicates biceps tendon pathology (long head)",
"Tests bicipital groove integrity (transverse humeral ligament)",
], RGBColor(0x0F, 0x5E, 0x3A), 6.7, 4.1, 6.4, 2.6),
]
for title, bullets, col, tx, ty, tw, th in labrum_tests:
add_rect(slide, tx, ty, tw, th, fill_color=WHITE,
line_color=col, line_width=1.5)
add_rect(slide, tx, ty, tw, 0.45, fill_color=col)
add_text(slide, title, tx+0.1, ty+0.02, tw-0.2, 0.42,
size=13, bold=True, color=WHITE)
tb = slide.shapes.add_textbox(Inches(tx+0.15), Inches(ty+0.52),
Inches(tw-0.3), Inches(th-0.62))
tf = tb.text_frame
tf.word_wrap = True
for j, b in enumerate(bullets):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(3)
run = p.add_run()
run.text = f"• {b}"
run.font.name = "Calibri"
run.font.size = Pt(12)
run.font.color.rgb = DARK_GRAY
# Add image - Speed's test
add_image_to_slide(slide,
"https://cdn.orris.care/cdss_images/pmc_clinical_VQA_addda4e02e47a9c991c41069ace3cb104d5d93d4d501340d3f1e65d8e77674e6.jpg",
0.3, 4.5, 2.8, 2.1)
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 8 – AC JOINT & SPECIAL TESTS
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=RGBColor(0x4A, 0x23, 0x00))
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "AC JOINT & OTHER SPECIAL TESTS", 0.3, 0.05, 10, 0.8,
size=26, bold=True, color=WHITE)
ac_tests = [
("SCARF / CROSS-BODY TEST", [
"Examiner passively adducts arm across chest (cross-body adduction)",
"Positive: Pain localised to AC joint",
"Most sensitive test for AC joint pathology",
"Also evaluates posterior capsule tightness",
], RGBColor(0x6B, 0x2D, 0x0F), 0.3, 1.1, 4.1, 3.0),
("HAMILTON RULER TEST", [
"Normal shoulder: straight ruler from acromion to lateral epicondyle passes away from medial epicondyle",
"In dislocation: ruler can rest simultaneously on acromion + lateral epicondyle because head is displaced",
"Positive: Ruler touches both points simultaneously",
"Indicates anterior shoulder dislocation",
], RGBColor(0x1A, 0x5C, 0x87), 4.6, 1.1, 4.1, 3.0),
("DUGAS TEST", [
"Patient places hand of affected arm on opposite shoulder",
"Attempts to touch chest with elbow",
"Positive: Cannot touch chest with elbow (or bring elbow to chest)",
"Indicates anterior shoulder dislocation",
], RGBColor(0x1A, 0x5C, 0x3A), 9.0, 1.1, 4.0, 3.0),
("ADSON TEST (Thoracic Outlet)", [
"Patient takes deep breath, extends neck, rotates chin toward tested side",
"Examiner monitors radial pulse",
"Positive: Diminished or absent radial pulse",
"Indicates thoracic outlet syndrome (scalene compression)",
], RGBColor(0x4A, 0x23, 0x6F), 0.3, 4.3, 4.1, 2.9),
("ROOS STRESS TEST (EAST)", [
"Arms abducted 90°, elbows flexed 90° (surrender position)",
"Patient opens and closes hands for 3 minutes",
"Positive: Inability to complete test, arm heaviness/pain/paresthesia",
"Indicates thoracic outlet syndrome",
], RGBColor(0x0F, 0x5E, 0x3A), 4.6, 4.3, 4.1, 2.9),
("BRYANT'S TEST", [
"Examiner notes level of anterior and posterior axillary folds on both sides",
"Positive: Lowering of anterior axillary fold = posterior dislocation",
"Lowering of posterior axillary fold = anterior dislocation",
"Simple bedside test for shoulder dislocation",
], RGBColor(0x7D, 0x31, 0x08), 9.0, 4.3, 4.0, 2.9),
]
for title, bullets, col, tx, ty, tw, th in ac_tests:
add_rect(slide, tx, ty, tw, th, fill_color=WHITE,
line_color=col, line_width=1.5)
add_rect(slide, tx, ty, tw, 0.42, fill_color=col)
add_text(slide, title, tx+0.08, ty+0.02, tw-0.16, 0.38,
size=11.5, bold=True, color=WHITE)
tb = slide.shapes.add_textbox(Inches(tx+0.12), Inches(ty+0.48),
Inches(tw-0.24), Inches(th-0.56))
tf = tb.text_frame
tf.word_wrap = True
for j, b in enumerate(bullets):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(2)
run = p.add_run()
run.text = f"• {b}"
run.font.name = "Calibri"
run.font.size = Pt(10.5)
run.font.color.rgb = DARK_GRAY
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 9 – BELLY-PRESS & HORN-BLOWER + More Cuff
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=RGBColor(0x1A, 0x5C, 0x3A))
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "ROTATOR CUFF – ADDITIONAL TESTS", 0.3, 0.05, 10, 0.8,
size=26, bold=True, color=WHITE)
add_text(slide, "Belly-Press • Horn-Blower • Rubber Band • External Rotation Lag", 3, 0.1, 10, 0.7,
size=12, color=RGBColor(0xAA, 0xFF, 0xCC), align=PP_ALIGN.RIGHT)
more_tests = [
("BELLY-PRESS (NAPOLEON) TEST", "Subscapularis",
["Patient presses hand against abdomen, elbow in front of body",
"Examiner tries to pull elbow posteriorly",
"Positive: Wrist flexes (patient compensates), elbow falls back",
"Indicates subscapularis tear (especially inferior part)"],
RGBColor(0x1A, 0x5C, 0x3A), 0.3, 1.1, 3.05, 5.6),
("HORN-BLOWER SIGN", "Teres Minor / Infraspinatus",
["Arm abducted 90°, elbow at 90°",
"Examiner resists maximal external rotation",
"Positive: Patient raises elbow to 'blow a horn' to compensate",
"Indicates teres minor or posterior supraspinatus lesion"],
RGBColor(0x8B, 0x44, 0x13), 3.5, 1.1, 3.05, 5.6),
("EXTERNAL ROTATION LAG SIGN", "Infraspinatus",
["Arm at 90° abduction, near-maximal ER passively",
"Examiner releases; patient maintains position",
"Positive: Arm falls into IR (lag sign present)",
"Highly specific for infraspinatus/teres minor tear",
"Sensitivity ~56–70% | Specificity ~98–100%"],
RGBColor(0x2E, 0x4A, 0x8B), 6.7, 1.1, 3.05, 5.6),
("INTERNAL ROTATION LAG SIGN", "Subscapularis",
["Arm behind back in near-maximal IR",
"Examiner releases; patient maintains position",
"Positive: Arm falls into ER (cannot maintain IR)",
"Highly specific for subscapularis tear"],
RGBColor(0x6C, 0x3A, 0x83), 9.9, 1.1, 3.1, 5.6),
]
for title, muscle, bullets, col, tx, ty, tw, th in more_tests:
add_rect(slide, tx, ty, tw, th, fill_color=WHITE,
line_color=col, line_width=1.5)
add_rect(slide, tx, ty, tw, 0.62, fill_color=col)
add_text(slide, title, tx+0.08, ty+0.02, tw-0.16, 0.32,
size=11.5, bold=True, color=WHITE)
add_text(slide, f"Muscle: {muscle}", tx+0.08, ty+0.33, tw-0.16, 0.26,
size=10, bold=False, color=RGBColor(0xFF, 0xE0, 0xB0))
tb = slide.shapes.add_textbox(Inches(tx+0.15), Inches(ty+0.70),
Inches(tw-0.3), Inches(th-0.80))
tf = tb.text_frame
tf.word_wrap = True
for j, b in enumerate(bullets):
p = tf.paragraphs[0] if j == 0 else tf.add_paragraph()
p.space_before = Pt(3)
run = p.add_run()
run.text = f"▸ {b}"
run.font.name = "Calibri"
run.font.size = Pt(11)
run.font.color.rgb = DARK_GRAY
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 10 – SENSITIVITY / SPECIFICITY SUMMARY TABLE
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=DARK_BLUE)
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "DIAGNOSTIC ACCURACY – SENSITIVITY & SPECIFICITY", 0.3, 0.05, 12.7, 0.8,
size=22, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
# Table headers
headers = ["Test", "Condition Tested", "Sensitivity", "Specificity", "Notes"]
col_widths = [3.0, 3.2, 1.7, 1.7, 3.3]
col_xs = [0.3]
for cw in col_widths[:-1]:
col_xs.append(col_xs[-1] + cw + 0.05)
row_h = 0.47
header_y = 1.05
for ci, (hdr, cw, cx) in enumerate(zip(headers, col_widths, col_xs)):
add_rect(slide, cx, header_y, cw, row_h, fill_color=MED_BLUE)
add_text(slide, hdr, cx+0.05, header_y+0.03, cw-0.1, row_h-0.06,
size=12, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
table_data = [
["Hawkins-Kennedy", "Impingement", "79%", "59%", "Most sensitive for impingement"],
["Neer Sign", "Impingement", "72%", "66%", "Less specific than Hawkins"],
["Jobe (Empty Can)", "Supraspinatus", "69%", "66%", "Pain or weakness positive"],
["Drop-Arm Test", "Full cuff tear", "35%", "88%", "High specificity for full tear"],
["Apprehension Test", "Ant. Instability","72%", "99%", "Gold standard for instability"],
["Relocation Test", "Ant. Instability","81%", "87%", "Follows Apprehension Test"],
["Sulcus Sign", "Inf. Instability","72%", "85%", "Graded 0–III"],
["O'Brien Test", "SLAP Lesion", "63%", "73%", "Pain top of shoulder = SLAP"],
["Speed's Test", "Biceps/SLAP", "54%", "61%", "Pain in bicipital groove"],
["Scarf Test", "AC Joint", "79%", "50%", "Most sensitive for AC path"],
["ER Lag Sign", "Infraspinatus", "56%", "99%", "Very high specificity"],
["Lift-Off Test", "Subscapularis", "62%", "89%", "Cannot lift from back"],
]
row_colors = [WHITE, RGBColor(0xEB, 0xF5, 0xFB)]
for ri, row in enumerate(table_data):
ry = header_y + row_h + ri * row_h
for ci, (val, cw, cx) in enumerate(zip(row, col_widths, col_xs)):
rc = row_colors[ri % 2]
if ci in (2, 3):
# Colour code sensitivity/specificity
try:
pct = int(val.replace("%", ""))
if pct >= 75:
rc = RGBColor(0xD5, 0xF5, 0xE3) # green
elif pct >= 60:
rc = RGBColor(0xFE, 0xF9, 0xE7) # yellow
else:
rc = RGBColor(0xFD, 0xED, 0xEC) # red
except:
pass
add_rect(slide, cx, ry, cw, row_h, fill_color=rc,
line_color=RGBColor(0xCC, 0xCC, 0xCC), line_width=0.5)
add_text(slide, val, cx+0.05, ry+0.02, cw-0.1, row_h-0.04,
size=10.5, color=DARK_GRAY, align=PP_ALIGN.CENTER if ci in (2,3) else PP_ALIGN.LEFT)
add_text(slide, "Green ≥75% | Yellow 60–74% | Red <60%",
0.3, 7.05, 12, 0.38, size=10, color=RGBColor(0x55, 0x55, 0x55), align=PP_ALIGN.CENTER)
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 11 – CLINICAL ALGORITHM / HOW TO APPROACH
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=LIGHT_GRAY)
add_rect(slide, 0, 0, 13.333, 0.9, fill_color=DARK_BLUE)
add_rect(slide, 0, 0.9, 13.333, 0.06, fill_color=ACCENT)
add_text(slide, "CLINICAL APPROACH TO SHOULDER EXAMINATION", 0.3, 0.05, 12.7, 0.8,
size=21, bold=True, color=WHITE, align=PP_ALIGN.LEFT)
# Flow boxes
steps = [
("1. HISTORY", "Pain location • Onset • Mechanism\nInstability episodes • Overhead activity\nNight pain (cuff) • Clicking (SLAP)", DARK_BLUE),
("2. INSPECTION", "Muscle wasting (deltoid, supraspinatus)\nAsymmetry • Scapular winging\nBryant's test • Deformity", MED_BLUE),
("3. PALPATION", "AC joint • Bicipital groove • Greater tuberosity\nHamilton's ruler test • Dugas test\nTenderness mapping", RGBColor(0x1A, 0x5C, 0x3A)),
("4. RANGE OF MOTION", "Active → Passive → Resisted\nPainful arc (60–120°) = impingement\nCapsular pattern (ER > Abd > IR)", RGBColor(0x7D, 0x31, 0x08)),
]
bw = 2.9
bh = 4.8
bys = 1.1
bxs = [0.3, 3.4, 6.5, 9.6]
for i, (title, content, col) in enumerate(steps):
bx = bxs[i]
add_rect(slide, bx, bys, bw, bh, fill_color=WHITE,
line_color=col, line_width=1.5)
add_rect(slide, bx, bys, bw, 0.5, fill_color=col)
add_text(slide, title, bx+0.1, bys+0.03, bw-0.2, 0.44,
size=13, bold=True, color=WHITE, align=PP_ALIGN.CENTER)
add_text(slide, content, bx+0.12, bys+0.6, bw-0.24, bh-0.75,
size=11.5, color=DARK_GRAY, wrap=True, valign=MSO_ANCHOR.TOP)
# Second row – special tests selection
add_rect(slide, 0.3, 6.1, 12.7, 1.2, fill_color=DARK_BLUE)
add_text(slide, "5. SPECIAL TESTS",
0.4, 6.12, 2.5, 0.35, size=13, bold=True, color=ACCENT)
add_text(slide,
"Impingement → Neer + Hawkins-Kennedy | Rotator Cuff → Jobe, Drop-Arm, Lift-Off, Bear-Hug\n"
"Instability → Apprehension + Relocation + Load-and-Shift + Sulcus | SLAP → O'Brien + Speed's\n"
"AC Joint → Scarf Test | Dislocation → Hamilton's Ruler + Dugas Test + Bryant's Test",
0.4, 6.47, 12.6, 0.8, size=11, color=WHITE, wrap=True, valign=MSO_ANCHOR.TOP)
# ════════════════════════════════════════════════════════════════════════════
# SLIDE 12 – KEY POINTS SUMMARY
# ════════════════════════════════════════════════════════════════════════════
slide = prs.slides.add_slide(blank)
add_rect(slide, 0, 0, 13.333, 7.5, fill_color=DARK_BLUE)
add_rect(slide, 0, 0, 0.3, 7.5, fill_color=ACCENT)
add_rect(slide, 0.3, 0, 13.033, 0.9, fill_color=RGBColor(0x1A, 0x45, 0x80))
add_text(slide, "KEY POINTS TO REMEMBER", 0.6, 0.05, 12.5, 0.8,
size=26, bold=True, color=WHITE)
key_points = [
("Impingement Tests", "Hawkins-Kennedy is most sensitive (79%); Neer sign less specific. Always confirm with subacromial injection test."),
("Rotator Cuff Tears", "Drop-arm (full tear), Jobe/Empty Can (supraspinatus), Lift-Off/Bear-Hug (subscapularis), ER Lag Sign (infraspinatus – near 100% specific)."),
("Instability", "Apprehension Test most specific (99%) for anterior instability. Relocation test confirms. Sulcus sign assesses inferior laxity."),
("SLAP Lesions", "O'Brien test (active compression) is standard; pain on top relieved by supination. Combine with Speed's and Yergason for biceps pathology."),
("AC Joint", "Scarf (cross-body adduction) test is most sensitive. O'Brien also positive for AC joint (deep pain vs top pain for SLAP)."),
("Dislocation", "Hamilton's ruler + Dugas test + Bryant's test form the classic triad for confirming shoulder dislocation. Always compare both sides."),
]
for i, (heading, text) in enumerate(key_points):
ky = 1.1 + i * 1.05
add_rect(slide, 0.6, ky, 12.4, 0.95, fill_color=RGBColor(0x1E, 0x4A, 0x80),
line_color=ACCENT, line_width=0.8)
add_rect(slide, 0.6, ky, 3.0, 0.95, fill_color=RGBColor(0x14, 0x35, 0x60))
add_text(slide, heading, 0.68, ky+0.05, 2.84, 0.85,
size=12, bold=True, color=ACCENT, align=PP_ALIGN.LEFT, valign=MSO_ANCHOR.MIDDLE)
add_text(slide, text, 3.72, ky+0.04, 9.1, 0.88,
size=11.5, color=RGBColor(0xDD, 0xEE, 0xFF), wrap=True, valign=MSO_ANCHOR.MIDDLE)
# ════════════════════════════════════════════════════════════════════════════
# SAVE
# ════════════════════════════════════════════════════════════════════════════
output_path = "/tmp/workspace/shoulder-ppt/Special_Tests_Shoulder_Joint.pptx"
prs.save(output_path)
print(f"Saved: {output_path}")
cd /tmp/workspace/shoulder-ppt && python build_ppt.py 2>&1
~/shoulder-ppt/build_ppt.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/shoulder-ppt/build_ppt.py'
cd /tmp/workspace/shoulder-ppt && python build_ppt.py 2>&1
cd /tmp/workspace/shoulder-ppt && python -c " import requests, base64, json from io import BytesIO urls = [ 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_addda4e02e47a9c991c41069ace3cb104d5d93d4d501340d3f1e65d8e77674e6.jpg', 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a63c393126ff0cef480cf8dc504c876ebb56b64549385316dcc8d30fcfffcb90.jpg', 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_a805aaa1975b204cb2110ed0276593ad20c3f2c6704b298eeb4860ae0145fefb.jpg', 'https://cdn.orris.care/cdss_images/pmc_clinical_VQA_417149005761d26c29ccecc172cef9b904b63ee8276f44a0e193f3ec14806a5d.jpg', ] for u in urls: r = requests.get(u, timeout=15) print(u[-20:], r.status_code, len(r.content)) " 2>&1 | head -20
~/shoulder-ppt/build_ppt.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/shoulder-ppt/build_ppt.py'
~/shoulder-ppt/build_ppt.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/shoulder-ppt/build_ppt.py'
cd /tmp/workspace/shoulder-ppt && python build_ppt.py 2>&1
python -c " from pptx import Presentation prs = Presentation('/tmp/workspace/shoulder-ppt/Special_Tests_Shoulder_Joint.pptx') print(f'Slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides, 1): texts = [s.text_frame.text.strip()[:50] for s in slide.shapes if s.has_text_frame and s.text_frame.text.strip()] print(f' Slide {i}: {texts[0] if texts else \"(no text)\"}') import os print(f'File size: {os.path.getsize(\"/tmp/workspace/shoulder-ppt/Special_Tests_Shoulder_Joint.pptx\")/1024:.1f} KB') "
Special Tests Shoulder Joint
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title Slide - Professional dark blue design |
| 2 | Classification Overview - 4-category colour-coded grid (Impingement, Instability, Labrum/Biceps, AC Joint & Other) |
| 3 | Impingement Tests - Neer Sign + Hawkins-Kennedy (with clinical photo) |
| 4 | Rotator Cuff Tests - Jobe/Empty Can, Drop-Arm, Lift-Off (Gerber), Bear-Hug |
| 5 | Instability Tests I - Apprehension, Relocation, Sulcus Sign (with clinical photos) |
| 6 | Instability Tests II - Load-and-Shift, Anterior & Posterior Drawer, Gagey |
| 7 | Labrum & Biceps Tests - O'Brien Active Compression, Speed's, Yergason |
| 8 | AC Joint & Other Tests - Scarf, Hamilton Ruler, Dugas, Adson, Roos, Bryant's |
| 9 | Additional Rotator Cuff - Belly-Press, Horn-Blower, ER/IR Lag Signs |
| 10 | Sensitivity & Specificity Table - Colour-coded accuracy table for 12 tests |
| 11 | Clinical Approach Algorithm - Step-by-step examination flow |
| 12 | Key Points Summary - High-yield recall card for each category |