From 58f5584c5779ff9a919b235adf9aead7912eb8be Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Fri, 13 Mar 2026 17:00:36 -0400 Subject: [PATCH 1/8] added visualization test for the scattering waveform, added function to compute tau, still needs testing --- pysp2/util/__init__.py | 2 +- pysp2/util/normalized_derivative_method.py | 228 +++++++++++++++++++++ tests/baseline/test_plot_wave.png | Bin 0 -> 53555 bytes tests/test_ndm.py | 24 +++ tests/test_vis.py | 13 ++ 5 files changed, 266 insertions(+), 1 deletion(-) create mode 100644 tests/baseline/test_plot_wave.png diff --git a/pysp2/util/__init__.py b/pysp2/util/__init__.py index 0a224ee..e35fb92 100644 --- a/pysp2/util/__init__.py +++ b/pysp2/util/__init__.py @@ -18,4 +18,4 @@ from .particle_properties import calc_diams_masses, process_psds from .deadtime import deadtime from .leo_fit import beam_shape,leo_fit -from .normalized_derivative_method import central_difference +from .normalized_derivative_method import central_difference, plot_normalized_derivative, mle_tau_moteki_kondo diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index 27aaa0b..a16580d 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -1,6 +1,12 @@ +from __future__ import annotations + import numpy as np import xarray as xr +from dataclasses import dataclass +from typing import Optional, Union + + def central_difference(S, num_records=None, normalize=True, baseline_to_zero=True): """ @@ -23,6 +29,8 @@ def central_difference(S, num_records=None, normalize=True, baseline_to_zero=Tru normalize: bool If True, normalize the derivative by the scattering signal S(t) to get (1/S) * dS/dt. + baseline_to_zero: bool + If True, shift each record's minimum to zero before differentiation. Returns ------- @@ -122,3 +130,223 @@ def plot_normalized_derivative(ds, record_no, chn=0): plt.grid() return ax + + +@dataclass(frozen=True) +class MLEConfig: + # Instrument / calibration parameters used in Appendix A + h: float # sampling interval (same units as t) + sigma_bar: float # average Gaussian width (\\bar{sigma}) + delta_sigma: float # std dev of width fluctuation (\\delta sigma) + A1: float # noise params for delta S_i (Eq. A.6) + A2: float + A3: float + + # Grid-search controls + grid_size: int = 401 + grid_margin: float = 0.5 # margin factor relative to local time span + + +def mle_tau_moteki_kondo( + S: xr.DataArray, + norm_deriv: xr.DataArray, + p: int, + *, + dim: Optional[str] = None, + tau_grid: Optional[Union[np.ndarray, xr.DataArray]] = None, + k_end: Optional[int] = None, + config: Optional[MLEConfig] = None, +) -> xr.DataArray: + """ + Maximum-likelihood estimation of tau for each k-subset using Moteki & Kondo (2008) Appendix A. + + For each k = 0..k_end, finds: + - tau_hat(k) = argmax_tau L_k(tau) + where L_k is the multivariate normal likelihood (Eq. A.9) with: + - mean ybar_i(tau) = -(t_i - tau)/sigma_bar^2 (Eq. A.4) + - covariance Sigma_k(tau) from Eqs. (A.10a,b), using S-dependent noise (A.6,A.7) + + Implements: + - Likelihood L_k(tau) as multivariate normal (Eq. A.9) + - MLE of tau by grid search (Appendix A.5) + + Parameters + ---------- + S : xr.DataArray + Scattering signal S(t) along a single time-like dimension. + norm_deriv : xr.DataArray + Normalized derivative y(t) = S'(t)/S(t), same dimension/coords as S (or alignable). + p : int + Sub-array length (number of consecutive points) used for each k. + dim : str, optional + Name of the time dimension. If None, inferred as the only shared dimension. + tau_grid : array-like, optional + If provided, uses this global grid for tau for every k (in same units as t coordinate). + If None, a per-k grid is constructed around the local time range. + kend : int, optional + Max starting index k to evaluate. If None, kend = N - p. + config : MLEConfig, optional + Required parameters from Appendix A. If None, raises ValueError. + + Returns + ------- + xr.Dataset with variables: + - tau_hat(k): MLE estimate of tau for each k + + Notes + ----- + - This function estimates tau for every k. Moteki & Kondo then choose k_best as the k + with minimum d^2(k) (Appendix A.5), and apply a chi-square test on d^2(k_best). + - For numerical stability, likelihood is computed via Cholesky factorization of Sigma_k. + - Currently supports 1D DataArrays along `dim`. + """ + if config is None: + raise ValueError("config must be provided (contains h, sigma_bar, delta_sigma, A1..A3).") + + # Align inputs + S, norm_deriv = xr.align(S, norm_deriv, join="inner") + + # Infer dimension + if dim is None: + common_dims = list(set(S.dims).intersection(norm_deriv.dims)) + if len(common_dims) != 1: + raise ValueError(f"Could not infer dim uniquely. Provide dim. Common dims: {common_dims}") + dim = common_dims[0] + + if dim not in S.dims: + raise ValueError(f"dim='{dim}' not found in S.dims={S.dims}") + if dim not in norm_deriv.dims: + raise ValueError(f"dim='{dim}' not found in norm_deriv.dims={norm_deriv.dims}") + + # Extract numpy arrays + y = np.asarray(norm_deriv.transpose(dim).data, dtype=float) + s = np.asarray(S.transpose(dim).data, dtype=float) + + if y.ndim != 1 or s.ndim != 1: + raise ValueError("This function currently supports 1D DataArrays along `dim`.") + if y.shape != s.shape: + raise ValueError(f"S and norm_deriv must have same length; got {s.shape} vs {y.shape}.") + + n = y.size + if p < 2 or p > n: + raise ValueError(f"p must be in [2, {n}] but got {p}.") + + if k_end is None: + k_end = n - p + if k_end < 0 or k_end > n - p: + raise ValueError(f"k_end must be in [0, {n-p}] but got {k_end}.") + + # Time coordinate (must be numeric) + if dim not in S.coords: + t = np.arange(n, dtype=float) + t_units = None + else: + t = np.asarray(S[dim].data, dtype=float) + t_units = S[dim].attrs.get("units") + + # Constants 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 or sigma_bar <= 0: + raise ValueError("h and sigma_bar must be positive.") + if delta_sigma < 0: + raise ValueError("delta_sigma must be >= 0.") + + # Eq. (A.7): Af_d = sqrt(130)/12 + Af_d = np.sqrt(130.0) / 12.0 + + # Eq. (A.6): deltaS_i + # deltaS_i = sqrt(A1^2 + A2^2 S_i + A3^2 S_i^2) + # Note: if S can be negative in your data, consider preprocessing upstream (paper doesn't specify clipping). + deltaS = np.sqrt(A1 * A1 + (A2 * A2) * s + (A3 * A3) * (s * s)) + + # Random variance term in Var[y_i], Eq. (A.10b) using Eq. (A.7) + with np.errstate(divide="ignore", invalid="ignore"): + var_rand = (Af_d * Af_d) / (h * h) * (deltaS * deltaS) / (s * s) + + # Optional global tau grid + if tau_grid is not None: + tau_grid_np = np.asarray( + tau_grid.data if isinstance(tau_grid, xr.DataArray) else tau_grid, + dtype=float, + ) + if tau_grid_np.ndim != 1: + raise ValueError("tau_grid must be 1D.") + else: + tau_grid_np = None + + tau_hat = np.full(k_end + 1, np.nan, dtype=float) + + def _logL_for_tau(yk: np.ndarray, tk: np.ndarray, var_rand_k: np.ndarray, tau: float) -> float: + """ + Compute log L_k(tau) for one subset (k) and one candidate tau, per Eq. (A.9). + Uses Cholesky factorization for stability. + """ + # Mean vector (Eq. A.4) + ybar = -(tk - tau) / (sigma_bar * sigma_bar) + + # Covariance matrix (Eqs. A.10a,b) + dt = (tk - tau).reshape(-1, 1) # (p,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 -np.inf + + # d2 = r^T Sigma^{-1} r via triangular solves + z = np.linalg.solve(L, r) + d2 = float(z.T @ z) + + # log|Sigma| + logdet = 2.0 * np.sum(np.log(np.diag(L))) + + p_local = yk.size + return float(-0.5 * (p_local * np.log(2.0 * np.pi) + logdet + d2)) + + for k in range(k_end + 1): + yk = y[k : k + p] + tk = t[k : k + p] + var_rand_k = var_rand[k : k + p] + + # Basic sanity checks + if not (np.all(np.isfinite(yk)) and np.all(np.isfinite(tk)) and np.all(np.isfinite(var_rand_k))): + continue + if np.any(var_rand_k <= 0): + continue + + # Per-k grid if not provided + if tau_grid_np is None: + span = float(tk[-1] - tk[0]) + margin = config.grid_margin * (span + h) + grid = np.linspace(tk[0] - margin, tk[-1] + margin, config.grid_size) + else: + grid = tau_grid_np + + best_ll = -np.inf + best_tau = np.nan + + for tau_cand in grid: + ll = _logL_for_tau(yk, tk, var_rand_k, float(tau_cand)) + if ll > best_ll: + best_ll = ll + best_tau = float(tau_cand) + + if np.isfinite(best_ll): + tau_hat[k] = best_tau + + # Return as DataArray + k_coord = xr.DataArray(np.arange(k_end + 1), dims=("k",), name="k") + out = xr.DataArray(tau_hat, dims=("k",), coords={"k": k_coord}, name="tau_hat") + out.attrs["long_name"] = "MLE estimate of tau for each k-subset" + if t_units: + out.attrs["units"] = t_units + + return out diff --git a/tests/baseline/test_plot_wave.png b/tests/baseline/test_plot_wave.png new file mode 100644 index 0000000000000000000000000000000000000000..bb117721bc6a26b43026080065fc6bb26f529937 GIT binary patch literal 53555 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%0DLsd z!D!&;k2cnU1R+7em3Zk9Z}a>PsBFlD5Xe`i;KeF*Nu}i5zo-6=eNQ`bq&H7b0t{GW zsOg(;ry+n+;=*wcd$Y(Hj zLE$2x!P zEtx-N({U-BT<#&zz6pM8C<_gkGIlamTz&v74EN$3SW3K=!0b06=M{*_SXADR>YXAV zgIqfRW}OQuW^ZqAGlZev{{dvs4}pz_Du1hAZEepqAzGar<8Usfel7i>7C`N5&J2{>gymrCkV z^ly7etygCDeSC}`sRkQjDIW~~HiGBJhRGZr#hEW#C8VVfWt07Zup^sbV0W*x(+EUl z9%~z$!1-STN|3#T7%7R`_BG=?Dm9-|?fxS>(*)Z$*qtmuBdS1IV(~gH44VdHa#E7A z%5eJVRkk`Me?8Q#@Df@!@cZ1)bGZ(^QKadTl7XlLlQV`o`)~Vc{1IOeac9PB9r2PT zFP&w74*2S~H~%S9T+lN6bGZN48&S%?bJB~QS;#90>3FfIfXuRZOm8RYZeLd7xI>o2moAk_vW@?AdO$+=d{#c%r;X&PIru#L@{tm{{JEaE_T!BwoxIH%-55&n&}p zIsb#L9ZGUBaI!e(;J_m$)@_>e63$duN!9)PIgsmJ+hI@8y(f7aamvN!aS;qjS%U?* zty~nCa8)fK;o+#EV@d8A6QTaSINrqArQo|IOq2|NKV%^9*&bS-<2a$`ny}?cH-wJzLe(?|%S4w^0rN literal 0 HcmV?d00001 diff --git a/tests/test_ndm.py b/tests/test_ndm.py index d670855..3e6375b 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -1,6 +1,8 @@ import pysp2 import numpy as np +from pysp2.util.normalized_derivative_method import MLEConfig + def test_central_difference(): my_sp2b = pysp2.io.read_sp2(pysp2.testing.EXAMPLE_SP2B) my_ini = pysp2.io.read_config(pysp2.testing.EXAMPLE_INI) @@ -22,4 +24,26 @@ def test_central_difference(): 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) + +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) + dSdt = pysp2.util.central_difference(my_binary, normalize=False, baseline_to_zero=True) + cfg = MLEConfig( + h=0.4e-6, # example: 0.4 microseconds + sigma_bar=16.6, # example; use your measured average width + delta_sigma=1.2,# example; use your measured width std dev + A1=0.37, + A2=1.6e-2, + A3=6.2e-4, +) + + #tau_hat = pysp2.util.mle_tau_moteki_kondo(my_binary, dSdt, 11, tau_grid=np.arange(-10, 10.1, 0.1), config=cfg) + #print(tau_hat) + + #np.testing.assert_almost_equal(tau_hat.isel(k=0).item(), -0.5, decimal=1) + #np.testing.assert_almost_equal(tau_hat.isel(k=10).item(), -0.5, decimal=1) + #np.testing.assert_almost_equal(tau_hat.isel(k=20).item(), -0.5, decimal=1) + #np.testing.assert_almost_equal(tau_hat.isel(k=30).item(), -0.5, decimal=1) \ No newline at end of file diff --git a/tests/test_vis.py b/tests/test_vis.py index d4f109f..7c614f2 100644 --- a/tests/test_vis.py +++ b/tests/test_vis.py @@ -5,6 +5,7 @@ import pysp2 from pysp2.util.normalized_derivative_method import plot_normalized_derivative +from pysp2.vis.plot_wave import plot_wave matplotlib.use("Agg") @@ -20,4 +21,16 @@ def test_plot_normalized_derivative(): ax = plot_normalized_derivative(dSdt_norm, record_no=499, chn=0) fig = ax.figure + return fig + +@pytest.mark.mpl_image_compare(tolerance=10) +def test_plot_wave(): + + 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) + + # Test the plotting function for channel 0 and record number 2 + display = plot_wave(my_binary, record_no=499, chn=0) + fig = display.axes[0].figure return fig \ No newline at end of file From e37e440b4917434dd11c9218ecabb644c6e3ef0e Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Wed, 18 Mar 2026 15:42:25 -0400 Subject: [PATCH 2/8] added flag to baseline correct the gaussian peak fit function, corrected plot_nomalized_derivative function, added tau_mle estimate function and working on tests --- pysp2/util/normalized_derivative_method.py | 289 +++++++++++------- pysp2/util/peak_fit.py | 12 +- .../test_plot_normalized_derivative.png | Bin 48801 -> 52973 bytes tests/baseline/test_plot_wave.png | Bin 53555 -> 49689 bytes tests/test_ndm.py | 30 +- tests/test_vis.py | 4 +- 6 files changed, 213 insertions(+), 122 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index a16580d..ea6dc4a 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -118,16 +118,21 @@ def plot_normalized_derivative(ds, record_no, chn=0): spectra['Data_ch' + str(chn)].values[np.newaxis, :], dims=['time', 'bins']) inp_data = xr.Dataset(inp_data) - bins = np.linspace(0, 100, 100) + + 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 ch_name = f'Data_ch{chn}' plt.figure(figsize=(10, 6)) ax = plt.gca() - inp_data[ch_name].plot(ax=ax) + # Plot using bins for x-axis + ax.plot(bins, spectra['Data_ch' + str(chn)].values, label=ch_name) + 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 (s)') + ax.set_xlabel('Time ($\mu$s)') ax.set_ylabel('Normalized Derivative') plt.grid() + ax.legend() return ax @@ -152,7 +157,10 @@ def mle_tau_moteki_kondo( norm_deriv: xr.DataArray, p: int, *, - dim: Optional[str] = None, + event_index: Optional[int] = None, + event_dim: str = "event_index", + S_sample_dim: Optional[str] = None, + y_sample_dim: Optional[str] = None, tau_grid: Optional[Union[np.ndarray, xr.DataArray]] = None, k_end: Optional[int] = None, config: Optional[MLEConfig] = None, @@ -178,15 +186,21 @@ def mle_tau_moteki_kondo( Normalized derivative y(t) = S'(t)/S(t), same dimension/coords as S (or alignable). p : int Sub-array length (number of consecutive points) used for each k. - dim : str, optional - Name of the time dimension. If None, inferred as the only shared dimension. - tau_grid : array-like, optional - If provided, uses this global grid for tau for every k (in same units as t coordinate). - If None, a per-k grid is constructed around the local time range. - kend : int, optional - Max starting index k to evaluate. If None, kend = N - p. - config : MLEConfig, optional - Required parameters from Appendix A. If None, raises ValueError. + event_index : int, optional + If given, compute tau_hat only for this one event and return tau_hat(k). + If None, compute tau_hat for all events and return tau_hat(event_index, k). + event_dim : str, default "event_index" + Name of the event dimension. + S_sample_dim : str, optional + Sample dimension in S. If None, inferred as the non-event dimension. + y_sample_dim : str, optional + Sample dimension in norm_deriv. If None, inferred as the non-event dimension. + tau_grid : 1D array-like, optional + Global tau grid to use for all subsets. If None, a per-k grid is constructed. + k_end : int, optional + Largest starting k. If None, uses n_samples - p. + config : MLEConfig + Calibration / noise / grid settings. Returns ------- @@ -201,71 +215,53 @@ def mle_tau_moteki_kondo( - Currently supports 1D DataArrays along `dim`. """ if config is None: - raise ValueError("config must be provided (contains h, sigma_bar, delta_sigma, A1..A3).") - - # Align inputs - S, norm_deriv = xr.align(S, norm_deriv, join="inner") - - # Infer dimension - if dim is None: - common_dims = list(set(S.dims).intersection(norm_deriv.dims)) - if len(common_dims) != 1: - raise ValueError(f"Could not infer dim uniquely. Provide dim. Common dims: {common_dims}") - dim = common_dims[0] - - if dim not in S.dims: - raise ValueError(f"dim='{dim}' not found in S.dims={S.dims}") - if dim not in norm_deriv.dims: - raise ValueError(f"dim='{dim}' not found in norm_deriv.dims={norm_deriv.dims}") - - # Extract numpy arrays - y = np.asarray(norm_deriv.transpose(dim).data, dtype=float) - s = np.asarray(S.transpose(dim).data, dtype=float) - - if y.ndim != 1 or s.ndim != 1: - raise ValueError("This function currently supports 1D DataArrays along `dim`.") - if y.shape != s.shape: - raise ValueError(f"S and norm_deriv must have same length; got {s.shape} vs {y.shape}.") - - n = y.size - if p < 2 or p > n: - raise ValueError(f"p must be in [2, {n}] but got {p}.") + raise ValueError("config must be provided.") + + 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 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] + + # Standardize dimension names internally + S_std = S.rename({S_sample_dim: "sample"}) + y_std = norm_deriv.rename({y_sample_dim: "sample"}) + + # Align on event and sample positions + S_std, y_std = xr.align(S_std, y_std, join="inner") + + if S_std.sizes["sample"] != y_std.sizes["sample"]: + raise ValueError("S and norm_deriv must have the same number of samples per event.") + + n_events = S_std.sizes[event_dim] + 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}") if k_end is None: - k_end = n - p - if k_end < 0 or k_end > n - p: - raise ValueError(f"k_end must be in [0, {n-p}] but got {k_end}.") - - # Time coordinate (must be numeric) - if dim not in S.coords: - t = np.arange(n, dtype=float) - t_units = None - else: - t = np.asarray(S[dim].data, dtype=float) - t_units = S[dim].attrs.get("units") - - # Constants 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 or sigma_bar <= 0: - raise ValueError("h and sigma_bar must be positive.") - if delta_sigma < 0: - raise ValueError("delta_sigma must be >= 0.") - - # Eq. (A.7): Af_d = sqrt(130)/12 - Af_d = np.sqrt(130.0) / 12.0 + k_end = n_samples - p + if k_end < 0 or k_end > n_samples - p: + raise ValueError(f"k_end must be in [0, {n_samples - p}], got {k_end}") - # Eq. (A.6): deltaS_i - # deltaS_i = sqrt(A1^2 + A2^2 S_i + A3^2 S_i^2) - # Note: if S can be negative in your data, consider preprocessing upstream (paper doesn't specify clipping). - deltaS = np.sqrt(A1 * A1 + (A2 * A2) * s + (A3 * A3) * (s * s)) - - # Random variance term in Var[y_i], Eq. (A.10b) using Eq. (A.7) - with np.errstate(divide="ignore", invalid="ignore"): - var_rand = (Af_d * Af_d) / (h * h) * (deltaS * deltaS) / (s * s) + # Use sample index as t-axis + t = np.arange(n_samples, dtype=float) # Optional global tau grid if tau_grid is not None: @@ -278,18 +274,44 @@ def mle_tau_moteki_kondo( else: tau_grid_np = None - tau_hat = np.full(k_end + 1, np.nan, dtype=float) + # Constants 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.") - def _logL_for_tau(yk: np.ndarray, tk: np.ndarray, var_rand_k: np.ndarray, tau: float) -> float: + Af_d = np.sqrt(130.0) / 12.0 # Eq. (A.7) + + def _logL_for_tau(yk: np.ndarray, sk: np.ndarray, tk: np.ndarray, tau: float) -> float: """ Compute log L_k(tau) for one subset (k) and one candidate tau, per Eq. (A.9). Uses Cholesky factorization for stability. """ - # Mean vector (Eq. A.4) + + # Eq. (A.4) ybar = -(tk - tau) / (sigma_bar * sigma_bar) - # Covariance matrix (Eqs. A.10a,b) - dt = (tk - tau).reshape(-1, 1) # (p,1) + # Eq. (A.6) + deltaS = np.sqrt(A1 * A1 + (A2 * A2) * sk + (A3 * A3) * (sk * sk)) + + # Eq. (A.10b) random term, using Eq. (A.7) + 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 -np.inf + if np.any(var_rand_k <= 0): + return -np.inf + + # Eqs. (A.10a,b) + 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 @@ -301,52 +323,89 @@ def _logL_for_tau(yk: np.ndarray, tk: np.ndarray, var_rand_k: np.ndarray, tau: f except np.linalg.LinAlgError: return -np.inf - # d2 = r^T Sigma^{-1} r via triangular solves z = np.linalg.solve(L, r) d2 = float(z.T @ z) - - # log|Sigma| logdet = 2.0 * np.sum(np.log(np.diag(L))) - p_local = yk.size + return float(-0.5 * (p_local * np.log(2.0 * np.pi) + logdet + d2)) - for k in range(k_end + 1): - yk = y[k : k + p] - tk = t[k : k + p] - var_rand_k = var_rand[k : k + p] + def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarray: + """Return tau_hat(k) for a single event.""" + tau_hat = np.full(k_end + 1, np.nan, dtype=float) - # Basic sanity checks - if not (np.all(np.isfinite(yk)) and np.all(np.isfinite(tk)) and np.all(np.isfinite(var_rand_k))): - continue - if np.any(var_rand_k <= 0): - continue + if not (np.all(np.isfinite(s_event)) and np.all(np.isfinite(y_event))): + return tau_hat - # Per-k grid if not provided - if tau_grid_np is None: - span = float(tk[-1] - tk[0]) - margin = config.grid_margin * (span + h) - grid = np.linspace(tk[0] - margin, tk[-1] + margin, config.grid_size) - else: - grid = tau_grid_np + for k in range(k_end + 1): + yk = y_event[k:k + p] + sk = s_event[k:k + p] + tk = t[k:k + p] - best_ll = -np.inf - best_tau = np.nan + if not (np.all(np.isfinite(yk)) and np.all(np.isfinite(sk))): + continue - for tau_cand in grid: - ll = _logL_for_tau(yk, tk, var_rand_k, float(tau_cand)) - if ll > best_ll: - best_ll = ll - best_tau = float(tau_cand) + if tau_grid_np is None: + span = float(tk[-1] - tk[0]) + margin = config.grid_margin * (span + h) + grid = np.linspace(tk[0] - margin, tk[-1] + margin, config.grid_size) + else: + grid = tau_grid_np - if np.isfinite(best_ll): - tau_hat[k] = best_tau + best_ll = -np.inf + best_tau = np.nan - # Return as DataArray - k_coord = xr.DataArray(np.arange(k_end + 1), dims=("k",), name="k") - out = xr.DataArray(tau_hat, dims=("k",), coords={"k": k_coord}, name="tau_hat") - out.attrs["long_name"] = "MLE estimate of tau for each k-subset" - if t_units: - out.attrs["units"] = t_units + for tau_cand in grid: + ll = _logL_for_tau(yk, sk, tk, float(tau_cand)) + if ll > best_ll: + best_ll = ll + best_tau = float(tau_cand) + if np.isfinite(best_ll): + tau_hat[k] = best_tau + + return tau_hat + + # Compute one event only + if event_index is not None: + s_event = np.asarray(S_std.sel({event_dim: event_index}).data, dtype=float) + y_event = np.asarray(y_std.sel({event_dim: event_index}).data, dtype=float) + + tau_hat_1d = _tau_hat_for_one_event(s_event, y_event) + + out = xr.DataArray( + tau_hat_1d, + dims=("k",), + coords={"k": np.arange(k_end + 1)}, + name="tau_hat", + ) + out.attrs["long_name"] = f"MLE tau_hat(k) for {event_dim}={event_index}" + out.attrs["units"] = "sample_index" + return out + + # Compute all events + tau_hat_all = np.full((n_events, k_end + 1), np.nan, dtype=float) + + event_vals = ( + S_std[event_dim].values + if event_dim in S_std.coords + else np.arange(n_events) + ) + + for i in range(n_events): + s_event = np.asarray(S_std.isel({event_dim: i}).data, dtype=float) + y_event = np.asarray(y_std.isel({event_dim: i}).data, dtype=float) + tau_hat_all[i, :] = _tau_hat_for_one_event(s_event, y_event) + + out = xr.DataArray( + tau_hat_all, + dims=(event_dim, "k"), + coords={ + event_dim: event_vals, + "k": np.arange(k_end + 1), + }, + name="tau_hat", + ) + out.attrs["long_name"] = "MLE tau_hat(event_index, k)" + out.attrs["units"] = "sample_index" return out diff --git a/pysp2/util/peak_fit.py b/pysp2/util/peak_fit.py index 86f38e2..0258d5a 100644 --- a/pysp2/util/peak_fit.py +++ b/pysp2/util/peak_fit.py @@ -84,7 +84,7 @@ def chisquare(obs, f_exp): return np.sum((obs - f_exp)**2) -def gaussian_fit(my_ds, config, parallel=False, num_records=None): +def gaussian_fit(my_ds, config, parallel=False, num_records=None, baseline_to_zero=False): """ Does Gaussian fitting for each wave in the dataset. This will do the fitting for channel 0 only. @@ -102,6 +102,8 @@ def gaussian_fit(my_ds, config, parallel=False, num_records=None): num_records: int or None Only process first num_records datapoints. Set to None to process all records. + baseline_to_zero: bool + If True, shift each record's minimum to zero before fitting (channel 0). Returns ------- @@ -114,6 +116,12 @@ def gaussian_fit(my_ds, config, parallel=False, num_records=None): num_trig_pts = int(config['Acquisition']['Pre-Trig Points']) start_time = time.time() + # Move baseline to zero for channel 0 if flag is set + if baseline_to_zero: + # For each event, subtract the minimum from Data_ch0 + min_vals = np.nanmin(my_ds['Data_ch0'].values, axis=1) + my_ds['Data_ch0'].values = my_ds['Data_ch0'].values - min_vals[:, np.newaxis] + for i in [3, 7]: coeffs = _split_scatter_fit(my_ds, i) Base2 = coeffs['base'] @@ -185,7 +193,7 @@ def gaussian_fit(my_ds, config, parallel=False, num_records=None): proc_records = [] for i in range(num_records): proc_records.append(_do_fit_records(my_ds, i, num_trig_pts)) - + FtAmp = np.stack([x[0] for x in proc_records]) FtPos = np.stack([x[1] for x in proc_records]) Base = np.stack([x[2] for x in proc_records]) diff --git a/tests/baseline/test_plot_normalized_derivative.png b/tests/baseline/test_plot_normalized_derivative.png index d794486a9a53340145b2828b45be6da03aa9231b..d2a361c59ded067d8e2040aabf8b78e7f966c6a2 100644 GIT binary patch literal 52973 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 a8G)3tN8E0Pwi_t?e6OvyJ87r+kADS;;DdSq literal 48801 zcmeFZcR1GV|37|38c39o$S9*CRI*1x3+-W+5z5NQo|TXyDV3~f50bqrD^W<1>`k&F zdwd_~)qTI;cYW^9ar}PA@%{7bxJRz8>vg?e=lL9u=i~W!o&o!`b}XUiq^D3QOLpy4 zJwTz*c2g)c#}+NXD?_Wx1n|GbXLf4aQz%Of$-na+DLp(zq2wOirMm5qbHw)sC-;LV zr<4Zw?qDi?*p;n$1&3t#=`t@HlhTmSE_z+1J$ zkM_-5vHp>LjqT!r`@6S2th(ztGkMyteWcN~R}>%6%XHY)x9`Wv)`9?h;!BFf&98UmL*w#z z^aX@|sFW7RZ{0E7zt(Q8NJYtgydD3{U%0SssIAy^;NV>qI{a>8Vj|4N-EnhvkG_|! zlhcl&*24X9>PtqtD`^ASMBl{i2>!%W)$bt7t&?i`*pb80es0#o;rkbsg-l$^!K)RR zSFG^8yWLN5*fy9)sfhi!yHC-TRdME(v4bNcswYnHs%+mbVN|eadZ?I(UR6xtsd!zA z1v{=Ls1@<(m`2dM5CbW*n_*!WySvRDzI|HkoFCc6U$ZAjl_{BLdlz`Y`|%#L4-v1^nmhyV-CLV%Uis!jrCfZu;uK?B(UtABFHe4ED&!SQ zsPku8Q;}r0cRn56V~&hA8LWqaTc2cv>{)t&Jz=VKsa7nktQV4#w~$wwyyg^gXD2P5 zX(ugcX=yp_*XwYBxw|$==t#U?!0FFV3=8~Oc4}x8{OBkh`nX4|rRKO-;nRfN)1MV} zlg$mKYs0Tz^~N>0hdbZrUs|!@O!KRGhaMj&WZKbMziHE^!OlB2Z{CZJZ7qTU8E&j~4_i7uxsqh$!RAP4i)E zZ}9jPj}Ho!g-bHTsb6_H*1|IHgpbz7N5>M4VEyCYlgh=-D|oMqXdmdi%B5Zzs}`Ag zrpgU&q@i<_N6GWDSl;xq<$@Z@&d$<~-@o{DzQ0o^$+Sa+Szca#Uykcpc;C(5ngm+P zyX)(Whm1`>L-&CQM}-6`s^q@ktd?r+yKFi5*5u;+*U z%(^t|29-NotXhwCChHdNvVrhv@NfXN~YJi=74<53k$Zm16u=}viISV z`LN;UzP=?C4p|4`a4DOh*XI|;9e#R5_`p5?!YLTX{rzI$&z^~7|9H3IOSdDfu0IXmjzuKimHa0fMxR92X_ULFr)Uh1b6lN8F zSfRwJk8Ahe-@T%xqeEc*;U{Z5%WfP0(0ly&vC-)F+Su)WO#H&aJDpu!>6Mg}Dl^Yo zBpT)~Nb+Ks88#bh3s$11v=;MtZL#ca%FCl%ZR_aqSj1O=NUByECh8j<9gVoM?DNy3 z?4d$?*$}I?uG*uaae2|=#Vn1Djj^!QSevHY)~_iRv1);AZ^DE5W@fN3x7$1fHE!`z z{1+_Yyj33-6}7SRL*xcdDQgjW_KhOgUEyyv31X(@QKFkRZ@$v+Hq@#%PkCgZ={P)U zw?l8WCNV}t+5BN8ZW7k%C_~Y6)5VsSB_$=XJ45*2G&MC{_1d*-m(k=%Pb_vm7MuPi zKYu&<9NBfFfyNy5;F>(o&W)4VrK{5njvc#2;f2|lZjFb5?V>ObSen~P5E}4B^Ld#c{$J1ws=b`cL{`|CN^S~VirhLM(;6 z1f#wL>j*T+aSfXd?MpR>{(9}}>kq#hlww@ElpQgD zbLMeV(+9WYoZ`*DytpfT=+V`|p&^#LckdeY*JlVe1*^zU4XZDz^BC*pmUY;fo|P3? z5-PN+G0$UiL?R=4_NVxm+cyLq7K-Z5o&J@h$OjA*)28AivvM{{f!sj0@!2v}m)C3# zcDwTZmKI0I*o)gV%3tP^`53!7YHnu0OTuH)0XIaC>utNM;`_q3P5m;D(&{@>HbtX- zb(%U(2M!)2?p>eb#@_ce<$OXyLS=y^7Sg;fRdm_%pNqmSZnY%zJlJEEw?PE-d;> zo|ls1WcM2Q5Up;SwXdI_U(4)f)3R51d|E`Ok=~l6zz<(uo@Bt6n%=CQCc%|N>Y&vM zm%Qd?*kMHTd5;GkHE^NRO|{(i^V{djEGHXhH#g(150M-)c56omnu3v}Z+#!|nw#Rm zmYzcnzKa;;JU+;W;A1(Okp=XDXw}*k?Nv0=Q?G1IB~RuP@eVMaudD z>b2d!X`u2@D{|knV-k9~?knM4g#c-Z)(x@*$WitIX{oBI8GgLCYY`LER@tfOx?3Y@ zjjjxMvclHFz@d(t$HVJ$orjDlcHQ2MNE?+vt3aNM#d1cL$vSj<`z_@$%D=e8yeU^9 zcdB15(7ykUP3~)ekA08!@ey|rKKz8$vA;f`r|O|`L+05pX*N8t;RRSJd~wT{MB`&w zj-m!0KM&`(pD7Pt8;>2Lm`EMpbN~MRy9Xa?eaZEZBdf3IF&T5Fban9Jet}BZO6fYuB!cTU3jDdU|we zLe6M-iwx5GQrrXO6;|1U^h_Xf_*DmNOWMYzvSbaBWzis1P#&dy8`sQe|>YL$U=i?5!N1rv|rWh_$Msj3GY zTg;hTTU!Tv6Y^qleQDPb;nSZU8Kx&ly2M<+ew{Vn?C7CGpEeH+bab42X$4Cp)@I<+ zvEqWSuOW=+mXep^hbRS$O$%QopQ<`DIdTdyn=w-Mtjg})^rQU^fx$|%9CA+m1p|3= z)<0?&zAg7T+gr^iFV7{all;nucHtm`Z8P>p+H*R+Hr;is|BBMw^m6!^atOZ~@mlwx zLiTizsjUQBI5Z(z#lf`RzJ05VZzp+NFUNJo(<9H{*yPPzL}cb)ySDwd7mq#MdkEn1 zb#d`R5}8Z-aLHGDm1ZvBJw~s*=ef8t3JBcAO_66Og~W+h6qA!D4Uy2h z8?vOdqT~biDozx1OYGmje|)?xxTUu@u*Se`2`seuXKziS(|`eT!+fB=mo2%lf+B<} z0(gP?QAruX=QtGIr3vapin(17Ue|TydEV5)0|zP+jw^jiIL-qwogby(W|uvHhnq*a zvHtL;49z@IL>fRjwM3&r5zjJ&tmi>@g!g_@+^+mB!)q?r|MF#4*u)ArZ`qJ#{QVI# zRr^fT3;B+(yC`#cbo%~6W_RJbMh-moqTOzz-zAdSnljIpzEDt5(1%0rr!Ysm{|Km^ z!LF&xyN_3_Wt-{4(rlHj%X1sEo~O(zs&i-KxX&i@;{?#uy}Nqr7O@dN z*p}%>JHt~9nKDP?^;k#(1;}Yl$eZ2dG7WpO{`ge6iC^5fh%v5hXk>&Huwe7)`)|w2 zSdrc(+b`Z1Ikk{{hDTDlRN{E$wpBvk5W)OawN>qO;0bPC9B{gTU&Ovb*D~6d9;#PeM5s9Y8y5D zm7yEng!1WOZ8_(R1w|Q!enofcK<<D+421Dta8rDh(+}D%WjGt z-)gyc?_PG|7ZhHk0Gp9p!(HX8a{65-#|{FoRyxk~9!BvRSFXr+0r=%6g*Qx8*ECsw zu9kDzGX7=DmNC}xD7p);KN>GmUteEJnSwIt6j#f!&JV^Ky=5qM?<}m@)52D?-Z{H@so5mZSl3weaH{Qw+*SBunx>)SB z%EPLFFJF%3kBaK1E~3POpAZ~)49AUYV#NipYMfgw%}3liTk`$j`l=M>Jz*jeUw2qX zOQp{Cv#a=nW>_pHCT9DieHY(_w<&b`(MRpOK1gP0Hl1U7)jg(p;zSJP#1}8eNj3+( z?WvLAyA5pJoQ}Ya`;*Q0lNvMt#?X^Y`L;>nsX@$jR z$G4kiDVUm=_%9RK?SFB}D$Z1oA0WmZ^t zf9!=tjEq~RoDiqtQOvgftT`@aSvB`!bZo3VQSN>QjlS1Qp{d*p%&n6@dt;S-XiT#j zyG&4%(|A`dHRF3GR^iKhacsP5JO2Z%$n_L|K%$kYK*1UmW~4`{DK1opC5cnbRf2n? z;IY63ck08gUgdT7@bEI zE|(Ho-DA1#8L%QLYs;U;KV>AmX5B;U*hG$@8mmn*(@jo5Sq)&Us>)$ilV`x=Iexdq z*mG{i3C=&&pQT>+Gx~X5nvImpWlxTSqoFaI%|4VR@-A2LmoP3`^eTPor6k=X@-r&3 zHwFDjKi~ z?^6cqfBSuQB)YcNZ{1nIYzi~dovW$5)z@SeibiG*1D~JJJm%**DVx4V{Yox~MH^u+ zEpqz)^$ZR(i~Ue1tcq;jwRf+S>^729^Q|UBd&!1Pid+s3mYO!DJ>kf)Fywh+VAe%C zP*L!!Nt=P!^0^`9!FchBYs{O8F66b+#-B@>cdmQau9AIYalmpW@@Y}y}z?E zZpSIPnJ2?FAqws|(+cX145EMEDK5dot9xbgRkU>{K zM;M`uH{}6J@rBQ=n&nxw3gv>?2VlHq1k;t?6zh`fHzV8>qSwBZ(}y*p&?lT6>gIqo&%i``xWtLz>n zcjl&&NiZy;XED$np^frKQ7|utg91FH8P?$wbjps8x1=$Cfk{(deQ)YLm64N1n8mAC znZGyYtO90!=Ty^-__cp9eb87luqmKY~!-!s)xJ~@% zSTaF*D=_#WS}7P95XTBvNcm(oSk2RH~4orEbDg3DFHpSQpKq}0x7nBL?m`fhyz9s!vOWk@wxi#*<(&s#G1Fch zb_$U!H|#SWk#YV0MItF$dyKxYL1GFD+}=ZGFK4Cpg13uaSq$T9>FhKe&B`Rq)xH?-mMQtH2t^yqiH7Lw*Dv_{ zFWO>V&w2O^5Yp~e^$fzBPmp4u zB4%5Ba9~i-MN&UHpB9j``pOCfBulEp^_gKX}{x))ufo7vS%dl|{V|9z5uTA6#6@ z69kxO{PrpzAmEnFK3twzr5P3Gtu3dnsZCYQ>Ceo}yl-61%zWY|jlL2?x~IE^iV6*- z8MR7A(d=N$_9O|Nr^oX=$GhW#Uw|ZJT(yrQOHH2~Gwqes6xna;C`wW{i46H)v|h z*qCd$z`*nGW2Is|JUrQx-=1FV2>ST(<6!<$r4!))Z%Nz68tSH70@R22K$nJnR{CSKSW zw!a8;C;=v<8F7F2jZI~~;-@~|;|gy2*!8y5cqCd|X?pN{?M%1!kJ~qNxnw-FdYag) zgPsRny7UIrambAuz5to6;5G>hQStPsnB|ujuU}lhH9OA4EqejDrXxM?d+|*eDGcp) zS*OhhWZ!++&bFa4qLhiTjoL5QS~uld+39KlvrPAUbwxTc^Y8=%-D~S{Wo2X-qL#fS zX~E_>*&~!6&<%q&1nJBnVKg7RZsuUe$IDCcW8!`z6zzTv;Ghjv@itTq6&dzs?jw~u z9w7vR`9Hmhoh3x!h4MqQ$&sqPLoI$h=)}<=pYf5+nCOabBUCt+;(cla?MseHJdXru z?(xaV^;|!fqdYDIYdJJKH4ul4YB~@%cOb`QSP%%%(r)U?Dyhr;4{t`ZF<7_*hV0z6 z>osmoQ;>EFWcdrnzOU{|#R%FGU}!-9t)}8HeXs9JIJbzq2{v%e7=!RQnfh5pXSvz#{N(VFJ~6Qb+dR)1al<$BMRbxEAw+FQ2@H(sbM&~! z=QAIb2jYSi&pmu7gyPn6%gPlL(D?=T&I%}v*owk+2^f}>;TmioI2m~Mcv49p+&I=pH;TBe739Ce3Z>p_id@0W_e@uu1SG= z~Mpsc_=b8Y#ku zV0A0=yu5ya^i@*U$2?R@j*JZ42LHDT1!&5|?9)S!&jGD8zwu>2i7S5lRUh1zahOF5^<80?XH&O02`1$B@?c}{+8rH5|%PSzzaa+w5b`o;y zmOs*VD8B-pYG`Q4^k#5r&u~##(@bJwB6h08cA^55(Mp2G5x)J5i-T6CW@TlyH8?d% zo;tf1dkKuX@5PC2pZ z&MzTR89VdMtW1)<&6k1wOvk$$({$EFAg+SIWDxRp-yj$rZo--6dFAadpYOJqo?Zoo zzAf5FaNZ*Ey1^=6ao*!~;M2lcyR@~nWj-9}?d%LQ4m@ZLM7%Ik%Z$Sn?BIDMWzMrM z3!@^wyl_;vwzqS$5kNNyJO;SitumgvRpr?UV%{S%w$tOb`Mb_VAVIHLw{9^I)8=*W z&~GzO^{>wJvvZBK%Tf>`;w1>x`O1THZSG ztYpt>;k)QRIuE~>n#WtrCtus~@S&fl<|OR#cD-q7Xh8ML4zn;Bz-II6XDhFThQ3!U z2E|07U;{pk*?UZM+(dig&AnZrjG}PwIeFOBGud3=WaULZc#q<6E?iRi$PqTM6;^h2 zNG+si`I&JXVQJuN%7z6@T;_I_3DyTP>`pRrNi(B7OELFSni*NX8htPHfbuPa=h=@a zY(|^Gm{`SYnn=5plcj8E|HdHY5R=x+&dGsUG9)Qw&T}a`i$6X({4}g3@SrBxZtv)5 zo(CGYjZy>ecxqoKw2OEy+f}8gCbt0va59fwV?pK8ll~ym@Rd}UlQDL0;_Db{?jiL4 zVl{4W`trhXd(a;Lc`u)8>*#P2DxsS{q5)v{is!x2o~ng_X15gFQY(WeP(`Y$t8<=> ze4l{+Z(G$~rNZm$4mS7n1R#TdJ#!~3OHMtAD*%pq;?tx3@D&M{X@t5#V9>83t7nc4 zqn%t(P!NNrLU(;eQpwEvLyx=>+*YQv)ALbtNZY#ov8qw@LCwu4k}YeOfio>e>BEBP z4j6Z5dgrMxFZc}Hht!_wq|l>jES{C%H9Jvkd9(Q8&%U~vtF)6mW3D_NBP{(*dBH%1 zI+7onA^>ria3LwTI#76s^Yj#Pk&r_%%JZ@T2ubLzv&pmC)UO1LI;f4_@hP;Rn-SvF zqj|t?6Nb9AtxYp3=~p{bCRa;f_jQUlmrdGe&VzesoAPbgzniwK zBPxWPbrB1KCY05P)C!em!pu}He*UmSVCi+l{OB0H47+ip5tfxJPmONgsHnIa&C^X; zdSUlRhMB(CXH=O_!6yfs=4PeJr`{(3ub}`WY_PQRU`$CLakW{4#Ot2vAN_bd&9^Kp zL%;up`-B~7Dtr%Mu%M%(GX&qfbLUQRkw9%c781%rP{Kth88kZ;DBgf}ZQzkF&h_dx zHF=EbCkgQ-d3AMr(dNv}PN5SH&I9EFD0#}UnlDDB1G9^l3!a#ro)Bc85zmGXkUx|1 zxw36UNb04WLpL+%>xIXU9}k@}J9+ZNEB|#q+g87Jqq;+y#RF}|R zMH%*8FTjGr_XLXhR#ksPyM(}0C>YSg^?ky)vV12G_uG& zkT8TAOA_@vBT^s99Ps60uuX%2k_z@JFF_TYKygS&SQQl&#@?7YKv+WLkY>EbovnSh zZIw!qQY9?Eh$Ds16U!c?AtmFdPlqDpoR~=8#MM<+{R*cq5=rCWE#x;Y=`$4421gIu z5ABb;q+4LuK~H)_2&-H+IX~GDTE$O)64t=FpZ)gfH6#p|(0hg-EXT5Yln>sAoS z*iYlJ{)X$=d>Q?1KI^3mOO2;*v$!c zA9jE-?53@qbqoxo>;cj)6B?e!eQ+L9yxI7(TJ!>t#n8^n zk@u)Jxp`B5-=#b(FXRe@+CJ_+L`Ud$jy2H`%>eru*2L@Y)YL4*Rewy&CuIMie*&Pg zac_?dMpifT3HMX|4sdB;_t_$y{*>E&o_2x$XihH}3gJxcUM>==s&MMMw zz~1oj@x3;&J8UuXy>>a_@4-=2#%!Y{)&M7eg`9`v699nv+EQvTd%XGlQf6-MEBMY6 z?QcWCGLpvqc|=>oHy0L<_dJZQ$ab+uuec4yNs2jwy>H#(IP~lo3xyfNreMX%MZgH^ zxCz(*2-oFqWBqDS=`iNAlCA?1Z!1JJ+fbYiezizg*?BnKd5FK!xoyeQO9$ON#&qKV z$ie7t1EWh?0JxSBn0t~?!5C-=4r*#?UBnu`dGm&GJNF!@K&T^_Z)`YPge4cXwiS9O zb+|J~h);F4nr{xYn;Kzw5nu@|hK3j$HjmA$JnH>H5dbTRsp-j-6JXWX;W11`jkKJd z(;;A`WPjSmAejEOq}y@jHq zc71SgkQudVEQnO2>G2^!iwgQ*iU)WoX{8gwx4Y_LFxu}r@m>qS@Q}9+b@G}>JgM$fw>D-r6L$d$-jY0w!^a3+LD#beVe7x9kdSsx%tZ=6J zH7yCRK6=$7pR>>?L1*j|>Gu25uUH1QKNk2Q78utE{n(7z=h3M^CzYsFTe`Z0`FGk32)T0-m&=EeKo8A5Ke&De*>&V*T`wt%m0+t6N zL0=#1Jw{Pm|bYY=^$mEw$M0JcuDS(F{&_UQBI~|0Z zV6g+VStP8Hx<9{fZ(enEcFon&A8sn`xn(+96W0y~HRZS+MVtG;`~?f>LE`U!t|N&C z*>Qi`g-nYmM#v&EMIri73q>@tt1L=HJC#V>Ld(NZhAc*ajGI!lcr0fheYd*PXIbg9 zlQ+Y|*LRjji=n~FOG86*0X^oypFdZ?8`wzT*7lQ6yI*8CIaN?t7y!%?h~1*q2|C9K5A{v=+^+d?cSjzzsE^S*m$J&+zET^KgW?1R}yIERG6AJu-wC zAApLI0iqtV_W1r2jxw+6+mo4G9S5?9gDAX>E?wODsR+XoZlji!$)^rd7sc&9qN7pK z<&~yh_Jjc=J%U(Zng8e>M!#AJmS&rpnqER)x>QlIZ$D}m@-GWo7l;{aKqYF9PCYAM z#b-IzV54PS`fM>@0nmgRga*Po$&ZMm!LyjRUt}y9`l+>N&vM!YjLhWq+XKg8E8t}VE~=O$@$lh!ZZ&V_Zgxm7u=4S&1r?M=zXosnXk z6iH}AvckPz1GhdmP+tqQM3@JcS(wFLR5LKz-9gXG_hzBQCb=kHKg$UG-I2m=s;VD) z0gztJ%{0xmkX(F~Z~G^vh2G!4eH$1EM(nF|S5ZP`uWQWiw4%d|`v+;7Ifz;{WJ(fr zitu?XI{~~{3rH5{!RC3CW)P^74mbP1B(5QEAbFy#IJg*Cts>XM4Nl4k!Py%^k-)1$ z16m0UeEBlt=W0dhd#5rzXEIABhsdJdg@lYzhde2( z9l{NeEa414+z-Zbt)QS0k}eT$0ud1C0!74z)$A-RA(FT`6H`;DnqRFD36da9vWWG5;ELVlfdISJ7Md>~n zuxV1P&-GZPvWTQ2!ne#$HO;-0#_BzM#pbXuq={_=>zQm-$A*HOsOGTYHdDO6B-3xL zaYK-La!8+{wwI>Cdy9Pd^>-1>3=Tp<7hXX`^unZM8Ca3-+YJ?MZEcB&X#~kYm2^mW z_b(Cl7PQldq5*5`huZZCH3rWw^q>xuxZ`{2Dd!nw{&)BoENrU%6gzHzDXe zUFJLV!Az5xCeW9DLCT`N)qLe;WvZs8f-m=`gF14hyaJYeapE;ioX3KN3w5*IIYSgc zCTsRF?_BfO?fPb@-_sPSIBdF$F9*_T!qj{#W}*Is44*kDNBK*>Zsen->i7u^TgrCc zD<}T*xFK5;A$!lNePMY1E8kW1|K8)yJI7*{hcswJNbmoj-xl!JI$fS|9lm?FA@x$K zU;itl|3e-B)*74jnaO9%xj)|hU2yBxBY$37mhZwoxkU%Gz?4DRVB7wdMN3hINcHa- zK3l@IRQLabFh6VY(xpe`=6_s-&HQzTET@)3#{cpT#7~d7X->_@4!qG@b6>p1KRJL- zmZeq`;=zA;`d_OkLt*PCH-H}|Z}M(1A{L+i^?3vZ)&G1ROcK1c4ih^b@3`n5%U`>X z@BS$G`$d247cEq~zrLxRLS23Q^8e?CLmEcDectmgxA5=74Bt^2E1dRI=6p?E3}T)9 zR#ZFL3@O^b+KG0mYtZ)P+4@>k@;Q(TI%S% zwW59mINC4AMYZb#i!Er2^V$Bl8I3F%kICdeFGyY4%iMDR!}h3qg?tx_O6%(nd2bu?eGeGUGuaYquD_u0(%Z|l7?M7}QQYQfKeNPUpgA5j4 zR@qt%(f%q@iR}&(A&_hf8Z&6zzc~I%^~i25ts}o*QD`Gmx-D%w#vFF~|L~*Byo4^{ zASjMCl9DTkitBK&rlzJEWY;gyuP4fI(7C=q`v8W>nB)11^OkF)X|U_}{qMc^;GIQO z4X;@jWc@m9Xs~5D4M5PqhkOsZB5gboEGY^3koWi@iP2Di(tKTielrAfAbqCUJLioc z*%&+FQ>T7RR<1eQ#`{hzHRkEghgFakb@U{n@jxwT3S}rzP{u*G2R4N_-j>2dR`Aq? zT)Id)Ss6LDZmn-9)E?=k#g{nFq@r|L&%G=p0G;jM%rgA!m%>OrI%Jg_P}ze^xno&l zvuEedeX?u$2?pBt`2zvq9V-g{ZgZ9+$1(=_b5 zA-w;M`uXv}g{Yo_$&Dgebxn>#hRiQ7U*G)^5D;Sn zMctl|4630bDrp1%69f`2&I+j$T|TLmn^#~`1hTf3R)K+m+o8bMidM8r_JFdRbj!Ym zMMPW%KtU6}*xXG+gAr@1Vboh0w=np8@$0r`+d*k(E_tTa3xl_BFSh;mDQa%ct4oo| zEq66kpck8FAX!t!e1!UC4nsSy12?r6@qJ=C*RIM7Afti?zM6hG5i}DXjz~8NB|#xV zHFT3n#fUEX9S^<#hT^E(0%UV=Uh76hSwpx9?fclX% zqbc4*&53fl09A6x^xWQgOyE8G`}?65eA!}4(kANGiX1m55&cY7bf}A0*<|~m`*15F zXU&1qDznId@Bd9N)h!$jb}NwOwu16-7-(z|KiGw&Nj{F>xPb%~P)tls`O%iIm6LOJ zaWO0o;wG|3!iEwpDVa}zxmJM2JsjlQeG04phvA=Ll+B=bw5{QAH0C1@d35>8#UK?b zQbk{!efqUhdTI57AlT0@kN@>lcM#Pue+{cegy$;n-9x)+)2A!G z!b*r|uJP-;OATU@=ze|guQlO1|F3I;x8MCOye2VWMGlj3 zvaH1n41a`8ztDn^Uu#)~F6Hm8-*Mq;>9Z9gi=5q(0_9|+{>rEA$semaQXUF5w;?Oo zS^qW2_x99%#5FOon0@m!D?N0W+zI*73e>MJxj|ipfXkN; z{T{Z0unHRt$vrP;WxeTzN9etm8w#5lj(lN||WZ~mHEj9~lwon(I=-j6OM8%R$z zf(S(qo!`w(#)Bc#^LEO0R^APJ8gBXjxI_g$Xcqkro0sqGIc4oUZC1rh)xy@piOnX+Ylc7u~eOz>BG|tWT2$` z<>ATF3w~`j)tYr`861`_b-^Bdpss|byL#KRg1> z1evrt`R=+;TACC_ae`s7+9O2J6AMz1%$R{r+Ych$9ppX)uF3YFRKp+&`2%DG{j$oV z`@yD?>W9eTvH0en9gwtXJjYuWBH=B7^05FT216g@283A^ zDw7I}ihjp?BE=i~+jswhb~?$>cM%>IRDv4#UB&lfYYUbv`L0mF#N_G&W`?iOUZr;okZKzP`+|t#I(=$?M z24ga9WoUne@b%g`u9A5CN@S0?K7_Ay&ly={r>kwo3i9%#nTDc^(`syZ_&k_S{Z?wu zvs2YGy+XYIMufC2jpXT1-sm`2jzU(?X@?%w@|=(aIcWeiy4 zc;ycDu0lwPSvF?YHt5pAKV z`5I({+r6nKsatXQURBQzhdNa475DeB0~3>cI}Yeav<__$sT7#ZG_T@c2*u~`RYwxn zP3<*D->^B{0M-2$y73kg?dfFXQRD()O2{rl{){8fbzZ-Jzht?PmTI)3M_KBJHBhoTJj+1~v-I`Yh% zoToRHx`7$F3Iz%{dWGQ$;9Gydo47r&sziup;-S`~=DMk{)i zRWQ^mpi?fV78Vu~H9mA%TfZuTXd@j_D+ue<0iFPxjFS}v1s7mj1rvXESDr6!;Vs6P zaObk(dFe&HE${yAm%GJnXX@K3y26uq{GxJ#ASN`Sw19gkv1MI9e-X=h&zXoW>Fdr4 zMn*=Ac~cnc^Z_{*wa89c&s0+Y5L*RkBN4(R=yCF29fO_hyaWG1`mI^ ze=}ZlpX_;v5larz(-=+E+wDUPL$9zQOL?gE)w>(YY1Vdi-##nX#J`G^Q!csot*EQ} z*edDOjpz&4brtivoQub zSAcp7p1b1VUY>jp5Rs(C@tvES04sE{RxDjDPv{(Ci4YOZg9t@XU*G>zf%{sN*MIRH z?>9}-%=AcfQxM;~3TX7za&vQUK^_Fbqz}kaB9tP6@JbK1je3jt=7ZEbk(`5aWgIPk z+pZ7X5c@Nu@%RcXqQA=I!HcR)ynj~OrYr5K@%=V6v}!{j`+I2Jl(B-E+W%%LA`V#V z*ViJ@`u`2v1PE*+NtPN+*NJKxnEgtTzi<*>{T(NX7{}8!R4o_Y=Z(Y@K}|duF!=)& z7{@Eu^q6drWpJ=lr)C92&HKM+h07T<+*jKwY6~MHSpGU|z;3t9ue<$EF1(hjT&}o_ z3+&rpSr&HwdzG4`ae94o%e-`j!=G8#7vOzb)bD$+H~NnlprI3fs#k_LE1keK@{KR= z{7*C!8h%=Kmg@w=-{~3@@*nQsekjKNnlv@nQG?sMj_PwC5YsRJovsg(bj?Xk*O-#{ zJ0^zrcMx{+<45UTTp4WCPlC|@0}BaC-Y9(*V)37i>d^)ne%D=ts@x!V z;*YHjEjVdP)6?^=SoJy&bs11oJ^y{#HLOLuDaCg~hpD(~v*Y(;|GbT(Whs{#c_k`S zr^=qwaRbbM@S_4CC~p3V?ervS*u)lm`<&FL82$O&hk(|%wdOCCo6x2v!xoII#N#c{+AD)sCk>QGTmn?=-CLPvs^mJKb))4S55=c}azGfh=1=H6(E1`W zN6(p`N0BI(^4DcD7#bR4W-RMcCHWvrM*MYFmzidtzR{9ht#3b@KT$rOXha7c{AFm^ zVxZemPlJYGWoFj$5G%Bu|H(QQuCUiEq2jY=TMoxGW!Nu7mvWQa9W+Z1j6`#)nk+Aw zKC;&LuMlu)LudHxRp6TIn>AN-!`up?-7+3c1;ri*g(3Y8)%LH@GyD_UwqDA3V8f8* z)#Nx;_E>prbb*5`9CWzykWXWZ#Zh$L=rGMHX<60dK*rBZ%WnBV`}358n><%Y?}3+r zSz1C_8N|k~JfI&z2OK(?1w=uF;R_7a_(9F_DPDgS5DXDmd}0crTCqTFT%em)>9ct+ z@5sStw}!8;U|`>P8DY@yM|%m{Or-ybanke974U!=*?L<#$p42BWbglg&sdxH)uP?n z+RCn(6KoF3sWD_%SK-MiM3hFvV9?A6VFoP_7j8MfRM9)w^T`hWm$&E9F8F7VNjHkG zb!Bwb3D5rUSlJBDxCYn2So3P4K}gBx{dgIofq&vE@`21ix6@CuO$k=Uy8$NDKu-@s zp-$#G)13yQzVfkTBtz5iyS+>5I@x+1p(03iJhe?@c7Tk1=PTdb^ z=AvauvIu#XWoy(gzk<1w9wo-&*Q{T^yN{X5|La}*_$%n{JV@v2 z2n_WKJuF+C3P2#E$|54fJng5}e&7$jSWmR(!i%Q0wlbngMQ1BYR-Q^#Ug(YLt(8C> zNQbU~Q;LO_=d_<{`vDvZ^3M_lpB;JL(BJ>=uT6Nrq8rCqs5&@oA*TvJ3U~s2IcIni z=|E5q4H@*;dj|#MpBM49>-mT>|N1JbbI#4q3_*{Cmi9*$zoO zC;{!s{=V5+WusUts&B10^+XvB{LM(j=YCn9Zr>SdwA#Yw=41U->nSPK?mecN0fBVJ zspb>^#)nzd>Q-#t6vbLIaW}e9 zA&qS$dCP>m>W4QS8>%tiMb+0re~311uin5@$df?{`tq-_^T1a9lOnTC(L+IZe@|)e z!le|Of$6@3$J@J7%Q$&;D+5_en(SHD6?W*7c^WV1i?%HaX%j$qyl`iL-rnB{^h-}W z!gHTyC-MyRs^J4E~_DJ@dbgA-iT zfh|#_X$gseKaeINiyrM?13sMrWr;_pF@_#4;qPN1h#E(=^8!=CRQXy}dDymg3Un?1 z%*U;#GaiUt+Y@%ZW;ZJpceMY|uTLsfTs?CNincTM2m9TrqsCTsTM7LIu>cM4US2YU zj9iJrX(1V{8cl?%`1SZu+fc1pG~rh-_F;f#|5``>J%t4Y&FJ+VlwE z9zEOqOKdmh5G+DmHXe^@%JbsEAqp4gheA12keEL1^;kPe5Sk@F^p7{N)sO>B&>#yMLyBy>q8BxK52!b}@tcGj3Yg!HbyfCF;mq@-Ca8Itf5f zBXbc%4n=ySS%sPe0h)+kJB#D=f;hWF*R&p% zR#`y{NLtebC*xQdirw@i4rma!@6;g2o1h9vbjc29#d325 zWM(=Tar3u|Oh$o?f=FPNOo|DLH(DRMzPqlAVHy4jq~Q1K*6r0v4rEPy&oN@QqTAbD z3rTV_k|Yxa6N=E4(kjkP+q+`~Lj5KVE7-uc11odp+oyGqw{lp`K^{h-KsfPXC~?yE z+uo}312!d=BUlhsaMhLf!AcA6akXs7T!DZi7>xNzX@ur0si@{bZ*xJ~qh1#m8!HY~ zMVu9^3w(AlG=o=C(NL3NTQ4Xu%fB=c9j?ZyBmag_Y&$R;)V-MHD zX3hk^4Ltwyi{I+teB0pd(H0*(xm+PcZ>^Vc;X;%fw&!~M*gMOuzj*(ntF}Jz9od&~ z-RXXt%2+z6LBy%2v4mzi@Ta8|>uF$&gostaZ*j^-e%M!GI-nJG`}X6VBL7R#CJm*R zot|mm)IeS_WD0{QK;qCSzu1TEECTq0Y>o~&?T&}#e@SuD zO$?N2oXEd8-It^*rR{Fh7%}W|`V&RgaenUfCa?02C#0&o$#Xuc0q#x4R?xg(BQ4EA z4v!*IOw#^G-X&PgDAA$2Vjf5vl48%`kSQ|60&@Qg(g`MpjD$bnL;gs?Ef{>e7%K-i zCMOM%yoheer)S#B3Av7pHU#NO*RhCSiG@#~qlB~Dmx1xnw1u$6ko+Dp~l^vuk>bNcuE`ve23*k@#h zhFaFzw(D(?Trh*;n4A`c5Jk5tI-WzisJ0JG113IMMV)AAdwTMY+q})4q}CWGThXdz2B4DK{<*w-9v7!TXeM=8Y{BgietDx`0RBgUQ_O<)?Ec2{AhCSdK_taSEu{0ThrluIj0 zrxdF`idbwTG^Swqlbx85-cJ~+xwEp|h>>wd)F`GJKLA{!Jj*ch>Cna`_4pkJLks8@ zENHzV)kvBwm%~KY@K2$8_0Q7H_P*Ypy*C?b0l+27lDB<&z(E>Td}pS=D>mWv!mMe^G?!}&nF?yDI)fOCTzipU-@Jd5^A9s=oI)<*lwvYv5$zb(hxA*Xgk6zn9JCi+da8aplMN+YHd-oQ}UG-Ja5RoIj$RKk1 z*khvC#fQB$F#?zE#Vsd-l26stf8 zzJiJclU+mwRh~V!M=a-_@*(Q7eg!GQUz#yZ`Hq2q^01QAS&+z>icQw}zjcH;KKMuB z-?}>^>>9tBwNrWZmbduauwE{m2TtW6L(DBr&}Er;uDYi3-)^n%{bXukV&d^C)(~}a3{>BL1v+>}QGr6|1y0Ht zCo4dKDFlQ%=b__#E znuksum7@_s$zFp2R*b1`2mF%2UJ{kov6Ry{Dt-Me&2ZMpZ!qJ!h0Ix7cK!j;I#Q){ z`~bazkK=e4KnF5m8Cr+%0BUeW(51I$HGdZjk*9ySvESQLZR}@?XY?dZLw;NBSO;Rg z2JXWCwj}>a-wPLht9lQ_cWi+{GK{=Z?j5@wCU|piRZo=1ajj)LKByj~%k(UfBqbLA z0rlPVgCpyUYZ*qecWS0QbAt_6gkJkGDzCa5X)GQ_qwu{cj|VV?gk-dfAN=i!C3@^* z{A%q#XQo{09!mZq4$V(rlco?%2wX=jolO4_JvAi;m=Ede$-7FHj4-tB|1f*Av$o|7 z7JvJU&n!;LI00D&k-vFP^-1|#_R8Xzhlv%EM z);1cro1{vOXvGGT)KLhMTamrjtEsn#V}9=G@78P@AL#b_ocEno@Svy%kJ&~*SCG>b zO>H*lrHfyacAHNP@|w4MThW2D?RMclA0J)Vunf(NhyV~HC&Z*F{k zhH8hZ@$dE6onWj-Uj}0E=(#G>9+d0=P2vy+$-k>ER)Zu2(|JvvQ&vIGd#Rr>$$2Ky zJY;;9VMN8(#CCSvwlOMj=Pu+Ss7;JXX+vxs`cDS1FQ68hF?mx=M(4=H=V`y4?FTSC z{9Dy6P&1-7RHct_uUj!MXuD8X%ww7y4D^vH44gOMW0N}p)&Syc4jd^{fQi5WDw&8h z`)65u1Eo<&&FQolS}s4W58DnVrPC@y#g*tXYUA4%WWQPe zHH*pEFZJbp(;CZehELub^kn;$yBJ&@F}Fra(Z8s4xyrPdr?rLp$KNI?3z@~-rkR1j zl$=%+<<>8Q*!2e3g@|kk2>_h%n0qyKZ%Px7vO8IXX;(#aoj}@M5H4JS2?R2Af)foX zI024SGy5>@OK5Nm_R^Ax7|a?z;uZ`k#cbo1e=yybp0?}!BDPK5buf(JyiYt8NtdomVeBY$uwA(wY1G2M~lSGTePo zF*oI7mIr+sWioSb4JNBA(PPSyb)y~!nL4ItS(Xw1XQ{Y5UgnKRf5h6Lh=5Y|ZZz-S zc+aD4?&`YP=0T1XK*`w(Lha~AajIjpk3HMi-_!H*OKKQWC0hCYq_4?@3M^W|jSYF( zvvYydtpa^2)&+!;tu zfb4bgl~rbyGY*|veJuN<@X3G5_sIGS6i&~#Rc>S$DbsMFB0H=DSd@c(%yy*B>ptG% zNB9UFapVu+Y>YD~NH68^)C9)W$+?q+3qkYb#ld8%msVFg*-8l|AdFT!A)>~=g_(dl zdBm*}M9#iMxoHTXM~?e=;m~t{&>yI6$-xk6Q>1Z~i-T@35Kt$hL*1(0_Ugihnxh7~ zatjp1el^(Br`OsBoyMFAIlU`)qH`5Fq!jeZ8=NoW4Ghn}Y11;)rsefJ&@aYC#7*8Z zqlnP=c@*&MPf5nnl9c+)bar802D8+d$prfg0GM4s@8zlK&PL5*jeq*k9K(`EU6851zbAq)vN zqmc4V$n|0lIsb?D@h@NV$)@&djuzqONPil05kv@vs*sE44*HznbYsxVLJEp&Fk1Ug zEV@27B*4=DFDh12}bU>M^WCSg|_l1RZ) zt7^At-vf;gY3%FX>}vIYiE|#V!M<-<3GCI-m`_Q1-b*3p@RBJ(>>)X5n4D1{W2lGu zSj^2e*>+--Tajew~QVy!0uP`DPVsxj+rb9W|fc*Nwgl=5a6IRSGzR-nl<{Z(v%u!1-*&ie;Fxn`Cj~2FIOo6yoU5>6)U*};Q8`a|E1;IPWFmFhMZ`DVCy1!gyQOfxjLQ+y~_RN#TRHJNO~ z2od3>A04=VsrDZ#g>wk)ces~^$iUo-AZPu|bbgEXf9>Jid7oSlp9nT?PFYrIhegtM z1wTBj8yOwCDFub|I!bj%Z$--aR6qBz@ABsI6tq|d0c;!CMKObH^YJnCgRw^~KyB5TXq;sOS>KyNIaw0uLm2F?YuD4#wEw)as#<|PMHm?s#x=)L(AR(KGnR*-ogDtyCC?Qigno)jYq=o~T~tGN^vPM@AdYklO% zCLbT1NF(;Dxb?%%{SJpwG)LA{6?(!>LuL^ z%<^QMoS6z6kWwZ?v61WS|A(@#fT}WW+uf9ah^R3Zq}o#z9_dAyJ<|r<*rBG z5RZYe{4r+*EI(Jn7B)QOXr7#C2t}HPDO}1)QM{znj*xS~x8ha;Ww6Bd=cB%X);OWZ zphm$#clhfe7U*i{H=pqT3itcMgZB0%~>N?L~jDbxjl z>mSm8_Ec&3zk8QbxoN4QiVSf$TmLXu@ z5!ZS6QUC60O63aOKdiJl#>CXp2TN~*C~<}}^^KSlr%t8(nGeB*ii_Jhw%`thO_xRO zs*zpFX`lV*;`&n@*Hn3?AxTEs8{dX0LCye3e_VgBAc5Ws*)ddK?Oq+J8~U3h6i^n*bFf z=NEQjHv)Nuh5tlW)`9_Ht;O;#$hC|yoM6fmQl=B)gpwEtTM|R5;u+NFjR434fIKyk zbIef`w6y;+7?bb9zT(6I)-7uC{0lr^L_HVU>C!iD;3HQFu-ESaCNCcY8peNS1zeaI zfv~S)u1xh$XC2$Be7x(E@Q`Db1{H})kWfM}eF(oCvCM;*^6fOo1LcwN;i*F)uhJ%L?vqrm7Jq<SFhyVukXBLrh<$+il%2f93FSpyR~KN(NHE(BhAc`+fYlTlkf{4@ohg z3w3#S2ZR8A5&R}Kos5n~ql!`qhUy8SD_BH8kFp*)(iG9WD zINF_rYkGRn7pIHN58JDBzbQ`OI{$ohvo--QKWkaYY=1nv+q32xCM#wX-a zXxKzy4hgiI-Qp7)hmM{`?e4+q1UACzfZqjd!r`x_-yNvcL-4=yIU(a?)W6v}=*$X7 zJ58v%Ah21;pP27ZPD6F?3!{)LDFl zneVnTnG9VQWLO3e8B(2}-{4IHuJ*qcB~Ua#WGNNYYIo=T8@jSwK*W$1lhO+xDurq%A6od*SK+5i6kCiD9mP|P$Sxfp>ObR;MUxp7L zq2NS@RRE9ZG@m{lB9=O+0YDQFReDEFA2JI}@1Q@eLBW)^+)GQbo*C|PpP!%6(mEqj z31L6f`YMMy_9o9=P||le?{fILkZT2k&BR54>3^12wS5#;qZZJ zK%AzTy58V5gQ*JtT5b-G$hOhr)Kt@~au`nu9g1mjakP#Y5^h0l*#`ufNDr(*%>n7; zBPbH+H$$t;1X@|Ix9+aA+zu!Ei*q+NSDL;!X3gQ{x1arD%u+oGPnQI)0+hfqBKQm# z4uNI}xdzxR_pJ`AgM}(kdJ;O0pyVHb#baY*qiq?>)r58kMap3z)}DTAW-K8Vt~cL@ zbgC1`)e1_7W;kfJK&*=}yO5#?!jdjM5i$=b)jy#+f*!dOg#qOqJkx+G3A_p33F-PE zs9}Vzg5ZlYauljhhG;=g`(I1a?F@-qM2}qHVVmX#8~{jygODL7$jF2KWE2XSjsofS ziRxV}2_l*SvLOiS2->jU*6a{`Clo_%LAOx1+?f<`zaX(qh3GXxRH>dk{UYJDgJ|%7 z*s!&I4m_*``RNYt%gg6Z<-ysNLS7j}Aq zM*bFJrkevW@8LBfsR9=sw7;u{#t&PNO)tQd;DDV%A~M*z7qE3Z*k(RENZ~40T1BAu zDgt1lJG^rLJ6t@Gw-pCz7$U-Tt@pnCsS|RSc1qLG{HI)f! zr@(c(0i`emW%4Br><)nHL+*e08(nV4_UsT{UR(#3)OHJN;%vj_f9YR9MYFcT3THc? z?sIlUx~4g;83Sl?DMN@}5ZEq)j!N;|!WJD3Vjqd~dO>Z^@b^WGjN)DB%EANkfH$KKrJ|W zrw>pTq*V&uPpivB0yNwK(FR)JL?ASP^`g5`8hyoz1`z;wPk-bg>M!QBphNCZB^R5a z&IerAJ*Q^IDBz57;(v=FsMsso+6m_)yKw`>=wlgs_ic*r^n=k~>H~9aefd{xMFGJ! z3`lZR4I+5}@+<#s9lc2V|0_$N5D3rnz`#1FBr5^w06IM*`39he4WfCHAx2E@k)VtE zk4UH$*i3F#R#YyEibBWt4qVs;nj@hRfF{`M<^h(I0*y@S6==Q#ItcpKEQpl^Y{o?p zZ$uyr;GdyLat(kjq#KQYQS@CLk@x`xI9UQ1gW>mG{PE+*b~7EU(qnAyk)X8wCl(wQ zY^IIpE(FeC(X0u|#OjjFj2rsK9n`~=&uDF_G=k(z=XF!#qp0p7G0oEpq# z$fjE?_>0{CfR@A-F_ZRcp#N=QW=Dv*VMlwV;l<=P9&_U$XpTcp0i|X9n3)CySON|4 zQK$%+`ya-e7&NvYGAIH_izRjAW~`)oGYIHMRV*-qmsKIA2LKi#aeN3Z%`g*WMN|C; zTsEoOYy*M4=hcl@$Fx!h(2&YS_2`$^QzTCSO#gu>hwfW$>WLA!h_X>1VJV_6F0sf@enK17ga?t zG$3LVl&4Dg=4zXxl%PjZl0oVH0k2aN5$Sb*5g@(NQX9qwd4eKt4wXrop10lpxa{n4 zSQ(Z{DaC~m2K0!$Bur<3a;iTv0s{&mH{9LJ`jbzV#{H|SXx3VY!Bn`|5JK&BVy%h zCF;|sbn@E10)o9yc%$E01{R{&`M{ckG7|$bHx258%TQfHM8ptY2gp@E0xyM_mBR+z zzuS-BAQcI%rgW^?y}ht*d5sV|+_E<&on(3^$-~8P-;;^A)%ionI@n@^0#i~15`!>z zAMAi@2!s^>J~TU^EQWL?Ff`Z!IF{tK99^|yOp^Ljg_4O^$x58>=s!Cal5-$nj(RJD zM|%}*l92rtFtSjgLx|yhK$Xez2awa#L(DC+J+fGaumm9Bm@DxDJs;yZN z#Cr^XN+tRD7>|MAZP-GSq{^1$YL{fD=w^^&26Z8QP%lG>)^k>f&=%-@ zpN94i{L@g_`yO)5!ImL?o@sAy`$Q1AziNrH9>P6B8hXH|acsJqbaUThw1ZWMe9tTq zr+WYB?YIYDk{V5rpasyJ2oTB>ycVd0p-^xj4Z*i;LfY^hz=DV6EASovI@?9lWBP^f zEjikT;adsH6rwiLx+mKRVa`e;@zabAogA8_R*@P^BU)*skZa^;Xn=#J2#OV&?cQl0+5rvezy$x3e>;ZkA?|73xN0v~*9N;mIY{}?lEp;? zdrcIEE2bdEm*6$haLaI3Bgw|Vtpj9DD{5tP6`>6eda+k*hF<~G&kz6<@Melx^%H^xI^OVNOd|&ujRu^UR+5K%e?~sN z2<2V$jiP5kG;4D^W~QL&iWV&XSS(p;kCyi=w#K?IjqcXo&XrY#-1=~9t1K@bVhv=1 zFvb=&VYovK=3ThV%$U2&9vcZ>2lE3H?o-{AeR}1%2OB>2#6_JME0kQNSD?Fy09TjO zpn78NFOO0AcbfjK)HDE$acA^kXU81>zOGHjIX5Z8?Nzf8mwnG9XDgv=afMaea=8)1 zSv_IaJ2%{+tq0WsI_Ok3tc^jZ26|G6RNdi+1Mu$8nns*Zk0o4`3rY&<>4}YE0$o)E z?tN%reBph2gQHs>xv~dEgznr3`K*bwa<62mnvS%Z>H}Ox&)^N$MuE~@>Q%kcY!jGX z;0LW62GGa32&ga!(sOhTZ_pqLmj5)~0y<81z+$@U0-WGVgykxIuclC_d-qTo^~_>XaPt}=%}@f_Ed-him;DQ%k(NNRG?Sk4Fm_Wd zPzRUddfo-fqAAjT#N?P`^OM3oN6(UMA|w%j!-r^Fn*0B@B0nx&@?CWtpqO_0g)(bvN-=nWOOJYX42M$#zwR}ErBxfl z=(jTi-)a^nk8taruHH{Xj0G^Hfy(qy9cP|Y0!m)=*kwvZN9|`kpr?^3IdC+N|E+=Cr_N=P&|Q>R5_J@pWuRRlI0%6d`^DS0lu+UCpMiG z75k(ZPcWIekCZ5{-)6G1-I5(c^0L&lv}7pQA^IaQE$fxfDxTIiL{Q~|Fmn&(zuMK= zP*3H~vrXa^fLap<->EYLFGssEr9y^GXa#B+OWiu_ZVCnlLd%1(Hn^I3 zO;b7_iKc%Lzf-yvsKs~z#jf&IyiE}V44#}YC%mU<-KStPW3NScjR*&zAkgAr{j755 zZ#-?ntHT=}3oO!iTI8E6ib-w`19JuPRHfpjK|ypQ`vW#beR-_^R8wfYceYjX_|(1a=la^r82TMmJ*8E^O5#Cc~h zQnXX}^+zU}WIOn5&G)xpP@BZ7fjQLAr^Rd(%?}Qr?2QmP#JHum2Ugm+XvzDcpo|B| z2|!sfM}3pWHEpx(M0XzHQ7R3-D`@(t#B+hqv%@0Km#cWKkX~?PU#g>(+*z0GOvlQ< z*A)_4&y>X3n$XEO-d@ZHy5}|BIW;*titB|SV6b-l$>smZWW)*dSc)M?zI>d%F5S$F z(|vbh&IOsZGu1zMv$RHV^Hp$jC6CUL-DSe1okepQ>7p?d$ITn&jZL8z0Suz-eE!FA z>H`~@VblmECQS}UIsn(CsbQ8`IzcxhqghsGe_toC-hK7fLeGeSceH+mAbp}&HytT0 z?x#=aSjrGFz$?+WSPArouv0;*_p)Fz28y7XnYgYVctMO=s!35iTme5j(jt5o20?3) zR^{evTo6sy_fnsK-arYgL7{y4DBp`lm?*tZkFd=%GxE@>Emv=eiKM8JLhY>MNE{r4 zaz=14Q?X{&`T7fM^IUneU12-LY8sT#7UAw*i^5<`rib;0^;7WM^ONahy7JGSpy3Sg z*5Or^>MsO(?tjc0EY#fh+Dced5wq+IV4{co94vofyiV428xN&l#1`G3hO7 zep{v!l;iv*ToSRQ#7X@smuzDCuSbuwKyUAj& zwoS39O!GayS}r%ANi#Z$ZN<~FFDmr!wbTY@$RYtgxq$idkf`xh0yo#F1X~=_HeoT3R%g6*x9n%yn?^UZ{0zE%SmW7AgNOQ(8268Dx|+!&(^=9!ou zXm0K?XeL%$t=-PQhm}XGvKj8WCK<`hmgNjQR$!|Z<=(@E*DCSUs_NcueoBH}0)c{xf<4+RQp(6Lq2L+m#99aoce@^rNPu}bKh<<*CfEwe z*ehs}HJ6b_CnnmNzHK^2zP5L{+60dC z?>+4p&YX!}^m6rRUS6gb!DW$YVwLXB2@5L}b!B2J3J8qU+gTimDrf_Jxj8H&-LZ<7IxB6qRwGpufzTB?*w6HUv_!xX(D zJHn&-ez~0xQqRBmU?1;ejcV7qS2+j2AG zFHJA)s-Fu-3i8DYA~ZzHm!OSsAT4(-PZ# z=X6FMDd;>r3O+IQj#QUkr(K{)tE>d#ytgvVFWSU6QEx7s-RN!&Wt|XQr7{Q)OWoVb z;I5(@8Y)KzIL~y{yrkf6waU2_!ZyB&BXoPLi9+b4o^Bl7c<#Z*2P3Soz*^(@(2&W- zMXyf~e2WH*eB?0TVrEX6o9n8Lx6epqU-+fIS@reM?QWQ;ZK$fKNZ=+m3p`;@T^qrL4S-J@ z_gU;c8}*V)f-H=`1q~O`W>gw_VBEIiN57C!@AWAfop$%;CXTV+`bO;>F5nXM-^v7{@+#AvFNZVIsb?x{X%#(`R=h(n`7K0V7ic1& z=xk57mZ|DCG8N5_o?VLIvaiT5tS!}lO;Z!eV{c!&WV`kBC;M^6Bg5|U&QbbRx(ePs z=(K+2zTrcGnNPffgP5<5jNU|ZLtKg&}I$A`GVn9GTrH zHzRA$j@H$-IPhkwc2Ixvq=6SpNQT=c!N=AHT4X*u-?DzF88)6uk|j@4W-;vH9UTuc ziJB=MR$)8u5zB8D*ngHiKfs}c@&@jTa~=@P{shVFh|-5_*d58n{7MU{BR zOPBLJWbL`-_4}sNl$T^>+`HcQsFkB8o|eRsG$5d0|Kgc5pzvrDQU>GBABQXM-%M$HtNU9RmQpP4q3!6@2R~czChr7X9CEz;^j`iG$3# z6zf#&#c3M#lKeHEX_v*O?)lCPKkFe(?^1tZ%c4gYr{UNQp_T3BadcO^u1iLNnTcJs z>jz7>xgnhdRQ_7okJq$#v)zqk*#soMTPr5T*mfnY3v0hj5->1P-TL{AP^`BjTT!9*CK z*MC-!o{z6jdw-!E&DQjq)?V=ISS^~u`^ynG<}7PH!^zu1*XUt?h5p{(0PkA!fVj!=fJ70dnr+^N48`V! zK5GrrJC*J=$=A`65?(ZKM75m9hf0(w=Z1&7=i9m;J%T*Z#APS{Lf=H?HN4U}E&c4f zX9Es2a*UhZzNZwu?umvfU>5zO&dwQMxd_ZI!H74PBD>Wvw@zn$V1!Yh$11AGx@$ev z0iGJsQXR`Kt>azzb(D1ChFxnQ2q7XkR^Y>(1%M$!^MisS0yu$w)a9P~wDj~80P=yI zAw&>jfQ*Jo$QZ_uXNZ#L;57!mPC+g^5otB9zCcJ_s))1Wgk7mcu|_LCs|; ziTnMR&&E_v7Ll)FB@9}B3{{Hcy9=~2DIStObQSz??c>)dxO^>oFpX(&p^M}qkf3%6 zj#8n(ce?-7&n(`-;|LVhpGTFC^+VdmAR`WP=^urE9m==Mz=9i6N!4Vvt?sf3b-dbGfaxDG<)8K z(3w@6M_49js}fRQCYtV54y5HZ81~fMZIg)F@Y%64T(_L{pgEzHrN$wov-{?v{Y(+u z$`Nlo)0WU;4|m)`bFnik`qkn}h3|E-ueW4xw2p3!On{{IuexiICvjbO-w>3=tdiH# zi+_WAM*#{+h`cbgm8OR)K_LksGph?jvi{ex6ml3^Eo5oNB>r@3_St%G@wk zB%wq-CT#X;i)B-c3^VfBy{lgkQ0|V4mw5YhPa(+tDe31+YBv7GQZ6Z{t;UBJ78p!W z_46M4N?h^4l*Vb#NHIZl>l-dou&l3bWM0u~jSK0~=4fB5sK6NOEmp9Ulbi9mU$G1h zbDZ(oN~>TLL&m6t=2o*lMqBdjA5aM^+`84U_Mx_g`?+PK(VAR%aL$9sR*d)Lt6iyV?Jo3A zIZeC*B?ly_b~El|45))$7PF@?(s^ynK@FrDYoHPN3GywJq$WMS6n6lU~4g)|X5?xUvI6vrPF>=d;fdux`@q`|1_jMjn!- zY|BSq^3BWhGys8=T^l~Wow_#QO$wUl!USIbl&x(V1Gtw~^vMd^1c=+x)twkt86y>{g*0bv$BsaEp~@ghC>!(OE$(yR3C zqqNr%y;44E2%JF0#BTi!=cZ~v`xahL@?6@88t+*(>b-O+!7-rCyRV28CLyvJ4Yn*V z1xtIb6VLwYiORWORD(R*{oFk)Nqa_H82N)fH@8NqN;M9{{>x0Fx?7vvAu*g$VY_RZ z&_GCxWB;}=U+fpk3W#BoOFWn*IjsyH&uxt{^_s=ykA z8G(GMOkn-;Wl$}BTz_xN4sfrsvLD{?v(ed9oD9mV!tKt%+ux(27P)d%S-JBB6JhwbemXEyRdGBk&-aQI2F=Ilb(wa)U-~l?3CmojQ575dmuRjWtM5qj2#$U@ zGLF(6Uqkw>P(Ow7hbO1|$N?Sj{B?wwzP@`VAu~%4EaJr7g^gjnqg2B$H4RAXq2x&I zoI1X_Tu-g`{AgD%iYtMZ%fBAoC)K(#l+LBk5G>Aqj=)>Lzs0&bX{qK1I^wbtcZUKvRqU2jY z5LpA@Us?nc0VE0>6ey{^GpH5^y}A!R2m5r1SO4zNc4re`bNm>$%Y7As-K>r{p_=yO zZbq(?%FbF^_7xuMT9ZKxURW*6I1AhR=HU+gN@1nc=M&=!1!xRe?WQZ!MdjAp234Zv zdZ89uSa~f^GTQUiZyh{*h;Y8ebFqo%sLSVyr>s|80)xP&&@jOag06SVDIat-q3apM zxfK^8I0-C=e$j<#nSTQ9vW*4o*B4Leg&P$3b- z%|aT+Yr*H3`(Ha=*FySES4+Rl$pbA0Sx|VA0nfb=acE0X7rvw7J$9OhGhl5l3OfHk zXGKmB6WdD=6W0ZGa%puqx|Jp|C0T0q^(&>navIlO%P0{d4ssU!JQZ`o{`NYiv1Vrx zPc>asgwRP?$h+Llp|79e6s{*kXS~)nnVI(Q249e4v27AqZ3!}knGSn_7tcs}M$EoE zvk!b#WaUT6;~OucXVYRP(;#3mRK??=V^^xMCSXbAxhKH((g9?`)Ia_|5%CDo9(vt~ zI22G4YJo%$0y@DUJ!k|08B9ugTHD5W`rODz%{*Mw^Wj(9H=6GGDRjSl{o1LFkt#JI zl+`4v>xxx^B{;sK?06Bv!D<`NQWr&iHddVFjUkd`WIPE$l}}Unfv6LnBW-IHJpjb zP#}POVwS<6x{5AJ*t3LgrP8b1(raU_#p8B#w0&lse3bFxn*gdrKt-|&ePrd5A1?NE z>${#VLst6!M!Ybzq}^g~VN0icCH8}J7I<`;n1>?j2HwY8xY_L#&2=R`)mo>I_f9Ek zj+!v%#)v{DXoPk#;!tD9@5*ZC`xwdN;Qj4KW{p{5BV(#4p3IHh8$?@u&UOXr zs`*7vQv_bsfqp`EPhO3ob-13~QQLKH+h5@oapF9AZ3zMlJ^E!IbtjVVOKZVAANKMt zsNaw97ddaCxjUW)S3kV_>fO|QvB_eFQT>m=C)UIGxOfx!kLN185+IaCWQJ+d7mu!I zM-Q&?mlVL@1l*C})w7VyRflLTswqOx$Bi9b z`9m#9lh1I^eRL{uqIxCEKmrokzL-5nLQ%#diEAcT?}SHHFHPr=?OGu(37o zz?2_FhG`w9y*;c2j7K!`jtILH4OJz292c~eT-X^F6S9jf4ai#z3%d>5 z7^WR~j=iDe)<~&p!UZOiq0%qJJ9M%Sro*BK8{ME#TVj^;lo#K2^4QX^tfpFMC(j+F z2<4ytr8$36YTvfYg|yoMx?w|OB$VMff#TxW5gZ)sNDyN)qh~2ZyWx2oWN&k=+DpefL_I70?k$WI@SZ+^W)So*No`kk zJ7Q&TDRPJHR3EV(G*QNgM(9(Ach^OKHx3iH8p7*k+ie3XKw-)y^M9!cZr^F zz!MP4H9)zx$h`JO`1u5k8|i&80? zgPEP@ZtT;8%E1#Y=nyroK@~%9R3OjN=bIV3N7%UC5$~cH_?o~J5ov8TSoClL{njRZF|=K$|5BXU6$bY z7>6n2#pefmWShUZ`X*xXWcKloG*z2edwTh8txOPyELMdzKT#eYEM>{lN)m~LDhO!Y zjmlKliCJU{w2ms=!0bZ#weo|3gx0G#F|Mem0k81)cU6mcHQwWUu7+@*menFAmh?Z4 z4p>UQZvR4@a;oX!khZf2qliZ98$~yVouZ1#ClP_t5@F@uFK*a-?r!#!j2a?%$GLkz zfc}j+DA2EcS@VP#%`{R#NJN5HwXYrMVAFl<&Bg1y6fW~LKD{Ppv#@D|WiCV0!>*$XN+LzwN=pI8k5x~%YRNZh=`{JPavZ0L%%VB}OnSQwK% z$F-?XP@&4`6w@-rJe+E6WYpKa{~BxlUzB^n>qi787V<$1_LQ3eR3?h==b~QIn%v9P zd>6dS0Li}oEFWJrw^^sNK+(5Cn<|{DJ&gpqMi^{mtTW#ad;t_N*+1Ik?c;m3u9v18 z+-5?BN`ZuCzq@b>uUYE!sQP>c^O42INt=njT8M{uFly@rIhu0#7N z$wJfcE752z)z;g+ha%3Xw>KLpS3f=O3VgO&wR@_!Ld)6dVE*c4j=;j;y$xq(9nhg9 zI*Pl$Kj64C(+O}3G_5Gq$@Mc;u-M&|NgG8uT$tnjhF_-WSWhMk$(p!V?;b_4*bmq@ zet)0kr;yb;dwZj0u1~ev4_Y7Wo6BHCS3%J}TmrP(pB1(zI!_)eFNQfmYrDI?AuN8X z8JJLOFz%2R@h(C-8+EGled@VBmSi=KQt?WWSUEa{3~bZ6tVCK5h79+49Yt)%EN zvlja*Ty}}l$Pk>>IpV=Gf@}jmMdM(j7$Ned^~jZr=U6kzA8RLC=oB@OTXciIXowXk zrhn0%*31>{JO9KIk;K>nt>3>W*Y%poxEGu_ZPz$K$H{(E%{Vpgd6qPZ(7hP%=<_nB zcaR{3jIrs_?q`D1s;%{T=nmMMn%L{s2H<6B;DG59I*mTKsqzxO5qjDIh0vqyJ3``k zshko5EvyVoooEUI_{VRUUyB>`IV(LRqHkM&!mX*7QHZ3ZW;gRmlo)YMca_09B40*G z*2MeiPHYqT$uzk}BTgk0yDl{m5sFhY(gwAQtx2;YWo&eJ9*8*tIjc&0Y$x9%96$iY&H0@YyQwWr+|9d6a&Zkx{3R34x9P$xVztFI#Q&a*M89mq+*OS zy*$cK3~$NYeziwK#U^00;Jik3qcgoDMnENsx8qOFmq&5d(fGyc;sW-z_yT^3 zvGKifK9K=$)+D?%8A*R;=DByZTP!f7NnZW^tscE8eLa-#(n(s2Vp>{3rT*#>1-!Oz zAGxY!WCosgsi@BH{|E_L__4Xa(?P;_D@&sf)mc$GbhX?}ykV&Mv&J5yV-2cB?N$>FP>qit_X9BZYtAbJLf z(o#L#&-j%Zc3pXVV#`lfC!(A`<=*>}N=ln*aL~_t*`-Hsy>x+IL`w6ESz=#TMY&Vh zsZ-}?e){|9RulYuD@QT2){_>(l6I11u8i1EG=rY~>c0L!L4E7p7tixqruUhX@IGCa z^iNIkNG_UOM61bXnr zA9+tiEQopIs-44kyoF|&E_WH|dJx1|Tzx+2?MINA8{);e_eh^aVr^Fb`mkm8G2df#*XY<@v=7z_kW~&bh+bRrvD)s2NIbZ5OUR(Oo(O=j>?{X{be4qDR z?{{8%*I#P3RsOVWS|_(0nC=oy2OHyU&vZK1wjS)(C$J>pp_(4Q zp%&TmtUE?~VY0PwKzeQZUh&n~%Z<-ACFw*TXqx0{wCtZqa$gG$546v|L;G;@b~$$I z)fs2sw=Op2`TZh}@;5Mp>ru9hn5-YcS70WjRtW3At4?jtzCwDz~u8fOI<5qKI->A6BOSQ~UJ>7+Fod6#) zcT&Fx!@Ap367vdpU!KVZPz`9&@82eLDeI|di!<=Z@k$u>$Te*V7%@8*@D=CNS0dq~ ztmpf`KlM3?J?V&&tfitdqgsm**Xu9sRInH+Lu_0z*L7)?!uP8k^6UPRv)z5sXBd6v zoYke>@XB29^{|UVt8ZoIo7R3G0d}>#gw?I7^(_%xVHDG#u1_WKJqFa1QhxQT_kV0W zvKmOA_VMzJKO?SBVqO(m;;#F~&}etDNAcc0sg{`a?_@#s)e(ba3?B`MrzLGqv@5e; zRBmc6fa}6S4c7`ECG|@GvFfxycwLv~KV{svi;08!bbtVfl|Yj?X&{u01PTk!0DIT-=F{K6eC~d_WOABa7Af& zj5*beUTH@aaJALEHj}-qHf=K%8EJn3n$oZ-fKRSX+@kn|=iJ2+TOXkcmTCR{g{R(2 zN%T%ZuX%j97hfl?7}7N%`J_ zOGoncj=@sr55W!#;X8ZW_cT`lZ zZY>V${rb^(WQQwn^5(DGLG(wWr?(HTr*0HHUo@CjYf$Hy6~_jpLYo^?I15I5~i zOhmp)6DO7TiNkMQJ42zPBh8tsczr&NoNc#yV^^%ba(9SiZ}ggmE#adVzQ>u274Wfn zcuA+H1rFDVH>1aUOa9?csfS;VJX|wBSRAMv@D`Iu^6>G>j2QgAiSU=8J2?KwH$@Ft zRBt{#O~Gn4^y>hKX1yM*1}}z2POi>b!Xw_scZBy!dh|}MaUrY9B;a7fwfL@x&&4wH zu2dQUUhzlzN|JELU;7@1UsGd}mGuisN|dM^npNQ{oto$iRzM5@@~HOq_JfCx0Xgb| zX_qS}NvG>JUG^4+Y6(}LJP8N_yZE5`)S-#OBSHkVOAdYJk&Jc=Te*kskk6O1ZSU{x z>-m(jOb`3EaxO?NooL5-@(qfyzg^CMJ~=YnxO$tvr824J+0x2}q`dRqn@ddUVD z1>8S>>csiK)=RF_qQ`(w`sOxOI~hZGYXXlOzSn{Gj=LSYAdOQ!l`F4eP6bET_peur z;FP@+vsoPKVds(L!FsOuuu1rd;`W|X+ASn12W?Kq> zRma>=bZ6j@uRvyU+FX{;mog>;#)36^Yka_u>-8=cJ%>%v}AxGFJPxuxmIBy_@ z1lri)APkfW^=ftj0d>$SslrqODES98UM_f0@Sh8-+SX&A@?$`;fXlysk9|8_NnetTIf>^ki>Jq z$vN4shX&aQ0jqws2(BH4`wyV1|8v%_ztkZEc>_>9<7O8C(~#u(URTR}aI=G})FY!L z3KL`TlJS~^m$tCubKm3mv^YborKP2y^rjKAGVB09;#7_RQFg5ckBl7@xqLRiFg{XY zfd^^Ilh48ED;dhv^HH{wpMno*Yy5EN5Kgu~HU#ZRtgEOuJuOVju4r=zxx>P@-v9K~ zMfXuZ!d1|ao&kZ*_Cl)I41B?9fCAh7v0{d+{b{)F&PDXZ8)o=>pSwmY1KLi)ExI34 z!t`LU2SRo$G^|`)o-&Gu9dlT?J4aamZ+Kx(s z>ZlRKp5qSU!05hp324Yw7?0DZPrrfdObxaXI`^ZY*h zo{6(jAd0J^qVlq$ZS>RQ7SN)8S>Xb|(b(F$E_CpXzwHg^BW=d*fEw-{_}?&BKDKQu zO5eS4cSg|%E93&Ln6S{$`-rkg;tHJlD==J#OJyL>XU{^MF!6EQr>RkgC813^&%pcx zI-Oz~mNP32EVVv?SFBWCtw#4%S7X{fn7;M`I>AU=NXWfcAHO=zd_G{9m~a4UVENL> zUh$A~?2CW^eo)jb2r&j8j{!!!63$2IBek3AC)}%9PR+bsTb*N>1v3AjtnbG^y%l(L}=ZkUrTaYCxd#6?gC z_z2RYpJ#!2vR06|_ieciABFNoL;8`a{5Dk6ex!0h+(=(VFe()?r&+383}iQw5Atut z1%L!m#>oD9vHN7S8PGM^;65sVRM;<==-cK5B$G}UkL|c`><`ptrO?Z;2t%GLE#mcg z-fLVk5`;>jpoY=*=b`I@Ll;q@G?=z788zo@1#+x+<82!B{NVvRgKuq*QO zehcb@`beY?@CuZa>B3;?@3iR?2e{!=+4}Nwp~vZhU-pSMEc)uhZ?fhbBTI6G-$kJ$ z3A(bQ_uPN7mtB07glBRRhaUdtyCmz9Ywy)EA4tOO-ibB%b;dDs^CV)QY5ww~FQ4b1 z-TNFdSjjTB52=7SH@$?lkI!z27|}FhlyIKh29x%OJ7axQsWB+G;D_(HC@`!HK6xhs z><%O1%>Zmu{)daa;E_`jG3c^br1Nfz9GzEM=e_pK9llu@zWHoeOw6x8eEz4o!qjs! zJBvWw^cF2P3nCqk;MCjpwvpUG(vt_(=$9ghM}ap=!sW7Nb@9=(jY^$A&<$mw|BJFpmFcpneqd-p|bsvMbZ_I zb*M5Z-G3?K8+=CGv*ZtNjbGmLULzv6dicnym`CcSD{aS~Q;WcQ*40t+cE5H*d}IU9 zpD+7k1KHi-`K${yimeSh2UyD&-MZd)JR@D-K#nK%HCP}Z8$0~5KuW7IE?I?=8Mxx6nFRHxKdhcdpO;S;dM8aGpc*wbdKllt)sPz&$ zr&&PFfb09c9nmnP?~m;Wuhq{|la0A@r|iJHm(TS&UXjU37JBk~{;U{fSE(gAPG|tmJ>c2jpJqpt{b~Gu?<8+ugDc1AzF7=kjsZdCMIgs%2f@2i7`SRo8lsAcjxihQ(h zET_TtDP1{OLIKc(sm{G~`*!#_7!N@yB9{;q#U@)DnCs!SG30`H^vgh{2YTD|($6oU zbC2v`vXrprWV)S;TnypbU4rVXQ2a@;HC~JTj7@ZpzctG(E&v12ja(D!DYWFNE^Ci*8T9tsRaH39)PR5EA_F zKcA;S0)oi&$2AVuR~K*E4ubme4;Wn663s6Ii3X=A%&{_q5i7DIUK{bCeXcfF2?Fx# z(VUABk&)?)-kaBu!P+oq`v;6-VD7G|P*R#VZ$5)OP1SV>k4!WPILh&EV1((w*9MeM7F4s{*Za(z08N=VJAHL?7V>Wz=tslE5T`D6 z&BpQN2O#BAt518&;7;@<={qr(m5q&4bITWmLDJwRkkyHQvJu&i6^6Em~&O=2a6`Jr-6pY6`X(~OJ;7y+n*f#I+m0&(v$ zY!la79j(m+5G8Sk87p4hzR7JTj)6#C7oX1-RE-Md`KmTkKwTpVB}0(WNKZ1c8qvAgV<DE z@ktn+$Szt8CsQ>|jso$wGUn2?c5pLe!^2N^!gy6xP?SvULCS{-Vjj2QMt*~-j=b*l zuyfQfSUAKOk@8JkArs$B3NZ%r^y(tKg{qR0;nAZ6)L?|sJ9s+rDL}gA0U`AvC>ijoKf`8& z0ljhg2qYlLh!P909U>HfX)Pw>KHlThj)m zfKA~O#}LJ9FjFvPg zp^%sSaeq0;=N$yL{V?MNDdm76&w^KX2R&yeAO_3AQ)hrE&3omy&p`Vo6}0Al!4=U4 zp^^RljcSXA;Ir>Fa%lFR1rw#_Rh&tN#8JFQ&ugvgyeFvhyqtHZjMc=0CS5A8qR3|9orLJh=_L)LfSAOmhQ_=YZU zUOzyj0MVs}w6qIsH*(;mm`*5wTv zDVE@>rj{0UxV%VxW3JHndHXxh8F{6Xx|U@yn)x$o-xY?Ut^u^q9F+HwMAl3H?ST@_ zV%1Kr`0mnmtKR&dp?gw!KkX?_pN0iB06c#OxuWPOV%v!SrY0Dy`I~k*bt~I2lPYJQxLEyZ?lX zk55r$S>hTV?nM|$f_PETW9b3?B$BrJx;i;d@5r0_`U!AaKzaVBS~R;q5`mn({_FwR zH7LmSfW$GYELf4qbM)e#cfofg_b8deM{mPmg)U%~C$7K_YG`Z6Akh=(bjhW(DY+|( zE6<*--oZ#;hdTvq58vnp7Pl*nKs((Y-Y9a+@JQXy7SEHlo$ceqfo zI4i%39BpR&7;n_KQj|*NSf_2eQ)|XaBb;g*tPGZq4tWsrvLjDMg<3TM%zSpFVe!RW zk)R9iQgo@dok$04Ydm(q*I#9>2xR?Y1%};L?&P>e_zyR=%h|u_Knoz;NN)XEhfw2mJ9uIN*VU1|22qudcUo3+wzfX!_x(r5y`x|=W;nVZY zCfQqUznh%h-SwuR?s+U1jf41z!^ZbNuPZzNYq>|ESjDfd-jP^qm_=BNW5uwpD9-ZQ zJaedb3qMWg=^&)>u5@dvKL*b>fKgoiBAel>>IQhEON*Atk*nSOk6y;^!EVj&Yl_ zLFK>LAiwuUPr}CyJVp_I*Ei$B%Vkby{a5dajrH!*hjmxpudjdOGBUE?MpCU|B$wX%%I_q_Av6({y-Sx;25Aaj+Z@%1FU`zKsA_yw zsD&pw4h)@M(9yjutq0{ zLkZdOs%?sidiCU_cHq#VDjND`b1-3;NsP6R;6D4huH=%Q|K)w)!7CuSkWf21IsK;- zvoIjNb-Y5MeDcI+q_zKSyEnJA2PZv0vcv3kyEZI?mi(C<_v1%3j9g=a+Vayr3sDw` z{K^0VSFTygzA0pz09>a)F_sL0gy8-orY3CJVgMj&q!@Vrg%RA2 zm=`=cTYtC=oR^G&Rc|O9`I@ek zXE&1_{91n~FqKY`M@QfM`poSkSYo?#89Eu|1jMm-k$HO{d@*WyKzV0sNTjk~X&Qop zcP$Y|e_WjS7rMiHbGs))ZQT)BsNy@~c`?+i$O%?^d5OsOxGFQvDENt4y4!_iv_eIi zIwutZu;)@?c`gh&Y{nTSL-B0sY{n$%E2kNL-1-7AEo&$}D&`He?I>ESgz{NrBxMXw zp4$A}!#;NMOzf$p);g>+`f`!s2LNy6m`OhRBZxq=2{6W9qnaYd`%f1M$CHhKZ z_^d7uU%?w*}NH^xQB;o!7hS+NK8If+K?EoO@rrlGd z=Wy1G!HV&o=x&)87_%|^Qgd+2eW`R2$WGf1Ch?}tQ=O8dsb_M8w<$CK`VdOhe>cC- z7-A}stT4;x>XR2yxRGmxbLi$h=YA88&UBcdkA-xd@f(q)RdqHRS={b4;sQlrV%; zq$}~^PY-n+2H8H-)0Sh!x(>tdam*G7f44R1mIeg{^*kRNVgUJ#*Gx5wH*GpiQ!lyK z$+XY8uGfv3h|}4$Tpkxu?~Z2n*X}tk7?!h#$B~xSR>8kZOI-u2AG8`_YR*1B$FYe| z;`)CinPEK#GHG;C$3rX4Le3^jQwp|#0pW~+QH*0Ednub^^!kRfxx&oZ+JGmSaK&VR z9*q)_#Z+m+G(zwvJ18Io0R4l5gGqMfkR*`z3~Ewnv>uzFjay<{t-i->v$oLN4d)s& z%7*)8C$bu?_r_*6YAOyMJWj+*A{ww9e`Y@$a#iM-@HCDtrrf7 z`B335!_9NMt=EYEB%@cok7DXM^nO-I9Qq%=nQ!-yOYdB!!_LsedaF_Att@dsI>%vl J#;g^8{tH-~6-@vD diff --git a/tests/baseline/test_plot_wave.png b/tests/baseline/test_plot_wave.png index bb117721bc6a26b43026080065fc6bb26f529937..941839ac9f47f24a89621f79edd7dd45d22ae6b5 100644 GIT binary patch literal 49689 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%0DLsd z!D!&;k2cnU1R+7em3Zk9Z}a>PsBFlD5Xe`i;KeF*Nu}i5zo-6=eNQ`bq&H7b0t{GW zsOg(;ry+n+;=*wcd$Y(Hj zLE$2x!P zEtx-N({U-BT<#&zz6pM8C<_gkGIlamTz&v74EN$3SW3K=!0b06=M{*_SXADR>YXAV zgIqfRW}OQuW^ZqAGlZev{{dvs4}pz_Du1hAZEepqAzGar<8Usfel7i>7C`N5&J2{>gymrCkV z^ly7etygCDeSC}`sRkQjDIW~~HiGBJhRGZr#hEW#C8VVfWt07Zup^sbV0W*x(+EUl z9%~z$!1-STN|3#T7%7R`_BG=?Dm9-|?fxS>(*)Z$*qtmuBdS1IV(~gH44VdHa#E7A z%5eJVRkk`Me?8Q#@Df@!@cZ1)bGZ(^QKadTl7XlLlQV`o`)~Vc{1IOeac9PB9r2PT zFP&w74*2S~H~%S9T+lN6bGZN48&S%?bJB~QS;#90>3FfIfXuRZOm8RYZeLd7xI>o2moAk_vW@?AdO$+=d{#c%r;X&PIru#L@{tm{{JEaE_T!BwoxIH%-55&n&}p zIsb#L9ZGUBaI!e(;J_m$)@_>e63$duN!9)PIgsmJ+hI@8y(f7aamvN!aS;qjS%U?* zty~nCa8)fK;o+#EV@d8A6QTaSINrqArQo|IOq2|NKV%^9*&bS-<2a$`ny}?cH-wJzLe(?|%S4w^0rN diff --git a/tests/test_ndm.py b/tests/test_ndm.py index 3e6375b..f3bda84 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -1,7 +1,8 @@ import pysp2 import numpy as np +np.set_printoptions(threshold=np.inf) -from pysp2.util.normalized_derivative_method import MLEConfig +from pysp2.util.normalized_derivative_method import MLEConfig, mle_tau_moteki_kondo def test_central_difference(): my_sp2b = pysp2.io.read_sp2(pysp2.testing.EXAMPLE_SP2B) @@ -28,8 +29,9 @@ def test_central_difference(): 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) + 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) + cfg = MLEConfig( h=0.4e-6, # example: 0.4 microseconds sigma_bar=16.6, # example; use your measured average width @@ -38,8 +40,30 @@ def test_mle_estimate_tau(): A2=1.6e-2, A3=6.2e-4, ) + print("my_binary", my_binary) + print("my_binary time coordinates:", my_binary['time'].isel(event_index=499).values) + print("my_binary['Data_ch0'].isel(event_index=499).values", my_binary['Data_ch0'].isel(event_index=499).values) + print("time of max signal:", my_binary['Data_ch0'].isel(event_index=499).argmax().item()) + + # One event + tau_one = mle_tau_moteki_kondo( + S=my_binary["Data_ch0"], + norm_deriv=dSdt["Data_ch0"], + p=20, + event_index=499, + config=cfg, + ) + print(tau_one) - #tau_hat = pysp2.util.mle_tau_moteki_kondo(my_binary, dSdt, 11, tau_grid=np.arange(-10, 10.1, 0.1), config=cfg) + # All events + #tau_all = mle_tau_moteki_kondo( + # S=my_binary["Data_ch0"], + # norm_deriv=dSdt["Data_ch0"], + # p=11, + # config=cfg, + #) + #tau_hat = pysp2.util.mle_tau_moteki_kondo(my_binary['Data_ch0'].isel(event_index=5876), dSdt['Data_ch0'].isel(event_index=5876), + # 11, tau_grid=np.arange(-10, 10.1, 0.1), config=cfg) #print(tau_hat) #np.testing.assert_almost_equal(tau_hat.isel(k=0).item(), -0.5, decimal=1) diff --git a/tests/test_vis.py b/tests/test_vis.py index 7c614f2..40fef1a 100644 --- a/tests/test_vis.py +++ b/tests/test_vis.py @@ -14,7 +14,7 @@ def test_plot_normalized_derivative(): 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) + 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 @@ -28,7 +28,7 @@ def test_plot_wave(): 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) + 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 display = plot_wave(my_binary, record_no=499, chn=0) From ab790d45197457adde99aa3bcd0f5027bebca851 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Wed, 18 Mar 2026 16:22:05 -0400 Subject: [PATCH 3/8] added a test to the tau calculation --- pysp2/util/normalized_derivative_method.py | 147 +++++++++------------ tests/test_ndm.py | 31 ++--- 2 files changed, 73 insertions(+), 105 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index ea6dc4a..ef07fb8 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -139,24 +139,22 @@ def plot_normalized_derivative(ds, record_no, chn=0): @dataclass(frozen=True) class MLEConfig: - # Instrument / calibration parameters used in Appendix A - h: float # sampling interval (same units as t) - sigma_bar: float # average Gaussian width (\\bar{sigma}) - delta_sigma: float # std dev of width fluctuation (\\delta sigma) - A1: float # noise params for delta S_i (Eq. A.6) + h: float + sigma_bar: float + delta_sigma: float + A1: float A2: float A3: float - - # Grid-search controls grid_size: int = 401 - grid_margin: float = 0.5 # margin factor relative to local time span + grid_margin: float = 0.5 def mle_tau_moteki_kondo( - S: xr.DataArray, - norm_deriv: xr.DataArray, + S: Union[xr.DataArray, xr.Dataset], + norm_deriv: Union[xr.DataArray, xr.Dataset], p: int, *, + data_var: Optional[str] = None, event_index: Optional[int] = None, event_dim: str = "event_index", S_sample_dim: Optional[str] = None, @@ -166,63 +164,65 @@ def mle_tau_moteki_kondo( config: Optional[MLEConfig] = None, ) -> xr.DataArray: """ - Maximum-likelihood estimation of tau for each k-subset using Moteki & Kondo (2008) Appendix A. - - For each k = 0..k_end, finds: - - tau_hat(k) = argmax_tau L_k(tau) - where L_k is the multivariate normal likelihood (Eq. A.9) with: - - mean ybar_i(tau) = -(t_i - tau)/sigma_bar^2 (Eq. A.4) - - covariance Sigma_k(tau) from Eqs. (A.10a,b), using S-dependent noise (A.6,A.7) - - Implements: - - Likelihood L_k(tau) as multivariate normal (Eq. A.9) - - MLE of tau by grid search (Appendix A.5) + Estimate tau_hat using the Moteki & Kondo grid-search MLE. Parameters ---------- - S : xr.DataArray - Scattering signal S(t) along a single time-like dimension. - norm_deriv : xr.DataArray - Normalized derivative y(t) = S'(t)/S(t), same dimension/coords as S (or alignable). + S : xr.DataArray or xr.Dataset + Scattering signal. + norm_deriv : xr.DataArray or xr.Dataset + Normalized derivative. p : int - Sub-array length (number of consecutive points) used for each k. + Number of consecutive points in each k-subset. + data_var : str, optional + Variable to select when S and/or norm_deriv are Datasets. + Required if a Dataset contains multiple variables and no unique choice exists. event_index : int, optional - If given, compute tau_hat only for this one event and return tau_hat(k). - If None, compute tau_hat for all events and return tau_hat(event_index, k). - event_dim : str, default "event_index" - Name of the event dimension. + If given, return tau_hat(k) for one event. + If None, return tau_hat(event_index, k) for all events. + event_dim : str + Name of event dimension. S_sample_dim : str, optional - Sample dimension in S. If None, inferred as the non-event dimension. + Sample dimension in S. y_sample_dim : str, optional - Sample dimension in norm_deriv. If None, inferred as the non-event dimension. + Sample dimension in norm_deriv. tau_grid : 1D array-like, optional - Global tau grid to use for all subsets. If None, a per-k grid is constructed. + Global tau grid for all subsets. k_end : int, optional - Largest starting k. If None, uses n_samples - p. + Largest starting k. config : MLEConfig Calibration / noise / grid settings. - - Returns - ------- - xr.Dataset with variables: - - tau_hat(k): MLE estimate of tau for each k - - Notes - ----- - - This function estimates tau for every k. Moteki & Kondo then choose k_best as the k - with minimum d^2(k) (Appendix A.5), and apply a chi-square test on d^2(k_best). - - For numerical stability, likelihood is computed via Cholesky factorization of Sigma_k. - - Currently supports 1D DataArrays along `dim`. """ if config is None: raise ValueError("config must be provided.") + def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArray: + if isinstance(obj, xr.DataArray): + return obj + if isinstance(obj, xr.Dataset): + if data_var is not None: + if data_var not in obj.data_vars: + raise ValueError( + f"{data_var!r} not found in {name}.data_vars={list(obj.data_vars)}" + ) + return obj[data_var] + 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 data_var. Available: {list(obj.data_vars)}" + ) + raise TypeError(f"{name} must be an xarray DataArray or Dataset.") + + S = _to_dataarray(S, "S") + norm_deriv = _to_dataarray(norm_deriv, "norm_deriv") + 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 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: @@ -239,16 +239,11 @@ def mle_tau_moteki_kondo( ) y_sample_dim = y_non_event_dims[0] - # Standardize dimension names internally S_std = S.rename({S_sample_dim: "sample"}) y_std = norm_deriv.rename({y_sample_dim: "sample"}) - # Align on event and sample positions S_std, y_std = xr.align(S_std, y_std, join="inner") - if S_std.sizes["sample"] != y_std.sizes["sample"]: - raise ValueError("S and norm_deriv must have the same number of samples per event.") - n_events = S_std.sizes[event_dim] n_samples = S_std.sizes["sample"] @@ -260,10 +255,8 @@ def mle_tau_moteki_kondo( if k_end < 0 or k_end > n_samples - p: raise ValueError(f"k_end must be in [0, {n_samples - p}], got {k_end}") - # Use sample index as t-axis - t = np.arange(n_samples, dtype=float) + #t = np.arange(n_samples, dtype=float) - # Optional global tau grid if tau_grid is not None: tau_grid_np = np.asarray( tau_grid.data if isinstance(tau_grid, xr.DataArray) else tau_grid, @@ -274,11 +267,12 @@ def mle_tau_moteki_kondo( else: tau_grid_np = None - # Constants 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) + + t = np.arange(n_samples) * h if h <= 0: raise ValueError("config.h must be positive.") @@ -287,21 +281,13 @@ def mle_tau_moteki_kondo( if delta_sigma < 0: raise ValueError("config.delta_sigma must be >= 0.") - Af_d = np.sqrt(130.0) / 12.0 # Eq. (A.7) + Af_d = np.sqrt(130.0) / 12.0 def _logL_for_tau(yk: np.ndarray, sk: np.ndarray, tk: np.ndarray, tau: float) -> float: - """ - Compute log L_k(tau) for one subset (k) and one candidate tau, per Eq. (A.9). - Uses Cholesky factorization for stability. - """ - - # Eq. (A.4) ybar = -(tk - tau) / (sigma_bar * sigma_bar) - # Eq. (A.6) deltaS = np.sqrt(A1 * A1 + (A2 * A2) * sk + (A3 * A3) * (sk * sk)) - # Eq. (A.10b) random term, using Eq. (A.7) with np.errstate(divide="ignore", invalid="ignore"): var_rand_k = (Af_d * Af_d) / (h * h) * (deltaS * deltaS) / (sk * sk) @@ -310,7 +296,6 @@ def _logL_for_tau(yk: np.ndarray, sk: np.ndarray, tk: np.ndarray, tau: float) -> if np.any(var_rand_k <= 0): return -np.inf - # Eqs. (A.10a,b) dt = (tk - tau).reshape(-1, 1) sys_pref = 4.0 * (delta_sigma * delta_sigma) / (sigma_bar ** 6) Sigma = sys_pref * (dt @ dt.T) @@ -327,11 +312,9 @@ def _logL_for_tau(yk: np.ndarray, sk: np.ndarray, tk: np.ndarray, tau: float) -> d2 = float(z.T @ z) logdet = 2.0 * np.sum(np.log(np.diag(L))) 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: - """Return tau_hat(k) for a single event.""" tau_hat = np.full(k_end + 1, np.nan, dtype=float) if not (np.all(np.isfinite(s_event)) and np.all(np.isfinite(y_event))): @@ -366,24 +349,21 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr return tau_hat - # Compute one event only if event_index is not None: - s_event = np.asarray(S_std.sel({event_dim: event_index}).data, dtype=float) - y_event = np.asarray(y_std.sel({event_dim: event_index}).data, dtype=float) + 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) tau_hat_1d = _tau_hat_for_one_event(s_event, y_event) - out = xr.DataArray( + return xr.DataArray( tau_hat_1d, dims=("k",), coords={"k": np.arange(k_end + 1)}, name="tau_hat", + attrs={"long_name": f"MLE tau_hat(k) for {event_dim}={event_index}", + "units": "sample_index"}, ) - out.attrs["long_name"] = f"MLE tau_hat(k) for {event_dim}={event_index}" - out.attrs["units"] = "sample_index" - return out - # Compute all events tau_hat_all = np.full((n_events, k_end + 1), np.nan, dtype=float) event_vals = ( @@ -393,19 +373,14 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr ) for i in range(n_events): - s_event = np.asarray(S_std.isel({event_dim: i}).data, dtype=float) - y_event = np.asarray(y_std.isel({event_dim: i}).data, dtype=float) + s_event = np.asarray(S_std.isel({event_dim: i}).values, dtype=float) + y_event = np.asarray(y_std.isel({event_dim: i}).values, dtype=float) tau_hat_all[i, :] = _tau_hat_for_one_event(s_event, y_event) - out = xr.DataArray( + return xr.DataArray( tau_hat_all, dims=(event_dim, "k"), - coords={ - event_dim: event_vals, - "k": np.arange(k_end + 1), - }, + coords={event_dim: event_vals, "k": np.arange(k_end + 1)}, name="tau_hat", + attrs={"long_name": "MLE tau_hat(event_index, k)", "units": "sample_index"}, ) - out.attrs["long_name"] = "MLE tau_hat(event_index, k)" - out.attrs["units"] = "sample_index" - return out diff --git a/tests/test_ndm.py b/tests/test_ndm.py index f3bda84..0ad487a 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -34,26 +34,27 @@ def test_mle_estimate_tau(): cfg = MLEConfig( h=0.4e-6, # example: 0.4 microseconds - sigma_bar=16.6, # example; use your measured average width - delta_sigma=1.2,# example; use your measured width std dev + 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 A1=0.37, A2=1.6e-2, A3=6.2e-4, ) - print("my_binary", my_binary) - print("my_binary time coordinates:", my_binary['time'].isel(event_index=499).values) - print("my_binary['Data_ch0'].isel(event_index=499).values", my_binary['Data_ch0'].isel(event_index=499).values) - print("time of max signal:", my_binary['Data_ch0'].isel(event_index=499).argmax().item()) - + # One event tau_one = mle_tau_moteki_kondo( - S=my_binary["Data_ch0"], - norm_deriv=dSdt["Data_ch0"], - p=20, + S=my_binary, + norm_deriv=dSdt, + p=21, + data_var="Data_ch0", event_index=499, config=cfg, ) - print(tau_one) + + 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(33, 37): + np.testing.assert_almost_equal(tau_one[i], tau_val, decimal=6) # All events #tau_all = mle_tau_moteki_kondo( @@ -62,12 +63,4 @@ def test_mle_estimate_tau(): # p=11, # config=cfg, #) - #tau_hat = pysp2.util.mle_tau_moteki_kondo(my_binary['Data_ch0'].isel(event_index=5876), dSdt['Data_ch0'].isel(event_index=5876), - # 11, tau_grid=np.arange(-10, 10.1, 0.1), config=cfg) - #print(tau_hat) - - #np.testing.assert_almost_equal(tau_hat.isel(k=0).item(), -0.5, decimal=1) - #np.testing.assert_almost_equal(tau_hat.isel(k=10).item(), -0.5, decimal=1) - #np.testing.assert_almost_equal(tau_hat.isel(k=20).item(), -0.5, decimal=1) - #np.testing.assert_almost_equal(tau_hat.isel(k=30).item(), -0.5, decimal=1) \ No newline at end of file From d62e7cfbff982decdf81b3ff141e3f119860d253 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Thu, 19 Mar 2026 16:41:35 -0400 Subject: [PATCH 4/8] one change to function input name --- pysp2/util/normalized_derivative_method.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index ef07fb8..dbdd513 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -154,7 +154,7 @@ def mle_tau_moteki_kondo( norm_deriv: Union[xr.DataArray, xr.Dataset], p: int, *, - data_var: Optional[str] = None, + ch: Optional[str] = None, event_index: Optional[int] = None, event_dim: str = "event_index", S_sample_dim: Optional[str] = None, @@ -174,7 +174,7 @@ def mle_tau_moteki_kondo( Normalized derivative. p : int Number of consecutive points in each k-subset. - data_var : str, optional + ch : str, optional Variable to select when S and/or norm_deriv are Datasets. Required if a Dataset contains multiple variables and no unique choice exists. event_index : int, optional @@ -200,18 +200,18 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr if isinstance(obj, xr.DataArray): return obj if isinstance(obj, xr.Dataset): - if data_var is not None: - if data_var not in obj.data_vars: + if ch is not None: + if ch not in obj.chs: raise ValueError( - f"{data_var!r} not found in {name}.data_vars={list(obj.data_vars)}" + f"{ch!r} not found in {name}.chs={list(obj.chs)}" ) - return obj[data_var] - if len(obj.data_vars) == 1: - only_var = next(iter(obj.data_vars)) + return obj[ch] + if len(obj.chs) == 1: + only_var = next(iter(obj.chs)) return obj[only_var] raise ValueError( f"{name} is a Dataset with multiple variables. " - f"Provide data_var. Available: {list(obj.data_vars)}" + f"Provide ch. Available: {list(obj.chs)}" ) raise TypeError(f"{name} must be an xarray DataArray or Dataset.") From e02ba711ff4485ab20033ee034a8b7d304828df4 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Fri, 20 Mar 2026 11:08:44 -0400 Subject: [PATCH 5/8] added one more test for tau calc function --- pysp2/util/normalized_derivative_method.py | 2 +- tests/test_ndm.py | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index dbdd513..c4923aa 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -201,7 +201,7 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr return obj if isinstance(obj, xr.Dataset): if ch is not None: - if ch not in obj.chs: + if ch not in obj.data_vars: raise ValueError( f"{ch!r} not found in {name}.chs={list(obj.chs)}" ) diff --git a/tests/test_ndm.py b/tests/test_ndm.py index 0ad487a..13b9239 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -41,19 +41,33 @@ def test_mle_estimate_tau(): A3=6.2e-4, ) - # One event + ## Test one event tau_one = mle_tau_moteki_kondo( S=my_binary, norm_deriv=dSdt, p=21, - data_var="Data_ch0", + 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(33, 37): + for i in range(21, 37): + np.testing.assert_almost_equal(tau_one[i], tau_val, decimal=6) + + ## Test another event + tau_one = mle_tau_moteki_kondo( + S=my_binary, + norm_deriv=dSdt, + p=21, + ch="Data_ch0", + event_index=1040, + config=cfg, + ) + + 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): np.testing.assert_almost_equal(tau_one[i], tau_val, decimal=6) # All events From 319b0cc46cccba7412d7939c20a51830e592cc11 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Fri, 20 Mar 2026 14:55:58 -0400 Subject: [PATCH 6/8] comments to function --- pysp2/util/normalized_derivative_method.py | 63 ++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index c4923aa..4b87627 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -197,10 +197,15 @@ def mle_tau_moteki_kondo( 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}.chs={list(obj.chs)}" @@ -215,14 +220,17 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr ) 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") + # The method requires one event axis and one sample axis. 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 the sample dimension if the user did not specify it. 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: @@ -239,9 +247,11 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr ) y_sample_dim = y_non_event_dims[0] + # Rename the sample dimensions to a common internal name. S_std = S.rename({S_sample_dim: "sample"}) y_std = norm_deriv.rename({y_sample_dim: "sample"}) + # Align the arrays so the same event/sample positions are used in both inputs. S_std, y_std = xr.align(S_std, y_std, join="inner") n_events = S_std.sizes[event_dim] @@ -255,8 +265,8 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr if k_end < 0 or k_end > n_samples - p: raise ValueError(f"k_end must be in [0, {n_samples - p}], got {k_end}") - #t = np.arange(n_samples, dtype=float) - + # Optional tau grid for the 1D grid search in tau. + # Moteki & Kondo determine tau numerically by maximizing L_k(tau). if tau_grid is not None: tau_grid_np = np.asarray( tau_grid.data if isinstance(tau_grid, xr.DataArray) else tau_grid, @@ -267,11 +277,15 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr else: tau_grid_np = None + # 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) + # 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 if h <= 0: @@ -281,46 +295,86 @@ 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). + """ tau_hat = np.full(k_end + 1, np.nan, dtype=float) + # Skip events with missing values. if not (np.all(np.isfinite(s_event)) and np.all(np.isfinite(y_event))): return tau_hat for k in range(k_end + 1): + # Consecutive p-point subset starting at k. + # This is the subset over which Moteki & Kondo search for the leading-edge + # segment that best matches I'/I [Appendix A.5]. yk = y_event[k:k + p] sk = s_event[k:k + p] tk = t[k:k + p] @@ -328,6 +382,7 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr if not (np.all(np.isfinite(yk)) and np.all(np.isfinite(sk))): continue + # If the user did not supply a global tau grid, build a local grid for this k. if tau_grid_np is None: span = float(tk[-1] - tk[0]) margin = config.grid_margin * (span + h) @@ -335,9 +390,9 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr else: grid = tau_grid_np + # Grid-search maximization of L_k(tau) [Appendix A.5]. best_ll = -np.inf best_tau = np.nan - for tau_cand in grid: ll = _logL_for_tau(yk, sk, tk, float(tau_cand)) if ll > best_ll: @@ -349,6 +404,7 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr return tau_hat + # If a single event index is requested, return tau_hat(k) for that event only. if event_index is not None: 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) @@ -364,6 +420,7 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr "units": "sample_index"}, ) + # Otherwise compute tau_hat(event_index, k) for all events. tau_hat_all = np.full((n_events, k_end + 1), np.nan, dtype=float) event_vals = ( From beb9fcf817ae3647ed873aaac5991ba1de902bb7 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Fri, 20 Mar 2026 16:50:12 -0400 Subject: [PATCH 7/8] test modification --- tests/test_ndm.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/test_ndm.py b/tests/test_ndm.py index 13b9239..a19926e 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -69,12 +69,4 @@ 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(23, 38): np.testing.assert_almost_equal(tau_one[i], tau_val, decimal=6) - - # All events - #tau_all = mle_tau_moteki_kondo( - # S=my_binary["Data_ch0"], - # norm_deriv=dSdt["Data_ch0"], - # p=11, - # config=cfg, - #) \ No newline at end of file From 4d0d5d3a8639b80d18a6d454fa643b5db87a92a4 Mon Sep 17 00:00:00 2001 From: jtgasparik Date: Fri, 20 Mar 2026 16:58:43 -0400 Subject: [PATCH 8/8] removed multiple event capabilities -- too slow --- pysp2/util/normalized_derivative_method.py | 73 ++++++++-------------- tests/test_ndm.py | 8 +-- 2 files changed, 31 insertions(+), 50 deletions(-) diff --git a/pysp2/util/normalized_derivative_method.py b/pysp2/util/normalized_derivative_method.py index 4b87627..1a91266 100644 --- a/pysp2/util/normalized_derivative_method.py +++ b/pysp2/util/normalized_derivative_method.py @@ -148,14 +148,13 @@ class MLEConfig: grid_size: int = 401 grid_margin: float = 0.5 - def mle_tau_moteki_kondo( S: Union[xr.DataArray, xr.Dataset], norm_deriv: Union[xr.DataArray, xr.Dataset], p: int, *, ch: Optional[str] = None, - event_index: Optional[int] = None, + event_index: int, event_dim: str = "event_index", S_sample_dim: Optional[str] = None, y_sample_dim: Optional[str] = None, @@ -177,9 +176,8 @@ def mle_tau_moteki_kondo( ch : str, optional Variable to select when S and/or norm_deriv are Datasets. Required if a Dataset contains multiple variables and no unique choice exists. - event_index : int, optional - If given, return tau_hat(k) for one event. - If None, return tau_hat(event_index, k) for all events. + event_index : int + Event index to select. This function returns tau_hat(k) for one event only. event_dim : str Name of event dimension. S_sample_dim : str, optional @@ -208,15 +206,15 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr # Use the user input channel. if ch not in obj.data_vars: raise ValueError( - f"{ch!r} not found in {name}.chs={list(obj.chs)}" + f"{ch!r} not found in {name}.data_vars={list(obj.data_vars)}" ) return obj[ch] - if len(obj.chs) == 1: - only_var = next(iter(obj.chs)) + 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.chs)}" + f"Provide ch. Available: {list(obj.data_vars)}" ) raise TypeError(f"{name} must be an xarray DataArray or Dataset.") @@ -254,7 +252,11 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr # Align the arrays so the same event/sample positions are used in both inputs. S_std, y_std = xr.align(S_std, y_std, join="inner") - n_events = S_std.sizes[event_dim] + 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: @@ -282,7 +284,7 @@ def _to_dataarray(obj: Union[xr.DataArray, xr.Dataset], name: str) -> xr.DataArr sigma_bar = float(config.sigma_bar) delta_sigma = float(config.delta_sigma) A1, A2, A3 = float(config.A1), float(config.A2), float(config.A3) - + # 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. @@ -375,9 +377,9 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr # Consecutive p-point subset starting at k. # This is the subset over which Moteki & Kondo search for the leading-edge # segment that best matches I'/I [Appendix A.5]. - yk = y_event[k:k + p] - sk = s_event[k:k + p] - tk = t[k:k + p] + 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 @@ -404,40 +406,19 @@ def _tau_hat_for_one_event(s_event: np.ndarray, y_event: np.ndarray) -> np.ndarr return tau_hat - # If a single event index is requested, return tau_hat(k) for that event only. - if event_index is not None: - 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) - - tau_hat_1d = _tau_hat_for_one_event(s_event, y_event) - - return xr.DataArray( - tau_hat_1d, - dims=("k",), - coords={"k": np.arange(k_end + 1)}, - name="tau_hat", - attrs={"long_name": f"MLE tau_hat(k) for {event_dim}={event_index}", - "units": "sample_index"}, - ) - - # Otherwise compute tau_hat(event_index, k) for all events. - tau_hat_all = np.full((n_events, k_end + 1), np.nan, dtype=float) - - event_vals = ( - S_std[event_dim].values - if event_dim in S_std.coords - else np.arange(n_events) - ) + # Select the requested event only, and return tau_hat(k) for that one event. + 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) - for i in range(n_events): - s_event = np.asarray(S_std.isel({event_dim: i}).values, dtype=float) - y_event = np.asarray(y_std.isel({event_dim: i}).values, dtype=float) - tau_hat_all[i, :] = _tau_hat_for_one_event(s_event, y_event) + tau_hat_1d = _tau_hat_for_one_event(s_event, y_event) return xr.DataArray( - tau_hat_all, - dims=(event_dim, "k"), - coords={event_dim: event_vals, "k": np.arange(k_end + 1)}, + tau_hat_1d, + dims=("k",), + coords={"k": np.arange(k_end + 1)}, name="tau_hat", - attrs={"long_name": "MLE tau_hat(event_index, k)", "units": "sample_index"}, + attrs={ + "long_name": f"MLE tau_hat(k) for {event_dim}={event_index}", + "units": "sample_index_or_time_units_of_t", + }, ) diff --git a/tests/test_ndm.py b/tests/test_ndm.py index a19926e..9e5d41a 100644 --- a/tests/test_ndm.py +++ b/tests/test_ndm.py @@ -42,7 +42,7 @@ def test_mle_estimate_tau(): ) ## Test one event - tau_one = mle_tau_moteki_kondo( + tau = mle_tau_moteki_kondo( S=my_binary, norm_deriv=dSdt, p=21, @@ -53,10 +53,10 @@ def test_mle_estimate_tau(): 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): - np.testing.assert_almost_equal(tau_one[i], tau_val, decimal=6) + np.testing.assert_almost_equal(tau[i], tau_val, decimal=6) ## Test another event - tau_one = mle_tau_moteki_kondo( + tau = mle_tau_moteki_kondo( S=my_binary, norm_deriv=dSdt, p=21, @@ -68,5 +68,5 @@ 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): - np.testing.assert_almost_equal(tau_one[i], tau_val, decimal=6) + np.testing.assert_almost_equal(tau[i], tau_val, decimal=6) \ No newline at end of file