Make ppt out of this. Include indian road accident data
India road accident statistics 2023 2024 NCRB MoRTH deaths injuries data
cd /home/daytona/workspace && python3 -c " import pdfplumber pdfs = [ '/home/daytona/workspace/attachments/2c2a3ee3-3e53-403e-8b30-b4dfd9518257/default(1).PDF', '/home/daytona/workspace/attachments/2c2a3ee3-3e53-403e-8b30-b4dfd9518257/default.PDF' ] for pdf_path in pdfs: print(f'\n\n=== FILE: {pdf_path} ===') try: with pdfplumber.open(pdf_path) as pdf: print(f'Pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): text = page.extract_text() if text: print(f'--- Page {i+1} ---') print(text[:3000]) except Exception as e: print(f'Error: {e}') "
mkdir -p /home/daytona/workspace/trauma-ppt && ls /home/daytona/workspace/trauma-ppt/
~/trauma-ppt/create_ppt.js
const pptxgen = require("pptxgenjs");
let pres = new pptxgen();
pres.layout = 'LAYOUT_16x9';
pres.title = 'Trauma Management & Indian Road Accident Data';
// โโโ THEME COLORS โโโ
const DARK_BG = "1A2340"; // deep navy
const MID_BG = "243058"; // slightly lighter navy
const ACCENT = "E84B3C"; // emergency red
const ACCENT2 = "F5A623"; // amber
const WHITE = "FFFFFF";
const LIGHT = "D8E0F0";
const GRAY = "8A97B0";
// โโโ HELPER: slide background โโโ
function darkSlide(pres) {
let s = pres.addSlide();
s.background = { color: DARK_BG };
return s;
}
function midSlide(pres) {
let s = pres.addSlide();
s.background = { color: MID_BG };
return s;
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 1 โ TITLE
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
// Red accent bar left
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 0.18, h: 5.625, fill: { color: ACCENT } });
// Red accent bar top
s.addShape(pres.ShapeType.rect, { x: 0.18, y: 0, w: 9.82, h: 0.08, fill: { color: ACCENT } });
// Main title
s.addText("TRAUMA MANAGEMENT", {
x: 0.5, y: 0.8, w: 9, h: 0.85,
fontSize: 44, bold: true, color: WHITE, fontFace: "Calibri",
charSpacing: 4
});
s.addText("& Indian Road Accident Statistics", {
x: 0.5, y: 1.65, w: 9, h: 0.55,
fontSize: 26, color: ACCENT2, fontFace: "Calibri", italic: false
});
// Divider
s.addShape(pres.ShapeType.rect, { x: 0.5, y: 2.3, w: 4.5, h: 0.05, fill: { color: ACCENT } });
// Subtitle description
s.addText("Initial Assessment ยท Hemorrhage Control ยท Resuscitation\nIndia Road Crash Epidemiology ยท Prevention", {
x: 0.5, y: 2.55, w: 9, h: 0.9,
fontSize: 17, color: LIGHT, fontFace: "Calibri", lineSpacingMultiple: 1.4
});
// Source tag
s.addText("Sources: UpToDate (Jun 2026) ยท MoRTH 2024 ยท WHO Global Status Report", {
x: 0.5, y: 5.1, w: 9.3, h: 0.4,
fontSize: 11, color: GRAY, fontFace: "Calibri", italic: true
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 2 โ INDIAN ROAD ACCIDENT OVERVIEW (2024)
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: ACCENT } });
s.addText("๐ฎ๐ณ INDIA ROAD ACCIDENT CRISIS โ 2024 DATA", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
// STAT BOXES row 1
const stats1 = [
{ val: "4.80 L", lbl: "Road Accidents\n(2024)", bg: "8B1A1A" },
{ val: "1.77 L", lbl: "Deaths\n(MoRTH 2024)", bg: "9B2A10" },
{ val: "485", lbl: "Deaths per Day", bg: "7A1E1E" },
{ val: "+2.3%", lbl: "Rise vs 2023", bg: "5A3010" },
];
stats1.forEach((st, i) => {
let x = 0.25 + i * 2.42;
s.addShape(pres.ShapeType.roundRect, { x, y: 0.8, w: 2.2, h: 1.35,
fill: { color: st.bg }, line: { color: ACCENT, width: 1.5 }, rectRadius: 0.08 });
s.addText(st.val, { x, y: 0.88, w: 2.2, h: 0.7,
fontSize: 30, bold: true, color: WHITE, align: "center", fontFace: "Calibri" });
s.addText(st.lbl, { x, y: 1.6, w: 2.2, h: 0.45,
fontSize: 12, color: ACCENT2, align: "center", fontFace: "Calibri" });
});
// Row 2 bullet points
const bullets = [
"India ranks #1 worldwide in road deaths โ ahead of China and the US (World Road Statistics, IRF)",
"India accounts for 11% of global road deaths despite having only 1% of the global vehicle population",
"18-45 age group โ 66.1% of all road accident deaths (prime productive age group)",
"Two-wheelers โ 46.2% of deaths | Pedestrians โ 20.6% of deaths",
"National Highways (only 2.1% of road network) โ 36.6% share in total deaths",
"Over-speeding responsible for 70.3% of all road crash fatalities",
"WHO target: 50% reduction in road deaths by 2030 (SDG 3.6) โ India far off-track",
];
s.addText(bullets.map((b, i) => ({
text: b,
options: { bullet: { type: "bullet", code: "25A0", color: ACCENT },
color: i === 0 || i === 1 ? ACCENT2 : LIGHT,
fontSize: 12.5, bold: i < 2, breakLine: true, paraSpaceAfter: 3 }
})), { x: 0.3, y: 2.28, w: 9.4, h: 3.0, fontFace: "Calibri" });
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 3 โ STATE-WISE & SEVERITY DATA
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = midSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: ACCENT } });
s.addText("STATE-WISE ROAD ACCIDENT DATA (2024)", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
// LEFT COLUMN โ top states table
s.addText("Top States by Accidents (2024)", {
x: 0.3, y: 0.8, w: 4.5, h: 0.38,
fontSize: 15, bold: true, color: ACCENT2, fontFace: "Calibri"
});
const tableRows = [
[{ text: "State", options: { bold: true, color: ACCENT2 } },
{ text: "Accidents", options: { bold: true, color: ACCENT2 } },
{ text: "Deaths", options: { bold: true, color: ACCENT2 } }],
["Uttar Pradesh", "~47,000", "~24,600"],
["Tamil Nadu", "~63,000", "~17,000"],
["Madhya Pradesh", "~52,000", "~14,800"],
["Rajasthan", "~30,000", "~14,200"],
["Maharashtra", "~32,000", "~13,500"],
];
s.addTable(tableRows, {
x: 0.3, y: 1.2, w: 4.5, h: 2.8,
colW: [2.1, 1.2, 1.2],
fill: { color: "1E2D50" },
border: { type: "solid", color: "2D4080", pt: 0.8 },
fontFace: "Calibri", fontSize: 12.5, color: WHITE,
align: "center"
});
// RIGHT COLUMN โ severity
s.addText("Accident Severity Index", {
x: 5.1, y: 0.8, w: 4.6, h: 0.38,
fontSize: 15, bold: true, color: ACCENT2, fontFace: "Calibri"
});
const severityData = [
{ state: "Uttar Pradesh", val: "52.4%", note: "Highest โ 1 death / 2 accidents", color: ACCENT },
{ state: "Rajasthan", val: "47.5%", note: "Very high severity", color: "D04020" },
{ state: "Gujarat", val: "49.5%", note: "Slight rise from 48%", color: "C04020" },
{ state: "Telangana", val: "30.6%", note: "Best improvement (-2.8%)", color: "4A9040" },
{ state: "Kerala", val: "~7.6%", note: "Lowest โ best post-crash care", color: "2A7060" },
];
severityData.forEach((d, i) => {
let y = 1.2 + i * 0.56;
s.addShape(pres.ShapeType.roundRect, { x: 5.1, y, w: 4.6, h: 0.5,
fill: { color: "1A2840" }, line: { color: d.color, width: 1.5 }, rectRadius: 0.06 });
s.addText(d.state, { x: 5.2, y: y + 0.04, w: 1.6, h: 0.25,
fontSize: 11.5, bold: true, color: WHITE, fontFace: "Calibri" });
s.addText(d.val, { x: 6.8, y: y + 0.02, w: 0.9, h: 0.3,
fontSize: 16, bold: true, color: d.color, fontFace: "Calibri", align: "center" });
s.addText(d.note, { x: 7.7, y: y + 0.08, w: 1.9, h: 0.3,
fontSize: 9.5, color: GRAY, fontFace: "Calibri", italic: true });
});
// Bottom note
s.addText("Golden Hour loss: 30-40% of deaths occur within 1 hour of crash (delayed trauma care) | Urban-rural enforcement gap persists", {
x: 0.3, y: 5.1, w: 9.4, h: 0.38,
fontSize: 10.5, color: GRAY, fontFace: "Calibri", italic: true
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 4 โ TRAUMA EPIDEMIOLOGY
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: "4A2010" } });
s.addText("TRAUMA EPIDEMIOLOGY โ GLOBAL CONTEXT", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
const items = [
{ icon: "๐", bold: "Leading cause of mortality globally.", rest: " Worldwide road traffic injuries are the #1 cause of death in ages 18-29." },
{ icon: "๐บ๐ธ", bold: "United States:", rest: " Trauma is the leading cause of death in young adults, accounting for 10% of all deaths among men and women." },
{ icon: "๐ฅ", bold: ">50 million patients/year", rest: " receive trauma-related care in the US alone; ~30% of all ICU admissions are trauma-related." },
{ icon: "โก", bold: "Hemorrhage is the #1 preventable cause of trauma death.", rest: " ~1/3 of traumatic deaths result from exsanguination; half result from CNS injury." },
{ icon: "โฑ๏ธ", bold: "Trauma center care:", rest: " Associated with significantly lower morbidity & mortality (10.4% vs 13.8%; RR 0.75)." },
{ icon: "๐ง ", bold: "Traumatic Brain Injury (TBI)", rest: " is the leading cause of trauma death; hemorrhage is second." },
{ icon: "๐", bold: "WHO 2030 SDG 3.6:", rest: " Halve global road deaths. India needs a 50% reduction โ current trajectory is far off-track." },
];
items.forEach((item, i) => {
let y = 0.8 + i * 0.63;
s.addText(item.icon, { x: 0.2, y, w: 0.5, h: 0.5, fontSize: 20, align: "center" });
s.addText([
{ text: item.bold, options: { bold: true, color: ACCENT2 } },
{ text: item.rest, options: { bold: false, color: LIGHT } }
], { x: 0.75, y: y + 0.06, w: 9, h: 0.48, fontSize: 13, fontFace: "Calibri" });
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 5 โ CLASSIFICATION OF HEMORRHAGE
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: ACCENT } });
s.addText("ATLS CLASSIFICATION OF HEMORRHAGE (11th Ed, 2025)", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
const classes = [
{ cls: "CLASS I", pct: "Up to 15%", hr: "Normal / minimally โ", sbp: "Normal", other: "No change in pulse pressure or RR", bg: "1E4A1E", border: "2A8A2A" },
{ cls: "CLASS II", pct: "15-30%", hr: "100-120 bpm โ", sbp: "Minimal change", other: "โ Pulse pressure, tachypnea (RR 20-24), cool/clammy skin", bg: "4A3A0A", border: "C8941A" },
{ cls: "CLASS III", pct: "30-40%", hr: "โฅ120 bpm (thready)", sbp: "< 90 mmHg", other: "Mental status changes, โ urine output, delayed capillary refill", bg: "4A1A0A", border: ACCENT },
{ cls: "CLASS IV", pct: "> 40%", hr: "> 120 bpm (marked)", sbp: "< 90 mmHg (hypotensive)", other: "Minimal/absent urine, cold/pale skin, narrow pulse pressure (โค25 mmHg)", bg: "6A1A1A", border: "FF2020" },
];
const colLabels = ["", "Blood Loss", "Heart Rate", "Blood Pressure", "Key Signs"];
const colX = [0.18, 1.3, 2.6, 4.0, 5.6];
const colW = [1.1, 1.28, 1.38, 1.58, 4.2];
// Header row
colLabels.forEach((label, ci) => {
s.addText(label, { x: colX[ci], y: 0.72, w: colW[ci], h: 0.32,
fontSize: 11, bold: true, color: ACCENT2, fontFace: "Calibri", align: "center" });
});
classes.forEach((c, i) => {
let y = 1.1 + i * 1.05;
// Row background
s.addShape(pres.ShapeType.roundRect, { x: 0.18, y, w: 9.64, h: 0.98,
fill: { color: c.bg }, line: { color: c.border, width: 1.5 }, rectRadius: 0.06 });
// Class label
s.addText(c.cls, { x: 0.22, y: y + 0.12, w: 1.0, h: 0.5,
fontSize: 14, bold: true, color: c.border, fontFace: "Calibri", align: "center" });
// Data cells
const cells = [c.pct, c.hr, c.sbp, c.other];
cells.forEach((cell, ci) => {
s.addText(cell, { x: colX[ci + 1], y: y + 0.1, w: colW[ci + 1], h: 0.75,
fontSize: 11.5, color: WHITE, fontFace: "Calibri", align: "center", valign: "middle", wrap: true });
});
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 6 โ INITIAL ASSESSMENT (ABCDE)
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = midSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: "1A3A6A" } });
s.addText("PRIMARY SURVEY โ ATLS ABCDE APPROACH", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
const steps = [
{ letter: "A", word: "AIRWAY", color: "E84B3C", desc: "Assess & protect airway โ C-spine stabilization. Video laryngoscopy preferred (90% vs 79% first-pass success). Cricothyrotomy kit at bedside for failed airway." },
{ letter: "B", word: "BREATHING", color: "F5A623", desc: "SpOโ >93%. Rule out tension pneumothorax (immediate needle decompression), massive hemothorax, cardiac tamponade. E-FAST is more sensitive than CXR for pneumothorax." },
{ letter: "C", word: "CIRCULATION", color: "4CAF50", desc: "2 large-bore (โฅ16G) IVs antecubital fossa. IO access if IV fails (93% success). Control external hemorrhage. FAST exam. Transfuse type O blood for severe shock." },
{ letter: "D", word: "DISABILITY", color: "2196F3", desc: "Glasgow Coma Scale (GCS), pupillary response, gross motor & sensory function. Spinal immobilization if C-spine injury possible. Avoid hypotension with TBI." },
{ letter: "E", word: "EXPOSURE", color: "9C27B0", desc: "Completely undress patient. Examine entire body including scalp, axillae, perineum, back. Prevent hypothermia โ heat room, warm fluids, warm blankets." },
];
steps.forEach((step, i) => {
let y = 0.75 + i * 0.96;
// Circle for letter
s.addShape(pres.ShapeType.ellipse, { x: 0.2, y: y + 0.12, w: 0.65, h: 0.65,
fill: { color: step.color }, line: { color: WHITE, width: 0.5 } });
s.addText(step.letter, { x: 0.2, y: y + 0.14, w: 0.65, h: 0.55,
fontSize: 22, bold: true, color: WHITE, align: "center", fontFace: "Calibri" });
// Word
s.addText(step.word, { x: 1.0, y: y + 0.08, w: 1.6, h: 0.35,
fontSize: 13, bold: true, color: step.color, fontFace: "Calibri" });
// Description
s.addText(step.desc, { x: 1.0, y: y + 0.4, w: 8.75, h: 0.48,
fontSize: 11.5, color: LIGHT, fontFace: "Calibri", wrap: true });
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 7 โ HEMORRHAGE CONTROL
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: ACCENT } });
s.addText("HEMORRHAGE CONTROL", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
// Two columns
// LEFT
s.addText("External Hemorrhage", { x: 0.3, y: 0.75, w: 4.5, h: 0.38,
fontSize: 15, bold: true, color: ACCENT2, fontFace: "Calibri" });
const extBullets = [
"Direct pressure โ primary & preferred method",
"Hemostatic-impregnated dressing + 3 min pressure",
"Tourniquet for amputations/severe extremity injury; record time",
"Junctional tourniquet for shoulder/groin wounds",
"Scalp: lidocaine+epinephrine injection, Raney clips, or running sutures",
"Wound packing with gauze or hemostatic agent",
];
s.addText(extBullets.map((b, i) => ({
text: b,
options: { bullet: { type: "bullet", code: "25CF", color: ACCENT }, color: LIGHT,
fontSize: 12, breakLine: true, paraSpaceAfter: 3 }
})), { x: 0.3, y: 1.15, w: 4.5, h: 3.0, fontFace: "Calibri" });
// RIGHT
s.addText("Non-Compressible Hemorrhage", { x: 5.2, y: 0.75, w: 4.5, h: 0.38,
fontSize: 15, bold: true, color: ACCENT2, fontFace: "Calibri" });
const intBullets = [
"Sites: chest, abdomen, retroperitoneum, pelvis, thigh (up to 1L)",
"FAST / E-FAST: identifies intraperitoneal & pericardial blood",
"Unstable pelvis: circumferential pelvic binder (open-book fractures)",
"REBOA (Resuscitative Endovascular Balloon Occlusion of Aorta): for massive pelvic/abdominal trauma",
"Haemodynamically stable โ CT scan for further workup",
"Unstable โ immediate OR or interventional radiology",
"Early trauma surgery consult is mandatory",
];
s.addText(intBullets.map((b, i) => ({
text: b,
options: { bullet: { type: "bullet", code: "25CF", color: "F5A623" }, color: LIGHT,
fontSize: 12, breakLine: true, paraSpaceAfter: 3 }
})), { x: 5.2, y: 1.15, w: 4.55, h: 3.0, fontFace: "Calibri" });
// Divider
s.addShape(pres.ShapeType.rect, { x: 4.97, y: 0.75, w: 0.06, h: 4.3, fill: { color: ACCENT } });
// Bottom bar
s.addShape(pres.ShapeType.rect, { x: 0, y: 4.95, w: 10, h: 0.65, fill: { color: "2A1A0A" } });
s.addText("โ Hypotension generally does not manifest until โฅ30% of blood volume is lost โ high index of suspicion required", {
x: 0.3, y: 5.0, w: 9.4, h: 0.5,
fontSize: 12, color: ACCENT2, bold: true, fontFace: "Calibri"
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 8 โ DAMAGE CONTROL RESUSCITATION
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = midSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: "1A3A6A" } });
s.addText("DAMAGE CONTROL RESUSCITATION (DCR)", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
const principles = [
{
num: "1", title: "Minimize IV Crystalloid",
desc: "Give only for hypotension (MAP <60-65 mmHg). Max 500 mL boluses. Limit to <1L total. Crystalloid >1.5L associated with 2ร increased mortality.",
color: "C04020"
},
{
num: "2", title: "Transfuse Early โ Balanced Ratio",
desc: "Whole blood or 1:1:1 ratio of PRBCs : FFP : Platelets. Activate Massive Transfusion Protocol (MTP) early. Type O blood available immediately.",
color: "C08020"
},
{
num: "3", title: "Tranexamic Acid (TXA) โ Within 3 Hours",
desc: "1g IV over 10 min โ 1g over 8 hours (or 2g single bolus). CRASH-2: โ all-cause mortality (14.5โ16%) and bleeding mortality. Benefit ONLY within 3 hours.",
color: "2060A0"
},
{
num: "4", title: "Permissive Hypotension",
desc: "Target SBP 70-90 mmHg (MAP 50-65) for penetrating trauma WITHOUT brain injury. For TBI/SCI: maintain MAP โฅ85 mmHg. European guidelines: SBP 80-90 mmHg.",
color: "206A30"
},
{
num: "5", title: "TEG / ROTEM Guided Treatment",
desc: "Thromboelastography provides faster & more accurate coagulopathy assessment. Guides clotting factor replacement. Reduces unnecessary transfusion.",
color: "602080"
},
];
principles.forEach((p, i) => {
let y = 0.8 + i * 0.94;
s.addShape(pres.ShapeType.ellipse, { x: 0.2, y: y + 0.1, w: 0.6, h: 0.6,
fill: { color: p.color }, line: { color: WHITE, width: 0.5 } });
s.addText(p.num, { x: 0.2, y: y + 0.1, w: 0.6, h: 0.6,
fontSize: 18, bold: true, color: WHITE, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(p.title, { x: 0.95, y: y + 0.06, w: 3.2, h: 0.35,
fontSize: 13.5, bold: true, color: ACCENT2, fontFace: "Calibri" });
s.addText(p.desc, { x: 0.95, y: y + 0.4, w: 8.8, h: 0.48,
fontSize: 11.5, color: LIGHT, fontFace: "Calibri", wrap: true });
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 9 โ MASSIVE TRANSFUSION PROTOCOL (ABC SCORE)
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: ACCENT } });
s.addText("MASSIVE TRANSFUSION PROTOCOL & ABC SCORE", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
// ABC Score box LEFT
s.addShape(pres.ShapeType.roundRect, { x: 0.2, y: 0.8, w: 4.6, h: 3.0,
fill: { color: "1E1A2E" }, line: { color: ACCENT2, width: 2 }, rectRadius: 0.1 });
s.addText("ABC SCORE (Assessment of Blood Consumption)", {
x: 0.4, y: 0.88, w: 4.2, h: 0.38,
fontSize: 13, bold: true, color: ACCENT2, fontFace: "Calibri"
});
const abcItems = [
"Penetrating mechanism of injury",
"Positive FAST exam (evidence of hemorrhage)",
"SBP โค 90 mmHg",
"Heart rate โฅ 120 bpm",
];
abcItems.forEach((item, i) => {
let y = 1.35 + i * 0.5;
s.addShape(pres.ShapeType.rect, { x: 0.4, y: y - 0.02, w: 0.36, h: 0.36,
fill: { color: ACCENT }, line: { color: ACCENT } });
s.addText(`+1`, { x: 0.4, y: y - 0.02, w: 0.36, h: 0.36,
fontSize: 12, bold: true, color: WHITE, align: "center", valign: "middle", fontFace: "Calibri" });
s.addText(item, { x: 0.82, y, w: 3.8, h: 0.35,
fontSize: 12.5, color: LIGHT, fontFace: "Calibri" });
});
s.addText("Score โฅ 2 โ Activate MTP\n(Sensitivity 75%, Specificity 86%)", {
x: 0.4, y: 3.5, w: 4.2, h: 0.6,
fontSize: 12.5, bold: true, color: "40FF80", fontFace: "Calibri"
});
// RIGHT โ Transfusion guide
s.addShape(pres.ShapeType.roundRect, { x: 5.2, y: 0.8, w: 4.6, h: 3.0,
fill: { color: "1E1A2E" }, line: { color: "4080C0", width: 2 }, rectRadius: 0.1 });
s.addText("TRANSFUSION GUIDE", {
x: 5.4, y: 0.88, w: 4.2, h: 0.38,
fontSize: 13, bold: true, color: ACCENT2, fontFace: "Calibri"
});
const transfItems = [
{ label: "Severe hemorrhage:", val: "Activate MTP immediately\n6 units PRBCs + 6 FFP + 6 plt (or 1 apheresis plt)" },
{ label: "Moderate hemorrhage:", val: "Same 1:1:1 ratio; transfuse as soon as need recognized" },
{ label: "Hb threshold (non-severe):", val: "< 7 g/dL (or <10 g/dL if ACS risk)" },
{ label: "Platelets:", val: "Transfuse if <50,000/ยตL" },
{ label: "FFP:", val: "If INR > 2" },
{ label: "Cryoprecipitate:", val: "If fibrinogen <150 mg/dL" },
];
transfItems.forEach((item, i) => {
let y = 1.3 + i * 0.52;
s.addText([
{ text: item.label + " ", options: { bold: true, color: ACCENT2 } },
{ text: item.val, options: { color: LIGHT } }
], { x: 5.4, y, w: 4.2, h: 0.5, fontSize: 11.5, fontFace: "Calibri", wrap: true });
});
// Bottom note
s.addText("Massive transfusion traditionally: โฅ10 units PRBCs/24 hrs | Modern definition: โฅ10 units/6 hrs", {
x: 0.3, y: 4.95, w: 9.4, h: 0.48,
fontSize: 11, color: GRAY, italic: true, fontFace: "Calibri"
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 10 โ SPECIAL SCENARIOS
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = midSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: "1A3A6A" } });
s.addText("SPECIAL CLINICAL SCENARIOS", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
const scenarios = [
{
title: "๐ง Spinal Cord Injury + Hemorrhage",
content: "Highest priority: control blood loss first. Target MAP โฅ85-90 mmHg (vs 60-65 for other trauma). Add norepinephrine if MAP not achieved after transfusion. Transfer with both blood products and norepinephrine.",
color: "4A1A7A"
},
{
title: "๐ด Older Adult Trauma",
content: "Beta-blockers may mask tachycardia. Baseline hypertension means 'normal' BP may actually be hypotensive. Many on oral anticoagulants โ reverse as appropriate. Decompensate more easily from excess IV fluid or blood loss.",
color: "1A3A5A"
},
{
title: "๐คฐ Pregnant Patient",
content: "Displace uterus to left (>20 wks) to improve cardiac output. Up to 20% blood volume loss before vital sign changes. Obtain obstetrics consult immediately. Continuous fetal heart rate monitoring. Give anti-D immunoglobulin if RhD-negative.",
color: "1A5A3A"
},
{
title: "๐ Anticoagulated Patient",
content: "Warfarin: Vitamin K + PCC (4-factor). Dabigatran: Idarucizumab. Factor Xa inhibitors (rivaroxaban/apixaban): Andexanet alfa or 4F-PCC. LMWH: Protamine sulfate. Avoid 4F-PCC empirically in MTP โ PROCOAG trial showed no mortality benefit, higher thromboembolism (35% vs 24%).",
color: "4A2A0A"
},
];
scenarios.forEach((sc, i) => {
let row = Math.floor(i / 2);
let col = i % 2;
let x = 0.2 + col * 4.9;
let y = 0.75 + row * 2.35;
s.addShape(pres.ShapeType.roundRect, { x, y, w: 4.6, h: 2.2,
fill: { color: sc.color }, line: { color: "AABBCC", width: 0.8 }, rectRadius: 0.1 });
s.addText(sc.title, { x: x + 0.15, y: y + 0.12, w: 4.3, h: 0.42,
fontSize: 13.5, bold: true, color: ACCENT2, fontFace: "Calibri" });
s.addText(sc.content, { x: x + 0.15, y: y + 0.56, w: 4.3, h: 1.58,
fontSize: 11, color: LIGHT, fontFace: "Calibri", wrap: true, lineSpacingMultiple: 1.2 });
});
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 11 โ INDIA: CAUSES & PREVENTION
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: "183060" } });
s.addText("INDIA ROAD ACCIDENTS โ CAUSES & WAY FORWARD", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 20, bold: true, color: WHITE, fontFace: "Calibri", margin: 0
});
// Left column: Causes
s.addText("Key Causes (MoRTH 2024)", {
x: 0.3, y: 0.75, w: 4.5, h: 0.38,
fontSize: 15, bold: true, color: ACCENT2, fontFace: "Calibri"
});
const causes = [
{ cause: "Over-speeding", pct: "70.3%" },
{ cause: "Drunk driving", pct: "~4%" },
{ cause: "Red light jumping", pct: "~2%" },
{ cause: "Wrong side driving", pct: "~3%" },
{ cause: "Distracted driving", pct: "~5%" },
{ cause: "Potholes / road defects", pct: "~1.6%" },
{ cause: "Night driving hazards", pct: "Significant" },
];
causes.forEach((c, i) => {
let y = 1.18 + i * 0.5;
// Bar
let barW = Math.min(3.5, (parseFloat(c.pct) / 70) * 3.5 || 0.6);
s.addShape(pres.ShapeType.rect, { x: 0.3, y: y + 0.1, w: barW, h: 0.25,
fill: { color: ACCENT }, line: { color: ACCENT } });
s.addText(`${c.cause} (${c.pct})`, { x: 0.3, y, w: 4.4, h: 0.42,
fontSize: 12, color: LIGHT, fontFace: "Calibri" });
});
// Divider
s.addShape(pres.ShapeType.rect, { x: 4.97, y: 0.75, w: 0.06, h: 4.7, fill: { color: "3060A0" } });
// Right column: Way forward
s.addText("Way Forward โ Key Interventions", {
x: 5.2, y: 0.75, w: 4.5, h: 0.38,
fontSize: 15, bold: true, color: ACCENT2, fontFace: "Calibri"
});
const interventions = [
"๐จ Enforce speed limits โ camera-based, automated penalties",
"๐ฅ Strengthen Golden Hour care: expand trauma centers on NH corridors",
"๐ Good Samaritan Law awareness to encourage bystander first aid",
"๐ก๏ธ Mandatory helmets, seatbelts โ increase conviction rate",
"๐ Crash data integration: close MoRTHโNCRB 14,600 deaths data gap",
"๐ฃ๏ธ Black-spot elimination on National Highways",
"๐ฑ Intelligent Traffic Management Systems in cities",
"๐ Road safety education in schools & for new drivers",
];
s.addText(interventions.map((b) => ({
text: b,
options: { bullet: false, color: LIGHT, fontSize: 12, breakLine: true, paraSpaceAfter: 4 }
})), { x: 5.2, y: 1.15, w: 4.55, h: 4.2, fontFace: "Calibri" });
}
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
// SLIDE 12 โ KEY TAKEAWAYS
// โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
{
let s = darkSlide(pres);
s.addShape(pres.ShapeType.rect, { x: 0, y: 0, w: 10, h: 0.65, fill: { color: ACCENT } });
s.addText("KEY TAKEAWAYS", {
x: 0.3, y: 0.1, w: 9.4, h: 0.45,
fontSize: 22, bold: true, color: WHITE, fontFace: "Calibri", margin: 0, charSpacing: 3
});
const takeaways = [
{ emoji: "๐ฉธ", text: "Hemorrhage is the #1 preventable cause of trauma death โ rapid control and early transfusion save lives." },
{ emoji: "โฑ๏ธ", text: "TXA must be given within 3 hours of injury (1g IV + 1g over 8h). After 3 hours, NO benefit." },
{ emoji: "๐", text: "Whole blood or 1:1:1 (PRBCs:FFP:Platelets) is the standard for massive hemorrhage resuscitation." },
{ emoji: "๐ซ", text: "Minimize crystalloid โ >1.5L crystalloid is associated with doubled mortality in trauma patients." },
{ emoji: "๐ฎ๐ณ", text: "India: 1.77 lakh deaths/year (2024), 485/day. #1 globally. 18-45 age group = 66% of all deaths." },
{ emoji: "๐๏ธ", text: "Over-speeding (70.3%) and two-wheelers (46.2%) dominate India's road death causes." },
{ emoji: "๐ฅ", text: "Only 2.1% of India's roads are National Highways, yet they account for 36.6% of road deaths." },
{ emoji: "๐ฏ", text: "India is far off-track for the WHO SDG 3.6 target of 50% reduction in road deaths by 2030." },
];
takeaways.forEach((t, i) => {
let y = 0.75 + i * 0.6;
s.addText(t.emoji, { x: 0.25, y, w: 0.5, h: 0.5, fontSize: 20, align: "center" });
s.addText(t.text, { x: 0.85, y: y + 0.06, w: 9.0, h: 0.48,
fontSize: 12.5, color: i < 4 ? LIGHT : ACCENT2, fontFace: "Calibri", wrap: true });
});
}
// โโโ WRITE FILE โโโ
const outputPath = "/home/daytona/workspace/trauma-ppt/Trauma_Management_India_Road_Accidents.pptx";
pres.writeFile({ fileName: outputPath })
.then(() => console.log(`โ
Saved: ${outputPath}`))
.catch(err => { console.error("Error:", err); process.exit(1); });
cd /home/daytona/workspace/trauma-ppt && node create_ppt.js
ls -lh /home/daytona/workspace/trauma-ppt/Trauma_Management_India_Road_Accidents.pptx
Trauma Management India Road Accidents
Presentation ยท PPTX
| Slide | Content |
|---|---|
| 1 | Title slide |
| 2 | ๐ฎ๐ณ India Road Accident Crisis 2024 โ 4 stat boxes + 7 key bullets |
| 3 | State-wise data table + Severity Index (UP worst, Kerala best) |
| 4 | Global Trauma Epidemiology |
| 5 | ATLS Hemorrhage Classification โ Classes IโIV (color-coded) |
| 6 | Primary Survey โ ABCDE approach |
| 7 | Hemorrhage Control (external + non-compressible) |
| 8 | Damage Control Resuscitation โ 5 key principles |
| 9 | Massive Transfusion Protocol + ABC Score |
| 10 | Special Scenarios (SCI, elderly, pregnant, anticoagulated patients) |
| 11 | India Causes + Way Forward / Prevention |
| 12 | Key Takeaways |
Create 40-45 slides with international level
Create 40-45 slides in international level
With pictures and themes
node /home/daytona/skills/shared/scripts/fetch_images.js \ "https://images.unsplash.com/photo-1504439468489-c8920d796a29?w=800&q=80" \ "https://images.unsplash.com/photo-1559757148-5c350d0d3c56?w=800&q=80" \ "https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=800&q=80" \ "https://images.unsplash.com/photo-1530026405186-ed1f139313f8?w=800&q=80" \ "https://images.unsplash.com/photo-1612349317150-e413f6a5b16d?w=800&q=80" \ "https://images.unsplash.com/photo-1587745416684-47953f16f02f?w=800&q=80" \ "https://images.unsplash.com/photo-1544820580-9d9d1b3e2c07?w=600&q=80" \ "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=800&q=80" \ 2>/dev/null | python3 -c " import sys, json data = json.load(sys.stdin) for i,d in enumerate(data): ok = 'OK' if (d.get('base64') and not d.get('error')) else 'FAIL' print(f'{i}: {ok} - {d[\"url\"][:60]}') "
# Try fetching images with curl and save locally mkdir -p /home/daytona/workspace/trauma-ppt/imgs cd /home/daytona/workspace/trauma-ppt/imgs # Download a few images quickly curl -s --max-time 10 "https://images.unsplash.com/photo-1504439468489-c8920d796a29?w=600&q=70" -o ambulance.jpg & curl -s --max-time 10 "https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=600&q=70" -o hospital.jpg & curl -s --max-time 10 "https://images.unsplash.com/photo-1530026405186-ed1f139313f8?w=600&q=70" -o surgery.jpg & curl -s --max-time 10 "https://images.unsplash.com/photo-1612349317150-e413f6a5b16d?w=600&q=70" -o doctor.jpg & curl -s --max-time 10 "https://images.unsplash.com/photo-1559757148-5c350d0d3c56?w=600&q=70" -o blood.jpg & curl -s --max-time 10 "https://images.unsplash.com/photo-1544820580-9d9d1b3e2c07?w=600&q=70" -o india_road.jpg & curl -s --max-time 10 "https://images.unsplash.com/photo-1558618666-fcd25c85cd64?w=600&q=70" -o road_accident.jpg & wait ls -lh /home/daytona/workspace/trauma-ppt/imgs/
# Generate rich SVG-based images locally using Python (no network needed) mkdir -p /home/daytona/workspace/trauma-ppt/imgs python3 << 'PYEOF' import base64, os def save_svg_as_png(svg_content, filename): """Save SVG as base64 PNG using cairosvg if available, otherwise save as SVG""" path = f"/home/daytona/workspace/trauma-ppt/imgs/{filename}" try: import cairosvg png_data = cairosvg.svg2png(bytestring=svg_content.encode(), output_width=800, output_height=450) with open(path.replace('.svg','.png'), 'wb') as f: f.write(png_data) print(f"PNG: {path.replace('.svg','.png')}") return path.replace('.svg','.png') except: with open(path, 'w') as f: f.write(svg_content) print(f"SVG: {path}") return path # Check what image tools are available import subprocess result = subprocess.run(['python3', '-c', 'import cairosvg; print("cairosvg OK")'], capture_output=True, text=True) print(result.stdout.strip() or "cairosvg not available") result2 = subprocess.run(['python3', '-c', 'from PIL import Image; print("PIL OK")'], capture_output=True, text=True) print(result2.stdout.strip() or "PIL not available") result3 = subprocess.run(['which', 'convert'], capture_output=True, text=True) print(f"ImageMagick: {result3.stdout.strip() or 'not found'}") PYEOF
python3 << 'PYEOF' from PIL import Image, ImageDraw, ImageFont import os, math OUT = "/home/daytona/workspace/trauma-ppt/imgs" os.makedirs(OUT, exist_ok=True) def make_gradient_img(filename, w, h, color1, color2, direction="horizontal"): img = Image.new("RGB", (w, h)) draw = ImageDraw.Draw(img) r1,g1,b1 = color1; r2,g2,b2 = color2 for i in range(w if direction=="horizontal" else h): t = i / (w-1 if direction=="horizontal" else h-1) r = int(r1 + (r2-r1)*t); g = int(g1 + (g2-g1)*t); b = int(b1 + (b2-b1)*t) if direction=="horizontal": draw.line([(i,0),(i,h)], fill=(r,g,b)) else: draw.line([(0,i),(w,i)], fill=(r,g,b)) img.save(f"{OUT}/{filename}") print(f"Created {filename}") def make_circle_icon(filename, size, bg_color, icon_color, symbol): img = Image.new("RGBA", (size, size), (0,0,0,0)) draw = ImageDraw.Draw(img) draw.ellipse([2,2,size-2,size-2], fill=bg_color) try: font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", int(size*0.45)) except: font = ImageFont.load_default() bbox = draw.textbbox((0,0), symbol, font=font) tw, th = bbox[2]-bbox[0], bbox[3]-bbox[1] draw.text(((size-tw)//2, (size-th)//2 - 4), symbol, fill=icon_color, font=font) img.save(f"{OUT}/{filename}") print(f"Created {filename}") def make_stat_panel(filename, w, h, bg_color, stats, title=""): img = Image.new("RGB", (w, h), bg_color) draw = ImageDraw.Draw(img) # border draw.rectangle([0,0,w-1,h-1], outline=(232,75,60), width=3) try: font_big = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 48) font_med = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 24) font_sm = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 18) except: font_big = font_med = font_sm = ImageFont.load_default() # title if title: draw.text((20,15), title, fill=(245,166,35), font=font_med) # divider draw.line([(0,55),(w,55)], fill=(232,75,60), width=2) # stats grid per_row = min(4, len(stats)) cell_w = w // per_row for i, (val, label) in enumerate(stats): cx = (i % per_row) * cell_w + cell_w//2 row = i // per_row cy = 90 + row * 90 bbox = draw.textbbox((0,0), val, font=font_big) tw = bbox[2]-bbox[0] draw.text((cx - tw//2, cy), val, fill=(255,255,255), font=font_big) bbox2 = draw.textbbox((0,0), label, font=font_sm) tw2 = bbox2[2]-bbox2[0] draw.text((cx - tw2//2, cy + 55), label, fill=(200,210,230), font=font_sm) img.save(f"{OUT}/{filename}") print(f"Created {filename}") def make_bar_chart(filename, w, h, bg, bars, title=""): img = Image.new("RGB", (w, h), bg) draw = ImageDraw.Draw(img) draw.rectangle([0,0,w-1,h-1], outline=(36,48,88), width=2) try: font_t = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 22) font_l = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 16) font_v = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 18) except: font_t = font_l = font_v = ImageFont.load_default() if title: draw.text((20, 10), title, fill=(245,166,35), font=font_t) max_val = max(v for _,v,_ in bars) if bars else 1 bar_area_h = h - 80 bar_area_y = 45 bw = (w - 40) // len(bars) - 8 for i, (label, val, color) in enumerate(bars): bh = int((val / max_val) * bar_area_h * 0.85) bx = 20 + i * ((w-40)//len(bars)) by = bar_area_y + bar_area_h - bh draw.rectangle([bx, by, bx+bw, bar_area_y+bar_area_h-1], fill=color) # value vstr = str(val) bbox = draw.textbbox((0,0), vstr, font=font_v) tw = bbox[2]-bbox[0] draw.text((bx + bw//2 - tw//2, by - 22), vstr, fill=(255,255,255), font=font_v) # label for j, part in enumerate(label.split("\n")): bbox2 = draw.textbbox((0,0), part, font=font_l) tw2 = bbox2[2]-bbox2[0] draw.text((bx + bw//2 - tw2//2, bar_area_y+bar_area_h+3+j*17), part, fill=(180,200,230), font=font_l) img.save(f"{OUT}/{filename}") print(f"Created {filename}") def make_infographic(filename, w, h, bg, items, title=""): img = Image.new("RGB", (w, h), bg) draw = ImageDraw.Draw(img) try: font_t = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 26) font_h = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 20) font_b = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 15) except: font_t = font_h = font_b = ImageFont.load_default() # Header bar draw.rectangle([0,0,w,50], fill=(232,75,60)) if title: draw.text((20, 12), title, fill=(255,255,255), font=font_t) # Items as horizontal bands band_h = (h-50) // len(items) colors = [(30,50,90),(26,42,78),(22,35,66),(28,48,84),(24,40,72),(20,36,62),(32,52,96)] for i, (icon, heading, body) in enumerate(items): by = 50 + i * band_h draw.rectangle([0,by,w,by+band_h], fill=colors[i%len(colors)]) draw.line([(0,by+band_h-1),(w,by+band_h-1)], fill=(50,70,120), width=1) # icon circle draw.ellipse([12, by+8, 48, by+band_h-8], fill=(232,75,60)) bbox = draw.textbbox((0,0), icon, font=font_h) tw = bbox[2]-bbox[0]; th = bbox[3]-bbox[1] draw.text((30-tw//2, by+band_h//2-th//2), icon, fill=(255,255,255), font=font_h) draw.text((60, by+8), heading, fill=(245,166,35), font=font_h) draw.text((60, by+32), body, fill=(200,215,240), font=font_b) img.save(f"{OUT}/{filename}") print(f"Created {filename}") # --- CREATE ALL IMAGES --- # 1. Title background gradient make_gradient_img("title_bg.png", 1000, 562, (10,18,40), (30,50,100), "horizontal") # 2. India stats panel make_stat_panel("india_stats.png", 800, 200, (20,28,60), [("1.77L", "Deaths (2024)"), ("4.80L", "Accidents"), ("485", "Deaths/Day"), ("+2.3%", "vs 2023")], title="INDIA ROAD ACCIDENTS 2024") # 3. Bar chart: deaths by vehicle type make_bar_chart("vehicle_deaths.png", 700, 350, (15,22,48), [("Two\nWheelers","46.2",(220,50,50)), ("Pedestrians","20.6",(200,120,30)), ("Cars/Taxis","15.2",(50,120,200)), ("Trucks","8.1",(80,160,80)), ("Buses","3.5",(150,80,200)), ("Others","6.4",(100,160,180))], title="Deaths by Vehicle Type (%) โ India 2024") # 4. Bar chart: state severity make_bar_chart("state_severity.png", 700, 320, (15,22,48), [("U.P.","52.4",(220,40,40)), ("Gujarat","49.5",(200,80,20)), ("Rajasthan","47.5",(190,100,10)), ("MP","44.2",(160,120,20)), ("Karnataka","35.1",(100,140,60)), ("Telangana","30.6",(60,160,80)), ("Kerala","7.6",(30,180,120))], title="Accident Severity (Deaths per 100 Accidents)") # 5. Hemorrhage classes infographic make_infographic("hemorrhage_classes.png", 800, 400, (15,22,48), [("I", "CLASS I (โค15% loss)", "HR normal, BP normal, minimal signs"), ("II", "CLASS II (15-30%)", "HR 100-120, tachypnea, โ pulse pressure"), ("III","CLASS III (30-40%)", "Hypotension, HRโฅ120, altered mental status"), ("IV", "CLASS IV (>40%)", "Marked hypotension, minimal urine, cold skin")], title="ATLS Hemorrhage Classification") # 6. ABCDE infographic make_infographic("abcde.png", 800, 450, (18,28,60), [("A","AIRWAY","Assess & protect โ C-spine stabilization, video laryngoscopy"), ("B","BREATHING","SpOโ >93% โ rule out tension pneumothorax, hemothorax"), ("C","CIRCULATION","2 large-bore IVs โ hemorrhage control โ FAST exam"), ("D","DISABILITY","GCS, pupils, motor/sensory โ avoid hypotension with TBI"), ("E","EXPOSURE","Full body exam โ prevent hypothermia โ warm fluids")], title="PRIMARY SURVEY โ ATLS ABCDE") # 7. TXA timeline graphic make_infographic("txa_timeline.png", 800, 300, (18,24,55), [("0-1h","BEST: TXA within 1 hour","STAAMP: 30-day mortality 4.6% vs 7.6% (p<0.05)"), ("1-3h","EFFECTIVE: TXA 1-3 hours","CRASH-2: all-cause mortality 14.5% vs 16%"), (">3h","NO BENEFIT: after 3 hours","PATCH: benefit only if given within 90 min")], title="TRANEXAMIC ACID โ TIME IS CRITICAL") # 8. Resuscitation goals make_infographic("resus_goals.png", 800, 350, (18,24,55), [("BP","Blood Pressure Target","MAP 60-65 (penetrating) | MAP โฅ85 (TBI/SCI/blunt)"), ("HR","Heart Rate Goal","60-100 bpm โ consider patient baseline"), ("O2","Oxygen Saturation",">94% โ restrict supplemental O2 once stable"), ("U/O","Urine Output",">0.5 mL/kg/hr โ indicator of end-organ perfusion"), ("Lac","Serum Lactate","Target <2 mmol/L โ monitor every 4 hours")], title="RESUSCITATION GOALS (Prolonged Management)") # 9. Global comparison bar chart make_bar_chart("global_compare.png", 700, 320, (12,18,45), [("India","177000",(232,75,60)), ("China","62000",(200,50,50)), ("USA","43000",(50,100,200)), ("Brazil","33000",(80,160,40)), ("Russia","16000",(150,80,200)), ("UK","1633",(40,140,200))], title="Annual Road Deaths โ Global Comparison (2024)") # 10. NH deaths infographic make_infographic("nh_deaths.png", 800, 260, (12,20,48), [("2.1%","National Highways = 2.1% of India road network","Yet responsible for 36.6% of all road accident deaths"), ("36.6%","Fatality concentration on NHs","Speeding + poor lighting + truck traffic = lethal combination")], title="NATIONAL HIGHWAY PARADOX โ INDIA") print("\nAll images created successfully!") PYEOF
python3 << 'PYEOF' from PIL import Image, ImageDraw, ImageFont import os OUT = "/home/daytona/workspace/trauma-ppt/imgs" os.makedirs(OUT, exist_ok=True) def get_fonts(): try: fb = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 22) fn = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 16) ft = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 26) fv = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 18) return ft, fb, fn, fv except: d = ImageFont.load_default() return d,d,d,d def make_bar_chart(filename, w, h, bg, bars, title=""): # bars = list of (label, float_val, color_tuple) img = Image.new("RGB", (w, h), bg) draw = ImageDraw.Draw(img) ft, fb, fn, fv = get_fonts() draw.rectangle([0,0,w-1,h-1], outline=(36,48,88), width=2) if title: draw.text((15, 8), title, fill=(245,166,35), font=ft) max_val = max(v for _,v,_ in bars) margin_left, margin_right, margin_top, margin_bottom = 10, 10, 50, 45 chart_w = w - margin_left - margin_right chart_h = h - margin_top - margin_bottom n = len(bars) slot_w = chart_w // n bw = int(slot_w * 0.7) for i, (label, val, color) in enumerate(bars): bh = int((val / max_val) * chart_h * 0.88) bx = margin_left + i * slot_w + (slot_w - bw)//2 by = margin_top + chart_h - bh draw.rectangle([bx, by, bx+bw, margin_top+chart_h], fill=color) # value label vstr = f"{val:.1f}%" bbox = draw.textbbox((0,0), vstr, font=fv) tw = bbox[2]-bbox[0] draw.text((bx + bw//2 - tw//2, by - 22), vstr, fill=(255,255,255), font=fv) # x axis label for j, part in enumerate(label.split("\n")): bbox2 = draw.textbbox((0,0), part, font=fn) tw2 = bbox2[2]-bbox2[0] draw.text((bx + bw//2 - tw2//2, margin_top+chart_h+4+j*16), part, fill=(180,200,230), font=fn) img.save(f"{OUT}/{filename}") print(f"OK: {filename}") def make_infographic(filename, w, h, bg, items, title=""): img = Image.new("RGB", (w, h), bg) draw = ImageDraw.Draw(img) ft, fb, fn, fv = get_fonts() draw.rectangle([0,0,w,50], fill=(232,75,60)) if title: draw.text((15, 12), title, fill=(255,255,255), font=ft) band_h = (h-52) // len(items) colors = [(30,50,90),(26,42,78),(22,35,66),(28,48,84),(24,40,72),(20,36,62),(32,52,96),(18,30,60)] for i, (icon, heading, body) in enumerate(items): by = 52 + i * band_h draw.rectangle([0,by,w,by+band_h-1], fill=colors[i%len(colors)]) draw.line([(0,by+band_h-1),(w,by+band_h-1)], fill=(50,70,120), width=1) draw.ellipse([10, by+6, 44, by+band_h-6], fill=(232,75,60)) bbox = draw.textbbox((0,0), icon, font=fb) tw,th = bbox[2]-bbox[0], bbox[3]-bbox[1] draw.text((27-tw//2, by+band_h//2-th//2), icon, fill=(255,255,255), font=fb) draw.text((54, by+6), heading, fill=(245,166,35), font=fb) draw.text((54, by+30), body, fill=(200,215,240), font=fn) img.save(f"{OUT}/{filename}") print(f"OK: {filename}") def make_gradient_img(filename, w, h, c1, c2): img = Image.new("RGB", (w, h)) draw = ImageDraw.Draw(img) r1,g1,b1=c1; r2,g2,b2=c2 for i in range(w): t = i/(w-1) r=int(r1+(r2-r1)*t); g=int(g1+(g2-g1)*t); b=int(b1+(b2-b1)*t) draw.line([(i,0),(i,h)], fill=(r,g,b)) img.save(f"{OUT}/{filename}") print(f"OK: {filename}") def make_global_bar(filename, w, h, bg, bars, title=""): # bars = (label, int_val, color) img = Image.new("RGB", (w, h), bg) draw = ImageDraw.Draw(img) ft, fb, fn, fv = get_fonts() draw.rectangle([0,0,w-1,h-1], outline=(36,48,88), width=2) if title: draw.text((15, 8), title, fill=(245,166,35), font=ft) max_val = max(v for _,v,_ in bars) ml, mr, mt, mb = 90, 20, 50, 20 bar_area_w = w - ml - mr n = len(bars) slot_h = (h - mt - mb) // n bh = int(slot_h * 0.65) for i, (label, val, color) in enumerate(bars): bw = int((val / max_val) * bar_area_w * 0.9) by = mt + i * slot_h + (slot_h - bh)//2 draw.rectangle([ml, by, ml+bw, by+bh], fill=color) # label left bbox = draw.textbbox((0,0), label, font=fn) tw,th = bbox[2]-bbox[0], bbox[3]-bbox[1] draw.text((ml - tw - 5, by + bh//2 - th//2), label, fill=(200,215,240), font=fn) # value right vstr = f"{val:,}" draw.text((ml+bw+5, by + bh//2 - 8), vstr, fill=(255,255,255), font=fv) img.save(f"{OUT}/{filename}") print(f"OK: {filename}") # --- GENERATE ALL IMAGES --- make_gradient_img("title_bg.png", 1000, 562, (8,14,38), (28,48,100)) make_bar_chart("vehicle_deaths.png", 700, 320, (15,22,48), [("Two\nWheelers",46.2,(220,50,50)), ("Pedestrians",20.6,(200,120,30)), ("Cars",15.2,(50,120,200)), ("Trucks",8.1,(80,160,80)), ("Buses",3.5,(150,80,200)), ("Others",6.4,(100,160,180))], title="Deaths by Vehicle Type (%) โ India 2024") make_bar_chart("state_severity.png", 700, 320, (15,22,48), [("U.P.",52.4,(220,40,40)), ("Gujarat",49.5,(200,80,20)), ("Rajasthan",47.5,(190,100,10)), ("M.P.",44.2,(160,120,20)), ("Karnataka",35.1,(100,140,60)), ("Telangana",30.6,(60,160,80)), ("Kerala",7.6,(30,180,120))], title="Accident Severity (Deaths per 100 Accidents) โ States") make_infographic("hemorrhage_classes.png", 800, 380, (15,22,48), [("I","CLASS I (up to 15% blood loss)","HR normal/minimally raised, BP normal, no resp changes"), ("II","CLASS II (15-30% blood loss)","HR 100-120, tachypnea RR 20-24, decreased pulse pressure"), ("III","CLASS III (30-40% blood loss)","Hypotension SBP<90, HR>=120 thready, altered mental status"), ("IV","CLASS IV (>40% blood loss)","Marked hypotension, HR>120, minimal urine, cold pale skin")], title="ATLS HEMORRHAGE CLASSIFICATION (11th Ed, 2025)") make_infographic("abcde.png", 800, 420, (18,28,60), [("A","AIRWAY โ Assess & Protect","C-spine stabilization; video laryngoscopy (90% first-pass); cric kit ready"), ("B","BREATHING โ Oxygenation","Maintain SpO2 >93%; decompress tension pneumothorax; E-FAST"), ("C","CIRCULATION โ Hemorrhage Control","2x large-bore IVs; FAST exam; type O blood for severe shock"), ("D","DISABILITY โ Neuro Assessment","GCS, pupils, motor/sensory; prevent hypotension with TBI"), ("E","EXPOSURE โ Full Body Exam","Undress completely; prevent hypothermia; warm fluids/blankets")], title="PRIMARY SURVEY โ ATLS ABCDE APPROACH") make_infographic("txa_timeline.png", 800, 280, (18,24,55), [("0-1h","OPTIMAL: TXA within 1 hour","STAAMP: 30-day mortality 4.6% vs 7.6% (p<0.05); severe shock benefit -17%"), ("1-3h","EFFECTIVE: TXA 1-3 hours","CRASH-2 (20,211 pts): all-cause mortality 14.5% vs 16%, RR 0.91"), (">3h","NO BENEFIT: after 3 hours","PATCH trial: benefit only within 90 min; may cause harm after 3h")], title="TRANEXAMIC ACID โ TIMING IS EVERYTHING") make_infographic("resus_goals.png", 800, 340, (18,24,55), [("BP","Blood Pressure","MAP 60-65 mmHg (penetrating) | MAP >=85 mmHg (TBI/SCI/blunt)"), ("HR","Heart Rate","Goal 60-100 bpm; note beta-blocker interference in elderly"), ("O2","Oxygen Saturation","Maintain >94%; wean supplemental O2 when stable"), ("U/O","Urine Output","Target >0.5 mL/kg/hr as perfusion indicator"), ("Lac","Serum Lactate","Target <2 mmol/L; monitor q4h; base deficit as surrogate")], title="RESUSCITATION MONITORING GOALS") make_global_bar("global_compare.png", 700, 340, (12,18,45), [("India",177000,(232,75,60)), ("China",62000,(200,80,40)), ("USA",43000,(50,100,200)), ("Brazil",33000,(80,160,40)), ("Russia",16000,(150,80,200)), ("Thailand",14000,(200,160,30)), ("UK",1633,(40,140,200))], title="Annual Road Deaths โ Global Comparison (2024)") make_infographic("nh_paradox.png", 800, 240, (12,20,48), [("2.1%","National Highways = only 2.1% of India's road network","Urban + suburban highway corridors"), ("36.6%","Yet account for 36.6% of ALL road accident deaths","High-speed + trucks + poor lighting + fatigue = lethal mix")], title="THE NATIONAL HIGHWAY PARADOX โ INDIA") make_infographic("dcr_principles.png", 800, 420, (15,22,50), [("1","Minimize IV Crystalloid","<1L; 500 mL boluses; >1.5L associated with 2x mortality"), ("2","Early Balanced Transfusion","1:1:1 ratio PRBCs:FFP:Platelets; whole blood preferred"), ("3","Tranexamic Acid <3 Hours","1g IV over 10 min + 1g over 8h; or 2g single bolus"), ("4","Permissive Hypotension","SBP 70-90 (no TBI/SCI); MAP >=85 for TBI/SCI patients"), ("5","TEG/ROTEM Guided Care","Point-of-care coagulation testing guides factor replacement")], title="DAMAGE CONTROL RESUSCITATION โ 5 CORE PRINCIPLES") make_infographic("special_scenarios.png", 800, 380, (18,26,55), [("SCI","Spinal Cord Injury + Hemorrhage","Blood products FIRST; add norepinephrine if MAP<85 after transfusion"), ("TBI","Traumatic Brain Injury","Single episode hypotension doubles mortality; target MAP>85 mmHg"), ("OAC","Anticoagulated Patient","Warfarin->4F-PCC+VitK; Dabigatran->Idarucizumab; Apixaban->Andexanet"), ("ELD","Elderly Trauma","Beta-blockers mask shock; anticoagulants increase hemorrhage risk"), ("OB","Pregnant Patient","Left uterine displacement; fetal monitoring; anti-D immunoglobulin")], title="SPECIAL CLINICAL SCENARIOS") print("\nAll images created!") import os for f in os.listdir(OUT): size = os.path.getsize(f"{OUT}/{f}") print(f" {f}: {size//1024}KB") PYEOF
I have not recieved ppt yet.
Hey
ls /home/daytona/workspace/trauma-ppt/imgs/ 2>/dev/null | head -20 && echo "---" && ls /home/daytona/workspace/trauma-ppt/ 2>/dev/null