Skip to content

0.32.2

Latest

Choose a tag to compare

@HaiwangYu HaiwangYu released this 03 Oct 04:11
· 2885 commits to master since this release

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_UNALIGNED and 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 last m_pad_nwires wires of each plane.
  • sigproc: r_erase_stale_contained, default true (68d3a99 + 9884670). ROI_refinement::CleanUpInductionROIs deleted loose ROIs without erasing their contained_rois key; a later V-plane ROI allocated at the freed U address inherited U's tight ROIs, making V-plane gauss/wiener heap-dependent. r_erase_stale_contained: false restores the legacy path. New doctest doctest_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.h and the plugin-private ROI_refinement.h, are not among them; FftwDFT.h is unchanged (only its .cxx).
  • The exported dynamic symbols of libWireCell{Util,Iface,Aux,Gen,SigProc}.so are identical in count to 0.32.1: 0 removed, 0 added. All 101 WireCell symbols that libWireCellLarsoft.so imports resolve against the 0.32.2 libraries, and none refer to OmnibusSigProc, ROI_refinement or FftwDFT.
  • OmnibusSigProc gains one bool member, 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.