Changelog

This project does not yet follow a formal release schedule. Key additions are listed below in reverse chronological order. Commit history on GitHub is the authoritative source.

1.1.6 — 2026-06-23

Bug fixes — Izotov+2006 ionisation correction factors

  • Corrected the neon, sulfur, argon and nitrogen ICFs (jwspecabund.icf). The four Izotov+2006 ICFs had been implemented as invented polynomials in the O⁺ fraction that dropped the dominant c/f term of the true a·f + b + c/f form (eqs. 18–22), returning ICF ≈ 0.3–1.0 where the correct value is ≈ 1.0–1.5. They are now the proper metallicity-dependent Izotov forms (three branches in 12+log(O/H), verified against PyNeb), return the elemental ICF (X/H = ICF·ion/H⁺), and the abundance ratios divide by the total oxygen abundance. Effect on reported ratios: Ne/O ~+0.45 dex (a spuriously low log(Ne/O) ≈ −1.2 is corrected to ≈ −0.8, consistent with the α-element locus), S/O ~+0.17 dex, Ar/O ~+0.10 dex. N/O via the Izotov tier changes by < 0.04 dex; the default Martinez+2025 / ICF-5 nitrogen path is unaffected. Carbon (Garnett+1997) was already correct. Regression tests added for all four.

1.1.5 — 2026-06-22

Direct-Te abundances: three-zone temperature & density framework

  • New default Te_relation="3_tier" (jwspecabund). The direct-Te method now resolves three ionisation zones with Garnett (1992) Te–Te relations throughout (following Martinez+2025, “Under Pressure”, arXiv:2510.21960): Te_int = 0.83·Te_high + 1700 and Te_low = 0.70·Te_high + 3000, with Te_high measured from [O III] λ4363 (or λ1666). Ions are assigned to zones by ionisation potential — O²⁺/Ne²⁺/N³⁺/C³⁺ to the high zone, N²⁺/C²⁺/S²⁺/Ar²⁺ to the intermediate zone, and O⁺/N⁺/S⁺ to the low zone. AbundanceResult gains Te_mid, Te_mid_err, and ne_Opp.

  • [Ar IV] λλ4711,4740 as the preferred O²⁺-zone density, with the λ4711 / He I λ4714 blend deblended via the He I λ4472 anchor and a PyNEB He I emissivity ratio (compute_ne_ArIV, heI_4714_over_4472); C III] is the fallback.

  • [Si III] λλ1883,1892 added as a UV low-ion density fallback for the O⁺/N⁺ zone (compute_ne_SiIII), for UV-only high-z stacks where the optical [S II]/[O II] doublets are unavailable.

  • Redshift-dependent density fallbacks when a doublet is missing or its solve fails (ne_zone_fallback): ne_low = 54·(1+z)^1.2 (Abdurro’uf+2024), and ne_mid = 1110·(1+z)^1.93, ne_high = 5400·(1+z)^1.62 (Martinez+2025 Eqs 4/5). Densities are solved at a 1.5×10⁴ K fiducial and refined once at the zone temperature.

  • New z_ne parameter on compute_abundances decouples the redshift used for density fallbacks from the geometric redshift (e.g. rest-frame z=0 stacks of a physically high-z sample).

Bug fixes

  • Intermediate-zone ions (C²⁺/N²⁺/S²⁺/Ar²⁺) now fall back to the O²⁺-zone density ne_Opp (carrying the z-dependent intermediate fallback) rather than the low-zone density when the C III] solve fails.

  • ne(low)/ne(high) diagnostic labels are now truthful after a z-fallback, and the Te(high) diagnostic reports the actual auroral line used (λ4363 vs λ1666).

1.1.4 — 2026-06-07

