<!-- canonical: https://jmrplens.github.io/phonometry/es/vibration/human/multiple-shock-vibration/ -->
Source: https://jmrplens.github.io/phonometry/es/vibration/human/multiple-shock-vibration/

La vibración que contiene **choques mecánicos** repetidos (vehículos todoterreno,
embarcaciones rápidas, maquinaria de movimiento de tierras) carga la columna
lumbar mucho más de lo que sugiere su nivel eficaz equivalente. **ISO
2631-5:2018** predice la respuesta espinal resultante y el riesgo de lesión
lumbar a partir de la aceleración vertical medida en el asiento. phonometry
implementa el modelo normativo de respuesta espinal del **apartado 5** y la
evaluación de efectos sobre la salud del **Anexo C**. (El modelo de elementos
finitos de los Anexos A / E lo distribuye ISO como software aparte y queda fuera
de alcance aquí.)

La frontera con el método básico es explícita. ISO 2631-1 declara su
evaluación eficaz normalmente suficiente hasta un factor de cresta de 9, y
ofrece el eficaz móvil/MTVV y el VDV más allá; ISO 2631-5 es el método
adicional para el régimen posterior, cuando el registro contiene choques
repetidos. Su apartado 4 divide después ese régimen en dos: las condiciones
*severas*, con posible caída libre o pérdida de contacto con el asiento y un
eje z dominante (vehículos militares todoterreno, embarcaciones rápidas),
usan el modelo del apartado 5 implementado aquí, mientras que las
condiciones *menos severas*, en las que el ocupante permanece sentado en todo
momento (tractores, maquinaria forestal y de movimiento de tierras sobre
terreno irregular), corresponden al modelo de elementos finitos del Anexo A.
En caso de duda, la delimitación es cuantitativa: cuando la aceleración de
pico vertical de banda limitada supera 9,81 m/s² (1 g, el umbral de caída
libre), se aplican el apartado 5 y el Anexo C.

## 1. Conseguir el registro (apartados 5.1.2 y 5.1.4)

Todo lo que viene después parte de un $a_z(t)$ medido, y la ISO 2631-5 añade
cuatro requisitos de adquisición sobre los de la ISO 2631-1, cada uno propio de
la exposición a choques.

**Dónde (5.1.2).** $a_z(t)$ se mide en la interfaz entre el asiento y las
**tuberosidades isquiáticas**. La ubicación de medida sobre el asiento y el
diseño del disco de acelerómetros sobre la almohadilla siguen la
**ISO 10326-1**: un disco semirrígido moldeado de 250 ± 50 mm de diámetro y
12 mm de altura como máximo, de dureza Shore A entre 80 y 90, con una cavidad
central que aloja un disco metálico de 75 ± 5 mm de diámetro y 1,5 mm de espesor
al que se fijan los acelerómetros, pegado con cinta al cojín de modo que los
transductores queden a medio camino entre las tuberosidades (5.2.3 de esa
norma). El sujeto permanece sentado durante toda la toma de datos y no se
levanta del asiento.

**Pérdida de contacto (5.1.2).** Interruptores de contacto, grabaciones de vídeo
u otro método detectan la pérdida de contacto entre el sujeto y la superficie del
asiento. Las aceleraciones medidas mientras se ha perdido el contacto **no deben
contabilizarse como exposición**, y la pérdida de contacto debe detectarse y
declararse; el impacto al aterrizar tras una caída libre, el movimiento de la
persona *y* el del asiento, debe tenerse plenamente en cuenta. Esta es la
instrumentación que de verdad exige el régimen *severo* del apartado 4 anterior,
y es lo que hace que un registro de ISO 2631-5 sea distinto de uno de
ISO 2631-1.

**La cadena (5.1.2).** Los acelerómetros y el equipo de medida deben ser
adecuados para las amplitudes máximas previstas durante el periodo de medida. El
registro digitalizado debería tener una respuesta plana en aceleración de
0,01 Hz hasta al menos 80 Hz, y puede hacer falta una frecuencia de muestreo de
256 muestras por segundo o mayor según el método antialiasing empleado, que es
de donde sale el `fs = 256.0` del ejemplo resuelto de más abajo. Deben aportarse
los detalles del equipo de medida, incluido el método de calibración utilizado.

