{
  "schema_version": "1",
  "spectrokernel_version": "0.8.1",
  "site_url": "https://docs.spectrokernel.io/",
  "docs_url": "https://docs.spectrokernel.io/validation/catalogue/",
  "registry": "tests/reference/cases.py",
  "count": 21,
  "summary": {
    "pass": 19,
    "fail": 0,
    "skipped": 2,
    "error": 0
  },
  "families": {
    "literature": "Literature values on synthetic inputs",
    "real_data": "Real data: CALSPEC spectrophotometric standards"
  },
  "cases": [
    {
      "id": "morton2000_halpha_air_to_vacuum",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "air_to_vacuum",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/correction/air_to_vacuum/",
      "dataset": "synthetic: one sample at 6562.79 Å (standard air)",
      "quantity": "λ_vac(Hα) [Å]",
      "published": 6564.603,
      "source": "Morton 2000, ApJS 130, 403 (air/vacuum dispersion n(λ)) ; air → vacuum with the VALD3 closed-form inverse ; Hα 6562.79 Å air = 6564.603 Å vacuum (NIST ASD)",
      "measured": 6564.602977311409,
      "deviation": -2.2688591343467124e-05,
      "tolerance": {
        "value": 0.0015,
        "kind": "abs",
        "text": "±0.0015 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "the VALD3 inverse reproduces Morton's relation to ~1e-4 Å ; 1.5e-3 Å is the rounding of the published vacuum value"
    },
    {
      "id": "stoehr2008_der_snr_flat_continuum",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "snr_der",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/quality/snr_der/",
      "dataset": "synthetic: flat continuum 50 with N(0, 1) noise, 3000 samples, seed 0",
      "quantity": "DER_SNR [-]",
      "published": 50.0,
      "source": "Stoehr et al. 2008, ASP Conf. Ser. 394, 505 — DER_SNR : SNR = median(F) / (1.482602/√6 · median|2F_i − F_{i−2} − F_{i+2}|), unbiased for Gaussian noise ; the synthetic is built with S/N = 50",
      "measured": 50.01247722249322,
      "deviation": 0.012477222493217255,
      "tolerance": {
        "value": 0.05,
        "kind": "rel",
        "text": "±0.05 relative"
      },
      "status": "pass",
      "detail": "",
      "note": "median statistics over 3000 samples scatter by ~2 % from realisation to realisation ; 5 % is 2–3 σ of that scatter"
    },
    {
      "id": "olivero1977_voigt_fwhm",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "fit_voigt_line",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/line_fitting/fit_voigt_line/",
      "dataset": "synthetic: Voigt profile σ = 2.0 Å, γ = 1.5 Å, amplitude 40 on continuum 100",
      "quantity": "Voigt FWHM [Å]",
      "published": 6.516,
      "source": "Olivero & Longbothum 1977, JQSRT 17, 233 — FWHM ≈ 0.5346 f_L + √(0.2166 f_L² + f_G²) with f_G = 2√(2 ln 2) σ = 4.7096 Å, f_L = 2γ = 3.0 Å ⇒ 6.5160 Å",
      "measured": 6.516040810253223,
      "deviation": 4.081025322300036e-05,
      "tolerance": {
        "value": 0.001,
        "kind": "rel",
        "text": "±0.001 relative"
      },
      "status": "pass",
      "detail": "",
      "note": "σ and γ are recovered to 1e-3 on a noise-free line ; the approximation itself is accurate to 0.02 % (the numerical FWHM of the true profile is 6.515 Å)"
    },
    {
      "id": "bouchy2001_rv_precision_gaussian_line",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "rv_precision_bouchy",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/radial_velocity/rv_precision_bouchy/",
      "dataset": "synthetic: Gaussian absorption λ₀ = 5050 Å, depth 500 on 1000, s = 0.5 Å, Δλ = 0.01 Å, σ_F = 10",
      "quantity": "δV_rms [m/s]",
      "published": 89.18,
      "source": "Bouchy, Pepe & Queloz 2001, A&A 374, 733, Eq. 6 (δV_rms = c / √ΣW) with Eq. 8 weights ; closed form for one Gaussian line δV = c σ_F √(2 s Δλ) / (λ₀ A π^{1/4}) = 89.18 m/s",
      "measured": 89.18981787754832,
      "deviation": 0.009817877548314868,
      "tolerance": {
        "value": 0.001,
        "kind": "rel",
        "text": "±0.001 relative"
      },
      "status": "pass",
      "detail": "",
      "note": "the closed form assumes λ ≈ λ₀ across the line and a continuous integral ; the discrete sum on a 0.01 Å grid differs by 1e-4"
    },
    {
      "id": "osterbrock2006_oiii_te_ratio_100",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "oiii_electron_temperature",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/nebular/oiii_electron_temperature/",
      "dataset": "synthetic: [O III] λ4959, λ5007 (ratio 2.98) and λ4363 Gaussians, (4959 + 5007) / 4363 = 100",
      "quantity": "T_e([O III]) [K]",
      "published": 12961.0,
      "source": "Osterbrock & Ferland 2006, Astrophysics of Gaseous Nebulae and AGN, Eq. 5.4 : [j(4959) + j(5007)] / j(4363) = 7.90 exp(32900 / T) ⇒ R = 100 gives T = 32900 / ln(100 / 7.90) = 12 961 K",
      "measured": 12961.39295670247,
      "deviation": 0.39295670246974623,
      "tolerance": {
        "value": 100.0,
        "kind": "abs",
        "text": "±100 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "dT/dR = −51 K per unit of R at R = 100 : 100 K allows a 2 % error on the fitted doublet ratio (recovered to 1e-9 on this noise-free input)"
    },
    {
      "id": "proxauf2014_sii_density_ratio_1",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "sii_electron_density",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/nebular/sii_electron_density/",
      "dataset": "synthetic: equal [S II] λ6716 and λ6731 Gaussians (R = 1.0)",
      "quantity": "n_e([S II]) [cm⁻³]",
      "published": 449.0,
      "source": "Proxauf, Öttl & Kimeswenger 2014, A&A 561, A10 — log n_e = 0.0543 tan(−3.0553 R + 2.8506) + 6.98 − 10.6905 R + 9.9186 R² − 3.5442 R³ evaluated at R = F(6716)/F(6731) = 1.0 ⇒ log n_e = 2.653, 449 cm⁻³",
      "measured": 449.39360861756995,
      "deviation": 0.3936086175699529,
      "tolerance": {
        "value": 0.05,
        "kind": "rel",
        "text": "±0.05 relative"
      },
      "status": "pass",
      "detail": "",
      "note": "d(log n_e)/dR = −1.66 at R = 1 : 5 % on n_e is a 1.3 % error on the fitted line ratio, generous for a noise-free input and the 3-digit published value"
    },
    {
      "id": "kauffmann2003_bpt_demarcation_x_minus_0p5",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "bpt_line_ratios",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/nebular/bpt_line_ratios/",
      "dataset": "synthetic: bisection of the classifier at log([N II]/Hα) = −0.5",
      "quantity": "log([O III]/Hβ) on the Kauffmann line at log([N II]/Hα) = −0.5",
      "published": 0.1909,
      "source": "Kauffmann et al. 2003, MNRAS 346, 1055, Eq. 1 : log([O III]/Hβ) = 0.61 / (log([N II]/Hα) − 0.05) + 1.3 ⇒ 0.1909 at x = −0.5",
      "measured": 0.19090909090909114,
      "deviation": 9.090909091152843e-06,
      "tolerance": {
        "value": 0.001,
        "kind": "abs",
        "text": "±0.001 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "the bisection resolves the HII / Composite edge to 1e-15 ; 1e-3 is the rounding"
    },
    {
      "id": "kewley2001_bpt_demarcation_x_minus_0p5",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "bpt_line_ratios",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/nebular/bpt_line_ratios/",
      "dataset": "synthetic: bisection of the classifier at log([N II]/Hα) = −0.5",
      "quantity": "log([O III]/Hβ) on the Kewley line at log([N II]/Hα) = −0.5",
      "published": 0.5611,
      "source": "Kewley et al. 2001, ApJ 556, 121, Eq. 5 (maximum starburst line) : log([O III]/Hβ) = 0.61 / (log([N II]/Hα) − 0.47) + 1.19 ⇒ 0.5611 at x = −0.5",
      "measured": 0.5611340206185567,
      "deviation": 3.402061855661831e-05,
      "tolerance": {
        "value": 0.001,
        "kind": "abs",
        "text": "±0.001 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "the bisection resolves the Composite / AGN edge to 1e-15 ; 1e-3 is the rounding"
    },
    {
      "id": "kasten_young1989_airmass_60deg",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "atmospheric_extinction_correct",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/correction/atmospheric_extinction_correct/",
      "dataset": "synthetic: kasten_young_airmass(60°), the brick's geometry path",
      "quantity": "airmass X(z = 60°)",
      "published": 1.994293,
      "source": "Kasten & Young 1989, Appl. Opt. 28, 4735, Eq. 3 : X = 1 / [cos z + 0.50572 (96.07995 − z)^−1.6364] with z in degrees",
      "measured": 1.9942928525292494,
      "deviation": -1.474707507220785e-07,
      "tolerance": {
        "value": 1e-05,
        "kind": "abs",
        "text": "±1e-05 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "closed form evaluated in double precision ; 1e-5 is the rounding of the value"
    },
    {
      "id": "kpno_extinction_node_5504",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "atmospheric_extinction_correct",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/correction/atmospheric_extinction_correct/",
      "dataset": "synthetic: unit flux at 5504 Å corrected at airmass 1",
      "quantity": "k(5504 Å) = 2.5 log₁₀(F_corr / F) [mag/airmass]",
      "published": 0.15,
      "source": "IRAF onedstds$kpnoextinct.dat (KPNO mean extinction curve, 82 nodes) : k(5504 Å) = 0.150 mag/airmass",
      "measured": 0.15000000000000008,
      "deviation": 8.326672684688674e-17,
      "tolerance": {
        "value": 1e-06,
        "kind": "abs",
        "text": "±1e-06 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "5504 Å is a node of the table, so no interpolation : exact to rounding"
    },
    {
      "id": "ccm89_deredden_factor_5500",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "deredden_interstellar",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/correction/deredden_interstellar/",
      "dataset": "synthetic: unit flux at 5500 Å, E(B−V) = 0.1, R_V = 3.1, law CCM89",
      "quantity": "F_dereddened / F at 5500 Å",
      "published": 1.33,
      "source": "Cardelli, Clayton & Mathis 1989, ApJ 345, 245 : R_V = 3.1, E(B−V) = 0.1 ⇒ A_V = 0.31, A(5500)/A_V = 0.99885 ⇒ 10^(0.4 · 0.30964) = 1.3300",
      "measured": 1.3300176379815252,
      "deviation": 1.7637981525098212e-05,
      "tolerance": {
        "value": 0.001,
        "kind": "abs",
        "text": "±0.001 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "the published factor is quoted to 4 digits ; skipped when dust_extinction is absent"
    },
    {
      "id": "vollmann2006_ew_error_gaussian_absorption",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "equivalent_width",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/line_fitting/equivalent_width/",
      "dataset": "synthetic: Gaussian absorption depth 0.4, FWHM 8 Å on continuum 100, σ_F = 1 (S/N = 100), 0.1 Å sampling, ±60 Å window",
      "quantity": "σ(EW) [Å]",
      "published": 1.6595,
      "source": "Vollmann & Eversberg 2006, AN 327, 862, Eq. 7 : σ(EW) = √(1 + F̄_c / F̄) · (Δλ − EW) / (S/N), evaluated with the analytic EW = 3.4063 Å and Δλ = 119.9 Å",
      "measured": 1.6594588993593296,
      "deviation": -4.110064067042174e-05,
      "tolerance": {
        "value": 0.001,
        "kind": "rel",
        "text": "±0.001 relative"
      },
      "status": "pass",
      "detail": "",
      "note": "the brick uses the measured EW and mean flux ; both agree with the analytic values to 1e-5 on a 0.1 Å grid"
    },
    {
      "id": "dravins1990_q1_epsilon_0p6",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "vsini_fourier",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/kinematics/vsini_fourier/",
      "dataset": "synthetic: q1_first_zero(0.6), the brick's calibration polynomial",
      "quantity": "q₁(ε = 0.6)",
      "published": 0.66,
      "source": "Dravins, Lindegren & Torkelsson 1990, A&A 237, 137 (q₁(ε) polynomial) ; Gray 2005, The Observation and Analysis of Stellar Photospheres, ch. 18 : q₁ = 0.660 for ε = 0.6",
      "measured": 0.6600304,
      "deviation": 3.0399999999985994e-05,
      "tolerance": {
        "value": 0.001,
        "kind": "abs",
        "text": "±0.001 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "Gray's tabulated value has three decimals"
    },
    {
      "id": "greisen2006_wave_log_axis",
      "family": "literature",
      "family_title": "Literature values on synthetic inputs",
      "algorithm": "read_fits",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/io/read_fits/",
      "dataset": "synthetic: header CTYPE1 = WAVE-LOG, CRVAL1 = 5000, CDELT1 = 1, CRPIX1 = 1",
      "quantity": "λ(pixel 2) [Å]",
      "published": 5001.0001,
      "source": "Greisen, Calabretta, Valdes & Allen 2006, A&A 446, 747 (WCS Paper III), the WAVE-LOG axis λ = λ_r exp(w / λ_r) ⇒ 5000 exp(1/5000) = 5001.0001 Å",
      "measured": 5001.000100006668,
      "deviation": 6.667505658697337e-09,
      "tolerance": {
        "value": 5e-05,
        "kind": "abs",
        "text": "±5e-05 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "half of the last digit of the published value (the axis is exact to 1e-12)"
    },
    {
      "id": "vega_halpha_rest_centre",
      "family": "real_data",
      "family_title": "Real data: CALSPEC spectrophotometric standards",
      "algorithm": "fit_gaussian_line",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/line_fitting/fit_gaussian_line/",
      "dataset": "vega_calspec",
      "quantity": "rest-frame air λ(Hα) [Å]",
      "published": 6562.79,
      "source": "NIST ASD Hα 6562.79 Å (air) ; fitted on CALSPEC alpha_lyr_stis_011 after vacuum_to_air and corrected for RV = −13.9 km/s (Evans 1967, IAU Symp. 30, 57)",
      "measured": 6562.533365432928,
      "deviation": -0.25663456707206933,
      "tolerance": {
        "value": 4.9,
        "kind": "abs",
        "text": "±4.9 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "half the fixture's FWHM column at the line (9.76 Å, STIS G750L segment) ; the fit lands within 0.3 Å"
    },
    {
      "id": "vega_hbeta_rest_centre",
      "family": "real_data",
      "family_title": "Real data: CALSPEC spectrophotometric standards",
      "algorithm": "fit_gaussian_line",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/line_fitting/fit_gaussian_line/",
      "dataset": "vega_calspec",
      "quantity": "rest-frame air λ(Hβ) [Å]",
      "published": 4861.35,
      "source": "NIST ASD Hβ 4861.35 Å (air) ; fitted on CALSPEC alpha_lyr_stis_011 after vacuum_to_air and corrected for RV = −13.9 km/s (Evans 1967, IAU Symp. 30, 57)",
      "measured": 4861.132780776285,
      "deviation": -0.2172192237158015,
      "tolerance": {
        "value": 2.75,
        "kind": "abs",
        "text": "±2.75 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "half the fixture's FWHM column at the line (5.49 Å, STIS G430L segment)"
    },
    {
      "id": "vega_hgamma_rest_centre",
      "family": "real_data",
      "family_title": "Real data: CALSPEC spectrophotometric standards",
      "algorithm": "fit_gaussian_line",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/line_fitting/fit_gaussian_line/",
      "dataset": "vega_calspec",
      "quantity": "rest-frame air λ(Hγ) [Å]",
      "published": 4340.47,
      "source": "NIST ASD Hγ 4340.47 Å (air) ; fitted on CALSPEC alpha_lyr_stis_011 after vacuum_to_air and corrected for RV = −13.9 km/s (Evans 1967, IAU Symp. 30, 57)",
      "measured": 4340.4288606889295,
      "deviation": -0.04113931107076496,
      "tolerance": {
        "value": 2.75,
        "kind": "abs",
        "text": "±2.75 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "half the fixture's FWHM column at the line (5.50 Å, STIS G430L segment)"
    },
    {
      "id": "vega_hdelta_rest_centre",
      "family": "real_data",
      "family_title": "Real data: CALSPEC spectrophotometric standards",
      "algorithm": "fit_gaussian_line",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/line_fitting/fit_gaussian_line/",
      "dataset": "vega_calspec",
      "quantity": "rest-frame air λ(Hδ) [Å]",
      "published": 4101.73,
      "source": "NIST ASD Hδ 4101.73 Å (air) ; fitted on CALSPEC alpha_lyr_stis_011 after vacuum_to_air and corrected for RV = −13.9 km/s (Evans 1967, IAU Symp. 30, 57)",
      "measured": 4101.507874810472,
      "deviation": -0.22212518952801474,
      "tolerance": {
        "value": 2.75,
        "kind": "abs",
        "text": "±2.75 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "half the fixture's FWHM column at the line (5.50 Å, STIS G430L segment)"
    },
    {
      "id": "sun_halpha_hbeta_separation",
      "family": "real_data",
      "family_title": "Real data: CALSPEC spectrophotometric standards",
      "algorithm": "fit_gaussian_line",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/line_fitting/fit_gaussian_line/",
      "dataset": "sun_calspec",
      "quantity": "λ(Hα) − λ(Hβ) [Å]",
      "published": 1701.44,
      "source": "NIST ASD Hα 6562.79 Å − Hβ 4861.35 Å = 1701.44 Å (air) ; fitted on CALSPEC sun_reference_stis_002 (Neckel & Labs 1984 segment) after vacuum_to_air",
      "measured": 1703.1231411070503,
      "deviation": 1.6831411070502327,
      "tolerance": {
        "value": 10.0,
        "kind": "abs",
        "text": "±10 absolute"
      },
      "status": "pass",
      "detail": "",
      "note": "the fixture is sampled every 10 Å (20 Å above 6500 Å) with a 10 Å FWHM : half the coarser step ; the Na I D doublet (5.97 Å apart) is not resolved, so the Balmer separation is the pair this resolution allows"
    },
    {
      "id": "vega_mk_type_pickles_chi2",
      "family": "real_data",
      "family_title": "Real data: CALSPEC spectrophotometric standards",
      "algorithm": "classify_template_chi2",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/classification/classify_template_chi2/",
      "dataset": "vega_calspec",
      "quantity": "MK spectral type",
      "published": "A0V",
      "source": "Johnson & Morgan 1953, ApJ 117, 313 (α Lyr is the A0 V MK standard) ; templates from Pickles 1998, PASP 110, 863",
      "measured": null,
      "deviation": null,
      "tolerance": {
        "value": 0.0,
        "kind": "exact",
        "text": "exact match"
      },
      "status": "skipped",
      "detail": "Pickles 1998 atlas not bundled (about 1 MB, ESO / CDS J/PASP/110/863 download) ; set SPECTRO_PICKLES_ATLAS_DIR to a directory of uk*.dat files to run this case",
      "note": "categorical ; runs only when the Pickles atlas is available locally (SPECTRO_PICKLES_ATLAS_DIR), it is neither bundled nor downloaded"
    },
    {
      "id": "sun_mk_type_pickles_chi2",
      "family": "real_data",
      "family_title": "Real data: CALSPEC spectrophotometric standards",
      "algorithm": "classify_template_chi2",
      "algorithm_docs_url": "https://docs.spectrokernel.io/algorithms/classification/classify_template_chi2/",
      "dataset": "sun_calspec",
      "quantity": "MK spectral type",
      "published": "G2V",
      "source": "Morgan & Keenan 1973, ARA&A 11, 29 (the Sun as G2 V) ; templates from Pickles 1998, PASP 110, 863",
      "measured": null,
      "deviation": null,
      "tolerance": {
        "value": 0.0,
        "kind": "exact",
        "text": "exact match"
      },
      "status": "skipped",
      "detail": "Pickles 1998 atlas not bundled (about 1 MB, ESO / CDS J/PASP/110/863 download) ; set SPECTRO_PICKLES_ATLAS_DIR to a directory of uk*.dat files to run this case",
      "note": "categorical ; runs only when the Pickles atlas is available locally (SPECTRO_PICKLES_ATLAS_DIR), it is neither bundled nor downloaded"
    }
  ],
  "not_measurable": [
    {
      "topic": "Na I D doublet separation (5895.92 − 5889.95 = 5.97 Å, NIST)",
      "dataset": "sun_calspec",
      "reason": "the solar composite is sampled every 10 Å with a 10 Å FWHM (Neckel & Labs 1984 segment) : the doublet is a single dip at 5896 Å"
    },
    {
      "topic": "Ca II H & K S-index (1.09 Å triangular cores, Vaughan et al. 1978)",
      "dataset": "sun_calspec",
      "reason": "the H and K cores are one 10 Å sample each in the Woods et al. 1996 segment ; the index needs a resolution of ~1 Å"
    },
    {
      "topic": "Hγ and Hδ centres on the Sun",
      "dataset": "sun_calspec",
      "reason": "at 10 Å sampling the G band (CH, 4300 Å) and the crowded Fe I / Ca I region dominate the fit windows ; only Hα and Hβ give a clean absorption fit"
    },
    {
      "topic": "Tonry & Davis 1979 r-value of a cross-correlation peak",
      "dataset": "synthetic",
      "reason": "the paper defines r = h / (√2 σ_a) but tabulates no value for a reference spectrum pair ; nothing published to compare with"
    }
  ]
}
