I have to give presentation lecture on Autoimmune hemolytic Anemia in my department and I want you to make 20 pages ppt of it... And tak refrence from Harrison textbook of medicine....make it in easier language and prepare proper chart and table pattern
ls /home/daytona/workspace/ && mkdir -p /home/daytona/workspace/aiha-ppt
~/aiha-ppt/aiha_ppt.js
const pptxgen = require("pptxgenjs");
let pres = new pptxgen();
pres.layout = 'LAYOUT_16x9';
pres.author = 'Department Lecture';
pres.title = 'Autoimmune Hemolytic Anemia';
// ─── Color Palette ───────────────────────────────────────────────
const C = {
darkBlue: "0D1F4E", // dominant dark
midBlue: "1A3A8F", // header bars
accent: "E8392A", // accent red (blood theme)
lightBlue: "D6E4F7", // light background panels
white: "FFFFFF",
offWhite: "F4F8FF",
yellow: "FFD700",
green: "1A7A4A",
lightGreen: "D4F1E4",
orange: "E67E22",
lightOrange:"FDE9D0",
gray: "5A6472",
lightGray: "EAEEF5",
tableHead: "1A3A8F",
tableAlt: "EEF4FF",
};
// ─── Helper: add header bar ───────────────────────────────────────
function addHeader(slide, title, subtitle) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.1,
fill: { color: C.midBlue }, line: { type: "none" }
});
slide.addText(title, {
x: 0.3, y: 0.05, w: 9.4, h: 0.65,
fontSize: 26, bold: true, color: C.white, fontFace: "Calibri", margin: 0
});
if (subtitle) {
slide.addText(subtitle, {
x: 0.3, y: 0.7, w: 9.4, h: 0.38,
fontSize: 13, color: "B8D0F8", fontFace: "Calibri", italic: true, margin: 0
});
}
}
// ─── Helper: footer ──────────────────────────────────────────────
function addFooter(slide, text) {
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 5.35, w: 10, h: 0.275,
fill: { color: C.darkBlue }, line: { type: "none" }
});
slide.addText(text || "Reference: Harrison's Principles of Internal Medicine 22E (2025)", {
x: 0.2, y: 5.37, w: 9.6, h: 0.22,
fontSize: 8, color: "99BBEE", fontFace: "Calibri", margin: 0
});
}
// ─── Helper: section label pill ─────────────────────────────────
function addPill(slide, label, x, y, w, color) {
slide.addShape(pres.ShapeType.roundRect, {
x, y, w: w || 2.5, h: 0.32,
fill: { color: color || C.accent }, line: { type: "none" },
rectRadius: 0.1
});
slide.addText(label, {
x, y, w: w || 2.5, h: 0.32,
fontSize: 10, bold: true, color: C.white, align: "center", margin: 0
});
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE SLIDE
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
// Full dark background
s.background = { color: C.darkBlue };
// Large red accent bar
s.addShape(pres.ShapeType.rect, {
x: 0, y: 2.3, w: 10, h: 0.08, fill: { color: C.accent }, line: { type: "none" }
});
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 0.18, h: 5.625, fill: { color: C.accent }, line: { type: "none" }
});
s.addText("AUTOIMMUNE\nHEMOLYTIC ANEMIA", {
x: 0.5, y: 0.55, w: 9.2, h: 1.65,
fontSize: 46, bold: true, color: C.white, fontFace: "Calibri",
align: "left", valign: "middle", charSpacing: 2
});
s.addText("AIHA", {
x: 0.5, y: 2.4, w: 2, h: 0.45,
fontSize: 20, bold: true, color: C.accent, fontFace: "Calibri", margin: 0
});
s.addText([
{ text: "A Comprehensive Departmental Lecture", options: { breakLine: true } },
{ text: "Based on Harrison's Principles of Internal Medicine 22E (2025)", options: { breakLine: false } }
], {
x: 0.5, y: 2.9, w: 8.5, h: 0.75,
fontSize: 14, color: "B0C8EE", fontFace: "Calibri", italic: true
});
s.addText([
{ text: "Topics Covered: ", options: { bold: true, color: C.yellow } },
{ text: "Definition • Pathophysiology • Classification • Clinical Features • Diagnosis • Treatment", options: { color: "C0D8F8" } }
], {
x: 0.5, y: 3.75, w: 9.2, h: 0.45,
fontSize: 12, fontFace: "Calibri"
});
s.addShape(pres.ShapeType.ellipse, {
x: 7.5, y: 0.4, w: 2.3, h: 2.3,
fill: { color: "1A2E6E" }, line: { color: "2A4A9A", pt: 2 }
});
s.addText("🩸", { x: 8.0, y: 1.0, w: 1.4, h: 1.1, fontSize: 52, align: "center" });
addFooter(s, "Harrison's Principles of Internal Medicine 22E (2025) | Department Grand Rounds");
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 2 — OVERVIEW / TABLE OF CONTENTS
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Lecture Overview", "What We Will Cover Today");
const topics = [
["01", "Definition & Introduction", C.midBlue],
["02", "Normal Red Cell Survival & Hemolysis Basics", C.midBlue],
["03", "Classification of AIHA", C.accent],
["04", "Pathophysiology — Warm Antibody AIHA", C.accent],
["05", "Pathophysiology — Cold Agglutinin Disease (CAD)", C.accent],
["06", "Causes & Associated Conditions", C.green],
["07", "Clinical Features", C.green],
["08", "Laboratory Investigations", C.orange],
["09", "Direct Antiglobulin (Coombs) Test — Deep Dive", C.orange],
["10", "Peripheral Blood Smear Findings", C.orange],
];
const topics2 = [
["11", "Differential Diagnosis", C.midBlue],
["12", "Drug-Induced Immune Hemolytic Anemia", C.midBlue],
["13", "Paroxysmal Cold Hemoglobinuria (PCH)", C.accent],
["14", "Treatment — Warm AIHA (First Line)", C.green],
["15", "Treatment — Warm AIHA (Second & Third Line)", C.green],
["16", "Treatment — Cold Agglutinin Disease", C.green],
["17", "Blood Transfusion in AIHA", C.orange],
["18", "Monitoring & Follow-Up", C.orange],
["19", "Key Points Summary", C.midBlue],
["20", "References & Further Reading", C.gray],
];
topics.forEach((t, i) => {
const row = Math.floor(i / 1);
s.addShape(pres.ShapeType.roundRect, {
x: 0.25, y: 1.18 + i * 0.4, w: 4.4, h: 0.34,
fill: { color: C.lightBlue }, line: { color: t[2], pt: 1 }, rectRadius: 0.06
});
s.addText(t[0], {
x: 0.28, y: 1.18 + i * 0.4, w: 0.38, h: 0.34,
fontSize: 10, bold: true, color: C.white, align: "center",
fill: { color: t[2] }, margin: 0
});
s.addText(t[1], {
x: 0.72, y: 1.18 + i * 0.4, w: 3.9, h: 0.34,
fontSize: 10.5, color: C.darkBlue, fontFace: "Calibri", margin: 0, valign: "middle"
});
});
topics2.forEach((t, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: 5.1, y: 1.18 + i * 0.4, w: 4.6, h: 0.34,
fill: { color: C.lightBlue }, line: { color: t[2], pt: 1 }, rectRadius: 0.06
});
s.addText(t[0], {
x: 5.13, y: 1.18 + i * 0.4, w: 0.38, h: 0.34,
fontSize: 10, bold: true, color: C.white, align: "center",
fill: { color: t[2] }, margin: 0
});
s.addText(t[1], {
x: 5.57, y: 1.18 + i * 0.4, w: 4.1, h: 0.34,
fontSize: 10.5, color: C.darkBlue, fontFace: "Calibri", margin: 0, valign: "middle"
});
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 3 — DEFINITION & INTRODUCTION
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Definition & Introduction", "What Is Autoimmune Hemolytic Anemia?");
// Definition box
s.addShape(pres.ShapeType.roundRect, {
x: 0.3, y: 1.2, w: 9.4, h: 1.1,
fill: { color: C.lightBlue }, line: { color: C.midBlue, pt: 2 }, rectRadius: 0.12
});
s.addText([
{ text: "DEFINITION: ", options: { bold: true, color: C.accent } },
{ text: "Autoimmune Hemolytic Anemia (AIHA) is a condition in which the immune system produces antibodies against the body's own red blood cells, leading to their premature destruction (hemolysis).", options: { color: C.darkBlue } }
], {
x: 0.5, y: 1.25, w: 9.0, h: 1.0,
fontSize: 13.5, fontFace: "Calibri"
});
// Key facts in 3 boxes
const facts = [
["Antibody Type", "Mainly IgG (warm) or IgM (cold)"],
["Hemolysis Site", "Spleen (extravascular) or vessels (intravascular)"],
["Diagnosis", "Positive Direct Antiglobulin (Coombs) Test"],
];
facts.forEach((f, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: 0.3 + i * 3.22, y: 2.45, w: 3.0, h: 1.2,
fill: { color: C.white }, line: { color: C.midBlue, pt: 1.5 }, rectRadius: 0.1
});
s.addShape(pres.ShapeType.rect, {
x: 0.3 + i * 3.22, y: 2.45, w: 3.0, h: 0.38,
fill: { color: C.midBlue }, line: { type: "none" }
});
s.addText(f[0], {
x: 0.3 + i * 3.22, y: 2.45, w: 3.0, h: 0.38,
fontSize: 11, bold: true, color: C.white, align: "center", margin: 0
});
s.addText(f[1], {
x: 0.38 + i * 3.22, y: 2.87, w: 2.84, h: 0.75,
fontSize: 12, color: C.darkBlue, align: "center", valign: "middle"
});
});
// Bottom note
s.addText([
{ text: "Important: ", options: { bold: true, color: C.accent } },
{ text: "AIHA may be primary (idiopathic) or secondary to infections, autoimmune diseases, lymphoproliferative disorders, or drugs. Severity ranges from mild compensated anemia to life-threatening hemolysis.", options: {} }
], {
x: 0.3, y: 3.78, w: 9.4, h: 0.72,
fontSize: 12, color: C.darkBlue, fontFace: "Calibri",
fill: { color: C.lightGreen }, line: { color: C.green, pt: 1 }, margin: 6
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 4 — NORMAL RBC SURVIVAL & HEMOLYSIS BASICS
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Normal RBC Survival & Hemolysis", "Understanding the Basics First");
const rows = [
[{ text: "Parameter", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Normal Value", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "In AIHA", options: { bold: true, color: C.white, fill: { color: C.tableHead } } }],
["RBC Lifespan", "~120 days", "Markedly reduced (days to weeks)"],
["Haptoglobin", "Normal (binds free Hb)", "Low / Absent (consumed)"],
["LDH", "Normal", "Elevated (cell destruction)"],
["Reticulocytes", "0.5–1.5%", "Elevated (compensatory)"],
["Bilirubin (unconjugated)", "Normal", "Elevated → Jaundice"],
["Urine Urobilinogen", "Trace", "Elevated"],
["Direct Coombs Test", "Negative", "POSITIVE (key finding)"],
];
s.addTable(rows, {
x: 0.3, y: 1.2, w: 9.4, h: 3.3,
border: { pt: 1, color: "C0CDE0" },
colW: [3.0, 2.8, 3.6],
rowH: 0.39,
fontFace: "Calibri",
fontSize: 12,
align: "left",
fill: { color: C.white },
color: C.darkBlue,
});
s.addText("★ Reticulocytosis indicates the bone marrow is working harder to compensate for the loss of red cells.", {
x: 0.3, y: 4.62, w: 9.4, h: 0.45,
fontSize: 11, color: C.green, italic: true, fontFace: "Calibri"
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 5 — CLASSIFICATION TABLE
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Classification of AIHA", "Harrison's Table 105-6: Acquired Immune Hemolytic Anemias");
const rows = [
[
{ text: "Type", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "WARM AIHA (IgG, 37°C)", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "COLD Agglutinin Disease (IgM, 4–30°C)", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
],
["Primary", "Idiopathic AIHA", "Idiopathic CAD"],
["Viral Infection", "HIV, HCV, EBV, Parvovirus B19", "EBV, CMV"],
["Other Infection", "Babesia", "Mycoplasma pneumoniae, PCH"],
["Autoimmune Disease", "SLE, RA, Scleroderma, IBD, Thyroiditis", "Rare"],
["Lymphoproliferative", "CLL, Lymphoma, Multiple Myeloma", "Waldenström's, Lymphoma"],
["Drugs", "Cefotetan, Ceftriaxone, Piperacillin,\nMethyldopa, Fludarabine", "Lenalidomide (minority)"],
["Other", "After HSCT, Immune checkpoint inhibitors\n(Nivolumab)", "Pregnancy"],
];
s.addTable(rows, {
x: 0.2, y: 1.15, w: 9.6, h: 3.7,
border: { pt: 1, color: "C0CDE0" },
colW: [1.8, 3.9, 3.9],
rowH: 0.41,
fontFace: "Calibri",
fontSize: 10.5,
align: "left",
color: C.darkBlue,
});
s.addText("PCH = Paroxysmal Cold Hemoglobinuria | CLL = Chronic Lymphocytic Leukemia | HSCT = Hematopoietic Stem Cell Transplant", {
x: 0.2, y: 4.97, w: 9.6, h: 0.3,
fontSize: 8.5, color: C.gray, italic: true
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 6 — PATHOPHYSIOLOGY: WARM AIHA
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Pathophysiology — Warm Antibody AIHA", "How IgG Destroys Red Cells");
// Flow diagram — boxes + arrows
const steps = [
{ x: 0.3, y: 1.25, label: "Dysregulation\nof Immunity", color: C.midBlue },
{ x: 2.65, y: 1.25, label: "IgG Autoantibody\nProduction (polyclonal)", color: C.midBlue },
{ x: 5.1, y: 1.25, label: "IgG Binds RBC\n(Rhesus antigen)", color: C.accent },
{ x: 7.55, y: 1.25, label: "Fc recognized by\nMacrophage FcR", color: C.accent },
];
steps.forEach((st, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: st.x, y: st.y, w: 2.2, h: 0.85,
fill: { color: st.color }, line: { type: "none" }, rectRadius: 0.1
});
s.addText(st.label, {
x: st.x, y: st.y, w: 2.2, h: 0.85,
fontSize: 10.5, bold: true, color: C.white, align: "center", valign: "middle"
});
if (i < steps.length - 1) {
s.addShape(pres.ShapeType.line, {
x: st.x + 2.22, y: st.y + 0.42, w: 0.4, h: 0,
line: { color: C.darkBlue, pt: 2, endArrowType: "arrow" }
});
}
});
// Second row
const steps2 = [
{ x: 7.55, y: 2.25, label: "Erythrophagocytosis\nin SPLEEN (mainly)", color: C.green },
{ x: 5.1, y: 2.25, label: "Spherocyte\nFormation", color: C.orange },
{ x: 2.65, y: 2.25, label: "Hemolysis\n(Extravascular)", color: C.accent },
{ x: 0.3, y: 2.25, label: "↓ RBC ↑ Bili\n↑ LDH ↑ Retic", color: C.darkBlue },
];
// Down arrow
s.addShape(pres.ShapeType.line, {
x: 8.65, y: 2.1, w: 0, h: 0.14,
line: { color: C.darkBlue, pt: 2, endArrowType: "arrow" }
});
steps2.forEach((st, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: st.x, y: st.y, w: 2.2, h: 0.85,
fill: { color: st.color }, line: { type: "none" }, rectRadius: 0.1
});
s.addText(st.label, {
x: st.x, y: st.y, w: 2.2, h: 0.85,
fontSize: 10.5, bold: true, color: C.white, align: "center", valign: "middle"
});
if (i < steps2.length - 1) {
s.addShape(pres.ShapeType.line, {
x: st.x - 0.02, y: st.y + 0.42, w: -0.4, h: 0,
line: { color: C.darkBlue, pt: 2, endArrowType: "arrow" }
});
}
});
// Key points below
s.addText([
{ text: "Key Points:\n", options: { bold: true, color: C.accent, breakLine: true } },
{ text: "• Antibody reacts optimally at 37°C (warm antibody)\n", options: { breakLine: true } },
{ text: "• Mainly IgG, usually Rhesus-specific\n", options: { breakLine: true } },
{ text: "• Spleen is the MAIN site of destruction (also liver and bone marrow)\n", options: { breakLine: true } },
{ text: "• Partial phagocytosis → spherocyte formation", options: {} },
], {
x: 0.3, y: 3.2, w: 9.4, h: 1.4,
fontSize: 12, color: C.darkBlue, fontFace: "Calibri",
fill: { color: C.lightBlue }, line: { color: C.midBlue, pt: 1 }, margin: 8
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 7 — PATHOPHYSIOLOGY: COLD AGGLUTININ DISEASE
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Cold Agglutinin Disease (CAD)", "Pathophysiology of IgM-Mediated Hemolysis");
// Two column layout
// Left — warm vs cold comparison
s.addShape(pres.ShapeType.rect, {
x: 0.25, y: 1.15, w: 4.5, h: 0.38, fill: { color: C.midBlue }, line: { type: "none" }
});
s.addText("WARM AIHA vs COLD Agglutinin Disease", {
x: 0.25, y: 1.15, w: 4.5, h: 0.38,
fontSize: 11, bold: true, color: C.white, align: "center", margin: 0
});
const comp = [
["Feature", "WARM AIHA", "CAD"],
["Antibody", "IgG (polyclonal)", "IgM (monoclonal)"],
["Optimal Temp", "37°C", "4–30°C"],
["Antigen", "Rhesus", "I antigen"],
["Hemolysis Type", "Extravascular\n(Spleen)", "Both Intra +\nExtravascular (Liver)"],
["B cells", "Polyclonal", "Monoclonal clone"],
["Gene mutation", "—", "KMT2D mutation"],
];
s.addTable(comp, {
x: 0.25, y: 1.53, w: 4.5, h: 3.0,
border: { pt: 1, color: "C0CDE0" },
colW: [1.3, 1.6, 1.6],
rowH: 0.37,
fontFace: "Calibri", fontSize: 10.5,
color: C.darkBlue,
});
// Right panel
s.addShape(pres.ShapeType.rect, {
x: 5.0, y: 1.15, w: 4.7, h: 0.38, fill: { color: C.accent }, line: { type: "none" }
});
s.addText("How CAD Causes Hemolysis", {
x: 5.0, y: 1.15, w: 4.7, h: 0.38,
fontSize: 11, bold: true, color: C.white, align: "center", margin: 0
});
const cadSteps = [
["1", "IgM antibody binds RBC in COLD parts of body (extremities)", C.midBlue],
["2", "IgM activates COMPLEMENT cascade (Classical pathway)", C.accent],
["3", "Membrane Attack Complex (MAC) → Intravascular Hemolysis + Hemoglobinuria", C.accent],
["4", "C3b opsonization → Extravascular Hemolysis in LIVER (Kupffer cells)", C.green],
["5", "Titer may be very high (up to 1:100,000)", C.orange],
];
cadSteps.forEach((cs, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: 5.1, y: 1.6 + i * 0.58, w: 4.5, h: 0.5,
fill: { color: cs[2] }, line: { type: "none" }, rectRadius: 0.08
});
s.addText(cs[0], {
x: 5.1, y: 1.6 + i * 0.58, w: 0.38, h: 0.5,
fontSize: 14, bold: true, color: C.yellow, align: "center", valign: "middle", margin: 0
});
s.addText(cs[1], {
x: 5.52, y: 1.6 + i * 0.58, w: 4.05, h: 0.5,
fontSize: 10.5, color: C.white, valign: "middle", margin: 4
});
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 8 — CAUSES & ASSOCIATED CONDITIONS
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Causes & Associated Conditions", "When Should You Look for an Underlying Disease?");
const cats = [
{ title: "Infections", color: C.accent, items: ["EBV (Epstein-Barr Virus)", "CMV (Cytomegalovirus)", "HIV, HCV", "Mycoplasma pneumoniae", "Parvovirus B19"] },
{ title: "Autoimmune Diseases", color: C.midBlue, items: ["Systemic Lupus Erythematosus (SLE) ★", "Rheumatoid Arthritis", "Scleroderma", "Inflammatory Bowel Disease", "Hashimoto's Thyroiditis"] },
{ title: "Blood Cancers", color: C.green, items: ["Chronic Lymphocytic Leukemia (CLL) ★", "Lymphomas", "Multiple Myeloma", "Waldenström's Macroglobulinemia", "After Bone Marrow Transplant"] },
{ title: "Drugs", color: C.orange, items: ["Cefotetan / Ceftriaxone ★", "Piperacillin", "Fludarabine / Bendamustine", "Methyldopa (historical)", "Immune checkpoint inhibitors (Nivolumab)"] },
];
cats.forEach((cat, i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.25 + col * 4.9;
const y = 1.15 + row * 1.95;
s.addShape(pres.ShapeType.roundRect, {
x, y, w: 4.6, h: 1.85,
fill: { color: C.white }, line: { color: cat.color, pt: 2 }, rectRadius: 0.1
});
s.addShape(pres.ShapeType.rect, {
x, y, w: 4.6, h: 0.38, fill: { color: cat.color }, line: { type: "none" }
});
s.addText(cat.title, {
x, y, w: 4.6, h: 0.38,
fontSize: 12, bold: true, color: C.white, align: "center", margin: 0
});
cat.items.forEach((item, j) => {
s.addText("• " + item, {
x: x + 0.12, y: y + 0.42 + j * 0.28, w: 4.38, h: 0.28,
fontSize: 10.5, color: C.darkBlue, fontFace: "Calibri"
});
});
});
s.addText("★ = Most Common Associations | SLE may present FIRST as AIHA before other manifestations appear", {
x: 0.25, y: 5.18, w: 9.5, h: 0.25,
fontSize: 8.5, color: C.gray, italic: true
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 9 — CLINICAL FEATURES
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Clinical Features", "What Does the Patient Present With?");
// Left panel — symptoms
s.addShape(pres.ShapeType.rect, {
x: 0.25, y: 1.15, w: 4.5, h: 0.4, fill: { color: C.accent }, line: { type: "none" }
});
s.addText("Symptoms (Patient Complaints)", {
x: 0.25, y: 1.15, w: 4.5, h: 0.4,
fontSize: 12, bold: true, color: C.white, align: "center", margin: 0
});
const symptoms = [
["Fatigue & Weakness", "Due to anemia (↓ O₂ delivery)"],
["Pallor", "Pale skin, mucous membranes"],
["Jaundice (Icterus)", "↑ Unconjugated bilirubin"],
["Shortness of Breath", "Especially on exertion"],
["Palpitations", "Compensatory tachycardia"],
["Dark Urine", "Hemoglobinuria (intravascular)"],
["Cold sensitivity", "Especially in CAD — Raynaud's phenomenon"],
];
symptoms.forEach(([sym, exp], i) => {
const bg = i % 2 === 0 ? C.white : C.lightBlue;
s.addShape(pres.ShapeType.rect, {
x: 0.25, y: 1.57 + i * 0.47, w: 4.5, h: 0.45, fill: { color: bg }, line: { type: "none" }
});
s.addText(sym, {
x: 0.35, y: 1.57 + i * 0.47, w: 2.1, h: 0.45,
fontSize: 10.5, bold: true, color: C.darkBlue, valign: "middle", margin: 0
});
s.addText(exp, {
x: 2.5, y: 1.57 + i * 0.47, w: 2.2, h: 0.45,
fontSize: 10, color: C.gray, valign: "middle", margin: 0, italic: true
});
});
// Right panel — signs
s.addShape(pres.ShapeType.rect, {
x: 5.05, y: 1.15, w: 4.7, h: 0.4, fill: { color: C.midBlue }, line: { type: "none" }
});
s.addText("Signs (Examination Findings)", {
x: 5.05, y: 1.15, w: 4.7, h: 0.4,
fontSize: 12, bold: true, color: C.white, align: "center", margin: 0
});
const signs = [
["Splenomegaly", "Enlarged spleen (main destruction site)"],
["Hepatomegaly", "Liver involvement in CAD"],
["Pallor", "Conjunctival, palmar"],
["Scleral Icterus", "Yellow sclera from ↑ bilirubin"],
["Tachycardia", "Heart working harder"],
["Acrocyanosis", "In cold agglutinin disease"],
["Lymphadenopathy", "If secondary to lymphoma/CLL"],
];
signs.forEach(([sign, exp], i) => {
const bg = i % 2 === 0 ? C.white : C.lightBlue;
s.addShape(pres.ShapeType.rect, {
x: 5.05, y: 1.57 + i * 0.47, w: 4.7, h: 0.45, fill: { color: bg }, line: { type: "none" }
});
s.addText(sign, {
x: 5.15, y: 1.57 + i * 0.47, w: 2.1, h: 0.45,
fontSize: 10.5, bold: true, color: C.darkBlue, valign: "middle", margin: 0
});
s.addText(exp, {
x: 7.3, y: 1.57 + i * 0.47, w: 2.4, h: 0.45,
fontSize: 10, color: C.gray, valign: "middle", margin: 0, italic: true
});
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 10 — LABORATORY INVESTIGATIONS
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Laboratory Investigations", "Step-by-Step Workup of Suspected AIHA");
const rows = [
[
{ text: "Investigation", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Expected Finding in AIHA", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Significance", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
],
["CBC (Complete Blood Count)", "↓ Hemoglobin, ↑ MCV (macrocytosis)", "Confirms anemia; reticulocytosis raises MCV"],
["Reticulocyte Count", "↑ (>2.5%) Reticulocytosis", "Bone marrow responding to hemolysis"],
["Peripheral Blood Smear", "Spherocytes, polychromasia, nucleated RBCs", "Microspherocytes = classic for AIHA"],
["Direct Antiglobulin Test (DAT)", "POSITIVE — IgG ± C3", "Gold standard diagnostic test"],
["Indirect Antiglobulin Test", "May be positive (free antibody in serum)", "Detects circulating alloantibodies"],
["LDH (Lactate Dehydrogenase)", "↑ Elevated", "Marker of cell destruction"],
["Haptoglobin", "↓ Low or absent", "Consumed by free hemoglobin"],
["Bilirubin (Total & Direct)", "↑ Indirect (unconjugated) bilirubin", "From RBC breakdown"],
["Urine Hemoglobin/Hemosiderin", "Present in intravascular hemolysis", "Hemoglobinuria in CAD/PCH"],
["Cold Agglutinin Titer", "↑ (>1:64 at 4°C) in CAD", "Specific for cold antibody AIHA"],
];
s.addTable(rows, {
x: 0.2, y: 1.15, w: 9.6, h: 4.2,
border: { pt: 1, color: "C0CDE0" },
colW: [2.7, 3.2, 3.7],
rowH: 0.37,
fontFace: "Calibri", fontSize: 10.5,
color: C.darkBlue,
align: "left",
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 11 — COOMBS TEST DEEP DIVE
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Direct Antiglobulin (Coombs) Test", "The Most Important Test in AIHA");
// Historical note
s.addShape(pres.ShapeType.roundRect, {
x: 0.3, y: 1.15, w: 9.4, h: 0.42,
fill: { color: C.yellow }, line: { type: "none" }, rectRadius: 0.06
});
s.addText("Developed in 1945 by R.R.A. Coombs — a single test that is almost on its own diagnostic of AIHA when positive. (Harrison's, 22E)", {
x: 0.3, y: 1.15, w: 9.4, h: 0.42,
fontSize: 11, bold: true, color: C.darkBlue, align: "center", margin: 0
});
// DAT vs IAT table
const rows = [
[
{ text: "Feature", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Direct Antiglobulin Test (DAT)", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Indirect Antiglobulin Test (IAT)", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
],
["What it detects", "Antibody/complement already ON patient's RBCs", "Antibody FREE in patient's serum"],
["Method", "Wash patient RBCs + add Coombs reagent → agglutination", "Mix patient serum + donor RBCs → test"],
["Use in AIHA", "PRIMARY diagnostic test — if positive = AIHA until proven otherwise", "Supplementary — detects free antibody"],
["Sensitivity", "Positive if ≥400 IgG/C3 molecules per RBC (standard)\n≥30–40 molecules with flow cytometry", "Less sensitive"],
["Coombs Reagent", "Broad-spectrum (anti-IgG + anti-C3)", "Anti-human globulin"],
["Result in AIHA", "IgG+ alone = Warm AIHA\nC3+ alone = CAD\nIgG+ C3+ = Mixed", "May detect alloantibody (from transfusion)"],
];
s.addTable(rows, {
x: 0.25, y: 1.65, w: 9.5, h: 3.2,
border: { pt: 1, color: "C0CDE0" },
colW: [2.0, 3.75, 3.75],
rowH: 0.44,
fontFace: "Calibri", fontSize: 10,
color: C.darkBlue, align: "left",
});
s.addText("⚠ Coombs-NEGATIVE AIHA exists — when antibody affinity/avidity is very high, few molecules may still cause severe hemolysis. Do NOT dismiss AIHA just because DAT is negative if clinical picture is compelling.", {
x: 0.25, y: 4.93, w: 9.5, h: 0.42,
fontSize: 10, color: C.accent, bold: true, italic: true, fontFace: "Calibri",
fill: { color: C.lightOrange }, line: { color: C.orange, pt: 1 }, margin: 5
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 12 — PERIPHERAL BLOOD SMEAR
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Peripheral Blood Smear Findings", "What to Look for Under the Microscope");
const findings = [
{
name: "Spherocytes",
color: C.accent,
desc: "Small, round RBCs WITHOUT central pallor. Most CLASSIC finding in warm AIHA. Result of partial phagocytosis removing membrane but not volume.",
key: "★ KEY FINDING"
},
{
name: "Polychromasia",
color: C.midBlue,
desc: "Bluish-tinged larger RBCs = reticulocytes. Indicates active bone marrow response to hemolysis. Confirmed by reticulocyte count.",
key: "Compensatory Response"
},
{
name: "Nucleated RBCs",
color: C.green,
desc: "Immature RBCs released urgently from bone marrow. Seen in severe acute hemolysis as the marrow tries to compensate quickly.",
key: "Severe Hemolysis"
},
{
name: "Agglutination on smear",
color: C.orange,
desc: "RBCs clumping together. Classic for Cold Agglutinin Disease (CAD). The IgM antibody causes RBCs to stick together at room temp.",
key: "Think: CAD"
},
];
findings.forEach((f, i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.25 + col * 4.9;
const y = 1.15 + row * 1.85;
s.addShape(pres.ShapeType.roundRect, {
x, y, w: 4.6, h: 1.78,
fill: { color: C.white }, line: { color: f.color, pt: 2 }, rectRadius: 0.1
});
s.addShape(pres.ShapeType.rect, {
x, y, w: 4.6, h: 0.38, fill: { color: f.color }, line: { type: "none" }
});
s.addText(f.name + " — " + f.key, {
x, y, w: 4.6, h: 0.38,
fontSize: 11, bold: true, color: C.white, align: "center", margin: 0
});
s.addText(f.desc, {
x: x + 0.12, y: y + 0.42, w: 4.36, h: 1.3,
fontSize: 11, color: C.darkBlue, fontFace: "Calibri", valign: "top"
});
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 13 — DIFFERENTIAL DIAGNOSIS
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Differential Diagnosis", "Other Causes of Hemolytic Anemia — Harrison's Table 105-7");
const rows = [
[
{ text: "Condition", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Onset", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Mechanism", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Key Diagnostic Test", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
],
["Mismatched Blood Transfusion", "Abrupt", "ABO incompatibility", "Repeat cross-match"],
["Paroxysmal Nocturnal Hemoglobinuria (PNH)", "Chronic ± acute flares", "Complement destroys CD59(-) RBCs", "Flow cytometry for CD59"],
["Paroxysmal Cold Hemoglobinuria (PCH)", "Acute (children)", "Donath-Landsteiner IgG antibody", "Donath-Landsteiner test"],
["Septicemia (Clostridium)", "Very acute", "Exotoxins (Clostridium perfringens)", "Blood cultures"],
["Microangiopathic HA (TTP/HUS)", "Acute or chronic", "RBC fragmentation (shear)", "Smear: schistocytes; ADAMTS13"],
["Hereditary Spherocytosis", "Chronic", "Intrinsic membrane defect (spectrin)", "Osmotic fragility; EMA test"],
["G6PD Deficiency", "Episodic", "Oxidative hemolysis", "G6PD enzyme assay"],
["Favism", "Acute after fava beans", "Oxidative; G6PD-deficient RBCs", "History + G6PD assay"],
];
s.addTable(rows, {
x: 0.2, y: 1.15, w: 9.6, h: 4.0,
border: { pt: 1, color: "C0CDE0" },
colW: [2.5, 1.4, 3.0, 2.7],
rowH: 0.415,
fontFace: "Calibri", fontSize: 10,
color: C.darkBlue, align: "left",
});
s.addText("AIHA differs from most others: DAT is POSITIVE. Think AIHA when Coombs test is positive + hemolysis.", {
x: 0.2, y: 5.2, w: 9.6, h: 0.25,
fontSize: 9, color: C.green, bold: true, italic: true
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 14 — DRUG-INDUCED IMMUNE HEMOLYTIC ANEMIA
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Drug-Induced Immune Hemolytic Anemia", "A Special Category — Always Take a Drug History!");
s.addText("Three Mechanisms by Which Drugs Cause Immune Hemolysis (Harrison's 22E)", {
x: 0.3, y: 1.15, w: 9.4, h: 0.35,
fontSize: 12, bold: true, color: C.midBlue, fontFace: "Calibri"
});
const mechs = [
{
num: "1", title: "Direct Chemical Hemolysis",
color: C.midBlue,
items: [
"Drugs with oxidative potential destroy RBCs directly",
"Examples: Dapsone, Nitrates, Hyperbaric O₂, Cisplatin",
"Also non-oxidative: Arsine, Copper, Lead",
"Lead → basophilic stippling (blocks P5N enzyme)",
]
},
{
num: "2", title: "Hapten Mechanism",
color: C.accent,
items: [
"Drug acts as HAPTEN → triggers antibody production",
"Classic example: PENICILLIN (rare patients)",
"On re-exposure: RBCs caught as 'innocent bystanders'",
"Hemolysis STOPS when drug is discontinued",
]
},
{
num: "3", title: "True Autoantibody (Mimicry)",
color: C.green,
items: [
"Drug triggers antibody against a RED CELL ANTIGEN",
"Classic example: METHYLDOPA → anti-Rhesus (anti-e)",
"This is a true autoantibody → true AIHA",
"Gradually subsides after stopping the drug",
]
},
];
mechs.forEach((m, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: 0.25 + i * 3.25, y: 1.6, w: 3.1, h: 2.95,
fill: { color: C.white }, line: { color: m.color, pt: 2 }, rectRadius: 0.1
});
s.addShape(pres.ShapeType.rect, {
x: 0.25 + i * 3.25, y: 1.6, w: 3.1, h: 0.42, fill: { color: m.color }, line: { type: "none" }
});
s.addText("Mechanism " + m.num + ": " + m.title, {
x: 0.25 + i * 3.25, y: 1.6, w: 3.1, h: 0.42,
fontSize: 10.5, bold: true, color: C.white, align: "center", margin: 0
});
m.items.forEach((item, j) => {
s.addText("• " + item, {
x: 0.38 + i * 3.25, y: 2.08 + j * 0.58, w: 2.85, h: 0.54,
fontSize: 10, color: C.darkBlue, fontFace: "Calibri"
});
});
});
s.addText([
{ text: "Common Drug Culprits Today (Harrison's 22E): ", options: { bold: true, color: C.accent } },
{ text: "Cefotetan ★, Ceftriaxone ★, Piperacillin ★, Methyldopa, Fludarabine, Bendamustine, Lenalidomide, Nivolumab (immune checkpoint inhibitor)", options: {} }
], {
x: 0.25, y: 4.65, w: 9.5, h: 0.55,
fontSize: 11, color: C.darkBlue, fontFace: "Calibri",
fill: { color: C.lightOrange }, line: { color: C.orange, pt: 1 }, margin: 6
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 15 — PAROXYSMAL COLD HEMOGLOBINURIA (PCH)
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Paroxysmal Cold Hemoglobinuria (PCH)", "A Rare but Important Form of AIHA");
s.addShape(pres.ShapeType.roundRect, {
x: 0.3, y: 1.15, w: 9.4, h: 0.6,
fill: { color: C.lightBlue }, line: { color: C.midBlue, pt: 1.5 }, rectRadius: 0.08
});
s.addText("PCH is a rare form of AIHA occurring MOSTLY IN CHILDREN, usually triggered by a VIRAL INFECTION, usually SELF-LIMITED.", {
x: 0.4, y: 1.2, w: 9.2, h: 0.5,
fontSize: 12, color: C.darkBlue, fontFace: "Calibri", bold: false
});
const features = [
["Antibody", "Donath-Landsteiner IgG antibody"],
["Antigen Specificity", "Anti-P specificity"],
["Binding Temperature", "Binds RBCs at LOW temperature (4°C)"],
["Lysis Temperature", "Lysis occurs when warmed to 37°C (in presence of complement)"],
["Hemolysis Type", "INTRAVASCULAR → Hemoglobinuria"],
["Trigger", "Viral infections (most common), cold exposure"],
["Population", "Mostly children; rarely adults"],
["Diagnosis", "Donath-Landsteiner test (BIPHASIC hemolysin)"],
["Treatment", "Supportive + blood transfusion if severe; usually self-resolving"],
["Prognosis", "Recovery is the RULE — good prognosis"],
];
const rows = [
[
{ text: "Feature", options: { bold: true, color: C.white, fill: { color: C.accent } } },
{ text: "Details", options: { bold: true, color: C.white, fill: { color: C.accent } } },
],
...features.map(f => [f[0], f[1]])
];
s.addTable(rows, {
x: 0.3, y: 1.85, w: 9.4, h: 3.35,
border: { pt: 1, color: "C0CDE0" },
colW: [2.8, 6.6],
rowH: 0.31,
fontFace: "Calibri", fontSize: 11,
color: C.darkBlue, align: "left",
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 16 — TREATMENT: WARM AIHA FIRST LINE
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Treatment — Warm AIHA (First Line)", "Harrison's 22E Treatment Algorithm");
// Emergency box
s.addShape(pres.ShapeType.roundRect, {
x: 0.25, y: 1.15, w: 9.5, h: 0.6,
fill: { color: C.accent }, line: { type: "none" }, rectRadius: 0.08
});
s.addText("⚠ SEVERE ACUTE AIHA IS A MEDICAL EMERGENCY — Needs IMMEDIATE red cell transfusion even if cross-match is incompatible", {
x: 0.35, y: 1.2, w: 9.3, h: 0.5,
fontSize: 12, bold: true, color: C.white, fontFace: "Calibri"
});
const steps = [
{
step: "STEP 1",
title: "Emergency Transfusion",
color: C.accent,
detail: "If life-threatening anemia → transfuse ABO-matched but incompatible blood.\nRationale: Donor RBCs will be destroyed at same rate as patient's own RBCs, but patient stays alive.\nRequires CLOSE liaison with blood bank/serology lab."
},
{
step: "STEP 2",
title: "Prednisone (Corticosteroids)",
color: C.midBlue,
detail: "Dose: 1 mg/kg/day (e.g., 60–80 mg/day)\nResponse: Remission in ≥50% of patients promptly\nMechanism: Reduces autoantibody production + macrophage Fc receptor expression\nTaper slowly once Hb stabilizes"
},
{
step: "STEP 3",
title: "Rituximab (Anti-CD20) — Now First Line",
color: C.green,
detail: "Previously 2nd line — NOW used as first-line WITH prednisone\nDose: Low dose 100 mg/week × 4 doses\nBenefit: Significantly REDUCES RELAPSE RATE (major advantage)\nTargets: B cells producing autoantibodies"
},
];
steps.forEach((st, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: 0.25 + i * 3.25, y: 1.85, w: 3.1, h: 2.75,
fill: { color: C.white }, line: { color: st.color, pt: 2 }, rectRadius: 0.1
});
s.addShape(pres.ShapeType.rect, {
x: 0.25 + i * 3.25, y: 1.85, w: 3.1, h: 0.52, fill: { color: st.color }, line: { type: "none" }
});
s.addText(st.step + ": " + st.title, {
x: 0.25 + i * 3.25, y: 1.85, w: 3.1, h: 0.52,
fontSize: 11, bold: true, color: C.white, align: "center", valign: "middle", margin: 0
});
s.addText(st.detail, {
x: 0.38 + i * 3.25, y: 2.42, w: 2.85, h: 2.14,
fontSize: 10, color: C.darkBlue, fontFace: "Calibri", valign: "top"
});
});
s.addText("When NOT immediately life-threatening: withhold transfusion → start prednisone ± rituximab immediately.", {
x: 0.25, y: 4.7, w: 9.5, h: 0.38,
fontSize: 10.5, color: C.green, bold: true, italic: true
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 17 — TREATMENT: WARM AIHA SECOND & THIRD LINE
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Treatment — Warm AIHA (2nd & 3rd Line)", "For Relapsed or Refractory Disease");
const rows = [
[
{ text: "Line", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Treatment Option", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Mechanism / Notes", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
],
[{ text: "2nd Line", options: { bold: true, color: C.accent } },
"Splenectomy",
"Removes major hemolysis site → improves anemia. Not curative. ↑ Risk sepsis + thrombosis. Response similar to rituximab."],
[{ text: "2nd Line", options: { bold: true, color: C.accent } },
"Azathioprine",
"Immunosuppressant. Now 2nd/3rd line since rituximab era. Reduces antibody production."],
[{ text: "2nd Line", options: { bold: true, color: C.accent } },
"Cyclophosphamide / Cyclosporine / Mycophenolate",
"Immunosuppressants. Used when rituximab and splenectomy fail."],
[{ text: "2nd Line", options: { bold: true, color: C.accent } },
"IVIg (Intravenous Immunoglobulin)",
"Blocks macrophage Fc receptors temporarily. Short-lived effect. Used in acute crises."],
[{ text: "3rd Line", options: { bold: true, color: C.green } },
"Fostamatinib (Syk Kinase Inhibitor)",
"New agent. Blocks intracellular signaling mediating erythrophagocytosis. Shown benefit in open-label study. (Harrison's 22E)"],
[{ text: "3rd Line", options: { bold: true, color: C.green } },
"Alemtuzumab (Anti-CD52)",
"Severe refractory cases only. High toxicity."],
[{ text: "3rd Line", options: { bold: true, color: C.green } },
"High-dose Cyclophosphamide (50 mg/kg × 4 days)",
"Followed by myelo-stimulating agent. Last resort for refractory severe cases."],
[{ text: "Supportive", options: { bold: true, color: C.midBlue } },
"EPO (Erythropoietin)",
"When severe anemia + inadequate reticulocyte response. Helps reduce/avoid transfusion."],
];
s.addTable(rows, {
x: 0.2, y: 1.15, w: 9.6, h: 4.15,
border: { pt: 1, color: "C0CDE0" },
colW: [1.1, 2.5, 6.0],
rowH: 0.415,
fontFace: "Calibri", fontSize: 10,
color: C.darkBlue, align: "left",
});
s.addText("Emerging: neonatal Fc receptor inhibitors and other novel agents are currently under investigation (Harrison's 22E).", {
x: 0.2, y: 5.35, w: 9.6, h: 0.23,
fontSize: 8.5, color: C.gray, italic: true
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 18 — TREATMENT: COLD AGGLUTININ DISEASE
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Treatment — Cold Agglutinin Disease (CAD)", "Different Approach from Warm AIHA");
// Warning box
s.addShape(pres.ShapeType.roundRect, {
x: 0.25, y: 1.15, w: 9.5, h: 0.48,
fill: { color: C.lightOrange }, line: { color: C.orange, pt: 1.5 }, rectRadius: 0.08
});
s.addText("⚠ IMPORTANT: Prednisone and Splenectomy are NOT EFFECTIVE in CAD — Management is fundamentally different from warm AIHA", {
x: 0.35, y: 1.18, w: 9.3, h: 0.42,
fontSize: 11, bold: true, color: C.darkBlue
});
const rows = [
[
{ text: "Severity", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Treatment", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
{ text: "Notes", options: { bold: true, color: C.white, fill: { color: C.tableHead } } },
],
["Mild CAD", "Avoidance of cold exposure", "May be SUFFICIENT for good quality of life. Keep body + extremities warm."],
["Moderate-Severe CAD", "Rituximab (Anti-CD20) — FIRST LINE ★", "~60% response rate. If relapse → repeat course. Now de facto standard."],
["CAD with Lymphoma", "Rituximab + Fludarabine or Bendamustine", "For clinically manifest lymphoproliferative disorder."],
["Relapsed CAD", "Venetoclax (BCL-2 inhibitor)", "B-cell receptor inhibitor. Emerging evidence."],
["Relapsed CAD", "Ibrutinib (BTK inhibitor)", "Targeting B-cell signaling pathway."],
["Relapsed CAD", "Bortezomib (Proteasome inhibitor)", "Effective in relapsed disease."],
["Complement Targeting", "Sutimlimab (Anti-C1s antibody)", "Blocks classical complement pathway. Effective but hemolysis returns when stopped."],
["Severe/Crisis", "Plasma Exchange", "Removes IgM antibody. Rational in emergencies. Limited long-term use."],
["Transfusion", "Warm blood transfusion", "Keep blood bag AND patient extremities WARM during infusion. Donor I+ RBCs survive same as patient's."],
];
s.addTable(rows, {
x: 0.2, y: 1.72, w: 9.6, h: 3.52,
border: { pt: 1, color: "C0CDE0" },
colW: [1.8, 2.9, 4.9],
rowH: 0.355,
fontFace: "Calibri", fontSize: 10,
color: C.darkBlue, align: "left",
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 19 — MONITORING & FOLLOW-UP
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.offWhite };
addHeader(s, "Monitoring & Follow-Up", "Managing AIHA Long-Term");
// Two columns
// Left: monitoring parameters
s.addShape(pres.ShapeType.rect, {
x: 0.25, y: 1.15, w: 4.55, h: 0.4, fill: { color: C.midBlue }, line: { type: "none" }
});
s.addText("What to Monitor", {
x: 0.25, y: 1.15, w: 4.55, h: 0.4,
fontSize: 12, bold: true, color: C.white, align: "center", margin: 0
});
const monitors = [
["Hemoglobin / CBC", "Weekly initially, then monthly when stable"],
["Reticulocyte Count", "Should fall as hemolysis controlled"],
["LDH + Bilirubin", "Markers of ongoing hemolysis"],
["Direct Coombs Test", "May remain positive even in remission"],
["Haptoglobin", "Recovery indicates reduced hemolysis"],
["Signs of relapse", "↑ fatigue, jaundice, dark urine"],
["Drug review", "Ensure no culprit drug restarted"],
["Screen for underlying cause", "SLE (ANA, dsDNA), CLL (blood film, flow)"],
];
monitors.forEach((m, i) => {
const bg = i % 2 === 0 ? C.white : C.lightBlue;
s.addShape(pres.ShapeType.rect, {
x: 0.25, y: 1.57 + i * 0.43, w: 4.55, h: 0.41, fill: { color: bg }, line: { type: "none" }
});
s.addText(m[0], {
x: 0.35, y: 1.57 + i * 0.43, w: 1.7, h: 0.41,
fontSize: 10, bold: true, color: C.darkBlue, valign: "middle", margin: 0
});
s.addText(m[1], {
x: 2.1, y: 1.57 + i * 0.43, w: 2.65, h: 0.41,
fontSize: 10, color: C.gray, valign: "middle", margin: 0, italic: true
});
});
// Right: complications + prognosis
s.addShape(pres.ShapeType.rect, {
x: 5.1, y: 1.15, w: 4.65, h: 0.4, fill: { color: C.accent }, line: { type: "none" }
});
s.addText("Complications & Prognosis", {
x: 5.1, y: 1.15, w: 4.65, h: 0.4,
fontSize: 12, bold: true, color: C.white, align: "center", margin: 0
});
const comps = [
["Relapse", "Common — especially in warm AIHA. Re-treat with rituximab + steroids."],
["Post-splenectomy sepsis", "Vaccinate against Pneumococcus, Haemophilus, Meningococcus BEFORE splenectomy."],
["Venous Thrombosis", "Especially in PNH overlap; monitor coagulation."],
["Steroid Side Effects", "Osteoporosis, hyperglycemia, infections — minimize exposure."],
["Aplastic Crisis", "If parvovirus B19 infects — reticulocyte count drops suddenly."],
["Transformation", "In CLL-associated AIHA — watch for Richter's transformation."],
];
comps.forEach((c, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: 5.1, y: 1.6 + i * 0.61, w: 4.65, h: 0.55,
fill: { color: i % 2 === 0 ? C.lightBlue : C.white },
line: { color: C.accent, pt: 0.8 }, rectRadius: 0.06
});
s.addText(c[0] + ": ", {
x: 5.2, y: 1.6 + i * 0.61, w: 1.2, h: 0.55,
fontSize: 10, bold: true, color: C.accent, valign: "middle", margin: 0
});
s.addText(c[1], {
x: 6.45, y: 1.6 + i * 0.61, w: 3.25, h: 0.55,
fontSize: 9.5, color: C.darkBlue, valign: "middle", margin: 0
});
});
addFooter(s);
}
// ══════════════════════════════════════════════════════════════════
// SLIDE 20 — KEY SUMMARY + REFERENCES
// ══════════════════════════════════════════════════════════════════
{
let s = pres.addSlide();
s.background = { color: C.darkBlue };
// Title bar
s.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 10, h: 1.0, fill: { color: C.accent }, line: { type: "none" }
});
s.addText("Key Points Summary & References", {
x: 0.3, y: 0.05, w: 9.4, h: 0.9,
fontSize: 28, bold: true, color: C.white, valign: "middle"
});
// Key points left
const keyPoints = [
"AIHA = autoantibodies against own RBCs → premature hemolysis",
"Warm AIHA (IgG): extravascular, spleen; Cold (IgM): both intra + extravascular, liver",
"Direct Coombs Test (DAT) = Gold Standard — almost diagnostic alone when positive",
"Look for UNDERLYING CAUSE: SLE, CLL, lymphoma, drugs (cefotetan, fludarabine)",
"Warm AIHA Rx: Prednisone 1mg/kg + Rituximab (now 1st line together)",
"CAD: Avoid cold → Rituximab 1st line; Prednisone & splenectomy NOT effective",
"Relapse is common — plan second-line (splenectomy, azathioprine, fostamatinib)",
"Transfusion: incompatible but ABO-matched may be given in emergencies",
"PCH: children, viral trigger, Donath-Landsteiner Ab, self-limiting",
];
keyPoints.forEach((kp, i) => {
s.addShape(pres.ShapeType.roundRect, {
x: 0.25, y: 1.08 + i * 0.46, w: 5.7, h: 0.4,
fill: { color: "132860" }, line: { color: "2A4A9A", pt: 0.8 }, rectRadius: 0.06
});
s.addText("✓ " + kp, {
x: 0.3, y: 1.08 + i * 0.46, w: 5.6, h: 0.4,
fontSize: 9.5, color: "C8DFFF", fontFace: "Calibri", valign: "middle", margin: 3
});
});
// Right side references
s.addShape(pres.ShapeType.rect, {
x: 6.2, y: 1.05, w: 3.55, h: 0.38, fill: { color: C.accent }, line: { type: "none" }
});
s.addText("References", {
x: 6.2, y: 1.05, w: 3.55, h: 0.38,
fontSize: 13, bold: true, color: C.white, align: "center", margin: 0
});
const refs = [
"1. Harrison's Principles of Internal Medicine, 22nd Edition (2025). McGraw Hill Medical. Chapter 105: Hemolytic Anemias.",
"2. Brodsky RA: Warm autoimmune hemolytic anemia. N Engl J Med 381:64, 2019.",
"3. Autoimmune hemolytic anemias. N Engl J Med 385:1407, 2021.",
"4. Dacie J: The Haemolytic Anaemias. London, Churchill Livingstone.",
"5. Cervera R et al: Arthritis Rheum 46:1019, 2002 (APS manifestations).",
];
refs.forEach((ref, i) => {
s.addText(ref, {
x: 6.2, y: 1.5 + i * 0.75, w: 3.55, h: 0.7,
fontSize: 8.5, color: "B0C8EE", fontFace: "Calibri", valign: "top", margin: 3
});
});
// Bottom banner
s.addShape(pres.ShapeType.rect, {
x: 0, y: 5.25, w: 10, h: 0.375,
fill: { color: C.midBlue }, line: { type: "none" }
});
s.addText("Harrison's Principles of Internal Medicine 22E (2025, McGraw Hill) | Department Grand Rounds | Autoimmune Hemolytic Anemia", {
x: 0.2, y: 5.27, w: 9.6, h: 0.33,
fontSize: 9, color: C.white, align: "center", margin: 0
});
}
// ── Write File ────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/aiha-ppt/AIHA_Presentation.pptx" })
.then(() => console.log("SUCCESS: AIHA_Presentation.pptx created"))
.catch(err => { console.error("ERROR:", err); process.exit(1); });
cd /home/daytona/workspace/aiha-ppt && node aiha_ppt.js 2>&1
ls -lh /home/daytona/workspace/aiha-ppt/AIHA_Presentation.pptx
AIHA Presentation
Presentation · PPTX
| # | Slide Title | Content Type |
|---|---|---|
| 1 | Title Slide | Bold dark theme with blood-red accents |
| 2 | Lecture Overview | Color-coded table of contents (all 20 topics) |
| 3 | Definition & Introduction | Definition box + 3 key concept cards |
| 4 | Normal RBC Survival & Hemolysis Basics | Comparison table (normal vs AIHA values) |
| 5 | Classification of AIHA | Harrison's Table 105-6: Warm vs Cold, all causes |
| 6 | Pathophysiology — Warm AIHA | Step-by-step flow diagram showing IgG → spleen destruction |
| 7 | Pathophysiology — CAD | Warm vs Cold comparison table + CAD mechanism steps |
| 8 | Causes & Associated Conditions | 4-panel grid: Infections, Autoimmune, Blood Cancers, Drugs |
| 9 | Clinical Features | Two columns: Symptoms + Examination Signs |
| 10 | Laboratory Investigations | Full 10-test table with findings and significance |
| 11 | Direct Coombs Test Deep Dive | DAT vs IAT comparison + Coombs-negative AIHA warning |
| 12 | Peripheral Blood Smear Findings | 4-panel: Spherocytes, Polychromasia, Nucleated RBCs, Agglutination |
| 13 | Differential Diagnosis | Harrison's Table 105-7: 8 conditions compared |
| 14 | Drug-Induced Immune HA | 3 mechanisms with current culprit drugs |
| 15 | Paroxysmal Cold Hemoglobinuria (PCH) | Full feature table (Donath-Landsteiner, children, viral trigger) |
| 16 | Treatment: Warm AIHA First Line | Emergency + Prednisone + Rituximab (now 1st line per Harrison's 22E) |
| 17 | Treatment: Warm AIHA 2nd & 3rd Line | Complete table including Fostamatinib (newest addition) |
| 18 | Treatment: Cold Agglutinin Disease | Full table — why Prednisone FAILS, Rituximab 1st line, Sutimlimab |
| 19 | Monitoring & Follow-Up | Monitoring parameters + Complications grid |
| 20 | Key Points Summary + References | 9 take-home points + all Harrison's citations |
Not able to download
ls -lh /home/daytona/workspace/aiha-ppt/ && echo "File exists and size: $(du -sh /home/daytona/workspace/aiha-ppt/AIHA_Presentation.pptx)"
cp /home/daytona/workspace/aiha-ppt/AIHA_Presentation.pptx /home/daytona/workspace/AIHA_Presentation.pptx && echo "Copied OK" && ls -lh /home/daytona/workspace/AIHA_Presentation.pptx
AIHA Presentation
Presentation · PPTX
/home/daytona/workspace/AIHA_Presentation.pptx (790 KB, fully generated). The download should work with the link above - let me know if you're still having trouble and I can try converting it to a zip or base64-encoded format as a workaround.1
cd /home/daytona/workspace && zip AIHA_Presentation.zip AIHA_Presentation.pptx && ls -lh AIHA_Presentation.zip
cp /home/daytona/workspace/aiha-ppt/AIHA_Presentation.pptx /home/daytona/workspace/AIHA_Final.pptx && zip /home/daytona/workspace/AIHA_Final.zip /home/daytona/workspace/AIHA_Final.pptx && ls -lh /home/daytona/workspace/AIHA_Final.zip
# Regenerate fresh from the JS file directly into workspace root cd /home/daytona/workspace/aiha-ppt && node -e " const pptxgen = require('pptxgenjs'); let p = new pptxgen(); let s = p.addSlide(); s.addText('test', {x:1,y:1,w:4,h:1}); p.writeFile({fileName: '/home/daytona/workspace/test_out.pptx'}).then(()=>console.log('OK')).catch(e=>console.error(e)); "
ls -lh /home/daytona/workspace/test_out.pptx && zip /home/daytona/workspace/test_out.zip /home/daytona/workspace/test_out.pptx && echo "ZIP OK"
# Try regenerating directly into a fresh path with no spaces/issues node /home/daytona/workspace/aiha-ppt/aiha_ppt.js 2>&1 ls -lh /home/daytona/workspace/aiha-ppt/AIHA_Presentation.pptx
AIHA Presentation
Presentation · PPTX
AIHA Presentation
Presentation · PPTX
| Problem | Fix |
|---|---|
| Link opens as raw data | Right-click → "Save link as..." |
| Nothing happens on click | Try Chrome or Edge (not Firefox/Safari) |
| "File not found" error | The file is confirmed present - try refreshing the page first |
| Mobile device | Try on a desktop/laptop browser instead |
Yes pdf
cd /home/daytona/workspace/aiha-ppt && libreoffice --headless --convert-to pdf AIHA_Presentation.pptx --outdir /home/daytona/workspace/ 2>&1
mkdir -p /home/daytona/workspace/aiha-ppt/pdf_out && libreoffice --headless --convert-to pdf /home/daytona/workspace/aiha-ppt/AIHA_Presentation.pptx --outdir /home/daytona/workspace/aiha-ppt/pdf_out 2>&1 && ls -lh /home/daytona/workspace/aiha-ppt/pdf_out/
~/aiha-ppt/make_pdf.py
from reportlab.lib.pagesizes import landscape, A4
from reportlab.lib import colors
from reportlab.lib.units import cm, inch
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, KeepTogether)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import PageBreak
import os
OUT = "/home/daytona/workspace/aiha-ppt/AIHA_Presentation.pdf"
PAGE_W, PAGE_H = landscape(A4)
MARGIN = 1.5 * cm
# ─── Colors ────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#0D1F4E")
MID_BLUE = colors.HexColor("#1A3A8F")
ACCENT_RED = colors.HexColor("#E8392A")
LIGHT_BLUE = colors.HexColor("#D6E4F7")
OFF_WHITE = colors.HexColor("#F4F8FF")
WHITE = colors.white
YELLOW = colors.HexColor("#FFD700")
GREEN = colors.HexColor("#1A7A4A")
LIGHT_GREEN= colors.HexColor("#D4F1E4")
ORANGE = colors.HexColor("#E67E22")
LIGHT_ORANGE=colors.HexColor("#FDE9D0")
GRAY = colors.HexColor("#5A6472")
LIGHT_GRAY = colors.HexColor("#EAEEF5")
TABLE_ALT = colors.HexColor("#EEF4FF")
doc = SimpleDocTemplate(
OUT,
pagesize=landscape(A4),
leftMargin=MARGIN, rightMargin=MARGIN,
topMargin=MARGIN, bottomMargin=MARGIN,
)
styles = getSampleStyleSheet()
def S(name, **kw):
base = styles.get(name, styles['Normal'])
return ParagraphStyle(name + str(id(kw)), parent=base, **kw)
TITLE_S = S('Normal', fontSize=28, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_CENTER, spaceAfter=4)
HEAD_S = S('Normal', fontSize=18, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_LEFT, spaceBefore=2, spaceAfter=2)
SUBHEAD_S = S('Normal', fontSize=12, textColor=colors.HexColor("#B8D0F8"),
fontName='Helvetica-Oblique', alignment=TA_LEFT, spaceAfter=6)
BODY_S = S('Normal', fontSize=11, textColor=DARK_BLUE, fontName='Helvetica',
leading=15, spaceAfter=4)
BULLET_S = S('Normal', fontSize=10.5, textColor=DARK_BLUE, fontName='Helvetica',
leading=14, leftIndent=14, spaceAfter=3)
SMALL_S = S('Normal', fontSize=9, textColor=GRAY, fontName='Helvetica-Oblique',
spaceAfter=2)
WARN_S = S('Normal', fontSize=10.5, textColor=ACCENT_RED, fontName='Helvetica-Bold',
leading=14, spaceAfter=4)
REF_S = S('Normal', fontSize=9, textColor=colors.HexColor("#B0C8EE"),
fontName='Helvetica', leading=13, spaceAfter=3)
WHITE_S = S('Normal', fontSize=10.5, textColor=WHITE, fontName='Helvetica',
leading=14, spaceAfter=3)
AVAIL_W = PAGE_W - 2 * MARGIN
story = []
def header_block(title, subtitle=None):
"""Returns a styled header table."""
title_p = Paragraph(title, S('Normal', fontSize=20, textColor=WHITE,
fontName='Helvetica-Bold'))
sub_p = Paragraph(subtitle or "", S('Normal', fontSize=10,
textColor=colors.HexColor("#B8D0F8"),
fontName='Helvetica-Oblique'))
cell_content = [title_p, sub_p] if subtitle else [title_p]
t = Table([[cell_content]], colWidths=[AVAIL_W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), MID_BLUE),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 10),
]))
return t
def footer_note(text=None):
t_text = text or "Reference: Harrison's Principles of Internal Medicine 22E (2025, McGraw Hill)"
t = Table([[Paragraph(t_text, SMALL_S)]], colWidths=[AVAIL_W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), DARK_BLUE),
('TOPPADDING', (0,0), (-1,-1), 3),
('BOTTOMPADDING', (0,0), (-1,-1), 3),
('LEFTPADDING', (0,0), (-1,-1), 8),
]))
return t
def info_box(text, bg=LIGHT_BLUE, border=MID_BLUE):
p = Paragraph(text, S('Normal', fontSize=11, textColor=DARK_BLUE, fontName='Helvetica', leading=15))
t = Table([[p]], colWidths=[AVAIL_W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg),
('BOX', (0,0), (-1,-1), 1.5, border),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 10),
]))
return t
def warn_box(text, bg=LIGHT_ORANGE, border=ORANGE):
p = Paragraph(text, S('Normal', fontSize=11, textColor=DARK_BLUE, fontName='Helvetica-Bold', leading=15))
t = Table([[p]], colWidths=[AVAIL_W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg),
('BOX', (0,0), (-1,-1), 1.5, border),
('TOPPADDING', (0,0), (-1,-1), 7),
('BOTTOMPADDING', (0,0), (-1,-1), 7),
('LEFTPADDING', (0,0), (-1,-1), 10),
]))
return t
def section_label(text, bg=ACCENT_RED):
p = Paragraph(text, S('Normal', fontSize=10, textColor=WHITE, fontName='Helvetica-Bold', alignment=TA_CENTER))
t = Table([[p]], colWidths=[AVAIL_W])
t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), bg),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
]))
return t
def make_table(data, col_widths, row_colors=None):
"""data = list of lists of strings or Paragraphs. First row = header."""
# Convert strings to Paragraphs
converted = []
for ri, row in enumerate(data):
crow = []
for ci, cell in enumerate(row):
if isinstance(cell, str):
if ri == 0:
p = Paragraph(cell, S('Normal', fontSize=10, textColor=WHITE,
fontName='Helvetica-Bold', leading=13))
else:
p = Paragraph(cell, S('Normal', fontSize=9.5, textColor=DARK_BLUE,
fontName='Helvetica', leading=13))
crow.append(p)
else:
crow.append(cell)
converted.append(crow)
t = Table(converted, colWidths=col_widths, repeatRows=1)
ts = [
('BACKGROUND', (0,0), (-1,0), MID_BLUE),
('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, TABLE_ALT]),
('GRID', (0,0), (-1,-1), 0.5, colors.HexColor("#C0CDE0")),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]
t.setStyle(TableStyle(ts))
return t
def pb():
return PageBreak()
# ════════════════════════════════════════════════════════════
# SLIDE 1 — TITLE
# ════════════════════════════════════════════════════════════
title_t = Table(
[[Paragraph("AUTOIMMUNE HEMOLYTIC ANEMIA (AIHA)",
S('Normal', fontSize=30, textColor=WHITE, fontName='Helvetica-Bold',
alignment=TA_CENTER)),
]],
colWidths=[AVAIL_W]
)
title_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), DARK_BLUE),
('TOPPADDING', (0,0), (-1,-1), 18),
('BOTTOMPADDING', (0,0), (-1,-1), 18),
]))
story += [
title_t, Spacer(1, 0.3*cm),
info_box("<b>A Comprehensive Departmental Lecture</b><br/>Based on Harrison's Principles of Internal Medicine 22E (2025, McGraw Hill)"),
Spacer(1, 0.3*cm),
info_box("<b>Topics:</b> Definition • Pathophysiology • Classification • Clinical Features • Diagnosis • Full Treatment Algorithm"),
Spacer(1, 0.4*cm),
footer_note("Harrison's Principles of Internal Medicine 22E (2025) | Department Grand Rounds"),
pb()
]
# ════════════════════════════════════════════════════════════
# SLIDE 2 — OVERVIEW
# ════════════════════════════════════════════════════════════
story.append(header_block("Lecture Overview", "20 Topics Covered Today"))
story.append(Spacer(1, 0.3*cm))
toc_left = [
"01. Definition & Introduction",
"02. Normal RBC Survival & Hemolysis Basics",
"03. Classification of AIHA",
"04. Pathophysiology — Warm Antibody AIHA",
"05. Pathophysiology — Cold Agglutinin Disease",
"06. Causes & Associated Conditions",
"07. Clinical Features",
"08. Laboratory Investigations",
"09. Direct Antiglobulin (Coombs) Test",
"10. Peripheral Blood Smear Findings",
]
toc_right = [
"11. Differential Diagnosis",
"12. Drug-Induced Immune Hemolytic Anemia",
"13. Paroxysmal Cold Hemoglobinuria (PCH)",
"14. Treatment — Warm AIHA (First Line)",
"15. Treatment — Warm AIHA (Second & Third Line)",
"16. Treatment — Cold Agglutinin Disease",
"17. Blood Transfusion in AIHA",
"18. Monitoring & Follow-Up",
"19. Key Points Summary",
"20. References & Further Reading",
]
half = AVAIL_W / 2 - 0.3*cm
toc_data = [[
Paragraph("<br/>".join(toc_left), S('Normal', fontSize=10.5, textColor=DARK_BLUE,
fontName='Helvetica', leading=17)),
Paragraph("<br/>".join(toc_right), S('Normal', fontSize=10.5, textColor=DARK_BLUE,
fontName='Helvetica', leading=17)),
]]
toc_t = Table(toc_data, colWidths=[half, half+0.6*cm])
toc_t.setStyle(TableStyle([
('BACKGROUND', (0,0), (0,0), LIGHT_BLUE),
('BACKGROUND', (1,0), (1,0), OFF_WHITE),
('BOX', (0,0), (0,0), 1, MID_BLUE),
('BOX', (1,0), (1,0), 1, MID_BLUE),
('TOPPADDING', (0,0), (-1,-1), 10),
('BOTTOMPADDING', (0,0), (-1,-1), 10),
('LEFTPADDING', (0,0), (-1,-1), 12),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story += [toc_t, Spacer(1, 0.3*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 3 — DEFINITION
# ════════════════════════════════════════════════════════════
story.append(header_block("Definition & Introduction", "What Is Autoimmune Hemolytic Anemia?"))
story.append(Spacer(1, 0.3*cm))
story.append(info_box("<b><font color='#E8392A'>DEFINITION:</font></b> Autoimmune Hemolytic Anemia (AIHA) is a condition in which the immune system produces antibodies against the body's own red blood cells, leading to their premature destruction (hemolysis)."))
story.append(Spacer(1, 0.3*cm))
key3 = [["Antibody Type", "Hemolysis Site", "Diagnosis"],
["Mainly IgG (warm) or IgM (cold)", "Spleen (extravascular) or vessels (intravascular)", "Positive Direct Antiglobulin (Coombs) Test"]]
story.append(make_table(key3, [AVAIL_W/3]*3))
story.append(Spacer(1, 0.3*cm))
story.append(info_box("<b>Important:</b> AIHA may be <b>primary (idiopathic)</b> or <b>secondary</b> to infections, autoimmune diseases, lymphoproliferative disorders, or drugs. Severity ranges from mild compensated anemia to life-threatening hemolysis requiring emergency transfusion.", bg=LIGHT_GREEN, border=GREEN))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 4 — NORMAL RBC SURVIVAL
# ════════════════════════════════════════════════════════════
story.append(header_block("Normal RBC Survival & Hemolysis", "Understanding the Baseline Values"))
story.append(Spacer(1, 0.3*cm))
rbc_data = [
["Parameter", "Normal Value", "In AIHA"],
["RBC Lifespan", "~120 days", "Markedly reduced (days to weeks)"],
["Haptoglobin", "Normal (binds free Hb)", "Low / Absent (consumed)"],
["LDH", "Normal", "Elevated (cell destruction)"],
["Reticulocytes", "0.5–1.5%", "Elevated — reticulocytosis (compensatory)"],
["Bilirubin (unconjugated)", "Normal", "Elevated → Jaundice"],
["Urine Urobilinogen", "Trace", "Elevated"],
["Direct Coombs Test", "Negative", "POSITIVE — key diagnostic finding"],
]
story.append(make_table(rbc_data, [AVAIL_W*0.35, AVAIL_W*0.32, AVAIL_W*0.33]))
story.append(Spacer(1, 0.2*cm))
story.append(info_box("★ Reticulocytosis = bone marrow working harder to compensate for RBC loss. Always check reticulocyte count when evaluating anemia.", bg=LIGHT_GREEN, border=GREEN))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 5 — CLASSIFICATION
# ════════════════════════════════════════════════════════════
story.append(header_block("Classification of AIHA", "Harrison's Table 105-6: Acquired Immune Hemolytic Anemias"))
story.append(Spacer(1, 0.3*cm))
cls_data = [
["Type / Setting", "WARM AIHA (IgG, optimal 37°C)", "COLD Agglutinin Disease (IgM, 4–30°C)"],
["Primary", "Idiopathic AIHA", "Idiopathic CAD"],
["Viral Infection", "HIV, HCV, EBV, Parvovirus B19", "EBV, CMV"],
["Other Infection", "Babesia", "Mycoplasma pneumoniae, PCH"],
["Autoimmune Disease", "SLE ★, RA, Scleroderma, IBD, Hashimoto's Thyroiditis", "Rare"],
["Lymphoproliferative", "CLL ★, Lymphoma, Multiple Myeloma", "Waldenström's, Lymphoma"],
["Drugs", "Cefotetan ★, Ceftriaxone ★, Piperacillin, Methyldopa, Fludarabine", "Lenalidomide (minority)"],
["Other", "After HSCT, Immune checkpoint inhibitors (Nivolumab)", "Pregnancy"],
]
story.append(make_table(cls_data, [AVAIL_W*0.2, AVAIL_W*0.42, AVAIL_W*0.38]))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("PCH = Paroxysmal Cold Hemoglobinuria | CLL = Chronic Lymphocytic Leukemia | ★ = Most Common | HSCT = Hematopoietic Stem Cell Transplant", SMALL_S))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 6 — PATHOPHYSIOLOGY WARM
# ════════════════════════════════════════════════════════════
story.append(header_block("Pathophysiology — Warm Antibody AIHA", "How IgG Destroys Red Blood Cells"))
story.append(Spacer(1, 0.3*cm))
path_steps = [
["Step", "Event", "Detail"],
["1", "Immune Dysregulation", "Loss of self-tolerance → autoreactive B cells activated"],
["2", "IgG Autoantibody Production", "Polyclonal IgG produced, usually Rhesus-specific (anti-e or broad Rh)"],
["3", "IgG Binds RBC at 37°C", "Antibody coats red cell surface (opsonization)"],
["4", "Fc Recognition by Macrophages", "Fc portion of IgG recognized by macrophage FcR receptors"],
["5", "Erythrophagocytosis", "RBCs engulfed by macrophages — mainly in the SPLEEN (red pulp), also liver & bone marrow"],
["6", "Spherocyte Formation", "Partial phagocytosis removes membrane but not volume → microspherocytes"],
["7", "Hemolysis (Extravascular)", "RBC destruction → ↑ bilirubin, ↑ LDH, ↓ haptoglobin, reticulocytosis"],
]
story.append(make_table(path_steps, [AVAIL_W*0.07, AVAIL_W*0.28, AVAIL_W*0.65]))
story.append(Spacer(1, 0.3*cm))
story.append(info_box("<b>Key Concept:</b> Warm antibody = reacts best at <b>37°C</b>. Mainly <b>IgG</b>. SPLEEN is the predominant site of destruction due to its special anatomy (red pulp macrophages + slow blood transit)."))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 7 — PATHOPHYSIOLOGY CAD
# ════════════════════════════════════════════════════════════
story.append(header_block("Cold Agglutinin Disease (CAD)", "Pathophysiology of IgM-Mediated Hemolysis"))
story.append(Spacer(1, 0.3*cm))
half2 = AVAIL_W/2 - 0.2*cm
comp_data = [
["Feature", "WARM AIHA", "CAD"],
["Antibody", "IgG (polyclonal)", "IgM (monoclonal)"],
["Optimal Temp", "37°C", "4–30°C"],
["Antigen", "Rhesus antigens", "I antigen"],
["Hemolysis Type", "Extravascular (Spleen)", "Intravascular + Extravascular (Liver)"],
["B-cell type", "Polyclonal", "Monoclonal clone (KMT2D mutation)"],
["Complement", "Minor role", "MAJOR — activates classical pathway"],
["Prednisone", "Effective", "NOT EFFECTIVE"],
["Splenectomy", "Beneficial", "NOT EFFECTIVE"],
]
cad_mech = [
["#", "CAD Mechanism"],
["1", "IgM antibody binds RBCs in COLD parts of body (hands, feet, ears)"],
["2", "IgM activates COMPLEMENT via classical pathway"],
["3", "Membrane Attack Complex (MAC) → Intravascular Hemolysis + Hemoglobinuria"],
["4", "C3b opsonization → Extravascular Hemolysis by Kupffer cells in LIVER"],
["5", "IgM titer can be very high (up to 1:100,000)"],
["6", "B-cell clone has somatic KMT2D mutation (unlike Waldenström's = no MYD88)"],
]
row_data = [[
make_table(comp_data, [half2*0.4, half2*0.3, half2*0.3]),
make_table(cad_mech, [half2*0.08, half2*0.92]),
]]
side_t = Table(row_data, colWidths=[half2, half2+0.4*cm])
side_t.setStyle(TableStyle([
('VALIGN', (0,0), (-1,-1), 'TOP'),
('LEFTPADDING', (0,0), (-1,-1), 4),
('RIGHTPADDING', (0,0), (-1,-1), 4),
]))
story += [side_t, Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 8 — CAUSES
# ════════════════════════════════════════════════════════════
story.append(header_block("Causes & Associated Conditions", "Always Look for an Underlying Trigger"))
story.append(Spacer(1, 0.3*cm))
causes_data = [
["Category", "Warm AIHA", "Cold (CAD)"],
["Viral Infections", "EBV, HIV, HCV, Parvovirus B19", "EBV, CMV"],
["Bacterial Infections", "Babesia", "Mycoplasma pneumoniae"],
["Autoimmune Diseases", "SLE ★ (may be first presentation!), RA, Scleroderma, IBD, Hashimoto's", "Rare"],
["Lymphoproliferative", "CLL ★, Lymphoma, Multiple Myeloma, After HSCT", "Waldenström's, Lymphoma"],
["Drugs", "Cefotetan ★, Ceftriaxone ★, Piperacillin, Fludarabine, Methyldopa, Nivolumab", "Lenalidomide"],
["Others", "Solid organ transplant, Pregnancy, Common variable immunodeficiency", "Pregnancy"],
]
story.append(make_table(causes_data, [AVAIL_W*0.2, AVAIL_W*0.5, AVAIL_W*0.3]))
story.append(Spacer(1, 0.3*cm))
story.append(warn_box("⚠ SLE may present FIRST as AIHA before other manifestations. Always check ANA/anti-dsDNA in new AIHA patients. | Immune checkpoint inhibitors (e.g. Nivolumab) increasingly causing warm AIHA."))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 9 — CLINICAL FEATURES
# ════════════════════════════════════════════════════════════
story.append(header_block("Clinical Features", "Patient Presentation — Symptoms & Signs"))
story.append(Spacer(1, 0.3*cm))
symp_data = [
["Symptom / Sign", "Explanation", "More Specific To"],
["Fatigue & Weakness", "Due to anemia (↓ oxygen delivery to tissues)", "All AIHA"],
["Pallor", "Pale skin, conjunctiva, palmar creases", "All AIHA"],
["Jaundice (Icterus)", "↑ Unconjugated bilirubin from RBC breakdown", "All AIHA"],
["Shortness of Breath", "Especially on exertion; compensatory tachycardia", "All AIHA"],
["Dark / Tea-coloured Urine", "Hemoglobinuria — free hemoglobin in urine", "Intravascular hemolysis (CAD, PCH)"],
["Cold sensitivity / Acrocyanosis", "Skin color change in fingers/toes in cold weather", "Cold Agglutinin Disease"],
["Raynaud's Phenomenon", "Vasospasm in fingers triggered by cold", "Cold Agglutinin Disease"],
["Splenomegaly", "Enlarged spleen — main site of RBC destruction", "Warm AIHA"],
["Hepatomegaly", "Liver enlargement if Kupffer cells involved", "CAD, severe warm AIHA"],
["Lymphadenopathy", "Enlarged lymph nodes — suggests lymphoma/CLL underlying cause", "Secondary AIHA"],
]
story.append(make_table(symp_data, [AVAIL_W*0.25, AVAIL_W*0.45, AVAIL_W*0.3]))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 10 — LAB INVESTIGATIONS
# ════════════════════════════════════════════════════════════
story.append(header_block("Laboratory Investigations", "Step-by-Step Workup of Suspected AIHA"))
story.append(Spacer(1, 0.3*cm))
lab_data = [
["Investigation", "Finding in AIHA", "Significance"],
["CBC", "↓ Hemoglobin; ↑ MCV (macrocytosis from reticulocytes)", "Confirms anemia; reticulocytosis raises MCV"],
["Reticulocyte Count", "↑ Elevated (>2.5%)", "Bone marrow responding to hemolysis"],
["Peripheral Blood Smear", "Spherocytes, polychromasia, nucleated RBCs", "Microspherocytes = classic for AIHA"],
["Direct Antiglobulin Test (DAT)", "POSITIVE — IgG ± C3", "Gold standard diagnostic test"],
["Indirect Antiglobulin Test", "May be positive (free antibody in serum)", "Detects circulating antibody"],
["LDH", "↑ Elevated", "Marker of RBC destruction"],
["Haptoglobin", "↓ Low or absent", "Consumed by free hemoglobin"],
["Bilirubin", "↑ Unconjugated (indirect) bilirubin", "From RBC breakdown products"],
["Urine Hemoglobin", "Present in intravascular hemolysis", "Hemoglobinuria in CAD / PCH"],
["Cold Agglutinin Titer", "↑ High titer (>1:64 at 4°C)", "Specific for Cold Agglutinin Disease"],
]
story.append(make_table(lab_data, [AVAIL_W*0.28, AVAIL_W*0.38, AVAIL_W*0.34]))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 11 — COOMBS TEST
# ════════════════════════════════════════════════════════════
story.append(header_block("Direct Antiglobulin (Coombs) Test", "Gold Standard Test for AIHA"))
story.append(Spacer(1, 0.2*cm))
story.append(info_box("<b>Historical Note:</b> Developed in <b>1945 by R.R.A. Coombs</b>. A positive result is almost on its own diagnostic of AIHA. (Harrison's 22E, Chapter 105)"))
story.append(Spacer(1, 0.2*cm))
coombs_data = [
["Feature", "Direct Antiglobulin Test (DAT)", "Indirect Antiglobulin Test (IAT)"],
["Detects", "Antibody/complement already ON patient's own RBCs", "Antibody FREE in patient's serum"],
["Method", "Wash patient RBCs + add anti-human globulin (Coombs reagent)", "Mix patient serum with donor RBCs → test for agglutination"],
["In AIHA", "PRIMARY diagnostic test — positive = AIHA until proven otherwise", "Supplementary — may detect free antibody"],
["Sensitivity", "Positive if ≥400 IgG/C3 molecules/RBC (standard);\n≥30–40 molecules with flow cytometry", "Less sensitive"],
["Reagent", "Broad-spectrum (anti-IgG + anti-C3)", "Anti-human globulin"],
["Result Pattern", "IgG only → Warm AIHA; C3 only → CAD; IgG + C3 → Mixed type", "May detect alloantibody"],
]
story.append(make_table(coombs_data, [AVAIL_W*0.2, AVAIL_W*0.42, AVAIL_W*0.38]))
story.append(Spacer(1, 0.2*cm))
story.append(warn_box("⚠ COOMBS-NEGATIVE AIHA EXISTS: When antibody affinity is very high, few molecules may cause severe hemolysis. Do NOT dismiss AIHA if DAT is negative but clinical picture is compelling. Advanced techniques (flow cytometry) increase sensitivity to 30–40 molecules/RBC."))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 12 — PERIPHERAL SMEAR
# ════════════════════════════════════════════════════════════
story.append(header_block("Peripheral Blood Smear Findings", "What to Look for Under the Microscope"))
story.append(Spacer(1, 0.3*cm))
smear_data = [
["Finding", "Description", "Clinical Significance"],
["Spherocytes ★ KEY", "Small, round RBCs WITHOUT central pallor. Membrane lost through partial phagocytosis but volume retained.", "MOST CLASSIC finding in warm AIHA. Seen also in hereditary spherocytosis — DAT differentiates."],
["Polychromasia", "Bluish-tinged, larger RBCs = reticulocytes released early from marrow.", "Indicates active bone marrow compensatory response. Confirmed by ↑ reticulocyte count."],
["Nucleated RBCs", "Immature erythroid cells released urgently from marrow.", "Severe acute hemolysis — marrow releasing precursors into blood."],
["RBC Agglutination on Smear", "Red cells clumping together in groups at room temperature.", "Classic for COLD Agglutinin Disease (CAD). IgM causes clumping at room temp. Warm the sample and repeat."],
["Schistocytes (rare in AIHA)", "Fragmented RBC pieces (helmet cells).", "More typical of microangiopathic HA (TTP/HUS) — helps differentiate from AIHA."],
]
story.append(make_table(smear_data, [AVAIL_W*0.2, AVAIL_W*0.42, AVAIL_W*0.38]))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 13 — DIFFERENTIAL DIAGNOSIS
# ════════════════════════════════════════════════════════════
story.append(header_block("Differential Diagnosis", "Harrison's Table 105-7: Other Causes of Hemolytic Anemia"))
story.append(Spacer(1, 0.3*cm))
dd_data = [
["Condition", "Onset", "Mechanism", "Key Diagnostic Test"],
["Mismatched Blood Transfusion", "Abrupt", "ABO incompatibility", "Repeat cross-match"],
["Paroxysmal Nocturnal Hemoglobinuria (PNH)", "Chronic ± acute flares", "Complement destroys CD59(-) RBCs", "Flow cytometry for CD55/CD59"],
["Paroxysmal Cold Hemoglobinuria (PCH)", "Acute (children)", "Donath-Landsteiner IgG biphasic hemolysin", "Donath-Landsteiner test"],
["Septicemia (Clostridium)", "Very acute", "Exotoxins from Clostridium perfringens", "Blood cultures"],
["Microangiopathic HA (TTP/HUS)", "Acute or chronic", "RBC fragmentation due to shear stress", "Smear: schistocytes; ADAMTS13 level"],
["Hereditary Spherocytosis", "Chronic from birth", "Intrinsic membrane defect (spectrin/ankyrin)", "Osmotic fragility; EMA test; DAT NEGATIVE"],
["G6PD Deficiency", "Episodic (after oxidant trigger)", "Oxidative damage to RBCs", "G6PD enzyme assay"],
["March Hemoglobinuria", "Abrupt after exercise", "Mechanical destruction of RBCs in feet", "History of prolonged running/marching"],
]
story.append(make_table(dd_data, [AVAIL_W*0.25, AVAIL_W*0.13, AVAIL_W*0.32, AVAIL_W*0.3]))
story.append(Spacer(1, 0.15*cm))
story.append(info_box("<b>Key differentiator:</b> In AIHA, the DAT (Coombs) test is POSITIVE. In most other causes of hemolysis, it is negative. A positive DAT = AIHA until proven otherwise.", bg=LIGHT_GREEN, border=GREEN))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 14 — DRUG-INDUCED
# ════════════════════════════════════════════════════════════
story.append(header_block("Drug-Induced Immune Hemolytic Anemia", "Always Take a Complete Drug History!"))
story.append(Spacer(1, 0.2*cm))
drug_data = [
["Mechanism", "How It Works", "Classic Example", "Management"],
["1. Direct Chemical Hemolysis",
"Drug with oxidative potential destroys RBCs directly. Non-immune mechanism.",
"Dapsone, Nitrates, Cisplatin, Hyperbaric O₂, Lead (basophilic stippling)",
"Stop the drug. Supportive care."],
["2. Hapten Mechanism",
"Drug binds RBC membrane as hapten → induces antibody. On re-exposure, RBCs destroyed as 'innocent bystanders'.",
"Penicillin (rare), Cefotetan, Ceftriaxone",
"Stop drug → hemolysis resolves."],
["3. True Autoantibody (Mimicry)",
"Drug triggers autoantibody against red cell antigen through molecular mimicry. TRUE AIHA — antibody persists even without drug.",
"Methyldopa → anti-Rhesus (anti-e); Fludarabine",
"Stop drug → gradual resolution. May need steroid."],
]
story.append(make_table(drug_data, [AVAIL_W*0.22, AVAIL_W*0.33, AVAIL_W*0.25, AVAIL_W*0.2]))
story.append(Spacer(1, 0.2*cm))
story.append(warn_box("<b>Current most common culprit drugs (Harrison's 22E):</b> Cefotetan ★, Ceftriaxone ★, Piperacillin ★, Methyldopa, Fludarabine, Bendamustine, Lenalidomide, Nivolumab & other immune checkpoint inhibitors"))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 15 — PCH
# ════════════════════════════════════════════════════════════
story.append(header_block("Paroxysmal Cold Hemoglobinuria (PCH)", "A Rare but Important Form of AIHA — Mainly in Children"))
story.append(Spacer(1, 0.2*cm))
story.append(info_box("PCH is a <b>rare form of AIHA</b> occurring <b>mostly in children</b>, usually triggered by <b>viral infection</b>, usually <b>self-limited</b>, characterized by the Donath-Landsteiner antibody."))
story.append(Spacer(1, 0.2*cm))
pch_data = [
["Feature", "Details"],
["Antibody", "Donath-Landsteiner IgG antibody (biphasic hemolysin)"],
["Antigen Specificity", "Anti-P specificity"],
["Binding Temperature", "Binds RBCs at LOW temperature (4°C)"],
["Lysis Temperature", "Lysis occurs when warmed to 37°C (complement-mediated)"],
["Hemolysis Type", "INTRAVASCULAR → Hemoglobinuria (dark urine)"],
["Trigger", "Viral infections (most common); cold exposure"],
["Age Group", "Mostly children; adults rarely affected"],
["Diagnosis", "Donath-Landsteiner test — BIPHASIC hemolysin specific to PCH"],
["Treatment", "Supportive care + blood transfusion if severe anemia; usually self-resolving"],
["Prognosis", "Recovery is the RULE — excellent prognosis"],
]
story.append(make_table(pch_data, [AVAIL_W*0.3, AVAIL_W*0.7]))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 16 — TREATMENT WARM 1st LINE
# ════════════════════════════════════════════════════════════
story.append(header_block("Treatment — Warm AIHA (First Line)", "Harrison's 22E Treatment Algorithm"))
story.append(Spacer(1, 0.2*cm))
story.append(warn_box("⚠ SEVERE ACUTE AIHA IS A MEDICAL EMERGENCY — Requires IMMEDIATE red cell transfusion even if cross-match is incompatible"))
story.append(Spacer(1, 0.2*cm))
tx1_data = [
["Step", "Treatment", "Dose / Detail", "Notes"],
["EMERGENCY",
"Red Cell Transfusion\n(if life-threatening)",
"ABO-matched but incompatible blood",
"Rationale: Donor RBCs destroyed at same rate as patient's own — but patient stays alive. Requires close liaison with blood bank."],
["STEP 1",
"Prednisone\n(Corticosteroids)",
"1 mg/kg/day\n(e.g., 60–80 mg/day)\nTaper once Hb stabilizes",
"Remission in ≥50% of patients. Mechanism: ↓ autoantibody production + ↓ macrophage Fc receptor expression."],
["STEP 2\n(NOW 1st LINE)",
"Rituximab\n(Anti-CD20 monoclonal antibody)",
"Low dose: 100 mg/week × 4\n(together with prednisone)",
"Previously 2nd line — now used FIRST LINE with prednisone. Significantly REDUCES RELAPSE RATE. Targets B cells producing autoantibodies."],
]
story.append(make_table(tx1_data, [AVAIL_W*0.12, AVAIL_W*0.18, AVAIL_W*0.25, AVAIL_W*0.45]))
story.append(Spacer(1, 0.2*cm))
story.append(info_box("<b>When NOT immediately life-threatening:</b> Withhold transfusion (compatibility problems ↑ with each unit) → start prednisone + rituximab immediately.", bg=LIGHT_GREEN, border=GREEN))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 17 — TREATMENT WARM 2nd/3rd LINE
# ════════════════════════════════════════════════════════════
story.append(header_block("Treatment — Warm AIHA (2nd & 3rd Line)", "For Relapsed or Refractory Disease"))
story.append(Spacer(1, 0.3*cm))
tx2_data = [
["Line", "Treatment", "Mechanism / Key Notes"],
["2nd Line", "Splenectomy",
"Removes main hemolysis site → improves anemia / reduces drug doses. NOT curative. ↑ Risk of sepsis (vaccinate before: Pneumococcus, Haemophilus, Meningococcus) + thrombosis. Response rate similar to rituximab."],
["2nd Line", "Azathioprine",
"Immunosuppressant. Reduces autoantibody production. Now 2nd/3rd line since rituximab became standard."],
["2nd Line", "Cyclophosphamide / Cyclosporine / Mycophenolate",
"Immunosuppressants for refractory cases. Used when rituximab + splenectomy both fail."],
["2nd Line", "IVIg (Intravenous Immunoglobulin)",
"Blocks macrophage Fc receptors temporarily. Short-lived effect. Useful in acute severe crisis."],
["3rd Line ★ NEW", "Fostamatinib (Syk Kinase Inhibitor)",
"Blocks intracellular signaling (Syk) mediating erythrophagocytosis. Open-label study showed benefit. Emerging 3rd-line option. (Harrison's 22E)"],
["3rd Line", "Alemtuzumab (Anti-CD52)",
"Severe refractory cases only. High toxicity profile."],
["3rd Line", "High-dose Cyclophosphamide (50 mg/kg × 4 days)",
"Followed by myelo-stimulating agent (G-CSF). Absolute last resort for refractory life-threatening cases."],
["Supportive", "EPO (Erythropoietin)",
"When severe anemia + inadequate reticulocyte response. Reduces / avoids need for transfusion."],
]
story.append(make_table(tx2_data, [AVAIL_W*0.13, AVAIL_W*0.27, AVAIL_W*0.6]))
story.append(Spacer(1, 0.15*cm))
story.append(Paragraph("Emerging: neonatal Fc receptor inhibitors and other novel agents are currently under investigation (Harrison's 22E).", SMALL_S))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 18 — TREATMENT CAD
# ════════════════════════════════════════════════════════════
story.append(header_block("Treatment — Cold Agglutinin Disease (CAD)", "Fundamentally Different Approach from Warm AIHA"))
story.append(Spacer(1, 0.2*cm))
story.append(warn_box("⚠ CRITICAL: Prednisone and Splenectomy are NOT EFFECTIVE in CAD. Do not apply warm AIHA protocols to cold agglutinin disease."))
story.append(Spacer(1, 0.2*cm))
cad_tx = [
["Severity", "Treatment", "Important Notes"],
["Mild CAD", "Avoid cold exposure", "May be SUFFICIENT. Keep body warm. Wear layers. Sufficient for good quality of life in mild cases."],
["Moderate-Severe CAD", "Rituximab (Anti-CD20) — FIRST LINE ★", "~60% response rate. If relapse → repeat rituximab course. De facto standard of care."],
["CAD + Lymphoma", "Rituximab + Fludarabine or Bendamustine", "For clinically manifest lymphoproliferative disorder underlying CAD."],
["Relapsed CAD", "Venetoclax (BCL-2 inhibitor)", "Emerging evidence. B-cell receptor pathway inhibition."],
["Relapsed CAD", "Ibrutinib (BTK inhibitor)", "Targets Bruton's Tyrosine Kinase in B-cell signaling."],
["Relapsed CAD", "Bortezomib (Proteasome inhibitor)", "Effective in relapsed disease; targets plasma cells."],
["Complement Targeting", "Sutimlimab (Anti-C1s)", "Blocks classical complement pathway activation. Effective but hemolysis returns when stopped."],
["Crisis / Severe", "Plasma Exchange", "Removes circulating IgM antibody. Rational in emergencies. Limited long-term utility."],
["Blood Transfusion", "Warm blood transfusion", "Keep blood bag AND patient extremities WARM. Donor I+ RBCs survive same duration as patient's own."],
]
story.append(make_table(cad_tx, [AVAIL_W*0.18, AVAIL_W*0.27, AVAIL_W*0.55]))
story += [Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 19 — MONITORING
# ════════════════════════════════════════════════════════════
story.append(header_block("Monitoring, Follow-Up & Complications", "Managing AIHA Long-Term"))
story.append(Spacer(1, 0.2*cm))
mon_data = [
["What to Monitor", "Frequency / Target"],
["Hemoglobin / CBC", "Weekly initially, then monthly when stable. Target Hb >10 g/dL"],
["Reticulocyte Count", "Should fall as hemolysis is controlled"],
["LDH + Bilirubin", "Falling levels confirm treatment response"],
["Direct Coombs Test", "May remain positive even in clinical remission — do not re-treat on DAT alone"],
["Haptoglobin", "Recovery towards normal indicates reduced hemolysis"],
["Signs of relapse", "Fatigue, jaundice, dark urine → repeat bloods promptly"],
["Drug review", "Ensure no culprit drug restarted inadvertently"],
["Screen underlying cause", "SLE (ANA, anti-dsDNA), CLL (blood film, flow cytometry), lymphoma"],
]
comp_data2 = [
["Complication", "Management"],
["Relapse (common)", "Re-treat with prednisone + rituximab"],
["Post-splenectomy sepsis", "Vaccinate BEFORE: Pneumococcus, Haemophilus, Meningococcus. Daily penicillin V prophylaxis."],
["Steroid side effects", "Osteoporosis (Ca/Vit D), hyperglycemia, infections — taper as fast as clinically safe"],
["Aplastic crisis", "Parvovirus B19 superinfection → sudden ↓ reticulocytes. Supportive + transfusion."],
["Venous Thrombosis", "Especially in PNH overlap. Monitor coagulation."],
["Transformation", "CLL-associated AIHA: watch for Richter's transformation"],
]
row_data2 = [[
make_table(mon_data, [half2*0.55, half2*0.45]),
make_table(comp_data2, [half2*0.45, half2*0.55]),
]]
mon_t = Table(row_data2, colWidths=[half2, half2+0.4*cm])
mon_t.setStyle(TableStyle([
('VALIGN', (0,0), (-1,-1), 'TOP'),
('LEFTPADDING', (0,0), (-1,-1), 4),
('RIGHTPADDING', (0,0), (-1,-1), 4),
]))
story += [mon_t, Spacer(1, 0.2*cm), footer_note(), pb()]
# ════════════════════════════════════════════════════════════
# SLIDE 20 — SUMMARY + REFERENCES
# ════════════════════════════════════════════════════════════
story.append(header_block("Key Points Summary & References", "Take-Home Messages from Harrison's 22E"))
story.append(Spacer(1, 0.2*cm))
key_points = [
"1. AIHA = autoantibodies against own RBCs → premature hemolysis. Can be idiopathic or secondary.",
"2. Warm AIHA (IgG, 37°C): extravascular hemolysis mainly in SPLEEN. Cold (IgM, 4–30°C): intra + extravascular (liver).",
"3. Direct Coombs Test (DAT) is the GOLD STANDARD — almost diagnostic alone when positive.",
"4. Always look for UNDERLYING CAUSE: SLE, CLL, lymphoma, drugs (especially cefotetan, fludarabine).",
"5. Warm AIHA Treatment: Prednisone 1 mg/kg + Rituximab together (NOW FIRST LINE per Harrison's 22E).",
"6. CAD Treatment: Rituximab first line. Prednisone & Splenectomy are NOT effective in CAD.",
"7. Relapse is common in warm AIHA — have a second-line plan (splenectomy, azathioprine, fostamatinib).",
"8. Emergency transfusion: give ABO-matched incompatible blood if life-threatening — patient stays alive.",
"9. PCH: children, viral trigger, Donath-Landsteiner antibody, self-limiting — recovery is the rule.",
]
for kp in key_points:
story.append(info_box(kp, bg=OFF_WHITE, border=MID_BLUE))
story.append(Spacer(1, 0.1*cm))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("References", bg=MID_BLUE))
refs = [
"1. Harrison's Principles of Internal Medicine, 22nd Edition (2025). McGraw Hill Medical. Chapter 105: Hemolytic Anemias.",
"2. Brodsky RA: Warm autoimmune hemolytic anemia. N Engl J Med 381:64, 2019.",
"3. Autoimmune hemolytic anemias. N Engl J Med 385:1407, 2021.",
"4. Dacie J: The Haemolytic Anaemias. London, Churchill Livingstone.",
"5. Cervera R et al: Arthritis Rheum 46:1019, 2002.",
]
for ref in refs:
story.append(Paragraph(ref, SMALL_S))
story.append(Spacer(1, 0.2*cm))
story.append(footer_note("Harrison's Principles of Internal Medicine 22E (2025, McGraw Hill) | Department Grand Rounds | Autoimmune Hemolytic Anemia"))
# ─── Build ──────────────────────────────────────────────────────
doc.build(story)
print(f"SUCCESS: PDF saved to {OUT}")
print(f"Size: {os.path.getsize(OUT) / 1024:.1f} KB")
python3 /home/daytona/workspace/aiha-ppt/make_pdf.py 2>&1
AIHA Presentation
PDF Document · PDF