2. CAE injury data fundamentals
Before a single line of Python can turn a crash simulation into an Excel dashboard, you need a precise mental model of what the raw data actually represents. Injury criteria are not arbitrary numbers — each one encodes a physical hypothesis about how a body region fails, and each is computed from specific measurement channels on a specific dummy. Getting the mapping between criteria, channels, and output formats wrong is the most common reason an automated report produces plausible-looking but meaningless results.
Injury criteria and the physics they encode
An injury criterion is a scalar (or short time series) derived from measured signals that correlates with a documented injury risk. In frontal impact work the head is usually assessed with HIC (Head Injury Criterion), defined over a window bounded by two time points t₁ and t₂:
HIC = max over (t1, t2) of [ (1/(t2 - t1)) * ∫ a(t) dt ]^2.5 * (t2 - t1)
where a(t) is the resultant translational acceleration at the head CG,
expressed in g, and (t2 - t1) ≤ 15 ms
The 2.5 exponent and the 15 ms cap are not tunable — they come from the Wayne State tolerance curve. In practice you compute HIC by filtering the head acceleration channel to CFC 1000 (SAE J211 channel frequency class), then scanning all valid windows. A common implementation error is applying the filter twice, or using the unfiltered signal; both shift HIC by several percent and can flip a pass/fail decision near the threshold.
The neck uses NIC (Neck Injury Criterion), which combines axial force Fz and bending moment My at the occipital condyle:
NIC = Fz / F_int + My / M_int
F_int and M_int are the intercepts of the normalized injury risk curve
(values depend on the dummy type and the regulatory or consumer protocol)
Chest injury is typically reported as chest deflection (absolute compression in mm) and VC (viscous criterion), the product of deflection rate and instantaneous compression, normalized by chest depth. Abdomen, pelvis, and femur each have their own force or moment limits. The key point for automation: every criterion has a defined channel source, a defined filter class, and a defined sign convention. Your Python pipeline must carry all three as metadata, not hard-code them per script.
ATD channels: what the dummy actually measures
An Anthropomorphic Test Device (ATD) — Hybrid III, THOR, or a Euro NCAP-spec variant — outputs a fixed set of channels. Each channel has an identifier, a unit, a location, and a positive direction. For a Hybrid III 50th percentile male in a frontal sled or full-vehicle model, the channels you will most often consume are:
| Channel ID | Quantity | Unit | Location / convention |
|---|---|---|---|
| HEAD_ACC_X/Y/Z | Translational acceleration | g | Head CG; +X forward, +Y left, +Z up |
| HEAD_OMEGA_Y | Angular velocity | rad/s | Head CG; +Y = left lateral axis |
| NECK_FZ | Axial force | N | Occipital condyle; +Z tension |
| NECK_MY | Bending moment | Nm | Occipital condyle; +Y flexion |
| CHEST_DEF | Deflection | mm | Sternum relative to spine box; + = compression |
| CHEST_ACC_Y | Lateral acceleration | g | Upper sternum |
| FEMUR_FZ_L/R | Axial force | kN | Femur shaft; +Z compression |
Sign conventions matter enormously. A chest deflection of −38 mm and +38 mm may both exceed a 35 mm limit in magnitude, but only one corresponds to compression depending on the dummy's local axis definition. Always resolve the convention from the model's channel metadata or the dummy manual, and record it alongside the computed criterion. When you later build the dashboard, a column labelled chest_def_mm is only trustworthy if the pipeline that produced it documented the sign.
Simulation output formats you will actually parse
CAE solvers emit time-history data in a handful of formats. The three you are most likely to automate against are:
- LS-DYNA
nodout/elout/binout— ASCII or binary;binoutis compact and fast but requires a reader (e.g.lasso-pythonord3plottooling). Channel names follow the*DATABASE_HISTORY_NODEdefinitions in the keyword deck. - PAM-CRASH / Radioss TH — ASCII time-history files with a header block listing channel IDs, units, and sampling interval.
- CSV / HDF5 exports — increasingly common when results are post-processed by a central team; HDF5 preserves units and channel metadata as attributes, which is ideal for automated ingestion.
A robust ingestion step does three things before any criterion is computed: (1) reads the sampling interval and confirms it is fine enough for the highest filter class in use — CFC 1000 needs at least 10 kHz to avoid aliasing; (2) verifies that every required channel is present and non-empty; (3) applies the correct SAE J211 filter once, and records the filter class in the output metadata. Skipping step (3) or applying it inconsistently across channels is the single most frequent source of disagreement between an automated report and a hand-checked one.
criterion → channel → filter_class → limit lets you swap dummy types or protocols without editing Python, and it becomes the single source of truth that both the report and the dashboard read.From raw channels to a criterion table
The natural intermediate product of this chapter is a tidy table: one row per (run, criterion), with columns for the computed value, the governing limit, the pass/fail flag, and the metadata needed to defend the number. The SVG below shows how the three layers — ATD channels, filtering and criterion computation, and the output table — connect, including the metadata that must travel with each value.
Notice that the metadata ribbon is drawn as a separate, dashed layer rather than as another box in the chain. That is deliberate: metadata is not a processing step, it is a property that must attach to every value the pipeline emits. If your criterion table lacks a filter_class and sign_convention column, the dashboard built on top of it cannot be audited, and a reviewer cannot tell whether a borderline chest deflection was computed with the correct compression sign.
A minimal, reproducible check
To confirm your understanding before moving to automation, take a single synthetic head acceleration trace — a half-sine pulse of 80 g peak and 10 ms duration, sampled at 10 kHz — and compute HIC by hand in Python. The expected result for this idealized pulse is approximately 400–450 depending on the exact window scan; the point is not the number but that you can reproduce it, then reproduce it again after applying a CFC 1000 filter and observe the small but real change. If your filtered and unfiltered HIC agree to the last digit, your filter is not being applied. If they differ by more than about 10%, check for double filtering or a wrong cutoff. This two-minute check catches the majority of ingestion bugs before they reach a report.
With the criteria defined, the channels mapped, and the output formats understood, the next layer of work — parsing these files programmatically and assembling the tidy criterion table — becomes a matter of disciplined data engineering rather than guesswork about the physics.