Actually tomorrow is my psm exam and i dont know about Assessment of nutritional status . Please provide me answer is easy language and easy way i will write in exam without forgeting

Reading File
Finding Sources
Finding Sources
Reading File
Reading File
I now have enough comprehensive content from Park's PSM textbook. Let me now give you a thorough, exam-ready answer.

Assessment of Nutritional Status

(Park's PSM - Easy Exam Notes)


What is it? (Write this as your intro)

Nutritional status = result of many interrelated factors (food intake quantity + quality + physical health of the individual).
Purpose of nutritional assessment:
  • Know prevalence and distribution of nutritional problems in a community
  • Identify individuals/groups "at risk"
  • Develop health care programmes
  • Evaluate effectiveness of nutrition programmes

7 Methods of Assessment (CABFVEE - Memory Trick)

Remember: "C A B F V E E"
#MethodMemory Word
1Clinical examinationC
2AnthropometryA
3Biochemical evaluationB
4Functional assessmentF
5Vital & health statisticsV
6Ecological studiesE
7Evaluation of dietary intakeE
These methods are not mutually exclusive - they are complementary to each other.

1. Clinical Examination

  • Simplest and most practical method
  • Examine for physical signs of malnutrition
  • Signs may be specific (e.g., Bitot's spots = Vit A deficiency) or non-specific
  • When 2 or more signs of same deficiency appear together = diagnostic significance increases
WHO classified signs into 3 groups:
  1. Group 1 - Definite signs (strongly associated with malnutrition): e.g., Bitot's spots, corneal xerosis, follicular keratosis, angular stomatitis, scrotal/vulval dermatosis, oedema
  2. Group 2 - Possible signs (may or may not be due to malnutrition): e.g., moist and swollen lips (cheilosis), thyroid enlargement, conjunctival pallor, dental caries
  3. Group 3 - Non-specific signs (not reliably associated): e.g., nasal discharge, skin infections

2. Anthropometry

Measurement of body dimensions to assess nutritional status
Measurements used:
  • Weight and Height (most common)
  • MUAC - Mid-Upper Arm Circumference (very useful in children; no need for age)
  • Skinfold thickness - measures fat stores (Triceps, Subscapular, Suprailiac)
  • Head circumference - in children under 3 years
  • Chest circumference
Key Indices:
IndexWhat it measuresUsed for
Weight for AgeOverall nutritionChildren; detects underweight
Height for AgeChronic malnutritionDetects stunting
Weight for HeightAcute malnutritionDetects wasting
BMI = Wt(kg)/Ht²(m)Obesity/thinnessAdults
BMI Cut-offs (Adults):
  • < 18.5 = Underweight (CED - Chronic Energy Deficiency)
  • 18.5-24.9 = Normal
  • 25-29.9 = Overweight
  • ≥ 30 = Obese
MUAC Cut-offs:
  • < 12.5 cm = Severe malnutrition (children 1-5 yrs)
  • 12.5-13.5 cm = Moderate malnutrition
  • 13.5 cm = Normal
Grading of PEM (Protein Energy Malnutrition) - Gomez Classification (Weight for Age):
  • Grade I (Mild) = 75-90% of standard
  • Grade II (Moderate) = 60-74% of standard
  • Grade III (Severe) = < 60% of standard

3. Biochemical Evaluation

Detects subclinical deficiency before clinical signs appear = most sensitive method
Commonly used tests:
NutrientTest
Protein statusSerum albumin, transferrin, prealbumin
Iron deficiencyHaemoglobin, serum ferritin, serum iron
Vitamin ASerum retinol
IodineUrinary iodine excretion
Vitamin DSerum 25-OH Vitamin D
Vitamin CSerum/urine ascorbic acid
Key Point: Biochemical tests detect subclinical (latent) deficiency - useful in early stages before symptoms appear.

4. Functional Assessment

Assesses functional consequences of malnutrition
  • Immune function - delayed hypersensitivity (skin test)
  • Muscle function - hand grip strength (dynamometer)
  • Work capacity / Physical performance
  • Cognitive function - mental development in children
  • Dark adaptation test - for Vitamin A deficiency

5. Assessment of Dietary Intake

Measures what food the person actually eats
Methods:
MethodDescription
24-hour recallAsk person to recall everything eaten in last 24 hours (most commonly used)
Dietary historyLong-term usual diet pattern (3-day, 7-day recall)
Food frequency questionnaireHow often certain foods are eaten
Weighed food recordActual weighing of food before eating
Food balance sheetsNational food availability data
Compare intake with RDA (Recommended Dietary Allowance) to identify deficiencies.

6. Vital and Health Statistics

Uses existing records - indirect method
  • IMR (Infant Mortality Rate) - sensitive indicator of nutritional status
  • Child mortality rate (especially 1-4 years = "toddler mortality")
  • Birth weight - indicator of maternal nutrition
  • Prevalence of low birth weight (< 2500 g)
  • Morbidity data - frequency of infections

7. Ecological Studies

Studies the environment and factors affecting nutrition
  • Food production data
  • Food consumption at national/community level
  • Socioeconomic factors (income, poverty, education)
  • Agricultural statistics
  • Food availability and distribution

Quick Summary Table (Write in Exam!)

MethodDetectsBest For
ClinicalFrank/obvious deficiencyQuick field surveys
AnthropometryGrowth retardation, obesityChildren mainly
BiochemicalSubclinical deficiencyEarly detection
FunctionalConsequences of malnutritionFunctional capacity
DietaryInadequate intakeCause finding
Vital statisticsPopulation-level trendsCommunity surveys
EcologicalRisk factorsPlanning programmes

Important Extra Points (Exam Favorites!)

Nutritional Surveillance = continuous monitoring of nutritional status of a population over time to detect changes and take action.
Indicators used for surveillance:
  • Birth weight (maternal nutrition)
  • Height for age, Weight for age (child nutrition)
  • Arm circumference (when age unknown)
Difference between nutritional assessment vs nutritional surveillance:
  • Assessment = done at one point in time (cross-sectional)
  • Surveillance = done continuously over time (monitoring)

Memory Tips for Exam

  1. 7 methods = C-A-B-F-D-V-E (Clinical, Anthropometry, Biochemical, Functional, Dietary, Vital stats, Ecological)
  2. Most practical method = Clinical examination
  3. Most sensitive method = Biochemical (detects subclinical)
  4. Best for children when age unknown = MUAC or Weight for Height
  5. Wasting = low weight for height (acute)
  6. Stunting = low height for age (chronic)
  7. Underweight = low weight for age (composite)

Good luck in your exam tomorrow! You've got this. Focus especially on the 7 methods, anthropometric indices (wasting/stunting/underweight), and BMI cut-offs - these are the most commonly asked topics in PSM exams.

Create a quick reference PDF summary for this topic

Reading File
Running Command

ls -la /home/daytona/workspace/ 2>/dev/null || echo "workspace empty or not found"

Running Command

mkdir -p /home/daytona/workspace/nutrition-psm && python3 -c "from reportlab.platypus import SimpleDocTemplate; print('reportlab ok')"

Writing File

~/nutrition-psm/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, TA_JUSTIFY
from reportlab.platypus import PageBreak

OUTPUT = "/home/daytona/workspace/nutrition-psm/Nutritional_Status_Assessment_PSM.pdf"

# ── Colour palette ────────────────────────────────────────────────
TEAL       = colors.HexColor("#0D7377")
TEAL_LIGHT = colors.HexColor("#E8F6F7")
ORANGE     = colors.HexColor("#E67E22")
ORANGE_LT  = colors.HexColor("#FEF9E7")
GREEN      = colors.HexColor("#1E8449")
GREEN_LT   = colors.HexColor("#EAFAF1")
PURPLE     = colors.HexColor("#6C3483")
PURPLE_LT  = colors.HexColor("#F5EEF8")
RED        = colors.HexColor("#C0392B")
GREY_DARK  = colors.HexColor("#2C3E50")
GREY_MID   = colors.HexColor("#7F8C8D")
GREY_LIGHT = colors.HexColor("#ECF0F1")
WHITE      = colors.white

# ── Styles ────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, **kw)

title_style = S("Title2",
    fontSize=22, fontName="Helvetica-Bold",
    textColor=WHITE, alignment=TA_CENTER, spaceAfter=4)

subtitle_style = S("Subtitle2",
    fontSize=11, fontName="Helvetica",
    textColor=colors.HexColor("#D5E8D4"), alignment=TA_CENTER, spaceAfter=2)

h1 = S("H1",
    fontSize=13, fontName="Helvetica-Bold",
    textColor=WHITE, alignment=TA_LEFT, spaceAfter=0)

h2 = S("H2",
    fontSize=11, fontName="Helvetica-Bold",
    textColor=TEAL, spaceBefore=8, spaceAfter=3)

h3 = S("H3",
    fontSize=10, fontName="Helvetica-Bold",
    textColor=GREY_DARK, spaceBefore=4, spaceAfter=2)

body = S("Body2",
    fontSize=9, fontName="Helvetica",
    textColor=GREY_DARK, spaceAfter=2, leading=13)

body_bold = S("BodyBold",
    fontSize=9, fontName="Helvetica-Bold",
    textColor=GREY_DARK, spaceAfter=2, leading=13)

bullet_style = S("Bullet2",
    fontSize=9, fontName="Helvetica",
    textColor=GREY_DARK, leftIndent=10, spaceAfter=1,
    bulletIndent=0, leading=13)

small = S("Small",
    fontSize=8, fontName="Helvetica",
    textColor=GREY_MID, alignment=TA_CENTER, spaceAfter=0)

tip_style = S("Tip",
    fontSize=9, fontName="Helvetica-Bold",
    textColor=ORANGE, spaceAfter=2, leading=13)

# ── Helper: section header banner ────────────────────────────────
def section_banner(text, bg=TEAL):
    data = [[Paragraph(text, h1)]]
    t = Table(data, colWidths=[17*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND",  (0,0), (-1,-1), bg),
        ("TOPPADDING",  (0,0), (-1,-1), 6),
        ("BOTTOMPADDING",(0,0),(-1,-1), 6),
        ("LEFTPADDING", (0,0), (-1,-1), 10),
        ("RIGHTPADDING",(0,0), (-1,-1), 10),
        ("ROUNDEDCORNERS", [4]),
    ]))
    return t

def tip_box(text, bg=ORANGE_LT, border=ORANGE):
    data = [[Paragraph(text, S("tipinner", fontSize=9, fontName="Helvetica",
                               textColor=GREY_DARK, leading=13))]]
    t = Table(data, colWidths=[17*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,-1), bg),
        ("TOPPADDING",    (0,0), (-1,-1), 6),
        ("BOTTOMPADDING", (0,0), (-1,-1), 6),
        ("LEFTPADDING",   (0,0), (-1,-1), 10),
        ("RIGHTPADDING",  (0,0), (-1,-1), 10),
        ("BOX",           (0,0), (-1,-1), 1.5, border),
        ("ROUNDEDCORNERS",[4]),
    ]))
    return t

