Files
GridBased/docs/WORKFLOW_DESIGN.md
T
xie_x1andClaude Opus 5.5 0f9a3f496f Initial commit: grid-based multi-photon reconstruction
Code, configs, charge LUTs, best.pth and evaluation records for each
training run, the knife-edge / Siemens-star / XRF notebooks with
outputs, and the overnight run reports. Epoch checkpoints, inference
results and HTML exports stay local (see .gitignore).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 07:36:49 +02:00

22 KiB
Raw Blame History

GridBased 重建工作流 —— 设计与 Work Package 分割

状态:草案 v0.1(2026-08-30);进度见第 9 节(2026-09-18) 目标:把 MLXID 从「cluster finder + 按光子数分模型」的链路,改为「在像素栅格上直接预测亚像素位置 + 能量」的链路,以支持多色(polychromatic)信号。 上游背景:27th iWoRiD 报告 Outlook 页 —— grid-based prediction from frames to X-ray reconstruction。


0. 出发点:为什么现在这条链路在多色下必然失效

现有链路(已完成 1/2/3 光子位置重建):

raw ADU → pedestal → 3D-LUT 标定 → keV frame → cluster finder
        → 用 cluster 总能量判定光子数 (E±ΔE / 2E±2ΔE / 3E±3ΔE)
        → 送进 1/2/3 光子专用模型 (3×3 / 6×6 / 9×9,cluster 中心化)
        → 亚像素位置

它有三个隐含前提,在多色下全部失效:

  1. 光子数由 cluster 能量判定。 多色下 cluster 能量 = ΣEᵢ,无法区分「1 个 24 keV」和「2 个 12 keV」。
  2. 每个多重度一个模型、输入尺寸固定。 光子数不可知,就无法选模型。
  3. cluster 中心化输入。 位置精度与 cluster finder 的定心行为耦合;效率也由 cluster finder 定义(报告里的 85% / 89% / 96%)。

新链路把 cluster finder 从「多重度分类器」直接删除,改由一个全卷积网络在固定像素栅格上输出:每个 cell 一组 (有无光子, 亚像素偏移 dx dy, 能量 E)。

新增能力:per-photon 能量 → 能量分辨成像 / K-edge / XRF 成分成像;效率不再由 cluster finder 定义,而是模型自身的 efficiency–purity 工作点,可连续调节。


1. 任务重述(整件事的核心)

从「对一个已切好的 cluster 回归 N 个点」变成「在一帧图像上做点目标检测」。

采用 CenterNet / anchor-free 形式:

  • 输出张量与输入帧同尺寸,每像素 cell 5 个通道: logit p(该 cell 内有光子)、dx, dy ∈ [−0.5, 0.5](cell 内亚像素偏移)、log E(能量); 可选第 6 通道 z(深度,仅模拟有真值,作辅助任务)。
  • 真值分配:光子 (x, y) 分配给 cell (⌊y⌋, ⌊x⌋)。
  • 推理:p > p_thr → 3×3 max-pool NMS → photon list (x = col + dx, y = row + dy, E)。

为什么是这个形式,而不是 DETR 式集合预测:变长输出天然、平移等变、可在任意尺寸帧上推理、训练稳定。集合预测(Hungarian matching,现有 2/3 光子 loss 的推广)保留为 ablation。


2. 八个核心设计决策

D1 — 全卷积:train small / infer large

不要 FC 层、不要 coordinate-embedding 通道、不要依赖全局统计的 BatchNorm(用 GroupNorm 或不用归一化)。

现有模型靠 coordinate embedding 把绝对位置喂进 FC 层。在 grid 形式下这既不必要(绝对位置 = cell index),也有害:它破坏平移等变,逼得训练尺寸与推理尺寸必须一致。保持严格平移等变,就可以用 32×32 小帧训练、直接在 400×400(乃至 full-size 1200×800)整帧上推理 —— 这是分块问题最干净的解法。

D2 — 感受野即 halo,halo 即唯一的算法死区

设感受野半径 R(4 层 3×3 valid conv → R = 4 px = 100 µm)。

  • 训练:tile 用 same padding,但损失只在距 tile 边界 ≥ R 的 cell 上计算。零填充对被监督的 cell 完全不可见 → 训练/推理分布一致。
  • 推理:整帧一次前向,只丢弃物理边界外 R 圈。tile 之间不存在重叠问题,因为根本不切 tile。
  • 显存受限时(1200×800 并不受限,24 GB 足够)退化为大 tile(如 256×256)+ halo R 重叠、只取中心区域,逻辑与训练完全一致。

