diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index 66284ef..8550eef 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -1,7 +1,7 @@ import numpy as np import xarray as xr -def central_difference(S, num_records=None): +def central_difference(S, num_records=None, normalize=True): """ Compute fourth order derivative S'(t) using the @@ -20,6 +20,9 @@ def central_difference(S, num_records=None): num_records: int or None Only process first num_records datapoints. Set to None to process all records. + normalize: bool + If True, normalize the derivative by the scattering signal + S(t) to get (1/S) * dS/dt. Returns ------- @@ -52,6 +55,12 @@ def central_difference(S, num_records=None): d[:, n-2] = (25*y[:, n-2] - 48*y[:, n-3] + 36*y[:, n-4] - 16*y[:, n-5] + 3*y[:, n-6]) / (12*dt) d[:, n-1] = (25*y[:, n-1] - 48*y[:, n-2] + 36*y[:, n-3] - 16*y[:, n-4] + 3*y[:, n-5]) / (12*dt) + if normalize: + with np.errstate(divide='ignore', invalid='ignore'): + d = np.where(y != 0, d / y, 0) + else: + d = d + dSdt[ch] = xr.DataArray( d, dims=('event_index', 'time'), diff --git a/tests/test_ndm.py b/tests/test_ndm.py index 8867890..d5a8e3c 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -5,7 +5,7 @@ def test_central_difference(): my_sp2b = pysp2.io.read_sp2(pysp2.testing.EXAMPLE_SP2B) my_ini = pysp2.io.read_config(pysp2.testing.EXAMPLE_INI) my_binary = pysp2.util.gaussian_fit(my_sp2b, my_ini, parallel=False) - dSdt = pysp2.util.central_difference(my_binary) + dSdt = pysp2.util.central_difference(my_binary, normalize=False) np.testing.assert_almost_equal(dSdt['Data_ch4'].isel(event_index=5876, time=0).item(), 8.3333333333e6, decimal=2) @@ -13,4 +13,12 @@ def test_central_difference(): 7.166666666e7, decimal=2) np.testing.assert_almost_equal(dSdt['Data_ch4'].isel(event_index=5876, time=19).item(), 1.5e7, decimal=2) - assert np.isfinite(dSdt).all() \ No newline at end of file + assert np.isfinite(dSdt).all() + + dSdt_norm = pysp2.util.central_difference(my_binary, normalize=True) + np.testing.assert_almost_equal(dSdt_norm['Data_ch4'].isel(event_index=5876, time=0).item(), + 8.3333333333e6/-30168, decimal=2) + np.testing.assert_almost_equal(dSdt_norm['Data_ch4'].isel(event_index=5876, time=99).item(), + 7.166666666e7/-30152, decimal=2) + np.testing.assert_almost_equal(dSdt_norm['Data_ch4'].isel(event_index=5876, time=19).item(), + 1.5e7/-30132, decimal=2) \ No newline at end of file