def colored_table(data, col_widths, header_bg=TEAL, alt_bg=TEAL_LIGHT):
    t = Table(data, colWidths=col_widths)
    style = [
        ("BACKGROUND",    (0,0), (-1,0), header_bg),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,-1), 8.5),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("RIGHTPADDING",  (0,0), (-1,-1), 6),
        ("GRID",          (0,0), (-1,-1), 0.5, colors.HexColor("#BDC3C7")),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, alt_bg]),
    ]
    t.setStyle(TableStyle(style))
    return t

def sp(n=1):
    return Spacer(1, n*3*mm)

# ══════════════════════════════════════════════════════════════════
#  BUILD DOCUMENT
# ══════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=2*cm, rightMargin=2*cm,
    topMargin=1.5*cm, bottomMargin=2*cm,
    title="Assessment of Nutritional Status - PSM Quick Reference",
    author="Orris Medical"
)

story = []

# ── TITLE BLOCK ──────────────────────────────────────────────────
title_data = [[
    Paragraph("ASSESSMENT OF NUTRITIONAL STATUS", title_style),
    ],
    [Paragraph("PSM Quick Reference  |  Park's Textbook  |  Exam Edition", subtitle_style)]
]
title_tbl = Table(title_data, colWidths=[17*cm])
title_tbl.setStyle(TableStyle([
    ("BACKGROUND",    (0,0), (-1,-1), TEAL),
    ("TOPPADDING",    (0,0), (-1,0),  14),
    ("BOTTOMPADDING", (0,0), (-1,-1), 10),
    ("LEFTPADDING",   (0,0), (-1,-1), 14),
    ("RIGHTPADDING",  (0,0), (-1,-1), 14),
    ("ROUNDEDCORNERS",[6]),
]))
story.append(title_tbl)
story.append(sp(2))

