Changelog¤
2025.1¤
Added:
- TOFResponse to estimate, deconvolve and denoise the instrumental response in eTOFs (#304).
- CookieboxCalibration to calibrate data from eTOFs after taking a calibration run (#284).
- Grating2DCalibration to calibrate data from a 2D grating detector (#284).
- Grating1DCalibration to calibrates 1D grating information (e.g.: collected from the Gotthard detector in SQS) (#318).
- Exposed detector data components from
extra_datainextra.components(AGIPD1M, AGIPD500K, DSSC1M, JUNGFRAU, LPD1M) (#177). - imshow2 now supports plotting 2D DataArrays properly (#333).
- Added hyperslicer2() to make plotting image arrays easier (#348).
- reorder_axes_to_shape utility function (#349).
- ShimadzuHPVX2Conditions to retrieve constants for dynamic flat-field correction (#254).
Changed:
- Timepix3.spatial_bins() is now a static method.
- The XGM component will now emit warnings when it
detects the wrong number of pulses have been saved in the slow data
property. There is also a new
force_slow_dataargument to XGM.pulse_counts() to always return whatever was saved in the slow data (#161). - LPDConditions now accepts
parallel_gain(#254). - JUNGFRAUConditions now accepts
exposure_timeout(#254). - CalibrationData.from_condition has a new
begin_at_strategyparameter (#254).
Fixed:
- Fixed PumpProbePulses.is_constant_pattern() to properly take pump probe flags into account when determining whether a pattern is constant (#313).
- AdqRawChannel.pulse_edges() now also supports data where the trace is too short for the actual number of pulses present (#312).
- Fixed issues with pulse separation in AdqRawChannel with variable pulse patterns and those with trains missing ADQ data (#310).
- AdqRawChannel now properly enumerates channels starting with 1 rather than 0 as in the Karabo device.
- Fixed reading of the Scantool.acquisition_time property for newer Scantool versions (#303).
- CookieboxCalibration: allow flagging of bad calibration points, to allow using others in the
mask_calibration_point(tof_id, energy)function (#318). - CookieboxCalibration: Order
plot_calibration_datay axis by energy to avoid unordered axis in case the energy scan was done out of monotonically increasing order (#318). - CookieboxCalibration: Use Auger-Meitner mean to align all plots in
plot_calibration_databy the Auger-Meitner peak (#318). - CookieboxCalibration: New function
plot_calibrations, which plots only the calibration factors in the same plot for diagnostics. Often this is all that one is interested in (#318). - Grating2DCalibration: Crop image based on rotation angle to avoid artifacts caused by out-of-bound effects. Add background root-mean-squared error as uncertainty band in the output (#318).
- Grating2DCalibration: If provided, use extra motor information as independent variable in the fit (useful when data includes motor movements additionally) (#318).
- Fixed Scan.plot_bin_by_steps() to show 2D data (#320).
- Restrict the version of Cython used to build while we figure out an issue with Cython 3.1 (#328).
- Fixed behaviour of Scan.plot_bin_by_steps() when passed a custom axis (#334).
2024.2¤
Added:
- Timepix3 to access raw hits and centroids from the Timepix3 detector (#231).
- Scan.plot() now allows passing a
figsize(#262). - JF4MHalfMotors to access positions of motors moving halfs of Jungfrau detector (#224).
Fixed:
- Karabacon 3.0.10 is now supported by the Scantool (#212).
Scan.plot_bin_by_steps()would previously ignore thetitle/xlabel/ylabelarguments, now it actually uses them (#237).- `Scan.bin_by_steps() now preserves any additional dimensions in the data to be binned, so it can produce e.g. an average spectrum per scan step (#269).
AdqRawChannel.pulse_data()no longer erroneously reads in the same train data for every pulse if there is only a single pulse per train (#259).
Changed:
gaussian()has a newnormparameter to allow disabling normalization, whichfit_gaussian()will use by default (#221).fit_gaussian()has a newA_signparameter to specify the expected orientation of the peak (#222).AdqRawChannel.pulse_data()no longer throws an exception if the pulse pattern refers to data beyond the acquired traces, but instead fills this with NaN or -1 depending on data type (#245).
2024.1.2¤
Added:
- AGIPD1MQuadrantMotors to access positions of motors moving quadrants of AGIPD1M detector (#148).
- A module to expose the DAMNIT API.
- AdqRawChannel to access and process raw traces saved by fast ADQ digitizers (#35).
- Hits obtained via DelayLineDetector.hits() can now optionally be restricted to hits reconstructed with a certain method. (#170).
- DldPulses can optionally enumerate PPL-only pulses using negative indices to stay compatible with PPL-unaware data. (#167).
- The
slowTrainsXGM property is available through XGM.slow_train_energy() (#162). - XGM.pulse_energy() can now take a
series=Trueargument to return a 1D Series instead of a 2D DataArray (#162). - Data indexed by pulse or train can now be aligned with and added as additional columns to sparse DLD data (#166, #173).
- OpticalLaserDelay to obtain the time delays between FEL and optical laser pulses (#165).
- Empty trains can now optionally be included when determining constant pulse patterns via XrayPulses.is_constant_pattern() (#156).
- Check whether any pulse patterns are interleaved with
is_interleaved_with()or directly SA1/SA3 withis_sa1_interleaved_with_sa3()(#155). - Obtain MachinePulses from any other timeserver-based pulse components directly via
machine_pulses()or get machine repetition rate directly frommachine_repetition_rate()(#155). - A helper function named fit_gaussian() (#131).
- A new method Scan.split_by_steps() (#169).
- PumpProbePulses.pulse_mask now has an option to give a mask for only FEL or only pump laser pulses (#174).
- BadPixels flag values for interpreting masks in corrected detector data (#172).
- Deprecate pulse dimension
timein favor ofpulseTime(#178). - Constant fraction and dynamic leading edge discriminators to determine arrival time of fast pulses on an analog signal (#25).
- Sinc interpolation method (#25).
- extra.calibration.CalibrationData now has methods to create & display a markdown table of the constants found. This is primarily for use in Jupyter notebooks (#202).
- More informative plots from Scan.plot() (#201).
Fixed:
- Sometimes an XGM will record the wrong number of pulses in its slow data
property, which would cause the pulse energy to not be retrieved properly. Now
the XGM will rely only on the fast data to find the number of pulses in
.pulse_energy()(#153). - Attempt to convert calibration condition values to floats before defaulting to strings. This prevents misinterpretation of boolean values as strings (e.g., "True") (#193).
- Add tabulate to the package dependencies.
2024.1.1¤
Added:
- MachinePulses to investigate pulse pattern data beyond only X-rays and optical lasers (#138).
- Implemented Scan.bin_by_steps() and Scan.plot_bin_by_steps() to help with averaging data over scan steps (#124).
pulse_periods(),pulse_repetition_rates()andtrain_durations()methods to obtain statistics about the pulses in all pulse pattern components (#114).extra.calibrationmodule to find and load calibration constants.
2024.1¤
Added:
- DelayLineDetector to access raw and reconstructed results from the offline delay line detector processing pipeline (#103).
- An XGM component to access XGM devices (#53).
- PumpProbePulses to combine X-ray and optical laser pulses in a single pattern (#24).
- The Scan component to automatically detect steps within a motor scan (#4).
- DldPulses to access pulse information saved during delay line detector event reconstruction (#42).
- The helper function imshow2 to provide good defaults when plotting images (#38).
Changed:
- The
get_prefix was deprecated for some method names in the pulse pattern components (#106). - All methods in XrayPulses and OpticalLaserPulses now support labelled results and default to it (#40).
- Scantool's
__repr__()functionality to print information was moved to Scantool.info() (#29).
2023.2¤
The initial release!

Added:
- A Scantool component for the EuXFEL scantool, in #2.
- Components for extracting the X-ray and optical laser pulse patterns: XrayPulses and OpticalLaserPulses in #5.
- A collection of utility functions.
- Sub-modules to forward EXtra-data, EXtra-geom, and karabo-bridge-py.