From 65c52ecf5cb50ebeee00390eab1aebf74fbaf7a7 Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Fri, 24 Jan 2025 10:20:40 +0100 Subject: [PATCH 01/10] equivalence azimuth and radial units --- src/pyFAI/integrator/azimuthal.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/pyFAI/integrator/azimuthal.py b/src/pyFAI/integrator/azimuthal.py index fb9772e14..e0c36f6a3 100644 --- a/src/pyFAI/integrator/azimuthal.py +++ b/src/pyFAI/integrator/azimuthal.py @@ -721,6 +721,9 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, if radial_range: radial_range = tuple([i / pos0_scale for i in radial_range]) + if azimuth_range: + azimuth_range = tuple([i / pos1_scale for i in azimuth_range]) + error_model = ErrorModel.parse(error_model) if variance is not None: assert variance.size == data.size @@ -732,11 +735,13 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, else: variance = (numpy.maximum(data, 1.0) + numpy.maximum(dark, 0.0)).astype(numpy.float32) - if azimuth_range is not None and azimuth_unit.period: - azimuth_range = tuple(deg2rad(azimuth_range[i], self.chiDiscAtPi) for i in (0, -1)) - if azimuth_range[1] <= azimuth_range[0]: - azimuth_range = (azimuth_range[0], azimuth_range[1] + 2 * pi) - self.check_chi_disc(azimuth_range) + for unit_, unit_range in zip((radial_unit, azimuth_unit), (radial_range, azimuth_range)): + if unit_range is not None and unit_.period: + if unit_.name.split("_")[0] == "deg": + unit_range = tuple(deg2rad(unit_range[i], self.chiDiscAtPi) for i in (0, -1)) + if unit_range[1] <= unit_range[0]: + unit_range = (unit_range[0], unit_range[1] + 2 * pi) + self.check_chi_disc(unit_range) if correctSolidAngle: solidangle = self.solidAngleArray(shape, correctSolidAngle) From 9bebedaaa6d82715da5550916bdb077058c9062e Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Fri, 24 Jan 2025 10:42:54 +0100 Subject: [PATCH 02/10] check both ranges --- src/pyFAI/integrator/azimuthal.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/pyFAI/integrator/azimuthal.py b/src/pyFAI/integrator/azimuthal.py index e0c36f6a3..d08459aad 100644 --- a/src/pyFAI/integrator/azimuthal.py +++ b/src/pyFAI/integrator/azimuthal.py @@ -735,13 +735,23 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, else: variance = (numpy.maximum(data, 1.0) + numpy.maximum(dark, 0.0)).astype(numpy.float32) - for unit_, unit_range in zip((radial_unit, azimuth_unit), (radial_range, azimuth_range)): - if unit_range is not None and unit_.period: - if unit_.name.split("_")[0] == "deg": - unit_range = tuple(deg2rad(unit_range[i], self.chiDiscAtPi) for i in (0, -1)) - if unit_range[1] <= unit_range[0]: - unit_range = (unit_range[0], unit_range[1] + 2 * pi) - self.check_chi_disc(unit_range) + if azimuth_range is not None and azimuth_unit.period: + if azimuth_unit.name.split("_")[-1] == "deg": + azimuth_range = tuple(deg2rad(azimuth_range[i], self.chiDiscAtPi) for i in (0, -1)) + if azimuth_range[1] <= azimuth_range[0]: + azimuth_range = (azimuth_range[0], azimuth_range[1] + 2 * pi) + self.check_chi_disc(azimuth_range) + if azimuth_unit.name.split("_")[-1] == "deg": + azimuth_range = [numpy.rad2deg(i) for i in azimuth_range] + + if radial_range is not None and radial_unit.period: + if radial_unit.name.split("_")[-1] == "deg": + radial_range = tuple(deg2rad(radial_range[i], self.chiDiscAtPi) for i in (0, -1)) + if radial_range[1] <= radial_range[0]: + radial_range = (radial_range[0], radial_range[1] + 2 * pi) + self.check_chi_disc(radial_range) + if radial_unit.name.split("_")[-1] == "deg": + radial_range = [numpy.rad2deg(i) for i in radial_range] if correctSolidAngle: solidangle = self.solidAngleArray(shape, correctSolidAngle) From 67bb034aad101fba70e10f39684f8cf681110a5d Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Wed, 29 Jan 2025 12:12:11 +0100 Subject: [PATCH 03/10] test_radazim_limits --- src/pyFAI/test/test_azimuthal_integrator.py | 72 +++++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/src/pyFAI/test/test_azimuthal_integrator.py b/src/pyFAI/test/test_azimuthal_integrator.py index 4c174880d..48ca4135f 100644 --- a/src/pyFAI/test/test_azimuthal_integrator.py +++ b/src/pyFAI/test/test_azimuthal_integrator.py @@ -867,6 +867,78 @@ def test_unweighted(self): self.fail(f"Unweighted failed for {method} with exception {err}") +class TestRadialAzimuthalScale(unittest.TestCase): + @classmethod + def setUpClass(cls): + dist = 0.1 + poni1 = 0.02 + poni2 = 0.02 + detector = detector_factory("Pilatus100k") + wavelength = 1e-10 + cls.data = UtilsTest.get_rng().random(detector.shape) + + cls.ai = AzimuthalIntegrator(dist=dist, + poni1=poni1, + poni2=poni2, + wavelength=wavelength, + detector=detector, + ) + + def test_limits_normal_units(self): + CONFIGS = [ + { + "unit" : (units.to_unit("q_nm^-1"), units.to_unit("chi_deg")), + "radial_range" : [10,20], + "azimuth_range" : [-30,30], + }, + { + "unit" : (units.to_unit("chi_deg"), units.to_unit("q_nm^-1")), + "radial_range" : [-30,30], + "azimuth_range" : [10,20], + }, + { + "unit" : (units.to_unit("q_A^-1"), units.to_unit("chi_deg")), + "radial_range" : [1,2], + "azimuth_range" : [-30,30], + }, + { + "unit" : (units.to_unit("chi_deg"), units.to_unit("q_A^-1")), + "radial_range" : [-30,30], + "azimuth_range" : [1,2], + }, + { + "unit" : (units.to_unit("q_A^-1"), units.to_unit("chi_rad")), + "radial_range" : [1,2], + "azimuth_range" : [-1,1], + }, + { + "unit" : (units.to_unit("chi_rad"), units.to_unit("q_A^-1")), + "radial_range" : [-1,1], + "azimuth_range" : [1,2], + }, + ] + + atol = 1e-1 + for config in CONFIGS: + res = self.ai.integrate2d(data=self.data, npt_azim=360, npt_rad=500, **config) + self.assertAlmostEqual(res.radial.min(), config["radial_range"][0], delta=atol) + self.assertAlmostEqual(res.radial.max(), config["radial_range"][1], delta=atol) + self.assertAlmostEqual(res.azimuthal.min(), config["azimuth_range"][0], delta=atol) + self.assertAlmostEqual(res.azimuthal.max(), config["azimuth_range"][1], delta=atol) + + + + # assert(numpy.allclose(res.radial.max(), config["radial_range"][1], atol=atol)) + # assert(numpy.allclose(res.azimuthal.min(), config["azimuth_range"][0], atol=atol)) + # assert(numpy.allclose(res.azimuthal.max(), config["azimuth_range"][1], atol=atol)) + + + + def test_limits_fiber_units(self): + ## TODO next fiber units PR + ... + + def suite(): loader = unittest.defaultTestLoader.loadTestsFromTestCase testsuite = unittest.TestSuite() From 278c20275217e942adbb0dddd26c8cfb500ce68b Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:14:10 +0000 Subject: [PATCH 04/10] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/pyFAI/test/test_azimuthal_integrator.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pyFAI/test/test_azimuthal_integrator.py b/src/pyFAI/test/test_azimuthal_integrator.py index 48ca4135f..353f43c2c 100644 --- a/src/pyFAI/test/test_azimuthal_integrator.py +++ b/src/pyFAI/test/test_azimuthal_integrator.py @@ -930,8 +930,8 @@ def test_limits_normal_units(self): # assert(numpy.allclose(res.radial.max(), config["radial_range"][1], atol=atol)) # assert(numpy.allclose(res.azimuthal.min(), config["azimuth_range"][0], atol=atol)) - # assert(numpy.allclose(res.azimuthal.max(), config["azimuth_range"][1], atol=atol)) - + # assert(numpy.allclose(res.azimuthal.max(), config["azimuth_range"][1], atol=atol)) + def test_limits_fiber_units(self): From 6e4946a3ee03df3fea3ae73d4f4d98d8cd7aedda Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Wed, 29 Jan 2025 12:17:36 +0100 Subject: [PATCH 05/10] clean --- src/pyFAI/test/test_azimuthal_integrator.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/pyFAI/test/test_azimuthal_integrator.py b/src/pyFAI/test/test_azimuthal_integrator.py index 353f43c2c..9cdd39882 100644 --- a/src/pyFAI/test/test_azimuthal_integrator.py +++ b/src/pyFAI/test/test_azimuthal_integrator.py @@ -926,14 +926,6 @@ def test_limits_normal_units(self): self.assertAlmostEqual(res.azimuthal.min(), config["azimuth_range"][0], delta=atol) self.assertAlmostEqual(res.azimuthal.max(), config["azimuth_range"][1], delta=atol) - - - # assert(numpy.allclose(res.radial.max(), config["radial_range"][1], atol=atol)) - # assert(numpy.allclose(res.azimuthal.min(), config["azimuth_range"][0], atol=atol)) - # assert(numpy.allclose(res.azimuthal.max(), config["azimuth_range"][1], atol=atol)) - - - def test_limits_fiber_units(self): ## TODO next fiber units PR ... From a4047b87c1b6c08eb013f284b30c19b8f2923a36 Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Wed, 29 Jan 2025 12:19:55 +0100 Subject: [PATCH 06/10] comment --- src/pyFAI/test/test_azimuthal_integrator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pyFAI/test/test_azimuthal_integrator.py b/src/pyFAI/test/test_azimuthal_integrator.py index 9cdd39882..e8b991653 100644 --- a/src/pyFAI/test/test_azimuthal_integrator.py +++ b/src/pyFAI/test/test_azimuthal_integrator.py @@ -33,7 +33,7 @@ __contact__ = "Jerome.Kieffer@ESRF.eu" __license__ = "MIT" __copyright__ = "European Synchrotron Radiation Facility, Grenoble, France" -__date__ = "15/01/2025" +__date__ = "29/01/2025" import unittest import os @@ -868,6 +868,7 @@ def test_unweighted(self): class TestRadialAzimuthalScale(unittest.TestCase): + # Non-regression tests added for pyFAI version 2025.01 @classmethod def setUpClass(cls): dist = 0.1 From 23300e78f9c579a32a51ee097b41c6620347dc29 Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Wed, 29 Jan 2025 21:51:07 +0100 Subject: [PATCH 07/10] test with chidisc --- src/pyFAI/test/test_azimuthal_integrator.py | 66 ++++++++------------- 1 file changed, 25 insertions(+), 41 deletions(-) diff --git a/src/pyFAI/test/test_azimuthal_integrator.py b/src/pyFAI/test/test_azimuthal_integrator.py index e8b991653..f4bf07175 100644 --- a/src/pyFAI/test/test_azimuthal_integrator.py +++ b/src/pyFAI/test/test_azimuthal_integrator.py @@ -866,9 +866,8 @@ def test_unweighted(self): except Exception as err: self.fail(f"Unweighted failed for {method} with exception {err}") - +# Non-regression tests added for pyFAI version 2025.01 class TestRadialAzimuthalScale(unittest.TestCase): - # Non-regression tests added for pyFAI version 2025.01 @classmethod def setUpClass(cls): dist = 0.1 @@ -877,7 +876,6 @@ def setUpClass(cls): detector = detector_factory("Pilatus100k") wavelength = 1e-10 cls.data = UtilsTest.get_rng().random(detector.shape) - cls.ai = AzimuthalIntegrator(dist=dist, poni1=poni1, poni2=poni2, @@ -886,46 +884,32 @@ def setUpClass(cls): ) def test_limits_normal_units(self): - CONFIGS = [ - { - "unit" : (units.to_unit("q_nm^-1"), units.to_unit("chi_deg")), - "radial_range" : [10,20], - "azimuth_range" : [-30,30], - }, - { - "unit" : (units.to_unit("chi_deg"), units.to_unit("q_nm^-1")), - "radial_range" : [-30,30], - "azimuth_range" : [10,20], - }, - { - "unit" : (units.to_unit("q_A^-1"), units.to_unit("chi_deg")), - "radial_range" : [1,2], - "azimuth_range" : [-30,30], - }, - { - "unit" : (units.to_unit("chi_deg"), units.to_unit("q_A^-1")), - "radial_range" : [-30,30], - "azimuth_range" : [1,2], - }, - { - "unit" : (units.to_unit("q_A^-1"), units.to_unit("chi_rad")), - "radial_range" : [1,2], - "azimuth_range" : [-1,1], - }, - { - "unit" : (units.to_unit("chi_rad"), units.to_unit("q_A^-1")), - "radial_range" : [-1,1], - "azimuth_range" : [1,2], - }, + qnm = units.to_unit("q_nm^-1") + qA = units.to_unit("q_A^-1") + chideg = units.to_unit("chi_deg") + chirad = units.to_unit("chi_rad") + nm_range = [10,20] + A_range = [1,2] + deg_range = [-30,30] + rad_range = [-1,1] + CONFIGS = [{"unit" : (qnm, chideg), "radial_range" : nm_range, "azimuth_range" : deg_range}, + {"unit" : (chideg, qnm), "radial_range" : deg_range, "azimuth_range" : nm_range}, + {"unit" : (qA, chideg), "radial_range" : A_range, "azimuth_range" : deg_range}, + {"unit" : (chideg, qA), "radial_range" : deg_range, "azimuth_range" : A_range}, + {"unit" : (qA, chirad), "radial_range" : A_range, "azimuth_range" : rad_range}, + {"unit" : (chirad, qA), "radial_range" : rad_range, "azimuth_range" : A_range}, + {"unit" : (qA, chideg), "radial_range" : A_range, "azimuth_range" : deg_range}, + {"unit" : (chideg, qA), "radial_range" : deg_range, "azimuth_range" : A_range}, ] - atol = 1e-1 - for config in CONFIGS: - res = self.ai.integrate2d(data=self.data, npt_azim=360, npt_rad=500, **config) - self.assertAlmostEqual(res.radial.min(), config["radial_range"][0], delta=atol) - self.assertAlmostEqual(res.radial.max(), config["radial_range"][1], delta=atol) - self.assertAlmostEqual(res.azimuthal.min(), config["azimuth_range"][0], delta=atol) - self.assertAlmostEqual(res.azimuthal.max(), config["azimuth_range"][1], delta=atol) + for chidisc in (True, False): + self.ai.chiDiscAtPi = chidisc + for config in CONFIGS: + res = self.ai.integrate2d(data=self.data, npt_azim=360, npt_rad=500, **config) + self.assertAlmostEqual(res.radial.min(), config["radial_range"][0], delta=atol) + self.assertAlmostEqual(res.radial.max(), config["radial_range"][1], delta=atol) + self.assertAlmostEqual(res.azimuthal.min(), config["azimuth_range"][0], delta=atol) + self.assertAlmostEqual(res.azimuthal.max(), config["azimuth_range"][1], delta=atol) def test_limits_fiber_units(self): ## TODO next fiber units PR From 608a455b550ae85291db7c0ad41c22ddacacf66d Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Wed, 29 Jan 2025 22:15:42 +0100 Subject: [PATCH 08/10] fix --- src/pyFAI/integrator/azimuthal.py | 14 ++++---------- src/pyFAI/test/test_azimuthal_integrator.py | 15 +++++++-------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/src/pyFAI/integrator/azimuthal.py b/src/pyFAI/integrator/azimuthal.py index d08459aad..72ae8c09c 100644 --- a/src/pyFAI/integrator/azimuthal.py +++ b/src/pyFAI/integrator/azimuthal.py @@ -718,12 +718,6 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, shape = data.shape - if radial_range: - radial_range = tuple([i / pos0_scale for i in radial_range]) - - if azimuth_range: - azimuth_range = tuple([i / pos1_scale for i in azimuth_range]) - error_model = ErrorModel.parse(error_model) if variance is not None: assert variance.size == data.size @@ -741,8 +735,8 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, if azimuth_range[1] <= azimuth_range[0]: azimuth_range = (azimuth_range[0], azimuth_range[1] + 2 * pi) self.check_chi_disc(azimuth_range) - if azimuth_unit.name.split("_")[-1] == "deg": - azimuth_range = [numpy.rad2deg(i) for i in azimuth_range] + elif azimuth_range is not None: + azimuth_range = tuple([i / pos1_scale for i in azimuth_range]) if radial_range is not None and radial_unit.period: if radial_unit.name.split("_")[-1] == "deg": @@ -750,8 +744,8 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, if radial_range[1] <= radial_range[0]: radial_range = (radial_range[0], radial_range[1] + 2 * pi) self.check_chi_disc(radial_range) - if radial_unit.name.split("_")[-1] == "deg": - radial_range = [numpy.rad2deg(i) for i in radial_range] + elif radial_range is not None: + radial_range = tuple([i / pos0_scale for i in radial_range]) if correctSolidAngle: solidangle = self.solidAngleArray(shape, correctSolidAngle) diff --git a/src/pyFAI/test/test_azimuthal_integrator.py b/src/pyFAI/test/test_azimuthal_integrator.py index f4bf07175..a0ccc049e 100644 --- a/src/pyFAI/test/test_azimuthal_integrator.py +++ b/src/pyFAI/test/test_azimuthal_integrator.py @@ -902,14 +902,13 @@ def test_limits_normal_units(self): {"unit" : (chideg, qA), "radial_range" : deg_range, "azimuth_range" : A_range}, ] atol = 1e-1 - for chidisc in (True, False): - self.ai.chiDiscAtPi = chidisc - for config in CONFIGS: - res = self.ai.integrate2d(data=self.data, npt_azim=360, npt_rad=500, **config) - self.assertAlmostEqual(res.radial.min(), config["radial_range"][0], delta=atol) - self.assertAlmostEqual(res.radial.max(), config["radial_range"][1], delta=atol) - self.assertAlmostEqual(res.azimuthal.min(), config["azimuth_range"][0], delta=atol) - self.assertAlmostEqual(res.azimuthal.max(), config["azimuth_range"][1], delta=atol) + self.ai.chiDiscAtPi = True + for config in CONFIGS: + res = self.ai.integrate2d(data=self.data, npt_azim=360, npt_rad=500, **config) + self.assertAlmostEqual(res.radial.min(), config["radial_range"][0], delta=atol) + self.assertAlmostEqual(res.radial.max(), config["radial_range"][1], delta=atol) + self.assertAlmostEqual(res.azimuthal.min(), config["azimuth_range"][0], delta=atol) + self.assertAlmostEqual(res.azimuthal.max(), config["azimuth_range"][1], delta=atol) def test_limits_fiber_units(self): ## TODO next fiber units PR From c785d0a8dac237923b9b17d97cc62e90e0f5c931 Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Thu, 30 Jan 2025 00:31:14 +0100 Subject: [PATCH 09/10] rad2rad --- src/pyFAI/integrator/azimuthal.py | 6 +++++- src/pyFAI/utils/mathutil.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/pyFAI/integrator/azimuthal.py b/src/pyFAI/integrator/azimuthal.py index 72ae8c09c..5ff85390d 100644 --- a/src/pyFAI/integrator/azimuthal.py +++ b/src/pyFAI/integrator/azimuthal.py @@ -42,7 +42,7 @@ from .common import Integrator # from ..geometry import Geometry from .. import units -from ..utils import EPS32, deg2rad, crc32 +from ..utils import EPS32, deg2rad, crc32, rad2rad # from ..utils.decorators import deprecated, deprecated_warning from ..containers import Integrate1dResult, Integrate2dResult, SeparateResult, ErrorModel from ..io import DefaultAiWriter, save_integrate_result @@ -732,6 +732,8 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, if azimuth_range is not None and azimuth_unit.period: if azimuth_unit.name.split("_")[-1] == "deg": azimuth_range = tuple(deg2rad(azimuth_range[i], self.chiDiscAtPi) for i in (0, -1)) + elif azimuth_unit.name.split("_")[-1] == "rad": + azimuth_range = tuple(rad2rad(azimuth_range[i], self.chiDiscAtPi) for i in (0, -1)) if azimuth_range[1] <= azimuth_range[0]: azimuth_range = (azimuth_range[0], azimuth_range[1] + 2 * pi) self.check_chi_disc(azimuth_range) @@ -741,6 +743,8 @@ def integrate2d_ng(self, data, npt_rad, npt_azim=360, if radial_range is not None and radial_unit.period: if radial_unit.name.split("_")[-1] == "deg": radial_range = tuple(deg2rad(radial_range[i], self.chiDiscAtPi) for i in (0, -1)) + elif azimuth_unit.name.split("_")[-1] == "rad": + azimuth_range = tuple(rad2rad(azimuth_range[i], self.chiDiscAtPi) for i in (0, -1)) if radial_range[1] <= radial_range[0]: radial_range = (radial_range[0], radial_range[1] + 2 * pi) self.check_chi_disc(radial_range) diff --git a/src/pyFAI/utils/mathutil.py b/src/pyFAI/utils/mathutil.py index e1c00e7e8..909471bc7 100644 --- a/src/pyFAI/utils/mathutil.py +++ b/src/pyFAI/utils/mathutil.py @@ -69,6 +69,16 @@ def deg2rad(dd, disc=1): rp -= 2.0 return rp * math.pi +def rad2rad(r, disc=1): + """ + + """ + # Set r between (0,2pi) + r = r % (2*math.pi) + if disc: + if r > math.pi: + r = r - 2 * math.pi + return r def expand2d(vect, size2, vertical=True): """ From 088c328e7bd804dc83b8cb7ab96cd425fb9a2db9 Mon Sep 17 00:00:00 2001 From: edgar1993a Date: Thu, 30 Jan 2025 09:10:06 +0100 Subject: [PATCH 10/10] doc --- src/pyFAI/utils/mathutil.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pyFAI/utils/mathutil.py b/src/pyFAI/utils/mathutil.py index 909471bc7..cbe1f9ef5 100644 --- a/src/pyFAI/utils/mathutil.py +++ b/src/pyFAI/utils/mathutil.py @@ -71,7 +71,10 @@ def deg2rad(dd, disc=1): def rad2rad(r, disc=1): """ + Transform radians in the range [-π->π[ or [0->2π[ + :param r: angle in radians + :return: angle in radians in the selected range """ # Set r between (0,2pi) r = r % (2*math.pi)