From 79a563a72af84d2eaf5c59577357c0be28f7146e Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Mon, 26 Oct 2026 03:12:17 -0400 Subject: [PATCH 01/11] Use measured effective pairs for cosmo_val OneCovariance shape noise --- docs/pair-count-noise.md | 52 ++++++++++ papers/cosmo_val/config/config.yaml | 3 + src/sp_validation/pair_counts.py | 103 ++++++++++++++++++++ src/sp_validation/tests/test_pair_counts.py | 66 +++++++++++++ workflow/rules/covariance.smk | 55 ++++++++++- workflow/scripts/measure_pair_counts.py | 15 +++ workflow/tests/conftest.py | 6 +- workflow/tests/test_pair_noise.py | 70 +++++++++++++ 8 files changed, 365 insertions(+), 5 deletions(-) create mode 100644 docs/pair-count-noise.md create mode 100644 src/sp_validation/pair_counts.py create mode 100644 src/sp_validation/tests/test_pair_counts.py create mode 100644 workflow/scripts/measure_pair_counts.py create mode 100644 workflow/tests/test_pair_noise.py diff --git a/docs/pair-count-noise.md b/docs/pair-count-noise.md new file mode 100644 index 000000000..0589d812d --- /dev/null +++ b/docs/pair-count-noise.md @@ -0,0 +1,52 @@ +# Pair-count shape noise + +Non-tomographic `cosmo_val` workflows use measured effective pairs for OneCovariance's real-space Gaussian shape-noise term by default. +Set `covariance.shape_noise: analytic` to recover the uniform-area approximation. +Other workflows retain their analytic default; tomographic pair-count noise is not implemented and an explicit request fails. +This changes neither blinding nor the mixed, sample-variance, non-Gaussian or SSC terms. + +## Cache and normalization + +`covariance_pair_counts` reads only the configured RA, Dec and weight columns of the same selected shear catalogue as `xi`. +It counts on each requested covariance grid, using TreeCorr NN correlations with weights `w` and `w²`, spherical coordinates, logarithmic bins and `min_top=6`, matching `xi`. +The cache is independent of cosmology and contains no shapes, signals or blind records. +It is a separate rule so covariance-only reruns need no shape measurement or access to a blind. +Its `threads`, memory and runtime can be overridden just like `xi` (large catalogues may need more than the default 40 GB). + +For unordered auto pairs in bin b, the NPZ stores: + +- `weight`: W = Σ w_i w_j. +- `weight_squared`: Q = Σ (w_i w_j)². +- `npairs`: the raw unordered count, plus exact bin edges and nominal centres. +- `ordered_effective_pairs`: 2 W²/Q. + +With independent isotropic shapes of constant per-component dispersion s, the pure-noise variance of either ξ component is `2 s⁴ Q/W²`. +The total two-component RMS is σ_e = √2 s, so the same variance is `σ_e⁴/(2 N_eff)`, where `N_eff = W²/Q` is **unordered**. +Mixing the two dispersion conventions gives a factor-of-four error. +Catalogue entries lacking `cov_th.sigma_e_convention` keep the legacy `total` convention; an explicit `per_component` skips the boundary's √2 division. + +## OneCovariance interface + +Verified against OneCovariance `c8755d6de43aadaa1cd4fe132ecf1c1d534e61f8`, the source used by the v2 run with the `ddd58fe0` container. +The external checkout is selected by `tools.onecov_executable`; the image supplies its dependencies, not the source. +`onecov/cov_input.py` reads `[tabulated inputs files]` keys `npair_directory` and `npair_mm_file` (first column θ in arcmin, last column counts). +`onecov/cov_setup.py:get_npair` accepts a matching grid without rebinning and otherwise falls back to an unsafe-for-effective-counts sum. +The workflow therefore writes **nominal geometric bin centres**, not measured mean separations, and counts separately on every covariance grid. +Empty or non-finite pair bins fail instead of silently restoring analytic noise. + +OneCovariance's analytic auto count is `A_arcmin² n_eff² π(θ_hi²−θ_lo²)`, which counts **ordered** pairs. +At `onecov/cov_theta_space.py` lines 1288–1297, the two Kronecker contractions and the `/0.5` yield `4 s⁴/N_ordered` for a single source bin. +The two-column `.txt` thus supplies `N_ordered = 2 W²/Q`, giving exactly `2 s⁴ Q/W²`. +No area rescaling or post-run whole-covariance scaling is applied. + +The normalization test checks the uniform-field expectation analytically, including non-unit equal weights and both dispersion conventions. +A four-object positions-only catalogue checks TreeCorr's unordered convention against explicit pair enumeration. +DAG tests verify the cache-to-ini dependency and analytic opt-out. + +## Existing products + +Existing covariance files do not encode the noise prescription in their filenames. +When migrating a completed run, use a fresh output tree or explicitly rerun `covariance_ini` and its descendants; do not interpret an old cached matrix as measured-pair noise. +Do not sum fine-grid effective counts to obtain coarse-grid counts: sum W and Q separately before forming W²/Q, or count directly on that grid as this rule does. +Pair noise includes the observed spatial selection and weight variation; it is not an independent mask-only simulation. +Mask-dependent mixed and sample-variance corrections remain separate validation work. diff --git a/papers/cosmo_val/config/config.yaml b/papers/cosmo_val/config/config.yaml index 44d66f5ea..8d7500d2e 100644 --- a/papers/cosmo_val/config/config.yaml +++ b/papers/cosmo_val/config/config.yaml @@ -113,6 +113,9 @@ var_method: jackknife covariance: default_masked: true + # Non-tomographic real-space shape noise: measured W²/Q includes pair loss. + # Set analytic to restore OneCovariance's uniform-area approximation. + shape_noise: pair_counts cl: n_ell_bins: 32 diff --git a/src/sp_validation/pair_counts.py b/src/sp_validation/pair_counts.py new file mode 100644 index 000000000..b2fc72d13 --- /dev/null +++ b/src/sp_validation/pair_counts.py @@ -0,0 +1,103 @@ +"""Non-cosmological weighted pair counts for real-space shape noise. + +TreeCorr auto counts are unordered. OneCovariance's xi_pm noise is +4*s**4/N_ordered, where s is the per-component dispersion, so supply +N_ordered = 2*W**2/Q, not raw npairs or W. No shape columns are accessed. +""" + +from pathlib import Path + +import numpy as np +import treecorr + +from sp_validation.io import Catalogue + + +def ordered_effective_pairs(weight, weight_squared): + """Convert unordered W=sum(w_i*w_j), Q=sum((w_i*w_j)**2) to 2 W²/Q. + + Empty/non-finite bins cannot define a covariance; fail rather than + silently falling back to analytic counts. + """ + weight = np.asarray(weight, dtype=float) + weight_squared = np.asarray(weight_squared, dtype=float) + if ( + weight.shape != weight_squared.shape + or not np.all(np.isfinite(weight)) + or not np.all(np.isfinite(weight_squared)) + or np.any(weight <= 0) + or np.any(weight_squared <= 0) + ): + raise ValueError("Pair counts require matching, finite, positive W and Q") + return 2 * weight**2 / weight_squared + + +def measure_pair_counts( + catalogue, + output, + *, + min_sep, + max_sep, + nbins, + ra_col="RA", + dec_col="Dec", + w_col="w", + num_threads=1, +): + """Cache W, Q and raw counts using positions and weights only. + + Uses the xi rule's log binning, spherical metric and min_top=6. + The adjacent two-column .txt has nominal log-bin centres in arcmin, + never mean pair separations: OneCovariance must not rebin W²/Q. + """ + with Catalogue(str(catalogue)) as cat: + data = cat.read(columns=(ra_col, dec_col, w_col)) + weights = np.asarray(data[w_col], dtype=float) + if ( + not np.all(np.isfinite(weights)) + or np.any(weights < 0) + or not np.all(np.isfinite(data[ra_col])) + or not np.all(np.isfinite(data[dec_col])) + ): + raise ValueError("Positions and non-negative weights must be finite") + config = dict( + min_sep=float(min_sep), + max_sep=float(max_sep), + nbins=int(nbins), + sep_units="arcmin", + min_top=6, + num_threads=int(num_threads), + ) + counts = [] + for power in (1, 2): + cat = treecorr.Catalog( + ra=data[ra_col], + dec=data[dec_col], + w=weights**power, + ra_units="deg", + dec_units="deg", + ) + nn = treecorr.NNCorrelation(config) + nn.process(cat) + counts.append(nn.weight.copy()) + print(f"Completed NN weights^{power}", flush=True) + W, Q = counts + ordered = ordered_effective_pairs(W, Q) + edges = np.geomspace(float(min_sep), float(max_sep), int(nbins) + 1) + theta = np.sqrt(edges[:-1] * edges[1:]) + output = Path(output) + output.parent.mkdir(parents=True, exist_ok=True) + np.savez( + output, + theta=theta, + edges=edges, + npairs=nn.npairs, + weight=W, + weight_squared=Q, + ordered_effective_pairs=ordered, + ) + np.savetxt( + output.with_suffix(".txt"), + np.column_stack((theta, ordered)), + header="theta_arcmin N_ordered_effective", + ) diff --git a/src/sp_validation/tests/test_pair_counts.py b/src/sp_validation/tests/test_pair_counts.py new file mode 100644 index 000000000..060868174 --- /dev/null +++ b/src/sp_validation/tests/test_pair_counts.py @@ -0,0 +1,66 @@ +"""Weighted-pair normalization, selection, and shape-free I/O.""" + +import numpy as np +import pytest +from astropy.io import fits + +from sp_validation.pair_counts import measure_pair_counts, ordered_effective_pairs + + +def test_uniform_limit_and_dispersion_convention(): + # Exact expectation for a uniform Poisson field, far from boundaries. + # All unordered pairs have the same product weight, which must cancel. + edges = np.geomspace(1, 83, 31) + area, density, s, pair_weight = 2000 * 3600, 5.0, 0.33, 7.0**2 + unordered = area * density**2 * np.pi * np.diff(edges**2) / 2 + W = unordered * pair_weight + Q = unordered * pair_weight**2 + ordered = ordered_effective_pairs(W, Q) + np.testing.assert_allclose(ordered, 2 * unordered) + np.testing.assert_allclose(4 * s**4 / ordered, 2 * s**4 * Q / W**2) + sigma_total = np.sqrt(2) * s + np.testing.assert_allclose(sigma_total**4 / (2 * unordered), 4 * s**4 / ordered) + + +@pytest.mark.parametrize( + "W,Q", + [ + ([0], [1]), + ([1], [0]), + ([1], [-1]), + ([np.nan], [1]), + ([1], [np.inf]), + ([1, 2], [1]), + ], +) +def test_invalid_counts_fail_closed(W, Q): + with pytest.raises(ValueError): + ordered_effective_pairs(W, Q) + + +def test_positions_weights_only_and_unordered_treecorr(tmp_path): + # There are deliberately no shape or blind columns/records in this FITS. + ra = np.array([0.0, 0.01, 0.03, 0.07]) + weights = np.array([1.0, 2.0, 3.0, 4.0]) + cat = tmp_path / "positions.fits" + fits.BinTableHDU.from_columns( + [ + fits.Column(name="RA", format="D", array=ra), + fits.Column(name="Dec", format="D", array=np.zeros(4)), + fits.Column(name="w", format="D", array=weights), + ] + ).writeto(cat) + out = tmp_path / "pairs.npz" + measure_pair_counts(cat, out, min_sep=0.1, max_sep=10.0, nbins=1) + products = np.array( + [weights[i] * weights[j] for i in range(4) for j in range(i + 1, 4)] + ) + with np.load(out) as z: + np.testing.assert_allclose(z["weight"], products.sum()) + np.testing.assert_allclose(z["weight_squared"], (products**2).sum()) + np.testing.assert_allclose(z["npairs"], 6) + np.testing.assert_allclose(z["theta"], [1.0]) + np.testing.assert_allclose( + np.loadtxt(out.with_suffix(".txt"))[1], + 2 * products.sum() ** 2 / (products**2).sum(), + ) diff --git a/workflow/rules/covariance.smk b/workflow/rules/covariance.smk index c30797601..e7ac0e63f 100644 --- a/workflow/rules/covariance.smk +++ b/workflow/rules/covariance.smk @@ -21,8 +21,12 @@ def get_onecov_cat_params(version): per bin.""" cov_th = catalogue_entry(version)["cov_th"] # cov_th.sigma_e sums both components; OneCovariance takes it per component. + convention = cov_th.get("sigma_e_convention", "total") + if convention not in ("total", "per_component"): + raise ValueError(f"Unknown sigma_e_convention: {convention}") + divisor = 2**0.5 if convention == "total" else 1 sigma_e = ", ".join( - repr(float(s) / 2**0.5) for s in str(cov_th["sigma_e"]).split(",") + repr(float(s) / divisor) for s in str(cov_th["sigma_e"]).split(",") ) return sigma_e, cov_th["n_e"], cov_th["A"] @@ -45,6 +49,26 @@ def _onecov_tool(key, default=None): return lookup +def _pair_noise_enabled(w): + """Default to measured noise for non-tomographic cosmo_val runs only.""" + default = "pair_counts" if "cosmo_val" in config else "analytic" + mode = config.get("covariance", {}).get("shape_noise", default) + if mode not in ("pair_counts", "analytic"): + raise ValueError("covariance.shape_noise must be pair_counts or analytic") + if w.tomo_suffix: + if mode == "pair_counts": + raise ValueError("Pair-count noise currently supports non-tomographic xi only") + return False + return mode == "pair_counts" + + +def _pair_count_path(w, suffix=".txt"): + return str(COSMO_VAL / ( + f"{w.version}_pairs_minsep={w.min_sep}_maxsep={w.max_sep}" + f"_nbins={w.nbins}{suffix}" + )) + + # Number of cores to use to execute OneCovariance ONECOV_THREADS = 8 @@ -114,9 +138,30 @@ rule generate_glass_mock_rhotau_samples: "../scripts/generate_glass_mock_rhotau_samples.py" +rule covariance_pair_counts: + """Non-cosmological cache: positions and weights only, no blind access.""" + input: + catalog=get_shear_catalog, + output: + cache=str(COSMO_VAL / "{version}_pairs_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}.npz"), + tabulated=str(COSMO_VAL / "{version}_pairs_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}.txt"), + params: + ra_col=lambda w: catalogue_entry(w.version)["shear"].get("ra_col", "RA"), + dec_col=lambda w: catalogue_entry(w.version)["shear"].get("dec_col", "Dec"), + w_col=lambda w: catalogue_entry(w.version)["shear"]["w_col"], + threads: 24 + resources: + mem_mb=40000, + disk_mb=20000, + runtime=600, + script: + "../scripts/measure_pair_counts.py" + + rule covariance_ini: input: nz_file=lambda w: redshift_path(w.version), + npair=lambda w: [_pair_count_path(w)] if _pair_noise_enabled(w) else [], mask=lambda w: [] if w.mask_suffix != "_masked" else [get_footprint_path(w.version)], output: cov_output(".ini"), @@ -149,6 +194,12 @@ rule covariance_ini: nz_dir=lambda w: os.path.dirname(redshift_path(w.version)), nz_file=lambda w: os.path.basename(redshift_path(w.version)), num_cores=ONECOV_THREADS, + pair_section=lambda w: ( + "[tabulated inputs files]\n" + f"npair_directory = {COSMO_VAL}\n" + f"npair_mm_file = {os.path.basename(_pair_count_path(w))}" + if _pair_noise_enabled(w) else "" + ), threads: 1 shell: """ @@ -192,6 +243,8 @@ ellipticity_dispersion = {params.sigma_e_param} survey_area_lensing_in_deg2 = {params.area} n_eff_lensing = {params.n_e} +{params.pair_section} + [redshift] zlens_directory = {params.nz_dir} zlens_file = {params.nz_file} diff --git a/workflow/scripts/measure_pair_counts.py b/workflow/scripts/measure_pair_counts.py new file mode 100644 index 000000000..767d04ee4 --- /dev/null +++ b/workflow/scripts/measure_pair_counts.py @@ -0,0 +1,15 @@ +"""Write a non-cosmological pair-count cache on the requested xi grid.""" + +from sp_validation.pair_counts import measure_pair_counts + +measure_pair_counts( + snakemake.input.catalog, + snakemake.output.cache, + min_sep=float(snakemake.wildcards.min_sep), + max_sep=float(snakemake.wildcards.max_sep), + nbins=int(snakemake.wildcards.nbins), + ra_col=snakemake.params.ra_col, + dec_col=snakemake.params.dec_col, + w_col=snakemake.params.w_col, + num_threads=snakemake.threads, +) diff --git a/workflow/tests/conftest.py b/workflow/tests/conftest.py index af4e4258d..8cd96d559 100644 --- a/workflow/tests/conftest.py +++ b/workflow/tests/conftest.py @@ -112,10 +112,8 @@ def snakemake(self, *args, config=(), cwd=None, env=None, timeout=300): environment. The workflow profile is off: it enables apptainer, which CI runners lack. """ - cmd = [ - sys.executable, - "-m", - "snakemake", + launcher = os.environ.get("SPV_TEST_SNAKEMAKE") + cmd = ([launcher] if launcher else [sys.executable, "-m", "snakemake"]) + [ "--cores", "1", "--workflow-profile", diff --git a/workflow/tests/test_pair_noise.py b/workflow/tests/test_pair_noise.py new file mode 100644 index 000000000..ee362c35f --- /dev/null +++ b/workflow/tests/test_pair_noise.py @@ -0,0 +1,70 @@ +"""The covariance depends on a shape-free cache by default in cosmo_val.""" + +from pathlib import Path + +import yaml +from conftest import VERSIONS, parse_jobs + + +def _ini(toy): + # Unmasked target: no site-specific footprint needed by this test. + (toy.root / "data" / "nz_SP_v0.1_A.txt").touch() + grid = toy.common.xi_grids(toy.config, toy.config["fiducial"])["integration"] + return toy.common.covariance_path( + VERSIONS[0], + "g", + grid["min_sep"], + grid["max_sep"], + grid["nbins"], + "", + "", + suffix=".ini", + ) + + +def test_pair_count_dependency_and_ini(toy): + target = _ini(toy) + result = toy.snakemake("-n", target, config=['covariance={"default_masked":false}']) + assert result.returncode == 0, result.stdout + jobs = parse_jobs(result.stdout) + (pair,) = [j for j in jobs if j.rule == "covariance_pair_counts"] + (ini,) = [j for j in jobs if j.rule == "covariance_ini"] + assert pair.input == [str(toy.root / "data" / f"{VERSIONS[0]}.fits")] + assert any(p.endswith(".txt") and p in ini.input for p in pair.output) + assert not any(".sacc" in p or "blind" in p for p in pair.input + pair.output) + # Stand in for measured counts, then execute only the host-side ini writer. + for p in pair.output: + Path(p).parent.mkdir(parents=True, exist_ok=True) + Path(p).touch() + result = toy.snakemake(target, "--allowed-rules", "covariance_ini") + assert result.returncode == 0, result.stdout + text = Path(target).read_text() + assert "[tabulated inputs files]\nnpair_directory = " in text + assert "npair_mm_file = " in text + assert "\\n" not in text + assert f"ellipticity_dispersion = {0.3 / 2**0.5!r}" in text + cat_path = toy.root / "cosmo_val" / "cat_config.yaml" + original = cat_path.read_text() + entries = yaml.safe_load(original) + entries[VERSIONS[0]]["cov_th"]["sigma_e_convention"] = "per_component" + cat_path.write_text(yaml.safe_dump(entries)) + try: + result = toy.snakemake("-F", target, "--allowed-rules", "covariance_ini") + assert result.returncode == 0, result.stdout + assert "ellipticity_dispersion = 0.3" in Path(target).read_text() + finally: + cat_path.write_text(original) + + +def test_analytic_flag_removes_pair_dependency(toy): + result = toy.snakemake( + "-n", + "-F", + _ini(toy), + config=['covariance={"shape_noise":"analytic","default_masked":false}'], + ) + assert result.returncode == 0, result.stdout + jobs = parse_jobs(result.stdout) + assert not any(j.rule == "covariance_pair_counts" for j in jobs) + (ini,) = [j for j in jobs if j.rule == "covariance_ini"] + assert not any("_pairs_" in p for p in ini.input) From d0dfecd20e2becace4e9663a358a8ea51bc6dde1 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Mon, 26 Oct 2026 03:32:46 -0400 Subject: [PATCH 02/11] Keep pair counting field-projected and preserve implicit tomographic defaults --- docs/pair-count-noise.md | 4 +- src/sp_validation/pair_counts.py | 12 +++++- src/sp_validation/tests/test_pair_counts.py | 44 +++++++++++++++++++++ workflow/rules/covariance.smk | 2 +- workflow/tests/test_pair_noise.py | 42 ++++++++++++++++++-- 5 files changed, 98 insertions(+), 6 deletions(-) diff --git a/docs/pair-count-noise.md b/docs/pair-count-noise.md index 0589d812d..711079262 100644 --- a/docs/pair-count-noise.md +++ b/docs/pair-count-noise.md @@ -10,6 +10,7 @@ This changes neither blinding nor the mixed, sample-variance, non-Gaussian or SS `covariance_pair_counts` reads only the configured RA, Dec and weight columns of the same selected shear catalogue as `xi`. It counts on each requested covariance grid, using TreeCorr NN correlations with weights `w` and `w²`, spherical coordinates, logarithmic bins and `min_top=6`, matching `xi`. The cache is independent of cosmology and contains no shapes, signals or blind records. +The reader projects fields directly from the lazy catalogue chunks, including compound HDF5 datasets, rather than materialising rows containing shape fields. It is a separate rule so covariance-only reruns need no shape measurement or access to a blind. Its `threads`, memory and runtime can be overridden just like `xi` (large catalogues may need more than the default 40 GB). @@ -41,7 +42,8 @@ No area rescaling or post-run whole-covariance scaling is applied. The normalization test checks the uniform-field expectation analytically, including non-unit equal weights and both dispersion conventions. A four-object positions-only catalogue checks TreeCorr's unordered convention against explicit pair enumeration. -DAG tests verify the cache-to-ini dependency and analytic opt-out. +HDF5 tests forbid whole-dataset or shape-column reads for single, chunked and joined layouts. +DAG tests verify the cache-to-ini dependency, analytic opt-out, dispersion boundary and tomographic default/refusal behavior. ## Existing products diff --git a/src/sp_validation/pair_counts.py b/src/sp_validation/pair_counts.py index b2fc72d13..488641418 100644 --- a/src/sp_validation/pair_counts.py +++ b/src/sp_validation/pair_counts.py @@ -50,8 +50,18 @@ def measure_pair_counts( The adjacent two-column .txt has nominal log-bin centres in arcmin, never mean pair separations: OneCovariance must not rebin W²/Q. """ + # Catalogue.read materialises whole compound HDF5 chunks before selecting + # columns. Index the public lazy chunk tables field-by-field instead, so + # shapes are never loaded, for either FITS or any supported HDF5 layout. + columns = (ra_col, dec_col, w_col) with Catalogue(str(catalogue)) as cat: - data = cat.read(columns=(ra_col, dec_col, w_col)) + data = np.empty(len(cat), dtype=cat.dtype(columns)) + start = 0 + for table in cat.chunks.values(): + end = start + len(table) + for name in columns: + data[name][start:end] = table[name] + start = end weights = np.asarray(data[w_col], dtype=float) if ( not np.all(np.isfinite(weights)) diff --git a/src/sp_validation/tests/test_pair_counts.py b/src/sp_validation/tests/test_pair_counts.py index 060868174..66d7503a8 100644 --- a/src/sp_validation/tests/test_pair_counts.py +++ b/src/sp_validation/tests/test_pair_counts.py @@ -1,5 +1,6 @@ """Weighted-pair normalization, selection, and shape-free I/O.""" +import h5py import numpy as np import pytest from astropy.io import fits @@ -64,3 +65,46 @@ def test_positions_weights_only_and_unordered_treecorr(tmp_path): np.loadtxt(out.with_suffix(".txt"))[1], 2 * products.sum() ** 2 / (products**2).sum(), ) + + +@pytest.mark.parametrize("layout", ["single", "chunked", "joined"]) +def test_hdf5_never_materialises_shapes(tmp_path, monkeypatch, layout): + cat = tmp_path / "catalogue.fits" # Detection is by content, not extension. + data = np.zeros(4, dtype=[(n, "f8") for n in ("RA", "Dec", "w", "e1", "e2")]) + data["RA"] = [0.0, 0.01, 0.03, 0.07] + data["w"] = [1.0, 2.0, 3.0, 4.0] + with h5py.File(cat, "w") as f: + if layout == "single": + f.create_dataset("data", data=data) + elif layout == "chunked": + group = f.create_group("tiles") + group.create_dataset("0001", data=data[:2]) + group.create_dataset("0002", data=data[2:]) + f.attrs["n_tiles"] = 2 + else: + f.create_dataset("data", data=data[["RA", "Dec", "e1", "e2"]]) + f.create_dataset("data_ext", data=data[["w"]]) + original = h5py.Dataset.__getitem__ + reads = [] + + def only_pair_fields(dataset, key, *args, **kwargs): + # Grammar may inspect zero-row slices to discover field dtypes. + if isinstance(key, slice) and key.start == key.stop == 0: + return original(dataset, key, *args, **kwargs) + # h5py field access recurses with a projected new_dtype and key (). + projected = kwargs.get("new_dtype") + if projected is not None: + assert set(projected.names) <= {"RA", "Dec", "w"} + return original(dataset, key, *args, **kwargs) + # Unprojected whole-dataset or shape-field reads remain forbidden. + assert isinstance(key, str) and key in ("RA", "Dec", "w"), key + reads.append(key) + return original(dataset, key, *args, **kwargs) + + monkeypatch.setattr(h5py.Dataset, "__getitem__", only_pair_fields) + out = tmp_path / "pairs.npz" + measure_pair_counts(cat, out, min_sep=0.1, max_sep=10.0, nbins=1) + assert set(reads) == {"RA", "Dec", "w"} + with np.load(out) as z: + np.testing.assert_allclose(z["weight"], 35.0) + np.testing.assert_allclose(z["weight_squared"], 273.0) diff --git a/workflow/rules/covariance.smk b/workflow/rules/covariance.smk index e7ac0e63f..bbe20989a 100644 --- a/workflow/rules/covariance.smk +++ b/workflow/rules/covariance.smk @@ -51,7 +51,7 @@ def _onecov_tool(key, default=None): def _pair_noise_enabled(w): """Default to measured noise for non-tomographic cosmo_val runs only.""" - default = "pair_counts" if "cosmo_val" in config else "analytic" + default = "pair_counts" if "cosmo_val" in config and not w.tomo_suffix else "analytic" mode = config.get("covariance", {}).get("shape_noise", default) if mode not in ("pair_counts", "analytic"): raise ValueError("covariance.shape_noise must be pair_counts or analytic") diff --git a/workflow/tests/test_pair_noise.py b/workflow/tests/test_pair_noise.py index ee362c35f..df9764bed 100644 --- a/workflow/tests/test_pair_noise.py +++ b/workflow/tests/test_pair_noise.py @@ -1,12 +1,28 @@ """The covariance depends on a shape-free cache by default in cosmo_val.""" +from contextlib import contextmanager from pathlib import Path import yaml from conftest import VERSIONS, parse_jobs -def _ini(toy): +@contextmanager +def _implicit_noise_setting(toy): + # Snakemake recursively merges CLI config; omitting a nested CLI key does + # not remove the explicit setting in the paper template. + path = toy.rundir / "config" / "config.yaml" + original = path.read_text() + config = yaml.safe_load(original) + config["covariance"].pop("shape_noise", None) + path.write_text(yaml.safe_dump(config)) + try: + yield + finally: + path.write_text(original) + + +def _ini(toy, tomo_suffix=""): # Unmasked target: no site-specific footprint needed by this test. (toy.root / "data" / "nz_SP_v0.1_A.txt").touch() grid = toy.common.xi_grids(toy.config, toy.config["fiducial"])["integration"] @@ -17,14 +33,15 @@ def _ini(toy): grid["max_sep"], grid["nbins"], "", - "", + tomo_suffix, suffix=".ini", ) def test_pair_count_dependency_and_ini(toy): target = _ini(toy) - result = toy.snakemake("-n", target, config=['covariance={"default_masked":false}']) + with _implicit_noise_setting(toy): + result = toy.snakemake("-n", target) assert result.returncode == 0, result.stdout jobs = parse_jobs(result.stdout) (pair,) = [j for j in jobs if j.rule == "covariance_pair_counts"] @@ -68,3 +85,22 @@ def test_analytic_flag_removes_pair_dependency(toy): assert not any(j.rule == "covariance_pair_counts" for j in jobs) (ini,) = [j for j in jobs if j.rule == "covariance_ini"] assert not any("_pairs_" in p for p in ini.input) + + +def test_implicit_tomographic_default_stays_analytic(toy): + with _implicit_noise_setting(toy): + result = toy.snakemake("-n", _ini(toy, "_tomo")) + assert result.returncode == 0, result.stdout + jobs = parse_jobs(result.stdout) + assert any(j.rule == "covariance_ini" for j in jobs) + assert not any(j.rule == "covariance_pair_counts" for j in jobs) + + +def test_explicit_tomographic_pair_counts_refused(toy): + result = toy.snakemake( + "-n", + _ini(toy, "_tomo"), + config=['covariance={"shape_noise":"pair_counts","default_masked":false}'], + ) + assert result.returncode != 0 + assert "non-tomographic xi only" in result.stdout From 23b6fb0f5c2e80d0e8a395c1f7c56f92ed0989e4 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Mon, 26 Oct 2026 04:31:51 -0400 Subject: [PATCH 03/11] Document full-catalogue pair-count resource overrides --- docs/pair-count-noise.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pair-count-noise.md b/docs/pair-count-noise.md index 711079262..f61b33ab1 100644 --- a/docs/pair-count-noise.md +++ b/docs/pair-count-noise.md @@ -13,6 +13,7 @@ The cache is independent of cosmology and contains no shapes, signals or blind r The reader projects fields directly from the lazy catalogue chunks, including compound HDF5 datasets, rather than materialising rows containing shape fields. It is a separate rule so covariance-only reruns need no shape measurement or access to a blind. Its `threads`, memory and runtime can be overridden just like `xi` (large catalogues may need more than the default 40 GB). +For the full v2 catalogue, use `--set-resources covariance_pair_counts:mem_mb=128000 covariance_pair_counts:runtime=1440`, alongside the run's existing resource overrides; the two NN passes can peak above the ξ rule's memory usage. For unordered auto pairs in bin b, the NPZ stores: From 121f4b6ea141a3bafc6fce855c82ff4fc17d8fb2 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Mon, 26 Oct 2026 04:46:06 -0400 Subject: [PATCH 04/11] docs(validation): pair-count noise figures for #432 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01L5YaFeu6oHriuZyFwNAbPd --- docs/validation/pair-noise/bmode-ptes-full.png | Bin 0 -> 48472 bytes .../pair-noise/noise-ratio-full-vs-pilot.png | Bin 0 -> 97612 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/validation/pair-noise/bmode-ptes-full.png create mode 100644 docs/validation/pair-noise/noise-ratio-full-vs-pilot.png diff --git a/docs/validation/pair-noise/bmode-ptes-full.png b/docs/validation/pair-noise/bmode-ptes-full.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ca5d27d28224ab4de5a7f27963bfe5856a49a9 GIT binary patch literal 48472 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� z!v3L}ohVYg>NJz2YCJHdSR*b5CMQCIj^^)Y+}3m@&9*wRh$h2vugiZPRhsj|aM1TB z3fLvS`xLD!&CEW*U`XZ%=pPW`y`da&Yv!eEo@V@$Y}=^JUlQQtkI>r^ zA<@+SoZHBG`U8k(k}i!TN= zhk9hdIT25EMs{`+D8{A|FE98}Gy#{JupNkX2&{$~-+^Bf6OBmSORhIq#mIXTPM$^f z_c5X(feH}0RQ`z7M$&mW1;3F5TdbtZSX?I@x#k$l zo4g|@gn2{@UcY{UmKOIPO6HL8ED~IXp;b1e8_9uqN>+)Hg>T9d0~Zu>BVZVkh}X9v zj*>_#2c|p^S0HlJO{L@QCKu6e6N5Qnnu})olX;uHf;Y9~E9!Zr;ca+Nf0!KUGV1b} zBEw{f;27fc&W?kVf>G5pqJ;xD1Sp#zSp1ue@_cMeD-92*9}q&{i}4Ttprb1%jhj=R z-vj%W>X?urrld>#FCtEmZ|w#S=@+>Ek94}Q`p7cUD3>fu3W8`mE$_#n2?G-Mysg6} zy|e3B4{9l*T4)28tM8h{paHCT=b?8Vz?2G{A0+E|Z`hRtKVU!hbsb)+ZX=7?yIq*_ z3%liIPli2->;l1qcfqT2sXalhgeNSX*GQ4!#&P2eK4#c+_+|~nFD00;VpG0I1)~m1yuRpVwt>toN8~@koaHvWm#E?OuPaNzn){n5Mu_m9 z+70gX2x&|DW05Ay!TA7rUSS81E{qvzUl4;02O#I}t$3N84OL}SK6CQAi_13ZBXGXk zV9OH27B&4`U2Cr*Bza0M#gegV_%FhTP-S`rJsfE|@X9@LP=y8R?4$(LymwvdQ0sNRQR_p0h*ZrI<&Vki7rsk>Yrs-@}K( z?e8&|WS$=b9cLRD&(qhhzkY>vjYWF(<|;*sKWg8j7&1bpRPgtX4w-6u+4%|elhk@} zw<5LMuyyxVunU=-@p+$)5h2&8P+s+N9Y~1R&jh&1ZpS*n74@;eBJrH6*wW+&8% z*p<%~g}>UYPa`iW4%yA*OJl@_F*S-xWhrak8qi!60gP|)1QO_<>(*sitY^vJvCUd! z-t6A9T+fda+H_kdc4y8@_SpjLPieJ=%f(}+SxPbq*xsE6(^Y2(!jQ?t!?FnZZflqoGYbWWK2 z*hk+%XZL;vfh6p7X1F@oH!}C#UU2Gseor@{Dq+pQoXY|MqOBdT<{M?4zB2$q0&e&|xU!qDJF-Fb!W7VlI*otvA( zEb2Z&aA6nuJbFaD5SqwxWR3v^S{w36LrNL?7KrHn>FMcYvX6ll7d@j;J&W6_<`I@P$-Fk2m>>vB_y@2|9}cgB zKm0fus_b+f;HUQ}vXB!MNEc0TGjWuoQ`5laLupqgbQ2qFCU~@B)%gk`hZ4caSpn&d zjgAIjK86qoJUl#0J{Cw%aPh`NN)2o4?sg3K_rJg_^8V4bKr;iD9pdJ0sk^?W!rCTk z@BB1`qv(0x>&2lq(zV?5t+Z4;DCna7^TV&*2mFgMp+gM8n3Rpc;FEx1;R{rd7kC)c z2HQytNH<@4@N0X4yMt76p;Wms0-rrvr}Rj6bL zejV?J@CXhK4K1^#)Pj3l`T6m=>l#l!KN*5s#kzRJY~jFtA0LGy%%94JL^UpJ)9B1d_bzJ;6d@c*(QxBJL>^W5e2 z_e3v-f>S47d;Ee2r=M~0?&Xs{KV%ctp^?$@$Jr2*|30DThIEfwb~s;go z0etw}zwZx00zHmhfk?6#wrzE^j8ye^4h|0B>Ig$uM*L2rWYQx+V<59&TMe)8eLt_8 z36+vUE%GS$`ZzH)r46!4qwxAQAf|37%Pkw(*ARL{5NOw;%(!B@?FaK^GH2nieUyTv}Qhhe!M^Atlx8y!3GGw!u`b^WcNmoWpo- zqQZUVS}nKp=Hldu=_iS0UNsF-$6hB5A<^8gUVTZLF5t;(hdG=bLKLZ6w{CU!^}T>r zp9tL#_VCIEN92_R^wwiOEWCuL(w6VCb+L7QfzZDMv^%$bXGKYbs~mF@GM1rttMeqkntp< zA*LMgbjU0_ai?J_mmJ|ije~5%0BfMa#x7`7tWO|ON7wCV;}{K1LGu|uTNqaG3zJNV z1ar9!J(1SlhF;Dq>p!p&DmlFF>mB+{A);AG zo3s+DsAC$F=z6!E^j=4C^mK5@I$~DE4%jN7842O5>Ju2XBr(`Bj&N-w;z8yHK|#Tj z)NA1CS^ah&z52%AgrHP1xE~cdmkffS964PrYoI+hy|q_@F@Q?FO;)_M$VoYxxE@YY zzYY&ae;WlRy#y3sHc|%I_`9WK!8FI4lm~D4OTcJ=cMV{1O+Z3otc6Rpg*+q7B0wrSi!SIK z8ly~yRKQYgqJ-kLO$Z^(#eZmTmnwB4A3uri_zacA3*iY+?wSAmvkurFGao$~Hbj_3 zQ9etJzW!|unOh{ok)*36W2?mMi&r*57(di;@-#UIAtBmT0TdVUqY>JQyo#vwc-3To zayr=m_YR&=GJc@>M_>A(tc<%!pm&>Zjp9HX+=3}E-UJP22kMOF&EQlaGAv9yUvRH&vS#w0`ng9;J0-?jldyT(}q&;%3m(O@?Z0sb??XUnMAQSO8xgg_^!3Yu&nXM!T zXqe?!qX|+n?zyvOGszLiu@R4PN7iUQc-!Ux5okAtiSOlzhdWd+*SXR6gux&=3Bgj` zAY;M>F&TiV321BAS?iu{EiiR#YR8TZ5)Ty;TzZAuZK{VXR9& zmcK0x&S%WoXXCY$2Ap<4$T`;cXnV5prmTL%-m=?cA^@#XHta0;8GqR*;TO%H`mRaFxM6Zxm(GHldo#w436l?7VW(NTCK+@{X)3bQ ze{;$|R&*T1RgmdPXy`N;F4b=^FzAEI@t-q!!qfI65OJhqhJ%R6&WBopw?G*|sHh?6c{y?+tAXt%=Aw>bkM@f#!p=jhx+r3q@d@#EjyfL&fV zTlNx;VIqtdQX;HfIozn`1jU20U4k$Ue97!gIiT&G2cxpm6~)& z=Yf)Ls>19@$Q3Gu!755uf(&cIo&9ooHPZ8Je5e4^vOWO zlVnZ-w@4oVRC+P5D09?WNxvtzb3 zU*NYJ(~pNde~OIPV+xjwd-!UxNyR1tY|-E?$x#?JM^;Hf??|2+j%`Q=8F#*?92d-_ z!y37K8546>+)uLdiEn|S3XYs z8BnBR_Bt%Jn6&cUvN$2`*i9{>0zUX^09UHdC2Rv&zKVhpCJUifQ{&*PvBY*xq~#$s z4v_PVMs*rioghvfkoD?23owgMT4#zH!b$zI9p*7kf*N6fgu($7u;73(4arMf%_Y+d z^hXorA6IaSIcQI^oLTku%xAU;6YyDk8D7iMxQcL43h-z>aZkW}7GY4n2SzpY9?gIo z8BR<1`p_-jUZxw%Q;~xS+kkOK94Dtl3M5bqnQSK9J^V>1MyDVuxu~h2_aO(<^pmMh z;3-muNaKo^lf6%Te^71Ua8Zv$0!oCjgrHkeDIv@y!P`!b8z4FYu7l{TFuk7ivBu$u z`lQ4Wacl2MZwrhH5K)1oN`!BOm^#L;a{FZR3kt}QYlII*Ta%77RasrFM4iA%WjF~; zZA+1%U8_f0)dNgY6CM}sdomLJ*x1<8!F=OAN;aK^x|p{O!P!McU0mDgdMW1-$oG*N$_V8T?1z)PC#>@9UaEWfLPIp z5Rzn>{By~Gm`f4@gA7BEEY;BiT2_nn6G$V3F>PwnM5L%=Sfm@jOTYqJo-=HR*Y7-f z4yi*id&eZUawBNOLrp)Q5*=-Ere*2ylqeiR;%!V$O+(Du@^YLj2LAs-~S>fXzCNgJNZ|T!`r;cF?{_*RDzFy7@^=Ot^{R$s(=tk(4}bW zeXCs1aWv7Cc94TAnqDEG2sKUWG`=;_OArw@Hd9WIit4Q_Ej@{B7KF}@aRd|ZMB+zN zPn`(Fwbd|q;k$MCtqYns!;Xu$`U`6wk6`CgMxF~=>hEaB$iu4_eTCbOCczy5c(y!1YMjQ*Vl$6x-} z4!}M1;qaq5fn~>*mClkm&1e&7vhsEx)Z?l zP!!#2)>7zIfv3$BFl$R($bo*EBwgq6B*(ToZ2Gz?Ibco1 zeYf8Zy!5&SN;PIyJH)%uuVKRAAZ!<``<6}fTiR%oVfnP~`U@b(pnc}$(Hg_K@$1Wam9yd+i;iP>v8>S7mFm-SH&vDqyM@tW5epW+x z>JO{d`hz}?&mP`op8-#zx2Y&ilUp>oZ!ZQd-BVbZ>|%V4*-v|JUBB2SRZ&{XX*7V3)7{F!mVg0@?BT}Ab+tpP1zGOiA|a8&-$R+YqY4-1sC;Iu-Lrs|D`q%vo$bIl4bw`pf63R% zs{hGNieYqqjg3sKJO7BdaTn&|130P>oYS;{PuwkS(q&-*uO2*6e{GFKKc}R?@nyN3 zhn8OdYubS6=gXhtxZ-hj9_N2o*&^3!jUWFxEiosgbOBoAK3hE=Wuc} zr!;tn`FLiZc$hfnyll zz258E9~K|>UP)lie|etqjB$_qzK8Mkv2+QIZRS47&PE;F@}x*5eRGMQ;Jetvn8E%ttOwn>H-;SEu>B zgY~7uGX|wmRyson18sH6g;6R5JP4ML^n1at=M8-O-FMTX!U+3d+D0VE*`d8+r67ZR z65!tON#&3COZQY8u0zZI-n|f={NPQ+CnCPtvJJDZ5AGcIqK_sIK1B|C%%G4KxOA}P zUu2oP8AnDo)csV(%Y%s}mdLkn=WqPGghVF*Zq`M!*htcF0gPV3oEIj#G&D$^SKZqE z1F8*I&pO{h%XZ3#(Zuj~xi8&3a1N57dvD&8Ee6sg76Y&;XtG41h#R&rUWE5ddtya& z=oMBm`7OF0+hOAhyB~ z5{eF*-T_qgVsI$7955(9mHRck%r0NnZl_S#l{k-#F7_fdcz$}xvSr;7R%C>4bMt(H z*g{kmHFnFiTJ~#X-0e7&@3nAj`TDg8U7!h#0@kx3qm z6Xs0%#?;q6=~s#*3F*oGD~I=Rc>g})*$iq^p$MGRcbUb-#n2cRXA4vHbU9~?w6}3;oDU4a8jFi+3$yP>Doltt`C}eF#QeDDDw9;w@VAOx>(2E z{G#PCsQPH>BE-XnG#4GNXqKOCuCrC9fo+mz#_ETN@>GCkt1Cal78RZbFpF^b#rj5S z5Gf8S7m%}9FX*+N3{qp&a*Q;V4qT8hpk8Ec0^d#3&xA%p1tcy__hRVxib_XV?WM z8;cbe_0#J@Kt$PRL@~h@WZCi-lkVKpEA||jhp;t<#*2y-|%p_zMmq>3f;X* z3dACCva)yY4k6gjUOXrY|A5gc%jiZPQh;76rdvyo81(S7ow5k&DfZ_t@9tlbOlRe` zM>)-8(WLPIJRxoiF-FR`$1bD0?_A>6eV9~YVT!_}o9sj;a%u-^pFxZi}r4{r6@(|(@c z#55Vs1oFK$b$md%jAkx^ThreBD&<;axfH3v_|qjiOqzo3OE% z3^+Oq#Wk*KXP{CkMU6u2{<>wC6X#y%>K+|Bs}fwy#R*$|ss!8Y&d04@kKVFv`C&YNB~|6!BQ{buX>IxVX9w>wgA)&S&C+`t*IffK8^^k+ z(cS}I&V_H%npU4^+PIXIBi?L6`4{wVY$#%^k>la_6#@576pSi=>SSr-9WT8?YeEDn zFehj|d~L;cktP7ZFn?MpHrmAZmFiM(4SGB?@sJY5v&ia%{zr7JdYc;tYjX0G=Eh>L zo>w>B9y1BtPmhb4WEKq%iP1tTRrzzwyrQdo`7tIv{EYdNw(!SmK*#d_so$h@7s*HK zL~bI4_KQS5sgKhMG#HZWXBEqlC&jxo38CptcZ?Iw^$^Qxp0(keUXXv%BW&g&gq$r9 z^}0CtfYLo>4R~D)`R%vg1S67HNJn60U3FPm8lQf7&g_YUzt!o(SPXGc%+7?gfm|foh0S3~1x@aCBBiBiG5`bb` zH{o-3s{MF%^P2<9Vw-3MhF}UQINH;k91JbI$?;UGZHu4vd_QoqYuESh-X&#?;x!!_ zw$;yR#`cB-ohtuca3x-+J~3-><1bdetSqz~-dM9Zsq6pMVAnEjk@?^&`-fm3Ke5Tr z4F?Vm%nS)%se!Rc=~R=OZ&@UZNR+rnw$iQzn7Io&M7ntdd;9(-UL)+w#O$3P{oP|) zB~9QnApe+qJ{dW3bB&ruI4+&d|`6AaF@z|d%(NZ5mAm#v+tO<>O23(LvR22 zptR*oQz+w%Uo82)LkArtXU^wGqou#GthRi}?E9ZDf_wi*y`!b|pGiUgc>@1=0{?je zb3f0^difMgK&;5#y&4&j3jRSF$;|Q?W_PGg>5QW7mo?#wyXTUk8KEGzFy zmA1Z4f3H580NSk@By-D8gPM;UxAD8;=lOs1jnH$}oytG7O?r4m1!1~y~$L!z`^Op$%F?IGjbawQaydPVy)w_XZoczI| z>Nm`4>lW6@z;zDEz)=NbN$x&NSbXhcNXWCN-vb;|#`qW%z#Ec68FDu$@SVK7Ws~q} zbLwpwrD<(#8Rk~;bb3;Xe^;HBgJA~Jl`(hlZ(yf-H>ScML!h(W23MT{!O7DAdlXi^Z0DPjI{ zJD;;wh4-r>FD^>X*rvgm>7@Mg)EQWaho~Il3M(>OXdo7Q^AI!BklZTH*WyP{^Qo40 zZ$GDc|8CLU;*GysXg|JL%db~l+w`bx!N7pSjr(kiXwss^QH2y4HiGnk?zq&~9RI=l zj}AgVL6)RYN?yYNoa}N*j%Y55HiUM$D#Z51vw6ITBRDH40%^wShC)Ns6PxAbc6MRd zl}}Nj)fc;MnRh~KYsA83SffDFlCB<=n#|~0SvNh*+#ze)o(b5+Ag%mGbyfqi( z;#Bgn%syy}?zclN)|lO~zb&_^b*Saz{7!RkVm(7{tU@VVTU8RYeS7+&HDrMqa6rTd zgXZ&j=Dj>!o(OsYb#d>$do|~^DZWHn%v6O_q7|c_mRy(Y#DqZz)Fo5t%FmlIW9bJm zJ;R~TL^?U#k<3Yut`lVZ%a|L@uJkjHzZ2G(1xSJ{>7mr^2y9N#yk#`oO6ihkKWW?7 zv>SO_{JR^?te)kP0Olipfz#$=ATt8Qd5Uyn2BkBwN?>Y5&rsAZ;tzxLPh-`80E@*} zjDvav@k&S$##jYTFA^#seas4oX?+08s8){B4nZ~>jzWwPA9Lxih%zgo;gg%tim02V zAjcf8dgzrZf2wHxisIj&{L_?U@#gLJ3%uv9^};W+Wqr9Oa5;bY zVbzU`LxCowtW~_`nx+nF^j_?>LFw{|1iUhT-J|L>L9c`@XtBBGoRF>v6~(f~VIcJo z3vDrwVm*g5dqs*0>Mzmx{&k>pAEkgKVj;8I%ngl;0HMZNSnPOHL7(Rabns}RQGEG% zPS2eIr2h#DVJJ$SN>5aLo}d>L^Pas&Z;G)hF*1sV_kfaSRjuUr?EH+=zcCdE=UeW5qB#z%yb*|tGRF1pz0=~YrlKlW^SQ~hC#b3pdG-h{}sdSfN8$^ zft12V8d*5|Cd$V*j>1LUo@VP;QDfN9R(?Xm7^9KyaQr}@a@RkFKratOtnmO7+4;uc zbelcH4Awjy$&?|t-d)7b;Prc?uVy=!n66&_j2Plb*Hf8>civ&^ko!{VWz4gPNQzJq zQ5Jb8`nrE|k={9et9NGkW$G_@`2T>V{2$jp&3-ob%Z^7M9h++|i#MZMW{ql%v1jp) z;_#DM98l!G6pB68jt>wdw8motfT0NGR%*Go1jZ`|A?GZj6D>=Y*7vcZt3YJ}XMwu( z>DH~=!mMc>@@r1iSW)Ia`=x%RKaotF=`+hT9>Ne4W4 z_nF5+4>x=vy6ttU%b$P#T=HDI z_o9?!-R!0h1|wLho0bX$8Nen^Lb3qgJPj#{LPv{IsM>kb8_@zMkm(K+30Yx@kL1|x_mcPcb5sV_)B%~u(A4Z` z2TRY|^-fN6dDr21F({>{0jDPVP21y*$q(Swcqllf`c4nk5Vy6;n9UJsD_D@9n>nz4W{4CjQQXpK3G{|dfgcZl z>QlBc(ZPmUqpid^vDdT{Vq;rLG!@gl!Oh1B019+w{KenD$+Qu6xL|D7xe4)iy#|DF zfC_^G!?}5rH<~ zVlY%m8BvBx)p~CpxVuDk1eq5kw9#{k0IM(Acro(%!mDcqu=Xcv+b{^L_W`k&dmC4N z03_+i#gjB}gjR(%UqHLnx%7F2qt$Q0Tk-xkFvs!*v}JJW#2x>D^H_jEgKRSUO2Y7y z&YTBC{1o3uFpA|=M$z(67>+16;AGELiI$dgZ?bB_#5HY5KxBr7kIzEyLRd%>`G=W& zX`228XnZp5NYacK?<3Wub&t$D>lyDhS-RmIC+v=9_IKuZ2~&Q;kNo7t&k_4cXK{; z^5jXevgU$=ct@Py3okCvWaigzCNfjG`?Y=ORJ40fF0lQv=1Yc^c6_o=H!@n#*Ii@9OfezxnS_m;IiQD+{;2l61rQm}WL%H!qL>7wL&C zIa7mMaxkBfc+P_TJ zdok(y7LP5b&wf8jF-E&-{P|zUc3ZL8{awn(A1^ocY2>q`FfZon(>G76lii$l9*(Q> zjb^`e`md1#yZ(y^vgBV}oVD%#>Cpb4U;WP$`2Xt(?A#a6m;hjy?t^-mB=+xBe7ADw z(cXWb@y<7>*b*BQe~ah^@xz* zwhIgcb_KcIS$gU5rCEI5Q>!*N2R3(u*K>Pj!GK$fdafHF(+m_S4YMP@JJl`J-{0zS z+{thEjC5B=#uwLFKl@{)PTu|MD*krEy_`?=$1P=c?y1KyD%JV#a&0g5MznBfcX`pf zoHk}kW$ewPY@zGs8e-0jzLM0GJL!B}J~p9thu_o(f4JziUqTyi?Lo~Py)l=S=-Jy#1M0Wd+tWL+Hn()hjs=M~ zax6WLsTPbE0P57$#kG^3cUgya9xWbNC(J>~ppt+!%I>y)-OE1q^P zY$hF?$2;Bs{^F2A8dH=49tvIE_h#Q{T~Dy~te(-d?S-*9PNk(U{5$09@BQPS*Px|P z(!t51JNCwmb5Z60%~P{s0ahzgni`rscWiFGV1CQ1v2B)^@afv$@zj)JDM)coIo1m_ zLoAJbeWU!wbVGWAM(b`;(hSSBG@TYrpVZKyjBmLwIEZLRF65k zVn0otc**4&g_syjQn?f%GEBab5ZANu<+*ONW~rp_NaD<|Dap0MU4A(&ChizY;(98! z3mrzRkwK8^DkCGKN5V75%aHnZ*y_g*PWx6OYVm8k(9kqsO!@8ME!&t$W}rR%YFO*) z2p}J!U_hM~Nf;VwCJ_yhM<=~VFt6aMh13*aQ2vavp8*b1gs%{!Uy6<}T9(=lxOPzQn*bn4DkeE49lqIge|_s5u~p>O zrsAU}`RzaS9@JG+$w8x@^m15w5~52V%!IO@v})B#WL07bcTm4=%R0W=gu84m;?sW zIDUAy1n#;#1aaYpcmqo65t2*A!oUDmBUSQsyrO>>?{AWQW|e%e95F5xjYW_emdRXb za|QQLLabiJhv={j>0x^)%oxi+9ht?Z7jgcC@#CfA&CZo3w&Jzev4EG@n>C31kTOk_ z{9=c~^@zhGfQ+`T?tG+S{s0cXZ&Uj@Z z+q-vfCC_^%Z%!~>c8R#c@|Zm@T)2Rh+v2aij*C0K2E>xV#rV=|_w75CRU{tB@)`jb zH!|Di`XG;W8y@;CTcFmTb!EdQi+bJj!>))`!_%8hhOV=aiWCZ!4$(=hN4eS5$frv$ z1yHiA9CN&Pc~t?s>~+JZw+*-t+4k=P|7$Z2!o1>JPbaPsyAL*FU$qqcD7kWx zGdk@5ZW9A;ML4RQwQAL>(Bij<+vOftr+NhgABw#RW%p}rGMTbIGqk?Ej6bsxjC5i= zL-$Ojid6LO+qZ9Gzhc(12?lF2uNsIlfVw%`6YH1x{QIK{VNqnSG4Nvp!J6kn#LySN zgTEFP!2MyxTIzjQv*eO#*~c%nw7cBB8oTQCm94dIs~5Jgn>nG!qRS1fGIMS#yEh6d zdV9$>q9S|Djj5dCZk@LFEY)k@zP&)h3eAui^vA~aX^$R>_EDLJ_L?vo*vXa>a2N=n za>OJD^MsArMKQjcs^$m1HLQ3rPNfj=uqfkRQ7w31-`54($49%MRtZVSg&jI%XiAA^ zrTR`t6%HS!X(@NMt;uylgp>ED7oC~^n@`c-)+=hp0vA3XeLXAd z>e~|x=aiXF{wR2T>Tpx)!$MQZMB+ti{D}YBxCu12)7id8M|FqR6dNIjW=o_FAf??b~JT29qOqeXIIQ4e2!Y z)SkL&9Dy~XY?^G);}9z-j$5?H%OShLkO-|GY?IpDvHYfI z%$krA>hpqP46&}C|J1bUh+dnMYHI*4M`u+vj@L}?yL~U>ta|P34U zp6*v|l4e*v;KLVM2M&&DRecieop;y}%aKtNG7k+b9@53`sN?#jnYKCoqI}-;x{?rU zvM{s#JsKw=&n~(LarRA)(cQQ4d|XwZsD~H1`n7%Ax;N|!Ej6F}s&bB7O6^xCSyo@l zvSL4r{ei3{&L4fd)caz{*k<1ZIGC`dglm-H1pBg}7`<|9WlGIqPtWsc3~`^&Eh+K0ZGkig;_gso!p|6Cq|w z;UM+ox6B!&yuN27PewAjN zxl+dbAkR8?3$hpoL!OlBRe-E8icZ<|< zLdDe5Ihw(-~>m{_z^gxQ*Q2*Aw5|msl>2y7>(R`~-H2kzKt5`ZeCd@n%`l2wH#nLIljI%$| zFX!pgaQplz;+QGYd2Z6H-}3v-556tfJzH~ui;)#vwS$yZOj9-sC8vMx<~n1^KcE`R zj5Jb28hi^o-xiZx8Jx{2CJeOokd7%?ILcv=uMrQNj1tLg$<~vHyb4CJkLlgA zeZfIrpWfBwu4BEpWRN+EBX3Dg>^!AXDLI#@{YIyjNyBnB2z(Fav}xIX6PFm3fPSxZ zZ`tx-r+fX{?88($fJUx4pO(SNE*{>((&ou(#+u+g8FZw*Btv8@99xI+Y!X>HT~nFT zF2xD9MAmCW@WctL?z?kIyD9*#y=RjxPuU;872mCV=66JJr;snTw#1Eh?-2a*x8i0I z-yMwk)%9J87eN~G7 zN3OO-TVbTahvm&@^_5$yRG$m~$?^LCc5(myKH9pq)zZ3s^7hh88$RRq&l{F7{_*qA zu0OGAN!lUL_-7wZG-VnG*_#EEW;(pAxA%WCWKxH=QRN-BQ0 zm+_-vBLpmpwik-@8?zrvmkGF!97SwbD9L2gRP_&>Jiqx$&7)g;(8$<0!y(n+0$DF? zkSQuW@*EL?>do6(_wapQ;xODNCHw8sV}eSA|6;y<|LEy%(kzorff@xm?-7L*qLACe z9adcJ+8KHYY4vPcJp5XJCArB}gb}^!+RVLmRddi@H;^gT-Ue=wKelQm?OTjQo;>UE z_h=`Xxwd_~ICSIgaA||Cw!gGhL8xW4HHC*Z`UE$x?RBPP!6H|fH!sVrwpIhOXg&8W z1pS9D@R}BZsG|V|O5_<(2}+BBTCE3DKps8IKXnKq=P>BYlFTy_btc~Ynx{o-BhJ&I z7#myDuBhr?c;N5$tcX)%WKt2f7SgMhm`V?ZkJfrAI%%Z!e{5*K#ouQuN$9W=v#Y?DQP>pG&y*)g9=t)C& zb39pK)p(K$#2Z~c&cG*JczCxW10d=Z#5Pci9`*LVh{R=NdO~i{;K73-IJmUm`7`-C zGRf>%g-_1ab>n(X_r(+zj;zPQgVPggsS#v6i+HW^#VanEmd-d=wT@VZJZZ8@CLuxR zQAeMNTd{okEA;0(5)%B+oeM;PV{iYWXU2;cRLRmclBNOY$JZ{Kw z`0Demp{@;Q6ggKRq8l2B5gU|SZbma74?n|jQe>u`%)}yN=0v;+15uWX&E z!!OB5Ah`wtdVxZZeV2}x=Hf@LVpA-xHZstIwV+T!gc0jg8cxeAe`rjihI3JPbS9Ua zuXm`=6cijB=!ZGN2Pj1nF8&TtuJ*0kv{~6Dm7~`Ci`DQR!riLZ_+hm?BW@dmaLE}wjQ=K%O{(RWOc~lTOyo1< zh4(9;*tO(_*oLc^O2LirFEhD(OKzkyUMd!Y!={6nNH(OQuan0mJxqKUI>2cO;pgQz zT9$*bNM#J`p97oU)CPihNYhPkUgMFTY>{V&mVa93tdi2PSeYzSWW$&|2*zb%}4YGeZ z*(dW7#dvuq&*dL#Ydi2o1*t-mVmWx7wE(k7DLkX--nVaZQPmK`2D-RE6`Z{)zCk(* z4Ir{yJFD)qd!ga%eYclhjg7^)lQ;S}`~ZZub|jO-vi{D`KUz{d3nIcY1cr0#usOX| zkS7+uFBklV@8C>m=-W1aRUJ$|*iIxx>rUQrT@Cle=I!7s*-)q=mz82UVs3%MuI-~y z(l0FU6zR07X_F=cCBZvuG1JTfrpubigK@$)-#z_|vyQn%*cSpE6Zz2-T-wn7y1{8k zdmZ$gf;rL76VL8}DXSxm!{W;JM%v|uf*{D)7jd3X$n^2{)*&|jV&~Hv#kar)0-Rkm z=@XCXrUc%U`fu=#0JISUJA^c|{6=qL0g30O%(EA&y)YnfSu8xZC@=7W?<`!#jMY|< zU^Y7yCy03)Z&x$ShDVZLSZMjo+YJCqJZ2adCU!}cQoMuY)huu)fTeWTD|Z|1>g+7; z)z-`(ml+*MT|^eew_Of&XS;JMTp-|!x=45r2oiK|4isV&#*kxyaURJCS1fT>Z=zK@ zbn{1NADf86SAoDKBJRk9y%a3GBr46u=2<7>5={HHp_+Q8?<;Lzu@ytaksWsc_*E29 zSTF_SEfE4zW26#8PS>V2CHwY6z@M3iq_Ek;o=YS?^F(hVsw5HHM|GG(tE z-OLh{A&oTg#YkVAHL&ZFu{TlJx)=CiYHzD*9Yp}};XEl)r| ziL}ML2j-&n%TWvN%;hCVxoj^Wy-xn22Lu0%4&?Jj2DA5CD8(OaRzOVIjV8uwj)r!` z(xHm>07)tHa>3B<0eS2?tWw#lBMloqUU>+F5p?$F^0O3B!w){#DC)Pv^AN1)dLrS; z)wjq3?hc5tcepTVRnMM1JIL;WowJ{;r5*5K<1VKmca4>}@fV2P8g&(sX1I*9KwEdV z+X^32n3d&CQUH98B^EH6IZRQhDXy*C8nGmSTKDqSF*33 zy+V(;4!l?$d2*PI=RRmN`>0Y#=mnz|B2v6KPUV^B56i(3M6l(G&q2d%e6`n1{<4bBdKR#e_K4 z|DEfs*|RmL18#-FDG{!Kjaqns;=UybB6Cw3*$ufi_@E`Qa~JC4PWOsgWd|OwPtSY3 zN~F7(t-z{7t+dF`!rMab2K%noKmK?Iqxa*fk>Le01c_~j_Vd}s9OD_L8k|)IGx0VzvD&R`s*(#>f$UNgeH7QlaD5~xA;czI92+d& zU}A7B-4({}$>z2yahZ=SQxS;eO!WP3In;ms7KF=N6T|idOI3<-X44(urx!guT06|5 zgub{6ZuW%BC*4wb$`MRxR9>!ea#xCD3^b;5v>2?ZK;=z|7ygC~)vHT{1;pzV6h~a) zDM3xQXB3uF$rps2o!{Vo;wVHtku1qctiNI3w!Kyf8 zYB3$n)1$ib9FJU9?_qNbU@|aM3uTP%7k&!JpV#%f(s>A+)OAyMQl#YoNk<>=A%|wK zt{&}Gcz9BmhsX-W@Xkk*3bQq2(gZT7AdZCNLw>O%-{YKp2zs6oWoN-hc1v{FBV0_% zq9@@YH}=2MI^-_cFQAMf-_5fW;)@Mo0vP6g8|#&$Eo?Ypg|jXt4WcbcI!WUu0HY{+ z_T(6xt@7u1D}2(w_%d+B%Rb}p-4kSnX#lI=%6=2yxsHvDb3R_~SKiP9H>FIDsS2Ki z97z;zp`&YF9@!Wo@D}I8QAq;$pMjsP?*nVz#C6^L;aBmsLy{AF%CQw&7{2~3MD}Rr4XdKWTYuMM5@kJOJU;~<`@NAS_)g}ddY{Mb0iK=twez+ z{MAEC+DQW4{#8zkn)n3KFF^87{UNE%cx!9x1I0$r;pwmRP};>;wm~zYrG1qEZ4Jua zxYQ7&ue_@fp1xvAo3cV$R^lbeIxgbDvYtH2%1(wfpcb9|-1f_>R|bEnP>R2ESw z0P)k-Rf$akGd{)pO&&a#835#pZa&%uuBAhT%D>aun9Fx#`r7#2xN9@^^qH6zX%FjB z@F%}-(g-V0;i`${q9AJk`qBY)vl-=TvJnXJj;vhp}h7-SoB~5uQ=*~#~dP` z*RDx=``%-3Rjn%P>}Im-eXI2j6tF-vjR;|=^U@9z0f|Q!!74FM)=Z_Nx{?7p;zMRp zZ1?E=@4|6r8CZ5~`iac2NJf4zJQ;p{1$pq(JvsMGHm4?1TVWrdn;IDjQhTSoHjU^u z*6!>`L8Pw#x?*%Mx~T&f9y|UTMfh;LZxCym9~jeW%zI(W$1`0P~_2o`}G>%$lS6!K=?cwViiruNV;Q+H30^gTU z?Zh^V+@gs5TSUSMctDH|8Q|c*k_=c*b~Df;TJcUzhxAzCHf_Pgi4#Lh2&O4n{rm6# z^D3t3CBwwfl+g19iR!*rdt#QUm z(tru$5Evd1*O**Xqj&ja@?kbu<{bKuDwQf7hxgd+$J657^gEknTK3q$91|JL!H>UB zVz3+r@a%i!Y%F~#G~rVv!bFyc01r21paW!5x$OIiv0DY|{H8T49jsj$Y2ekXUq53e zy!F3a!W`fEv<4oK$av5op@chTn46MqwbktokA*1Qi?tL;{#wf--m7ShdH7(zKD}}_ zPMc?brB$wG44ehx^I=&|^SxG-{1$tU%!)(>cmLBerA#SJY2UXW@bQmm!Pgp5Dr6%UZUKed3+ zO@;2jzMQYP_L#?KP8vN2#)nM*pt2K-Jzlk(^1S@Lr(D&7QiCrQwEa0+7iwrtjJEH* z-8bBbOE{UV=Aa|R+r(#@BxJo0bFVj&(o$iCH=^L$w3tt^|7}QZ8@rCST(aCC3YzTU zVuv|HQWH@zFe|h=G=1(2nb^y77PEW?5Z>I_#%}KM?l+`onJ-x;wqyyBl~ikj-Atj) zPT?uh%;Co{%xR#*TzRMG(Gvd;Jga9-ocMK?*HV9OsGt~7XQAyfFb*vJ89y9x-Qp@7 z_nf#AcbcQ}dO(lT&rWLD4=ZVGt92f@HY>^m__(z(>aKoQtd)D)*}aXOrHp~FfVT|)ht!{Qem6ylBvVlB+M$Ie8)eT%s?*oGZCoH>%J<%vPdm!SV0n5kDd1SIxc+6!)~@l={A$0lsyJ)9 z%#)|E6zP_@1f!S{H%!P0c+8&u<#8+ZiqYx~9Nf{*zP(C5txO}1x@JwvxE=$S+B>ZN z^GRv?_>JjjK z@``0FyIRKK{KXeI*jBU1j+f9Ru(*}cNP9ntSbKAGbC5Rz+(h_2hl4i&Nlzqxwop!_ z_WM0OJ-w4{e~X0GLzxD9X!)FA(}%lv@77KqPV@wQVnwc1N79EIcH+bdzC=8am(`F8 zBo}9rOf)lTyZQ)$ys!+BnN;aalu1oZojiSdluM52pj`AXOg+9dA_YXH1vCeS%m5j7 z2W7OV%)Q7n+^G-?k|^6ckeXwaV!dxV8sQsm$dj8nZQxhOCdQJ{CC z8|ExKE;fr~qn!NtP5_DKVQy_%4d+90-erJZpR78FTgU51Q}hJc!mP1%mVrb2Db3om z^BX^F2^$lQ3^*foyE?KSsaG+Fshvy_+OmTNo?#^?4BUpR*SWp9l!ymE0rhe`xN_5=dK&XqU7}>1;Rjypeq=Wt0Emav z72yS7S$wZDzyFhHhYK$K|kCcUDZNO;GB72L*1YYEH)~j}e$dwcOus(2K~#%Y6G^ z__mbAmqG=&`2lxcTkDQL{IDdBDP}btzOZh$Q*d^l`-vbu3rpOYDSeh=BD$(08_U?; zuhWDj6IXT7cYfeZ>0I7?$PfD z!MLbu+|*7W2S>bUK0gRsLMrk1OTVu3Bok;(C%cWrmt@y;609 zg4)OVd3gAfhznV4ZXFrGG&;zx&$oW_tyv%b5LP!Jw$}9nlw8n+-PKNjf0t@EV}UR2 z!+J85S_;qq&8Aq!K|tWifBAAw`U>HPZOQrHI`WH?zLrnr=YOhDceT2F6dWlVM7xryKF*}7ES-kf;>+~^~RF#!!&7n!p zspmIuxElV-w7Yp@kwo7BPK>V<$M!08jwH^I&%dN4_sByXz2}IdEHBt+ip| zrGXmZv_J^x#uDqKbHw8n8naNbggi|SZoTWkfBP>-iWN@B<+1W5_^^gfYds;0VGwW)qjk!?y=P z93vulT3;EPxm20|fap!a4QxDU>8&P>zy8{q zjV!}(kmSz^U8F04ghJed>0g>*Z}p&9f;V0t#Yv1*r9unD(_qw}o&tWx71@s1!>YkNTMPz0(UVf5!u@Cg#*x7>Hv^HJq(2OJ4!Z zWcwaHcKGmVA(`+cwbj=e`f0|NQqY+NlpuG!NR=gwcPsmBAb|nFF6bb{^M$w6jM;?2x=gol?AYoPzs#$y*-Xrw` z!lUKI=)ukD4HOwR)Es1F%g^u|&z(DGMgArYXKAAskKRPuK-tA;;Md%}u+IH`QlmG5 zY%=Nl4DHY&0x{ebjNY7sIJLaPFp8VuUz|`G_s4loLYa+xcuiZaEidpQg$tlX?*~L~AeAYma2qt8Vg3M^61vpgAEE)^Jk7cqh z-~shm5)Qwr^+oBuIbV#@QpUU&!et%u0a2>Fe*IdcCSp55$2fqQt1EM{#-FTWq|Zgv z@ZOuu7A>k^u!MN)%4nL9(&230KivxH-hp1*QEY@hIN_&FEs-ESWst~HroB5{x3?gFRtl(FF5%3`*E`e-^`$>*H;VYOC=K^ z%j1*ZrDrBYq4)L_(cm2j;*r~$Z8@x>Cx)P3PK+%8+dSd3KlV7@D(&%X7KTDe47-2D z43t|DNE5Zd?RaXrKFk{5O%4lvYd$7HAb&;Q* zthhkvH;U0+=CbB&yH+^hP`<1#=@H01sr-S;hP;c*;PnC9+B(jMV4zS!u;Q8Yo>33O z&iNmAJQW5osC7pobzn9%h~7L8GwBG;^cFNSL%Ej#dcogcA>?6tjKgyUf35kL%)Fra zR#sNoweleN)hVHBY--|B<(#1@A zGj-auOpuF8V#X_Wm&#u_-9Z^$!*jhQ@HvYCORugS9InbZ|Mi;opcVwMp_}n-^u3b4{+W641i?{tRG`n)$ literal 0 HcmV?d00001 diff --git a/docs/validation/pair-noise/noise-ratio-full-vs-pilot.png b/docs/validation/pair-noise/noise-ratio-full-vs-pilot.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e14a8d4d246134dd96f8bae07e4616897b2853 GIT binary patch literal 97612 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�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 XslI8d_WNcEU;S(c*&MQ(u>8LORbl*1 literal 0 HcmV?d00001 From a26812d5ae0a64fc9826453a454610512690ec95 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Fri, 30 Oct 2026 01:00:38 +0100 Subject: [PATCH 05/11] Keep PR figures out of the branch Co-Authored-By: Claude Opus 5.5 --- docs/validation/pair-noise/bmode-ptes-full.png | Bin 48472 -> 0 bytes .../pair-noise/noise-ratio-full-vs-pilot.png | Bin 97612 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/validation/pair-noise/bmode-ptes-full.png delete mode 100644 docs/validation/pair-noise/noise-ratio-full-vs-pilot.png diff --git a/docs/validation/pair-noise/bmode-ptes-full.png b/docs/validation/pair-noise/bmode-ptes-full.png deleted file mode 100644 index e9ca5d27d28224ab4de5a7f27963bfe5856a49a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48472 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� 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 diff --git a/docs/validation/pair-noise/noise-ratio-full-vs-pilot.png b/docs/validation/pair-noise/noise-ratio-full-vs-pilot.png deleted file mode 100644 index a8e14a8d4d246134dd96f8bae07e4616897b2853..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97612 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�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 XslI8d_WNcEU;S(c*&MQ(u>8LORbl*1 From 4b0883d231527af162ed14cbee59eb8557a95e96 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Fri, 30 Oct 2026 01:52:13 +0100 Subject: [PATCH 06/11] Reuse constant-weight pair counts for the squared-weight moment MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For w_i=c, Q=c²W exactly, so one geometry traversal supplies both moments. Real-data impact: nonuniform-weight catalogues are unchanged; uniform-weight catalogues avoid a redundant traversal. All 14 pair-count tests pass inside the image on the allocation. --- src/sp_validation/pair_counts.py | 9 +++++++ src/sp_validation/tests/test_pair_counts.py | 29 +++++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/sp_validation/pair_counts.py b/src/sp_validation/pair_counts.py index 488641418..2b5a6e0d3 100644 --- a/src/sp_validation/pair_counts.py +++ b/src/sp_validation/pair_counts.py @@ -78,6 +78,9 @@ def measure_pair_counts( min_top=6, num_threads=int(num_threads), ) + constant_weight = ( + float(weights[0]) if len(weights) and np.all(weights == weights[0]) else None + ) counts = [] for power in (1, 2): cat = treecorr.Catalog( @@ -91,6 +94,12 @@ def measure_pair_counts( nn.process(cat) counts.append(nn.weight.copy()) print(f"Completed NN weights^{power}", flush=True) + if constant_weight is not None: + # For w_i=c, W=c² N and Q=c⁴ N=c² W on the same geometry. + # The second traversal carries no additional information. + counts.append(counts[0] * constant_weight**2) + print("Derived squared-weight counts for constant weights", flush=True) + break W, Q = counts ordered = ordered_effective_pairs(W, Q) edges = np.geomspace(float(min_sep), float(max_sep), int(nbins) + 1) diff --git a/src/sp_validation/tests/test_pair_counts.py b/src/sp_validation/tests/test_pair_counts.py index 66d7503a8..99e383af0 100644 --- a/src/sp_validation/tests/test_pair_counts.py +++ b/src/sp_validation/tests/test_pair_counts.py @@ -67,6 +67,35 @@ def test_positions_weights_only_and_unordered_treecorr(tmp_path): ) +@pytest.mark.parametrize("weight", [1.0, 2.0, 0.7]) +def test_constant_weights_use_one_tree_traversal(tmp_path, monkeypatch, weight): + import treecorr + + calls = [] + process = treecorr.NNCorrelation.process + + def record(self, *args, **kwargs): + calls.append(1) + return process(self, *args, **kwargs) + + monkeypatch.setattr(treecorr.NNCorrelation, "process", record) + cat = tmp_path / "constant.fits" + fits.BinTableHDU.from_columns( + [ + fits.Column(name="RA", format="D", array=[0.0, 0.01, 0.03, 0.07]), + fits.Column(name="Dec", format="D", array=np.zeros(4)), + fits.Column(name="w", format="D", array=np.full(4, weight)), + ] + ).writeto(cat) + out = tmp_path / "pairs.npz" + measure_pair_counts(cat, out, min_sep=0.1, max_sep=10.0, nbins=1) + assert len(calls) == 1 + with np.load(out) as z: + np.testing.assert_allclose(z["weight"], 6 * weight**2) + np.testing.assert_allclose(z["weight_squared"], 6 * weight**4) + np.testing.assert_allclose(z["ordered_effective_pairs"], 12) + + @pytest.mark.parametrize("layout", ["single", "chunked", "joined"]) def test_hdf5_never_materialises_shapes(tmp_path, monkeypatch, layout): cat = tmp_path / "catalogue.fits" # Detection is by content, not extension. From 8c2b168600cbe2e1508fcce58e65a75c3c6f7c83 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Fri, 30 Oct 2026 03:38:40 +0100 Subject: [PATCH 07/11] Allow explicit geometry-only pair-count references for paired mocks --- workflow/README.md | 156 ++++++++++++++++++++ workflow/common.py | 54 +++++++ workflow/rules/covariance.smk | 5 +- workflow/tests/test_pair_count_reference.py | 31 ++++ 4 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 workflow/tests/test_pair_count_reference.py diff --git a/workflow/README.md b/workflow/README.md index e3e15c6c6..28dd632bb 100644 --- a/workflow/README.md +++ b/workflow/README.md @@ -131,6 +131,162 @@ snakemake -n --profile workflow/profiles/default -s workflow/Snakefile \ --configfile papers/bmodes/config/config.yaml ``` +### Geometry-only pair counts + +The default measures weighted pair counts independently for each catalogue. +A paired mock run can share this non-cosmological geometry calculation after +verifying **all** selected positions and weights are identical, for example by +hashing every RA, Dec and weight value in row order. +Declare the reference explicitly in the run config: + +```yaml +covariance: + shape_noise: pair_counts + pair_counts_reference: + GLASS1_blinded: GLASS1_clean + GLASS1_psfleak: GLASS1_clean + GLASS1_addB: GLASS1_clean +``` + +Each consumer depends directly on the clean entry's pair-count table on the same +angular grid; the workflow does not copy tables into another producer's outputs. +The reference must be a configured run version and cannot chain through another +reference. +This option does not share shear vectors, rho/tau, fitted coefficients or +harmonic covariances, and it does not authorize sharing between different +positions, weights or selections. +Keep the full-geometry verification receipt with the run. + +## Catalogue-painted GLASS mocks + +The `glass_painted_maps` and `glass_painted_catalogue` rules project a single +source n(z) through lognormal matter shells, then paint the resulting shear +onto the positions of a calibrated FITS/HDF5 catalogue. +The default `shear: gamma` makes the signal pure E with the saved C_EE as its +known answer; `shear: reduced` applies gamma/(1-kappa) and includes physical +reduced-shear corrections to EE and BB. +The CLI exposes the same choice through `--shear {gamma,reduced}`, and the +catalogue metadata records it. +Each input ellipticity keeps its amplitude and receives an independent uniform +orientation; positions, weights and auxiliary columns remain row-aligned. +This models the projected source population rather than drawing a source +redshift per object. +The default sky has nside 4096 and lmax 8192; `harmonic_lmax` is explicit so the +painted mocks have power throughout the analysis range, independently of the +sampled mocks' `lmax=nside` default. +The default zmax of 3.5 contains the nonzero tail of the v1.4.6.3 B n(z). + +Add this opt-in configuration to a run config (paths are examples): + +```yaml +glass_paint: + output_dir: results/glass_painted + nz: /path/to/nz_B.txt + threads: 28 + map_config: + nside: 4096 + harmonic_lmax: 8192 + zmax: 3.5 + limber: true + catalogues: + sample: + path: /path/to/calibrated_catalogue.fits + ra_col: RA + dec_col: Dec + w_col: w_des + e1_col: e1 + e2_col: e2 + shear: gamma + psf_cols: [e1_PSF, e2_PSF] + injections: + none: {} + leakage: + alpha: 0.02 + additive: [0.0001, 0.0] + additive_b: + b_amplitude: 2.6e-11 + b_seed: 401 +``` + +Target `results/glass_painted/seed_00001/sample_none.h5` with the shared +workflow and the run config. +On an existing allocation, run with `srun -n 1 -c 28` and the default profile +(`-j 28`), not the cluster profile that submits new jobs. +The standalone equivalent is: + +```bash +python scripts/glass_mock/paint_catalogue.py maps --seed 1 --nz /path/nz_B.txt \ + --output results/glass_painted/seed_00001/maps --cache results/glass_painted/cache +python scripts/glass_mock/paint_catalogue.py paint --seed 1 \ + --input /path/calibrated_catalogue.fits \ + --maps results/glass_painted/seed_00001/maps \ + --output results/glass_painted/seed_00001/sample_none.h5 +``` + +Each sky stores float32 RING `kappa.npy`, `gamma1.npy`, `gamma2.npy`, +`spectra.npz` (measured full-sky KK, EE, BB and cross spectra; shell-ensemble +KK/EE with and without pixel windows), and `maps.json` (cosmology, seed, +source weights, timings and cache key). +The exact shell theory includes the same source partition and three-neighbour +shell covariance truncation as the generator, and the spherical spin-2 factor. +Both the target and the padded lognormal solver's achieved ensemble spectra are +saved, so solver residuals can be checked quantitatively. +The solver runs independent shell pairs in spawned single-thread processes, +bounded by the rule's threads or the CLI's `--workers` (default OMP_NUM_THREADS). +The locked cache holds seed-independent matter and Gaussian spectra. +It is keyed by cosmology, shell geometry, n(z), resolution and GLASS version. + +The output HDF5 has a root `data` table, readable by `read_catalogue`. +It stores `e1/e2` (or caller-named columns), `e1_noise/e2_noise` (rotated intrinsic +ellipticities), `g1_true/g2_true` (the selected noise-free signal, gamma by +default), `kappa_true`, and +`e1_injected/e2_injected` (the optional additive terms). +The input calibrated `e1_leak_corrected/e2_leak_corrected` aliases, if present, +also receive the mock shapes so corrected-column diagnostics stay mock-only. +These aliases don't apply a leakage correction to an injected mock. +Input ngmix/uncalibrated shape columns are auxiliary and must not be used as +mock shears; the mock's calibrated shape columns are authoritative. +A JSON sidecar and HDF5 attributes record rotation and injection seeds and +amplitudes. +For a B injection, `.bmode_spectra.npz` stores the target BB and +the realised full-sky EE/BB/EB of the injected field; its path is in the header. +The catalogue header also records weight sums and full-catalogue one-point +moments of the rotated noise and painted shapes, using both w and w² weights. +These diagnostics never use unrotated data components. +Columnar HDF5 inputs (one row-aligned dataset per column) are read lazily by +`Catalogue`, so compact 138M-row inputs stay bounded by `chunk_size`. +For a calibrated v2 input with a `w` column, set `w_col: w` and R=1 in the +consumer; `halo_clear` is copied unchanged for subsequent row selections. +A B-mode injection accepts either `b_amplitude` for +`C_BB=A exp[-(ell/2000)^2]` or a two-column `b_cl_path`; these specify the +pixelized target spectrum, without another pixel-window factor. +Map gamma2 has the HEALPix sign; catalogue e2, g2, noise2 and injected2 have the +opposite sky-coordinate sign, matching cosmo_val's `pol_factor: -1`. +`test_glass_paint.py` proves this with the pipeline's NaMaster map estimator, +and fails the null with the opposite sign. +Only these known-truth mock catalogue entries may use `blind: none`. +The map and catalogue headers include stage timings; catalogue timing splits +reading, signal painting, output assembly and writing. +The known-answer figures can be generated with: + +```bash +python scripts/glass_mock/plot_painted_mock.py \ + --maps results/glass_painted/seed_00001/maps \ + --catalogue /path/calibrated_catalogue.fits \ + --mock results/glass_painted/seed_00001/sample_none.h5 \ + --output results/glass_painted/diagnostics --reduced-comparison +``` + +This diagnostic runner uses the v1.4.6.3 column names (`RA`, `Dec`, `w_des`, +`e1`, `e2`) for its catalogue panels. +It samples up to one million rows in distributed contiguous blocks to avoid a +full multi-GB reread; the figure and JSON identify the evaluated sample size. +Its real-catalogue accesses are only one-point shape-noise distributions; +it never measures a real cosmological vector. +The reduced-shear comparison is entirely mock-map based, with both EE and BB +measured through `healpy.anafast(pol=True)`. +The sign-control panel instead uses cosmo_val's NaMaster primitive. + ### Which `sp_validation` a rule imports: the launched checkout The image is the frozen *dependency stack*; the `sp_validation` that runs is diff --git a/workflow/common.py b/workflow/common.py index c7d4116e8..912ba4dc4 100644 --- a/workflow/common.py +++ b/workflow/common.py @@ -332,6 +332,60 @@ def catalogue_entry(version): return CATALOG_CONFIG[catalogue_name(version)] +def measurement_catalogue(version, *, psf=False): + """Load-bearing catalogue metadata for two-point producer invalidation. + + Styles and precomputed survey summaries are presentation/covariance inputs, + not inputs to these measurements. Keep them out of expensive rerun triggers. + The PSF producers additionally read the stellar entries and patch count. + """ + entry = catalogue_entry(version) + shear_keys = ( + "path", + "hdu", + "column_map", + "ra_col", + "dec_col", + "w_col", + "e1_col", + "e2_col", + "e1_col_corrected", + "e2_col_corrected", + "R", + "R11", + "R22", + "redshift_path", + "tomo_bin_col", + ) + metadata = { + "subdir": entry.get("subdir", ""), + "shear": { + key: entry["shear"][key] for key in shear_keys if key in entry["shear"] + }, + "mask": entry.get("mask"), + } + if psf: + metadata.update( + {key: entry[key] for key in ("psf", "star", "patch_number") if key in entry} + ) + return metadata + + +def pair_count_reference(config, version): + """Resolve an explicit geometry-only reference without chaining aliases. + + The run must verify identical positions, weights and selection before + declaring a reference. The default measures each catalogue independently. + """ + references = config.get("covariance", {}).get("pair_counts_reference", {}) + reference = references.get(version, version) + if reference not in config["versions"]: + raise ValueError(f"Pair-count reference {reference!r} is not a run version") + if references.get(reference, reference) != reference: + raise ValueError("Pair-count references must point directly to a producer") + return reference + + def redshift_path(version): """The n(z) file of ``version``: its catalogue entry's ``shear.redshift_path``, as written (as ``CosmologyValidation.get_redshift`` reads it).""" diff --git a/workflow/rules/covariance.smk b/workflow/rules/covariance.smk index fbf059c78..81d1ec41f 100644 --- a/workflow/rules/covariance.smk +++ b/workflow/rules/covariance.smk @@ -57,8 +57,11 @@ def _pair_noise_enabled(w): def _pair_count_path(w, suffix=".txt"): + # This explicit reference is for catalogues with verified identical + # positions, weights and selection. No shear or rho/tau product is shared. + reference = pair_count_reference(config, w.version) return str(COSMO_VAL / ( - f"{w.version}_pairs_minsep={w.min_sep}_maxsep={w.max_sep}" + f"{reference}_pairs_minsep={w.min_sep}_maxsep={w.max_sep}" f"_nbins={w.nbins}{suffix}" )) diff --git a/workflow/tests/test_pair_count_reference.py b/workflow/tests/test_pair_count_reference.py new file mode 100644 index 000000000..89f378255 --- /dev/null +++ b/workflow/tests/test_pair_count_reference.py @@ -0,0 +1,31 @@ +"""Geometry-only pair-count sharing is explicit, direct and opt-in.""" + +import pytest + + +def test_pair_count_reference_is_opt_in(toy): + config = {"versions": ["clean", "blinded"]} + assert toy.common.pair_count_reference(config, "blinded") == "blinded" + config["covariance"] = {"pair_counts_reference": {"blinded": "clean"}} + assert toy.common.pair_count_reference(config, "blinded") == "clean" + assert toy.common.pair_count_reference(config, "clean") == "clean" + + +def test_pair_count_reference_rejects_missing_producer(toy): + config = { + "versions": ["blinded"], + "covariance": {"pair_counts_reference": {"blinded": "missing"}}, + } + with pytest.raises(ValueError, match="not a run version"): + toy.common.pair_count_reference(config, "blinded") + + +def test_pair_count_reference_rejects_chains(toy): + config = { + "versions": ["clean", "blinded", "injected"], + "covariance": { + "pair_counts_reference": {"blinded": "injected", "injected": "clean"} + }, + } + with pytest.raises(ValueError, match="directly to a producer"): + toy.common.pair_count_reference(config, "blinded") From 90c93cd53406894f3268d5ec51a1ee09aaabb942 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Fri, 30 Oct 2026 05:36:34 +0100 Subject: [PATCH 08/11] Keep only the pair-count reference in this branch The previous commit also carried the catalogue-metadata invalidation helper and the painted-mock README section, which belong to their own PRs. Co-Authored-By: Claude Opus 5.5 --- workflow/README.md | 133 +-------------------------------------------- workflow/common.py | 39 ------------- 2 files changed, 1 insertion(+), 171 deletions(-) diff --git a/workflow/README.md b/workflow/README.md index 28dd632bb..58995a075 100644 --- a/workflow/README.md +++ b/workflow/README.md @@ -131,7 +131,7 @@ snakemake -n --profile workflow/profiles/default -s workflow/Snakefile \ --configfile papers/bmodes/config/config.yaml ``` -### Geometry-only pair counts +#### Geometry-only pair counts for paired mocks The default measures weighted pair counts independently for each catalogue. A paired mock run can share this non-cosmological geometry calculation after @@ -155,137 +155,6 @@ reference. This option does not share shear vectors, rho/tau, fitted coefficients or harmonic covariances, and it does not authorize sharing between different positions, weights or selections. -Keep the full-geometry verification receipt with the run. - -## Catalogue-painted GLASS mocks - -The `glass_painted_maps` and `glass_painted_catalogue` rules project a single -source n(z) through lognormal matter shells, then paint the resulting shear -onto the positions of a calibrated FITS/HDF5 catalogue. -The default `shear: gamma` makes the signal pure E with the saved C_EE as its -known answer; `shear: reduced` applies gamma/(1-kappa) and includes physical -reduced-shear corrections to EE and BB. -The CLI exposes the same choice through `--shear {gamma,reduced}`, and the -catalogue metadata records it. -Each input ellipticity keeps its amplitude and receives an independent uniform -orientation; positions, weights and auxiliary columns remain row-aligned. -This models the projected source population rather than drawing a source -redshift per object. -The default sky has nside 4096 and lmax 8192; `harmonic_lmax` is explicit so the -painted mocks have power throughout the analysis range, independently of the -sampled mocks' `lmax=nside` default. -The default zmax of 3.5 contains the nonzero tail of the v1.4.6.3 B n(z). - -Add this opt-in configuration to a run config (paths are examples): - -```yaml -glass_paint: - output_dir: results/glass_painted - nz: /path/to/nz_B.txt - threads: 28 - map_config: - nside: 4096 - harmonic_lmax: 8192 - zmax: 3.5 - limber: true - catalogues: - sample: - path: /path/to/calibrated_catalogue.fits - ra_col: RA - dec_col: Dec - w_col: w_des - e1_col: e1 - e2_col: e2 - shear: gamma - psf_cols: [e1_PSF, e2_PSF] - injections: - none: {} - leakage: - alpha: 0.02 - additive: [0.0001, 0.0] - additive_b: - b_amplitude: 2.6e-11 - b_seed: 401 -``` - -Target `results/glass_painted/seed_00001/sample_none.h5` with the shared -workflow and the run config. -On an existing allocation, run with `srun -n 1 -c 28` and the default profile -(`-j 28`), not the cluster profile that submits new jobs. -The standalone equivalent is: - -```bash -python scripts/glass_mock/paint_catalogue.py maps --seed 1 --nz /path/nz_B.txt \ - --output results/glass_painted/seed_00001/maps --cache results/glass_painted/cache -python scripts/glass_mock/paint_catalogue.py paint --seed 1 \ - --input /path/calibrated_catalogue.fits \ - --maps results/glass_painted/seed_00001/maps \ - --output results/glass_painted/seed_00001/sample_none.h5 -``` - -Each sky stores float32 RING `kappa.npy`, `gamma1.npy`, `gamma2.npy`, -`spectra.npz` (measured full-sky KK, EE, BB and cross spectra; shell-ensemble -KK/EE with and without pixel windows), and `maps.json` (cosmology, seed, -source weights, timings and cache key). -The exact shell theory includes the same source partition and three-neighbour -shell covariance truncation as the generator, and the spherical spin-2 factor. -Both the target and the padded lognormal solver's achieved ensemble spectra are -saved, so solver residuals can be checked quantitatively. -The solver runs independent shell pairs in spawned single-thread processes, -bounded by the rule's threads or the CLI's `--workers` (default OMP_NUM_THREADS). -The locked cache holds seed-independent matter and Gaussian spectra. -It is keyed by cosmology, shell geometry, n(z), resolution and GLASS version. - -The output HDF5 has a root `data` table, readable by `read_catalogue`. -It stores `e1/e2` (or caller-named columns), `e1_noise/e2_noise` (rotated intrinsic -ellipticities), `g1_true/g2_true` (the selected noise-free signal, gamma by -default), `kappa_true`, and -`e1_injected/e2_injected` (the optional additive terms). -The input calibrated `e1_leak_corrected/e2_leak_corrected` aliases, if present, -also receive the mock shapes so corrected-column diagnostics stay mock-only. -These aliases don't apply a leakage correction to an injected mock. -Input ngmix/uncalibrated shape columns are auxiliary and must not be used as -mock shears; the mock's calibrated shape columns are authoritative. -A JSON sidecar and HDF5 attributes record rotation and injection seeds and -amplitudes. -For a B injection, `.bmode_spectra.npz` stores the target BB and -the realised full-sky EE/BB/EB of the injected field; its path is in the header. -The catalogue header also records weight sums and full-catalogue one-point -moments of the rotated noise and painted shapes, using both w and w² weights. -These diagnostics never use unrotated data components. -Columnar HDF5 inputs (one row-aligned dataset per column) are read lazily by -`Catalogue`, so compact 138M-row inputs stay bounded by `chunk_size`. -For a calibrated v2 input with a `w` column, set `w_col: w` and R=1 in the -consumer; `halo_clear` is copied unchanged for subsequent row selections. -A B-mode injection accepts either `b_amplitude` for -`C_BB=A exp[-(ell/2000)^2]` or a two-column `b_cl_path`; these specify the -pixelized target spectrum, without another pixel-window factor. -Map gamma2 has the HEALPix sign; catalogue e2, g2, noise2 and injected2 have the -opposite sky-coordinate sign, matching cosmo_val's `pol_factor: -1`. -`test_glass_paint.py` proves this with the pipeline's NaMaster map estimator, -and fails the null with the opposite sign. -Only these known-truth mock catalogue entries may use `blind: none`. -The map and catalogue headers include stage timings; catalogue timing splits -reading, signal painting, output assembly and writing. -The known-answer figures can be generated with: - -```bash -python scripts/glass_mock/plot_painted_mock.py \ - --maps results/glass_painted/seed_00001/maps \ - --catalogue /path/calibrated_catalogue.fits \ - --mock results/glass_painted/seed_00001/sample_none.h5 \ - --output results/glass_painted/diagnostics --reduced-comparison -``` - -This diagnostic runner uses the v1.4.6.3 column names (`RA`, `Dec`, `w_des`, -`e1`, `e2`) for its catalogue panels. -It samples up to one million rows in distributed contiguous blocks to avoid a -full multi-GB reread; the figure and JSON identify the evaluated sample size. -Its real-catalogue accesses are only one-point shape-noise distributions; -it never measures a real cosmological vector. -The reduced-shear comparison is entirely mock-map based, with both EE and BB -measured through `healpy.anafast(pol=True)`. -The sign-control panel instead uses cosmo_val's NaMaster primitive. ### Which `sp_validation` a rule imports: the launched checkout diff --git a/workflow/common.py b/workflow/common.py index 912ba4dc4..81a09f108 100644 --- a/workflow/common.py +++ b/workflow/common.py @@ -332,45 +332,6 @@ def catalogue_entry(version): return CATALOG_CONFIG[catalogue_name(version)] -def measurement_catalogue(version, *, psf=False): - """Load-bearing catalogue metadata for two-point producer invalidation. - - Styles and precomputed survey summaries are presentation/covariance inputs, - not inputs to these measurements. Keep them out of expensive rerun triggers. - The PSF producers additionally read the stellar entries and patch count. - """ - entry = catalogue_entry(version) - shear_keys = ( - "path", - "hdu", - "column_map", - "ra_col", - "dec_col", - "w_col", - "e1_col", - "e2_col", - "e1_col_corrected", - "e2_col_corrected", - "R", - "R11", - "R22", - "redshift_path", - "tomo_bin_col", - ) - metadata = { - "subdir": entry.get("subdir", ""), - "shear": { - key: entry["shear"][key] for key in shear_keys if key in entry["shear"] - }, - "mask": entry.get("mask"), - } - if psf: - metadata.update( - {key: entry[key] for key in ("psf", "star", "patch_number") if key in entry} - ) - return metadata - - def pair_count_reference(config, version): """Resolve an explicit geometry-only reference without chaining aliases. From 25cf86a642b82ddd9709fa964dc2ea9117d4144b Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Sat, 31 Oct 2026 00:53:55 +0100 Subject: [PATCH 09/11] Tomographic covariances stay analytic under explicit pair_counts covariance.shape_noise governs the non-tomographic covariance. A config that sets pair_counts explicitly, as the cosmo_val template does, now builds its tomographic covariances analytic instead of refusing them. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01JK7o9GEqa7euoocPk5aSTT --- papers/cosmo_val/config/config.yaml | 1 + workflow/rules/covariance.smk | 14 +++++++------- workflow/tests/test_pair_noise.py | 10 +++++++--- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/papers/cosmo_val/config/config.yaml b/papers/cosmo_val/config/config.yaml index 8d7500d2e..83fa331cb 100644 --- a/papers/cosmo_val/config/config.yaml +++ b/papers/cosmo_val/config/config.yaml @@ -115,6 +115,7 @@ covariance: default_masked: true # Non-tomographic real-space shape noise: measured W²/Q includes pair loss. # Set analytic to restore OneCovariance's uniform-area approximation. + # Tomographic covariances are always analytic. shape_noise: pair_counts cl: diff --git a/workflow/rules/covariance.smk b/workflow/rules/covariance.smk index 81d1ec41f..d4fe39dc6 100644 --- a/workflow/rules/covariance.smk +++ b/workflow/rules/covariance.smk @@ -44,16 +44,16 @@ def _onecov_tool(key, default=None): def _pair_noise_enabled(w): - """Default to measured noise for non-tomographic cosmo_val runs only.""" - default = "pair_counts" if "cosmo_val" in config and not w.tomo_suffix else "analytic" + """Whether a covariance uses measured pair counts for its shape noise. + + ``covariance.shape_noise`` sets the non-tomographic covariance (default + pair_counts in cosmo_val, analytic elsewhere). Tomographic covariances are + always analytic: pair counts are measured for the whole sample only.""" + default = "pair_counts" if "cosmo_val" in config else "analytic" mode = config.get("covariance", {}).get("shape_noise", default) if mode not in ("pair_counts", "analytic"): raise ValueError("covariance.shape_noise must be pair_counts or analytic") - if w.tomo_suffix: - if mode == "pair_counts": - raise ValueError("Pair-count noise currently supports non-tomographic xi only") - return False - return mode == "pair_counts" + return mode == "pair_counts" and not w.tomo_suffix def _pair_count_path(w, suffix=".txt"): diff --git a/workflow/tests/test_pair_noise.py b/workflow/tests/test_pair_noise.py index 166ad0abd..e280ac092 100644 --- a/workflow/tests/test_pair_noise.py +++ b/workflow/tests/test_pair_noise.py @@ -88,11 +88,15 @@ def test_implicit_tomographic_default_stays_analytic(toy): assert not any(j.rule == "covariance_pair_counts" for j in jobs) -def test_explicit_tomographic_pair_counts_refused(toy): +def test_explicit_pair_counts_leave_tomographic_analytic(toy): + """The template's explicit pair_counts governs the non-tomographic + covariance; a tomographic one from the same config resolves, analytic.""" result = toy.snakemake( "-n", _ini(toy, "_tomo"), config=['covariance={"shape_noise":"pair_counts","default_masked":false}'], ) - assert result.returncode != 0 - assert "non-tomographic xi only" in result.stdout + assert result.returncode == 0, result.stdout + jobs = parse_jobs(result.stdout) + assert any(j.rule == "covariance_ini" for j in jobs) + assert not any(j.rule == "covariance_pair_counts" for j in jobs) From 75c279eecee98da48fe430e6d6edfc71422ddb34 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Sun, 1 Nov 2026 05:17:03 +0100 Subject: [PATCH 10/11] Use measured effective pair counts for tomographic shape noise --- docs/pair-count-noise.md | 29 ++++- papers/cosmo_val/config/config.yaml | 3 +- src/sp_validation/pair_counts.py | 53 ++++++--- src/sp_validation/tests/test_pair_counts.py | 45 ++++++++ .../tests/test_pair_counts_onecov.py | 102 ++++++++++++++++++ workflow/README.md | 2 +- workflow/rules/covariance.smk | 51 +++++++-- workflow/scripts/measure_pair_counts.py | 2 + workflow/tests/test_onecov_inputs.py | 2 +- workflow/tests/test_pair_noise.py | 59 ++++++---- 10 files changed, 296 insertions(+), 52 deletions(-) create mode 100644 src/sp_validation/tests/test_pair_counts_onecov.py diff --git a/docs/pair-count-noise.md b/docs/pair-count-noise.md index 3d66ccdff..e52b07f27 100644 --- a/docs/pair-count-noise.md +++ b/docs/pair-count-noise.md @@ -1,13 +1,13 @@ # Pair-count shape noise -Non-tomographic `cosmo_val` workflows use measured effective pairs for OneCovariance's real-space Gaussian shape-noise term by default. +`cosmo_val` workflows (whole-sample and tomographic) use measured effective pairs for OneCovariance's real-space Gaussian shape-noise term by default. Set `covariance.shape_noise: analytic` to recover the uniform-area approximation. -Other workflows retain their analytic default; tomographic pair-count noise is not implemented and an explicit request fails. +Other workflows retain their analytic default. This changes neither blinding nor the mixed, sample-variance, non-Gaussian or SSC terms. ## Cache and normalization -`covariance_pair_counts` reads only the configured RA, Dec and weight columns of the same selected shear catalogue as `xi`. +`covariance_pair_counts` reads only the configured RA, Dec, weight and (for tomography) bin-ID columns of the same selected shear catalogue as `xi`. It counts on each requested covariance grid, using TreeCorr NN correlations with weights `w` and `w²`, spherical coordinates, logarithmic bins and `min_top=6`, matching `xi`. The cache is independent of cosmology and contains no shapes, signals or blind records. The reader projects fields directly from the lazy catalogue chunks, including compound HDF5 datasets, rather than materialising rows containing shape fields. @@ -43,7 +43,28 @@ No area rescaling or post-run whole-covariance scaling is applied. The normalization test checks the uniform-field expectation analytically, including non-unit equal weights and both dispersion conventions. A four-object positions-only catalogue checks TreeCorr's unordered convention against explicit pair enumeration. HDF5 tests forbid whole-dataset or shape-column reads for single, chunked and joined layouts. -DAG tests verify the cache-to-ini dependency, analytic opt-out, dispersion boundary and tomographic default/refusal behavior. +DAG tests verify the cache-to-ini dependency, analytic opt-out, dispersion boundary and tomographic file order and footprint inputs. + +## Tomographic pairs + +Each positive tomographic bin pair is counted separately, including cross correlations between disjoint bins. +`shear.tomo_bin_col` names the bin-ID field; zero and negative IDs are excluded, matching ξ± selection. +One-based indices in filenames refer to the sorted positive catalogue IDs, in the same order as the n(z) columns and `cov_th.tomo` survey parameters. +The workflow writes `{version}_pairs_minsep=..._maxsep=..._nbins=..._tomo_bin=i-j.npz` and `.txt`, ordered `(1,1), (1,2), …, (2,2), …` in `npair_mm_file`. +Each cache records the bin indices and the actual catalogue IDs. +The area's and mask's source remains `cov_th.tomo` as for analytic noise. +Geometry references must also have identical bin IDs when tomography is enabled. + +For an auto pair the table contains **2W²/Q**, with `ordered_effective_pairs` in the cache. +For a cross pair it contains **W²/Q**, with `effective_cross_pairs` in the cache: TreeCorr counts each cross pair once, and only one of OneCovariance's two Kronecker contractions survives. +Both yield the independent-shape variance `2 s_i² s_j² Q/W²`. +Passing 2W²/Q for a cross would underestimate its noise by a factor of two. +Pure shape noise has no covariance between different unordered bin pairs or between ξ+ and ξ−. + +The opt-in test `test_pair_counts_onecov.py` executes the external checkout's actual file reader and real-space noise kernel with unequal bin dispersions and explicit weighted-pair answers. +Only the Fourier cosmological terms are stubbed to zero; it does not run the full cosmological integration. +Run it inside the dependency container with `ONECOVARIANCE_PATH` set to the workflow's external source checkout. +The tomographic probe is verified against candide checkout `70265be3a4bffcfded7b9251a3c4cbe8159d793f`. ## Existing products diff --git a/papers/cosmo_val/config/config.yaml b/papers/cosmo_val/config/config.yaml index 21d988f66..07e2b3ad5 100644 --- a/papers/cosmo_val/config/config.yaml +++ b/papers/cosmo_val/config/config.yaml @@ -114,9 +114,8 @@ var_method: jackknife covariance: default_masked: true - # Non-tomographic real-space shape noise: measured W²/Q includes pair loss. + # Real-space shape noise, including tomography: measured W²/Q includes pair loss. # Set analytic to restore OneCovariance's uniform-area approximation. - # Tomographic covariances are always analytic. shape_noise: pair_counts cl: diff --git a/src/sp_validation/pair_counts.py b/src/sp_validation/pair_counts.py index 2b5a6e0d3..942a04a51 100644 --- a/src/sp_validation/pair_counts.py +++ b/src/sp_validation/pair_counts.py @@ -2,7 +2,8 @@ TreeCorr auto counts are unordered. OneCovariance's xi_pm noise is 4*s**4/N_ordered, where s is the per-component dispersion, so supply -N_ordered = 2*W**2/Q, not raw npairs or W. No shape columns are accessed. +N_ordered = 2*W**2/Q for autos. Cross bins use W**2/Q and one +Kronecker contraction. No shape columns are accessed. """ from pathlib import Path @@ -43,17 +44,21 @@ def measure_pair_counts( dec_col="Dec", w_col="w", num_threads=1, + tomo_bin_col=None, + bin_pair=None, ): """Cache W, Q and raw counts using positions and weights only. Uses the xi rule's log binning, spherical metric and min_top=6. The adjacent two-column .txt has nominal log-bin centres in arcmin, never mean pair separations: OneCovariance must not rebin W²/Q. + ``bin_pair`` contains one-based indices into the sorted positive IDs in + ``tomo_bin_col``, matching the n(z) column order used by OneCovariance. """ # Catalogue.read materialises whole compound HDF5 chunks before selecting # columns. Index the public lazy chunk tables field-by-field instead, so # shapes are never loaded, for either FITS or any supported HDF5 layout. - columns = (ra_col, dec_col, w_col) + columns = (ra_col, dec_col, w_col) + ((tomo_bin_col,) if bin_pair else ()) with Catalogue(str(catalogue)) as cat: data = np.empty(len(cat), dtype=cat.dtype(columns)) start = 0 @@ -62,6 +67,15 @@ def measure_pair_counts( for name in columns: data[name][start:end] = table[name] start = end + if bin_pair: + ids = np.unique(data[tomo_bin_col]) + ids = ids[ids > 0] + # OneCovariance indexes the sorted positive bins from one, as n(z) does. + selected_ids = ids[np.asarray(bin_pair) - 1] + selections = [data[tomo_bin_col] == value for value in selected_ids] + else: + selections = [np.ones(len(data), dtype=bool)] * 2 + auto = bin_pair is None or bin_pair[0] == bin_pair[1] weights = np.asarray(data[w_col], dtype=float) if ( not np.all(np.isfinite(weights)) @@ -83,15 +97,18 @@ def measure_pair_counts( ) counts = [] for power in (1, 2): - cat = treecorr.Catalog( - ra=data[ra_col], - dec=data[dec_col], - w=weights**power, - ra_units="deg", - dec_units="deg", - ) + cats = [ + treecorr.Catalog( + ra=data[ra_col][mask], + dec=data[dec_col][mask], + w=weights[mask] ** power, + ra_units="deg", + dec_units="deg", + ) + for mask in selections[: 1 if auto else 2] + ] nn = treecorr.NNCorrelation(config) - nn.process(cat) + nn.process(*cats) counts.append(nn.weight.copy()) print(f"Completed NN weights^{power}", flush=True) if constant_weight is not None: @@ -101,22 +118,30 @@ def measure_pair_counts( print("Derived squared-weight counts for constant weights", flush=True) break W, Q = counts - ordered = ordered_effective_pairs(W, Q) + # One contraction survives for disjoint cross bins, two for an auto. + # OneCovariance therefore needs W²/Q for crosses and 2 W²/Q for autos. + effective = ordered_effective_pairs(W, Q) / (1 if auto else 2) edges = np.geomspace(float(min_sep), float(max_sep), int(nbins) + 1) theta = np.sqrt(edges[:-1] * edges[1:]) output = Path(output) output.parent.mkdir(parents=True, exist_ok=True) np.savez( output, + **( + {"bin_pair": np.asarray(bin_pair), "bin_ids": selected_ids} + if bin_pair + else {} + ), theta=theta, edges=edges, npairs=nn.npairs, weight=W, weight_squared=Q, - ordered_effective_pairs=ordered, + **{("ordered_effective_pairs" if auto else "effective_cross_pairs"): effective}, ) np.savetxt( output.with_suffix(".txt"), - np.column_stack((theta, ordered)), - header="theta_arcmin N_ordered_effective", + np.column_stack((theta, effective)), + header="theta_arcmin " + + ("N_ordered_effective" if auto else "N_cross_effective"), ) diff --git a/src/sp_validation/tests/test_pair_counts.py b/src/sp_validation/tests/test_pair_counts.py index 99e383af0..48bbf5f95 100644 --- a/src/sp_validation/tests/test_pair_counts.py +++ b/src/sp_validation/tests/test_pair_counts.py @@ -137,3 +137,48 @@ def only_pair_fields(dataset, key, *args, **kwargs): with np.load(out) as z: np.testing.assert_allclose(z["weight"], 35.0) np.testing.assert_allclose(z["weight_squared"], 273.0) + + +@pytest.mark.parametrize( + "pair, indices, factor", + [ + ((1, 1), [(1, 2)], 2), + ((1, 2), [(1, 3), (1, 4), (2, 3), (2, 4)], 1), + ((2, 2), [(3, 4)], 2), + ], +) +def test_tomographic_pairs_known_answer(tmp_path, pair, indices, factor): + # Negative and zero IDs are excluded; sorted positive IDs needn't be consecutive. + weights = np.array([100.0, 1.0, 2.0, 3.0, 4.0, 100.0]) + cat = tmp_path / "tomo.fits" + fits.BinTableHDU.from_columns( + [ + fits.Column(name="RA", format="D", array=np.arange(6) * 0.01), + fits.Column(name="Dec", format="D", array=np.zeros(6)), + fits.Column(name="w", format="D", array=weights), + fits.Column(name="TOM_BIN_ID", format="J", array=[0, 2, 2, 4, 4, -1]), + ] + ).writeto(cat) + output = tmp_path / "counts.npz" + measure_pair_counts( + cat, + output, + min_sep=0.1, + max_sep=10, + nbins=1, + tomo_bin_col="TOM_BIN_ID", + bin_pair=pair, + ) + products = np.array([weights[i] * weights[j] for i, j in indices]) + with np.load(output) as z: + np.testing.assert_allclose(z["weight"], products.sum()) + np.testing.assert_allclose(z["weight_squared"], (products**2).sum()) + np.testing.assert_allclose(z["npairs"], len(indices)) + np.testing.assert_allclose( + z[ + "ordered_effective_pairs" + if pair[0] == pair[1] + else "effective_cross_pairs" + ], + factor * products.sum() ** 2 / (products**2).sum(), + ) diff --git a/src/sp_validation/tests/test_pair_counts_onecov.py b/src/sp_validation/tests/test_pair_counts_onecov.py new file mode 100644 index 000000000..1ea6a4270 --- /dev/null +++ b/src/sp_validation/tests/test_pair_counts_onecov.py @@ -0,0 +1,102 @@ +"""Opt-in probe of the external OneCovariance table reader and noise kernel. + +Run with ONECOVARIANCE_PATH pointing to the checkout used by the workflow. +Only the cosmological Fourier terms are stubbed; the real table reader and +real-space noise contractions execute from that checkout. +""" + +import os + +import numpy as np +import pytest +from astropy.io import fits + +from sp_validation.pair_counts import measure_pair_counts + + +@pytest.mark.skipif( + not os.environ.get("ONECOVARIANCE_PATH"), + reason="Set ONECOVARIANCE_PATH to the workflow's external checkout", +) +def test_onecov_tomographic_noise_kernel(tmp_path, monkeypatch): + monkeypatch.syspath_prepend(os.environ["ONECOVARIANCE_PATH"]) + from onecov.cov_input import FileInput + from onecov.cov_theta_space import CovTHETASpace + + cat = tmp_path / "positions.fits" + weights = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0]) + ids = np.array([1, 1, 1, 2, 2, 2]) + fits.BinTableHDU.from_columns( + [ + fits.Column(name="RA", format="D", array=np.arange(6) * 0.01), + fits.Column(name="Dec", format="D", array=np.zeros(6)), + fits.Column(name="w", format="D", array=weights), + fits.Column(name="bin", format="J", array=ids), + ] + ).writeto(cat) + pairs = [(1, 1), (1, 2), (2, 2)] + files, expected = [], {} + s = np.array([0.23, 0.37]) + for i, j in pairs: + out = tmp_path / f"pairs_{i}_{j}.npz" + measure_pair_counts( + cat, + out, + min_sep=0.1, + max_sep=10, + nbins=1, + tomo_bin_col="bin", + bin_pair=(i, j), + ) + files.append(out.with_suffix(".txt").name) + products = np.array( + [ + weights[a] * weights[b] + for a in range(6) + for b in range(6) + if ids[a] == i and ids[b] == j and (i != j or a < b) + ] + ) + expected[i - 1, j - 1] = ( + 2 + * s[i - 1] ** 2 + * s[j - 1] ** 2 + * (products**2).sum() + / products.sum() ** 2 + ) + + reader = FileInput({}) + reader.clustering, reader.ggl, reader.cosmicshear = False, False, True + reader.n_tomo_lens = 2 + reader._FileInput__get_npair_tabs( + { + "tabulated inputs files": { + "npair_directory": str(tmp_path), + "npair_mm_file": ", ".join(files), + } + } + ) + assert reader.npair_mm.shape == (1, 2, 2, 1) + + cov = CovTHETASpace.__new__(CovTHETASpace) + cov.cov_dict = {"gauss": True, "split_gauss": True, "sn_only": True} + cov.csmf, cov.gg, cov.gm, cov.mm = False, False, False, True + cov.n_tomo_lens = 2 + cov.sample_dim = 1 + cov.xi_pp, cov.xi_pm, cov.xi_mm = True, True, True + cov.theta_bins_lensing = np.array([1.0]) + cov.ellrange = np.array([10.0]) + cov.npair_mm = reader.npair_mm.transpose(0, 3, 1, 2) + zero = np.zeros((1, 1, 1, 1, 2, 2, 2, 2)) + cov.covELL_gaussian = lambda *args: [zero] * 18 + parts = cov._CovTHETASpace__covTHETA_split_gaussian( + {}, {"ellipticity_dispersion": s}, False + ) + for offset in (23, 29): + noise = parts[offset][0, 0, 0, 0] + for (i, j), value in expected.items(): + np.testing.assert_allclose(noise[i, j, i, j], value, rtol=1e-12) + for k, ell in expected: + if (i, j) != (k, ell): + assert noise[i, j, k, ell] == 0 + assert parts[26] == 0 # Pure-noise xi+ / xi- cross covariance vanishes. diff --git a/workflow/README.md b/workflow/README.md index 4e358583b..f1f41d141 100644 --- a/workflow/README.md +++ b/workflow/README.md @@ -139,7 +139,7 @@ snakemake -n --profile workflow/profiles/default -s workflow/Snakefile \ The default measures weighted pair counts independently for each catalogue. A paired mock run can share this non-cosmological geometry calculation after verifying **all** selected positions and weights are identical, for example by -hashing every RA, Dec and weight value in row order. +hashing every RA, Dec and weight value in row order (and every bin ID for tomography). Declare the reference explicitly in the run config: ```yaml diff --git a/workflow/rules/covariance.smk b/workflow/rules/covariance.smk index 2057fc163..daa1cd0d7 100644 --- a/workflow/rules/covariance.smk +++ b/workflow/rules/covariance.smk @@ -115,28 +115,34 @@ def _onecov_tool(key, default=None): def _pair_noise_enabled(w): - """Whether a covariance uses measured pair counts for its shape noise. - - ``covariance.shape_noise`` sets the non-tomographic covariance (default - pair_counts in cosmo_val, analytic elsewhere). Tomographic covariances are - always analytic: pair counts are measured for the whole sample only.""" + """Whether this covariance uses measured pair counts on its own grid.""" default = "pair_counts" if "cosmo_val" in config else "analytic" mode = config.get("covariance", {}).get("shape_noise", default) if mode not in ("pair_counts", "analytic"): raise ValueError("covariance.shape_noise must be pair_counts or analytic") - return mode == "pair_counts" and not w.tomo_suffix + return mode == "pair_counts" -def _pair_count_path(w, suffix=".txt"): +def _pair_count_path(w, suffix=".txt", pair=None): # This explicit reference is for catalogues with verified identical # positions, weights and selection. No shear or rho/tau product is shared. reference = pair_count_reference(config, w.version) return str(COSMO_VAL / ( f"{reference}_pairs_minsep={w.min_sep}_maxsep={w.max_sep}" - f"_nbins={w.nbins}{suffix}" + f"_nbins={w.nbins}" + + (f"_tomo_bin={pair[0]}-{pair[1]}" if pair else "") + suffix )) +def _pair_count_paths(w): + if not w.tomo_suffix: + return [_pair_count_path(w)] + # The ordered n(z) columns and survey parameters define the bin order. + n = len(get_onecov_cat_params(w.version, w.tomo_suffix)[1].split(",")) + return [_pair_count_path(w, pair=(i, j)) + for i in range(1, n + 1) for j in range(i, n + 1)] + + # Number of cores to use to execute OneCovariance ONECOV_THREADS = 8 @@ -226,10 +232,35 @@ rule covariance_pair_counts: "../scripts/measure_pair_counts.py" +rule covariance_pair_counts_tomo: + """Non-cosmological cache: positions and weights only, no blind access.""" + input: + catalog=get_shear_catalog, + output: + cache=str(COSMO_VAL / "{version}_pairs_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}_tomo_bin={bin1}-{bin2}.npz"), + tabulated=str(COSMO_VAL / "{version}_pairs_minsep={min_sep}_maxsep={max_sep}_nbins={nbins}_tomo_bin={bin1}-{bin2}.txt"), + params: + ra_col=lambda w: catalogue_entry(w.version)["shear"].get("ra_col", "RA"), + dec_col=lambda w: catalogue_entry(w.version)["shear"].get("dec_col", "Dec"), + w_col=lambda w: catalogue_entry(w.version)["shear"]["w_col"], + tomo_bin_col=lambda w: catalogue_entry(w.version)["shear"]["tomo_bin_col"], + bin_pair=lambda w: (int(w.bin1), int(w.bin2)), + wildcard_constraints: + bin1=r"[1-9][0-9]*", + bin2=r"[1-9][0-9]*", + threads: 24 + resources: + mem_mb=40000, + disk_mb=20000, + runtime=600, + script: + "../scripts/measure_pair_counts.py" + + rule covariance_ini: input: nz_file=lambda w: onecov_nz_path(w.version, w.tomo_suffix), - npair=lambda w: [_pair_count_path(w)] if _pair_noise_enabled(w) else [], + npair=lambda w: _pair_count_paths(w) if _pair_noise_enabled(w) else [], mask=lambda w: ( [] if w.mask_suffix != "_masked" else [get_footprint_path(w.version, w.tomo_suffix)] @@ -267,7 +298,7 @@ rule covariance_ini: pair_section=lambda w: ( "[tabulated inputs files]\n" f"npair_directory = {COSMO_VAL}\n" - f"npair_mm_file = {os.path.basename(_pair_count_path(w))}" + "npair_mm_file = " + ", ".join(os.path.basename(p) for p in _pair_count_paths(w)) if _pair_noise_enabled(w) else "" ), threads: 1 diff --git a/workflow/scripts/measure_pair_counts.py b/workflow/scripts/measure_pair_counts.py index 767d04ee4..51d8ed700 100644 --- a/workflow/scripts/measure_pair_counts.py +++ b/workflow/scripts/measure_pair_counts.py @@ -12,4 +12,6 @@ dec_col=snakemake.params.dec_col, w_col=snakemake.params.w_col, num_threads=snakemake.threads, + tomo_bin_col=snakemake.params.get("tomo_bin_col"), + bin_pair=snakemake.params.get("bin_pair"), ) diff --git a/workflow/tests/test_onecov_inputs.py b/workflow/tests/test_onecov_inputs.py index ff3ae2077..276135ac5 100644 --- a/workflow/tests/test_onecov_inputs.py +++ b/workflow/tests/test_onecov_inputs.py @@ -8,7 +8,7 @@ # Bin integrals 0.5 and 0.625: not unit-normalised. NZ_ROWS = "0.0 0.0 0.0\n0.5 1.0 0.5\n1.0 0.0 1.5\n" -UNMASKED = ['covariance={"default_masked":false}'] +UNMASKED = ['covariance={"default_masked":false,"shape_noise":"analytic"}'] def _ini(toy, tomo_suffix=""): diff --git a/workflow/tests/test_pair_noise.py b/workflow/tests/test_pair_noise.py index e280ac092..b3ae31577 100644 --- a/workflow/tests/test_pair_noise.py +++ b/workflow/tests/test_pair_noise.py @@ -79,24 +79,43 @@ def test_analytic_flag_removes_pair_dependency(toy): assert not any("_pairs_" in p for p in ini.input) -def test_implicit_tomographic_default_stays_analytic(toy): - with _implicit_noise_setting(toy): - result = toy.snakemake("-n", _ini(toy, "_tomo")) - assert result.returncode == 0, result.stdout - jobs = parse_jobs(result.stdout) - assert any(j.rule == "covariance_ini" for j in jobs) - assert not any(j.rule == "covariance_pair_counts" for j in jobs) - +def test_tomographic_counts_and_file_order(toy): + from test_onecov_inputs import _two_bin_catalogue -def test_explicit_pair_counts_leave_tomographic_analytic(toy): - """The template's explicit pair_counts governs the non-tomographic - covariance; a tomographic one from the same config resolves, analytic.""" - result = toy.snakemake( - "-n", - _ini(toy, "_tomo"), - config=['covariance={"shape_noise":"pair_counts","default_masked":false}'], - ) - assert result.returncode == 0, result.stdout - jobs = parse_jobs(result.stdout) - assert any(j.rule == "covariance_ini" for j in jobs) - assert not any(j.rule == "covariance_pair_counts" for j in jobs) + with _two_bin_catalogue(toy): + target = _ini(toy, "_tomo") + result = toy.snakemake("-n", target) + assert result.returncode == 0, result.stdout + jobs = parse_jobs(result.stdout) + pairs = [j for j in jobs if j.rule == "covariance_pair_counts_tomo"] + assert len(pairs) == 3 + assert {(j.wildcards["bin1"], j.wildcards["bin2"]) for j in pairs} == { + ("1", "1"), + ("1", "2"), + ("2", "2"), + } + for job in pairs: + for path in job.output: + Path(path).parent.mkdir(parents=True, exist_ok=True) + Path(path).touch() + result = toy.snakemake(target, "--allowed-rules", "covariance_ini") + assert result.returncode == 0, result.stdout + text = Path(target).read_text() + line = next( + line for line in text.splitlines() if line.startswith("npair_mm_file") + ) + names = line.split(" = ")[1].split(", ") + assert [name.split("_tomo_bin=")[1] for name in names] == [ + "1-1.txt", + "1-2.txt", + "2-2.txt", + ] + assert "survey_area_lensing_in_deg2 = 7.5" in text + result = toy.snakemake( + "-n", "-F", target, config=['covariance={"shape_noise":"analytic"}'] + ) + assert result.returncode == 0, result.stdout + assert not any( + j.rule.startswith("covariance_pair_counts") + for j in parse_jobs(result.stdout) + ) From daa3a162013eef39d4b30ecf7404a08ebd3f81e8 Mon Sep 17 00:00:00 2001 From: Cail Daley Date: Sun, 1 Nov 2026 05:19:04 +0100 Subject: [PATCH 11/11] Preserve whole-sample array views and guard tomographic HDF5 reads --- src/sp_validation/pair_counts.py | 2 +- src/sp_validation/tests/test_pair_counts.py | 28 ++++++++++++++------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/sp_validation/pair_counts.py b/src/sp_validation/pair_counts.py index 942a04a51..4f84d48e8 100644 --- a/src/sp_validation/pair_counts.py +++ b/src/sp_validation/pair_counts.py @@ -74,7 +74,7 @@ def measure_pair_counts( selected_ids = ids[np.asarray(bin_pair) - 1] selections = [data[tomo_bin_col] == value for value in selected_ids] else: - selections = [np.ones(len(data), dtype=bool)] * 2 + selections = [slice(None)] * 2 auto = bin_pair is None or bin_pair[0] == bin_pair[1] weights = np.asarray(data[w_col], dtype=float) if ( diff --git a/src/sp_validation/tests/test_pair_counts.py b/src/sp_validation/tests/test_pair_counts.py index 48bbf5f95..967762953 100644 --- a/src/sp_validation/tests/test_pair_counts.py +++ b/src/sp_validation/tests/test_pair_counts.py @@ -97,11 +97,14 @@ def record(self, *args, **kwargs): @pytest.mark.parametrize("layout", ["single", "chunked", "joined"]) -def test_hdf5_never_materialises_shapes(tmp_path, monkeypatch, layout): +@pytest.mark.parametrize("tomographic", [False, True]) +def test_hdf5_never_materialises_shapes(tmp_path, monkeypatch, layout, tomographic): cat = tmp_path / "catalogue.fits" # Detection is by content, not extension. - data = np.zeros(4, dtype=[(n, "f8") for n in ("RA", "Dec", "w", "e1", "e2")]) + data = np.zeros(4, dtype=[(n, "f8") for n in ("RA", "Dec", "w", "e1", "e2", "bin")]) data["RA"] = [0.0, 0.01, 0.03, 0.07] data["w"] = [1.0, 2.0, 3.0, 4.0] + data["bin"] = [1, 1, 2, 2] + allowed = {"RA", "Dec", "w"} | ({"bin"} if tomographic else set()) with h5py.File(cat, "w") as f: if layout == "single": f.create_dataset("data", data=data) @@ -111,7 +114,7 @@ def test_hdf5_never_materialises_shapes(tmp_path, monkeypatch, layout): group.create_dataset("0002", data=data[2:]) f.attrs["n_tiles"] = 2 else: - f.create_dataset("data", data=data[["RA", "Dec", "e1", "e2"]]) + f.create_dataset("data", data=data[["RA", "Dec", "e1", "e2", "bin"]]) f.create_dataset("data_ext", data=data[["w"]]) original = h5py.Dataset.__getitem__ reads = [] @@ -123,20 +126,27 @@ def only_pair_fields(dataset, key, *args, **kwargs): # h5py field access recurses with a projected new_dtype and key (). projected = kwargs.get("new_dtype") if projected is not None: - assert set(projected.names) <= {"RA", "Dec", "w"} + assert set(projected.names) <= allowed return original(dataset, key, *args, **kwargs) # Unprojected whole-dataset or shape-field reads remain forbidden. - assert isinstance(key, str) and key in ("RA", "Dec", "w"), key + assert isinstance(key, str) and key in allowed, key reads.append(key) return original(dataset, key, *args, **kwargs) monkeypatch.setattr(h5py.Dataset, "__getitem__", only_pair_fields) out = tmp_path / "pairs.npz" - measure_pair_counts(cat, out, min_sep=0.1, max_sep=10.0, nbins=1) - assert set(reads) == {"RA", "Dec", "w"} + measure_pair_counts( + cat, + out, + min_sep=0.1, + max_sep=10.0, + nbins=1, + **({"tomo_bin_col": "bin", "bin_pair": (1, 2)} if tomographic else {}), + ) + assert set(reads) == allowed with np.load(out) as z: - np.testing.assert_allclose(z["weight"], 35.0) - np.testing.assert_allclose(z["weight_squared"], 273.0) + np.testing.assert_allclose(z["weight"], 21.0 if tomographic else 35.0) + np.testing.assert_allclose(z["weight_squared"], 125.0 if tomographic else 273.0) @pytest.mark.parametrize(