Plan: diagnosing the Fig. 6 (Costanzi et al. 2026) model mismatch¶
Context¶
validate_fig6_digitized.py compares CLensPy’s SelBiasEngine/SigmaPrj
model prediction against Costanzi et al. (2026)’s own model curve
(digitized from Fig. 6, validation/data/costanzi2026_fig6.csv — not a
noisy mock measurement, their theory line). Current result: systematic
overshoot everywhere, richness-dependent —
lam[20,30): +66% to +86% median frac residual;
lam[60,500): +11% to +24% median frac residual.
Sigmoid shape (k=2.5/theta_lambda, theta_0=theta_lambda/2) and
boost_slope=0.13 already confirmed exact matches to the paper. A pure
global units bug is disfavored (residual is not constant across bins),
but a units bug entering through a richness-dependent quantity is not
ruled out.
A. Units / cosmology sanity (cheapest, do first — invalidates everything downstream if wrong)¶
Empirical h-power calibration sweep: multiply the whole
Sigma_prjoutput byh^nforn in {-2,-1,0,1,2}at one reference point, check if any power lands on the digitized curve.Comoving vs physical
R: test whether the digitizedRaxis is comoving Mpc/h (our assumption) or physical Mpc/h – a stray(1+z)would look like this, and is distinguishable since our 3 z-bins span 0.2-0.65.Confirm the exact cosmology (
Omega_m, h, sigma8, ns, P(k) source) used in Costanzi’s own scripts (SelectionBias/make_mock_lob_sigma_ catalog.fitsgeneration + notebooks) againstV.COSMO.validate_sigma_prj_mock.py’s own docstring flags this as an assumption (“Planck 2018… assumed”), not confirmed.Cosmology sensitivity: once (3) is known, if it doesn’t match exactly, perturb
Omega_m/sigma8within the plausible gap and see how much the ratio curve moves.theta units sanity: confirm no stray degrees/radians slip into
sigmoid_theta/area_overlap.R_lambdaconvention cross-check:r_lambda(lam,h)=(lam/100)^0.2/hvs the mock script’s ownR_lambda(lam)=(lam/100)^0.2[pMpc/h]– hand-derived match already, confirm numerically.
B. Config/wiring checks¶
b_effreally uses Tinker HMF + Tinker bias (same objects_operatorsuses, not a stale default).Richness kernel choice:
"y3"(DES Y3/SDSS-injection EMG) vs"self"(mock-consistent) for a synthetic mock/theory comparison.min_massintegration bound (1e12vs1e13) re-checked underbuzzard()– only tested under the old MOR.xi_NL/PkGridsettings: nonlinear halofit vs linear, k-range/ truncation – untouched this whole session, sets the correlated channel amplitude directly.Photo-z window
sigma_z: confirmy3_photoz_window()matches whatever synthetic photo-z scatter Costanzi’s model assumes.
C. Data-driven inversion (strongest diagnostic – model-agnostic)¶
Fit
(B_small, B_large)per panel directly from the digitized curve: invertratio(R)holding our own geometry/xi_NL/HMF fixed, get the implied plateaus, compare to what our closure currently computes.Fit the implied MOR slope
alphafrom (12)’s implied large-R plateau; compare tobuzzard()’salpha=0.859.
D. More¶
Percolation cap (
lambda<lob) convergence re-check underbuzzard().n_theta/n_M/n_zquadrature convergence underbuzzard()(tuned under a different, flatter MOR).lob_repbias check: does the forward-model representative differ systematically between the narrow[20,30)bin and the wide, open[60,500)bin in a way that fakes a richness-dependent residual?
Order of attack¶
A (1-6) first – a units/cosmology bug invalidates every downstream check. Then C (12-13) – most direct, model-agnostic read on where the gap actually is. B and D as needed based on what A/C find.