Cardio assessment as per megha sheth easy to remember how to assess in physiotherapy
Megha Sheth cardiovascular assessment physiotherapy mnemonic
As per this tricks
cd /tmp/workspace/attachments/6695a5c5-1083-4551-8aa2-40c1ff295c00 && python3 -c " import pdfplumber with pdfplumber.open('Cardio respiratory assessment- Shaswat sir_260821_232403.pdf') as pdf: print('pages', len(pdf.pages)) for i,page in enumerate(pdf.pages): t = page.extract_text() print('--- page', i+1, '---') print(t) "
| Item | Trick to remember |
|---|---|
| Name | Identification, always address patient by name |
| Age | Age-related impairment + functional level + treatment planning |
| Sex | Gender-related cardiorespiratory disorders |
| Occupation | Occupational disease + job physical demand + working posture (tells you which body segment is most involved) |
| Address | Environmental exposure clue |
| Color | Meaning |
|---|---|
| Rust | Pneumonia |
| Purple | Neoplasm/tumor |
| Yellow | Infective |
| Green | Pseudomonas infection |
| Pink/white frothy | Pulmonary edema |
| Black specks | Smoke inhalation |
| Sand-like | Aspiration |
| Brown | Chronic smoker |
| Apple green | Hemophilus infection |
| Sound | Pathology |
|---|---|
| Tympanic | Stomach (gastric bubble) |
| Hyperresonant | Pneumothorax/Emphysema |
| Normal resonant | Normal lung |
| Dull | Consolidation |
| Stony dull | Tumor/effusion |
See properly pdf few things r missing with tricks give me
cd /tmp/workspace/attachments/6695a5c5-1083-4551-8aa2-40c1ff295c00 && python3 -c " import fitz doc = fitz.open('Cardio respiratory assessment- Shaswat sir_260821_232403.pdf') print(len(doc)) for i in [4,5,6,8,10]: page = doc[i] pix = page.get_pixmap(dpi=250) pix.save(f'page_{i+1}.png') print('saved', i+1) "
cd /tmp/workspace/attachments/6695a5c5-1083-4551-8aa2-40c1ff295c00 && python3 -c " import pdfplumber with pdfplumber.open('Cardio respiratory assessment- Shaswat sir_260821_232403.pdf') as pdf: for i in [4,5,6,8,10]: page = pdf.pages[i] im = page.to_image(resolution=250) im.save(f'page_{i+1}.png') print('saved', i+1) "
| Score | Meaning |
|---|---|
| 1 | Nothing |
| 2 | Very Easy |
| 3 | Easy |
| 4 | Comfortable |
| 5 | Somewhat difficult |
| 6 | Difficult |
| 7 | Hard |
| 8 | Very Hard |
| 9 | Extremely Hard |
| 10 | Exhausted |
| Type | Character |
|---|---|
| Pleuritic | Worse on inspiration; sharp, short, stabbing |
| Cardiac | Dull, central, radiates to neck/jaw/arm; increases with cough, deep breathing, lying flat |
| Pericardial | Same as anginal pain but also increased by cough/DBE/position (central) |
| Tracheitis | Burning pain over anterior central chest |
| Musculoskeletal | Localized; may originate from muscle, bone or joint; worse with chest/arm movement |
Everthing together u give me
mkdir -p /tmp/workspace/cardio-resp-assessment && ls -la /tmp/workspace/
~/cardio-resp-assessment/build_doc.py
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
doc = Document()
style = doc.styles["Normal"]
style.font.name = "Calibri"
style.font.size = Pt(11)
BLUE = RGBColor(0x1F, 0x4E, 0x79)
RED = RGBColor(0xC0, 0x00, 0x00)
GREEN = RGBColor(0x00, 0x60, 0x00)
def set_cell_shading(cell, color_hex):
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), color_hex)
cell._tc.get_or_add_tcPr().append(shd)
def add_table(headers, rows, widths=None):
table = doc.add_table(rows=1, cols=len(headers))
table.style = 'Light Grid Accent 1'
table.alignment = WD_TABLE_ALIGNMENT.CENTER
hdr = table.rows[0].cells
for i, h in enumerate(headers):
hdr[i].text = h
for p in hdr[i].paragraphs:
for r in p.runs:
r.bold = True
r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
set_cell_shading(hdr[i], "1F4E79")
for row in rows:
cells = table.add_row().cells
for i, val in enumerate(row):
cells[i].text = str(val)
doc.add_paragraph("")
return table
def h1(text):
p = doc.add_heading(text, level=1)
for r in p.runs:
r.font.color.rgb = BLUE
def h2(text):
p = doc.add_heading(text, level=2)
for r in p.runs:
r.font.color.rgb = BLUE
def h3(text):
p = doc.add_heading(text, level=3)
for r in p.runs:
r.font.color.rgb = RED
def bullet(text, bold_prefix=None):
p = doc.add_paragraph(style='List Bullet')
if bold_prefix:
run = p.add_run(bold_prefix)
run.bold = True
p.add_run(text)
else:
p.add_run(text)
def trick(text):
p = doc.add_paragraph()
run = p.add_run("TRICK: ")
run.bold = True
run.font.color.rgb = GREEN
p.add_run(text)
def para(text, italic=False):
p = doc.add_paragraph()
r = p.add_run(text)
r.italic = italic
# ---------------- COVER ----------------
title = doc.add_heading("CARDIO-RESPIRATORY ASSESSMENT", level=0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
sub = doc.add_paragraph("Complete Assessment Format with Easy-to-Remember Tricks & Mnemonics")
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
sub.runs[0].italic = True
sub.runs[0].font.size = Pt(13)
note = doc.add_paragraph("Compiled from: Shaswat Verma, MPT, Dept. of Physiotherapy, MSRMTH, Bangalore (original notes) + consolidated clinical tricks")
note.alignment = WD_ALIGN_PARAGRAPH.CENTER
note.runs[0].font.size = Pt(10)
note.runs[0].font.color.rgb = RGBColor(0x60,0x60,0x60)
doc.add_page_break()
# ---------------- OVERVIEW ----------------
h1("Overall Sequence")
para("Demographics -> Subjective (HOPI) -> Past / Personal / Family / Occupational / Socioeconomic History -> Objective Exam (Vitals -> Inspection -> Palpation -> Percussion -> Auscultation -> Special Tests) -> Investigations -> Exercise Tolerance Testing -> Problem List & Goals")
trick("Remember it as 'Demo-HOPI-History-VIPPA-Special-Invest-Exercise-Goals'")
# ---------------- 1. DEMOGRAPHICS ----------------
h1("1. Demographic Data - Why We Ask Each Thing")
add_table(
["Item", "Clinical reason / Trick"],
[
["Name", "Identification - always call the patient by name"],
["Age", "Age-related impairment + functional level + treatment planning"],
["Sex", "Gender-related cardiorespiratory disorders"],
["Occupation", "Occupational disease + physical demand of job + working posture (tells which body segment is most involved) + vocational management"],
["Address", "Environmental exposure clue"],
["Chief Complaint", "Always recorded in the PATIENT'S OWN LANGUAGE"],
]
)
# ---------------- 2. HOPI ----------------
h1("2. History of Present Illness (HOPI)")
trick("Every symptom (Cough, Sputum, Dyspnea, Haemoptysis, Chest Pain, Fever) follows the SAME template - once you know it, you don't need to memorize 6 separate lists:")
para("O-D-F-A-R-C-S-Q = Onset - Duration - Frequency - Aggravating factor - Relieving factor - Course (onset till now) - Severity - Quality/Characteristics (+ Associated factors)")
h2("A. COUGH")
add_table(
["Cough character", "Suggests"],
[
["Dry", "Smoker's cough"],
["Non-productive -> productive", "Carcinoma / tumor"],
["Persistent", "TB"],
["Since childhood", "Bronchiectasis"],
["Initially dry & painful -> productive", "Lobar pneumonia"],
["Barking", "Laryngeal or tracheal disease"],
]
)
h3("Cough Grades (I to IV)")
trick("Pattern = '3 months/2yrs -> several/week -> mornings only -> all day'")
add_table(
["Grade", "Description"],
[
["I", "Cough for 3 consecutive months or more per year, for 2 consecutive years"],
["II", "Bouts of cough 4-6 times/day or more, several days a week"],
["III", "Morning cough on most days of the week, throughout the year"],
["IV", "Daily persistent cough"],
["Normal", "Occasional cough, usually with common cold"],
]
)
h3("Cough Complications")
trick("Mnemonic 'SHIRT-BUHV': Syncope, Headache, Inguinal hernia, Rib fracture, muscle Tear, Backache, Urinary incontinence, Hematoma, Vertebral compression fracture")
h2("B. SPUTUM")
h3("Colour = Diagnosis (classic bedside trick)")
add_table(
["Colour", "Meaning"],
[
["Rust", "Pneumonia"],
["Purple", "Neoplasm / tumour"],
["Yellow", "Infective"],
["Green", "Pseudomonas infection"],
["Pink / white, frothy", "Pulmonary oedema, smoke inhalation"],
["Black specks", "Smoke inhalation / soot"],
["Sand-like", "Aspiration"],
["Brown", "Chronic smoker"],
["Apple green", "Haemophilus infection"],
]
)
h3("Quality")
bullet("Mucoid / Mucopurulent / Purulent")
h3("Sputum Purulence Grading")
add_table(
["Grade", "Description"],
[
["M1", "Mucoid, no suspicion of pus"],
["M2", "Predominantly mucoid, suspicion of pus"],
["P1", "1/3 purulent, 2/3 mucoid"],
["P2", "2/3 purulent, 1/3 mucoid"],
["P3", "Fully (2/3+) purulent"],
]
)
h3("Sputum Frequency Grades (I-IV)")
trick("Same pattern as cough grading: 3 months -> twice/day -> morning only -> all day")
bullet("Smell: Neutral or Foul (foul = anaerobic infection)")
h2("C. DYSPNOEA")
h3("Position-Related Names")
trick("Mnemonic 'OPT + PND'")
add_table(
["Term", "Meaning"],
[
["Orthopnoea", "Breathless on lying flat"],
["Platypnoea", "Breathless on sitting up from supine"],
["Trepopnoea", "Breathless in side-lying"],
["PND", "Paroxysmal Nocturnal Dyspnoea"],
]
)
h3("NYHA Grading (I-IV)")
trick("Pattern = 'Severe -> Ordinary -> Mild -> Rest'")
add_table(
["Grade", "Description"],
[
["I", "No symptoms with ordinary activity; breathlessness only with severe exertion"],
["II", "Symptoms with ordinary activity e.g. walking upstairs, carrying loads"],
["III", "Symptoms with mild exertion e.g. bathing, dressing"],
["IV", "Symptoms at rest"],
]
)
h3("Scales used")
bullet("BDI/TDI (Baseline / Transitional Dyspnoea Index)")
bullet("VAS for breathlessness")
bullet("Modified Borg Scale (0-10, category-ratio: e.g. 0.5 = very very light, 10 = maximal)")
h2("D. WHEEZE")
para("Assessed exactly like cough: Onset -> Progression -> Continuous or intermittent")
h2("E. HAEMOPTYSIS")
trick("Frank blood / Blood streaking -> think TB, Bronchiectasis, Late-stage Pneumonia")
bullet("Check: onset, duration, frequency, course, any previous episodes")
h2("F. CHEST PAIN")
h3("Quality/Character = Diagnosis (the most useful clinical differentiator)")
add_table(
["Type", "Character"],
[
["Pleuritic chest pain", "Worse on inspiration; sharp, short, stabbing"],
["Cardiac chest pain", "Dull, central, radiates to neck/jaw/arm; increases with cough, deep breathing exercise (DBE), lying flat"],
["Pericardial chest pain", "Similar to anginal pain but also worsened by cough/DBE/position change; central"],
["Tracheitis", "Burning pain over anterior central chest"],
["Musculoskeletal chest pain", "Localized pain; may originate from muscle, bone or joint; worse with chest/arm movement"],
]
)
h2("G. FEVER")
bullet("Time pattern: morning / night / evening / anytime")
bullet("Grade: high-grade vs low-grade")
h2("H. HOARSENESS OF VOICE")
trick("4 causes mnemonic 'T-L-S-V': Trauma (post-intubation), Laryngeal dysfunction, Smoking, Vocal cord paralysis (unilateral)")
h2("I. EDEMA")
para("Note location - useful early flag for right heart failure / DVT / renal disease")
# ---------------- 3. HISTORY ----------------
h1("3. Past / Personal / Family / Occupational / Socioeconomic History")
h2("Past History")
bullet("Illness & development since birth, surgeries & hospitalizations, allergies + treatment, systemic illness + treatment, pulmonary impairment history")
h2("Previous Treatment")
trick("Split into 3: Medical Hx / PT (Physiotherapy) Hx / Surgical (Sx) Hx")
h2("Personal History")
bullet("Smoker / non-smoker / ex-smoker; Bidi / cigarette / pipe per day + duration (pack-years concept)")
bullet("Alcohol; sleep-diet-exercise habits; tobacco & snuff use")
h2("Family History")
trick("Mnemonic 'DATH': Diabetes, Asthma, TB, Hypertension")
bullet("Also: health of blood relatives, source of physical/emotional/economic support, hereditary + infective disease history")
h2("Occupational & Environmental History")
bullet("Exposure to potential disease agents, area of work/living, duration of exposure, symptoms, activity level")
trick("Hypersensitivity reaction pattern = 'Monday Fever' (classic for Byssinosis - cotton/textile dust; symptoms worse after returning to work post weekend break)")
h3("Potential Occupational Agents")
add_table(
["Agent/Exposure", "Disease"],
[
["Sugar cane dust", "Bagassosis"],
["Silica dust", "Silicosis"],
["Asbestos fibres", "Asbestosis"],
["Coal dust", "Coal-worker's pneumoconiosis"],
]
)
bullet("Also record Allergic history alongside exposure history")
h2("Socioeconomic History")
bullet("Education level, source of income and expenses (affects compliance & follow-up ability)")
# ---------------- 4. OBJECTIVE EXAM ----------------
h1("4. Objective Examination")
h2("A. Vital Signs")
bullet("Height & weight, Level of consciousness (GCS), Temperature")
h3("Pulse Volume Grading")
trick("0-1-2-3-4 pattern")
add_table(
["Grade", "Meaning"],
[["0","Absent"],["1","Diminished"],["2","Normal"],["3","Increased"],["4","Bounding"]]
)
h3("Respiratory Rate Types")
bullet("Eupnoea, Apnoea, Bradypnoea, Tachypnoea, Hypopnoea, Hyperpnoea")
bullet("Blood Pressure: check for Hypotension / Hypertension")
h2("B. Inspection")
h3("Body Type")
add_table(
["Category", "Options"],
[
["Build", "Ectomorphic / Endomorphic / Mesomorphic"],
["Nutritional/general state", "Sthenic / Asthenic; Fleshy / Cachectic / Debilitated / Failure to thrive"],
["Posture", "Forward head posture, Stooping posture, Kyphosis/Scoliosis/Kyphoscoliosis"],
]
)
h3("Head & Face")
bullet("Facial expression/grimace, nasal flaring, pallor, puffiness/oedema, central cyanosis, bobbing of head")
h3("Extremities")
bullet("Cyanosis, pallor, clubbing, oedema location")
para("")
h3("Clubbing - Schamroth's Sign (classic bedside trick)")
trick("Place both index fingers nail-to-nail (pulp to pulp). Normally a small diamond/rhomboid window is visible between the nail beds. If the window DISAPPEARS -> Clubbing is present.")
h3("Clubbing Progression")
bullet("Softening of nail bed -> Fluctuation -> Increased curvature -> Drumstick appearance -> Parrot-beak nail -> Hypertrophic osteoarthropathy")
h3("Clubbing Index")
trick("Ratio A/B, where A = finger diameter at the DIP joint (distal phalanx) and B = finger diameter at the interphalangeal joint (skin-fold). A/B < 1 = Normal. A/B > 1 = Clubbing present.")
h3("Neck / Accessory Muscles / Chest Wall")
bullet("Neck: Jugular Venous Distension (JVD)")
trick("Accessory muscles of breathing used in distress: Trapezius, SCM (sternocleidomastoid), Pectoralis")
add_table(
["Medical term", "Common/lay name"],
[
["Pectus excavatum", "Funnel chest"],
["Pectus carinatum", "Pigeon chest"],
["Hyperinflation (chest)", "Barrel-shaped chest"],
]
)
bullet("Harrison's sulcus, flattening of chest (infraclavicular muscle wasting)")
h3("Breathing Pattern & Effort")
bullet("Thoracoabdominal vs Abdominothoracic pattern")
trick("I:E ratio (Inspiratory : Expiratory time) - normal approx. 1:2. Prolonged expiration (1:3, 1:4) suggests obstructive airway disease (COPD/Asthma)")
bullet("Retraction: infraclavicular / intercostal")
bullet("Epigastric excursion")
trick("Hoover's Sign = paradoxical BENDING IN (inward movement) of the LOWER RIBS/costal margin during inspiration -> indicates a flattened diaphragm (seen in COPD)")
bullet("Paradoxical breathing, Flail chest (trauma)")
bullet("Symmetry of chest expansion, visible apex beat vibration, wounds/scars, spinal deformities")
h3("Equipment Check (easy to forget - always note before hands-on exam)")
trick("IV lines - Catheter - Supplemental oxygen - Any other attached equipment")
h2("C. Palpation")
bullet("Neck: Lymph nodes")
h3("Trachea Position (classic exam pearl)")
add_table(
["Finding", "Suggests"],
[
["Central", "Normal"],
["Shifted to SAME side", "Fibrosis / Collapse (pulls trachea towards lesion)"],
["Shifted to OPPOSITE side", "Pleural effusion / Tension pneumothorax (pushes trachea away)"],
]
)
bullet("Chest: tenderness, subcutaneous emphysema (crepitus), chest expansion (manual & tape measure), diaphragm excursion, AP & transverse diameter, apex beat, fremitus (vocal & tactile)")
h3("Extremities")
bullet("Tenderness, capillary refill (nail beds), oedema (pitting vs non-pitting)")
h3("Oedema Grading (based on circumference difference)")
add_table(
["Grade", "Description"],
[
["Grade 1 (mild)", "Distal parts only (forearm/hand or leg/foot); <4 cm difference; no tissue changes yet"],
["Grade 2 (moderate)", "Entire limb or trunk quadrant; 4-6 cm difference; pitting apparent"],
["Grade 3a (severe)", "One limb + associated trunk quadrant; >6 cm difference; skin changes, cysts/fistulae"],
["Grade 3b (massive)", "Same as 3a but 2 or more extremities affected"],
]
)
h2("D. Percussion")
trick("Pleximeter = finger placed flat on chest wall (usually middle finger); Plexor = finger used to tap on it (opposite hand's middle finger)")
bullet("Percuss symmetrically; avoid bony structures and breast tissue")
h3("Percussion Note = Pathology")
add_table(
["Sound", "Pathology"],
[
["Tympanic", "Stomach (gastric bubble)"],
["Hyperresonant", "Pneumothorax / Emphysema"],
["Normal resonant", "Normal lung"],
["Dull", "Consolidation"],
["Stony dull", "Tumour / Pleural effusion"],
]
)
bullet("Also used for: diaphragmatic excursion (limited by obesity, muscular chest wall)")
h2("E. Auscultation")
bullet("Breath sounds - Normal: Vesicular, Bronchial, Bronchovesicular")
bullet("Breath sounds - Abnormal versions of the same + added sounds: Crackles, Wheeze, Rhonchi, Stridor")
bullet("Heart sounds: S1, S2 (+ S3/S4 gallops), Murmurs, Rubs")
h3("Vocal Resonance Tricks")
add_table(
["Term", "Test/Trick"],
[
["Bronchophony", "Increased clarity of spoken words through consolidated lung"],
["Egophony", "Patient says 'E' -> clinician hears nasal/bleating 'A' through stethoscope over consolidation"],
["Whispering pectoriloquy", "Whispered words heard clearly through stethoscope over consolidation"],
]
)
h2("F. Special Tests")
add_table(
["Test", "What it detects"],
[
["Coin test", "Metallic ringing sound = pneumothorax"],
["Succussion splash test", "Fluid + air together in pleural space"],
["D'Espine's sign", "Mediastinal pathology - bronchial breath sound heard over lower thoracic spinous processes"],
]
)
# ---------------- 5. INVESTIGATIONS ----------------
h1("5. Investigations")
bullet("PFT (Pulmonary Function Test), CXR (Chest X-Ray), ABG (Arterial Blood Gas), ECG, Bronchoscopy, CT Scan, Sputum C/S (culture & sensitivity)")
h1("6. Exercise Tolerance Testing")
bullet("6-Minute Walk Test (6MWT), 12-Minute Walk Test (12MWT), Shuttle Walk Test, 3-Minute Step Test")
h1("7. Clinical Reasoning")
bullet("Problem List -> Short-Term Goals -> Long-Term Goals")
# ---------------- QUICK RECALL PAGE ----------------
doc.add_page_break()
h1("ONE-PAGE QUICK RECALL - All Tricks Together")
add_table(
["Topic", "Trick / Mnemonic"],
[
["Symptom history template", "O-D-F-A-R-C-S-Q (Onset-Duration-Frequency-Aggravating-Relieving-Course-Severity-Quality)"],
["Cough/Sputum grading", "3mo/2yr -> several/week -> mornings only -> all day (Grades I-IV)"],
["Cough complications", "SHIRT-BUHV"],
["Sputum colour", "Rust=Pneumonia, Purple=Tumour, Yellow=Infective, Green=Pseudomonas, Pink frothy=Pulm. oedema, Brown=Smoker, Apple green=H. influenzae"],
["Sputum purulence", "M1-M2-P1-P2-P3"],
["Dyspnoea positions", "OPT + PND (Ortho-Platy-Trepo-Paroxysmal Nocturnal)"],
["NYHA Grades", "Severe only -> Ordinary activity -> Mild exertion -> Rest"],
["Haemoptysis", "Frank/Streaking -> TB, Bronchiectasis, Late pneumonia"],
["Chest pain quality", "Pleuritic(sharp,insp) / Cardiac(dull,radiates) / Pericardial(positional) / Tracheitis(burning) / MSK(localized, movement-related)"],
["Hoarseness causes", "T-L-S-V: Trauma/Laryngeal/Smoking/Vocal cord palsy"],
["Family history", "DATH: Diabetes-Asthma-TB-Hypertension"],
["Occupational fever", "Monday Fever = Byssinosis"],
["Pulse grading", "0-Absent,1-Diminished,2-Normal,3-Increased,4-Bounding"],
["Clubbing test", "Schamroth's sign - window disappears = clubbing"],
["Clubbing index", "A/B ratio; >1 = clubbing"],
["Chest shape names", "Excavatum=Funnel, Carinatum=Pigeon, Hyperinflation=Barrel"],
["Trachea shift", "Same side=Fibrosis/Collapse; Opposite side=Effusion/Pneumothorax"],
["Hoover's sign", "Paradoxical inward bending of lower ribs on inspiration = flat diaphragm"],
["Oedema grading", "Grade1(<4cm)-Grade2(4-6cm)-Grade3a(>6cm,1 limb)-Grade3b(>6cm,2+ limbs)"],
["Percussion notes", "Tympanic=Stomach, Hyperresonant=Pneumothorax, Dull=Consolidation, Stony dull=Effusion/Tumour"],
["Vocal resonance", "Egophony = 'E' spoken heard as 'A'; Whispering pectoriloquy = whisper heard clearly"],
["Special tests", "Coin test=Pneumothorax, Splash test=Hydropneumothorax, D'Espine's=Mediastinal mass"],
]
)
footer_p = doc.add_paragraph("Compiled by Shaswat Verma, MPT, Dept. of Physiotherapy, MSRMTH, Bangalore | Consolidated with additional clinical tricks for easy exam recall.")
footer_p.runs[0].italic = True
footer_p.runs[0].font.size = Pt(9)
footer_p.runs[0].font.color.rgb = RGBColor(0x60,0x60,0x60)
doc.save("/tmp/workspace/cardio-resp-assessment/Cardio_Respiratory_Assessment_Complete.docx")
print("saved")
cd /tmp/workspace/cardio-resp-assessment && python3 build_doc.py
cd /tmp/workspace/cardio-resp-assessment && python3 -c " from docx import Document d = Document('Cardio_Respiratory_Assessment_Complete.docx') print('paragraphs:', len(d.paragraphs)) print('tables:', len(d.tables)) " && ls -la /tmp/workspace/cardio-resp-assessment/
Cardio Respiratory Assessment Complete
Word Document · DOCX
Like wise same write oncology in physiotherapy assessment
oncology physiotherapy assessment format mnemonic ECOG Karnofsky lymphedema cancer related fatigue assessment
cancer rehabilitation physiotherapy subjective objective assessment checklist
https://pmc.ncbi.nlm.nih.gov/articles/PMC2967778
~/oncology-physio-assessment/build_doc.py
from docx import Document
from docx.shared import Pt, Inches, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
doc = Document()
style = doc.styles["Normal"]
style.font.name = "Calibri"
style.font.size = Pt(11)
BLUE = RGBColor(0x1F, 0x4E, 0x79)
RED = RGBColor(0xC0, 0x00, 0x00)
GREEN = RGBColor(0x00, 0x60, 0x00)
GREY = RGBColor(0x60, 0x60, 0x60)
def set_cell_shading(cell, color_hex):
shd = OxmlElement('w:shd')
shd.set(qn('w:val'), 'clear')
shd.set(qn('w:color'), 'auto')
shd.set(qn('w:fill'), color_hex)
cell._tc.get_or_add_tcPr().append(shd)
def add_table(headers, rows):
table = doc.add_table(rows=1, cols=len(headers))
table.style = 'Light Grid Accent 1'
table.alignment = WD_TABLE_ALIGNMENT.CENTER
hdr = table.rows[0].cells
for i, h in enumerate(headers):
hdr[i].text = h
for p in hdr[i].paragraphs:
for r in p.runs:
r.bold = True
r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
set_cell_shading(hdr[i], "1F4E79")
for row in rows:
cells = table.add_row().cells
for i, val in enumerate(row):
cells[i].text = str(val)
doc.add_paragraph("")
return table
def h1(text):
p = doc.add_heading(text, level=1)
for r in p.runs:
r.font.color.rgb = BLUE
def h2(text):
p = doc.add_heading(text, level=2)
for r in p.runs:
r.font.color.rgb = BLUE
def h3(text):
p = doc.add_heading(text, level=3)
for r in p.runs:
r.font.color.rgb = RED
def bullet(text):
p = doc.add_paragraph(style='List Bullet')
p.add_run(text)
def trick(text):
p = doc.add_paragraph()
run = p.add_run("TRICK: ")
run.bold = True
run.font.color.rgb = GREEN
p.add_run(text)
def para(text, italic=False):
p = doc.add_paragraph()
r = p.add_run(text)
r.italic = italic
# ---------------- COVER ----------------
title = doc.add_heading("ONCOLOGY ASSESSMENT IN PHYSIOTHERAPY", level=0)
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
sub = doc.add_paragraph("Complete Assessment Format with Easy-to-Remember Tricks & Mnemonics")
sub.alignment = WD_ALIGN_PARAGRAPH.CENTER
sub.runs[0].italic = True
sub.runs[0].font.size = Pt(13)
note = doc.add_paragraph("Consolidated using ICF framework, ECOG/Karnofsky, ISL lymphedema staging, CTCAE grading and standard oncology rehabilitation literature")
note.alignment = WD_ALIGN_PARAGRAPH.CENTER
note.runs[0].font.size = Pt(10)
note.runs[0].font.color.rgb = GREY
doc.add_page_break()
# ---------------- OVERVIEW ----------------
h1("Overall Sequence")
para("Demographics -> Subjective (Oncology History + HOPI) -> Cancer Treatment History -> Systemic/Red-Flag Screen -> Objective Exam (Inspection -> Palpation -> Neuro/MSK -> Functional) -> Outcome Measures -> Precautions Check -> Problem List & Goals")
trick("Remember it as 'Demo-Onco Hx-Treatment Hx-Red Flags-IPPA(F)-Outcomes-Precautions-Goals'")
# ---------------- 1. DEMOGRAPHICS ----------------
h1("1. Demographic Data - Why We Ask Each Thing")
add_table(
["Item", "Clinical reason / Trick"],
[
["Name", "Identification - always address patient by name"],
["Age", "Age-related cancer incidence (e.g. paediatric leukaemia/bone tumours vs adult carcinomas); tolerance to treatment"],
["Sex", "Sex-specific cancers (breast, cervical, ovarian, prostate, testicular)"],
["Occupation", "Occupational carcinogen exposure (asbestos-mesothelioma, benzene-leukaemia); ability to return to work"],
["Address", "Environmental exposure, access to rehab/travel burden for treatment"],
["Chief Complaint", "Record in patient's own words - note if pain, weakness, breathlessness, swelling or fatigue brought them in"],
]
)
# ---------------- 2. ONCOLOGY-SPECIFIC HISTORY ----------------
h1("2. Oncology-Specific History (before general HOPI)")
h2("Diagnosis Details")
bullet("Type of cancer / primary site / histology")
h3("TNM Staging - the classic trick")
trick("T-N-M = Tumour size/extent - Node involvement - Metastasis (higher number in each = more advanced). Stage is then grouped I-IV.")
h3("Constitutional 'B symptoms' - always screen (red flag trick)")
trick("Mnemonic 'FNW': Fever, Night sweats, Weight loss (unintentional, >10% body weight in 6 months) - suggests systemic disease activity/recurrence")
h2("Cancer Treatment History - the 5 pillars")
trick("Mnemonic 'SCRIT': Surgery - Chemotherapy - Radiotherapy - Immunotherapy/Targeted therapy - Transplant (bone marrow/stem cell)")
add_table(
["Treatment", "Physio-relevant effect to screen for"],
[
["Surgery", "Scar mobility, ROM loss, lymph node dissection -> lymphedema risk, post-op weakness"],
["Chemotherapy", "Cardiotoxicity, peripheral neuropathy, fatigue, myelosuppression (low blood counts), nausea"],
["Radiotherapy", "Skin fibrosis, joint stiffness, lymphedema, radiation-induced brachial plexopathy, lung fibrosis"],
["Immunotherapy / Targeted therapy", "Fatigue, joint pain/arthralgia, pneumonitis, skin reactions"],
["Bone marrow / Stem cell transplant", "Graft-versus-host disease, profound deconditioning, prolonged immunosuppression"],
]
)
h2("Pain Assessment - Character Tells the Source (same trick as chest pain)")
add_table(
["Pain type", "Character / Clue"],
[
["Nociceptive (somatic)", "Localized, aching, worse with movement/loading"],
["Bone/metastatic pain", "Deep, constant, worse at night, not relieved by rest -> RED FLAG for pathological fracture risk"],
["Neuropathic pain", "Burning, tingling, shooting, in a dermatomal/nerve distribution (chemo or radiation-induced)"],
["Visceral pain", "Diffuse, poorly localized, cramping, referred"],
]
)
trick("Night pain + constant + not relieved by rest/position = ALWAYS rule out bone metastasis before loading that segment")
# ---------------- 3. HOPI TEMPLATE ----------------
h1("3. HOPI Template (same reusable structure)")
trick("O-D-F-A-R-C-S-Q = Onset - Duration - Frequency - Aggravating factor - Relieving factor - Course - Severity - Quality (+ Associated factors). Apply this to pain, fatigue, breathlessness, or swelling.")
# ---------------- 4. HISTORY ----------------
h1("4. Past / Personal / Family / Occupational History")
h2("Past History")
bullet("Other illnesses, previous surgeries/hospitalizations, comorbidities (diabetes, cardiac, renal - affects treatment tolerance)")
h2("Personal History")
bullet("Smoking, alcohol, diet, activity/exercise habits (major modifiable risk factors)")
h2("Family History")
trick("Screen for hereditary cancer syndromes - first-degree relatives with breast/ovarian (BRCA1/2), colorectal (Lynch syndrome), or multiple cancers at young age")
h2("Occupational & Environmental History")
add_table(
["Exposure", "Associated cancer"],
[
["Asbestos", "Mesothelioma, lung cancer"],
["Benzene", "Leukaemia"],
["Ionizing radiation", "Thyroid, skin, leukaemia"],
["Tobacco/chewing tobacco", "Oral, lung, oesophageal cancer"],
["UV exposure", "Skin cancer (melanoma)"],
]
)
# ---------------- 5. SYSTEMIC / FUNCTIONAL SCREEN ----------------
h1("5. Oncology-Specific Systemic Screen")
h2("A. Performance Status (do this FIRST - drives whole plan)")
h3("ECOG Scale (0-5) - trick 'Active-Restricted-Ambulatory-Limited-Bed-Dead'")
add_table(
["Grade", "Description"],
[
["0", "Fully active, no restriction"],
["1", "Restricted in strenuous activity, ambulatory, light work possible"],
["2", "Ambulatory, self-care intact, unable to work, up >50% of waking hours"],
["3", "Limited self-care, confined to bed/chair >50% of waking hours"],
["4", "Completely disabled, cannot self-care, totally bed/chair bound"],
["5", "Dead"],
]
)
h3("Karnofsky Performance Status (100-0, in steps of 10)")
trick("100 = Normal, no complaints -> 70 = cares for self, can't work/normal activity -> 50 = needs considerable assistance -> 10 = moribund -> 0 = Dead. Roughly: KPS = ECOG in reverse, KPS 100-80 approx ECOG 0-1.")
h2("B. Cancer-Related Fatigue (CRF)")
bullet("Screen with FACIT-Fatigue scale or a simple 0-10 severity scale")
trick("CRF is different from normal tiredness - it is disproportionate to activity and NOT fully relieved by rest. Always screen anaemia, thyroid, sleep, and deconditioning as contributors.")
h2("C. Lymphedema")
h3("ISL Staging (International Society of Lymphology) - trick 'Latent-Reversible-Fixed-Elephant'")
add_table(
["Stage", "Description"],
[
["0 (Latent)", "Subclinical, no visible swelling, impaired lymph transport already present"],
["I (Early)", "Pitting oedema, reduces with elevation/rest overnight"],
["II (Moderate)", "Pitting or non-pitting, does NOT reduce fully with elevation; tissue fibrosis begins"],
["III (Severe)", "Lymphostatic elephantiasis - non-pitting, skin changes (papillomas, hyperkeratosis, fibrosis)"],
]
)
bullet("Assess with circumferential limb girth measurements (compare bilaterally) or volumetric water displacement")
h2("D. Chemotherapy-Induced Peripheral Neuropathy (CIPN)")
trick("CTCAE Grading: Grade 1 = mild, asymptomatic/sensory only; Grade 2 = moderate, limits daily activities; Grade 3 = severe, limits self-care; Grade 4 = life-threatening/disabling")
bullet("Screen: light touch, pinprick, vibration sense (distal-to-proximal 'glove and stocking' pattern), balance and fall risk")
h2("E. Cardiotoxicity Screen (cardio-oncology overlap)")
bullet("Relevant with anthracyclines (e.g. doxorubicin) and trastuzumab - monitor for dyspnoea, fatigue, oedema, resting HR/BP before exertion")
h2("F. Cognitive Screen")
bullet("'Chemo brain' - screen attention, memory, processing speed; impacts exercise instruction and safety")
h2("G. Psychosocial Screen")
bullet("Distress Thermometer (0-10) - quick screen for anxiety/depression/distress needing referral")
# ---------------- 6. OBJECTIVE EXAM ----------------
h1("6. Objective Examination")
h2("A. Inspection")
bullet("General: cachexia, pallor, alopecia (chemo), jaundice")
bullet("Skin: surgical scars, radiation fibrosis/dermatitis, wound healing, ports/PICC lines/stomas")
bullet("Swelling: lymphedema, ascites")
bullet("Posture: antalgic posturing, guarding around a painful/at-risk segment")
h2("B. Palpation")
bullet("Lymph nodes (size, mobility, tenderness, consistency - hard/fixed nodes are a red flag)")
bullet("Scar mobility and adhesion")
bullet("Bony tenderness (screen for possible metastasis before loading)")
bullet("Pitting vs non-pitting oedema, limb girth")
h2("C. Neuro-Musculoskeletal Exam")
bullet("ROM - especially shoulder (post-mastectomy/axillary dissection), neck (post head & neck cancer/RT)")
bullet("Manual Muscle Testing - AVOID resisted testing directly over a known/suspected bone metastasis")
bullet("Sensation - CIPN pattern (distal, symmetric, glove-and-stocking)")
bullet("Balance - Berg Balance Scale, especially if on neurotoxic chemo or elderly")
h2("D. Functional / Outcome Measures")
add_table(
["Domain", "Common outcome measure"],
[
["Aerobic capacity/endurance", "6-Minute Walk Test (6MWT)"],
["Mobility/fall risk", "Timed Up and Go (TUG), Berg Balance Scale"],
["Upper limb function (breast cancer)", "DASH (Disabilities of Arm, Shoulder & Hand)"],
["Lower limb function", "Lower Extremity Functional Scale (LEFS)"],
["Fatigue", "FACIT-Fatigue Scale"],
["Quality of life", "EORTC QLQ-C30"],
["Peripheral neuropathy", "FACT/GOG-Ntx"],
["Strength", "Grip strength (dynamometer), 5x Sit-to-Stand"],
["Sarcopenia screen", "SARC-CalF (recommended by Clinical Oncology Society of Australia)"],
]
)
# ---------------- 7. PRECAUTIONS ----------------
h1("7. Precautions / Red Flags Before Exercise - MUST CHECK")
trick("Mnemonic 'ABCDE' for oncology physio precautions")
add_table(
["Letter", "Precaution"],
[
["A", "Anaemia - Hb <8 g/dL: avoid moderate/vigorous aerobic exercise until corrected"],
["B", "Bone metastasis - avoid high-impact, resisted or high-load exercise at the involved site (fracture risk)"],
["C", "Cardiotoxicity - monitor HR/BP/symptoms in patients on anthracyclines/trastuzumab or with radiation to chest"],
["D", "DVT / clotting risk - watch for unilateral limb swelling, calf pain before mobilising"],
["E", "low blood counts - Neutropenia (ANC low): infection precautions, avoid public gyms/pools; Thrombocytopenia (platelets <50,000): avoid contact sport, vigorous manual therapy, high fall-risk activity"],
]
)
para("Also always check same-day blood counts and oncologist clearance before starting a new exercise program, and stop and refer back if fever, unexplained bleeding/bruising, or new severe bone pain appears.")
# ---------------- 8. CLINICAL REASONING ----------------
h1("8. Clinical Reasoning - ICF Framework")
trick("Organize problems using ICF: Body Structure/Function impairments -> Activity limitations -> Participation restrictions -> Contextual (personal + environmental) factors")
bullet("Problem List -> Short-Term Goals -> Long-Term Goals (SMART format: Specific, Measurable, Achievable, Relevant, Time-bound)")
# ---------------- QUICK RECALL ----------------
doc.add_page_break()
h1("ONE-PAGE QUICK RECALL - All Tricks Together")
add_table(
["Topic", "Trick / Mnemonic"],
[
["Treatment history", "SCRIT: Surgery-Chemo-Radiotherapy-Immunotherapy/targeted-Transplant"],
["Constitutional red flags", "FNW: Fever-Night sweats-Weight loss"],
["Staging", "TNM: Tumour-Node-Metastasis"],
["Pain source", "Bone pain = night pain, constant, not relieved by rest -> rule out metastasis"],
["HOPI template", "O-D-F-A-R-C-S-Q"],
["ECOG scale", "0=Active,1=Restricted,2=Ambulatory/no work,3=Limited self-care,4=Bed-bound,5=Dead"],
["Karnofsky", "100-0 in steps of 10; roughly mirror-image of ECOG"],
["Lymphedema staging", "0=Latent,1=Reversible(pits,reduces with elevation),2=Fixed(fibrosis),3=Elephantiasis"],
["CIPN grading", "Grade1=Mild,2=Limits ADL,3=Limits self-care,4=Life-threatening"],
["Exercise precautions", "ABCDE: Anaemia-Bone mets-Cardiotoxicity-DVT-low blood counts (neutropenia/thrombocytopenia)"],
["Clinical reasoning", "ICF: Body structure/function -> Activity -> Participation -> Contextual factors"],
]
)
footer_p = doc.add_paragraph("Consolidated for easy exam/clinical recall. Always confirm current blood counts, oncologist clearance, and site-specific precautions before initiating any physiotherapy intervention in an oncology patient.")
footer_p.runs[0].italic = True
footer_p.runs[0].font.size = Pt(9)
footer_p.runs[0].font.color.rgb = GREY
doc.save("/tmp/workspace/oncology-physio-assessment/Oncology_Physiotherapy_Assessment.docx")
print("saved")
mkdir -p /tmp/workspace/oncology-physio-assessment && cd /tmp/workspace/oncology-physio-assessment && python3 build_doc.py
ls -la /tmp/workspace/oncology-physio-assessment/ && python3 -c " from docx import Document d = Document('/tmp/workspace/oncology-physio-assessment/Oncology_Physiotherapy_Assessment.docx') print('paragraphs:', len(d.paragraphs)) print('tables:', len(d.tables)) "
Oncology Physiotherapy Assessment
Word Document · DOCX
Not too much i want like brief same like cardio