Create me pdf of disaster management based on tintinalli , include out hospital management field triage, in hospital triage and management in tertiary centre referral criteria
mkdir -p /tmp/workspace/disaster-management && ls /tmp/workspace/
~/disaster-management/generate_pdf.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import cm, mm
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY
from reportlab.platypus import ListFlowable, ListItem
OUTPUT = "/tmp/workspace/disaster-management/Disaster_Management_Tintinalli.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
leftMargin=2*cm, rightMargin=2*cm,
topMargin=2.5*cm, bottomMargin=2.5*cm,
title="Disaster Management - Tintinalli's Emergency Medicine",
author="Tintinalli's Emergency Medicine: A Comprehensive Study Guide"
)
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
'CustomTitle', parent=styles['Title'],
fontSize=22, textColor=colors.HexColor('#1a3a5c'),
spaceAfter=6, spaceBefore=4, alignment=TA_CENTER,
fontName='Helvetica-Bold'
)
subtitle_style = ParagraphStyle(
'Subtitle', parent=styles['Normal'],
fontSize=11, textColor=colors.HexColor('#4a6fa5'),
spaceAfter=20, spaceBefore=4, alignment=TA_CENTER,
fontName='Helvetica-Oblique'
)
h1_style = ParagraphStyle(
'H1', parent=styles['Heading1'],
fontSize=15, textColor=colors.white,
spaceAfter=8, spaceBefore=14,
fontName='Helvetica-Bold',
backColor=colors.HexColor('#1a3a5c'),
leftIndent=-0.5*cm, rightIndent=-0.5*cm,
borderPad=6
)
h2_style = ParagraphStyle(
'H2', parent=styles['Heading2'],
fontSize=13, textColor=colors.HexColor('#1a3a5c'),
spaceAfter=6, spaceBefore=12,
fontName='Helvetica-Bold',
borderPad=4,
borderColor=colors.HexColor('#4a6fa5'),
borderWidth=0,
leftIndent=0
)
h3_style = ParagraphStyle(
'H3', parent=styles['Heading3'],
fontSize=11, textColor=colors.HexColor('#2c6fad'),
spaceAfter=4, spaceBefore=8,
fontName='Helvetica-Bold',
)
body_style = ParagraphStyle(
'Body', parent=styles['Normal'],
fontSize=10, textColor=colors.HexColor('#222222'),
spaceAfter=6, spaceBefore=2,
leading=15, alignment=TA_JUSTIFY,
fontName='Helvetica'
)
bullet_style = ParagraphStyle(
'Bullet', parent=body_style,
leftIndent=18, bulletIndent=6, spaceBefore=2, spaceAfter=2
)
note_style = ParagraphStyle(
'Note', parent=body_style,
backColor=colors.HexColor('#eef4fb'),
borderColor=colors.HexColor('#4a6fa5'),
borderWidth=1,
borderPad=8,
leftIndent=8, rightIndent=8,
textColor=colors.HexColor('#1a3a5c'),
fontName='Helvetica-Oblique'
)
warn_style = ParagraphStyle(
'Warn', parent=body_style,
backColor=colors.HexColor('#fff3cd'),
borderColor=colors.HexColor('#ffc107'),
borderWidth=1,
borderPad=8,
leftIndent=8, rightIndent=8,
textColor=colors.HexColor('#333')
)
ref_style = ParagraphStyle(
'Ref', parent=styles['Normal'],
fontSize=8.5, textColor=colors.HexColor('#555'),
spaceAfter=2, spaceBefore=1,
fontName='Helvetica-Oblique'
)
def make_table(headers, rows, col_widths=None):
data = [headers] + rows
if col_widths is None:
col_widths = [doc.width / len(headers)] * len(headers)
t = Table(data, colWidths=col_widths, repeatRows=1)
style = TableStyle([
('BACKGROUND', (0,0), (-1,0), colors.HexColor('#1a3a5c')),
('TEXTCOLOR', (0,0), (-1,0), colors.white),
('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
('FONTSIZE', (0,0), (-1,0), 9.5),
('ALIGN', (0,0), (-1,0), 'CENTER'),
('BOTTOMPADDING', (0,0), (-1,0), 7),
('TOPPADDING', (0,0), (-1,0), 7),
('FONTNAME', (0,1), (-1,-1), 'Helvetica'),
('FONTSIZE', (0,1), (-1,-1), 9),
('ROWBACKGROUNDS', (0,1), (-1,-1), [colors.HexColor('#f4f8fc'), colors.white]),
('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#c0cfe0')),
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,1), (-1,-1), 5),
('BOTTOMPADDING', (0,1), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 6),
('RIGHTPADDING', (0,0), (-1,-1), 6),
])
t.setStyle(style)
return t
def section_header(text, style=h1_style):
return [
Spacer(1, 8),
Paragraph(f" {text}", style),
Spacer(1, 4)
]
story = []
# ─── COVER PAGE ───────────────────────────────────────────────────────────────
story.append(Spacer(1, 2.5*cm))
story.append(HRFlowable(width="100%", thickness=3, color=colors.HexColor('#1a3a5c')))
story.append(Spacer(1, 0.4*cm))
story.append(Paragraph("DISASTER MANAGEMENT", title_style))
story.append(Spacer(1, 0.2*cm))
story.append(Paragraph("Based on Tintinalli's Emergency Medicine: A Comprehensive Study Guide", subtitle_style))
story.append(Spacer(1, 0.3*cm))
story.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor('#4a6fa5')))
story.append(Spacer(1, 1*cm))
cover_content = [
("Chapters Covered:", "Chapter 5 – Disaster Preparedness\nChapter 302 – Mass Casualty Triage"),
("Topics:", "• Disaster Definition & Classification\n• Disaster Preparedness & Planning\n• Out-of-Hospital Management\n• Field Triage (START / SALT)\n• In-Hospital Triage & Management\n• Management in Tertiary Centre\n• Referral Criteria\n• Incident Command System"),
("Source:", "Tintinalli's Emergency Medicine: A Comprehensive Study Guide (9th Ed.)"),
("Date:", "July 2026"),
]
cover_table_data = [[Paragraph(f"<b>{k}</b>", body_style), Paragraph(v, body_style)] for k,v in cover_content]
cover_tbl = Table(cover_table_data, colWidths=[4*cm, 12.5*cm])
cover_tbl.setStyle(TableStyle([
('VALIGN', (0,0), (-1,-1), 'TOP'),
('TOPPADDING', (0,0), (-1,-1), 6),
('BOTTOMPADDING', (0,0), (-1,-1), 6),
('GRID', (0,0), (-1,-1), 0.3, colors.HexColor('#c0cfe0')),
('BACKGROUND', (0,0), (0,-1), colors.HexColor('#eef4fb')),
]))
story.append(cover_tbl)
story.append(Spacer(1, 2*cm))
story.append(HRFlowable(width="100%", thickness=2, color=colors.HexColor('#1a3a5c')))
story.append(PageBreak())
# ─── SECTION 1: INTRODUCTION & DEFINITIONS ────────────────────────────────────
story += section_header("1. INTRODUCTION & DISASTER DEFINITIONS")
story.append(Paragraph("Introduction", h2_style))
story.append(Paragraph(
"Disasters have claimed millions of lives and cost billions of dollars worldwide in recent decades. "
"Examples include the terrorist attacks of September 11, 2001; the 2004 Pacific Ocean tsunami; the 2010 earthquake in Haiti; "
"the 2011 earthquake and tsunami in Japan; the 2015 earthquake in Nepal; and Superstorm Sandy of 2012. "
"Emergency physicians frequently have extensive responsibilities for community and hospital-level disaster preparedness and response, "
"covering smaller-scale disasters (active shooters, explosions, building fires, transportation accidents) as well as mass casualty events.",
body_style))
story.append(Paragraph("Disaster Definition", h2_style))
story.append(Paragraph(
"The <b>World Health Organization (WHO)</b> defines a disaster as <i>a sudden ecologic phenomenon of sufficient magnitude to require external assistance</i>. "
"A disaster is an event that overwhelms the resources of the region or location in which it occurs. "
"A <b>hospital disaster</b> may similarly be defined as an event that overwhelms the resources of the receiving hospital — "
"it is not limited to mass casualty incidents. A single patient who ingested an organophosphorous pesticide may overwhelm a hospital's resources "
"if the hospital is unprepared to decontaminate outside the ED.",
body_style))
story.append(Paragraph(
"Whether an event constitutes a disaster depends on the time of day, nature of injuries, type of event, "
"and the preparation time before patient arrival. ED <b>surge capacity</b> (the ability to care for more patients than typical) "
"may be severely limited by hospital overcrowding.",
body_style))
story.append(Paragraph("Types of Disasters", h2_style))
headers = [Paragraph("<b>Type</b>", body_style), Paragraph("<b>Definition</b>", body_style), Paragraph("<b>Examples</b>", body_style)]
rows = [
[Paragraph("External", body_style), Paragraph("Occurs at a location physically separate from the hospital", body_style), Paragraph("Transportation accident, industrial accident", body_style)],
[Paragraph("Internal", body_style), Paragraph("Occurs within the confines of the hospital", body_style), Paragraph("Bomb scare, laboratory accident with radiologic agents, power failure", body_style)],
[Paragraph("Combined", body_style), Paragraph("Both internal and external elements", body_style), Paragraph("Earthquake with mass casualties AND internal hospital damage", body_style)],
[Paragraph("Acute", body_style), Paragraph("Identifiable time of onset producing casualties; large numbers of minimally injured self-transport to nearest hospitals", body_style), Paragraph("Explosion, chemical release, fire, earthquake", body_style)],
[Paragraph("Non-acute", body_style), Paragraph("Slower onset; volumes remain elevated for extended periods", body_style), Paragraph("Pandemic of infectious disease", body_style)],
]
story.append(make_table(headers, rows, col_widths=[3.5*cm, 7.5*cm, 5.5*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Key Disaster Characteristics", h2_style))
story.append(Paragraph(
"In an acute disaster, the event is followed by a large number of minimally injured patients presenting to the nearest hospitals "
"— usually <b>without prehospital triage or evaluation</b>. The vast majority (~80%) of patients are <b>not transported by prehospital agencies</b>, "
"but instead self-transport by car, police vehicle, cabs, or foot to the nearest ED. "
"Initial patients can be expected within minutes; peak volumes can be expected at <b>2 to 3 hours</b> after the event. "
"ED volumes tend to remain elevated for days to weeks after events.",
body_style))
story.append(Paragraph(
"<b>Factors that hinder ED disaster response:</b> communication overload, loss of utilities, structural damage, "
"staff not reporting to work, media interference, influx of families seeking relatives, and decontamination challenges.",
bullet_style))
story.append(PageBreak())
# ─── SECTION 2: DISASTER PREPAREDNESS & PLANNING ──────────────────────────────
story += section_header("2. DISASTER PREPAREDNESS & PLANNING")
story.append(Paragraph("Hospital Emergency Operations Plan (EOP)", h2_style))
story.append(Paragraph(
"Planning for any type of disaster consists of common elements. A hospital disaster planning group is responsible for "
"generating the hospital's <b>Emergency Operations Plan (EOP)</b>. The group should include a diverse membership of hospital "
"employees and decision makers, and should meet regularly to:",
body_style))
for item in [
"Assess hazards (Hazard Vulnerability Analysis)",
"Develop and update short- and long-term disaster plans",
"Plan exercises and training (tabletop exercises, drills, full-scale exercises)",
"Redesign the plan based on experience",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("Incident Command System (ICS)", h2_style))
story.append(Paragraph(
"The <b>Incident Command System (ICS)</b> is a standardized, on-scene, all-hazard incident management concept that "
"allows its users to adopt an integrated organizational structure to match the complexities and demands of single or multiple incidents. "
"The key components include:",
body_style))
ics_headers = [Paragraph("<b>Command Position</b>", body_style), Paragraph("<b>Role</b>", body_style)]
ics_rows = [
[Paragraph("Incident Commander", body_style), Paragraph("Overall command and management of the incident", body_style)],
[Paragraph("Operations Section", body_style), Paragraph("Tactical operations at the disaster site; patient care teams", body_style)],
[Paragraph("Planning Section", body_style), Paragraph("Collection, evaluation, and dissemination of information", body_style)],
[Paragraph("Logistics Section", body_style), Paragraph("Services and support resources — equipment, personnel, facilities", body_style)],
[Paragraph("Finance/Administration", body_style), Paragraph("Cost accounting, procurement, time recording", body_style)],
[Paragraph("Medical Group Supervisor", body_style), Paragraph("Oversees medical treatment area; coordinates triage, treatment, transport", body_style)],
[Paragraph("Triage Officer", body_style), Paragraph("Supervises triage of all incoming patients", body_style)],
[Paragraph("Treatment Officer", body_style), Paragraph("Coordinates definitive stabilization before transport", body_style)],
[Paragraph("Transport Officer", body_style), Paragraph("Coordinates patient transport to appropriate receiving facilities", body_style)],
]
story.append(make_table(ics_headers, ics_rows, col_widths=[5*cm, 11.5*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Hospital Emergency Operations Plan: Key Elements", h2_style))
for item in [
"Clear lines of authority and command structure",
"Protocols for alerting and activating staff (calling trees, radio, cellular, email)",
"Bed management: rapid discharge of non-emergency patients, activating surge beds",
"Decontamination procedures (external to ED) for chemical, biological, radiological exposures",
"Security plan: diverting non-essential vehicles, protecting treatment areas",
"Communication protocols: internal (hospital) and external (EMS, regional hospitals, public health)",
"Supply and equipment stockpiling",
"Staff safety and personal protective equipment (PPE) protocols",
"Mental health support for staff and patients",
"Regular drills — at least two per year as required by The Joint Commission (TJC)",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(PageBreak())
# ─── SECTION 3: OUT-OF-HOSPITAL MANAGEMENT ────────────────────────────────────
story += section_header("3. OUT-OF-HOSPITAL (PREHOSPITAL) MANAGEMENT")
story.append(Paragraph("Overview", h2_style))
story.append(Paragraph(
"The prehospital phase of disaster management encompasses all medical activities that occur at or near the disaster scene, "
"before victims reach a hospital. The primary goals are: <b>(1)</b> scene safety, <b>(2)</b> systematic triage, "
"<b>(3)</b> life-saving interventions, and <b>(4)</b> coordinated transport to appropriate facilities.",
body_style))
story.append(Paragraph("Scene Assessment and Safety", h2_style))
for item in [
"Establish scene safety before entering — risk of secondary hazards (fire, explosion, structural collapse, chemical release)",
"Identify the incident type and scale",
"Establish a Command Post and Medical Operations Center away from hazards",
"Set up casualty collection areas with clear access and egress routes",
"Request additional resources early: EMS units, fire, law enforcement, HAZMAT teams",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("Establishing the Medical Sector", h2_style))
story.append(Paragraph(
"On-site disaster medical teams from hospitals may be deployed when: victims require prolonged extrication, "
"transportation routes are blocked, or the number of casualties exceeds transportation capacity. "
"Such teams should be dispatched with caution — physicians and nurses function optimally in-hospital and should not "
"leave the ED until backup staff have arrived. Teams must be integrated into the ICS structure.",
body_style))
story.append(Paragraph("Mass Casualty Incident (MCI) Definition", h2_style))
story.append(Paragraph(
"<b>MASCAL (Mass Casualty) events</b> are defined as medical contingencies in which the number and needs of casualties "
"exceed available resources (personnel and supplies). They are time-constrained, complex operational problems requiring "
"the calculation of multiple risk variables to accomplish the goal of doing <b>the most good for the greatest number of people.</b>",
body_style))
story.append(Paragraph(
"Risk variables include: ongoing threats, casualty evacuation platforms, time/distance to treatment facilities, "
"environmental conditions, communications, and non-medical manpower. A rehearsed and validated <b>PACE plan</b> "
"(Primary, Alternate, Contingency, Emergency) is critical.",
body_style))
story.append(Paragraph("Principles of Field Medical Care", h2_style))
for item in [
"When patient numbers are small and resources sufficient: on-site care with rapid stabilization and transport",
"When extrication is prolonged: initiate fluid resuscitation and pain control in the field",
"When there is danger (fire, explosion, falling buildings, HAZMAT, extreme weather): perform early, rapid transport with minimum treatment",
"SAVE principle: minimum treatment in the field, maximum in hospital",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("Communication: Disaster Site to Hospitals", h2_style))
story.append(Paragraph(
"The local emergency communications or emergency operations center should alert hospitals in the affected area of possible "
"mass/multiple casualty situations. Reports to hospitals should include:",
body_style))
for item in [
"Total number of injured",
"Number of seriously injured (who may need ICU capability)",
"Number for whom ambulatory treatment is sufficient",
"Type of injuries (burns, blast, chemical exposure, etc.)",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph(
"Hospitals should report back to the EMS communications center: <b>bed availability, number of casualties received, "
"number of additional casualties the hospital can accept, specific items in short supply.</b>",
body_style))
story.append(Paragraph("Distribution of Casualties to Receiving Hospitals", h2_style))
story.append(Paragraph(
"Good communication between hospitals and on-site EMS command minimizes unequal distribution of victims. "
"An overloaded hospital must immediately alert the on-scene incident commander. In this situation, "
"<b>less injured and more stable patients</b> can be sent a farther distance to outlying hospitals.",
body_style))
story.append(Paragraph(
"Casualties with special problems (major burns, carbon monoxide poisoning, spinal cord injuries, "
"victims of chemical or biological terrorism) may need direct transfer to specialized units. "
"Regional plans should allow for care of specialty patients in non-specialty hospitals when specialized capacity is overwhelmed.",
body_style))
story.append(PageBreak())
# ─── SECTION 4: FIELD TRIAGE ──────────────────────────────────────────────────
story += section_header("4. FIELD TRIAGE")
story.append(Paragraph("Purpose of Field Triage", h2_style))
story.append(Paragraph(
"Field triage establishes priorities for care and determines the sequence of treatment and transport. "
"The goal is to do the most good for the greatest number of casualties. Field triage must be:",
body_style))
for item in ["Rapid (seconds per patient)", "Simple enough to be performed by first responders", "Reproducible across different providers", "Dynamic — reassessed continuously"]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("START Triage (Simple Triage and Rapid Treatment)", h2_style))
story.append(Paragraph(
"In the field, rescue personnel often use a <b>simple triage and rapid treatment</b> technique that depends on a rapid assessment "
"of respiratory status, perfusion, hemorrhage control, and mental status. "
"Patients are triaged to <b>immediate care, delayed care, minimal, or dead/dying.</b> "
"START triage can be completed in approximately 30 seconds per patient.",
body_style))
start_headers = [Paragraph("<b>Step</b>", body_style), Paragraph("<b>Assessment</b>", body_style), Paragraph("<b>Action/Category</b>", body_style)]
start_rows = [
[Paragraph("1. Respiration", body_style),
Paragraph("Is the patient breathing?", body_style),
Paragraph("Not breathing after repositioning airway → DEAD (Black)\nBreathing >30/min → IMMEDIATE (Red)\nBreathing ≤30/min → proceed to step 2", body_style)],
[Paragraph("2. Perfusion", body_style),
Paragraph("Radial pulse / capillary refill >2 sec?", body_style),
Paragraph("Absent pulse or CRT >2 sec → IMMEDIATE (Red)\nNormal → proceed to step 3", body_style)],
[Paragraph("3. Mental Status", body_style),
Paragraph("Can patient follow simple commands?", body_style),
Paragraph("Cannot follow commands → IMMEDIATE (Red)\nCan follow commands → DELAYED (Yellow) or MINIMAL (Green)", body_style)],
[Paragraph("4. Ambulation", body_style),
Paragraph("Can patient walk?", body_style),
Paragraph("Walking wounded → MINIMAL (Green)", body_style)],
]
story.append(make_table(start_headers, start_rows, col_widths=[3.5*cm, 5.5*cm, 7.5*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("SALT Triage Algorithm (Sort, Assess, Lifesaving Interventions, Treatment/Transport)", h2_style))
story.append(Paragraph(
"Evidence suggests that the <b>SALT algorithm</b> best balances sensitivity and specificity among triage algorithms. "
"SALT involves two key steps:",
body_style))
story.append(Paragraph("<b>Step 1 — Global Sorting (Three-Tier Prioritization):</b>", h3_style))
story.append(Paragraph(
"The triage physician directs all casualties to walk to a designated area if they need help.",
body_style))
for item in [
"<b>Walking wounded (Green/Minimal):</b> Patients who walk — last priority for individual assessment. Demonstrate intact airway, breathing, circulation, and mental status.",
"<b>Wave or purposeful movement (Yellow/Delayed):</b> Individually assessed second.",
"<b>Still / not moving OR obvious life-threatening injury (Red/Immediate):</b> Assessed first — massive external hemorrhage, airway compromise.",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("<b>Step 2 — Individual Casualty Assessment and Lifesaving Interventions:</b>", h3_style))
story.append(Paragraph(
"Perform individual assessments and apply lifesaving interventions. To qualify as a lifesaving intervention in the field, it must:",
body_style))
for item in [
"Be provided quickly",
"Greatly improve the casualty's likelihood of survival",
"Not require the physician to stay with the casualty",
"Be within the provider's scope of practice",
"Require only immediately available equipment",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph(
"Field lifesaving interventions include: controlling massive external hemorrhage, opening a compromised airway. "
"Following interventions, casualties are assigned to a triage category.",
body_style))
story.append(Paragraph("Triage Categories (DIME — Military / Universal)", h2_style))
triage_headers = [
Paragraph("<b>Color</b>", body_style),
Paragraph("<b>Category</b>", body_style),
Paragraph("<b>Criteria</b>", body_style),
Paragraph("<b>Priority</b>", body_style)
]
triage_rows = [
[Paragraph("🔴 Red", body_style), Paragraph("IMMEDIATE", body_style),
Paragraph("Life-threatening injuries that can be salvaged with immediate intervention. Airway compromise, uncontrolled hemorrhage, tension pneumothorax, shock.", body_style),
Paragraph("1st — treat now", body_style)],
[Paragraph("🟡 Yellow", body_style), Paragraph("DELAYED", body_style),
Paragraph("Serious injuries but patient is stable enough to wait without immediate risk to life. Fractures, burns <20% BSA, minor hemorrhage.", body_style),
Paragraph("2nd — can wait 30–60 min", body_style)],
[Paragraph("🟢 Green", body_style), Paragraph("MINIMAL", body_style),
Paragraph("Walking wounded. Minor injuries — lacerations, contusions, anxiety. Can be treated by non-medical personnel.", body_style),
Paragraph("3rd — treat last", body_style)],
[Paragraph("⚫ Black", body_style), Paragraph("EXPECTANT / DEAD", body_style),
Paragraph("Dead, or injuries so severe that survival is unlikely even with unlimited resources. Unsurvivable injuries (massive head trauma, burns >80% BSA with inhalation). In civilian setting: CPR category.", body_style),
Paragraph("Last / no resources", body_style)],
]
story.append(make_table(triage_headers, triage_rows, col_widths=[2.5*cm, 3*cm, 9*cm, 3*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Mass Casualty Triage Algorithm — Key Decision Points (Tintinalli Table 302-5)", h2_style))
algo_headers = [Paragraph("<b>Parameter</b>", body_style), Paragraph("<b>Finding</b>", body_style), Paragraph("<b>Decision</b>", body_style)]
algo_rows = [
[Paragraph("AIRWAY", body_style), Paragraph("Moving air", body_style), Paragraph("Assess breathing →", body_style)],
[Paragraph("", body_style), Paragraph("Not moving air", body_style), Paragraph("Open airway — still not moving air → EXPECTANT", body_style)],
[Paragraph("BREATHING", body_style), Paragraph(">10 and <30 breaths/min, no severe respiratory distress", body_style), Paragraph("Assess circulation →", body_style)],
[Paragraph("", body_style), Paragraph("Apneic or >30 breaths/min or severe distress", body_style), Paragraph("IMMEDIATE", body_style)],
[Paragraph("CIRCULATION", body_style), Paragraph("Radial pulse present, no major hemorrhage", body_style), Paragraph("Assess mental status →", body_style)],
[Paragraph("", body_style), Paragraph("No radial pulse OR major uncontrolled hemorrhage", body_style), Paragraph("Control hemorrhage if possible → IMMEDIATE", body_style)],
[Paragraph("MENTAL STATUS", body_style), Paragraph("Obeys commands", body_style), Paragraph("DELAYED", body_style)],
[Paragraph("", body_style), Paragraph("Does not obey commands", body_style), Paragraph("IMMEDIATE", body_style)],
[Paragraph("WALKING", body_style), Paragraph("Able to walk", body_style), Paragraph("MINIMAL (Green)", body_style)],
]
story.append(make_table(algo_headers, algo_rows, col_widths=[4*cm, 7*cm, 5.5*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("SAVE Triage — Secondary Assessment of Victim Endpoint", h2_style))
story.append(Paragraph(
"When patients are likely to have significantly delayed transport from a scene (number of casualties exceeds transport capacity "
"or damage to hospital infrastructure), the <b>SAVE triage system</b> helps identify patients most likely to benefit from "
"care available under austere field conditions. SAVE categorizes patients into:",
body_style))
for item in [
"<b>Category 1:</b> Will die regardless of how much care is received — do not invest resources",
"<b>Category 2:</b> Will survive whether or not they receive care — low priority for interventions",
"<b>Category 3:</b> Will benefit significantly from austere field interventions — highest priority under resource scarcity",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(PageBreak())
# ─── SECTION 5: IN-HOSPITAL TRIAGE & MANAGEMENT ──────────────────────────────
story += section_header("5. IN-HOSPITAL TRIAGE & MANAGEMENT")
story.append(Paragraph("Initial Hospital Response", h2_style))
story.append(Paragraph(
"When a call is received indicating a disaster or potential mass casualty event, the incident must be verified by the appropriate "
"predesignated official, who then <b>puts the Emergency Operations Plan (EOP) into effect</b>. "
"In some events, the first sign of a disaster may be patients arriving at the hospital — in this case, "
"contact the regional emergency communications center immediately.",
body_style))
story.append(Paragraph("Immediate Actions on EOP Activation", h2_style))
for item in [
"Notify nursing and medical personnel of impending casualty arrival",
"Activate staff calling plan (phone, radio, cellular, text, email, TV announcement)",
"Conduct initial needs assessment — evaluate current ED patients and make disposition decisions (admit, discharge, transfer)",
"Discharge all non-emergency patients with responsible individuals",
"Assign staff to designated areas within the department",
"Transport all available litters and wheelchairs to ambulance entrance immediately",
"Place essential equipment (ETT, IV fluids, cervical collars, splints, bandages) near ambulance entrance",
"Activate security: divert non-essential vehicles, ensure one-way traffic flow to ambulance entrance",
"Communicate to prehospital center: number of patients the department can receive",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("Emergency Department In-Hospital Triage", h2_style))
story.append(Paragraph(
"Triage must be performed at the ED entrance even if it was performed at the scene, as patient conditions change. "
"The triage team evaluates all arriving patients and classifies them by severity. "
"Triage category is identified by a <b>colored band or disaster tag</b> placed on the patient.",
body_style))
story.append(Paragraph(
"<b>Key principle:</b> Patient care at triage should be limited to <b>manually opening airways and controlling external hemorrhage</b>. "
"Some principles of normal medical care must be altered to achieve the best overall result for the most patients.",
note_style))
story.append(Spacer(1, 8))
story.append(Paragraph("ED Triage Categories (Table 5-8 from Tintinalli)", h2_style))
ed_triage_headers = [
Paragraph("<b>Tag</b>", body_style),
Paragraph("<b>Category</b>", body_style),
Paragraph("<b>Clinical Criteria</b>", body_style),
Paragraph("<b>Examples</b>", body_style)
]
ed_triage_rows = [
[Paragraph("Red", body_style), Paragraph("IMMEDIATE\nPriority 1", body_style),
Paragraph("Life-threatening but potentially salvageable with immediate intervention", body_style),
Paragraph("Airway obstruction, tension pneumothorax, hemorrhagic shock, respiratory failure, open thoracic wounds", body_style)],
[Paragraph("Yellow", body_style), Paragraph("DELAYED\nPriority 2", body_style),
Paragraph("Serious injury but stable; can tolerate a delay in treatment of 30-60 min without risk to life", body_style),
Paragraph("Stable abdominal wounds without shock, soft tissue injuries, fractures without vascular compromise, burns 10–30% BSA", body_style)],
[Paragraph("Green", body_style), Paragraph("MINIMAL\nPriority 3", body_style),
Paragraph("Minor injury; can manage self or with minimal assistance; walking wounded", body_style),
Paragraph("Contusions, minor lacerations, sprains, mild burns, anxiety reactions", body_style)],
[Paragraph("Black", body_style), Paragraph("EXPECTANT\nPriority 4", body_style),
Paragraph("Dead or injuries so severe that survival is unlikely even with unlimited resources; resource allocation would compromise care of salvageable patients", body_style),
Paragraph("Decapitation, massive brain injury, burns >85% BSA, prolonged cardiac arrest in trauma", body_style)],
]
story.append(make_table(ed_triage_headers, ed_triage_rows, col_widths=[2.5*cm, 3*cm, 6*cm, 5*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Treatment Areas in the ED", h2_style))
treat_headers = [Paragraph("<b>Area</b>", body_style), Paragraph("<b>For</b>", body_style), Paragraph("<b>Key Activities</b>", body_style)]
treat_rows = [
[Paragraph("Resuscitation / Immediate Area", body_style),
Paragraph("Red tag patients", body_style),
Paragraph("Airway management, hemorrhage control, chest decompression, IV access, blood transfusion, emergency surgery triage", body_style)],
[Paragraph("Acute Care Area", body_style),
Paragraph("Yellow tag patients", body_style),
Paragraph("IV fluids, wound management, splinting, monitoring, pain control, imaging", body_style)],
[Paragraph("Minor Care / Ambulatory Area", body_style),
Paragraph("Green tag patients", body_style),
Paragraph("Wound care, splinting, analgesia, psychological support, discharge instructions", body_style)],
[Paragraph("Expectant Area", body_style),
Paragraph("Black tag patients", body_style),
Paragraph("Comfort measures, pain control; reassess if conditions improve", body_style)],
[Paragraph("Morgue / Holding Area", body_style),
Paragraph("Deceased patients", body_style),
Paragraph("Documentation, identification, notification of families, coordination with medical examiner", body_style)],
]
story.append(make_table(treat_headers, treat_rows, col_widths=[4*cm, 3*cm, 9.5*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Surge Capacity Management", h2_style))
for item in [
"Rapidly discharge stable inpatients",
"Cancel elective admissions and procedures",
"Convert non-clinical space to additional patient care areas",
"Use hallways, waiting rooms, and conference rooms for lower-acuity patients",
"Set up external triage/treatment tents if casualty numbers are very large",
"Activate disaster credentialing for additional volunteer/off-duty providers",
"Request mutual aid from neighboring hospitals via regional coordination",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("Documentation During Disaster", h2_style))
story.append(Paragraph(
"Maintain a patient encounter form or disaster tag for each patient. Documentation should include: patient identifier, "
"triage category, vital signs, mechanism of injury, interventions performed, and disposition. "
"This facilitates tracking of patients across the system and communication to receiving facilities.",
body_style))
story.append(PageBreak())
# ─── SECTION 6: MANAGEMENT IN TERTIARY CENTRE ─────────────────────────────────
story += section_header("6. MANAGEMENT IN A TERTIARY CENTRE")
story.append(Paragraph("Role of the Tertiary Centre", h2_style))
story.append(Paragraph(
"Tertiary centres (Level I trauma centres, academic medical centres with specialty resources) play a pivotal role in disaster "
"management by accepting and definitively managing the most critically injured patients. They must activate their EOP "
"at a higher level and maintain specialized resources:",
body_style))
for item in [
"Operating theatres on standby for emergency surgery",
"Intensive care unit beds (including burn ICU)",
"Specialist teams: trauma surgery, neurosurgery, orthopedics, vascular surgery, burns, cardiothoracic",
"Blood bank with massive transfusion protocol activation",
"Advanced imaging: CT, angiography, interventional radiology",
"Toxicology and HAZMAT decontamination capability",
"Burn unit capacity",
"Pediatric specialist teams (if combined paediatric-adult tertiary centre)",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("Rapid Re-Triage in Tertiary Centre", h2_style))
story.append(Paragraph(
"Triage is dynamic and must be repeated at each level of care. On arrival at the tertiary centre, "
"ALL patients must undergo re-triage regardless of field or secondary hospital triage category. "
"Conditions change during transport; delays can convert delayed (Yellow) patients to immediate (Red).",
body_style))
story.append(Paragraph("Primary and Secondary Survey", h2_style))
survey_headers = [Paragraph("<b>Survey</b>", body_style), Paragraph("<b>Component</b>", body_style), Paragraph("<b>Assessment</b>", body_style)]
survey_rows = [
[Paragraph("PRIMARY SURVEY (ABCDE)", body_style), Paragraph("A — Airway", body_style),
Paragraph("Assess patency; c-spine protection if trauma; RSI/intubation if airway compromise", body_style)],
[Paragraph("", body_style), Paragraph("B — Breathing", body_style),
Paragraph("Ventilation and oxygenation; needle/finger thoracostomy for tension PTX; chest drain for HTX", body_style)],
[Paragraph("", body_style), Paragraph("C — Circulation", body_style),
Paragraph("Hemorrhage control; IV/IO access; blood products; vasopressors; FAST/DPL for abdominal bleeding", body_style)],
[Paragraph("", body_style), Paragraph("D — Disability", body_style),
Paragraph("GCS, pupils, glucose; neuroprotection if TBI (head-up position, normocapnia, ICP management)", body_style)],
[Paragraph("", body_style), Paragraph("E — Exposure", body_style),
Paragraph("Full exposure; log roll; prevent hypothermia (warm blankets, warmed fluids)", body_style)],
[Paragraph("SECONDARY SURVEY", body_style), Paragraph("Head-to-toe examination", body_style),
Paragraph("Detailed assessment of all injuries; adjuncts (ECG, imaging, labs, foley, NGT)", body_style)],
]
story.append(make_table(survey_headers, survey_rows, col_widths=[4*cm, 3.5*cm, 9*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Damage Control Resuscitation (DCR)", h2_style))
story.append(Paragraph(
"In mass casualty disasters, <b>Damage Control Resuscitation</b> prioritizes rapid hemorrhage control "
"and prevention of the lethal triad (hypothermia, acidosis, coagulopathy):",
body_style))
for item in [
"Permissive hypotension (target SBP 80–90 mmHg in penetrating trauma, 90–100 in TBI) until definitive hemorrhage control",
"Balanced blood product resuscitation: ratio 1:1:1 (packed red cells : FFP : platelets)",
"Tranexamic acid (TXA) within 3 hours of injury",
"Minimize crystalloid — avoid dilutional coagulopathy",
"Early activation of Massive Transfusion Protocol (MTP)",
"Hypothermia prevention — warm fluids, warm environment, warm blankets",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Paragraph("Damage Control Surgery (DCS)", h2_style))
story.append(Paragraph(
"In the context of MCI, operative resources may be limited. Damage Control Surgery follows a three-phase approach:",
body_style))
dcs_headers = [Paragraph("<b>Phase</b>", body_style), Paragraph("<b>Goal</b>", body_style), Paragraph("<b>Procedures</b>", body_style)]
dcs_rows = [
[Paragraph("Phase 1\n(Abbreviated Surgery)", body_style),
Paragraph("Hemorrhage control and contamination control only", body_style),
Paragraph("Packing, vascular shunting, temporary bowel stapling, abdominal closure with temporary dressing (laparostomy)", body_style)],
[Paragraph("Phase 2\n(ICU Resuscitation)", body_style),
Paragraph("Physiological restoration", body_style),
Paragraph("Correct coagulopathy, acidosis, hypothermia. Optimize hemodynamics. Ventilation management.", body_style)],
[Paragraph("Phase 3\n(Definitive Repair)", body_style),
Paragraph("Anatomical reconstruction once stabilized", body_style),
Paragraph("Bowel reconstruction, vascular repair, fasciotomy closure, abdominal closure", body_style)],
]
story.append(make_table(dcs_headers, dcs_rows, col_widths=[4*cm, 4.5*cm, 8*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Special Populations in Tertiary Centre Disaster Management", h2_style))
for item in [
"<b>Burns:</b> Fluid resuscitation (Parkland formula — 4 mL/kg/% TBSA in first 24h), airway management (early intubation if >40% TBSA or inhalation injury), escharotomy if circumferential burns, burn ICU care",
"<b>Blast injuries:</b> Primary (barotrauma to air-containing organs), secondary (fragmentation), tertiary (blunt trauma from displacement), quaternary (burns, crush, toxins) — all assessed systematically",
"<b>Penetrating trauma:</b> Rapid surgical control; REBOA in extremis; angioembolization for solid organ injuries",
"<b>Chemical/Biological/Radiological exposure:</b> Decontamination before entry to hospital; specific antidotes (atropine/pralidoxime for nerve agents); isolation precautions for biological agents",
"<b>Pediatric patients:</b> Weight-based dosing, smaller ETT sizes, different physiologic parameters; pediatric specialist involvement",
"<b>Pregnant patients:</b> Maternal stabilization is primary; fetal monitoring; obstetric team involvement",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(PageBreak())
# ─── SECTION 7: REFERRAL CRITERIA ─────────────────────────────────────────────
story += section_header("7. REFERRAL CRITERIA — FROM PERIPHERAL TO TERTIARY CENTRE")
story.append(Paragraph("Principles of Inter-Facility Referral in Disasters", h2_style))
story.append(Paragraph(
"In a disaster, referral decisions balance the patient's needs against available resources at the referring centre "
"and capacity at the tertiary centre. Communication between hospitals is critical before transport is initiated. "
"Casualties with <b>special problems</b> may need direct transfer to specialized units, "
"though in large MCIs, specialized units may not have capacity for all such patients.",
body_style))
story.append(Paragraph("General Referral Criteria from Non-Tertiary to Tertiary Centre", h2_style))
story.append(Paragraph(
"<b>Refer when the patient's needs exceed the managing facility's capabilities:</b>",
body_style))
ref_headers = [Paragraph("<b>Category</b>", body_style), Paragraph("<b>Indications for Referral to Tertiary Centre</b>", body_style)]
ref_rows = [
[Paragraph("Airway / Respiratory", body_style),
Paragraph("• Persistent airway compromise despite basic interventions\n• Need for prolonged mechanical ventilation\n• Significant inhalation injury\n• Bilateral pulmonary contusions requiring advanced ventilator management\n• Open chest wound requiring thoracic surgery", body_style)],
[Paragraph("Circulatory / Hemorrhage", body_style),
Paragraph("• Uncontrolled hemorrhage requiring operative intervention not available at referring centre\n• Hemorrhagic shock unresponsive to initial resuscitation\n• Need for Massive Transfusion Protocol not available locally\n• Vascular injury requiring repair\n• Need for angioembolization / interventional radiology", body_style)],
[Paragraph("Neurological / Head Injury", body_style),
Paragraph("• GCS ≤8 or deteriorating GCS\n• Suspected intracranial hemorrhage (EDH, SDH, contusion)\n• Need for urgent neurosurgical intervention (decompressive craniectomy, burr hole)\n• Spinal cord injury or suspected unstable spine injury", body_style)],
[Paragraph("Burns", body_style),
Paragraph("• Burns ≥20% TBSA (adult), ≥10% (children/elderly)\n• Burns involving face, hands, feet, genitalia, perineum, or major joints\n• Full-thickness burns ≥5% TBSA\n• Inhalation injury\n• Chemical or electrical burns\n• Burns with associated injuries\n• Circumferential burns requiring escharotomy", body_style)],
[Paragraph("Abdominal / Genitourinary", body_style),
Paragraph("• Suspected intra-abdominal injury requiring laparotomy not available locally\n• Blunt solid organ injury with haemodynamic instability\n• Bowel evisceration, mesenteric injury\n• Pelvic fracture with haemodynamic instability", body_style)],
[Paragraph("Orthopaedics", body_style),
Paragraph("• Open fractures requiring orthopaedic expertise\n• Fractures with vascular injury\n• Traumatic amputation\n• Compartment syndrome requiring fasciotomy", body_style)],
[Paragraph("Chemical / Biological / Radiological", body_style),
Paragraph("• Organophosphate/nerve agent poisoning requiring intensive care/antidote administration\n• Radiological exposure requiring specialist assessment and monitoring\n• Biological exposure requiring infectious disease/critical care management", body_style)],
[Paragraph("Paediatric Patients", body_style),
Paragraph("• Any seriously injured child where paediatric specialist resources are unavailable\n• Burns in children\n• Head injury with GCS ≤14 in child", body_style)],
[Paragraph("Obstetric Patients", body_style),
Paragraph("• Pregnant trauma patients with haemodynamic instability\n• Suspected abruption, uterine rupture\n• Fetal compromise", body_style)],
]
story.append(make_table(ref_headers, ref_rows, col_widths=[4.5*cm, 12*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Transfer Checklist Before Referral", h2_style))
for item in [
"Contact receiving tertiary centre and confirm acceptance and capacity (do not send without prior communication)",
"Ensure patient is stabilised for transport (airway secured, IV access, hemorrhage controlled, spine immobilisation if indicated)",
"Prepare full documentation: triage tag, vital signs trend, interventions performed, medications given, allergies",
"Accompany with appropriate level of personnel (ALS provider if unstable patient)",
"Communicate estimated time of arrival to receiving centre",
"Ensure adequate oxygen, medications, and equipment for transport duration",
"Brief receiving team via direct communication (SBAR — Situation, Background, Assessment, Recommendation)",
]:
story.append(Paragraph(f"• {item}", bullet_style))
story.append(Spacer(1, 8))
story.append(Paragraph(
"IMPORTANT: In a mass casualty event, the principle of maximizing the number of lives saved takes precedence. "
"Transfer of a single patient should not compromise the care of multiple patients remaining at the referring centre. "
"Transfer non-critical patients to free up resources for immediate (Red tag) patients at the referring centre.",
warn_style))
story.append(PageBreak())
# ─── SECTION 8: SUMMARY TABLE ─────────────────────────────────────────────────
story += section_header("8. QUICK REFERENCE SUMMARY")
story.append(Paragraph("Triage Categories — Quick Reference", h2_style))
qr_headers = [Paragraph("<b>Color</b>", body_style), Paragraph("<b>Priority</b>", body_style),
Paragraph("<b>Examples</b>", body_style), Paragraph("<b>Action</b>", body_style)]
qr_rows = [
[Paragraph("Red\n(Immediate)", body_style), Paragraph("1st", body_style),
Paragraph("Airway obstruction, hemorrhagic shock, tension PTX, open chest, altered GCS", body_style),
Paragraph("Treat NOW", body_style)],
[Paragraph("Yellow\n(Delayed)", body_style), Paragraph("2nd", body_style),
Paragraph("Stable abdominal injury, limb fractures, burns 10-30% BSA", body_style),
Paragraph("Wait up to 1 hour", body_style)],
[Paragraph("Green\n(Minimal)", body_style), Paragraph("3rd", body_style),
Paragraph("Lacerations, contusions, anxiety, minor burns", body_style),
Paragraph("Self-treat / minor care area", body_style)],
[Paragraph("Black\n(Expectant/Dead)", body_style), Paragraph("4th / Last", body_style),
Paragraph("Decapitation, massive TBI, >85% burns, prolonged arrest", body_style),
Paragraph("Comfort only / defer to resources", body_style)],
]
story.append(make_table(qr_headers, qr_rows, col_widths=[3.5*cm, 2*cm, 7.5*cm, 3.5*cm]))
story.append(Spacer(1, 8))
story.append(Paragraph("Disaster Response Flow", h2_style))
flow_headers = [Paragraph("<b>Phase</b>", body_style), Paragraph("<b>Location</b>", body_style), Paragraph("<b>Key Activities</b>", body_style)]
flow_rows = [
[Paragraph("Scene Safety", body_style), Paragraph("Disaster site", body_style),
Paragraph("Secure scene; set up ICS; establish medical sector; call for resources", body_style)],
[Paragraph("Field Triage", body_style), Paragraph("Disaster site", body_style),
Paragraph("START/SALT triage; tag all casualties; lifesaving interventions only (airway + hemorrhage)", body_style)],
[Paragraph("Field Treatment", body_style), Paragraph("Casualty collection area", body_style),
Paragraph("Basic stabilization; IV access; immobilization; prepare for transport", body_style)],
[Paragraph("Transport", body_style), Paragraph("EMS system", body_style),
Paragraph("Distribute casualties evenly to hospitals; direct specialties (burns, neuro) to tertiary if capacity allows", body_style)],
[Paragraph("In-Hospital Triage", body_style), Paragraph("ED entrance", body_style),
Paragraph("Re-triage ALL arrivals; assign to treatment areas; limit triage care to airway/hemorrhage", body_style)],
[Paragraph("Emergency Management", body_style), Paragraph("ED treatment areas", body_style),
Paragraph("Resuscitation of Red tags; stabilize Yellow; treat Green; activate OR and ICU", body_style)],
[Paragraph("Definitive / Tertiary Care", body_style), Paragraph("Tertiary centre", body_style),
Paragraph("Surgery (DCS), ICU, specialist care, reconstruction; re-triage on arrival", body_style)],
[Paragraph("Referral", body_style), Paragraph("Between facilities", body_style),
Paragraph("Transfer patients exceeding local capabilities; confirm capacity; stabilize before transport", body_style)],
]
story.append(make_table(flow_headers, flow_rows, col_widths=[3.5*cm, 3.5*cm, 9.5*cm]))
# ─── REFERENCES ───────────────────────────────────────────────────────────────
story.append(Spacer(1, 14))
story.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor('#c0cfe0')))
story.append(Spacer(1, 6))
story.append(Paragraph("References", h2_style))
story.append(Paragraph(
"Tintinalli JE, et al. <i>Tintinalli's Emergency Medicine: A Comprehensive Study Guide</i>, 9th Edition. "
"McGraw-Hill Education, 2020. Chapter 5: Disaster Preparedness (Hendrickson RG, Horowitz BZ); "
"Chapter 302: Mass Casualty Triage.", ref_style))
story.append(Paragraph(
"WHO. Emergency and disaster risk management for health. World Health Organization, Geneva.", ref_style))
story.append(Paragraph(
"Lerner EB, et al. Mass Casualty Triage: An Evaluation of the Data and Development of a Proposed National Guideline. "
"<i>Disaster Medicine and Public Health Preparedness</i>, 2008.", ref_style))
doc.build(story)
print(f"PDF created: {OUTPUT}")
cd /tmp/workspace/disaster-management && python generate_pdf.py
ls -lh /tmp/workspace/disaster-management/Disaster_Management_Tintinalli.pdf