关于原设想的「sub-frame 之间 1–2 行重叠」:若坚持切小 tile 推理,重叠必须是 2R(每边 R),即 8 行/列,而不是 1–2;且 9×9 tile 配 R=4 只剩 1×1 有效区,计算浪费约 80 倍。这就是不切小 tile 的直接理由。

关于探测器边缘:物理上不可恢复的只有最外 1 圈(电荷跑出传感器)。R 圈是算法性的,可以用边缘增强训练(约 5–10% 训练帧含一条模拟传感器边界、界外为零)消除,把弃用区从 4 圈压回 1 圈。400×400 上是 2% vs 0.5% 面积。

D3 — 训练帧尺寸 32×32,而不是 9×9

9×9 来自现有 3 光子 cluster 尺寸,在 grid 形式下不再有意义。选 32×32:

  • 有效监督面积占比 (32−2R)²/32² = 56%(9×9 只剩 ~1%);
  • 1% occupancy 下每帧 ~10 个光子,天然包含真实 pileup 与空白区的混合。

空白区必须进训练集,否则模型在空 tile 上会幻觉出光子 —— 这是 fake rate 的根源。推论:训练样本必须按帧生成(见 D7),而不是按"事例"生成。

D4 — 同 cell 简并与 NMS

两个光子落在同一个 25 µm cell 内时,栅格形式只能吐一个。这本就是物理上不可分的情形,但必须量化:统计「因同 cell 丢失」的比例随 occupancy 的变化。若需要,可给每个 cell 两个 slot(10 通道),代价是标签歧义。

建议先单 slot,用 pair-resolution 曲线(分辨概率 vs 两光子间距)作为基本 figure of merit,取代原来的 "efficiency vs occupancy"。

相邻 cell 对同一光子同时激活的重复计数,用 3×3 max-pool NMS 抑制;同时评估「位置空间按距离合并」作为替代方案。

D5 — 能量:平坦先验 + log 回归

训练能量从 4–32 keV 均匀采样(比目标 5–30 keV 略宽)。回归网络会把预测拉向训练先验的均值,平坦先验可最大限度避免谱形偏置;真实谱下的表现在评估阶段用重加权检验。

预期能量分辨:3×3 求和的噪声极限 ≈ √9 × 0.13 = 0.39 keV RMS(12 keV 处 Fano 项只有 ~75 eV,可忽略)。网络能看到 9×9 感受野且能加权求和,有可能优于固定 3×3 求和 —— 3×3 在大电荷云 + 像素角入射时会漏掉尾巴。这是一个可验证的增益点。

D6 — 样本产生:α(E,t)、β(E,t) 做二维曲面,不要独立插值 9 个拟合参数

McGeneration/Notebooks/DoubleParameterize.ipynb 目前停在「把 5–30 keV 每个能量点的 9 个参数画出来」。

不要对这 9 个参数各自拟合 E 的函数。α 的 4 参数多项式和 β 的 5 参数 p0(x−p1)^p2 + p3·exp(p4·x) + 2 都存在拟合简并,参数之间强相关且各自不稳定;逐参数插值会在中间能量产生非物理的 α(t)、β(t)。

推荐:把每个能量点已拟合好的 α(t)、β(t) 采样成表,构造 α[E, t] / β[E, t] 二维 LUT + 双线性插值(E 方向 1 keV 步长已足够密)。物理量本身光滑,拟合参数不是。

闭合检验:用 LUT 在 12 / 15 keV 重新生成样本,与该能量点直接拟合生成的样本比较 cluster 能量谱、eta 分布、3×3 能量份额分布。

D7 — 帧级生成器,噪声要补齐

现有 McGenerator.singleProcess 是「一帧一个光子、位置固定在中心像素内、再切 cluster」。改成帧级:

  • N ~ Poisson(occupancy × 面积),位置在整帧均匀;
  • 每个光子独立采 E(谱可配置)→ 由 E 取衰减长度 → 采 z₀ → 得漂移时间 t → LUT 取 α、β → gennorm 采样电荷对 → 叠加;
  • 噪声:实测 per-pixel pedestal noise map(已有)+ shot + calibration,新增 common-mode(MÖNCH 逐行/列共模让相邻像素相关,是 grid 检测器 fake rate 的主要来源,原先被 cluster finder 的形态学约束挡掉了)+ ADU 量化 + LUT 残余非线性;
  • 物理补齐:Si 逃逸峰(1.74 keV)、康普顿 —— 多色 5–30 keV 下这些会污染能量谱。

