The v25 delivery carries four metal bands, Z = −2, −1, 0, +1 dex about the standard sdB pattern, and every fit in the archive uses Z0. These are the highest signal-to-noise sdOB and He-sdOB spectra in the BOSS archive, fitted on each band, and then fitted again with metallicity as the third free parameter in place of helium.
All four parameters free → — Teff, log g, helium and Z fitted together, and which of them Z is really degenerate with.
| class | n | ΔTeff [K] | Δlog g | Δlog n(He)/n(H) |
|---|---|---|---|---|
| He-sdOB | 6 | +866 | +0.360 | +0.275 |
| sdOB | 6 | +1276 | +0.062 | +0.014 |
Median of Z = +1 minus Z = −1.
Median over the stars of how far apart the four bands' best fits get on each line, in per cent of the continuum. Each band sits at its own fitted parameters, so this is the disagreement that survives every band doing its best — the part the fit cannot absorb.
| line | He-sdOB | sdOB |
|---|---|---|
| He II 4686 | 1.9 | 9.3 |
| Hβ | 3.3 | 2.9 |
| Hγ | 2.5 | 3.3 |
| He II 5412 | 2.7 | — |
| Hδ | 2.3 | 2.8 |
| Hε | 3.2 | 1.6 |
| He I 4922 | 1.3 | 2.7 |
| He II 4542 | 1.7 | — |
| Hη | 1.8 | 1.1 |
| He I 4472 | 1.4 | 1.1 |
| Hθ | 2.0 | 1.1 |
| Hζ | 1.2 | 0.9 |
| He I 4713 | 1.1 | — |
| He I 4026 | 0.7 | 1.2 |
| He II 4200 | 0.8 | — |
| He I 5876 | 0.7 | — |
| Hι | 0.2 | 0.6 |
| He I 5016 | 0.4 | — |
| star | class | S/N | band | Teff | log g | log n(He)/n(H) | reduced χ² |
|---|---|---|---|---|---|---|---|
| J00511+0042 | sdOB | 68.2 | Z-1 | 36939 | 6.042 | -1.13 | 2.11 |
| Z0 | 37557 | 6.070 | -1.13 | 1.69 | |||
| Z1 | 38929 | 6.150 | -1.11 | 1.30 | |||
| J07284+4149 | He-sdOB | 72.8 | Z-1 | 39051 | 5.743 | -0.13 | 1.98 |
| Z0 | 39035 | 5.816 | -0.14 | 1.77 | |||
| Z1 | 39009 | 6.002 | -0.15 | 2.02 | |||
| J07403+2049 | sdOB | 79.1 | Z-1 | 34020 | 5.853 | -1.60 | 2.21 |
| Z0 | 34147 | 5.862 | -1.60 | 1.90 | |||
| Z1 | 34979 | 5.903 | -1.59 | 1.72 | |||
| J07462+3333 | He-sdOB | 68.2 | Z-1 | 47750 | 5.948 | +0.38 | 3.11 |
| Z0 | 48002 | 6.065 | +0.43 | 3.06 | |||
| Z1 | 48703 | 6.309 | +0.59 | 3.24 | |||
| J08251-6314 | sdOB | 81.9 | Z-1 | 32762 | 6.008 | -1.65 | 3.71 |
| Z0 | 32813 | 6.049 | -1.64 | 3.67 | |||
| Z1 | 34077 | 6.083 | -1.60 | 3.71 | |||
| J08590+0233 | sdOB | 74.4 | Z-1 | 33641 | 5.925 | -1.84 | 1.53 |
| Z0 | 33744 | 5.937 | -1.82 | 1.40 | |||
| Z1 | 34879 | 5.965 | -1.79 | 1.38 | |||
| J12533+3006 | sdOB | 71.0 | Z-1 | 33636 | 5.824 | -2.15 | 1.08 |
| Z0 | 33794 | 5.827 | -2.13 | 1.05 | |||
| Z1 | 35176 | 5.851 | -2.16 | 1.24 | |||
| J16387+6728 | He-sdOB | 74.5 | Z-1 | 45815 | 5.804 | +0.66 | 3.30 |
| Z0 | 46137 | 5.927 | +0.74 | 3.05 | |||
| Z1 | 46894 | 6.164 | +0.98 | 2.82 | |||
| J17083+3001 | sdOB | 77.3 | Z-1 | 36487 | 6.118 | -1.64 | 1.48 |
| Z0 | 36819 | 6.144 | -1.67 | 1.31 | |||
| Z1 | 37597 | 6.218 | -1.78 | 2.33 | |||
| J21133+0017 | He-sdOB | 69.3 | Z-1 | 45450 | 5.799 | +0.47 | 2.09 |
| Z0 | 45933 | 5.933 | +0.55 | 2.04 | |||
| Z1 | 46691 | 6.175 | +0.79 | 2.25 | |||
| J21193+0057 | He-sdOB | 73.7 | Z-1 | 45456 | 5.732 | +0.58 | 2.61 |
| Z0 | 45748 | 5.830 | +0.67 | 2.38 | |||
| Z1 | 46235 | 6.032 | +0.88 | 2.33 | |||
| J22071+1257 | He-sdOB | 80.1 | Z-1 | 54450 | 6.023 | +0.34 | 2.18 |
| Z0 | 53699 | 6.140 | +0.39 | 2.01 | |||
| Z1 | 54051 | 6.417 | +0.60 | 1.96 |
Helium held at exactly the value the ordinary fit found — each band splined along its own helium axis to it, not snapped to the nearest delivered file — and Z free over −2…+1. Three parameters float either way. The comparison is not quite like for like: helium was fixed at a value measured at Z = 0, so the Z run has had four quantities determined from the data where the helium run had three. Settling it needs a four-dimensional grid.
| star | class | Teff He free | Teff Z free | fitted Z | χ² He free | χ² Z free | Δχ² total |
|---|---|---|---|---|---|---|---|
| J00511+0042 | sdOB | 37557 | 38667 | +0.84 | 1.69 | 1.27 | -273 |
| J07284+4149 | He-sdOB | 39035 | 38882 | +0.27 | 1.78 | 1.77 | -8 |
| J07403+2049 | sdOB | 34147 | 34675 | +0.68 | 1.90 | 1.57 | -214 |
| J07462+3333 | He-sdOB | 48002 | 48187 | +0.32 | 3.06 | 3.09 | +25 |
| J08251-6314 | sdOB | 32823 | 33248 | +0.43 | 3.65 | 3.61 | -26 |
| J08590+0233 | sdOB | 33745 | 34340 | +0.62 | 1.40 | 1.29 | -71 |
| J12533+3006 | sdOB | 33794 | 34132 | +0.32 | 1.05 | 1.04 | -7 |
| J16387+6728 | He-sdOB | 46137 | 46809 | +0.82 | 3.05 | 2.83 | -182 |
| J17083+3001 | sdOB | 36819 | 36856 | +0.06 | 1.31 | 1.31 | +0 |
| J21133+0017 | He-sdOB | 45933 | 45926 | -0.02 | 2.04 | 2.03 | -8 |
| J21193+0057 | He-sdOB | 45748 | 46010 | +0.50 | 2.38 | 2.30 | -66 |
| J22071+1257 | He-sdOB | 53699 | 53817 | +0.53 | 2.01 | 1.94 | -57 |
Nothing in the interpolation ever knew that its third axis was helium. It splines over whatever numbers the axis carries, one axis at a time, and hands back that axis's own first derivative along with the value — which is what gives Levenberg–Marquardt an analytic Jacobian for the price of the interpolation it had to do anyway. So a set of models at one helium abundance and several metallicities makes a grid whose third parameter is Z, fitted exactly the way helium is. The one library change was to let GridSet.load take the axis values explicitly rather than reading each file's own helium header.
Three parameters float either way — Teff, log g, and one of helium or Z — so the two reduced chi-squares compare directly. This is not a four-parameter fit: in the Z run helium is held, and it is held at a value that was itself measured at Z = 0. That is the caveat above, stated as machinery: the Z run has had four quantities determined from the data where the helium run had three.
Floating Teff, log g, helium and Z together is the clean test, and the arithmetic for it is written and checked (nd_prototype.py) even though no star has yet been fitted with four free parameters. The derivative chain generalises to a loop: at each axis the value array is splined for its value and the new derivative, while each derivative carried from an earlier axis is splined for its value only — differentiating it again would be a second derivative, which the Jacobian does not want. The stack grows by one per axis, so k axes cost 1+2+…+k spline passes: six now, ten with four.
| check | result |
|---|---|
| all four analytic derivatives against central finite differences | agree to 1.4×10−9 … 1.9×10−7 relative |
| the same routine restricted to three axes, against the shipped interpolation | identical bit for bit — value and all three derivatives |
| memory for a four-axis block over a twelve-line window | 57 MB |
| time to assemble it | 2.3 s cold, 0.54 s warm |
What remains is plumbing rather than numerics — the result object, the output writers, the bounds and the error scaling all count to three — and two decisions that change published numbers: whether Z should be bounded to the delivered range (unlike temperature and gravity, where a fit walking out of the grid is a deliberate diagnostic, a cubic through four points a dex apart is wild outside them), and whether the reduced chi-square should divide by n − len(free) rather than the n − 2 it uses today.