From a0e49c1fff7a768bab5320dc584cbd17e1299aaa Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Wed, 8 Apr 2026 17:50:03 -0400 Subject: [PATCH 1/6] added new function to compute statistical distance --- pysp2/util/normalized_derivative_method.py | 296 +++++++++++++++++++++ tests/test_ndm.py | 13 +- 2 files changed, 308 insertions(+), 1 deletion(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index b7622ca..0920826 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -445,3 +445,299 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr "units": "sample_index_or_time_units_of_t", }, ) + +def _to_dataarray( + obj: Union[xr.DataArray, xr.Dataset], + name: str, + ch: Optional[str] = None, +) -> xr.DataArray: + """ + Convert a DataArray/Dataset to a DataArray. + + If a Dataset is supplied: + - use `ch` if provided + - otherwise accept only a single-variable Dataset + """ + if isinstance(obj, xr.DataArray): + return obj + + if isinstance(obj, xr.Dataset): + if ch is not None: + if ch not in obj.data_vars: + raise ValueError( + f"{ch!r} not found in {name}.data_vars={list(obj.data_vars)}" + ) + return obj[ch] + + if len(obj.data_vars) == 1: + only_var = next(iter(obj.data_vars)) + return obj[only_var] + + raise ValueError( + f"{name} is a Dataset with multiple variables. " + f"Provide ch. Available: {list(obj.data_vars)}" + ) + + raise TypeError(f"{name} must be an xarray DataArray or Dataset.") + + +def _moteki_kondo_subset_statistics( + yk: np.ndarray, + sk: np.ndarray, + tk: np.ndarray, + tau: float, + *, + h: float, + sigma_bar: float, + delta_sigma: float, + A1: float, + A2: float, + A3: float, +) -> tuple[Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray], Optional[float]]: + """ + Internal shared helper for Moteki & Kondo Appendix A. + + Returns + ------- + ybar : np.ndarray + Mean vector [Eq. (A.4)]. + Sigma : np.ndarray + Covariance matrix [Eqs. (A.10a), (A.10b)]. + L : np.ndarray or None + Cholesky factor of Sigma, if Sigma is positive definite. + d2 : float or None + Statistical distance squared [Eq. (A.11)]. + """ + # Mean vector of S'/S under a Gaussian beam: + # ybar_i(tau) = -(t_i - tau) / sigma_bar^2 [Eq. (A.4)] + ybar = -(tk - tau) / (sigma_bar * sigma_bar) + + # Signal-noise amplitude: + # delta S_i = sqrt(A1^2 + A2^2 S_i + A3^2 S_i^2) [Eq. (A.6)] + deltaS = np.sqrt(A1 * A1 + (A2 * A2) * sk + (A3 * A3) * (sk * sk)) + + # Random variance in y = S'/S from finite-difference error propagation: + # (delta y_i)_ran = Af_d * (1/h) * (1/S_i) * deltaS_i [Eq. (A.7)] + Af_d = np.sqrt(130.0) / 12.0 + with np.errstate(divide="ignore", invalid="ignore"): + var_rand_k = (Af_d * Af_d) / (h * h) * (deltaS * deltaS) / (sk * sk) + + if not np.all(np.isfinite(var_rand_k)): + return None, None, None, None + if np.any(var_rand_k <= 0): + return None, None, None, None + + # Systematic covariance from particle-by-particle fluctuation in sigma: + # Cov[y_i, y_j] = 4/sigma_bar^6 * (t_i - tau)(t_j - tau) * delta_sigma^2 [Eq. (A.10a)] + # Var[y_i] = 4/sigma_bar^6 * (t_i - tau)^2 * delta_sigma^2 + random term [Eq. (A.10b)] + dt = (tk - tau).reshape(-1, 1) + sys_pref = 4.0 * (delta_sigma * delta_sigma) / (sigma_bar ** 6) + Sigma = sys_pref * (dt @ dt.T) + + # Add the diagonal random variance term [Eq. (A.10b)]. + Sigma[np.diag_indices_from(Sigma)] += var_rand_k + + # Residual vector. + r = yk - ybar + + # Cholesky factorization for stable evaluation of the multivariate Gaussian. + try: + L = np.linalg.cholesky(Sigma) + except np.linalg.LinAlgError: + return ybar, Sigma, None, None + + # Statistical distance: + # d^2(k) = (y_k - ybar_k)^T Sigma_k^{-1} (y_k - ybar_k) [Eq. (A.11)] + z = np.linalg.solve(L, r) + d2 = float(z.T @ z) + + return ybar, Sigma, L, d2 + + +def compute_d2_moteki_kondo( + S: Union[xr.DataArray, xr.Dataset], + norm_deriv: Union[xr.DataArray, xr.Dataset], + tau_hat: Union[np.ndarray, xr.DataArray], + p: int, + *, + ch: Optional[str] = None, + event_index: int, + event_dim: str = "event_index", + S_sample_dim: Optional[str] = None, + y_sample_dim: Optional[str] = None, + k_end: Optional[int] = None, + config: Optional[MLEConfig] = None, +) -> xr.DataArray: + """ + Compute d^2(k) for one selected event using the Moteki & Kondo statistical distance. + + This is the quantity used to quantify how well each k-subset matches the expected + I'/I line segment [Eq. (A.11)], and it is the same statistic used in Appendix A.5 + for judging candidate sub-arrays against the chi-square reference distribution. + + Parameters + ---------- + S : xr.DataArray or xr.Dataset + Scattering signal S(t). + norm_deriv : xr.DataArray or xr.Dataset + Normalized derivative S'(t)/S(t). + tau_hat : 1D array-like or xr.DataArray + tau_hat(k) for the selected event. Must have length k_end + 1. + p : int + Number of consecutive points in each k-subset. + ch : str, optional + Variable name to select when S and/or norm_deriv are Datasets. + event_index : int + Event index to evaluate. + event_dim : str + Name of the event dimension. + S_sample_dim : str, optional + Sample dimension in S. + y_sample_dim : str, optional + Sample dimension in norm_deriv. + k_end : int, optional + Largest starting k. If None, inferred from tau_hat length. + config : MLEConfig + Calibration / noise / grid settings. + + Returns + ------- + xr.DataArray + d^2(k) for the selected event, with dimension k. + """ + if config is None: + raise ValueError("config must be provided.") + + # Convert Datasets to DataArrays if needed. + S = _to_dataarray(S, "S", ch=ch) + norm_deriv = _to_dataarray(norm_deriv, "norm_deriv", ch=ch) + + # Require the event dimension. + if event_dim not in S.dims: + raise ValueError(f"{event_dim!r} not found in S.dims={S.dims}") + if event_dim not in norm_deriv.dims: + raise ValueError(f"{event_dim!r} not found in norm_deriv.dims={norm_deriv.dims}") + + # Infer sample dimensions if not provided. + if S_sample_dim is None: + s_non_event_dims = [d for d in S.dims if d != event_dim] + if len(s_non_event_dims) != 1: + raise ValueError( + f"Could not infer S sample dim. Non-event dims in S: {s_non_event_dims}" + ) + S_sample_dim = s_non_event_dims[0] + + if y_sample_dim is None: + y_non_event_dims = [d for d in norm_deriv.dims if d != event_dim] + if len(y_non_event_dims) != 1: + raise ValueError( + f"Could not infer norm_deriv sample dim. Non-event dims in norm_deriv: {y_non_event_dims}" + ) + y_sample_dim = y_non_event_dims[0] + + # Rename to common internal sample dimension. + S_std = S.rename({S_sample_dim: "sample"}) + y_std = norm_deriv.rename({y_sample_dim: "sample"}) + + # Align on common coordinates. + S_std, y_std = xr.align(S_std, y_std, join="inner") + + if event_index < 0 or event_index >= S_std.sizes[event_dim]: + raise ValueError( + f"event_index must be in [0, {S_std.sizes[event_dim] - 1}], got {event_index}" + ) + + n_samples = S_std.sizes["sample"] + if p < 2 or p > n_samples: + raise ValueError(f"p must be in [2, {n_samples}], got {p}") + + # Tau-hat is expected to be a vector over k. + tau_hat_np = np.asarray( + tau_hat.data if isinstance(tau_hat, xr.DataArray) else tau_hat, + dtype=float, + ) + if tau_hat_np.ndim != 1: + raise ValueError("tau_hat must be 1D.") + + if k_end is None: + k_end = tau_hat_np.size - 1 + if k_end < 0: + raise ValueError(f"k_end must be >= 0, got {k_end}") + if tau_hat_np.size != k_end + 1: + raise ValueError( + f"tau_hat length must equal k_end + 1. Got len(tau_hat)={tau_hat_np.size}, " + f"k_end={k_end}." + ) + if k_end > n_samples - p: + raise ValueError(f"k_end must be in [0, {n_samples - p}], got {k_end}") + + # Parameters from Appendix A. + h = float(config.h) + sigma_bar = float(config.sigma_bar) + delta_sigma = float(config.delta_sigma) + A1, A2, A3 = float(config.A1), float(config.A2), float(config.A3) + + if h <= 0: + raise ValueError("config.h must be positive.") + if sigma_bar <= 0: + raise ValueError("config.sigma_bar must be positive.") + if delta_sigma < 0: + raise ValueError("config.delta_sigma must be >= 0.") + + # Time axis used in the fit. + # This should match the time axis used in mle_tau_moteki_kondo. + t = np.arange(n_samples, dtype=float) * h + + # Select the requested event only. + s_event = np.asarray(S_std.sel({event_dim: event_index}).values, dtype=float) + y_event = np.asarray(y_std.sel({event_dim: event_index}).values, dtype=float) + + if not (np.all(np.isfinite(s_event)) and np.all(np.isfinite(y_event))): + raise ValueError(f"Selected event_index={event_index} contains non-finite values.") + + d2_vals = np.full(k_end + 1, np.nan, dtype=float) + + for k in range(k_end + 1): + # Consecutive p-point subset starting at k, exactly as in the tau_hat search. + yk = y_event[k : k + p] + sk = s_event[k : k + p] + tk = t[k : k + p] + + if not (np.all(np.isfinite(yk)) and np.all(np.isfinite(sk))): + continue + + tau_k = float(tau_hat_np[k]) + if not np.isfinite(tau_k): + continue + + # Build the subset mean/covariance using the same equations as the MLE. + # Mean: Eq. (A.4) + # Covariance: Eqs. (A.10a), (A.10b) + # Statistical distance: Eq. (A.11) + _, _, _, d2 = _moteki_kondo_subset_statistics( + yk, + sk, + tk, + tau_k, + h=h, + sigma_bar=sigma_bar, + delta_sigma=delta_sigma, + A1=A1, + A2=A2, + A3=A3, + ) + + if d2 is not None and np.isfinite(d2): + d2_vals[k] = d2 + + out = xr.DataArray( + d2_vals, + dims=("k",), + coords={"k": np.arange(k_end + 1)}, + name="d2", + attrs={ + "long_name": f"Moteki & Kondo statistical distance d^2(k) for event_index={event_index}", + "units": "dimensionless", + }, + ) + return out \ No newline at end of file diff --git a/tests/test_ndm.py b/tests/test_ndm.py index 9e5d41a..c18a663 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -2,7 +2,7 @@ import numpy as np np.set_printoptions(threshold=np.inf) -from pysp2.util.normalized_derivative_method import MLEConfig, mle_tau_moteki_kondo +from pysp2.util.normalized_derivative_method import MLEConfig, mle_tau_moteki_kondo, compute_d2_moteki_kondo def test_central_difference(): my_sp2b = pysp2.io.read_sp2(pysp2.testing.EXAMPLE_SP2B) @@ -54,6 +54,17 @@ def test_mle_estimate_tau(): # Test that the estimated tau for a subset of results is close to the true value for the event for i in range(21, 37): np.testing.assert_almost_equal(tau[i], tau_val, decimal=6) + + d2 = compute_d2_moteki_kondo( + S=my_binary, + norm_deriv=dSdt, + tau_hat=tau, + p=21, + ch="Data_ch0", + event_index=499, + config=cfg, + ) + print(d2) ## Test another event tau = mle_tau_moteki_kondo( From eb72068671a30b178ba8299ccf3a43cb8887606d Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Thu, 9 Apr 2026 16:54:50 -0400 Subject: [PATCH 2/6] modified tau function to incorporate helper functions --- pysp2/util/normalized_derivative_method.py | 346 +++++++++------------ 1 file changed, 143 insertions(+), 203 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index 0920826..3aead48 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -171,6 +171,106 @@ class MLEConfig: grid_size: int = 401 grid_margin: float = 0.5 +def _to_dataarray( + obj: Union[xr.DataArray, xr.Dataset], + name: str, + ch: Optional[str] = None, +) -> xr.DataArray: + """ + Accept either a DataArray or Dataset. + If a Dataset is provided, select the variable named `ch`. + """ + if isinstance(obj, xr.DataArray): + return obj + + if isinstance(obj, xr.Dataset): + if ch is not None: + # Use the user input channel. + if ch not in obj.data_vars: + raise ValueError( + f"{ch!r} not found in {name}.data_vars={list(obj.data_vars)}" + ) + return obj[ch] + + if len(obj.data_vars) == 1: + only_var = next(iter(obj.data_vars)) + return obj[only_var] + + raise ValueError( + f"{name} is a Dataset with multiple variables. " + f"Provide ch. Available: {list(obj.data_vars)}" + ) + + raise TypeError(f"{name} must be an xarray DataArray or Dataset.") + + +def _moteki_kondo_subset_statistics( + yk: np.ndarray, + sk: np.ndarray, + tk: np.ndarray, + tau: float, + *, + h: float, + sigma_bar: float, + delta_sigma: float, + A1: float, + A2: float, + A3: float, +) -> tuple[Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray], Optional[float]]: + """ + Shared Moteki & Kondo subset statistics. + + Returns + ------- + ybar : np.ndarray + Mean vector [Eq. (A.4)]. + Sigma : np.ndarray + Covariance matrix [Eqs. (A.10a), (A.10b)]. + L : np.ndarray or None + Cholesky factor of Sigma, if Sigma is positive definite. + d2 : float or None + Statistical distance squared [Eq. (A.11)]. + """ + # Mean vector of the normalized derivative under the Gaussian beam model. + # Eq. (A.4): ybar_i(tau) = -(t_i - tau) / sigma_bar^2 + ybar = -(tk - tau) / (sigma_bar * sigma_bar) + + # Signal-noise amplitude from Appendix A. + # Eq. (A.6): deltaS_i = sqrt(A1^2 + A2^2 S_i + A3^2 S_i^2) + deltaS = np.sqrt(A1 * A1 + (A2 * A2) * sk + (A3 * A3) * (sk * sk)) + + # Random variance in y = S'/S from finite-difference error propagation. + # Eq. (A.7): (delta y_i)_ran = Af_d * (1/h) * (1/S_i) * deltaS_i + Af_d = np.sqrt(130.0) / 12.0 + with np.errstate(divide="ignore", invalid="ignore"): + var_rand_k = (Af_d * Af_d) / (h * h) * (deltaS * deltaS) / (sk * sk) + + if not np.all(np.isfinite(var_rand_k)): + return None, None, None, None + if np.any(var_rand_k <= 0): + return None, None, None, None + + # Systematic covariance from particle-by-particle fluctuations in sigma. + # Eq. (A.10a): Cov[y_i, y_j] = 4/sigma_bar^6 * (t_i - tau)(t_j - tau) * delta_sigma^2 + # Eq. (A.10b): Var[y_i] adds the random variance term above. + dt = (tk - tau).reshape(-1, 1) + sys_pref = 4.0 * (delta_sigma * delta_sigma) / (sigma_bar ** 6) + Sigma = sys_pref * (dt @ dt.T) + Sigma[np.diag_indices_from(Sigma)] += var_rand_k + + r = yk - ybar + + try: + L = np.linalg.cholesky(Sigma) + except np.linalg.LinAlgError: + return ybar, Sigma, None, None + + # Eq. (A.11): d^2 = (y - ybar)^T Sigma^{-1} (y - ybar) + z = np.linalg.solve(L, r) + d2 = float(z.T @ z) + + return ybar, Sigma, L, d2 + def mle_tau_moteki_kondo( S: Union[xr.DataArray, xr.Dataset], norm_deriv: Union[xr.DataArray, xr.Dataset], @@ -217,33 +317,9 @@ def mle_tau_moteki_kondo( if config is None: raise ValueError("config must be provided.") - def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArray: - """ - Accept either a DataArray or Dataset. - If a Dataset is provided, select the variable named `ch`. - """ - if isinstance(obj, xr.DataArray): - return obj - if isinstance(obj, xr.Dataset): - if ch is not None: - # Use the user input channel. - if ch not in obj.data_vars: - raise ValueError( - f"{ch!r} not found in {name}.data_vars={list(obj.data_vars)}" - ) - return obj[ch] - if len(obj.data_vars) == 1: - only_var = next(iter(obj.data_vars)) - return obj[only_var] - raise ValueError( - f"{name} is a Dataset with multiple variables. " - f"Provide ch. Available: {list(obj.data_vars)}" - ) - raise TypeError(f"{name} must be an xarray DataArray or Dataset.") - # Convert datasets to the selected DataArrays. - S = _to_dataarray(S, "S") - norm_deriv = _to_dataarray(norm_deriv, "norm_deriv") + S = _to_dataarray(S, "S", ch=ch) + norm_deriv = _to_dataarray(norm_deriv, "norm_deriv", ch=ch) # The method requires one event axis and one sample axis. if event_dim not in S.dims: @@ -291,7 +367,7 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr raise ValueError(f"k_end must be in [0, {n_samples - p}], got {k_end}") # Optional tau grid for the 1D grid search in tau. - # Moteki & Kondo determine tau numerically by maximizing L_k(tau). + # Moteki & Kondo determine tau numerically by maximizing L_k(tau) [Appendix A.5]. if tau_grid is not None: tau_grid_np = np.asarray( tau_grid.data if isinstance(tau_grid, xr.DataArray) else tau_grid, @@ -311,7 +387,7 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr # Time axis used in the fit. # Here we use physical time spacing h so tk is in seconds (or whatever unit h uses). # This must match sigma_bar and delta_sigma units. - t = np.arange(n_samples) * h + t = np.arange(n_samples, dtype=float) * h if h <= 0: raise ValueError("config.h must be positive.") @@ -320,72 +396,6 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr if delta_sigma < 0: raise ValueError("config.delta_sigma must be >= 0.") - # Eq. (A.7): finite-difference amplification factor for the derivative noise. - Af_d = np.sqrt(130.0) / 12.0 - - def _logL_for_tau(yk: np.ndarray, sk: np.ndarray, tk: np.ndarray, tau: float) -> float: - """ - Log-likelihood for one k-subset and one candidate tau. - - Mean model: - ybar_i(tau) = -(t_i - tau) / sigma_bar^2 [Eq. (A.4)] - where y_i = S'_i / S_i. - - Covariance: - Cov[y_i, y_j] = 4 / sigma_bar^6 * (t_i - tau)(t_j - tau) * (delta_sigma)^2 [Eq. (A.10a)] - Var[y_i] = 4 / sigma_bar^6 * (t_i - tau)^2 * (delta_sigma)^2 - + (Af_d^2 / h^2) * (1/S_i^2) * (delta S_i)^2 [Eq. (A.10b)] - with - delta S_i = sqrt(A1^2 + A2^2 S_i + A3^2 S_i^2) [Eq. (A.6)] - and - (delta y_i)_ran = Af_d * (1/h) * (1/S_i) * delta S_i [Eq. (A.7)] - - The full likelihood is the multivariate Gaussian in Eq. (A.9). - """ - # Mean vector of the normalized derivative under the Gaussian beam model. - # This is the line I'/I = -(t - tau)/sigma^2 [Eq. (5)] used as the mean [Eq. (A.4)]. - ybar = -(tk - tau) / (sigma_bar * sigma_bar) - - # Signal-noise amplitude from Appendix A [Eq. (A.6)]. - deltaS = np.sqrt(A1 * A1 + (A2 * A2) * sk + (A3 * A3) * (sk * sk)) - - # Random variance of y = S'/S from finite-difference error propagation [Eq. (A.7)]. - with np.errstate(divide="ignore", invalid="ignore"): - var_rand_k = (Af_d * Af_d) / (h * h) * (deltaS * deltaS) / (sk * sk) - - # If any term is non-finite, this tau candidate is unusable. - if not np.all(np.isfinite(var_rand_k)): - return -np.inf - if np.any(var_rand_k <= 0): - return -np.inf - - # Systematic covariance from particle-by-particle fluctuations in sigma [Eq. (A.10a)]. - dt = (tk - tau).reshape(-1, 1) - sys_pref = 4.0 * (delta_sigma * delta_sigma) / (sigma_bar ** 6) - Sigma = sys_pref * (dt @ dt.T) - # Add the diagonal random variance term [Eq. (A.10b)]. - Sigma[np.diag_indices_from(Sigma)] += var_rand_k - - # Residual vector y - ybar. - r = yk - ybar - - # Use Cholesky factorization for numerical stability when evaluating Eq. (A.9). - try: - L = np.linalg.cholesky(Sigma) - except np.linalg.LinAlgError: - return -np.inf - - # Compute statistical distance. - # d^2 = (y - ybar)^T Sigma^{-1} (y - ybar) [Eq. (A.11)] - z = np.linalg.solve(L, r) - d2 = float(z.T @ z) - # log |Sigma| from the Cholesky factor. - logdet = 2.0 * np.sum(np.log(np.diag(L))) - - # Multivariate normal log-likelihood [Eq. (A.9)]. - p_local = yk.size - return float(-0.5 * (p_local * np.log(2.0 * np.pi) + logdet + d2)) - def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarray: """ For one event, scan all k-subsets of length p and return tau_hat(k). @@ -419,7 +429,45 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr best_ll = -np.inf best_tau = np.nan for tau_cand in grid: - ll = _logL_for_tau(yk, sk, tk, float(tau_cand)) + _, _, _, d2 = _moteki_kondo_subset_statistics( + yk, + sk, + tk, + float(tau_cand), + h=h, + sigma_bar=sigma_bar, + delta_sigma=delta_sigma, + A1=A1, + A2=A2, + A3=A3, + ) + + if d2 is None: + ll = -np.inf + else: + # Reconstruct the log-likelihood from the same subset statistics. + # Eq. (A.9): log L = -1/2 * [p log(2pi) + log|Sigma| + d^2] + # Since _moteki_kondo_subset_statistics does not return log|Sigma|, + # we compute likelihood separately here for the grid-search step. + ybar, Sigma, L, d2 = _moteki_kondo_subset_statistics( + yk, + sk, + tk, + float(tau_cand), + h=h, + sigma_bar=sigma_bar, + delta_sigma=delta_sigma, + A1=A1, + A2=A2, + A3=A3, + ) + if L is None or d2 is None: + ll = -np.inf + else: + logdet = 2.0 * np.sum(np.log(np.diag(L))) + p_local = yk.size + ll = float(-0.5 * (p_local * np.log(2.0 * np.pi) + logdet + d2)) + if ll > best_ll: best_ll = ll best_tau = float(tau_cand) @@ -446,114 +494,6 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr }, ) -def _to_dataarray( - obj: Union[xr.DataArray, xr.Dataset], - name: str, - ch: Optional[str] = None, -) -> xr.DataArray: - """ - Convert a DataArray/Dataset to a DataArray. - - If a Dataset is supplied: - - use `ch` if provided - - otherwise accept only a single-variable Dataset - """ - if isinstance(obj, xr.DataArray): - return obj - - if isinstance(obj, xr.Dataset): - if ch is not None: - if ch not in obj.data_vars: - raise ValueError( - f"{ch!r} not found in {name}.data_vars={list(obj.data_vars)}" - ) - return obj[ch] - - if len(obj.data_vars) == 1: - only_var = next(iter(obj.data_vars)) - return obj[only_var] - - raise ValueError( - f"{name} is a Dataset with multiple variables. " - f"Provide ch. Available: {list(obj.data_vars)}" - ) - - raise TypeError(f"{name} must be an xarray DataArray or Dataset.") - - -def _moteki_kondo_subset_statistics( - yk: np.ndarray, - sk: np.ndarray, - tk: np.ndarray, - tau: float, - *, - h: float, - sigma_bar: float, - delta_sigma: float, - A1: float, - A2: float, - A3: float, -) -> tuple[Optional[np.ndarray], Optional[np.ndarray], Optional[np.ndarray], Optional[float]]: - """ - Internal shared helper for Moteki & Kondo Appendix A. - - Returns - ------- - ybar : np.ndarray - Mean vector [Eq. (A.4)]. - Sigma : np.ndarray - Covariance matrix [Eqs. (A.10a), (A.10b)]. - L : np.ndarray or None - Cholesky factor of Sigma, if Sigma is positive definite. - d2 : float or None - Statistical distance squared [Eq. (A.11)]. - """ - # Mean vector of S'/S under a Gaussian beam: - # ybar_i(tau) = -(t_i - tau) / sigma_bar^2 [Eq. (A.4)] - ybar = -(tk - tau) / (sigma_bar * sigma_bar) - - # Signal-noise amplitude: - # delta S_i = sqrt(A1^2 + A2^2 S_i + A3^2 S_i^2) [Eq. (A.6)] - deltaS = np.sqrt(A1 * A1 + (A2 * A2) * sk + (A3 * A3) * (sk * sk)) - - # Random variance in y = S'/S from finite-difference error propagation: - # (delta y_i)_ran = Af_d * (1/h) * (1/S_i) * deltaS_i [Eq. (A.7)] - Af_d = np.sqrt(130.0) / 12.0 - with np.errstate(divide="ignore", invalid="ignore"): - var_rand_k = (Af_d * Af_d) / (h * h) * (deltaS * deltaS) / (sk * sk) - - if not np.all(np.isfinite(var_rand_k)): - return None, None, None, None - if np.any(var_rand_k <= 0): - return None, None, None, None - - # Systematic covariance from particle-by-particle fluctuation in sigma: - # Cov[y_i, y_j] = 4/sigma_bar^6 * (t_i - tau)(t_j - tau) * delta_sigma^2 [Eq. (A.10a)] - # Var[y_i] = 4/sigma_bar^6 * (t_i - tau)^2 * delta_sigma^2 + random term [Eq. (A.10b)] - dt = (tk - tau).reshape(-1, 1) - sys_pref = 4.0 * (delta_sigma * delta_sigma) / (sigma_bar ** 6) - Sigma = sys_pref * (dt @ dt.T) - - # Add the diagonal random variance term [Eq. (A.10b)]. - Sigma[np.diag_indices_from(Sigma)] += var_rand_k - - # Residual vector. - r = yk - ybar - - # Cholesky factorization for stable evaluation of the multivariate Gaussian. - try: - L = np.linalg.cholesky(Sigma) - except np.linalg.LinAlgError: - return ybar, Sigma, None, None - - # Statistical distance: - # d^2(k) = (y_k - ybar_k)^T Sigma_k^{-1} (y_k - ybar_k) [Eq. (A.11)] - z = np.linalg.solve(L, r) - d2 = float(z.T @ z) - - return ybar, Sigma, L, d2 - - def compute_d2_moteki_kondo( S: Union[xr.DataArray, xr.Dataset], norm_deriv: Union[xr.DataArray, xr.Dataset], From e7c9b718f93e748fdf381fb85326cd3633cb68b3 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Fri, 10 Apr 2026 15:42:55 -0400 Subject: [PATCH 3/6] statistical distance tests --- tests/test_ndm.py | 51 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 9 deletions(-) diff --git a/tests/test_ndm.py b/tests/test_ndm.py index c18a663..0a90a92 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -30,12 +30,12 @@ def test_mle_estimate_tau(): 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, baseline_to_zero=True) - dSdt = pysp2.util.central_difference(my_binary, normalize=False, baseline_to_zero=True) + dSdt = pysp2.util.central_difference(my_binary, normalize=True, baseline_to_zero=True) cfg = MLEConfig( h=0.4e-6, # example: 0.4 microseconds - sigma_bar=26.28*0.4e-6, # example; use your measured average width - delta_sigma=1.2*0.4e-6,# example; use your measured width std dev + sigma_bar= 16.6*0.4e-6, # example; use your measured average width + delta_sigma=1.2*0.4e-6, # example; use your measured width std dev A1=0.37, A2=1.6e-2, A3=6.2e-4, @@ -45,32 +45,47 @@ def test_mle_estimate_tau(): tau = mle_tau_moteki_kondo( S=my_binary, norm_deriv=dSdt, - p=21, + p=10, ch="Data_ch0", event_index=499, config=cfg, ) tau_val = my_binary['Data_ch0'].isel(event_index=499).argmax().item()*0.4e-6 # Test that the estimated tau for a subset of results is close to the true value for the event - for i in range(21, 37): + for i in range(25, 34): np.testing.assert_almost_equal(tau[i], tau_val, decimal=6) d2 = compute_d2_moteki_kondo( S=my_binary, norm_deriv=dSdt, tau_hat=tau, - p=21, + p=10, ch="Data_ch0", event_index=499, config=cfg, ) - print(d2) + + # Define k window + k_start, k_end = 18, 34 + d2_subset = d2.isel(k=slice(k_start, k_end + 1)) + # Find index of minimum d2 within subset + k_min_local = int(d2_subset.argmin(dim="k").item()) + k_min = k_start + k_min_local + # Get corresponding tau value + tau_best = tau.isel(k=k_min).item() + + # Assert closeness + np.testing.assert_allclose( + tau_best, + tau_val, + atol=0.01e-05, # absolute tolerance = 1e-7 + ) ## Test another event tau = mle_tau_moteki_kondo( S=my_binary, norm_deriv=dSdt, - p=21, + p=10, ch="Data_ch0", event_index=1040, config=cfg, @@ -78,6 +93,24 @@ def test_mle_estimate_tau(): tau_val = my_binary['Data_ch0'].isel(event_index=1040).argmax().item()*0.4e-6 # Test that the estimated tau for a subset of results is close to the true value for the event - for i in range(23, 38): + for i in range(31, 43): np.testing.assert_almost_equal(tau[i], tau_val, decimal=6) + + d2 = compute_d2_moteki_kondo( + S=my_binary, + norm_deriv=dSdt, + tau_hat=tau, + p=10, + ch="Data_ch0", + event_index=1040, + config=cfg, + ) + + tau_best = tau.isel(k=35).item() + # Assert closeness + np.testing.assert_allclose( + tau_best, + tau_val, + atol=0.05e-05, # absolute tolerance = 1e-7 + ) \ No newline at end of file From 8b18d3654449f38e4dc9ba17a1bce1fd8c02fd13 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Wed, 15 Apr 2026 17:01:35 -0400 Subject: [PATCH 4/6] added flag to plot the scattering signal to ndm plotting --- pysp2/util/normalized_derivative_method.py | 54 ++++++++++++++---- .../test_plot_normalized_derivative.png | Bin 52973 -> 85129 bytes tests/test_ndm.py | 5 ++ tests/test_vis.py | 3 +- 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index 3aead48..6dff399 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -87,18 +87,22 @@ def central_difference(S, num_records=None, normalize=True, baseline_to_zero=Tru return xr.Dataset(dSdt) -def plot_normalized_derivative(ds, record_no, chn=0): +def plot_normalized_derivative(S, ds, record_no, chn=0, plot_scattering_signal=False): """ Plots the normalized derivative of the scattering signal for a given record_no and channel. Parameters ---------- + S: xarray Dataset + The original scattering signal dataset, used for optional overlay. ds: xarray Dataset The dataset containing the normalized derivative to plot. record_no: int The record number to plot. chn: int The channel number to plot (0 or 4). + plot_scattering_signal: bool + If True, overlay the original scattering signal on the plot. Returns ------- ax: matplotlib Axes @@ -114,10 +118,10 @@ def plot_normalized_derivative(ds, record_no, chn=0): inp_data = {} inp_data['time'] = xr.DataArray(np.array(time[np.newaxis]), dims=['time']) - inp_data['Data_ch' + str(chn)] = xr.DataArray( - spectra['Data_ch' + str(chn)].values[np.newaxis, :], - dims=['time', 'bins']) - inp_data = xr.Dataset(inp_data) + #inp_data['Data_ch' + str(chn)] = xr.DataArray( + # spectra['Data_ch' + str(chn)].values[np.newaxis, :], + # dims=['time', 'bins']) + #inp_data = xr.Dataset(inp_data) bins = np.arange(0, 0.00004-0.3e-6, 0.4e-6) # 0 to 0.0004 microseconds in steps of 0.4e-6 seconds bins = bins*1e6 # convert to microseconds for plotting @@ -125,14 +129,42 @@ def plot_normalized_derivative(ds, record_no, chn=0): ch_name = f'Data_ch{chn}' plt.figure(figsize=(10, 6)) ax = plt.gca() - # Plot using bins for x-axis - ax.plot(bins, spectra['Data_ch' + str(chn)].values, label=ch_name) + # --- Primary axis: normalized derivative --- + line1, = ax.plot( + bins, + spectra[ch_name].values, + label=f'{ch_name} (Normalized dS/dt)' + ) + ax.set_xlim([bins[0], bins[-1]]) - ax.set_title(f'Normalized Derivative of Scattering Signal - Channel {chn} Record {record_no}') - ax.set_xlabel('Time ($\mu$s)') + ax.set_xlabel('Time ($\\mu$s)') ax.set_ylabel('Normalized Derivative') - plt.grid() - ax.legend() + + # --- Secondary axis: scattering signal --- + if plot_scattering_signal: + ax2 = ax.twinx() + y = S[ch_name].isel(event_index=record_no).values + y = y - np.nanmin(y) # baseline shift + + line2, = ax2.plot( + bins, + y, + color = 'black', + linestyle='--', + label=f'{ch_name} (Scattering Signal)' + ) + ax2.set_ylabel('Scattering Signal (baseline shifted)') + + # Combine legends + lines = [line1, line2] + labels = [l.get_label() for l in lines] + ax.legend(lines, labels) + else: + ax.legend() + ax.set_title( + f'Normalized Derivative of Scattering Signal - Channel {chn} Record {record_no}' + ) + ax.grid() return ax diff --git a/tests/baseline/test_plot_normalized_derivative.png b/tests/baseline/test_plot_normalized_derivative.png index d2a361c59ded067d8e2040aabf8b78e7f966c6a2..9a8846c95393b104849e5f7cc2c923369bdf715c 100644 GIT binary patch literal 85129 zcmeFZcRZJG|2KYWDT*W+S<#fN6xoH8knCh+g;HkOqmYI|Mnq<2!w99UC`4r>WhaRu zgk-y)N1yBZ-q$^T_x*VM{`&p#`&`%6=gN4$&-ZyA$LsZ6uj8twhRPZ`4mygW)*L>h zq(xCn2PkTZ!O9i*$}jFWTkx+{4u_6AQxu~a`5#S&e7Y?~Ls5s7_UpLC4RyL2tpE6t zc66jEs_S|N@3m{jaokNem^rj zJREvx^MRnSGv>kae0)pRU0vo+%eX-*LZ;}#PmZ>H+od~q?mV=4ousrhJ(pIPgxlyz z{7p$oX(g9x{M5|M0lqNa&6|}5G)oT;^;uZaKl z)kZ3snE2J)&o=o~?7q9yYnsm` zdbtK)Sb1ls@qh^3oAjdz4M~c$M$cSUm3aKV6cWOC@FwT<+u!S$nVHtE^;@xqqx|K| zWl~a7IRypEccspYTo^Kl+vl9NHo1QEVTIu4&Ez6VOG^Vcgd1GlVXtiLkl40=y2ge)yu2Qj)N_`k`x7-@K28A>vhdpy7V3%9wHJFDnSff4hwVB zoM%-ogzXqlh>zzM(9H@6<5%Gm6U+0vnds&=HM(i_>ecv!4Q0N*k#%dC_MYpwa(T_h zikh00Gcz*|j*c(#tm;CeqSBo1K7A_r=FT2^-TQihj~)rBsjD~USsme&^Lon57$myI z@BnSO!Tu}3!7p!ZIU;iYhfb0r6N|90u(;i)wS|R+2ZC;G^Ix&%lE44bD=QP^yer

