Skip to content

vibration.human.multiple_shock

Whole-body vibration containing multiple shocks (ISO 2631-5:2018).

Implements the normative Clause 5 spinal-response model and the Annex C assessment of adverse health effects for the vertical (z) axis.

The 2018 edition is vertical-axis only by design: clause 4 (delineation, item a) neglects the x and y contributions to spinal compression, the seat-to-spine transfer function of clause 5.2 is the vertical seat-to-lumbar response, and the Annex C stress conversion is the vertical one. The horizontal spinal model of the withdrawn 2004 edition is not reproduced. Assess horizontal whole-body exposure with the ISO 2631-1 metrics in this domain instead: the weighted r.m.s. acceleration (weighted_acceleration) and the vibration dose value (vibration_dose_value).

A seat-to-spine transfer function (clause 5.2, Formula 1) maps the measured seat acceleration to the spinal response acceleration

The standard assumes a conditioned input: has unity transmissibility at 0 Hz, so any DC offset in the record (e.g. the gravity component of a non-AC-coupled accelerometer) passes straight into and corrupts the response peaks; remove the mean (high-pass) before processing. The acceleration dose is

over the positive response peaks, scaled to a daily dose

Annex C turns the daily dose into an injury risk: the daily compressive stress (Formula C.1), the age-cumulated stress variable (Formulae C.3/C.4) and the Weibull probability of lumbar injury (Formula C.5, Table C.1):

The Annex A / Annex E model (intervertebral compressive forces via a finite-element model distributed by ISO) is not reproducible from the standard text and is out of scope.

Auto-generated from the source docstrings by scripts/generate_api_docs.py (make api-docs). Do not edit by hand.

acceleration_dose(acceleration: ArrayLike, fs: float) -> float

Acceleration dose from a seat acceleration time history.

Filters the acceleration through the seat-to-spine transfer function (Formula 2), takes the positive response peaks and combines them by Formula 3. The input must be conditioned (DC-removed); see spinal_response.

Parameters

NameDescription
accelerationMeasured, conditioned (zero-mean) vertical seat acceleration , m/s2.
fsSampling frequency, in hertz.

Returns: The acceleration dose , m/s2.

compression_dose(daily_dose_value: float, *, mz: float = 0.029) -> float

Daily compressive stress (Annex C, Formula C.1).

Parameters

NameDescription
daily_dose_valueThe daily acceleration dose , m/s2.
mzStress conversion (MPa per m/s2); default the 82 kg male value MZ_MALE. See MZ_FEMALE.

Returns: The daily compressive stress , MPa.

daily_dose(
dose: float,
exposure_time: float,
measurement_time: float,
) -> float

Daily acceleration dose (clause 5.3, Formula 4).

Parameters

NameDescription
doseThe measured acceleration dose , m/s2.
exposure_timeDaily exposure period (any time unit).
measurement_timePeriod over which was measured (same unit as exposure_time).

Returns: The daily dose , m/s2.

daily_dose_multi(
doses: ArrayLike,
exposure_times: ArrayLike,
measurement_times: ArrayLike,
) -> float

Daily dose from several exposure conditions (clause 5.3, Formula 5).

Parameters

NameDescription
dosesAcceleration dose of each condition, m/s2.
exposure_timesDaily exposure duration of each condition.
measurement_timesMeasurement duration of each condition.

Returns: The combined daily dose , m/s2.

dose_from_peaks(peaks: ArrayLike) -> float

Acceleration dose from response peaks (clause 5.3, Formula 3).

Parameters

NameDescription
peaksThe positive response peaks , m/s2.

Returns: The acceleration dose , m/s2.

injury_probability(
risk: ArrayLike,
*,
sex: Literal['male', 'female'] = 'male',
) -> np.ndarray | float

Probability of lumbar injury (Annex C, Formula C.5).

Parameters

NameDescription
riskThe stress variable (see injury_risk); scalar or array-like.
sex"male" or "female" (sets the Weibull coefficients).

Returns: The injury probability in 0-1; a float for a scalar input, otherwise an array. Negative gives 0.

injury_risk(
daily_compression: float,
*,
start_age: float,
years: int,
days_per_year: float,
sex: Literal['male', 'female'] = 'male',
mz: float | None = None,
) -> float

Cumulative injury stress variable (Annex C, Formula C.3).

Accumulates the daily compressive stress over the exposure years, each year weighted by the reducing ultimate strength of the ageing spine.

Parameters

NameDescription
daily_compressionThe daily compressive stress , MPa.
start_ageAge at which the exposure started, in years.
yearsNumber of exposure years n.
days_per_yearNumber of exposure days per year N.
sex"male" or "female".
mzStress conversion for the static stress ; defaults to the sex-specific value.

Returns: The stress variable .

Raises

ExceptionWhen
ValueErrorif years is not positive or the spine strength is exhausted () within the exposure period.
multiple_shock_assessment(
acceleration: ArrayLike,
fs: float,
*,
start_age: float,
years: int,
days_per_year: float,
exposure_time: float | None = None,
measurement_time: float | None = None,
sex: Literal['male', 'female'] = 'male',
mz: float | None = None,
) -> MultipleShockResult

Full multiple-shock assessment from a seat acceleration time history.

Chains the Clause 5 dose and the Annex C risk: spinal response (Formula 2), acceleration dose (Formula 3), daily dose (Formula 4), compressive stress (C.1), stress variable (C.3) and injury probability (C.5). The input must be conditioned (DC-removed); see spinal_response.

The model is vertical-axis only (clause 4a of the 2018 edition); for horizontal whole-body exposure use the ISO 2631-1 metrics in this domain (weighted_acceleration, vibration_dose_value).

Parameters