**Cuánto tiempo (5.1.4).** El registro debe ser lo bastante largo para que los
choques múltiples medidos sean representativos de la exposición que se evalúa.
Los sucesos de choque pueden ser poco frecuentes, así que la duración hay que
estimarla a partir de lo variables que sean los impactos: cuando unos pocos
choques severos conviven con muchos pequeños, hace falta un registro más largo
para tener una probabilidad razonable de capturarlos. Un ciclo de trabajo
completo es representativo en una tarea repetible, como la de un dúmper de mina;
en las no repetibles (marcha campo a través, transporte militar) la duración
suficiente depende de la variabilidad del terreno. Los ensayos que exponen a
personas a choques repetidos necesitan su propia evaluación de riesgos, y
medidas más cortas primero.

## 2. Acondicionar el registro (apartado 5.1.3)

El acondicionamiento son seis pasos ordenados, y dos de ellos contradicen el
consejo que un lector se daría a sí mismo.

1. **Comprueba el signo.** Todo el método va de carga *compresiva* de la
   columna, así que el eje z debe ser positivo hacia craneal: positivo hacia
   arriba, en el sistema basicéntrico para personas sentadas. Un error de signo
   invierte qué picos se cuentan.
2. **Recorta las partes sin contacto** entre el disco de acelerómetros de la
   almohadilla y el sujeto. Eso parte el registro en tramos separados, y los
   pasos restantes se aplican a cada tramo **por separado**.
3. **Comprueba el antialiasing** si los datos se remuestrearon después de
   adquirirlos. La NOTA 1 advierte de que los paquetes habituales de tratamiento
   de datos aplican filtros adecuados de forma automática, pero de que es
   importante verificar que lo hicieron.
4. **Corrige el offset** para que la aceleración registrada marque
   (0 ± 0,1) m/s² con el acelerómetro en reposo. El apartado añade después la
   advertencia: restar la media **puede no ser apropiado** si la aceleración
   registrada es asimétrica, y un registro de choques es asimétrico por
   construcción, que es justo el caso en el que restar la media se equivoca.
5. **Aplica una ventana de entrada y salida** (una ventana coseno de varios
   segundos, por ejemplo) si el acelerómetro estaba en movimiento al principio o
   al final de la grabación, antes de limitar la banda.
6. **Limita la banda** con un paso alto Butterworth de segundo orden a 0,01 Hz y
   un paso bajo Butterworth de cuarto orden a 80 Hz. Los filtros de limitación de
   banda y de ponderación de la ISO 2631-1 **no** deben aplicarse.

El último paso es donde se gana o se pierde el número. La NOTA 2 da la razón con
números: se han observado periodos de caída libre de más de 0,5 s en
embarcaciones rápidas de guerra, y un paso alto de 0,5 Hz arrastra los −1 g de la
caída libre de vuelta a cero antes de que llegue el impacto, de modo que el pico
del impacto queda desplazado hasta +1 g y la dosis calculada se equivoca del
orden de un 10 %. Los cambios bruscos de perfil del terreno pueden hacer lo
mismo. El corte de 0,01 Hz existe para conservar la caída libre en el registro.

```python

from scipy.signal import butter, filtfilt

# La limitación de banda del apartado 5.1.3, sobre un registro ya corregido de
# offset y partido en las fronteras de pérdida de contacto.
fs = 256.0
high = butter(2, 0.01, "high", fs=fs, output="sos")   # segundo orden, 0,01 Hz
low = butter(4, 80.0, "low", fs=fs, output="sos")     # cuarto orden, 80 Hz
print(high.shape, low.shape)                          # (1, 6) (2, 6)
```

## 3. Respuesta espinal (apartado 5.2)

Una función de transferencia asiento-columna $H(f)$ (un cero complejo y seis
polos complejos, transmisibilidad unidad a 0 Hz y una resonancia cerca de 5 Hz)
transforma la aceleración acondicionada del asiento en la respuesta espinal
vertical $A_z(t)$ (Fórmula 1/2):

$$
A_z(t) = \mathcal{F}^{-1}\!\left[H(f)\,\mathcal{F}[a_z(t)]\right].
$$

