Uses of screening in psm
| Type | Description | Example |
|---|---|---|
| Mass Screening | Screening of the whole population without selection | Population-wide BP screening |
| High-risk (Selective) Screening | Targeted at high-risk groups to increase yield | Diabetes screening in >40 years age group |
| Multiphasic Screening | Application of two or more screening tests in combination at one time | Health questionnaire + clinical exam + blood/urine tests + audiometry + lung function tests |
| Term | Definition | Example |
|---|---|---|
| Screening | Testing in populations NOT seeking health care | Serological testing for HIV in blood donors; neonatal screening |
| Case-finding | Using tests to detect disease in individuals seeking care for OTHER reasons | VDRL for syphilis in pregnant women; detecting hypertension in routine OPD |
| Diagnostic tests | Confirming/refuting disease in patients WITH signs and symptoms | VDRL in a patient with lesions suggestive of secondary syphilis |
Make a presentation summarizing screening types, uses, and criteria
ls /home/daytona/workspace/ 2>/dev/null && echo "---" && ls /home/daytona/skills…
mkdir -p /home/daytona/workspace/screening-psm
~/screening-psm/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Screening in PSM";
pres.author = "Orris";
// ── COLOUR PALETTE ──────────────────────────────────────────────────────────
const C = {
navy: "0D2B55", // dominant dark
teal: "1A7A9E", // supporting mid
aqua: "2BBFCF", // accent/highlight
white: "FFFFFF",
offWhite:"F4F8FB",
slate: "E0EEF5",
text: "0D2B55",
subtext: "4A6278",
light: "B8D8E8",
};
// ── HELPERS ─────────────────────────────────────────────────────────────────
function darkSlide(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy }, line: { color: C.navy } });
}
function lightSlide(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.offWhite }, line: { color: C.offWhite } });
}
function sectionHeader(slide, label) {
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 0.25, h: 5.625, fill: { color: C.aqua }, line: { color: C.aqua } });
slide.addShape(pres.shapes.RECTANGLE, { x: 0, y: 0, w: 10, h: 0.7, fill: { color: C.teal }, line: { color: C.teal } });
slide.addText(label, { x: 0.35, y: 0, w: 9.3, h: 0.7, fontSize: 18, bold: true, color: C.white, valign: "middle", margin: 0 });
}
function card(slide, x, y, w, h, title, titleColor, bgColor, items, iconChar) {
slide.addShape(pres.shapes.RECTANGLE, {
x, y, w, h,
fill: { color: bgColor },
shadow: { type: "outer", color: "000000", blur: 5, offset: 2, angle: 135, opacity: 0.12 },
line: { color: C.light, pt: 1 }
});
// accent bar top of card
slide.addShape(pres.shapes.RECTANGLE, { x, y, w, h: 0.06, fill: { color: titleColor }, line: { color: titleColor } });
let ty = y + 0.1;
if (iconChar) {
slide.addText(iconChar, { x, y: ty, w, h: 0.35, fontSize: 16, align: "center", color: titleColor, bold: true, margin: 0 });
ty += 0.35;
}
slide.addText(title, { x: x + 0.1, y: ty, w: w - 0.2, h: 0.38, fontSize: 11.5, bold: true, color: titleColor, align: "center", margin: 0 });
ty += 0.38;
const bullets = items.map((t, i) => ({ text: t, options: { bullet: { type: "bullet" }, breakLine: i < items.length - 1, fontSize: 9.5, color: C.text } }));
slide.addText(bullets, { x: x + 0.12, y: ty, w: w - 0.24, h: h - (ty - y) - 0.1, fontSize: 9.5, color: C.text, valign: "top" });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
darkSlide(s);
// teal diagonal accent shape
s.addShape(pres.shapes.RECTANGLE, { x: 7, y: 0, w: 3, h: 5.625, fill: { color: C.teal }, line: { color: C.teal } });
s.addShape(pres.shapes.RECTANGLE, { x: 6.6, y: 0, w: 0.5, h: 5.625, fill: { color: C.aqua }, line: { color: C.aqua } });
s.addText("SCREENING", {
x: 0.5, y: 1.0, w: 6, h: 0.9,
fontSize: 42, bold: true, color: C.white, charSpacing: 8, margin: 0
});
s.addText("in Preventive & Social Medicine", {
x: 0.5, y: 1.95, w: 6, h: 0.55,
fontSize: 20, color: C.aqua, italic: true, margin: 0
});
s.addShape(pres.shapes.RECTANGLE, { x: 0.5, y: 2.6, w: 3.5, h: 0.05, fill: { color: C.aqua }, line: { color: C.aqua } });
s.addText([
{ text: "Types | Uses | Criteria", options: { bold: false } }
], { x: 0.5, y: 2.75, w: 5.8, h: 0.4, fontSize: 14, color: C.light, margin: 0 });
s.addText("Source: Park's Textbook of Preventive and Social Medicine", {
x: 0.5, y: 5.1, w: 6, h: 0.35, fontSize: 9, color: C.light, italic: true, margin: 0
});
// right-panel content
s.addText([
{ text: "DEFINITION", options: { bold: true, breakLine: true, fontSize: 11, color: C.white } },
{ text: " ", options: { breakLine: true, fontSize: 6 } },
{ text: "Presumptive identification of unrecognized disease in apparently healthy individuals who are NOT seeking health care.", options: { fontSize: 10, color: C.light } }
], { x: 7.1, y: 1.5, w: 2.7, h: 2.5, margin: 0.1 });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 2 — OVERVIEW / AGENDA
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
lightSlide(s);
sectionHeader(s, "What We Will Cover");
const topics = [
["01", "Screening vs. Case-finding vs. Diagnosis", "Key distinctions between three related concepts"],
["02", "Types of Screening", "Mass, Selective, and Multiphasic"],
["03", "Uses of Screening", "Four main purposes described by Park"],
["04", "Disease Criteria", "9 criteria for a disease to be suitable for screening"],
["05", "Test Criteria", "Properties a good screening test must have"],
["06", "Yield of Screening", "What determines how much unrecognized disease is detected"],
];
topics.forEach(([num, title, sub], i) => {
const col = i % 3;
const row = Math.floor(i / 3);
const x = 0.35 + col * 3.2;
const y = 0.85 + row * 2.15;
s.addShape(pres.shapes.RECTANGLE, {
x, y, w: 3.0, h: 1.85,
fill: { color: C.white },
shadow: { type: "outer", color: "000000", blur: 4, offset: 2, angle: 135, opacity: 0.10 },
line: { color: C.slate, pt: 1 }
});
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.5, h: 1.85, fill: { color: C.teal }, line: { color: C.teal } });
s.addText(num, { x, y: y + 0.55, w: 0.5, h: 0.6, fontSize: 16, bold: true, color: C.white, align: "center", margin: 0 });
s.addText(title, { x: x + 0.6, y: y + 0.15, w: 2.3, h: 0.8, fontSize: 11, bold: true, color: C.navy, margin: 0 });
s.addText(sub, { x: x + 0.6, y: y + 0.95, w: 2.3, h: 0.75, fontSize: 9, color: C.subtext, margin: 0 });
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 3 — DISTINCTIONS
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
lightSlide(s);
sectionHeader(s, "Screening vs. Case-finding vs. Diagnostic Tests");
const cols = [
{
title: "SCREENING", color: C.navy, icon: "🔍",
def: "Testing in populations NOT seeking health care",
ex: ["Serological testing for HIV in blood donors", "Neonatal screening programmes", "Premarital syphilis screening"]
},
{
title: "CASE-FINDING", color: C.teal, icon: "📋",
def: "Detecting disease in individuals seeking care for OTHER reasons",
ex: ["VDRL in pregnant women attending ANC", "BP check in routine OPD", "Cervical cancer in gynaecology patients"]
},
{
title: "DIAGNOSTIC TEST", color: C.aqua, icon: "🧪",
def: "Confirming/refuting disease in patients WITH signs & symptoms",
ex: ["VDRL in patient with secondary syphilis lesions", "Endocervical culture for N. gonorrhoeae", "FBS in symptomatic patient"]
},
];
cols.forEach(({ title, color, icon, def, ex }, i) => {
const x = 0.3 + i * 3.15;
// header
s.addShape(pres.shapes.RECTANGLE, { x, y: 0.8, w: 3.0, h: 0.65, fill: { color }, line: { color } });
s.addText(icon + " " + title, { x, y: 0.8, w: 3.0, h: 0.65, fontSize: 12, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
// body
s.addShape(pres.shapes.RECTANGLE, {
x, y: 1.45, w: 3.0, h: 3.9,
fill: { color: C.white },
shadow: { type: "outer", color: "000000", blur: 4, offset: 2, angle: 135, opacity: 0.10 },
line: { color: C.light, pt: 1 }
});
s.addShape(pres.shapes.RECTANGLE, { x, y: 1.45, w: 3.0, h: 0.05, fill: { color }, line: { color } });
s.addText("Definition", { x: x + 0.1, y: 1.55, w: 2.8, h: 0.3, fontSize: 9.5, bold: true, color, margin: 0 });
s.addText(def, { x: x + 0.1, y: 1.85, w: 2.8, h: 0.8, fontSize: 9.5, color: C.text, margin: 0 });
s.addShape(pres.shapes.RECTANGLE, { x: x + 0.1, y: 2.7, w: 2.8, h: 0.02, fill: { color: C.light }, line: { color: C.light } });
s.addText("Examples", { x: x + 0.1, y: 2.78, w: 2.8, h: 0.3, fontSize: 9.5, bold: true, color, margin: 0 });
const bullets = ex.map((t, j) => ({ text: t, options: { bullet: true, breakLine: j < ex.length - 1, fontSize: 9, color: C.text } }));
s.addText(bullets, { x: x + 0.1, y: 3.08, w: 2.8, h: 2.1, valign: "top", margin: 0 });
});
s.addText("Note: The same test (e.g., VDRL) can serve different purposes depending on context.", {
x: 0.3, y: 5.28, w: 9.4, h: 0.28, fontSize: 8.5, italic: true, color: C.subtext, margin: 0
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 4 — TYPES OF SCREENING
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
lightSlide(s);
sectionHeader(s, "Types of Screening");
const types = [
{
num: "01", title: "MASS SCREENING", color: C.navy,
desc: "Screening of the entire population without any selection criteria.",
points: ["Applied to all members of a community", "High coverage but lower efficiency", "Example: Universal BP measurement in adults"],
pros: "Maximum reach",
cons: "High cost, lower yield"
},
{
num: "02", title: "SELECTIVE (High-risk) SCREENING", color: C.teal,
desc: "Targeted at specific high-risk groups to increase diagnostic yield.",
points: ["Applied to sub-populations at elevated risk", "More cost-effective than mass screening", "Example: Diabetes screening in persons >40 yrs"],
pros: "Higher yield, lower cost",
cons: "Risk groups may be misidentified"
},
{
num: "03", title: "MULTIPHASIC SCREENING", color: C.aqua,
desc: "Two or more screening tests applied in combination to a large population at one time.",
points: ["May include questionnaire, clinical exam, bloods, lung function, audiometry", "Historically popular in UK & USA", "RCTs showed NO benefit in mortality/morbidity"],
pros: "Broad detection scope",
cons: "Unvalidated tests; increased costs; no proven mortality benefit"
},
];
types.forEach(({ num, title, color, desc, points, pros, cons }, i) => {
const x = 0.3 + i * 3.15;
s.addShape(pres.shapes.RECTANGLE, {
x, y: 0.82, w: 3.0, h: 4.5,
fill: { color: C.white },
shadow: { type: "outer", color: "000000", blur: 5, offset: 2, angle: 135, opacity: 0.12 },
line: { color: C.light, pt: 1 }
});
s.addShape(pres.shapes.RECTANGLE, { x, y: 0.82, w: 3.0, h: 0.06, fill: { color }, line: { color } });
// number badge
s.addShape(pres.shapes.RECTANGLE, { x: x + 0.1, y: 0.95, w: 0.42, h: 0.42, fill: { color }, line: { color } });
s.addText(num, { x: x + 0.1, y: 0.95, w: 0.42, h: 0.42, fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
s.addText(title, { x: x + 0.62, y: 0.95, w: 2.28, h: 0.42, fontSize: 10.5, bold: true, color, valign: "middle", margin: 0 });
s.addText(desc, { x: x + 0.12, y: 1.48, w: 2.76, h: 0.65, fontSize: 9, color: C.subtext, italic: true, margin: 0 });
// divider
s.addShape(pres.shapes.RECTANGLE, { x: x + 0.12, y: 2.15, w: 2.76, h: 0.02, fill: { color: C.slate }, line: { color: C.slate } });
const bp = points.map((t, j) => ({ text: t, options: { bullet: true, breakLine: j < points.length - 1, fontSize: 9, color: C.text } }));
s.addText(bp, { x: x + 0.12, y: 2.22, w: 2.76, h: 1.3, valign: "top", margin: 0 });
// pros/cons
s.addShape(pres.shapes.RECTANGLE, { x: x + 0.12, y: 3.55, w: 2.76, h: 0.02, fill: { color: C.slate }, line: { color: C.slate } });
s.addText([
{ text: "✓ ", options: { bold: true, color: "2E7D32" } },
{ text: pros, options: { fontSize: 8.5, color: C.text } },
{ text: "\n✗ ", options: { bold: true, color: "C62828" } },
{ text: cons, options: { fontSize: 8.5, color: C.text } },
], { x: x + 0.12, y: 3.62, w: 2.76, h: 1.5, margin: 0, fontSize: 8.5 });
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 5 — USES OF SCREENING
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
lightSlide(s);
sectionHeader(s, "Uses of Screening — Four Main Uses (Park)");
// Left side: 4 use cards stacked
const uses = [
{
num: "1", color: C.navy, title: "Case Detection (Prescriptive Screening)",
body: "Presumptive identification of unrecognized disease not arising from a patient's request. People screened primarily for their own benefit.",
ex: "Neonatal screening, PKU, bacteriuria in pregnancy, breast/cervical cancer"
},
{
num: "2", color: C.teal, title: "Control of Disease (Prospective Screening)",
body: "People are examined for the benefit of others — reduces spread of infectious disease.",
ex: "Screening immigrants for TB/syphilis; streptococcal infection to prevent rheumatic fever"
},
{
num: "3", color: "7B5EA7", title: "Research Purposes",
body: "Used when natural history of a disease is not fully known. Initial screening = prevalence estimate; repeat screening = incidence figure.",
ex: "Chronic disease research (cancer, hypertension). Note: participants must be informed if no follow-up therapy is planned."
},
{
num: "4", color: C.aqua, title: "Qualification Screening",
body: "Assessment of suitability for a particular role or task.",
ex: "Pre-employment medicals, armed forces fitness screening, blood donor screening"
},
];
uses.forEach(({ num, color, title, body, ex }, i) => {
const y = 0.82 + i * 1.15;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y, w: 9.4, h: 1.05,
fill: { color: C.white },
shadow: { type: "outer", color: "000000", blur: 3, offset: 1, angle: 135, opacity: 0.10 },
line: { color: C.slate, pt: 1 }
});
s.addShape(pres.shapes.RECTANGLE, { x: 0.3, y, w: 0.55, h: 1.05, fill: { color }, line: { color } });
s.addText(num, { x: 0.3, y, w: 0.55, h: 1.05, fontSize: 20, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
s.addText(title, { x: 0.95, y: y + 0.08, w: 4.5, h: 0.35, fontSize: 10.5, bold: true, color, margin: 0 });
s.addText(body, { x: 0.95, y: y + 0.42, w: 4.5, h: 0.55, fontSize: 8.8, color: C.text, margin: 0 });
// example tag
s.addShape(pres.shapes.RECTANGLE, { x: 5.55, y: y + 0.1, w: 4.05, h: 0.85, fill: { color: C.slate }, line: { color: C.light, pt: 1 } });
s.addText([
{ text: "Eg: ", options: { bold: true, fontSize: 8.5, color } },
{ text: ex, options: { fontSize: 8.5, color: C.text } }
], { x: 5.65, y: y + 0.1, w: 3.85, h: 0.85, valign: "middle", margin: 0.06 });
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 6 — DISEASE CRITERIA
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
lightSlide(s);
sectionHeader(s, "Criteria for Screening — The Disease");
s.addText("Before initiating a screening programme, the disease must satisfy ALL of the following:", {
x: 0.35, y: 0.82, w: 9.3, h: 0.3, fontSize: 9.5, italic: true, color: C.subtext, margin: 0
});
const criteria = [
["1", "Important Health Problem", "Condition must be prevalent and significant in the community"],
["2", "Latent / Asymptomatic Stage", "A recognizable pre-symptomatic phase must exist"],
["3", "Natural History Understood", "Disease progression from latent to declared disease must be adequately known"],
["4", "Detectable by a Test", "A test must be able to detect disease before signs/symptoms appear"],
["5", "Diagnostic Facilities", "Facilities must be available to confirm the diagnosis"],
["6", "Effective Treatment", "An accepted and effective treatment must be available"],
["7", "Agreed Treatment Policy", "Clear consensus on who should be treated (e.g., borderline hypertension, diabetes)"],
["8", "Early Detection Reduces Mortality", "Good evidence that early detection + treatment reduces morbidity/mortality"],
["9", "Benefits > Risks + Costs", "Expected benefits (lives saved) must exceed the risks and financial costs"],
];
const col1 = criteria.slice(0, 5);
const col2 = criteria.slice(5);
[col1, col2].forEach((col, ci) => {
col.forEach(([num, title, desc], ri) => {
const x = 0.3 + ci * 4.8;
const y = 1.2 + ri * 0.83;
s.addShape(pres.shapes.RECTANGLE, {
x, y, w: 4.6, h: 0.74,
fill: { color: C.white },
line: { color: C.slate, pt: 1 },
shadow: { type: "outer", color: "000000", blur: 3, offset: 1, angle: 135, opacity: 0.08 }
});
// left accent
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 0.38, h: 0.74, fill: { color: C.teal }, line: { color: C.teal } });
s.addText(num, { x, y, w: 0.38, h: 0.74, fontSize: 14, bold: true, color: C.white, align: "center", valign: "middle", margin: 0 });
s.addText(title, { x: x + 0.45, y: y + 0.06, w: 4.05, h: 0.28, fontSize: 9.5, bold: true, color: C.navy, margin: 0 });
s.addText(desc, { x: x + 0.45, y: y + 0.36, w: 4.05, h: 0.32, fontSize: 8.5, color: C.subtext, margin: 0 });
});
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 7 — TEST CRITERIA
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
lightSlide(s);
sectionHeader(s, "Criteria for Screening — The Test");
s.addText("A screening test must satisfy the following properties:", {
x: 0.35, y: 0.82, w: 9.3, h: 0.3, fontSize: 9.5, italic: true, color: C.subtext, margin: 0
});
const testCriteria = [
{ icon: "✓", title: "Validity", color: C.navy, body: "High Sensitivity (few false negatives) + High Specificity (few false positives). Tests with greater accuracy are often more expensive." },
{ icon: "↻", title: "Repeatability", color: C.teal, body: "Consistent, reproducible results on repeated application under the same conditions." },
{ icon: "👥", title: "Acceptability", color: "7B5EA7", body: "Must be acceptable to the target population. Painful, embarrassing or discomforting tests (e.g., rectal/vaginal exams) reduce participation." },
{ icon: "⚡", title: "Simplicity & Rapidity", color: C.aqua, body: "Should be easy to administer and yield results quickly so large populations can be screened efficiently." },
{ icon: "🎯", title: "Yield", color: "2E7D32", body: "Amount of previously unrecognized disease detected. Depends on: sensitivity, specificity, disease prevalence, and participation rate." },
{ icon: "$", title: "Cost-effectiveness", color: "C62828", body: "Must be financially justifiable. Balance between test accuracy and economic cost." },
];
const cols = 3;
testCriteria.forEach(({ icon, title, color, body }, i) => {
const col = i % cols;
const row = Math.floor(i / cols);
const x = 0.3 + col * 3.15;
const y = 1.2 + row * 2.0;
s.addShape(pres.shapes.RECTANGLE, {
x, y, w: 3.0, h: 1.8,
fill: { color: C.white },
shadow: { type: "outer", color: "000000", blur: 5, offset: 2, angle: 135, opacity: 0.12 },
line: { color: C.light, pt: 1 }
});
s.addShape(pres.shapes.RECTANGLE, { x, y, w: 3.0, h: 0.06, fill: { color }, line: { color } });
s.addText(icon, { x, y: y + 0.1, w: 3.0, h: 0.42, fontSize: 18, align: "center", color, margin: 0 });
s.addText(title, { x: x + 0.1, y: y + 0.52, w: 2.8, h: 0.32, fontSize: 11, bold: true, color, align: "center", margin: 0 });
s.addShape(pres.shapes.RECTANGLE, { x: x + 0.6, y: y + 0.84, w: 1.8, h: 0.02, fill: { color: C.slate }, line: { color: C.slate } });
s.addText(body, { x: x + 0.1, y: y + 0.9, w: 2.8, h: 0.8, fontSize: 8.5, color: C.text, margin: 0 });
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 8 — YIELD
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
lightSlide(s);
sectionHeader(s, "Yield of Screening");
// Definition box
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y: 0.85, w: 9.4, h: 0.9,
fill: { color: C.navy }, line: { color: C.navy }
});
s.addText([
{ text: "YIELD ", options: { bold: true, fontSize: 13, color: C.aqua } },
{ text: "= Amount of previously unrecognized disease that is diagnosed as a result of the screening effort.", options: { fontSize: 12, color: C.white } }
], { x: 0.45, y: 0.85, w: 9.1, h: 0.9, valign: "middle", margin: 0.1 });
// Determinants
s.addText("Determinants of Yield", { x: 0.3, y: 1.9, w: 4.5, h: 0.35, fontSize: 12, bold: true, color: C.navy, margin: 0 });
const factors = [
["Sensitivity of the Test", "Higher sensitivity → fewer missed cases → higher yield"],
["Specificity of the Test", "Higher specificity → fewer false positives → better targeting"],
["Prevalence of Disease", "Higher prevalence in screened group → more cases detected"],
["Participation Rate", "Greater public cooperation → more disease detected overall"],
];
factors.forEach(([title, desc], i) => {
const y = 2.32 + i * 0.72;
s.addShape(pres.shapes.RECTANGLE, {
x: 0.3, y, w: 4.6, h: 0.62,
fill: { color: C.white },
shadow: { type: "outer", color: "000000", blur: 3, offset: 1, angle: 135, opacity: 0.08 },
line: { color: C.slate, pt: 1 }
});
s.addShape(pres.shapes.RECTANGLE, { x: 0.3, y, w: 0.12, h: 0.62, fill: { color: C.teal }, line: { color: C.teal } });
s.addText(title, { x: 0.52, y: y + 0.04, w: 4.2, h: 0.26, fontSize: 9.5, bold: true, color: C.navy, margin: 0 });
s.addText(desc, { x: 0.52, y: y + 0.3, w: 4.2, h: 0.26, fontSize: 8.5, color: C.subtext, margin: 0 });
});
// Right side: key insight
s.addShape(pres.shapes.RECTANGLE, {
x: 5.3, y: 1.9, w: 4.4, h: 3.5,
fill: { color: C.slate }, line: { color: C.light, pt: 1 }
});
s.addText("Practical Application", { x: 5.45, y: 2.0, w: 4.1, h: 0.32, fontSize: 11, bold: true, color: C.navy, margin: 0 });
s.addShape(pres.shapes.RECTANGLE, { x: 5.45, y: 2.35, w: 4.1, h: 0.02, fill: { color: C.light }, line: { color: C.light } });
const insights = [
"High-risk populations are usually selected for screening to increase yield.",
"Example: Limiting a diabetes screening programme to persons OVER 40 years significantly increases yield.",
"Restricting to high-prevalence sub-groups saves resources while maximizing detection.",
"The goal is always to maximize previously unrecognized cases found per unit cost."
];
const insightBullets = insights.map((t, i) => ({
text: t,
options: { bullet: true, breakLine: i < insights.length - 1, fontSize: 9, color: C.text }
}));
s.addText(insightBullets, { x: 5.45, y: 2.42, w: 4.1, h: 2.8, valign: "top", margin: 0 });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 9 — SUMMARY / CONCLUSION
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
darkSlide(s);
s.addShape(pres.shapes.RECTANGLE, { x: 7.5, y: 0, w: 2.5, h: 5.625, fill: { color: C.teal }, line: { color: C.teal } });
s.addShape(pres.shapes.RECTANGLE, { x: 7.15, y: 0, w: 0.4, h: 5.625, fill: { color: C.aqua }, line: { color: C.aqua } });
s.addText("KEY TAKEAWAYS", { x: 0.4, y: 0.25, w: 6.6, h: 0.5, fontSize: 22, bold: true, color: C.aqua, charSpacing: 4, margin: 0 });
s.addShape(pres.shapes.RECTANGLE, { x: 0.4, y: 0.8, w: 6.6, h: 0.04, fill: { color: C.teal }, line: { color: C.teal } });
const takeaways = [
["3 TYPES", "Mass | Selective (High-risk) | Multiphasic"],
["4 USES", "Case Detection | Disease Control | Research | Qualification"],
["9 DISEASE CRITERIA", "Prevalence, latent stage, natural history, test available, facilities, treatment, policy, evidence of benefit, benefits > costs"],
["KEY TEST PROPERTIES", "Validity (sensitivity + specificity), Repeatability, Acceptability, Simplicity, Yield, Cost-effectiveness"],
["YIELD PRINCIPLE", "Select high-risk groups to maximize unrecognized disease detected per unit cost"],
];
takeaways.forEach(([label, value], i) => {
const y = 0.95 + i * 0.88;
s.addShape(pres.shapes.RECTANGLE, { x: 0.4, y, w: 1.5, h: 0.72, fill: { color: C.teal }, line: { color: C.teal } });
s.addText(label, { x: 0.4, y, w: 1.5, h: 0.72, fontSize: 8.5, bold: true, color: C.white, align: "center", valign: "middle", margin: 0.05 });
s.addShape(pres.shapes.RECTANGLE, { x: 1.9, y, w: 5.1, h: 0.72, fill: { color: "163C66" }, line: { color: "163C66" } });
s.addText(value, { x: 2.0, y, w: 4.9, h: 0.72, fontSize: 9.5, color: C.light, valign: "middle", margin: 0 });
});
s.addText("Park's Textbook of Preventive & Social Medicine", {
x: 7.55, y: 4.8, w: 2.3, h: 0.3, fontSize: 7.5, italic: true, color: C.light, align: "center", margin: 0
});
}
// ── WRITE FILE ───────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/screening-psm/Screening_in_PSM.pptx" })
.then(() => console.log("Done: /home/daytona/workspace/screening-psm/Screening_in_PSM.pptx"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/screening-psm && node build.js 2>&1
Screening in PSM
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide with definition of screening |
| 2 | Overview / agenda with 6 topic cards |
| 3 | Screening vs. Case-finding vs. Diagnostic Tests (3-column layout) |
| 4 | Three types of screening - Mass, Selective, Multiphasic (with pros/cons) |
| 5 | Four uses of screening with examples (horizontal card layout) |
| 6 | 9 Disease criteria for screening (two-column grid) |
| 7 | 6 Test criteria (icon cards) |
| 8 | Yield - definition, determinants, and practical application |
| 9 | Key Takeaways summary slide |