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>
This commit is contained in:
xie_x1andClaude Opus 5.5 committed 2026-10-20 07:36:49 +02:00
commit 0f9a3f496f
222 files changed
+53227

No files matched your search

+23
View File
@@ -0,0 +1,23 @@
# WP1.1 -- alpha(E, t) / beta(E, t) look-up table, MOENCH014 @150 V
#
# The depth grid, and therefore the drift-time grid, depends only on the sensor,
# so (energy, drift time) is a regular grid and needs no fitting in between.
sensor:
code: Moench014
hv: 150 # V
thickness_um: 320
depletion_voltage: 29.6 # V
temperature: 307.8 # K, = 273 + 20.0 + 14.8, as in McGenerator
energies:
first: 5 # keV
last: 30
step: 1
simulation:
folder: /home/xie_x1/MLED/McSimulation/BatchResults/{sensor}_{hv}V_{energy}keV
z_bins: 512
method: simu2 # 'simu1' (cpu) or 'simu2' (gpu)
output: data/charge_lut_Moench014_150V.npz
@@ -0,0 +1,23 @@
# WP1.1 -- alpha(E, t) / beta(E, t) look-up table, MOENCH014 @150 V, 3-30 keV
#
# The depth grid, and therefore the drift-time grid, depends only on the sensor,
# so (energy, drift time) is a regular grid and needs no fitting in between.
sensor:
code: Moench014
hv: 150 # V
thickness_um: 320
depletion_voltage: 29.6 # V
temperature: 307.8 # K, = 273 + 20.0 + 14.8, as in McGenerator
energies:
first: 3 # keV (2 keV exists but only 328/512 depth bins)
last: 30
step: 1
simulation:
folder: /home/xie_x1/MLED/McSimulation/BatchResults/{sensor}_{hv}V_{energy}keV
z_bins: 512
method: simu2 # 'simu1' (cpu) or 'simu2' (gpu)
output: data/charge_lut_Moench014_150V_3to30keV.npz
@@ -0,0 +1,32 @@
# WP1.1 -- alpha(E, t) / beta(E, t) look-up table, MOENCH040 @150 V, 2-20 keV
#
# Same construction as charge_lut_Moench014_3to30keV.yaml; the sensor is the
# 650 um MOENCH040 of the MaxIV knife edge (12 keV) and the SOLEIL Siemens star
# (15 keV). Training range 2-20 keV by the user's choice (2026-09-27).
#
# The copied simulation lacks the deepest depth bins at 6 / 7 / 8 keV
# (bins 266-511 / 475-511 / 492-511, next to the pixel side). At those energies
# 1.4e-5 / 2.9e-6 / 1.3e-4 of the photons convert there; the bins are filled from
# the 5 and 9 keV fits at the same depth (fill_missing: energy) and flagged in
# the table as `filled_from_energy`.
sensor:
code: Moench040
hv: 150 # V
thickness_um: 650
depletion_voltage: 34.7 # V
temperature: 307.8 # K, = 273 + 20.0 + 14.8, as in McGenerator
energies:
first: 2
last: 20
step: 1
simulation:
folder: /home/xie_x1/MLED/McSimulation/BatchResults/{sensor}_{hv}V_{energy}keV
z_bins: 512
method: simu2
fill_missing: energy
output: data/charge_lut_Moench040_150V_2to20keV.npz
+63
View File
@@ -0,0 +1,63 @@
# GridBased frame generation -- 12 keV, MOENCH040 @150 V (WP1.2, stamp-reuse variant)
#
# Frames are composed from the existing noiseless single-photon MC stamps
# (McGeneration output). Charge superposition is linear, so pile-up frames can
# be assembled by summing stamps; detector noise is applied once per frame.
meta:
energy: 12 # keV, beam energy of the stamp library
sensor: Moench040
hv: 150 # V
pixel_size_um: 25
sensor_thickness_um: 650
stamps:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/Simulation/Moench040
pattern: "12keV_Moench040_150V_{}.npz"
train_files: [0, 11] # inclusive index range -> 12 shards
val_files: [12, 13]
test_files: [14, 15]
frame:
size: 32 # training frame side (px). Fully-convolutional
# model => inference runs on full 400x400 frames.
margin: 4 # ring (px) over which photons are also thrown so
# that out-of-frame photons leak charge in
noise:
pixel_keV: 0.13 # per-pixel Gaussian, matches the iWoRiD study
common_mode_row_keV: 0.0 # WP1.3: switch on once measured
common_mode_col_keV: 0.0
edge_augmentation:
fraction: 0.08 # fraction of frames containing a sensor boundary
output:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/12keV_Moench040_150V
splits:
train:
frames_per_shard: 200_000 # 12 shards -> 2.4M frames, ~60M photons
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
val:
frames_per_shard: 80_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
test:
frames_per_shard: 80_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
# fixed-occupancy sets, for scanning performance vs flux
eval_scan:
# 20 % and 50 % are far outside the 0.2-10 % training range on purpose:
# they are where the cluster chains stop working and the grid chain has to
# be shown extrapolating. Appended, never reordered -- the per-point seed
# is base_seed + 9000 + index, so inserting a point would reshuffle the
# existing ones.
occupancies: [0.005, 0.01, 0.02, 0.05, 0.10, 0.20, 0.50]
frames_each: 8_000
stamp_files: [14, 15]
edge_fraction: 0.0
runtime:
n_workers: 16
seed: 20260830
@@ -0,0 +1,65 @@
# GridBased frame generation -- polychromatic 2-20 keV, MOENCH040 @150 V
#
# Same recipe as generate_frames_poly3to30keV_Moench014.yaml, for the 650 um
# MOENCH040 of the 12 keV MaxIV knife edge and the 15 keV SOLEIL Siemens star:
# per-photon energy (flat 2-20 keV), conversion depth from that energy's
# attenuation length, and the charge cloud of alpha(E, t) / beta(E, t).
# Pixel noise 0.13 keV = the 0.129 keV MOENCH040 delivers after the column
# common mode (README, measurement pipeline).
meta:
sensor: Moench040
hv: 150 # V
pixel_size_um: 25
sensor_thickness_um: 650
depletion_voltage: 34.7 # V
temperature: 307.8 # K
generation:
mode: lut
lut: data/charge_lut_Moench040_150V_2to20keV.npz
spectrum:
train: {mode: flat, min: 2.0, max: 20.0}
val: {mode: flat, min: 2.0, max: 20.0}
test: {mode: flat, min: 2.0, max: 20.0}
eval: {mode: flat, min: 2.0, max: 20.0}
frame:
size: 32
margin: 4
noise:
pixel_keV: 0.13
common_mode_row_keV: 0.0
common_mode_col_keV: 0.0
edge_augmentation:
fraction: 0.08
output:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly2to20keV_Moench040_150V
splits:
train:
n_shards: 12
frames_per_shard: 100_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
val:
n_shards: 2
frames_per_shard: 40_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
test:
n_shards: 2
frames_per_shard: 40_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
eval_scan:
occupancies: [0.005, 0.01, 0.02, 0.05, 0.10]
frames_each: 8_000
stamp_files: [0, 1]
edge_fraction: 0.0
runtime:
n_workers: 21
seed: 20260927
@@ -0,0 +1,70 @@
# GridBased frame generation -- polychromatic 3-30 keV, MOENCH014 @150 V (WP1.2)
#
# Same as generate_frames_poly_Moench014.yaml except for the energy range: the
# 5 keV edge biased and compressed Cr Ka (5.41 keV) in the XRF test, so the
# lower edge moves to 3 keV, >= 1 keV below the lowest line of interest.
#
# Every photon gets its own energy, its own conversion depth from that energy's
# attenuation length, and the charge cloud that the alpha(E, t) / beta(E, t)
# table gives for the resulting drift time. The single-energy stamp-reuse path
# is untouched and still lives in generate_frames_12keV.yaml.
meta:
sensor: Moench014
hv: 150 # V
pixel_size_um: 25
sensor_thickness_um: 320
depletion_voltage: 29.6 # V
temperature: 307.8 # K, = 273 + 20.0 + 14.8
generation:
mode: lut
lut: data/charge_lut_Moench014_150V_3to30keV.npz
spectrum:
# flat, so the regression carries no spectral prior of its own; the table
# covers 3-30 keV, and sampling to its edges means the outermost ~1 keV
# regresses with a one-sided prior
train: {mode: flat, min: 3.0, max: 30.0}
val: {mode: flat, min: 3.0, max: 30.0}
test: {mode: flat, min: 3.0, max: 30.0}
eval: {mode: flat, min: 3.0, max: 30.0}
frame:
size: 32
margin: 4
noise:
pixel_keV: 0.13
common_mode_row_keV: 0.0
common_mode_col_keV: 0.0
edge_augmentation:
fraction: 0.08
output:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly3to30keV_Moench014_150V
splits:
train:
n_shards: 12
frames_per_shard: 100_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
val:
n_shards: 2
frames_per_shard: 40_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
test:
n_shards: 2
frames_per_shard: 40_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
eval_scan:
occupancies: [0.005, 0.01, 0.02, 0.05, 0.10]
frames_each: 8_000
stamp_files: [0, 1]
edge_fraction: 0.0
runtime:
n_workers: 14
seed: 20260918
@@ -0,0 +1,66 @@
# GridBased frame generation -- polychromatic 5-30 keV, MOENCH014 @150 V (WP1.2)
#
# Every photon gets its own energy, its own conversion depth from that energy's
# attenuation length, and the charge cloud that the alpha(E, t) / beta(E, t)
# table gives for the resulting drift time. The single-energy stamp-reuse path
# is untouched and still lives in generate_frames_12keV.yaml.
meta:
sensor: Moench014
hv: 150 # V
pixel_size_um: 25
sensor_thickness_um: 320
depletion_voltage: 29.6 # V
temperature: 307.8 # K, = 273 + 20.0 + 14.8
generation:
mode: lut
lut: data/charge_lut_Moench014_150V.npz
spectrum:
# flat, so the regression carries no spectral prior of its own; the table
# covers 5-30 keV, and sampling to its edges means the outermost ~1 keV
# regresses with a one-sided prior
train: {mode: flat, min: 5.0, max: 30.0}
val: {mode: flat, min: 5.0, max: 30.0}
test: {mode: flat, min: 5.0, max: 30.0}
eval: {mode: flat, min: 5.0, max: 30.0}
frame:
size: 32
margin: 4
noise:
pixel_keV: 0.13
common_mode_row_keV: 0.0
common_mode_col_keV: 0.0
edge_augmentation:
fraction: 0.08
output:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly5to30keV_Moench014_150V
splits:
train:
n_shards: 12
frames_per_shard: 100_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
val:
n_shards: 2
frames_per_shard: 40_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
test:
n_shards: 2
frames_per_shard: 40_000
occupancy: {mode: loguniform, min: 0.002, max: 0.10}
eval_scan:
occupancies: [0.005, 0.01, 0.02, 0.05, 0.10]
frames_each: 8_000
stamp_files: [0, 1]
edge_fraction: 0.0
runtime:
n_workers: 14
seed: 20260901
+97
View File
@@ -0,0 +1,97 @@
# GridBased inference on measured data -- 12 keV, MOENCH040 @150 V (WP5.1/5.2)
#
# Raw ADU -> pedestal -> common mode -> 3D-LUT (all on GPU) -> GridNet -> photon
# list -> sub-pixel binned image. No cluster finder, no calibrated frames on
# disk. Select a run with --run <name>.
detector:
n_x: 101
n_y: 101
corner: [70, 170] # StCorner: ROI position inside the 400x400 chip,
# needed to crop the calibration LUT
pixel_size_um: 25.0
header_words: 56
calibration:
file: /home/xie_x1/MLED/data-process/utils/BacksidePulsing_Calibration/Moench040/Moench040_AduToKevMapping_g4_50us_150V_250423.npy
common_mode: column # MOENCH is column-parallel: 6.7 ADU RMS column
# offset. Correcting it takes the per-pixel noise
# from 0.140 to 0.129 keV -- i.e. onto the 0.13 keV
# the model was trained with.
pedestal_source: pedestal_run # 'pedestal_run' or 'per_file' (self-median)
pedestal_frames: 2000
model:
# All eight measurement runs are reconstructed with this one checkpoint so
# that the flux points, and the edge/flat pair within each point, are
# comparable. Override per run with --checkpoint only for tests.
checkpoint: /home/xie_x1/MLXID/GridBased/Results/260831_12keV_Moench040_01/Models/best.pth
threshold: 0.3
merge_distance: 0.1
inference:
n_frames: null # null = the whole run
batch_size: 512
binning_factor: 10 # 25 um / 10 = 2.5 um bins, as in the cluster-based analysis
save_photons: false # 1.9e8 photons for the full run -> ~3 GB
self_flattening: true # Rosenblatt remap of the sub-pixel phase (risk R1)
energy_bins: [0.0, 40.0, 400]
output_folder: /mnt/sls_det_storage/moench_data/MLXID/InferenceResults/GridBased
runs:
Edge_3filters_pos0_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_data_d0_f{}_0.raw
signal_files: [0, 139]
Flat_3filters_pos0_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_3filters_pos0_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_3filters_pos0_data_d0_f{}_0.raw
signal_files: [0, 139]
Edge_0filters_12keV: # 9.42 % occupancy in the illuminated area
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_0filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_0filters_data_d0_f{}_0.raw
signal_files: [0, 34]
Flat_0filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_0filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_0filters_data_d0_f{}_0.raw
signal_files: [0, 34]
Edge_1filters_12keV: # 3.90 % occupancy in the illuminated area
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_1filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_1filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Flat_1filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_1filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_1filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Edge_2filters_12keV: # 1.58 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_2filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_2filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Flat_2filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_2filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_2filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Pedestal_1filters_12keV: # dark run: the model must find (almost) nothing
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_1filters_pedestal_d0_f0_0.raw # a different run's pedestal,
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_1filters_pedestal_d0_f{}_0.raw # so the test is independent
signal_files: [0, 0]
Pedestal_2filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_2filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_2filters_pedestal_d0_f{}_0.raw
signal_files: [0, 0]
# dark run: the model must find (almost) nothing here -- the hardest fake-rate test
Pedestal_3filters_pos0_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_pedestal_d0_f{}_0.raw
signal_files: [0, 0]
@@ -0,0 +1,210 @@
# GridBased inference on measured data -- XRF, MOENCH014 @150 V, poly 3-30 keV model
#
# 2603 MaxIV beamtime, process/xrf. Every run is a flood field on the full
# 400x400 chip (fluorescence is isotropic, no imaging optics), so these runs
# test the energy axis and the flux behaviour, not spatial resolution:
# * line positions / widths against tabulated energies (per run, `lines`)
# * Kalpha pairs a few keV apart must come out resolved
# * line positions and pile-up versus flux (factor 10 -> 1)
# * sub-pixel flatness of a uniform illumination (self_flattening)
# * fake rate on a dark run
#
# `factor` is the slit factor of the acquisition script: gap = 1.1 mm / factor,
# so factor 1 is the highest flux. Each data file holds 100 000 frames, each
# pedestal file 1000 frames taken ~3 min before its data run.
#
# Survey of all 58 runs (2000 frames each, 3x3-sum local maxima; see the
# comments per run): pixel noise after column common mode 0.126 keV (0.144 on
# AgCd), matching the 0.13 keV of the training frames; occupancy 0.6-7 %, all
# inside the 0.2-10 % training range. Beam was 12 keV for the Cu/Cr/Co and
# pigment runs (elastic line at 12.0 keV); for the Ag runs it was above the Sb
# K edge (30.5 keV), and their Compton/elastic bump at ~28.5-29 keV sits at the
# top of the training range.
#
# `lines` are Kalpha1/Kalpha2 centroids (2:1) and Kbeta1 in keV, for the
# downstream line fit; 05_infer_measurement.py ignores them.
#
# The Moench014 LUT has 1640 bins, the abs()/sign() convention of
# UsefulFuncs.convertAduFrameToEnergyFrame; GpuCalibrator handles it.
detector:
n_x: 400
n_y: 400
corner: [0, 0] # full chip, the LUT is used uncropped
pixel_size_um: 25.0
header_words: 56
calibration:
file: /home/xie_x1/MLED/data-process/utils/BacksidePulsing_Calibration/Moench014/Moench014_AduToKevMapping_g4_50us_250305.npy
common_mode: column_masked # median over the pixels without charge. The plain
# column median is pulled up by the photons: -4.0 /
# -7.2 meV per pixel on AgMo / CuCrCo factor 10,
# i.e. -36 / -65 meV on a 3x3 sum, growing with flux
pedestal_source: pedestal_run
pedestal_frames: 1000 # all a pedestal file has
model:
# 3-30 keV, [32, 64, 96, 96], chosen 2026-09-19 from the four sizes in
# Results/overnight_poly3to30keV/report. The previous default, 5-30 keV
# [32, 64, 128, 128], is Results/260901_poly5to30keV_Moench014_00; its XRF
# reconstructions carry the tag _poly5to30.
checkpoint: /home/xie_x1/MLXID/GridBased/Results/260919_poly3to30keV_Moench014_c96_00/Models/best.pth
threshold: 0.3
merge_distance: 0.1
inference:
n_frames: null # null = the whole run
precision: fp16 # FP16 autocast + channels-last; offsets and energy of
# the candidate cells recomputed in FP32 (an FP16 head
# rounds E to 7-15 meV steps: a comb in 50 eV spectra).
# Photon list = FP32 within ~20 nm / ~4 meV.
batch_size: 32 # 2.6 GB peak for the model in FP16 (7.9 GB in FP32);
# larger batches are not faster
binning_factor: 10
save_photons: false # ~1.8e8 photons per run at factor 10 -> ~3 GB
self_flattening: true # the 'before' phase histogram of a flood field is
# the direct R1 measurement
energy_bins: [0.0, 40.0, 800] # 0.05 keV, for fitting line positions
output_folder: /mnt/sls_det_storage/moench_data/MLXID/InferenceResults/GridBased/XRF_2603MaxIV
runs:
# --- two elements, Kalpha lines well separated --------------------------
# Mo Ka 17.44 / Ag Ka 22.11: 4.7 keV apart, mid-range, with both Kbeta lines
# resolved as well -- the cleanest multi-line run. Full flux series.
AgMo_1_factor_10: # occupancy 0.75 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Mo_Ka: 17.44, Mo_Kb: 19.61, Ag_Ka: 22.11, Ag_Kb: 24.94}
AgMo_1_factor_4: # 1.4 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_4_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_4_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Mo_Ka: 17.44, Mo_Kb: 19.61, Ag_Ka: 22.11, Ag_Kb: 24.94}
AgMo_1_factor_2: # 2.5 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_2_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_2_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Mo_Ka: 17.44, Mo_Kb: 19.61, Ag_Ka: 22.11, Ag_Kb: 24.94}
# with the plain column median the 3x3-sum centroids here sat 0.06-0.07 keV
# below factor 10 (median biased by the hits); column_masked removes that
AgMo_1_factor_1: # 4.0 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_1_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgMo_1_factor_1_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Mo_Ka: 17.44, Mo_Kb: 19.61, Ag_Ka: 22.11, Ag_Kb: 24.94}
# Ag Ka 22.11 / Sb Ka 26.28: 4.2 keV apart. Sb Kb 29.73 merges with the
# scatter bump at the top edge of the training range.
AgSb_1_factor_10: # 0.70 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgSb_1_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgSb_1_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Ag_Ka: 22.11, Ag_Kb: 24.94, Sb_Ka: 26.28, Sb_Kb: 29.73}
# Cr Ka 5.41 / Cu Ka 8.04: 2.6 keV apart, at the low end. Cr Ka was 0.4 keV
# above the training edge of the 5-30 keV model (+33 meV, width compressed);
# the 3-30 keV model puts it 2.4 keV inside its range. CuCr_1..4 are the same pair
# at different Cr:Cu ratios (3x3-sum peak heights 17 : 4.2 : 1.2 : 0.43).
CuCr_1_factor_10: # 1.0 %, Cr-dominated
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_1_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_1_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
CuCr_2_factor_10: # 1.0 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_2_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_2_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
CuCr_3_factor_10: # 1.2 %, Cr and Cu about equal
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_3_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_3_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
CuCr_4_factor_10: # 1.2 %, Cu-dominated
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_4_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCr_4_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
# --- three elements ------------------------------------------------------
# Cr Ka 5.41 / Co Ka 6.93 / Cu Ka 8.04: 1.5 and 1.1 keV apart, and Co Kb 7.65
# sits on the low flank of Cu Ka -- in the 3x3 sums Cu is only a shoulder.
# Pg17 / Pg28 / Cu below are the single-line references for it.
# Full flux series.
CuCrCo_1_factor_10: # 1.2 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Co_Ka: 6.93, Co_Kb: 7.65, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
CuCrCo_1_factor_4: # 2.2 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_4_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_4_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Co_Ka: 6.93, Co_Kb: 7.65, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
CuCrCo_1_factor_2: # 3.9 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_2_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_2_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Co_Ka: 6.93, Co_Kb: 7.65, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
CuCrCo_1_factor_1: # 5.9 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_1_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_1_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, Co_Ka: 6.93, Co_Kb: 7.65, Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
# --- single-line references ---------------------------------------------
# One fluorescence line plus the 12 keV elastic line: energy scale and
# resolution at each of the CuCrCo energies without overlaps. In the 3x3
# sums each also shows a pile-up peak at twice its line (10.8 / 13.8 /
# 15.9 keV); a photon-separating reconstruction should shrink it.
Pg17_factor_10: # 1.6 %, pigment green 17 (Cr2O3)
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/Pg17_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/Pg17_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cr_Ka: 5.41, Cr_Kb: 5.95, elastic: 12.0}
Pg28_factor_10: # 1.1 %, pigment green 28 (cobalt titanate; Ti Ka
# 4.51 is below the training range)
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/Pg28_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/Pg28_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Co_Ka: 6.93, Co_Kb: 7.65, elastic: 12.0}
Cu_factor_10: # 1.5 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/Cu_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/Cu_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Cu_Ka: 8.04, Cu_Kb: 8.91, elastic: 12.0}
# --- resolution limit ------------------------------------------------------
# Ag Ka 22.11 / Cd Ka 23.11: only 1.0 keV apart, merged into one peak in the
# 3x3 sums. Highest noise of the set (0.144 keV).
AgCd_1_factor_10: # 1.4 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgCd_1_factor_10_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/AgCd_1_factor_10_data_d0_f{}_0.raw
signal_files: [0, 0]
lines: {Ag_Ka: 22.11, Cd_Ka: 23.11, Ag_Kb: 24.94, Cd_Kb: 26.10}
# --- dark run ----------------------------------------------------------------
# the shutter is closed during pedestal runs: the model must find (almost)
# nothing. Pedestal from the run taken 3 min earlier, so the test is
# independent of the frames it is applied to.
Pedestal_CuCrCo_1:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_4_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/xrf/CuCrCo_1_factor_10_pedestal_d0_f{}_0.raw
signal_files: [0, 0]
@@ -0,0 +1,96 @@
# GridBased inference on measured data -- 12 keV knife edge, MOENCH040 @150 V,
# with the polychromatic 2-20 keV model (overnight 2026-09-27/28)
#
# Identical to infer_measurement_12keV.yaml -- same runs, same ROI readout, same
# pedestal, same column common mode, same self-flattening -- so that the only
# difference from the published 12 keV GridBased images is the model. Only the
# precision differs: FP16 with the energy head in FP32 (predict_fp16), as for
# every poly model. The checkpoint is passed with --checkpoint by
# scripts/overnight_poly2to20keV_Moench040_partB.sh and the outputs carry the tag
# _poly2to20, next to the 12 keV model's.
detector:
n_x: 101
n_y: 101
corner: [70, 170] # StCorner: ROI position inside the 400x400 chip
pixel_size_um: 25.0
header_words: 56
calibration:
file: /home/xie_x1/MLED/data-process/utils/BacksidePulsing_Calibration/Moench040/Moench040_AduToKevMapping_g4_50us_150V_250423.npy
common_mode: column # as for the 12 keV model's runs
pedestal_source: pedestal_run
pedestal_frames: 2000
model:
checkpoint: null # given on the command line (--checkpoint)
threshold: 0.3
merge_distance: 0.1
inference:
n_frames: null # null = the whole run
precision: fp16 # FP16 backbone, FP32 energy/offsets of the candidates
batch_size: 512
binning_factor: 10 # 2.5 um bins
save_photons: false
self_flattening: true
energy_bins: [0.0, 30.0, 600] # 50 eV
output_folder: /mnt/sls_det_storage/moench_data/MLXID/InferenceResults/GridBased
runs:
Edge_3filters_pos0_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_data_d0_f{}_0.raw
signal_files: [0, 139]
Flat_3filters_pos0_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_3filters_pos0_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_3filters_pos0_data_d0_f{}_0.raw
signal_files: [0, 139]
Edge_0filters_12keV: # 9.42 % occupancy in the illuminated area
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_0filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_0filters_data_d0_f{}_0.raw
signal_files: [0, 34]
Flat_0filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_0filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_0filters_data_d0_f{}_0.raw
signal_files: [0, 34]
Edge_1filters_12keV: # 3.90 % occupancy in the illuminated area
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_1filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_1filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Flat_1filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_1filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_1filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Edge_2filters_12keV: # 1.58 %
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_2filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_2filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Flat_2filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_2filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_2filters_data_d0_f{}_0.raw
signal_files: [0, 69]
Pedestal_1filters_12keV: # dark run: the model must find (almost) nothing
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_1filters_pedestal_d0_f0_0.raw # a different run's pedestal,
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_1filters_pedestal_d0_f{}_0.raw # so the test is independent
signal_files: [0, 0]
Pedestal_2filters_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/flat_2filters_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_2filters_pedestal_d0_f{}_0.raw
signal_files: [0, 0]
# dark run: the model must find (almost) nothing here -- the hardest fake-rate test
Pedestal_3filters_pos0_12keV:
pedestal: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2603_MaxIVBeamtime/2026032408/process/mtf/edge_3filters_pos0_pedestal_d0_f{}_0.raw
signal_files: [0, 0]
@@ -0,0 +1,80 @@
# GridBased inference on measured data -- 15 keV Siemens star, MOENCH040 @150 V,
# SOLEIL 2504 beamtime, with the polychromatic 2-20 keV model (2026-09-27/28)
#
# The star was recorded on the full 400x400 chip, 2000 files x 10 000 frames.
# DataProcess/Configs.py analyses two regions of it:
# SiemenStarLowerLeft x 130-240, y 110-220
# SiemenStarLowerRight x 235-345, y 110-220
# They share the same rows, so one crop covers both, extended by the halo R = 4
# on every side: x 126-349, y 106-224. Its valid region is exactly x 130-345,
# y 110-220; the notebook cuts the two regions out of it. The frames of each
# file are read as that 118-row band only (RawFrameReader crop, ~3x faster than
# whole frames on the NFS store), so both regions come out of one pass.
#
# The run is split into four parts of 500 files each so that a partial night
# still leaves complete images; the notebook sums the parts it finds.
detector:
n_x: 400
n_y: 400
corner: [0, 0] # full-chip frames on disk
crop: [126, 349, 106, 224] # x0, x1, y0, y1 of the reconstructed window
pixel_size_um: 25.0
header_words: 56
calibration:
file: /home/xie_x1/MLED/data-process/utils/BacksidePulsing_Calibration/Moench040/Moench040_AduToKevMapping_g4_50us_150V_250423.npy
common_mode: column_masked # median over the uncharged pixels of the 118 rows. The
# plain median (the 2026-09-27 run, tag _poly2to20) is pulled
# up by the photons at ~5 % occupancy: 15 keV line at 14.47 keV
pedestal_source: pedestal_run
pedestal_frames: 2000 # of the 10 000 in the pedestal file
model:
checkpoint: null # given on the command line (--checkpoint)
threshold: 0.3
merge_distance: 0.1
inference:
n_frames: null
precision: fp16
batch_size: 512
binning_factor: 10 # 2.5 um bins
save_photons: false
self_flattening: streaming # ~820 photons per frame here: the in-memory
# remap would need ~100 GB per 5 M frames, so the
# Rosenblatt table is built from the first 1e8
# photons and every photon remapped as it comes
# (src/flattening.py; identical to the in-memory
# version when built from the same photons)
flattening_lut_photons: 300000000 # buffered for the tables, ~2.4 GB
# one table per local-occupancy class (photons / px / frame over the 9x9
# receptive field): the sub-pixel phase depends on the flux, and one table for
# the whole crop left a 25 um grid in the dim star of LowerLeft (4.4 % sub-pixel
# rms at ~0.7 % occupancy -> 0.4 % with the classes; 600 k-frame test, 09-28)
flattening_occupancy_edges: [0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07]
energy_bins: [0.0, 30.0, 600] # 50 eV
output_folder: /mnt/sls_det_storage/moench_data/MLXID/InferenceResults/GridBased
runs:
SiemensStar_15keV_part0:
pedestal: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_signal_d0_f{}_0.raw
signal_files: [0, 499]
SiemensStar_15keV_part1:
pedestal: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_signal_d0_f{}_0.raw
signal_files: [500, 999]
SiemensStar_15keV_part2:
pedestal: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_signal_d0_f{}_0.raw
signal_files: [1000, 1499]
SiemensStar_15keV_part3:
pedestal: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_signal_d0_f{}_0.raw
signal_files: [1500, 1999]
# smoke test: one file, 10 000 frames
SiemensStar_15keV_smoke:
pedestal: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_pedestal_d0_f0_0.raw
signal_pattern: /mnt/sls_det_storage/moench_data/2504_SoleilBeamtime/Moench040_g4_SimonStars_150V_50us/15keV_signal_d0_f{}_0.raw
signal_files: [1000, 1000]
+49
View File
@@ -0,0 +1,49 @@
# GridBased training -- 12 keV, MOENCH040 @150 V (WP3, monochromatic gate G2)
experiment:
name: "12keV_Moench040"
results_dir: "Results"
data:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/12keV_Moench040_150V
train_shards: [0, 11] # inclusive
val_shards: [0, 1]
max_train_frames: null # null = all
max_val_frames: 8000
input_scale: 12.0 # keV; frames are divided by this
energy_scale: 12.0 # keV; energy target is E / energy_scale
augment: true # 8-fold D4, a true symmetry of the problem
batch_size_train: 256
batch_size_val: 512
num_workers: 8
model:
channels: [32, 64, 64, 64] # 4 x conv3x3 -> receptive-field radius R = 4 px
predict_energy: true
norm: "none" # see models.py: 'group' breaks strict locality
prior_prob: 0.01 # focal-loss bias init
loss:
w_obj: 1.0
w_off: 1.0
w_ene: 0.1
focal_alpha: 0.25
focal_gamma: 2.0
smooth_l1_beta_offset: 0.01 # px = 0.25 um, as for the cluster-based models
smooth_l1_beta_energy: 0.02
training:
epochs: 150
lr: 1.0e-3
weight_decay: 0.0
scheduler_factor: 0.5
scheduler_patience: 4
amp: true
seed: 0
checkpoint_epochs: [25, 50, 75, 100, 125, 150]
eval:
threshold: 0.3 # from the ROC of run 260830_00: eff plateaus below 0.3
merge_distance: 0.1 # px; position-space duplicate suppression
match_radius: 1.0 # px; 25 um
pixel_size_um: 25.0
@@ -0,0 +1,59 @@
# GridBased training -- polychromatic 2-20 keV, MOENCH040 @150 V, [32, 64, 96, 96]
#
# The default poly architecture (Results/260919_poly3to30keV_Moench014_c96_00)
# retrained for the 650 um MOENCH040 on flat 2-20 keV frames, to be tested on
# the 12 keV MaxIV knife edge and the 15 keV SOLEIL Siemens star. Everything
# but the data and the number of epochs is identical to the MOENCH014 c96.
#
# Same architecture and the same losses as the 12 keV configuration; what
# changes is that the energy head now carries information, so it gets a real
# weight and a scale that is not tied to a beam energy.
experiment:
name: "poly2to20keV_Moench040_c96"
results_dir: "Results"
data:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly2to20keV_Moench040_150V
train_shards: [0, 11]
val_shards: [0, 1]
max_train_frames: null
max_val_frames: 8000
input_scale: 15.0 # keV, mid-range; frames are divided by this
energy_scale: 15.0 # keV, the energy target is E / energy_scale
augment: true
batch_size_train: 256
batch_size_val: 512
num_workers: 8
model:
channels: [32, 64, 96, 96] # last two layers 96 wide: -35 % MAC, +23 % speed (FP16)
predict_energy: true
norm: "none"
prior_prob: 0.01
loss:
w_obj: 1.0
w_off: 1.0
w_ene: 1.0 # 0.1 at a single energy, where the head learned a
# constant; here it carries the spectrum
focal_alpha: 0.25
focal_gamma: 2.0
smooth_l1_beta_offset: 0.01
smooth_l1_beta_energy: 0.03 # ~ the 0.39 keV noise floor of a 3x3 sum, / 15 keV
training:
epochs: 200 # the 3-30 keV c96 run was within 0.004 % of its best val loss at 200
lr: 1.0e-3
weight_decay: 0.0
scheduler_factor: 0.5
scheduler_patience: 6
amp: true
seed: 0
checkpoint_epochs: [50, 100, 150, 200]
eval:
threshold: 0.3
merge_distance: 0.1
match_radius: 1.0
pixel_size_um: 25.0
@@ -0,0 +1,58 @@
# GridBased training -- polychromatic 3-30 keV, MOENCH014 @150 V, variant c128
#
# One of four models trained on the same 3-30 keV frames to compare network
# sizes (Results/overnight_poly3to30keV). Everything but model.channels is
# identical to train_grid_poly_Moench014.yaml.
#
# Same architecture and the same losses as the 12 keV configuration; what
# changes is that the energy head now carries information, so it gets a real
# weight and a scale that is not tied to a beam energy.
experiment:
name: "poly3to30keV_Moench014_c128"
results_dir: "Results"
data:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly3to30keV_Moench014_150V
train_shards: [0, 11]
val_shards: [0, 1]
max_train_frames: null
max_val_frames: 8000
input_scale: 15.0 # keV, mid-range; frames are divided by this
energy_scale: 15.0 # keV, the energy target is E / energy_scale
augment: true
batch_size_train: 256
batch_size_val: 512
num_workers: 8
model:
channels: [32, 64, 128, 128] # reference width, as the 5-30 keV model
predict_energy: true
norm: "none"
prior_prob: 0.01
loss:
w_obj: 1.0
w_off: 1.0
w_ene: 1.0 # 0.1 at a single energy, where the head learned a
# constant; here it carries the spectrum
focal_alpha: 0.25
focal_gamma: 2.0
smooth_l1_beta_offset: 0.01
smooth_l1_beta_energy: 0.03 # ~ the 0.39 keV noise floor of a 3x3 sum, / 15 keV
training:
epochs: 300
lr: 1.0e-3
weight_decay: 0.0
scheduler_factor: 0.5
scheduler_patience: 6
amp: true
seed: 0
checkpoint_epochs: [50, 100, 150, 200, 250, 300]
eval:
threshold: 0.3
merge_distance: 0.1
match_radius: 1.0
pixel_size_um: 25.0
@@ -0,0 +1,58 @@
# GridBased training -- polychromatic 3-30 keV, MOENCH014 @150 V, variant c64
#
# One of four models trained on the same 3-30 keV frames to compare network
# sizes (Results/overnight_poly3to30keV). Everything but model.channels is
# identical to train_grid_poly_Moench014.yaml.
#
# Same architecture and the same losses as the 12 keV configuration; what
# changes is that the energy head now carries information, so it gets a real
# weight and a scale that is not tied to a beam energy.
experiment:
name: "poly3to30keV_Moench014_c64"
results_dir: "Results"
data:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly3to30keV_Moench014_150V
train_shards: [0, 11]
val_shards: [0, 1]
max_train_frames: null
max_val_frames: 8000
input_scale: 15.0 # keV, mid-range; frames are divided by this
energy_scale: 15.0 # keV, the energy target is E / energy_scale
augment: true
batch_size_train: 256
batch_size_val: 512
num_workers: 8
model:
channels: [32, 64, 64, 64] # the 12 keV model size: -61 % MAC, +83 % speed (FP16)
predict_energy: true
norm: "none"
prior_prob: 0.01
loss:
w_obj: 1.0
w_off: 1.0
w_ene: 1.0 # 0.1 at a single energy, where the head learned a
# constant; here it carries the spectrum
focal_alpha: 0.25
focal_gamma: 2.0
smooth_l1_beta_offset: 0.01
smooth_l1_beta_energy: 0.03 # ~ the 0.39 keV noise floor of a 3x3 sum, / 15 keV
training:
epochs: 300
lr: 1.0e-3
weight_decay: 0.0
scheduler_factor: 0.5
scheduler_patience: 6
amp: true
seed: 0
checkpoint_epochs: [50, 100, 150, 200, 250, 300]
eval:
threshold: 0.3
merge_distance: 0.1
match_radius: 1.0
pixel_size_um: 25.0
@@ -0,0 +1,58 @@
# GridBased training -- polychromatic 3-30 keV, MOENCH014 @150 V, variant c96
#
# One of four models trained on the same 3-30 keV frames to compare network
# sizes (Results/overnight_poly3to30keV). Everything but model.channels is
# identical to train_grid_poly_Moench014.yaml.
#
# Same architecture and the same losses as the 12 keV configuration; what
# changes is that the energy head now carries information, so it gets a real
# weight and a scale that is not tied to a beam energy.
experiment:
name: "poly3to30keV_Moench014_c96"
results_dir: "Results"
data:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly3to30keV_Moench014_150V
train_shards: [0, 11]
val_shards: [0, 1]
max_train_frames: null
max_val_frames: 8000
input_scale: 15.0 # keV, mid-range; frames are divided by this
energy_scale: 15.0 # keV, the energy target is E / energy_scale
augment: true
batch_size_train: 256
batch_size_val: 512
num_workers: 8
model:
channels: [32, 64, 96, 96] # last two layers 96 wide: -35 % MAC, +23 % speed (FP16)
predict_energy: true
norm: "none"
prior_prob: 0.01
loss:
w_obj: 1.0
w_off: 1.0
w_ene: 1.0 # 0.1 at a single energy, where the head learned a
# constant; here it carries the spectrum
focal_alpha: 0.25
focal_gamma: 2.0
smooth_l1_beta_offset: 0.01
smooth_l1_beta_energy: 0.03 # ~ the 0.39 keV noise floor of a 3x3 sum, / 15 keV
training:
epochs: 300
lr: 1.0e-3
weight_decay: 0.0
scheduler_factor: 0.5
scheduler_patience: 6
amp: true
seed: 0
checkpoint_epochs: [50, 100, 150, 200, 250, 300]
eval:
threshold: 0.3
merge_distance: 0.1
match_radius: 1.0
pixel_size_um: 25.0
@@ -0,0 +1,58 @@
# GridBased training -- polychromatic 3-30 keV, MOENCH014 @150 V, variant r3
#
# One of four models trained on the same 3-30 keV frames to compare network
# sizes (Results/overnight_poly3to30keV). Everything but model.channels is
# identical to train_grid_poly_Moench014.yaml.
#
# Same architecture and the same losses as the 12 keV configuration; what
# changes is that the energy head now carries information, so it gets a real
# weight and a scale that is not tied to a beam energy.
experiment:
name: "poly3to30keV_Moench014_r3"
results_dir: "Results"
data:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly3to30keV_Moench014_150V
train_shards: [0, 11]
val_shards: [0, 1]
max_train_frames: null
max_val_frames: 8000
input_scale: 15.0 # keV, mid-range; frames are divided by this
energy_scale: 15.0 # keV, the energy target is E / energy_scale
augment: true
batch_size_train: 256
batch_size_val: 512
num_workers: 8
model:
channels: [32, 64, 128] # 3 layers, R = 3 px (7x7 field): -61 % MAC, +78 % speed (FP16)
predict_energy: true
norm: "none"
prior_prob: 0.01
loss:
w_obj: 1.0
w_off: 1.0
w_ene: 1.0 # 0.1 at a single energy, where the head learned a
# constant; here it carries the spectrum
focal_alpha: 0.25
focal_gamma: 2.0
smooth_l1_beta_offset: 0.01
smooth_l1_beta_energy: 0.03 # ~ the 0.39 keV noise floor of a 3x3 sum, / 15 keV
training:
epochs: 300
lr: 1.0e-3
weight_decay: 0.0
scheduler_factor: 0.5
scheduler_patience: 6
amp: true
seed: 0
checkpoint_epochs: [50, 100, 150, 200, 250, 300]
eval:
threshold: 0.3
merge_distance: 0.1
match_radius: 1.0
pixel_size_um: 25.0
+56
View File
@@ -0,0 +1,56 @@
# GridBased training -- polychromatic 5-30 keV, MOENCH014 @150 V
#
# Same architecture and the same losses as the 12 keV configuration; what
# changes is that the energy head now carries information, so it gets a real
# weight and a scale that is not tied to a beam energy.
experiment:
name: "poly5to30keV_Moench014"
results_dir: "Results"
data:
folder: /mnt/sls_det_storage/moench_data/MLXID/Samples/GridBased/poly5to30keV_Moench014_150V
train_shards: [0, 11]
val_shards: [0, 1]
max_train_frames: null
max_val_frames: 8000
input_scale: 15.0 # keV, mid-range; frames are divided by this
energy_scale: 15.0 # keV, the energy target is E / energy_scale
augment: true
batch_size_train: 256
batch_size_val: 512
num_workers: 8
model:
channels: [32, 64, 128, 128] # still 4 x conv3x3, so R = 4 px; wider, because
# the cloud size now has to be disentangled from
# the energy rather than mapping straight to depth
predict_energy: true
norm: "none"
prior_prob: 0.01
loss:
w_obj: 1.0
w_off: 1.0
w_ene: 1.0 # 0.1 at a single energy, where the head learned a
# constant; here it carries the spectrum
focal_alpha: 0.25
focal_gamma: 2.0
smooth_l1_beta_offset: 0.01
smooth_l1_beta_energy: 0.03 # ~ the 0.39 keV noise floor of a 3x3 sum, / 15 keV
training:
epochs: 300
lr: 1.0e-3
weight_decay: 0.0
scheduler_factor: 0.5
scheduler_patience: 6
amp: true
seed: 0
checkpoint_epochs: [50, 100, 150, 200, 250, 300]
eval:
threshold: 0.3
merge_distance: 0.1
match_radius: 1.0
pixel_size_um: 25.0