El acondicionamiento de la sección 2 no es opcional aquí: como $H$ es unidad a
0 Hz por diseño, un offset de continua (la componente de gravedad de 1 g de un
acelerómetro acoplado en continua, por ejemplo) pasa directamente a $A_z(t)$ y
corrompe los picos positivos de respuesta con los que se construye la dosis.

```python
from phonometry import vibration

# La transmisibilidad alcanza el máximo cerca de la resonancia espinal de ~5 Hz.
print(round(abs(vibration.seat_to_spine_transfer([2.0])[0]), 2))  # 1.06
print(round(abs(vibration.seat_to_spine_transfer([5.0])[0]), 2))  # 1.54
```

## 4. Dosis de aceleración (apartado 5.3)

La **dosis de aceleración** combina los picos positivos de la respuesta
$A_{z,i}$ (cada uno el máximo entre dos cruces por cero consecutivos) con una
ley de sexta potencia, de modo que dominan los choques mayores (Fórmula 3):

$$
D_z = 1{,}07\left(\sum_i A_{z,i}^{\,6}\right)^{1/6}.
$$

El 1,07 no es un apaño de calibración: la NOTA 1 al apartado 5.3 dice que la
Fórmula (1) representa la respuesta en frecuencia de la columna como filtro, y
que la columna tiene además una función de respuesta en *amplitud*, que es lo que
lleva el 1,07. Solo se cuentan los picos positivos, y la sexta potencia tiene un
corolario operativo que la norma declara sin rodeos: los picos de aceleración
inferiores al mayor en un factor de tres o más no contribuyen de forma
significativa a la Fórmula (3). La dosis de una jornada la deciden por tanto un
puñado de impactos, que es también la razón de que el recuento de picos sea
robusto frente a cómo trate la regla de cruces por cero a los pequeños.

Una dosis diaria escala la dosis medida al tiempo de exposición diario $t_\mathrm{d}$
sobre el tiempo de medida $t_\mathrm{m}$ (Fórmula 4):
$D_{z\mathrm{d}} = D_z\,(t_\mathrm{d}/t_\mathrm{m})^{1/6}$. Para comparar exposiciones distintas, la norma
recomienda $t_\mathrm{d}$ = 8 h.

```python
from phonometry import vibration

# Cinco picos de respuesta de 40 m/s2 al día (el ejemplo del Anexo C).
print(round(vibration.dose_from_peaks([40.0] * 5), 2))  # 55.97  m/s2
```

*Lo que el apartado 5 le hace a un registro, y en el dominio en el que se lo
hace. El filtro asiento-columna es resonante, así que un impacto seco del asiento
se convierte en una respuesta espinal que resuena, cuyo pico llega más tarde y no
se parece en nada a la entrada; la regla de cruces por cero cuenta después 28
picos positivos; y la sexta potencia entrega el 98,6 % de la dosis a uno solo de
ellos. Todo lo que queda por debajo de un tercio del pico mayor, la línea
discontinua, aporta centésimas de punto porcentual, que es la regla del apartado
5.3 hecha visible. `MultipleShockResult.peaks` contiene exactamente los valores
marcados.*

<details>
<summary>Mostrar el código de esta figura</summary>

```python

# `vibration` es el espacio de nombres importado en el fragmento de la sección 3.

fs_rec, duration = 256.0, 8.0
time = np.arange(int(duration * fs_rec)) / fs_rec
rng = np.random.default_rng(11)
seat = 1.5 * np.sin(2 * np.pi * 3.6 * time) + 0.45 * rng.standard_normal(time.size)
for start, amplitude in ((1.15, 26.0), (3.05, 8.0), (5.60, 55.0), (6.95, 15.0)):
    hit = time >= start
    seat[hit] += amplitude * np.exp(-20.0 * (time[hit] - start)) * np.sin(
        2 * np.pi * 5.5 * (time[hit] - start))
seat[(time >= 5.18) & (time < 5.58)] = -9.81      # 0,4 s de caída libre

response = np.asarray(vibration.spinal_response(seat, fs_rec))
peaks = np.asarray(vibration.response_peaks(response))
shares = 100.0 * peaks**6 / float(np.sum(peaks**6))
print(peaks.size, round(float(peaks.max()), 1), round(float(shares.max()), 1))
# 28 30.3 98.6

fig, (ax_t, ax_p) = plt.subplots(2, 1, sharex=True, figsize=(11, 7.6))
ax_t.plot(time, seat, lw=0.9, color="#9e9e9e", label="$a_z(t)$")
ax_t.plot(time, response, lw=1.5, color="#1f77b4", label="$A_z(t)$")
ax_p.plot(time, response, lw=1.2, color="#1f77b4")
ax_p.axhline(peaks.max() / 3.0, ls="--", color="#2ca02c")
ax_t.legend(loc="upper left")
ax_p.set_xlabel("Tiempo [s]")
plt.show()
```

