Skip to content

Halo clustering — xi_hh, xi_hh_smallr, r_ab

xi_hh — full-scale halo–halo correlation (derived)

ξ_hh(r | M₁, M₂) for differential mass-bin pairs, over the full xi_mm support. A derived property combining xi_mm, b_cum, xi_hh_smallr, and r_ab.

import numpy as np
res = reg.predict("xi_hh", "LCDM", 0.25, [0.31, 0.677, 0.967, 0.83])   # default 0.1-dex bins
res = reg.predict("xi_hh", "LCDM", 0.25, theta,
                  edges=np.array([13.0, 13.3, 13.6]),   # your bin edges (log10M)
                  r=np.geomspace(3, 90, 40),            # custom radii (optional)
                  route="auto")                         # auto | exact | bbar

res["xi_hh"]      # (Nbin, Nbin, Nr)
res["r"]          # radii (Mpc/h)
res["bin_edges"]  # the mass-bin edges used
res["b_bin"]      # per-bin <b>
res["validity"]   # per-gravity acceptance-test evidence — READ IT

Routes

  • exact (default via auto) — exact count-weighted mixed-difference, validated over r ∈ [2.2, 100] Mpc/h. Small-r pairs have NaN inside the halo-exclusion wedge — that is physics, not a bug.
  • bbar — pure factorization ⟨b⟩⟨b⟩ξ_mm, only good for r ∈ [20, 70] Mpc/h.

Limits

  • Bin edges above log₁₀M = 14 use the Tinker-extended b with D = 1.
  • Requested r outside the xi_mm support [2.04, 124.8] Mpc/h raises.

Accuracy (binned radial convention, 2026-07): full-scale ξ_hh design-sweep band medians 1.1–2.1 % to 60 Mpc/h (ΛCDM) and 1.1–2.2 % (f(R)), with median |χ| ≤ 1.0 in every band — at the five-box measurement floor; noise-floor-limited beyond. Pass r_edges= to predict("xi_hh", ...) for binned values comparable to pair-count measurements (point values at arithmetic bin centres carry a coherent 1–2 % small-r offset against binned data — a binning inconsistency, not an emulator error). The f(R) fiducials are calibration points of this chain (χ_rms 4.3/3.8 vs their 100-box SEM, floors 1.2/2.7); see the DOCUMENTATION §8b campaign notes.

xi_hh_smallr — small-r departure emulator (trained)

The trained threshold-level small-scale departure surface (the "D-surface") that xi_hh uses below the factorization window. The f(R) emulator carries a coefficient-scale-relative GP jitter floor (jitter_floor_frac = 0.05) that regularises under-fit high PCA modes — small-r ξ_hh reconstruction bands ≈ 6 % better. Not usually called directly.

Target choice (tested — don't re-explore)

The emulated target is D = ξ_AB / [b(>M₁) b(>M₂) ξ_mm] — the departure with the clustering amplitude divided out once. A 2026-07 target-choice study (smallr_reduced_target_test.py, smallr_sqrtd_gate.slurm) confirmed this is optimal:

  • Dividing out more bias (D/(b·b), (D−1)/(b·b)) is 43 %–2.3× worse — it re-injects the mass/cosmology dynamic range D was built to remove.
  • Compressing the surface (log D, √D, √(ξ_hh/ξ_mm)) lowers the D-surface column error (√D by ~5 % for f(R)) but the gain washes out in the composed binned ξ_hh — the end-to-end reconstruction gate is unchanged within noise, because the departure is a subdominant term in the total error budget (ξ_mm, HMF, mixed-difference, sim noise dominate). Not adopted.

Lesson: the composed reconstruction bands decide, not the D-surface metrics.

r_ab — halo–matter cross-correlation coefficient (trained)

rab = reg.predict("r_ab", "LCDM", 0.25, [0.31, 0.677, 0.967, 0.83])   # (1, 30, 30)
art = reg.load("r_ab", "LCDM", 0.25)
art.thresholds   # both matrix axes (log10M thresholds)
  • Output: (1, 30, 30) threshold-pair matrix on the b_cum grid.
  • Used as a stochasticity / validity guard for b_diff and xi_hh.

Redshift

All three registered at z = 0.25 only.