Create a study guide comparing normal vs. abnormal DLC patterns
"differential leukocyte count" AND "reference range"
Key principle: Always use the absolute count (WBC total × cell %), not just the percentage, to determine a true abnormality. A raised % of one cell type can simply reflect a reduction in another.
| Cell Type | % of WBC | Absolute Count (×10³/µL) | Notes |
|---|---|---|---|
| Neutrophils (segs + bands) | 50-70% | 1.8-7.0 | Bands normally <5% |
| Lymphocytes | 20-40% | 1.0-4.8 | Dominant in children <4 yrs |
| Monocytes | 2-10% | 0.2-1.0 | Largest circulating WBC |
| Eosinophils | 1-4% | 0.04-0.4 | Elevated in allergies/parasites |
| Basophils | 0-1% | 0.01-0.1 | Rarest; carrier of histamine |
| Category | Examples |
|---|---|
| Infections | Bacterial (most common), fungal, some viral |
| Inflammation | Trauma, surgery, burns, MI |
| Drugs | Corticosteroids, G-CSF, lithium |
| Physiologic | Exercise, stress, pregnancy, neonatal period |
| Neoplastic | CML, myeloproliferative disorders |
| Metabolic | Uremia, diabetic ketoacidosis, gout |
| Other | Asplenia, hemorrhage, hemolysis |
| Change | Description |
|---|---|
| Toxic granulation | Dark azurophilic (primary) granules; severe infections and toxic conditions |
| Döhle bodies | Pale-blue oval cytoplasmic inclusions (ribosome remnants); infections and toxic states |
| Cytoplasmic vacuoles | Indicate active phagocytosis |
| Category | Examples |
|---|---|
| Drugs (most common) | Chemotherapy, chloramphenicol, sulfonamides, phenothiazines, antithyroids, anticonvulsants |
| Radiation | Dose-dependent marrow damage |
| Toxins | Alcohol, benzene |
| Immune-mediated | SLE, RA/Felty syndrome, AIDS |
| Congenital | Kostmann syndrome, cyclic neutropenia (21-day cycling, ELA2 mutations), Chédiak-Higashi |
| Hematologic | Megaloblastic anemia, myelodysplasia, aplastic anemia, marrow infiltration |
| Infectious | Overwhelming bacterial infection; measles, rubella (viral-mediated suppression) |
| Other | Starvation, hypersplenism |
| Anomaly | Description | Significance |
|---|---|---|
| Pelger-Huët | Bilobed/"pince-nez" nucleus | Inherited (benign) or acquired in MDS |
| Hypersegmentation | ≥5 lobes; ≥5% have ≥5 lobes | Megaloblastic anemia (B12/folate deficiency) |
| Alder-Reilly | Prominent azurophilic granulation | Not infection-related; mucopolysaccharidoses |
| May-Hegglin | Döhle-like inclusions + giant platelets | Rare autosomal-dominant anomaly |
| Chédiak-Higashi | Giant fused granules (lysosomes) in all leukocytes | Autosomal-recessive; recurrent pyogenic infections, partial albinism |
| Category | Examples |
|---|---|
| Acute viral infections | EBV (mononucleosis), CMV, hepatitis, rubella, pertussis |
| Chronic infections | TB, brucellosis, toxoplasmosis |
| Autoimmune | Early RA, other autoimmune disorders |
| Neoplastic | CLL (chronic lymphocytic leukemia), ALL, lymphomas |
| Category | Examples |
|---|---|
| Immunodeficiency | HIV/AIDS, DiGeorge syndrome, SCID |
| Adrenocortical excess | Cushing's syndrome, high-dose corticosteroids |
| Cytotoxic therapy | Chemotherapy, radiation (lymphocytes are most radiosensitive) |
| Advanced malignancy | Lymphomas, carcinomas |
| Other | Impaired intestinal lymphatic drainage, anorexia nervosa |
| Category | Examples |
|---|---|
| Infections | Tuberculosis, brucellosis, subacute bacterial endocarditis, Listeria, protozoal |
| Hematologic | Acute monocytic leukemia (AML-M5), AML-M4, MDS |
| Inflammatory | SLE, IBD, sarcoidosis |
| Recovery phase | Post-chemotherapy/radiation (monocytes recover before neutrophils) |
| GI disorders | Sprue, ulcerative colitis |
| Drug reactions | Various |
| Category | Examples |
|---|---|
| Allergic | Asthma, hay fever, urticaria, atopic dermatitis, angioedema |
| Parasitic | Tissue-invasive helminths (Ascaris, hookworm, Toxocara, Strongyloides) |
| Neoplastic | CML, eosinophilic leukemia, Hodgkin lymphoma, solid tumor metastases |
| Cutaneous | Eczema, psoriasis, pemphigus |
| Pulmonary | Löffler syndrome, eosinophilic pneumonia |
| Drug reactions | NSAIDs, antibiotics |
| Other | Addison disease, post-irradiation, Lyme disease, rheumatic fever |
| Category | Examples |
|---|---|
| Hematologic (most specific) | CML (very characteristic), polycythemia vera, myeloid metaplasia |
| Inflammatory/allergic | Hypersensitivity reactions, chronic sinusitis |
| Endocrine | Hypothyroidism |
| Other | Chronic hemolytic anemia, splenectomy, ionizing radiation |
| Pattern | First Diagnosis to Suspect |
|---|---|
| Neutrophilia + left shift + toxic changes | Bacterial infection / sepsis |
| Neutrophilia alone (no toxic changes) | Physiologic stress, corticosteroids |
| Neutropenia + no toxic changes | Drug effect, PIH, immune-mediated |
| Lymphocytosis + atypical lymphocytes | EBV infectious mononucleosis |
| Lymphocytosis + mature small lymphocytes | CLL |
| Eosinophilia (mild-moderate) | Allergy, atopic disease |
| Eosinophilia (marked) | Tissue-invasive parasites |
| Basophilia | CML (until proven otherwise) |
| Monocytosis | TB, chronic infection, AML-M5 |
| Lymphopenia | HIV/AIDS, corticosteroids, radiation |
| Pancytopenia | Aplastic anemia, marrow infiltration, megaloblastic anemia |
| Neutrophilia + basophilia + eosinophilia | CML (leukemoid reaction if no BCR-ABL) |
| Disease | Classic DLC Pattern |
|---|---|
| Bacterial sepsis | Neutrophilia, left shift, toxic granulation, Döhle bodies |
| Viral infection (EBV) | Lymphocytosis with atypical (reactive) lymphocytes |
| CML | Neutrophilia, basophilia, eosinophilia; all myeloid stages present; BCR-ABL+ |
| CLL | Lymphocytosis of mature-looking small lymphocytes |
| Pertussis | Lymphocytosis (not neutrophilia, unusually for bacterial cause) |
| Tuberculosis | Lymphocytosis or monocytosis; neutropenia possible |
| Parasitic infection | Eosinophilia (tissue-invasive species especially) |
| Allergic reaction | Eosinophilia ± basophilia |
| HIV/AIDS | Lymphopenia (especially CD4+ T cells), neutropenia |
| Felty syndrome | Neutropenia + RA + splenomegaly |
| B12/folate deficiency | Hypersegmented neutrophils, pancytopenia |
| Addison's disease | Eosinophilia, lymphocytosis, neutropenia |
| Cushing's syndrome | Neutrophilia, lymphopenia, eosinopenia |
Generate a Word document or PDF of this study guide for printing/sharing
ls -la /home/daytona/workspace/ && ls /home/daytona/skills/docx/
mkdir -p /home/daytona/workspace/dlc-study-guide && node -e "require('docx'); console.log('docx ok')"
~/dlc-study-guide/generate.js
const {
Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell,
HeadingLevel, AlignmentType, BorderStyle, WidthType, ShadingType,
VerticalAlign, PageNumber, Header, Footer, TabStopType, TabStopPosition,
PageBreak
} = require('docx');
const fs = require('fs');
// ── Colour palette ──────────────────────────────────────────────────────────
const BLUE_DARK = "1F3864";
const BLUE_MID = "2E74B5";
const BLUE_LIGHT = "D6E4F0";
const BLUE_HEADER = "BDD7EE";
const GREEN_HDR = "C6EFCE";
const RED_HDR = "FFDCE1";
const YELLOW_HDR = "FFEB9C";
const GREY_ROW = "F2F2F2";
const WHITE = "FFFFFF";
// ── Helpers ──────────────────────────────────────────────────────────────────
const noBorder = { style: BorderStyle.NONE, size: 0, color: "FFFFFF" };
const thinBorder = { style: BorderStyle.SINGLE, size: 4, color: "BFBFBF" };
const medBorder = { style: BorderStyle.SINGLE, size: 8, color: BLUE_MID };
function h1(text) {
return new Paragraph({
text, heading: HeadingLevel.HEADING_1,
spacing: { before: 360, after: 120 },
shading: { type: ShadingType.SOLID, color: BLUE_DARK },
run: { color: WHITE, bold: true, size: 28 },
});
}
function h2(text) {
return new Paragraph({
text, heading: HeadingLevel.HEADING_2,
spacing: { before: 280, after: 80 },
border: { bottom: { style: BorderStyle.SINGLE, size: 6, color: BLUE_MID } },
});
}
function h3(text) {
return new Paragraph({
text, heading: HeadingLevel.HEADING_3,
spacing: { before: 200, after: 60 },
});
}
function para(text, opts = {}) {
return new Paragraph({
children: [new TextRun({ text, size: 20, ...opts })],
spacing: { after: 80 },
});
}
function bullet(text, bold_prefix = null) {
const runs = [];
if (bold_prefix) {
runs.push(new TextRun({ text: bold_prefix + ": ", bold: true, size: 20 }));
runs.push(new TextRun({ text, size: 20 }));
} else {
runs.push(new TextRun({ text, size: 20 }));
}
return new Paragraph({
children: runs,
bullet: { level: 0 },
spacing: { after: 40 },
});
}
function note(text) {
return new Paragraph({
children: [
new TextRun({ text: "📌 Note: ", bold: true, size: 20, color: BLUE_MID }),
new TextRun({ text, size: 20, italics: true }),
],
spacing: { before: 80, after: 80 },
indent: { left: 360 },
});
}
function spacer(before = 120, after = 0) {
return new Paragraph({ text: "", spacing: { before, after } });
}
// ── Table builder ─────────────────────────────────────────────────────────────
function makeTable(headers, rows, headerColor = BLUE_HEADER, altColor = GREY_ROW) {
const colCount = headers.length;
const pct = Math.floor(9000 / colCount);
function cell(text, bgColor, bold = false, textColor = "000000") {
return new TableCell({
children: [new Paragraph({
children: [new TextRun({ text: String(text), bold, size: 18, color: textColor })],
spacing: { before: 60, after: 60 },
indent: { left: 80, right: 80 },
})],
shading: { type: ShadingType.SOLID, color: bgColor },
borders: { top: thinBorder, bottom: thinBorder, left: thinBorder, right: thinBorder },
width: { size: pct, type: WidthType.PERCENTAGE },
verticalAlign: VerticalAlign.CENTER,
});
}
const headerRow = new TableRow({
children: headers.map(h => cell(h, headerColor, true, BLUE_DARK)),
tableHeader: true,
});
const dataRows = rows.map((row, i) => new TableRow({
children: row.map(c => cell(c, i % 2 === 0 ? WHITE : altColor)),
}));
return new Table({
rows: [headerRow, ...dataRows],
width: { size: 100, type: WidthType.PERCENTAGE },
margins: { top: 60, bottom: 60, left: 80, right: 80 },
});
}
// ── Document ──────────────────────────────────────────────────────────────────
const children = [];
// Title block
children.push(new Paragraph({
children: [new TextRun({ text: "DLC Study Guide", bold: true, size: 56, color: BLUE_DARK })],
alignment: AlignmentType.CENTER,
spacing: { before: 200, after: 60 },
}));
children.push(new Paragraph({
children: [new TextRun({ text: "Differential Leukocyte Count: Normal vs. Abnormal Patterns", size: 26, color: BLUE_MID, italics: true })],
alignment: AlignmentType.CENTER,
spacing: { after: 40 },
}));
children.push(new Paragraph({
children: [new TextRun({ text: "Sources: Henry's Clinical Diagnosis & Management by Laboratory Methods (23e) | Goldman-Cecil Medicine | Textbook of Family Medicine (9e) | Tietz Textbook of Laboratory Medicine (7e)", size: 16, color: "666666", italics: true })],
alignment: AlignmentType.CENTER,
spacing: { after: 40 },
}));
children.push(new Paragraph({
border: { bottom: { style: BorderStyle.THICK, size: 12, color: BLUE_MID } },
spacing: { after: 240 },
}));
// ─── SECTION 1: Introduction ──────────────────────────────────────────────────
children.push(h1("1. What Is the DLC?"));
children.push(para("The Differential Leukocyte Count (DLC) quantifies the relative (%) and absolute (cells/µL) concentration of each leukocyte type in peripheral blood. It is performed as part of the automated CBC and reviewed by a skilled technologist when abnormal flags appear."));
children.push(note("Always use the absolute count (WBC total × cell %), not just the percentage, to determine a true abnormality. A raised % of one cell type can simply reflect a reduction in another."));
children.push(para("Normal total WBC in adults: 4,000–7,000 cells/µL (broad reference: ~4,500–11,000/µL). Approximately two-thirds are neutrophils and just under one-third are lymphocytes."));
// ─── SECTION 2: Normal Reference Ranges ──────────────────────────────────────
children.push(h1("2. Normal DLC Reference Ranges (Adults)"));
children.push(makeTable(
["Cell Type", "% of WBC", "Absolute Count (×10³/µL)", "Key Notes"],
[
["Neutrophils (segs + bands)", "50–70%", "1.8–7.0", "Bands normally <5%"],
["Lymphocytes", "20–40%", "1.0–4.8", "Dominant cell type in children <4 yrs"],
["Monocytes", "2–10%", "0.2–1.0", "Largest circulating WBC"],
["Eosinophils", "1–4%", "0.04–0.4", "Elevated in allergies/parasites"],
["Basophils", "0–1%", "0.01–0.1", "Rarest; carrier of histamine"],
],
BLUE_HEADER
));
children.push(para("Reference ranges may vary slightly by laboratory, age, and sex.", { color: "666666", italics: true, size: 18 }));
// ─── SECTION 3: NEUTROPHILS ───────────────────────────────────────────────────
children.push(h1("3. Neutrophils"));
children.push(h2("Normal Morphology"));
children.push(bullet("Segmented nucleus with 3–5 lobes, pale pink cytoplasm with fine pink-purple granules"));
children.push(bullet("Bands: horseshoe/U-shaped unsegmented nucleus, normally <5% of differential"));
children.push(h2("Neutrophilia (Neutrophilic Leukocytosis)"));
children.push(para("Definition: Absolute neutrophils >7.0 ×10³/µL in adults."));
children.push(h3("Mechanisms"));
children.push(bullet("Demargination/pseudoneutrophilia", "Epinephrine, exercise, stress"));
children.push(bullet("Increased marrow output", "Cortisol/steroids, severe infection"));
children.push(bullet("Decreased egress from blood", "Corticosteroids block tissue migration"));
children.push(spacer(80));
children.push(h3("Causes of Neutrophilia"));
children.push(makeTable(
["Category", "Examples"],
[
["Infections", "Bacterial (most common), fungal, some viral"],
["Inflammation", "Trauma, surgery, burns, myocardial infarction"],
["Drugs", "Corticosteroids, G-CSF, lithium"],
["Physiologic", "Exercise, stress, pregnancy, neonatal period"],
["Neoplastic", "CML, myeloproliferative disorders"],
["Metabolic", "Uremia, diabetic ketoacidosis, gout"],
["Other", "Asplenia, acute hemorrhage, hemolysis"],
],
BLUE_HEADER
));
children.push(note("Exceptions to neutrophilia in bacterial infection: Tuberculosis, brucellosis, pertussis (lymphocyte-dominant), Listeria (monocyte-dominant)."));
children.push(h3("Left Shift"));
children.push(para("Increased immature neutrophils (bands, metamyelocytes, myelocytes) released from marrow. Reactive left shift rarely includes promyelocytes or blasts. Accompanies severe infections and sepsis."));
children.push(h3("Toxic Changes in Neutrophils"));
children.push(makeTable(
["Change", "Description", "Clinical Setting"],
[
["Toxic granulation", "Dark azurophilic (primary) granules in cytoplasm", "Severe infections, toxic conditions, reactive states"],
["Döhle bodies", "Pale-blue oval cytoplasmic inclusions (ribosome remnants)", "Infections and other toxic conditions"],
["Cytoplasmic vacuoles", "Empty vacuoles in cytoplasm", "Active phagocytosis; infection"],
],
BLUE_HEADER
));
children.push(h2("Neutropenia"));
children.push(para("Definition: Absolute neutrophils <1.8 ×10³/µL (adults)."));
children.push(h3("Severity Grading"));
children.push(bullet("Mild: 1.0–1.8 ×10³/µL"));
children.push(bullet("Moderate: 0.5–1.0 ×10³/µL"));
children.push(bullet("Severe (agranulocytosis): <0.5 ×10³/µL — high risk of life-threatening infection"));
children.push(spacer(80));
children.push(h3("Key Causes of Neutropenia"));
children.push(makeTable(
["Category", "Examples"],
[
["Drugs (most common)", "Chemotherapy, chloramphenicol, sulfonamides, phenothiazines, antithyroids, anticonvulsants"],
["Radiation", "Dose-dependent marrow damage"],
["Toxins", "Alcohol, benzene compounds"],
["Immune-mediated", "SLE, RA/Felty syndrome, AIDS"],
["Congenital", "Kostmann syndrome, cyclic neutropenia (ELA2 mutations, ~21-day cycle), Chédiak-Higashi"],
["Hematologic", "Megaloblastic anemia, myelodysplasia, aplastic anemia, marrow infiltration"],
["Infectious", "Overwhelming bacterial infection; viral-mediated suppression (measles, rubella)"],
["Other", "Starvation, hypersplenism"],
],
RED_HDR
));
children.push(note("Toxic granulation, left shift, and Döhle bodies are seen with infection-related neutropenia but NOT in neutropenia of pregnancy-induced hypertension (PIH) — a useful distinguishing point."));
children.push(h2("Morphological Anomalies of Neutrophils"));
children.push(makeTable(
["Anomaly", "Description", "Significance"],
[
["Pelger-Huët", "Bilobed / 'pince-nez' nucleus", "Inherited (benign) or acquired in MDS"],
["Hypersegmentation", "≥5 lobes; ≥5% of neutrophils have ≥5 lobes", "Megaloblastic anemia (B12/folate deficiency)"],
["Alder-Reilly", "Prominent azurophilic granulation (not infection-related)", "Mucopolysaccharidoses"],
["May-Hegglin", "Döhle-like inclusions + giant platelets", "Rare autosomal-dominant anomaly"],
["Chédiak-Higashi", "Giant fused granules (abnormal lysosomes) in all leukocytes", "Autosomal-recessive; recurrent pyogenic infections, partial oculocutaneous albinism"],
],
YELLOW_HDR
));
// ─── SECTION 4: LYMPHOCYTES ───────────────────────────────────────────────────
children.push(h1("4. Lymphocytes"));
children.push(h2("Lymphocytosis"));
children.push(para("Definition: Absolute lymphocytes >4.8 ×10³/µL (adults). Physiologically normal in children."));
children.push(makeTable(
["Category", "Examples"],
[
["Acute viral infections (most common)", "EBV (mononucleosis), CMV, hepatitis, rubella, pertussis"],
["Chronic infections", "Tuberculosis, brucellosis, toxoplasmosis"],
["Autoimmune", "Early RA and other autoimmune disorders"],
["Neoplastic", "CLL, ALL, lymphomas"],
],
BLUE_HEADER
));
children.push(note("Reactive (atypical) lymphocytes: Larger cells with abundant blue-gray cytoplasm and eccentric kidney-shaped nucleus. Classically seen in EBV mononucleosis — represent T-cell activation."));
children.push(h2("Lymphopenia (Lymphocytopenia)"));
children.push(para("Definition: Absolute lymphocytes <1.0 ×10³/µL."));
children.push(makeTable(
["Category", "Examples"],
[
["Immunodeficiency", "HIV/AIDS, DiGeorge syndrome, SCID"],
["Adrenocortical excess", "Cushing's syndrome, high-dose corticosteroids"],
["Cytotoxic therapy", "Chemotherapy, radiation (lymphocytes are most radiosensitive WBCs)"],
["Advanced malignancy", "Lymphomas, advanced carcinomas"],
["Other", "Impaired intestinal lymphatic drainage, anorexia nervosa"],
],
RED_HDR
));
// ─── SECTION 5: MONOCYTES ─────────────────────────────────────────────────────
children.push(h1("5. Monocytes"));
children.push(h2("Monocytosis"));
children.push(para("Definition: Absolute monocytes >1.0 ×10³/µL."));
children.push(makeTable(
["Category", "Examples"],
[
["Infections", "TB, brucellosis, subacute bacterial endocarditis, Listeria, protozoal infections"],
["Hematologic malignancy", "AML-M5 (acute monocytic leukemia), AML-M4, MDS"],
["Inflammatory / autoimmune", "SLE, IBD, sarcoidosis"],
["Recovery phase", "Post-chemotherapy or radiation (monocytes recover before neutrophils)"],
["GI disorders", "Sprue, ulcerative colitis"],
["Drug reactions", "Various drugs"],
],
BLUE_HEADER
));
children.push(note("Listeria monocytogenes infection produces a predominantly monocytic WBC response (especially in neonates)."));
children.push(h2("Monocytopenia"));
children.push(para("Causes: Onset of steroid therapy; hairy cell leukemia (characteristic finding). Isolated monocytopenia is not usually considered pathologic."));
// ─── SECTION 6: EOSINOPHILS ──────────────────────────────────────────────────
children.push(h1("6. Eosinophils"));
children.push(h2("Eosinophilia"));
children.push(para("Definition: Absolute eosinophils >0.4 ×10³/µL (>4% on differential)."));
children.push(h3("Severity Grading"));
children.push(bullet("Mild: 0.4–1.5 ×10³/µL"));
children.push(bullet("Moderate: 1.5–5.0 ×10³/µL"));
children.push(bullet("Severe / Hypereosinophilia: >5.0 ×10³/µL — risk of end-organ damage"));
children.push(spacer(80));
children.push(makeTable(
["Category", "Examples"],
[
["Allergic (most common in developed countries)", "Asthma, hay fever, urticaria, atopic dermatitis, angioedema"],
["Parasitic (most common globally)", "Tissue-invasive helminths (Ascaris, hookworm, Toxocara, Strongyloides)"],
["Neoplastic", "CML, eosinophilic leukemia, Hodgkin lymphoma, solid tumor metastases"],
["Cutaneous", "Eczema, psoriasis, pemphigus"],
["Pulmonary", "Löffler syndrome, eosinophilic pneumonia"],
["Drug reactions", "NSAIDs, antibiotics"],
["Other", "Addison disease, Lyme disease, rheumatic fever, post-irradiation"],
],
BLUE_HEADER
));
children.push(note("In synovial fluid: eosinophilia >2% reported in Lyme disease, RA, rheumatic fever, metastatic carcinoma, and allergic reactions to contrast dye."));
children.push(h2("Eosinopenia"));
children.push(para("Causes: Acute physical stress, acute inflammatory states, Cushing's syndrome, corticosteroid therapy. Often difficult to detect given the normally very low baseline count."));
// ─── SECTION 7: BASOPHILS ────────────────────────────────────────────────────
children.push(h1("7. Basophils"));
children.push(h2("Basophilia"));
children.push(para("Definition: Absolute basophils >0.1 ×10³/µL."));
children.push(makeTable(
["Category", "Examples"],
[
["Hematologic (most specific)", "CML (very characteristic), polycythemia vera, myeloid metaplasia"],
["Inflammatory / allergic", "Hypersensitivity reactions, chronic sinusitis"],
["Endocrine", "Hypothyroidism"],
["Other", "Chronic hemolytic anemia, splenectomy, ionizing radiation"],
],
BLUE_HEADER
));
children.push(note("Persistent basophilia combined with neutrophilia and eosinophilia strongly suggests CML — check for BCR-ABL fusion gene / Philadelphia chromosome."));
children.push(h2("Basopenia"));
children.push(para("Causes: Sustained glucocorticoid treatment, acute infection or stress, hyperthyroidism. Difficult to detect given normally very low baseline count."));
// ─── SECTION 8: Quick Pattern Recognition ─────────────────────────────────────
children.push(h1("8. Quick Pattern Recognition"));
children.push(makeTable(
["DLC Pattern", "First Diagnosis to Suspect"],
[
["Neutrophilia + left shift + toxic changes", "Bacterial infection / sepsis"],
["Neutrophilia alone (no toxic changes)", "Physiologic stress, corticosteroids"],
["Neutropenia + no toxic changes", "Drug effect, pregnancy-induced hypertension, immune-mediated"],
["Lymphocytosis + atypical lymphocytes", "EBV infectious mononucleosis"],
["Lymphocytosis + mature small lymphocytes", "CLL (chronic lymphocytic leukemia)"],
["Eosinophilia mild-moderate", "Allergy, atopic disease"],
["Eosinophilia marked", "Tissue-invasive parasites"],
["Basophilia", "CML (until proven otherwise)"],
["Monocytosis", "TB, chronic infection, AML-M5"],
["Lymphopenia", "HIV/AIDS, corticosteroids, radiation"],
["Pancytopenia", "Aplastic anemia, marrow infiltration, megaloblastic anemia"],
["Neutrophilia + basophilia + eosinophilia", "CML (leukemoid reaction if BCR-ABL negative)"],
],
GREEN_HDR
));
// ─── SECTION 9: DLC in Specific Diseases ─────────────────────────────────────
children.push(h1("9. DLC Patterns in Specific Diseases"));
children.push(makeTable(
["Disease", "Classic DLC Pattern"],
[
["Bacterial sepsis", "Neutrophilia, left shift, toxic granulation, Döhle bodies, vacuoles"],
["Viral infection (EBV/mono)", "Lymphocytosis with atypical (reactive) lymphocytes"],
["CML", "Neutrophilia + basophilia + eosinophilia; all myeloid stages; BCR-ABL positive"],
["CLL", "Lymphocytosis of mature-looking small lymphocytes; smear cells on film"],
["Pertussis (whooping cough)", "Lymphocytosis (unusually, for a bacterial infection)"],
["Tuberculosis", "Lymphocytosis or monocytosis; neutropenia possible"],
["Parasitic infection", "Eosinophilia (especially tissue-invasive helminths)"],
["Allergic reaction", "Eosinophilia ± basophilia"],
["HIV/AIDS", "Lymphopenia (CD4+ T-cell depletion), neutropenia"],
["Felty syndrome", "Neutropenia + RA + splenomegaly"],
["B12/folate deficiency", "Hypersegmented neutrophils, pancytopenia; macrocytic anemia"],
["Addison's disease", "Eosinophilia, lymphocytosis, neutropenia"],
["Cushing's syndrome", "Neutrophilia, lymphopenia, eosinopenia"],
["Listeria infection (neonates)", "Monocytosis (predominant response)"],
],
YELLOW_HDR
));
// ─── SECTION 10: Key Formulas ─────────────────────────────────────────────────
children.push(h1("10. Key Formulas"));
children.push(makeTable(
["Formula", "Expression"],
[
["Absolute cell count", "Total WBC × (% of cell type / 100)"],
["Corrected WBC (for nRBCs)", "WBC × 100 ÷ (100 + number of nRBCs per 100 WBCs)"],
],
BLUE_HEADER
));
// ─── Footer ───────────────────────────────────────────────────────────────────
children.push(spacer(200));
children.push(new Paragraph({
border: { top: { style: BorderStyle.SINGLE, size: 6, color: BLUE_MID } },
spacing: { before: 120 },
}));
children.push(new Paragraph({
children: [new TextRun({ text: "Sources: Henry's Clinical Diagnosis and Management by Laboratory Methods (23e) | Goldman-Cecil Medicine | Textbook of Family Medicine (9e) | Tietz Textbook of Laboratory Medicine (7e) | Quick Compendium of Clinical Pathology (5e)", size: 16, color: "666666", italics: true })],
alignment: AlignmentType.CENTER,
spacing: { after: 40 },
}));
children.push(new Paragraph({
children: [new TextRun({ text: "Generated by Orris Medical AI — For educational use only. Always verify clinical decisions against current guidelines.", size: 16, color: "888888", italics: true })],
alignment: AlignmentType.CENTER,
}));
// ─── Build Document ───────────────────────────────────────────────────────────
const doc = new Document({
creator: "Orris Medical AI",
title: "DLC Study Guide",
description: "Differential Leukocyte Count: Normal vs. Abnormal Patterns",
styles: {
default: {
document: {
run: { font: "Calibri", size: 20, color: "222222" },
paragraph: { spacing: { after: 80 } },
},
},
paragraphStyles: [
{
id: "Heading1",
name: "Heading 1",
basedOn: "Normal",
next: "Normal",
run: { bold: true, size: 28, color: WHITE, font: "Calibri" },
paragraph: {
spacing: { before: 360, after: 120 },
shading: { type: ShadingType.SOLID, color: BLUE_DARK },
indent: { left: 160, right: 160 },
},
},
{
id: "Heading2",
name: "Heading 2",
basedOn: "Normal",
next: "Normal",
run: { bold: true, size: 24, color: BLUE_DARK, font: "Calibri" },
paragraph: {
spacing: { before: 240, after: 80 },
border: { bottom: { style: BorderStyle.SINGLE, size: 6, color: BLUE_MID } },
},
},
{
id: "Heading3",
name: "Heading 3",
basedOn: "Normal",
next: "Normal",
run: { bold: true, size: 22, color: BLUE_MID, font: "Calibri" },
paragraph: { spacing: { before: 160, after: 60 } },
},
],
},
sections: [{
properties: {
page: {
margin: { top: 720, bottom: 720, left: 900, right: 900 },
},
},
headers: {
default: new Header({
children: [new Paragraph({
children: [
new TextRun({ text: "DLC Study Guide | Differential Leukocyte Count: Normal vs. Abnormal Patterns", size: 16, color: "888888" }),
],
alignment: AlignmentType.CENTER,
border: { bottom: { style: BorderStyle.SINGLE, size: 4, color: "CCCCCC" } },
})],
}),
},
footers: {
default: new Footer({
children: [new Paragraph({
children: [
new TextRun({ text: "For educational use only | Page ", size: 16, color: "888888" }),
new TextRun({ children: [PageNumber.CURRENT], size: 16, color: "888888" }),
new TextRun({ text: " of ", size: 16, color: "888888" }),
new TextRun({ children: [PageNumber.TOTAL_PAGES], size: 16, color: "888888" }),
],
alignment: AlignmentType.CENTER,
})],
}),
},
children,
}],
});
Packer.toBuffer(doc).then(buffer => {
fs.writeFileSync("/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.docx", buffer);
console.log("Done: DLC_Study_Guide.docx");
});
cd /home/daytona/workspace/dlc-study-guide && node generate.js 2>&1
python3 /home/daytona/skills/docx/scripts/office/validate.py /home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.docx 2>&1
# Validate manually by checking the docx is a valid zip and has required XML files python3 -c " import zipfile, sys path = '/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.docx' try: z = zipfile.ZipFile(path) names = z.namelist() required = ['word/document.xml', 'word/_rels/document.xml.rels', '[Content_Types].xml'] for r in required: print('OK' if r in names else 'MISSING: ' + r, r) print('File size:', __import__('os').path.getsize(path), 'bytes') print('All entries:', len(names)) except Exception as e: print('ERROR:', e) "
python3 /home/daytona/skills/docx/scripts/office/soffice.py --headless --convert-to pdf /home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.docx --outdir /home/daytona/workspace/dlc-study-guide/ 2>&1
cp /home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.docx /tmp/DLC_Study_Guide.docx && python3 /home/daytona/skills/docx/scripts/office/soffice.py --headless --convert-to pdf /tmp/DLC_Study_Guide.docx --outdir /tmp/ 2>&1 && cp /tmp/DLC_Study_Guide.pdf /home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.pdf && echo "PDF ready"
ls -lh /home/daytona/workspace/dlc-study-guide/
DLC Study Guide
Word Document · DOCX
DLC Study Guide
PDF Document · PDF
Also convert it itni ppt
~/dlc-study-guide/generate_pptx.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.author = "Orris Medical AI";
pres.title = "DLC Study Guide";
// ── Palette ──────────────────────────────────────────────────────────────────
const C = {
navy: "1F3864",
blue: "2E74B5",
blueLight: "D6E4F0",
blueHdr: "BDD7EE",
teal: "1A7A7A",
tealLight: "C8E6E6",
green: "1E7D34",
greenLight: "C6EFCE",
red: "C0392B",
redLight: "FFDCE1",
amber: "B8860B",
amberLight: "FFEB9C",
white: "FFFFFF",
offwhite: "F8FAFC",
grey: "7F7F7F",
darkgrey: "333333",
};
// ── Slide helpers ─────────────────────────────────────────────────────────────
function addBg(slide, color) {
slide.background = { color };
}
function addRect(slide, x, y, w, h, color, options = {}) {
slide.addShape(pres.ShapeType.rect, { x, y, w, h, fill: { color }, line: { color: "none" }, ...options });
}
function title_text(slide, text, y = 0.25, color = C.white, size = 30) {
slide.addText(text, {
x: 0.45, y, w: 9.1, h: 0.65,
fontSize: size, bold: true, color,
fontFace: "Calibri", valign: "middle", margin: 0,
});
}
function subtitle_text(slide, text, y = 0.95, color = C.blueHdr, size = 16) {
slide.addText(text, {
x: 0.45, y, w: 9.1, h: 0.35,
fontSize: size, color, fontFace: "Calibri",
valign: "top", margin: 0, italic: true,
});
}
function body_box(slide, items, x, y, w, h, opts = {}) {
slide.addText(items, {
x, y, w, h,
fontSize: 13, fontFace: "Calibri", color: C.darkgrey,
valign: "top", margin: [6, 8, 6, 8],
...opts,
});
}
function section_header(slide, label, color = C.navy) {
addRect(slide, 0, 0, 10, 0.85, color);
addRect(slide, 0, 0.85, 10, 0.06, C.blue);
title_text(slide, label, 0.1, C.white, 26);
}
// Add a colored pill/badge label
function badge(slide, text, x, y, bgColor, textColor = C.white) {
slide.addShape(pres.ShapeType.roundRect, {
x, y, w: 1.5, h: 0.3,
fill: { color: bgColor },
line: { color: "none" },
rectRadius: 0.05,
});
slide.addText(text, {
x, y, w: 1.5, h: 0.3,
fontSize: 10, bold: true, color: textColor,
fontFace: "Calibri", align: "center", valign: "middle", margin: 0,
});
}
// Table builder
function addTable(slide, headers, rows, x, y, w, h, headerColor = C.navy) {
const colW = w / headers.length;
const rowH = Math.min(0.32, (h - 0.36) / rows.length);
// Header row
headers.forEach((hdr, i) => {
addRect(slide, x + i * colW, y, colW, 0.34, headerColor);
slide.addText(hdr, {
x: x + i * colW + 0.05, y: y + 0.04, w: colW - 0.1, h: 0.26,
fontSize: 11, bold: true, color: C.white, fontFace: "Calibri",
valign: "middle", margin: 0,
});
});
// Data rows
rows.forEach((row, ri) => {
const rowBg = ri % 2 === 0 ? C.white : C.blueLight;
row.forEach((cell, ci) => {
addRect(slide, x + ci * colW, y + 0.34 + ri * rowH, colW, rowH, rowBg);
slide.addText(cell, {
x: x + ci * colW + 0.06, y: y + 0.34 + ri * rowH,
w: colW - 0.12, h: rowH,
fontSize: 10, color: C.darkgrey, fontFace: "Calibri",
valign: "middle", margin: 0,
});
});
});
}
// Callout note box
function noteBox(slide, text, x, y, w, color = C.blue) {
addRect(slide, x, y, 0.06, 0.38, color);
addRect(slide, x + 0.06, y, w - 0.06, 0.38, C.blueLight);
slide.addText(text, {
x: x + 0.12, y, w: w - 0.18, h: 0.38,
fontSize: 11, color: C.navy, fontFace: "Calibri",
valign: "middle", italic: true, margin: 0,
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — Title
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.navy);
addRect(s, 0, 3.9, 10, 1.7, C.blue);
addRect(s, 0, 3.85, 10, 0.08, C.teal);
s.addText("DLC Study Guide", {
x: 0.5, y: 0.7, w: 9, h: 1.4,
fontSize: 52, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle",
});
s.addText("Differential Leukocyte Count", {
x: 0.5, y: 2.1, w: 9, h: 0.55,
fontSize: 26, color: C.blueLight, fontFace: "Calibri",
align: "center", valign: "middle",
});
s.addText("Normal vs. Abnormal Patterns", {
x: 0.5, y: 2.65, w: 9, h: 0.45,
fontSize: 22, color: C.tealLight, fontFace: "Calibri",
align: "center", valign: "middle", italic: true,
});
s.addText("Sources: Henry's Clinical Diagnosis & Management (23e) | Goldman-Cecil Medicine | Textbook of Family Medicine (9e) | Tietz Textbook of Laboratory Medicine (7e)", {
x: 0.4, y: 4.05, w: 9.2, h: 0.5,
fontSize: 10, color: C.blueHdr, fontFace: "Calibri",
align: "center", valign: "middle", italic: true,
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 2 — What Is the DLC?
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "What Is the DLC?");
s.addText([
{ text: "The DLC quantifies the ", options: {} },
{ text: "relative (%) and absolute (cells/µL)", options: { bold: true, color: C.blue } },
{ text: " concentration of each leukocyte type in peripheral blood.", options: {} },
], { x: 0.45, y: 1.0, w: 9.1, h: 0.5, fontSize: 15, fontFace: "Calibri", color: C.darkgrey, valign: "top", margin: 0 });
noteBox(s, "Always use the ABSOLUTE count (WBC × cell %), not just percentage, to judge a true abnormality.", 0.45, 1.6, 9.1);
s.addText("Normal Total WBC (Adults):", {
x: 0.45, y: 2.12, w: 3.5, h: 0.35,
fontSize: 13, bold: true, color: C.navy, fontFace: "Calibri", valign: "middle", margin: 0,
});
s.addText("4,000 – 7,000 cells/µL", {
x: 3.85, y: 2.12, w: 3, h: 0.35,
fontSize: 13, color: C.darkgrey, fontFace: "Calibri", valign: "middle", margin: 0,
});
s.addText("(broader reference: ~4,500 – 11,000 / µL)", {
x: 6.7, y: 2.12, w: 3, h: 0.35,
fontSize: 11, italic: true, color: C.grey, fontFace: "Calibri", valign: "middle", margin: 0,
});
addTable(s,
["Cell Type", "% of WBC", "Absolute Count (×10³/µL)", "Key Notes"],
[
["Neutrophils (segs + bands)", "50–70%", "1.8–7.0", "Bands <5%; dominant in adults"],
["Lymphocytes", "20–40%", "1.0–4.8", "Dominant in children <4 yrs"],
["Monocytes", "2–10%", "0.2–1.0", "Largest circulating WBC"],
["Eosinophils", "1–4%", "0.04–0.4","Elevated in allergies / parasites"],
["Basophils", "0–1%", "0.01–0.1","Rarest; carrier of histamine"],
],
0.45, 2.55, 9.1, 2.75, C.navy
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 3 — Neutrophils: Normal & Neutrophilia
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Neutrophils — Neutrophilia");
badge(s, "NEUTROPHIL", 8.1, 0.25, C.blue);
// Normal morphology box
addRect(s, 0.45, 1.0, 4.3, 0.28, C.navy);
s.addText("Normal Morphology", { x: 0.5, y: 1.0, w: 4.2, h: 0.28, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
s.addText([
{ text: "• ", options: {} }, { text: "3–5 lobed", options: { bold: true } }, { text: " segmented nucleus; fine pink-purple granules\n", options: {} },
{ text: "• Bands: ", options: { bold: true } }, { text: "horseshoe nucleus, normally <5%", options: {} },
], { x: 0.5, y: 1.3, w: 4.2, h: 0.55, fontSize: 12, fontFace: "Calibri", color: C.darkgrey, valign: "top", margin: 0 });
// Definition
addRect(s, 5.0, 1.0, 4.55, 0.28, C.blue);
s.addText("Neutrophilia >7.0 ×10³/µL", { x: 5.05, y: 1.0, w: 4.45, h: 0.28, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
s.addText([
{ text: "Mechanisms:\n", options: { bold: true, color: C.navy } },
{ text: "• Demargination", options: { bold: true } }, { text: " (exercise, epinephrine, stress)\n", options: {} },
{ text: "• Increased marrow output", options: { bold: true } }, { text: " (infection, steroids)\n", options: {} },
{ text: "• Decreased egress", options: { bold: true } }, { text: " (corticosteroids block tissue migration)", options: {} },
], { x: 5.05, y: 1.3, w: 4.45, h: 0.72, fontSize: 11.5, fontFace: "Calibri", color: C.darkgrey, valign: "top", margin: 0 });
addTable(s,
["Category", "Key Examples"],
[
["Infections", "Bacterial (most common), fungal, some viral"],
["Inflammation","Trauma, surgery, burns, myocardial infarction"],
["Drugs", "Corticosteroids, G-CSF, lithium"],
["Physiologic", "Exercise, stress, pregnancy, neonatal period"],
["Neoplastic", "CML, myeloproliferative disorders"],
["Metabolic", "Uremia, DKA, gout"],
],
0.45, 2.0, 9.1, 2.4, C.blue
);
noteBox(s, "Exceptions — NOT neutrophilic: TB, brucellosis, pertussis (lymphocytes dominant); Listeria (monocytes dominant).", 0.45, 4.52, 9.1, C.teal);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 4 — Left Shift + Toxic Changes
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Neutrophils — Left Shift & Toxic Changes");
// Left shift
addRect(s, 0.45, 1.0, 4.6, 0.3, C.teal);
s.addText("Left Shift", { x: 0.5, y: 1.0, w: 4.5, h: 0.3, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
s.addText([
{ text: "Release of immature neutrophils from marrow:\n", options: { bold: true } },
{ text: "Bands → Metamyelocytes → Myelocytes\n(Promyelocytes/blasts suggest leukemia, not reactive)", options: {} },
], { x: 0.5, y: 1.35, w: 4.5, h: 0.75, fontSize: 12, fontFace: "Calibri", color: C.darkgrey, valign: "top", margin: 0 });
// Toxic changes table
addRect(s, 5.2, 1.0, 4.35, 0.3, C.red);
s.addText("Toxic Changes in Neutrophils", { x: 5.25, y: 1.0, w: 4.25, h: 0.3, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
addTable(s,
["Change", "Description"],
[
["Toxic granulation", "Dark azurophilic (primary) granules — severe infection/toxic states"],
["Döhle bodies", "Pale-blue oval cytoplasmic inclusions (ribosome remnants) — infection"],
["Cytoplasmic vacuoles","Empty vacuoles — active phagocytosis"],
],
5.2, 1.35, 4.35, 1.5, C.red
);
// Morphological anomalies table
addRect(s, 0.45, 2.2, 9.1, 0.3, C.amber);
s.addText("Morphological Anomalies of Neutrophils", { x: 0.5, y: 2.2, w: 9, h: 0.3, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
addTable(s,
["Anomaly", "Description", "Significance"],
[
["Pelger-Huët", "Bilobed / pince-nez nucleus", "Inherited (benign) or acquired in MDS"],
["Hypersegmentation","≥5 nuclear lobes in ≥5% of neutrophils", "Megaloblastic anemia (B12/folate deficiency)"],
["Alder-Reilly", "Prominent azurophilic granulation", "Mucopolysaccharidoses; NOT infection"],
["May-Hegglin", "Döhle-like inclusions + giant platelets", "Rare autosomal-dominant anomaly"],
["Chédiak-Higashi", "Giant fused lysosomes in all leukocytes", "AR disorder; recurrent pyogenic infections, partial albinism"],
],
0.45, 2.55, 9.1, 2.7, C.amber
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 5 — Neutropenia
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Neutropenia");
badge(s, "NEUTROPENIA", 7.8, 0.25, C.red);
// Severity grading
addRect(s, 0.45, 1.0, 2.8, 0.28, C.red);
s.addText("Severity Grading", { x: 0.5, y: 1.0, w: 2.7, h: 0.28, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
const grades = [
{ label: "Mild", range: "1.0–1.8 ×10³/µL", color: C.amberLight, txt: C.amber },
{ label: "Moderate", range: "0.5–1.0 ×10³/µL", color: C.redLight, txt: C.red },
{ label: "Severe / Agranulocytosis", range: "<0.5 ×10³/µL ⚠ High infection risk", color: C.red, txt: C.white },
];
grades.forEach((g, i) => {
addRect(s, 0.45, 1.32 + i * 0.34, 2.8, 0.3, g.color);
s.addText(`${g.label}: ${g.range}`, {
x: 0.55, y: 1.32 + i * 0.34, w: 2.65, h: 0.3,
fontSize: 10.5, color: g.txt, fontFace: "Calibri",
bold: g.label === "Severe / Agranulocytosis", valign: "middle", margin: 0,
});
});
addTable(s,
["Category", "Examples"],
[
["Drugs (most common)", "Chemo, chloramphenicol, sulfonamides, phenothiazines, antithyroids, anticonvulsants"],
["Radiation", "Dose-dependent marrow damage; lymphocytes most sensitive"],
["Toxins", "Alcohol, benzene compounds"],
["Immune-mediated", "SLE, RA / Felty syndrome, AIDS"],
["Congenital", "Kostmann, cyclic neutropenia (ELA2 mutations, ~21-day cycle), Chédiak-Higashi"],
["Hematologic", "Megaloblastic anemia, MDS, aplastic anemia, marrow infiltration"],
["Infectious", "Overwhelming bacterial infection; measles, rubella (viral suppression)"],
["Other", "Starvation, hypersplenism"],
],
3.35, 1.0, 6.2, 3.3, C.red
);
noteBox(s, "Toxic granulation, left shift, and Döhle bodies are seen with infection-related neutropenia — but NOT in PIH (pregnancy-induced hypertension) neutropenia. Useful distinguishing point.", 0.45, 4.52, 9.1, C.red);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 6 — Lymphocytes
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Lymphocytes");
badge(s, "LYMPHOCYTES", 7.8, 0.25, C.teal);
// Lymphocytosis
addRect(s, 0.45, 1.0, 4.55, 0.3, C.teal);
s.addText("Lymphocytosis >4.8 ×10³/µL", { x: 0.5, y: 1.0, w: 4.45, h: 0.3, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
addTable(s,
["Category", "Examples"],
[
["Acute viral (most common)", "EBV (mono), CMV, hepatitis, rubella, pertussis"],
["Chronic infections", "TB, brucellosis, toxoplasmosis"],
["Autoimmune", "Early RA, other autoimmune disorders"],
["Neoplastic", "CLL, ALL, lymphomas"],
],
0.45, 1.34, 4.55, 2.0, C.teal
);
noteBox(s, "Reactive (atypical) lymphocytes: Large, blue-gray cytoplasm, eccentric kidney-shaped nucleus — classically seen in EBV mononucleosis (T-cell activation).", 0.45, 3.45, 4.55, C.teal);
// Lymphopenia
addRect(s, 5.1, 1.0, 4.45, 0.3, C.red);
s.addText("Lymphopenia <1.0 ×10³/µL", { x: 5.15, y: 1.0, w: 4.35, h: 0.3, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
addTable(s,
["Category", "Examples"],
[
["Immunodeficiency", "HIV/AIDS, DiGeorge syndrome, SCID"],
["Adrenocortical excess","Cushing's syndrome, high-dose corticosteroids"],
["Cytotoxic therapy", "Chemo, radiation (lymphocytes most radiosensitive)"],
["Advanced malignancy", "Lymphomas, advanced carcinomas"],
["Other", "Impaired intestinal lymphatics, anorexia nervosa"],
],
5.1, 1.34, 4.45, 2.0, C.red
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 7 — Monocytes & Eosinophils
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Monocytes & Eosinophils");
// Monocytes left
addRect(s, 0.45, 1.0, 4.55, 0.3, C.navy);
s.addText("Monocytosis >1.0 ×10³/µL", { x: 0.5, y: 1.0, w: 4.45, h: 0.3, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
addTable(s,
["Category", "Examples"],
[
["Infections", "TB, brucellosis, SBE, Listeria, protozoal"],
["Hematologic", "AML-M5, AML-M4, MDS"],
["Inflammatory", "SLE, IBD, sarcoidosis"],
["Recovery phase", "Post-chemo/radiation (monocytes recover before neutrophils)"],
["Other", "Sprue, ulcerative colitis, drug reactions"],
],
0.45, 1.34, 4.55, 1.9, C.navy
);
addRect(s, 0.45, 3.3, 4.55, 0.28, C.grey);
s.addText("Monocytopenia", { x: 0.5, y: 3.3, w: 4.45, h: 0.28, fontSize: 11, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
s.addText("Steroid therapy (onset); hairy cell leukemia (characteristic). Isolated monocytopenia not usually pathologic.", {
x: 0.5, y: 3.62, w: 4.45, h: 0.4, fontSize: 11, fontFace: "Calibri", color: C.darkgrey, valign: "top", margin: 0,
});
noteBox(s, "Listeria infection → monocytic response (especially in neonates).", 0.45, 4.1, 4.55, C.navy);
// Eosinophils right
addRect(s, 5.1, 1.0, 4.45, 0.3, C.green);
s.addText("Eosinophilia >0.4 ×10³/µL", { x: 5.15, y: 1.0, w: 4.35, h: 0.3, fontSize: 12, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
// Severity
const eGrades = [
["Mild", "0.4–1.5 ×10³/µL", C.greenLight, C.green],
["Moderate","1.5–5.0 ×10³/µL", C.green, C.white],
["Severe"," >5.0 ×10³/µL", C.navy, C.white],
];
eGrades.forEach(([label, range, bg, tc], i) => {
addRect(s, 5.1, 1.34 + i * 0.28, 4.45, 0.26, bg);
s.addText(`${label}: ${range}`, { x: 5.18, y: 1.34 + i * 0.28, w: 4.3, h: 0.26, fontSize: 10, color: tc, fontFace: "Calibri", bold: true, valign: "middle", margin: 0 });
});
addTable(s,
["Category", "Examples"],
[
["Allergic", "Asthma, hay fever, urticaria, atopic dermatitis"],
["Parasitic", "Tissue-invasive helminths (Ascaris, hookworm, Toxocara)"],
["Neoplastic", "CML, eosinophilic leukemia, Hodgkin lymphoma"],
["Other", "Addison disease, Löffler syndrome, drug reactions"],
],
5.1, 2.2, 4.45, 1.8, C.green
);
addRect(s, 5.1, 4.08, 4.45, 0.28, C.grey);
s.addText("Eosinopenia: Acute stress, Cushing's, corticosteroids", { x: 5.15, y: 4.08, w: 4.35, h: 0.28, fontSize: 10, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 8 — Basophils
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Basophils");
badge(s, "BASOPHILS", 8.2, 0.25, C.amber);
addRect(s, 0.45, 1.0, 9.1, 0.3, C.amber);
s.addText("Basophilia >0.1 ×10³/µL", { x: 0.5, y: 1.0, w: 9.0, h: 0.3, fontSize: 14, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
addTable(s,
["Category", "Examples"],
[
["Hematologic (most specific)", "CML (very characteristic), polycythemia vera, myeloid metaplasia"],
["Inflammatory / allergic", "Hypersensitivity reactions, chronic sinusitis"],
["Endocrine", "Hypothyroidism"],
["Other", "Chronic hemolytic anemia, splenectomy, ionizing radiation"],
],
0.45, 1.34, 9.1, 1.8, C.amber
);
noteBox(s, "Persistent basophilia + neutrophilia + eosinophilia = strongly suspect CML. Check for BCR-ABL fusion gene / Philadelphia chromosome.", 0.45, 3.2, 9.1, C.amber);
addRect(s, 0.45, 3.7, 9.1, 0.3, C.grey);
s.addText("Basopenia: Sustained glucocorticoids | Acute infection or stress | Hyperthyroidism", {
x: 0.5, y: 3.7, w: 9.0, h: 0.3, fontSize: 12, bold: true, color: C.white,
fontFace: "Calibri", valign: "middle", margin: 0,
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 9 — Quick Pattern Recognition
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Quick Pattern Recognition");
addTable(s,
["DLC Pattern", "First Diagnosis to Suspect"],
[
["Neutrophilia + left shift + toxic changes", "Bacterial infection / sepsis"],
["Neutrophilia alone (no toxic changes)", "Physiologic stress, corticosteroids"],
["Neutropenia + no toxic changes", "Drug effect, PIH, immune-mediated"],
["Lymphocytosis + atypical lymphocytes", "EBV infectious mononucleosis"],
["Lymphocytosis + mature small lymphocytes", "CLL (chronic lymphocytic leukemia)"],
["Eosinophilia mild-moderate", "Allergy / atopic disease"],
["Eosinophilia marked (>5.0 ×10³/µL)", "Tissue-invasive parasites"],
["Basophilia", "CML (until proven otherwise)"],
["Monocytosis", "TB, chronic infection, AML-M5"],
["Lymphopenia", "HIV/AIDS, corticosteroids, radiation"],
["Pancytopenia", "Aplastic anemia, marrow infiltration, megaloblastic anemia"],
["Neutrophilia + basophilia + eosinophilia", "CML (or leukemoid reaction if BCR-ABL negative)"],
],
0.45, 1.0, 9.1, 4.5, C.green
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 10 — DLC in Specific Diseases
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "DLC Patterns in Specific Diseases");
addTable(s,
["Disease", "Classic DLC Pattern"],
[
["Bacterial sepsis", "Neutrophilia + left shift + toxic granulation + Döhle bodies + vacuoles"],
["Viral infection (EBV/mono)","Lymphocytosis with atypical (reactive) lymphocytes"],
["CML", "Neutrophilia + basophilia + eosinophilia; all myeloid stages; BCR-ABL+"],
["CLL", "Lymphocytosis of mature small lymphocytes; smear (smudge) cells"],
["Pertussis", "Lymphocytosis (unusual for a bacterial cause)"],
["Tuberculosis", "Lymphocytosis or monocytosis; possible neutropenia"],
["Parasitic infection", "Eosinophilia (tissue-invasive helminths especially)"],
["HIV/AIDS", "Lymphopenia (CD4+ depletion) + neutropenia"],
["Felty syndrome", "Neutropenia + RA + splenomegaly"],
["B12 / folate deficiency", "Hypersegmented neutrophils; pancytopenia; macrocytic anemia"],
["Cushing's syndrome", "Neutrophilia + lymphopenia + eosinopenia"],
["Addison's disease", "Eosinophilia + lymphocytosis + neutropenia"],
],
0.45, 1.0, 9.1, 4.5, C.amber
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 11 — Key Formulas + Sources
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.offwhite);
section_header(s, "Key Formulas & Sources");
// Formulas
addRect(s, 0.45, 1.0, 9.1, 0.3, C.blue);
s.addText("Key Formulas", { x: 0.5, y: 1.0, w: 9.0, h: 0.3, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
const formulas = [
["Absolute Cell Count", "= Total WBC × (% of cell type ÷ 100)"],
["Corrected WBC (for nRBCs)", "= WBC × 100 ÷ (100 + nRBCs per 100 WBCs)"],
];
formulas.forEach(([label, formula], i) => {
addRect(s, 0.45, 1.34 + i * 0.42, 9.1, 0.38, i % 2 === 0 ? C.blueLight : C.white);
s.addText(label + ":", { x: 0.6, y: 1.38 + i * 0.42, w: 4.0, h: 0.3, fontSize: 12, bold: true, color: C.navy, fontFace: "Calibri", valign: "middle", margin: 0 });
s.addText(formula, { x: 4.5, y: 1.38 + i * 0.42, w: 5.0, h: 0.3, fontSize: 12, color: C.darkgrey, fontFace: "Calibri", valign: "middle", margin: 0 });
});
// Sources
addRect(s, 0.45, 2.35, 9.1, 0.3, C.navy);
s.addText("Sources", { x: 0.5, y: 2.35, w: 9.0, h: 0.3, fontSize: 13, bold: true, color: C.white, fontFace: "Calibri", valign: "middle", margin: 0 });
const sources = [
"Henry's Clinical Diagnosis and Management by Laboratory Methods, 23rd edition",
"Goldman-Cecil Medicine (International Edition)",
"Textbook of Family Medicine, 9th edition",
"Tietz Textbook of Laboratory Medicine, 7th edition",
"Quick Compendium of Clinical Pathology, 5th edition",
];
sources.forEach((src, i) => {
s.addText(`${i + 1}. ${src}`, {
x: 0.6, y: 2.7 + i * 0.3, w: 8.9, h: 0.28,
fontSize: 11, color: C.darkgrey, fontFace: "Calibri", valign: "top", margin: 0, italic: true,
});
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 12 — End slide
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
addBg(s, C.navy);
addRect(s, 0, 2.4, 10, 0.08, C.teal);
s.addText("Thank You", {
x: 0.5, y: 0.6, w: 9, h: 1.2,
fontSize: 54, bold: true, color: C.white,
fontFace: "Calibri", align: "center", valign: "middle",
});
s.addText("DLC Study Guide — Differential Leukocyte Count: Normal vs. Abnormal Patterns", {
x: 0.5, y: 1.85, w: 9, h: 0.5,
fontSize: 18, color: C.blueLight, fontFace: "Calibri",
align: "center", valign: "middle", italic: true,
});
s.addText("For educational purposes only | Always verify clinical decisions against current guidelines", {
x: 0.5, y: 4.9, w: 9, h: 0.4,
fontSize: 12, color: C.grey, fontFace: "Calibri",
align: "center", valign: "middle", italic: true,
});
}
// ── Write file ────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.pptx" })
.then(() => console.log("Done: DLC_Study_Guide.pptx"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/dlc-study-guide && node generate_pptx.js 2>&1
ls -lh /home/daytona/workspace/dlc-study-guide/ && python3 -c " import zipfile, os path = '/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide.pptx' z = zipfile.ZipFile(path) slides = [n for n in z.namelist() if n.startswith('ppt/slides/slide') and not '_rels' in n] print('Slides:', len(slides)) print('File size:', os.path.getsize(path), 'bytes') "
DLC Study Guide
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title slide (dark navy background) |
| 2 | What Is the DLC? + Normal Reference Ranges table |
| 3 | Neutrophilia - morphology, mechanisms, causes |
| 4 | Left Shift, Toxic Changes + Morphological Anomalies |
| 5 | Neutropenia - severity grading + causes |
| 6 | Lymphocytosis vs. Lymphopenia (side by side) |
| 7 | Monocytes vs. Eosinophils (side by side) |
| 8 | Basophilia & Basopenia |
| 9 | Quick Pattern Recognition table (green color-coded) |
| 10 | DLC in Specific Diseases (amber color-coded) |
| 11 | Key Formulas + Sources |
| 12 | Closing slide |
Change the slide style
~/dlc-study-guide/generate_pptx_v2.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.author = "Orris Medical AI";
pres.title = "DLC Study Guide";
// ── Palette: Medical green / white / slate ──────────────────────────────────
const C = {
green: "1A6B3A", // deep clinical green (headers, accents)
greenMid: "2E8B57", // mid green (subheaders, highlights)
greenLight: "D6EFE0", // light green (row tints, card bgs)
greenPale: "F0FAF4", // near-white green tint (slide bg)
teal: "0E7490", // secondary accent (notes, callouts)
tealLight: "CFFAFE", // teal tint
white: "FFFFFF",
offwhite: "F9FAFB",
slate: "334155", // body text
slateLight: "64748B", // secondary text
border: "CBD5E1", // table borders
red: "B91C1C", // danger labels
redLight: "FEE2E2",
amber: "92400E",
amberLight: "FEF3C7",
};
// ── Layout constants ──────────────────────────────────────────────────────────
const SW = 10, SH = 5.625; // slide width / height in inches
const PAD = 0.45; // left/right page margin
const INNER = SW - PAD * 2; // usable inner width
// ── Low-level helpers ─────────────────────────────────────────────────────────
function rect(s, x, y, w, h, fill, lineColor = null) {
const opts = { x, y, w, h, fill: { color: fill } };
if (lineColor) opts.line = { color: lineColor, width: 1 };
else opts.line = { color: fill, width: 0 };
s.addShape(pres.ShapeType.rect, opts);
}
function txt(s, text, x, y, w, h, opts = {}) {
s.addText(text, { x, y, w, h, fontFace: "Calibri", valign: "middle", margin: 0, ...opts });
}
// ── Slide chrome ──────────────────────────────────────────────────────────────
// Thin green top bar + white body — clean clinical look
function chrome(s, title, subtitle = null) {
// Full white background
s.background = { color: C.white };
// Top accent bar (full width, 0.9" tall)
rect(s, 0, 0, SW, 0.9, C.green);
// Bottom accent strip
rect(s, 0, SH - 0.12, SW, 0.12, C.greenMid);
// Title text
txt(s, title, PAD, 0.08, INNER, 0.72,
{ fontSize: 22, bold: true, color: C.white, align: "left" });
// Optional subtitle / section label
if (subtitle) {
txt(s, subtitle, PAD, 0.66, INNER, 0.26,
{ fontSize: 10, color: "A7F3D0", italic: true, align: "left" });
}
// Slide area starts at y = 1.0
}
// ── Section divider slide ─────────────────────────────────────────────────────
function divider(s, number, title, body) {
s.background = { color: C.green };
// Large number watermark
txt(s, number, 6.5, 0.3, 3.2, 4.5,
{ fontSize: 200, bold: true, color: "1D7A42", align: "right", valign: "middle" });
txt(s, title, PAD, 1.2, 5.5, 1.2,
{ fontSize: 36, bold: true, color: C.white, align: "left" });
txt(s, body, PAD, 2.5, 5.5, 0.9,
{ fontSize: 14, color: "A7F3D0", italic: true, align: "left" });
rect(s, PAD, 2.35, 1.2, 0.06, "A7F3D0");
}
// ── Key-value card ────────────────────────────────────────────────────────────
function card(s, x, y, w, h, headerText, headerBg, bodyLines) {
// Card container with light border
rect(s, x, y, w, h, C.white, C.border);
// Header band
rect(s, x, y, w, 0.34, headerBg);
txt(s, headerText, x + 0.12, y, w - 0.24, 0.34,
{ fontSize: 11, bold: true, color: C.white, align: "left" });
// Body text
s.addText(bodyLines, {
x: x + 0.12, y: y + 0.38, w: w - 0.24, h: h - 0.46,
fontFace: "Calibri", fontSize: 10.5, color: C.slate,
valign: "top", margin: 0,
});
}
// ── Simple 2-column table ─────────────────────────────────────────────────────
function table2(s, headers, rows, x, y, w, hdrBg = C.green) {
const c0 = w * 0.42, c1 = w * 0.58;
const rh = 0.29;
// Header
rect(s, x, y, c0, 0.32, hdrBg);
rect(s, x + c0, y, c1, 0.32, hdrBg);
txt(s, headers[0], x + 0.1, y, c0 - 0.12, 0.32, { fontSize: 10.5, bold: true, color: C.white });
txt(s, headers[1], x + c0 + 0.1, y, c1 - 0.12, 0.32, { fontSize: 10.5, bold: true, color: C.white });
// Rows
rows.forEach(([a, b], i) => {
const ry = y + 0.32 + i * rh;
const bg = i % 2 === 0 ? C.white : C.greenLight;
rect(s, x, ry, c0, rh, bg, C.border);
rect(s, x + c0, ry, c1, rh, bg, C.border);
txt(s, a, x + 0.1, ry, c0 - 0.12, rh, { fontSize: 9.5, color: C.slate });
txt(s, b, x + c0 + 0.1, ry, c1 - 0.12, rh, { fontSize: 9.5, color: C.slate });
});
}
// ── 3-column table ────────────────────────────────────────────────────────────
function table3(s, headers, rows, x, y, w, hdrBg = C.green) {
const cw = w / 3;
const rh = 0.28;
headers.forEach((h, i) => {
rect(s, x + i * cw, y, cw, 0.32, hdrBg);
txt(s, h, x + i * cw + 0.08, y, cw - 0.1, 0.32, { fontSize: 10, bold: true, color: C.white });
});
rows.forEach((row, ri) => {
const ry = y + 0.32 + ri * rh;
const bg = ri % 2 === 0 ? C.white : C.greenLight;
row.forEach((cell, ci) => {
rect(s, x + ci * cw, ry, cw, rh, bg, C.border);
txt(s, cell, x + ci * cw + 0.08, ry, cw - 0.1, rh, { fontSize: 9, color: C.slate });
});
});
}
// ── Callout note ──────────────────────────────────────────────────────────────
function note(s, text, y) {
rect(s, PAD, y, 0.05, 0.38, C.teal);
rect(s, PAD + 0.05, y, INNER - 0.05, 0.38, C.tealLight);
txt(s, text, PAD + 0.14, y, INNER - 0.2, 0.38,
{ fontSize: 10, color: C.teal, italic: true });
}
// ── Stat badge (big number + label) ──────────────────────────────────────────
function statBadge(s, x, y, w, h, bigText, labelText, bgColor = C.greenLight) {
rect(s, x, y, w, h, bgColor, C.border);
txt(s, bigText, x, y + 0.04, w, h * 0.55,
{ fontSize: 24, bold: true, color: C.green, align: "center" });
txt(s, labelText, x, y + h * 0.55, w, h * 0.38,
{ fontSize: 9, color: C.slateLight, align: "center", italic: true });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — Title
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.background = { color: C.white };
// Left green panel
rect(s, 0, 0, 3.6, SH, C.green);
// Accent strip
rect(s, 3.6, 0, 0.08, SH, C.greenMid);
txt(s, "DLC", 0.3, 0.5, 3.0, 2.0,
{ fontSize: 90, bold: true, color: C.white, align: "center" });
txt(s, "Study Guide", 0.3, 2.3, 3.0, 0.9,
{ fontSize: 22, bold: true, color: "A7F3D0", align: "center" });
txt(s, "Differential Leukocyte Count", 4.0, 1.2, 5.6, 0.7,
{ fontSize: 26, bold: true, color: C.green, align: "left" });
txt(s, "Normal vs. Abnormal Patterns", 4.0, 1.9, 5.6, 0.5,
{ fontSize: 18, color: C.slateLight, italic: true, align: "left" });
rect(s, 4.0, 2.5, 5.6, 0.04, C.greenLight);
const sourceLines = [
"Henry's Clinical Diagnosis & Management by Laboratory Methods (23e)",
"Goldman-Cecil Medicine | Textbook of Family Medicine (9e)",
"Tietz Textbook of Laboratory Medicine (7e)",
];
sourceLines.forEach((l, i) => {
txt(s, l, 4.0, 2.65 + i * 0.3, 5.6, 0.28,
{ fontSize: 9.5, color: C.slateLight, italic: true, align: "left" });
});
txt(s, "For educational use only", 4.0, 5.2, 5.6, 0.3,
{ fontSize: 9, color: C.border, italic: true, align: "left" });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 2 — What Is DLC + Normal Ranges
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "What Is the DLC?");
txt(s, "The DLC quantifies the relative (%) and absolute (cells/µL) concentration of each leukocyte type in peripheral blood as part of the automated CBC.",
PAD, 1.02, INNER, 0.42, { fontSize: 12, color: C.slate, align: "left" });
note(s, "Key principle: Always interpret the ABSOLUTE count (WBC × % ÷ 100), not percentage alone — a raised % may just reflect depletion of another cell type.", 1.52);
txt(s, "Normal Total WBC (Adults): 4,000 – 7,000 cells/µL (broader ref: 4,500 – 11,000 /µL)",
PAD, 2.0, INNER, 0.3, { fontSize: 11, bold: true, color: C.green, align: "left" });
table3(s,
["Cell Type", "% of WBC", "Absolute (×10³/µL)"],
[
["Neutrophils (segs + bands)", "50 – 70%", "1.8 – 7.0 | Bands <5%"],
["Lymphocytes", "20 – 40%", "1.0 – 4.8 | Dominant <4 yrs"],
["Monocytes", "2 – 10%", "0.2 – 1.0 | Largest WBC"],
["Eosinophils", "1 – 4%", "0.04 – 0.4 | Allergy/parasites"],
["Basophils", "0 – 1%", "0.01 – 0.1 | Rarest; histamine"],
],
PAD, 2.35, INNER, C.green
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 3 — Neutrophilia
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Neutrophilia", "Neutrophils > 7.0 ×10³/µL");
// 3 mechanism cards
const mechanisms = [
["Demargination", "Exercise, epinephrine, stress — shifts cells from vessel walls into circulation. No increase in total pool."],
["Increased Marrow Output", "Cortisol, steroids, severe infections — drives release from marrow storage pool."],
["Decreased Egress", "Corticosteroids block neutrophil migration out of blood into tissues."],
];
const cw = (INNER - 0.3) / 3;
mechanisms.forEach(([title, body], i) => {
card(s, PAD + i * (cw + 0.15), 1.02, cw, 1.15, title, C.greenMid,
[{ text: body, options: { fontSize: 10, color: C.slate } }]);
});
table2(s,
["Category", "Key Examples"],
[
["Infections", "Bacterial (most common), fungal, some viral"],
["Inflammation","Trauma, surgery, burns, MI, post-splenectomy"],
["Drugs", "Corticosteroids, G-CSF, lithium"],
["Physiologic", "Exercise, stress, pregnancy, neonatal"],
["Neoplastic", "CML, myeloproliferative disorders"],
["Metabolic", "Uremia, DKA, gout, thyrotoxicosis"],
],
PAD, 2.28, INNER, C.green
);
note(s, "NOT neutrophilic (exceptions): TB, brucellosis, pertussis → lymphocytes dominant; Listeria → monocytes dominant.", 4.6);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 4 — Left Shift & Toxic Changes
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Left Shift & Toxic Changes in Neutrophils");
// Left shift explanation (left panel)
txt(s, "Left Shift", PAD, 1.05, 4.5, 0.3,
{ fontSize: 13, bold: true, color: C.green });
txt(s, [
{ text: "Release of immature neutrophils:\n", options: { bold: true } },
{ text: "Bands → Metamyelocytes → Myelocytes\n\n", options: {} },
{ text: "Reactive left shift ", options: { bold: true } },
{ text: "rarely includes promyelocytes or blasts.\nPromyelocytes/blasts suggest ", options: {} },
{ text: "leukemia", options: { bold: true, color: C.red } },
{ text: ", not reactive disease.", options: {} },
], { x: PAD, y: 1.38, w: 4.4, h: 1.1,
fontFace: "Calibri", fontSize: 11, color: C.slate, valign: "top", margin: 0 });
// Toxic changes (right panel)
const tox = [
["Toxic Granulation", C.green, "Dark azurophilic (primary) granules in cytoplasm. Severe infections, toxic conditions, reactive states."],
["Döhle Bodies", C.greenMid,"Pale-blue oval cytoplasmic inclusions (ribosome remnants). Infections and toxic states."],
["Cytoplasmic Vacuoles", C.teal, "Empty vacuoles indicating active phagocytosis. Infection."],
];
tox.forEach(([title, color, body], i) => {
card(s, 5.05, 1.05 + i * 0.88, 4.5, 0.82, title, color,
[{ text: body, options: { fontSize: 10, color: C.slate } }]);
});
// Anomalies table at bottom
table3(s,
["Anomaly", "Description", "Significance"],
[
["Pelger-Huët", "Bilobed / pince-nez nucleus", "Inherited (benign) or MDS"],
["Hypersegmentation","≥5 lobes in ≥5% of neutrophils", "B12 / folate deficiency"],
["May-Hegglin", "Döhle-like inclusions + giant platelets","Rare autosomal-dominant"],
["Chédiak-Higashi", "Giant fused lysosomes in all WBCs", "AR; recurrent infections + albinism"],
],
PAD, 3.75, INNER, C.slateLight
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 5 — Neutropenia
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Neutropenia", "Absolute neutrophils < 1.8 ×10³/µL");
// Severity stat badges
const grades = [
["1.0 – 1.8", "Mild", C.greenLight],
["0.5 – 1.0", "Moderate", C.amberLight],
["< 0.5", "Severe / Agranulocytosis ⚠", C.redLight],
];
const bw = (INNER - 0.4) / 3;
grades.forEach(([val, label, bg], i) => {
statBadge(s, PAD + i * (bw + 0.2), 1.02, bw, 0.85, val + " ×10³/µL", label, bg);
});
table2(s,
["Category", "Key Examples"],
[
["Drugs (most common)", "Chemo, chloramphenicol, sulfonamides, phenothiazines, anticonvulsants"],
["Radiation", "Dose-dependent marrow damage; lymphocytes most radiosensitive"],
["Immune-mediated", "SLE, RA / Felty syndrome, AIDS — immune-mediated destruction"],
["Congenital", "Kostmann syndrome, cyclic neutropenia (~21-day cycle; ELA2 mutation)"],
["Hematologic", "Megaloblastic anemia, MDS, aplastic anemia, marrow infiltration"],
["Infectious", "Overwhelming bacterial sepsis; viral suppression (measles, rubella)"],
["Other", "Starvation, hypersplenism, alcohol, benzene toxicity"],
],
PAD, 1.98, INNER, C.green
);
note(s, "Toxic granulation + Döhle bodies seen in infection-related neutropenia — absent in PIH (pregnancy-induced hypertension). Clinically useful distinction.", 4.6);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 6 — Lymphocytes
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Lymphocytes");
// Left: Lymphocytosis
rect(s, PAD, 1.02, 4.5, 0.3, C.green);
txt(s, "Lymphocytosis > 4.8 ×10³/µL",
PAD + 0.1, 1.02, 4.3, 0.3, { fontSize: 11, bold: true, color: C.white });
table2(s,
["Category", "Examples"],
[
["Acute viral", "EBV (mono), CMV, hepatitis, rubella, pertussis"],
["Chronic infections", "TB, brucellosis, toxoplasmosis"],
["Autoimmune", "Early RA, other autoimmune disorders"],
["Neoplastic", "CLL, ALL, lymphomas"],
],
PAD, 1.35, 4.5, C.greenMid
);
note(s, "Reactive (atypical) lymphocytes: large, blue-gray cytoplasm, kidney-shaped nucleus — classic in EBV mono.", 2.95);
// Right: Lymphopenia
rect(s, 5.1, 1.02, 4.45, 0.3, C.red);
txt(s, "Lymphopenia < 1.0 ×10³/µL",
5.2, 1.02, 4.25, 0.3, { fontSize: 11, bold: true, color: C.white });
table2(s,
["Category", "Examples"],
[
["Immunodeficiency", "HIV/AIDS, DiGeorge syndrome, SCID"],
["Adrenocortical excess", "Cushing's, high-dose corticosteroids"],
["Cytotoxic therapy", "Chemo, radiation (most radiosensitive WBC)"],
["Advanced malignancy", "Lymphomas, advanced carcinomas"],
["Other", "Anorexia nervosa, impaired intestinal lymphatics"],
],
5.1, 1.35, 4.45, C.red
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 7 — Monocytes & Eosinophils
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Monocytes & Eosinophils");
// Monocytosis
rect(s, PAD, 1.02, 4.5, 0.3, C.green);
txt(s, "Monocytosis > 1.0 ×10³/µL",
PAD + 0.1, 1.02, 4.3, 0.3, { fontSize: 11, bold: true, color: C.white });
table2(s,
["Category", "Examples"],
[
["Infections", "TB, brucellosis, SBE, Listeria, protozoa"],
["Hematologic", "AML-M5, AML-M4, MDS"],
["Inflammatory", "SLE, IBD, sarcoidosis"],
["Recovery / other", "Post-chemo; sprue; ulcerative colitis"],
],
PAD, 1.35, 4.5, C.greenMid
);
note(s, "Listeria → monocyte-predominant response, esp. in neonates.", 2.95);
txt(s, "Monocytopenia: onset of steroids; hairy cell leukemia (classic).",
PAD, 3.42, 4.5, 0.3, { fontSize: 10, color: C.slateLight, italic: true });
// Eosinophilia
rect(s, 5.1, 1.02, 4.45, 0.3, C.teal);
txt(s, "Eosinophilia > 0.4 ×10³/µL",
5.2, 1.02, 4.25, 0.3, { fontSize: 11, bold: true, color: C.white });
const eSeverity = [
["Mild: 0.4–1.5 ×10³/µL", C.greenLight, C.green],
["Moderate: 1.5–5.0 ×10³/µL", C.amberLight, C.amber],
["Severe / HES: > 5.0 ×10³/µL ⚠", C.redLight, C.red],
];
eSeverity.forEach(([label, bg, tc], i) => {
rect(s, 5.1, 1.35 + i * 0.26, 4.45, 0.24, bg, C.border);
txt(s, label, 5.2, 1.35 + i * 0.26, 4.25, 0.24,
{ fontSize: 10, bold: true, color: tc });
});
table2(s,
["Category", "Examples"],
[
["Allergic", "Asthma, hay fever, urticaria, atopic dermatitis"],
["Parasitic", "Tissue-invasive helminths (Ascaris, hookworm, Toxocara)"],
["Neoplastic", "CML, Hodgkin lymphoma, eosinophilic leukemia"],
["Other", "Addison disease, Löffler syndrome, drug reactions"],
],
5.1, 2.15, 4.45, C.teal
);
txt(s, "Eosinopenia: acute stress, Cushing's, corticosteroids.",
5.1, 3.8, 4.45, 0.3, { fontSize: 10, color: C.slateLight, italic: true });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 8 — Basophils
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Basophils");
// Definition
rect(s, PAD, 1.02, INNER, 0.3, C.green);
txt(s, "Basophilia > 0.1 ×10³/µL | Basopenia < 0.01 ×10³/µL",
PAD + 0.1, 1.02, INNER - 0.2, 0.3, { fontSize: 12, bold: true, color: C.white });
table2(s,
["Category", "Basophilia Causes"],
[
["Hematologic (most specific)", "CML (very characteristic), polycythemia vera, myeloid metaplasia"],
["Inflammatory / allergic", "Hypersensitivity reactions, chronic sinusitis, ulcerative colitis"],
["Endocrine", "Hypothyroidism"],
["Other", "Chronic hemolytic anemia, splenectomy, ionizing radiation"],
],
PAD, 1.38, INNER, C.greenMid
);
note(s, "Persistent basophilia + neutrophilia + eosinophilia = strongly suspect CML. Send BCR-ABL (Philadelphia chromosome) testing.", 2.72);
rect(s, PAD, 3.2, INNER, 0.3, C.slateLight);
txt(s, "Basopenia Causes: Sustained glucocorticoids | Acute infection or stress | Hyperthyroidism",
PAD + 0.1, 3.2, INNER - 0.2, 0.3, { fontSize: 11, color: C.white });
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 9 — Quick Pattern Recognition
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Quick Pattern Recognition");
table2(s,
["DLC Pattern", "Suspect First"],
[
["Neutrophilia + left shift + toxic changes", "Bacterial infection / sepsis"],
["Neutrophilia alone, no toxic changes", "Physiologic stress or corticosteroids"],
["Neutropenia, no toxic changes", "Drug-induced, PIH, or immune-mediated"],
["Lymphocytosis + atypical lymphocytes", "EBV infectious mononucleosis"],
["Lymphocytosis + mature small lymphocytes", "CLL (chronic lymphocytic leukemia)"],
["Eosinophilia (mild–moderate)", "Allergy / atopic disease"],
["Eosinophilia (marked, >5 ×10³/µL)", "Tissue-invasive parasites"],
["Basophilia", "CML — until proven otherwise"],
["Monocytosis", "TB, chronic infection, or AML-M5"],
["Lymphopenia", "HIV/AIDS, corticosteroids, radiation"],
["Pancytopenia", "Aplastic anemia, marrow infiltration, megaloblastic anemia"],
["Neutrophilia + basophilia + eosinophilia", "CML (leukemoid reaction if BCR-ABL negative)"],
],
PAD, 1.02, INNER, C.green
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 10 — Disease Patterns
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "DLC Patterns in Specific Diseases");
table2(s,
["Disease", "Classic DLC Pattern"],
[
["Bacterial sepsis", "Neutrophilia + left shift + toxic granulation + Döhle bodies"],
["EBV mononucleosis", "Lymphocytosis with atypical (reactive) lymphocytes"],
["CML", "Neutrophilia + basophilia + eosinophilia; BCR-ABL positive"],
["CLL", "Mature small lymphocytosis; smudge cells on film"],
["Pertussis", "Lymphocytosis (unusually, for a bacterial infection)"],
["Tuberculosis", "Lymphocytosis or monocytosis; possible neutropenia"],
["HIV/AIDS", "Lymphopenia (CD4+ depletion) + neutropenia"],
["Felty syndrome", "Neutropenia + RA + splenomegaly"],
["B12 / folate deficiency", "Hypersegmented neutrophils; pancytopenia; macrocytic anemia"],
["Cushing's syndrome", "Neutrophilia + lymphopenia + eosinopenia"],
["Addison's disease", "Eosinophilia + lymphocytosis + neutropenia"],
["Listeria (neonates)", "Monocyte-predominant response"],
],
PAD, 1.02, INNER, C.green
);
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 11 — Formulas
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
chrome(s, "Key Formulas");
const fw = (INNER - 0.2) / 2;
[
["Absolute Cell Count", "Total WBC × (% cell type ÷ 100)", C.greenLight],
["Corrected WBC (nRBCs)", "WBC × 100 ÷ (100 + nRBCs per 100 WBCs)", C.tealLight],
].forEach(([label, formula, bg], i) => {
rect(s, PAD + i * (fw + 0.2), 1.1, fw, 1.2, bg, C.border);
txt(s, label, PAD + i * (fw + 0.2) + 0.15, 1.2, fw - 0.3, 0.35,
{ fontSize: 12, bold: true, color: C.green, align: "center" });
txt(s, formula, PAD + i * (fw + 0.2) + 0.1, 1.62, fw - 0.2, 0.5,
{ fontSize: 13, color: C.slate, align: "center", italic: true });
});
// Sources
rect(s, PAD, 2.55, INNER, 0.3, C.green);
txt(s, "References", PAD + 0.1, 2.55, INNER - 0.2, 0.3,
{ fontSize: 12, bold: true, color: C.white });
const sources = [
"Henry's Clinical Diagnosis and Management by Laboratory Methods, 23rd edition",
"Goldman-Cecil Medicine (International Edition)",
"Textbook of Family Medicine, 9th edition",
"Tietz Textbook of Laboratory Medicine, 7th edition | Quick Compendium of Clinical Pathology, 5th edition",
];
sources.forEach((src, i) => {
txt(s, `${i + 1}. ${src}`, PAD, 2.9 + i * 0.3, INNER, 0.28,
{ fontSize: 10, color: C.slateLight, italic: true });
});
}
// ════════════════════════════════════════════════════════════════════════════
// SLIDE 12 — End
// ════════════════════════════════════════════════════════════════════════════
{
const s = pres.addSlide();
s.background = { color: C.white };
rect(s, 0, 0, 3.6, SH, C.green);
rect(s, 3.6, 0, 0.08, SH, C.greenMid);
txt(s, "Thank\nYou", 0.2, 0.4, 3.2, 3.2,
{ fontSize: 54, bold: true, color: C.white, align: "center", valign: "middle" });
txt(s, "DLC Study Guide", 3.9, 1.5, 5.7, 0.7,
{ fontSize: 28, bold: true, color: C.green, align: "left" });
txt(s, "Differential Leukocyte Count\nNormal vs. Abnormal Patterns", 3.9, 2.25, 5.7, 0.8,
{ fontSize: 15, color: C.slateLight, italic: true, align: "left" });
rect(s, 3.9, 3.2, 5.7, 0.04, C.greenLight);
txt(s, "For educational purposes only | Always verify clinical decisions against current guidelines.",
3.9, 3.3, 5.7, 0.4, { fontSize: 9.5, color: C.border, italic: true, align: "left" });
}
// ── Write ─────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide_v2.pptx" })
.then(() => console.log("Done"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/dlc-study-guide && node generate_pptx_v2.js 2>&1 | grep -v '"none"'
python3 -c " import zipfile, os path = '/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide_v2.pptx' z = zipfile.ZipFile(path) slides = [n for n in z.namelist() if n.startswith('ppt/slides/slide') and '_rels' not in n] print(f'Slides: {len(slides)}, Size: {os.path.getsize(path):,} bytes') "
DLC Study Guide v2
Presentation · PPTX
| Old Style | New Style | |
|---|---|---|
| Background | Off-white/grey | Clean white throughout |
| Headers | Dark navy bar | Deep clinical green bar |
| Accent | Blue, red, amber, yellow mix | Green + teal (with red only for danger labels) |
| Layout | Dense, many tables per slide | More whitespace, cards for mechanism slides |
| Title slide | Full-width colour block | Split panel (green left, white right) |
| Section dividers | None | Large watermark number + title |
| Fonts | Mixed weights | Calibri throughout, lighter body weight |
| Tables | Alternating blue rows | Alternating soft green rows |
| Callout notes | Blue left-border | Teal left-border with teal tint background |
Make more beautiful
~/dlc-study-guide/generate_pptx_v3.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.author = "Orris Medical AI";
pres.title = "DLC Study Guide";
// ═══════════════════════════════════════════════════════════════════════════
// DESIGN SYSTEM
// Deep forest green dominant + crisp white + warm gold accent
// ═══════════════════════════════════════════════════════════════════════════
const C = {
// Primary greens
forest: "0D4F2E", // dominant dark green
emerald: "1A6B3A", // mid green
sage: "2E8B57", // lighter green
mint: "D1FAE5", // very light green tint
mintPale: "F0FDF4", // near-white green
// Gold accent
gold: "D4A017", // warm gold
goldLight: "FEF9E7", // pale gold
goldMid: "F5C842", // bright gold
// Neutrals
white: "FFFFFF",
pearl: "FAFAFA",
smoke: "F1F5F9",
ash: "E2E8F0",
ink: "1E293B", // near-black for body text
muted: "64748B", // secondary text
ghost: "CBD5E1", // borders
// Semantic
rose: "BE123C",
roseLight: "FFE4E6",
sky: "0369A1",
skyLight: "E0F2FE",
};
const SW = 10, SH = 5.625;
const PAD = 0.42;
const IW = SW - PAD * 2; // 9.16" inner width
// ── Primitives ────────────────────────────────────────────────────────────
function R(s, x, y, w, h, fill, opts = {}) {
s.addShape(pres.ShapeType.rect, {
x, y, w, h,
fill: { color: fill },
line: opts.line ? opts.line : { color: fill, width: 0 },
shadow: opts.shadow || undefined,
});
}
function T(s, content, x, y, w, h, opts = {}) {
s.addText(content, {
x, y, w, h,
fontFace: "Calibri",
valign: "middle",
margin: opts.margin !== undefined ? opts.margin : 0,
...opts,
});
}
// Rounded-rectangle simulation via shape
function pill(s, x, y, w, h, fill) {
s.addShape(pres.ShapeType.roundRect, {
x, y, w, h,
fill: { color: fill },
line: { color: fill, width: 0 },
rectRadius: 0.06,
});
}
// ── Slide chrome: green top bar with gold underline ───────────────────────
function chrome(s, title, tag = null) {
s.background = { color: C.white };
// Top bar
R(s, 0, 0, SW, 0.82, C.forest);
// Gold accent stripe under bar
R(s, 0, 0.82, SW, 0.055, C.gold);
// Page bottom strip
R(s, 0, SH - 0.1, SW, 0.1, C.mint);
T(s, title, PAD, 0.1, IW - 1.2, 0.62,
{ fontSize: 21, bold: true, color: C.white, align: "left" });
if (tag) {
pill(s, SW - PAD - 1.8, 0.18, 1.8, 0.46, C.gold);
T(s, tag, SW - PAD - 1.8, 0.18, 1.8, 0.46,
{ fontSize: 10, bold: true, color: C.forest, align: "center" });
}
}
// ── Section divider (full dark slide) ────────────────────────────────────
function sectionDivider(s, num, heading, sub) {
s.background = { color: C.forest };
// Decorative diagonal stripe
R(s, 6.2, 0, 3.8, SH, "0B4428");
// Gold vertical bar left
R(s, 0, 0, 0.18, SH, C.gold);
T(s, num, 6.5, -0.1, 3.2, SH + 0.2,
{ fontSize: 220, bold: true, color: "0B4428", align: "right", valign: "middle" });
T(s, heading, 0.45, 1.3, 5.8, 1.1,
{ fontSize: 38, bold: true, color: C.white, align: "left" });
R(s, 0.45, 2.5, 1.4, 0.07, C.gold);
T(s, sub, 0.45, 2.68, 5.6, 0.65,
{ fontSize: 14, color: "A7F3D0", italic: true, align: "left" });
}
// ── Card with header band ─────────────────────────────────────────────────
function card(s, x, y, w, h, headerText, hBg, bodyArr, options = {}) {
// Card shadow simulation
R(s, x + 0.04, y + 0.04, w, h, C.ash);
// Card body
R(s, x, y, w, h, C.white, { line: { color: C.ash, width: 1 } });
// Header band
R(s, x, y, w, 0.36, hBg);
// Gold bottom border
R(s, x, y + h - 0.05, w, 0.05, C.gold);
T(s, headerText, x + 0.12, y + 0.01, w - 0.24, 0.34,
{ fontSize: 11, bold: true, color: C.white, align: "left" });
s.addText(bodyArr, {
x: x + 0.12, y: y + 0.42, w: w - 0.24, h: h - 0.54,
fontFace: "Calibri", fontSize: 10, color: C.ink,
valign: "top", margin: 0,
});
}
// ── Stat badge (big value + label) ───────────────────────────────────────
function badge(s, x, y, w, h, value, label, bg, textColor = C.forest) {
R(s, x + 0.035, y + 0.035, w, h, C.ash);
R(s, x, y, w, h, bg, { line: { color: C.ghost, width: 1 } });
R(s, x, y + h - 0.07, w, 0.07, C.gold);
T(s, value, x, y + 0.08, w, h * 0.52,
{ fontSize: 20, bold: true, color: textColor, align: "center" });
T(s, label, x, y + h * 0.54, w, h * 0.38,
{ fontSize: 9, color: C.muted, align: "center", italic: true });
}
// ── Slim 2-col table with gold header ────────────────────────────────────
function tbl2(s, h1, h2, rows, x, y, totalW, hBg = C.forest, rh = 0.285) {
const c0 = totalW * 0.42, c1 = totalW * 0.58;
// Shadow
R(s, x + 0.04, y + 0.04, totalW, 0.33 + rows.length * rh, C.ash);
// Header
R(s, x, y, c0, 0.33, hBg);
R(s, x + c0, y, c1, 0.33, hBg);
T(s, h1, x + 0.1, y, c0 - 0.12, 0.33,
{ fontSize: 10.5, bold: true, color: C.white });
T(s, h2, x + c0 + 0.1, y, c1 - 0.12, 0.33,
{ fontSize: 10.5, bold: true, color: C.white });
// Rows
rows.forEach(([a, b], i) => {
const ry = y + 0.33 + i * rh;
const bg = i % 2 === 0 ? C.white : C.mintPale;
R(s, x, ry, c0, rh, bg, { line: { color: C.ash, width: 0.5 } });
R(s, x + c0, ry, c1, rh, bg, { line: { color: C.ash, width: 0.5 } });
T(s, a, x + 0.1, ry, c0 - 0.14, rh, { fontSize: 9.5, color: C.ink });
T(s, b, x + c0 + 0.1, ry, c1 - 0.14, rh, { fontSize: 9.5, color: C.ink });
});
}
// ── 3-col table ───────────────────────────────────────────────────────────
function tbl3(s, headers, rows, x, y, totalW, hBg = C.forest) {
const cw = totalW / 3;
const rh = 0.275;
R(s, x + 0.04, y + 0.04, totalW, 0.33 + rows.length * rh, C.ash);
headers.forEach((h, i) => {
R(s, x + i * cw, y, cw, 0.33, hBg);
T(s, h, x + i * cw + 0.09, y, cw - 0.12, 0.33,
{ fontSize: 10, bold: true, color: C.white });
});
rows.forEach((row, ri) => {
const ry = y + 0.33 + ri * rh;
const bg = ri % 2 === 0 ? C.white : C.mintPale;
row.forEach((cell, ci) => {
R(s, x + ci * cw, ry, cw, rh, bg, { line: { color: C.ash, width: 0.5 } });
T(s, cell, x + ci * cw + 0.09, ry, cw - 0.12, rh,
{ fontSize: 9, color: C.ink });
});
});
}
// ── Callout note ──────────────────────────────────────────────────────────
function note(s, text, y, icon = "★") {
R(s, PAD, y, IW, 0.4, C.goldLight, { line: { color: C.gold, width: 1 } });
R(s, PAD, y, 0.36, 0.4, C.gold);
T(s, icon, PAD, y, 0.36, 0.4,
{ fontSize: 14, bold: true, color: C.white, align: "center" });
T(s, text, PAD + 0.42, y, IW - 0.48, 0.4,
{ fontSize: 10, color: C.forest, italic: true });
}
// ── Divider line ──────────────────────────────────────────────────────────
function hr(s, y) { R(s, PAD, y, IW, 0.04, C.mint); }
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 1 — TITLE
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.background = { color: C.forest };
// Right decorative panel
R(s, 5.8, 0, 4.2, SH, "0B4428");
R(s, 5.8, 0, 0.07, SH, C.gold);
// Watermark cell icon (large background text)
T(s, "WBC", 5.6, 0.2, 4.1, 5.0,
{ fontSize: 130, bold: true, color: "0B4428", align: "center", valign: "middle" });
// Left content
R(s, 0.42, 1.0, 1.0, 0.1, C.gold); // gold rule above
T(s, "DLC", 0.35, 1.15, 5.2, 1.8,
{ fontSize: 88, bold: true, color: C.white, align: "left", charSpacing: -2 });
T(s, "Study Guide", 0.42, 2.95, 5.2, 0.7,
{ fontSize: 30, bold: false, color: C.goldMid, align: "left" });
T(s, "Differential Leukocyte Count", 0.42, 3.7, 5.2, 0.4,
{ fontSize: 14, color: "A7F3D0", italic: true, align: "left" });
T(s, "Normal vs. Abnormal Patterns", 0.42, 4.1, 5.2, 0.35,
{ fontSize: 13, color: C.mint, italic: true, align: "left" });
R(s, 0.42, SH - 0.35, 5.2, 0.04, C.gold);
T(s, "Henry's Clinical Diagnosis & Management (23e) | Goldman-Cecil | Family Medicine (9e) | Tietz (7e)",
0.42, SH - 0.3, 5.2, 0.28,
{ fontSize: 8.5, color: C.muted, italic: true });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 2 — OVERVIEW: What Is the DLC?
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "What Is the DLC?", "OVERVIEW");
T(s, "The DLC quantifies the relative (%) and absolute (cells/µL) concentration of each leukocyte type in peripheral blood — part of every automated CBC.",
PAD, 0.96, IW, 0.38,
{ fontSize: 12, color: C.ink });
note(s, "Always interpret ABSOLUTE count (WBC × % ÷ 100), not percentage alone. A raised % may simply reflect depletion of another cell type.", 1.42);
// WBC stat row
const stats = [
["4,000–7,000", "Normal WBC /µL (adult)", C.mint],
["5 types", "WBC subtypes measured", C.goldLight],
["~⅔ : ⅓", "Neutrophils : Lymphocytes", C.skyLight],
];
const sw2 = (IW - 0.4) / 3;
stats.forEach(([val, lbl, bg], i) => {
badge(s, PAD + i * (sw2 + 0.2), 1.9, sw2, 0.82, val, lbl, bg);
});
tbl3(s,
["Cell Type", "% of WBC (Adult)", "Absolute ×10³/µL"],
[
["Neutrophils (segs + bands)", "50–70%", "1.8–7.0 · Bands <5%"],
["Lymphocytes", "20–40%", "1.0–4.8 · Dominant <4 yrs"],
["Monocytes", "2–10%", "0.2–1.0 · Largest WBC"],
["Eosinophils", "1–4%", "0.04–0.4 · Allergy/parasites"],
["Basophils", "0–1%", "0.01–0.1 · Histamine carrier"],
],
PAD, 2.82, IW
);
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 3 — NEUTROPHILIA
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Neutrophilia", "NEUTROPHILS ↑");
// 3 mechanism cards
const mech = [
["Demargination", "Epinephrine, exercise, stress shift cells from vessel wall pool → circulating pool. Total granulocyte pool unchanged."],
["↑ Marrow Output", "Infection, corticosteroids, G-CSF stimulate release from bone marrow storage pool."],
["↓ Tissue Egress", "Corticosteroids block neutrophil migration out of blood into tissues."],
];
const cw3 = (IW - 0.3) / 3;
mech.forEach(([title, body], i) => {
card(s, PAD + i * (cw3 + 0.15), 1.0, cw3, 1.1, title, C.emerald,
[{ text: body, options: { fontSize: 10, color: C.ink } }]);
});
tbl2(s, "Category", "Key Examples",
[
["Infections", "Bacterial (most common), fungal, some viral"],
["Inflammation", "Trauma, surgery, burns, MI"],
["Drugs", "Corticosteroids, G-CSF, lithium"],
["Physiologic", "Exercise, stress, pregnancy, neonatal"],
["Neoplastic", "CML, myeloproliferative disorders"],
["Metabolic", "Uremia, DKA, gout"],
],
PAD, 2.2, IW
);
note(s, "⚠ Exceptions: TB · brucellosis · pertussis → lymphocyte-dominant. Listeria → monocyte-dominant.", 4.58, "!");
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 4 — LEFT SHIFT & TOXIC CHANGES
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Left Shift & Toxic Changes", "NEUTROPHILS");
// Left shift box
R(s, PAD, 1.0, 4.45, 0.32, C.emerald);
T(s, "Left Shift", PAD + 0.1, 1.0, 4.25, 0.32,
{ fontSize: 12, bold: true, color: C.white });
s.addText([
{ text: "Immature neutrophil release from marrow:\n", options: { bold: true, fontSize: 11 } },
{ text: "Bands → Metamyelocytes → Myelocytes\n\n", options: { fontSize: 11 } },
{ text: "Reactive shift ", options: { bold: true, fontSize: 11 } },
{ text: "rarely includes promyelocytes or blasts.\n", options: { fontSize: 11 } },
{ text: "Blasts → suspect leukaemia, not reactive.", options: { fontSize: 11, color: C.rose, bold: true } },
], { x: PAD + 0.1, y: 1.38, w: 4.25, h: 1.05,
fontFace: "Calibri", color: C.ink, valign: "top", margin: 0 });
// Toxic changes — 3 cards right column
const tox = [
["Toxic Granulation", C.forest, "Dark azurophilic (primary) granules. Severe infections and toxic/reactive conditions."],
["Döhle Bodies", C.emerald, "Pale-blue oval cytoplasmic ribosome remnants. Infections and toxic states."],
["Cytoplasmic Vacuoles",C.sage, "Empty vacuoles — indicate active phagocytosis during infection."],
];
tox.forEach(([title, bg, body], i) => {
card(s, 5.05, 1.0 + i * 0.86, 4.51, 0.8, title, bg,
[{ text: body, options: { fontSize: 10, color: C.ink } }]);
});
// Anomalies at bottom
tbl3(s,
["Anomaly", "Description", "Significance"],
[
["Pelger-Huët", "Bilobed / pince-nez nucleus", "Inherited (benign) or MDS"],
["Hypersegmentation","≥5 lobes in ≥5% neutrophils", "B12 / folate deficiency"],
["Alder-Reilly", "Prominent azurophilic granulation", "Mucopolysaccharidoses; NOT infection"],
["Chédiak-Higashi", "Giant fused lysosomes in ALL WBCs", "AR; pyogenic infections + albinism"],
],
PAD, 3.68, IW, C.muted
);
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 5 — NEUTROPENIA
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Neutropenia", "NEUTROPHILS ↓");
// Severity badges
const grades = [
["1.0–1.8 ×10³/µL", "MILD", C.mint, C.forest],
["0.5–1.0 ×10³/µL", "MODERATE", C.goldLight, C.forest],
["< 0.5 ×10³/µL", "SEVERE ⚠", C.roseLight, C.rose],
];
const bw = (IW - 0.4) / 3;
grades.forEach(([val, lbl, bg, tc], i) => {
badge(s, PAD + i * (bw + 0.2), 1.0, bw, 0.88, val, lbl, bg, tc);
});
tbl2(s, "Category", "Key Examples",
[
["Drugs (most common)", "Chemo · chloramphenicol · sulfonamides · phenothiazines · anticonvulsants"],
["Radiation", "Dose-dependent marrow damage; lymphocytes most radiosensitive"],
["Immune-mediated", "SLE · RA/Felty syndrome · AIDS"],
["Congenital", "Kostmann · cyclic neutropenia (ELA2, ~21-day cycle) · Chédiak-Higashi"],
["Hematologic", "Megaloblastic anemia · MDS · aplastic anemia · marrow infiltration"],
["Infectious", "Overwhelming bacterial sepsis; measles, rubella (viral suppression)"],
["Other", "Starvation · hypersplenism · alcohol · benzene"],
],
PAD, 1.98, IW
);
note(s, "Toxic granulation + Döhle bodies present in infection-related neutropenia — ABSENT in PIH. Clinically useful distinction.", 4.6);
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 6 — LYMPHOCYTES
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Lymphocytes", "LYMPHOCYTES");
// Left half — Lymphocytosis
R(s, PAD, 1.0, 4.5, 0.32, C.forest);
T(s, "↑ Lymphocytosis > 4.8 ×10³/µL",
PAD + 0.1, 1.0, 4.3, 0.32,
{ fontSize: 11, bold: true, color: C.white });
tbl2(s, "Category", "Examples",
[
["Acute viral (most common)", "EBV (mono), CMV, hepatitis, rubella, pertussis"],
["Chronic infections", "TB, brucellosis, toxoplasmosis"],
["Autoimmune", "Early RA, other autoimmune disorders"],
["Neoplastic", "CLL, ALL, lymphomas"],
],
PAD, 1.35, 4.5, C.emerald, 0.285
);
note(s, "Reactive (atypical) lymphocytes: large, blue-gray cytoplasm, kidney-shaped nucleus — classic in EBV mono.", 2.9, "★");
// Right half — Lymphopenia
R(s, 5.1, 1.0, 4.46, 0.32, C.rose);
T(s, "↓ Lymphopenia < 1.0 ×10³/µL",
5.2, 1.0, 4.26, 0.32,
{ fontSize: 11, bold: true, color: C.white });
tbl2(s, "Category", "Examples",
[
["Immunodeficiency", "HIV/AIDS, DiGeorge syndrome, SCID"],
["Adrenocortical excess","Cushing's, high-dose corticosteroids"],
["Cytotoxic therapy", "Chemo · radiation (most radiosensitive WBC)"],
["Advanced malignancy", "Lymphomas, advanced carcinomas"],
["Other", "Anorexia nervosa, impaired intestinal lymphatics"],
],
5.1, 1.35, 4.46, C.rose, 0.285
);
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 7 — MONOCYTES & EOSINOPHILS
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Monocytes & Eosinophils");
// ── Monocytes ──
R(s, PAD, 1.0, 4.5, 0.32, C.forest);
T(s, "Monocytosis > 1.0 ×10³/µL",
PAD + 0.1, 1.0, 4.3, 0.32,
{ fontSize: 11, bold: true, color: C.white });
tbl2(s, "Category", "Examples",
[
["Infections", "TB · brucellosis · SBE · Listeria · protozoa"],
["Hematologic", "AML-M5, AML-M4, MDS"],
["Inflammatory", "SLE, IBD, sarcoidosis"],
["Recovery", "Post-chemo; monocytes recover before neutrophils"],
],
PAD, 1.35, 4.5, C.emerald, 0.285
);
note(s, "Listeria → monocyte-predominant response, especially in neonates.", 2.9, "★");
T(s, "Monocytopenia: onset of steroids | hairy cell leukaemia (classic)",
PAD, 3.4, 4.5, 0.3,
{ fontSize: 9.5, color: C.muted, italic: true });
// ── Eosinophils ──
R(s, 5.1, 1.0, 4.46, 0.32, C.sky);
T(s, "Eosinophilia > 0.4 ×10³/µL",
5.2, 1.0, 4.26, 0.32,
{ fontSize: 11, bold: true, color: C.white });
const eSev = [
["Mild 0.4–1.5", C.mint, C.forest],
["Moderate 1.5–5", C.goldLight, C.forest],
["Severe > 5.0 ⚠", C.roseLight, C.rose],
];
const esw = 4.46 / 3;
eSev.forEach(([lbl, bg, tc], i) => {
R(s, 5.1 + i * esw, 1.35, esw, 0.3, bg, { line: { color: C.ghost, width: 0.5 } });
T(s, lbl, 5.1 + i * esw + 0.06, 1.35, esw - 0.08, 0.3,
{ fontSize: 9.5, bold: true, color: tc, align: "center" });
});
tbl2(s, "Category", "Examples",
[
["Allergic", "Asthma, hay fever, urticaria, atopic dermatitis"],
["Parasitic", "Tissue-invasive helminths (Ascaris, hookworm, Toxocara)"],
["Neoplastic", "CML · Hodgkin lymphoma · eosinophilic leukemia"],
["Other", "Addison disease · Löffler syndrome · drug reactions"],
],
5.1, 1.7, 4.46, C.sky, 0.285
);
T(s, "Eosinopenia: acute stress | Cushing's | corticosteroids",
5.1, 3.7, 4.46, 0.3,
{ fontSize: 9.5, color: C.muted, italic: true });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 8 — BASOPHILS
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Basophils", "BASOPHILS");
R(s, PAD, 1.0, IW, 0.32, C.forest);
T(s, "Basophilia > 0.1 ×10³/µL",
PAD + 0.1, 1.0, IW - 0.2, 0.32,
{ fontSize: 12, bold: true, color: C.white });
tbl2(s, "Category", "Basophilia Causes",
[
["Hematologic (most specific)", "CML (very characteristic) · polycythemia vera · myeloid metaplasia"],
["Inflammatory / allergic", "Hypersensitivity reactions · chronic sinusitis"],
["Endocrine", "Hypothyroidism"],
["Other", "Chronic hemolytic anemia · splenectomy · ionizing radiation"],
],
PAD, 1.36, IW
);
note(s, "Basophilia + neutrophilia + eosinophilia = suspect CML immediately. Send BCR-ABL / Philadelphia chromosome testing.", 2.76);
R(s, PAD, 3.26, IW, 0.32, C.muted);
T(s, "Basopenia: Sustained glucocorticoids | Acute infection / stress | Hyperthyroidism",
PAD + 0.1, 3.26, IW - 0.2, 0.32,
{ fontSize: 11, bold: true, color: C.white });
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 9 — QUICK PATTERN RECOGNITION
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Quick Pattern Recognition", "CLINICAL PEARLS");
tbl2(s, "DLC Pattern", "First Diagnosis to Suspect",
[
["Neutrophilia + left shift + toxic changes", "Bacterial infection / sepsis"],
["Neutrophilia alone, no toxic changes", "Physiologic stress or corticosteroids"],
["Neutropenia, no toxic changes", "Drug-induced · PIH · immune-mediated"],
["Lymphocytosis + atypical lymphocytes", "EBV infectious mononucleosis"],
["Lymphocytosis + mature small lymphocytes", "CLL (chronic lymphocytic leukaemia)"],
["Eosinophilia (mild–moderate)", "Allergy / atopic disease"],
["Eosinophilia (marked > 5 ×10³/µL)", "Tissue-invasive parasites"],
["Basophilia", "CML — until proven otherwise"],
["Monocytosis", "TB · chronic infection · AML-M5"],
["Lymphopenia", "HIV/AIDS · corticosteroids · radiation"],
["Pancytopenia", "Aplastic anemia · marrow infiltration · megaloblastic anemia"],
["Neutrophilia + basophilia + eosinophilia", "CML (leukemoid reaction if BCR-ABL negative)"],
],
PAD, 1.0, IW, C.forest, 0.275
);
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 10 — DISEASE PATTERNS
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "DLC Patterns in Specific Diseases", "DIAGNOSIS");
tbl2(s, "Disease", "Classic DLC Pattern",
[
["Bacterial sepsis", "Neutrophilia + left shift + toxic granulation + Döhle bodies"],
["EBV mononucleosis", "Lymphocytosis with atypical (reactive) lymphocytes"],
["CML", "Neutrophilia + basophilia + eosinophilia; BCR-ABL positive"],
["CLL", "Mature small lymphocytosis; smudge cells on blood film"],
["Pertussis", "Lymphocytosis (unusually, for a bacterial infection)"],
["HIV/AIDS", "Lymphopenia (CD4+ depletion) + neutropenia"],
["Felty syndrome", "Neutropenia + RA + splenomegaly"],
["B12 / folate deficiency", "Hypersegmented neutrophils; pancytopenia; macrocytic anemia"],
["Cushing's syndrome", "Neutrophilia + lymphopenia + eosinopenia"],
["Addison's disease", "Eosinophilia + lymphocytosis + neutropenia"],
["Listeria (neonates)", "Monocyte-predominant response"],
["Tuberculosis", "Lymphocytosis or monocytosis; possible neutropenia"],
],
PAD, 1.0, IW, C.forest, 0.275
);
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 11 — KEY FORMULAS & SOURCES
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
chrome(s, "Key Formulas & References", "SUMMARY");
const fw = (IW - 0.24) / 2;
// Formula cards
[
["Absolute Cell Count", "Total WBC × (% cell type ÷ 100)", C.mint, C.forest],
["Corrected WBC (nRBCs)", "WBC × 100 ÷ (100 + nRBCs per 100 WBCs)", C.goldLight, C.forest],
].forEach(([title, formula, bg, tc], i) => {
// Shadow
R(s, PAD + i * (fw + 0.24) + 0.04, 1.04, fw, 1.1, C.ash);
// Card
R(s, PAD + i * (fw + 0.24), 1.0, fw, 1.1, bg, { line: { color: C.ghost, width: 1 } });
R(s, PAD + i * (fw + 0.24), 1.0, fw, 0.08, C.gold); // top gold bar
T(s, title, PAD + i * (fw + 0.24) + 0.12, 1.14, fw - 0.24, 0.32,
{ fontSize: 12, bold: true, color: tc });
T(s, formula, PAD + i * (fw + 0.24) + 0.12, 1.5, fw - 0.24, 0.5,
{ fontSize: 13, color: C.ink, italic: true, align: "center" });
});
// Sources
R(s, PAD, 2.25, IW, 0.32, C.forest);
T(s, "References", PAD + 0.1, 2.25, IW - 0.2, 0.32,
{ fontSize: 12, bold: true, color: C.white });
const refs = [
"Henry's Clinical Diagnosis and Management by Laboratory Methods, 23rd edition",
"Goldman-Cecil Medicine (International Edition)",
"Textbook of Family Medicine, 9th edition",
"Tietz Textbook of Laboratory Medicine, 7th edition",
"Quick Compendium of Clinical Pathology, 5th edition",
];
refs.forEach((r, i) => {
T(s, `${i + 1}. ${r}`, PAD + 0.06, 2.62 + i * 0.28, IW - 0.12, 0.26,
{ fontSize: 9.5, color: C.muted, italic: true });
});
}
// ─────────────────────────────────────────────────────────────────────────────
// SLIDE 12 — CLOSING
// ─────────────────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
s.background = { color: C.forest };
// Decorative elements
R(s, 0, 0, SW, 0.1, C.gold);
R(s, 0, SH - 0.1, SW, 0.1, C.gold);
R(s, 0, 0.1, 0.12, SH - 0.2, C.emerald);
T(s, "Thank You", 0.5, 0.7, SW - 1, 2.0,
{ fontSize: 68, bold: true, color: C.white, align: "center" });
R(s, 2.5, 2.8, SW - 5, 0.07, C.gold);
T(s, "DLC Study Guide — Differential Leukocyte Count: Normal vs. Abnormal Patterns",
0.5, 2.95, SW - 1, 0.5,
{ fontSize: 15, color: C.goldMid, align: "center" });
T(s, "For educational purposes only | Always verify clinical decisions against current guidelines",
0.5, 4.9, SW - 1, 0.35,
{ fontSize: 10, color: C.muted, align: "center", italic: true });
}
// ─────────────────────────────────────────────────────────────────────────────
// WRITE
// ─────────────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide_v3.pptx" })
.then(() => console.log("Done"))
.catch(e => { console.error(e); process.exit(1); });
cd /home/daytona/workspace/dlc-study-guide && node generate_pptx_v3.js 2>&1 | grep -v '"none"'
python3 -c " import zipfile, os path = '/home/daytona/workspace/dlc-study-guide/DLC_Study_Guide_v3.pptx' z = zipfile.ZipFile(path) slides = [n for n in z.namelist() if n.startswith('ppt/slides/slide') and '_rels' not in n] print(f'Slides: {len(slides)} | Size: {os.path.getsize(path):,} bytes') "
DLC Study Guide v3
Presentation · PPTX
| Element | What changed |
|---|---|
| Title slide | Large "DLC" type with gold rule, "WBC" watermark, left panel split — cinematic feel |
| Header bar | Deep forest green + warm gold underline stripe on every content slide |
| Cards | Subtle drop shadows on all cards and tables for depth |
| Severity badges | Styled with drop shadow + gold bottom edge for polish |
| Callout notes | Gold left-icon block + pale gold background instead of plain teal |
| Tables | Alternating white / soft mint rows with thin grey borders, shadow behind each table |
| Closing slide | Gold top + bottom border, large "Thank You" centred |
| Color discipline | Forest green dominant · gold as the single accent · rose only for danger · sky blue for secondary cells |
| Typography | Controlled hierarchy: 21pt headers · 12pt body · 9–10pt table cells — nothing competing |