We have no code in aare to deal with RawFiles that have missing packets if they are not padded to full size or frames with packet loss dropped. Added: - check that we don't try to read files that are not supported - python bindings for frame discard policy at least we get the check in: closes #171 --------- Co-authored-by: AliceMazzoleni99 <alice.mazzoleni@psi.ch>
13 KiB
Release notes
Next
New Features:
- Added the Python
FrameDiscardPolicyenum withNoDiscard,Discard, andDiscardPartial, enabling access toRawMasterFile.frame_discard_policy. - Added the Python
Pedestalfactory withdtypeselection, matchingFastPedestaland defaulting tofloat64output. - Added
FastPedestalin C++ and Python for per-pixel running mean and population standard deviation. It supports exponentially - Added
ClusterFile.frames()andClusterFile.chunks()in C++ and Python for iteration from the current file position. Frames preserve empty frames and frame numbers; chunks support an optional positive size override. Python's default file iteration continues to yield chunks. - Added
FastPedestalin C++ and Python for per-pixel running mean, population variance, and standard deviation. It supports exponentially weighted updates, initialization from files, direct subtraction from NumPy arrays, andfloat64,float32, andint16output types. - Added the
Pedestal_i16Python binding alongsideFastPedestal_d,FastPedestal_f, andFastPedestal_i16. PedestalTrackingPixelHistogram.fill_from_file()now uses parallel, double-buffered file reading and acceptsreader_threadsandreader_chunk_sizetuning parameters.- Added the
AARE_TUNE_LOCALCMake option to build with-march=nativeand-mtune=nativewhen supported. Binaries built with this option are specific to the local CPU and may not be portable. - Added string representator in python for Cluster and Eta
- Added roi slice method in python for easy slicing of numpy arrays
array[roi.slice()]. - added context manager for
aare.RawMasterFile
API Changes:
-
FastPedestalvariance is now a privatedoubleintermediate. Removed the C++variance()/variance_unchecked()APIs and Pythonvar(). Standard deviation is calculated before conversion to the output type, avoiding overflow of intermediate variance forint16output. Negative variance from floating-point roundoff is clamped to zero. -
Pedestalnow always accumulates sums and sums of squares indouble, likeFastPedestal. Mean and standard deviation output types are unchanged. Removed the C++get_sum()/get_sum2()getters and Pythonsum/sum2properties; internal sums are no longer exposed. -
Removed the public
Pedestal.variance()andcached_std()APIs and C++update_std(). Usestd()to calculate the current population standard deviation; variance is now an internal implementation detail. -
Added
ClusterFile::read_frame(ClusterVector&)for allocation-reusing C++ reads. It returnsfalseat a clean end of file. The value-returning C++ overload now returnsstd::optional<ClusterVector<ClusterType>>and Pythonread_frame()returnsNoneat end of file. Incomplete frames still raise an error. -
Added an explicit boolean conversion to the C++
FilePtrtype. -
Removed the public C++
ClusterFile::openmethod. Construct a newClusterFileto reopen a file or change its mode. -
ClusterFindernow usesFastPedestal. It must receive 1000 pedestal frames before cluster finding;find_clusters()raises an error until initialization is complete. Addedupdate_threshold()to recompute the per-pixel detection thresholds. -
Added the
queue_depthconstructor argument toClusterFinderMTto configure the number of preallocated frame buffers per worker thread. -
Exposed
ClusterVector.empty()in the Python API. -
Added ClusterVector.estimate_n_clusters
-
Removed the lmfit dependency and the legacy
fit_gaus,fit_pol1,fit_scurve, andfit_scurve2APIs. UseGaussian,Pol1,RisingScurve, orFallingScurveand callmodel.fit(...)(orfit(model, ...)) instead. -
Removed the legacy
gaus,pol1,scurve, andscurve2function evaluators. Model objects are callable and provide the replacement, for exampleGaussian()(x, par). -
NDView<T, Ndim>now converts toNDView<const T, Ndim>;expand4to8bitandexpand24to32bitaccept const input views. -
RawMasterFile::geometry()is deprecetad and returns full detector geometry information including module geometry. UseRawMasterFile::module_layout()to get num_modules in x an y -
RawMasterFile::rois()always returns a list of rois (no optional). Per default it returns a list of one ROI element spawing the entire detector -
TimingMode::Autochanged toTimingMode::AUTO_TIMING,TimingMode::Triggerchanged toTimingMode::TRIGGER_EXPOSURE
Bugfixes:
-
RawFileandFilereject raw files with frame padding disabled unless the frame discard policy isdiscardpartial. The constructor reports the master path before opening data subfiles. Legacy.rawmaster files now parse the frame discard policy so unpaddeddiscardpartialfiles remain readable. -
Fixed
CtbRawFile.read_frame(index)and reads afterseek(index)at subfile boundaries skipping a subfile, returning the wrong frame or raisingSubfile index out of range. -
Pedestalreports mismatched frame shapes with exceptions in all push overloads, including Debug builds, instead of aborting on assertions. -
Python
Pedestalconstructors reject negative dimensions and sample counts instead of converting them to large unsigned values. -
Pedestalclamps negative variance from floating-point roundoff to zero, preventing NaN standard deviations for nearly constant inputs. -
Python
Pedestal.push()now requires C-contiguousuint16frames without implicit conversion. Bothpush()andpush_with_threshold()validate that frames and thresholds are two-dimensional before constructing views, preventing incorrect results from unsupported array layouts or ranks. -
Fixed a leaked empty
ClusterVectorat the end of PythonClusterFileiteration. Chunk iteration now rejects a zero chunk size. -
ClusterFile::read_clustersand Python iteration now report incomplete frame headers and cluster records instead of treating truncated files as a clean end of file, with or without ROI or noise filtering. -
ClusterFile::write_framenow reports incomplete writes instead of silently continuing with a truncated file. -
Gain-map application now checks the complete cluster footprint, preventing out-of-bounds access for cluster sizes larger than 3x3.
-
RawFilenow derives its frame count from the shortest selected raw subfile series across all ROIs. Frame-number reads use the same bounds, and Pythonlen(reader)returns the adjusted count. A warning is printed when subfile counts differ or their minimum differs from the recorded master count. The expected frame count is not used and master metadata is preserved. Warning-level logging is now enabled in non-verbose builds. -
Raw frame, batch, ROI, and frame-number read errors now include the attempted frame index and file path in C++ and Python, preserving subfile error details. Subfile errors omit redundant master-file context and C++ source locations; out-of-range errors include the available frame count. Synchronization errors identify the last raw data file for the affected module. Top-level frame bounds errors state the total frame count and that indices are zero-based.
-
Fixed
ClusterVectormove operations to transfer storage instead of copying every cluster. -
Validate that
ClusterVectormasks are one-dimensional, C-contiguous Boolean arrays. -
Preserve signed
ClusterVectorframe numbers when filtering or reducing cluster dimensions. -
Fixed broken reading of old (pre reordering) Moench03
-
Supports reading all timing modes supported in slsDetectorPackage (auto, trigger, gating, burst_trigger, trigger_gating)
2026.7.2
New Features:
- Added a new Minuit2-based fitting framework for
Gaussian,RisingScurve,FallingScurve,Pol1andPol2models. - setter and getter for nSigma for ClusterFinder
aare.ClusterFinder().nSigma = 2,aare.ClusterFinderMT().set_nSigma(2) - mask opeartor for ClusterVector
masked_clustervector = aare.ClusterVector()(mask) - passing pre computed eta values to
aare.Interpolator.interpolatealongside clusters - Added
PixelHistogramandPedestalTrackingPixelHistogram aare.transfrom.Matterhorn10Transformhandles counter artefact in chip. Mind that enabling only one counter or three counters or enabling the wromg two counters e.g. 0,1 will still lead to erreneous data.aare.transfrom.Matterhorn10Transformreshapes data such that first dimension is number of counters- Added support for len() for files. Returns the number of frames
- Added support for direct subtraction of Pedestal from numpy array
- Added support to read files with disabled udp ports
Bugfixes:
- Fixed
split_task(first, last, n_threads)so task ranges now correctly respect thefirstoffset. Previously, non-zero starting indices could generate incorrect subranges. - Fixed overflow issue causing failed allocations for NDArrays abouve ~2GB
- Fixed libfmt failures due to consteval when building with C++20
2026.3.17
New Features:
- Decoding transceiver data from Matterhorn10
transformed_data = aare.transform.Matterhorn10Transform(num_counters=2, dynamic_range=16)(data) - Expanding 24 to 32 bit data
aare._aare.expand24to32bit(data, offset=4) - Decoding digital data from Mythen 302
transformed_data = aare.transform.Mythen302Transform(offset=4)(data) - added
aare.Interpolator.transform_eta_values. Function transforms\eta-values to uniform spatial coordinates. Should only be used for easier debugging. - New
to_string,string_to - Added exptime and period members to RawMasterFile including decoding
- Removed redundant
arr.value(ix,iy...)on NDArray usearr(ix,iy...) - Removed Print/Print_some/Print_all form NDArray (operator
<<still works) - Added const* version of .data()
- reading multiple ROI's supported for aare.
- Use
aare.RawFile.read_roi(roi_index=0)to read a specific ROI for the current frame - Use
aare.RawFile.read_rois()to read multiple ROIs for the current frame - Use
aare.RawFile.read_n_with_roi(num_frames = 2, roi_index = 0)to read multiple frames for a specific ROI. - Note
read_frameandread_nis not supported for multiple ROI's.
- Use
- Building conda/pypi pkgs for python 3.14. Removing 3.11 builds.
Bugfixes:
- multi threaded cluster finder doesnt drop frames if queues are full
- Round before casting in the cluster finder to avoid biasing clusters by truncating
2025.11.21
New Features:
-
Added SPDX-License-Identifier: MPL-2.0 to source files
-
Calculate Eta3 supports all cluster types
-
interpolation class supports using cross eta3x3 and eta3x3 on full cluster as well as eta2x2 on full cluster
-
interpolation class has option to calculate the rosenblatt transform
-
reduction operations to reduce Clusters of general size to 2x2 or 3x3 clusters
-
max_sum_2x2including index of subcluster with highest energy is now available from Python API -
interpolation supports bilinear interpolation of eta values for more fine grained transformed uniform coordinates
-
Interpolation is documented
-
Added tell to ClusterFile. Returns position in bytes for debugging
Resolved Features:
- calculate_eta coincides with theoretical definition
Bugfixes:
- eta calculation assumes correct photon center
- eta transformation to uniform coordinates starts at 0
- Bug in interpolation
- File supports reading new master json file format (multiple ROI's not supported yet)
API Changes:
- ClusterFinder for 2x2 Cluster disabled
- eta stores corner as enum class cTopLeft, cTopRight, BottomLeft, cBottomRight indicating 2x2 subcluster with largest energy relative to cluster center
- max_sum_2x2 returns corner as index
2025.8.22
Features:
- Apply calibration works in G0 if passes a 2D calibration and pedestal
- count pixels that switch
- calculate pedestal (also g0 version)
- NDArray::view() needs an lvalue to reduce issues with the view outliving the array
Bugfixes:
- Now using glibc 2.17 in conda builds (was using the host)
- Fixed shifted pixels in clusters close to the edge of a frame
2025.7.18
Features:
- Cluster finder now works with 5x5, 7x7 and 9x9 clusters
- Added ClusterVector::empty() member
- Added apply_calibration function for Jungfrau data
Bugfixes:
- Fixed reading RawFiles with ROI fully excluding some sub files.
- Decoding of MH02 files placed the pixels in wrong position
- Removed unused file: ClusterFile.cpp
2025.5.22
Features:
- Added scurve fitting
Bugfixes:
- Fixed crash when opening raw files with large number of data files
Download, Documentation & Support
Download
The Source Code: https://github.com/slsdetectorgroup/aare
Documentation
Documentation including installation details: https://github.com/slsdetectorgroup/aare
Support
erik.frojdh@psi.ch
alice.mazzoleni@psi.ch
dhanya.thattil@psi.ch