Skip to content

Commit f7e3592

Browse files
authored
Merge pull request #518 from European-XFEL/prep-2026.1
Prepare to release 2026.1
2 parents bcfd593 + 8a0e7ad commit f7e3592

7 files changed

Lines changed: 71 additions & 42 deletions

File tree

docs/changelog.md

Lines changed: 39 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,51 @@
55

66
# Changelog
77

8-
## [Unreleased]
8+
## [2026.1]
99

10-
!!! note
11-
All of the changes here are deployed to our current environment, even though
12-
a release hasn't been made for them yet. If you want to have these updates
13-
in a personal environment you'll need to install the package from git.
10+
Added in components:
1411

15-
```bash title="Installation command"
16-
pip install git+https://github.com/European-XFEL/EXtra.git
17-
```
18-
19-
Added:
20-
21-
- [PumpProbePattern.pumped_pulses_ratios][extra.components.PumpProbePattern.pumped_pulses_ratios]
12+
- [PumpProbePulses.pumped_pulses_ratios][extra.components.PumpProbePulses.pumped_pulses_ratios]
2213
determining the ratio of pumped pulses per train (!317).
2314
- [PulsePattern.inspect][extra.components.pulses.PulsePattern.inspect] to visualize any pulse patterns (!504).
2415
- [TimeserverPulses.plot_xray_patterns][extra.components.pulses.TimeserverPulses.plot_xray_patterns]
2516
to visualize the X-ray pulse patterns present in timeserver data (!499).
17+
- [PulsePattern.select_pulses][extra.components.pulses.PulsePattern.select_pulses],
18+
[PulsePattern.deselect_pulses][extra.components.pulses.PulsePattern.deselect_pulses] and
19+
[PulsePattern.union][extra.components.pulses.PulsePattern.union] to modify pulse patterns (!417).
20+
- [ManualPulses][extra.components.ManualPulses] to generate custom pulse pattern with
21+
the same interface as existing
22+
[PulsePattern][extra.components.pulses.PulsePattern]-based components (!417).
23+
- `split_trains()` methods for the pulse pattern components.
24+
- [PulsePattern.info()][extra.components.pulses.PulsePattern.info] to give a brief summary of a pulse pattern.
2625
- [DelayLineDetector.edges][extra.components.DelayLineDetector.edges] can include the edge amplitudes
2726
in its result if requested (!505).
27+
- [DelayLineDetector.split_trains][extra.components.DelayLineDetector.split_trains]
2828
- [AdqRawChannel.train_data][extra.components.AdqRawChannel.train_data] and
2929
[AdqRawChannel.pulse_data][extra.components.AdqRawChannel.pulse_data] are now
3030
reading data in parallel by default (!497).
3131
- [AdqRawChannel.pulse_data][extra.components.AdqRawChannel.pulse_data] accepts
3232
a dtype parameter for the output array.
3333
- [AdqRawChannel.split_trains][extra.components.AdqRawChannel.split_trains]
34+
- [AdqRawChannel][extra.components.AdqRawChannel.pulses] now has a public `.pulses` property.
35+
It is either a `PulsePattern` object or None if the class is instantiated with the `pulses=False` option. (!411)
36+
- [Timepix3.select_trains][extra.components.Timepix3.select_trains] and
37+
[Timepix3.split_trains][extra.components.Timepix3.split_trains]
38+
- [XGM.select_trains][extra.components.XGM.select_trains] and
39+
[XGM.split_trains][extra.components.XGM.split_trains]
40+
- [Scan.group_data()][extra.components.Scan.group_data] method to make an xarray
41+
or pandas GroupBy object based on scan steps (!379).
42+
- [Scan.from_motor_targets()][extra.components.Scan.from_motor_targets] method
43+
to make a scan object based on the target positions of the motor, excluding
44+
points where the actual position is too far from the target.
45+
46+
Added in calibration:
47+
3448
- [AGIPDConditions][extra.calibration.AGIPDConditions] now recognizes current source constant types
3549
- [CalibrationData.from_data][extra.calibration.CalibrationData.from_data] method to
3650
find the constants suitable for a given `DataCollection`
3751
- [DetectorData][extra.calibration.DetectorData] to obtain detector metadata and
38-
module mapping from the Calibration Cataloge (!408).
39-
- [PulsePattern.select_pulses][extra.components.pulses.PulsePattern.select_pulses],
40-
[PulsePattern.deselect_pulses][extra.components.pulses.PulsePattern.deselect_pulses] and
41-
[PulsePattern.union][extra.components.pulses.PulsePattern.union] to modify pulse patterns (!417).
42-
- [ManualPulses][extra.components.ManualPulses] to generate custom pulse pattern with
43-
the same interface as existing
44-
[PulsePattern][extra.components.pulses.PulsePattern]-based components (!417).
45-
- [SpectrometerCalibration][extra.gui.jupyter.SpectrometerCalibration] to
46-
provide a Jupyter widget for energy calibration of 2D X-ray spectrum data
47-
(!363).
48-
- Pre-built packages will be available on PyPI for Python 3.10 - 3.13 from the
49-
next release, rather than only Python 3.10 (!377).
52+
module mapping from the Calibration Catalog (!408).
5053
- [CalibrationData.from_condition][extra.calibration.CalibrationData.from_condition]
5154
supports `DataCollection` objects to reference a point in time
5255
- [CalibrationData.from_correction][extra.calibration.CalibrationData.from_correction]
@@ -57,32 +60,28 @@ Added:
5760
- [lpd_dark_consts_with_fallback][extra.calibration.lpd_dark_consts_with_fallback]
5861
function to find LPD dark constants with a fallback to constants recorded with
5962
all memory cells.
60-
- [Scan.group_data()][extra.components.Scan.group_data] method to make an xarray
61-
or pandas GroupBy object based on scan steps (!379).
62-
- [Scan.from_motor_targets()][extra.components.Scan.from_motor_targets] method
63-
to make a scan object based on the target positions of the motor, excluding
64-
points where the actual position is too far from the target.
63+
- New bits in [BadPixels][extra.calibration.BadPixels] flags: ``EXPERT_CHOICE``
64+
for manually created masks, and ``USER1`` & ``USER2`` to allow for experiment
65+
specific meanings.
66+
67+
Added (other):
68+
6569
- [fit_gaussian()][extra.utils.fit_gaussian] has a new `nans_on_failure`
6670
argument to allow returning NaN arrays when fitting fails (!385).
6771
- [fit_gaussian()][extra.utils.fit_gaussian] now supports
6872
[DataArray][xarray.DataArray] inputs (!385).
69-
- [AdqRawChannel][extra.components.AdqRawChannel.pulses] now has a public `.pulses` property. It is either a `PulsePattern` object or None if the class is instantiated with the `pulses=False` option. (!411)
7073
- Added support for plotting wrapped Julia arrays from PythonCall.jl to
7174
[imshow2()][extra.utils.imshow2].
72-
- [PulsePattern.info()][extra.components.pulses.PulsePattern.info] to give a brief
75+
- [SpectrometerCalibration][extra.gui.jupyter.SpectrometerCalibration] to
76+
provide a Jupyter widget for energy calibration of 2D X-ray spectrum data
77+
(!363).
7378
- [TOFAnalogResponse][extra.applications.TOFAnalogResponse] can deconvolve the Auger-Meitner
7479
and photon line if the flag `deconvolve` is set to True.
7580
summary about a pulse pattern (!435).
7681
- `StepTimer` class for measuring performance within functions.
7782
- [Grating1DCalibration][extra.applications.Grating1DCalibration] can use the calibration mask,
7883
removes the background subtraction (leaving it to the calibration DB),
7984
and use robust tools to improve the fit quality (!510).
80-
- [Timepix3.select_trains][extra.components.Timepix3.select_trains] and
81-
[Timepix3.split_trains][extra.components.Timepix3.split_trains]
82-
- [XGM.select_trains][extra.components.XGM.select_trains] and
83-
[XGM.split_trains][extra.components.XGM.split_trains]
84-
- [DelayLineDetector.split_trains][extra.components.DelayLineDetector.split_trains]
85-
- `split_trains()` methods for the pulse pattern components.
8685