# ── INTRO DEFINITION ─────────────────────────────────────────────
story.append(tip_box(
    "<b>Definition:</b> Nutritional status is the result of many interrelated factors - "
    "adequacy of food intake (quantity + quality) and physical health of the individual. "
    "The <b>purpose</b> of nutritional assessment is to identify at-risk groups, develop health "
    "care programmes, and evaluate their effectiveness. <i>(Park's PSM)</i>",
    bg=TEAL_LIGHT, border=TEAL
))
story.append(sp(2))

# ── 7 METHODS OVERVIEW TABLE ─────────────────────────────────────
story.append(section_banner("7 METHODS OF NUTRITIONAL ASSESSMENT  [Memory: C-A-B-F-D-V-E]"))
story.append(sp(1))

methods_data = [
    ["#", "Method", "What it Detects", "Best Used For"],
    ["1", "Clinical Examination",     "Obvious/frank deficiency signs",     "Quick field surveys"],
    ["2", "Anthropometry",            "Growth retardation, obesity",         "Children & adults"],
    ["3", "Biochemical Evaluation",   "Subclinical (latent) deficiency",    "Early/lab detection"],
    ["4", "Functional Assessment",    "Functional consequences",             "Work/immune capacity"],
    ["5", "Dietary Intake",           "Inadequate food intake",             "Cause identification"],
    ["6", "Vital & Health Statistics","Population-level trends",            "Community surveys"],
    ["7", "Ecological Studies",       "Environmental/socio risk factors",   "Programme planning"],
]
story.append(colored_table(methods_data,
    col_widths=[1*cm, 4.2*cm, 5.8*cm, 6*cm]))
