Repository navigation
Patch release on the 0.32.x branch: 0.32.1 plus the four run-to-run determinism fixes from master, for the SBND production chain (sbndcode v10_14_02_x -> larwirecell v10_01_2x -> wirecell v0_32_1). No configuration change is needed; the new SP default governs every OmnibusSigProc user.
Fixes (cherry-picked with -x)
- aux/FftwDFT: fix run-to-run non-determinism in the FFTW plan cache (47d1667, in master since 0.35.0). The plan-cache key included a bit derived from heap buffer addresses, so different runs selected different cached codelets (SIMD vs scalar) and got ULP-level differences that propagated through NF and SP and flipped ROI decisions. All plans are now created with
FFTW_UNALIGNEDand the address bit is gone from the key. - sigproc/OmnibusSigProc: fix uninitialized FFT-padding rows in
decon_2D_looseROI(36489a2, in master since 0.35.0). Rows beyond the physical wires were never written and leaked heap garbage into the lastm_pad_nwireswires of each plane. - sigproc:
r_erase_stale_contained, defaulttrue(68d3a99 + 9884670).ROI_refinement::CleanUpInductionROIsdeleted loose ROIs without erasing theircontained_roiskey; a later V-plane ROI allocated at the freed U address inherited U's tight ROIs, making V-planegauss/wienerheap-dependent.r_erase_stale_contained: falserestores the legacy path. New doctestdoctest_roi_refinement_stale_keys.
Validation
SBND standard_detsim_sbnd.fcl (WCT sim + NF + SP + DNN-ROI, TbbFlow) on one Gen-2 g4 file, 9 events, 6 concurrent repeats per arm, per-event SHA-256 of the recob::Wire products:
| dnnsp | gauss | wiener | |
|---|---|---|---|
0.32.1 (cvmfs wirecell v0_32_1) |
3/9 events differ between runs | 6/9 differ (V plane only, up to 5 states) | 6/9 differ |
| 0.32.2 | 9/9 byte-identical | 9/9 byte-identical | 9/9 byte-identical |
0.32.2 output is not byte-equal to 0.32.1 (the FFTW plans changed): ~0.05 % of in-ROI samples move by >= 0.1, the same scale as 0.32.1's own run-to-run differences; per-event charge sums agree to 1e-4. Built in the SL7 container against the same UPS products as wirecell v0_32_1 -q e26:prof; wcdoctest-sigproc and wcdoctest-aux pass. Full record: HaiwangYu/wire-cell-toolkit-ai-helper#36 (and wcp-porting-validation sbnd/sbnd_xin/docs/127).
Not included: the shared gen::Random engine still has no lock, so a multi-threaded TbbFlow (several AddNoise/DepoTransform nodes drawing concurrently) remains timing-dependent on all planes; fixing it changes the noise realization and is a separate decision.
larwirecell: no rebuild needed (ABI unchanged)
Checked against cvmfs larwirecell v10_01_26_01 (the version sbndcode v10_14_02_03 uses):
- larwirecell includes WCT headers from Util, Iface, Aux, Gen and four SigProc headers (
Microboone.h,OmnibusNoiseFilter.h,OmniChannelNoiseDB.h,SimpleChannelNoiseDB.h). The headers this release changes,OmnibusSigProc.hand the plugin-privateROI_refinement.h, are not among them;FftwDFT.his unchanged (only its.cxx). - The exported dynamic symbols of
libWireCell{Util,Iface,Aux,Gen,SigProc}.soare identical in count to 0.32.1: 0 removed, 0 added. All 101 WireCell symbols thatlibWireCellLarsoft.soimports resolve against the 0.32.2 libraries, and none refer toOmnibusSigProc,ROI_refinementorFftwDFT. OmnibusSigProcgains oneboolmember, which only affects code that constructs or derives from it directly; larwirecell instantiates it through the WCT factory by name.- The validation above ran the unmodified cvmfs larwirecell against the 0.32.2 libraries (54 events, rc=0, byte-identical output).
So 0.32.2 is a drop-in for 0.32.1 at the binary level. For UPS distribution a new larwirecell version is still needed, because its table pins wirecell v0_32_1: a table bump, not a code change.
Full changelog: 0.32.1...0.32.2
Release notes drafted by Claude Fable 5.1 (claude-fable-5-1) from the validation record above; release made by HaiwangYu.