8786
Fixed:
8887

@@ -131,6 +130,7 @@ Changed:
131130
from `AdqRawChannel` to clean up the data (!511).
132131
- [CookieboxCalibration][extra.applications.CookieboxCalibration] use
133132
processes to parallelize over eTOFs (!513).
133+
- Pre-built packages are now available on PyPI for Python 3.10 - 3.13 (!377).
134134

135135
## [2025.1]
136136

@@ -370,7 +370,8 @@ Added:
370370
[EXtra-geom](detector-geometry.md), and [karabo-bridge-py](karabo-bridge.md).
371371

372372

373-
[Unreleased]: https://github.com/European-XFEL/EXtra/compare/2025.1...master
373+
[Unreleased]: https://github.com/European-XFEL/EXtra/compare/2026.1...master
374+
[2026.1]: https://github.com/European-XFEL/EXtra/releases/tag/2026.1
374375
[2025.1]: https://github.com/European-XFEL/EXtra/releases/tag/2025.1
375376
[2024.2]: https://github.com/European-XFEL/EXtra/releases/tag/2024.2
376377
[2024.1.2]: https://github.com/European-XFEL/EXtra/releases/tag/2024.1.2

src/extra/calibration/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ class BadPixels(IntFlag):
5252
"JUNGFRAUConditions",
5353
"ShimadzuHPVX2Conditions",
5454
"DetectorData",
55-
"DetectorModule"
56-
"AutoConditionsError"
55+
"DetectorModule",
56+
"AutoConditionsError",
5757
]
58-
59-