story.append(sp(1))
story.append(tip_box(
    "⭐ Key Point: These methods are NOT mutually exclusive - they are COMPLEMENTARY to each other.",
    bg=ORANGE_LT, border=ORANGE))
story.append(sp(2))

# ── 1. CLINICAL ──────────────────────────────────────────────────
story.append(section_banner("1. CLINICAL EXAMINATION", bg=PURPLE))
story.append(sp(1))
story.append(Paragraph(
    "Simplest and most practical method. Looks for physical signs of malnutrition. "
    "Signs may be <b>specific</b> (e.g., Bitot's spots = Vit A) or <b>non-specific</b>. "
    "Diagnostic value increases when 2+ signs of same deficiency appear together.",
    body))
story.append(sp(1))

clinical_data = [
    ["WHO Group", "Description", "Examples"],
    ["Group 1\n(Definite signs)",
     "Strongly associated\nwith malnutrition",
     "Bitot's spots, corneal xerosis,\nfollicular keratosis,\nangular stomatitis, oedema,\nscrotal/vulval dermatosis"],
    ["Group 2\n(Possible signs)",
     "May or may not be\ndue to malnutrition",
     "Cheilosis (swollen lips),\nthyroid enlargement,\nconjunctival pallor,\ndental caries"],
    ["Group 3\n(Non-specific signs)",
     "Not reliably associated\nwith malnutrition",
     "Nasal discharge,\nskin infections"],
]
story.append(colored_table(clinical_data,
    col_widths=[3.5*cm, 5.5*cm, 8*cm], header_bg=PURPLE, alt_bg=PURPLE_LT))
story.append(sp(2))

# ── 2. ANTHROPOMETRY ─────────────────────────────────────────────
story.append(section_banner("2. ANTHROPOMETRY", bg=GREEN))
story.append(sp(1))
story.append(Paragraph(
    "Measurement of body dimensions to assess nutritional status. Most useful in children.",
    body))
story.append(sp(1))

# Key Indices
story.append(Paragraph("KEY ANTHROPOMETRIC INDICES", h3))
anthro_data = [
    ["Index", "Detects", "Condition"],
    ["Weight for Age (W/A)",   "Overall nutrition",    "Underweight"],
    ["Height for Age (H/A)",   "Chronic malnutrition", "Stunting"],
    ["Weight for Height (W/H)","Acute malnutrition",   "Wasting"],
    ["BMI = Wt(kg)/Ht²(m)",   "Obesity / thinness",   "Used in adults"],
    ["MUAC",                   "Arm muscle/fat stores","Children (age unknown OK)"],
    ["Skinfold Thickness",     "Body fat",             "Triceps, subscapular site"],
]
story.append(colored_table(anthro_data,
    col_widths=[5*cm, 5*cm, 7*cm], header_bg=GREEN, alt_bg=GREEN_LT))
story.append(sp(1))

