From b9959ae82721b0d183ca8aa2f8593cd693d8bf6d Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Mon, 2 Feb 2026 13:23:48 +0100 Subject: [PATCH 1/6] feat: expose NC options in peak reader --- src/ess/beer/peakfinding.py | 4 ++-- src/ess/diffraction/peaks.py | 32 ++++++++++++++++++++++++-------- tests/diffraction/test_peaks.py | 18 +++++++++++++----- 3 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/ess/beer/peakfinding.py b/src/ess/beer/peakfinding.py index 3c7fd465..419b5402 100644 --- a/src/ess/beer/peakfinding.py +++ b/src/ess/beer/peakfinding.py @@ -1,4 +1,4 @@ -from ..diffraction.peaks import dspacing_peak_positions_from_cif +from ..diffraction.peaks import dspacing_peaks_from_cif from .types import CIFIdentifierForPeakPositions, CIFPeaksMinIntensity, DHKLList @@ -6,4 +6,4 @@ def dhkl_peaks_from_cif( cif: CIFIdentifierForPeakPositions, intensity_threshold: CIFPeaksMinIntensity ) -> DHKLList: '''Gets the list of expected peak positions from a CIF file/identifier.''' - return dspacing_peak_positions_from_cif(cif, intensity_threshold) + return dspacing_peaks_from_cif(cif, intensity_threshold).coords['dspacing'] diff --git a/src/ess/diffraction/peaks.py b/src/ess/diffraction/peaks.py index 1b3e4c8e..c3f0bdc8 100644 --- a/src/ess/diffraction/peaks.py +++ b/src/ess/diffraction/peaks.py @@ -2,9 +2,9 @@ import scipp as sc -def dspacing_peak_positions_from_cif(cif, intensity_threshold=None) -> sc.Variable: +def dspacing_peaks_from_cif(cif, intensity_threshold=None, **kwargs) -> sc.DataArray: """ - Retrieves a list of the peak positions for the given material. + Retrieves a data array representing the bragg peaks of the given material. The material is represented by a cif file or a codid or similar. The number of peaks retrieved can be controlled by setting the intensity @@ -27,20 +27,36 @@ def dspacing_peak_positions_from_cif(cif, intensity_threshold=None) -> sc.Variab times the multiplicity of the peak. The ``intensity_threshold`` must be convertible to unit ``barn``. + kwargs: + Can be anything that :py:`NCrystal.NCMATComposer.from_cif` supports. + For example: `uiso_temperature` or `override_spacegroup`. + Returns ------------ Array containing the peak positions in `dspacing`, with unit ``angstrom``. """ - info = NC.NCMATComposer.from_cif(cif).load('comp=bragg').info + info = NC.NCMATComposer.from_cif(cif, **kwargs).load('comp=bragg').info min_intensity = ( intensity_threshold.to(unit='barn').value if intensity_threshold is not None else 0 ) - return sc.array( - dims=['peaks'], - values=[ - hkl.d for hkl in info.hklObjects() if (hkl.f2 * hkl.mult) >= min_intensity - ], + dims = ['peaks'] + peaks = [hkl for hkl in info.hklObjects() if (hkl.f2 * hkl.mult) >= min_intensity] + dspacing = sc.array( + dims=dims, + values=[hkl.d for hkl in peaks], unit='angstrom', ) + out = sc.DataArray( + sc.array(dims=dims, values=[hkl.f2 * hkl.mult for hkl in peaks], unit='barn'), + coords={ + 'dspacing': dspacing, + 'cif': sc.scalar(cif), + 'info': sc.scalar(info), + **{name: sc.scalar(value) for name, value in kwargs.items()}, + }, + ) + if intensity_threshold is not None: + out.coords['intensity_threshold'] = intensity_threshold + return out diff --git a/tests/diffraction/test_peaks.py b/tests/diffraction/test_peaks.py index 0fc73bba..c77b47a3 100644 --- a/tests/diffraction/test_peaks.py +++ b/tests/diffraction/test_peaks.py @@ -1,25 +1,33 @@ import scipp as sc -from ess.diffraction.peaks import dspacing_peak_positions_from_cif +from ess.diffraction.peaks import dspacing_peaks_from_cif def test_retreived_peak_list_has_expected_units(): - d = dspacing_peak_positions_from_cif( + d = dspacing_peaks_from_cif( 'codid::9011998', sc.scalar(50, unit='barn'), ) - assert d.unit == 'angstrom' + assert d.coords['dspacing'].unit == 'angstrom' + assert d.unit == 'barn' def test_intensity_threshold_is_taken_into_account(): - d = dspacing_peak_positions_from_cif( + d = dspacing_peaks_from_cif( 'codid::9011998', sc.scalar(50, unit='barn'), ) assert len(d) > 0 - d = dspacing_peak_positions_from_cif( + d = dspacing_peaks_from_cif( 'codid::9011998', sc.scalar(50, unit='Mbarn'), ) assert len(d) == 0 + + +def test_retreived_peak_list_with_temperature_kwarg(): + d = dspacing_peaks_from_cif( + 'codid::9011998', sc.scalar(50, unit='barn'), uiso_temperature=300 + ) + assert d.coords['uiso_temperature'] == 300 From 144d5609580c7b2e0be6fab91633d7656e8b26c0 Mon Sep 17 00:00:00 2001 From: jokasimr Date: Mon, 2 Feb 2026 14:56:13 +0100 Subject: [PATCH 2/6] Update src/ess/diffraction/peaks.py Co-authored-by: Jan-Lukas Wynen --- src/ess/diffraction/peaks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ess/diffraction/peaks.py b/src/ess/diffraction/peaks.py index c3f0bdc8..4967ec52 100644 --- a/src/ess/diffraction/peaks.py +++ b/src/ess/diffraction/peaks.py @@ -29,7 +29,7 @@ def dspacing_peaks_from_cif(cif, intensity_threshold=None, **kwargs) -> sc.DataA kwargs: Can be anything that :py:`NCrystal.NCMATComposer.from_cif` supports. - For example: `uiso_temperature` or `override_spacegroup`. + For example: ``uiso_temperature`` or ``override_spacegroup``. Returns ------------ From 775fc22368c4837a63fedc8f82e40077a4cd3200 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Mon, 2 Feb 2026 15:07:26 +0100 Subject: [PATCH 3/6] docs: add example --- src/ess/diffraction/peaks.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/ess/diffraction/peaks.py b/src/ess/diffraction/peaks.py index 4967ec52..4fc7695e 100644 --- a/src/ess/diffraction/peaks.py +++ b/src/ess/diffraction/peaks.py @@ -33,8 +33,26 @@ def dspacing_peaks_from_cif(cif, intensity_threshold=None, **kwargs) -> sc.DataA Returns ------------ - Array containing the peak positions in `dspacing`, with unit ``angstrom``. - """ + Data array represengint peak amplitudes and peak positions in ``dspacing``. + The full NCrystal information object is added as a coordinate with the name ``info``. + The input arguments are added as scalar coordinates. + + + Examples + ------------ + >>> from ess.diffraction.peaks import dspacing_peaks_from_cif + >>> dspacing_peaks_from_cif('codid::9008460', uiso_temperature=400, override_spacegroup='F d -3 m:1') + + Dimensions: Sizes[peaks:162, ] + Coordinates: + * cif string () "codid::9008460" + * dspacing float64 [Å] (peaks) [2.33803, 2.02479, ..., 0.243756, 0.243756] + * info PyObject () + * override_spacegroup string () "F d -3 m:1" + * uiso_temperature int64 [dimensionless] () 400 + Data: + float64 [barn] (peaks) [13.3631, 9.59562, ..., 0.000556426, 0.000556426] + """ # noqa: E501 info = NC.NCMATComposer.from_cif(cif, **kwargs).load('comp=bragg').info min_intensity = ( intensity_threshold.to(unit='barn').value From 5b8a07168dede0c8fc5e5198bc019f14af9eb293 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Mon, 2 Feb 2026 15:11:10 +0100 Subject: [PATCH 4/6] fix --- src/ess/diffraction/peaks.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/ess/diffraction/peaks.py b/src/ess/diffraction/peaks.py index 4fc7695e..3852e32a 100644 --- a/src/ess/diffraction/peaks.py +++ b/src/ess/diffraction/peaks.py @@ -39,19 +39,24 @@ def dspacing_peaks_from_cif(cif, intensity_threshold=None, **kwargs) -> sc.DataA Examples - ------------ - >>> from ess.diffraction.peaks import dspacing_peaks_from_cif - >>> dspacing_peaks_from_cif('codid::9008460', uiso_temperature=400, override_spacegroup='F d -3 m:1') - - Dimensions: Sizes[peaks:162, ] - Coordinates: - * cif string () "codid::9008460" - * dspacing float64 [Å] (peaks) [2.33803, 2.02479, ..., 0.243756, 0.243756] - * info PyObject () - * override_spacegroup string () "F d -3 m:1" - * uiso_temperature int64 [dimensionless] () 400 - Data: - float64 [barn] (peaks) [13.3631, 9.59562, ..., 0.000556426, 0.000556426] + -------- + >>> from ess.diffraction.peaks import dspacing_peaks_from_cif + >>> dspacing_peaks_from_cif( + ... 'codid::9008460', + ... uiso_temperature=400, + ... override_spacegroup='F d -3 m:1', + ... ) + + Dimensions: Sizes[peaks:162, ] + Coordinates: + * cif string () "codid::9008460" + * dspacing float64 [Å] (peaks) [2.33803, 2.02479, ..., 0.243756, 0.243756] + * info PyObject () + * override_spacegroup string () "F d -3 m:1" + * uiso_temperature int64 [dimensionless] () 400 + Data: + float64 [barn] (peaks) [13.3631, 9.59562, ..., 0.000556426, 0.000556426] + """ # noqa: E501 info = NC.NCMATComposer.from_cif(cif, **kwargs).load('comp=bragg').info min_intensity = ( From 9c0fa04c4f54ddcdf10f24b856c59b6fff857c2d Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Mon, 2 Feb 2026 15:11:40 +0100 Subject: [PATCH 5/6] fix --- src/ess/diffraction/peaks.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ess/diffraction/peaks.py b/src/ess/diffraction/peaks.py index 3852e32a..4bd9d02b 100644 --- a/src/ess/diffraction/peaks.py +++ b/src/ess/diffraction/peaks.py @@ -37,7 +37,6 @@ def dspacing_peaks_from_cif(cif, intensity_threshold=None, **kwargs) -> sc.DataA The full NCrystal information object is added as a coordinate with the name ``info``. The input arguments are added as scalar coordinates. - Examples -------- >>> from ess.diffraction.peaks import dspacing_peaks_from_cif From 792d2b24b1f4aeb7dca490919b9dbed50b37c717 Mon Sep 17 00:00:00 2001 From: Johannes Kasimir Date: Mon, 2 Feb 2026 15:13:48 +0100 Subject: [PATCH 6/6] fix --- src/ess/diffraction/peaks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ess/diffraction/peaks.py b/src/ess/diffraction/peaks.py index 4bd9d02b..b3bf2bf9 100644 --- a/src/ess/diffraction/peaks.py +++ b/src/ess/diffraction/peaks.py @@ -33,7 +33,7 @@ def dspacing_peaks_from_cif(cif, intensity_threshold=None, **kwargs) -> sc.DataA Returns ------------ - Data array represengint peak amplitudes and peak positions in ``dspacing``. + Data array representing peak amplitudes and peak positions in ``dspacing``. The full NCrystal information object is added as a coordinate with the name ``info``. The input arguments are added as scalar coordinates.