From 3d964dabbb35b7b826f6018c604ca0036d1fc95a Mon Sep 17 00:00:00 2001 From: Daniel Hellfeld Date: Wed, 21 Jul 2021 15:04:56 -0700 Subject: [PATCH 1/4] Implement a square root binning function --- becquerel/core/utils.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/becquerel/core/utils.py b/becquerel/core/utils.py index 69d072f3..9ba2d106 100644 --- a/becquerel/core/utils.py +++ b/becquerel/core/utils.py @@ -124,3 +124,18 @@ def bin_centers_from_edges(edges_kev): edges_kev = np.array(edges_kev) centers_kev = (edges_kev[:-1] + edges_kev[1:]) / 2 return centers_kev + + +def sqrt_bins(bin_min, bin_max, nbins): + """ + Square root binning + + Args: + bin_min (float): Minimum bin edge (must be greater than 0) + bin_max (float): Maximum bin edge (must be greater than bin_min) + nbins (int): Number of bins + + Returns: + np.array of bin edges (length = nbins + 1) + """ + return np.linspace(np.sqrt(bin_min), np.sqrt(bin_max), nbins + 1) ** 2 From 34bdf4ad1f3fb217bfe35d7b39a205df76fcd45c Mon Sep 17 00:00:00 2001 From: Daniel Hellfeld Date: Wed, 21 Jul 2021 15:15:47 -0700 Subject: [PATCH 2/4] Add edge to args to be more explicit --- becquerel/core/utils.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/becquerel/core/utils.py b/becquerel/core/utils.py index 9ba2d106..03fb4551 100644 --- a/becquerel/core/utils.py +++ b/becquerel/core/utils.py @@ -126,16 +126,16 @@ def bin_centers_from_edges(edges_kev): return centers_kev -def sqrt_bins(bin_min, bin_max, nbins): +def sqrt_bins(bin_edge_min, bin_edge_max, nbins): """ Square root binning Args: - bin_min (float): Minimum bin edge (must be greater than 0) - bin_max (float): Maximum bin edge (must be greater than bin_min) + bin_edge_min (float): Minimum bin edge (must be greater than 0) + bin_edge_max (float): Maximum bin edge (must be greater than bin_min) nbins (int): Number of bins Returns: np.array of bin edges (length = nbins + 1) """ - return np.linspace(np.sqrt(bin_min), np.sqrt(bin_max), nbins + 1) ** 2 + return np.linspace(np.sqrt(bin_edge_min), np.sqrt(bin_edge_max), nbins + 1) ** 2 From 02a1eecd67bfcb868da8f93d747f10367adb6fa9 Mon Sep 17 00:00:00 2001 From: Daniel Hellfeld Date: Wed, 21 Jul 2021 15:24:20 -0700 Subject: [PATCH 3/4] Update doc, add asserts --- becquerel/core/utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/becquerel/core/utils.py b/becquerel/core/utils.py index 03fb4551..9ceb23f0 100644 --- a/becquerel/core/utils.py +++ b/becquerel/core/utils.py @@ -131,11 +131,13 @@ def sqrt_bins(bin_edge_min, bin_edge_max, nbins): Square root binning Args: - bin_edge_min (float): Minimum bin edge (must be greater than 0) + bin_edge_min (float): Minimum bin edge (must be >= 0) bin_edge_max (float): Maximum bin edge (must be greater than bin_min) nbins (int): Number of bins Returns: np.array of bin edges (length = nbins + 1) """ + assert bin_edge_min >= 0 + assert bin_edge_max > bin_edge_min return np.linspace(np.sqrt(bin_edge_min), np.sqrt(bin_edge_max), nbins + 1) ** 2 From 3c3446e0ee5c5f3d1a933451e8c701bd14f9db60 Mon Sep 17 00:00:00 2001 From: Daniel Hellfeld Date: Fri, 23 Jul 2021 16:33:57 -0700 Subject: [PATCH 4/4] Add test --- tests/test_utils.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 tests/test_utils.py diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 00000000..ab4b7ba2 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,28 @@ +import pytest +import numpy as np +import becquerel as bq + + +# ---------------------------------------------- +# Test utils +# ---------------------------------------------- + + +def test_sqrt_bins(): + """Test basic functionality of utils.sqrt_bins.""" + edge_min = 0 + edge_max = 3000 + n_bins = 128 + be = bq.utils.sqrt_bins(edge_min, edge_max, n_bins) + bc = (be[1:] + be[:-1]) / 2 + bw = np.diff(be) + # compute slope of line + m = np.diff(bw ** 2) / np.diff(bc) + # assert that the square of the bin + assert np.allclose(m[0], m) + # negative edge_min + with pytest.raises(AssertionError): + be = bq.utils.sqrt_bins(-10, edge_max, n_bins) + # edge_max < edge_min + with pytest.raises(AssertionError): + be = bq.utils.sqrt_bins(100, 50, n_bins)