Colour × Mag Residual Grid

Colour × magnitude residuals across the CCD

Faint-star-trained ePSFs (faintonly_20260925) evaluated on the fixed C5 scene. Outer 3×3 = CCD cells (y up). Inside each cell: rows = Tmag 8–10 / 10–12 / 12–13, columns = BP‑RP <0.75 / 0.75–1.25 / >1.25. Each stamp is the 5σ-clipped mean of residual/flux (1e‑4 per px²); its title gives n and cxx/cyy (1e‑3 px², negative = data sharper than the model).

Final run (run5): pooled over the 5 cross-fit folds, 2026-10-14

The paper pipeline's last run (run5: run4 + PS1 template calibration), folds_final, all five fields. Each fold's ePSF is trained on 4/5 of the stars; the grids pool all 5 folds. Held-out: every star once, rendered by the model that did not train on it. In-fold: training stars, each 4×. All: every star under all 5 fold models (1 held-out + 4 in-fold). Same layout and colour scale rule as the tabs below.

run5 pooled residual grid

Pooling: /astro/armin/koji/syndiff/dev_runs/group_meeting_slides_20261013/run5_pooled/pool.py (concatenates e2e_final_recipe_20261007/run5/<F>/folds_final/eval/fold<k>[/insample/{infold,all}]/raster_res_model.npz), grids by residual_grid.py. Held-out stars: F1 10536, F2 8766, S22 8491, C1 8224, C4 13528.

G1 held-out harness: out-of-fold grids, 2026-09-29