# BMI + MUAC side by side
bmi_data = [
    ["BMI Cut-offs (Adults)", ""],
    ["< 18.5", "Underweight (CED)"],
    ["18.5 - 24.9", "Normal"],
    ["25.0 - 29.9", "Overweight"],
    ["≥ 30.0", "Obese"],
]
muac_data = [
    ["MUAC Cut-offs (Children 1-5 yrs)", ""],
    ["< 12.5 cm", "Severe malnutrition"],
    ["12.5 - 13.5 cm", "Moderate malnutrition"],
    ["> 13.5 cm", "Normal"],
    ["", ""],
]

def small_table(data, header_bg, alt_bg, col_w):
    t = Table(data, colWidths=col_w)
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (-1,0), header_bg),
        ("SPAN",          (0,0), (-1,0)),
        ("TEXTCOLOR",     (0,0), (-1,0), WHITE),
        ("FONTNAME",      (0,0), (-1,0), "Helvetica-Bold"),
        ("FONTSIZE",      (0,0), (-1,-1), 8.5),
        ("TOPPADDING",    (0,0), (-1,-1), 4),
        ("BOTTOMPADDING", (0,0), (-1,-1), 4),
        ("LEFTPADDING",   (0,0), (-1,-1), 6),
        ("RIGHTPADDING",  (0,0), (-1,-1), 6),
        ("GRID",          (0,0), (-1,-1), 0.5, colors.HexColor("#BDC3C7")),
        ("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, alt_bg]),
        ("ALIGN",         (0,0), (-1,0), "CENTER"),
        ("VALIGN",        (0,0), (-1,-1), "MIDDLE"),
    ]))
    return t

side_data = [[
    small_table(bmi_data, GREEN, GREEN_LT, [3.5*cm, 3*cm]),
    Spacer(0.5*cm, 1),
    small_table(muac_data, TEAL, TEAL_LIGHT, [3.8*cm, 3.2*cm]),
]]
side_tbl = Table(side_data, colWidths=[6.5*cm, 0.5*cm, 10*cm])
side_tbl.setStyle(TableStyle([
    ("VALIGN", (0,0), (-1,-1), "TOP"),
    ("TOPPADDING", (0,0), (-1,-1), 0),
    ("BOTTOMPADDING", (0,0), (-1,-1), 0),
    ("LEFTPADDING", (0,0), (-1,-1), 0),
    ("RIGHTPADDING", (0,0), (-1,-1), 0),
]))
story.append(side_tbl)
story.append(sp(1))

# Gomez Classification
story.append(Paragraph("GOMEZ CLASSIFICATION (PEM Grading - Weight for Age)", h3))
gomez_data = [
    ["Grade", "% of Standard Weight", "Severity"],
    ["Grade I",   "75 - 90%",  "Mild PEM"],
    ["Grade II",  "60 - 74%",  "Moderate PEM"],
    ["Grade III", "< 60%",     "Severe PEM"],
]
story.append(colored_table(gomez_data,
    col_widths=[4*cm, 6*cm, 7*cm], header_bg=GREEN, alt_bg=GREEN_LT))
story.append(sp(2))

# ── 3. BIOCHEMICAL ───────────────────────────────────────────────
story.append(section_banner("3. BIOCHEMICAL EVALUATION", bg=RED))
story.append(sp(1))
story.append(tip_box(
    "⭐ MOST SENSITIVE method - detects SUBCLINICAL (latent) deficiency BEFORE clinical signs appear!",
    bg=colors.HexColor("#FDEDEC"), border=RED))
story.append(sp(1))

bio_data = [
    ["Nutrient / Parameter", "Test Used"],
    ["Protein status",           "Serum albumin, transferrin, prealbumin"],
    ["Iron deficiency anaemia",  "Haemoglobin (Hb), serum ferritin, serum iron, TIBC"],
    ["Vitamin A deficiency",     "Serum retinol level"],
    ["Iodine deficiency",        "Urinary iodine excretion (UIE)"],
    ["Vitamin D deficiency",     "Serum 25-OH Vitamin D"],
    ["Vitamin C deficiency",     "Serum / urine ascorbic acid"],
    ["Overall nutrition",        "Serum albumin (< 3.5 g/dL = malnutrition)"],
]
story.append(colored_table(bio_data,
    col_widths=[6*cm, 11*cm], header_bg=RED,
    alt_bg=colors.HexColor("#FDEDEC")))
story.append(sp(2))