src/extra/components/adq.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,11 @@ def select_trains(self, trains):
642642
return res
643643

644644
def split_trains(self, parts=None, trains_per_part=None):
645+
"""Split this data into subsets along the train dimension.
646+
647+
This method accepts the same type of arguments as
648+
[DataCollection.split_trains][extra_data.DataCollection.split_trains].
649+
"""
645650
n_trains = len(self._instrument_src.train_ids)
646651
for sl in split_trains(n_trains, parts=parts, trains_per_part=trains_per_part):
647652
yield self.select_trains(sl)

src/extra/components/dld.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,11 @@ def rec_params(self):
275275
if not key.endswith('.timestamp')}
276276

277277
def select_trains(self, trains):
278+
"""Select a subset of trains in this data.
279+
280+
This method accepts the same type of arguments as
281+
[DataCollection.select_trains][extra_data.DataCollection.select_trains].
282+
"""
278283
new_self = copy(self)
279284

280285
if self._control_src is not None:
@@ -285,6 +290,11 @@ def select_trains(self, trains):
285290
return new_self
286291

287292
def split_trains(self, parts=None, trains_per_part=None):
293+
"""Split this data into subsets along the train dimension.
294+
295+
This method accepts the same type of arguments as
296+
[DataCollection.split_trains][extra_data.DataCollection.split_trains].
297+
"""
288298
n_trains = len(self._instrument_src.train_ids)
289299
for sl in split_trains(n_trains, parts=parts, trains_per_part=trains_per_part):
290300
yield self.select_trains(sl)

src/extra/components/pulses.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,11 @@ def select_trains(self, trains):
621621
return res
622622

623623
def split_trains(self, parts=None, trains_per_part=None):
624+
"""Split this data into subsets along the train dimension.
625+
626+
This method accepts the same type of arguments as
627+
[DataCollection.split_trains][extra_data.DataCollection.split_trains].
628+
"""
624629
# Get train IDs from an EXtra-data object if possible, so it will split
625630
# the same way as other things from the same data.
626631
if self._source is not None:

src/extra/components/timepix.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,11 @@ def select_trains(self, trains):
134134
return res
135135

136136
def split_trains(self, parts=None, trains_per_part=None):
137+
"""Split this data into subsets along the train dimension.
138+
139+
This method accepts the same type of arguments as
140+
[DataCollection.split_trains][extra_data.DataCollection.split_trains].
141+
"""
137142
n_trains = len(self.train_ids)
138143
for sl in split_trains(n_trains, parts=parts, trains_per_part=trains_per_part):
139144
yield self.select_trains(sl)

src/extra/components/xgm.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,11 @@ def select_trains(self, trains):
242242
return res
243243

244244
def split_trains(self, parts=None, trains_per_part=None):
245+
"""Split this data into subsets along the train dimension.
246+
247+
This method accepts the same type of arguments as
248+
[DataCollection.split_trains][extra_data.DataCollection.split_trains].
249+
"""
245250
n_trains = len(self._control_source.train_ids)
246251
for sl in split_trains(n_trains, parts=parts, trains_per_part=trains_per_part):
247252
yield self.select_trains(sl)

0 commit comments

Comments
 (0)