many revisions, getting closer
BIN
Data_Saves_Lives.pptx
Normal file
BIN
Data_Saves_Lives_v2.pptx
Normal file
BIN
Data_Saves_Lives_v3.pptx
Normal file
BIN
From_Tragedy_to_Triumph/From_Tragedy_to_Triumph.pptx
Normal file
689
From_Tragedy_to_Triumph/create_presentation.py
Normal file
@@ -0,0 +1,689 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Create PowerPoint: From Tragedy to Triumph
|
||||
How Data Transformed Deaths into Design Changes - 45 minute internal presentation
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
from pptx import Presentation
|
||||
from pptx.util import Inches, Pt
|
||||
from pptx.dml.color import RGBColor
|
||||
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
|
||||
from pptx.enum.shapes import MSO_SHAPE
|
||||
|
||||
# Create presentation
|
||||
prs = Presentation()
|
||||
prs.slide_width = Inches(13.333)
|
||||
prs.slide_height = Inches(7.5)
|
||||
|
||||
# Color scheme - Darker, more somber for emotional impact
|
||||
DARK_NAVY = RGBColor(15, 30, 45) # Very dark blue/black
|
||||
ACCENT_GOLD = RGBColor(212, 175, 55) # Dignified gold
|
||||
SOFT_WHITE = RGBColor(250, 250, 250)
|
||||
DARK_GRAY = RGBColor(60, 60, 60)
|
||||
MED_GRAY = RGBColor(120, 120, 120)
|
||||
LIGHT_GRAY = RGBColor(220, 220, 220)
|
||||
HOPE_BLUE = RGBColor(70, 130, 180) # Steel blue for triumph sections
|
||||
SOMBER_RED = RGBColor(139, 69, 69) # Muted red for tragedy
|
||||
|
||||
|
||||
def add_dark_title_slide(title, subtitle=""):
|
||||
"""Full dark title slide for emotional impact"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DARK_NAVY
|
||||
bg.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2.8), Inches(12.333), Inches(1.5)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(56)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if subtitle:
|
||||
sub_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(4.5), Inches(12.333), Inches(0.8)
|
||||
)
|
||||
tf = sub_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = subtitle
|
||||
p.font.size = Pt(24)
|
||||
p.font.color.rgb = ACCENT_GOLD
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_story_intro_slide(story_num, title):
|
||||
"""Story section divider - dark and serious"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DARK_NAVY
|
||||
bg.line.fill.background()
|
||||
|
||||
# Story number
|
||||
num_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2.2), Inches(12.333), Inches(0.8)
|
||||
)
|
||||
tf = num_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = f"STORY {story_num}"
|
||||
p.font.size = Pt(20)
|
||||
p.font.color.rgb = ACCENT_GOLD
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Title
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(3.0), Inches(12.333), Inches(1.5)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(44)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_memorial_slide(main_text, subtext=""):
|
||||
"""Memorial-style slide for tragedy sections"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DARK_NAVY
|
||||
bg.line.fill.background()
|
||||
|
||||
# Main text
|
||||
main_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(2.5), Inches(11.333), Inches(2)
|
||||
)
|
||||
tf = main_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = main_text
|
||||
p.font.size = Pt(36)
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if subtext:
|
||||
sub_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(4.8), Inches(11.333), Inches(0.8)
|
||||
)
|
||||
tf = sub_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = subtext
|
||||
p.font.size = Pt(22)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = MED_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_question_slide(question):
|
||||
"""Large question slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DARK_NAVY
|
||||
bg.line.fill.background()
|
||||
|
||||
q_box = slide.shapes.add_textbox(Inches(1), Inches(2.8), Inches(11.333), Inches(2))
|
||||
tf = q_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = question
|
||||
p.font.size = Pt(40)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = ACCENT_GOLD
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_content_slide(title, bullets, tone="neutral"):
|
||||
"""Content slide with tonal variation"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Background based on tone
|
||||
if tone == "tragedy":
|
||||
header_color = SOMBER_RED
|
||||
elif tone == "triumph":
|
||||
header_color = HOPE_BLUE
|
||||
else:
|
||||
header_color = DARK_NAVY
|
||||
|
||||
# Header
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = header_color
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(32)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
|
||||
# Bullets
|
||||
bullet_box = slide.shapes.add_textbox(
|
||||
Inches(0.8), Inches(1.4), Inches(11.5), Inches(5.8)
|
||||
)
|
||||
tf = bullet_box.text_frame
|
||||
tf.word_wrap = True
|
||||
|
||||
for i, bullet in enumerate(bullets):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = f" {bullet}"
|
||||
p.font.size = Pt(22)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(14)
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_data_slide(title, data_description, annotation=""):
|
||||
"""Data revelation slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = DARK_NAVY
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(32)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
|
||||
# Data box placeholder
|
||||
data_box = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, Inches(1), Inches(1.5), Inches(11.333), Inches(4)
|
||||
)
|
||||
data_box.fill.solid()
|
||||
data_box.fill.fore_color.rgb = LIGHT_GRAY
|
||||
data_box.line.color.rgb = DARK_NAVY
|
||||
|
||||
data_text = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(3), Inches(11.333), Inches(1)
|
||||
)
|
||||
tf = data_text.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = f"[{data_description}]"
|
||||
p.font.size = Pt(22)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if annotation:
|
||||
ann_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(5.8), Inches(11.333), Inches(1)
|
||||
)
|
||||
tf = ann_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = annotation
|
||||
p.font.size = Pt(18)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = SOMBER_RED
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_triumph_stat_slide(stat, description):
|
||||
"""Triumph statistic slide - hopeful tone"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Gradient-like effect with hope blue
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = HOPE_BLUE
|
||||
bg.line.fill.background()
|
||||
|
||||
stat_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2), Inches(12.333), Inches(2.5)
|
||||
)
|
||||
tf = stat_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = stat
|
||||
p.font.size = Pt(96)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
desc_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(4.5), Inches(12.333), Inches(1.5)
|
||||
)
|
||||
tf = desc_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = description
|
||||
p.font.size = Pt(28)
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_arc_slide(title):
|
||||
"""Show the tragedy-to-triumph arc"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.3), Inches(12.333), Inches(0.8)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(28)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = DARK_NAVY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Arc elements
|
||||
elements = ["TRAGEDY", "INVESTIGATION", "DATA", "SOLUTION", "TRIUMPH"]
|
||||
colors = [SOMBER_RED, DARK_GRAY, DARK_NAVY, HOPE_BLUE, HOPE_BLUE]
|
||||
|
||||
box_width = Inches(2.0)
|
||||
spacing = Inches(0.4)
|
||||
start_x = Inches(0.8)
|
||||
|
||||
for i, (element, color) in enumerate(zip(elements, colors)):
|
||||
x = start_x + i * (box_width + spacing)
|
||||
|
||||
# Box
|
||||
box = slide.shapes.add_shape(
|
||||
MSO_SHAPE.ROUNDED_RECTANGLE, x, Inches(3), box_width, Inches(1.2)
|
||||
)
|
||||
box.fill.solid()
|
||||
box.fill.fore_color.rgb = color
|
||||
box.line.fill.background()
|
||||
|
||||
# Text
|
||||
text_box = slide.shapes.add_textbox(x, Inches(3.3), box_width, Inches(0.8))
|
||||
tf = text_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = element
|
||||
p.font.size = Pt(16)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = SOFT_WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Arrow
|
||||
if i < len(elements) - 1:
|
||||
arrow = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RIGHT_ARROW,
|
||||
x + box_width + Inches(0.05),
|
||||
Inches(3.35),
|
||||
spacing - Inches(0.1),
|
||||
Inches(0.5),
|
||||
)
|
||||
arrow.fill.solid()
|
||||
arrow.fill.fore_color.rgb = MED_GRAY
|
||||
arrow.line.fill.background()
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_final_quote_slide(quote):
|
||||
"""Final reflective quote"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DARK_NAVY
|
||||
bg.line.fill.background()
|
||||
|
||||
quote_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(2.5), Inches(11.333), Inches(3)
|
||||
)
|
||||
tf = quote_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = quote
|
||||
p.font.size = Pt(32)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = ACCENT_GOLD
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# BUILD THE PRESENTATION
|
||||
# ============================================================================
|
||||
|
||||
# Slide 1: Title
|
||||
add_dark_title_slide(
|
||||
"From Tragedy to Triumph", "How Data Transformed Deaths into Design Changes"
|
||||
)
|
||||
|
||||
# Slide 2: Arc introduction
|
||||
add_arc_slide("Every Safety Standard Follows This Arc")
|
||||
|
||||
# Slide 3: Story 1 intro
|
||||
add_story_intro_slide("1", "The Children Who Were\nKilled by Safety")
|
||||
|
||||
# Slide 4: Memorial
|
||||
add_memorial_slide(
|
||||
"In memory of the 175+ people\nkilled by airbags, 1990-1997",
|
||||
"Most were children sitting in the front seat",
|
||||
)
|
||||
|
||||
# Slide 5: The question
|
||||
add_question_slide(
|
||||
"Why were airbags killing the people\nthey were designed to protect?"
|
||||
)
|
||||
|
||||
# Slide 6: Investigation
|
||||
add_content_slide(
|
||||
"The Investigation: Out-of-Position Testing",
|
||||
[
|
||||
"What happens when someone isn't in the ideal position?",
|
||||
"What happens when they're too close to the airbag?",
|
||||
"What happens when they're small?",
|
||||
"",
|
||||
"Researchers used instrumented dummies:",
|
||||
" Small female dummies, child dummies, infant dummies",
|
||||
" Accelerometers and load cells capturing every millisecond",
|
||||
" The same sensors DTS makes today",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 7: The data
|
||||
add_data_slide(
|
||||
"The Data: Fatal Forces Revealed",
|
||||
"Neck load trace showing 3,500 N peak vs. 1,600 N injury threshold",
|
||||
"More than DOUBLE the fatal threshold for a child's neck",
|
||||
)
|
||||
|
||||
# Slide 8: The solution
|
||||
add_content_slide(
|
||||
"The Engineering Solution",
|
||||
[
|
||||
"1998: Immediate depowering (20-35% force reduction)",
|
||||
"Dual-stage inflators: Variable deployment force",
|
||||
"Occupant classification: Weight sensors detect children",
|
||||
"Suppression systems: Turn off for rear-facing child seats",
|
||||
"Multi-stage deployment: Match force to crash severity",
|
||||
"",
|
||||
"Every solution required new testing, new data, new validation",
|
||||
],
|
||||
tone="triumph",
|
||||
)
|
||||
|
||||
# Slide 9: Triumph
|
||||
add_triumph_stat_slide(
|
||||
"50 → 0", "Airbag fatalities per year:\nFrom over 50 to essentially zero"
|
||||
)
|
||||
|
||||
# Slide 10: Story 2 intro
|
||||
add_story_intro_slide("2", "The Car That Was\nCheaper to Let Burn")
|
||||
|
||||
# Slide 11: Pinto tragedy
|
||||
add_content_slide(
|
||||
"The Ford Pinto: 1970s Bestseller",
|
||||
[
|
||||
"Small, cheap, fuel-efficient during the oil crisis",
|
||||
"One problem: Gas tank 9 inches from rear bumper",
|
||||
"",
|
||||
"In rear-end collisions:",
|
||||
" Rear crumpled into gas tank",
|
||||
" Tank ruptured, fuel sprayed",
|
||||
" A spark ignited it",
|
||||
"",
|
||||
"People burned to death inside their cars",
|
||||
"Estimates: 27 to several hundred deaths",
|
||||
],
|
||||
tone="tragedy",
|
||||
)
|
||||
|
||||
# Slide 12: The memo
|
||||
add_memorial_slide(
|
||||
'"Costs: $11/car × 12.5M cars = $137M\nBenefits: 180 deaths × $200K = $36M"',
|
||||
"Internal Ford cost-benefit analysis. Cost exceeds benefit. Don't fix it.",
|
||||
)
|
||||
|
||||
# Slide 13: Data/solution
|
||||
add_content_slide(
|
||||
"The Data That Should Have Driven the Decision",
|
||||
[
|
||||
"Rear impact testing showed catastrophic fuel leakage",
|
||||
"Tank design failed at impacts as low as 25 mph",
|
||||
"Ford engineers knew. They had the data.",
|
||||
"But data didn't make it past accounting.",
|
||||
"",
|
||||
"After the scandal, FMVSS 301 was strengthened:",
|
||||
" Rear impact: 50 mph",
|
||||
" Side impact: 20 mph",
|
||||
" Rollover: 360 degrees",
|
||||
" Fuel leakage precisely measured and limited",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 14: Triumph
|
||||
add_triumph_stat_slide("Down 76%", "Vehicle fire deaths since 1980")
|
||||
|
||||
# Slide 15: Story 3 intro
|
||||
add_story_intro_slide("3", "The Test That\nHumbled an Industry")
|
||||
|
||||
# Slide 16: Context
|
||||
add_content_slide(
|
||||
"2010: Frontal Safety Was 'Solved'",
|
||||
[
|
||||
"Vehicles acing federal full-frontal test",
|
||||
"Vehicles acing IIHS moderate overlap test",
|
||||
"Frontal crash deaths were down significantly",
|
||||
"",
|
||||
"But IIHS researchers noticed a pattern...",
|
||||
"",
|
||||
"People were still dying in frontal crashes",
|
||||
"Tree strikes. Pole strikes. Corner-to-corner.",
|
||||
"Crashes where only 20-25% of width was engaged",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 17: The test
|
||||
add_content_slide(
|
||||
"The New Test: Small Overlap Frontal",
|
||||
[
|
||||
"25% overlap - not 40%",
|
||||
"Rigid barrier - not deformable",
|
||||
"40 mph",
|
||||
"",
|
||||
"Designed to stress the outer edge of the structure",
|
||||
"The area where trees and poles were hitting",
|
||||
"",
|
||||
"2012: Testing begins",
|
||||
"Results shocked everyone",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 18: The failures
|
||||
add_content_slide(
|
||||
"The Results: Premium Brands Failed",
|
||||
[
|
||||
"BMW 5-Series: Marginal",
|
||||
"Mercedes C-Class: Marginal",
|
||||
"Audi A4: Marginal",
|
||||
"Lexus ES: Poor",
|
||||
"",
|
||||
"Only 3 of 13 midsize cars earned 'Good'",
|
||||
"",
|
||||
"Data showed catastrophic intrusion, collapsed footwells,",
|
||||
"HIC values exceeding limits, femur loads off the charts",
|
||||
],
|
||||
tone="tragedy",
|
||||
)
|
||||
|
||||
# Slide 19: Response
|
||||
add_content_slide(
|
||||
"The Industry Response",
|
||||
[
|
||||
"Within two years: Fundamental structural redesign",
|
||||
"Small overlap load paths added",
|
||||
"Extended bumper beams",
|
||||
"Reinforced A-pillars",
|
||||
"",
|
||||
"By 2015: Most vehicles earning 'Good'",
|
||||
"",
|
||||
"Instrumented testing proved the problem",
|
||||
"And proved that the redesign worked",
|
||||
],
|
||||
tone="triumph",
|
||||
)
|
||||
|
||||
# Slide 20: Triumph
|
||||
add_triumph_stat_slide(
|
||||
"Down 8%",
|
||||
"Additional reduction in frontal crash deaths\nwithin 3 years of test introduction",
|
||||
)
|
||||
|
||||
# Slide 21: Story 4 intro
|
||||
add_story_intro_slide("4", "The Sport That\nSaved Itself")
|
||||
|
||||
# Slide 22: Football tragedy
|
||||
add_memorial_slide(
|
||||
"32 players per year", "Killed by head and neck injuries in football, 1960s-1970s"
|
||||
)
|
||||
|
||||
# Slide 23: The problem
|
||||
add_content_slide(
|
||||
"Helmets Existed. They Just Didn't Work.",
|
||||
[
|
||||
"No standard. No test. No validation.",
|
||||
"Manufacturers made claims. Coaches trusted them.",
|
||||
"Players died.",
|
||||
"",
|
||||
"1969: NOCSAE formed",
|
||||
"Mission: Create a test that actually predicts protection",
|
||||
"",
|
||||
"Drop tower. Instrumented headform. Accelerometers.",
|
||||
"Severity Index (SI) metric developed.",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 24: The data
|
||||
add_data_slide(
|
||||
"The Data: Some Helmets Weren't Even Close",
|
||||
"Chart: SI values - Good helmets at 600-800, bad helmets at 1500-2000",
|
||||
"Pass threshold: SI < 1200. Many market leaders failed catastrophically.",
|
||||
)
|
||||
|
||||
# Slide 25: Solution
|
||||
add_content_slide(
|
||||
"The Solution: Set a Standard",
|
||||
[
|
||||
"NOCSAE established SI < 1200 requirement",
|
||||
"1980: NCAA mandated compliance",
|
||||
"High school federations followed",
|
||||
"",
|
||||
"Helmet manufacturers had to design for performance",
|
||||
"Better liners. Better shells. Better protection.",
|
||||
"",
|
||||
"2016: Linear impactor test added for rotational injury",
|
||||
"The science advances; the standard advances",
|
||||
],
|
||||
tone="triumph",
|
||||
)
|
||||
|
||||
# Slide 26: Triumph
|
||||
add_triumph_stat_slide(
|
||||
"32 → 3", "Football deaths per year from head/neck injuries\n90%+ reduction"
|
||||
)
|
||||
|
||||
# Slide 27: Pattern summary
|
||||
add_arc_slide("Four Stories, One Pattern: Data Made the Difference")
|
||||
|
||||
# Slide 28: DTS position
|
||||
add_content_slide(
|
||||
"Where DTS Fits in This Arc",
|
||||
[
|
||||
"We're in the middle. We're the data capture mechanism.",
|
||||
"",
|
||||
"Our accelerometers are in the dummies",
|
||||
"Our DAQ systems are in the crash labs",
|
||||
"Our calibration ensures global consistency",
|
||||
"",
|
||||
"We don't design vehicles or write regulations",
|
||||
"But without accurate data capture,",
|
||||
"none of that other work is possible",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 29: Ongoing mission
|
||||
add_content_slide(
|
||||
"The Mission Continues",
|
||||
[
|
||||
"Electric vehicles: New crash dynamics, battery safety",
|
||||
"Autonomous vehicles: Active safety validation",
|
||||
"Pedestrians & cyclists: Rising fatalities need solutions",
|
||||
"Military: Evolving threats, new protection needs",
|
||||
"Sports: Concussion science revealing rotational injury",
|
||||
"",
|
||||
"Each challenge will follow the same arc",
|
||||
"There will be tragedies. Then data. Then solutions.",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 30: Final quote
|
||||
add_final_quote_slide(
|
||||
"Behind every safety standard is someone who didn't come home.\n\n"
|
||||
"Data ensures their loss wasn't in vain."
|
||||
)
|
||||
|
||||
# Slide 31: Questions
|
||||
add_dark_title_slide("Questions?", "Ben - Application Engineer")
|
||||
|
||||
# ============================================================================
|
||||
# Save
|
||||
# ============================================================================
|
||||
|
||||
output_file = "From_Tragedy_to_Triumph.pptx"
|
||||
prs.save(output_file)
|
||||
print(f"Presentation created: {output_file}")
|
||||
print(f"Total slides: {len(prs.slides)}")
|
||||
591
From_Tragedy_to_Triumph/script_and_speaker_notes.md
Normal file
@@ -0,0 +1,591 @@
|
||||
# From Tragedy to Triumph
|
||||
## How Data Transformed Deaths into Design Changes
|
||||
### A 45-Minute Presentation for DTS Internal Staff
|
||||
|
||||
---
|
||||
|
||||
# PRESENTATION OVERVIEW
|
||||
|
||||
**Presenter:** Ben, Application Engineer
|
||||
**Audience:** DTS engineering and internal staff
|
||||
**Duration:** 45 minutes
|
||||
**Goal:** Tell deeply human stories that connect DTS work to real lives saved
|
||||
|
||||
**Key Themes:**
|
||||
1. Every safety standard was written in blood
|
||||
2. Data is the bridge between tragedy and solution
|
||||
3. DTS equipment is the instrument that captures that bridge
|
||||
4. Our work has profound human meaning
|
||||
|
||||
**Emotional Arc:**
|
||||
- Open with tragedy (create emotional investment)
|
||||
- Build through investigation and data
|
||||
- Resolve with triumph (engineering solution + lives saved)
|
||||
- Repeat pattern 3-4 times, building cumulative impact
|
||||
|
||||
---
|
||||
|
||||
# SLIDE-BY-SLIDE SCRIPT AND SPEAKER NOTES
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 1: Title Slide
|
||||
**Visual:** Dark background with subtle gradient
|
||||
**Title:** From Tragedy to Triumph
|
||||
**Subtitle:** How Data Transformed Deaths into Design Changes
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Start with silence. Let the room settle.]*
|
||||
>
|
||||
> Every safety standard was written in blood.
|
||||
>
|
||||
> That's not a metaphor. It's literal truth. Behind every FMVSS regulation, every IIHS test protocol, every NOCSAE helmet standard - there are people who died.
|
||||
>
|
||||
> Today I want to tell you four stories. Four tragedies that became triumphs. Four times when data - data captured by instrumentation like ours - made the difference between "people keep dying" and "this never happens again."
|
||||
>
|
||||
> These stories are not easy to hear. But I think they're important. Because they remind us why we do what we do.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 2: Story Structure
|
||||
**Visual:** Simple diagram showing the arc
|
||||
**Path:** Tragedy → Investigation → Data → Solution → Triumph
|
||||
|
||||
### Speaker Notes:
|
||||
> Every story I'm going to tell follows the same arc.
|
||||
>
|
||||
> It starts with tragedy. Someone dies. Often many people die.
|
||||
>
|
||||
> Then comes investigation. Engineers ask: What happened? Why?
|
||||
>
|
||||
> Then data. We test. We measure. We quantify what went wrong.
|
||||
>
|
||||
> Then solution. We redesign. We regulate. We change.
|
||||
>
|
||||
> And finally, triumph. The deaths stop. Lives are saved.
|
||||
>
|
||||
> This arc - from tragedy to triumph - is the arc of safety engineering. And data is the hinge point that makes the transformation possible.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 3: Story 1 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** STORY 1: The Children Who Were Killed by Safety
|
||||
|
||||
### Speaker Notes:
|
||||
> Story one. The children who were killed by safety.
|
||||
>
|
||||
> This is perhaps the most tragic story in automotive safety history. Because the very device designed to protect - the airbag - became the killer.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 4: The Tragedy - A Name
|
||||
**Visual:** Simple memorial-style slide
|
||||
**Text:** "In memory of the 175+ people killed by airbags, 1990-1997"
|
||||
**Below:** "Many were children sitting in the front seat"
|
||||
|
||||
### Speaker Notes:
|
||||
> Between 1990 and 1997, airbags killed over 175 people.
|
||||
>
|
||||
> Most of them were children. Some were small women. Some were people who sat too close to the steering wheel.
|
||||
>
|
||||
> *[Pause - let this land]*
|
||||
>
|
||||
> The youngest victim I know of was 1 month old. Killed by an airbag while riding in a rear-facing car seat placed in the front passenger position.
|
||||
>
|
||||
> These weren't high-speed crashes. These were fender-benders. 10 mph impacts. Situations where everyone should have walked away.
|
||||
>
|
||||
> Instead, parents watched their children die from the very device that was supposed to protect them.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 5: The Question
|
||||
**Visual:** Large question mark
|
||||
**Text:** "Why were airbags killing the people they were designed to protect?"
|
||||
|
||||
### Speaker Notes:
|
||||
> The question was devastating: Why?
|
||||
>
|
||||
> Airbags had been sold as the ultimate safety device. They would save 12,000 lives per year, the government said. And they were saving lives - adult male lives, mostly.
|
||||
>
|
||||
> But they were also killing. And the deaths were concentrated among a specific population: Children. Small women. Anyone who wasn't a large adult male.
|
||||
>
|
||||
> Engineers had to find out why. And the only way to find out was to test.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 6: The Investigation
|
||||
**Visual:** Photo of out-of-position testing setup or small dummy
|
||||
**Caption:** Out-of-position testing with child and small female dummies
|
||||
|
||||
### Speaker Notes:
|
||||
> The investigation centered on out-of-position testing.
|
||||
>
|
||||
> What happens when someone isn't sitting in the ideal position? What happens when they're too close to the airbag? What happens when they're small?
|
||||
>
|
||||
> Researchers put instrumented dummies - small female dummies, child dummies, infant dummies - in various positions relative to the airbag. And then they deployed the airbag.
|
||||
>
|
||||
> The dummies were instrumented with accelerometers and load cells. The same kinds of sensors DTS makes today.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 7: The Data
|
||||
**Visual:** Illustration of data showing neck loads
|
||||
**Annotations:** "Peak neck tension: 3,500 N" / "Injury threshold: 1,600 N"
|
||||
|
||||
### Speaker Notes:
|
||||
> The data was horrifying.
|
||||
>
|
||||
> Early airbags inflated at roughly 200 miles per hour. When that explosion hit a small child positioned close to the bag, the neck loads were catastrophic.
|
||||
>
|
||||
> The injury threshold for a child's neck is about 1,600 Newtons. The data showed loads of 3,500 Newtons or more. More than double the fatal threshold.
|
||||
>
|
||||
> The airbags weren't just dangerous - they were essentially guaranteed to kill children in certain positions.
|
||||
>
|
||||
> But without the data, no one would have known exactly why. And without knowing why, you can't engineer a solution.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 8: The Solution
|
||||
**Visual:** Diagram showing multi-stage airbag system components
|
||||
**Bullets:** Depowered bags, dual-stage, occupant classification, suppression
|
||||
|
||||
### Speaker Notes:
|
||||
> The data drove a cascade of engineering solutions:
|
||||
>
|
||||
> First, in 1998, immediate depowering. Reduce the inflation force by 20-35%. Accept that some large males in severe crashes might not be perfectly protected, in exchange for not killing children.
|
||||
>
|
||||
> Second, dual-stage inflators. Variable deployment force based on crash severity. Light crash? Light deployment.
|
||||
>
|
||||
> Third, occupant classification. Weight sensors in seats to detect children and small adults. Adjust or suppress the airbag accordingly.
|
||||
>
|
||||
> Fourth, suppression for rear-facing child seats. If a sensor detects a rear-facing seat, the airbag turns off completely.
|
||||
>
|
||||
> Each of these solutions required new testing. New data. New validation that the fix actually worked.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 9: The Triumph
|
||||
**Visual:** Graph showing airbag fatalities declining
|
||||
**Data:** From 50+/year (1997) to near zero (2020s)
|
||||
|
||||
### Speaker Notes:
|
||||
> The triumph: Airbag fatalities dropped from over 50 per year to essentially zero.
|
||||
>
|
||||
> Modern airbags are smart. They detect who's in the seat. They know how severe the crash is. They deploy with appropriate force - or don't deploy at all.
|
||||
>
|
||||
> And those 50+ people per year who used to die? They're alive. Every year, those 50 people go home to their families instead of going to the morgue.
|
||||
>
|
||||
> That's what data did. Data turned a child-killing device into a life-saving device.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 10: Story 2 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** STORY 2: The Car That Was Cheaper to Let Burn
|
||||
|
||||
### Speaker Notes:
|
||||
> Story two. The car that was cheaper to let burn.
|
||||
>
|
||||
> This is the story of the Ford Pinto. And it's a story about what happens when engineering is overruled by accounting.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 11: The Tragedy
|
||||
**Visual:** Newspaper headlines about Pinto fires
|
||||
**Headlines:** "Pinto Fire Kills Mother and Child" / "Exploding Gas Tanks - Who Knew?"
|
||||
|
||||
### Speaker Notes:
|
||||
> The Ford Pinto was a bestseller in the 1970s. Small, cheap, fuel-efficient during the oil crisis.
|
||||
>
|
||||
> It had one problem: The gas tank was mounted behind the rear axle, only 9 inches from the rear bumper.
|
||||
>
|
||||
> In a rear-end collision - even at moderate speed - the rear crumpled into the gas tank. The tank ruptured. Fuel sprayed. A spark ignited it.
|
||||
>
|
||||
> And people burned to death inside their cars.
|
||||
>
|
||||
> It's impossible to know the exact death toll. Estimates range from 27 to several hundred. What we know for certain: Ford knew about the problem before anyone died.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 12: The Investigation - The Memo
|
||||
**Visual:** Quote from the infamous Ford memo
|
||||
**Quote:** "Costs: $11 per car × 12.5 million cars = $137 million"
|
||||
**Quote:** "Benefits: 180 deaths × $200,000 = $36 million"
|
||||
**Caption:** Internal Ford cost-benefit analysis
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Let the audience read the slide]*
|
||||
>
|
||||
> This is from an actual internal Ford memo.
|
||||
>
|
||||
> The cost to fix the problem: $11 per car. Eleven dollars. For 12.5 million vehicles, that's $137 million.
|
||||
>
|
||||
> The "benefit" of fixing it - in Ford's calculation - was 180 fewer deaths. At $200,000 per death (their number), that's $36 million.
|
||||
>
|
||||
> Cost exceeds benefit. Don't fix it.
|
||||
>
|
||||
> *[Pause]*
|
||||
>
|
||||
> This is what happens when safety decisions are made without proper data context. When human lives are just numbers in a spreadsheet.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 13: The Data
|
||||
**Visual:** Illustration of rear impact test data
|
||||
**Annotations:** Fuel leakage measurements, fire risk metrics
|
||||
|
||||
### Speaker Notes:
|
||||
> The data that should have driven the decision was clear.
|
||||
>
|
||||
> Rear impact testing showed fuel leakage far exceeding safe limits. The tank design failed at impacts as low as 25 mph.
|
||||
>
|
||||
> Ford's own engineers knew. They had the data. But the data didn't make it past the accounting department.
|
||||
>
|
||||
> After the scandal broke, after the lawsuits, after the criminal charges - the federal government strengthened FMVSS 301, the fuel system integrity standard.
|
||||
>
|
||||
> Now every vehicle is tested. Rear impact at 50 mph. Side impact at 20 mph. Rollover in 360 degrees. Fuel leakage is measured precisely - using instrumentation - and limits are enforced.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 14: The Solution
|
||||
**Visual:** Modern fuel system protection features
|
||||
**Bullets:** Reinforced tanks, shields, self-sealing lines, protected locations
|
||||
|
||||
### Speaker Notes:
|
||||
> The solutions were straightforward - and cheap.
|
||||
>
|
||||
> That $11 fix? It included a plastic shield to protect the tank, reinforced bumper mounts, and better tank location.
|
||||
>
|
||||
> Today, fuel system integrity is non-negotiable. Tanks are mounted in protected locations. They're designed to deform without rupturing. Fuel lines are self-sealing.
|
||||
>
|
||||
> And critically: Every design is tested. Instrumented. Measured. You can't claim safety without proving it with data.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 15: The Triumph
|
||||
**Visual:** Statistics on fire deaths
|
||||
**Text:** "Vehicle fire deaths: Down 76% since 1980"
|
||||
|
||||
### Speaker Notes:
|
||||
> The triumph: Vehicle fire deaths have dropped 76% since 1980.
|
||||
>
|
||||
> Some of that is better firefighting. Some is better rescue. But much of it is engineering: Vehicles simply don't catch fire like they used to.
|
||||
>
|
||||
> The Pinto scandal forced the industry to take fuel system safety seriously. It forced regulators to mandate testing. And it established the principle that safety decisions must be based on data, not cost-benefit analysis.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 16: Story 3 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** STORY 3: The Test That Humbled an Industry
|
||||
|
||||
### Speaker Notes:
|
||||
> Story three. The test that humbled an industry.
|
||||
>
|
||||
> This is the story of the IIHS small overlap test. And it's a reminder that even when we think we've solved a problem, we might be missing something.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 17: The Tragedy Pattern
|
||||
**Visual:** Crash reconstruction showing small overlap impact
|
||||
**Caption:** The crash pattern that kept killing people
|
||||
|
||||
### Speaker Notes:
|
||||
> By 2010, frontal crash safety was considered a solved problem. Vehicles were acing the federal full-frontal test. They were acing the IIHS moderate overlap test. Deaths were down.
|
||||
>
|
||||
> But IIHS researchers noticed something in real-world crash data. People were still dying in frontal crashes. And they were dying in a specific pattern.
|
||||
>
|
||||
> Tree strikes. Pole strikes. Corner-to-corner with other vehicles. Crashes where only 20-25% of the vehicle's width was engaged.
|
||||
>
|
||||
> These "small overlap" crashes weren't captured by existing tests. The vehicles that aced the 40% overlap test? They were failing in real crashes.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 18: The Investigation
|
||||
**Visual:** Photo of IIHS small overlap test in progress
|
||||
**Caption:** 25% overlap, rigid barrier, 40 mph
|
||||
|
||||
### Speaker Notes:
|
||||
> IIHS developed a new test. Twenty-five percent overlap. Rigid barrier - not deformable. Forty miles per hour.
|
||||
>
|
||||
> The test was designed to stress the part of the vehicle structure that existing tests missed: The outer edge. The corner. The area where all those trees and poles were hitting.
|
||||
>
|
||||
> In 2012, they started testing. The results shocked everyone.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 19: The Data - The Failure
|
||||
**Visual:** Test results table
|
||||
**Show:** BMW, Mercedes, Audi, Lexus - all Marginal or Poor
|
||||
|
||||
### Speaker Notes:
|
||||
> BMW 5-Series: Marginal.
|
||||
> Mercedes C-Class: Marginal.
|
||||
> Audi A4: Marginal.
|
||||
> Lexus ES: Poor.
|
||||
>
|
||||
> These are the most expensive, most prestigious vehicles on the road. Vehicles marketed as "safe." Vehicles that aced every other crash test.
|
||||
>
|
||||
> And they failed. Only 3 of 13 midsize cars earned "Good" in the first round.
|
||||
>
|
||||
> The data showed catastrophic intrusion. Footwells collapsed. Steering columns displaced. Dummies' heads struck hard interior surfaces. Feet were trapped in crushed metal.
|
||||
>
|
||||
> The instrument data told the story: HIC values exceeding limits. Femur loads off the charts. Lower leg compression in the critical injury range.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 20: The Solution
|
||||
**Visual:** Before/after structural diagrams
|
||||
**Caption:** Industry redesign of front structures
|
||||
|
||||
### Speaker Notes:
|
||||
> The industry responded with remarkable speed.
|
||||
>
|
||||
> Within two years, most manufacturers had fundamentally redesigned their front structures. They added small overlap load paths. Extended bumper beams. Reinforced A-pillars.
|
||||
>
|
||||
> By 2015, most vehicles were earning "Good" ratings. The test that humbled the industry became the test that improved the industry.
|
||||
>
|
||||
> But it took instrumented testing to prove the problem. Without precise measurement of what was happening to the dummies - the head injury values, the leg loads, the chest compression - you couldn't quantify the failure. And you couldn't prove that the redesign worked.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 21: The Triumph
|
||||
**Visual:** Statistics on frontal crash deaths
|
||||
**Text:** "Frontal crash deaths: Down 8% within 3 years of test introduction"
|
||||
|
||||
### Speaker Notes:
|
||||
> The triumph: Within three years of the small overlap test introduction, frontal crash deaths dropped an additional 8%.
|
||||
>
|
||||
> That's after decades of improvement. That's when everyone thought frontal safety was "done."
|
||||
>
|
||||
> The test revealed a hidden vulnerability. Data quantified it. Engineering fixed it. And real people - thousands of them - are alive because of it.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 22: Story 4 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** STORY 4: The Sport That Saved Itself
|
||||
|
||||
### Speaker Notes:
|
||||
> Story four. The sport that saved itself.
|
||||
>
|
||||
> This is the story of football helmets. And it's a reminder that safety standards can transform an entire culture.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 23: The Tragedy
|
||||
**Visual:** Vintage football injury photo or memorial
|
||||
**Text:** "32 players per year, 1960s-1970s"
|
||||
**Caption:** Killed by head and neck injuries in football
|
||||
|
||||
### Speaker Notes:
|
||||
> In the 1960s and early 1970s, American football was deadly.
|
||||
>
|
||||
> Thirty-two players died every year from head and neck injuries. High school kids. College students. Professionals.
|
||||
>
|
||||
> Helmets existed. Players wore them. But the helmets weren't protecting them - because there was no standard. There was no test. There was no way to know if a helmet actually worked.
|
||||
>
|
||||
> Manufacturers made claims. Coaches trusted them. And players died.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 24: The Investigation
|
||||
**Visual:** Photo of drop tower testing
|
||||
**Caption:** NOCSAE drop test development, 1970s
|
||||
|
||||
### Speaker Notes:
|
||||
> In 1969, the National Operating Committee on Standards for Athletic Equipment - NOCSAE - was formed.
|
||||
>
|
||||
> Their mission: Develop a test that actually predicts whether a helmet will protect a player.
|
||||
>
|
||||
> They built drop towers. They instrumented headforms with accelerometers. They developed the Severity Index metric - an integral of acceleration that correlates with brain injury risk.
|
||||
>
|
||||
> They tested every helmet on the market. Many failed. Some failed spectacularly.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 25: The Data
|
||||
**Visual:** Chart showing SI values for different helmets
|
||||
**Annotations:** Pass/fail threshold at SI 1200
|
||||
|
||||
### Speaker Notes:
|
||||
> The data was stark.
|
||||
>
|
||||
> Some helmets attenuated impact beautifully - SI values of 600, 800. Well under the 1200 threshold.
|
||||
>
|
||||
> Other helmets - including some market leaders - showed SI values of 1500, 1800, 2000. They weren't just failing; they weren't even close to passing.
|
||||
>
|
||||
> Players were wearing helmets that provided almost no protection. And nobody knew - because nobody had measured.
|
||||
>
|
||||
> NOCSAE measurement changed that. Suddenly there was objective data. Helmets either worked or they didn't. And you could prove which was which.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 26: The Solution
|
||||
**Visual:** Modern football helmet design features
|
||||
**Bullets:** Energy-absorbing liners, improved shells, standardized testing
|
||||
|
||||
### Speaker Notes:
|
||||
> The solution was elegant: Set a standard, and let the market respond.
|
||||
>
|
||||
> NOCSAE established the SI < 1200 requirement. In 1980, the NCAA mandated that all helmets meet the standard. High school federations followed.
|
||||
>
|
||||
> Suddenly, helmet manufacturers had to design for performance, not just appearance. Helmets got better liners. Better shells. Better overall performance.
|
||||
>
|
||||
> And the standard kept evolving. In 2016, NOCSAE added the linear impactor test for rotational injury assessment. The science advances; the standard advances.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 27: The Triumph
|
||||
**Visual:** Graph showing football fatalities over time
|
||||
**Data:** 32/year (1970) → 8/year (1985) → 3/year (2020)
|
||||
|
||||
### Speaker Notes:
|
||||
> The triumph: Football deaths from head and neck injuries dropped by over 90%.
|
||||
>
|
||||
> From 32 per year to typically 3 or fewer. Hundreds of lives saved every year.
|
||||
>
|
||||
> That's not better coaching. That's not rule changes. That's engineering. Helmets validated with instrumented testing. Helmets that actually work.
|
||||
>
|
||||
> And DTS instrumentation is in testing labs around the country, validating helmets every day. The same measurement principles that started this revolution continue to drive it forward.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 28: The Pattern
|
||||
**Visual:** Four arcs showing all four stories
|
||||
**Summary:** Tragedy → Data → Solution → Triumph (×4)
|
||||
|
||||
### Speaker Notes:
|
||||
> Four stories. Four tragedies. Four triumphs.
|
||||
>
|
||||
> Children killed by airbags → Out-of-position testing data → Smart airbags → Deaths to zero.
|
||||
>
|
||||
> People burning in Pintos → Fuel system testing data → Protected fuel systems → Fire deaths down 76%.
|
||||
>
|
||||
> Drivers dying in small overlap crashes → New test protocol data → Structural redesign → Frontal deaths down 8%.
|
||||
>
|
||||
> Football players killed → Helmet testing data → Better helmets → Deaths down 90%.
|
||||
>
|
||||
> Every one of these transformations ran through the same chokepoint: Data. Instrumented testing. Precise measurement of what was going wrong.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 29: Where DTS Fits
|
||||
**Visual:** Connection diagram
|
||||
**Center:** DTS Instrumentation
|
||||
**Spokes:** Crash labs, helmet labs, military labs, sports labs
|
||||
|
||||
### Speaker Notes:
|
||||
> Where does DTS fit in this arc?
|
||||
>
|
||||
> We're in the middle. We're the data capture mechanism.
|
||||
>
|
||||
> Our accelerometers are in the dummies. Our data acquisition systems are in the crash labs. Our calibration standards ensure that a measurement in Detroit means the same thing as a measurement in Stuttgart.
|
||||
>
|
||||
> We don't design the vehicles. We don't write the regulations. We don't do the engineering analysis.
|
||||
>
|
||||
> But without accurate data capture, none of that other work is possible. We're the foundation that everything else builds on.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 30: The Ongoing Mission
|
||||
**Visual:** List of current/emerging challenges
|
||||
**Bullets:** EV safety, autonomous vehicles, pedestrian protection, new concussion science
|
||||
|
||||
### Speaker Notes:
|
||||
> And the mission continues.
|
||||
>
|
||||
> Electric vehicles are crashing differently. Batteries are bringing new failure modes. We need new instrumentation.
|
||||
>
|
||||
> Autonomous vehicles need validation of active safety. Not just "what happens in a crash" but "did the vehicle avoid the crash?" That's new measurement territory.
|
||||
>
|
||||
> Pedestrian and cyclist deaths are rising even as occupant deaths fall. We need instrumentation for active pedestrian protection systems.
|
||||
>
|
||||
> Concussion science is revealing that rotational acceleration matters as much as linear. We need sensors that capture rotation.
|
||||
>
|
||||
> Each of these challenges will follow the same arc. There will be tragedies. There will be investigations. There will be data. And there will be solutions.
|
||||
>
|
||||
> DTS will be part of that arc - providing the instrumentation that turns tragedy into triumph.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 31: Final Reflection
|
||||
**Visual:** Simple text on dark background
|
||||
**Quote:** "Behind every safety standard is someone who didn't come home. Data ensures their loss wasn't in vain."
|
||||
|
||||
### Speaker Notes:
|
||||
> I want to leave you with this thought.
|
||||
>
|
||||
> Behind every safety standard is someone who didn't come home. A child killed by an airbag. A mother burned in a Pinto. A driver crushed in a small overlap crash. A football player who never got up.
|
||||
>
|
||||
> Those deaths can't be undone. But data - accurate, reliable, precise data - ensures that their loss wasn't in vain.
|
||||
>
|
||||
> The data we capture enables the engineering changes that prevent the next death. And the next. And the next.
|
||||
>
|
||||
> That's what we do. That's why it matters. That's why I'm proud to work here.
|
||||
>
|
||||
> Thank you.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 32: Questions
|
||||
**Visual:** "Questions?"
|
||||
**Subtitle:** Ben - Application Engineer
|
||||
|
||||
### Speaker Notes:
|
||||
> I'm happy to take questions. These are heavy stories - if you need a moment to process, that's okay too.
|
||||
>
|
||||
> *[Open for Q&A]*
|
||||
|
||||
---
|
||||
|
||||
# APPENDIX: ADDITIONAL STORIES (BACKUP)
|
||||
|
||||
## Story: The Roof That Crushed
|
||||
- Ford Explorer/Firestone rollover crisis
|
||||
- 271 deaths attributed to rollovers
|
||||
- FMVSS 216 upgrade from 1.5× to 3× vehicle weight
|
||||
- IIHS roof test at 4× for "Good"
|
||||
|
||||
## Story: The Seat That Whipped
|
||||
- Whiplash causing more injury claims than any other type
|
||||
- BioRID II dummy development
|
||||
- IIHS head restraint ratings
|
||||
- Industry response to dynamic testing
|
||||
|
||||
## Story: The Truck That Underrode
|
||||
- Jayne Mansfield death (1967) driving rear underride awareness
|
||||
- FMVSS 223/224 rear impact guards
|
||||
- IIHS underride testing
|
||||
- Ongoing gaps in side underride protection
|
||||
|
||||
---
|
||||
|
||||
# TIMING GUIDE
|
||||
|
||||
| Section | Duration | Cumulative |
|
||||
|---------|----------|------------|
|
||||
| Opening (Slides 1-2) | 4 min | 4 min |
|
||||
| Story 1 - Airbags (Slides 3-9) | 10 min | 14 min |
|
||||
| Story 2 - Pinto (Slides 10-15) | 8 min | 22 min |
|
||||
| Story 3 - Small Overlap (Slides 16-21) | 8 min | 30 min |
|
||||
| Story 4 - Football (Slides 22-27) | 8 min | 38 min |
|
||||
| Closing (Slides 28-32) | 5 min | 43 min |
|
||||
| Q&A Buffer | 2 min | 45 min |
|
||||
|
||||
---
|
||||
|
||||
# EMOTIONAL MANAGEMENT NOTES
|
||||
|
||||
This presentation deals with heavy subject matter. Consider:
|
||||
|
||||
1. **Pacing:** Don't rush through the tragedy sections. Let them land.
|
||||
2. **Transitions:** Use silence between stories to reset emotional baseline.
|
||||
3. **Resolution:** Always end each story on the triumph. Don't leave audience in despair.
|
||||
4. **Self-care:** Check in with yourself before presenting. These stories can be draining.
|
||||
5. **Audience:** Watch for signs of distress. Have an out if needed.
|
||||
|
||||
---
|
||||
|
||||
*End of Script and Speaker Notes*
|
||||
BIN
Test_Modes_Reference.pptx
Normal file
BIN
The_Stories_Our_Data_Tells/The_Stories_Our_Data_Tells.pptx
Normal file
771
The_Stories_Our_Data_Tells/create_presentation.py
Normal file
@@ -0,0 +1,771 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Create PowerPoint: The Stories Our Data Tells
|
||||
How DTS Helps Save Lives - 45 minute internal presentation
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
# Add parent directory to path for shared assets
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from pptx import Presentation
|
||||
from pptx.util import Inches, Pt
|
||||
from pptx.dml.color import RGBColor
|
||||
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
|
||||
from pptx.enum.shapes import MSO_SHAPE
|
||||
|
||||
# Create presentation with widescreen dimensions
|
||||
prs = Presentation()
|
||||
prs.slide_width = Inches(13.333)
|
||||
prs.slide_height = Inches(7.5)
|
||||
|
||||
# Color scheme - DTS-inspired professional blue
|
||||
DARK_BLUE = RGBColor(0, 48, 87) # Deep navy
|
||||
ACCENT_BLUE = RGBColor(0, 120, 174) # Bright blue
|
||||
LIGHT_BLUE = RGBColor(173, 216, 230) # Light accent
|
||||
DARK_GRAY = RGBColor(51, 51, 51)
|
||||
LIGHT_GRAY = RGBColor(245, 245, 245)
|
||||
WHITE = RGBColor(255, 255, 255)
|
||||
ACCENT_ORANGE = RGBColor(230, 126, 34)
|
||||
HIGHLIGHT_RED = RGBColor(192, 57, 43)
|
||||
|
||||
|
||||
def add_title_slide(title, subtitle=""):
|
||||
"""Full-bleed title slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Dark blue background
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DARK_BLUE
|
||||
bg.line.fill.background()
|
||||
|
||||
# Title
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2.8), Inches(12.333), Inches(1.5)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(60)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if subtitle:
|
||||
sub_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(4.5), Inches(12.333), Inches(0.8)
|
||||
)
|
||||
tf = sub_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = subtitle
|
||||
p.font.size = Pt(28)
|
||||
p.font.color.rgb = LIGHT_BLUE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_section_slide(title, subtitle=""):
|
||||
"""Section divider with accent bar"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Left accent bar
|
||||
bar = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, Inches(0.4), prs.slide_height
|
||||
)
|
||||
bar.fill.solid()
|
||||
bar.fill.fore_color.rgb = ACCENT_BLUE
|
||||
bar.line.fill.background()
|
||||
|
||||
# Section title
|
||||
title_box = slide.shapes.add_textbox(Inches(1), Inches(2.5), Inches(11), Inches(2))
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(48)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = DARK_BLUE
|
||||
|
||||
if subtitle:
|
||||
p = tf.add_paragraph()
|
||||
p.text = subtitle
|
||||
p.font.size = Pt(24)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_stat_slide(number, description, context=""):
|
||||
"""Big number impact slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Number
|
||||
num_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2), Inches(12.333), Inches(2.5)
|
||||
)
|
||||
tf = num_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = number
|
||||
p.font.size = Pt(144)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = ACCENT_BLUE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Description
|
||||
desc_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(4.5), Inches(12.333), Inches(1)
|
||||
)
|
||||
tf = desc_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = description
|
||||
p.font.size = Pt(32)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if context:
|
||||
ctx_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(5.8), Inches(11.333), Inches(1)
|
||||
)
|
||||
tf = ctx_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = context
|
||||
p.font.size = Pt(18)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_quote_slide(quote, attribution=""):
|
||||
"""Quote slide with large text"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Quote
|
||||
quote_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(2), Inches(11.333), Inches(3)
|
||||
)
|
||||
tf = quote_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = f'"{quote}"'
|
||||
p.font.size = Pt(36)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = DARK_BLUE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if attribution:
|
||||
attr_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(5.5), Inches(11.333), Inches(0.5)
|
||||
)
|
||||
tf = attr_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = f"- {attribution}"
|
||||
p.font.size = Pt(20)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_content_slide(title, bullets, subtitle=""):
|
||||
"""Standard content slide with bullets"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Header bar
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.2)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = DARK_BLUE
|
||||
header.line.fill.background()
|
||||
|
||||
# Title
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.25), Inches(12), Inches(0.9)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(36)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
# Subtitle in header
|
||||
if subtitle:
|
||||
sub_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.75), Inches(12), Inches(0.4)
|
||||
)
|
||||
tf = sub_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = subtitle
|
||||
p.font.size = Pt(16)
|
||||
p.font.color.rgb = LIGHT_BLUE
|
||||
|
||||
# Bullets
|
||||
bullet_box = slide.shapes.add_textbox(
|
||||
Inches(0.8), Inches(1.6), Inches(11.5), Inches(5.5)
|
||||
)
|
||||
tf = bullet_box.text_frame
|
||||
tf.word_wrap = True
|
||||
|
||||
for i, bullet in enumerate(bullets):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = f" {bullet}"
|
||||
p.font.size = Pt(24)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(18)
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_two_column_slide(title, left_title, left_items, right_title, right_items):
|
||||
"""Two column comparison slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Header
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = DARK_BLUE
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(32)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
# Left column title
|
||||
left_title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(1.3), Inches(6), Inches(0.5)
|
||||
)
|
||||
tf = left_title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = left_title
|
||||
p.font.size = Pt(22)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = ACCENT_BLUE
|
||||
|
||||
# Left items
|
||||
left_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(1.9), Inches(5.8), Inches(5)
|
||||
)
|
||||
tf = left_box.text_frame
|
||||
tf.word_wrap = True
|
||||
for i, item in enumerate(left_items):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = f" {item}"
|
||||
p.font.size = Pt(18)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(10)
|
||||
|
||||
# Divider line
|
||||
divider = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, Inches(6.5), Inches(1.3), Inches(0.02), Inches(5.5)
|
||||
)
|
||||
divider.fill.solid()
|
||||
divider.fill.fore_color.rgb = LIGHT_BLUE
|
||||
divider.line.fill.background()
|
||||
|
||||
# Right column title
|
||||
right_title_box = slide.shapes.add_textbox(
|
||||
Inches(6.8), Inches(1.3), Inches(6), Inches(0.5)
|
||||
)
|
||||
tf = right_title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = right_title
|
||||
p.font.size = Pt(22)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = ACCENT_BLUE
|
||||
|
||||
# Right items
|
||||
right_box = slide.shapes.add_textbox(Inches(6.8), Inches(1.9), Inches(6), Inches(5))
|
||||
tf = right_box.text_frame
|
||||
tf.word_wrap = True
|
||||
for i, item in enumerate(right_items):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = f" {item}"
|
||||
p.font.size = Pt(18)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(10)
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_story_headline_slide(headline, subtext=""):
|
||||
"""Newspaper-style headline slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Light gray "newspaper" background
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, Inches(0.5), Inches(1.5), Inches(12.333), Inches(4.5)
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = LIGHT_GRAY
|
||||
bg.line.color.rgb = DARK_GRAY
|
||||
|
||||
# Headline
|
||||
headline_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(2.5), Inches(11.333), Inches(2)
|
||||
)
|
||||
tf = headline_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = headline
|
||||
p.font.size = Pt(44)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if subtext:
|
||||
sub_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(4.8), Inches(11.333), Inches(0.8)
|
||||
)
|
||||
tf = sub_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = subtext
|
||||
p.font.size = Pt(24)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_graph_placeholder_slide(title, graph_description, caption=""):
|
||||
"""Slide with placeholder for graph/chart"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Header
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = DARK_BLUE
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(32)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
# Graph placeholder
|
||||
graph = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, Inches(1), Inches(1.5), Inches(11.333), Inches(4.5)
|
||||
)
|
||||
graph.fill.solid()
|
||||
graph.fill.fore_color.rgb = LIGHT_GRAY
|
||||
graph.line.color.rgb = ACCENT_BLUE
|
||||
|
||||
# Graph description
|
||||
desc_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(3.3), Inches(11.333), Inches(1)
|
||||
)
|
||||
tf = desc_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = f"[{graph_description}]"
|
||||
p.font.size = Pt(24)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if caption:
|
||||
cap_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(6.3), Inches(11.333), Inches(0.8)
|
||||
)
|
||||
tf = cap_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = caption
|
||||
p.font.size = Pt(18)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_connection_slide(title, connections):
|
||||
"""Show flow/connection between concepts"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Header
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = DARK_BLUE
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(32)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
# Connection boxes
|
||||
num_items = len(connections)
|
||||
box_width = Inches(2.2)
|
||||
spacing = (prs.slide_width - box_width * num_items) / (num_items + 1)
|
||||
|
||||
for i, item in enumerate(connections):
|
||||
x = spacing + i * (box_width + spacing)
|
||||
|
||||
# Box
|
||||
box = slide.shapes.add_shape(
|
||||
MSO_SHAPE.ROUNDED_RECTANGLE, x, Inches(3), box_width, Inches(1.5)
|
||||
)
|
||||
box.fill.solid()
|
||||
box.fill.fore_color.rgb = ACCENT_BLUE if i % 2 == 0 else DARK_BLUE
|
||||
box.line.fill.background()
|
||||
|
||||
# Text
|
||||
text_box = slide.shapes.add_textbox(x, Inches(3.3), box_width, Inches(1))
|
||||
tf = text_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = item
|
||||
p.font.size = Pt(16)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Arrow (except for last)
|
||||
if i < num_items - 1:
|
||||
arrow = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RIGHT_ARROW,
|
||||
x + box_width + Inches(0.1),
|
||||
Inches(3.5),
|
||||
spacing - Inches(0.2),
|
||||
Inches(0.5),
|
||||
)
|
||||
arrow.fill.solid()
|
||||
arrow.fill.fore_color.rgb = LIGHT_BLUE
|
||||
arrow.line.fill.background()
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# BUILD THE PRESENTATION
|
||||
# ============================================================================
|
||||
|
||||
# Slide 1: Title
|
||||
add_title_slide("The Stories Our Data Tells", "How DTS Helps Save Lives")
|
||||
|
||||
# Slide 2: The Number That Matters
|
||||
add_stat_slide(
|
||||
"117,000",
|
||||
"Lives saved every year in the U.S. alone",
|
||||
"Compared to 1970 fatality rates - a 77% reduction per mile driven",
|
||||
)
|
||||
|
||||
# Slide 3: Quote - Crashed Car
|
||||
add_quote_slide(
|
||||
"A crashed car is destroyed in milliseconds. The data is what remains.",
|
||||
"The foundation of safety engineering",
|
||||
)
|
||||
|
||||
# Slide 4: Section - Part 1
|
||||
add_section_slide("PART 1", "The Data Behind the Headlines")
|
||||
|
||||
# Slide 5: Story 1 - Airbag Headline
|
||||
add_story_headline_slide(
|
||||
"Airbag Kills Child in Minor Crash",
|
||||
"1990s Airbag Crisis - 175+ deaths from safety devices",
|
||||
)
|
||||
|
||||
# Slide 6: What the Data Revealed
|
||||
add_content_slide(
|
||||
"What the Data Revealed",
|
||||
[
|
||||
"Early airbags designed for one scenario only:",
|
||||
" Unbelted 50th percentile male in 30 mph crash",
|
||||
"Inflation speed: ~200 mph",
|
||||
"Actual occupants hit: Children, small women, close-sitters",
|
||||
"Neck loads in small dummies: Off the charts",
|
||||
"Data from out-of-position testing showed fatal forces",
|
||||
],
|
||||
"Instrumented testing exposed the deadly design flaw",
|
||||
)
|
||||
|
||||
# Slide 7: Engineering Response
|
||||
add_content_slide(
|
||||
"The Engineering Response",
|
||||
[
|
||||
"1998: Immediate depowering (20-35% force reduction)",
|
||||
"Dual-stage inflators: Variable deployment force",
|
||||
"Occupant classification: Weight sensors in seats",
|
||||
"Suppression systems: Turn off for rear-facing child seats",
|
||||
"Multi-stage deployment: Match force to crash severity",
|
||||
"Result: Deaths dropped from 50+/year to near zero",
|
||||
],
|
||||
"Every solution required new testing with instrumented dummies",
|
||||
)
|
||||
|
||||
# Slide 8: DTS Connection - Airbags
|
||||
add_content_slide(
|
||||
"The DTS Connection",
|
||||
[
|
||||
"OOP testing requires precise measurements in small packages",
|
||||
"Forces on child dummy necks",
|
||||
"Acceleration of infant heads",
|
||||
"Chest deflection of 5th percentile female",
|
||||
"DTS accelerometers in CRABI infant dummy",
|
||||
"DTS DAQ captures millisecond-by-millisecond events",
|
||||
],
|
||||
"Without this data: No depowering. No dual-stage. More dead children.",
|
||||
)
|
||||
|
||||
# Slide 9: Story 2 - Small Overlap
|
||||
add_story_headline_slide(
|
||||
"Luxury Cars Fail New Crash Test",
|
||||
"2012 Small Overlap Shock - Premium brands exposed",
|
||||
)
|
||||
|
||||
# Slide 10: The Results
|
||||
add_two_column_slide(
|
||||
"The 2012 Small Overlap Results",
|
||||
"FAILED (Marginal/Poor)",
|
||||
[
|
||||
"BMW 5-Series: Marginal",
|
||||
"Mercedes C-Class: Marginal",
|
||||
"Audi A4: Marginal",
|
||||
"Lexus ES: Poor",
|
||||
"Volkswagen Passat: Marginal",
|
||||
"",
|
||||
"Only 3 of 13 midsize cars",
|
||||
"earned 'Good' rating",
|
||||
],
|
||||
"WHY THEY FAILED",
|
||||
[
|
||||
"Structure bypassed main rails",
|
||||
"Wheels pushed into footwell",
|
||||
"Firewalls collapsed",
|
||||
"Steering columns displaced",
|
||||
"Feet trapped in crushed metal",
|
||||
"",
|
||||
"The dummies told the story:",
|
||||
"HIC exceeded limits, leg loads critical",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 11: Industry Response
|
||||
add_content_slide(
|
||||
"The Industry Response",
|
||||
[
|
||||
"Fundamental redesign of front structures",
|
||||
"Small overlap-specific load paths added",
|
||||
"Extended bumper beams",
|
||||
"Reinforced A-pillars",
|
||||
"Modified wheel well geometry",
|
||||
"By 2015: Most vehicles earning 'Good' ratings",
|
||||
],
|
||||
"Every redesign validated with crash testing and instrumented dummies",
|
||||
)
|
||||
|
||||
# Slide 12: Story 3 - Football
|
||||
add_story_headline_slide(
|
||||
"The Sport That Was Killing Players",
|
||||
"1960s-70s: 32 football deaths per year from head injuries",
|
||||
)
|
||||
|
||||
# Slide 13: NOCSAE Solution
|
||||
add_content_slide(
|
||||
"The NOCSAE Solution",
|
||||
[
|
||||
"1969: National Operating Committee formed",
|
||||
"Developed the drop test: Helmeted headform from 60 inches",
|
||||
"Instrumented with accelerometers",
|
||||
"Metric: Severity Index (SI) < 1200",
|
||||
"Simple. Repeatable. Science-based.",
|
||||
"Standard mandated in 1980",
|
||||
],
|
||||
"A measurement standard that would actually prevent deaths",
|
||||
)
|
||||
|
||||
# Slide 14: Football Results
|
||||
add_graph_placeholder_slide(
|
||||
"Football Fatalities: Before and After",
|
||||
"Graph: Deaths per year - 32 (1970) dropping to 8 (1980) to 3 (2020)",
|
||||
"90% reduction in fatalities - from helmets validated with instrumented testing",
|
||||
)
|
||||
|
||||
# Slide 15: Section - Part 2
|
||||
add_section_slide("PART 2", "Customers You Didn't Know You Had")
|
||||
|
||||
# Slide 16: Surprising Applications Overview
|
||||
add_content_slide(
|
||||
"DTS Equipment: Beyond Automotive",
|
||||
[
|
||||
"Military: WIAMan dummy for IED underbody blast",
|
||||
"Space: Astronaut protection during landing",
|
||||
"Theme Parks: Roller coaster acceleration limits",
|
||||
"Medical Devices: Implant impact testing",
|
||||
"Sports: Helmet certification across all sports",
|
||||
"Research: University biomechanics labs worldwide",
|
||||
],
|
||||
"Same measurement principles - different life-saving applications",
|
||||
)
|
||||
|
||||
# Slide 17: WIAMan
|
||||
add_content_slide(
|
||||
"Military: The WIAMan Dummy",
|
||||
[
|
||||
"IEDs send blast forces up through vehicle floors",
|
||||
"Traditional dummies designed for horizontal impact",
|
||||
"WIAMan: Warrior Injury Assessment Manikin",
|
||||
"Specifically designed for underbody blast",
|
||||
"DTS partnership: Instrumentation for lumbar spine loads",
|
||||
"Protecting soldiers' backs from being broken",
|
||||
],
|
||||
"Not automotive - but the same mission: Use data to save lives",
|
||||
)
|
||||
|
||||
# Slide 18: Common Thread
|
||||
add_connection_slide(
|
||||
"The Common Thread",
|
||||
[
|
||||
"Dynamic Event",
|
||||
"Precise Measurement",
|
||||
"Data Analysis",
|
||||
"Engineering Decision",
|
||||
"Lives Saved",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 19: Section - Part 3
|
||||
add_section_slide("PART 3", "Good Data Enables Good Decisions")
|
||||
|
||||
# Slide 20: Good vs Bad Data
|
||||
add_two_column_slide(
|
||||
"Data Quality: Why It Matters",
|
||||
"GOOD DATA",
|
||||
[
|
||||
"Clean pre-trigger baseline",
|
||||
"Appropriate CFC filtering",
|
||||
"Clear signal, no saturation",
|
||||
"Proper sensor range",
|
||||
"No zero shift after impact",
|
||||
"No cable artifacts",
|
||||
"",
|
||||
"= Data you can trust",
|
||||
"= Good engineering decisions",
|
||||
],
|
||||
"BAD DATA",
|
||||
[
|
||||
"Saturated signal (overranged)",
|
||||
"Excessive noise/interference",
|
||||
"Zero shift (baseline moved)",
|
||||
"Cable yanked = false spike",
|
||||
"Resonance artifacts",
|
||||
"Missing channels",
|
||||
"",
|
||||
"= Data you cannot trust",
|
||||
"= Dangerous decisions",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 21: Your Decisions Matter
|
||||
add_content_slide(
|
||||
"Why This Matters for Your Work",
|
||||
[
|
||||
"Sensor range selection: Will customers saturate?",
|
||||
"Mounting design: Will they get resonance artifacts?",
|
||||
"Calibration procedures: What's the accuracy baseline?",
|
||||
"Cable design: Will it survive the test?",
|
||||
"Software algorithms: Is filtering correct?",
|
||||
"",
|
||||
"Your decisions affect every test run with our equipment",
|
||||
],
|
||||
"These aren't abstract - they determine if engineers can trust the data",
|
||||
)
|
||||
|
||||
# Slide 22: Ripple Effect
|
||||
add_connection_slide(
|
||||
"The Ripple Effect of Your Work",
|
||||
[
|
||||
"DTS Product",
|
||||
"Customer Test",
|
||||
"Vehicle Design",
|
||||
"1M Vehicles Built",
|
||||
"Millions Protected",
|
||||
],
|
||||
)
|
||||
|
||||
# Slide 23: Section - Closing
|
||||
add_section_slide("CLOSING", "Remember the Why")
|
||||
|
||||
# Slide 24: Real Customers
|
||||
add_content_slide(
|
||||
"The Real Customers",
|
||||
[
|
||||
"Not the test lab",
|
||||
"Not the automotive OEM",
|
||||
"Not the government regulator",
|
||||
"",
|
||||
"The real customers are the people who will sit",
|
||||
"in vehicles designed using our data",
|
||||
"",
|
||||
"They don't know our name - but their lives depend on us",
|
||||
],
|
||||
"Families. Children. Commuters. Soldiers. Athletes.",
|
||||
)
|
||||
|
||||
# Slide 25: Work Isn't Done
|
||||
add_content_slide(
|
||||
"The Work Isn't Done",
|
||||
[
|
||||
"Electric vehicles: Battery integrity, high-voltage safety",
|
||||
"Autonomous vehicles: Active safety validation",
|
||||
"Pedestrians & cyclists: Rising fatalities need solutions",
|
||||
"Military: Evolving threats require new testing",
|
||||
"Sports: Brain injury mechanisms still being discovered",
|
||||
"",
|
||||
"Every challenge will require new instrumentation, new data",
|
||||
],
|
||||
"New challenges for the next generation of DTS products",
|
||||
)
|
||||
|
||||
# Slide 26: Final Quote
|
||||
add_quote_slide(
|
||||
"Every channel of data tells a story. Make sure it's accurate enough to save a life."
|
||||
)
|
||||
|
||||
# Slide 27: Questions
|
||||
add_title_slide("Questions?", "Ben - Application Engineer | [email]")
|
||||
|
||||
# ============================================================================
|
||||
# Save the presentation
|
||||
# ============================================================================
|
||||
|
||||
output_file = "The_Stories_Our_Data_Tells.pptx"
|
||||
prs.save(output_file)
|
||||
print(f"Presentation created: {output_file}")
|
||||
print(f"Total slides: {len(prs.slides)}")
|
||||
603
The_Stories_Our_Data_Tells/script_and_speaker_notes.md
Normal file
@@ -0,0 +1,603 @@
|
||||
# The Stories Our Data Tells
|
||||
## How DTS Helps Save Lives
|
||||
### A 45-Minute Presentation for DTS Internal Staff
|
||||
|
||||
---
|
||||
|
||||
# PRESENTATION OVERVIEW
|
||||
|
||||
**Presenter:** Ben, Application Engineer
|
||||
**Audience:** DTS engineering and internal staff
|
||||
**Duration:** 45 minutes
|
||||
**Goal:** Inspire pride in DTS's mission, show real-world impact, inform future engineering decisions
|
||||
|
||||
**Key Themes:**
|
||||
1. Every data channel represents a human life
|
||||
2. Good data enables good engineering decisions
|
||||
3. DTS equipment is part of a global life-saving mission
|
||||
4. The work isn't done - new challenges await
|
||||
|
||||
---
|
||||
|
||||
# SLIDE-BY-SLIDE SCRIPT AND SPEAKER NOTES
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 1: Title Slide
|
||||
**Title:** The Stories Our Data Tells
|
||||
**Subtitle:** How DTS Helps Save Lives
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Walk to center stage, pause, make eye contact with audience]*
|
||||
>
|
||||
> Good morning everyone. I'm Ben, and I've spent the last [X] years as a field application engineer, which means I get to see something most of you don't - I get to see what happens to our equipment after it leaves this building.
|
||||
>
|
||||
> Today I want to share some stories with you. Not technical specifications or product roadmaps - stories. Because behind every data channel we design, every product we ship, every calibration we perform... there's a human story.
|
||||
>
|
||||
> Let me start with a number.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 2: The Number That Matters
|
||||
**Visual:** Large "117,000" in center
|
||||
**Subtitle:** Lives saved every year in the U.S. alone
|
||||
|
||||
### Speaker Notes:
|
||||
> One hundred seventeen thousand.
|
||||
>
|
||||
> That's how many people are alive today, this year, who would have died on American roads if we still had 1970s vehicle safety.
|
||||
>
|
||||
> In 1970, the fatality rate was 4.7 deaths per 100 million vehicle miles traveled. Today it's about 1.1. Same roads. More cars. More miles. But 77% fewer deaths per mile driven.
|
||||
>
|
||||
> *[Pause]*
|
||||
>
|
||||
> That didn't happen by accident. It happened because of data. Data that came from instrumentation. Instrumentation that companies like DTS build.
|
||||
>
|
||||
> Every accelerometer we ship, every data acquisition system we calibrate, every channel of data we help capture - it's part of this.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 3: A Crashed Car is Gone Forever
|
||||
**Visual:** Photo of crashed test vehicle
|
||||
**Quote:** "A crashed car is destroyed in milliseconds. The data is what remains."
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's something I tell customers all the time: A crashed car is gone forever. In about 150 milliseconds, a $50,000 test vehicle becomes scrap metal.
|
||||
>
|
||||
> But the data? The data lives on. The data gets analyzed, debated, published. The data drives regulation. The data changes designs. The data saves the next generation of occupants.
|
||||
>
|
||||
> That's what we do. We're not just building data acquisition systems. We're building the memory of every crash test ever run.
|
||||
>
|
||||
> Let me show you what I mean with three stories from the field.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 4: Part 1 - The Headlines
|
||||
**Visual:** Section divider
|
||||
**Title:** PART 1: The Data Behind the Headlines
|
||||
|
||||
### Speaker Notes:
|
||||
> You've all seen safety recalls in the news. You've seen crash test ratings. You've maybe heard about the airbag crisis or the Ford Explorer rollovers.
|
||||
>
|
||||
> What you might not know is that behind every one of those headlines, there's data. Specific data. Data channels that revealed what was happening. Data that DTS equipment helped capture.
|
||||
>
|
||||
> Let me take you behind three headlines.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 5: Story 1 - The Airbag That Killed
|
||||
**Visual:** Newspaper headline - "Airbag Kills Child in Minor Crash"
|
||||
**Subtitle:** 1990s Airbag Crisis
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Pause for effect]*
|
||||
>
|
||||
> 1996. A mother is driving her 6-year-old daughter to school. They're rear-ended at maybe 15 miles per hour. A minor fender-bender.
|
||||
>
|
||||
> The airbag deploys. The child, sitting in the front seat, is killed instantly.
|
||||
>
|
||||
> This wasn't a freak accident. Between 1990 and 1997, airbags killed over 175 people - mostly children and small adults. The very safety device designed to save them was killing them.
|
||||
>
|
||||
> The question everyone was asking: Why?
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 6: What the Data Revealed
|
||||
**Visual:** Data trace showing airbag deployment force - high spike
|
||||
**Annotation:** Peak inflation force, deployment timing
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's what the data showed.
|
||||
>
|
||||
> *[Point to trace]*
|
||||
>
|
||||
> This is an airbag deployment trace. Look at that spike. Early airbags were designed for one scenario: an unbelted 50th percentile male in a 30 mph crash. They inflated with explosive force - about 200 mph.
|
||||
>
|
||||
> But who was actually getting hit by these airbags? Children. Small women. People sitting too close to the steering wheel.
|
||||
>
|
||||
> The data from out-of-position testing - using accelerometers like ours in small female dummies and child dummies - showed neck loads that were off the charts. Loads that would kill.
|
||||
>
|
||||
> This data drove everything that came next.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 7: The Engineering Response
|
||||
**Visual:** Diagram of multi-stage airbag system
|
||||
**Bullet points:** Depowered bags, dual-stage inflators, occupant classification, suppression systems
|
||||
|
||||
### Speaker Notes:
|
||||
> The engineering response was comprehensive:
|
||||
>
|
||||
> First, immediate depowering - reducing inflation force by 20-35%. This happened in 1998.
|
||||
>
|
||||
> Then, dual-stage inflators that could vary deployment force based on crash severity.
|
||||
>
|
||||
> Then, occupant classification systems - weight sensors in seats that detect if a child or small adult is present.
|
||||
>
|
||||
> Then, suppression systems that turn off the airbag entirely for rear-facing child seats.
|
||||
>
|
||||
> Every single one of these solutions required new testing. New test protocols. New instrumentation. New data channels.
|
||||
>
|
||||
> *[Pause]*
|
||||
>
|
||||
> And it worked. Airbag-related fatalities dropped from over 50 per year to near zero.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 8: The DTS Connection
|
||||
**Visual:** Photo of CRABI infant dummy or small female dummy with DTS instrumentation
|
||||
**Caption:** DTS accelerometers in out-of-position testing
|
||||
|
||||
### Speaker Notes:
|
||||
> Where does DTS fit in?
|
||||
>
|
||||
> Out-of-position testing requires precise measurements in very small packages. The forces on a child dummy's neck. The acceleration of an infant's head. The chest deflection of a 5th percentile female.
|
||||
>
|
||||
> These measurements need to be accurate, repeatable, and small enough to fit in small dummies without affecting their biofidelity.
|
||||
>
|
||||
> That's what we do. Our accelerometers are in the CRABI infant dummy. Our data acquisition systems capture the millisecond-by-millisecond record of what happens when an airbag meets an out-of-position occupant.
|
||||
>
|
||||
> Without that data, there's no depowering. There's no dual-stage inflator. There's no occupant classification. And there are more dead children.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 9: Story 2 - The Luxury Car That Failed
|
||||
**Visual:** IIHS Small Overlap test photo - crumpled luxury vehicle
|
||||
**Subtitle:** The 2012 Small Overlap Shock
|
||||
|
||||
### Speaker Notes:
|
||||
> Let's move to story two. This one might surprise you.
|
||||
>
|
||||
> 2012. The Insurance Institute for Highway Safety introduces a new test: the small overlap frontal crash. Twenty-five percent overlap, rigid barrier, 40 miles per hour.
|
||||
>
|
||||
> The industry assumed their vehicles would do fine. After all, they'd been acing the moderate overlap test for years. Mercedes, BMW, Audi - surely they'd pass.
|
||||
>
|
||||
> *[Pause]*
|
||||
>
|
||||
> They didn't.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 10: The Results
|
||||
**Visual:** Table showing 2012 small overlap results
|
||||
- BMW 5-Series: Marginal
|
||||
- Mercedes C-Class: Marginal
|
||||
- Audi A4: Marginal
|
||||
- Lexus ES: Poor
|
||||
|
||||
### Speaker Notes:
|
||||
> Look at this list. BMW 5-Series - Marginal. Mercedes C-Class - Marginal. Audi A4 - Marginal. Lexus ES - Poor.
|
||||
>
|
||||
> These are some of the most expensive, most prestigious vehicles on the road. And they failed a crash test.
|
||||
>
|
||||
> Only 3 of 13 midsize cars earned "Good" in the first round of testing.
|
||||
>
|
||||
> This was a wake-up call for the entire industry.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 11: What the Data Showed
|
||||
**Visual:** Comparison - good structure vs. poor structure (intrusion data)
|
||||
**Annotation:** Firewall intrusion, footwell collapse, steering column displacement
|
||||
|
||||
### Speaker Notes:
|
||||
> What did the data show?
|
||||
>
|
||||
> *[Point to comparison]*
|
||||
>
|
||||
> On the left: a vehicle with good small overlap performance. The crash structure engages, absorbs energy, and the occupant compartment stays intact.
|
||||
>
|
||||
> On the right: a vehicle that failed. See how the structure bypasses the main longitudinal rails? The wheel gets pushed back. The firewall collapses. The footwell crushes. The steering column displaces into the occupant.
|
||||
>
|
||||
> The dummies - instrumented with accelerometers and load cells - told the story. Head injury numbers through the roof. Leg loads exceeding injury thresholds. Feet trapped in crushed footwells.
|
||||
>
|
||||
> This wasn't visible from looking at the car. You had to see the data.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 12: The Industry Response
|
||||
**Visual:** Before/after structural diagrams showing redesigned front end
|
||||
**Caption:** Structural redesigns across the industry
|
||||
|
||||
### Speaker Notes:
|
||||
> The industry response was massive. And fast.
|
||||
>
|
||||
> Within two years, automakers fundamentally redesigned their front structures. They added small overlap-specific load paths. They extended the bumper beam. They reinforced the A-pillar. They changed the wheel well geometry.
|
||||
>
|
||||
> By 2015, most vehicles were earning "Good" ratings. But it required a complete rethink of frontal crash structure.
|
||||
>
|
||||
> And every one of those redesigned vehicles was validated with crash testing. With instrumented dummies. With data channels.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 13: Story 3 - The Sport That Was Killing Its Players
|
||||
**Visual:** Vintage football photo - leather helmets
|
||||
**Subtitle:** Football's Deadly Secret
|
||||
|
||||
### Speaker Notes:
|
||||
> Let's step outside automotive for our third story.
|
||||
>
|
||||
> In the 1960s and early 1970s, American football was killing its players. Not occasionally - regularly. An average of 32 players died each year from head and neck injuries.
|
||||
>
|
||||
> Thirty-two funerals. Every year. High school kids. College students. Professional athletes. All dead from a sport.
|
||||
>
|
||||
> Helmets existed. They just didn't work.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 14: The NOCSAE Solution
|
||||
**Visual:** Drop tower test equipment
|
||||
**Caption:** NOCSAE drop test - the standard that changed everything
|
||||
|
||||
### Speaker Notes:
|
||||
> In 1969, the National Operating Committee on Standards for Athletic Equipment - NOCSAE - was formed. Their mission: create a helmet standard that would actually prevent deaths.
|
||||
>
|
||||
> They developed the drop test. A helmeted headform dropped from 60 inches onto various anvils. The headform instrumented with accelerometers.
|
||||
>
|
||||
> The metric they chose: Severity Index. An integral of acceleration over time, raised to the 2.5 power. If SI exceeded 1200, the helmet failed.
|
||||
>
|
||||
> It was simple. It was repeatable. And it worked.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 15: The Results
|
||||
**Visual:** Graph showing football fatalities before and after NOCSAE
|
||||
- 1970: ~32 deaths/year
|
||||
- 1980: ~8 deaths/year
|
||||
- 2020: ~3 deaths/year
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Point to graph]*
|
||||
>
|
||||
> Look at this curve.
|
||||
>
|
||||
> Pre-NOCSAE: 32 deaths per year.
|
||||
>
|
||||
> After the standard was mandated in 1980: deaths dropped to single digits.
|
||||
>
|
||||
> Today: typically 3 or fewer deaths per year from head/neck trauma in football.
|
||||
>
|
||||
> That's a 90% reduction. Not from rule changes. Not from better coaching. From better helmets - helmets validated with instrumented testing.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 16: The DTS Connection
|
||||
**Visual:** Linear impactor test setup / helmet testing equipment
|
||||
**Caption:** Modern helmet testing - now including rotational metrics
|
||||
|
||||
### Speaker Notes:
|
||||
> DTS instrumentation is used in helmet testing facilities around the world.
|
||||
>
|
||||
> Our accelerometers are in the headforms. Our data acquisition systems capture the impact data. Our calibration standards ensure that a test run in Kansas gives the same result as a test run in Virginia.
|
||||
>
|
||||
> And the science keeps advancing. The original drop test measured linear acceleration. Today, we're adding rotational acceleration - because we now understand that concussions are caused by brain rotation, not just linear impact.
|
||||
>
|
||||
> That means new sensors. New data channels. New measurement techniques. The same DTS capabilities that serve automotive are now serving sports safety.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 17: Part 2 - Surprising Applications
|
||||
**Visual:** Section divider
|
||||
**Title:** PART 2: Customers You Didn't Know You Had
|
||||
|
||||
### Speaker Notes:
|
||||
> Those three stories - airbags, small overlap, football helmets - are the obvious ones. Automotive and sports. The things you'd expect.
|
||||
>
|
||||
> But DTS equipment shows up in places you might not expect. Let me give you a quick tour of some surprising applications.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 18: Military - The WIAMan Dummy
|
||||
**Visual:** WIAMan dummy in military vehicle
|
||||
**Caption:** Protecting soldiers from IED underbody blast
|
||||
|
||||
### Speaker Notes:
|
||||
> The military has a problem. IEDs - improvised explosive devices - are killing soldiers by sending blast forces up through vehicle floors.
|
||||
>
|
||||
> Traditional crash test dummies weren't designed for this. They measure horizontal impact, not vertical blast.
|
||||
>
|
||||
> So the Army developed WIAMan - the Warrior Injury Assessment Manikin. A dummy specifically designed for underbody blast assessment.
|
||||
>
|
||||
> *[Pause]*
|
||||
>
|
||||
> DTS was a key partner in developing WIAMan's instrumentation. Our accelerometers measure the lumbar spine loads that determine whether a soldier's back is broken. Our data acquisition systems capture the blast event.
|
||||
>
|
||||
> This isn't automotive. But it's the same mission: use data to save lives.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 19: Space - Astronaut Protection
|
||||
**Visual:** Space capsule splashdown or astronaut seat testing
|
||||
**Caption:** Crew return vehicle impact testing
|
||||
|
||||
### Speaker Notes:
|
||||
> When a space capsule returns to Earth, it hits the water - or land - hard. Potentially 15g or more of deceleration.
|
||||
>
|
||||
> How do you know if the astronauts will survive? You test. With instrumented dummies. With accelerometers. With data acquisition systems.
|
||||
>
|
||||
> DTS equipment has been used to validate crew seating in multiple space programs. The same measurement principles that protect car occupants protect astronauts returning from orbit.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 20: Theme Parks - Roller Coaster Safety
|
||||
**Visual:** Roller coaster or theme park ride
|
||||
**Caption:** Acceleration limits for amusement rides
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's one you might not expect: theme parks.
|
||||
>
|
||||
> Roller coasters are designed to create excitement through acceleration. But there are limits - exceed them, and you injure guests.
|
||||
>
|
||||
> ASTM standards specify acceleration limits for amusement rides. And how do you verify that a new roller coaster meets those limits? You instrument it. You measure the g-forces. You capture the data.
|
||||
>
|
||||
> Some theme parks use DTS equipment for this. Same accelerometers. Same data acquisition. Different application.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 21: Medical Devices - Implant Testing
|
||||
**Visual:** Medical device impact testing or spinal implant
|
||||
**Caption:** Validating devices that go inside human bodies
|
||||
|
||||
### Speaker Notes:
|
||||
> Medical devices like spinal implants or joint replacements experience repeated loading inside the body. Drop something? An impact load.
|
||||
>
|
||||
> Device manufacturers need to know: will this implant survive real-world conditions?
|
||||
>
|
||||
> Impact testing of medical devices uses the same principles as crash testing. Controlled impacts. Measured forces. Data analysis. Some of that testing uses DTS equipment.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 22: The Common Thread
|
||||
**Visual:** Graphic showing diverse applications connected to "PRECISE MEASUREMENT"
|
||||
**Caption:** Different industries. Same mission.
|
||||
|
||||
### Speaker Notes:
|
||||
> Automotive. Sports. Military. Space. Theme parks. Medical devices.
|
||||
>
|
||||
> What do they all have in common?
|
||||
>
|
||||
> They all need precise measurement of dynamic events. Events that happen in milliseconds. Events that determine whether someone lives or dies, walks or doesn't, returns from space or doesn't.
|
||||
>
|
||||
> That's what DTS does. We provide the measurement capability that enables safety engineering across all these fields.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 23: Part 3 - Engineering Impact
|
||||
**Visual:** Section divider
|
||||
**Title:** PART 3: Good Data Enables Good Decisions
|
||||
|
||||
### Speaker Notes:
|
||||
> Let me shift gears and talk directly to the engineers in the room.
|
||||
>
|
||||
> Everything I've shown you - the airbag fixes, the structural redesigns, the helmet improvements - all of it depends on one thing: good data.
|
||||
>
|
||||
> Bad data leads to bad decisions. And in safety engineering, bad decisions cost lives.
|
||||
>
|
||||
> Let me show you what I mean.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 24: What Good Data Looks Like
|
||||
**Visual:** Clean data trace with proper characteristics
|
||||
**Annotations:** Pre-trigger baseline, appropriate filter, clear signal, no saturation
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's what good data looks like.
|
||||
>
|
||||
> *[Point to features]*
|
||||
>
|
||||
> Clean pre-trigger baseline - the sensor was working before the event.
|
||||
>
|
||||
> Appropriate filtering - CFC 1000 for head acceleration, removing noise without distorting the signal.
|
||||
>
|
||||
> Clear signal - you can see exactly what happened, when it happened.
|
||||
>
|
||||
> No saturation - the sensor range was appropriate for the event.
|
||||
>
|
||||
> This is data you can trust. Data that can drive engineering decisions.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 25: What Bad Data Looks Like
|
||||
**Visual:** Problematic data traces
|
||||
**Examples:** Saturated signal, excessive noise, zero shift, cable artifact
|
||||
|
||||
### Speaker Notes:
|
||||
> And here's what bad data looks like.
|
||||
>
|
||||
> *[Point to examples]*
|
||||
>
|
||||
> Saturated signal - the accelerometer was overranged. We don't know what the actual peak was. Could have been 100g. Could have been 500g. We don't know.
|
||||
>
|
||||
> Excessive noise - either electrical interference or mechanical resonance. The real signal is buried in garbage.
|
||||
>
|
||||
> Zero shift - the sensor's baseline moved after impact. Every measurement after this point is wrong.
|
||||
>
|
||||
> Cable artifact - that spike isn't acceleration, it's the cable being yanked.
|
||||
>
|
||||
> *[Pause]*
|
||||
>
|
||||
> You cannot make good engineering decisions with bad data. If a customer makes a vehicle safer based on bad data, they might be making it more dangerous.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 26: Why This Matters for Your Work
|
||||
**Visual:** Product development cycle with "DATA QUALITY" highlighted
|
||||
**Caption:** Your decisions affect every test run with our equipment
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's why this matters for everyone in this room.
|
||||
>
|
||||
> Every design decision you make - sensor selection, cable design, data acquisition architecture, software algorithms, calibration procedures - affects the quality of data our customers collect.
|
||||
>
|
||||
> When you choose a sensor range, you're deciding whether customers will saturate.
|
||||
>
|
||||
> When you design a mounting system, you're determining whether they'll get resonance artifacts.
|
||||
>
|
||||
> When you write calibration procedures, you're setting the accuracy baseline for every test.
|
||||
>
|
||||
> These aren't abstract technical decisions. They're decisions that determine whether an engineer at GM or Toyota or BMW can trust the data. And trust the conclusions they draw from it.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 27: The Ripple Effect
|
||||
**Visual:** Diagram showing DTS product → Customer test → Vehicle design → Road safety
|
||||
**Caption:** Your work affects millions
|
||||
|
||||
### Speaker Notes:
|
||||
> Let me paint the picture.
|
||||
>
|
||||
> You design a product. That product goes to a customer. The customer runs a test. The test generates data. That data influences a design decision. That design goes into a vehicle. That vehicle is manufactured a million times. Those million vehicles protect millions of occupants.
|
||||
>
|
||||
> The ripple effect of your work is enormous. You might never see it. You might never know about it. But it's there.
|
||||
>
|
||||
> Every calibration. Every design review. Every manufacturing check. They all matter.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 28: Closing - The Human Element
|
||||
**Visual:** Section divider
|
||||
**Title:** CLOSING: Remember the Why
|
||||
|
||||
### Speaker Notes:
|
||||
> I want to close by bringing us back to the human element.
|
||||
>
|
||||
> It's easy to get lost in specifications. Sample rates. Filter classes. Calibration tolerances. These things matter - I've just told you why they matter.
|
||||
>
|
||||
> But let's not forget why we care about those specifications.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 29: The Real Customers
|
||||
**Visual:** Collage of real people - families, children, commuters
|
||||
**Caption:** These are the people we protect
|
||||
|
||||
### Speaker Notes:
|
||||
> These are our real customers.
|
||||
>
|
||||
> Not the test lab. Not the automotive OEM. Not the government regulator.
|
||||
>
|
||||
> The real customers are the people who will sit in the vehicles that get designed using our data. The children who ride in car seats validated with our instrumentation. The soldiers protected by armor tested with our equipment. The athletes wearing helmets certified with our measurement systems.
|
||||
>
|
||||
> They don't know our name. They don't know what DTS is. But their lives depend on us doing our jobs well.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 30: The Work Isn't Done
|
||||
**Visual:** Emerging challenges - EVs, autonomous vehicles, pedestrian safety
|
||||
**Caption:** New challenges require new solutions
|
||||
|
||||
### Speaker Notes:
|
||||
> And the work isn't done.
|
||||
>
|
||||
> Electric vehicles have different crash characteristics - battery integrity, high-voltage safety.
|
||||
>
|
||||
> Autonomous vehicles need validation of active safety systems in ways we're still figuring out.
|
||||
>
|
||||
> Pedestrian and cyclist fatalities are rising even as occupant fatalities fall - new protection challenges.
|
||||
>
|
||||
> Military threats evolve constantly.
|
||||
>
|
||||
> Sports science is discovering new mechanisms of brain injury.
|
||||
>
|
||||
> Every one of these challenges will require new testing. New instrumentation. New data. New solutions from companies like DTS.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 31: Final Thought
|
||||
**Visual:** Simple text on dark background
|
||||
**Quote:** "Every channel of data tells a story. Make sure it's accurate enough to save a life."
|
||||
|
||||
### Speaker Notes:
|
||||
> I'll leave you with this.
|
||||
>
|
||||
> Every channel of data tells a story. A story about what happened in a crash test. A story about forces and accelerations and human tolerance. A story that will be read by engineers making decisions about vehicle design.
|
||||
>
|
||||
> Make sure those stories are accurate. Make sure they're reliable. Make sure they're precise.
|
||||
>
|
||||
> Because somewhere, someday, a vehicle designed using data from our equipment will be in a crash. And the person inside will either walk away or they won't.
|
||||
>
|
||||
> That's the story our data tells. Let's make sure we're telling it right.
|
||||
>
|
||||
> Thank you.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 32: Questions
|
||||
**Visual:** "Questions?" with contact information
|
||||
**Caption:** Ben [Last Name], Application Engineer
|
||||
|
||||
### Speaker Notes:
|
||||
> I'm happy to take questions. And if you want to hear more stories from the field - the weird tests, the challenging customers, the equipment that survived things it shouldn't have - come find me. I've got plenty more.
|
||||
>
|
||||
> *[Open for Q&A]*
|
||||
|
||||
---
|
||||
|
||||
# APPENDIX: ADDITIONAL TALKING POINTS
|
||||
|
||||
## If Asked About Specific Products
|
||||
- Reference SLICE systems for in-dummy acquisition
|
||||
- Mention TDAS for vehicle-level data
|
||||
- Discuss calibration services and traceability
|
||||
|
||||
## If Asked About Competition
|
||||
- Focus on DTS advantages: reliability, size, support
|
||||
- Don't disparage competitors - redirect to customer mission
|
||||
|
||||
## If Asked About Future Technology
|
||||
- Discuss emerging measurement needs (rotational brain injury, EV testing)
|
||||
- Mention R&D initiatives if appropriate
|
||||
- Emphasize continuous improvement
|
||||
|
||||
## Backup Stories (if time permits)
|
||||
1. The test where the camera caught fire but DTS equipment kept recording
|
||||
2. The customer who found a design flaw 2 weeks before production
|
||||
3. The dummy that was dropped (accidentally) and the data that was recovered
|
||||
|
||||
---
|
||||
|
||||
# TIMING GUIDE
|
||||
|
||||
| Section | Duration | Cumulative |
|
||||
|---------|----------|------------|
|
||||
| Opening (Slides 1-3) | 5 min | 5 min |
|
||||
| Part 1 - Headlines (Slides 4-16) | 15 min | 20 min |
|
||||
| Part 2 - Surprising Applications (Slides 17-22) | 8 min | 28 min |
|
||||
| Part 3 - Engineering Impact (Slides 23-27) | 10 min | 38 min |
|
||||
| Closing (Slides 28-32) | 5 min | 43 min |
|
||||
| Q&A Buffer | 2 min | 45 min |
|
||||
|
||||
---
|
||||
|
||||
# EQUIPMENT/MATERIALS NEEDED
|
||||
|
||||
1. Projector/screen
|
||||
2. Clicker/remote
|
||||
3. (Optional) Physical sensor or dummy component to show
|
||||
4. (Optional) Short video clips of crash tests
|
||||
5. Water for speaker
|
||||
|
||||
---
|
||||
|
||||
*End of Script and Speaker Notes*
|
||||
BIN
When_the_Data_Surprised_Us/When_the_Data_Surprised_Us.pptx
Normal file
834
When_the_Data_Surprised_Us/create_presentation.py
Normal file
@@ -0,0 +1,834 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Create PowerPoint: When the Data Surprised Us
|
||||
Counterintuitive Findings from the Field - 45 minute internal presentation
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
from pptx import Presentation
|
||||
from pptx.util import Inches, Pt
|
||||
from pptx.dml.color import RGBColor
|
||||
from pptx.enum.text import PP_ALIGN, MSO_ANCHOR
|
||||
from pptx.enum.shapes import MSO_SHAPE
|
||||
|
||||
# Create presentation
|
||||
prs = Presentation()
|
||||
prs.slide_width = Inches(13.333)
|
||||
prs.slide_height = Inches(7.5)
|
||||
|
||||
# Color scheme - Engaging, puzzle-like feel
|
||||
DEEP_PURPLE = RGBColor(48, 25, 88) # Mystery color
|
||||
BRIGHT_TEAL = RGBColor(0, 168, 168) # Reveal color
|
||||
QUESTION_YELLOW = RGBColor(255, 200, 0) # Question accent
|
||||
DARK_GRAY = RGBColor(51, 51, 51)
|
||||
MED_GRAY = RGBColor(128, 128, 128)
|
||||
LIGHT_GRAY = RGBColor(235, 235, 235)
|
||||
WHITE = RGBColor(255, 255, 255)
|
||||
CORRECT_GREEN = RGBColor(46, 139, 87) # For good results
|
||||
WRONG_RED = RGBColor(178, 34, 34) # For bad results
|
||||
|
||||
|
||||
def add_title_slide(title, subtitle=""):
|
||||
"""Title slide with mystery theme"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DEEP_PURPLE
|
||||
bg.line.fill.background()
|
||||
|
||||
# Question marks decoration
|
||||
for i, pos in enumerate([(1, 1), (11, 1.5), (2, 5.5), (10, 5)]):
|
||||
q = slide.shapes.add_textbox(
|
||||
Inches(pos[0]), Inches(pos[1]), Inches(1.5), Inches(1.5)
|
||||
)
|
||||
tf = q.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = "?"
|
||||
p.font.size = Pt(72)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = RGBColor(80, 50, 120) # Slightly lighter purple
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2.5), Inches(12.333), Inches(1.5)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(52)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
if subtitle:
|
||||
sub_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(4.3), Inches(12.333), Inches(0.8)
|
||||
)
|
||||
tf = sub_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = subtitle
|
||||
p.font.size = Pt(26)
|
||||
p.font.color.rgb = BRIGHT_TEAL
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_puzzle_intro_slide(puzzle_num, title):
|
||||
"""Puzzle section introduction"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DEEP_PURPLE
|
||||
bg.line.fill.background()
|
||||
|
||||
# Puzzle number
|
||||
num_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2.5), Inches(12.333), Inches(1)
|
||||
)
|
||||
tf = num_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = f"PUZZLE {puzzle_num}"
|
||||
p.font.size = Pt(28)
|
||||
p.font.color.rgb = QUESTION_YELLOW
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Title
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(3.3), Inches(12.333), Inches(1.5)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(48)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_setup_slide(title, content_lines):
|
||||
"""Setup slide for puzzle - the scenario"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Header
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = DEEP_PURPLE
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(32)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
# Content
|
||||
content_box = slide.shapes.add_textbox(
|
||||
Inches(0.8), Inches(1.4), Inches(11.5), Inches(5.8)
|
||||
)
|
||||
tf = content_box.text_frame
|
||||
tf.word_wrap = True
|
||||
|
||||
for i, line in enumerate(content_lines):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = line
|
||||
p.font.size = Pt(24)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(12)
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_guess_slide(question):
|
||||
"""Interactive question slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = QUESTION_YELLOW
|
||||
bg.line.fill.background()
|
||||
|
||||
q_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(2.5), Inches(11.333), Inches(2.5)
|
||||
)
|
||||
tf = q_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = question
|
||||
p.font.size = Pt(40)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = DEEP_PURPLE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# "What do you think?" prompt
|
||||
prompt_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(5.5), Inches(11.333), Inches(0.8)
|
||||
)
|
||||
tf = prompt_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = "Take a guess..."
|
||||
p.font.size = Pt(24)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = DEEP_PURPLE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_reveal_slide(title, reveal_data, is_surprising=True):
|
||||
"""The big reveal slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Header - teal for reveal
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = BRIGHT_TEAL
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = "THE REVEAL: " + title
|
||||
p.font.size = Pt(28)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
# Reveal content
|
||||
reveal_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(1.5), Inches(11.333), Inches(5.5)
|
||||
)
|
||||
tf = reveal_box.text_frame
|
||||
tf.word_wrap = True
|
||||
|
||||
for i, line in enumerate(reveal_data):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = line
|
||||
p.font.size = Pt(26)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(16)
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_comparison_slide(
|
||||
title, left_title, left_data, left_result, right_title, right_data, right_result
|
||||
):
|
||||
"""Side-by-side comparison with results"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
# Header
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = BRIGHT_TEAL
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(28)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
# Left side
|
||||
left_box = slide.shapes.add_shape(
|
||||
MSO_SHAPE.ROUNDED_RECTANGLE, Inches(0.5), Inches(1.3), Inches(6), Inches(4.5)
|
||||
)
|
||||
left_box.fill.solid()
|
||||
left_box.fill.fore_color.rgb = LIGHT_GRAY
|
||||
left_box.line.color.rgb = CORRECT_GREEN if left_result == "GOOD" else WRONG_RED
|
||||
left_box.line.width = Pt(4)
|
||||
|
||||
left_title_box = slide.shapes.add_textbox(
|
||||
Inches(0.8), Inches(1.5), Inches(5.5), Inches(0.6)
|
||||
)
|
||||
tf = left_title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = left_title
|
||||
p.font.size = Pt(22)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
|
||||
left_data_box = slide.shapes.add_textbox(
|
||||
Inches(0.8), Inches(2.2), Inches(5.5), Inches(2.8)
|
||||
)
|
||||
tf = left_data_box.text_frame
|
||||
tf.word_wrap = True
|
||||
for i, line in enumerate(left_data):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = line
|
||||
p.font.size = Pt(18)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(6)
|
||||
|
||||
left_result_box = slide.shapes.add_textbox(
|
||||
Inches(0.8), Inches(5.2), Inches(5.5), Inches(0.5)
|
||||
)
|
||||
tf = left_result_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = left_result
|
||||
p.font.size = Pt(24)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = CORRECT_GREEN if left_result == "GOOD" else WRONG_RED
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Right side
|
||||
right_box = slide.shapes.add_shape(
|
||||
MSO_SHAPE.ROUNDED_RECTANGLE, Inches(6.833), Inches(1.3), Inches(6), Inches(4.5)
|
||||
)
|
||||
right_box.fill.solid()
|
||||
right_box.fill.fore_color.rgb = LIGHT_GRAY
|
||||
right_box.line.color.rgb = CORRECT_GREEN if right_result == "GOOD" else WRONG_RED
|
||||
right_box.line.width = Pt(4)
|
||||
|
||||
right_title_box = slide.shapes.add_textbox(
|
||||
Inches(7.1), Inches(1.5), Inches(5.5), Inches(0.6)
|
||||
)
|
||||
tf = right_title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = right_title
|
||||
p.font.size = Pt(22)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
|
||||
right_data_box = slide.shapes.add_textbox(
|
||||
Inches(7.1), Inches(2.2), Inches(5.5), Inches(2.8)
|
||||
)
|
||||
tf = right_data_box.text_frame
|
||||
tf.word_wrap = True
|
||||
for i, line in enumerate(right_data):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = line
|
||||
p.font.size = Pt(18)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(6)
|
||||
|
||||
right_result_box = slide.shapes.add_textbox(
|
||||
Inches(7.1), Inches(5.2), Inches(5.5), Inches(0.5)
|
||||
)
|
||||
tf = right_result_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = right_result
|
||||
p.font.size = Pt(24)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = CORRECT_GREEN if right_result == "GOOD" else WRONG_RED
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_lesson_slide(lesson_text):
|
||||
"""Key lesson from the puzzle"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = DEEP_PURPLE
|
||||
bg.line.fill.background()
|
||||
|
||||
# "LESSON" label
|
||||
label_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2.3), Inches(12.333), Inches(0.5)
|
||||
)
|
||||
tf = label_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = "THE LESSON"
|
||||
p.font.size = Pt(18)
|
||||
p.font.color.rgb = BRIGHT_TEAL
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
# Lesson text
|
||||
lesson_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(3), Inches(11.333), Inches(2.5)
|
||||
)
|
||||
tf = lesson_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = f'"{lesson_text}"'
|
||||
p.font.size = Pt(36)
|
||||
p.font.italic = True
|
||||
p.font.color.rgb = WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_content_slide(title, bullets):
|
||||
"""Standard content slide"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
header = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, Inches(1.0)
|
||||
)
|
||||
header.fill.solid()
|
||||
header.fill.fore_color.rgb = DEEP_PURPLE
|
||||
header.line.fill.background()
|
||||
|
||||
title_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(0.2), Inches(12), Inches(0.7)
|
||||
)
|
||||
tf = title_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = title
|
||||
p.font.size = Pt(32)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
|
||||
content_box = slide.shapes.add_textbox(
|
||||
Inches(0.8), Inches(1.4), Inches(11.5), Inches(5.8)
|
||||
)
|
||||
tf = content_box.text_frame
|
||||
tf.word_wrap = True
|
||||
|
||||
for i, bullet in enumerate(bullets):
|
||||
if i == 0:
|
||||
p = tf.paragraphs[0]
|
||||
else:
|
||||
p = tf.add_paragraph()
|
||||
p.text = f" {bullet}"
|
||||
p.font.size = Pt(22)
|
||||
p.font.color.rgb = DARK_GRAY
|
||||
p.space_after = Pt(14)
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
def add_stat_slide(stat, description):
|
||||
"""Big statistic reveal"""
|
||||
slide = prs.slides.add_slide(prs.slide_layouts[6])
|
||||
|
||||
bg = slide.shapes.add_shape(
|
||||
MSO_SHAPE.RECTANGLE, 0, 0, prs.slide_width, prs.slide_height
|
||||
)
|
||||
bg.fill.solid()
|
||||
bg.fill.fore_color.rgb = BRIGHT_TEAL
|
||||
bg.line.fill.background()
|
||||
|
||||
stat_box = slide.shapes.add_textbox(
|
||||
Inches(0.5), Inches(2), Inches(12.333), Inches(2)
|
||||
)
|
||||
tf = stat_box.text_frame
|
||||
p = tf.paragraphs[0]
|
||||
p.text = stat
|
||||
p.font.size = Pt(96)
|
||||
p.font.bold = True
|
||||
p.font.color.rgb = WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
desc_box = slide.shapes.add_textbox(
|
||||
Inches(1), Inches(4.3), Inches(11.333), Inches(1.5)
|
||||
)
|
||||
tf = desc_box.text_frame
|
||||
tf.word_wrap = True
|
||||
p = tf.paragraphs[0]
|
||||
p.text = description
|
||||
p.font.size = Pt(28)
|
||||
p.font.color.rgb = WHITE
|
||||
p.alignment = PP_ALIGN.CENTER
|
||||
|
||||
return slide
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# BUILD THE PRESENTATION
|
||||
# ============================================================================
|
||||
|
||||
# Slide 1: Title
|
||||
add_title_slide(
|
||||
"When the Data Surprised Us", "Counterintuitive Findings from the Field"
|
||||
)
|
||||
|
||||
# Slide 2: Rules
|
||||
add_content_slide(
|
||||
"The Rules of the Game",
|
||||
[
|
||||
"1. I'll show you a scenario",
|
||||
"2. You guess what happened",
|
||||
"3. I reveal the data",
|
||||
"4. We discuss why it matters",
|
||||
"",
|
||||
"Fair warning: Some of these will mess with your head.",
|
||||
"That's the point.",
|
||||
],
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# PUZZLE 1: The Beautiful Wreck
|
||||
# ============================================================================
|
||||
|
||||
add_puzzle_intro_slide("1", "The Beautiful Wreck")
|
||||
|
||||
add_setup_slide(
|
||||
"The Setup: Two Cars After Frontal Crash Tests",
|
||||
[
|
||||
"Same test. Same speed. Same barrier.",
|
||||
"",
|
||||
"CAR A: Destroyed. Front end pushed back almost to firewall.",
|
||||
" Hood crumpled like paper. Looks catastrophic.",
|
||||
"",
|
||||
"CAR B: Relatively intact. Minimal visible damage.",
|
||||
" Structure held. Passenger compartment looks good.",
|
||||
],
|
||||
)
|
||||
|
||||
add_guess_slide("Which car would you rather be in during a crash?")
|
||||
|
||||
add_comparison_slide(
|
||||
"The Reveal: Appearances Deceive",
|
||||
"CAR A (Destroyed)",
|
||||
[
|
||||
"HIC: 485",
|
||||
"Chest deflection: 38mm",
|
||||
"Femur load: 4.2 kN",
|
||||
"",
|
||||
"All measurements well within limits",
|
||||
],
|
||||
"GOOD",
|
||||
"CAR B (Intact)",
|
||||
[
|
||||
"HIC: 890",
|
||||
"Chest deflection: 58mm",
|
||||
"Femur load: 9.1 kN",
|
||||
"",
|
||||
"Multiple measurements near limits",
|
||||
],
|
||||
"MARGINAL",
|
||||
)
|
||||
|
||||
add_content_slide(
|
||||
"Why This Happens",
|
||||
[
|
||||
"Crush zones are SUPPOSED to crush",
|
||||
"That's their job - absorb energy by deforming",
|
||||
"",
|
||||
"Car A: Crumpled beautifully, extended deceleration pulse",
|
||||
" More time to slow down = less force on occupant",
|
||||
"",
|
||||
"Car B: Too stiff, didn't crumple enough",
|
||||
" Short, sharp deceleration = wall of g-forces",
|
||||
"",
|
||||
"Looking at the car tells you nothing about safety",
|
||||
],
|
||||
)
|
||||
|
||||
add_lesson_slide(
|
||||
"Never judge a crash by looking at the car. Judge it by looking at the data."
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# PUZZLE 2: The Survivor's Paradox
|
||||
# ============================================================================
|
||||
|
||||
add_puzzle_intro_slide("2", "The Survivor's Paradox")
|
||||
|
||||
add_setup_slide(
|
||||
"The Setup: The Rollover Problem",
|
||||
[
|
||||
"Rollovers are only 3% of crashes",
|
||||
"But they account for 33% of fatalities",
|
||||
"",
|
||||
"The obvious solution: Stronger roofs!",
|
||||
"",
|
||||
"In 2009, NHTSA doubled the roof crush requirement:",
|
||||
"From 1.5× vehicle weight to 3× vehicle weight",
|
||||
],
|
||||
)
|
||||
|
||||
add_guess_slide("How much did stronger roofs reduce rollover fatalities?")
|
||||
|
||||
add_reveal_slide(
|
||||
"Essentially Unchanged",
|
||||
[
|
||||
"Despite DOUBLING roof strength requirements...",
|
||||
"",
|
||||
"Rollover fatalities: Barely moved",
|
||||
"",
|
||||
"How is that possible?",
|
||||
"Wasn't roof crush the problem?",
|
||||
],
|
||||
)
|
||||
|
||||
add_content_slide(
|
||||
"The Data Revealed the Real Problem",
|
||||
[
|
||||
"70%+ of rollover fatalities involve EJECTION",
|
||||
"",
|
||||
"Occupants weren't killed by roof crushing",
|
||||
"They were killed by being thrown from the vehicle",
|
||||
"",
|
||||
"Once outside: Ground. Other cars. Poles.",
|
||||
"The vehicle itself rolling over them.",
|
||||
"",
|
||||
"Roof crush was secondary. Ejection was primary.",
|
||||
],
|
||||
)
|
||||
|
||||
add_content_slide(
|
||||
"The Real Solution",
|
||||
[
|
||||
"Side curtain airbags with rollover sensors",
|
||||
"Stay inflated for 5-6 seconds through multiple rolls",
|
||||
"Keep occupants INSIDE the vehicle",
|
||||
"",
|
||||
"Result: 41% reduction in ejection",
|
||||
"",
|
||||
"The data pointed to a completely different solution",
|
||||
"than the intuitive one",
|
||||
],
|
||||
)
|
||||
|
||||
add_lesson_slide(
|
||||
"The obvious solution isn't always the right solution. Let the data tell you what's actually happening."
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# PUZZLE 3: The Luxury Failure
|
||||
# ============================================================================
|
||||
|
||||
add_puzzle_intro_slide("3", "The Luxury Failure")
|
||||
|
||||
add_setup_slide(
|
||||
"The Setup: Premium Brands",
|
||||
[
|
||||
"BMW. Mercedes-Benz. Audi. Lexus.",
|
||||
"",
|
||||
"Most expensive cars on the road",
|
||||
"Most prestigious brands in the world",
|
||||
"Decades of safety engineering",
|
||||
"",
|
||||
"All passed moderate overlap test with flying colors",
|
||||
"",
|
||||
"2012: IIHS introduces small overlap test",
|
||||
"25% overlap instead of 40%. Rigid barrier.",
|
||||
],
|
||||
)
|
||||
|
||||
add_guess_slide("How did the luxury brands perform?")
|
||||
|
||||
add_content_slide(
|
||||
"The Results",
|
||||
[
|
||||
"BMW 5-Series: MARGINAL",
|
||||
"Mercedes C-Class: MARGINAL",
|
||||
"Audi A4: MARGINAL",
|
||||
"Lexus ES 350: POOR",
|
||||
"",
|
||||
"Only 3 of 13 midsize cars earned 'Good'",
|
||||
"",
|
||||
"The most expensive vehicles on the road",
|
||||
"couldn't pass a new crash test",
|
||||
],
|
||||
)
|
||||
|
||||
add_content_slide(
|
||||
"What the Data Showed",
|
||||
[
|
||||
"Crash forces bypassed main structural rails",
|
||||
"Wheels pushed back into footwells",
|
||||
"Firewalls collapsed",
|
||||
"Steering columns displaced into occupants",
|
||||
"",
|
||||
"Dummy data: Elevated HIC, critical femur loads,",
|
||||
"feet trapped in crushed metal",
|
||||
"",
|
||||
"Engineered for the 40% test. Vulnerable at 25%.",
|
||||
],
|
||||
)
|
||||
|
||||
add_lesson_slide(
|
||||
"Engineering to pass a test is not the same as engineering for safety."
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# PUZZLE 4: The 46.2g Man
|
||||
# ============================================================================
|
||||
|
||||
add_puzzle_intro_slide("4", "The 46.2g Man")
|
||||
|
||||
add_setup_slide(
|
||||
"The Setup: 1954",
|
||||
[
|
||||
"The jet age is dawning. Pilots flying faster than ever.",
|
||||
"Many are dying - not from crashes, from ejections.",
|
||||
"",
|
||||
"Medical authorities believed:",
|
||||
"'Humans cannot survive more than 18g of deceleration'",
|
||||
"",
|
||||
"If true, high-speed ejection was a death sentence.",
|
||||
"",
|
||||
"One researcher decided to test this assumption.",
|
||||
"Not with dummies. With himself.",
|
||||
],
|
||||
)
|
||||
|
||||
add_content_slide(
|
||||
"Colonel John Paul Stapp",
|
||||
[
|
||||
"Air Force flight surgeon",
|
||||
"The bravest - or craziest - researcher in safety history",
|
||||
"",
|
||||
"Strapped himself into a rocket sled",
|
||||
"Ran test after test, pushing higher g-forces",
|
||||
"",
|
||||
"December 10, 1954:",
|
||||
"The ultimate test",
|
||||
],
|
||||
)
|
||||
|
||||
add_stat_slide(
|
||||
"46.2g", "632 mph to zero in 1.4 seconds\nMore than 2.5× the 'fatal' threshold"
|
||||
)
|
||||
|
||||
add_content_slide(
|
||||
"He Survived",
|
||||
[
|
||||
"Walked away - temporarily blinded",
|
||||
"Burst blood vessels in his eyes",
|
||||
"But alive and conscious",
|
||||
"",
|
||||
"Proved humans could survive far more than believed",
|
||||
"Revolutionized aviation safety",
|
||||
"Made ejection seats viable at higher speeds",
|
||||
"",
|
||||
"Laid the foundation for automotive crash testing:",
|
||||
"How do we design so occupants never exceed their limits?",
|
||||
],
|
||||
)
|
||||
|
||||
add_lesson_slide("Assumptions are not data. Test it. Measure it. Know for certain.")
|
||||
|
||||
# ============================================================================
|
||||
# PUZZLE 5: The Airbag Arms Race
|
||||
# ============================================================================
|
||||
|
||||
add_puzzle_intro_slide("5", "The Airbag Arms Race")
|
||||
|
||||
add_setup_slide(
|
||||
"The Setup: Airbag History",
|
||||
[
|
||||
"1970: Airbags first proposed",
|
||||
"1984: First automatic restraint requirements",
|
||||
"1998: Airbags mandatory in all vehicles",
|
||||
"2000s: 'Advanced' airbags with occupant classification",
|
||||
"",
|
||||
"Each generation more sophisticated:",
|
||||
"More sensors. More stages. More intelligence.",
|
||||
],
|
||||
)
|
||||
|
||||
add_guess_slide(
|
||||
"How much faster did airbag technology advance after mandates vs. before?"
|
||||
)
|
||||
|
||||
add_reveal_slide(
|
||||
"Regulation Created Innovation",
|
||||
[
|
||||
"Pre-mandate (1970-1984): Minimal innovation",
|
||||
"Why invest in something not required?",
|
||||
"",
|
||||
"Post-mandate: Explosion of patents and technology",
|
||||
"Multi-stage inflators, occupant sensors, position detection",
|
||||
"Side airbags, curtain airbags, knee airbags",
|
||||
"",
|
||||
"The regulation created the market",
|
||||
"The market drove innovation",
|
||||
"The innovation saved lives",
|
||||
],
|
||||
)
|
||||
|
||||
add_stat_slide(
|
||||
"~2,800",
|
||||
"Lives saved by airbags per year in the U.S.\nFrom zero in 1985 to thousands today",
|
||||
)
|
||||
|
||||
add_lesson_slide(
|
||||
"Measurement isn't just about understanding what happened. It's about enabling what comes next."
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
# CLOSING
|
||||
# ============================================================================
|
||||
|
||||
add_content_slide(
|
||||
"The Meta-Lesson",
|
||||
[
|
||||
"Beautiful Wreck: Crush zones work - deformation is safety",
|
||||
"Survivor's Paradox: Ejection, not crush, was the killer",
|
||||
"Luxury Failure: We'd optimized for the wrong test",
|
||||
"46.2g Man: Assumptions limited our designs",
|
||||
"Airbag Arms Race: Mandates drove innovation",
|
||||
"",
|
||||
"In every case, data didn't just describe - it ENABLED",
|
||||
"It pointed the way forward",
|
||||
],
|
||||
)
|
||||
|
||||
add_content_slide(
|
||||
"Implications for DTS",
|
||||
[
|
||||
"Our instrumentation is the source of these surprises",
|
||||
"",
|
||||
"When data contradicts expectations, it's because:",
|
||||
"Someone measured something that hadn't been measured",
|
||||
"Or measured it more precisely",
|
||||
"Or measured it in a new context",
|
||||
"",
|
||||
"Every sensor we design, every DAQ we build",
|
||||
"is potentially the source of the next breakthrough",
|
||||
],
|
||||
)
|
||||
|
||||
add_lesson_slide(
|
||||
"What assumptions are we making today that data will overturn tomorrow?"
|
||||
)
|
||||
|
||||
# Questions slide
|
||||
add_title_slide("Questions?", "Ben - Application Engineer")
|
||||
|
||||
# ============================================================================
|
||||
# Save
|
||||
# ============================================================================
|
||||
|
||||
output_file = "When_the_Data_Surprised_Us.pptx"
|
||||
prs.save(output_file)
|
||||
print(f"Presentation created: {output_file}")
|
||||
print(f"Total slides: {len(prs.slides)}")
|
||||
591
When_the_Data_Surprised_Us/script_and_speaker_notes.md
Normal file
@@ -0,0 +1,591 @@
|
||||
# When the Data Surprised Us
|
||||
## Counterintuitive Findings from the Field
|
||||
### A 45-Minute Presentation for DTS Internal Staff
|
||||
|
||||
---
|
||||
|
||||
# PRESENTATION OVERVIEW
|
||||
|
||||
**Presenter:** Ben, Application Engineer
|
||||
**Audience:** DTS engineering and internal staff
|
||||
**Duration:** 45 minutes
|
||||
**Goal:** Engage engineers with surprising stories, reinforce value of measurement, create memorable learning moments
|
||||
|
||||
**Key Themes:**
|
||||
1. Reality often contradicts expectations
|
||||
2. Data reveals what the eye cannot see
|
||||
3. Trust the data, not assumptions
|
||||
4. This is why rigorous measurement matters
|
||||
|
||||
**Tone:** Engaging, interactive, puzzle-like. Audience guessing before reveals.
|
||||
|
||||
---
|
||||
|
||||
# SLIDE-BY-SLIDE SCRIPT AND SPEAKER NOTES
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 1: Title Slide
|
||||
**Visual:** Question marks and data traces
|
||||
**Title:** When the Data Surprised Us
|
||||
**Subtitle:** Counterintuitive Findings from the Field
|
||||
|
||||
### Speaker Notes:
|
||||
> Welcome to my favorite presentation to give. This is the one where I get to be a game show host.
|
||||
>
|
||||
> Over the years in the field, I've seen things that made me say, "Wait, that can't be right." Results that defied expectations. Data that contradicted what everyone assumed.
|
||||
>
|
||||
> Today I'm going to share some of those stories. And I'm going to make you guess before I reveal the answer.
|
||||
>
|
||||
> Fair warning: Some of these will mess with your head. That's the point.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 2: The Rules of the Game
|
||||
**Visual:** Numbered list
|
||||
**Content:**
|
||||
1. I'll show you a scenario
|
||||
2. You guess what happened
|
||||
3. I reveal the data
|
||||
4. We discuss why it matters
|
||||
|
||||
### Speaker Notes:
|
||||
> Here are the rules.
|
||||
>
|
||||
> I'll show you a scenario. You'll have a few seconds to think about what you expect the data to show.
|
||||
>
|
||||
> Then I'll reveal what actually happened. Sometimes you'll be right. Often you won't.
|
||||
>
|
||||
> And then we'll talk about why it matters for the work we do.
|
||||
>
|
||||
> Ready? Let's go.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 3: Puzzle 1 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** PUZZLE 1: The Beautiful Wreck
|
||||
|
||||
### Speaker Notes:
|
||||
> Puzzle one. I call this one "The Beautiful Wreck."
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 4: The Setup - Two Cars
|
||||
**Visual:** Two post-crash photos side by side
|
||||
**Car A:** Severely crumpled front end, pushed back, visually destroyed
|
||||
**Car B:** Relatively intact, minimal visible damage
|
||||
|
||||
### Speaker Notes:
|
||||
> Here are two cars after frontal crash tests. Same test. Same speed. Same barrier.
|
||||
>
|
||||
> Car A - on the left - is destroyed. The front end is pushed back almost to the firewall. The hood is crumpled like paper. It looks catastrophic.
|
||||
>
|
||||
> Car B - on the right - looks pretty good. Some crumpling, sure, but the structure held. The passenger compartment looks intact.
|
||||
>
|
||||
> *[Pause]*
|
||||
>
|
||||
> Quick poll: Which car do you think had better occupant protection? Which car would you rather be in during a crash?
|
||||
>
|
||||
> *[Wait for audience response - most will say Car B]*
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 5: The Reveal
|
||||
**Visual:** Data comparison
|
||||
**Car A (destroyed):** HIC 485, Chest 38mm, Femur 4.2 kN - ALL GOOD
|
||||
**Car B (intact):** HIC 890, Chest 58mm, Femur 9.1 kN - MARGINAL/POOR
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Dramatic pause]*
|
||||
>
|
||||
> The destroyed car - Car A - had excellent dummy numbers. HIC of 485. Chest deflection of 38 millimeters. Femur load of 4.2 kilonewtons.
|
||||
>
|
||||
> The intact-looking car - Car B - had terrible dummy numbers. HIC of 890. Chest deflection of 58 millimeters. Femur load just under the injury threshold.
|
||||
>
|
||||
> *[Let this sink in]*
|
||||
>
|
||||
> You would rather be in the car that looked destroyed.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 6: Why This Happens
|
||||
**Visual:** Energy absorption diagram
|
||||
**Caption:** Crush zone is designed to absorb energy - that's the point
|
||||
|
||||
### Speaker Notes:
|
||||
> Why does this happen?
|
||||
>
|
||||
> Because crush zones are supposed to crush. That's their job. They absorb energy by deforming. The more they crumple, the more energy they absorb before it reaches the occupant.
|
||||
>
|
||||
> Car A crumpled beautifully. It extended the deceleration pulse. It gave the occupant more time to slow down. Less force on the body.
|
||||
>
|
||||
> Car B didn't crumple enough. It was too stiff. The deceleration pulse was short and sharp. The occupant hit a wall of g-forces.
|
||||
>
|
||||
> Looking at the car tells you nothing about occupant safety. Only the data does.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 7: The Lesson
|
||||
**Visual:** Quote
|
||||
**Text:** "Never judge a crash by looking at the car. Judge it by looking at the data."
|
||||
|
||||
### Speaker Notes:
|
||||
> The lesson: Never judge a crash by looking at the car.
|
||||
>
|
||||
> I've seen this mistake made by journalists writing about crash tests. "Look how much damage!" they say. And they conclude the car is unsafe.
|
||||
>
|
||||
> They've got it backwards. The damage is the safety. The crush zone did its job.
|
||||
>
|
||||
> This is why we need instrumentation. This is why we need data. Because what you see is not what matters.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 8: Puzzle 2 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** PUZZLE 2: The Survivor's Paradox
|
||||
|
||||
### Speaker Notes:
|
||||
> Puzzle two. The Survivor's Paradox.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 9: The Setup - Rollover Statistics
|
||||
**Visual:** Statistics
|
||||
**Text:** "Rollovers are only 3% of crashes, but account for 33% of fatalities"
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's a statistic that drove safety engineers crazy for years.
|
||||
>
|
||||
> Rollovers are only about 3% of crashes. But they account for roughly a third of fatalities.
|
||||
>
|
||||
> Obviously, we need stronger roofs, right? Prevent the roof from crushing the occupants during rollover.
|
||||
>
|
||||
> In 2009, NHTSA doubled the roof crush requirement - from 1.5 times vehicle weight to 3 times vehicle weight.
|
||||
>
|
||||
> Question: How much did this reduce rollover fatalities?
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 10: The Reveal
|
||||
**Visual:** Graph showing minimal change
|
||||
**Text:** "Rollover fatalities: Essentially unchanged after roof crush upgrade"
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Pause]*
|
||||
>
|
||||
> Essentially unchanged.
|
||||
>
|
||||
> Despite doubling the roof strength requirement, rollover fatalities barely moved.
|
||||
>
|
||||
> *[Wait for reaction]*
|
||||
>
|
||||
> How is that possible? Wasn't roof crush the problem?
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 11: The Data Revealed the Real Problem
|
||||
**Visual:** Diagram showing ejection during rollover
|
||||
**Text:** "70%+ of rollover fatalities involve ejection"
|
||||
|
||||
### Speaker Notes:
|
||||
> The data revealed the real problem.
|
||||
>
|
||||
> Over 70% of rollover fatalities involve ejection. The occupant isn't killed by the roof crushing - they're killed by being thrown from the vehicle during the roll.
|
||||
>
|
||||
> Once you're outside the vehicle, everything is hard. The ground. Other cars. Poles. The vehicle itself rolling over you.
|
||||
>
|
||||
> Roof crush was a secondary problem. Ejection was the primary problem.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 12: The Real Solution
|
||||
**Visual:** Side curtain airbag deployment
|
||||
**Text:** "Side curtain airbags with rollover sensors: 41% reduction in ejection"
|
||||
|
||||
### Speaker Notes:
|
||||
> The real solution was side curtain airbags.
|
||||
>
|
||||
> Airbags that deploy during rollover and stay inflated for 5-6 seconds. Long enough to keep occupants inside the vehicle through multiple rolls.
|
||||
>
|
||||
> Combined with better seatbelt pretensioners and rollover-sensing systems, ejection rates dropped significantly.
|
||||
>
|
||||
> The data - ejection statistics, injury mechanisms, survival analysis - pointed to a completely different solution than the intuitive one.
|
||||
>
|
||||
> Without data, we'd still be making roofs stronger and wondering why people were dying.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 13: The Lesson
|
||||
**Visual:** Quote
|
||||
**Text:** "The obvious solution isn't always the right solution. Let the data tell you what's actually happening."
|
||||
|
||||
### Speaker Notes:
|
||||
> The lesson: The obvious solution isn't always the right solution.
|
||||
>
|
||||
> Everyone assumed roof crush was the killer. The data said ejection was the killer.
|
||||
>
|
||||
> This happens more than you'd think. The assumed problem isn't the actual problem. And the only way to know is to measure.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 14: Puzzle 3 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** PUZZLE 3: The Luxury Failure
|
||||
|
||||
### Speaker Notes:
|
||||
> Puzzle three. I mentioned this briefly in another context, but let's really dig into it.
|
||||
>
|
||||
> The Luxury Failure.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 15: The Setup
|
||||
**Visual:** Logos of BMW, Mercedes, Audi, Lexus
|
||||
**Text:** "The most expensive cars. The most prestigious brands. Decades of safety engineering."
|
||||
|
||||
### Speaker Notes:
|
||||
> BMW. Mercedes-Benz. Audi. Lexus.
|
||||
>
|
||||
> These are the most expensive, most prestigious car brands in the world. They employ thousands of engineers. They've been building cars for decades.
|
||||
>
|
||||
> They all passed the moderate overlap frontal test with flying colors. Great safety records. Premium pricing partly justified by "superior safety engineering."
|
||||
>
|
||||
> In 2012, IIHS introduced the small overlap frontal test. Twenty-five percent overlap instead of forty. Rigid barrier instead of deformable.
|
||||
>
|
||||
> What do you think happened?
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 16: The Reveal
|
||||
**Visual:** Test results with photos
|
||||
**Results:**
|
||||
- BMW 5-Series: MARGINAL
|
||||
- Mercedes C-Class: MARGINAL
|
||||
- Audi A4: MARGINAL
|
||||
- Lexus ES 350: POOR
|
||||
|
||||
### Speaker Notes:
|
||||
> *[Let the slide speak first]*
|
||||
>
|
||||
> They failed.
|
||||
>
|
||||
> BMW 5-Series: Marginal.
|
||||
> Mercedes C-Class: Marginal.
|
||||
> Audi A4: Marginal.
|
||||
> Lexus ES 350: Poor.
|
||||
>
|
||||
> Some of the most expensive vehicles on the road couldn't pass a new crash test.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 17: What the Data Showed
|
||||
**Visual:** Crash photos showing intrusion
|
||||
**Annotations:** Footwell collapse, steering wheel displacement, head contact with structure
|
||||
|
||||
### Speaker Notes:
|
||||
> The data told a brutal story.
|
||||
>
|
||||
> In these vehicles, when the impact was offset to the corner, the crash forces bypassed the main structural rails. The wheel got pushed back into the footwell. The firewall collapsed. The steering column displaced into the occupant.
|
||||
>
|
||||
> The instrumentated dummy data showed:
|
||||
> - Elevated HIC from head striking interior structures
|
||||
> - Femur loads near the injury threshold
|
||||
> - Lower leg compression in the danger zone
|
||||
> - Feet trapped in crushed footwells
|
||||
>
|
||||
> These vehicles were engineered for the tests that existed. They weren't engineered for this test.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 18: The Deeper Lesson
|
||||
**Visual:** Text
|
||||
**Quote:** "Engineering to pass a test is not the same as engineering for safety."
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's the deeper lesson.
|
||||
>
|
||||
> Engineering to pass a test is not the same as engineering for safety.
|
||||
>
|
||||
> These automakers had optimized for the 40% overlap test. Their structures were brilliant - for that test. But they'd inadvertently created a vulnerability at the corner.
|
||||
>
|
||||
> This is why test protocols must evolve. This is why consumer information testing matters. And this is why we need precise data - because without it, you don't know if you've actually solved the problem or just solved one specific scenario.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 19: Puzzle 4 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** PUZZLE 4: The 46.2g Man
|
||||
|
||||
### Speaker Notes:
|
||||
> Puzzle four. This one goes back to the early days of safety testing.
|
||||
>
|
||||
> The 46.2g Man.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 20: The Setup
|
||||
**Visual:** 1950s photo or rocket sled
|
||||
**Text:** "1954: Conventional wisdom said humans could not survive more than 18g"
|
||||
|
||||
### Speaker Notes:
|
||||
> It's 1954. The jet age is dawning. Pilots are flying faster than ever before. And they're dying.
|
||||
>
|
||||
> Not from crashes - from ejections. Pilots ejecting from aircraft were experiencing massive g-forces. And medical authorities believed that humans could not survive more than 18g of deceleration.
|
||||
>
|
||||
> If that was true, high-speed ejection was a death sentence. There was no point designing ejection seats for speeds beyond a certain threshold.
|
||||
>
|
||||
> One researcher decided to test this assumption. Not with dummies. With himself.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 21: John Paul Stapp
|
||||
**Visual:** Photo of John Paul Stapp
|
||||
**Text:** "Colonel John Paul Stapp - Air Force flight surgeon"
|
||||
|
||||
### Speaker Notes:
|
||||
> Colonel John Paul Stapp. Air Force flight surgeon. And the bravest - or craziest - researcher in the history of safety testing.
|
||||
>
|
||||
> Stapp strapped himself into a rocket sled. And he ran test after test, pushing higher and higher g-forces.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 22: The Reveal
|
||||
**Visual:** Data display
|
||||
**Text:** "December 10, 1954: 46.2g sustained. 632 mph to zero in 1.4 seconds."
|
||||
|
||||
### Speaker Notes:
|
||||
> On December 10, 1954, Stapp rode the rocket sled to 632 miles per hour - faster than a .45 caliber bullet.
|
||||
>
|
||||
> Then he hit the brakes.
|
||||
>
|
||||
> In 1.4 seconds, he decelerated from 632 mph to zero. He experienced 46.2g of sustained deceleration.
|
||||
>
|
||||
> That's more than 2.5 times what "experts" said would kill him.
|
||||
>
|
||||
> He survived. He walked away - temporarily blinded, with burst blood vessels in his eyes, but alive and conscious.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 23: What the Data Revealed
|
||||
**Visual:** Comparison chart
|
||||
**18g "limit" vs. 46.2g survival**
|
||||
|
||||
### Speaker Notes:
|
||||
> Stapp proved that the human body could survive far more than anyone believed.
|
||||
>
|
||||
> This data - captured by instrumentation on his sled and his body - revolutionized aviation safety. It meant ejection seats could be designed for higher speeds. It meant survival was possible in scenarios previously considered hopeless.
|
||||
>
|
||||
> And it laid the foundation for automotive crash testing. If humans could survive 46g, then the question became: How do we design vehicles so that occupants never experience more than they can tolerate?
|
||||
>
|
||||
> Stapp's data made modern crash safety possible.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 24: The Lesson
|
||||
**Visual:** Quote
|
||||
**Text:** "Assumptions are not data. Test it. Measure it. Know for certain."
|
||||
|
||||
### Speaker Notes:
|
||||
> The lesson: Assumptions are not data.
|
||||
>
|
||||
> For years, everyone "knew" that 18g was fatal. Nobody had tested it. They just assumed.
|
||||
>
|
||||
> Stapp tested it. He measured it. And he proved them wrong.
|
||||
>
|
||||
> This is the foundation of everything we do. Don't assume. Test. Measure. Know for certain.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 25: Puzzle 5 Introduction
|
||||
**Visual:** Section divider
|
||||
**Title:** PUZZLE 5: The Airbag Arms Race
|
||||
|
||||
### Speaker Notes:
|
||||
> Last puzzle. I call this one the Airbag Arms Race.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 26: The Setup
|
||||
**Visual:** Timeline graphic
|
||||
**1970:** Airbags proposed
|
||||
**1984:** First mandates
|
||||
**1998:** Full mandate
|
||||
**2000s:** "Advanced" airbags
|
||||
|
||||
### Speaker Notes:
|
||||
> The history of airbag regulation is fascinating.
|
||||
>
|
||||
> 1970: Airbags first proposed as an alternative to seatbelts.
|
||||
> 1984: First automatic restraint requirements (airbag OR automatic belt).
|
||||
> 1998: Airbags mandatory in all vehicles.
|
||||
> 2000s: "Advanced" airbags with occupant classification.
|
||||
>
|
||||
> Each generation, airbags got more sophisticated. More sensors. More inflation stages. More intelligence.
|
||||
>
|
||||
> Here's the question: How much faster did airbag technology advance during the mandate period versus before?
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 27: The Reveal
|
||||
**Visual:** Comparison
|
||||
**Pre-mandate (1970-1984):** Minimal innovation
|
||||
**Post-mandate:** Explosion of patents, technologies, features
|
||||
|
||||
### Speaker Notes:
|
||||
> The answer is dramatic.
|
||||
>
|
||||
> Before mandates, airbag technology advanced slowly. Why invest in something that wasn't required?
|
||||
>
|
||||
> After mandates, innovation exploded. Multi-stage inflators. Occupant sensors. Position detection. Seatbelt pretensioner integration. Side airbags. Curtain airbags. Knee airbags.
|
||||
>
|
||||
> The regulation created the market. The market drove innovation. And the innovation saved lives.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 28: The Data That Drove It
|
||||
**Visual:** Graph
|
||||
**Text:** "Lives saved by airbags: From 0 (1985) to ~2,800/year (today)"
|
||||
|
||||
### Speaker Notes:
|
||||
> Today, airbags save approximately 2,800 lives per year in the United States.
|
||||
>
|
||||
> That didn't happen because of voluntary adoption. It happened because regulation required it, testing proved it worked, and data validated each improvement.
|
||||
>
|
||||
> Without crash testing data, you couldn't prove an airbag design was better. Without that proof, you couldn't justify the R&D investment. Without the investment, you couldn't innovate.
|
||||
>
|
||||
> Data is the engine of safety progress.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 29: The Meta-Lesson
|
||||
**Visual:** Text
|
||||
**Quote:** "Measurement isn't just about understanding what happened. It's about enabling what comes next."
|
||||
|
||||
### Speaker Notes:
|
||||
> Here's the meta-lesson from all five puzzles.
|
||||
>
|
||||
> Measurement isn't just about understanding what happened. It's about enabling what comes next.
|
||||
>
|
||||
> The beautiful wreck taught us that crush zones work.
|
||||
> The rollover data taught us that ejection was the real problem.
|
||||
> The small overlap test taught us that we'd missed a vulnerability.
|
||||
> Stapp's sled taught us what humans can survive.
|
||||
> The airbag arms race taught us that mandates drive innovation.
|
||||
>
|
||||
> In every case, data didn't just describe - it enabled. It pointed the way forward.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 30: Implications for DTS
|
||||
**Visual:** Connection to DTS products
|
||||
**Text:** "Our instrumentation is the source of these surprises."
|
||||
|
||||
### Speaker Notes:
|
||||
> What does this mean for DTS?
|
||||
>
|
||||
> Our instrumentation is the source of these surprises. When data contradicts expectations, it's because someone measured something that hadn't been measured before. Or measured it more precisely. Or measured it in a new context.
|
||||
>
|
||||
> Every sensor we design, every data acquisition system we build, every calibration we perform - it's potentially the source of the next surprise. The next counterintuitive finding that changes how vehicles are built.
|
||||
>
|
||||
> That's a remarkable responsibility. And a remarkable opportunity.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 31: Your Turn
|
||||
**Visual:** Challenge
|
||||
**Text:** "What assumptions are we making today that data will overturn tomorrow?"
|
||||
|
||||
### Speaker Notes:
|
||||
> I want to leave you with a challenge.
|
||||
>
|
||||
> What assumptions are we making today that data will overturn tomorrow?
|
||||
>
|
||||
> In the 1950s, everyone assumed 18g was fatal. Wrong.
|
||||
> In the 2000s, everyone assumed roof crush was the rollover killer. Wrong.
|
||||
> In 2011, everyone assumed luxury cars were safer. Wrong.
|
||||
>
|
||||
> What are we assuming now that we haven't tested? What do we "know" that might not be true?
|
||||
>
|
||||
> Those are the questions that lead to the next breakthrough.
|
||||
>
|
||||
> Thank you.
|
||||
|
||||
---
|
||||
|
||||
## SLIDE 32: Questions
|
||||
**Visual:** "Questions?"
|
||||
**Subtitle:** Ben - Application Engineer
|
||||
|
||||
### Speaker Notes:
|
||||
> I'm happy to take questions. And if you've got your own "data surprised me" story, I'd love to hear it.
|
||||
>
|
||||
> *[Open for Q&A]*
|
||||
|
||||
---
|
||||
|
||||
# APPENDIX: ADDITIONAL PUZZLES (BACKUP)
|
||||
|
||||
## Puzzle: The Safer Smaller Car
|
||||
- Setup: Large SUV vs. small car in head-on collision
|
||||
- Assumption: SUV occupant always safer
|
||||
- Reality: Depends on crash compatibility; some small cars protect better than some SUVs
|
||||
- Lesson: Mass isn't everything; structure and restraints matter
|
||||
|
||||
## Puzzle: The Helmet That Failed
|
||||
- Setup: Two helmets - one heavy, one light
|
||||
- Assumption: Heavier = more protection
|
||||
- Reality: Lighter helmet had better SI scores due to better energy-absorbing liner
|
||||
- Lesson: Material science matters more than mass
|
||||
|
||||
## Puzzle: The Zero-Star Five-Star
|
||||
- Setup: Same vehicle, two different NCAP programs
|
||||
- Assumption: Rating should be consistent
|
||||
- Reality: Different test protocols, different dummies, different results
|
||||
- Lesson: Test protocol details matter enormously
|
||||
|
||||
## Puzzle: The Unbreakable Neck
|
||||
- Setup: Early dummy neck designs
|
||||
- Assumption: Stiff neck provides realistic injury measurement
|
||||
- Reality: Too stiff = underestimate injury risk; too flexible = overestimate
|
||||
- Lesson: Biofidelity is a constant calibration challenge
|
||||
|
||||
---
|
||||
|
||||
# TIMING GUIDE
|
||||
|
||||
| Section | Duration | Cumulative |
|
||||
|---------|----------|------------|
|
||||
| Opening (Slides 1-2) | 3 min | 3 min |
|
||||
| Puzzle 1 - Beautiful Wreck (Slides 3-7) | 7 min | 10 min |
|
||||
| Puzzle 2 - Survivor's Paradox (Slides 8-13) | 7 min | 17 min |
|
||||
| Puzzle 3 - Luxury Failure (Slides 14-18) | 8 min | 25 min |
|
||||
| Puzzle 4 - 46.2g Man (Slides 19-24) | 8 min | 33 min |
|
||||
| Puzzle 5 - Airbag Arms Race (Slides 25-28) | 6 min | 39 min |
|
||||
| Closing (Slides 29-32) | 4 min | 43 min |
|
||||
| Q&A Buffer | 2 min | 45 min |
|
||||
|
||||
---
|
||||
|
||||
# ENGAGEMENT TECHNIQUES
|
||||
|
||||
1. **Polling:** Ask audience to guess before reveals. Show of hands or verbal responses.
|
||||
2. **Pause:** Give time for guesses. Don't rush to the answer.
|
||||
3. **Callback:** Reference earlier puzzles when discussing later ones.
|
||||
4. **Humor:** The surprises are inherently engaging - lean into the "gotcha" moment.
|
||||
5. **Validation:** When audience guesses right, acknowledge it.
|
||||
6. **Discussion:** For some puzzles, open brief discussion before revealing.
|
||||
|
||||
---
|
||||
|
||||
# VISUAL NOTES
|
||||
|
||||
- Use high-contrast reveals (gray "hidden" state, then color)
|
||||
- Include actual data traces where possible
|
||||
- Photos of actual crashes add credibility
|
||||
- Keep slides uncluttered - one main point per slide
|
||||
- Consider animation for reveals (build in PowerPoint)
|
||||
|
||||
---
|
||||
|
||||
*End of Script and Speaker Notes*
|
||||
11
_NateNotes.md
Normal file
@@ -0,0 +1,11 @@
|
||||
Introduction
|
||||
Humble
|
||||
Made a mistake and pitched an idea
|
||||
Struggled
|
||||
No pictures
|
||||
Want to convey:
|
||||
How our customers use equipment
|
||||
Inform decisions
|
||||
Our work matters
|
||||
|
||||
|
||||
BIN
assets/biorid_neck.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
assets/biorid_split.jpg
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
assets/euroncap_cyclist_headform.png
Normal file
|
After Width: | Height: | Size: 199 KiB |
BIN
assets/euroncap_headform.png
Normal file
|
After Width: | Height: | Size: 181 KiB |
BIN
assets/ford_pinto_rear.jpg
Normal file
|
After Width: | Height: | Size: 172 KiB |
BIN
assets/iihs_dummy_sensors.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
assets/iihs_fcp_car_target.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
assets/iihs_fcp_motorcycle_target.png
Normal file
|
After Width: | Height: | Size: 8.8 KiB |
BIN
assets/iihs_side_2021.jpg
Normal file
|
After Width: | Height: | Size: 60 KiB |
BIN
assets/iihs_side_barrier.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
assets/iihs_side_dummies.jpg
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
assets/iihs_small_overlap_barrier.jpg
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
assets/iihs_small_overlap_overhead.jpg
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
assets/nocsae_headforms.jpg
Normal file
|
After Width: | Height: | Size: 168 KiB |
BIN
assets/nocsae_helmet_test.jpg
Normal file
|
After Width: | Height: | Size: 101 KiB |
1410
create_data_saves_lives.py
Normal file
1711
create_data_saves_lives_v2.py
Normal file
1733
create_data_saves_lives_v3.py
Normal file
1192
create_test_modes_pptx.py
Normal file
132
embed_speaker_notes.py
Normal file
@@ -0,0 +1,132 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Embed speaker notes into all three presentation PowerPoint files.
|
||||
This script reads the speaker notes from the markdown files and adds them
|
||||
to the corresponding slides in each PowerPoint presentation.
|
||||
"""
|
||||
|
||||
from pptx import Presentation
|
||||
from pptx.util import Inches, Pt
|
||||
import re
|
||||
import os
|
||||
|
||||
|
||||
def extract_speaker_notes(markdown_path):
|
||||
"""
|
||||
Extract speaker notes from a markdown file.
|
||||
Returns a dict mapping slide numbers to their speaker notes.
|
||||
"""
|
||||
with open(markdown_path, "r", encoding="utf-8") as f:
|
||||
content = f.read()
|
||||
|
||||
notes = {}
|
||||
|
||||
# Pattern to match slide headers and their speaker notes
|
||||
# Looking for "## SLIDE X:" followed by content, then "### Speaker Notes:" and the notes
|
||||
slide_pattern = r"## SLIDE (\d+):.*?### Speaker Notes:\s*\n((?:>.*?\n)+)"
|
||||
|
||||
matches = re.findall(slide_pattern, content, re.DOTALL)
|
||||
|
||||
for match in matches:
|
||||
slide_num = int(match[0])
|
||||
# Clean up the notes - remove > prefixes and clean whitespace
|
||||
raw_notes = match[1]
|
||||
lines = raw_notes.split("\n")
|
||||
cleaned_lines = []
|
||||
for line in lines:
|
||||
# Remove leading > and whitespace
|
||||
cleaned = re.sub(r"^>\s*", "", line)
|
||||
# Remove stage directions but keep the text
|
||||
cleaned = re.sub(r"\*\[(.*?)\]\*", r"[\1]", cleaned)
|
||||
# Remove italic markers
|
||||
cleaned = cleaned.replace("*", "")
|
||||
cleaned_lines.append(cleaned)
|
||||
|
||||
notes[slide_num] = "\n".join(cleaned_lines).strip()
|
||||
|
||||
return notes
|
||||
|
||||
|
||||
def add_notes_to_pptx(pptx_path, notes_dict):
|
||||
"""
|
||||
Add speaker notes to a PowerPoint presentation.
|
||||
"""
|
||||
prs = Presentation(pptx_path)
|
||||
|
||||
slides_updated = 0
|
||||
for i, slide in enumerate(prs.slides, 1):
|
||||
if i in notes_dict:
|
||||
# Get or create notes slide
|
||||
notes_slide = slide.notes_slide
|
||||
text_frame = notes_slide.notes_text_frame
|
||||
text_frame.text = notes_dict[i]
|
||||
slides_updated += 1
|
||||
|
||||
# Save the presentation
|
||||
prs.save(pptx_path)
|
||||
return slides_updated
|
||||
|
||||
|
||||
def process_presentation(folder_name, pptx_name):
|
||||
"""
|
||||
Process a single presentation - extract notes and embed them.
|
||||
"""
|
||||
base_path = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
if folder_name:
|
||||
markdown_path = os.path.join(
|
||||
base_path, folder_name, "script_and_speaker_notes.md"
|
||||
)
|
||||
pptx_path = os.path.join(base_path, folder_name, pptx_name)
|
||||
else:
|
||||
markdown_path = os.path.join(base_path, "script_and_speaker_notes.md")
|
||||
pptx_path = os.path.join(base_path, pptx_name)
|
||||
|
||||
print(f"\nProcessing: {pptx_name}")
|
||||
print(f" Markdown: {markdown_path}")
|
||||
print(f" PowerPoint: {pptx_path}")
|
||||
|
||||
# Check files exist
|
||||
if not os.path.exists(markdown_path):
|
||||
print(f" ERROR: Markdown file not found!")
|
||||
return False
|
||||
if not os.path.exists(pptx_path):
|
||||
print(f" ERROR: PowerPoint file not found!")
|
||||
return False
|
||||
|
||||
# Extract notes
|
||||
notes = extract_speaker_notes(markdown_path)
|
||||
print(f" Extracted notes for {len(notes)} slides")
|
||||
|
||||
# Add notes to PowerPoint
|
||||
slides_updated = add_notes_to_pptx(pptx_path, notes)
|
||||
print(f" Updated {slides_updated} slides with speaker notes")
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print("Embedding Speaker Notes into PowerPoint Presentations")
|
||||
print("=" * 60)
|
||||
|
||||
presentations = [
|
||||
("The_Stories_Our_Data_Tells", "The_Stories_Our_Data_Tells.pptx"),
|
||||
("From_Tragedy_to_Triumph", "From_Tragedy_to_Triumph.pptx"),
|
||||
("When_the_Data_Surprised_Us", "When_the_Data_Surprised_Us.pptx"),
|
||||
]
|
||||
|
||||
success_count = 0
|
||||
for folder, pptx in presentations:
|
||||
if process_presentation(folder, pptx):
|
||||
success_count += 1
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print(
|
||||
f"Complete! Successfully processed {success_count}/{len(presentations)} presentations."
|
||||
)
|
||||
print("=" * 60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||