Optimising Dysphagia Palliation in Oesophageal Cancer: Comparative Effectiveness of SEMS and Radiotherapy
"oesophageal cancer" AND "self-expanding metal stent" AND "radiotherapy" AND dysphagia
PMID: 33610215
PMID: 34042566
"esophageal cancer" AND dysphagia AND palliation AND ("brachytherapy" OR "external beam radiotherapy")
"esophageal cancer" AND dysphagia AND "self-expanding metal stent" AND palliation
PMID: 31636025
PMID: 36085137
"esophageal cancer" AND "stent" AND "brachytherapy" AND dysphagia
PMID: 32915105
PMID: 33930932
PMID: 32407795
"esophageal cancer" AND dysphagia AND stent AND complications AND palliation
SEMS vs radiotherapy dysphagia palliation oesophageal cancer 2023 2024 guidelines comparison
https://aoe.amegroups.org/article/view/5899/html
| Complication | Rate | Notes |
|---|---|---|
| Stent obstruction (tumour ingrowth/overgrowth, food impaction) | 30–40% | Managed by stent-in-stent technique or APC |
| Migration | Higher with FCSEMS | Lower with uncovered/PCSEMS |
| Perforation | 2–8% | Life-threatening if delayed; mortality up to 50% with fistula |
| Bleeding | Common (minor); fatal if aortic involvement | Risk multiplied in post-radiation esophageal wall |
| Fistula formation | ~5% | Particularly with concurrent radiation |
| Reflux/aspiration | Significant at GEJ | Anti-reflux valve stents may help |
| Outcome | Usual Care | EBRT + Usual Care | p-value |
|---|---|---|---|
| Dysphagia deterioration at 12 wks | 49% | 45% | 0.59 (NS) |
| Median overall survival | 19.7 weeks | 18.9 weeks | 0.70 (NS) |
| Bleeding events/hospitalisation | Higher | Fewer (subHR 0.52, p=0.038) | Significant |
| Parameter | SEMS | EBRT | Brachytherapy | Irradiation Stent |
|---|---|---|---|---|
| Speed of dysphagia relief | Hours to days | 4–6 weeks | 4–6 weeks | Hours (stent) + ongoing |
| Durability of relief | Limited (30–40% obstruct) | Moderate | Longer-lasting | Longest |
| Technical success | ~100% | N/A | ~100% | ~100% |
| Optimal life expectancy | <3 months | >3 months | >3 months | >3 months |
| Fistula sealing | Yes (covered SEMS) | No | No | Limited |
| Key toxicities | Migration, ingrowth, bleeding, perforation | Fatigue, oesophagitis | Fistula (8.3%), stenosis (12.2%) | Intermediate |
| Bleeding risk reduction | No | Yes (post-ROCS) | Possible | Likely |
| Cost-effectiveness | High | Lower (vs. SEMS alone post-ROCS) | Moderate | Unknown |
| Guideline status | First-line (ESGE 2021) | Not recommended concurrent with stent | Alternative for longer survival | Investigational |
i want to do a retrospective study of these two treatment modalities, kindly make a synopsis for me.
| Phase | Activity | Duration |
|---|---|---|
| Month 1 | Ethics approval, data governance clearance | 4 weeks |
| Months 1–3 | Patient identification and data extraction | 8 weeks |
| Months 3–4 | Data cleaning, coding, and database finalisation | 4 weeks |
| Months 4–5 | Statistical analysis | 4 weeks |
| Months 5–6 | Manuscript preparation and submission | 6 weeks |
| Total | ~6 months |
Notes for completion before submission:
- Insert your full name, designation, department, and institutional affiliation throughout.
- Specify the dysphagia scoring tool used at your centre (Ogilvie, Mellow-Pinkas, or EORTC QLQ-OES18 dysphagia subscale).
- Confirm your institution's data governance and ethics committee submission form requirements and attach this synopsis as the narrative section.
- A cover letter to the ethics committee chair, signed consent waiver request, and CV of the PI are typically required as supplementary documents.
i also want to study pain palliation by either of two as another primary objective besides dysphagea . observation will be made in locally advanced or metastatic oesophageal cancer patients who are not fit for other treatments and should not have received any anticancer treatment previously
"esophageal cancer" AND pain AND palliation AND ("stent" OR "radiotherapy")
"esophageal cancer" AND "treatment naive" AND "palliative" AND dysphagia
"esophageal cancer" AND pain AND "palliative radiotherapy"
"esophageal cancer" AND pain AND stent AND "quality of life"
PMID: 32380466
PMID: 35402038
PMID: 36172146
| Phase | Activity | Duration |
|---|---|---|
| Month 1 | Ethics committee approval; data governance clearance | 4 weeks |
| Months 1–3 | Patient identification; data extraction from EPR | 8 weeks |
| Months 3–4 | Data cleaning, coding, pseudonymisation, database finalisation | 4 weeks |
| Months 4–5 | Statistical analysis (primary, secondary, propensity score) | 4 weeks |
| Months 5–6 | Manuscript preparation and journal submission | 6 weeks |
| Total | ~6 months |
Completion checklist before submission:
- Fill in all investigator names, designations, and institutional details
- Confirm the pain scoring tool routinely used at your centre (NRS, VAS, or EORTC QLQ-OES18 pain domain) — adjust pain primary outcome definition accordingly
- Confirm your institution's dysphagia scoring tool (Ogilvie, Mellow-Pinkas, or EORTC QLQ-OES18 dysphagia subscale)
- Attach any required supplementary documents per your ethics committee's submission checklist (e.g., PI CV, co-investigator declarations, data extraction template, data storage agreement)
- A formal consent waiver application form may need to be completed separately depending on your institution's requirements
FOR same study suggest some good impressive alternate title
as per uploaded format make ppt for this synopsis
cd /home/daytona/workspace/attachments/1b60bb2a-c3f4-48f4-b6ee-096475d8a300 && python3 -c " import pdfplumber with pdfplumber.open('IEC PPT format.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): print(f'--- Page {i+1} ---') print(page.extract_text()) print() "
cd /home/daytona/workspace/attachments/1b60bb2a-c3f4-48f4-b6ee-096475d8a300 && python3 -c " import pdfplumber with pdfplumber.open('IEC PPT format.pdf') as pdf: for i, page in enumerate(pdf.pages): print(f'--- Page {i+1} size: {page.width} x {page.height} ---') # Get color info from rects/lines rects = page.rects for r in rects[:5]: print(' rect:', r) lines = page.lines for l in lines[:3]: print(' line:', l) chars = page.chars[:5] for c in chars: print(' char:', c.get('text'), 'color:', c.get('non_stroking_color'), 'size:', c.get('size')) " 2>&1 | head -120
ls /home/daytona/workspace/ 2>/dev/null && mkdir -p /home/daytona/workspace/iec-synopsis-ppt
~/iec-synopsis-ppt/create_iec_ppt.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3" x 7.5" — closest to 720x540 ratio (4:3 ish but WIDE chosen for readability)
// Override to 4:3 ratio matching the PDF (720x540 = 4:3)
// Actually use LAYOUT_4x3 for exact match
pres.layout = "LAYOUT_4x3"; // 10" x 7.5"
// ─── COLOUR PALETTE ───────────────────────────────────────────────
const C_SIDEBAR = "1C1C1C"; // near-black left sidebar
const C_PROTOCOL = "572316"; // dark maroon — "Protocol #" text
const C_RED = "C0392B"; // red for section headings
const C_DIVIDER = "D9D9D9"; // light grey divider bar
const C_WHITE = "FFFFFF";
const C_DARK_TEXT = "1A1A1A"; // near-black body text
const C_FIELD_BG = "F4F4F4"; // very light grey fill for entry boxes
const C_ACCENT = "2E4057"; // dark navy accent for sub-headings
// ─── HELPER: add standard slide chrome ────────────────────────────
// Each slide has: white bg, thin dark left sidebar strip, "Protocol #" top-left, red section title
function addChrome(slide, sectionTitle, showProtocol = true) {
// White full background
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: "100%", h: "100%",
fill: { color: C_WHITE },
line: { color: C_WHITE }
});
// Dark left sidebar strip (~0.3" wide)
slide.addShape(pres.ShapeType.rect, {
x: 0, y: 0, w: 0.28, h: 7.5,
fill: { color: C_SIDEBAR },
line: { color: C_SIDEBAR }
});
// "Protocol #" — top-left in maroon
if (showProtocol) {
slide.addText("Protocol #", {
x: 0.38, y: 0.15, w: 3.5, h: 0.45,
fontSize: 14, bold: true, color: C_PROTOCOL,
fontFace: "Calibri", margin: 0
});
}
// Red section title
slide.addText(sectionTitle, {
x: 0.38, y: 0.65, w: 9.3, h: 0.55,
fontSize: 20, bold: true, color: C_RED,
fontFace: "Calibri", margin: 0
});
// Grey horizontal divider under the title
slide.addShape(pres.ShapeType.rect, {
x: 0.38, y: 1.25, w: 9.3, h: 0.04,
fill: { color: C_DIVIDER },
line: { color: C_DIVIDER }
});
}
// ─── HELPER: labelled field row ────────────────────────────────────
function addField(slide, label, value, x, y, w, h, opts = {}) {
const labelH = 0.28;
const valueH = h - labelH - 0.04;
// Label
slide.addText(label, {
x, y, w, h: labelH,
fontSize: opts.labelSize || 9,
bold: true,
color: C_ACCENT,
fontFace: "Calibri",
margin: 0
});
// Value box
slide.addShape(pres.ShapeType.rect, {
x, y: y + labelH, w, h: valueH,
fill: { color: C_FIELD_BG },
line: { color: C_DIVIDER, pt: 0.5 }
});
if (value) {
slide.addText(value, {
x: x + 0.05, y: y + labelH + 0.03, w: w - 0.1, h: valueH - 0.06,
fontSize: opts.fontSize || 10,
color: C_DARK_TEXT,
fontFace: "Calibri",
valign: "top",
wrap: true,
margin: 0
});
}
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 1 — Details of the Applicant
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Details of the Applicant");
const fields = [
{ label: "Name:", value: "[To be completed]" },
{ label: "Designation:", value: "[To be completed]" },
{ label: "Department:", value: "Department of Radiation Oncology / Gastroenterology / Oncology" },
{ label: "Phone:", value: "[To be completed]" },
{ label: "Email:", value: "[To be completed]" },
{ label: "Date of the IEC SKIMS Meeting:", value: "[To be completed]" },
];
const startY = 1.38;
const rowH = 0.82;
fields.forEach((f, i) => {
addField(s, f.label, f.value, 0.38, startY + i * rowH, 9.3, rowH - 0.05);
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 2 — Details of the P.I. / Supervisor / Guide
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Details of the P.I. / Supervisor / Guide");
const fields = [
{ label: "Name:", value: "[To be completed]" },
{ label: "Qualification:", value: "[To be completed]" },
{ label: "Designation:", value: "[To be completed]" },
{ label: "Department:", value: "Department of Radiation Oncology / Gastroenterology / Oncology" },
{ label: "Phone:", value: "[To be completed]" },
{ label: "Email:", value: "[To be completed]" },
{ label: "Number of Ongoing Studies (where PI is involved):", value: "[To be completed]" },
];
const startY = 1.38;
const rowH = 0.72;
fields.forEach((f, i) => {
addField(s, f.label, f.value, 0.38, startY + i * rowH, 9.3, rowH - 0.04);
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 3 — Details of the Co-Investigator(s)
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Details of the Co-Investigator(s) / Co-Supervisor(s)");
// Header row for 3 co-investigators
const cols = [
{ label: "Co-Investigator #1", x: 0.38, w: 2.95 },
{ label: "Co-Investigator #2", x: 3.43, w: 2.95 },
{ label: "Co-Investigator #3", x: 6.48, w: 3.2 },
];
// Column headers
cols.forEach(col => {
slide_addColHeader(s, col.label, col.x, 1.38, col.w);
});
const rowLabels = ["Name:", "Qualification:", "Designation:", "Department:", "Phone:", "Email:"];
const startY = 1.85;
const rowH = 0.85;
rowLabels.forEach((lbl, i) => {
cols.forEach(col => {
addField(s, lbl, "[To be completed]", col.x, startY + i * rowH, col.w - 0.05, rowH - 0.06, { fontSize: 9, labelSize: 8 });
});
});
function slide_addColHeader(sl, text, x, y, w) {
sl.addShape(pres.ShapeType.rect, {
x, y, w, h: 0.38,
fill: { color: C_ACCENT },
line: { color: C_ACCENT }
});
sl.addText(text, {
x: x + 0.05, y, w: w - 0.1, h: 0.38,
fontSize: 10, bold: true, color: C_WHITE,
fontFace: "Calibri", valign: "middle", margin: 0
});
}
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 4 — Title of the Project
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Title of the Project / Study");
// Title box
s.addShape(pres.ShapeType.rect, {
x: 0.38, y: 1.38, w: 9.3, h: 1.6,
fill: { color: "EBF5FB" },
line: { color: "2E86C1", pt: 1.2 }
});
s.addText(
"Comparative Effectiveness of Self-Expanding Metal Stents (SEMS) Versus Radiotherapy for Palliation of Dysphagia and Pain in Treatment-Naive Patients with Locally Advanced or Metastatic Oesophageal Cancer Unfit for Standard Anticancer Treatment: A Retrospective Cohort Study at a Tertiary Cancer Centre (January 2017 – December 2023)",
{
x: 0.48, y: 1.42, w: 9.1, h: 1.52,
fontSize: 11.5, bold: true, color: C_ACCENT,
fontFace: "Calibri", valign: "middle", align: "center",
wrap: true, margin: 0
}
);
// Site
addField(s, "Site(s) where study is to be conducted:", "Tertiary Cancer Centre — [Institution Name, City]", 0.38, 3.15, 9.3, 0.78);
// Study type badge
s.addShape(pres.ShapeType.rect, {
x: 0.38, y: 4.1, w: 4.4, h: 0.55,
fill: { color: "D5F5E3" },
line: { color: "1E8449", pt: 0.8 }
});
s.addText("Study Design: Retrospective Cohort Study", {
x: 0.48, y: 4.1, w: 4.2, h: 0.55,
fontSize: 10, bold: true, color: "1E8449",
fontFace: "Calibri", valign: "middle", margin: 0
});
s.addShape(pres.ShapeType.rect, {
x: 4.9, y: 4.1, w: 4.78, h: 0.55,
fill: { color: "FDEDEC" },
line: { color: C_RED, pt: 0.8 }
});
s.addText("Study Period: January 2017 – December 2023", {
x: 5.0, y: 4.1, w: 4.6, h: 0.55,
fontSize: 10, bold: true, color: C_RED,
fontFace: "Calibri", valign: "middle", margin: 0
});
// Two arms
const armY = 4.85;
const armData = [
{ label: "Group A — SEMS", desc: "Treatment-naive patients receiving SEMS as primary palliative intervention for dysphagia", col: "2E86C1", bg: "EBF5FB" },
{ label: "Group B — Radiotherapy", desc: "Treatment-naive patients receiving palliative EBRT or intraluminal brachytherapy as primary intervention", col: "8E44AD", bg: "F5EEF8" },
];
armData.forEach((arm, i) => {
const ax = 0.38 + i * 4.75;
s.addShape(pres.ShapeType.rect, {
x: ax, y: armY, w: 4.55, h: 1.2,
fill: { color: arm.bg },
line: { color: arm.col, pt: 1 }
});
s.addText(arm.label, {
x: ax + 0.1, y: armY + 0.05, w: 4.3, h: 0.32,
fontSize: 10, bold: true, color: arm.col,
fontFace: "Calibri", margin: 0
});
s.addText(arm.desc, {
x: ax + 0.1, y: armY + 0.38, w: 4.3, h: 0.78,
fontSize: 9, color: C_DARK_TEXT,
fontFace: "Calibri", valign: "top", wrap: true, margin: 0
});
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 5 — Research Question / Hypothesis
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Research Question / Hypothesis");
// Research question
s.addText("Research Question", {
x: 0.38, y: 1.38, w: 9.3, h: 0.35,
fontSize: 12, bold: true, color: C_ACCENT,
fontFace: "Calibri", margin: 0
});
s.addShape(pres.ShapeType.rect, {
x: 0.38, y: 1.74, w: 9.3, h: 1.1,
fill: { color: "EBF5FB" },
line: { color: "2E86C1", pt: 1 }
});
s.addText(
"In treatment-naive patients with locally advanced or metastatic oesophageal cancer who are unfit for standard anticancer treatment, does palliative radiotherapy (EBRT or brachytherapy) provide superior or equivalent palliation of dysphagia and pain compared to self-expanding metal stent (SEMS) insertion over a 4-week follow-up period?",
{
x: 0.48, y: 1.77, w: 9.1, h: 1.04,
fontSize: 10.5, color: C_DARK_TEXT,
fontFace: "Calibri", valign: "top", wrap: true, italic: true, margin: 0
}
);
// Hypotheses
s.addText("Hypotheses", {
x: 0.38, y: 3.0, w: 9.3, h: 0.35,
fontSize: 12, bold: true, color: C_ACCENT,
fontFace: "Calibri", margin: 0
});
const hyps = [
{
label: "H₁ — Dysphagia:",
text: "Radiotherapy results in a significantly different proportion of patients achieving clinically meaningful dysphagia improvement (≥1-point Ogilvie score reduction) at 4 weeks compared to SEMS."
},
{
label: "H₂ — Pain:",
text: "Radiotherapy results in a significantly different proportion of patients achieving clinically meaningful pain reduction (≥2-point NRS reduction) at 4 weeks compared to SEMS."
},
{
label: "H₀ — Null Hypothesis:",
text: "There is no significant difference between SEMS and radiotherapy in dysphagia score improvement or pain reduction at 4 weeks in this population."
}
];
const hypStartY = 3.42;
const hypH = 0.95;
hyps.forEach((h, i) => {
const hy = hypStartY + i * (hypH + 0.05);
const col = i === 2 ? "7F8C8D" : (i === 0 ? "2E86C1" : "8E44AD");
const bg = i === 2 ? "F8F9FA" : (i === 0 ? "EBF5FB" : "F5EEF8");
s.addShape(pres.ShapeType.rect, {
x: 0.38, y: hy, w: 9.3, h: hypH,
fill: { color: bg },
line: { color: col, pt: 0.8 }
});
s.addText(h.label, {
x: 0.48, y: hy + 0.06, w: 9.1, h: 0.28,
fontSize: 9.5, bold: true, color: col,
fontFace: "Calibri", margin: 0
});
s.addText(h.text, {
x: 0.48, y: hy + 0.34, w: 9.1, h: 0.56,
fontSize: 9, color: C_DARK_TEXT,
fontFace: "Calibri", wrap: true, valign: "top", margin: 0
});
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 6 — Budget, Sponsor, Duration
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Budget / Funding / Duration");
const items = [
{ label: "Total Estimated Budget:", value: "No external funding required. Retrospective data analysis — costs limited to investigator time and data management. Estimated institutional cost: NIL (investigator-initiated study)." },
{ label: "Agency / Sponsor:", value: "None — Investigator-Initiated Study. No commercial sponsorship." },
{ label: "Conflict of Interest:", value: "None declared by any investigator." },
{ label: "Duration of the Project:", value: "6 months (approximately January 2026 – June 2026)" },
{ label: "Suggested Date of Starting the Study:", value: "[To be completed — pending ethics approval]" },
{ label: "Total Number of Patients to be Accrued:", value: "" },
];
const startY = 1.38;
let curY = startY;
items.slice(0, 5).forEach((item, i) => {
const h = i === 0 ? 1.05 : 0.78;
addField(s, item.label, item.value, 0.38, curY, 9.3, h - 0.05);
curY += h;
});
// Patient accrual — two side-by-side boxes
s.addText("Total Number of Patients to be Accrued:", {
x: 0.38, y: curY, w: 9.3, h: 0.28,
fontSize: 9, bold: true, color: C_ACCENT,
fontFace: "Calibri", margin: 0
});
curY += 0.3;
const accrualBoxes = [
{ label: "From [Institution]:", value: "Minimum 122 patients (61 per arm)" },
{ label: "Total:", value: "122 (minimum; all eligible patients Jan 2017 – Dec 2023)" },
];
accrualBoxes.forEach((box, i) => {
const bx = 0.38 + i * 4.75;
s.addShape(pres.ShapeType.rect, { x: bx, y: curY, w: 4.55, h: 0.55, fill: { color: C_FIELD_BG }, line: { color: C_DIVIDER } });
s.addText(`${box.label} ${box.value}`, {
x: bx + 0.08, y: curY + 0.04, w: 4.35, h: 0.47,
fontSize: 9.5, color: C_DARK_TEXT, fontFace: "Calibri", valign: "middle", wrap: true, margin: 0
});
});
curY += 0.65;
s.addText("Will biological products be sent outside SKIMS / Country? No — this is a retrospective records-based study. No biological samples are collected or transferred.", {
x: 0.38, y: curY, w: 9.3, h: 0.38,
fontSize: 8.5, italic: true, color: "7F8C8D",
fontFace: "Calibri", wrap: true, margin: 0
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 7 — Sample Size
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Sample Size");
// Summary boxes at top
const summaryBoxes = [
{ label: "Minimum Total Sample", value: "122 patients", col: "2E86C1", bg: "EBF5FB" },
{ label: "Per Arm (each group)", value: "61 patients", col: "8E44AD", bg: "F5EEF8" },
{ label: "Power", value: "80%", col: "1E8449", bg: "D5F5E3" },
{ label: "Significance (α)", value: "0.025 per co-primary*", col: C_RED, bg: "FDEDEC" },
];
summaryBoxes.forEach((b, i) => {
const bx = 0.38 + i * 2.38;
s.addShape(pres.ShapeType.rect, { x: bx, y: 1.38, w: 2.28, h: 0.9, fill: { color: b.bg }, line: { color: b.col, pt: 1.2 } });
s.addText(b.label, { x: bx + 0.08, y: 1.41, w: 2.1, h: 0.3, fontSize: 8.5, bold: true, color: b.col, fontFace: "Calibri", margin: 0 });
s.addText(b.value, { x: bx + 0.08, y: 1.72, w: 2.1, h: 0.5, fontSize: 12, bold: true, color: b.col, fontFace: "Calibri", valign: "middle", margin: 0 });
});
s.addText("* Bonferroni correction applied for dual co-primary outcomes (α = 0.025 each; family-wise α = 0.05)", {
x: 0.38, y: 2.34, w: 9.3, h: 0.28,
fontSize: 8, italic: true, color: "7F8C8D", fontFace: "Calibri", margin: 0
});
// Calculation method — two columns
const calcData = [
{
title: "Primary Outcome 1 — Dysphagia",
col: "2E86C1", bg: "EBF5FB",
rows: [
"Measure: Ogilvie Dysphagia Score (≥1-point improvement at 4 weeks)",
"Expected response: SEMS 78% vs. Radiotherapy 58%",
"Two-sided α = 0.025 | Power = 80%",
"Required n: 61 per arm (122 total)",
"Method: Two-proportion z-test"
]
},
{
title: "Primary Outcome 2 — Pain",
col: "8E44AD", bg: "F5EEF8",
rows: [
"Measure: NRS Pain Score (≥2-point reduction at 4 weeks)",
"Expected response: RT 60% vs. SEMS 35% (Martin et al., 2020)",
"Two-sided α = 0.025 | Power = 80%",
"Required n: 53 per arm (106 total)",
"Method: Two-proportion z-test"
]
}
];
calcData.forEach((calc, i) => {
const cx = 0.38 + i * 4.75;
s.addShape(pres.ShapeType.rect, { x: cx, y: 2.72, w: 4.55, h: 0.38, fill: { color: calc.col }, line: { color: calc.col } });
s.addText(calc.title, { x: cx + 0.1, y: 2.72, w: 4.35, h: 0.38, fontSize: 10, bold: true, color: C_WHITE, fontFace: "Calibri", valign: "middle", margin: 0 });
calc.rows.forEach((row, j) => {
const ry = 3.15 + j * 0.45;
s.addShape(pres.ShapeType.rect, { x: cx, y: ry, w: 4.55, h: 0.42, fill: { color: j % 2 === 0 ? calc.bg : C_WHITE }, line: { color: C_DIVIDER } });
s.addText(row, { x: cx + 0.1, y: ry + 0.04, w: 4.35, h: 0.34, fontSize: 9, color: C_DARK_TEXT, fontFace: "Calibri", valign: "middle", wrap: true, margin: 0 });
});
});
s.addText("Governing sample size: n = 122 (larger estimate from dysphagia outcome). All eligible patients within the study period will be included (census sampling).", {
x: 0.38, y: 5.4, w: 9.3, h: 0.38,
fontSize: 8.5, bold: true, color: C_ACCENT, fontFace: "Calibri", wrap: true, margin: 0
});
// Controls note
s.addShape(pres.ShapeType.rect, { x: 0.38, y: 5.84, w: 9.3, h: 0.45, fill: { color: C_FIELD_BG }, line: { color: C_DIVIDER } });
s.addText("Controls: No separate external control group. The two study arms (SEMS vs. Radiotherapy) serve as comparison groups. Propensity-score matching will create balanced pseudo-matched cohorts.", {
x: 0.48, y: 5.84, w: 9.1, h: 0.45,
fontSize: 8.5, color: C_DARK_TEXT, fontFace: "Calibri", valign: "middle", wrap: true, margin: 0
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 8 — Selection Criteria
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Selection Criteria");
// Two columns: Inclusion | Exclusion
const colDefs = [
{ label: "Inclusion Criteria", col: "1E8449", bg: "D5F5E3", x: 0.38, w: 4.55 },
{ label: "Exclusion Criteria", col: C_RED, bg: "FDEDEC", x: 5.03, w: 4.65 },
];
const inclusions = [
"Histologically/cytologically confirmed oesophageal carcinoma (SCC or adenocarcinoma)",
"Locally advanced (unresectable T3/T4 or N+) or metastatic (Stage IV) disease",
"TREATMENT-NAIVE: No prior anticancer therapy of any kind",
"Unfit for standard treatment (ECOG PS ≥3, significant comorbidity, MDT decision or patient refusal)",
"Receipt of SEMS or palliative RT (EBRT/BT) as primary dysphagia intervention (Jan 2017 – Dec 2023)",
"Documented baseline dysphagia and/or pain score within 2 weeks pre-intervention",
"Age ≥ 18 years",
"Minimum 4-week post-intervention follow-up documentation"
];
const exclusions = [
"Any prior anticancer treatment (chemo, immunotherapy, surgery, or radical RT)",
"SEMS as bridge to surgery or before preoperative chemoradiotherapy",
"Concurrent SEMS + EBRT (simultaneous combination — confounding)",
"Benign oesophageal strictures or non-malignant indication",
"Insufficient records: no baseline AND no post-intervention score available",
"Life expectancy < 2 weeks at time of intervention",
"Participation in concurrent interventional clinical trial affecting palliation endpoints"
];
colDefs.forEach((col, ci) => {
// Header
s.addShape(pres.ShapeType.rect, { x: col.x, y: 1.38, w: col.w, h: 0.42, fill: { color: col.col }, line: { color: col.col } });
s.addText(col.label, { x: col.x + 0.1, y: 1.38, w: col.w - 0.2, h: 0.42, fontSize: 11, bold: true, color: C_WHITE, fontFace: "Calibri", valign: "middle", margin: 0 });
});
const listData = [inclusions, exclusions];
colDefs.forEach((col, ci) => {
const items = listData[ci];
items.forEach((item, j) => {
const iy = 1.87 + j * 0.65;
s.addShape(pres.ShapeType.rect, {
x: col.x, y: iy, w: col.w, h: 0.62,
fill: { color: j % 2 === 0 ? col.bg : C_WHITE },
line: { color: C_DIVIDER }
});
s.addText([
{ text: "• ", options: { bold: true, color: col.col } },
{ text: item, options: { color: C_DARK_TEXT } }
], {
x: col.x + 0.08, y: iy + 0.04, w: col.w - 0.16, h: 0.54,
fontSize: 8.5, fontFace: "Calibri", valign: "top", wrap: true, margin: 0
});
});
});
// Vulnerable groups
s.addShape(pres.ShapeType.rect, { x: 0.38, y: 6.8, w: 9.3, h: 0.38, fill: { color: "FEF9E7" }, line: { color: "F39C12", pt: 0.8 } });
s.addText("Does the study involve vulnerable groups? Patients with advanced incurable cancer (vulnerable by virtue of terminal illness). No children, prisoners, or pregnant women. Standard ethical protections apply.", {
x: 0.48, y: 6.8, w: 9.1, h: 0.38,
fontSize: 8.5, color: C_DARK_TEXT, fontFace: "Calibri", valign: "middle", wrap: true, margin: 0
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 9 — Outcome Measures
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Outcome Measures");
// Co-primary outcomes side by side
const primaryCols = [
{
title: "CO-PRIMARY OUTCOME A — Dysphagia", col: "2E86C1", bg: "EBF5FB",
items: [
"Proportion achieving ≥1-point Ogilvie Dysphagia Score improvement at 4 weeks",
"Change in ordinal dysphagia score at 2 wks, 4 wks, 3 months",
"Tool: Ogilvie Dysphagia Score (0 = normal eating → 4 = total dysphagia)"
]
},
{
title: "CO-PRIMARY OUTCOME B — Pain", col: "8E44AD", bg: "F5EEF8",
items: [
"Proportion achieving ≥2-point NRS reduction at 4 weeks",
"Change in NRS (0–10) pain score at 2 wks, 4 wks, 3 months",
"Supplementary proxy: WHO analgesic ladder step change where NRS unavailable"
]
}
];
primaryCols.forEach((pc, i) => {
const px = 0.38 + i * 4.75;
s.addShape(pres.ShapeType.rect, { x: px, y: 1.38, w: 4.55, h: 0.42, fill: { color: pc.col }, line: { color: pc.col } });
s.addText(pc.title, { x: px + 0.08, y: 1.38, w: 4.38, h: 0.42, fontSize: 9, bold: true, color: C_WHITE, fontFace: "Calibri", valign: "middle", margin: 0 });
pc.items.forEach((item, j) => {
const iy = 1.85 + j * 0.5;
s.addShape(pres.ShapeType.rect, { x: px, y: iy, w: 4.55, h: 0.47, fill: { color: j % 2 === 0 ? pc.bg : C_WHITE }, line: { color: C_DIVIDER } });
s.addText([
{ text: String.fromCharCode(0x41 + j) + ". ", options: { bold: true, color: pc.col } },
{ text: item, options: {} }
], { x: px + 0.1, y: iy + 0.04, w: 4.35, h: 0.39, fontSize: 9, color: C_DARK_TEXT, fontFace: "Calibri", valign: "top", wrap: true, margin: 0 });
});
});
// Secondary outcomes
s.addShape(pres.ShapeType.rect, { x: 0.38, y: 3.38, w: 9.3, h: 0.38, fill: { color: C_ACCENT }, line: { color: C_ACCENT } });
s.addText("SECONDARY OUTCOME MEASURES", { x: 0.48, y: 3.38, w: 9.1, h: 0.38, fontSize: 11, bold: true, color: C_WHITE, fontFace: "Calibri", valign: "middle", margin: 0 });
const secClinical = [
"1. Overall Survival (OS): date of intervention to death or last follow-up",
"2. Time to Re-Intervention: time to rescue stent or repeat RT",
"3. Complication / Adverse Event Rates: stent migration, ingrowth, perforation, fistula, radiation oesophagitis, haemorrhage (CTCAE v5.0)",
"4. Health-Related Quality of Life: EORTC QLQ-C30 / QLQ-OES18 (dysphagia, pain, eating domains — where documented)",
"5. Nutritional Status: body weight and serum albumin at 4 and 12 weeks"
];
const secLab = [
"1. Serum Albumin (g/dL) — baseline, 4 wks, 12 wks",
"2. Body Weight (kg) — baseline, 4 wks, 12 wks",
"3. Haemoglobin (g/dL) — where bleeding events documented",
"",
""
];
// Clinical column
s.addText("Clinical:", { x: 0.38, y: 3.84, w: 5.5, h: 0.3, fontSize: 10, bold: true, color: C_ACCENT, fontFace: "Calibri", margin: 0 });
secClinical.forEach((item, j) => {
const iy = 4.16 + j * 0.5;
s.addShape(pres.ShapeType.rect, { x: 0.38, y: iy, w: 5.5, h: 0.47, fill: { color: j % 2 === 0 ? "EAF2FF" : C_WHITE }, line: { color: C_DIVIDER } });
s.addText(item, { x: 0.48, y: iy + 0.04, w: 5.3, h: 0.39, fontSize: 8.5, color: C_DARK_TEXT, fontFace: "Calibri", valign: "top", wrap: true, margin: 0 });
});
// Lab column
s.addText("Lab Parameters:", { x: 6.0, y: 3.84, w: 3.68, h: 0.3, fontSize: 10, bold: true, color: C_ACCENT, fontFace: "Calibri", margin: 0 });
secLab.slice(0, 3).forEach((item, j) => {
if (!item) return;
const iy = 4.16 + j * 0.5;
s.addShape(pres.ShapeType.rect, { x: 6.0, y: iy, w: 3.68, h: 0.47, fill: { color: j % 2 === 0 ? "EAF2FF" : C_WHITE }, line: { color: C_DIVIDER } });
s.addText(item, { x: 6.1, y: iy + 0.04, w: 3.48, h: 0.39, fontSize: 8.5, color: C_DARK_TEXT, fontFace: "Calibri", valign: "top", wrap: true, margin: 0 });
});
}
// ─────────────────────────────────────────────────────────────────
// SLIDE 10 — Benefits of the Project / Study
// ─────────────────────────────────────────────────────────────────
{
const s = pres.addSlide();
addChrome(s, "Benefits of the Project / Study");
// Two-column layout: To SKIMS | To Study Subjects
const benefitCols = [
{
title: "Benefits to SKIMS / Institution",
col: "2E4057", bg: "EAF2FF",
items: [
"First institutional audit of SEMS vs. RT outcomes in unfit oesophageal cancer patients — establishes a quality benchmark",
"Informs MDT protocols and departmental guidelines for palliative pathway decision-making",
"Generates pilot data to support future prospective/RCT grant applications",
"Enhances research profile and contributes to postgraduate training and academic output",
"Publication in a peer-reviewed journal enhances institutional academic standing"
]
},
{
title: "Benefits to Study Subjects / Future Patients",
col: "1E8449", bg: "D5F5E3",
items: [
"No direct risk — retrospective study with no intervention on enrolled patients",
"Findings will optimise treatment selection for future patients with the same condition",
"Identifies which patients benefit most from each modality (personalised palliation)",
"Pain palliation — first time pain is a designated primary outcome alongside dysphagia in this population at this centre",
"Directly addresses an underserved, vulnerable population excluded from most clinical trials"
]
}
];
benefitCols.forEach((bc, i) => {
const bx = 0.38 + i * 4.75;
s.addShape(pres.ShapeType.rect, { x: bx, y: 1.38, w: 4.55, h: 0.45, fill: { color: bc.col }, line: { color: bc.col } });
s.addText(bc.title, { x: bx + 0.1, y: 1.38, w: 4.35, h: 0.45, fontSize: 9.5, bold: true, color: C_WHITE, fontFace: "Calibri", valign: "middle", margin: 0 });
bc.items.forEach((item, j) => {
const iy = 1.9 + j * 0.9;
s.addShape(pres.ShapeType.rect, { x: bx, y: iy, w: 4.55, h: 0.86, fill: { color: j % 2 === 0 ? bc.bg : C_WHITE }, line: { color: C_DIVIDER } });
s.addText([
{ text: `${j + 1}. `, options: { bold: true, color: bc.col } },
{ text: item }
], { x: bx + 0.1, y: iy + 0.06, w: 4.35, h: 0.74, fontSize: 9, color: C_DARK_TEXT, fontFace: "Calibri", valign: "top", wrap: true, margin: 0 });
});
});
// Footer
s.addShape(pres.ShapeType.rect, { x: 0.38, y: 7.0, w: 9.3, h: 0.28, fill: { color: C_SIDEBAR }, line: { color: C_SIDEBAR } });
s.addText("Investigator-Initiated Study | No External Funding | No Conflict of Interest | Retrospective — Zero Risk to Subjects", {
x: 0.48, y: 7.0, w: 9.1, h: 0.28,
fontSize: 8, color: C_WHITE, fontFace: "Calibri", align: "center", valign: "middle", margin: 0
});
}
// ─────────────────────────────────────────────────────────────────
// SAVE
// ─────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx" })
.then(() => console.log("✅ PPT saved successfully."))
.catch(err => console.error("❌ Error:", err));
cd /home/daytona/workspace/iec-synopsis-ppt && node create_iec_ppt.js 2>&1
python3 -m markitdown /home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx 2>&1 | head -80
python3 -c " from pptx import Presentation prs = Presentation('/home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx') print(f'Slides: {len(prs.slides)}') for i, slide in enumerate(prs.slides): texts = [] for shape in slide.shapes: if shape.has_text_frame: for para in shape.text_frame.paragraphs: t = para.text.strip() if t: texts.append(t[:60]) print(f'Slide {i+1}: {texts[:3]}') "
# Verify the file size and existence ls -lh /home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx # Extract text using unzip to check content cd /tmp && unzip -o /home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx "ppt/slides/slide*.xml" -d pptx_check 2>&1 | head -5 ls /tmp/pptx_check/ppt/slides/ | head -12
ls /tmp/pptx_check/ppt/slides/
~/iec-synopsis-ppt/create_iec_ppt2.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_4x3"; // 10" x 7.5"
// ─── COLOUR PALETTE ──────────────────────────────────────────────
const C_SIDEBAR = "1C1C1C";
const C_PROTOCOL = "572316"; // dark maroon
const C_RED = "C0392B";
const C_DIVIDER = "D9D9D9";
const C_WHITE = "FFFFFF";
const C_DARK_TEXT = "1A1A1A";
const C_FIELD_BG = "F4F4F4";
const C_ACCENT = "2E4057"; // dark navy
// ─── HELPERS ─────────────────────────────────────────────────────
function addChrome(slide, sectionTitle) {
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:"100%", h:"100%", fill:{color:C_WHITE}, line:{color:C_WHITE} });
slide.addShape(pres.ShapeType.rect, { x:0, y:0, w:0.28, h:7.5, fill:{color:C_SIDEBAR}, line:{color:C_SIDEBAR} });
slide.addText("Protocol #", { x:0.38, y:0.15, w:3.5, h:0.42, fontSize:13, bold:true, color:C_PROTOCOL, fontFace:"Calibri", margin:0 });
slide.addText(sectionTitle, { x:0.38, y:0.63, w:9.3, h:0.52, fontSize:18, bold:true, color:C_RED, fontFace:"Calibri", margin:0 });
slide.addShape(pres.ShapeType.rect, { x:0.38, y:1.21, w:9.3, h:0.04, fill:{color:C_DIVIDER}, line:{color:C_DIVIDER} });
}
function addField(slide, label, value, x, y, w, h, fontSize) {
const fs = fontSize || 9.5;
const lh = 0.26;
slide.addText(label, { x, y, w, h:lh, fontSize:9, bold:true, color:C_ACCENT, fontFace:"Calibri", margin:0 });
slide.addShape(pres.ShapeType.rect, { x, y:y+lh, w, h:h-lh-0.04, fill:{color:C_FIELD_BG}, line:{color:C_DIVIDER, pt:0.5} });
if (value) {
slide.addText(value, { x:x+0.07, y:y+lh+0.04, w:w-0.14, h:h-lh-0.1, fontSize:fs, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
}
}
function addHeader(slide, text, x, y, w, h, col, bg) {
slide.addShape(pres.ShapeType.rect, { x, y, w, h, fill:{color:col}, line:{color:col} });
slide.addText(text, { x:x+0.08, y, w:w-0.16, h, fontSize:9.5, bold:true, color:C_WHITE, fontFace:"Calibri", valign:"middle", margin:0 });
}
function addListItem(slide, number, text, x, y, w, h, col, bg) {
slide.addShape(pres.ShapeType.rect, { x, y, w, h, fill:{color:bg}, line:{color:C_DIVIDER} });
slide.addText([
{ text: number + ". ", options:{ bold:true, color:col } },
{ text: text }
], { x:x+0.08, y:y+0.04, w:w-0.16, h:h-0.08, fontSize:8.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
}
// ═══════════════════════════════════════════════════════════════════
// SLIDE 1 — Details of the Applicant
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Details of the Applicant");
const fields = [
["Name:", "[To be completed]"],
["Designation:", "[To be completed]"],
["Department:", "Oncology / Radiation Oncology / Gastroenterology"],
["Phone:", "[To be completed]"],
["Email:", "[To be completed]"],
["Date of the IEC SKIMS Meeting:", "[To be completed]"],
];
fields.forEach((f, i) => {
addField(s, f[0], f[1], 0.38, 1.35 + i * 0.98, 9.3, 0.9);
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 2 — Details of the P.I.
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Details of the P.I. / Supervisor / Guide");
const fields = [
["Name:", "[To be completed]"],
["Qualification:", "[To be completed]"],
["Designation:", "[To be completed]"],
["Department:", "Oncology / Radiation Oncology / Gastroenterology"],
["Phone:", "[To be completed]"],
["Email:", "[To be completed]"],
["Number of Ongoing Studies (where PI is involved):", "[To be completed]"],
];
fields.forEach((f, i) => {
addField(s, f[0], f[1], 0.38, 1.35 + i * 0.82, 9.3, 0.75);
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 3 — Co-Investigators
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Details of the Co-Investigator(s) / Co-Supervisor(s)");
const cols = [
{ label:"Co-Investigator #1", x:0.38, w:2.95 },
{ label:"Co-Investigator #2", x:3.43, w:2.95 },
{ label:"Co-Investigator #3", x:6.48, w:3.2 },
];
cols.forEach(col => {
addHeader(s, col.label, col.x, 1.35, col.w, 0.4, C_ACCENT, C_ACCENT);
});
const rowLabels = ["Name:", "Qualification:", "Designation:", "Department:", "Phone:", "Email:"];
rowLabels.forEach((lbl, i) => {
cols.forEach(col => {
addField(s, lbl, "[To be completed]", col.x, 1.82 + i * 0.9, col.w - 0.05, 0.83, 9);
});
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 4 — Title of the Project
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Title of the Project / Study");
// Title box
s.addShape(pres.ShapeType.rect, { x:0.38, y:1.35, w:9.3, h:1.5, fill:{color:"EBF5FB"}, line:{color:"2E86C1", pt:1.2} });
s.addText(
"Comparative Effectiveness of Self-Expanding Metal Stents (SEMS) Versus Radiotherapy for Palliation of Dysphagia and Pain in Treatment-Naive Patients with Locally Advanced or Metastatic Oesophageal Cancer Unfit for Standard Anticancer Treatment: A Retrospective Cohort Study (January 2017 – December 2023)",
{ x:0.5, y:1.38, w:9.06, h:1.44, fontSize:11, bold:true, color:C_ACCENT, fontFace:"Calibri", valign:"middle", align:"center", wrap:true, margin:0 }
);
addField(s, "Site(s) where study is to be conducted:", "Tertiary Cancer Centre — [Institution Name, City]", 0.38, 2.95, 9.3, 0.75);
// Badges row
const badges = [
{ text:"Study Design: Retrospective Cohort Study", col:"1E8449", bg:"D5F5E3" },
{ text:"Study Period: January 2017 – December 2023", col:C_RED, bg:"FDEDEC" },
];
badges.forEach((b, i) => {
const bx = 0.38 + i * 4.75;
s.addShape(pres.ShapeType.rect, { x:bx, y:3.82, w:4.55, h:0.5, fill:{color:b.bg}, line:{color:b.col, pt:0.8} });
s.addText(b.text, { x:bx+0.1, y:3.82, w:4.35, h:0.5, fontSize:10, bold:true, color:b.col, fontFace:"Calibri", valign:"middle", margin:0 });
});
// Comparison arms
const arms = [
{ label:"Group A — SEMS", desc:"Treatment-naive patients receiving SEMS as primary palliative intervention for dysphagia and/or pain", col:"2E86C1", bg:"EBF5FB" },
{ label:"Group B — Radiotherapy (EBRT / BT)", desc:"Treatment-naive patients receiving palliative external beam RT or intraluminal brachytherapy as primary intervention", col:"8E44AD", bg:"F5EEF8" },
];
arms.forEach((arm, i) => {
const ax = 0.38 + i * 4.75;
s.addShape(pres.ShapeType.rect, { x:ax, y:4.45, w:4.55, h:0.38, fill:{color:arm.col}, line:{color:arm.col} });
s.addText(arm.label, { x:ax+0.1, y:4.45, w:4.35, h:0.38, fontSize:10, bold:true, color:C_WHITE, fontFace:"Calibri", valign:"middle", margin:0 });
s.addShape(pres.ShapeType.rect, { x:ax, y:4.86, w:4.55, h:0.85, fill:{color:arm.bg}, line:{color:C_DIVIDER} });
s.addText(arm.desc, { x:ax+0.1, y:4.9, w:4.35, h:0.77, fontSize:9.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
s.addText("Both arms: Treatment-naive | Locally advanced or metastatic | Unfit for standard anticancer therapy", {
x:0.38, y:5.82, w:9.3, h:0.32, fontSize:9, bold:true, color:"7F8C8D", fontFace:"Calibri", align:"center", italic:true, margin:0
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 5 — Research Question / Hypothesis
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Research Question / Hypothesis");
s.addText("Research Question", { x:0.38, y:1.35, w:9.3, h:0.3, fontSize:11, bold:true, color:C_ACCENT, fontFace:"Calibri", margin:0 });
s.addShape(pres.ShapeType.rect, { x:0.38, y:1.68, w:9.3, h:1.05, fill:{color:"EBF5FB"}, line:{color:"2E86C1", pt:1} });
s.addText(
"In treatment-naive patients with locally advanced or metastatic oesophageal cancer who are unfit for standard anticancer treatment, does palliative radiotherapy (EBRT or brachytherapy) provide superior or equivalent palliation of dysphagia AND pain compared to self-expanding metal stent (SEMS) insertion over a 4-week follow-up period?",
{ x:0.48, y:1.71, w:9.1, h:0.99, fontSize:10.5, italic:true, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 }
);
s.addText("Hypotheses", { x:0.38, y:2.84, w:9.3, h:0.3, fontSize:11, bold:true, color:C_ACCENT, fontFace:"Calibri", margin:0 });
const hyps = [
{ label:"H₁ — Dysphagia (Primary Outcome A):", text:"Radiotherapy results in a significantly different proportion of patients achieving clinically meaningful dysphagia improvement (≥1-point Ogilvie score reduction) at 4 weeks compared to SEMS.", col:"2E86C1", bg:"EBF5FB" },
{ label:"H₂ — Pain (Primary Outcome B):", text:"Radiotherapy results in a significantly different proportion of patients achieving clinically meaningful pain reduction (≥2-point NRS reduction at 4 weeks) compared to SEMS.", col:"8E44AD", bg:"F5EEF8" },
{ label:"H₀ — Null Hypothesis:", text:"There is no significant difference between SEMS and radiotherapy in dysphagia score improvement or pain reduction at 4 weeks in treatment-naive, unfit oesophageal cancer patients.", col:"7F8C8D", bg:"F8F9FA" },
];
hyps.forEach((h, i) => {
const hy = 3.22 + i * 1.35;
s.addShape(pres.ShapeType.rect, { x:0.38, y:hy, w:9.3, h:1.28, fill:{color:h.bg}, line:{color:h.col, pt:0.8} });
s.addText(h.label, { x:0.48, y:hy+0.07, w:9.1, h:0.28, fontSize:9.5, bold:true, color:h.col, fontFace:"Calibri", margin:0 });
s.addText(h.text, { x:0.48, y:hy+0.38, w:9.1, h:0.85, fontSize:9.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 6 — Budget / Funding / Duration
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Budget / Funding / Duration");
const rows = [
["Total Estimated Budget:", "None — Investigator-Initiated retrospective study. No external funding. Costs limited to investigator time and institutional data management. Estimated direct cost: NIL.", 0.9],
["Agency / Sponsor:", "None — No commercial sponsorship involved.", 0.68],
["Conflict of Interest:", "None declared by any investigator.", 0.68],
["Duration of the Project:", "6 months (approx. commencement pending ethics approval through June 2026)", 0.68],
["Suggested Date of Starting:", "[To be completed — pending IEC approval]", 0.68],
];
let curY = 1.35;
rows.forEach(r => {
addField(s, r[0], r[1], 0.38, curY, 9.3, r[2]);
curY += r[2] + 0.06;
});
// Patient accrual section
s.addText("Total Number of Patients to be Accrued:", { x:0.38, y:curY, w:9.3, h:0.28, fontSize:9, bold:true, color:C_ACCENT, fontFace:"Calibri", margin:0 });
curY += 0.3;
const accrualCols = [
{ label:"From [Institution]:", value:"Minimum 61 per arm", w:4.55 },
{ label:"Total:", value:"≥ 122 patients (all eligible Jan 2017–Dec 2023)", w:4.55 },
];
accrualCols.forEach((ac, i) => {
const ax = 0.38 + i * 4.8;
s.addShape(pres.ShapeType.rect, { x:ax, y:curY, w:ac.w, h:0.52, fill:{color:C_FIELD_BG}, line:{color:C_DIVIDER} });
s.addText(`${ac.label} ${ac.value}`, { x:ax+0.08, y:curY+0.04, w:ac.w-0.16, h:0.44, fontSize:9.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"middle", wrap:true, margin:0 });
});
curY += 0.62;
s.addShape(pres.ShapeType.rect, { x:0.38, y:curY, w:9.3, h:0.38, fill:{color:"FEF9E7"}, line:{color:"F39C12", pt:0.7} });
s.addText("Will biological products be sent outside SKIMS / Country? NO — Retrospective records-based study only. No biological samples are collected, processed, or transferred.", {
x:0.48, y:curY+0.04, w:9.1, h:0.3, fontSize:8.5, italic:true, color:C_DARK_TEXT, fontFace:"Calibri", wrap:true, margin:0
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 7 — Sample Size
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Sample Size");
const summaryBoxes = [
{ label:"Min. Total Sample", value:"122 patients", col:"2E86C1", bg:"EBF5FB" },
{ label:"Per Arm (each group)", value:"61 patients", col:"8E44AD", bg:"F5EEF8" },
{ label:"Power", value:"80%", col:"1E8449", bg:"D5F5E3" },
{ label:"α (per co-primary)", value:"0.025*", col:C_RED, bg:"FDEDEC" },
];
summaryBoxes.forEach((b, i) => {
const bx = 0.38 + i * 2.38;
s.addShape(pres.ShapeType.rect, { x:bx, y:1.35, w:2.28, h:0.88, fill:{color:b.bg}, line:{color:b.col, pt:1.2} });
s.addText(b.label, { x:bx+0.08, y:1.38, w:2.12, h:0.28, fontSize:8.5, bold:true, color:b.col, fontFace:"Calibri", margin:0 });
s.addText(b.value, { x:bx+0.08, y:1.66, w:2.12, h:0.5, fontSize:14, bold:true, color:b.col, fontFace:"Calibri", valign:"middle", margin:0 });
});
s.addText("* Bonferroni correction for dual co-primary outcomes (family-wise α = 0.05). Census sampling: all eligible patients in study period will be enrolled.", {
x:0.38, y:2.29, w:9.3, h:0.25, fontSize:7.5, italic:true, color:"7F8C8D", fontFace:"Calibri", margin:0
});
// Two calculation tables
const calcTables = [
{
title:"CO-PRIMARY A — Dysphagia", col:"2E86C1", bg:"EBF5FB",
rows:[
["Measure", "Ogilvie Dysphagia Score ≥1-point improvement at 4 weeks"],
["Expected proportions", "SEMS: 78% vs. Radiotherapy: 58%"],
["Method", "Two-proportion z-test"],
["α / Power", "0.025 two-sided / 80%"],
["n required", "61 per arm = 122 total"],
["Basis", "Published palliative SEMS/RT literature"]
]
},
{
title:"CO-PRIMARY B — Pain", col:"8E44AD", bg:"F5EEF8",
rows:[
["Measure", "NRS Pain Score ≥2-point reduction at 4 weeks"],
["Expected proportions", "Radiotherapy: 60% vs. SEMS: 35%"],
["Method", "Two-proportion z-test"],
["α / Power", "0.025 two-sided / 80%"],
["n required", "53 per arm = 106 total"],
["Basis", "Martin et al., J Natl Compr Canc Netw, 2020 (n=1,957)"]
]
}
];
calcTables.forEach((ct, ci) => {
const cx = 0.38 + ci * 4.75;
addHeader(s, ct.title, cx, 2.62, 4.55, 0.38, ct.col, ct.col);
ct.rows.forEach((row, j) => {
const ry = 3.03 + j * 0.56;
const bg = j % 2 === 0 ? ct.bg : C_WHITE;
s.addShape(pres.ShapeType.rect, { x:cx, y:ry, w:1.6, h:0.53, fill:{color:ct.col === "2E86C1" ? "D6EAF8" : "E8DAEF"}, line:{color:C_DIVIDER} });
s.addText(row[0], { x:cx+0.06, y:ry+0.05, w:1.48, h:0.43, fontSize:8.5, bold:true, color:ct.col, fontFace:"Calibri", valign:"middle", wrap:true, margin:0 });
s.addShape(pres.ShapeType.rect, { x:cx+1.6, y:ry, w:2.95, h:0.53, fill:{color:bg}, line:{color:C_DIVIDER} });
s.addText(row[1], { x:cx+1.67, y:ry+0.05, w:2.82, h:0.43, fontSize:8.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"middle", wrap:true, margin:0 });
});
});
s.addShape(pres.ShapeType.rect, { x:0.38, y:6.4, w:9.3, h:0.36, fill:{color:C_ACCENT}, line:{color:C_ACCENT} });
s.addText("Governing sample: n = 122 (dysphagia outcome). All eligible patients in study period will be included (census approach). Post-hoc power confirmed after data extraction.", {
x:0.48, y:6.4, w:9.1, h:0.36, fontSize:8.5, color:C_WHITE, fontFace:"Calibri", valign:"middle", wrap:true, margin:0
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 8 — Selection Criteria
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Selection Criteria");
const incl = [
"Histologically/cytologically confirmed oesophageal carcinoma (SCC or adenocarcinoma, including OGJ)",
"Locally advanced (unresectable T3/T4 or N+) or metastatic (Stage IV) disease",
"TREATMENT-NAIVE: No prior anticancer therapy of any kind (chemo, surgery, RT, immunotherapy)",
"Unfit for standard treatment (ECOG PS ≥3, significant comorbidity, or MDT/patient decision)",
"SEMS or palliative RT (EBRT/BT) as primary intervention (January 2017 – December 2023)",
"Documented baseline dysphagia and/or pain score ≤2 weeks before intervention",
"Age ≥18 years | Minimum 4-week post-intervention follow-up available"
];
const excl = [
"Any prior anticancer therapy (chemotherapy, immunotherapy, surgery, or radical RT)",
"SEMS as bridge to surgery or before preoperative chemoradiotherapy",
"Concurrent simultaneous SEMS + EBRT (confounding — not a pure monotherapy arm)",
"Benign oesophageal strictures or non-malignant intervention indication",
"Insufficient records: no baseline AND no post-intervention outcome score",
"Life expectancy < 2 weeks at time of intervention",
"Enrolment in concurrent interventional clinical trial affecting palliation outcomes"
];
addHeader(s, "INCLUSION CRITERIA", 0.38, 1.35, 4.55, 0.4, "1E8449", "1E8449");
addHeader(s, "EXCLUSION CRITERIA", 5.05, 1.35, 4.63, 0.4, C_RED, C_RED);
incl.forEach((item, i) => {
const iy = 1.82 + i * 0.74;
const bg = i % 2 === 0 ? "D5F5E3" : C_WHITE;
s.addShape(pres.ShapeType.rect, { x:0.38, y:iy, w:4.55, h:0.71, fill:{color:bg}, line:{color:C_DIVIDER} });
s.addText([{ text:"✓ ", options:{bold:true, color:"1E8449"} }, { text:item }],
{ x:0.46, y:iy+0.04, w:4.39, h:0.63, fontSize:8.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
excl.forEach((item, i) => {
const iy = 1.82 + i * 0.74;
const bg = i % 2 === 0 ? "FDEDEC" : C_WHITE;
s.addShape(pres.ShapeType.rect, { x:5.05, y:iy, w:4.63, h:0.71, fill:{color:bg}, line:{color:C_DIVIDER} });
s.addText([{ text:"✗ ", options:{bold:true, color:C_RED} }, { text:item }],
{ x:5.13, y:iy+0.04, w:4.47, h:0.63, fontSize:8.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
s.addShape(pres.ShapeType.rect, { x:0.38, y:7.02, w:9.3, h:0.34, fill:{color:"FEF9E7"}, line:{color:"F39C12", pt:0.7} });
s.addText("Vulnerable groups: Patients with advanced incurable cancer — vulnerable by virtue of terminal illness. Standard ethical protections apply. No children or prisoners involved.", {
x:0.48, y:7.02, w:9.1, h:0.34, fontSize:8, italic:true, color:C_DARK_TEXT, fontFace:"Calibri", valign:"middle", wrap:true, margin:0
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 9 — Outcome Measures
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Outcome Measures");
// CO-PRIMARY header
addHeader(s, "CO-PRIMARY OUTCOMES (Dual — Bonferroni-corrected α = 0.025 each)", 0.38, 1.35, 9.3, 0.38, C_ACCENT, C_ACCENT);
const primary = [
{
label:"A — Dysphagia Palliation", col:"2E86C1", bg:"EBF5FB",
items:["Proportion achieving ≥1-point Ogilvie Dysphagia Score improvement at 4 weeks","Change in Ogilvie score at 2 weeks, 4 weeks, 3 months","Tool: Ogilvie Dysphagia Score (Grade 0 = normal → Grade 4 = complete dysphagia)"]
},
{
label:"B — Pain Palliation", col:"8E44AD", bg:"F5EEF8",
items:["Proportion achieving ≥2-point NRS pain reduction at 4 weeks","Change in NRS (0–10) pain score at 2 weeks, 4 weeks, 3 months","Proxy: WHO analgesic ladder step change where NRS not formally recorded"]
}
];
primary.forEach((p, i) => {
const px = 0.38 + i * 4.75;
addHeader(s, p.label, px, 1.82, 4.55, 0.36, p.col, p.col);
p.items.forEach((item, j) => {
const iy = 2.22 + j * 0.52;
s.addShape(pres.ShapeType.rect, { x:px, y:iy, w:4.55, h:0.49, fill:{color: j%2===0 ? p.bg : C_WHITE}, line:{color:C_DIVIDER} });
s.addText([{text:`${String.fromCharCode(65+j)}. `, options:{bold:true, color:p.col}}, {text:item}],
{ x:px+0.08, y:iy+0.04, w:4.39, h:0.41, fontSize:9, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
});
// SECONDARY header
addHeader(s, "SECONDARY OUTCOME MEASURES", 0.38, 3.78, 9.3, 0.36, C_RED, C_RED);
// Clinical outcomes
s.addText("Clinical:", { x:0.38, y:4.2, w:5.5, h:0.26, fontSize:9, bold:true, color:C_ACCENT, fontFace:"Calibri", margin:0 });
const clinSec = [
"1. Overall Survival: date of intervention to death / last follow-up (Kaplan-Meier, Cox regression)",
"2. Time to Re-Intervention: rescue stent or repeat RT (competing-risks analysis)",
"3. Complication / Adverse Event Rates: stent migration, ingrowth, perforation, fistula, RT oesophagitis, haemorrhage (CTCAE v5.0)",
"4. Health-Related QoL: EORTC QLQ-C30 / QLQ-OES18 dysphagia, pain, eating domains (where documented)",
"5. Nutritional Status: body weight and serum albumin at baseline, 4 weeks, 12 weeks"
];
clinSec.forEach((item, i) => {
const iy = 4.5 + i * 0.52;
s.addShape(pres.ShapeType.rect, { x:0.38, y:iy, w:5.5, h:0.49, fill:{color: i%2===0 ? "EAF2FF" : C_WHITE}, line:{color:C_DIVIDER} });
s.addText(item, { x:0.46, y:iy+0.04, w:5.34, h:0.41, fontSize:8.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
// Lab parameters
s.addText("Lab Parameters:", { x:6.0, y:4.2, w:3.68, h:0.26, fontSize:9, bold:true, color:C_ACCENT, fontFace:"Calibri", margin:0 });
const labSec = [
"A. Serum Albumin (g/dL): baseline, 4 wks, 12 wks",
"B. Body Weight (kg): baseline, 4 wks, 12 wks",
"C. Haemoglobin (g/dL): where bleeding events documented"
];
labSec.forEach((item, i) => {
const iy = 4.5 + i * 0.52;
s.addShape(pres.ShapeType.rect, { x:6.0, y:iy, w:3.68, h:0.49, fill:{color: i%2===0 ? "EAF2FF" : C_WHITE}, line:{color:C_DIVIDER} });
s.addText(item, { x:6.08, y:iy+0.04, w:3.52, h:0.41, fontSize:8.5, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
})();
// ═══════════════════════════════════════════════════════════════════
// SLIDE 10 — Benefits of the Project
// ═══════════════════════════════════════════════════════════════════
(function() {
const s = pres.addSlide();
addChrome(s, "Benefits of the Project / Study");
const cols = [
{
title:"Benefits to SKIMS / Institution", col:C_ACCENT, bg:"EAF2FF",
items:[
"First institutional audit of SEMS vs. RT outcomes specifically in treatment-naive, unfit oesophageal cancer patients — establishes a quality benchmark",
"Informs MDT protocols and departmental palliative pathway guidelines",
"Generates pilot data to support future prospective study / grant applications",
"Enhances research output, institutional academic standing, and postgraduate training",
"No additional resource expenditure required — uses existing patient records"
]
},
{
title:"Benefits to Study Subjects / Future Patients", col:"1E8449", bg:"D5F5E3",
items:[
"Zero direct risk to enrolled patients — retrospective study, no intervention",
"Findings will optimise treatment selection for future patients in the same category",
"First time pain palliation is a designated co-primary outcome alongside dysphagia at this institution — directly addresses an unmet need",
"Identifies subgroups who benefit most from each modality (personalised palliation)",
"Addresses an underserved population consistently excluded from clinical trials"
]
}
];
cols.forEach((col, i) => {
const cx = 0.38 + i * 4.75;
addHeader(s, col.title, cx, 1.35, 4.55, 0.42, col.col, col.col);
col.items.forEach((item, j) => {
const iy = 1.85 + j * 1.0;
s.addShape(pres.ShapeType.rect, { x:cx, y:iy, w:4.55, h:0.96, fill:{color: j%2===0 ? col.bg : C_WHITE}, line:{color:C_DIVIDER} });
s.addText([{text:`${j+1}. `, options:{bold:true, color:col.col}}, {text:item}],
{ x:cx+0.1, y:iy+0.06, w:4.35, h:0.84, fontSize:9, color:C_DARK_TEXT, fontFace:"Calibri", valign:"top", wrap:true, margin:0 });
});
});
// Footer bar
s.addShape(pres.ShapeType.rect, { x:0, y:7.18, w:10, h:0.32, fill:{color:C_SIDEBAR}, line:{color:C_SIDEBAR} });
s.addText("Investigator-Initiated Study | No External Funding | No Conflict of Interest | Retrospective Design — Zero Risk to Subjects", {
x:0.1, y:7.18, w:9.8, h:0.32, fontSize:8, color:C_WHITE, fontFace:"Calibri", align:"center", valign:"middle", margin:0
});
})();
// ═══════════════════════════════════════════════════════════════════
// SAVE
// ═══════════════════════════════════════════════════════════════════
pres.writeFile({ fileName: "/home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx" })
.then(() => console.log("✅ Saved: IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx"))
.catch(err => console.error("❌ Error:", err));
cd /home/daytona/workspace/iec-synopsis-ppt && node create_iec_ppt2.js 2>&1
# Verify all 10 slides are present and check file size cd /tmp && rm -rf pptx_verify && unzip -o /home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx "ppt/slides/slide*.xml" -d pptx_verify 2>&1 echo "---" ls /tmp/pptx_verify/ppt/slides/ | wc -l ls /tmp/pptx_verify/ppt/slides/ echo "---" ls -lh /home/daytona/workspace/iec-synopsis-ppt/IEC_Synopsis_SEMS_vs_RT_OesophagealCancer.pptx
IEC Synopsis SEMS vs RT OesophagealCancer
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Details of the Applicant (Name, Designation, Dept, Phone, Email, IEC Meeting Date) |
| 2 | Details of the P.I. / Supervisor / Guide (7 fields) |
| 3 | Co-Investigators — 3-column table layout (#1, #2, #3) |
| 4 | Title of the Project + Site + Study Design/Period badges + both comparison arms |
| 5 | Research Question + 3 Hypotheses (H₁ Dysphagia, H₂ Pain, H₀ Null) |
| 6 | Budget / Sponsor / COI / Duration / Patient accrual / Biological products |
| 7 | Sample Size — 4 summary boxes + side-by-side calculation tables for both co-primaries |
| 8 | Inclusion ✓ vs. Exclusion ✗ criteria in two colour-coded columns + vulnerable groups note |
| 9 | Co-primary outcomes (Dysphagia + Pain) + 5 secondary clinical + 3 lab parameters |
| 10 | Benefits to SKIMS vs. Benefits to Study Subjects + footer bar |