Bug fixes

  • Corrected air/vacuum wavelengths for 12 optical lines in REST_LINES_A. A subset of lines (Hδ, Hγ, Hβ, Hα, [O III] λλ4959,5007, [N II] λλ5756,6549,6585, He I λ5877, [S II] λλ6718,6732) had the air→vacuum transform applied twice — once to values that were already in vacuum — inflating them by the refractive index of air (n ≈ 1.000279, ≈ +1.4 Å at 5000 Å, a +84 km/s offset). They now hold the correct vacuum wavelengths. The inconsistency (some lines, e.g. [O III] λ4363, were already correct) could bias fitted redshifts and line positions at grating/high resolution. A regression test (tests/test_line_wavelengths.py) now pins these against literature vacuum values.

Line database additions

  • Seven UV interstellar absorption lines added to REST_LINES_A (vacuum, Morton 2003): the O I λ1302 + Si II λ1304 blend (abs_OISiII1303, single feature), Si II λ1526 (abs_SiII1526), Fe II λ1608 (abs_FeII1608), the Al III λλ1854,1862 doublet (abs_AlIII1854, abs_AlIII1862), and the C IV λλ1548,1550 doublet (abs_CIV1548, abs_CIV1550). All but the C IV pair are included in the default prism and grating line lists. abs_CIV1548/1550 are in the database but not the default lists, because they coincide exactly with the CIV_1/CIV_2 emission components — fit them explicitly via lines=[...] when C IV is in absorption / P-Cygni.

Behaviour changes

  • Multi-Balmer A_V now uses only lines bluer than the anchor. balmer_anchor="HBETA" (default) uses Hγ/Hβ, Hδ/Hβ, H9/Hβ, H10/Hβ and excludes Hα/Hβ; balmer_anchor="Ha" uses every other Balmer line (all are bluer than Hα). Previously the Hβ anchor also included Hα/Hβ. Anchor on Hα to include Hα; on Hβ to use only the bluer Balmer series.

New

  • balmer_pair option in compute_abundances (and the public compute_Av_balmer_pair). Forces the A_V derivation onto a single Balmer decrement, e.g. balmer_pair=("Ha", "HBETA") for Hα/Hβ only, instead of the multi-line fit — useful to avoid low-SNR Balmer lines. Overrides balmer_anchor/snr_balmer for the A_V step; ignored when Av is supplied directly.

1.1.3 — 2026-06-01

Behaviour changes

  • O²⁺ and Ne²⁺ are decoupled from the N IV] density. T_e([O III]) and the O²⁺/H⁺ and Ne²⁺/H⁺ abundances are now evaluated at the intermediate-ionisation density (C III] λ1907/1909, with a low-zone fallback) instead of the high-ionisation N IV] density. The [O III] 5007/Hβ and [Ne III] 3869/Hβ abundances are density-insensitive below ~10⁴–10⁵ cm⁻³, and C III] (24–48 eV) overlaps the O²⁺ zone (35–55 eV), whereas N IV] (47–77 eV) traces more highly-ionised gas and can spuriously spike — dragging T_e down and inflating O/H. N³⁺ and C³⁺ keep the high-ionisation density, so the Martinez+25 ICF 5 ((N²⁺+N³⁺)/O²⁺) still uses the correct density for each nitrogen ion.

  • log(U) from O32 / N43 now takes an electron-density input. The Martinez+25 O32 and N43 log(U) diagnostics are evaluated at the measured density rather than a fixed default.

Documentation

  • New Plotting & visualisation section consolidating all static (matplotlib) and interactive (plotly) plotting helpers across the suite, with a backend-choice guide and line-marker reference.

Fixes

  • DLAResult.plot() no longer emits a tight_layout warning on the two-panel (data + residual) figure (now uses constrained layout).

1.1.2 — 2026-05-29

Behaviour changes

  • Martinez+2025 ICF/log(U) bounds are now enforced by rejection, not extrapolation. Inputs outside the calibration domain (log(O32), log(N43), Z/Z_sun, or the resulting log(U)) are set to NaN instead of being extrapolated or clipped to the boundary, so uncalibrated values no longer enter the reported N/O.

  • Direct-T_e MC and MCMC loops resample to the requested count. The loop keeps drawing until n_mc / n_posterior in-bounds N/O draws are collected (capped at 20× attempts; a WARNING is logged and N/O is left under-sampled if an object is centred outside the bounds).

  • O/H is decoupled from the N/O bounds. Only N/O is gated on the Martinez calibration; O/H, T_e, and the C/O, S/O, Ne/O, Ar/O ratios (which do not use the Martinez ICF) are recorded for every drawn sample. As a result the O/H posterior generally holds more finite draws than the N/O posterior — the two arrays are independent and need not share a length. See abundance_methodology §8.2 and §11.3.

