Ok I'm having a assignment on topic investigation use of drug and cover the topics like description, principle involved, classification, control, identification,role of hospital pharmacist , advisory committee give contents in human version and no phlagarism and I'm a b harmacy final year student and this topic is under pharmacy practice
investigational use of drugs pharmacy practice description classification identification hospital pharmacist role advisory committee
https://www.hoparx.org/documents/109/HOPA16_IDS_Guidelines.r…
investigational drug classification 4 classes FDA IND B pharmacy practice notes
Excellent so can you consize the each subtopic and convert into 2 slides for my presentation and it should be attractive
ls /home/daytona/workspace/ 2>/dev/null && mkdir -p /home/daytona/workspace/inve…
~/investigational-drug-ppt/build.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
// ─── COLOUR PALETTE ────────────────────────────────────────────────────────────
// Deep navy (dominant), electric teal (accent), white, soft platinum (cards)
const C = {
navy: "0A1628",
navyMid: "0D2040",
teal: "00C9B1",
tealDark: "009E8C",
white: "FFFFFF",
offWhite: "F0F4F8",
platinum: "E8EDF3",
lightText:"B8C8D8",
gold: "F5C842",
cardBg: "112240",
lineGray: "2A3F60",
};
// ─── HELPERS ────────────────────────────────────────────────────────────────────
function darkSlide(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x:0, y:0, w:13.3, h:7.5, fill:{color:C.navy}, line:{color:C.navy} });
}
function addAccentBar(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x:0, y:0, w:13.3, h:0.07, fill:{color:C.teal}, line:{color:C.teal} });
}
function addBottomBar(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x:0, y:7.35, w:13.3, h:0.15, fill:{color:C.tealDark}, line:{color:C.tealDark} });
}
function slideLabel(slide, num, total) {
slide.addText(`${num} / ${total}`, { x:12.4, y:7.1, w:0.8, h:0.25, fontSize:9, color:C.lightText, align:"right" });
}
function sectionTag(slide, tag) {
slide.addShape(pres.shapes.ROUNDED_RECTANGLE, { x:0.35, y:0.2, w:2.6, h:0.35, fill:{color:C.teal}, line:{color:C.teal}, rectRadius:0.05 });
slide.addText(tag.toUpperCase(), { x:0.35, y:0.2, w:2.6, h:0.35, fontSize:9, bold:true, color:C.navy, align:"center", valign:"middle", margin:0 });
}
function slideTitle(slide, title) {
slide.addText(title, { x:0.35, y:0.65, w:12.6, h:0.6, fontSize:24, bold:true, color:C.white, fontFace:"Calibri" });
slide.addShape(pres.shapes.RECTANGLE, { x:0.35, y:1.28, w:1.4, h:0.05, fill:{color:C.teal}, line:{color:C.teal} });
}
function card(slide, x, y, w, h) {
slide.addShape(pres.shapes.RECTANGLE, { x, y, w, h,
fill:{color:C.cardBg}, line:{color:C.lineGray},
shadow:{type:"outer", color:"000000", blur:8, offset:3, angle:135, opacity:0.3}
});
}
function iconCircle(slide, x, y, color, emoji) {
slide.addShape(pres.shapes.ELLIPSE, { x, y, w:0.52, h:0.52, fill:{color:color}, line:{color:color} });
slide.addText(emoji, { x, y, w:0.52, h:0.52, fontSize:18, align:"center", valign:"middle", margin:0 });
}
function bulletList(slide, items, x, y, w, h, fontSize=12) {
const rich = items.map((t, i) => ({
text: t,
options: { bullet:{type:"bullet"}, breakLine: i < items.length-1, fontSize, color:C.offWhite, fontFace:"Calibri" }
}));
slide.addText(rich, { x, y, w, h, paraSpaceAfter:4 });
}
const TOTAL = 17;
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — TITLE SLIDE
// ══════════════════════════════════════════════════════════════════════════════
let s = pres.addSlide();
darkSlide(s);
// Large teal circle decoration
s.addShape(pres.shapes.ELLIPSE, { x:9.5, y:-1, w:5.5, h:5.5, fill:{color:C.teal}, line:{color:C.teal}, transparency:85 });
s.addShape(pres.shapes.ELLIPSE, { x:10.3, y:3.5, w:3.8, h:3.8, fill:{color:C.gold}, line:{color:C.gold}, transparency:90 });
// Accent bar
addAccentBar(s);
addBottomBar(s);
// Main title
s.addText("Investigational Use of Drugs", { x:0.6, y:1.8, w:9.2, h:1.4, fontSize:44, bold:true, color:C.white, fontFace:"Calibri" });
s.addShape(pres.shapes.RECTANGLE, { x:0.6, y:3.25, w:3.0, h:0.07, fill:{color:C.teal}, line:{color:C.teal} });
s.addText("B.Pharmacy Final Year | Pharmacy Practice", { x:0.6, y:3.4, w:9, h:0.4, fontSize:15, color:C.teal, fontFace:"Calibri" });
s.addText("A comprehensive overview for clinical and hospital pharmacy students", { x:0.6, y:3.9, w:9, h:0.4, fontSize:12, color:C.lightText, fontFace:"Calibri", italic:true });
// Bottom presenter info
s.addText("Presented by: B.Pharmacy Final Year Student", { x:0.6, y:6.6, w:9, h:0.3, fontSize:10, color:C.lightText });
slideLabel(s, 1, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 2 — TABLE OF CONTENTS
// ══════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
s.addText("Presentation Overview", { x:0.4, y:0.15, w:12.5, h:0.6, fontSize:26, bold:true, color:C.white, fontFace:"Calibri" });
s.addShape(pres.shapes.RECTANGLE, { x:0.4, y:0.78, w:1.2, h:0.05, fill:{color:C.teal}, line:{color:C.teal} });
const topics = [
["01", "Description & Introduction"],
["02", "Principles Involved"],
["03", "Classification of Investigational Drugs"],
["04", "Control of Investigational Drugs"],
["05", "Identification of Investigational Drugs"],
["06", "Role of the Hospital Pharmacist"],
["07", "Advisory Committee"],
];
const colors = ["00C9B1","009E8C","0087C8","6A5ACD","E05C5C","F5A623","F5C842"];
topics.forEach(([num, title], i) => {
const col = i < 4 ? 0 : (i < 7 ? 1 : 2);
const row = i < 4 ? i : i-4;
const x = 0.35 + col * 4.3;
const y = 0.95 + row * 1.4;
if (i >= 4 && i < 7) {
// right column
}
card(s, x, y, 4.0, 1.25);
s.addShape(pres.shapes.RECTANGLE, { x, y, w:0.55, h:1.25, fill:{color:"#"+colors[i]}, line:{color:"#"+colors[i]} });
s.addText(num, { x, y, w:0.55, h:1.25, fontSize:18, bold:true, color:C.navy, align:"center", valign:"middle", margin:0 });
s.addText(title, { x:x+0.65, y:y+0.15, w:3.25, h:0.9, fontSize:13, color:C.white, fontFace:"Calibri", valign:"middle" });
});
slideLabel(s, 2, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDES 3-4 — DESCRIPTION & INTRODUCTION
// ══════════════════════════════════════════════════════════════════════════════
// Slide 3
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 01");
slideTitle(s, "Description & Introduction");
// Definition card (full width)
card(s, 0.35, 1.45, 12.6, 1.5);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y:1.45, w:0.12, h:1.5, fill:{color:C.teal}, line:{color:C.teal} });
s.addText("What is an Investigational Drug?", { x:0.6, y:1.5, w:12, h:0.35, fontSize:13, bold:true, color:C.teal, fontFace:"Calibri" });
s.addText("Any chemical or biological substance being evaluated in human subjects to determine its safety and efficacy — not yet approved by a regulatory authority (FDA / CDSCO) for general commercial use.", {
x:0.6, y:1.88, w:12, h:0.95, fontSize:12, color:C.offWhite, fontFace:"Calibri"
});
// 3 key cards
const descCards = [
["🔬","New Chemical Entity","A brand-new molecule — never tested in humans before. Only pre-clinical (animal) data exists."],
["💊","Approved Drug – New Use","An existing approved drug being studied for a new indication, dose, route, or population."],
["🏥","Compassionate / Expanded Use","Access to unapproved drugs for patients with serious/life-threatening conditions and no alternatives."],
];
descCards.forEach(([emoji, title, desc], i) => {
const x = 0.35 + i*4.32;
card(s, x, 3.1, 4.1, 3.9);
iconCircle(s, x+1.8, 3.2, C.teal, emoji);
s.addText(title, { x:x+0.15, y:3.82, w:3.8, h:0.45, fontSize:12, bold:true, color:C.teal, align:"center", fontFace:"Calibri" });
s.addText(desc, { x:x+0.15, y:4.3, w:3.8, h:2.6, fontSize:11, color:C.offWhite, fontFace:"Calibri", align:"center" });
});
slideLabel(s, 3, TOTAL);
// Slide 4
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 01 — continued");
slideTitle(s, "IND Application & Regulatory Framework");
card(s, 0.35, 1.45, 6.1, 5.6);
s.addText("IND Application (USA – 21 CFR Part 312)", { x:0.5, y:1.55, w:5.8, h:0.4, fontSize:13, bold:true, color:C.teal, fontFace:"Calibri" });
bulletList(s, [
"Sponsor must file before first human trial",
"FDA has 30 days to review — no objection = proceed",
"Includes: pharmacology, toxicology, CMC data",
"Must include the clinical protocol & investigator credentials",
"Informed consent documents required",
], 0.5, 2.0, 5.8, 4.8);
card(s, 6.85, 1.45, 6.1, 5.6);
s.addText("India — Schedule Y & CT Rules 2019", { x:7.0, y:1.55, w:5.8, h:0.4, fontSize:13, bold:true, color:C.gold, fontFace:"Calibri" });
bulletList(s, [
"Governed by Drugs & Cosmetics Act Schedule Y",
"New Drugs & Clinical Trials Rules, 2019",
"CDSCO is the apex regulatory body",
"Ethics Committee approval mandatory",
"Phase-wise trial conduct identical to global standards",
], 7.0, 2.0, 5.8, 4.8);
// Central divider
s.addShape(pres.shapes.RECTANGLE, { x:6.6, y:1.45, w:0.05, h:5.6, fill:{color:C.lineGray}, line:{color:C.lineGray} });
slideLabel(s, 4, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDES 5-6 — PRINCIPLES INVOLVED
// ══════════════════════════════════════════════════════════════════════════════
// Slide 5
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 02");
slideTitle(s, "Principles Involved — Ethical & Scientific");
const principles1 = [
["⚖️","Declaration of Helsinki","Welfare of subject > interests of science. Voluntary, informed consent. Research must be scientifically sound."],
["📋","Good Clinical Practice (GCP)","ICH-E6 international standard for designing, conducting, recording and reporting clinical trials."],
["✍️","Informed Consent","Patient must understand purpose, risks, benefits, and right to withdraw — BEFORE any study procedure."],
];
principles1.forEach(([emoji, title, desc], i) => {
const y = 1.5 + i*1.9;
card(s, 0.35, y, 12.6, 1.75);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y, w:0.12, h:1.75, fill:{color:C.teal}, line:{color:C.teal} });
iconCircle(s, 0.6, y+0.6, C.tealDark, emoji);
s.addText(title, { x:1.3, y:y+0.15, w:3.5, h:0.45, fontSize:13, bold:true, color:C.teal, fontFace:"Calibri" });
s.addText(desc, { x:1.3, y:y+0.62, w:11.4, h:0.95, fontSize:11.5, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 5, TOTAL);
// Slide 6
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 02 — continued");
slideTitle(s, "Principles Involved — Regulatory & Oversight");
const principles2 = [
["🔬","Risk-Benefit Balance","Harris-Kefauver Amendments (1962): drug must demonstrate BOTH safety and efficacy. Stricter the disease, greater the acceptable risk."],
["🏛️","IRB / Ethics Committee Oversight","Independent review of protocol and consent before trial start. Can suspend or terminate trial if unacceptable risks emerge."],
["📊","Scientific Validity","Flawed study = ethical violation. Requires proper sample size, randomisation, blinding, and defined endpoints."],
];
principles2.forEach(([emoji, title, desc], i) => {
const y = 1.5 + i*1.9;
card(s, 0.35, y, 12.6, 1.75);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y, w:0.12, h:1.75, fill:{color:C.gold}, line:{color:C.gold} });
iconCircle(s, 0.6, y+0.6, C.gold, emoji);
s.addText(title, { x:1.3, y:y+0.15, w:3.5, h:0.45, fontSize:13, bold:true, color:C.gold, fontFace:"Calibri" });
s.addText(desc, { x:1.3, y:y+0.62, w:11.4, h:0.95, fontSize:11.5, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 6, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDES 7-8 — CLASSIFICATION
// ══════════════════════════════════════════════════════════════════════════════
// Slide 7
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 03");
slideTitle(s, "Classification of Investigational Drugs");
// 4-class grid
const classData = [
["CLASS I","New Chemical Entities","00C9B1","Never tested in humans. Only pre-clinical data. Highest uncertainty — most rigorous monitoring required.","🧪"],
["CLASS II","Approved Drug – New Use","009E8C","Existing approved drug studied for new indication, dose form, route, or population. Fresh IND required.","💊"],
["CLASS III","Treatment IND / Expanded Access","F5A623","Serious/life-threatening illness with no alternative. Three types: individual, intermediate, widespread access.","🏥"],
["CLASS IV","Off-Label Under Investigation","6A5ACD","Approved drugs used beyond labelled indication. Formal study needs IRB oversight and usually an IND.","📁"],
];
classData.forEach(([cls, title, color, desc, emoji], i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.35 + col * 6.5;
const y = 1.5 + row * 2.9;
card(s, x, y, 6.25, 2.6);
s.addShape(pres.shapes.RECTANGLE, { x, y, w:6.25, h:0.55, fill:{color:"#"+color}, line:{color:"#"+color} });
s.addText(`${emoji} ${cls}`, { x:x+0.1, y, w:6.05, h:0.55, fontSize:12, bold:true, color:C.navy, align:"left", valign:"middle", margin:8 });
s.addText(title, { x:x+0.15, y:y+0.6, w:6.0, h:0.4, fontSize:12, bold:true, color:"#"+color, fontFace:"Calibri" });
s.addText(desc, { x:x+0.15, y:y+1.05, w:6.0, h:1.4, fontSize:11, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 7, TOTAL);
// Slide 8 — Clinical Trial Phases
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 03 — continued");
slideTitle(s, "Clinical Trial Phases (Phase I – IV)");
const phases = [
["Phase I","First in Human","10–100\nHealthy Volunteers","Safety, dose-finding, PK/PD","00C9B1"],
["Phase II","First in Patient","50–500\nPatient subjects","Efficacy signals + safety","009E8C"],
["Phase III","Multisite Trial","100s–1000s\nPatient subjects","Confirm efficacy & safety","F5A623"],
["Phase IV","Post-Marketing","Many 1000s\nReal-world patients","New risks, new indications","6A5ACD"],
];
phases.forEach(([phase, subtitle, participants, focus, color], i) => {
const x = 0.35 + i * 3.2;
const y = 1.5;
card(s, x, y, 3.0, 5.6);
// Phase header
s.addShape(pres.shapes.RECTANGLE, { x, y, w:3.0, h:0.7, fill:{color:"#"+color}, line:{color:"#"+color} });
s.addText(phase, { x:x+0.05, y, w:2.9, h:0.38, fontSize:15, bold:true, color:C.navy, align:"center", valign:"bottom", margin:0 });
s.addText(subtitle, { x:x+0.05, y:y+0.38, w:2.9, h:0.32, fontSize:9.5, color:C.navy, align:"center", valign:"top", margin:0 });
// Arrow connector (except last)
if (i < 3) {
s.addShape(pres.shapes.RECTANGLE, { x:x+3.0, y:y+1.1, w:0.15, h:0.08, fill:{color:C.teal}, line:{color:C.teal} });
}
s.addText("PARTICIPANTS", { x:x+0.1, y:y+0.85, w:2.8, h:0.3, fontSize:9, bold:true, color:C.teal, align:"center" });
s.addText(participants, { x:x+0.1, y:y+1.15, w:2.8, h:0.65, fontSize:11, color:C.offWhite, align:"center", fontFace:"Calibri" });
s.addShape(pres.shapes.RECTANGLE, { x:x+0.5, y:y+1.85, w:2.0, h:0.04, fill:{color:C.lineGray}, line:{color:C.lineGray} });
s.addText("FOCUS", { x:x+0.1, y:y+1.95, w:2.8, h:0.3, fontSize:9, bold:true, color:C.teal, align:"center" });
s.addText(focus, { x:x+0.1, y:y+2.28, w:2.8, h:0.7, fontSize:11, color:C.offWhite, align:"center", fontFace:"Calibri" });
});
slideLabel(s, 8, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDES 9-10 — CONTROL
// ══════════════════════════════════════════════════════════════════════════════
// Slide 9
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 04");
slideTitle(s, "Control of Investigational Drugs — Part 1");
const controlData1 = [
["📦","Acquisition & Receipt","Receipt by pharmacy/IDS only. Verify drug vs. shipping manifest. Document: lot numbers, expiry, quantity, transport conditions."],
["❄️","Storage","Per sponsor specifications (temp, light, humidity). Controlled substances: locked limited-access area. Stored SEPARATELY from commercial drugs. Temperature logs maintained."],
["💬","Dispensing Rules","Only on receipt of PI-signed prescription. Confirm informed consent BEFORE dispensing. Document every dispensing event on Drug Accountability Record (DAR)."],
];
controlData1.forEach(([emoji, title, desc], i) => {
const y = 1.55 + i * 1.95;
card(s, 0.35, y, 12.6, 1.75);
iconCircle(s, 0.55, y+0.62, C.teal, emoji);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y, w:0.1, h:1.75, fill:{color:C.teal}, line:{color:C.teal} });
s.addText(title, { x:1.25, y:y+0.12, w:4.0, h:0.4, fontSize:13, bold:true, color:C.teal, fontFace:"Calibri" });
s.addText(desc, { x:1.25, y:y+0.55, w:11.2, h:1.05, fontSize:11.5, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 9, TOTAL);
// Slide 10
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 04 — continued");
slideTitle(s, "Control of Investigational Drugs — Part 2");
const controlData2 = [
["📂","Drug Accountability Records","Track every unit: date received, quantity dispensed, patient ID, returns, destruction. Retained 2 years after approval or trial discontinuation."],
["🔁","Returns & Destruction","Unused drugs returned to sponsor or destroyed per regulations. Documented destruction — NEVER regular waste disposal. Sponsor authorization required."],
["🎭","Blinding & Randomisation Control","Pharmacy holds randomisation codes. Maintain blinding integrity throughout. Emergency unblinding procedure must be pre-established and documented."],
];
controlData2.forEach(([emoji, title, desc], i) => {
const y = 1.55 + i * 1.95;
card(s, 0.35, y, 12.6, 1.75);
iconCircle(s, 0.55, y+0.62, C.gold, emoji);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y, w:0.1, h:1.75, fill:{color:C.gold}, line:{color:C.gold} });
s.addText(title, { x:1.25, y:y+0.12, w:4.0, h:0.4, fontSize:13, bold:true, color:C.gold, fontFace:"Calibri" });
s.addText(desc, { x:1.25, y:y+0.55, w:11.2, h:1.05, fontSize:11.5, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 10, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDES 11-12 — IDENTIFICATION
// ══════════════════════════════════════════════════════════════════════════════
// Slide 11
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 05");
slideTitle(s, "Identification — Mandatory Labeling");
// Label requirements
card(s, 0.35, 1.45, 7.8, 5.6);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y:1.45, w:7.8, h:0.55, fill:{color:C.teal}, line:{color:C.teal} });
s.addText("Mandatory Label Requirements (21 CFR Part 312)", { x:0.5, y:1.45, w:7.6, h:0.55, fontSize:13, bold:true, color:C.navy, align:"center", valign:"middle", margin:0 });
const labelItems = [
"Caution: New Drug — Limited to Investigational Use",
"Sponsor name and address",
"IND / Protocol number",
"Name of Principal Investigator",
"Storage conditions (temperature, light)",
"Lot / Batch number",
"Expiry date (if known)",
"Quantity and strength",
];
bulletList(s, labelItems, 0.55, 2.1, 7.5, 4.7, 12);
// Blinded study note
card(s, 8.55, 1.45, 4.4, 5.6);
s.addShape(pres.shapes.RECTANGLE, { x:8.55, y:1.45, w:4.4, h:0.55, fill:{color:C.gold}, line:{color:C.gold} });
s.addText("Blinded Study Labels", { x:8.65, y:1.45, w:4.2, h:0.55, fontSize:13, bold:true, color:C.navy, align:"center", valign:"middle", margin:0 });
s.addText("In blinded trials, the drug name is replaced by a randomisation/subject code to maintain blinding. The actual identity is held in a sealed emergency envelope only accessible under defined circumstances.", {
x:8.7, y:2.1, w:4.1, h:2.0, fontSize:11.5, color:C.offWhite, fontFace:"Calibri"
});
iconCircle(s, 10.2, 4.2, C.gold, "🔒");
s.addText("Blinding = Safety\nMaintain integrity\nuntil study close", { x:8.7, y:4.85, w:4.1, h:1.9, fontSize:11, color:C.offWhite, fontFace:"Calibri", align:"center" });
slideLabel(s, 11, TOTAL);
// Slide 12
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 05 — continued");
slideTitle(s, "Identification — Challenges & System Controls");
// Left column: challenges
card(s, 0.35, 1.45, 6.1, 5.6);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y:1.45, w:6.1, h:0.55, fill:{color:"E05C5C"}, line:{color:"E05C5C"} });
s.addText("⚠️ Physical Identification Challenges", { x:0.45, y:1.45, w:5.9, h:0.55, fontSize:13, bold:true, color:C.white, align:"center", valign:"middle", margin:0 });
bulletList(s, [
"Lack distinguishing visual features (blinding requirement)",
"Cannot use different colours, shapes or imprinted codes",
"Tall man lettering and packaging differences not applicable",
"Small manufacturing batches limit sophisticated packaging",
"Staff must rely on PROTOCOL documentation, not visual cues",
], 0.5, 2.1, 5.8, 4.7, 11.5);
// Right column: system controls
card(s, 6.85, 1.45, 6.1, 5.6);
s.addShape(pres.shapes.RECTANGLE, { x:6.85, y:1.45, w:6.1, h:0.55, fill:{color:C.teal}, line:{color:C.teal} });
s.addText("✅ System-Based Identification Controls", { x:6.95, y:1.45, w:5.9, h:0.55, fontSize:13, bold:true, color:C.navy, align:"center", valign:"middle", margin:0 });
bulletList(s, [
"Pharmacy systems configured with protocol numbers & authorised prescribers",
"Barcode scanning as additional verification step",
"Protocol binders/electronic access at dispensing area at all times",
"Two-patient identifier verification before every dispensing",
"Confirm patient enrolment + valid consent at each visit",
], 7.0, 2.1, 5.8, 4.7, 11.5);
slideLabel(s, 12, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDES 13-14 — ROLE OF HOSPITAL PHARMACIST
// ══════════════════════════════════════════════════════════════════════════════
// Slide 13
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 06");
slideTitle(s, "Role of the Hospital Pharmacist — Part 1");
const pharmRole1 = [
["🔍","Protocol Review & Feasibility","Reviews protocol before trial starts. Checks pharmaceutical feasibility: compatibility, stability, dose preparation. Identifies medication-related safety concerns.", C.teal],
["📜","Regulatory Compliance","Ensures compliance with 21 CFR 312, ICH-GCP, Joint Commission MM.06.01.05, and institutional SOPs.", C.teal],
["📦","Procurement & Inventory","Coordinates receipt, maintains perpetual inventory, notifies PI when stock reaches minimum level. Manages trial closure accountability.", C.teal],
["💉","Preparation & Dispensing","Prepares drug (including sterile compounding). Dispenses only to enrolled, consented patients on valid investigator orders. Maintains complete DARs.", C.teal],
];
const cols13 = [[0,1],[2,3]];
pharmRole1.forEach(([emoji, title, desc, color], i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.35 + col * 6.5;
const y = 1.45 + row * 2.95;
card(s, x, y, 6.25, 2.7);
iconCircle(s, x+0.25, y+0.9, C.tealDark, emoji);
s.addText(title, { x:x+0.9, y:y+0.15, w:5.2, h:0.45, fontSize:13, bold:true, color:C.teal, fontFace:"Calibri" });
s.addText(desc, { x:x+0.9, y:y+0.65, w:5.2, h:1.85, fontSize:11, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 13, TOTAL);
// Slide 14
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 06 — continued");
slideTitle(s, "Role of the Hospital Pharmacist — Part 2");
const pharmRole2 = [
["🗣️","Patient Counselling","How & when to take drug, storage at home, side effects to watch, right to withdraw, importance of returning unused drug.", C.gold],
["⚠️","ADR Monitoring & Reporting","Identifies, documents and reports Adverse Drug Reactions (ADRs) and Serious Adverse Events (SAEs) within required timeframes to sponsor and regulatory authority.", C.gold],
["📚","Drug Information Resource","Primary information source for nurses, physicians & other team members. Uses Investigator's Brochure, mechanism, dosing, interactions, handling procedures.", C.gold],
["🎓","Training & Emergency Handling","Trains pharmacy staff per each protocol. Maintains training records. Manages emergency unblinding. Ensures alternative treatment if patient is discontinued.", C.gold],
];
pharmRole2.forEach(([emoji, title, desc, color], i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.35 + col * 6.5;
const y = 1.45 + row * 2.95;
card(s, x, y, 6.25, 2.7);
iconCircle(s, x+0.25, y+0.9, C.gold, emoji);
s.addText(title, { x:x+0.9, y:y+0.15, w:5.2, h:0.45, fontSize:13, bold:true, color:C.gold, fontFace:"Calibri" });
s.addText(desc, { x:x+0.9, y:y+0.65, w:5.2, h:1.85, fontSize:11, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 14, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDES 15-16 — ADVISORY COMMITTEE
// ══════════════════════════════════════════════════════════════════════════════
// Slide 15
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 07");
slideTitle(s, "Advisory Committee — Key Bodies");
const advData1 = [
["🏛️","FDA Advisory Committee","External expert panels convened by FDA. Evaluate clinical trial data. Make non-binding recommendations on drug approval. Public meetings ensure transparency. FDA follows recommendation in most cases.","009ED4"],
["🔬","IRB / Ethics Committee","Primary oversight body in hospitals/research institutions. Reviews & approves protocols before any study begins. Annual continuing reviews. Can suspend or terminate trials if risks emerge.","00C9B1"],
];
advData1.forEach(([emoji, title, desc, color], i) => {
const y = 1.5 + i * 2.85;
card(s, 0.35, y, 12.6, 2.5);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y, w:1.5, h:2.5, fill:{color:"#"+color}, line:{color:"#"+color} });
s.addText(emoji, { x:0.35, y, w:1.5, h:2.5, fontSize:32, align:"center", valign:"middle", margin:0 });
s.addText(title, { x:2.05, y:y+0.15, w:10.7, h:0.5, fontSize:15, bold:true, color:"#"+color, fontFace:"Calibri" });
s.addText(desc, { x:2.05, y:y+0.7, w:10.7, h:1.65, fontSize:12, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 15, TOTAL);
// Slide 16
s = pres.addSlide();
darkSlide(s);
addAccentBar(s);
addBottomBar(s);
sectionTag(s, "Section 07 — continued");
slideTitle(s, "Advisory Committee — Institutional Bodies");
const advData2 = [
["💊","P&T Committee","Reviews and approves institutional policies for investigational drugs. Ensures alignment with hospital formulary. Reviews safety data. Advises on post-trial formulary inclusion.","F5A623"],
["🔬","Scientific Review Committee (SRC)","Evaluates proposed trials before IRB: scientific merit, institutional feasibility, resource adequacy, overlap with existing studies. IDS pharmacist is a KEY member.","9B59B6"],
["📊","DSMB / Data Monitoring Committee","Independent committee for larger trials. Reviews accumulating safety & efficacy data at intervals. Can recommend early termination. Operates independently of sponsor to avoid bias.","E05C5C"],
];
advData2.forEach(([emoji, title, desc, color], i) => {
const y = 1.45 + i * 1.95;
card(s, 0.35, y, 12.6, 1.75);
s.addShape(pres.shapes.RECTANGLE, { x:0.35, y, w:1.2, h:1.75, fill:{color:"#"+color}, line:{color:"#"+color} });
s.addText(emoji, { x:0.35, y, w:1.2, h:1.75, fontSize:26, align:"center", valign:"middle", margin:0 });
s.addText(title, { x:1.7, y:y+0.12, w:3.8, h:0.45, fontSize:13, bold:true, color:"#"+color, fontFace:"Calibri" });
s.addText(desc, { x:1.7, y:y+0.6, w:11.0, h:1.0, fontSize:11.5, color:C.offWhite, fontFace:"Calibri" });
});
slideLabel(s, 16, TOTAL);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 17 — CLOSING / SUMMARY
// ══════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
darkSlide(s);
// Decorative circles
s.addShape(pres.shapes.ELLIPSE, { x:-1, y:-1, w:5.5, h:5.5, fill:{color:C.teal}, line:{color:C.teal}, transparency:88 });
s.addShape(pres.shapes.ELLIPSE, { x:9.8, y:3.5, w:4.5, h:4.5, fill:{color:C.gold}, line:{color:C.gold}, transparency:90 });
addAccentBar(s);
addBottomBar(s);
s.addText("Key Takeaways", { x:0.6, y:0.7, w:12, h:0.6, fontSize:28, bold:true, color:C.white, fontFace:"Calibri" });
s.addShape(pres.shapes.RECTANGLE, { x:0.6, y:1.32, w:2.0, h:0.07, fill:{color:C.teal}, line:{color:C.teal} });
const takeaways = [
["💡","Investigational drugs are tightly regulated — every human trial begins with an IND application and ethical clearance."],
["⚖️","Core principles include GCP, Informed Consent, IRB oversight, and the risk-benefit framework mandated since 1962."],
["📋","Four-class system (NCE → New Use → Expanded Access → Off-Label Research) covers all investigational scenarios."],
["🔒","Control demands complete Drug Accountability Records, proper storage, and rigorous dispensing procedures."],
["🏥","The hospital pharmacist is a central safeguard — from protocol review through ADR monitoring and patient counselling."],
["🏛️","Advisory bodies (FDA panel, IRB, P&T, SRC, DSMB) provide layered oversight from national to bedside level."],
];
takeaways.forEach(([emoji, text], i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 0.35 + col * 6.5;
const y = 1.55 + row * 1.82;
card(s, x, y, 6.25, 1.65);
s.addShape(pres.shapes.RECTANGLE, { x, y, w:0.1, h:1.65, fill:{color:i%2===0?C.teal:C.gold}, line:{color:i%2===0?C.teal:C.gold} });
s.addText(emoji, { x:x+0.2, y:y+0.4, w:0.6, h:0.8, fontSize:22, align:"center", valign:"middle", margin:0 });
s.addText(text, { x:x+0.9, y:y+0.15, w:5.2, h:1.35, fontSize:11.5, color:C.offWhite, fontFace:"Calibri", valign:"middle" });
});
slideLabel(s, 17, TOTAL);
// ─── WRITE FILE ────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/investigational-drug-ppt/Investigational_Use_of_Drugs.pptx" })
.then(() => console.log("SUCCESS: File written."))
.catch(e => console.error("ERROR:", e));
cd /home/daytona/workspace/investigational-drug-ppt && node build.js 2>&1
node -e "const p = require('pptxgenjs'); const pr = new p(); console.log(Object.…
node -e "const p = require('pptxgenjs'); const pr = new p(); const keys = Object…
node -e "const p = require('pptxgenjs'); const pr = new p(); const keys = Object…
sed -i 's/pres\.shapes\.ELLIPSE/pres.shapes.OVAL/g' /home/daytona/workspace/inve…
python3 -c " with open('/home/daytona/workspace/investigational-drug-ppt/build.j…
cd /home/daytona/workspace/investigational-drug-ppt && node build.js 2>&1
ls -lh /home/daytona/workspace/investigational-drug-ppt/Investigational_Use_of_D…
Investigational Use of Drugs
Presentation · PPTX
| Slide | Content |
|---|---|
| 1 | Title Slide - with decorative circles, teal accent |
| 2 | Table of Contents - color-coded topic cards |
| 3-4 | Description & Introduction - definition, 3 drug types, IND vs India regulations side-by-side |
| 5-6 | Principles Involved - Helsinki, GCP, Consent (slide 5) + Risk-Benefit, IRB, Scientific Validity (slide 6) |
| 7-8 | Classification - 4-class grid with color headers + Phase I-IV table |
| 9-10 | Control - Acquisition/Storage/Dispensing (slide 9) + DAR/Returns/Blinding (slide 10) |
| 11-12 | Identification - Mandatory label checklist + blinding challenges vs system controls side-by-side |
| 13-14 | Role of Hospital Pharmacist - 4-card grid per slide (8 roles total) |
| 15-16 | Advisory Committee - FDA/IRB (slide 15) + P&T/SRC/DSMB (slide 16) |
| 17 | Key Takeaways - 6 summary points with teal/gold alternating cards |
I mean cover the topics within 2 slides and the background must be white in color
~/investigational-drug-ppt/build2.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
// ─── COLOUR PALETTE (white background theme) ───────────────────────────────
const C = {
white: "FFFFFF",
darkBlue: "1A237E", // deep indigo for headings
blue: "1565C0", // medium blue
teal: "00897B", // teal green accent
orange: "E65100", // warm orange accent
purple: "6A1B9A", // purple
red: "C62828", // red
gold: "F9A825", // gold
navy: "0D47A1",
lightBg: "F5F7FA", // very light gray-blue for cards
cardBlue: "E3F2FD", // light blue card
cardTeal: "E0F2F1",
cardOrange:"FFF3E0",
cardPurple:"F3E5F5",
textDark: "212121",
textMid: "424242",
textLight:"757575",
line: "E0E0E0",
};
function addTopBar(slide, color) {
slide.addShape(pres.shapes.RECTANGLE, { x:0, y:0, w:13.3, h:0.12, fill:{color:color||C.darkBlue}, line:{color:color||C.darkBlue} });
}
function addBottomStrip(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x:0, y:7.35, w:13.3, h:0.15, fill:{color:C.darkBlue}, line:{color:C.darkBlue} });
slide.addText("B.Pharmacy Final Year | Pharmacy Practice | Investigational Use of Drugs", {
x:0, y:7.35, w:13.3, h:0.15, fontSize:7.5, color:C.white, align:"center", valign:"middle", margin:0
});
}
function miniCard(slide, x, y, w, h, fillColor, lineColor) {
slide.addShape(pres.shapes.RECTANGLE, {
x, y, w, h,
fill:{ color: fillColor || C.lightBg },
line:{ color: lineColor || C.line, pt:1 },
shadow:{ type:"outer", color:"BBBBBB", blur:4, offset:2, angle:135, opacity:0.2 }
});
}
function sectionHeader(slide, x, y, w, h, label, color) {
slide.addShape(pres.shapes.RECTANGLE, { x, y, w, h, fill:{color:color}, line:{color:color} });
slide.addText(label, { x, y, w, h, fontSize:9.5, bold:true, color:C.white, align:"center", valign:"middle", margin:0 });
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 1
// Covers: Description | Principles | Classification
// ══════════════════════════════════════════════════════════════════════════════
let s = pres.addSlide();
// White background (default), top color bar
s.addShape(pres.shapes.RECTANGLE, {x:0,y:0,w:13.3,h:7.5,fill:{color:C.white},line:{color:C.white}});
addTopBar(s, C.darkBlue);
// ── SLIDE TITLE ──
s.addText("Investigational Use of Drugs", {
x:0.3, y:0.18, w:9, h:0.52,
fontSize:22, bold:true, color:C.darkBlue, fontFace:"Calibri"
});
s.addShape(pres.shapes.RECTANGLE, { x:0.3, y:0.72, w:5.5, h:0.04, fill:{color:C.teal}, line:{color:C.teal} });
s.addText("Slide 1 of 2", { x:12.0, y:0.22, w:1.1, h:0.3, fontSize:9, color:C.textLight, align:"right" });
// ════════════════════════════
// SECTION A — DESCRIPTION
// ════════════════════════════
sectionHeader(s, 0.2, 0.85, 2.5, 0.32, "01 DESCRIPTION", C.darkBlue);
miniCard(s, 0.2, 1.22, 4.05, 1.62, C.cardBlue, "BBDEFB");
s.addText([
{ text: "Definition: ", options: { bold:true, color:C.darkBlue } },
{ text: "A drug not yet approved by regulatory authorities (FDA/CDSCO) for general use. Tested in humans under an ", options: { color:C.textDark } },
{ text: "Investigational New Drug (IND) Application", options: { bold:true, color:C.blue } },
{ text: " to establish safety & efficacy.", options: { color:C.textDark } },
], { x:0.35, y:1.27, w:3.75, h:1.52, fontSize:11, fontFace:"Calibri", valign:"top" });
miniCard(s, 4.45, 1.22, 4.05, 1.62, "FFF8E1", "FFE082");
s.addText([
{ text: "Scope includes:\n", options: { bold:true, color:C.orange } },
{ text: "• New Chemical Entities (NCE) — first in human\n• Approved drugs for new indications\n• Expanded / compassionate use\n• Off-label drugs under formal investigation", options: { color:C.textDark } },
], { x:4.6, y:1.27, w:3.75, h:1.52, fontSize:10.5, fontFace:"Calibri" });
miniCard(s, 8.9, 1.22, 4.2, 1.62, "F3E5F5", "CE93D8");
s.addText([
{ text: "IND Requirements:\n", options: { bold:true, color:C.purple } },
{ text: "• Pre-clinical pharmacology & toxicology data\n• CMC (Chemistry, Manufacturing, Controls)\n• Clinical protocol & investigator credentials\n• Informed consent documents\n• FDA reviews in 30 days", options: { color:C.textDark } },
], { x:9.05, y:1.27, w:3.9, h:1.52, fontSize:10.5, fontFace:"Calibri" });
// ════════════════════════════
// SECTION B — PRINCIPLES
// ════════════════════════════
sectionHeader(s, 0.2, 2.98, 2.5, 0.32, "02 PRINCIPLES INVOLVED", C.teal);
const principles = [
["⚖️ Declaration of\nHelsinki", "Subject welfare > science. Voluntary informed consent mandatory before any procedure.", C.cardTeal, "80CBC4"],
["📋 Good Clinical\nPractice (GCP)", "ICH-E6 standard for designing, conducting & reporting trials. Internationally binding.", C.cardBlue, "90CAF9"],
["✍️ Informed\nConsent", "Explain purpose, risks, benefits & right to withdraw. Obtained BEFORE any study activity.", "FFF3E0", "FFCC80"],
["🔬 Risk-Benefit\nBalance", "Harris-Kefauver 1962: Prove both safety AND efficacy. Acceptable risk = severity of disease.", "FCE4EC", "F48FB1"],
["🏛️ IRB / Ethics\nCommittee", "Independent review before trial start. Monitors ongoing trial. Can suspend for safety.", "F3E5F5", "CE93D8"],
["📊 Scientific\nValidity", "Flawed design = ethical violation. Needs proper sample size, randomisation & endpoints.", "FFFDE7", "FFF176"],
];
principles.forEach(([title, desc, fill, line], i) => {
const x = 0.2 + i * 2.15;
miniCard(s, x, 3.35, 2.0, 2.0, fill, line);
s.addText(title, { x:x+0.08, y:3.4, w:1.84, h:0.55, fontSize:10, bold:true, color:C.darkBlue, fontFace:"Calibri", align:"center" });
s.addShape(pres.shapes.RECTANGLE, { x:x+0.15, y:3.95, w:1.7, h:0.03, fill:{color:C.line}, line:{color:C.line} });
s.addText(desc, { x:x+0.08, y:4.0, w:1.84, h:1.3, fontSize:9.5, color:C.textMid, fontFace:"Calibri" });
});
// ════════════════════════════
// SECTION C — CLASSIFICATION
// ════════════════════════════
sectionHeader(s, 0.2, 5.42, 2.5, 0.32, "03 CLASSIFICATION", C.orange);
const classes = [
["Class I", "New Chemical Entities", "Never tested in humans. Highest uncertainty. Most rigorous monitoring.", C.darkBlue],
["Class II", "Approved Drug — New Use", "Existing approved drug studied for new indication, route or population.", C.teal],
["Class III", "Treatment IND / Expanded Access", "Serious/life-threatening illness, no alternatives. Individual or widespread access.", C.orange],
["Class IV", "Off-Label Under Investigation", "Approved drugs used beyond label. Formal study needs IND + IRB oversight.", C.purple],
];
classes.forEach(([cls, title, desc, color], i) => {
const x = 0.2 + i * 3.27;
miniCard(s, x, 5.8, 3.1, 1.55, C.lightBg, C.line);
s.addShape(pres.shapes.RECTANGLE, { x, y:5.8, w:3.1, h:0.36, fill:{color:color}, line:{color:color} });
s.addText(`${cls} | ${title}`, { x:x+0.08, y:5.8, w:2.94, h:0.36, fontSize:10, bold:true, color:C.white, valign:"middle", margin:4 });
s.addText(desc, { x:x+0.1, y:6.19, w:2.9, h:1.1, fontSize:10, color:C.textMid, fontFace:"Calibri" });
});
addBottomStrip(s);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 2
// Covers: Control | Identification | Role of Hospital Pharmacist | Advisory Committee
// ══════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
s.addShape(pres.shapes.RECTANGLE, {x:0,y:0,w:13.3,h:7.5,fill:{color:C.white},line:{color:C.white}});
addTopBar(s, C.blue);
s.addText("Investigational Use of Drugs", {
x:0.3, y:0.18, w:9, h:0.52,
fontSize:22, bold:true, color:C.darkBlue, fontFace:"Calibri"
});
s.addShape(pres.shapes.RECTANGLE, { x:0.3, y:0.72, w:5.5, h:0.04, fill:{color:C.blue}, line:{color:C.blue} });
s.addText("Slide 2 of 2", { x:12.0, y:0.22, w:1.1, h:0.3, fontSize:9, color:C.textLight, align:"right" });
// ════════════════════════════
// LEFT COLUMN — CONTROL + IDENTIFICATION
// ════════════════════════════
// CONTROL
sectionHeader(s, 0.2, 0.85, 2.5, 0.32, "04 CONTROL", C.teal);
const controlPoints = [
["📦 Acquire","Pharmacy/IDS only. Verify against manifest. Log lot, expiry, qty."],
["❄️ Storage","Per sponsor specs. Locked area for controlled substances. Separate from commercial drugs."],
["💉 Dispense","PI-signed order required. Confirm consent. Document on Drug Accountability Record (DAR)."],
["📂 Records","DAR tracks every unit. Retained 2 years post-approval or trial end."],
["♻️ Returns","Unused drug returned or destroyed with documentation. Never regular waste."],
];
controlPoints.forEach(([label, desc], i) => {
const y = 1.25 + i * 0.65;
miniCard(s, 0.2, y, 6.2, 0.58, i%2===0?C.cardTeal:C.lightBg, C.line);
s.addText(label, { x:0.3, y:y+0.04, w:1.1, h:0.5, fontSize:9.5, bold:true, color:C.teal, fontFace:"Calibri", valign:"top" });
s.addShape(pres.shapes.RECTANGLE, { x:1.5, y:y+0.08, w:0.03, h:0.42, fill:{color:C.line}, line:{color:C.line} });
s.addText(desc, { x:1.6, y:y+0.05, w:4.7, h:0.5, fontSize:9.5, color:C.textMid, fontFace:"Calibri", valign:"top" });
});
// IDENTIFICATION
sectionHeader(s, 0.2, 4.55, 2.5, 0.32, "05 IDENTIFICATION", C.purple);
const idPoints = [
["🏷️ Label (Mandatory)","Must state: 'Caution: New Drug — Investigational Use Only', Sponsor, IND#, PI, storage, lot, expiry, strength."],
["⚠️ Challenge","No color/shape/imprint cues in blinded trials. Staff rely on protocol docs, not visual ID."],
["🖥️ System Controls","Pharmacy software with protocol IDs, barcode scan, 2-patient-identifier check before every dispense."],
];
idPoints.forEach(([label, desc], i) => {
const y = 4.95 + i * 0.72;
miniCard(s, 0.2, y, 6.2, 0.62, i%2===0?"F3E5F5":C.lightBg, C.line);
s.addText(label, { x:0.3, y:y+0.05, w:1.35, h:0.52, fontSize:9.5, bold:true, color:C.purple, fontFace:"Calibri", valign:"top" });
s.addShape(pres.shapes.RECTANGLE, { x:1.72, y:y+0.08, w:0.03, h:0.42, fill:{color:C.line}, line:{color:C.line} });
s.addText(desc, { x:1.82, y:y+0.05, w:4.5, h:0.52, fontSize:9.5, color:C.textMid, fontFace:"Calibri", valign:"top" });
});
// ════════════════════════════
// RIGHT COLUMN — PHARMACIST + ADVISORY
// ════════════════════════════
// ROLE OF HOSPITAL PHARMACIST
sectionHeader(s, 6.85, 0.85, 3.0, 0.32, "06 ROLE OF HOSPITAL PHARMACIST", C.darkBlue);
const pharmacistRoles = [
["🔍 Protocol Review", "Feasibility, compatibility, stability check before trial start."],
["📜 Regulatory Compliance", "Ensure 21 CFR 312, ICH-GCP, Joint Commission MM.06.01.05 adherence."],
["📦 Procurement & Inventory", "Receive drug, maintain perpetual DAR, notify PI at minimum stock."],
["💊 Preparation & Dispensing", "Sterile compounding if needed. Dispense only to consented, enrolled patients."],
["🗣️ Patient Counselling", "Dosing, storage, side effects, right to withdraw, return unused drug."],
["⚠️ ADR Monitoring", "Detect, document and report ADRs/SAEs to sponsor & regulatory authority."],
["📚 Drug Information", "Primary resource for team — mechanism, dosing, interactions from Investigator's Brochure."],
["🎓 Training & Unblinding", "Train staff per protocol. Manage emergency unblinding with documentation."],
];
pharmacistRoles.forEach(([label, desc], i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 6.85 + col * 3.22;
const y = 1.25 + row * 0.72;
miniCard(s, x, y, 3.05, 0.62, row%2===0?C.cardBlue:C.lightBg, C.line);
s.addText(label, { x:x+0.08, y:y+0.04, w:2.9, h:0.28, fontSize:9, bold:true, color:C.darkBlue, fontFace:"Calibri" });
s.addText(desc, { x:x+0.08, y:y+0.33, w:2.9, h:0.27, fontSize:8.5, color:C.textMid, fontFace:"Calibri" });
});
// ADVISORY COMMITTEE
sectionHeader(s, 6.85, 4.22, 3.0, 0.32, "07 ADVISORY COMMITTEE", C.orange);
const advisory = [
["🏛️ FDA Advisory\nCommittee", "External expert panels. Evaluate trial data. Non-binding approval recommendations. Public meetings ensure transparency.", "FFF3E0", "FFB74D"],
["🔬 IRB / Ethics\nCommittee", "Reviews & approves protocols. Annual monitoring. Can suspend trial. Requires diverse membership incl. community.", "FFF8E1", "FFD54F"],
["💊 P&T Committee", "Approves hospital policies for investigational drugs. Formulary oversight. Reviews trial safety data.", "E8F5E9", "81C784"],
["📊 DSMB / DMC", "Independent body for large trials. Reviews interim safety/efficacy data. Recommends early stop if needed.", "F3E5F5", "BA68C8"],
];
advisory.forEach(([label, desc, fill, line], i) => {
const col = i % 2;
const row = Math.floor(i / 2);
const x = 6.85 + col * 3.22;
const y = 4.62 + row * 1.35;
miniCard(s, x, y, 3.05, 1.22, fill, line);
s.addText(label, { x:x+0.1, y:y+0.06, w:2.85, h:0.45, fontSize:9.5, bold:true, color:C.orange, fontFace:"Calibri" });
s.addShape(pres.shapes.RECTANGLE, { x:x+0.1, y:y+0.52, w:2.85, h:0.03, fill:{color:C.line}, line:{color:C.line} });
s.addText(desc, { x:x+0.1, y:y+0.58, w:2.85, h:0.6, fontSize:8.8, color:C.textMid, fontFace:"Calibri" });
});
// SRC note
miniCard(s, 6.85, 6.35, 6.29, 0.72, "E8EAF6", "9FA8DA");
s.addText("🔬 Scientific Review Committee (SRC)", { x:6.95, y:6.38, w:3.0, h:0.28, fontSize:9.5, bold:true, color:C.darkBlue, fontFace:"Calibri" });
s.addText("Evaluates scientific merit, feasibility and resource adequacy of proposed trials before IRB review. The IDS pharmacist is a KEY member — provides pharmaceutical expertise for investigator-initiated trials.", {
x:6.95, y:6.65, w:6.1, h:0.38, fontSize:9, color:C.textMid, fontFace:"Calibri"
});
addBottomStrip(s);
// ─── WRITE ──────────────────────────────────────────────────────────────────
pres.writeFile({ fileName: "/home/daytona/workspace/investigational-drug-ppt/Investigational_Use_of_Drugs_2slides.pptx" })
.then(() => console.log("SUCCESS"))
.catch(e => console.error("ERROR:", e));
cd /home/daytona/workspace/investigational-drug-ppt && node build2.js 2>&1
ls -lh /home/daytona/workspace/investigational-drug-ppt/Investigational_Use_of_D…
Investigational Use of Drugs 2slides
Presentation · PPTX
No dark colors the text color should be black and times new Roman
~/investigational-drug-ppt/build3.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
const F = "Times New Roman";
const C = {
white: "FFFFFF",
black: "000000",
gray: "555555",
line: "CCCCCC",
lightGray:"F7F7F7",
// Soft pastel accents — used ONLY for section header bars and card borders
blue: "4A90D9",
teal: "3BAA8C",
orange: "E8873A",
purple: "8B6FCB",
green: "5BAD72",
red: "D95B5B",
gold: "C9A227",
};
// ── helpers ──────────────────────────────────────────────────────────────────
function whiteBg(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x:0,y:0,w:13.3,h:7.5,fill:{color:C.white},line:{color:C.white} });
}
function topBar(slide, color) {
slide.addShape(pres.shapes.RECTANGLE, { x:0,y:0,w:13.3,h:0.1,fill:{color:color},line:{color:color} });
}
function bottomBar(slide) {
slide.addShape(pres.shapes.RECTANGLE, { x:0,y:7.38,w:13.3,h:0.12,fill:{color:C.line},line:{color:C.line} });
slide.addText("B.Pharmacy Final Year | Pharmacy Practice | Investigational Use of Drugs", {
x:0,y:7.38,w:13.3,h:0.12,fontSize:7,color:C.gray,align:"center",valign:"middle",margin:0,fontFace:F
});
}
function secLabel(slide, x, y, w, h, txt, color) {
slide.addShape(pres.shapes.RECTANGLE, { x,y,w,h,fill:{color:color},line:{color:color} });
slide.addText(txt, { x,y,w,h,fontSize:9,bold:true,color:C.white,align:"center",valign:"middle",margin:0,fontFace:F });
}
function card(slide, x, y, w, h, borderColor) {
slide.addShape(pres.shapes.RECTANGLE, {
x,y,w,h,
fill:{color:C.white},
line:{color:borderColor||C.line,pt:1},
shadow:{type:"outer",color:"DDDDDD",blur:3,offset:1,angle:135,opacity:0.3}
});
}
function row(slide, x, y, w, h, fill) {
slide.addShape(pres.shapes.RECTANGLE, {x,y,w,h,fill:{color:fill||C.lightGray},line:{color:C.line,pt:0.5}});
}
function txt(slide, text, x, y, w, h, opts) {
slide.addText(text, Object.assign({ x,y,w,h,fontFace:F,color:C.black,fontSize:10,valign:"middle" }, opts||{}));
}
function boldTxt(slide, text, x, y, w, h, opts) {
txt(slide, text, x, y, w, h, Object.assign({ bold:true }, opts||{}));
}
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 1 — Description | Principles | Classification
// ══════════════════════════════════════════════════════════════════════════════
let s = pres.addSlide();
whiteBg(s);
topBar(s, C.blue);
// Slide heading
boldTxt(s,"Investigational Use of Drugs — Overview",0.25,0.13,10,0.48,{fontSize:20,color:C.black});
s.addShape(pres.shapes.RECTANGLE,{x:0.25,y:0.63,w:6,h:0.035,fill:{color:C.blue},line:{color:C.blue}});
txt(s,"Slide 1 of 2",12.1,0.18,1.0,0.28,{fontSize:8.5,color:C.gray,align:"right"});
// ─── SECTION 01 — DESCRIPTION ────────────────────────────────────────────────
secLabel(s, 0.2,0.75,2.6,0.28,"01 DESCRIPTION",C.blue);
card(s,0.2,1.08,4.1,1.6,C.blue);
boldTxt(s,"What is an Investigational Drug?",0.32,1.11,3.86,0.3,{fontSize:10.5,color:C.black});
s.addShape(pres.shapes.RECTANGLE,{x:0.32,y:1.42,w:3.86,h:0.025,fill:{color:C.blue},line:{color:C.blue}});
txt(s,"A drug not yet approved by FDA / CDSCO for general use, tested in humans under an Investigational New Drug (IND) application to establish safety and efficacy.",0.32,1.46,3.85,1.2,{fontSize:10,wrapText:true});
card(s,4.5,1.08,4.1,1.6,C.teal);
boldTxt(s,"Scope of Investigational Use",4.62,1.11,3.86,0.3,{fontSize:10.5,color:C.black});
s.addShape(pres.shapes.RECTANGLE,{x:4.62,y:1.42,w:3.86,h:0.025,fill:{color:C.teal},line:{color:C.teal}});
s.addText([
{text:"• New Chemical Entities (NCE) — first in human\n",options:{fontSize:10,color:C.black,fontFace:F}},
{text:"• Approved drug for new indication/route/population\n",options:{fontSize:10,color:C.black,fontFace:F}},
{text:"• Expanded / compassionate use programs\n",options:{fontSize:10,color:C.black,fontFace:F}},
{text:"• Off-label drugs under formal study",options:{fontSize:10,color:C.black,fontFace:F}},
],{x:4.62,y:1.46,w:3.85,h:1.2});
card(s,8.9,1.08,4.2,1.6,C.orange);
boldTxt(s,"IND Application Requirements",9.02,1.11,3.96,0.3,{fontSize:10.5,color:C.black});
s.addShape(pres.shapes.RECTANGLE,{x:9.02,y:1.42,w:3.96,h:0.025,fill:{color:C.orange},line:{color:C.orange}});
s.addText([
{text:"• Pre-clinical pharmacology & toxicology data\n",options:{fontSize:10,color:C.black,fontFace:F}},
{text:"• Chemistry, Manufacturing & Controls (CMC)\n",options:{fontSize:10,color:C.black,fontFace:F}},
{text:"• Clinical protocol & investigator credentials\n",options:{fontSize:10,color:C.black,fontFace:F}},
{text:"• FDA review: 30 days to approve/reject",options:{fontSize:10,color:C.black,fontFace:F}},
],{x:9.02,y:1.46,w:3.96,h:1.2});
// ─── SECTION 02 — PRINCIPLES ─────────────────────────────────────────────────
secLabel(s, 0.2,2.83,2.8,0.28,"02 PRINCIPLES INVOLVED",C.teal);
const principles = [
["Declaration of Helsinki","Subject welfare > science. Voluntary informed consent before any procedure. Research must be scientifically sound."],
["Good Clinical Practice (GCP)","ICH-E6 international standard for designing, conducting, recording and reporting clinical trials."],
["Informed Consent","Patient must understand purpose, risks, benefits and right to withdraw BEFORE any study activity begins."],
["Risk-Benefit Balance","Harris-Kefauver 1962: Prove both safety AND efficacy. Acceptable risk is proportional to disease severity."],
["IRB / Ethics Committee","Independent review and approval before trial start. Annual monitoring. Can suspend trial for patient safety."],
["Scientific Validity","Flawed study design is an ethical violation. Requires proper sample size, randomisation and clear endpoints."],
];
principles.forEach(([title,desc],i) => {
const col = i%3, row_ = Math.floor(i/3);
const x = 0.2 + col*4.35;
const y = 3.17 + row_*1.35;
card(s,x,y,4.18,1.25, [C.teal,C.blue,C.orange,C.purple,C.green,C.red][i]);
s.addShape(pres.shapes.RECTANGLE,{x,y,w:4.18,h:0.04,fill:{color:[C.teal,C.blue,C.orange,C.purple,C.green,C.red][i]},line:{color:[C.teal,C.blue,C.orange,C.purple,C.green,C.red][i]}});
boldTxt(s,title,x+0.1,y+0.06,3.98,0.28,{fontSize:10,color:C.black});
s.addShape(pres.shapes.RECTANGLE,{x:x+0.1,y:y+0.36,w:3.98,h:0.025,fill:{color:C.line},line:{color:C.line}});
txt(s,desc,x+0.1,y+0.38,3.98,0.82,{fontSize:9.5,color:C.black,wrapText:true,valign:"top"});
});
// ─── SECTION 03 — CLASSIFICATION ─────────────────────────────────────────────
secLabel(s, 0.2,5.92,2.6,0.28,"03 CLASSIFICATION",C.orange);
const classes = [
["Class I","New Chemical Entity","Never tested in humans. Only pre-clinical data. Most rigorous monitoring required."],
["Class II","Approved Drug — New Use","Existing drug studied for new indication, dose, route or population. Fresh IND needed."],
["Class III","Treatment IND / Expanded Access","Serious illness with no alternative. Includes individual, intermediate and widespread access."],
["Class IV","Off-Label Under Investigation","Approved drug used beyond label under formal study. Requires IND + IRB oversight."],
];
classes.forEach(([cls,title,desc],i) => {
const x = 0.2 + i*3.27;
card(s,x,6.26,3.1,1.1, [C.blue,C.teal,C.orange,C.purple][i]);
s.addShape(pres.shapes.RECTANGLE,{x,y:6.26,w:3.1,h:0.3,fill:{color:[C.blue,C.teal,C.orange,C.purple][i]},line:{color:[C.blue,C.teal,C.orange,C.purple][i]}});
txt(s,`${cls} | ${title}`,x+0.08,6.26,2.94,0.3,{fontSize:9.5,bold:true,color:C.white,valign:"middle",margin:3});
txt(s,desc,x+0.1,6.59,2.9,0.73,{fontSize:9.5,color:C.black,valign:"top",wrapText:true});
});
bottomBar(s);
// ══════════════════════════════════════════════════════════════════════════════
// SLIDE 2 — Control | Identification | Hospital Pharmacist | Advisory Committee
// ══════════════════════════════════════════════════════════════════════════════
s = pres.addSlide();
whiteBg(s);
topBar(s, C.teal);
boldTxt(s,"Investigational Use of Drugs — Management & Oversight",0.25,0.13,11,0.48,{fontSize:20,color:C.black});
s.addShape(pres.shapes.RECTANGLE,{x:0.25,y:0.63,w:6.5,h:0.035,fill:{color:C.teal},line:{color:C.teal}});
txt(s,"Slide 2 of 2",12.1,0.18,1.0,0.28,{fontSize:8.5,color:C.gray,align:"right"});
// ─── LEFT HALF ────────────────────────────────────────────────────────────────
// SECTION 04 — CONTROL
secLabel(s,0.2,0.75,2.2,0.28,"04 CONTROL",C.teal);
const controlRows = [
["Acquisition & Receipt","Received by pharmacy/IDS only. Verify against sponsor manifest. Document lot, expiry, quantity and transport conditions."],
["Storage","Per sponsor specs (temperature, light, humidity). Controlled substances in locked area. Stored separately from commercial drugs. Temperature logs maintained."],
["Dispensing","PI-signed prescription required. Confirm informed consent before dispensing. Every dispense documented on Drug Accountability Record (DAR)."],
["Drug Accountability Records","DAR tracks every unit from receipt to disposal. Retained for 2 years after approval or trial discontinuation."],
["Returns & Destruction","Unused drug returned to sponsor or destroyed per regulations. Documented destruction — never disposed as regular waste."],
];
controlRows.forEach(([label,desc],i) => {
const y = 1.1 + i*0.62;
const fill = i%2===0 ? "F2F9F7" : C.white;
s.addShape(pres.shapes.RECTANGLE,{x:0.2,y,w:6.3,h:0.56,fill:{color:fill},line:{color:C.line,pt:0.5}});
boldTxt(s,label,0.3,y+0.03,1.65,0.5,{fontSize:9.5,color:C.black,valign:"top"});
s.addShape(pres.shapes.RECTANGLE,{x:2.0,y:y+0.08,w:0.025,h:0.4,fill:{color:C.teal},line:{color:C.teal}});
txt(s,desc,2.07,y+0.03,4.35,0.5,{fontSize:9,color:C.black,valign:"top",wrapText:true});
});
// SECTION 05 — IDENTIFICATION
secLabel(s,0.2,4.25,2.4,0.28,"05 IDENTIFICATION",C.purple);
const idRows = [
["Mandatory Label","Must state: 'New Drug — Investigational Use Only', Sponsor name, IND#, PI name, storage conditions, lot number, expiry and strength."],
["Identification Challenge","No colour/shape/imprint cues in blinded trials. Staff must rely on protocol documentation, not visual identification."],
["System Controls","Pharmacy software with protocol IDs, barcode verification, and two-patient-identifier check before every dispensing event."],
];
idRows.forEach(([label,desc],i) => {
const y = 4.6 + i*0.71;
const fill = i%2===0 ? "F9F5FF" : C.white;
s.addShape(pres.shapes.RECTANGLE,{x:0.2,y,w:6.3,h:0.65,fill:{color:fill},line:{color:C.line,pt:0.5}});
boldTxt(s,label,0.3,y+0.03,1.75,0.59,{fontSize:9.5,color:C.black,valign:"top"});
s.addShape(pres.shapes.RECTANGLE,{x:2.1,y:y+0.08,w:0.025,h:0.45,fill:{color:C.purple},line:{color:C.purple}});
txt(s,desc,2.18,y+0.03,4.25,0.59,{fontSize:9,color:C.black,valign:"top",wrapText:true});
});
// ─── RIGHT HALF ───────────────────────────────────────────────────────────────
// SECTION 06 — HOSPITAL PHARMACIST
secLabel(s,6.8,0.75,3.1,0.28,"06 ROLE OF HOSPITAL PHARMACIST",C.blue);
const pharmaRoles = [
["Protocol Review","Check feasibility, compatibility, stability before trial start. Participate in Scientific Review Committee."],
["Regulatory Compliance","Ensure 21 CFR 312, ICH-GCP and Joint Commission MM.06.01.05 adherence."],
["Procurement & Inventory","Receive drug, maintain perpetual DAR, notify PI at minimum stock level."],
["Preparation & Dispensing","Sterile compounding if required. Dispense only to consented, enrolled patients on valid PI orders."],
["Patient Counselling","Explain dosing, storage, side effects, right to withdraw, and importance of returning unused drug."],
["ADR Monitoring","Detect, document and report Adverse Drug Reactions and Serious Adverse Events to sponsor and authority."],
["Drug Information","Primary resource for entire team — mechanism, interactions, dosing from Investigator's Brochure."],
["Training & Unblinding","Train staff per each protocol. Manage emergency unblinding with proper documentation."],
];
pharmaRoles.forEach(([label,desc],i) => {
const col = i%2, rw = Math.floor(i/2);
const x = 6.8 + col*3.22;
const y = 1.1 + rw*0.72;
const fill = rw%2===0 ? "F0F6FF" : C.white;
s.addShape(pres.shapes.RECTANGLE,{x,y,w:3.05,h:0.65,fill:{color:fill},line:{color:C.line,pt:0.5}});
boldTxt(s,label,x+0.1,y+0.03,2.85,0.25,{fontSize:9.5,color:C.black});
txt(s,desc,x+0.1,y+0.3,2.85,0.32,{fontSize:8.8,color:C.black,valign:"top",wrapText:true});
});
// SECTION 07 — ADVISORY COMMITTEE
secLabel(s,6.8,3.98,2.8,0.28,"07 ADVISORY COMMITTEE",C.orange);
const advisory = [
["FDA Advisory Committee","External expert panels evaluate trial data and make non-binding approval recommendations. Public meetings ensure transparency."],
["IRB / Ethics Committee","Reviews and approves protocols before trial start. Annual monitoring. Can suspend or terminate trial for patient safety."],
["P&T Committee","Approves hospital policies for investigational drugs. Oversees formulary alignment. Reviews ongoing trial safety data."],
["DSMB / Data Monitoring Committee","Independent body for large trials. Reviews interim safety/efficacy data. Can recommend early study termination."],
["Scientific Review Committee (SRC)","Assesses scientific merit and feasibility before IRB review. IDS pharmacist is a key member providing pharmaceutical expertise."],
];
advisory.forEach(([label,desc],i) => {
const col = i < 4 ? i%2 : 0;
const rw = i < 4 ? Math.floor(i/2) : 2;
const x = i < 4 ? 6.8 + col*3.22 : 6.8;
const w = i < 4 ? 3.05 : 6.3;
const y = 4.33 + rw*0.74;
const fill = rw%2===0 ? "FFF8F0" : C.white;
s.addShape(pres.shapes.RECTANGLE,{x,y,w,h:0.65,fill:{color:fill},line:{color:C.line,pt:0.5}});
boldTxt(s,label,x+0.1,y+0.03,i<4?2.85:3.5,0.25,{fontSize:9.5,color:C.black});
txt(s,desc,x+0.1,y+0.3,i<4?2.85:6.1,0.32,{fontSize:8.8,color:C.black,valign:"top",wrapText:true});
});
bottomBar(s);
// ─── WRITE ────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName:"/home/daytona/workspace/investigational-drug-ppt/InvestigationalDrugs_Final.pptx" })
.then(()=>console.log("SUCCESS"))
.catch(e=>console.error("ERROR:",e));
cd /home/daytona/workspace/investigational-drug-ppt && node build3.js 2>&1
ls -lh /home/daytona/workspace/investigational-drug-ppt/InvestigationalDrugs_Fin…
InvestigationalDrugs Final
Presentation · PPTX
Can you even make flow chart
~/investigational-drug-ppt/flowchart.js
const pptxgen = require("pptxgenjs");
const pres = new pptxgen();
pres.layout = "LAYOUT_WIDE"; // 13.3 x 7.5 inches
const F = "Times New Roman";
// ── COLOURS (white bg, black text, soft accents for shapes only) ──
const WHITE = "FFFFFF";
const BLACK = "000000";
const LGRAY = "F0F0F0";
const BORDER = "AAAAAA";
// Step box fill colours (soft pastels — text stays black)
const COL = {
start: "D6EAF8", // light blue — start/end ovals
process: "EAF4FB", // very light blue — process rectangles
decision: "FEF9E7", // light yellow — diamond decisions
phase1: "E8F8F5", // mint
phase2: "E9F7EF", // light green
phase3: "FEF9E7", // light gold
phase4: "FDEDEC", // light rose
approval: "F9EBEA", // light red
success: "EAFAF1", // pale green
arrow: "2E86C1", // medium blue for arrows
};
const s = pres.addSlide();
// White background
s.addShape(pres.shapes.RECTANGLE, {x:0,y:0,w:13.3,h:7.5,fill:{color:WHITE},line:{color:WHITE}});
// ── TOP BAR + TITLE ──
s.addShape(pres.shapes.RECTANGLE, {x:0,y:0,w:13.3,h:0.08,fill:{color:"2E86C1"},line:{color:"2E86C1"}});
s.addText("Investigational Use of Drugs — Process Flowchart", {
x:0.3,y:0.1,w:12.7,h:0.5,
fontSize:18,bold:true,color:BLACK,fontFace:F,align:"center"
});
s.addShape(pres.shapes.RECTANGLE,{x:1.5,y:0.62,w:10.3,h:0.03,fill:{color:"2E86C1"},line:{color:"2E86C1"}});
// ── BOTTOM BAR ──
s.addShape(pres.shapes.RECTANGLE,{x:0,y:7.4,w:13.3,h:0.1,fill:{color:LGRAY},line:{color:LGRAY}});
s.addText("B.Pharmacy Final Year | Pharmacy Practice",{
x:0,y:7.4,w:13.3,h:0.1,fontSize:7,color:"666666",align:"center",valign:"middle",fontFace:F
});
// ─────────────────────────────────────────────────────────────────────────────
// LAYOUT: Two columns of flow
// LEFT column (x ≈ 0.35): Discovery → Pre-clinical → IND Application → IND Review
// Then merges to CENTER for Phase I → II → III → NDA → FDA Review → Approval → Phase IV
// We'll do a single top-to-bottom vertical flow centered on the slide.
// ─────────────────────────────────────────────────────────────────────────────
// Helper: draw a rounded-rect process box
function box(x, y, w, h, label, sublabel, fill, lineColor) {
s.addShape(pres.shapes.ROUNDED_RECTANGLE, {
x, y, w, h,
fill: { color: fill || COL.process },
line: { color: lineColor || BORDER, pt: 1 },
rectRadius: 0.08,
shadow: { type:"outer", color:"CCCCCC", blur:3, offset:1, angle:135, opacity:0.25 }
});
if (sublabel) {
s.addText(label, { x:x+0.06, y:y+0.04, w:w-0.12, h:h*0.48, fontSize:9.5, bold:true, color:BLACK, fontFace:F, align:"center", valign:"bottom", margin:0 });
s.addText(sublabel, { x:x+0.06, y:y+h*0.5, w:w-0.12, h:h*0.46, fontSize:8.5, color:"333333", fontFace:F, align:"center", valign:"top", margin:0 });
} else {
s.addText(label, { x:x+0.06, y, w:w-0.12, h, fontSize:9.5, bold:true, color:BLACK, fontFace:F, align:"center", valign:"middle", margin:0 });
}
}
// Helper: draw an oval (start/end)
function oval(x, y, w, h, label, fill) {
s.addShape(pres.shapes.OVAL, {
x, y, w, h,
fill: { color: fill || COL.start },
line: { color: BORDER, pt: 1.2 },
shadow: { type:"outer", color:"CCCCCC", blur:3, offset:1, angle:135, opacity:0.25 }
});
s.addText(label, { x:x+0.05, y, w:w-0.1, h, fontSize:10, bold:true, color:BLACK, fontFace:F, align:"center", valign:"middle", margin:0 });
}
// Helper: diamond decision
function diamond(x, y, w, h, label, fill) {
s.addShape(pres.shapes.DIAMOND, {
x, y, w, h,
fill: { color: fill || COL.decision },
line: { color: BORDER, pt: 1 },
shadow: { type:"outer", color:"CCCCCC", blur:3, offset:1, angle:135, opacity:0.25 }
});
s.addText(label, { x:x+0.06, y, w:w-0.12, h, fontSize:9, bold:true, color:BLACK, fontFace:F, align:"center", valign:"middle", margin:0 });
}
// Helper: downward arrow
function arrowDown(x, y, h, label) {
s.addShape(pres.shapes.RECTANGLE, { x:x-0.01, y, w:0.04, h, fill:{color:COL.arrow}, line:{color:COL.arrow} });
// arrowhead triangle
s.addShape(pres.shapes.ISOSCELES_TRIANGLE, { x:x-0.09, y:y+h-0.01, w:0.22, h:0.14, fill:{color:COL.arrow}, line:{color:COL.arrow}, rotate:180 });
if (label) {
s.addText(label, { x:x+0.08, y:y+h/2-0.1, w:0.9, h:0.22, fontSize:8, color:"555555", fontFace:F, italic:true });
}
}
// Helper: side arrow (right)
function arrowRight(x, y, w, label) {
s.addShape(pres.shapes.RECTANGLE, { x, y:y-0.01, w, h:0.04, fill:{color:COL.arrow}, line:{color:COL.arrow} });
s.addShape(pres.shapes.ISOSCELES_TRIANGLE, { x:x+w-0.01, y:y-0.09, w:0.14, h:0.22, fill:{color:COL.arrow}, line:{color:COL.arrow}, rotate:90 });
if (label) {
s.addText(label, { x:x+w/2-0.3, y:y-0.22, w:0.8, h:0.2, fontSize:7.5, color:"555555", fontFace:F, italic:true, align:"center" });
}
}
// Helper: side arrow (left — for "Rejected" feedback)
function arrowLeft(x, y, w) {
s.addShape(pres.shapes.RECTANGLE, { x, y:y-0.01, w, h:0.04, fill:{color:"CC0000"}, line:{color:"CC0000"} });
s.addShape(pres.shapes.ISOSCELES_TRIANGLE, { x:x-0.13, y:y-0.09, w:0.14, h:0.22, fill:{color:"CC0000"}, line:{color:"CC0000"}, rotate:270 });
}
// ─────────────────────────────────────────────────────────────────────────────
// FLOWCHART NODES
// Layout: 3 columns flowing left→center→right in a Z/cascade pattern
// Left col x≈0.5, center x≈3.8, right col x≈9.2
// Vertical rows at y = 0.78, 1.62, 2.46, 3.30, 4.14, 4.98, 5.82, 6.55
// ─────────────────────────────────────────────────────────────────────────────
const BW = 2.55; // box width
const BH = 0.62; // box height
const DW = 2.3; // diamond width
const DH = 0.72; // diamond height
// ROW 1 — Start
const r1y = 0.78;
oval(5.4, r1y, 2.5, 0.52, "START: Drug Discovery / New Molecule Identified", "D6EAF8");
// Arrow down
arrowDown(6.65, r1y+0.52, 0.2);
// ROW 2 — Pre-clinical
const r2y = r1y + 0.52 + 0.2;
box(0.35, r2y, BW, BH, "Pre-Clinical Studies", "Animal pharmacology, toxicology\n& safety profiling", COL.process, BORDER);
box(5.4, r2y, 2.5, BH, "Pre-Clinical Studies", "Pharmacology · Toxicology · CMC · Safety in animals", COL.process, BORDER);
box(10.6, r2y, BW, BH, "Outcome", "Sufficient safety data\nto justify human trials?", COL.decision, BORDER);
// Annotations left and right
s.addText("Key data collected:", {x:0.4,y:r2y+0.04,w:BW-0.1,h:0.22,fontSize:8.5,bold:true,color:BLACK,fontFace:F});
s.addText("• Pharmacokinetics (ADME)\n• Acute & chronic toxicity\n• Genotoxicity / Carcinogenicity\n• Reproductive toxicity",{x:0.4,y:r2y+0.25,w:BW-0.1,h:BH-0.28,fontSize:8,color:"333333",fontFace:F});
// Arrow from pre-clinical box to decision
arrowRight(7.9, r2y+BH/2, 0.5);
// Decision diamond replacing the box on right
diamond(10.3, r2y-0.05, DW+0.2, DH, "Data\nSufficient?", COL.decision);
// Arrow down from pre-clinical centre
arrowDown(6.65, r2y+BH, 0.22);
// ROW 3 — IND Application
const r3y = r2y + BH + 0.22;
box(5.4, r3y, 2.5, BH, "IND Application Filed", "Sponsor submits to FDA (21 CFR Part 312)", COL.process, "2E86C1");
// Side note
s.addText("IND must include:\n• Pre-clinical data\n• CMC information\n• Clinical protocol\n• Investigator credentials\n• Informed consent docs",{x:8.18,y:r3y,w:2.5,h:BH+0.1,fontSize:8.5,color:BLACK,fontFace:F,
fill:{color:"EAF4FB"}, line:{color:BORDER,pt:0.5}
});
// bracket line connecting note to box
s.addShape(pres.shapes.RECTANGLE,{x:7.9,y:r3y+BH/2-0.01,w:0.28,h:0.04,fill:{color:BORDER},line:{color:BORDER}});
arrowDown(6.65, r3y+BH, 0.22);
// ROW 4 — FDA Review diamond
const r4y = r3y + BH + 0.22;
diamond(5.52, r4y, 2.26, DH, "FDA Review\n(30 days)", COL.decision);
// "Approved" arrow down
arrowDown(6.65, r4y+DH, 0.22);
s.addText("Approved /\nNo Objection",{x:6.72,y:r4y+DH/2,w:1.1,h:0.4,fontSize:8,color:"1A7E3C",fontFace:F,italic:true});
// "Rejected" arrow to left with label
arrowLeft(3.6, r4y+DH/2, 1.92);
s.addText("Rejected /\nMore Data",{x:3.55,y:r4y+DH/2-0.22,w:1.0,h:0.22,fontSize:8,color:"CC0000",fontFace:F,italic:true,align:"center"});
// ROW 5 — Phase I, II, III (horizontal flow)
const r5y = r4y + DH + 0.22;
box(0.35, r5y, BW, BH, "Phase I", "10–100 Healthy Volunteers\nSafety · Dose-finding · PK/PD", COL.phase1, "3BAA8C");
arrowRight(BW+0.35, r5y+BH/2, 0.25);
box(3.15, r5y, BW, BH, "Phase II", "50–500 Patients\nEfficacy signals + Safety", COL.phase2, "27AE60");
arrowRight(3.15+BW, r5y+BH/2, 0.25);
box(5.95, r5y, BW, BH, "Phase III", "Hundreds–Thousands Patients\nConfirm Efficacy & Safety\n(Randomised Controlled)", COL.phase3, "D4AC0D");
arrowRight(5.95+BW, r5y+BH/2, 0.25);
box(8.75, r5y, BW, BH, "NDA / BLA\nSubmission", "Sponsor submits to FDA\nwith full trial data", "FAE5D3", "E8873A");
arrowRight(8.75+BW, r5y+BH/2, 0.25);
// FDA Approval diamond
diamond(11.6, r5y-0.05, 1.5, DH, "FDA\nApproval?", COL.decision);
// Entry arrow from above into Phase I
arrowDown(1.67, r5y-0.22, 0.22);
// ROW 6 — Approved / Not Approved
const r6y = r5y + BH + 0.22;
// Arrow from approval diamond down-left to "Approved" box
// Arrow down from diamond (bottom)
arrowDown(12.35, r5y-0.05+DH, 0.22);
box(11.6, r6y, 1.7, BH, "APPROVED\nfor Marketing", "Drug enters\ncommercial market", COL.success, "1A7E3C");
// Not approved → back arrow
s.addShape(pres.shapes.RECTANGLE,{x:11.55,y:r5y+DH/2-0.05,w:1.6,h:0.04,fill:{color:"CC0000"},line:{color:"CC0000"}});
s.addText("Not Approved",{x:11.58,y:r5y+DH/2-0.24,w:1.5,h:0.22,fontSize:7.5,color:"CC0000",fontFace:F,italic:true,align:"center"});
arrowDown(12.35, r6y+BH, 0.2);
// ROW 7 — Phase IV
const r7y = r6y + BH + 0.2;
box(11.6, r7y, 1.7, BH, "Phase IV\n(Post-Marketing)", "Real-world safety\nNew indications · Long-term data", COL.phase4, "D95B5B");
// ── Final END oval
arrowDown(12.35, r7y+BH, 0.16);
oval(11.3, r7y+BH+0.16, 2.1, 0.42, "ONGOING PHARMACOVIGILANCE", COL.start);
// ── LEGEND ──
s.addShape(pres.shapes.RECTANGLE,{x:0.3,y:6.42,w:8.5,h:0.9,fill:{color:LGRAY},line:{color:BORDER,pt:0.5}});
s.addText("LEGEND:", {x:0.45,y:6.48,w:0.9,h:0.2,fontSize:8.5,bold:true,color:BLACK,fontFace:F});
const legItems = [
[COL.process,"Process / Step"],
[COL.decision,"Decision"],
[COL.phase1,"Phase I"],
[COL.phase2,"Phase II"],
[COL.phase3,"Phase III"],
[COL.success,"Approved"],
[COL.phase4,"Phase IV"],
];
legItems.forEach(([fill,label],i) => {
const lx = 0.42 + i*1.18;
s.addShape(pres.shapes.RECTANGLE,{x:lx,y:6.72,w:0.28,h:0.22,fill:{color:fill},line:{color:BORDER,pt:0.5}});
s.addText(label,{x:lx+0.32,y:6.72,w:0.85,h:0.22,fontSize:8,color:BLACK,fontFace:F,valign:"middle"});
});
// ─── WRITE ────────────────────────────────────────────────────────────────────
pres.writeFile({ fileName:"/home/daytona/workspace/investigational-drug-ppt/Investigational_Drug_Flowchart.pptx" })
.then(()=>console.log("SUCCESS"))
.catch(e=>console.error("ERROR:",e));
cd /home/daytona/workspace/investigational-drug-ppt && node flowchart.js 2>&1
ls -lh /home/daytona/workspace/investigational-drug-ppt/Investigational_Drug_Flo…
Investigational Drug Flowchart
Presentation · PPTX
START (Oval)
↓
Pre-Clinical Studies
(Pharmacology · Toxicology · CMC · Animal Safety)
↓
IND Application Filed → [side note: what IND must include]
↓
FDA Review — 30 days (Diamond)
↙ Approved ↖ Rejected (red arrow back)
↓
Phase I → Phase II → Phase III → NDA/BLA Submission → FDA Approval? (Diamond)
↓ Approved
APPROVED for Marketing
↓
Phase IV (Post-Marketing)
↓
ONGOING PHARMACOVIGILANCE (Oval)