SPIRAL2 LLRF fault-diagnosis pipeline

A working companion to the pipeline behind the LLRF fault-diagnosis paper: how raw superconducting-cavity postmortem buffers become labeled events, features, and models. Built up together, step by step — each section below fills in with real plots and notes as we explore it in conversation, rather than all at once.

Raw files scanned 14,232
Events (V7) 2,865
Normal 1,478
Fault (7 categories) 1,387
Features 810

Data & code availability. The structured feature matrix, ground-truth labels, intermediate signal data, feature ontology, and full results manifest underlying this page are archived on Zenodo: doi.org/10.5281/zenodo.22729653. Pipeline code: github.com/aghribi/LLRF_SP2_pipeline.

Pipeline at a glance

One trunk — extraction through feature engineering — then five independent consumers of the same feature matrix, converging into a shared explainability and reporting layer. This is an orientation diagram for our own exploration, distinct from the paper's own fig:pipeline_overview (still a hand-drawn placeholder there).

DATA FOUNDATION PREPROCESSING & FEATURES Raw postmortem files 14,232 files, 2019–2025 Ground-truth labeling Classify_PostMortemFile label ≠ Filtré Quality filter 2,110 events pass Preprocessing HP filter · align · Z-score Feature engineering 777 features (V6) MODELING — INDEPENDENT CONSUMERS OF THE FEATURE MATRIX Precursor detection Steps 04–05 · 386-feat. subset unsupervised ensemble + RF Binary classification Step 06b · pre-trigger only LogReg / RF / XGBoost / SVM Multi-label classification Step 07/07b · sup. + unsup. · both windows BR · CC · LP · clustering ARI/NMI Root cause ID Step 08 target = argmax(y) Subtype clustering Step 09 · per category K-Means / Agglom. / GMM Explainability & reporting SHAP · results manifest → LaTeX macros
Raw LLRF postmortem buffers are decoded by PyPostMortem, labeled by the deterministic ground-truth classifier Classify_PostMortemFile into seven fault categories, quality-filtered, then preprocessed (high-pass filter, per-file trigger alignment, Z-score normalization) into a 777-feature matrix. Five modeling tasks each consume that matrix independently — root cause's target is the same fault-label vector multi-label classification uses, not multi-label's model output, so the two are siblings rather than chained. Diagram drawn from report/sections/03_system_description.tex and 04_methodology.tex as of the 2026-09-07 revision; no fabricated numbers.

00

Data foundation

prepare_data_cluster_v7.py Confirmed 2026-09-09

Every event starts as a raw postmortem buffer captured by the LLRF system's trigger logic across 27 monitored signals. Labels come from Classify_PostMortemFile, a deterministic classifier built on the first hardware fault-register bit to trip chronologically — not the older, less reliable summary ALM header field this pipeline used to rely on. Four of the seven categories get a further physics-threshold refinement on top of that hardware decode: a cavity-voltage fall of at least 50% within a bounded time window separates a genuine quench from a false alarm; the reflected-power/cavity-voltage ratio Ucav/Ucat > 8.5 marks an RF safety threshold exceedance; oscillation, gain, and beam-anomaly subtypes of RF regulation out of tolerance come from Z-score+FFT analysis of the drive and reflected signals. The remaining three categories are the hardware decode alone.

Of 14,232 raw files scanned (2019–2025), 102 fail to parse and 20 are zero-byte, leaving 14,109 ground-truth rows. Before any of the seven fault categories or Normal is even considered, each file must pass six validity checks — in order, so a file failing an earlier check is never evaluated against a later one. Chart below reflects the corrected classifier (re-run 2026-09-09, see the callout further down) — the check order and the four reliability/state checks are unchanged, only the feed-forward check's scope changed:

0 800 1,600 2,400 3,200 Feed-forward off (2021+ only) 3,229 KPI < 10 3,168 Loop OFF 2,878 AMPT > 10% 1,187 Ucav too low 753 Mask problem 28
11,243 of 14,109 files (79.7%) fail this filter, down from 85.0% before the fix — leaving 2,866 that pass. Feed-forward off is still the single largest reason but is no longer overwhelmingly dominant (was 8,205 files / 68% of all rejections when the check ran unscoped in every year; now 3,229 / 28.7%, since it no longer fires at all pre-2021). The files it stopped intercepting didn't all become valid — most now correctly fail a later check instead (KPI and Loop OFF absorbed most of the difference), which is exactly the cascade behaving as intended once the first gate is scoped correctly. AMPT/KPI are per-file acquisition-quality metrics, not state flags; Ucav/mask are direct signal/metadata validity checks. Counts from the re-run LLRF_result.csv, 2026-09-09.
Correction, applied and confirmed 2026-09-09 BEAM=NON in the header doesn't mean "no beam present" — it means feed-forward disabled, and the field has only been operationally meaningful since 2021 (before that it defaults to NON because feed-forward didn't exist yet: 2019 100.0%, 2020 96.4% of files header-flagged NON, vs. a genuine 50.3%→9.3% decline from 2021→2025). Classify_PostMortemFile's _check_filters() has been fixed to scope the check to 2021+ (gated on the acquisition's own header DATE field) and re-run against the full 2019–2025 corpus.
0% 25% 50% 75% 100% 100% 2019 96% 2020 50% 2021 31% 2022 37% 2023 24% 2024 9% 2025 field not yet meaningful
Share of each year's files flagged BEAM=NON (a raw header statistic, unaffected by the fix itself). 2019–2020 (faded bars) sit at a constant ~100%, consistent with feed-forward not existing yet; 2021 on is a genuine, declining operational choice.

Fixing the scope recovers real events — not an estimate this time, the classifier has actually been re-run against the full corpus and the before/after is a direct diff:

before fix after fix (confirmed) 0 200 400 600 800 +73 2019 +683 2020 2021 2022 2023 2024 2025
Ground-truth-passing events per year, before vs. after the fix, direct diff of the two CSVs. 2019: 0→73. 2020: 76→759. 2021–2025: exactly unchanged, 0 rows gained or lost in any of those five years — confirming the fix touches exactly what it should and nothing else.
2,110 → 2,866 +756 events (+35.8%), confirmed. All of the gain is 2019 (+73) and 2020 (+683); every other year is byte-identical to before. This is the corrected ground-truth pool — the feature-engineered dataset (V6, 2,109 events) has now been re-extracted against it as V7 (2,865 events, validated — see the Status note below). The stat strip at the top of this page and everything below step 00 still describes V6 until steps 01–08 are re-run against V7 (Phase 2, not started).