</details>

## 5. Riesgo de lesión (Anexo C)

La dosis diaria se convierte en una **tensión compresiva** diaria
$S_\mathrm{d} = m_z\,D_{z\mathrm{d}}$ (Fórmula C.1), donde $m_z$ (0,029 MPa por m/s² para un
hombre de 82 kg, 0,025 para una mujer de 64 kg) convierte la aceleración en
tensión vertebral. La tensión se acumula sobre los años de exposición frente a
la resistencia última decreciente de la columna que envejece
$S_\mathrm{u} = 6{,}75\ \mathrm{MPa} - S_{\mathrm{age}}\,(b+i)$ (Fórmulas C.3/C.4):

$$
R = \left[\sum_{i=0}^{n-1}
\left(\frac{S_\mathrm{d}\,N^{1/6}}{S_{\mathrm{u},i} - S_{\mathrm{stat}}}\right)^{6}\right]^{1/6},
$$

donde $b$ es la edad a la que empezó la exposición, $n$ el número de años de
exposición, $i$ el contador de años $0 \le i \le n-1$ (de modo que $S_{\mathrm{u},i}$ es
la resistencia última a la edad $b+i$) y $N$ el número de días de exposición al
año. $S_{\mathrm{stat}} = m_z \times 9{,}81\ \mathrm{m/s^2}$ es la tensión
compresiva estática que la columna ya soporta bajo la gravedad — 0,284 MPa con
el $m_z$ masculino, 0,245 MPa con el femenino (`vibration.static_stress`) — y
$S_{\mathrm{age}}$ es la pérdida anual de resistencia última, 0,052 MPa/año en
hombres y 0,039 MPa/año en mujeres (`vibration.ultimate_strength`, que devuelve
5,71 MPa a los 20 años y 4,67 MPa a los 40 en un hombre). El denominador es,
por tanto, un *margen*: $R$ crece tanto porque la dosis se acumula día tras día
como porque ese margen se estrecha en $S_{\mathrm{age}}$ cada año, así que la
misma dosis diaria daña más a una columna más envejecida.

Un modelo de Weibull convierte $R$ en la probabilidad de lesión lumbar
(Fórmula C.5):

$$
\Pi(R) = 1 - \exp\!\left[-\left(\frac{R}{\alpha}\right)^{\beta}\right].
$$

```python
from phonometry import vibration

# Ejemplo del Anexo C: 5 x 40 m/s2/día, hombre de 82 kg, edad 20 durante 20
# años, 120 días/año.
dz = vibration.dose_from_peaks([40.0] * 5)
sd = vibration.compression_dose(dz)                     # 1.62 MPa
r = vibration.injury_risk(sd, start_age=20, years=20, days_per_year=120)
print(round(r, 2))                               # 1.22
print(round(100 * vibration.injury_probability(r)))     # 37  % de riesgo de lesión
```

### Leer $R$ (Tabla C.2)

$R$ no tiene unidades ni significado hasta que se pone en la escala de la
Tabla C.2, que da el valor asociado a un riesgo de lesión del 10 %, del 50 % y
del 90 % para cada sexo:

| Riesgo de lesión | 10 % | 50 % | 90 % |
| :--- | :--- | :--- | :--- |
| Hombre | 0,72 | 1,42 | 2,17 |
| Mujer | 0,52 | 0,87 | 1,20 |

Las cuatro bandas que recortan esos umbrales son las que imprime la ficha de la
sección 6: por debajo del valor del 10 %, probabilidad **baja** de un efecto
adverso para la salud; entre el 10 % y el 50 %, **moderada**; entre el 50 % y el
90 %, **alta**; y por encima del valor del 90 %, **muy alta**. El ejemplo
masculino de arriba, $R$ = 1,22, cae en la banda moderada, que es lo que concluye
el propio ejemplo resuelto de la norma.