1.1.0 — 2026-05-20

New public API

  • jwspecfit.fit_redshift — strong-line redshift fitter spanning z = 0–20, with auto-detected spectral resolution (spec.Rgrating → pixel-spacing fallback).

  • jwspecfit.show_lines() — discovery helper for the line database; plot_spectrum_interactive and plot_2d_1d accept add_lines=[…] for ad-hoc marker additions.

  • jwspecfit.plot_2d_1d — matplotlib panel showing the 2D SCI image and 1D extraction for a single FITS file, auto-scaled to the brightest emission line in view.

  • jwspecmcmc.fit_with_broad + jwspecfit.fit_hei_broad — two-tier BIC selection for HeI broad components (analogous to the Balmer pipeline).

Behaviour changes

  • Broad-component control moved from mode="…" to dedicated boolean kwargs fit_balmer_broad= and fit_oiii_broad=; both default to False. Two-tier BIC selects between off / single broad / double broad / both, with kinematics tied across [O III] doublet components.

  • fit_redshift excludes [N II] and [S II] from the default line list (avoids false matches in low-metallicity high-z spectra).

  • Resolution-aware centroid bounds: σ-instrument-scaled limits on narrow-line centroid drift to prevent collapse into a neighbouring line.

  • plot_spectrum_interactive overhaul — emission-line markers, staggered labels, step error band, multi-spectrum legend, custom add_lines=[…], configurable y-range.

Line database additions

  • He II 4200 (Pickering 11→4, vacuum 4201.013 Å)

  • He I: 4027, 4145, 6680, 7065 (vacuum-converted from NIST air values)

  • [O I] 6302

  • [Ar III] 7138

jwspecabund additions

  • balmer_anchor option on compute_abundances and compute_Av_multi_balmer — A_V can be derived with Hα as the anchor (using Hβ/Hα, Hγ/Hα, Hδ/Hα, H9/Hα, H10/Hα) instead of the default Hβ anchor.

  • ciii_doublet_ratio to fix the C III] ratio from a user-supplied density.

  • niv_doublet_ratio to fix the N IV] ratio from the C III] density.

  • Cardelli extinction curve extended to the far-UV; DLA fitter overhaul.

  • snr_balmer parameter for the Balmer-line SNR floor used in A_V derivation.

Fixes

  • Centroid-bounds collapse for [O III] broad components in the MCMC engine (mirrored from the LS fitter).

  • HEI_7067 marker label corrected to air-convention “HeI 7065” (vacuum wavelength 7067.138 Å unchanged).

  • Hard IGM cutoff blueward of Lyα (Gunn–Peterson trough), smoothed by the LSF convolution.

Docs / branding

  • Adopted a hex + Gaussian logo; wired into RTD sidebar (html_logo), browser favicon (html_favicon), and README header. SVG source + PNG fallbacks (16/32/64/128/256 px) under docs/_static/logos/.

  • New notebook walkthrough for jwspecfit.fit_redshift.

1.0.2 — 2026-05-14

Maintenance release; see commit history for details.

1.0.1 — 2026-04-21

Patch release to retry Zenodo DOI minting. The v1.0.0 deposit failed validation because CITATION.cff contained a placeholder ORCID; the ORCID field has been removed and the citation metadata cleaned up. No functional code changes.

1.0.0 — initial public development release

  • jwspecfit — resolution-aware least-squares fitting with bootstrap uncertainties and BIC broad-Balmer selection.

  • jwspecmcmc — NUTS / emcee / nautilus MCMC fitting.

  • jwspecabund — direct-T_e, forward-model, and strong-line abundance pathways.