# ── 4. FUNCTIONAL ────────────────────────────────────────────────
story.append(section_banner("4. FUNCTIONAL ASSESSMENT", bg=ORANGE))
story.append(sp(1))
story.append(Paragraph(
    "Assesses functional consequences of malnutrition:", body))

func_items = [
    "Immune function - delayed hypersensitivity skin test",
    "Muscle function - hand grip strength (dynamometer)",
    "Work capacity / physical performance tests",
    "Cognitive function - mental development in children",
    "Dark adaptation test - for Vitamin A deficiency",
]
for item in func_items:
    story.append(Paragraph(f"• {item}", bullet_style))
story.append(sp(2))

# ── 5. DIETARY INTAKE ────────────────────────────────────────────
story.append(section_banner("5. ASSESSMENT OF DIETARY INTAKE", bg=colors.HexColor("#1A5276")))
story.append(sp(1))
story.append(Paragraph(
    "Measures what food the person actually eats and compares with RDA "
    "(Recommended Dietary Allowance).", body))
story.append(sp(1))

diet_data = [
    ["Method", "Description"],
    ["24-Hour Recall",        "Patient recalls everything eaten in past 24 hrs - MOST commonly used"],
    ["Dietary History",       "Long-term usual diet pattern (3-day or 7-day recall)"],
    ["Food Frequency Questionnaire", "How often certain foods are eaten per week/month"],
    ["Weighed Food Record",   "Actual weighing of food before consumption - most accurate"],
    ["Food Balance Sheets",   "National food availability data (FAO method)"],
]
story.append(colored_table(diet_data,
    col_widths=[5.5*cm, 11.5*cm],
    header_bg=colors.HexColor("#1A5276"),
    alt_bg=colors.HexColor("#EAF2FF")))
story.append(sp(2))

# ── 6 & 7 side by side ───────────────────────────────────────────
story.append(section_banner("6 & 7. VITAL STATISTICS  +  ECOLOGICAL STUDIES", bg=GREY_DARK))
story.append(sp(1))

vital_items = [
    "IMR (Infant Mortality Rate) - sensitive indicator",
    "Child mortality rate (1-4 years = toddler mortality)",
    "Birth weight (< 2500 g = low birth weight)",
    "Prevalence of stunting/wasting in community",
    "Morbidity data (disease frequency)",
]
eco_items = [
    "Food production & agricultural data",
    "Socioeconomic factors (income, poverty)",
    "Food availability and distribution patterns",
    "Education and literacy levels",
    "Cultural food habits and beliefs",
]

def bullet_cell(title, items, bg):
    content = [Paragraph(title, S("ct", fontSize=9, fontName="Helvetica-Bold",
                                   textColor=WHITE))]
    for it in items:
        content.append(Paragraph(f"• {it}", S("bi", fontSize=8.5, fontName="Helvetica",
                                               textColor=GREY_DARK, leftIndent=6, leading=12)))
    data = [[content]]
    t = Table(data, colWidths=[8*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0), (0,0), bg),
        ("BACKGROUND",    (0,1), (0,-1), GREY_LIGHT),
        ("TOPPADDING",    (0,0), (-1,-1), 5),
        ("BOTTOMPADDING", (0,0), (-1,-1), 5),
        ("LEFTPADDING",   (0,0), (-1,-1), 8),
        ("BOX",           (0,0), (-1,-1), 0.5, GREY_MID),
    ]))
    return t

v_tbl = small_table(
    [["6. VITAL & HEALTH STATISTICS"]] +
    [[f"• {i}"] for i in vital_items],
    header_bg=GREY_DARK, alt_bg=GREY_LIGHT, col_w=[8.2*cm]
)
e_tbl = small_table(
    [["7. ECOLOGICAL STUDIES"]] +
    [[f"• {i}"] for i in eco_items],
    header_bg=GREY_DARK, alt_bg=GREY_LIGHT, col_w=[8.2*cm]
)

dual = Table([[v_tbl, Spacer(0.6*cm, 1), e_tbl]],
             colWidths=[8.2*cm, 0.6*cm, 8.2*cm])
dual.setStyle(TableStyle([
    ("VALIGN", (0,0), (-1,-1), "TOP"),
    ("TOPPADDING", (0,0), (-1,-1), 0),
    ("BOTTOMPADDING", (0,0), (-1,-1), 0),
    ("LEFTPADDING", (0,0), (-1,-1), 0),
    ("RIGHTPADDING", (0,0), (-1,-1), 0),
]))
story.append(dual)
story.append(sp(2))