**El valor por defecto importa.** `compression_dose` toma `mz` e `injury_risk`
toma `sex`, y ambos usan por defecto los valores masculinos. Ejecutar la *misma
exposición* para una mujer de 64 kg no solo cambia el número: cambia el
veredicto.

```python
for sex, mz in (("male", 0.029), ("female", 0.025)):
    sd_sex = vibration.compression_dose(dz, mz=mz)
    r_sex = vibration.injury_risk(sd_sex, start_age=20, years=20,
                                  days_per_year=120, sex=sex)
    print(sex, round(sd_sex, 2), round(r_sex, 2),
          round(100 * float(vibration.injury_probability(r_sex, sex=sex))))
# male   1.62 1.22 37   -> moderada  (10 % < riesgo < 50 %)
# female 1.40 0.96 64   -> alta      (50 % < riesgo < 90 %)
```

La tensión compresiva más baja cae en la banda más alta, porque los umbrales
femeninos de la Tabla C.2 son todavía más bajos. La NOTA 5 del Anexo C recoge el
mismo resultado para esta exposición y cita $R$ = 0,97 frente al 0,96 calculado
aquí, un redondeo de su propio $S_\mathrm{d}$ impreso; la banda, y por tanto el veredicto,
es la misma. Los coeficientes $\alpha$ y $\beta$ de la Fórmula (C.5) y los
umbrales de la Tabla C.2 para sujetos femeninos se apoyan en un conjunto de datos
más pequeño, como anota la norma al pie de ambas tablas.

Desde un registro temporal medido, toda la cadena es una sola llamada:

```python

from phonometry import vibration

# Un registro sintético de asiento de 10 s a 256 Hz con cinco choques de
# 60 m/s2 (sustituto de un az(t) medido).
fs = 256.0
az = np.zeros(2560)
az[256::512] = 60.0
result = vibration.multiple_shock_assessment(
    az, fs, start_age=20, years=20, days_per_year=120, sex="male",
    measurement_time=10.0,      # t_m: el registro dura 10 s
    exposure_time=4 * 3600.0,   # t_d: 4 h al día en este vehículo
)
print(round(result.acceleration_dose, 2))  # 20.94  m/s2, sobre el registro de 10 s
print(round(result.daily_dose, 2))         # 70.35  m/s2, Fórmula 4 escalada a td
print(round(result.risk, 2))               # 1.53
print(round(result.probability, 2))        # 0.58

result.plot()   # la curva de probabilidad de lesión con la R de esta evaluación marcada (requiere matplotlib)
```

`exposure_time` y `measurement_time` son los que implementan aquí la Fórmula 4.
Si se omiten, la dosis medida se toma sin cambios como dosis diaria, lo cual
solo es correcto cuando el registro ya cubre toda la exposición diaria: para
este registro de 10 s y una jornada de 4 h ese atajo divide la dosis entre
$(t_\mathrm{d}/t_\mathrm{m})^{1/6} = 3{,}36$ y declara $R = 0{,}46$ en lugar de $1{,}53$ — un 3 %
de probabilidad de lesión donde la exposición da un 58 %.

<details>
<summary>Mostrar el código de esta figura</summary>