一个需要专门检验的物理效应:低能(5 keV,衰减长度 18 µm)几乎全部在入射面转换 → 最长漂移 → 最大电荷云 → 分享最好;高能(30 keV,衰减长度 3.3 mm ≫ 320 µm)深度近似均匀 → 大量小电荷云 → 位置分辨变差。 位置分辨对能量不是单调的,也正因如此位置和能量必须联合预测。

D8 — 分两步走:先单色对标,再多色

不要同时改两件事。第一阶段用 12 keV 单色,在同一批模拟样本上把 grid-based 与现有 1/2/3 光子模型 + eta 插值直接对比(σ = 0.8 µm、DanMAX 表格里的 MTF50 / DQE 都是现成对标点)。过不了这一关,多色再好看也不可信。


3. 评估口径必须换

原来的 efficiency 是 cluster finder 给的;现在是检测问题,要报:

指标 说明
efficiency (recall) / purity (1 − fake rate) 作为 occupancy、能量、最近邻距离的函数;工作点由 p_thr 扫出 ROC
位置残差 RMS / FWHM vs 能量、vs z、vs 是否 pileup
能量分辨与线性 vs 能量、vs pileup
亚像素均匀度 grid artifact 风险:每 cell 独立回归偏移,天生倾向于避开 cell 边界
纯噪声帧 fake rate 直接拿 pedestal run 跑模型 —— 最硬的实验检验
pair-resolution 曲线 分辨概率 vs 两光子间距,取代 efficiency vs occupancy

匹配方式:photon-level Hungarian / 贪心匹配,半径阈值 1 px。


4. 实验数据:现成的多色数据已经有了

DataProcess/Configs.py 里已存在 2603 MaxIV beamtime 的 XRF run(Moench014 标定):

  • AgMo_factor_10 —— Ag Kα 22.16 / Kβ 24.94,Mo Kα 17.48 / Kβ 19.61 keV
  • Pg28_2_factor_1 / Pg28_2_factor_10 —— Pb Lα 10.55 / Lβ 12.61 / Lγ 14.76 keV 更正(2026-09-18):这些 run 在 12 keV 束流下测量,低于 Pb L3 边(13.04 keV),谱里没有 Pb L 线。 Pb28 / Pg28 / Pg17 / Pg7 是颜料样品(钴蓝 / 钴钛绿 → Co Kα 6.93,氧化铬绿 → Cr Kα 5.41,酞菁绿 → Cu Kα 8.04), 13.8 keV 处的峰是 Co+Co pile-up。

分立的已知能量线,是 per-photon 能量重建最直接的检验(谱线位置、能量分辨、相对强度)。每个样品都有 slit factor 1/2/4/10(CuCr 还有 20)的 flux 系列,占有率 0.6–7 %。 实际覆盖:Cr/Co/Cu(5.4–8 keV,12 keV 束流)与 Mo/Ag/Cd/Sb(17–26 keV,束流高于 Sb K 边)。全部 run 和选择理由见 Configs/infer_measurement_poly_Moench014.yaml。

XRF 用的是 Moench014,偏压 150 V 已由 beamtime 的 moench.config(highvoltage 150)确认。

单色对标数据也齐:DanMAX 12 keV knife-edge + flat field、SOLEIL 15 keV Siemens star,可直接复算 ESF / MTF / DQE 与已发表表格对比(DeepLearning/src/funcs_postprocess.py 全部可复用)。

吞吐量估计:5 层小卷积 ≈ 54k MAC/px → 400×400 整帧 ≈ 17 GFLOP → RTX 4090 上 ~0.2 ms/帧(≈ 5–6 kHz,与探测器帧率同量级);20 M 帧 ≈ 1 GPU-小时,实际会是 I/O 受限(6.4 TB raw)。即:grid-based 端到端未必比现在的 CPU cluster finder 慢。


5. Work Package 分割

依赖关系:WP0 → {WP1, WP2} → WP3 → WP4 → WP5 → WP6。WP1 在关键路径上。