# ── NUTRITIONAL SURVEILLANCE ─────────────────────────────────────
story.append(section_banner("NUTRITIONAL SURVEILLANCE", bg=PURPLE))
story.append(sp(1))
story.append(Paragraph(
    "<b>Definition:</b> Continuous monitoring of nutritional status of a population over time "
    "to detect changes and facilitate timely action.", body))
story.append(sp(1))

surv_data = [
    ["Population Group", "Key Indicator(s)"],
    ["Maternal nutrition",         "Birth weight"],
    ["Infants & preschool (age known)",   "Height for age, Weight for age"],
    ["Infants & preschool (age unknown)", "Weight for height, MUAC, clinical signs"],
    ["School children",           "Height for age + Weight for height at age 7"],
]
story.append(colored_table(surv_data,
    col_widths=[7*cm, 10*cm], header_bg=PURPLE, alt_bg=PURPLE_LT))
story.append(sp(1))
story.append(tip_box(
    "<b>Assessment vs Surveillance:</b>  Assessment = done at ONE point in time (cross-sectional).  "
    "Surveillance = done CONTINUOUSLY over time (ongoing monitoring).",
    bg=ORANGE_LT, border=ORANGE))
story.append(sp(2))

# ── EXAM QUICK RECALL ────────────────────────────────────────────
story.append(section_banner("EXAM QUICK RECALL - IMPORTANT POINTS", bg=RED))
story.append(sp(1))

recall_items = [
    ("<b>Simplest & most practical</b> method", "Clinical Examination"),
    ("<b>Most sensitive</b> method (detects subclinical)", "Biochemical Evaluation"),
    ("<b>Wasting</b> = low Weight for Height", "Acute malnutrition"),
    ("<b>Stunting</b> = low Height for Age", "Chronic malnutrition"),
    ("<b>Underweight</b> = low Weight for Age", "Composite/overall"),
    ("<b>Best when age is unknown</b>", "MUAC or Weight for Height"),
    ("<b>Gomez Grade III</b> (Severe PEM)", "Weight < 60% of standard"),
    ("<b>Low Birth Weight</b>", "< 2500 g"),
    ("<b>Severe MUAC in children</b>", "< 12.5 cm"),
    ("<b>Serum albumin cut-off for malnutrition</b>", "< 3.5 g/dL"),
]

recall_data = [["Key Fact", "Answer"]] + recall_items
story.append(colored_table(recall_data,
    col_widths=[9*cm, 8*cm],
    header_bg=RED, alt_bg=colors.HexColor("#FDEDEC")))
story.append(sp(2))

# ── MEMORY AID ───────────────────────────────────────────────────
story.append(tip_box(
    "🧠  <b>MEMORY AID:</b>  C - A - B - F - D - V - E  "
    "(Clinical | Anthropometry | Biochemical | Functional | Dietary | Vital stats | Ecological)\n"
    "Think: <b>\"Can A Boy Find Directions Via Ecology?\"</b>",
    bg=GREEN_LT, border=GREEN))
story.append(sp(1))
story.append(Paragraph(
    "Source: Park's Textbook of Preventive and Social Medicine  |  Generated by Orris Medical",
    small))

# ── BUILD ─────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF created: {OUTPUT}")
Running Command

cd /home/daytona/workspace/nutrition-psm && python3 generate_pdf.py

Your PDF is ready! Download it here:

Nutritional Status Assessment PSM

PDF Document · PDF

Here's what's packed inside:
  • Color-coded sections for each of the 7 methods (Clinical, Anthropometry, Biochemical, Functional, Dietary, Vital Stats, Ecological)
  • WHO classification table for clinical signs (3 groups)
  • Anthropometric indices - Wasting / Stunting / Underweight explained clearly
  • BMI + MUAC cut-off tables side by side
  • Gomez Classification table for PEM grading
  • Biochemical tests - nutrient by nutrient
  • Dietary intake methods table
  • Nutritional surveillance indicators (Assessment vs Surveillance difference)
  • Exam Quick Recall table - 10 most commonly asked facts
  • Memory aid at the bottom: "Can A Boy Find Directions Via Ecology?"
Print it, stick it somewhere visible, and revise tonight. All the best for your exam tomorrow!
This is a shared conversation. Sign in to Orris to start your own chat.