```python

from phonometry import vibration

fig, (ax_h, ax_r) = plt.subplots(1, 2, figsize=(12.5, 5.4))

# Izquierda: la magnitud de la función de transferencia asiento-columna (Fórmula 1).
f = np.logspace(np.log10(0.5), np.log10(80.0), 400)
ax_h.plot(f, np.abs(vibration.seat_to_spine_transfer(f)), label="|H(f)|")
ax_h.set_xscale("log")
ax_h.set_xlabel("Frecuencia [Hz]")
ax_h.set_ylabel("Transmisibilidad  asiento -> columna")
ax_h.legend()

# Derecha: la probabilidad de lesión de Weibull para ambos sexos, con el
# ejemplo masculino del Anexo C (cinco picos de respuesta de 40 m/s2 al día)
# marcado, que es la R que imprime la figura, no la R del registro sintético
# de 10 s de arriba.
grid = np.linspace(0.0, 3.0, 300)
for sex, etiqueta in (("male", "hombre"), ("female", "mujer")):
    ax_r.plot(grid, 100.0 * vibration.injury_probability(grid, sex=sex), label=etiqueta)
sd = vibration.compression_dose(vibration.dose_from_peaks([40.0] * 5))
r = vibration.injury_risk(sd, start_age=20, years=20, days_per_year=120)
for level, r_level in zip((10, 50, 90), (0.72, 1.42, 2.17)):  # Tabla C.2, hombre
    ax_r.axhline(level, color="#7f7f7f", linestyle=":", lw=0.8)
    ax_r.plot([r_level, r_level], [0.0, level], color="#7f7f7f", linestyle=":", lw=0.8)
ax_r.scatter([r], [100.0 * vibration.injury_probability(r)], marker="*", s=160,
             label=f"Ejemplo  R = {r:.2f}")
ax_r.set_xlabel("Variable de tensión R")
ax_r.set_ylabel("Probabilidad de lesión lumbar [%]")
ax_r.legend()
plt.show()
```

</details>

El `MultipleShockResult` lleva la dosis $D_z$, la dosis diaria $D_{z\mathrm{d}}$, la
tensión compresiva $S_\mathrm{d}$, la variable de tensión $R$, la probabilidad de lesión
y los picos de respuesta, y su `.plot()` dibuja la curva de probabilidad de
lesión con los umbrales de riesgo del 10/50/90 % de la Tabla C.2. El modelo es
solo para el
eje vertical: el apartado 4 desprecia por diseño las contribuciones horizontales
a la compresión espinal, y el modelo espinal horizontal de la edición de 2004,
retirada, no se restablece, de modo que la exposición horizontal de cuerpo
entero se evalúa con las métricas eficaz, eficaz móvil/MTVV y VDV de
[Vibración en humanos](/phonometry/es/vibration/human/human-vibration/) (ISO 2631-1).

## 6. El informe de riesgo para la salud

La cadena de dosis existe para ponerla por escrito y leerla frente a la
orientación del anexo C. `MultipleShockResult.report()` escribe una hoja de
evaluación del riesgo para la salud en PDF de una página: la línea de base
normativa (respuesta espinal del apartado 5 y modelo de riesgo del anexo C),
una cabecera de metadatos opcional (cliente, sujeto, puesto de trabajo/vehículo,
instrumentación, calibración), la rejilla del escenario de exposición (sexo del
sujeto, la edad $b$ al inicio de la exposición, el número de años de exposición
$n$, el número de días de exposición por año $N$ y el número de choques de
respuesta contabilizados) y la tabla de análisis de dosis y tensión con la dosis
de aceleración $D_z$ (Fórmula 3), la dosis diaria $D_{z\mathrm{d}}$ (Fórmula 4), la
tensión compresiva diaria $S_\mathrm{d}$ (Fórmula C.1), la variable de tensión acumulada
$R$ (Fórmula C.3) y la probabilidad de lesión lumbar $\Pi$ (Fórmula C.5).

Como la ISO 2631-5:2018 no define ningún límite de exposición, la ficha lleva
una **fila de zona** con la banda de riesgo en lugar de un veredicto CUMPLE/NO
CUMPLE: el $R$ y el $\Pi$ recuadrados nombran la clasificación del riesgo del
anexo C, y una tabla de clasificación sitúa $R$ entre las variables de tensión
de la Tabla C.2 para un riesgo de lesión del $10$ / $50$ / $90$ %
(probabilidad baja / moderada / alta / muy alta de un efecto adverso para la
salud), con la curva de probabilidad de lesión encima. `language="es"`
genera la ficha en español (decimales con coma).

El argumento `metadata` acepta un `ReportMetadata` cuyos campos relevantes para
un informe de choques múltiples son `client`, `specimen` (el sujeto),
`test_room` (el puesto de trabajo o vehículo), `test_date`, `instrumentation`,
`calibration` y la identidad de pie `laboratory`, `operator`, `report_id` y
`notes`.

