Summarize

Reading File
Running Command

cd /home/daytona/workspace/attachments/0d6fdc99-b8ae-414c-a3fe-7f62be42766a && python3 -c " import pdfplumber with pdfplumber.open('Vitals.pdf') as pdf: print(f'Pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): text = page.extract_text() print(f'--- Page {i+1} ---') print(text) print() "

Running Command

cd /home/daytona/workspace/attachments/0d6fdc99-b8ae-414c-a3fe-7f62be42766a && python3 -c " from pypdf import PdfReader import base64 reader = PdfReader('Vitals.pdf') print(f'Pages: {len(reader.pages)}') print('Metadata:', reader.metadata) "

Running Command

cd /home/daytona/workspace/attachments/0d6fdc99-b8ae-414c-a3fe-7f62be42766a && python3 -c " import fitz # pymupdf doc = fitz.open('Vitals.pdf') import os os.makedirs('pages', exist_ok=True) for i in range(len(doc)): page = doc[i] mat = fitz.Matrix(2, 2) # 2x zoom for better quality clip = page.get_pixmap(matrix=mat) clip.save(f'pages/page_{i+1:02d}.png') print('Done. Pages saved:', len(doc)) "

Running Command

cd /home/daytona/workspace/attachments/0d6fdc99-b8ae-414c-a3fe-7f62be42766a && mkdir -p pages && pdftoppm -r 150 -png Vitals.pdf pages/page && ls pages/ | head -5

Running Command

cd /home/daytona/workspace/attachments/0d6fdc99-b8ae-414c-a3fe-7f62be42766a && mkdir -p pages && pdftoppm -r 72 -png -f 1 -l 5 Vitals.pdf pages/page && ls pages/

Running Command

cd /home/daytona/workspace/attachments/0d6fdc99-b8ae-414c-a3fe-7f62be42766a && python3 -c " import subprocess, os pages_dir = 'pages' for i in range(1, 23): fname = f'page-{i:02d}.png' fpath = os.path.join(pages_dir, fname) result = subprocess.run(['tesseract', fpath, 'stdout', '--psm', '6'], capture_output=True, text=True) print(f'=== PAGE {i} ===') print(result.stdout[:2000]) print() " 2>/dev/null

I now have all the content. Here is a comprehensive summary of the PDF:

Summary: Vitals.pdf (CMC Medicine Notes)

This is a 22-page medical study document (titled "CMC medicine.pdf," created April 2022) covering clinical examination of vital signs and general physical findings. Below is a topic-by-topic breakdown:

1. Pulse

  • Definition: Waveform generated by left ventricular systole, travelling the arterial tree peripherally.
  • Assessment sites: Radial (rate & rhythm), Carotid (volume & character), Femoral (radio-femoral delay).
  • Rate: Normal 60-100/min; bradycardia <60, tachycardia >100. Causes of each listed.
  • Rhythm: Regular, regularly irregular (atrial flutter/PAT with fixed AV block, ventricular bigemini/trigemini), irregularly irregular (AF, PAT with varying AV block).
  • Volume & Character: Described by pulse pressure (systolic - diastolic).
    • Hypokinetic: Low volume, narrow pulse pressure (mitral stenosis, aortic stenosis).
    • Hyperkinetic: High amplitude, wide pulse pressure (high output states, MR, VSD).
    • Anacrotic (pulsus parvus et tardus): Slow-rising, late peak - severe aortic stenosis.
    • Dicrotic: Two peaks (one systolic, one diastolic) - low stroke volume (LV failure, typhoid, dilated cardiomyopathy, cardiac tamponade).
    • Water Hammer (Corrigan's): Bounding, rapidly collapsing - severe aortic regurgitation, PDA, AV fistula.
    • Bisferiens: Double systolic peak - AR with AS or HOCM.
    • Pulsus Alternans: Alternating large/small volume, regular rhythm - severe LV failure, associated with S3 and electrical alternans.
    • Pulsus Bigeminus: Alternating pulse with compensatory pause - digitalis toxicity.
    • Pulsus Paradoxus: Exaggerated inspiratory fall in systolic BP >10 mmHg - cardiac tamponade, constrictive pericarditis, acute severe asthma, SVC obstruction.
    • Reverse Pulsus Paradoxus: Inspiratory rise in BP - HOCM, AV dissociation.
  • Radio-femoral delay: Seen in coarctation of aorta (normal delay is ~75-80 ms, beyond human perception).

2. Blood Pressure

  • Method: Auscultatory (Korotkoff phases I-V); Phase I = systolic, Phase V = diastolic (Phase IV used in pregnancy/AR where Phase V reaches zero).
  • Auscultatory gap: False reading; corrected by palpatory method.
  • Mean arterial pressure: Diastolic BP + 1/3 pulse pressure.
  • WHO Classification:
    • Optimal: <120/<80
    • Normal: 120-129/80-84
    • High normal: 130-139/85-89
    • Mild HT (Grade I): 140-159/90-99
    • Moderate HT (Grade II): 160-179/100-109
    • Severe HT (Grade III): ≥180/≥110
  • Hypertension definitions:
    • Increase of ≥30 mmHg systolic or ≥20 mmHg diastolic from baseline.
    • Malignant HT: BP >200/140 + papilledema + renal dysfunction.
    • Hypertensive urgency: Markedly high BP, no end-organ damage.
    • Hypertensive emergency: Markedly high BP + end-organ damage.

3. Respiratory Rate

  • Normal: 14-18 breaths/min; male = abdominothoracic, female = thoracoabdominal.
  • Tachypnoea (>20/min): Anxiety, exertion, fever, hypoxia, acidosis, pneumonia, pulmonary edema, ARDS.
  • Bradypnoea: Alkalosis, hypothyroidism, raised ICP.
  • Hyperpnoea: Acidosis, brainstem lesion, hysteria.

4. Temperature

  • Normal oral: 37°C (6AM); 37.6°C (6PM) - diurnal variation due to increased BMR and skeletal muscle activity.
  • Rectal: 1°F above oral; Axillary: 1°F below oral.
  • Febrile: >37.8°C (>100°F); Hyperpyrexia: >41°C (>106°F); Hypothermia: <35°C (<95°F).
  • Fever patterns:
    • Intermittent: Returns to normal most days (e.g., sepsis).
    • Remittent: Does not return to normal daily (viral URI, mycoplasma).
    • Continuous: Varies <1°F/day (brucellosis, leptospirosis, RMSF).
    • Relapsing: Cycles of fever and afebrile periods (Borrelia, tuberculosis, Behcet's, Crohn's).
    • Tertian: 3-day cycle (P. vivax, ovale, falciparum malaria).
    • Quartan: 4-day cycle (P. malariae).
    • Pel-Ebstein: 3-10 days fever then 3-10 days afebrile (Hodgkin's lymphoma).
    • Saddle-back: 2-3 days febrile, 2 days afebrile (dengue).
    • Hyperpyrexia (>106°F): Rheumatic fever, pontine hemorrhage, cerebral malaria, septicemia, meningococcal meningitis.

5. Jugular Venous Pressure (JVP)

  • Definition: Vertical height from sternal angle to zone of transition; normally 4-5 cm at 30-45° recline. CVP = 5 + JVP; Normal CVP = 5-9 cm H2O.
  • Why IJV: Direct RA continuation, no valves, straight path, reflects right atrial pressure.
  • JVP waveforms: a-wave (RA contraction), c-wave (tricuspid valve ascent/carotid impact), x-descent (RA relaxation), v-wave (venous filling), y-descent (tricuspid opens/atrial emptying).
  • Wave abnormalities:
    • Prominent a-wave: PAH, PS.
    • Cannon a-wave: Complete heart block.
    • Absent a-wave: AF, atrial standstill.
    • Prominent v-wave: TR, RVF, restrictive cardiomyopathy.
    • a=v wave: Cardiac tamponade, constrictive pericarditis, hypovolemia.
    • Prominent x-descent: Cardiac tamponade, ASD.
    • Prominent y-descent: Constrictive pericarditis, TR, ASD, restrictive cardiomyopathy.
    • Blunted x-descent: TR, AF.
    • Blunted y-descent: Cardiac tamponade, TS, right atrial myxoma.
  • Causes of elevated JVP: Cardiac failure, TR/TS, constrictive pericarditis, tamponade, COPD, ascites, pregnancy, excess IV fluids. Most common = CCF.
  • Causes of low JVP: Hypovolemia, shock, Addison's disease.
  • Kussmaul's sign: Paradoxical rise in JVP on inspiration - constrictive pericarditis, restrictive cardiomyopathy, RVF, right ventricular infarction.
  • Abdominojugular reflux: Positive if JVP rises >3 cm sustained >15 sec on abdominal pressure - RHF (absent in Budd-Chiari syndrome).

6. Pallor

  • Sites: lower palpebral conjunctiva, tongue, fingernail beds, palms.
  • Palmar crease pallor = Hb <8 g/dL.
  • Pallor + lymphadenopathy + splenomegaly = lymphoproliferative disorder.
  • Pallor + petechiae = platelet dysfunction.

7. Icterus (Jaundice)

  • Indicates hyperbilirubinemia; usually serum bilirubin >2 mg%.
  • Clinical associations:
      • Malnutrition: pancreatic malignancy / cirrhosis.
      • Virchow's nodes / Sister Mary Joseph's nodules: intra-abdominal malignancy.
      • Elevated JVP + tender hepatomegaly: hepatic congestion.
      • Ascites + pleural effusion: advanced cirrhosis or disseminated malignancy.
      • Murphy's sign: acute cholecystitis / ascending cholangitis.
      • Tender hepatomegaly: viral or alcoholic hepatitis.

8. Clubbing

  • Definition: Bulbous enlargement of the distal phalanx due to proliferation of subungual connective tissue.
  • Grading: I (obliteration of nail bed angle), II (parrot-beak), III (drumstick), IV (HPOA).
  • Schamroth's sign: Diamond-shaped aperture absent when dorsal surfaces of terminal phalanges are approximated.
  • Causes: Unilateral (AV malformation, aneurysm, Pancoast tumor); Bilateral: pulmonary (bronchogenic carcinoma, CSLD, ILD, TB), cardiovascular (cyanotic HD, IE, Eisenmenger's), GIT (cirrhosis, IBD, malignancy), miscellaneous (acromegaly, thyrotoxicosis, syphilis).
  • Pathogenesis: PDGF-mediated (most accepted) - megakaryocytes bypass pulmonary fragmentation and release PDGF, stimulating CT proliferation.
  • Pseudo-clubbing: Hansen's disease, leukemia, hyperparathyroidism, vinyl chloride workers.

9. Cyanosis

  • Definition: Bluish discolouration due to increased reduced Hb (>5 g/dL, >30% of total Hb, PaO2 <85%).
  • Central: R-to-L shunt or lung disorder; warm extremities, clubbing + polycythemia; slight improvement with O2.
    • Causes: high altitude, alveolar hypoventilation, V/Q mismatch, cyanotic heart disease, Hb anomalies (methemoglobinemia, sulfhemoglobinemia).
  • Peripheral: Peripheral stasis; cold extremities improving on warming; PaO2 normal (85-100%); frostbite, arterial/venous obstruction.
  • Differential: Lower limbs only = PDA with Eisenmenger's; upper limbs only = PDA + TGV + Eisenmenger's.
  • Intermittent: Ebstein's anomaly.

10. Lymphadenopathy

  • Generalized (≥2 non-contiguous areas) vs. Localized (one area); Persistent generalized if >3 months.
  • Examination: Size (normal <1 cm; epitrochlear >0.5 cm, inguinal >1.5 cm abnormal), tenderness, consistency (stony-hard = metastatic cancer; rubbery = lymphoma; soft = infection; fluctuant = suppurative; matted = TB/sarcoidosis or malignancy).
  • Etiology of generalized lymphadenopathy: Infections (viral, bacterial, protozoal, fungal), autoimmune (SLE, JRA, drug reactions, serum sickness), storage diseases (Gaucher, Niemann-Pick), neoplastic (leukemias, lymphomas, neuroblastoma).

11. Edema

  • Pathophysiology (Starling forces): Increased hydrostatic pressure (CCF, renal failure), decreased plasma oncotic pressure (liver failure, nephrotic syndrome), altered capillary permeability (injury, cytokines).
  • Types: Generalized (cardiac, renal, hepatic, nutritional); Localized (lymphatic, inflammatory).
  • Cardiac edema (CCF): Back pressure → elevated JVP, congestive hepatosplenomegaly, ascites, pedal/sacral edema + RAA axis activation → Na/water retention → volume expansion.
  • Renal edema: Primarily hypoalbuminemia (nephrotic syndrome).
  • Hepatic edema: Portal hypertension + hypoalbuminemia + RAA activation.
  • Fast edema: Pitting disappears <40 sec = hypoalbuminemic.
  • Slow edema: Pitting disappears >1 min.

12. Assessment of Hydration & Nutrition

  • Dehydration signs: Anxiety/confusion, cool clammy skin, delayed capillary refill, dry mucous membranes, tachycardia, tachypnoea, hypotension, oliguria, poor skin turgor, sunken eyes, tongue with longitudinal furrows, acute weight loss 3-5%.
  • Nutrition assessment (4 methods):
    • IBW: 22.5 × height(m)² (male); female = male × 0.94. Overweight if >10% above IBW, obese if >20%.
    • BMI: Weight/height². Grade I obesity: 25-30; Grade II: 30-40; Grade III (very obese): >40.
    • Skinfold thickness: Measured with calipers over triceps, biceps, subscapular, suprailiac.
    • (4th method not fully visible in last page.)

Overall: This is a comprehensive set of handwritten/printed clinical medicine notes covering the standard "vitals and general examination" section of an internal medicine course, likely from Christian Medical College (CMC). It is a high-yield study resource for MBBS/MD students.

Create a quick reference PDF of vital sign abnormalities and causes

Reading File
Running Command

mkdir -p /home/daytona/workspace/vitals-quickref && ls /home/daytona/workspace/vitals-quickref/

Writing File

~/vitals-quickref/generate_pdf.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.pdfbase import pdfmetrics

OUTPUT = "/home/daytona/workspace/vitals-quickref/Vitals_Quick_Reference.pdf"

# ── colour palette ──────────────────────────────────────────────────────────
C_DARK   = colors.HexColor("#1a2e44")   # deep navy
C_MED    = colors.HexColor("#2563eb")   # bright blue
C_LIGHT  = colors.HexColor("#dbeafe")   # pale blue fill
C_ACCENT = colors.HexColor("#dc2626")   # red for danger
C_GREEN  = colors.HexColor("#16a34a")   # green for normal
C_ORANGE = colors.HexColor("#ea580c")   # orange for warning
C_GREY   = colors.HexColor("#f1f5f9")   # very light grey row
C_WHITE  = colors.white
C_HEAD   = colors.HexColor("#1e3a5f")   # section header bg

doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=1.5*cm, rightMargin=1.5*cm,
    topMargin=1.8*cm, bottomMargin=1.8*cm,
    title="Vital Sign Abnormalities – Quick Reference",
    author="CMC Medicine Notes"
)

W = A4[0] - 3*cm   # usable width

styles = getSampleStyleSheet()

# custom styles
def ps(name, parent="Normal", **kw):
    s = ParagraphStyle(name, parent=styles[parent], **kw)
    return s

title_style   = ps("Title2",    fontSize=20, textColor=C_WHITE,   alignment=TA_CENTER,
                   fontName="Helvetica-Bold", spaceAfter=2)
subtitle_style= ps("Sub",       fontSize=9,  textColor=C_LIGHT,   alignment=TA_CENTER,
                   fontName="Helvetica")
sh_style      = ps("SecHead",   fontSize=11, textColor=C_WHITE,   fontName="Helvetica-Bold",
                   spaceAfter=1, spaceBefore=2)
body_style    = ps("Body2",     fontSize=8,  textColor=C_DARK,    fontName="Helvetica",
                   leading=11)
bold_style    = ps("Bold2",     fontSize=8,  textColor=C_DARK,    fontName="Helvetica-Bold",
                   leading=11)
note_style    = ps("Note",      fontSize=7.5,textColor=colors.HexColor("#475569"),
                   fontName="Helvetica-Oblique", leading=10)
label_normal  = ps("LabelN",    fontSize=8,  textColor=C_GREEN,   fontName="Helvetica-Bold")
label_abnorm  = ps("LabelA",    fontSize=8,  textColor=C_ACCENT,  fontName="Helvetica-Bold")
label_warn    = ps("LabelW",    fontSize=8,  textColor=C_ORANGE,  fontName="Helvetica-Bold")

# ── helpers ──────────────────────────────────────────────────────────────────
def section_header(text):
    """Coloured banner row acting as a section title."""
    tbl = Table([[Paragraph(text, sh_style)]], colWidths=[W])
    tbl.setStyle(TableStyle([
        ("BACKGROUND", (0,0), (-1,-1), C_HEAD),
        ("ROWPADDING", (0,0), (-1,-1), 5),
        ("ROUNDEDCORNERS", [4,4,4,4]),
        ("BOX", (0,0), (-1,-1), 0, C_HEAD),
    ]))
    return tbl

def mini_table(headers, rows, col_widths=None, stripe=True):
    """Generic styled table."""
    header_row = [Paragraph(h, ps("TH", fontSize=8, textColor=C_WHITE,
                                  fontName="Helvetica-Bold", leading=10))
                  for h in headers]
    data = [header_row]
    for r in rows:
        data.append([Paragraph(str(c), body_style) for c in r])

    if col_widths is None:
        col_widths = [W / len(headers)] * len(headers)

    tbl = Table(data, colWidths=col_widths, repeatRows=1)
    ts = [
        ("BACKGROUND",  (0,0), (-1,0),  C_MED),
        ("ROWPADDING",  (0,0), (-1,-1), 4),
        ("GRID",        (0,0), (-1,-1), 0.4, colors.HexColor("#cbd5e1")),
        ("VALIGN",      (0,0), (-1,-1), "TOP"),
        ("ROWBACKGROUNDS", (0,1), (-1,-1), [C_WHITE, C_GREY] if stripe else [C_WHITE]),
    ]
    tbl.setStyle(TableStyle(ts))
    return tbl

def p(text, style=None):
    return Paragraph(text, style or body_style)

def sp(h=4):
    return Spacer(1, h*mm)

# ── build story ──────────────────────────────────────────────────────────────
story = []

# ===== COVER BANNER =====
cover = Table(
    [[Paragraph("VITAL SIGNS", title_style)],
     [Paragraph("Abnormalities &amp; Causes  –  Quick Reference", subtitle_style)],
     [Paragraph("Based on CMC Medicine Notes", note_style)]],
    colWidths=[W]
)
cover.setStyle(TableStyle([
    ("BACKGROUND", (0,0), (-1,-1), C_DARK),
    ("ROWPADDING", (0,0), (-1,-1), 6),
    ("BOX",        (0,0), (-1,-1), 0, C_DARK),
]))
story += [cover, sp(5)]

# ════════════════════════════════════════════════════════════════════════════
# 1. PULSE RATE
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("1.  PULSE RATE"), sp(2)]

pulse_rate_rows = [
    ["<b>Bradycardia</b> &lt; 60/min",
     "Physiological: athlete, sleep\nPathological: hypothyroidism, myxoedema, raised ICP, obstructive jaundice, "
     "heart block, sick sinus syndrome, beta-blockers, digoxin toxicity"],
    ["<b>Normal</b>  60–100/min", "Physiological at rest"],
    ["<b>Tachycardia</b> &gt; 100/min",
     "Physiological: emotion, exertion\nPathological: fever, anaemia, thyrotoxicosis, "
     "phaeochromocytoma, hypovolemia, acute anterior wall MI, drugs"],
]
story.append(mini_table(["Rate", "Causes"], pulse_rate_rows, [W*0.25, W*0.75]))
story.append(sp(4))

# Rhythm
story += [section_header("2.  PULSE RHYTHM"), sp(2)]
rhythm_rows = [
    ["Regular", "Normal sinus rhythm"],
    ["Regularly Irregular",
     "Atrial flutter / PAT with fixed AV block\nVentricular bigemini / trigemini"],
    ["Irregularly Irregular",
     "Atrial fibrillation\nPAT or atrial flutter with varying AV block"],
]
story.append(mini_table(["Rhythm", "Causes / Examples"], rhythm_rows, [W*0.28, W*0.72]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 3. PULSE CHARACTER
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("3.  PULSE CHARACTER (Volume / Waveform)"), sp(2)]
char_rows = [
    ["<b>Hypokinetic</b>\n(small, narrow PP)",
     "Mitral stenosis, Aortic stenosis, LV failure, hypovolaemia, pericardial effusion"],
    ["<b>Hyperkinetic</b>\n(bounding, wide PP)",
     "High-output states (fever, anaemia, thyrotoxicosis, pregnancy), MR, VSD, PDA"],
    ["<b>Anacrotic</b>\n(pulsus parvus et tardus)\nSlow rise, late peak",
     "Severe Aortic Stenosis"],
    ["<b>Dicrotic</b>\n(2 peaks: 1 systolic + 1 diastolic)",
     "LV failure, typhoid fever, dilated cardiomyopathy, cardiac tamponade"],
    ["<b>Water-Hammer</b>\n(Corrigan's) – bounding, collapsing",
     "Severe Aortic Regurgitation, PDA, AV fistula, VSD"],
    ["<b>Bisferiens</b>\n(2 systolic peaks)",
     "AR + AS (combined), HOCM"],
    ["<b>Pulsus Alternans</b>\n(alternating large/small, regular)",
     "Severe LV failure (associated with S3, electrical alternans)"],
    ["<b>Pulsus Bigeminus</b>\n(alternating with compensatory pause)",
     "Digitalis toxicity"],
    ["<b>Pulsus Paradoxus</b>\n(inspiratory fall in SBP &gt;10 mmHg)",
     "Cardiac tamponade, constrictive pericarditis, acute severe asthma, SVC obstruction"],
    ["<b>Reverse Pulsus Paradoxus</b>\n(inspiratory rise in BP)",
     "HOCM, AV dissociation"],
]
story.append(mini_table(["Pulse Type", "Causes"], char_rows, [W*0.32, W*0.68]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 4. BLOOD PRESSURE
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("4.  BLOOD PRESSURE"), sp(2)]

# WHO classification
story.append(p("<b>WHO Classification of Blood Pressure (mmHg)</b>", bold_style))
story.append(sp(1))
bp_class = [
    ["Optimal",             "< 120",       "< 80"],
    ["Normal",              "120–129",     "80–84"],
    ["High Normal",         "130–139",     "85–89"],
    ["Mild HT  (Grade I)",  "140–159",     "90–99"],
    ["Moderate HT (Grade II)", "160–179",  "100–109"],
    ["Severe HT (Grade III)",  "≥ 180",    "≥ 110"],
]
story.append(mini_table(["Category", "Systolic", "Diastolic"], bp_class,
                         [W*0.45, W*0.275, W*0.275]))
story.append(sp(3))

# Hypertension types
story.append(p("<b>Hypertensive Syndromes</b>", bold_style))
story.append(sp(1))
htn_rows = [
    ["Malignant HT",
     "BP > 200/140 + papilledema + renal dysfunction"],
    ["Hypertensive Urgency",
     "Markedly high BP  –  NO end-organ damage"],
    ["Hypertensive Emergency",
     "Markedly high BP  +  end-organ damage"],
]
story.append(mini_table(["Syndrome", "Criteria"], htn_rows, [W*0.35, W*0.65]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 5. RESPIRATORY RATE
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("5.  RESPIRATORY RATE"), sp(2)]
rr_rows = [
    ["<b>Bradypnoea</b>\n&lt; 12/min",
     "Alkalosis, hypothyroidism, raised ICP, opioids/sedatives"],
    ["<b>Normal</b>  14–18/min",
     "Male: abdominothoracic  |  Female: thoracoabdominal"],
    ["<b>Tachypnoea</b>\n&gt; 20/min",
     "Anxiety, exertion, fever, hypoxia, metabolic acidosis, pneumonia, "
     "pulmonary oedema, ARDS, PE"],
    ["<b>Hyperpnoea</b>\n(deep rapid breathing)",
     "Metabolic acidosis (Kussmaul), brainstem lesion, hysteria"],
]
story.append(mini_table(["Pattern", "Causes"], rr_rows, [W*0.28, W*0.72]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 6. TEMPERATURE
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("6.  TEMPERATURE"), sp(2)]

story.append(p("<b>Normal values:</b>  Oral 37°C (6 AM) / 37.6°C (6 PM)  |  "
               "Rectal +1°F  |  Axillary −1°F compared to oral", body_style))
story.append(sp(2))

temp_rows = [
    ["<b>Hypothermia</b>",   "< 35°C (< 95°F)",   "Exposure, hypothyroidism, sepsis, Addison's"],
    ["<b>Normal</b>",        "36–37.8°C",          "Diurnal variation; post-ovulatory +0.5°C"],
    ["<b>Fever (Febrile)</b>","37.8–41°C",         "Infection, inflammation, malignancy, drugs"],
    ["<b>Hyperpyrexia</b>",  "> 41°C (> 106°F)",   "Rheumatic fever, pontine haemorrhage, "
                                                    "cerebral malaria, septicaemia, meningococcal meningitis"],
]
story.append(mini_table(["State", "Threshold", "Causes / Examples"],
                         temp_rows, [W*0.22, W*0.22, W*0.56]))
story.append(sp(3))

story.append(p("<b>Fever Patterns</b>", bold_style))
story.append(sp(1))
fp_rows = [
    ["Intermittent",  "Returns to normal most days",      "Sepsis, malaria"],
    ["Remittent",     "Never reaches normal, varies &gt;1°F/day", "Viral URI, mycoplasma"],
    ["Continuous",    "Varies &lt; 1°F/day",              "Typhoid, brucellosis, leptospirosis, RMSF"],
    ["Relapsing",     "Recurrent cycles of fever &amp; afebrile periods",
                      "Borrelia recurrentis, TB, Behçet's, Crohn's disease"],
    ["Tertian",       "3-day cycle",                      "P. vivax, P. ovale, P. falciparum"],
    ["Quartan",       "4-day cycle",                      "P. malariae"],
    ["Pel–Ebstein",   "3–10 d fever then 3–10 d afebrile","Hodgkin's lymphoma"],
    ["Saddle-back",   "2–3 d febrile → 2 d afebrile",    "Dengue fever"],
]
story.append(mini_table(["Pattern", "Definition", "Classic Cause"],
                         fp_rows, [W*0.22, W*0.38, W*0.40]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 7. JVP
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("7.  JUGULAR VENOUS PRESSURE (JVP)"), sp(2)]
story.append(p("<b>Normal:</b>  4–5 cm from sternal angle (patient at 30–45°)  |  "
               "CVP = 5 + JVP  |  Normal CVP = 5–9 cm H₂O", body_style))
story.append(sp(2))

jvp_rows = [
    ["<b>Elevated JVP</b>",
     "CCF (most common), tricuspid stenosis / regurgitation, constrictive pericarditis, "
     "cardiac tamponade, COPD / cor pulmonale, SVC obstruction, massive pleural effusion, "
     "ascites, pregnancy, excess IV fluids"],
    ["<b>Low JVP</b>",
     "Hypovolaemia, shock, Addison's disease"],
]
story.append(mini_table(["JVP Change", "Causes"], jvp_rows, [W*0.25, W*0.75]))
story.append(sp(3))

story.append(p("<b>JVP Wave Abnormalities</b>", bold_style))
story.append(sp(1))
wave_rows = [
    ["Prominent 'a' wave",        "PAH, pulmonary stenosis"],
    ["Cannon 'a' wave",           "Complete heart block"],
    ["Absent 'a' wave",           "Atrial fibrillation, atrial standstill"],
    ["Prominent 'v' wave",        "Tricuspid regurgitation, RVF, restrictive CMP"],
    ["a = v wave",                "Cardiac tamponade, constrictive pericarditis, hypovolaemia"],
    ["Prominent 'x' descent",     "Cardiac tamponade, ASD"],
    ["Prominent 'y' descent",     "Constrictive pericarditis, TR, ASD, restrictive CMP"],
    ["Blunted 'x' descent",       "Tricuspid regurgitation, AF"],
    ["Blunted 'y' descent",       "Cardiac tamponade, tricuspid stenosis, RA myxoma"],
    ["Kussmaul's sign",           "JVP rises on inspiration – constrictive pericarditis, "
                                  "restrictive CMP, RVF, RV infarction"],
]
story.append(mini_table(["Wave Abnormality", "Association"],
                         wave_rows, [W*0.35, W*0.65]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 8. GENERAL EXAM FINDINGS
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("8.  KEY GENERAL EXAMINATION FINDINGS"), sp(2)]

gen_rows = [
    ["<b>Pallor</b>",
     "Anaemia (palmar crease pallor = Hb &lt; 8 g/dL)\n"
     "+ lymphadenopathy + splenomegaly → lymphoproliferative disorder\n"
     "+ petechiae → platelet dysfunction"],
    ["<b>Icterus</b>\n(Serum bili &gt; 2 mg%)",
     "+ malnutrition → pancreatic malignancy / cirrhosis\n"
     "+ Virchow's node / Sister Mary Joseph's nodule → intra-abdominal malignancy\n"
     "+ elevated JVP + tender hepatomegaly → hepatic congestion\n"
     "+ Murphy's sign → acute cholecystitis / ascending cholangitis\n"
     "+ tender hepatomegaly → viral or alcoholic hepatitis"],
    ["<b>Clubbing</b>\n(PDGF-mediated)",
     "Pulmonary: bronchogenic Ca, CSLD, ILD, TB, mesothelioma\n"
     "Cardiovascular: cyanotic HD, infective endocarditis, Eisenmenger's\n"
     "GIT: cirrhosis, IBD, malignancy\n"
     "Misc: acromegaly, thyrotoxicosis, syphilis, syringomyelia"],
    ["<b>Central Cyanosis</b>\n(reduced Hb &gt; 5 g/dL)",
     "R→L shunt, cyanotic CHD, pulmonary AV fistula, alveolar hypoventilation,\n"
     "V/Q mismatch, high altitude, met-haemoglobinaemia, sulph-haemoglobinaemia"],
    ["<b>Peripheral Cyanosis</b>",
     "Peripheral stasis, frostbite, arterial / venous obstruction,\n"
     "redistribution of flow from extremities"],
    ["<b>Oedema</b>",
     "Cardiac: CCF (raised JVP, congestive HSM, ascites, pedal oedema)\n"
     "Renal: nephrotic syndrome (hypoalbuminaemia)\n"
     "Hepatic: portal HTN + hypoalbuminaemia\n"
     "Nutritional: protein deficiency\n"
     "Localised: lymphatic obstruction, inflammation"],
]
story.append(mini_table(["Finding", "Clinical Associations / Causes"],
                         gen_rows, [W*0.22, W*0.78]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 9. DEHYDRATION QUICK CHECK
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("9.  DEHYDRATION – CLINICAL SIGNS"), sp(2)]
deh_rows = [
    ["Mild",    "Thirst, reduced urine output, dry mucous membranes"],
    ["Moderate","Tachycardia, tachypnoea, postural hypotension, sunken eyes,\n"
                "poor skin turgor over sternum, delayed cap refill, confusion"],
    ["Severe",  "Absent radial pulse, low BP, cool clammy skin,\n"
                "oliguria / anuria, marked confusion"],
]
story.append(mini_table(["Severity", "Signs"], deh_rows, [W*0.18, W*0.82]))
story.append(sp(4))

# ════════════════════════════════════════════════════════════════════════════
# 10. BMI / NUTRITION
# ════════════════════════════════════════════════════════════════════════════
story += [section_header("10.  BMI &amp; NUTRITION CLASSIFICATION"), sp(2)]
bmi_rows = [
    ["Underweight",         "< 18.5"],
    ["Normal",              "18.5–24.9"],
    ["Grade I Overweight",  "25–30"],
    ["Grade II Obese",      "30–40"],
    ["Grade III Very Obese", "> 40"],
]
story.append(mini_table(["Category", "BMI (kg/m²)"], bmi_rows, [W*0.6, W*0.4]))
story.append(sp(3))

# footer note
story.append(HRFlowable(width=W, thickness=0.5, color=colors.HexColor("#94a3b8")))
story.append(sp(1))
story.append(p("Source: CMC Medicine Notes (Vitals.pdf) – compiled for quick clinical reference.", note_style))

# ── build PDF ─────────────────────────────────────────────────────────────
doc.build(story)
print("PDF created:", OUTPUT)
Running Command

python3 /home/daytona/workspace/vitals-quickref/generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/vitals-quickref/Vitals_Quick_Reference.pdf

Your quick reference PDF is ready. Here's what's inside:

Vitals Quick Reference

PDF Document · PDF


Contents of the PDF (10 sections, A4 format):
#SectionWhat's covered
1Pulse RateBradycardia / Normal / Tachycardia with causes
2Pulse RhythmRegular, regularly irregular, irregularly irregular
3Pulse CharacterAll 10 waveform types (anacrotic, water hammer, bisferiens, pulsus paradoxus, etc.) with causes
4Blood PressureWHO classification table + malignant HT / urgency / emergency criteria
5Respiratory RateBradypnoea / tachypnoea / hyperpnoea patterns and causes
6TemperatureThresholds + all 8 fever patterns (tertian, quartan, Pel-Ebstein, saddle-back, etc.)
7JVPElevated vs low JVP causes + complete wave abnormality table (a, c, v, x, y)
8General ExamPallor, icterus, clubbing, cyanosis, oedema - all with clinical associations
9DehydrationMild / moderate / severe signs
10BMI / NutritionGrade I–III obesity classification
The layout uses colour-coded section headers, alternating row shading, and concise tabular formatting - designed for fast revision or bedside reference.

Can you add types and finding PICCLE

Reading File
Reading File
Editing File

~/vitals-quickref/generate_pdf.py

Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/vitals-quickref/generate_pdf.py'
Running Command

python3 /home/daytona/workspace/vitals-quickref/generate_pdf.py 2>&1

Running Command

ls -lh /home/daytona/workspace/vitals-quickref/Vitals_Quick_Reference.pdf

Done! The PDF has been updated (grew from 14KB to 24KB with the new content).

Vitals Quick Reference

PDF Document · PDF


What was added in Section 8 - PICCLE:
LetterTopicNew Content Added
PPallorSites of assessment + 6 clinical associations (anaemia, lymphoproliferative disorder, platelet dysfunction, haemolytic anaemia, koilonychia, glossitis)
IIcterus3 types (Pre-hepatic / Hepatic / Post-hepatic) with key features + bilirubin characteristics + 8 clinical associations with Murphy's sign, Charcot's triad, etc.
CClubbing4 grades (I–IV) + Schamroth's sign + 7 categories of causes including pseudo-clubbing
CCyanosis4 types (Central / Peripheral / Differential / Intermittent) with features and causes
LLymphadenopathyExamination characteristics (size, tenderness, consistency, mobility) + aetiology table + 9 regional lymph node groups with drainage areas
EEdemaSites + Starling forces pathophysiology + 8 types of oedema (cardiac, renal, hepatic, nutritional, lymphatic, inflammatory, fast vs slow pitting)
The mnemonic P - I - C - C - L - E is displayed as a colour-coded banner at the top of the section for quick recall.
This is a shared conversation. Sign in to Orris to start your own chat.