Docs

El método se desarrolló en 09W3 (W en RMP) y en 09W4 se generalizó a todas
las especies. Se llama con analyze_shot(shot), Shot.analyze_injections()
o GroupShots.analyze_injections().

Pasos

  1. Señal: shot.emission(shot.default_signal), la línea de núcleo con signo
    físico.
  2. Detección, con find_injections(shot).
    • El barrido scan_injections busca subidas de la señal suavizada (5 pts)
      en 30 ms mayores que k=8 sigma (MAD).
    • Los eventos cerca de un -lboN.txt (−80/+200 ms) quedan con
      source="lbo file".
    • Un evento no listado queda con source="detected" si
      z >= max(z_strong=30, z_rel=0.2 * z_max_listado), o si cae en la grilla
      de disparo del shot (grid_period=1 s, misma fase ±30 ms que las
      listadas, y solo si estas tienen fase consistente).
    • extra_times=[...] y exclude_times=[...] corrigen a mano.
    • El barrido completo queda en df.attrs["candidates"].
  3. Caracterización, con characterize_injection(t, y, t_ref): pico (máximo
    suavizado en −80/+200 ms), baseline y ruido (100 ms antes del onset,
    iterado), onset (último punto bajo baseline + 4σ/√3), amplitud, SNR,
    t_onset_to_peak_ms y t_rise_10_90_ms.
  4. Ventana de decaimiento, con decay_end: va desde el pico hasta
    t_peak + t_max (DECAY_T_MAX: W 0.45 s; Fe/Ni/Mo 0.6 s). Se recorta 50 ms
    antes de la siguiente inyección o de un escalón de ECRH (heating_steps),
    y al final de los datos.
  5. Curva normalizada, con decay_curve: tr = t − t_peak,
    yn = (I − baseline)/A. Nunca incluye la subida.
  6. Ajustes (aug.models.exponential):
    • fit_single_exp: a·exp(−t/τ) + b.
    • fit_double_exp: a_f·exp(−t/τ_f) + a_s·exp(−t/τ_s) + b, multi-start,
      τ_f ∈ [6, 60] ms. τ_imp = τ_s. Es identificable si cada amplitud
      es ≥ 0.1, τ_s > 1.5 τ_f, τ_f no está en la cota, σ(τ_s) < 50 % y
      τ_s < 0.75 × la ventana.
    • select_decay_model elige "double" solo si el F-test da p < 0.05,
      ΔAIC > 2 y el ajuste es identificable.
    • block_bootstrap_tau estima el error de τ (simple) con un moving-block
      bootstrap
      de los residuos (bloques de 10 muestras).
    • fit_rise_decay: modelo de subida + decaimiento, como chequeo (τ_r y τ_d
      salen correlacionados).
  7. Sensibilidad a la ventana: τ simple con inicio en pico + {0, 10, 20, 40} ms
    y largo {⅔, 1, 4/3}·t_max. Da tau_sys_ms (semi-rango p16-p84).
  8. Contexto, con plasma_context: P_ECRH_MW, P_NBI_MW, Te_c_keV,
    ne_1e19, Wmhd_kJ, Ip_MA, Zeff; elm_rate (picos de Ipolsola);
    dFe23_sigma (cambio de Fe23+ en la ventana, para shots que no son de Fe).
  9. Flags (FLAGS). clean significa sin flags.

τ adoptado

Flags

Flag Condición
ECRH_step escalón de ECRH < 150 ms antes del onset
Fe_influx Fe23+ sube > 5σ durante la ventana (solo especie ≠ Fe)
no_decay R² del simple < 0.5
low_snr amplitud < 5σ
ELMy > 10 ELMs/s durante el decaimiento (solo régimen RMP)
window_sensitive tau_sys_ms > 30 % de τ
short_window ventana < 100 ms o más corta que τ
fit_failed algún ajuste no convergió, o hay < 10 puntos

InjectionSet

res = group.analyze_injections()
res.table                       # DataFrame, una fila por inyección
res.details[(shot, inj)]        # dict: t, y, char, t_end, tr, yn, model, rd, boot, sens
res_a + res_b                   # concatena

Columnas principales de res.table: dataset, regime, species, heating, signal, shot, inj, source, t_ref, t_onset, t_peak, snr, t_onset_to_peak_ms, t_rise_10_90_ms, tau_rise_ms, window_ms, tau_1exp_ms, tau_1exp_err_ms, tau_1exp_err_boot_ms, tau_sys_ms, r2_1exp, tau_slow_2exp_ms, tau_slow_2exp_err_ms, tau_fast_2exp_ms, a_fast, a_slow, identifiable_2exp, p_F, dAIC, recommended, tau_imp_ms, tau_imp_err_ms, P_ECRH_MW, P_NBI_MW, Te_c_keV, ne_1e19, Ip_MA, elm_rate_decay_Hz, dFe23_sigma, <flags>, clean, flags.