```python

from phonometry import vibration, ReportMetadata

# El ejemplo resuelto del anexo C: cinco choques de respuesta espinal de
# 40 m/s2 al día, hombre de 82 kg, expuesto desde los 20 años durante 20 años a
# 120 días/año. El registro se reconstruye a partir de esos picos de respuesta
# (la norma plantea el ejemplo en términos de los picos), de modo que la ficha
# imprime los valores publicados del anexo C. Los cinco picos son toda la
# jornada, así que td = tm y daily_dose es dz sin escalar.
peaks = np.array([40.0] * 5)
dz = vibration.dose_from_peaks(peaks)
sd = vibration.compression_dose(dz)
r = vibration.injury_risk(sd, start_age=20, years=20, days_per_year=120)
result = vibration.MultipleShockResult(
    sex="male",
    acceleration_dose=dz,
    daily_dose=dz,
    compression_dose=sd,
    risk=r,
    probability=float(vibration.injury_probability(r)),
    start_age=20.0,
    years=20,
    days_per_year=120.0,
    peaks=peaks,
    risk_thresholds=(0.72, 1.42, 2.17),   # Tabla C.2, hombre: riesgo del 10 / 50 / 90 %
)

result.report(
    "multiple_shock.pdf",
    metadata=ReportMetadata(
        client="Operador de transporte de ejemplo",
        specimen="Operador varón de 82 kg (sentado)",
        test_room="Vehículo todoterreno, asiento del conductor",
        report_id="EXAMPLE-2631-5",
    ),
    language="es",
)   # R = 1,22, Pi = 37 % -> probabilidad moderada de un efecto adverso para la salud
```

La ficha de ejemplo se regenera con `make reports` y se mantiene renderizada en
el repositorio; pulsa la vista previa para abrir el PDF.

## Qué cubre esta guía

El apartado 5 y el Anexo C de la ISO 2631-5:2018. Los requisitos de
adquisición y acondicionamiento de los apartados 5.1.2 a 5.1.4 como
orientación; la función de transferencia asiento-columna del apartado 5.2
(`seat_to_spine_transfer`, `spinal_response`, `response_peaks`); la dosis de
aceleración del apartado 5.3 y la dosis diaria de la Fórmula 4
(`dose_from_peaks`, `acceleration_dose`, `daily_dose`, y el par
`measurement_time` / `exposure_time` de `multiple_shock_assessment`); y la
tensión compresiva, la variable de tensión acumulada y la probabilidad de
Weibull del Anexo C con sus coeficientes de la Tabla C.1 y sus umbrales de la
Tabla C.2 (`compression_dose`, `static_stress`, `ultimate_strength`,
`injury_risk`, `injury_probability`, `multiple_shock_assessment`,
`MultipleShockResult.report`).

El modelo de elementos finitos de los Anexos A / E para las exposiciones
*menos severas* del apartado 4 (ocupantes que permanecen sentados en todo
momento, que es la mayor parte del trabajo agrícola y de movimiento de
tierras) lo distribuye ISO como software aparte y no está implementado aquí;
un registro de ese régimen no tiene recorrido por esta página. Tampoco lo está
el modelo espinal horizontal de la edición retirada de 2004, así que la
exposición horizontal de cuerpo entero va a las métricas eficaz, eficaz
móvil/MTVV y VDV de [Vibración en
humanos](/phonometry/es/vibration/human/human-vibration/). La cadena de
acondicionamiento de la sección 2 es cosa de quien llama: `spinal_response` da
por supuesto un registro al que ya se le ha comprobado el signo, se ha partido
en las fronteras de pérdida de contacto, se le ha corregido el offset, se le
ha aplicado la ventana y se le ha limitado la banda.

## Véase también

- [Vibración en humanos](/phonometry/es/vibration/human/human-vibration/): la cadena de ISO 2631-1 a la que esta página devuelve los ejes horizontales, y el factor de cresta y los cocientes del apartado 6.3.3 que deciden si un registro pertenece aquí siquiera.
- Referencia de la API: [`vibration.human.multiple_shock`](/phonometry/es/reference/api/vibration/multiple-shock/).
- Teoría: [Choques múltiples (ISO 2631-5)](/phonometry/es/reference/theory/vibration/#choques-múltiples-iso-2631-5): el modelo de respuesta de la ISO 2631-5, la dosis de aceleración y la ley de riesgo de Weibull.
