And merge both files in 1 Can you put the questions at the end. And also Iβve got an exam I donβt know anything. Explain everything in detail in simple words like youβre teaching it to a very dumb kid
python -m markitdown /home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_6_Oncology_DH_26.pptx 2>&1 | head -300
python -m markitdown /home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_7_Oncology_DH_26.pptx 2>&1 | head -300
python3 -c " from pptx import Presentation prs = Presentation('/home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_6_Oncology_DH_26.pptx') for i, slide in enumerate(prs.slides): print(f'=== SLIDE {i+1} ===') for shape in slide.shapes: if hasattr(shape, 'text') and shape.text.strip(): print(shape.text) print() " 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_7_Oncology_DH_26.pptx') for i, slide in enumerate(prs.slides): print(f'=== SLIDE {i+1} ===') for shape in slide.shapes: if hasattr(shape, 'text') and shape.text.strip(): print(shape.text) print() " 2>&1
ls /home/daytona/skills/pptx/scripts/ 2>&1 && ls /home/daytona/skills/pptx/ 2>&1
ls /home/daytona/skills/pptx/scripts/ 2>&1
pip install python-pptx --quiet 2>&1 | tail -5
python3 -c " from pptx import Presentation prs = Presentation('/home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_6_Oncology_DH_26.pptx') for i, slide in enumerate(prs.slides): print(f'=== SLIDE {i+1} ===') for shape in slide.shapes: if hasattr(shape, 'text') and shape.text.strip(): print(shape.text) print() " 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_7_Oncology_DH_26.pptx') for i, slide in enumerate(prs.slides): print(f'=== SLIDE {i+1} ===') for shape in slide.shapes: if hasattr(shape, 'text') and shape.text.strip(): print(shape.text) print() " 2>&1
python3 -c " from pptx import Presentation prs = Presentation('/home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_6_Oncology_DH_26.pptx') print('LECTURE 6 - Slide count:', len(prs.slides)) for i, slide in enumerate(prs.slides): print(f'=== SLIDE {i+1} ===') for shape in slide.shapes: if hasattr(shape, 'text') and shape.text.strip(): print(shape.text) print() " 2>&1
python3 -c " from pptx import Presentation import os prs6 = Presentation('/home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_6_Oncology_DH_26.pptx') prs7 = Presentation('/home/daytona/workspace/attachments/fb06b58f-73b8-4357-ae1f-3636509bae7e/Lecture_7_Oncology_DH_26.pptx') print(f'Lecture 6: {len(prs6.slides)} slides') print(f'Lecture 7: {len(prs7.slides)} slides') # Check slide layouts and any notes print() print('=== LECTURE 6 NOTES ===') for i, slide in enumerate(prs6.slides): if slide.notes_slide and slide.notes_slide.notes_text_frame.text.strip(): print(f'Slide {i+1}: {slide.notes_slide.notes_text_frame.text}') print() print('=== LECTURE 7 NOTES ===') for i, slide in enumerate(prs7.slides): if slide.notes_slide and slide.notes_slide.notes_text_frame.text.strip(): print(f'Slide {i+1}: {slide.notes_slide.notes_text_frame.text}') " 2>&1
mkdir -p /home/daytona/workspace/oncology-study && ls /home/daytona/workspace/oncology-study/
~/oncology-study/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_16x9";
pres.title = "Oncology Lectures 6 & 7 - CNS Cancers Study Guide";
// βββ Color Palette βββββββββββββββββββββββββββββββββββββββββββββββ
const C = {
navy: "0D1B2A", // dominant dark background
teal: "1B998B", // accent headers
gold: "FFCF50", // key term highlights
white: "FFFFFF",
lightBg: "EDF2F4", // light slide backgrounds
red: "E63946", // warning / bad prognosis
green: "2DC653", // good prognosis
gray: "8D99AE", // muted text
darkText:"0D1B2A",
};
// βββ Helper: add a slide with navy title bar ββββββββββββββββββββββ
function titleSlide(title, subtitle) {
let s = pres.addSlide();
// full navy background
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
// teal accent band
s.addShape(pres.ShapeType.rect, { x: 0, y: 2.4, w: 10, h: 0.08, fill: { color: C.teal } });
s.addText(title, {
x: 0.5, y: 1.2, w: 9, h: 1.0,
fontSize: 40, bold: true, color: C.white, fontFace: "Calibri", align: "center",
});
if (subtitle) {
s.addText(subtitle, {
x: 0.5, y: 2.7, w: 9, h: 0.8,
fontSize: 20, color: C.teal, fontFace: "Calibri", align: "center",
});
}
return s;
}
function sectionHeader(title, subtitle) {
let s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
s.addShape(pres.ShapeType.rect, { x: 0.4, y: 1.5, w: 0.1, h: 2.5, fill: { color: C.teal } });
s.addText(title, {
x: 0.8, y: 1.6, w: 8.5, h: 1.0,
fontSize: 34, bold: true, color: C.white, fontFace: "Calibri",
});
if (subtitle) {
s.addText(subtitle, {
x: 0.8, y: 2.8, w: 8.5, h: 0.8,
fontSize: 18, color: C.gray, fontFace: "Calibri",
});
}
return s;
}
// Content slide: light bg, teal top bar, bullets
function contentSlide(title, bullets, opts = {}) {
let s = pres.addSlide();
// light background
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.lightBg } });
// teal top bar
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.8, fill: { color: C.teal } });
s.addText(title, {
x: 0.3, y: 0.08, w: 9.4, h: 0.65,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// Build bullet items
let items = bullets.map((b, i) => {
let isLast = i === bullets.length - 1;
if (typeof b === "string") {
return { text: b, options: { bullet: { type: "bullet" }, color: C.darkText, fontSize: 15, fontFace: "Calibri", breakLine: !isLast } };
}
// object with text + highlight
return {
text: b.text,
options: { bullet: { type: "bullet" }, color: b.color || C.darkText, bold: b.bold || false, fontSize: b.size || 15, fontFace: "Calibri", breakLine: !isLast }
};
});
s.addText(items, {
x: 0.4, y: 1.0, w: 9.2, h: 4.4,
valign: "top", paraSpaceAfter: 4,
});
return s;
}
// Two-column content slide
function twoColSlide(title, leftItems, rightItems, leftHead, rightHead) {
let s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.lightBg } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.8, fill: { color: C.navy } });
s.addText(title, {
x: 0.3, y: 0.08, w: 9.4, h: 0.65,
fontSize: 22, bold: true, color: C.white, fontFace: "Calibri", valign: "middle",
});
// divider
s.addShape(pres.ShapeType.rect, { x: 4.95, y: 0.9, w: 0.05, h: 4.6, fill: { color: C.gray } });
// left col header
if (leftHead) s.addText(leftHead, { x: 0.3, y: 0.9, w: 4.5, h: 0.4, fontSize: 14, bold: true, color: C.teal, fontFace: "Calibri" });
// right col header
if (rightHead) s.addText(rightHead, { x: 5.2, y: 0.9, w: 4.5, h: 0.4, fontSize: 14, bold: true, color: C.teal, fontFace: "Calibri" });
const makeItems = (arr) => arr.map((b, i) => ({
text: typeof b === "string" ? b : b.text,
options: { bullet: { type: "bullet" }, color: (typeof b === "object" && b.color) ? b.color : C.darkText, bold: (typeof b === "object" && b.bold) ? true : false, fontSize: 13, fontFace: "Calibri", breakLine: i !== arr.length - 1 }
}));
s.addText(makeItems(leftItems), { x: 0.3, y: 1.35, w: 4.5, h: 4.0, valign: "top", paraSpaceAfter: 4 });
s.addText(makeItems(rightItems), { x: 5.2, y: 1.35, w: 4.5, h: 4.0, valign: "top", paraSpaceAfter: 4 });
return s;
}
// Callout box slide (key concept)
function calloutSlide(title, bigLabel, explanation, details) {
let s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 0.15, w: 9.4, h: 1.1, fill: { color: C.teal }, rectRadius: 0.1 });
s.addText(title, { x: 0.5, y: 0.25, w: 9, h: 0.9, fontSize: 24, bold: true, color: C.white, fontFace: "Calibri", valign: "middle" });
// big label
s.addText(bigLabel, { x: 0.5, y: 1.45, w: 4, h: 1.3, fontSize: 28, bold: true, color: C.gold, fontFace: "Calibri", align: "center", valign: "middle" });
s.addText(explanation, { x: 4.6, y: 1.45, w: 5, h: 1.3, fontSize: 16, color: C.white, fontFace: "Calibri", valign: "middle" });
// details bullets
let items = details.map((d, i) => ({ text: d, options: { bullet: { type: "bullet" }, color: C.lightBg, fontSize: 14, fontFace: "Calibri", breakLine: i !== details.length - 1 } }));
s.addText(items, { x: 0.5, y: 3.0, w: 9, h: 2.4, valign: "top", paraSpaceAfter: 5 });
return s;
}
// Q&A slide
function qaSlide(num, question, answer) {
let s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.lightBg } });
// left gold bar
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.75, fill: { color: C.gold } });
s.addText(`Q${num}`, { x: 0.2, y: 0.08, w: 0.7, h: 0.6, fontSize: 22, bold: true, color: C.navy, fontFace: "Calibri", valign: "middle" });
s.addText("Exam Question", { x: 1.0, y: 0.1, w: 8.5, h: 0.55, fontSize: 18, bold: true, color: C.navy, fontFace: "Calibri", valign: "middle" });
// question box
s.addShape(pres.ShapeType.rect, { x: 0.3, y: 0.9, w: 9.4, h: 1.3, fill: { color: C.navy }, rectRadius: 0.08 });
s.addText(question, { x: 0.5, y: 0.95, w: 9, h: 1.2, fontSize: 16, bold: true, color: C.white, fontFace: "Calibri", valign: "middle" });
// answer label
s.addText("ANSWER:", { x: 0.3, y: 2.4, w: 2, h: 0.4, fontSize: 14, bold: true, color: C.teal, fontFace: "Calibri" });
// answer text
s.addText(answer, { x: 0.3, y: 2.85, w: 9.4, h: 2.6, fontSize: 14, color: C.darkText, fontFace: "Calibri", valign: "top" });
return s;
}
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 1 β Title
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
titleSlide(
"CNS Cancer Study Guide",
"Lectures 6 & 7 | Oncology | D. Hakimian β’ Simple Edition for Exam Prep"
);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 2 β What are CNS Cancers?
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("What Are CNS Cancers? (Think of it like this...)", [
{ text: "Your brain is made of MANY different cell types β neurons, support cells (glia), protective linings (meninges).", bold: true },
"Any of these cells can start dividing uncontrollably and become a tumor.",
"All brain tumors share ONE core problem: a cell gets stuck in a loop β it keeps dividing but never fully matures.",
"What DIFFERS between tumor types:",
" β WHICH cell got stuck (stem cell? glia? meningeal cell?)",
" β WHICH growth signal pathway was hijacked",
" β This determines: does the tumor invade? Compress? Respond to drugs?",
{ text: "Key stats: ~321,000 new CNS tumor cases worldwide in 2022; ~248,000 deaths. 6.2/100,000 in the US.", color: C.gray },
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 3 β Big Picture Overview (the 4 tumor types)
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("The 4 Main CNS Tumor Types β Cheat Sheet", [
{ text: "1. GLIOBLASTOMA (GBM) β IDH-wildtype", bold: true, color: C.red },
" Worst. Fastest. Most aggressive. No IDH mutation. Found in adults.",
{ text: "2. ASTROCYTOMA β IDH-mutant", bold: true, color: "#D4750A" },
" Slower. IDH gene is mutated. Better prognosis. Found in adults.",
{ text: "3. OLIGODENDROGLIOMA β IDH-mutant + 1p/19q co-deleted", bold: true, color: "#1B7A34" },
" Slowest diffuse glioma. Has BOTH IDH mutation AND chromosome deletion. Best prognosis of gliomas.",
{ text: "4. MEDULLOBLASTOMA β SHH pathway", bold: true, color: C.teal },
" Childhood tumor in cerebellum. Caused by stuck development signal (SHH). Treatable!",
{ text: "5. MENINGIOMA β NK2 loss", bold: true, color: C.navy },
" NOT invasive. Pushes brain, doesn't invade. Usually cured with surgery.",
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 4 β Section: Diffuse Gliomas
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sectionHeader("Section 1: Diffuse Gliomas", "Glioblastoma Β· Astrocytoma Β· Oligodendroglioma");
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 5 β What is IDH? (The most important concept)
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("IDH Mutation β The Single Most Important Concept", [
{ text: "IDH = a normal enzyme in your cells. When it mutates, it makes a TOXIC byproduct called 2-HG (2-hydroxyglutarate).", bold: true },
"Think of it like a factory machine that normally makes useful parts, but breaks and starts making garbage instead.",
"2-HG JAMS the switches that tell DNA when to turn genes on or off (epigenetic locking).",
"Result: the cancer cell CANNOT fully mature (differentiate) β it stays stuck like an eternal teenager.",
{ text: "IDH-MUTANT tumors (Astrocytoma, Oligodendroglioma):", bold: true, color: C.green },
" β Divide slowly, less mutational mess, respond better to treatment, BETTER PROGNOSIS β",
{ text: "IDH-WILDTYPE tumors (Glioblastoma):", bold: true, color: C.red },
" β No IDH mutation = no brake on proliferation = WORST PROGNOSIS β",
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 6 β Glioblastoma (GBM) β the monster
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("Glioblastoma (GBM) β Why It Is So Dangerous", [
{ text: "Think of GBM as a car with 3 things broken at once:", bold: true },
{ text: "1. Gas pedal stuck down β EGFR over-expressed = constant 'GROW!' signal. Cell divides non-stop.", bold: true },
{ text: "2. Brakes cut β PTEN lost = the brakes (stress/damage checkpoints) are gone. Cell ignores danger signals.", bold: true },
{ text: "3. Odometer reset to zero β TERT activated = cell never ages/dies (replicative immortality).", bold: true },
"Result: Massive tumor growth creating low-oxygen pockets (hypoxic niches).",
"Cells in low-oxygen zones divide SLOWER but are HARDER to kill with drugs.",
{ text: "Surgery? Radiation? Chemo (TMZ)? All help initially, but GBM almost always comes back.", color: C.red },
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 7 β GBM Resistance (MGMT)
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("GBM Resistance β Why TMZ Stops Working (MGMT)", [
{ text: "Temozolomide (TMZ) = the main chemo drug for GBM. It works by damaging the DNA in cancer cells.", bold: true },
"Think of TMZ as a wrecking ball smashing cancer DNA.",
{ text: "BUT β some GBM tumors have MGMT, which is like a repair crew that fixes all the damage.", bold: true },
"If MGMT is active β tumor repairs itself β TMZ fails β RESISTANCE.",
{ text: "MGMT+ (methylated promoter) = MGMT is SILENCED = repair crew is OFF = TMZ WORKS BETTER = good for patient!", color: C.green, bold: true },
{ text: "MGMT- (unmethylated) = MGMT is ACTIVE = repair crew keeps fixing = TMZ FAILS = bad for patient.", color: C.red, bold: true },
"KEY EXAM POINT: MGMT+ status = better response to TMZ chemo.",
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 8 β Astrocytoma (IDH-mutant)
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("Astrocytoma (IDH-mutant) β The Slower Glioma", [
{ text: "IDH is mutated β makes 2-HG β jams the DNA switches (epigenetic locking)", bold: true },
"The cell is stuck in a 'teenager' state β not fully mature, but not going crazy fast either.",
"This is like a car with the gas pedal stuck at 30 mph instead of 100 mph.",
{ text: "WHY DOES IDH MUTATION HELP PROGNOSIS?", bold: true, color: C.teal },
" β 2-HG locks the epigenome β limited genetic chaos β fewer mutations β more treatable",
" β The tumor does NOT have the massive mutational burden of GBM",
{ text: "Treatment: Surgery + TMZ chemotherapy. IDH-mutant tumors RESPOND to TMZ.", color: C.green },
"Prognosis: Much better than GBM β patients can survive years to decades.",
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 9 β Oligodendroglioma
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("Oligodendroglioma β The 'Double Mutation' Glioma", [
{ text: "Diagnosis requires TWO things: IDH mutation + 1p/19q co-deletion.", bold: true },
{ text: "What is 1p/19q co-deletion?", bold: true, color: C.teal },
" β Chromosomes 1 (short arm) and 19 (long arm) are both deleted.",
" β This removes DNA repair genes and cell cycle regulators.",
{ text: "Why does this help treatment?", bold: true, color: C.teal },
" β Think of it as kicking out the repair crew AND the traffic cop keeping cells in line.",
" β When you hit this tumor with PCV chemotherapy (which damages DNA), it CANNOT repair itself.",
" β Result: Cell death! PCV chemo works really well.",
{ text: "Best prognosis of all diffuse gliomas. Patients can live 10-20+ years.", color: C.green, bold: true },
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 10 β Comparison: 3 Diffuse Gliomas
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
{
let s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.lightBg } });
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.75, fill: { color: C.navy } });
s.addText("Diffuse Gliomas β Side by Side Comparison", { x: 0.3, y: 0.1, w: 9.4, h: 0.6, fontSize: 20, bold: true, color: C.white, fontFace: "Calibri", valign: "middle" });
const cols = [
{ x: 0.15, label: "Feature", items: ["IDH status", "1p/19q deletion", "MGMT relevant?", "Speed", "Prognosis", "Key drug"] },
{ x: 2.8, label: "Glioblastoma", items: ["Wildtype (normal)", "No", "Yes (MGMT+βTMZ works)", "Very fast", "POOR (~15 months)", "TMZ + RT"], color: C.red },
{ x: 5.45, label: "Astrocytoma", items: ["Mutant (2-HG)", "No", "Less critical", "Slow-moderate", "MODERATE (years)", "TMZ"], color: "#D4750A" },
{ x: 8.1, label: "Oligodendroglioma", items: ["Mutant (2-HG)", "YES", "No", "Slowest", "BEST (10-20 yrs)", "PCV chemo"], color: C.green },
];
cols.forEach(col => {
s.addText(col.label, { x: col.x, y: 0.85, w: 2.5, h: 0.45, fontSize: 13, bold: true, color: col.color || C.navy, fontFace: "Calibri", align: "center" });
col.items.forEach((item, i) => {
let bg = i % 2 === 0 ? "FFFFFF" : "E8F4F8";
s.addShape(pres.ShapeType.rect, { x: col.x, y: 1.3 + i * 0.68, w: 2.5, h: 0.65, fill: { color: bg }, line: { color: "D0D0D0", width: 0.5 } });
s.addText(item, { x: col.x + 0.05, y: 1.33 + i * 0.68, w: 2.4, h: 0.58, fontSize: 11, color: C.darkText, fontFace: "Calibri", valign: "middle", align: "center" });
});
});
}
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 11 β Section: Pediatric + Meningioma
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sectionHeader("Section 2: Pediatric Tumors & Meningioma", "Medulloblastoma Β· Meningioma");
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 12 β Medulloblastoma
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("Medulloblastoma β The Kid's Brain Tumor", [
{ text: "Location: CEREBELLUM (the part of your brain at the back that controls balance and coordination).", bold: true },
{ text: "Who gets it? Children. It is the most common malignant brain tumor in kids.", bold: true, color: C.teal },
"What goes wrong? It is a DEVELOPMENTAL ERROR β think of it like a construction project that never stops.",
" β Normally: progenitor cells divide rapidly β then get a STOP signal β differentiate into mature neurons.",
" β In Medulloblastoma: the STOP SIGNAL FAILS.",
{ text: "Why does the stop fail? The SHH (Sonic Hedgehog) pathway stays permanently ON.", bold: true },
" β SHH normally drives cell division in development. When it never turns off β endless dividing.",
{ text: "The good news: SHH blockers (drugs like vismodegib) work very well here!", color: C.green, bold: true },
"Treatment: Surgery + radiation + chemotherapy + SHH pathway blockers.",
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 13 β Meningioma
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("Meningioma β The 'Nice' Brain Tumor", [
{ text: "Origin: Arachnoid cells β these are the cells in the meninges (the protective wrapping around the brain). NOT from brain tissue itself.", bold: true },
"Analogy: Instead of cancer growing inside the house, it grows in the wallpaper around the house.",
{ text: "What goes wrong? Loss of NF2 (neurofibromatosis type 2) gene suppresses the normal boundary signals.", bold: true },
" β Cells normally know when to stop dividing at tissue borders. With NF2 loss, this boundary sense is gone.",
{ text: "KEY DIFFERENCE from gliomas:", bold: true, color: C.teal },
" β Meningiomas COMPRESS the brain (push it) β they do NOT invade into brain tissue.",
" β This is WHY surgery usually works! You can see clear edges and cut it out.",
{ text: "β IMPORTANT: Meningiomas CAN spread to the spine! Always do a spinal MRI.", color: C.red, bold: true },
"Prognosis: Usually good. Most are benign. Surgery is often curative.",
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 14 β Clinical Workflow
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sectionHeader("Section 3: Clinical Workflow & Case Studies", "How to diagnose and treat CNS tumors step by step");
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 15 β Clinical Workflow
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("How CNS Tumors Are Diagnosed & Treated β The Workflow", [
{ text: "STEP 1: Patient presents with symptoms", bold: true, color: C.teal },
" β Headaches, seizures, speech problems, weakness, confusion, balance issues",
{ text: "STEP 2: Imaging (MRI)", bold: true, color: C.teal },
" β Does the lesion enhance with contrast? (Ring-enhancing = aggressive = GBM)",
" β Is there necrosis? (dead tissue = aggressive)",
" β Is it diffuse/spreading or well-circumscribed?",
{ text: "STEP 3: Molecular Testing (MANDATORY)", bold: true, color: C.teal },
" β IDH mutation? (Yes = better prognosis, No = GBM territory)",
" β 1p/19q co-deletion? (Yes = Oligodendroglioma)",
" β MGMT promoter methylated? (Yes = TMZ will work)",
" β SHH pathway active? (Yes = Medulloblastoma)",
{ text: "STEP 4: Treat based on ALL of the above findings.", bold: true, color: C.teal },
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 16 β Case Studies Header
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sectionHeader("Case Studies β Practice Diagnosis", "Use the molecular markers to identify each tumor");
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 17 β Case 1
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
twoColSlide(
"Case 1 β 32-year-old with Seizures",
[
"Age: 32 years old",
"Symptoms: New-onset focal seizure + mild speech hesitation",
"MRI: Non-enhancing, diffuse lesion in LEFT FRONTAL LOBE",
"No necrosis β slow-growing, not aggressive",
"Molecular markers:",
" IDH+ (mutant) β",
" 1p/19q- (no deletion)",
" MGMT- (active repair)",
" SHH- (not medulloblastoma)",
],
[
{ text: "DIAGNOSIS: IDH-MUTANT ASTROCYTOMA", bold: true, color: C.teal },
"",
"Why? IDH+ but NO 1p/19q deletion β rules out oligodendroglioma β must be astrocytoma.",
"",
"Treatment: Surgery + surveillance β TMZ chemotherapy",
"",
{ text: "Prognosis: Moderate β years to live with treatment", color: "#D4750A" },
],
"The Patient",
"Diagnosis & Reasoning"
);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 18 β Case 2
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
twoColSlide(
"Case 2 β 68-year-old with Headache + Confusion",
[
"Age: 68 years old",
"Symptoms: Progressive headache, confusion, right-sided weakness",
"MRI: RING-ENHANCING lesion with NECROSIS",
" (Necrosis + ring enhancement = very aggressive!)",
"Molecular markers:",
" IDH- (wildtype) β no mutation",
" 1p/19q- (no deletion)",
" MGMT+ (methylated, silenced)",
" SHH- (not medulloblastoma)",
],
[
{ text: "DIAGNOSIS: GLIOBLASTOMA (GBM)", bold: true, color: C.red },
"",
"Why? IDH wildtype + ring-enhancing + necrosis = GBM. MGMT+ means the patient will RESPOND to TMZ chemo.",
"",
"Treatment: Surgery β TMZ + radiation",
"",
{ text: "Prognosis: Poor β median ~15 months even with treatment", color: C.red },
"",
"Silver lining: MGMT+ means TMZ chemo works β slightly better than MGMT- GBM.",
],
"The Patient",
"Diagnosis & Reasoning"
);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 19 β Case 3
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
twoColSlide(
"Case 3 β 45-year-old with Seizures + Calcified Lesion",
[
"Age: 45 years old",
"Symptoms: Seizures, neurologically intact",
"MRI: Frontal lobe lesion, PARTIALLY CALCIFIED",
" (Calcification is a clue for oligodendroglioma!)",
"Molecular markers:",
" IDH+ (mutant) β",
" 1p/19q+ (BOTH arms deleted) β",
" MGMT- (not critical here)",
" SHH- (not medulloblastoma)",
],
[
{ text: "DIAGNOSIS: OLIGODENDROGLIOMA", bold: true, color: C.green },
"",
"Why? IDH+ AND 1p/19q+ β this is the DEFINING combination for oligodendroglioma.",
"",
"Treatment: Surgery + radiation β PCV chemotherapy",
" (PCV damages DNA; without repair genes, tumor cells die)",
"",
{ text: "Prognosis: BEST of all diffuse gliomas β 10-20+ years", color: C.green, bold: true },
],
"The Patient",
"Diagnosis & Reasoning"
);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 20 β Case 4
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
twoColSlide(
"Case 4 β 7-year-old with Balance Problems",
[
"Age: 7 years old (CHILD!)",
"Symptoms: Ataxia (stumbling/clumsy) + vomiting",
" Vomiting = β intracranial pressure from the tumor",
" Ataxia = cerebellar location gives it away",
"MRI: Midline CEREBELLAR mass",
"Molecular markers:",
" IDH- (not a glioma)",
" 1p/19q- (not oligodendroglioma)",
" MGMT- (not relevant here)",
" SHH+ β KEY!",
],
[
{ text: "DIAGNOSIS: MEDULLOBLASTOMA", bold: true, color: C.teal },
"",
"Why? Child + cerebellum + SHH+ = medulloblastoma. All other markers negative.",
"",
"What is ataxia? Loss of muscle coordination β patient can't walk straight. Caused by cerebellar damage.",
"",
"Treatment: Surgery + radiation + chemo + SHH BLOCKERS (e.g. vismodegib)",
"",
{ text: "Prognosis: Variable β many children can be cured!", color: C.green },
"Note: Be careful with radiation in young children β can damage developing brain.",
],
"The Patient",
"Diagnosis & Reasoning"
);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 21 β Case 5
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
twoColSlide(
"Case 5 β 60-year-old, Incidental Finding",
[
"Age: 60 years old",
"Symptoms: Mild headaches only",
" Tumor found INCIDENTALLY (accidentally)",
"MRI: Well-circumscribed, DURAL-BASED lesion",
" (Dural-based = attached to meninges, not brain tissue)",
"Molecular markers:",
" IDH- (not a glioma)",
" 1p/19q- (not oligodendroglioma)",
" MGMT- (not relevant)",
" SHH- (not medulloblastoma)",
],
[
{ text: "DIAGNOSIS: MENINGIOMA", bold: true, color: C.navy },
"",
"Why? All markers negative + dural-based + well-circumscribed = meningioma. It pushes, doesn't invade.",
"",
"Treatment: Surgery OR observation (if small and not causing problems)",
"",
{ text: "β ALWAYS do a spinal MRI β meningiomas CAN spread to spine!", color: C.red, bold: true },
"",
{ text: "Prognosis: Usually excellent β surgery is often curative.", color: C.green },
],
"The Patient",
"Diagnosis & Reasoning"
);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 22 β Summary Cheat Sheet
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sectionHeader("Summary & Exam Cheat Sheet", "Everything you need to remember on one page");
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 23 β Master Cheat Sheet
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
contentSlide("MASTER CHEAT SHEET β Memorize This!", [
{ text: "IDH+ β better prognosis (Astrocytoma or Oligodendroglioma)", bold: true, color: C.green },
{ text: "IDH- β GBM territory β worst prognosis", bold: true, color: C.red },
{ text: "IDH+ AND 1p/19q+ β OLIGODENDROGLIOMA β PCV chemo β best glioma prognosis", bold: true, color: C.teal },
{ text: "IDH+ AND 1p/19q- β ASTROCYTOMA β TMZ chemo", bold: true, color: "#D4750A" },
{ text: "IDH- AND ring-enhancing + necrosis β GLIOBLASTOMA β TMZ + RT", bold: true, color: C.red },
{ text: "MGMT+ β TMZ works (repair crew silenced)", bold: true, color: C.green },
{ text: "MGMT- β TMZ may fail (repair crew active)", bold: true, color: C.red },
{ text: "SHH+ + child + cerebellum β MEDULLOBLASTOMA β SHH blockers", bold: true, color: C.teal },
{ text: "Dural-based + well-circumscribed + all markers - β MENINGIOMA β Surgery", bold: true, color: C.navy },
{ text: "Meningioma can spread to SPINE β always do spinal MRI!", bold: true, color: C.red },
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// SLIDE 24 β Lung Cancer Recap Answers (from recap slides 3-7)
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sectionHeader("Bonus: Lung Cancer Recap Answers", "From the Lecture 6 recap slides β answers explained");
contentSlide("Lung Cancer Recap β Answered Simply", [
{ text: "Q: Highest risk factor for lung cancer? β SMOKING (by far)", bold: true },
{ text: "Q: Two major classifications? β SCLC (Small Cell) vs NSCLC (Non-Small Cell)", bold: true },
"Q: Which location for which type?",
" β SCLC: Central/hilar location (near major airways)",
" β NSCLC Squamous Cell: Central too | NSCLC Adenocarcinoma: Peripheral (outer lung)",
{ text: "Q: Most frequent lung cancer? β ADENOCARCINOMA (~40%)", bold: true },
"Q: Why can you drug RAS in lung cancer but NOT in colorectal cancer?",
" β In colorectal cancer, RAS is mutated (constitutively active) β the drug has nothing to block.",
" β In lung adenocarcinoma, RAS is wild-type but overactivated β drugs can still work upstream.",
{ text: "Q: Molecular testing in all lung cancers? β EGFR, ALK, ROS1, KRAS, BRAF, MET, RET, PD-L1", bold: true },
]);
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
// QUESTIONS SECTION
// βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
sectionHeader("EXAM QUESTIONS", "Questions from the lectures β with full answers");
// Q1
qaSlide(1,
"What is the single biggest difference between IDH-mutant and IDH-wildtype gliomas, and why does it affect prognosis?",
"IDH-mutant gliomas carry a mutation in the IDH enzyme, which causes it to produce a toxic metabolite called 2-hydroxyglutarate (2-HG). This compound jams the epigenetic switches in the cell's DNA, locking the cancer cell in a slow-growing, progenitor-like state. Because the cells divide slowly and accumulate fewer mutations, they respond better to treatment and patients live significantly longer.\n\nIDH-wildtype gliomas (= Glioblastoma) have no such brake β no IDH mutation means no 2-HG jamming, so cells grow rapidly, accumulate massive mutations (genomic instability), and are highly therapy-resistant. Median survival is ~15 months even with treatment."
);
// Q2
qaSlide(2,
"A patient has IDH+, 1p/19q co-deletion. What is the diagnosis? What drug do you use and why does it work?",
"Diagnosis: OLIGODENDROGLIOMA.\n\nThe combination of IDH mutation + 1p/19q co-deletion is the defining molecular signature of oligodendroglioma β no other CNS tumor has both.\n\nDrug: PCV chemotherapy (Procarbazine, CCNU/Lomustine, Vincristine).\n\nWhy it works: The 1p/19q co-deletion physically removes the chromosomal regions that contain DNA repair genes and cell cycle regulators. Without these repair genes, when PCV damages the tumor's DNA, the cancer cells cannot fix the damage and die. The tumor has essentially lost its own repair machinery, making it exquisitely sensitive to DNA-damaging drugs."
);
// Q3
qaSlide(3,
"What is MGMT, and why does MGMT promoter methylation matter in Glioblastoma treatment?",
"MGMT (O6-methylguanine-DNA methyltransferase) is a DNA repair enzyme. When active, it repairs the specific type of DNA damage caused by temozolomide (TMZ) β the main chemotherapy drug for GBM.\n\nMGMT PROMOTER METHYLATED (MGMT+) = the gene's on-switch (promoter) is silenced by methylation β MGMT enzyme is NOT produced β the repair crew is gone β TMZ damage persists β cancer cells die β patient responds better to TMZ.\n\nMGMT PROMOTER UNMETHYLATED (MGMT-) = MGMT is fully active β it repairs all the TMZ-induced damage β tumor survives β TMZ resistance.\n\nIn summary: MGMT+ = good news for GBM patients because it means TMZ will actually work."
);
// Q4
qaSlide(4,
"A 7-year-old presents with vomiting and ataxia. MRI shows a midline cerebellar mass. SHH+. What is the diagnosis, what caused it, and how do you treat it?",
"Diagnosis: MEDULLOBLASTOMA.\n\nWhat is ataxia? Loss of muscle coordination β the child stumbles and cannot walk straight. This is caused by damage to/compression of the cerebellum, which controls balance.\n\nCause: During normal brain development, progenitor cells in the cerebellum divide rapidly (driven by the SHH = Sonic Hedgehog pathway) and then receive a STOP signal to differentiate into mature neurons. In medulloblastoma, this STOP signal fails β the SHH pathway stays permanently ON, driving endless cell division.\n\nTreatment: Surgery (remove the mass) + Radiation + Chemotherapy + SHH pathway blockers (e.g., vismodegib). Note: Avoid heavy radiation in very young children to protect the developing brain."
);
// Q5
qaSlide(5,
"What makes Glioblastoma so resistant to treatment? Name the 3 key molecular drivers.",
"GBM has three core molecular problems that make it extraordinarily aggressive and therapy-resistant:\n\n1. EGFR overexpression: The growth factor receptor is constitutively active β it sends a constant 'GROW NOW' signal even without external cues. This means the proliferation accelerator is stuck on.\n\n2. PTEN loss: PTEN normally acts as a brake β it tells cells to stop growing when stressed or damaged. Without PTEN, cells ignore DNA damage signals, stress signals, and hypoxia signals entirely.\n\n3. TERT activation: Telomerase is reactivated, resetting the cellular aging clock. Normally cells die after a set number of divisions; with TERT active, they divide forever (replicative immortality).\n\nTogether these create massive tumor growth, hypoxic niches where cells hide from chemo, and adaptive resistance."
);
// Q6
qaSlide(6,
"Why can't surgeons simply cut out diffuse gliomas (GBM, Astrocytoma, Oligodendroglioma)?",
"Diffuse gliomas get their name from the word 'diffuse' β meaning they spread out like ink in water throughout brain tissue rather than forming a neat ball.\n\nThis is because glioma cells arise from glia, which are naturally migratory cells (they move around during brain development). The cancer cells keep this migratory behavior β individual cells infiltrate deep into surrounding brain tissue far beyond what any scan can show.\n\nBy the time a patient is diagnosed, cancer cells have already spread widely through the brain. There is no clean edge to cut around. A surgeon removing the visible tumor would still leave millions of cancer cells behind.\n\nThis is fundamentally different from meningiomas, which compress the brain without invading it β those DO have clean edges and surgery works well."
);
// Q7
qaSlide(7,
"What is the difference between a tumor that INVADES vs one that COMPRESSES the brain? Give an example of each.",
"INVADING tumors (Gliomas β GBM, Astrocytoma, Oligodendroglioma):\nβ Cancer cells physically enter brain tissue, spreading between normal neurons.\nβ No clear border β the tumor blends into healthy brain.\nβ Surgery cannot fully remove them β cells are scattered everywhere.\nβ Think of a drop of food dye spreading through water β you cannot un-spread it.\n\nCOMPRESSING tumors (Meningioma):\nβ The tumor grows outside the brain (from meningeal cells) and pushes against it like a balloon pressing on the brain.\nβ There IS a clear border β healthy brain on one side, tumor on the other.\nβ Surgery can cut around it and remove the whole thing.\nβ Think of a balloon being pressed against a wall β you can remove the balloon without disturbing the wall.\n\nThis distinction is WHY meningiomas are often cured with surgery, while gliomas are not."
);
// Q8
qaSlide(8,
"Walk through the complete clinical workflow for diagnosing and treating a CNS tumor.",
"STEP 1 β Symptoms: Patient arrives with headaches, seizures, speech problems, weakness, or confusion.\n\nSTEP 2 β Imaging (MRI):\nβ’ Is it ring-enhancing with necrosis? β Aggressive (GBM)\nβ’ Non-enhancing, diffuse? β Slower-growing (astrocytoma/oligodendroglioma)\nβ’ Dural-based, well-circumscribed? β Meningioma\nβ’ Cerebellar in a child? β Think medulloblastoma\n\nSTEP 3 β Molecular Testing (determines exact diagnosis AND treatment):\nβ’ IDH mutation? Yes/No\nβ’ 1p/19q co-deletion? Yes/No\nβ’ MGMT promoter methylated? Yes/No (affects TMZ response)\nβ’ SHH pathway active? Yes/No\n\nSTEP 4 β Treatment:\nβ’ GBM: Surgery + TMZ + Radiation\nβ’ Astrocytoma: Surgery + surveillance + TMZ\nβ’ Oligodendroglioma: Surgery + Radiation + PCV\nβ’ Medulloblastoma: Surgery + Radiation + Chemo + SHH blockers\nβ’ Meningioma: Surgery (or observe if small) + spinal MRI"
);
// Q9
qaSlide(9,
"Recap question: A 45-year-old non-smoker has brain metastases. Biopsy shows lung adenocarcinoma. Markers: EGFR-, ALK+, PD-L1 ~80%. What is the treatment plan?",
"This is a Stage IV lung adenocarcinoma (metastatic β it has spread to the brain).\n\nKey findings:\nβ’ ALK+ β the ALK gene is fused/mutated β this drives cancer growth β ALK is a DRUGGABLE TARGET\nβ’ EGFR- β cannot use EGFR inhibitors\nβ’ PD-L1 ~80% β high β immunotherapy (checkpoint inhibitor) could also work\n\nTreatment:\n1. PRIMARY: ALK inhibitor (e.g., alectinib, crizotinib) β these drugs specifically block the ALK pathway. They also penetrate the blood-brain barrier, which is critical for treating brain metastases.\n\n2. FOR BRAIN METS: ALK inhibitors with good CNS penetration (alectinib preferred over crizotinib for brain mets).\n\n3. Immunotherapy: PD-L1 is high, BUT in ALK+ patients, immunotherapy alone is less effective β ALK inhibitors are preferred.\n\nNote: Surgery/radiation may be used for the brain mets in addition to systemic therapy."
);
// FINAL SLIDE
{
let s = pres.addSlide();
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 5.625, fill: { color: C.navy } });
s.addText("Good Luck on Your Exam!", {
x: 0.5, y: 1.2, w: 9, h: 1.2, fontSize: 40, bold: true, color: C.gold, fontFace: "Calibri", align: "center",
});
s.addText("Remember the 3-step key:", {
x: 1, y: 2.6, w: 8, h: 0.5, fontSize: 20, color: C.white, fontFace: "Calibri", align: "center",
});
s.addText([
{ text: "1. IDH status ", options: { bold: true, color: C.teal } },
{ text: "β 2. 1p/19q deletion ", options: { color: C.white } },
{ text: "β 3. MGMT / SHH", options: { bold: true, color: C.gold } },
], {
x: 1, y: 3.2, w: 8, h: 0.7, fontSize: 18, fontFace: "Calibri", align: "center",
});
s.addText("Lectures 6 & 7 | D. Hakimian | Oncology", {
x: 0.5, y: 4.8, w: 9, h: 0.5, fontSize: 12, color: C.gray, fontFace: "Calibri", align: "center",
});
}
pres.writeFile({ fileName: "/home/daytona/workspace/oncology-study/CNS_Oncology_Study_Guide.pptx" })
.then(() => console.log("SUCCESS: File written."))
.catch(err => { console.error("ERROR:", err); process.exit(1); });
cd /home/daytona/workspace/oncology-study && node build.js 2>&1
ls -lh /home/daytona/workspace/oncology-study/CNS_Oncology_Study_Guide.pptx
CNS Oncology Study Guide
Presentation Β· PPTX
Convert into pdf
which libreoffice && libreoffice --version 2>&1
libreoffice --headless --convert-to pdf /home/daytona/workspace/oncology-study/CNS_Oncology_Study_Guide.pptx --outdir /home/daytona/workspace/oncology-study/ 2>&1
Comvert into pdf and short
libreoffice --headless --convert-to pdf /home/daytona/workspace/oncology-study/CNS_Oncology_Study_Guide.pptx --outdir /home/daytona/workspace/oncology-study/ 2>&1
~/oncology-study/make_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
# ββ Output βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OUT = "/home/daytona/workspace/oncology-study/CNS_Oncology_Short_Guide.pdf"
# ββ Palette ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NAVY = colors.HexColor("#0D1B2A")
TEAL = colors.HexColor("#1B998B")
GOLD = colors.HexColor("#FFCF50")
RED = colors.HexColor("#E63946")
GREEN = colors.HexColor("#2DC653")
LGRAY = colors.HexColor("#F2F4F8")
DGRAY = colors.HexColor("#555555")
WHITE = colors.white
doc = SimpleDocTemplate(
OUT,
pagesize=A4,
leftMargin=1.8*cm, rightMargin=1.8*cm,
topMargin=1.8*cm, bottomMargin=1.8*cm,
title="CNS Oncology Study Guide",
)
W, H = A4
TW = W - 3.6*cm # usable text width
styles = getSampleStyleSheet()
def style(name, **kw):
s = ParagraphStyle(name, **kw)
return s
# Custom styles
S_TITLE = style("MyTitle",
fontSize=26, leading=30, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_CENTER)
S_H1 = style("H1",
fontSize=15, leading=18, textColor=WHITE,
fontName="Helvetica-Bold", spaceAfter=4)
S_H2 = style("H2",
fontSize=12, leading=14, textColor=TEAL,
fontName="Helvetica-Bold", spaceBefore=6, spaceAfter=2)
S_BODY = style("Body",
fontSize=10, leading=14, textColor=DGRAY,
fontName="Helvetica", spaceAfter=3)
S_BULLET = style("Bullet",
fontSize=10, leading=13, textColor=DGRAY,
fontName="Helvetica", leftIndent=12,
bulletIndent=0, spaceAfter=2)
S_KEY = style("Key",
fontSize=10, leading=13, textColor=NAVY,
fontName="Helvetica-Bold", spaceAfter=2)
S_Q = style("Q",
fontSize=11, leading=14, textColor=NAVY,
fontName="Helvetica-Bold", spaceAfter=4, spaceBefore=6)
S_A = style("A",
fontSize=10, leading=14, textColor=DGRAY,
fontName="Helvetica", spaceAfter=8, alignment=TA_JUSTIFY)
S_SMALL = style("Small",
fontSize=9, leading=12, textColor=DGRAY, fontName="Helvetica")
# ββ Helpers ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def colored_box(text, bg=NAVY, fg=WHITE, size=13):
"""Return a 1-cell Table acting as a colored banner."""
p = Paragraph(f"<font color='#{fg.hexval()[1:]}'>{text}</font>",
style("BoxText", fontSize=size, leading=size+3,
fontName="Helvetica-Bold", textColor=fg,
alignment=TA_CENTER))
t = Table([[p]], colWidths=[TW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 6),
("BOTTOMPADDING",(0,0),(-1,-1), 6),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING",(0,0), (-1,-1), 8),
]))
return t
def section_banner(title):
return colored_box(title, bg=TEAL, fg=WHITE, size=13)
def tip_box(text, bg=LGRAY):
p = Paragraph(text, style("TipText", fontSize=9.5, leading=13,
fontName="Helvetica", textColor=NAVY))
t = Table([[p]], colWidths=[TW])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), bg),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING",(0,0),(-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING",(0,0), (-1,-1), 8),
("BOX", (0,0), (-1,-1), 0.5, TEAL),
]))
return t
def hr():
return HRFlowable(width="100%", thickness=0.5, color=TEAL, spaceAfter=4, spaceBefore=4)
def b(text): return Paragraph(f"β’ {text}", S_BULLET)
def key(text): return Paragraph(text, S_KEY)
def body(text):return Paragraph(text, S_BODY)
def sp(n=4): return Spacer(1, n)
# ββ Build Story ββββββββββββββββββββββββββββββββββββββββββββββββββββ
story = []
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
# COVER
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(colored_box("CNS CANCER β ONCOLOGY STUDY GUIDE", bg=NAVY, fg=WHITE, size=20))
story.append(sp(6))
story.append(colored_box("Lectures 6 & 7 | D. Hakimian | Exam Prep β Short Version", bg=TEAL, fg=WHITE, size=11))
story.append(sp(10))
# Intro box
story.append(tip_box(
"<b>Core Idea:</b> Every CNS tumor is the same basic problem β a brain cell gets stuck "
"in a loop, keeps dividing, and never fully matures. "
"What differs: WHICH cell, WHICH pathway, and HOW it behaves (invades vs compresses)."
))
story.append(sp(8))
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
# 1. QUICK REFERENCE TABLE β all tumor types
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("1 β TUMOR TYPE QUICK REFERENCE"))
story.append(sp(4))
headers = ["Tumor", "IDH", "1p/19q", "MGMT", "SHH", "Key Feature", "Treatment", "Prognosis"]
rows = [
headers,
["Glioblastoma\n(GBM)", "Wildtype\n(β)", "β", "Matters!\n(+ = TMZ works)", "β",
"Ring-enhancing\n+ necrosis\nEGFRβ, PTEN lost", "Surgery\n+ TMZ + RT", "POOR\n~15 months"],
["Astrocytoma", "Mutant\n(+)", "β", "Less\ncritical", "β",
"Diffuse, slow\n2-HG produced\nepigenetic lock", "Surgery\n+ TMZ", "MODERATE\nyears"],
["Oligodendroglioma", "Mutant\n(+)", "BOTH\ndeleted (+)", "β", "β",
"Calcified lesion\nDNA repair lost", "Surgery\n+ RT + PCV", "BEST\n10-20 yrs"],
["Medulloblastoma", "β", "β", "β", "+(ON)",
"Child, cerebellum\nataxia, vomiting", "Surgery\n+ RT + Chemo\n+ SHH blockers", "Variable\nmany cured"],
["Meningioma", "β", "β", "β", "β",
"Dural-based\nwell-circumscribed\ncompresses brain", "Surgery\n(or observe)\n+ spinal MRI!", "GOOD\noften curative"],
]
col_w = [2.2*cm, 1.5*cm, 1.5*cm, 2.0*cm, 1.2*cm, 3.0*cm, 2.6*cm, 2.2*cm]
# Ensure total fits
tbl = Table(rows, colWidths=col_w, repeatRows=1)
tbl.setStyle(TableStyle([
# Header row
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 8),
("ALIGN", (0,0), (-1,0), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
# Data rows
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8),
("ALIGN", (0,1), (-1,-1), "CENTER"),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LGRAY]),
# Grid
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
# Color-code first column
("BACKGROUND", (0,1), (0,1), colors.HexColor("#FFE5E5")), # GBM
("BACKGROUND", (0,2), (0,2), colors.HexColor("#FFF3CD")), # Astrocytoma
("BACKGROUND", (0,3), (0,3), colors.HexColor("#D4EDDA")), # Oligo
("BACKGROUND", (0,4), (0,4), colors.HexColor("#D1ECF1")), # Medulloblastoma
("BACKGROUND", (0,5), (0,5), colors.HexColor("#E2E3E5")), # Meningioma
("FONTNAME", (0,1), (0,-1), "Helvetica-Bold"),
]))
story.append(tbl)
story.append(sp(8))
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
# 2. KEY CONCEPTS β simplified
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("2 β KEY CONCEPTS (Simply Explained)"))
story.append(sp(5))
story.append(Paragraph("IDH Mutation", S_H2))
story.append(tip_box(
"IDH is a normal enzyme. When it mutates it makes a toxic byproduct called <b>2-HG</b> "
"that jams the DNA 'on/off' switches (epigenetic locking). "
"The cancer cell can't fully mature β stays stuck like a teenager β divides slowly, fewer mutations. "
"<b>IDH+ = better prognosis.</b> <b>IDHβ (wildtype) = GBM = worst prognosis.</b>"
))
story.append(sp(5))
story.append(Paragraph("MGMT & TMZ Resistance", S_H2))
story.append(tip_box(
"<b>TMZ (Temozolomide)</b> is the main chemo for GBM. It works by damaging cancer DNA. "
"<b>MGMT</b> is a DNA repair enzyme β if active, it repairs the damage and TMZ fails. "
"<b>MGMT+ (methylated)</b> = MGMT is silenced = repair crew OFF = TMZ WORKS = good for patient. "
"<b>MGMTβ (unmethylated)</b> = MGMT is active = repair crew ON = TMZ FAILS."
))
story.append(sp(5))
story.append(Paragraph("Why Can't You Surgically Remove Diffuse Gliomas?", S_H2))
story.append(tip_box(
"Glioma cells are naturally migratory (they move through brain tissue). By diagnosis, "
"they've already spread far beyond the visible tumor β like ink dropped in water. "
"No clean edge to cut around. <b>Meningioma</b> is the opposite: it sits outside the brain "
"and compresses it (like a balloon pressing on a wall) β clear edges, surgery works."
))
story.append(sp(5))
story.append(Paragraph("GBM β 3 Molecular Drivers", S_H2))
data = [
["Driver", "Effect", "Simple Analogy"],
["EGFR overexpression", "Constant 'GROW!' signal", "Gas pedal stuck down"],
["PTEN loss", "Ignores stress/damage signals", "Brakes completely cut"],
["TERT activation", "Cells never age or die", "Odometer reset to zero"],
]
t2 = Table(data, colWidths=[4.5*cm, 5.5*cm, 6.2*cm])
t2.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), RED),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("ALIGN", (0,0), (-1,-1), "CENTER"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.4, colors.HexColor("#CCCCCC")),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LGRAY]),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
]))
story.append(t2)
story.append(sp(8))
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
# 3. CASE STUDIES
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("3 β CASE STUDIES"))
story.append(sp(5))
cases = [
{
"title": "Case 1 β 32F, Seizures, Frontal Lobe",
"markers": "IDH+ | 1p/19qβ | MGMTβ | SHHβ",
"dx": "IDH-mutant ASTROCYTOMA",
"dx_color": colors.HexColor("#D4750A"),
"why": "IDH+ confirms glioma; no 1p/19q deletion rules out oligodendroglioma β astrocytoma.",
"tx": "Surgery + surveillance β TMZ chemotherapy",
},
{
"title": "Case 2 β 68M, Headache + Confusion, Ring-enhancing + Necrosis",
"markers": "IDHβ | 1p/19qβ | MGMT+ | SHHβ",
"dx": "GLIOBLASTOMA (GBM)",
"dx_color": RED,
"why": "IDH wildtype + ring-enhancing + necrosis = GBM. MGMT+ = TMZ will work (slightly better outcome).",
"tx": "Surgery β TMZ + Radiation",
},
{
"title": "Case 3 β 45M, Seizures, Calcified Frontal Lesion",
"markers": "IDH+ | 1p/19q+ | MGMTβ | SHHβ",
"dx": "OLIGODENDROGLIOMA",
"dx_color": GREEN,
"why": "IDH+ AND 1p/19q+ = the defining combination. Calcification is a classic clue.",
"tx": "Surgery + Radiation β PCV chemotherapy",
},
{
"title": "Case 4 β 7-year-old, Ataxia + Vomiting, Cerebellar Mass",
"markers": "IDHβ | 1p/19qβ | MGMTβ | SHH+",
"dx": "MEDULLOBLASTOMA",
"dx_color": TEAL,
"why": "Child + cerebellum + SHH+ = medulloblastoma. Ataxia = loss of coordination (cerebellar damage).",
"tx": "Surgery + Radiation + Chemo + SHH blockers (e.g. vismodegib)",
},
{
"title": "Case 5 β 60F, Mild Headaches, Well-circumscribed Dural Mass",
"markers": "IDHβ | 1p/19qβ | MGMTβ | SHHβ",
"dx": "MENINGIOMA",
"dx_color": NAVY,
"why": "All markers negative + dural-based + well-circumscribed = meningioma (not brain tissue origin).",
"tx": "Surgery or observe + ALWAYS do spinal MRI (can spread to spine!)",
},
]
for c in cases:
story.append(Paragraph(c["title"], S_H2))
# marker row
mrow = [Paragraph(f"<b>Markers:</b> {c['markers']}", S_SMALL)]
mt = Table([mrow], colWidths=[TW])
mt.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), LGRAY),
("TOPPADDING",(0,0),(-1,-1),3),("BOTTOMPADDING",(0,0),(-1,-1),3),
("LEFTPADDING",(0,0),(-1,-1),6),("RIGHTPADDING",(0,0),(-1,-1),6),
]))
story.append(mt)
story.append(sp(2))
# dx + why + tx table
dx_p = Paragraph(f"<b>{c['dx']}</b>", style("DX", fontSize=10, fontName="Helvetica-Bold",
textColor=c["dx_color"], leading=13))
why_p = Paragraph(c["why"], S_SMALL)
tx_p = Paragraph(f"<b>Tx:</b> {c['tx']}", S_SMALL)
inner = Table([[dx_p], [why_p], [tx_p]], colWidths=[TW - 0.5*cm])
inner.setStyle(TableStyle([
("TOPPADDING",(0,0),(-1,-1),2),("BOTTOMPADDING",(0,0),(-1,-1),2),
("LEFTPADDING",(0,0),(-1,-1),0),
]))
story.append(inner)
story.append(sp(6))
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
# 4. EXAM QUESTIONS
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("4 β EXAM QUESTIONS & ANSWERS"))
story.append(sp(5))
qas = [
(
"Q1: What is the single biggest difference between IDH-mutant and IDH-wildtype gliomas?",
"IDH-mutant gliomas produce 2-HG, which jams epigenetic switches and locks cells in a slow-growing progenitor state β fewer mutations, better treatment response, better prognosis. "
"IDH-wildtype (GBM) has no such brake: rapid growth, genomic chaos, median survival ~15 months."
),
(
"Q2: Patient has IDH+, 1p/19q+. Diagnosis? Drug? Why does it work?",
"Diagnosis: OLIGODENDROGLIOMA (IDH+ AND 1p/19q+ is the defining combination). "
"Drug: PCV chemotherapy. It works because 1p/19q deletion removes DNA repair genes β when PCV damages tumor DNA, the cancer cannot fix it and dies."
),
(
"Q3: What is MGMT and why does MGMT+ matter in GBM?",
"MGMT is a DNA repair enzyme that fixes the exact damage caused by TMZ chemo. "
"MGMT+ (methylated) = the gene is silenced β repair enzyme not made β TMZ damage persists β cancer cells die β patient responds better. "
"MGMTβ = MGMT is active β repairs TMZ damage β resistance."
),
(
"Q4: 7-year-old with ataxia + vomiting, cerebellar mass, SHH+. Diagnosis, cause, treatment?",
"Diagnosis: MEDULLOBLASTOMA. Cause: SHH (Sonic Hedgehog) pathway stays permanently ON during development β the STOP signal for cell division never fires. "
"Ataxia = loss of coordination from cerebellar damage. "
"Treatment: Surgery + Radiation + Chemotherapy + SHH blockers (vismodegib). Use caution with radiation in young children."
),
(
"Q5: Name the 3 molecular drivers of GBM and explain each.",
"1. EGFR overexpression β constant proliferation signal (gas pedal stuck). "
"2. PTEN loss β cells ignore stress, hypoxia, and DNA damage (brakes cut). "
"3. TERT activation β cells never age or die (immortality). Together = explosive growth + therapy resistance."
),
(
"Q6: Why can't surgeons remove diffuse gliomas?",
"Glioma cells are migratory by nature β they spread individually through brain tissue far beyond the visible tumor (like ink in water). "
"By diagnosis, cancer cells are already scattered everywhere with no clean border to cut around. "
"Contrast with Meningioma, which compresses (not invades) the brain and has clear surgical margins."
),
(
"Q7: Invading vs compressing tumors β give an example of each.",
"INVADING (e.g., GBM, Astrocytoma): cells infiltrate brain tissue, no clear border, surgery cannot fully remove them. "
"COMPRESSING (e.g., Meningioma): grows outside brain, pushes it like a balloon pressing a wall, clear margins, surgery is effective."
),
(
"Q8: Walk through the full clinical workflow for a CNS tumor.",
"1. Symptoms: seizures, headache, weakness, confusion. "
"2. MRI: Ring-enhancing + necrosis = GBM; non-enhancing diffuse = slower glioma; dural-based = meningioma; cerebellar (child) = medulloblastoma. "
"3. Molecular testing: IDH? 1p/19q? MGMT? SHH? "
"4. Treat: GBM β Surgery+TMZ+RT | Astrocytoma β Surgery+TMZ | Oligo β Surgery+RT+PCV | Medulloblastoma β Surgery+RT+Chemo+SHH blockers | Meningioma β Surgery+spinal MRI."
),
(
"Q9: 45F non-smoker, brain mets, lung adenocarcinoma. Markers: EGFRβ, ALK+, PD-L1 80%. Treatment?",
"ALK+ is the actionable target. Use an ALK inhibitor (alectinib preferred for CNS penetration to treat brain mets). "
"Despite high PD-L1, immunotherapy alone is less effective in ALK+ disease β targeted therapy comes first. "
"Alectinib crosses the blood-brain barrier, treating both primary lung tumor and brain metastases."
),
]
for i, (q, a) in enumerate(qas, 1):
# Question box
qbox_p = Paragraph(q, style(f"QQ{i}", fontSize=10.5, fontName="Helvetica-Bold",
textColor=WHITE, leading=14))
qt = Table([[qbox_p]], colWidths=[TW])
qt.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), NAVY),
("TOPPADDING",(0,0),(-1,-1),5),("BOTTOMPADDING",(0,0),(-1,-1),5),
("LEFTPADDING",(0,0),(-1,-1),8),("RIGHTPADDING",(0,0),(-1,-1),8),
]))
story.append(qt)
story.append(sp(2))
story.append(Paragraph(a, S_A))
story.append(sp(4))
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
# CHEAT SHEET FOOTER
# ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(section_banner("MASTER CHEAT SHEET β Memorize These Rules"))
story.append(sp(4))
cheat = [
("IDH+ β better prognosis (Astrocytoma or Oligodendroglioma)", TEAL),
("IDHβ β GBM territory β worst prognosis", RED),
("IDH+ AND 1p/19q+ β OLIGODENDROGLIOMA β PCV chemo", GREEN),
("IDH+ AND 1p/19qβ β ASTROCYTOMA β TMZ chemo", colors.HexColor("#D4750A")),
("IDHβ + ring-enhancing + necrosis β GBM β TMZ + RT", RED),
("MGMT+ β TMZ works (repair silenced) β", GREEN),
("MGMTβ β TMZ may fail (repair active) β", RED),
("SHH+ + child + cerebellum β MEDULLOBLASTOMA β SHH blockers", TEAL),
("Dural-based + all markers β β MENINGIOMA β Surgery + spinal MRI!", NAVY),
]
for rule, col in cheat:
p = Paragraph(f"β’ {rule}", style("Cheat", fontSize=10, fontName="Helvetica-Bold",
textColor=col, leading=14, spaceAfter=2))
story.append(p)
story.append(sp(8))
story.append(colored_box("Good Luck on Your Exam! β Lectures 6 & 7 | D. Hakimian", bg=NAVY, fg=GOLD, size=13))
# ββ Build ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
doc.build(story)
print(f"PDF created: {OUT}")
python3 /home/daytona/workspace/oncology-study/make_pdf.py 2>&1
~/oncology-study/make_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/oncology-study/make_pdf.py'
python3 /home/daytona/workspace/oncology-study/make_pdf.py 2>&1
ls -lh /home/daytona/workspace/oncology-study/CNS_Oncology_Short_Guide.pdf
CNS Oncology Short Guide
PDF Document Β· PDF