Paper 1 gate G1. The CCD is split into 2 folds of 128-px tiles. Each fold fit starts from a leak-free init (another sector's A3 fit for the same CCD; for F1 that is S25 C2K2) and uses the decided recipe: A3 + live moment-blind prior, 300/3000/2000 steps. Every star is then rendered by the fit that never trained on it. Tabs ho_F1_*: full_xsec = all-star fit, in-sample (the provisional Paper 1 calibration); oof_xsec / oof_smooth = out of fold, from two different inits. Record: dev_runs/heldout_harness_20260929/README.md.

Held-out vs in-fold core chi2 during training, moment-blind vs plain prior
F1: median core χ² relative to the init vs ePSF training step. Solid = held-out, dashed = in-fold. Blue: 2-fold, moment-blind. Orange: 2-fold, plain prior. Green: the all-star fit (in-sample).

Colour model v2, stage 2b and decision, 2026-09-29

Five hp_d frames, approved by the user: S24 C1K2 (cam1), S23 C2K1 (cam2), S26 C3K1 (cam3), S23 C4K2 (cam4, still running), and S25 C2K2, which is F1's CCD one sector later. Each is B14 → A3. Tabs s0023*/s0024*/s0025*/s0026*. Proposed model: A3, in dev/forward_epsf_wcs/docs/COLOUR_MODEL_V2_DECISION_20260929.md. It awaits approval.

S23 C4K2 (cam4), added after the write-up. The width is fixed: r−t χ²/n 41 → 9.9, 45° 8.3 → 2.1, and the q2 planes repeat S20 C4K2. But the red end overshoots, from +5.6 to −4.6 mpx over all stars, while beyond 1800 px it is still +3.8. This field also has the only photometric colour-slope regression, −0.23 %/mag. It is limit 6 in the decision doc.

S23 C4K2 B14 vs A3 scorecard comparison
S23 C4K2: B14 vs A3. Left, the reddest bin overshoots to −4.6 mpx over all stars. Second panel, beyond 1800 px it still sits at +3.8.
S25 C2K2 A3 red minus blue width per region
S25 C2K2 (camera 2 / CCD 2, sector 25) after A3. Compare F1's A7 map in the stage-1 section below: the radial−tangential band and the 45° bottom row are the same, one sector apart.

Colour model v2, stage 2 (four more CCDs), 2026-09-29

Repeatability test of the two stage-1 models on raw FFIs S20 C3K3 (cam3; same frame as F2), S20 C4K2 (cam4) and S20 C2K1 (cam2), plus the hp_d lane S22 C3K3 (cam3). For each lane: B14 (#14 trained from the lane's stage-2 fit), then A3 (u + quad + planes) and A6 (u + quad + axis astigmatism), each warm-started from B14 for 1500 steps. Tabs s00*_B14/A3/A6. Record: dev_runs/chroma_v2_20260928/README.md.

S20 C3K3 raw scorecard comparison, B14 vs A3 vs A6
S20 C3K3 raw: radial shift vs colour, red−mid rms and region width χ²/n for B14, A3 and A6.
S20 C2K1 A3 red minus blue width per region
S20 C2K1 raw (cam2) after A3. The radial−tangential leftover sits at mid-distance from the axis, which for CCD1 is off the top-right corner: −2.6, −2.1 and −4.3e-3 px². Round width shows the uniform red-broader offset.

Colour model v2, stage 1, 2026-09-28

Eight arms warm-started from #14 (sffi_rawgauge_20260924 F*_D1_raw_dilR), each run for 1500 steps with the new colour terms starting at 0. The code is dev branch chroma-v2 f5e3605. Scoring uses S4's scorecard on the fixed C5 star sets. Tabs F*_A0…A7. Record: dev_runs/chroma_v2_20260928/README.md.

F1 scorecard comparison of #14 and arms A0-A5
F1 (S24 C2K2): residual radial shift vs BP-RP (all stars, and r > 1800 px), red−mid stack rms, and red−blue width χ²/n per 3×3 region, for #14 and A0–A5. The shaded band is the ±2 mpx target.
F2 scorecard comparison of #14 and arms A0-A5
F2 (S20 C3K3): the same panels. u colour (A3, A5) brings the red end inside ±2 mpx.
F1 A7 red minus blue width per CCD region
F1 A7 (u + quad + planes + axis astigmatism): red−blue width per region. The radial−tangential band, −12e-3 px² at mid-distance from the axis (the axis is off the top-left corner), is unchanged from A5.

Held-out memorisation control, 2026-09-28

C5 recipe retrained on split30 (30% of T8–13 stars held out, C5 warm start). Tabs cl_F*_C5s_warm. Record: dev_runs/epsf_width_decision_20260928/README.md.

Prior fix + optimizer schedule: held-out sweep, 2026-09-25 evening

Faint training (isolated T10–13 trainees, 30% held out; scenes faint10split), 46 arms × F1/F2, all eval on the fixed C5 scene. Scored on the isolated held-out faint stars and on the crowded never-trained T10–13 stars. Code: worktree finenbr-orth. Record: dev_runs/finenbr_axis_20260925/README.md. Tabs sw_* below.

Held-out chi2 vs axis width residual for every sweep arm
Every arm: held-out median core χ² relative to plain 1e8 vs the axis-cell width residual. Left: isolated held-out; right: crowded never-trained. Top F1, bottom F2.
Width maps for key arms
Per-cell width residual (held-out + crowd blue/mid T10–13, ≥ 200 px from the CCD edge) for plain 3e7/1e8/3e8 and moment-blind 3e8 with and without the width/shift prior. ★ = optical axis.

Quadratic-in-colour radial shift, 2026-09-25

New colour-model extras sq0,sq1 (worktree colour-quad, commit 599e12c): shift = [Δc·s(r) + (Δc² − ⟨Δc²⟩)·(sq0 + sq1·r)]·n̂, toward the optical axis. Both arms continue C5 for 1500 steps with C5's colour coefficients kept. Tabs F*_ctrl and F*_quad below. Record: dev_runs/colourquad_20260925/README.md.

Residual radial shift vs BP-RP for C5, control and quadratic
Residual radial shift vs BP-RP (stacks rotated into the radial frame), all stars and beyond 1800 px from the axis, plus the stacked residual rms inside 2 px.
Red-minus-mid residual decomposition
Red (BP-RP ≥ 1.5) minus mid (0.8–1.2) stack in the radial frame: data, fit (shift + round width + quadrupole + coma), leftover, energy explained per nested basis, coefficients, radial cut.

Option A tested: moment-blind fine prior, 2026-09-25

--fine-nbr-mode moment_blind (dev worktree finenbr-orth): before squaring each adjacent-node difference of the fine parts, project out the pair-mean flux and both nodes' own shift and width generators. Same recipe as faint10/faint11 (1500 steps from C5), λ = 1e8 and 3e8, eval on the fixed C5 scene. Tabs eval_F*_faint1*mb* below.

Per-cell width residual, trained vs held-out, plain vs off vs moment-blind prior
(cxx+cyy)/2 of blue+mid T10–13 stars per CCD cell, fixed C5 star set, split trained / held-out; ★ = optical axis. Columns: plain prior, off (nbr0), moment-blind 1e8, 3e8. ± = bootstrap over stars. Data: /astro/armin/koji/syndiff/dev_runs/finenbr_axis_20260925/

Fixing the corner: diagnosis and options, 2026-09-25

Two effects, measured on the faint10 fits (no retraining):

Node width maps, junk spectrum and prior penalty share
Left: node ePSF width relative to the CCD mean (C5, faint10 prior on and off). Middle: spectrum of what the prior removes vs a pure width change, with the fine-split cutoffs. Right: share of the prior penalty that falls on shift/width terms, per split σ.
Fine width map, node-phase fold and radial profile
Left: width residual on a 10×10 grid with nodes (+). Middle: residual vs distance to the nearest node near the axis (scallop = interpolation error). Right: residual vs distance from the optical axis.
OptionFixesAssessment
A. Moment-blind fine prior: project flux/shift/width terms out of each node-pair differencedragBest-targeted; keeps penalising the junk at all frequencies
B. Narrower fine split (σ = 1 or 0.5 samples)drag, partlyCheap comparison arm; also frees the junk below about 1 cycle/px
C. Penalise curvature across nodes instead of differenceslinear trends onlyNot alone: the width field curves near the axis
D1. Axis-warped node spacing (still 6×6, denser near the axis)interpolationLow priority after the edge-corrected scallop (about 0.7 on F1)
D2. Bicubic (Catmull-Rom) blend over the same nodesinterpolationModerate renderer change
D3. Explicit radial width/shape field about the optical axis, colour-independent (like the colour-model dilation d0+d1r)bothPhysically motivated (focus vs field angle); needs a gauge against the nodes
E. Learning-rate decay polish on every armoptimiser floorControl: corner nodes converge slowest
F. Retune λ after A (held-out sweep)junkA may allow a stronger λ at no width cost

Validation. Synthetic first: inject a known sharpening near the axis into the retrain-from-truth scene, which gives a known answer. Then on real data, judge by the width map, radial profile, node-phase scallop, held-out χ² and flux bias vs magnitude and colour.

Axis-corner bullseye = fine-neighbour prior, 2026-09-25

In the cell nearest the optical axis, blue and mid-colour stars of every magnitude are sharper than the ePSF. That is why the pattern vanishes after subtracting the cell's all-star stack: it is a position effect shared by everyone there.

Per-cell width residual map, prior on vs off
(cxx+cyy)/2 of blue+mid T10–13 stars per CCD cell on the fixed C5 star set; ★ = optical axis; nbr0 = prior off.

Faint-only training, 2026-09-25

Residual grids

One tab per training run, newest last. Each new training run is added here.

Residual grid

Where it lives

Scriptdev/forward_epsf_wcs/diagnostics/residual_grid.py RUN_DIR LABEL
Every runcalled at the end of dev_runs/magwidth_20260924/width_analysis.py, so each an/ dir gets resgrid_*.png, _rel.png, .json
Add a runpython dev/forward_epsf_wcs/diagnostics/resgrid_publish.py <an dir> <label> "<description>", then republish this page
These figures/astro/armin/koji/syndiff/dev_runs/faintonly_20260925/resgrid/