WP0 — 框架与数据契约(~0.5 周)

  • GridBased/ 独立 git repo,沿用现有约定:src/ + Configs/*.yaml(OmegaConf) + Results/<exp>/{Models,Plots}。
  • 数据契约(先定死,后面全部依赖它):
    • 训练帧 HDF5:frames [N, S, S] float32 (keV);变长真值 photon list (frame_idx, x, y, E, z)。
    • 推理输出:photon list (frame_idx, x, y, E, p),+ 可选分箱图像。
  • 评估 harness 骨架(matching + 指标),先用现有 1/3 光子模型跑通,保证新旧结果可比。

WP1 — 多色样本产生(~2–3 周,关键路径)

  • 1.1 α(E,t) / β(E,t) 二维 LUT + 闭合检验(接 DoubleParameterize.ipynb)。
  • 1.2 帧级生成器:Poisson 布点、可配置能谱、边缘增强帧、多进程产出。
  • 1.3 噪声与物理补齐:common mode、逃逸峰、ADU 量化、LUT 残差;与实测像素能量谱 / cluster 能量谱对标(沿用 NIMA 论文的比法)。
  • 交付:5–30 keV、occupancy 0.1–10% 覆盖的 ~10⁷ 光子级数据集 + 生成器配置。
  • 门控 G1:模拟帧的像素能量谱、cluster 能量谱、eta 分布在 12 / 15 keV 与实测一致。

WP2 — 输入定义与分块(~0.5–1 周)

  • tiling.py:训练帧采样、损失掩码、推理(整帧 / 大 tile 两条路径)、边缘策略。
  • 单元测试:覆盖完备性(每个物理像素恰被一个有效区覆盖一次)、无重复计数。
  • ablation:R(层数)与训练帧尺寸扫描;「预测质量 vs 距 tile 边界距离」曲线用来定 halo。

WP3 — 模型与损失(~2–3 周)

  • FCN backbone(GroupNorm / 无归一化)+ 5 通道 head;focal loss(objectness)+ SmoothL1(offset / logE,仅正样本);max-pool NMS。
  • 先单色 12 keV(D8),再多色。
  • 门控 G2:12 keV 模拟上单光子 σ ≤ 0.8 µm;1.7% occupancy 下 efficiency ≥ 96% 且 purity 不劣于现有链路。

WP4 — 模拟验证与基准(~1.5–2 周)

  • 第 3 节全套指标;与 eta 插值、现有 1/2/3 光子模型在同一批样本上对比。
  • 亚像素均匀度与展平方案(flat-field 自归一化 / Rosenblatt)。
  • 门控 G3:5–30 keV 全区间 efficiency / purity / 能量分辨成表;亚像素均匀度可接受或有可用展平方案。

WP5 — 实验数据(~2–3 周)

  • 5.1 帧级标定流水线:复用 UsefulFuncs.convertAduFrameToEnergyFrame,去掉 cluster finder 分支。
  • 5.2 大规模推理 + photon list 输出 + 分箱成像(复用 binning_factor = 10)。
  • 5.3 XRF 多色验证(AgMo / Pb):谱线位置、能量分辨、能量分辨成像。
  • 5.4 单色复算:DanMAX knife-edge ESF/MTF/DQE、SOLEIL Siemens star,与已发表表格对比。
  • 5.5 pedestal run 上的 fake rate 实测。
  • 门控 G4:MTF50 ≥ 现有 DL 数字;XRF 谱线可分辨且位置正确。

WP6 — 扩展与集成(开放)

full-size MÖNCH 1200×800;ONNX / TensorRT 导出;在线管线集成;detector design scan(pixel pitch / sensor thickness / bias voltage)。

WP7 — 产出

iWoRiD / NIMA、thesis chapter;MLXIDDemo 增补 grid-based 分支。


6. 风险清单

# 风险 缓解
R1 亚像素栅格伪影比现有方法更严重(每 cell 独立回归偏移,cell 边界处天然稀疏)。最可能真正卡住的一条。 flat-field 自归一化;训练时亚像素抖动增强;或改用连续 heatmap + soft-argmax
R2 fake rate / common mode —— cluster finder 的形态学约束没有了 噪声建模补齐 + pedestal run 实测 + p_thr 工作点
R3 sim-to-real gap —— 5–30 keV 全区间 LUT 标定的非线性残差 XRF 线交叉检验;必要时用单色 run 的 pseudo-label 微调
R4 同 cell 双光子的内禀损失,在高 occupancy 下成为主要低效来源 量化并写进 pair-resolution 曲线;必要时双 slot
R5 多色下没有"能量窗"可做数据侧筛选 —— 实验数据不再有 easy ground truth 验证只能靠 XRF 线 + MTF + flat-field 均匀性三条腿

7. 已定 / 待定

已定(2026-08-30)

决定
第一阶段工作点 12 keV 单色,MOENCH040 @150 V —— 直接对标 DanMAX knife-edge 与已发表的 σ=0.8 µm
训练 occupancy 对数均匀 0.2 % – 10 %(可配置),一个模型覆盖全通量;测试用 0.5/1/2/5/10 % 固定点逐步观察
样本来源 复用现成的 12keV_Moench040_150V_*.npz(10 M 无噪声 5×5 stamp),叠加成帧后统一加噪声;WP1.1 的 α(E,t) LUT 推迟到多色阶段
训练帧 / halo 32×32 训练帧,R = 4 px(4 层 3×3),有效区 24×24;推理整帧

待定

  1. XRF run 的偏压 / 增益设置需确认 —— 150 V,见第 4 节。
  2. 训练能谱:实际采用平坦 5–30 keV。XRF 表明能量头在两端 ~0.75 keV 内有偏移和刻度压缩(Cr Kα 5.41 keV 受影响), 建议下一版扩到 ~3–35 keV,使感兴趣的谱线都离边界 ≥ 1 keV(见第 9 节)。
  3. 是否要 z(深度)作为辅助输出 —— 有助于让网络显式学电荷云尺寸,但推理时无用。
  4. Moench040 的传感器厚度:现成样本的 z 范围是 0–650 µm,与 Moench014 的 320 µm 不同,多色阶段重做参数化时要对齐。

8. 建议目录结构

GridBased/
├── docs/
│   └── WORKFLOW_DESIGN.md        # 本文件
├── Configs/
│   ├── generate_frames.yaml      # WP1 帧级生成
│   ├── train_grid.yaml           # WP3
│   └── infer_<run>.yaml          # WP5
├── src/
│   ├── charge_model.py           # WP1.1  α(E,t)/β(E,t) LUT
│   ├── frame_generator.py        # WP1.2  帧级 MC
│   ├── noise_model.py            # WP1.3  pedestal / common mode / 量化
│   ├── tiling.py                 # WP2    训练帧采样、损失掩码、推理分块
│   ├── datasets.py               # WP3
│   ├── models.py                 # WP3    FCN + 5 通道 head
│   ├── losses.py                 # WP3    focal + SmoothL1 + 真值分配
│   ├── decode.py                 # WP3    NMS → photon list
│   ├── metrics.py                # WP4    matching / efficiency / purity / 残差
│   └── measurement.py            # WP5    标定 → 整帧推理 → photon list
├── scripts/
│   ├── 01_build_charge_lut.py
│   ├── 02_generate_frames.py
│   ├── 03_train.py
│   ├── 04_benchmark_mc.py
│   └── 05_infer_measurement.py
├── Notebooks/
└── Results/

可直接复用的现有代码:

  • McGeneration/McGenerator.py —— 漂移时间模型 getDriftTime_allpix2_8p23、GGD 参数化流程
  • DataProcess/UsefulFuncs.py —— convertAduFrameToEnergyFrame(3D-LUT 标定)、pedestal 处理、raw 帧读取
  • DeepLearning/src/funcs_postprocess.py —— ESF / MTF(ISO 12233) / NPS / DQE / 亚像素归一化
  • EtaInterpolation/ —— baseline 对比

9. 进度与门控(2026-09-19)

WP 状态 说明
WP0 框架与数据契约 ✅ 00_selftest.py(坐标、D4、平移等变、位置空间合并)
WP1.1 α(E,t)/β(E,t) LUT ✅ 01_build_charge_lut.py + 01b_validate_charge_lut.py(留一法插值检验);现用 3–30 keV 表 data/charge_lut_Moench014_150V_3to30keV.npz(2 keV 模拟只有 328/512 个深度 bin,未用)
WP1.2 帧级生成器 ✅ 12 keV stamp 复用;3–30 keV 逐光子 LUT 采样(衰减长度表已补到 2 keV)
WP1.3 噪声 / 物理补齐 ❌ 只有 0.13 keV 像素噪声;逃逸峰、康普顿、LUT 增益残差、入射窗未做;门控 G1 未正式比对
WP2 halo / 有效区 ✅ 严格验证;边缘增强已实现。训练帧尺寸 ablation 未做(R = 3 vs 4 已比较,见下)
WP3 模型与损失 ✅ 12 keV(MOENCH040)模型;多色:5–30 keV [32,64,128,128](旧默认)→ 3–30 keV 四种规模 → 默认 3–30 keV [32,64,96,96]
WP4 模拟验证 ✅ G2 通过(README "Baseline comparison");G3:3–30 keV 效率/纯度/能量响应已成表(eval_summary.json、07_energy_response.py)
WP5.1/5.2 测量流水线 ✅ GPU 标定(两种 LUT 格式、column_masked 共模)、整帧推理(FP16 主干 + FP32 输出层)、成像
WP5.3 XRF 多色验证 ✅(部分) AgMo、CuCrCo:谱线位置、能量分辨、效率。能量分辨成像未做(XRF run 都是均匀照射)
WP5.4 单色复算 ✅(部分) DanMAX knife-edge 四个 flux 点完成;SOLEIL Siemens star 未做
WP5.5 fake rate ✅ 12 keV:0 / 1000 帧(101×101);多色默认模型:0 / 1000 整帧(400×400)
WP6 扩展 / WP7 产出 ❌

门控:G1 ❌(未正式比对);G2 ✅;G3 ✅;G4 ✅ —— knife-edge σ = 1.360 µm(MTF50 138 lp/mm,0.66 % 占有率),与已发表最好链路(CNN 1 光子,1.355 µm,138 lp/mm)在误差内相同,XRF 谱线全部分开且位置正确。

训练范围与模型规模(2026-09-19,Results/overnight_poly3to30keV/report):训练下限从 5 keV 降到 3 keV 后,数据上 Cr Kα 从 +33 meV、核心被压缩到 0.18 keV,变为 +10 meV、σ 0.245 keV(MC 0.256),不再需要 MC 修正。同一批 3–30 keV 数据上比较四种网络:[32,64,96,96] 与 [32,64,128,128] 各项一致,快 23 %,定为默认;[32,64,64,64] 快 82 %,但 10 % occupancy 下能量分辨差约 5 %,dark run 在 3 keV 以下有 15 个误报;R = 3 高 occupancy 下最差。

能量分辨对比(默认模型,XRF slit factor 10,线形核心 σ / 全线形 FWHM,keV,直接输出、无修正;经典 = 同一批标定帧上的 3×3 求和):

谱线 E [keV] GridBased σ (FWHM) 经典 3×3 σ (FWHM) FWHM 比 MC 核心 σ
Cr Kα 5.41 0.245 (0.58) 0.398 (0.94) 0.62 0.256
Co Kα 6.93 0.265 (0.62) 0.408 (0.96) 0.65 0.264
Cu Kα 8.04 0.305 (0.72) 0.441 (1.04) 0.69 0.267
弹性散射 12.0 0.311 (0.73) 0.470 (1.11) 0.66 0.279
Mo Kα 17.44 0.327 (0.82) 0.464 (1.09) 0.75 0.275
Mo Kβ 19.64 0.353 (0.83) 0.492 (1.16) 0.72 0.290
Ag Kα 22.10 0.378 (0.95) 0.489 (1.15) 0.82 0.301
  • D5 的预期得到证实:网络比固定 3×3 求和窄 18–38 %,核心 σ 在所有谱线上都低于 3×3 的噪声极限 0.38 keV。
  • Cr、Co 与 MC 一致(±5 %);Cu、弹性散射和 17–22 keV 的谱线比 MC 宽 12–26 %,多出一个 ∝ E 的项(~1 % E,像素增益残差一类)。这一项该放进 WP1.3。
  • 效率:孤立光子(≥ 5 keV)99.97 / 99.99 %(MC 99.96 %)。grid 比经典多找 7–9 % 的光子,主要是经典方法合并掉的 pile-up。能量守恒 0.997 / 0.996。
  • 谱线位置:grid 与表值差 ≤ 0.04 keV;经典 3×3 偏高 0.05–0.10 keV(Moench014 LUT 偏高 0.3–1 %)。"能量向中心偏"是尾部效应(均值),不是谱线偏移。
  • 推理:FP16 时输出层须保持 FP32,否则能量落在 FP16 网格上(7–15 meV 步长),50 eV 能谱出现梳状结构。

下一步:WP1.3 加入增益残差 / 逃逸峰 / 入射窗并做 G1;XRF flux 系列(slit factor 1–20,yaml 已配置);SOLEIL Siemens star;上限 30 keV 附近的边界效应(Sb Kβ、Compton)如需处理,要有 30 keV 以上的模拟。