NameDescription
accelerationMeasured, conditioned (zero-mean) vertical seat acceleration , m/s2.
fsSampling frequency, in hertz.
start_ageAge b at which the exposure started, in years.
yearsNumber of exposure years n.
days_per_yearNumber of exposure days per year N.
exposure_timeDaily exposure period ; when given with measurement_time the dose is scaled to a daily dose (Formula 4), otherwise the measured dose is taken as the daily dose.
measurement_timePeriod over which the record was measured.
sex"male" or "female".
mzStress conversion (MPa per m/s2); defaults to the sex-specific value.

Returns: The MultipleShockResult.

MultipleShockResult(
sex: Literal['male', 'female'],
acceleration_dose: float,
daily_dose: float,
compression_dose: float,
risk: float,
probability: float,
start_age: float,
years: int,
days_per_year: float,
peaks: np.ndarray,
risk_thresholds: tuple[float, float, float],
)

Multiple-shock health assessment (ISO 2631-5:2018, Clause 5 + Annex C).

Attributes

NameDescription
sex"male" or "female".
acceleration_doseThe acceleration dose , m/s2.
daily_doseThe daily acceleration dose , m/s2.
compression_doseThe daily compressive stress , MPa.
riskThe cumulative stress variable .
probabilityThe probability of lumbar injury in 0-1.
start_ageAge at which the exposure started, in years.
yearsNumber of exposure years.
days_per_yearNumber of exposure days per year.
peaksThe positive response peaks used for the dose, m/s2.
risk_thresholdsThe values for 10 %, 50 % and 90 % risk of injury for this sex (Table C.2).
MultipleShockResult.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the injury-probability curve with this assessment’s .

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

MultipleShockResult.report(
path: str,
*,
metadata: ReportMetadata | None = None,
engine: str = 'reportlab',
verbose: bool = False,
language: str = 'en',
) -> str

Render a whole-body multiple-shock health-risk fiche to a PDF.

Writes a one-page health-risk assessment sheet for whole-body vibration containing multiple shocks (ISO 2631-5:2018): the standard-basis line (Clause 5 spinal response and Annex C risk model), an optional metadata header (client, subject, workplace/vehicle, instrumentation, calibration), the exposure-scenario grid (subject sex, the age b at which the exposure started, the number of exposure years n, the number of exposure days per year N and the number of counted response shocks), the dose-and-stress analysis table (the acceleration dose of Formula 3, the daily dose of Formula 4, the daily compressive stress of Formula C.1, the cumulative stress variable of Formula C.3 and the probability of lumbar injury of Formula C.5), the injury-probability chart, the boxed and with the Annex C risk classification, a classification table against the Table C.2 risk levels with a zone row, and a footer identity/disclaimer block.

The Annex C classification is informative (ISO 2631-5:2018 defines no exposure limit), so the fiche carries a risk-band zone row rather than a PASS/FAIL verdict: is placed among the Table C.2 stress variables for 10 / 50 / 90 % risk of injury (low / moderate / high / very high probability of an adverse health effect), the moderate band matching the Annex C worked example.

Parameters

NameDescription
pathDestination path of the PDF file.
metadataOptional ReportMetadata supplying the header identity (client, specimen the subject, test_room the workplace or vehicle) plus the instrumentation and calibration free-text fields and the footer identity.
engineRendering back end; only "reportlab" is supported.
verboseAccepted for a uniform .report() signature; the fiche has one stacked body layout, so it has no effect.
languageFiche language: "en" (default, English) or "es" (Spanish, with a comma decimal separator).

Returns: The written path as a str.

Raises

ExceptionWhen
ValueErrorIf engine is not "reportlab" or language is unknown.
ImportErrorIf reportlab or matplotlib is not installed. The fiche always embeds the injury-probability chart, so both are required (pip install "phonometry[report,plot]").
response_peaks(response: ArrayLike) -> np.ndarray

Positive response peaks (clause 5.3).

A peak is the maximum value of the response between two consecutive zero crossings; only positive peaks are counted.

Parameters

NameDescription
responseThe spinal response acceleration .

Returns: The positive peak values, in the order they occur.

seat_to_spine_transfer(frequencies: ArrayLike) -> np.ndarray

Seat-to-spine transfer function (clause 5.2, Formula 1).

A single complex zero and six complex poles map the seat acceleration to the vertical spinal response; the transmissibility is unity at 0 Hz.

Parameters

NameDescription
frequenciesFrequencies at which to evaluate H, in hertz.

Returns: The complex frequency response, aligned with frequencies.

spinal_response(acceleration: ArrayLike, fs: float) -> np.ndarray

Vertical spinal response (clause 5.2, Formula 2).

Applies the seat-to-spine transfer function to the measured conditioned seat acceleration in the frequency domain and returns the time-domain response by the inverse transform.

The input must be conditioned (DC-removed): the transfer function is unity at 0 Hz by design (clause 5.2), so a DC offset (e.g. the 1 g gravity component of a DC-coupled accelerometer) is passed unattenuated and produces a spurious constant shift in that corrupts the positive response peaks of the dose. Subtract the mean (or high-pass) of before calling.

Parameters

NameDescription
accelerationMeasured, conditioned (zero-mean) vertical seat acceleration , m/s2.
fsSampling frequency, in hertz.

Returns: The spinal response acceleration , m/s2, same length.

static_stress(mz: float = 0.029) -> float

Static compressive stress (Annex C), MPa.

ultimate_strength(
age: ArrayLike,
*,
sex: Literal['male', 'female'] = 'male',
) -> np.ndarray

Ultimate lumbar strength at an age (Annex C, Formula C.4).

Parameters

NameDescription
ageAge , in years.
sex"male" or "female" (sets the age slope ).

Returns: The ultimate strength , MPa.