Is the header trustworthy, or could a stuck bit be discarding files that were actually running? — the coherence check from before the correction, still valid as a read of what the header field itself behaves like (the sample below was drawn from the old, unscoped Beam NON grouping, which mixes pre-2021 defaulted-NON files with genuine post-2021 feed-forward-off files — useful for checking the flag's physical meaning, not a current rejection-count figure; see the corrected counts above for that). For a random sample of files in each rejected group (n=100, plus a 150-file passing baseline mixing Normal and every fault category), we read the real cavity-voltage (Ucav) and drive (Uci) waveform amplitude via PyPostMortem, independent of the header flags that got the file rejected.

passes quality filter (baseline) rejected by quality filter baseline IQR (1.4–4.1 MV/m) 2022 10 07 CMB01-CAV2_0016: Ucav=3.220 MV/m 2021 12 03 CMA06_0006: Ucav=0.549 MV/m 2021 09 28 CMA01_0001: Ucav=1.288 MV/m 2023 10 17 CMB01-CAV1_0002: Ucav=3.259 MV/m 2023 10 10 CMB07-CAV1_0001: Ucav=6.518 MV/m 2021 07 21 CMA10_0006 10, 2E-4 FFOUI 1mA: Ucav=6.449 MV/m 2021 07 21 CMA11_0004: Ucav=0.443 MV/m 2021 07 21 CMA10avecff_0024: Ucav=1.072 MV/m 2021 12 03 CMA04_0005: Ucav=0.417 MV/m 2021 07 30 CMA10_0014: Ucav=6.449 MV/m 2021 11 16 CMB01-CAV1_0008: Ucav=4.062 MV/m 2022 09 30 CMB07-CAV2_0001: Ucav=3.118 MV/m 2022 10 07 CMB01-CAV2_0043: Ucav=3.220 MV/m 2023 11 16 CMA01_0005: Ucav=1.275 MV/m 2023 11 16 CMA05_0003: Ucav=1.686 MV/m 2022 09 15 CMA05_0002: Ucav=0.513 MV/m 2021 11 16 CMB03-CAV1_0001: Ucav=7.225 MV/m 2025 10 20 CMB01-CAV1_0001: Ucav=6.157 MV/m 2023 11 16 CMA02_0003: Ucav=1.329 MV/m 2021 07 21 CMA10avecff_0010: Ucav=1.537 MV/m 2025 10 18 CMA08_0019: Ucav=5.465 MV/m 2023 10 10 CMA06_0001: Ucav=1.964 MV/m 2022 08 30 CMA08_0007: Ucav=1.624 MV/m 2022 10 20 CMB06-CAV1_0001: Ucav=4.060 MV/m 2020 11 18 CMA01_0003_6kw: Ucav=0.633 MV/m 2021 07 21 CMA10avecff_0002: Ucav=6.449 MV/m 2025 10 13 CMB01-CAV1_0001: Ucav=6.475 MV/m 2022 09 13 CMB01-CAV2_0001: Ucav=2.892 MV/m 2021 12 03 CMB03-CAV2_0008: Ucav=3.286 MV/m 2023 10 19 CMB01-CAV2_0001: Ucav=5.418 MV/m 2022 10 12 CMB06-CAV1_0003: Ucav=6.771 MV/m 2025 10 17 CMA08_0016: Ucav=5.465 MV/m 2023 10 19 CMB06-CAV1_0001: Ucav=6.601 MV/m 2025 10 13 CMA04_0002: Ucav=1.479 MV/m 2022 10 14 CMA08_0001: Ucav=3.155 MV/m 2021 11 26 CMB02-CAV1_0008: Ucav=3.736 MV/m 2021 07 21 CMA10avecff_0023: Ucav=1.143 MV/m 2021 11 26 CMB02-CAV1_0025: Ucav=3.766 MV/m 2023 10 12 CMA04_0001 (1): Ucav=0.748 MV/m 2024 11 08 CMA02_0002: Ucav=0.671 MV/m 2024 11 28 CMA04_0001: Ucav=0.740 MV/m 2022 10 07 CMB01-CAV2_0042: Ucav=2.924 MV/m 2020 11 08 CMA07_0003: Ucav=0.700 MV/m 2020 11 18 CMA02_0001: Ucav=0.752 MV/m 2022 09 20 CMA08_0004: Ucav=1.588 MV/m 2024 11 04 CMA02_0002: Ucav=0.671 MV/m 2022 09 25 CMB07-CAV2_0008: Ucav=2.533 MV/m 2022 09 25 CMA03_0001: Ucav=1.396 MV/m 2025 10 13 CMB07-CAV1_0002: Ucav=6.518 MV/m 2024 11 20 CMA12_0001: Ucav=3.232 MV/m 2021 12 03 CMA03_0017: Ucav=0.390 MV/m 2025 10 14 CMA12_0001: Ucav=6.489 MV/m 2025 10 02 CMB02-CAV2_0001: Ucav=6.426 MV/m 2023 10 12 CMA11_0001: Ucav=2.633 MV/m 2021 12 03 CMB03-CAV1_0007: Ucav=3.539 MV/m 2023 09 22 CMA11_0001: Ucav=2.620 MV/m 2021 12 03 CMB01-CAV1_0006: Ucav=3.298 MV/m 2023 09 22 CMB03-CAV1_0002: Ucav=3.308 MV/m 2023 10 17 CMA08_0001: Ucav=3.131 MV/m 2024 09 27 CMB06-CAV2_0001: Ucav=6.113 MV/m 2021 11 30 CMB04-CAV1_0001: Ucav=3.403 MV/m 2025 10 14 CMA01_0001: Ucav=1.277 MV/m 2022 09 15 CMB01-CAV2_0001: Ucav=3.335 MV/m 2025 10 01 CMB06-CAV2_0001: Ucav=6.066 MV/m 2022 10 14 CMB07-CAV2_0005: Ucav=3.101 MV/m 2022 10 04 CMB07-CAV2_0003: Ucav=3.118 MV/m 2021 11 26 CMB02-CAV1_0021: Ucav=3.851 MV/m 2025 10 02 CMA07_0002: Ucav=3.163 MV/m 2021 07 21 CMA10avecff_0050: Ucav=2.598 MV/m 2023 11 16 CMB02-CAV1_0002: Ucav=6.732 MV/m 2024 11 26 CMA02_0001: Ucav=0.599 MV/m 2020 11 18 CMA02_0003_16kw_off 75-0.1 FF: Ucav=0.380 MV/m 2022 09 30 CMA12_0002: Ucav=5.569 MV/m 2023 10 19 CMB04-CAV1_0006: Ucav=3.278 MV/m 2022 10 07 CMB01-CAV2_0088: Ucav=2.972 MV/m 2022 09 14 CMB01-CAV2_0002: Ucav=3.247 MV/m 2021 07 21 CMA10avecff_0017: Ucav=0.191 MV/m 2021 07 21 CMA10avecff_0025: Ucav=1.187 MV/m 2023 08 07 CMA04_0001_DAbsence autorisation RF: Ucav=3.236 MV/m 2024 10 21 CMA11_0001 (1): Ucav=2.029 MV/m 2025 10 06 CMB07-CAV1_0001: Ucav=6.518 MV/m 2021 10 06 CMA12_0003: Ucav=7.887 MV/m 2025 10 18 CMB01-CAV2_0001: Ucav=5.155 MV/m 2025 10 03 CMA06_0001: Ucav=1.964 MV/m 2021 12 03 CMA12_0004: Ucav=3.958 MV/m 2023 10 19 CMA07_0001: Ucav=2.487 MV/m 2024 11 28 CMA02_0001: Ucav=0.679 MV/m 2023 10 19 CMB02-CAV1_0003 cw DPCI=+5: Ucav=6.685 MV/m 2021 11 26 CMB02-CAV1_0018: Ucav=3.810 MV/m 2022 10 14 CMB05-CAV2_0001: Ucav=6.139 MV/m 2021 12 03 CMB04-CAV2_0004: Ucav=3.536 MV/m 2024 09 12 CMB01-CAV1_0001 8000: Ucav=6.293 MV/m 2021 11 19 CMA09_0004: Ucav=1.303 MV/m 2021 12 03 CMB03-CAV1_0006: Ucav=3.539 MV/m 2021 10 06 CMA05_0001: Ucav=2.074 MV/m 2024 11 18 CMA04_0001: Ucav=2.105 MV/m 2024 09 27 CMA03_0001: Ucav=1.403 MV/m 2022 10 07 CMB01-CAV1_0003: Ucav=3.254 MV/m 2022 10 07 CMB01-CAV2_0035: Ucav=3.220 MV/m 2025 10 17 CMA09_0005: Ucav=6.911 MV/m 2025 10 02 CMA08_0003: Ucav=5.465 MV/m 2025 10 15 CMA07_0001: Ucav=3.163 MV/m 2024 11 27 CMA12_0001: Ucav=6.139 MV/m 2023 11 16 CMA03_0005: Ucav=1.405 MV/m 2025 10 17 CMA05_0004: Ucav=1.617 MV/m 2024 11 08 CMA09_0002: Ucav=2.333 MV/m 2025 10 02 CMB07-CAV1_0002: Ucav=6.518 MV/m 2022 10 20 CMB01-CAV2_0010: Ucav=2.985 MV/m 2022 10 14 CMB07-CAV2_0004: Ucav=3.119 MV/m 2025 10 02 CMA07_0003: Ucav=3.163 MV/m 2021 07 30 CMA05_0002: Ucav=0.417 MV/m 2021 11 26 CMB02-CAV1_0044: Ucav=3.861 MV/m 2023 11 04 CMA04_0004 0 mA: Ucav=1.479 MV/m 2024 09 27 CMB02-CAV1_0005_D Absence autorisation RF: Ucav=3.388 MV/m 2023 09 01 CMA08_0007: Ucav=1.587 MV/m 2024 11 04 CMA05_0003: Ucav=0.850 MV/m 2025 10 13 CMA05_0002: Ucav=1.699 MV/m 2023 11 16 CMA07_0004: Ucav=2.498 MV/m 2021 07 21 CMA01_0021: Ucav=1.204 MV/m 2021 12 03 CMA05_0007: Ucav=0.532 MV/m 2023 07 28 CMA01_0009: Ucav=2.971 MV/m 2021 11 16 CMB02-CAV2_0002 5mA: Ucav=6.323 MV/m 2020 11 12 CMA06_0022: Ucav=1.042 MV/m 2022 10 07 CMB01-CAV2_0098: Ucav=2.972 MV/m 2021 11 16 CMB01-CAV1_0010: Ucav=1.351 MV/m 2023 10 19 CMB01-CAV1_0001: Ucav=6.476 MV/m 2021 11 26 CMB02-CAV1_0029: Ucav=3.929 MV/m 2021 11 16 CMA06_0002: Ucav=2.136 MV/m 2022 09 30 CMA05_0006: Ucav=0.671 MV/m 2023 11 16 CMB05-CAV1_0005: Ucav=6.915 MV/m 2022 09 17 CMB01-CAV2_0001: Ucav=2.684 MV/m 2024 11 04 CMB02-CAV1_0003: Ucav=3.378 MV/m 2021 07 30 CMA07_0002: Ucav=0.549 MV/m 2022 10 07 CMB04-CAV2_0071: Ucav=3.074 MV/m 2023 11 16 CMB06-CAV2_0001: Ucav=6.065 MV/m 2024 09 26 CMB05-CAV1_0001 test delai rampe: Ucav=4.954 MV/m 2022 10 07 CMB01-CAV2_0047: Ucav=3.219 MV/m 2023 09 04 CMA01_0001: Ucav=1.277 MV/m 2021 07 30 CMA08_0001 BL D1.9mA 10 0,01: Ucav=3.440 MV/m 2023 10 19 CMB02-CAV1_0002 cw DPCI=-3: Ucav=6.685 MV/m 2024 10 02 CMB02-CAV1_0004_D Absence autorisation RF: Ucav=3.387 MV/m 2024 11 28 CMA01_0001: Ucav=0.632 MV/m 2023 10 12 CMB01-CAV1_0001: Ucav=3.257 MV/m 2022 09 17 CMA12_0012: Ucav=5.536 MV/m 2021 07 21 CMA10avecff_0016: Ucav=0.879 MV/m 2024 11 04 CMB03-CAV1_0001: Ucav=3.318 MV/m 2025 10 20 CMB01-CAV2_0001: Ucav=5.155 MV/m 2022 09 30 CMA07_0004: Ucav=3.390 MV/m 2022 10 07 CMB01-CAV2_0030: Ucav=3.220 MV/m 2022 09 29 CMB07-CAV1_0039: Ucav=0.482 MV/m GT-passing n=150 2020 10 22 CMA10_0001: Ucav=1.749 MV/m 2020 12 08 CMB02-CAV1_0001: Ucav=0.002 MV/m 2023 07 28 CMA12_0003_D Absence autorisation RF: Ucav=0.002 MV/m 2019 10 22 CMA03_0001: Ucav=0.003 MV/m 2022 10 12 CMB01-CAV2_0006: Ucav=1.360 MV/m 2020 10 09 CMA09_0001: Ucav=0.003 MV/m 2020 07 17 CMA10_0015: Ucav=0.012 MV/m 2020 07 29 CMB03-CAV1_0002: Ucav=0.003 MV/m 2020 07 17 CMA10_0001: Ucav=0.003 MV/m 2021 06 28 CMB01-CAV2_0045: Ucav=0.733 MV/m 2020 09 14 CMA01_0004: Ucav=2.318 MV/m 2024 09 25 CMA01_0006 def regul: Ucav=0.645 MV/m 2020 10 22 CMA11_0018: Ucav=0.126 MV/m 2022 11 29 CMB05-CAV2_0004: Ucav=0.002 MV/m 2021 08 29 CMB01-CAV2_0001: Ucav=0.003 MV/m 2019 09 20 CMB06-CAV2_0001: Ucav=0.002 MV/m 2020 07 23 CMB04-CAV2_0001: Ucav=0.004 MV/m 2022 11 09 CMA10_0001: Ucav=6.542 MV/m 2020 12 06 CMA12_0001: Ucav=0.002 MV/m 2022 12 08 CMA01_0002: Ucav=0.001 MV/m 2020 10 09 CMB05-CAV1_0005: Ucav=0.087 MV/m 2019 12 06 CMB02-CAV2_0001: Ucav=0.002 MV/m 2022 10 19 CMB01-CAV2_0005: Ucav=1.055 MV/m 2020 07 17 CMA10_0024: Ucav=0.012 MV/m 2020 11 06 CMA07_0001: Ucav=1.390 MV/m 2019 10 22 CMB07-CAV1_0002: Ucav=0.080 MV/m 2019 11 05 CMA11_0004: Ucav=0.009 MV/m 2019 11 06 CMA10_0015: Ucav=0.133 MV/m 2024 09 19 CMB07-CAV1_0001: Ucav=0.001 MV/m 2020 09 05 CMB06-CAV1_0001: Ucav=0.116 MV/m 2020 10 06 CMB04-CAV1_0002: Ucav=6.768 MV/m 2021 06 25 CMB03-CAV1_0002: Ucav=3.183 MV/m 2019 10 31 CMB02-CAV2_0002: Ucav=0.962 MV/m 2019 10 09 CMB02-CAV1_0010: Ucav=3.423 MV/m 2021 06 17 CMB03-CAV1_0001: Ucav=3.574 MV/m 2022 09 17 CMA12_0007: Ucav=2.220 MV/m 2019 10 09 CMB03-CAV2_0002: Ucav=1.652 MV/m 2021 06 22 CMA12_0002 exp 6.5 MVpm: Ucav=2.986 MV/m 2021 09 03 CMB01-CAV2_0005: Ucav=0.003 MV/m 2020 09 14 CMB02-CAV1_0004: Ucav=3.191 MV/m 2021 11 26 CMA11_0007: Ucav=1.793 MV/m 2020 07 29 CMB07-CAV1_0001: Ucav=0.001 MV/m 2019 11 13 CMA06_0001: Ucav=0.002 MV/m 2020 07 27 CMB05-CAV1_0003: Ucav=3.335 MV/m 2023 09 18 CMA10_0002: Ucav=0.003 MV/m 2021 08 23 CMB01-CAV1_0005: Ucav=3.533 MV/m 2020 09 14 CMB01-CAV1_0001: Ucav=3.323 MV/m 2023 08 10 CMA08_0001: Ucav=0.002 MV/m 2020 09 30 CMA06_0001: Ucav=1.097 MV/m 2020 12 02 CMA10_0002: Ucav=1.750 MV/m 2019 10 15 CMB06-CAV2_0007: Ucav=3.897 MV/m 2020 07 23 CMB07-CAV1_0002: Ucav=2.163 MV/m 2022 12 11 CMA11_0004: Ucav=2.330 MV/m 2020 11 09 CMA10_0006: Ucav=2.047 MV/m 2021 09 14 CMA08_0001: Ucav=1.731 MV/m 2021 09 03 CMA05_0009: Ucav=0.654 MV/m 2020 12 02 CMA01_0001: Ucav=0.001 MV/m 2023 11 09 CMB03-CAV2_0001: Ucav=0.001 MV/m 2022 04 27 CMB04-CAV2_0004: Ucav=0.002 MV/m 2019 12 05 CMA09_0001: Ucav=0.002 MV/m 2019 09 05 CMA11_0016: Ucav=1.314 MV/m 2024 10 24 CMA03_0004: Ucav=0.707 MV/m 2019 12 03 CMA09_0001: Ucav=0.002 MV/m 2020 08 27 CMA09_0001: Ucav=2.588 MV/m 2020 09 29 CMA11_0001: Ucav=4.816 MV/m 2022 08 23 CMB04-CAV1_0001: Ucav=0.003 MV/m 2022 08 30 CMA09_0003: Ucav=2.354 MV/m 2021 07 29 CMB02-CAV1_0022: Ucav=0.654 MV/m 2019 10 22 CMB07-CAV2_0001: Ucav=0.002 MV/m 2020 09 23 CMA02_0005: Ucav=0.018 MV/m 2019 12 06 CMA09_0002: Ucav=0.002 MV/m 2020 10 16 CMB03-CAV1_0003: Ucav=3.556 MV/m 2019 10 28 CMB05-CAV1_0006: Ucav=3.781 MV/m 2022 08 23 CMB07-CAV2_0005: Ucav=2.873 MV/m 2020 10 22 CMB07-CAV1_0001: Ucav=3.022 MV/m 2019 09 06 CMA07_0005: Ucav=0.002 MV/m 2020 12 06 CMB05-CAV1_0001: Ucav=0.001 MV/m 2019 11 26 CMB07-CAV1_0002: Ucav=0.002 MV/m 2022 04 27 CMB04-CAV1_0008: Ucav=0.002 MV/m 2020 09 22 CMA11_0014: Ucav=4.816 MV/m 2020 07 17 CMB07-CAV2_0002: Ucav=0.495 MV/m 2020 10 01 CMA01_0001: Ucav=0.001 MV/m 2020 10 09 CMA11_0013: Ucav=1.057 MV/m 2020 11 06 CMA02_0003 noFF 75-0.1 4.5 mA: Ucav=0.752 MV/m 2019 10 23 CMA01_0001: Ucav=0.002 MV/m 2022 10 17 CMB07-CAV2_0001: Ucav=3.118 MV/m 2021 09 14 CMB04-CAV2_0001: Ucav=3.643 MV/m 2019 12 06 CMB05-CAV2_0002: Ucav=0.002 MV/m 2022 10 04 CMB07-CAV2_0005: Ucav=0.279 MV/m 2019 11 13 CMA09_0002: Ucav=0.018 MV/m 2020 10 19 CMA09_0001: Ucav=1.303 MV/m 2019 10 14 CMA12_0001: Ucav=3.244 MV/m 2021 09 03 CMB01-CAV2_0003: Ucav=0.003 MV/m 2021 12 10 CMB05-CAV1_0004: Ucav=0.236 MV/m 2021 09 03 CMB04-CAV2_0003: Ucav=0.002 MV/m 2020 12 08 CMB01-CAV2_0002: Ucav=3.281 MV/m 2022 09 25 CMB02-CAV1_0042: Ucav=0.178 MV/m 2019 09 18 CMA11_0001: Ucav=3.525 MV/m 2022 08 23 CMB05-CAV1_0001: Ucav=0.002 MV/m 2019 10 09 CMA07_0006: Ucav=4.691 MV/m Feed-forward off n=100 2024 10 11 CMB04-CAV2_0001: Ucav=0.002 MV/m 2023 11 06 CMA07_0002: Ucav=0.003 MV/m 2024 10 24 CMB06-CAV2_0004: Ucav=0.001 MV/m 2021 12 10 CMB05-CAV2_0001: Ucav=0.002 MV/m 2022 10 07 CMA09_0001: Ucav=0.001 MV/m 2021 10 22 CMB02-CAV2_0001: Ucav=0.002 MV/m 2023 09 05 CMB01-CAV1_0003: Ucav=0.002 MV/m 2022 09 20 CMA06_0001: Ucav=0.001 MV/m 2024 10 24 CMA02_0002: Ucav=0.673 MV/m 2023 08 17 CMA06_0001: Ucav=0.001 MV/m 2023 10 19 CMA09_0003: Ucav=0.001 MV/m 2024 11 08 CMB03-CAV1_0003: Ucav=0.002 MV/m 2022 09 06 CMA03_0002: Ucav=0.508 MV/m 2024 10 24 CMB03-CAV2_0002: Ucav=0.002 MV/m 2022 09 20 CMA07_0001: Ucav=0.003 MV/m 2022 10 21 CMB06-CAV1_0001: Ucav=0.001 MV/m 2023 08 24 CMB06-CAV1_0001: Ucav=0.001 MV/m 2025 09 04 CMB03-CAV1_0001: Ucav=6.260 MV/m 2025 09 04 CMB06-CAV2_0001: Ucav=5.968 MV/m 2022 09 30 CMB02-CAV1_0001: Ucav=0.002 MV/m 2023 08 24 CMB03-CAV1_0003: Ucav=0.002 MV/m 2021 11 19 CMB04-CAV1_0001: Ucav=0.002 MV/m 2022 09 20 CMA03_0005: Ucav=0.702 MV/m 2021 11 16 CMA12_0005: Ucav=0.004 MV/m 2023 10 19 CMB07-CAV1_0004: Ucav=0.001 MV/m 2025 09 05 CMB06-CAV2_0002: Ucav=0.001 MV/m 2025 09 19 CMB01-CAV2_0003: Ucav=0.003 MV/m 2025 09 05 CMA05_0001: Ucav=0.004 MV/m 2021 11 19 CMB03-CAV2_0001: Ucav=0.002 MV/m 2021 10 22 CMB05-CAV2_0001: Ucav=0.002 MV/m 2024 09 16 CMA11_0001: Ucav=0.004 MV/m 2022 10 21 CMA01_0006: Ucav=0.002 MV/m 2023 08 10 CMA02_0001: Ucav=0.001 MV/m 2023 08 11 CMA03_0002: Ucav=0.003 MV/m 2021 12 03 CMB05-CAV1_0002: Ucav=0.002 MV/m 2021 10 22 CMA09_0001: Ucav=0.002 MV/m 2022 09 20 CMA08_0002: Ucav=0.002 MV/m 2021 11 16 CMB04-CAV1_0004: Ucav=0.002 MV/m 2023 08 17 CMA05_0003: Ucav=2.448 MV/m 2023 09 05 CMB02-CAV1_0021: Ucav=0.002 MV/m 2022 10 07 CMB06-CAV2_0001: Ucav=0.001 MV/m 2025 10 03 CMA10_0004: Ucav=0.003 MV/m 2024 11 08 CMB06-CAV2_0001: Ucav=0.001 MV/m 2025 09 04 CMA02_0002: Ucav=0.413 MV/m 2021 12 03 CMA03_0002: Ucav=0.003 MV/m 2025 10 02 CMA08_0004: Ucav=0.002 MV/m 2021 11 19 CMA06_0001: Ucav=0.001 MV/m 2025 09 04 CMA01_0001: Ucav=6.102 MV/m 2023 08 11 CMA05_0002: Ucav=0.003 MV/m 2023 10 19 CMA05_0003: Ucav=0.003 MV/m 2021 10 22 CMA10_0001: Ucav=0.003 MV/m 2023 09 01 CMB01-CAV1_0001: Ucav=0.001 MV/m 2023 11 16 CMA06_0006: Ucav=0.001 MV/m 2023 08 10 CMB03-CAV1_0001: Ucav=0.003 MV/m 2021 11 12 CMB02-CAV2_0002: Ucav=0.002 MV/m 2021 12 10 CMA03_0001: Ucav=0.002 MV/m 2021 12 10 CMB06-CAV1_0001: Ucav=0.002 MV/m 2022 09 29 CMB07-CAV1_0026: Ucav=2.017 MV/m 2021 10 26 CMA09_0001: Ucav=0.002 MV/m 2025 09 19 CMB04-CAV1_0004: Ucav=0.003 MV/m 2023 10 19 CMA10_0002: Ucav=0.003 MV/m 2025 09 19 CMA07_0004: Ucav=0.004 MV/m 2022 09 06 CMB04-CAV1_0001: Ucav=0.002 MV/m 2024 11 25 CMA07_0001: Ucav=0.004 MV/m 2021 11 19 CMA12_0005: Ucav=0.003 MV/m 2022 09 20 CMA01_0003: Ucav=0.001 MV/m 2024 09 23 CMB01-CAV1_0001: Ucav=0.001 MV/m 2025 09 19 CMA03_0004: Ucav=0.003 MV/m 2024 11 08 CMB07-CAV1_0005: Ucav=0.001 MV/m 2021 11 19 CMA10_0006: Ucav=0.006 MV/m 2023 08 10 CMB01-CAV2_0001: Ucav=0.004 MV/m 2022 09 14 CMA02_0001: Ucav=0.341 MV/m 2024 10 24 CMA11_0001: Ucav=0.003 MV/m 2022 09 14 CMB01-CAV2_0001: Ucav=0.003 MV/m 2024 10 24 CMB04-CAV1_0004: Ucav=0.002 MV/m 2021 11 15 CMB07-CAV1_0002: Ucav=0.001 MV/m 2022 10 21 CMA01_0002: Ucav=0.002 MV/m 2025 09 19 CMB03-CAV2_0002: Ucav=0.003 MV/m 2021 11 26 CMB04-CAV2_0002: Ucav=0.002 MV/m 2025 09 05 CMA07_0002: Ucav=0.004 MV/m 2021 11 12 CMA09_0001: Ucav=0.002 MV/m 2022 10 12 CMB04-CAV1_0001: Ucav=0.002 MV/m 2025 09 19 CMA07_0001: Ucav=0.004 MV/m 2023 08 11 CMA09_0002: Ucav=0.001 MV/m 2025 09 26 CMA09_0001: Ucav=0.001 MV/m 2021 12 03 CMA07_0001: Ucav=0.003 MV/m 2023 08 22 CMA12_0001_D Absence autorisation RF: Ucav=0.003 MV/m 2023 08 11 CMB06-CAV1_0001: Ucav=0.001 MV/m 2022 09 17 CMA09_0001: Ucav=0.001 MV/m 2021 10 26 CMB01-CAV1_0002: Ucav=0.002 MV/m 2025 09 04 CMA04_0002: Ucav=0.001 MV/m 2022 10 12 CMA03_0001: Ucav=0.003 MV/m 2021 11 19 CMA04_0001: Ucav=0.001 MV/m 2022 10 12 CMB03-CAV2_0003: Ucav=0.002 MV/m 2024 11 04 CMA03_0004: Ucav=0.708 MV/m 2024 10 24 CMB02-CAV1_0007_D Absence autorisation RF: Ucav=0.002 MV/m 2021 12 02 CMA12_0002: Ucav=0.014 MV/m 2025 09 05 CMB05-CAV1_0002: Ucav=0.002 MV/m 2021 12 10 CMA04_0001: Ucav=0.001 MV/m 2022 09 06 CMA02_0001: Ucav=0.341 MV/m Loop OFF n=100 2023 11 16 CMB04-CAV2_0001: Ucav=7.057 MV/m 2022 11 03 CMB05-CAV2_0001: Ucav=6.759 MV/m 2022 11 24 CMB04-CAV1_0001: Ucav=0.275 MV/m 2022 11 24 CMB02-CAV1_0006: Ucav=3.675 MV/m 2022 11 24 CMA11_0016: Ucav=1.005 MV/m 2022 11 29 CMB01-CAV2_0002: Ucav=3.623 MV/m 2022 11 21 CMB01-CAV1_0001: Ucav=2.707 MV/m 2022 10 31 CMA12_0002: Ucav=3.803 MV/m 2022 11 24 CMA05_0009: Ucav=0.933 MV/m 2022 11 29 CMB06-CAV2_0001: Ucav=3.044 MV/m 2022 11 03 CMB04-CAV2_0003 50-0.1 oui: Ucav=6.637 MV/m 2021 12 03 CMB07-CAV1_0005: Ucav=3.144 MV/m 2022 11 24 CMA12_0002: Ucav=0.350 MV/m 2022 11 03 CMB03-CAV2_0003: Ucav=6.788 MV/m 2022 11 22 CMA12_0028: Ucav=1.288 MV/m 2022 11 29 CMA06_0005: Ucav=0.985 MV/m 2022 11 24 CMA11_0019: Ucav=1.132 MV/m 2022 11 24 CMA11_0010: Ucav=0.725 MV/m 2022 11 22 CMB01-CAV1_0030: Ucav=0.687 MV/m 2022 11 24 CMA11_0020: Ucav=1.191 MV/m 2022 11 03 CMB03-CAV1_0002: Ucav=6.574 MV/m 2022 11 09 CMA05_0002: Ucav=1.699 MV/m 2022 11 24 CMB01-CAV1_0005: Ucav=0.722 MV/m 2021 12 03 CMA11_0007: Ucav=2.414 MV/m 2021 12 03 CMB05-CAV2_0024: Ucav=3.101 MV/m 2021 09 29 CMB01-CAV2_0001: Ucav=0.003 MV/m 2022 11 09 CMB07-CAV1_0004: Ucav=6.332 MV/m 2022 11 24 CMA11_0055: Ucav=2.819 MV/m 2022 11 09 CMA04_0001: Ucav=1.479 MV/m 2021 09 29 CMB04-CAV2_0001: Ucav=0.002 MV/m 2022 11 09 CMB07-CAV2_0001: Ucav=3.118 MV/m 2022 11 29 CMB03-CAV1_0001: Ucav=3.298 MV/m 2022 11 03 CMB04-CAV1_0002: Ucav=6.291 MV/m 2022 11 09 CMA01_0001: Ucav=1.277 MV/m 2022 11 09 CMA02_0002: Ucav=1.367 MV/m 2022 09 25 CMB02-CAV1_0006: Ucav=1.520 MV/m 2021 12 03 CMB05-CAV2_0021: Ucav=3.046 MV/m 2022 12 08 CMB01-CAV1_0012: Ucav=2.018 MV/m 2021 09 28 CMB02-CAV1_0005: Ucav=6.633 MV/m 2023 11 16 CMA01_0007: Ucav=0.643 MV/m 2022 11 29 CMB02-CAV2_0002: Ucav=3.619 MV/m 2022 09 30 CMB04-CAV2_0010: Ucav=0.323 MV/m 2021 11 12 CMB06-CAV1_0005 kpki durs 6.46 MVpm: Ucav=7.422 MV/m 2022 11 03 CMB03-CAV2_0004: Ucav=3.460 MV/m 2021 07 30 CMB07-CAV2_0005: Ucav=5.448 MV/m 2022 11 09 CMB04-CAV1_0002: Ucav=6.292 MV/m 2022 11 03 CMB04-CAV1_0006: Ucav=6.279 MV/m 2022 12 08 CMB01-CAV2_0011: Ucav=1.756 MV/m 2022 11 24 CMA05_0007: Ucav=0.710 MV/m 2022 11 24 CMB03-CAV1_0012: Ucav=1.564 MV/m 2021 09 29 CMA07_0003: Ucav=1.373 MV/m 2022 11 29 CMB03-CAV2_0001: Ucav=3.143 MV/m 2021 09 29 CMB02-CAV1_0002: Ucav=0.002 MV/m 2022 11 24 CMA11_0043: Ucav=2.241 MV/m 2022 11 03 CMA03_0006: Ucav=0.004 MV/m 2022 09 25 CMB02-CAV1_0031: Ucav=1.125 MV/m 2022 11 21 CMB03-CAV1_0001: Ucav=2.637 MV/m 2022 11 24 CMA11_0035: Ucav=1.957 MV/m 2022 11 03 CMA05_0003: Ucav=1.698 MV/m 2022 11 29 CMA07_0006: Ucav=1.249 MV/m 2022 11 03 CMA09_0003: Ucav=1.521 MV/m 2021 07 30 CMB06-CAV1_0004: Ucav=7.421 MV/m 2022 11 24 CMA11_0014: Ucav=0.915 MV/m 2021 11 15 CMB06-CAV2_0013: Ucav=1.664 MV/m 2023 07 28 CMA01_0010: Ucav=1.240 MV/m 2022 11 04 CMA05_0008: Ucav=1.697 MV/m 2021 12 03 CMB05-CAV1_0007: Ucav=0.365 MV/m 2022 11 04 CMA09_0003: Ucav=4.634 MV/m 2022 11 04 CMA04_0002: Ucav=1.479 MV/m 2022 11 03 CMB03-CAV2_0008: Ucav=0.001 MV/m 2022 11 24 CMB01-CAV1_0020: Ucav=2.442 MV/m 2021 09 29 CMA06_0003: Ucav=1.073 MV/m 2022 11 03 CMB01-CAV1_0002: Ucav=6.476 MV/m 2022 11 24 CMA12_0014: Ucav=1.696 MV/m 2022 12 06 CMB01-CAV2_0002: Ucav=3.266 MV/m 2022 11 22 CMA12_0033: Ucav=0.929 MV/m 2021 12 03 CMB04-CAV1_0038: Ucav=3.385 MV/m 2022 11 09 CMA01_0002: Ucav=1.277 MV/m 2022 11 29 CMB01-CAV2_0010: Ucav=3.272 MV/m 2022 11 09 CMA08_0002: Ucav=3.155 MV/m 2022 11 03 CMA02_0007: Ucav=0.001 MV/m 2022 11 04 CMA07_0009: Ucav=2.487 MV/m 2022 09 25 CMB02-CAV1_0023: Ucav=3.756 MV/m 2022 11 03 CMA05_0004: Ucav=1.698 MV/m 2021 12 03 CMB06-CAV1_0007: Ucav=0.102 MV/m 2022 09 25 CMB02-CAV1_0037: Ucav=0.231 MV/m 2021 12 03 CMB04-CAV1_0029: Ucav=3.611 MV/m 2022 11 29 CMB02-CAV2_0003: Ucav=3.228 MV/m 2022 11 22 CMB01-CAV1_0026: Ucav=1.147 MV/m 2022 11 24 CMB01-CAV1_0031: Ucav=3.282 MV/m 2021 12 03 CMB06-CAV2_0009: Ucav=3.532 MV/m 2022 11 24 CMB03-CAV1_0024: Ucav=3.021 MV/m 2022 11 03 CMB05-CAV2_0005: Ucav=0.002 MV/m 2022 11 04 CMA06_0002: Ucav=1.964 MV/m 2022 11 04 CMA12_0006: Ucav=6.488 MV/m 2022 11 04 CMA03_0010: Ucav=1.396 MV/m 2022 11 04 CMA10_0003: Ucav=6.542 MV/m 2022 11 03 CMB01-CAV2_0005: Ucav=0.003 MV/m 2022 11 04 CMA11_0004: Ucav=5.228 MV/m 2022 11 03 CMA12_0007: Ucav=6.476 MV/m AMPT>10% n=100 2021 12 02 CMB06-CAV2_0008: Ucav=3.011 MV/m 2021 09 03 CMA10_0008: Ucav=0.003 MV/m 2021 07 21 CMA01_0017 5 7E-4 FFOUI tuned12° 1 mA: Ucav=1.285 MV/m 2022 09 20 CMB07-CAV2_0009: Ucav=3.191 MV/m 2022 09 20 CMA05_0005: Ucav=0.855 MV/m 2022 09 20 CMB03-CAV1_0005: Ucav=3.310 MV/m 2022 09 22 CMA12_0003: Ucav=3.260 MV/m 2022 09 09 CMA12_0005: Ucav=0.262 MV/m 2022 09 23 CMB04-CAV1_0001: Ucav=6.292 MV/m 2021 09 03 CMA10_0004: Ucav=1.444 MV/m 2022 11 29 CMA05_0005: Ucav=0.853 MV/m 2022 09 23 CMB02-CAV2_0001: Ucav=6.426 MV/m 2021 09 28 CMB05-CAV1_0002: Ucav=6.449 MV/m 2024 10 11 CMA08_0003: Ucav=1.580 MV/m 2022 10 18 CMB01-CAV2test PMT_0003: Ucav=5.559 MV/m 2021 09 16 CMA05_0001: Ucav=0.003 MV/m 2022 10 07 CMB04-CAV2_0045: Ucav=3.070 MV/m 2021 09 29 CMB03-CAV1_0002: Ucav=3.814 MV/m 2021 09 21 CMA11_0005: Ucav=2.122 MV/m 2024 11 08 CMA08_0003: Ucav=1.580 MV/m 2022 09 23 CMB07-CAV1_0001: Ucav=6.202 MV/m 2021 09 21 CMA11_0002: Ucav=2.294 MV/m 2022 09 25 CMB07-CAV1_0004: Ucav=3.183 MV/m 2024 09 19 CMA10_0001: Ucav=3.251 MV/m 2022 10 07 CMB04-CAV2_0036: Ucav=3.074 MV/m 2024 10 11 CMA03_0001: Ucav=0.707 MV/m 2023 11 27 CMB07-CAV2_0017 cw 5.3 MVpm 3.3 kWi, 3.15 kWr 12deg: Ucav=5.133 MV/m 2021 11 12 CMA05_0004: Ucav=0.910 MV/m 2022 09 23 CMB01-CAV2_0001: Ucav=6.397 MV/m 2021 09 29 CMA11_0009: Ucav=2.408 MV/m 2021 12 01 CMB04-CAV1_0005: Ucav=3.383 MV/m 2022 09 23 CMB05-CAV1_0001: Ucav=6.522 MV/m 2021 11 15 CMB06-CAV2_0046: Ucav=2.037 MV/m 2024 10 24 CMA04_0005: Ucav=0.753 MV/m 2021 10 06 CMB07-CAV2_0001: Ucav=5.914 MV/m 2024 11 04 CMA06_0001: Ucav=0.999 MV/m 2023 08 07 CMB01-CAV2_0001: Ucav=0.003 MV/m 2022 10 07 CMB04-CAV2_0026: Ucav=3.073 MV/m 2022 09 16 CMA12_0009: Ucav=0.522 MV/m 2022 09 29 CMB03-CAV2_0020: Ucav=0.467 MV/m 2022 09 13 CMB06-CAV2_0002: Ucav=0.001 MV/m 2024 10 11 CMA10_0001: Ucav=3.273 MV/m 2021 09 21 CMB02-CAV2_0002: Ucav=3.177 MV/m 2025 09 03 CMA01_0001: Ucav=1.016 MV/m 2023 08 07 CMA01_0005: Ucav=1.240 MV/m 2024 09 27 CMA08_0003 kf FFO coup sur defaut regul: Ucav=3.151 MV/m 2022 09 17 CMB04-CAV1_0008: Ucav=0.494 MV/m 2022 09 25 CMB06-CAV2_0002: Ucav=2.845 MV/m 2024 10 11 CMA10_0004: Ucav=3.274 MV/m 2021 09 21 CMB05-CAV1_0001: Ucav=0.002 MV/m 2022 08 23 CMA01_0001: Ucav=1.879 MV/m 2022 09 22 CMA09_0001: Ucav=4.635 MV/m 2021 09 16 CMB07-CAV1_0001: Ucav=0.001 MV/m 2024 11 25 CMA04_0001: Ucav=2.005 MV/m 2021 11 15 CMB06-CAV2_0044: Ucav=0.739 MV/m 2024 10 24 CMB02-CAV1_0003_D Signal RF hors tolérance: Ucav=3.385 MV/m 2022 09 30 CMB06-CAV2_0005: Ucav=0.596 MV/m 2022 09 22 CMB06-CAV2_0004: Ucav=0.514 MV/m 2023 11 16 CMB07-CAV1_0001: Ucav=6.518 MV/m 2022 09 20 CMB04-CAV2_0004: Ucav=3.335 MV/m 2024 10 02 CMB03-CAV1_0001: Ucav=3.319 MV/m 2022 09 22 CMB06-CAV2_0003: Ucav=3.190 MV/m 2024 10 24 CMA08_0002: Ucav=1.580 MV/m 2021 12 01 CMB07-CAV1_0003: Ucav=0.631 MV/m 2021 12 01 CMA11_0003: Ucav=0.729 MV/m 2021 10 26 CMA12_0001: Ucav=3.950 MV/m 2022 09 29 CMB03-CAV2_0005: Ucav=0.507 MV/m 2021 11 12 CMB07-CAV2_0010: Ucav=0.047 MV/m 2021 09 29 CMB01-CAV2_0002: Ucav=3.522 MV/m 2021 11 15 CMB06-CAV2_0039: Ucav=0.738 MV/m 2025 10 18 CMB01-CAV2_0002: Ucav=5.155 MV/m 2025 10 20 CMB01-CAV2_0005: Ucav=5.155 MV/m 2021 12 01 CMB05-CAV1_0006: Ucav=2.979 MV/m 2022 09 25 CMB05-CAV1_0001: Ucav=1.382 MV/m 2021 09 16 CMB01-CAV1_0001: Ucav=0.002 MV/m 2021 09 28 CMB06-CAV2_0001: Ucav=7.002 MV/m 2024 10 11 CMA02_0001: Ucav=0.673 MV/m 2021 09 21 CMA05_0008: Ucav=0.635 MV/m 2024 10 24 CMB02-CAV2_0007: Ucav=3.235 MV/m 2024 10 11 CMB07-CAV1_0002: Ucav=3.387 MV/m 2022 09 17 CMA11_0002: Ucav=0.411 MV/m 2021 09 29 CMB04-CAV1_0002: Ucav=3.488 MV/m 2021 09 21 CMA09_0008: Ucav=2.541 MV/m 2022 09 29 CMB07-CAV1_0008: Ucav=0.486 MV/m 2025 10 23 CMB01-CAV2_0001: Ucav=5.155 MV/m 2023 11 13 CMA08_0022: Ucav=1.587 MV/m 2022 09 20 CMB04-CAV1_0005: Ucav=0.241 MV/m 2021 11 26 CMB05-CAV2_0002: Ucav=0.987 MV/m 2021 10 08 CMB02-CAV1_0001: Ucav=0.002 MV/m 2022 09 20 CMB04-CAV1_0007: Ucav=0.829 MV/m 2024 11 08 CMA11_0004: Ucav=2.006 MV/m 2022 09 25 CMB05-CAV1_0002: Ucav=0.518 MV/m 2022 09 17 CMA11_0003: Ucav=0.411 MV/m 2024 11 18 CMA01_0001: Ucav=0.935 MV/m 2022 10 07 CMB04-CAV2_0027: Ucav=3.074 MV/m 2021 10 08 CMB03-CAV2_0001: Ucav=0.002 MV/m 2022 10 14 CMA12_0005: Ucav=1.742 MV/m 2022 09 20 CMB04-CAV1_0006: Ucav=0.320 MV/m 2021 09 21 CMA09_0012: Ucav=2.541 MV/m 2022 11 03 CMB06-CAV2_0007: Ucav=0.001 MV/m KPI<10 n=100 0.001 0.01 0.1 1 10 cavity voltage amplitude, |Ucav| (MV/m, log scale)
Each dot is one file's whole-trace mean |Ucav|; the short horizontal tick is each group's median. Loop OFF is unambiguous: 95% collapse near zero, fully coherent with an open control loop. Feed-forward off splits: median 0.39 MV/m (vs. 3.16 baseline), but ~35% of the sample sits inside the baseline's own operating range, loop still closed — feed-forward is a control-loop compensation feature, unrelated to beam presence, so a live-looking file with it disabled needs no special explanation. The dead-looking majority lines up with the recoverable-data check above: most of that group fails a real check (low KPI, open loop) once you look past the feed-forward flag. AMPT and KPI are acquisition-quality metrics, not state flags, so their large overlap with the baseline range was always expected. n=100 per rejected group, n=150 baseline, single random sample (seed 20260908), one pass — a first look, not a hardened estimate.
Rejected groupLive-looking in sampleOld countRead
Loop OFF5 / 1001,534→2,878clean — header is coherent
Feed-forward off35 / 1008,205→3,229expected once corrected — unrelated to RF/beam state; scope fix now applied
KPI < 1057 / 100859→3,168expected — a reliability metric, not a state flag
AMPT > 10%63 / 1001,113→1,187expected — a reliability metric, not a state flag

One more thing tested along the way: is there an independent beam-presence signal in this data at all, now that the header field turned out not to be one? The classifier's own code carries a field literally called Presence faisceau, but it's built by renaming a per-sample état bit labeled Temp RF int on the way out — a mismatch between the variable name and its documented source. Tested against 250 of the same sampled files: even in the passing baseline, this bit reads "on" for essentially none of the trace (median 0.09% of samples). That's not what a real, sustained beam-presence signal should look like, so this field looks mislabeled or misassigned rather than trustworthy — worth a bug report to whoever owns Classify_PostMortemFile, separately from the feed-forward correction above. courant pickup (pickup-probe current) was the other candidate; it also failed, pinning at a near-constant ~33 µA for the large majority of files in every group. Net: there is currently no independently-verified beam-presence signal in this dataset at all.

Status: V7 extracted and validated. The classifier fix is applied, re-run, and the recovery confirmed (+756 events, entirely 2019–2020, everything else untouched). prepare_data_cluster_v7.py (forked from V6, with the beam_present→feed_forward_enabled feature rename applied) has run against the corrected ground truth: 2,865 events (2,866 ground-truth-passing minus the same single feature-extraction failure V6 also hit), 1,478 Normal / 1,387 fault, 810 features (up from 777 — expected: the same 0.95 correlation-dedup threshold keeps a different subset once the dataset's composition changes, not a bug), 246 PCA components. Validated directly: NaN rate in the newly-recovered 2019–2020 events (0.20% / 0.31%) is lower than the full corpus's own average (0.45%), and their fault-category mix (majority Normal, RF regulation out of tolerance the largest fault category) matches the rest of the corpus — no sign the recovered events are degenerate. Steps 01–08 below still describe V6 — re-running them against V7 (Phase 2) hasn't started yet.

01

Preprocessing

preprocess_signals() Explored 2026-09-09

Three operations, in order, applied to every one of the 27 signals independently: a 4th-order Butterworth high-pass filter (cutoff 0.01, normalized to each file's own Nyquist frequency — i.e. relative to that file's own sample rate, since decimation varies ~250× across the corpus) removes DC offset and slow drift while keeping fast transients; each event is aligned to its own true trigger sample, read directly off the acquisition's real time axis (zero_idx = argmin(|time|)) rather than a fixed offset; then the filtered signal is Z-score normalized over its own event window, with the filtered-but-unnormalized version kept alongside it (the 2026-09-07 fix from step 02, so real-amplitude statistics have real amplitude to work from).

The old bug, with a real number attached: for a representative NDEC=200 event (2022 10 12 CMA01_0001, an Oscillation Ucav subtype of RF regulation out of tolerance), the true trigger sits at sample 50,047 of 100,096. The pipeline's old hardcoded trigger_idx=3000 would have pointed 534 ms early — 47,047 samples off, 47% of the entire file — treating what was actually mid-acquisition steady-state as if it were the pre-trigger precursor window. Every "pre-trigger" and "post-trigger" feature in the old pipeline was computed from the wrong slice of the trace for a file like this one.

1.44 -0.15 1. Raw Ucav, MV/m 0.05 -0.03 2. High-pass filtered (4th-order Butterworth, cutoff 0.01) a.u. 3.91 -2.25 3. Z-score normalized σ -250 -200 -150 -100 -50 0 50 100 150 time relative to trigger (ms) trigger (t=0)
Real trace, same event as above, zoomed to the analysis window (−250 to +150 ms around the trigger). Panel 1: raw Ucav in physical units (MV/m) — a slow drift is visible, the reason for panel 2. Panel 2: after the high-pass filter, DC offset and drift are gone, transient structure preserved; note the y-axis is now dimensionless (arbitrary units) since the filter has no calibrated gain. Panel 3: Z-scored — same shape as panel 2, rescaled to standard deviations, which is what every classifier in this pipeline actually sees. One real, verified aside: this same file's Z-scored trace peaks at |z|=93.6 — not visible here because it happens at the very first sample (t=−568 ms), the high-pass filter's own causal startup transient, not a real physical event. It's why the report's methodology explicitly restricts analysis to a window well after file-start (Sec. 3) — confirmed here directly, not just asserted.

Two more things worth being precise about, since they're easy to gloss over. First, the precursor window used for early-fault-onset detection isn't "the first 3,000 samples" or "34 ms" in some fixed sense — it's scale_samples(3000, dt_us), which converts a sample count tuned at the dominant NDEC=200 spacing (dt ≈ 11.4 µs) into whatever sample count gives the same physical duration for this file's own dt_us. A file with NDEC=100 (like several of the recovered 2019 events above) needs about twice as many samples for the same 34 ms. Second, one fault category — RF regulation out of tolerance — gets a further onset refinement on top of the informatic trigger: Alexandre's AMPT-based physical onset detection (find_true_t0_with_ampt), applied only to that category since it's the one his validation actually covers, per the earlier user decision documented in the methodology.

02

Feature engineering

engineer_features() Explored 2026-09-09

Three families, computed for every event: 17 statistics × 27 signals over the full window (459 candidates); seven physics-informed families targeting specific LLRF dynamics (39 candidates: effective decay, detuning, microphonics, RF mismatch, modulator command, phase stability, RF power flow); and temporal/derivative features — per-segment slopes, finite differences, CUSUM change points, early/late-window ratios — the largest group by far. Before correlation filtering that's 1,200+ raw candidates; after the >0.95 dedup pass, 810 features survive in V7 (up from 777 in V6). Verified directly on V7 with the same family classifier the paper's SHAP analysis uses (100% coverage, zero unclassified features, both versions):

0 100 200 300 400 500 Temporal 501 Statistical 260 Metadata/Status 10 RF Mismatch 9 Effective Decay 6 Modulator Command 6 RF Power Flow 5 Detuning 5 Phase Stability 4 Microphonics 4
Teal bars are the seven physics-informed families (39 features total); ochre bars are the generic statistical/temporal/metadata families (771). That's a 19.8:1 imbalance — confirms the report's "roughly 20:1" claim still holds exactly on V7, which matters because it's the reason the paper reports per-feature-mean SHAP importance by family rather than a group sum (Sec. 5): summing would structurally favor the two large generic groups regardless of how informative any single physics feature actually is. Comparing to V6: the physics-informed families and Metadata/Status are byte-identical in count (39 and 10, both versions) — only Statistical (262→260) and Temporal (466→501) shifted, exactly what you'd expect from the same 0.95 correlation threshold landing differently on a differently-composed dataset, not a change in what's being computed.

One family worth a close look because it's the most physically interpretive: effective system decay. Post-trigger, the pipeline fits cavity voltage amplitude (|Ucav|, in MV/m) to V(t) = V0·e−t/τeff over a fixed 500-sample-equivalent window (≈5.7 ms), by linear regression on ln|Ucav|. The report is explicit that τeff is not the cavity's intrinsic QL — with the LLRF loop still active and protection logic responding, what's measured is the whole system's response. First pass at this (below, corrected) picked one clean-fitting and one poor-fitting quench event and left it at "an active loop makes the decay non-exponential" — too glib, and the log-scale plot hid the actual units and made a genuinely important detail invisible. Redone properly: measured how long each of the 31 real quench events takes to drop below 20% of its pre-trigger amplitude, across the whole category, not two cherry-picked examples.

0.01 0.1 1 2021 11 19 CMB07-CAV2_0001: 0.011 ms 2023 08 11 CMA11_0012: 0.011 ms 2025 10 23 CMB01-CAV1_0001: 0.011 ms 2020 09 24 CMA10_0001: 0.023 ms 2022 10 14 CMB07-CAV2_0006: 0.023 ms 2022 10 20 CMA11_0003: 0.034 ms 2021 11 19 CMB07-CAV2_0007: 0.057 ms 2021 11 19 CMB07-CAV2_0002: 0.057 ms 2022 10 07 CMB07-CAV2_0003: 0.057 ms 2022 09 16 CMA09_0001: 0.068 ms 2021 11 19 CMB07-CAV2_0004: 0.068 ms 2024 11 04 CMA10_0003: 0.068 ms 2022 10 07 CMB07-CAV2_0002: 0.079 ms 2020 09 23 CMA02_0013: 0.091 ms 2022 10 07 CMB01-CAV2_0060: 0.102 ms 2022 10 07 CMB01-CAV2_0059: 0.114 ms 2023 07 28 CMA02_0003: 0.125 ms 2022 10 14 CMB07-CAV2_0007: 0.125 ms 2021 11 19 CMB07-CAV2_0006: 0.136 ms 2021 11 19 CMB07-CAV2_0005: 0.148 ms 2022 09 06 CMA11_0001: 0.148 ms 2022 10 14 CMB07-CAV2_0005: 0.170 ms 2020 09 24 CMA09_0001: 0.170 ms 2023 07 28 CMA05_0006: 3.952 ms 2021 10 22 CMA05_0002: 4.066 ms 2022 10 07 CMB01-CAV2_0045: 4.656 ms 2022 10 07 CMB01-CAV2_0026: 4.713 ms 2022 09 25 CMB07-CAV2_0007: 5.099 ms 2022 09 30 CMB07-CAV2_0002: 5.167 ms 2022 10 04 CMB07-CAV2_0001: 5.167 ms 2022 10 07 CMB07-CAV2_0005: 5.236 ms no events in this range time from trigger to |Ucav| < 20% of pre-trigger amplitude (ms, log scale)
Every real Claquage ou quench cavité event in the corpus (n=31), red = collapses in under 1 ms, teal = takes several ms. 23 of 31 (74%) collapse within 0.17 ms — 1 to 15 samples, functionally instantaneous; the other 8 (26%) take 4.0–5.2 ms, and nothing falls in between. That's a real gap in real data, not a modeling artifact. Your read was right: for the fast group, the 5.7 ms fit window isn't wrong because it's too wide in some absolute sense — it's that the entire physical event is over in 1–2 samples, so no window, however sized, gives a log-linear regression anything real to fit; the other ~490 samples are just noise near the floor. R² correctly reports that as a bad fit; it isn't measuring "how non-exponential the decay is," it's silently flagging "there was no decay to measure."
Fast collapse: 2022 09 16 CMA09_0001 complete within ~1 sample (0.068 ms) 20% of initial 0.00 0.25 0.49 0.74 0.99 7.2 0 ms after trigger |Ucav| (MV/m) Slow decay: 2022 10 07 CMB01-CAV2_0026 genuine multi-ms relaxation (4.71 ms to 20%) 20% of initial 0.00 1.50 2.99 4.49 5.99 6.9 0 ms after trigger |Ucav| (MV/m)
Same two events as the original attempt, now in real units (MV/m) on a linear axis instead of log|Ucav|. Left: the collapse is a near-step function — 6.65 MV/m at the trigger, 0.002 MV/m one sample (11.4 µs) later. Right: a genuine multi-millisecond relaxation, still above 1 MV/m five milliseconds out. These are two different physical regimes, most plausibly a hard breakdown/arc (fast group) versus a softer interlock-triggered ramp-down (slow group) — consistent with your "different sub-families" read.

Checked whether the pipeline's own subtype-clustering step (09, k=2 search per category) already found this: it gives 19/9 for this category on V6's 28 events, and that smaller cluster (n=9) is disproportionately the group with no valid decay window (56% vs 26% in the larger cluster) — correlated with the fast/slow split, but not identical to it. Checked why: the real top-differentiating features between those two clusters (same Cohen's-d method the report's own subtype figure uses) turn out to be modulator-command and reference-frequency statistics, not the decay features directly — the existing clustering runs over the full 810-feature space and lands on whatever axis separates best overall, which isn't necessarily collapse-timescale. The collapse-time gap shown above is a cleaner, more directly physical signal than what the current full-feature clustering surfaces — worth flagging as a concrete, real methodology improvement: either add collapse-timescale as an explicit feature, or run the subtype search on the physics-informed decay features specifically rather than the full feature space, before trusting the current quench subtype split as physically meaningful.

Last check: the whole-signal-statistic normalization-order bug (Sec. 00/01, fixed 2026-09-07) reduced near-constant features from 65 to 15 on V6. Re-ran the same check on V7: 16 near-constant features (std<1e-6 of 810) — same story, one more. The two previously-disclosed non-functional features (reflected_saturation_fraction, control_saturation_fraction, still-miscalibrated legacy thresholds) are still in the list, unchanged. The one addition, llrf_loop_closed, is easily explained: V7's recovered 2019–2020 events skew the corpus slightly more toward closed-loop operation, pushing that flag's variance just under the threshold — a composition effect, not a new bug.

03

Precursor detection

prepare_05_phase0_precursor.py Explored 2026-09-08

Early fault-onset detection, restricted to the pre-trigger-only 386-feature subset so the task can't cheat off the post-trigger transient. Five unsupervised baselines (Isolation Forest, LOF, Mahalanobis distance on a PCA-reduced Ledoit–Wolf covariance, PCA reconstruction error, DBSCAN) establish how much separability exists without labels, then a class-weighted Random Forest is trained supervised on the same subset. An ensemble score combines all of the unsupervised methods with the RF's own probability output.

Everything on this step is V6, not V7 The trained precursor model and every number/chart below come from step_05_v6/precursor_detection.pkl — V6, the last dataset with a full downstream re-run, not V7 (see the "Data foundation" step above and the sidebar footer for the V6/V7 dataset status). Step 05 is one of the steps Phase 2 (re-running everything against V7) would need to redo, and Phase 2 hasn't happened yet. Concretely: none of the ~756 events recovered by the feed-forward fix (mostly 2019–2020) were in this model's training/test data, and the mislabeled beam_present field (only correctly meaningful post-2021 on V6) may itself have been a feature the model leaned on. The one finding below that's unaffected by this: the buffer-length numbers (568.4ms/1136.8ms), which come from reading raw postmortem files directly, independent of dataset version.
MethodROC AUCLabelsNotes
Random Forest0.9991supervised386-feature true-precursor subset
Ensemble0.9881supervised5 unsupervised scores + RF probability, combined
Mahalanobis distance0.7881unsupervisedPCA-reduced Ledoit–Wolf covariance
Isolation Forest0.6376unsupervisedno labels used at all
LOF0.5797unsupervisedno labels used at all

The large supervised/unsupervised gap (0.999 vs 0.58–0.79) is a real, learnable decision boundary, not a window-length leak: a follow-up check restricting to only the already-fixed-window columns (382 of 766, same conclusion as the 386-feature production subset above) still gets RF AUC 0.9998 while Isolation Forest/LOF on the identical columns stay at 0.65/0.59 — unsupervised methods can't see what the label-trained model sees, which window length alone can't explain.

Open question, not yet resolved What is the model actually detecting? A direct lead-time probe on 40 sampled true-positive fault events slid the same fixed 34 ms window progressively earlier and checked how far out predicted probability stays above 0.5. 39 of 40 (97.5%) never dropped below 0.5 within the tested buffer (up to ~477 ms out, roughly 14× the window's own duration) — right-censored, not a bounded lead time. A genuinely local, near-trigger precursor signal shouldn't stay this confidently detected this far outside the window it was trained on.
0.00 0.25 0.50 0.75 1.00 0 100 200 300 400 477
Follow-up probe, 20 independently-sampled true-positive fault events: re-ran the trained RF at 12 offsets per event, from the trigger itself out to 477 ms before it, x-axis reading far→near left to right. 19 of 20 curves are essentially flat — predicted probability sits ≥0.85 for most events from the very first (furthest) offset tested, with no visible ramp-up as the true trigger approaches. One event (red) sits on a lower but equally flat plateau (0.60–0.72); one (dashed, orange) hit its own file's buffer edge after only 4 offsets, consistent with the censoring above. None of the 20 dropped below the 0.5 threshold at any tested offset. Computed 2026-09-08, SLURM job 58250756, from step_05_v6/precursor_curves_exploration.json.

A model really keying on an approaching fault should look uncertain far from the trigger and grow confident as it nears — instead, confidence is already saturated at the furthest offset tested and never moves. Taken alone, that pattern would suggest the model is picking up a stable per-capture characteristic unrelated to the fault itself, rather than genuine fault-onset proximity — the open caveat the report already carries (Sec. 6/7/8).

Disambiguating test run, result complicates the simple reading Ran the report's own proposed test: score the same 386-feature true-precursor set on a window from the middle of a Normal event's recording, far from any acquisition boundary and unrelated to any real trigger (20 confidently-true-negative Normal events, SLURM job 58257135). If the model were keying on a generic, fault-unrelated acquisition characteristic, these should score elevated too — they don't: 0 of 20 scored above the 0.5 fault threshold (predicted fault probability 0.00–0.05 for 18 of 20; the other two, 0.34 and 0.44, still confidently below threshold). The model cleanly separates “this is a fault-event recording” from “this is a normal-event recording” even hundreds of ms before either file's own trigger point — that's not consistent with a generic, label-blind acquisition artifact.

Net reading: there is a real, fault-specific signal present far earlier than the interlock trip — genuine early separability, not a spurious correlate. What it is not, per the flat curves above, is a signal that ramps up as the fault approaches; it appears (at least within the tested window) present at roughly constant strength well in advance, on fault-destined recordings specifically. Whether that constant early signature reflects a genuine slow-developing physical precursor or an early fault-associated operating-condition change that isn't itself the cause ramping toward the trigger is still open — this test rules out the “meaningless artifact” reading, it doesn't yet distinguish between those two remaining explanations.
04

Binary classification

prepare_06b_phase1_binary_pretrigger.py Explored 2026-09-09 — V7

Fault-vs-Normal, restricted to the pre-trigger-only 418-feature "true precursor" subset (the same restriction step 05 uses) — the operationally meaningful version of this task, since a real-time system only has pre-trigger information available. Compared across Logistic Regression, Random Forest, XGBoost, and an RBF-kernel SVM. This, not the full-window version, is the primary binary-classification result: a full-window classifier can see the interlock-trip transient directly, which makes it trivially separable and not real evidence of a useful modeling capability — see the callout below for why it's kept only as a contrast.

MethodAccuracyROC AUCF1
Random Forest99.5%0.99980.995
XGBoost99.5%0.99990.995
Logistic Regression99.0%0.99890.989
SVM (RBF)97.6%0.99730.975

2,865 events (V7), 860 in the held-out test set, 418 pre-trigger-only features. RF stability check: 99.42%±0.32% accuracy across 10 repeated splits. Near-ceiling even without seeing the interlock trip — not proof of what the underlying early signal is, but real, independently-confirmed evidence (via a completely different, simpler model design than step 05's unsupervised-ensemble approach) that fault-destined events carry a strong, already-confident signal well before the trigger, matching step 03's probability-curve finding. A systemic scaler/PCA-fit-on-full-dataset leak was found and fixed earlier in this project (shared leakage_safe_features.py helper, applied across all downstream modeling steps); these numbers are post-fix.

Kept only as a contrast: the naive full-window version The original design for this step (prepare_06_phase1_binary.py) used the full event window, post-trigger included — fair challenge raised in review that a classifier able to see the interlock-trip transient directly is "obvious," not real evidence of a useful capability. Its numbers, for reference only: Random Forest 100.0% (AUC 1.0000), XGBoost 100.0% (AUC 1.0000), Logistic Regression 99.9% (AUC 1.0000), SVM 99.3% (AUC 0.9997) — essentially the same near-ceiling result, just with an easier task. Restricting to pre-trigger-only barely moved the numbers, which is itself the interesting finding above, not a sign the full-window version was somehow more informative.
Sharper test: blind the model to each category's own defining signal Deeper challenge: pre-trigger-only isn't enough on its own — if the model can still see the exact physical quantity that will trip the deterministic cut (e.g. cavity voltage for a quench), "early detection" could just mean reading out that same quantity slightly before the threshold, not a genuinely independent early-warning signal. For each fault category, identified the raw signal(s) its own deterministic classification criterion actually reads (verified directly in Classify_PostMortemFile/src/classification.py, not guessed), excluded every feature derived from that signal, and re-ran the same category-vs-Normal, pre-trigger-only classifier.
CategoryExcluded signal(s)Features removedRF accuracy: with → without
Claquage ou quench cavitéUcav17100.0% → 100.0%
Dép seuil de sécurité RFUcav, A Ucr3899.6% → 98.9%
Seuil de videvide, courant pickup35100.0% → 100.0%
Rég signal RF hors toléranceUci, A Ucr, Ucav, IQ6699.6% → 99.6%
Seuil pick-upcourant pickup1999.6% → 99.6%
Absence autorisation RFeach of 27 channels, one at a timevaries99.1%–99.8% across all 27

Excluding the defining signal barely changes anything, for almost every category — even removing 66 of 418 features (16% of the whole pre-trigger set, four entire channels) for "Rég signal RF hors tolérance" leaves accuracy exactly where it started. The one exception: RF safety threshold exceeded loses 0.7 points when its own Ucav/A Ucr ratio is removed — the only category where that signal carries real, non-redundant weight. For "Absence autorisation RF" (329 events, no single defining channel in the code), a full 27-channel sweep — excluding each raw signal one at a time — stays in a tight 99.1–99.8% band throughout: no single channel matters much on its own, the signal is diffuse across many channels. ("Coupure externe rapide," only 11 events, stayed flat at 100.0% for every one of the 27 exclusions too — not trusted as a real finding, almost certainly just sample-size triviality with a ~3-event test fold, not robustness.)

Read together with the two findings above: this is broad, category-by-category evidence that the pre-trigger early-detection signal isn't a disguised readout of each fault's own "obvious" physical quantity — it's genuinely redundant across many other pre-trigger channels too, for nearly every category tested.

05

Multi-label classification

phaseA/B/C_*.py, prepare_07(b)_*.py Explored 2026-09-09 — V7

Four competing supervised approaches to the same seven-category task, each class-weighted appropriately for its own structure: Binary Relevance, Classifier Chains, and Label Powerset (all with RF or XGBoost base estimators), plus a MultiOutput Random Forest baseline and four deep multi-head architectures (CNN, Transformer, CNN-LSTM, MLP) sharing a per-label weighted BCE loss. Every fault event in this dataset carries exactly one active label by construction of the ground-truth classifier, so the genuinely multi-label case (several simultaneous faults) hasn't been exercised on real data yet. Label Powerset is the best-performing approach on the full-window comparison run of record; all four deep architectures underperformed the classical baselines on it.

Following the same pre-trigger question raised for step 04, and to check whether the supervised numbers reflect genuinely learnable structure rather than something only a labeled classifier can reach, we completed a full 2×2 grid: supervised vs. a newly built unsupervised counterpart, each in both full-window and pre-trigger-only (418-feature) conditions.

ApproachMacro-F1, full windowMacro-F1, pre-trigger only
Label Powerset (best, full-window)0.780±0.0290.664±0.024
Classifier Chain—0.597±0.026
MultiOutput Random Forest0.710±0.0270.557±0.010
Binary Relevance0.713±0.0270.553±0.017

Repeated-split mean±std, 10 splits each. Pre-trigger-only stays in a broadly similar band rather than collapsing toward chance — the same pattern step 04 already showed for binary classification. Every approach shows the same rarest-category floor either way: "Coupure externe rapide" (11 events) scores exactly 0.000 F1 across every approach and every split — a sample-size floor, not a pre-trigger-specific weakness.

New: an unsupervised counterpart, previously absent from this task Two families of methods, neither trained on the fault labels. (1) The same four continuous-score anomaly-detection methods from step 03 (Isolation Forest, LOF, Mahalanobis distance, PCA reconstruction), fit on train and scored on test, evaluated as a one-vs-rest ROC AUC against each fault category independently. (2) K-Means, Agglomerative, and Gaussian Mixture clustering, fit directly on the full unsplit dataset (an internal-structure comparison, not a generalization claim — same no-split precedent as step 07's sub-type clustering) at k=8 clusters (Normal + 7 fault types), then compared against ground truth via Adjusted Rand Index, Normalized Mutual Information, and purity. Ground truth reuses step 06's own argmax(y_multilabel) convention — exact here, since no event in this dataset ever has more than one active label.
CategoryIsolation ForestLOFMahalanobisPCA recon.
Seuil pick-up0.7560.7820.8100.806
Coupure externe rapide0.3030.6100.3790.572
Absence autorisation RF0.2520.5300.3040.400
Seuil de vide0.7550.7680.8820.823
Claquage ou quench cavité0.3860.4630.6250.408
Dép seuil de sécurité RF0.9170.3910.8960.865
Rég signal RF hors tolérance0.5500.6490.6510.659

Full-window, single-split headline AUC. No single method dominates — Mahalanobis is generally strongest, but "Absence autorisation RF" stays weak across every method (0.25–0.53), consistent with that category having no single defining physical signal in the classifier code either. Restricted to pre-trigger-only, the picture holds broadly but not uniformly: Mahalanobis for "Dép seuil de sécurité RF" is essentially unchanged (0.896 → 0.929), while for "Claquage ou quench cavité" it drops (0.625 → 0.466) — a real category-specific gap, unlike the uniform "barely moves" pattern the labeled comparison showed.

MethodWindowARINMIPurity
K-MeansFull window0.6990.6160.787
K-MeansPre-trigger only0.1490.1910.597
AgglomerativeFull window0.4020.4760.765
AgglomerativePre-trigger only0.1920.2230.631
GMMFull window0.4560.5090.771
GMMPre-trigger only0.0830.1740.595

The sharpest contrast in the whole grid, and it runs the opposite direction from every other pre-trigger-vs-full-window comparison in this project. Full-window clustering recovers real fault-category structure (K-Means ARI 0.699, purity 0.787); pre-trigger-only clustering is substantially weaker across all three methods (K-Means ARI drops to 0.149). Read together with the tables above: real, learnable pre-trigger structure exists and survives labeled training, but recovering that same structure with no labels at all, purely from unsupervised geometry, is a much harder task — post-trigger content (the interlock-trip transient itself) makes the categories far easier to separate geometrically without needing any labels. This qualifies, not undermines, the pre-trigger early-warning story elsewhere in this project: genuine pre-trigger separability is present and learnable, just not yet strong enough to self-organize into the right categories unsupervised.

Caught before trusting it: DBSCAN's fixed hyperparameter didn't transfer First run reused step 03's fixed eps=0.5 for DBSCAN and got a degenerate result — 100% of test events flagged as outliers, in both window conditions. Not a finding, just a hyperparameter tuned for a different feature space. Re-tuned via the same 75th-percentile-of-5-nearest-neighbor-distance heuristic step 07's own sub-type clustering already uses, instead of inventing a new one: full window ε=24.41 (22.1% outlier rate), pre-trigger ε=12.41 (22.7%), both now genuinely informative with real per-category spread (0.000–1.000 outlier recall depending on category).
06

Root cause identification

prepare_08_phase3a_rootcause.py Explored 2026-09-10 — V7

A Random Forest predicts the primary fault category among the seven, restricted to the 1,387 V7 fault events (Normal excluded) on the leakage-safe train-fold-only-scaled feature set. The training target is argmax over the multi-label vector — a deterministic first-flagged-category rule, not an independently labeled physical root cause — and because the current dataset has zero genuinely multi-fault events, that argmax currently has one unambiguous answer per event rather than exercising any real tie-breaking. A real limitation of the task's current formulation, disclosed as such rather than presented as a solved comparison.

MetricSingle-split (seed=42)Repeated-split, 10×, class-weighted
Accuracy93.5%0.924±0.010
Macro-F10.7990.782±0.011
Weighted-F10.933—

417 held-out test events (of 1,387 fault events, 30% split), class_weight='balanced'. As with every supervised step in this project, the repeated-split mean is the number to cite — the single seed=42 split reads 1–2 points higher on both metrics, split noise rather than a better model.

Category (n in dataset)F1, unweighted RFF1, class_weight='balanced'
Seuil pick-up0.963±0.0250.974±0.016
Coupure externe rapide (11)0.0000.000
Absence autorisation RF0.893±0.0200.890±0.019
Seuil de vide0.957±0.0290.973±0.018
Claquage ou quench cavité0.696±0.0860.795±0.092
Dép seuil de sécurité RF0.892±0.0350.902±0.028
Rég signal RF hors tolérance0.943±0.0110.942±0.007
Class-weighting helps the one category that needed it, doesn't touch the rest class_weight='balanced' (added in an earlier phase 4 mitigation pass) moves six of seven per-label F1 scores by less than 0.02 — the exception is Claquage ou quench cavité, +0.099 (0.696→0.795), this category's own historically-noted rarity making it the one place reweighting has real headroom to work with. "Coupure externe rapide" is the same rarest-category floor already documented in steps 04/05 (11 ground-truth-passing events total): weighting can't manufacture signal from a class this small, and scores exactly 0.000 every single split either way.
Caught before trusting the label: dataset_version silently hardcoded to "V6" Same bug pattern already found and fixed in prepare_09c_enhanced_subclass_discovery.py and prepare_06_phase1_binary.py during the V7 re-run — missed in this script at the time. Both manifests here (08_phase3a_rootcause.yaml, _stability.yaml) carry dataset_version: V6 even though dataset_path correctly points at cooked_data_v7 and every number above is genuinely V7 — a display-label bug, not a data bug, but exactly the kind of thing that would mislead a future reader of the raw manifest. Fixed the same way as the two sibling scripts (derive from the input directory name instead of a literal), not yet re-run on the cluster since it only touches how this one metadata field is labeled, not any metric.

Cross-check against step 05: this task — predict which of the seven categories, given a fault happened — is close kin to step 05's full multi-label classification, just restricted to fault-only events with a plain RF instead of Label Powerset's ensemble. The repeated-split macro-F1 here (0.782±0.012) lands almost exactly on step 05's full-window Label Powerset macro-F1 (0.780±0.029) — consistent with both tasks recovering essentially the same 7-way separability rather than root-cause framing adding genuinely new discriminative information beyond "which fault category is this." The 1,387-event fault count also reconciles exactly with step 00/01's V7 total (2,865 events, 1,478 Normal + 1,387 fault).

correct (diagonal) misclassified Reference split (seed=42), n=417 test events · shade = row-normalized fraction Pickup thresholdSeuil pick-up Fast ext. cutoffCoupure externe rapide RF auth. absentAbsence autorisation RF Vacuum thresholdSeuil de vide Cavity quenchClaquage ou quench cavité RF safety thresholdDép seuil de sécurité RF RF reg. out of tol.Rég signal RF hors tolérance Pickup thresholdSeuil pick-up Fast ext. cutoffCoupure externe rapide RF auth. absentAbsence autorisation RF Vacuum thresholdSeuil de vide Cavity quenchClaquage ou quench cavité RF safety thresholdDép seuil de sécurité RF RF reg. out of tol.Rég signal RF hors tolérance 21 1 1 91 8 2 11 1 6 21 4 9 1 240 Predicted True
Real confusion matrix, pulled directly from cooked_data_v7/step_08_phase3a_v7/root_cause.pkl on cca (one-shot read-only command, no retraining). Diagonal reproduces the 93.5% single-split accuracy exactly (390/417). Two things the per-label F1 table doesn't show on its own: both "Coupure externe rapide" test events (n=2 of 11 total — a 30% split of a class this small) land on other classes, one on each of the two largest categories, rather than clustering on one wrong answer; and "Rég signal RF hors tolérance" is the dominant attractor for errors in both directions — it receives 9 misrouted "Absence autorisation RF" events and 4 misrouted "Dép seuil de sécurité RF" events, while itself leaking 9 events the other way into "Absence autorisation RF". Consistent with it being the majority class (250/417, 60% of the test set) rather than any specific physical confusability.
unweighted RF class_weight='balanced' 0 .25 .50 .75 1.0 F1 Pickupthreshold F1=0.000 (n=11) Fast ext.cutoff RF auth.absent Vacuumthreshold +0.099 Cavityquench RF safetythreshold RF reg.out of tol.
Repeated-split (10×) mean F1 per category, unweighted RF vs. class_weight='balanced' — the same numbers as the per-label table above, plotted to make the one real change visible at a glance: Claquage ou quench cavité is the only category weighting meaningfully helps (+0.099). "Coupure externe rapide" (11 events total) is flat at the axis floor either way, labeled explicitly rather than left as an easily-missed empty gap in the chart.
07

Fault subtype clustering

prepare_09c_enhanced_subclass_discovery.py Explored 2026-09-10 — V7

Within each fault category with enough events, K-Means, Agglomerative (ward/complete/average), and Gaussian Mixture clustering are compared by silhouette score to look for subtypes. Two corrections were needed before this was trustworthy: a near-zero-denominator division bug that let a handful of events take extreme outlier values, and a subtler bias where unconstrained silhouette maximization reliably chose whichever split isolated the single tightest minority subgroup — as small as one event — over a genuine population split. Fixed by winsorizing features at the 5th/95th percentile per category and requiring every cluster hold at least 15% of that category's events; a category with no candidate satisfying that floor reports "no balanced structure found" rather than falling back to an outlier-driven pick.

On V7, six of the seven categories now clear the 20-event minimum to attempt clustering at all (only "Coupure externe rapide", 11 events, is still too small) — up from five on V6, since "Seuil pick-up" grew from 12 to 94 events in the feed-forward-scope fix. Five of those six converge to a balanced k=2 split; the sixth, the largest category by far, doesn't:

Category (n)SplitMethodSilhouette
Dép seuil de sécurité RF (86)15 / 71KMeans-20.335
Seuil pick-up (94)18 / 76Agglom-ward-20.189
Seuil de vide (46)7 / 39Agglom-average-20.179
Absence autorisation RF (329)73 / 256Agglom-ward-20.130
Claquage ou quench cavité (31)13 / 18GMM-20.074
Rég signal RF hors tolérance (790)—none satisfies floor—
How many subtypes, with what confidence — the honest read Passing the 15%-balance sanity check is not the same claim as "real subtype structure," and the table above conflates them if read too quickly. By the standard silhouette bands (Kaufman & Rousseeuw: >0.7 strong, 0.5–0.7 reasonable, 0.25–0.5 weak-but- possibly-real, ≤0.25 no substantial structure), only "Dép seuil de sécurité RF" (0.335) clears even the weak-structure threshold. The other four balance-constrained splits — Seuil pick-up, Seuil de vide, Absence autorisation RF, Claquage ou quench cavité, silhouette 0.074–0.189 — are technically valid (no outlier-isolation, every cluster ≥15%) but sit in the range conventionally read as noise-level separation, not confident subtypes. So: 5 of 7 categories admit a technically-valid k=2 split; only 1 of those 5 has silhouette strong enough to call a real subtype with any confidence. "Rég signal RF hors tolérance" has real (if imbalanced) structure per the investigation below but no accepted split; "Coupure externe rapide" (11 events) was never analyzable. Every category topped out at k=2 — not a discovered commonality, k=3–6 were searched for all six and never won once the balance constraint applied.
Caught before trusting the note: excluded-category text hardcoded from V6 The manifest's own excluded_categories_note still read "Seuil pick-up (12 events) and Coupure externe rapide (11 events) are excluded" — true on V6, stale on V7 the moment "Seuil pick-up" crossed the 20-event floor at 94. A literal string, not derived from the run's actual data. Fixed to compute the excluded-category list (and its real counts) from the run's own y_multilabel instead of a hand-typed sentence — same class of bug as the dataset_version hardcodes already fixed here and in prepare_06_phase1_binary.py (step 04) during the 2026-09-09 V7 re-run, and fixed in prepare_08_phase3a_rootcause.py (step 06) earlier in this session — this script had its dataset_version field fixed already, but this second, separate hardcoded string was missed at the time. Not yet re-run on the cluster.
0% 30% 45% 15% balance floor Claquage ou quench cavité (31) 41.9% (13/31) Absence autorisation RF (329) 22.2% (73/329) Seuil pick-up (94) 19.1% (18/94) Dép seuil de sécurité RF (86) 17.4% (15/86) Seuil de vide (46) 15.2% (7/46) Rég signal RF hors tolérance (790) best: 12.8% (101/790) — rejected
Minority-cluster share of the best balance-constrained split found per category (amber), vs. the best any split reached for "Rég signal RF hors tolérance" even though it fails the 15% floor (red) — included to show how close it actually comes, not just that it fails. Reproduced directly on cca, one-shot, against cooked_data_v7 — silhouette and method for every row match the manifest exactly.
Resolving the open thread from 2026-09-09: not "no structure," a near-miss The previous session flagged "RF regulation out of tolerance" failing to cluster on V7 as unresolved, with two candidate explanations on the table. Investigated directly (one-shot ssh cca, no retraining beyond what the pipeline itself already does): the unconstrained top pick really is degenerate — a single-event outlier, 789-vs-1, exactly what the 15% floor exists to reject. But three independent methods (KMeans-2, Agglom-ward-2, Agglom-complete-2) agree, unprompted, on a ~101–103-event (~13%) minority subgroup with silhouette ≈0.22 — a score that would have beaten 3 of the 5 categories that did pass. This is genuine, cross-method-agreed structure, not noise; it simply sits about 2 points under a floor chosen as a round number, not derived from this category's own distribution. Neither of the two candidate explanations from 2026-09-09 (feature-space shift, or real finer substructure the search can't express) turns out to be quite right — it's closer to "real structure, floor slightly too strict for this one category's natural split."
08

Explainability & reporting

generate_macros.py SHAP + saliency done, LIME running — 2026-09-10

SHAP explains the classification models per physics-informed feature family, reported as per-feature-mean importance rather than a naive per-group sum — the statistical and temporal families outnumber the seven physics families combined roughly 20:1, so a group sum would structurally favor them regardless of how informative any single physics feature is. Every number in the paper, including every figure and table above, traces to a versioned, git-tracked results manifest rather than being hand-typed: each pipeline script writes its own manifest, a generator converts it into LaTeX macros, and a checker flags any bare numeric literal in the report text that isn't backed by one.

Unlike every step above, this one had never run on V7 at all Checked before writing anything here: every SHAP phase (A/B/C), the enhanced physics-group SHAP pass, the Phase-3 weakness diagnosis, and the inference-latency benchmark only had _v6 SLURM submit scripts — not stale V7 numbers, genuinely never run. Two of the underlying scripts (phase3_weakness_diagnosis.py, benchmark_inference_latency.py) hardcoded cooked_data_v6 directly rather than reading SPIRAL2_COOKED_DIR like the others, so pointing them at V7 needed a real code fix, not just a new submit script — parameterized the same way as every other script in this pipeline. Along the way, caught one more concrete break: prepare_07a_phaseA_shap.py hardcoded its trained-model input directory as step_07_phaseA_br, which doesn't exist under cooked_data_v7 (the real V7 directory is step_07_phaseA_v7_br) — would have failed outright rather than silently used wrong data, but fixed before submitting rather than found out from a failed job. All upstream V7 models this depends on (binary RF, Label Powerset, precursor RF, Phase A/B trained models) were verified to already exist on cca before launching — no retraining needed, only the analysis layer on top of them.
JobSLURM IDElapsedResult
Phase A SHAP (Binary Relevance)5836586110sCompleted
Phase B SHAP (Classifier Chains)583658621m49sCompleted
Phase C SHAP (Label Powerset)583658635m01sCompleted
Enhanced physics-group SHAP5836586417sCompleted
Phase 3 weakness diagnosis5836586519sCompleted
Inference-latency benchmark583658669sCompleted
Physics-group SHAP manifest583658672sCompleted

All seven jobs finished clean (exit 0), 19 seconds to 5 minutes each — no reruns needed. Three real analyses below: the physics-group SHAP breakdown, the Phase-3 weakness diagnosis (imbalance correlation, a second confusion-matrix cross-check, a 9-subtype physics breakdown, and learning curves), and the inference-latency benchmark.

Physics-group SHAP

CategoryTop group, per-feature meanShareTop group, by sum
Seuil pick-upStatistical40.8%Temporal
Coupure externe rapideRF Mismatch33.1%Temporal
Absence autorisation RFModulator Command26.1%Temporal
Seuil de videStatistical46.1%Temporal
Claquage ou quench cavitéEffective Decay34.8%Temporal
Dép seuil de sécurité RFStatistical22.5%Temporal
Rég signal RF hors toléranceEffective Decay26.7%Temporal
The imbalance-correction argument, seen directly in the real numbers "Top group by sum" is Temporal for every single one of the seven categories — exactly the structural artifact this step's own intro paragraph warns about (Temporal alone is 501 of 810 features, 61.9%), not a physics finding. Per-feature mean tells a different, more interesting story: 4 of 7 categories have a genuine physics-informed family on top despite those families totaling only 39 of 810 features (4.8%) — Coupure externe rapide/RF Mismatch, Absence autorisation RF/Modulator Command, and both quench-related categories/Effective Decay. Claquage ou quench cavité landing on Effective Decay (34.8% mean, 52.1% median — agreeing by both metrics) is a direct, independent confirmation of step 02's own decay-fit finding (the bimodal fast/slow collapse-time split found by hand on 31 real quench events) — two different methods, on the same category, converging on the same physics.
Good catch from the user: SHAP alone wasn't the whole explainability story The pipeline actually runs three attribution methods, not one — SHAP (classical models, above), gradient saliency (the four deep phaseD architectures), and LIME (classical models again, a second, independent local-attribution method). Only SHAP had been checked so far this session. Saliency turned out to already be done on V7, from a prior session, completely missed until asked about directly. LIME, like SHAP, had never run on V7 at all — now launched, same pattern as before.

Saliency (deep models) — already complete on V7

Gradient-based saliency (∂output/∂input, per fault-category head) for all four phaseD deep architectures (CNN, CNN-LSTM, MLP, Transformer), 200 sampled events × 810 features × 7 heads each. Already run on V7 in a prior session (jobs 58270040–43 and re-run 58277150–53, all COMPLETED — found via sacct history, not something this session launched) but never reported here until the question above prompted checking. Classified through the exact same physics-group function the SHAP analysis uses, for a fair comparison:

ArchitectureTop single feature (mean |saliency|)GroupTop group by sum
CNNA Ucr binary_meanStatisticalTemporal, 60.6%
CNN-LSTMDPCI_velocity_meanTemporalTemporal, 63.1%
MLPmeta_KPIMetadata/StatusTemporal, 61.1%
Transformercommandes binary_segment_early_meanTemporalTemporal, 59.9%
Cross-method agreement, plus one real oddity Temporal dominates group-sum saliency for all four deep architectures (60–63%) — the same pattern SHAP showed for every classical-model category, and for the same structural reason (Temporal is 62% of all features). This cross-method agreement is reassuring, not surprising. The one thing worth flagging: MLP's single top feature is meta_KPI, an acquisition-quality metadata field (already flagged back in step 00 as "not a state flag"), not a physics signal — the other three architectures' top feature is a genuine physics-adjacent Temporal/Statistical measurement. Not necessarily a problem (KPI plausibly correlates with real fault precursors indirectly), but a concrete thing to check before trusting the MLP variant's explanations at face value; the other three architectures don't show this pattern.

LIME — launched, running

Same gap as SHAP: only _v6 submit scripts existed for LIME (Phase A/B/C, the classical multi-label models). Fixed the identical step_07_phaseA_br hardcode bug in prepare_07a_phaseA_lime.py (SHAP's own twin script had the same bug, fixed earlier this session) and launched three V7 jobs: Phase A (58367851), Phase B (58367852), Phase C (58367853) — all confirmed running via squeue. LIME fits a local perturbation-sampled surrogate model per instance, far more expensive than SHAP's TreeExplainer (2-hour budget vs. SHAP's 1-hour), so these are still in flight; numbers land here once they finish.

Weakness diagnosis

Imbalance really does hurt performance, now quantified rather than assumed: Pearson r (category size vs. mean F1 across 4 multi-label models) = 0.402, rising to 0.731 against log₁₀(size) — the relationship is closer to logarithmic than linear, consistent with "Rég signal RF hors tolérance" (n=790, mean F1=0.935) and "Coupure externe rapide" (n=11, mean F1=0.049) sitting at opposite ends. A second, independently-built root-cause confusion matrix (plain unweighted RF, not the class_weight='balanced' one from step 06) reproduces the same pattern found there: 391/417 correct (93.8%, vs. step 06's 93.5% weighted), same dominant confusion direction (10 "Rég signal RF hors tolérance" events misrouted to "Absence autorisation RF", the reverse direction weaker at 6) — consistent, not identical, cross-check.

Real subtype structure exists within "Rég signal RF hors tolérance" — step 07 just couldn't find it unsupervised This diagnosis pulls a different subtype label this dataset already carries: a rule-based 9-way physics breakdown (Fausse alerte, Gain chaîne de puissance, Oscillation Ucav, Perte faisceau, Quench, Quench adjacent, Anomalie de la présence faisceau, Erreur de contrôle d'accord, Autre — decoded from the ALM bits, not discovered). A supervised RF predicting these 9 labels from features reaches macro-F1 = 0.812 on all 790 events of this category — a strong, confident result, despite the smallest subtype ("Erreur de contrôle d'accord") having just 1 test-set event. This directly answers step 07's open question: unsupervised clustering found nothing valid for this category (best balanced candidate 12.8%, under the 15% floor) not because there's no real subtype structure, but because unsupervised geometry can't discover named physics categories that unsupervised search was never given labels for. With the labels, the structure is there and strongly learnable.
0 .25 .50 .75 1.0 10% 23% 36% 49% 61% 74% 87% 100% % of training data used Binary classification (step 04) Root-cause identification (step 06)
5-fold CV macro-F1 (mean), from the manifest's own real numbers, not smoothed or fitted. Binary classification is already at ceiling with just 10% of the training data (cv_f1=0.999) and gains essentially nothing from the rest (slope −0.001 over the whole range) — overkill, not evidence of a hard task solved well. Root-cause identification is the opposite: climbs from 0.228 to 0.693 (slope +0.465), still rising, not flattened, at 100% of the available data — a genuinely data-limited task, unlike binary classification, and a concrete argument for why more labeled fault events (not a different model) is the lever most likely to move this number further.

Inference latency

ModelMeanp95Max
Step 04 binary RF12.28ms12.45ms19.93ms
Step 05 precursor RF12.61ms12.46ms76.10ms
Phase C Label Powerset (XGBoost)0.35ms0.38ms7.20ms

Single-event, single-threaded, no batching — the realistic "one new postmortem file arrives" deployment scenario, 200 timed calls per model on V7 test data. Every model is comfortably real-time; the RF-based models (~12–13ms) are roughly 35× slower per event than XGBoost (0.35ms) despite solving a harder task (multi-label vs. a single Label Powerset code), consistent with RF's per-tree traversal cost against XGBoost's more compact boosted ensemble. Replaces the report's previously-unverified "45ms/event"/"<100ms" claims with a real, reproducible number; feature engineering time (reading the raw file, computing features) is not included, since it already runs offline, not per-event.


REF

Glossary & acronyms

LLRF
Low-Level Radio Frequency — the control system regulating a cavity's RF field amplitude and phase.
RF
Radio Frequency — the oscillating electromagnetic field used to accelerate the particle beam.
Cavity
A superconducting resonant structure that transfers RF energy to the particle beam.
Quench
A sudden, localized loss of superconductivity in a cavity, causing a rapid collapse of the stored RF field.
Postmortem buffer
A short recording of signals captured automatically around a fault trigger, used for offline diagnosis.
ALM
Alarme (French: alarm) — the control-system bit flagging an active interlock/fault condition.
Feed-forward
An LLRF control-loop mode that pre-compensates known disturbances rather than reacting to them; operationally meaningful only from 2021 onward in this dataset.
ROC AUC
Area under the Receiver Operating Characteristic curve — a threshold-independent measure of binary classification quality (1.0 = perfect, 0.5 = chance).
F1 / macro-F1
The harmonic mean of precision and recall for one class; macro-F1 averages this unweighted across all classes, so rare classes count equally with common ones.
SHAP
SHapley Additive exPlanations — a game-theoretic method attributing a model's prediction to its input features.
LIME
Local Interpretable Model-agnostic Explanations — explains one individual prediction by fitting a simple local surrogate model around it.
Saliency
A gradient-based explanation method for neural networks: how much a small change in each input feature would change the output.
Silhouette score
A clustering-quality measure from −1 to 1, comparing each point's distance to its own cluster vs. the nearest other cluster.
SPIRAL2
The superconducting linear accelerator facility at GANIL, Caen, France.
GANIL
Grand Accélérateur National d'Ions Lourds — the French national heavy-ion accelerator laboratory.
REF

Bibliography

Methods, prior work, and SPIRAL2-specific references used throughout this pipeline. Every DOI below was checked directly against Crossref or the publisher's own record; a handful of legitimate older or preprint-venue papers have no DOI at all, and are marked as such rather than given a guessed one.

  1. SPIRAL2 / GANIL — A. Orduz et al., “SPIRAL2 commissioning and operations”, Journal of Instrumentation 19, T05006 (2024). 10.1088/1748-0221/19/05/t05006
  2. SPIRAL2 LLRF control — F. Bouly et al., “Superconducting Cavity and RF Control loop model for the SPIRAL2 LINAC”, LINAC2022 (2022). 10.18429/JACoW-LINAC2022-THPOPA13
  3. AI for accelerators, overview — A. Ghribi et al., “Artificial intelligence for advancing particle accelerators”, Europhysics News 56(1), 15–19 (2025). 10.1051/epn/2025106
  4. ML for accelerator fault diagnosis — C. Tennant et al., “Superconducting Radio-Frequency Cavity Fault Classification Using Machine Learning at Jefferson Laboratory”, Phys. Rev. Accel. Beams 23, 114601 (2020). 10.1103/PhysRevAccelBeams.23.114601
  5. ML for accelerator anomaly detection — C. Peters et al., “Machine Learning for Time Series Prediction of an Accelerator Beam to Recognize Equipment Malfunction”, IPAC’21 (2021). 10.18429/JACoW-IPAC2021-TUPAB328
  6. ML for beam-loss classification — G. Valentino et al., “Machine Learning Applied at the LHC for Beam Loss Pattern Classification”, J. Phys.: Conf. Ser. 1067, 072036 (2018). 10.1088/1742-6596/1067/7/072036
  7. Quench prediction (LSTM) — M. Mertik & A. Skoczeń et al., “A Conceptual Development of Quench Prediction App based on LSTM and ELQA Framework”, arXiv:1610.09201 (2016). 10.48550/arXiv.1610.09201
  8. Model-based fault estimation — B. Sayyar-Rodsari & C. Schweiger, “Optimal Model-Based Fault Estimation and Correction for Particle Accelerators and Industrial Plants”, SLAC tech. report (2010). 10.2172/992983
  9. Rule-based accelerator fault diagnosis — E. Malandain & P. Skarek, “An Expert System for Accelerator Fault Diagnosis”, PAC’87, 559–561 (1987). JACoW archive — no DOI exists (pre-DOI-era proceedings).
  10. XFEL anomaly detection — A. S. Nawaz, “Probabilistic Model-based Anomaly Detection for the European X-ray Free Electron Laser”, PhD thesis, Universität zu Lübeck (2021). No DOI found (institutional-repository thesis).
  11. Isolation Forest — F. T. Liu, K. M. Ting & Z.-H. Zhou, ICDM, 413–422 (2008). 10.1109/icdm.2008.17
  12. Local Outlier Factor — M. M. Breunig et al., ACM SIGMOD, 93–104 (2000). 10.1145/342009.335388
  13. DBSCAN — M. Ester et al., “A Density-Based Algorithm for Discovering Clusters in Large Spatial Databases with Noise”, KDD, 226–231 (1996). No DOI exists (pre-DOI-era proceedings).
  14. Deep autoencoding GMM (anomaly detection) — B. Zong et al., ICLR (2018). No DOI found (ICLR/OpenReview venue).
  15. GANomaly — S. Akcay, A. Atapour-Abarghouei & T. P. Breckon, ACCV, 622–637 (2018/2019). 10.1007/978-3-030-20893-6_39
  16. Silhouette score — P. J. Rousseeuw, “Silhouettes: A Graphical Aid to the Interpretation and Validation of Cluster Analysis”, J. Comput. Appl. Math. 20, 53–65 (1987). 10.1016/0377-0427(87)90125-7
  17. SHAP — S. M. Lundberg & S.-I. Lee, “A Unified Approach to Interpreting Model Predictions”, NeurIPS, 4765–4774 (2017). No DOI found (NeurIPS venue).
  18. LIME — M. T. Ribeiro, S. Singh & C. Guestrin, “‘Why Should I Trust You?’: Explaining the Predictions of Any Classifier”, ACM SIGKDD, 1135–1144 (2016). 10.1145/2939672.2939778
  19. Explainable AI, survey — A. Barredo Arrieta et al., “Explainable Artificial Intelligence (XAI)”, Information Fusion 58, 82–115 (2020). 10.1016/j.inffus.2019.12.012
  20. Classifier Chains — J. Read et al., ECML, 254–269 (2009). 10.1007/978-3-642-04174-7_17
  21. ML-kNN — M.-L. Zhang & Z.-H. Zhou, Pattern Recognition 40, 2038–2048 (2007). 10.1016/j.patcog.2006.12.019
  22. Multi-label decision trees — C. Vens et al., “Decision Trees for Hierarchical Multi-Label Classification”, Machine Learning 73, 185–214 (2008). 10.1007/s10994-008-5077-3
  23. Multi-label learning, survey — M.-L. Zhang & Z.-H. Zhou, IEEE TKDE 26, 1819–1837 (2014). 10.1109/tkde.2013.39
  24. Causal inference — J. Pearl, Causality: Models, Reasoning, and Inference, 2nd ed., Cambridge University Press (2009). 10.1017/cbo9780511803161
  25. Granger causality — C. W. J. Granger, Econometrica 37, 424–438 (1969). 10.2307/1912791
REF

Project team

  • Adnan Ghribi
  • Charly Lassalle
  • Alexandre Dalibard Brund
  • Marco Di Giacomo
  • Frédéric Bouly