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
- Señal:
shot.emission(shot.default_signal), la línea de núcleo con signo
físico. - Detección, con
find_injections(shot).- El barrido
scan_injectionsbusca subidas de la señal suavizada (5 pts)
en 30 ms mayores quek=8sigma (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=[...]yexclude_times=[...]corrigen a mano.- El barrido completo queda en
df.attrs["candidates"].
- El barrido
- 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_msyt_rise_10_90_ms. - 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. - Curva normalizada, con
decay_curve:tr = t − t_peak,
yn = (I − baseline)/A. Nunca incluye la subida. - 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,τ_fno está en la cota,σ(τ_s) < 50 %y
τ_s < 0.75 ×la ventana.select_decay_modelelige "double" solo si el F-test dap < 0.05,
ΔAIC > 2 y el ajuste es identificable.block_bootstrap_tauestima 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).
- Sensibilidad a la ventana: τ simple con inicio en pico + {0, 10, 20, 40} ms
y largo {⅔, 1, 4/3}·t_max. Datau_sys_ms(semi-rango p16-p84). - Contexto, con
plasma_context:P_ECRH_MW,P_NBI_MW,Te_c_keV,
ne_1e19,Wmhd_kJ,Ip_MA,Zeff;elm_rate(picos deIpolsola);
dFe23_sigma(cambio de Fe23+ en la ventana, para shots que no son de Fe). - Flags (
FLAGS).cleansignifica sin flags.
τ adoptado
- Si
recommended == "single",tau_imp_ms = tau_1exp_msy el error
estadístico es el máximo entre la covarianza y el bootstrap. - Si
recommended == "double",tau_imp_ms = tau_slow_2exp_mscon el error
de la covarianza. tau_imp_err_ms= estadístico ⊕tau_sys_ms.
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.