TVpWbm}8 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 z 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 C+|%*^ literal 52973 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 a8G)3tN8E0Pwi_t?e6OvyJ87r+kADS;;DdSq diff --git a/tests/test_ndm.py b/tests/test_ndm.py index 0a90a92..b40791d 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -50,7 +50,10 @@ def test_mle_estimate_tau(): event_index=499, config=cfg, ) + print(my_binary['Data_ch0'].isel(event_index=499).argmax().item()) tau_val = my_binary['Data_ch0'].isel(event_index=499).argmax().item()*0.4e-6 + print("Estimated tau values:", tau.values) + print("True tau value:", tau_val) # Test that the estimated tau for a subset of results is close to the true value for the event for i in range(25, 34): np.testing.assert_almost_equal(tau[i], tau_val, decimal=6) @@ -65,6 +68,8 @@ def test_mle_estimate_tau(): config=cfg, ) + print("d2 values:", d2.values) + # Define k window k_start, k_end = 18, 34 d2_subset = d2.isel(k=slice(k_start, k_end + 1)) diff --git a/tests/test_vis.py b/tests/test_vis.py index 40fef1a..a51dfc6 100644 --- a/tests/test_vis.py +++ b/tests/test_vis.py @@ -13,12 +13,13 @@ def test_plot_normalized_derivative(): my_sp2b = pysp2.io.read_sp2(pysp2.testing.EXAMPLE_SP2B) + print(my_sp2b['Data_ch0'].isel(event_index=499)) my_ini = pysp2.io.read_config(pysp2.testing.EXAMPLE_INI) my_binary = pysp2.util.gaussian_fit(my_sp2b, my_ini, parallel=False, baseline_to_zero=True) dSdt_norm = pysp2.util.central_difference(my_binary, normalize=True, baseline_to_zero=True) # Test the plotting function for channel 0 and record number 2 - ax = plot_normalized_derivative(dSdt_norm, record_no=499, chn=0) + ax = plot_normalized_derivative(my_sp2b, dSdt_norm, record_no=499, chn=0, plot_scattering_signal=True) fig = ax.figure return fig From a6a5c613daf45b9a1ae5233e883801e70e68e273 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Thu, 16 Apr 2026 10:33:42 -0400 Subject: [PATCH 5/6] added tests for evaporative particle --- tests/test_ndm.py | 43 +++++++++++++++++++++++++++++++++++-------- tests/test_vis.py | 5 ++--- 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/tests/test_ndm.py b/tests/test_ndm.py index b40791d..25769c1 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -50,13 +50,10 @@ def test_mle_estimate_tau(): event_index=499, config=cfg, ) - print(my_binary['Data_ch0'].isel(event_index=499).argmax().item()) - tau_val = my_binary['Data_ch0'].isel(event_index=499).argmax().item()*0.4e-6 - print("Estimated tau values:", tau.values) - print("True tau value:", tau_val) + tau_val_true = my_binary['Data_ch0'].isel(event_index=499).argmax().item()*0.4e-6 # Test that the estimated tau for a subset of results is close to the true value for the event for i in range(25, 34): - np.testing.assert_almost_equal(tau[i], tau_val, decimal=6) + np.testing.assert_almost_equal(tau[i], tau_val_true, decimal=6) d2 = compute_d2_moteki_kondo( S=my_binary, @@ -68,8 +65,6 @@ def test_mle_estimate_tau(): config=cfg, ) - print("d2 values:", d2.values) - # Define k window k_start, k_end = 18, 34 d2_subset = d2.isel(k=slice(k_start, k_end + 1)) @@ -82,7 +77,7 @@ def test_mle_estimate_tau(): # Assert closeness np.testing.assert_allclose( tau_best, - tau_val, + tau_val_true, atol=0.01e-05, # absolute tolerance = 1e-7 ) @@ -118,4 +113,36 @@ def test_mle_estimate_tau(): tau_val, atol=0.05e-05, # absolute tolerance = 1e-7 ) + + ## Test another event + tau = mle_tau_moteki_kondo( + S=my_binary, + norm_deriv=dSdt, + p=10, + ch="Data_ch4", + event_index=2008, + config=cfg, + ) + + d2 = compute_d2_moteki_kondo( + S=my_binary, + norm_deriv=dSdt, + tau_hat=tau, + p=10, + ch="Data_ch4", + event_index=2008, + config=cfg, + ) + + # Test that the estimated tau for a subset of results is close to the true value for the event + for i in range(39, 42): + np.testing.assert_almost_equal(tau[i], tau_val_true, decimal=6) + + tau_best = tau.isel(k=39).item() + # Assert closeness + np.testing.assert_allclose( + tau_best, + tau_val_true, + atol=0.02e-04, # absolute tolerance = 1e-7 + ) \ No newline at end of file diff --git a/tests/test_vis.py b/tests/test_vis.py index a51dfc6..a858ace 100644 --- a/tests/test_vis.py +++ b/tests/test_vis.py @@ -13,12 +13,11 @@ def test_plot_normalized_derivative(): my_sp2b = pysp2.io.read_sp2(pysp2.testing.EXAMPLE_SP2B) - print(my_sp2b['Data_ch0'].isel(event_index=499)) my_ini = pysp2.io.read_config(pysp2.testing.EXAMPLE_INI) my_binary = pysp2.util.gaussian_fit(my_sp2b, my_ini, parallel=False, baseline_to_zero=True) dSdt_norm = pysp2.util.central_difference(my_binary, normalize=True, baseline_to_zero=True) - # Test the plotting function for channel 0 and record number 2 + # Test the plotting function for channel 0 and record number 499 ax = plot_normalized_derivative(my_sp2b, dSdt_norm, record_no=499, chn=0, plot_scattering_signal=True) fig = ax.figure @@ -31,7 +30,7 @@ def test_plot_wave(): my_ini = pysp2.io.read_config(pysp2.testing.EXAMPLE_INI) my_binary = pysp2.util.gaussian_fit(my_sp2b, my_ini, parallel=False, baseline_to_zero=True) - # Test the plotting function for channel 0 and record number 2 + # Test the plotting function for channel 0 and record number 499 display = plot_wave(my_binary, record_no=499, chn=0) fig = display.axes[0].figure return fig \ No newline at end of file From 0fe3306b6735c154ac9a6c8dff801629e17cad4f Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Thu, 16 Apr 2026 14:28:47 -0400 Subject: [PATCH 6/6] some edits to code comments --- tests/test_ndm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_ndm.py b/tests/test_ndm.py index 25769c1..c75e678 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -143,6 +143,6 @@ def test_mle_estimate_tau(): np.testing.assert_allclose( tau_best, tau_val_true, - atol=0.02e-04, # absolute tolerance = 1e-7 + atol=0.02e-04, # absolute tolerance = 2e-6 (larger tolerance for evaporation events) ) \ No newline at end of file