KSPECDR Flux Calibration Pipeline#
End-to-End Process Overview#
Project:
kspecdrGoal: convert extracted counts to physical flux density (
erg/cm2/s/A)Entry point:
reduce_object(args)Flux calibration stage:
_apply_fluxcal(red_filename, args)
Where Flux Calibration Happens#
Reduction Order in reduce_object#
Raw -> IM (
make_im)IM -> EX (
make_ex)EX -> RED copy
Flat-field, scrunch, throughput correction, sky subtraction
Flux calibration (
CALIBFLUX=True)Final metadata + reduced status
Key point: flux calibration runs after wavelength calibration and sky subtraction.
Inputs Required for Flux Calibration#
Science Data + Metadata#
RED spectra + variance + wavelength solution (
WAVELA)Fiber table with fiber types and names (
FIBRES)Standard fibers identified by
TYPE='C'
External Resources#
Standard-star photometry CSV (
CALIBFLUX_CATALOG)BOSZ template library (
data/templates/bosz2024/)Filter curves (
data/filters/*.dat)Mask regions (
data/masks/telluric_default.dat)
Standard-Star Selection#
Fiber and Catalog Mapping#
Pipeline scans fibers and keeps only calibration fibers (
TYPE='C')For each selected fiber:
Build observed
Spectrum1D(wavelength, flux, variance, mask)Read star name from fiber table (if present)
Load photometry row from catalog
Current implementation detail:
Catalog matching is by row index order (not RA/Dec positional matching yet).
Template Matching (Per Standard Star)#
Best-Fit Stellar Model Selection#
Estimate Teff search range from broadband colors
Query BOSZ candidates in parameter box (Teff/logg/[M/H])
For each candidate:
Convolve to instrument resolution (
CALIBFLUX_FWHMorSPECFWHM)Resample to observed wavelength grid
Measure RV by log-lambda cross-correlation
Continuum-normalize observed and template spectra
Score fit (
chi2orhuber)
Select best template + RV
Photometric Scaling#
Set the Absolute Flux Level#
Compute synthetic photometry of the best template through loaded filters
Compare to observed catalog magnitudes (internally converted to AB)
Derive a weighted scale factor from magnitude offsets
Formula used:
scale = 10^(-0.4 * mean_delta_mag)
Output:
Scaled template spectrum in physical flux units
Scale uncertainty from photometric errors
Per-Star Calibration Vector#
Build Cal_star(lambda)#
Core relation:
Cal_star(lambda) = F_model_scaled(lambda) / C_obs(lambda)
Mask invalid pixels:
non-finite values
non-positive flux
telluric/bad wavelength regions
Variance model:
Var(Cal) = Cal^2 * [Var(model)/model^2 + Var(obs)/obs^2]
Each star yields one CalibrationVector with metadata (Teff, logg, [M/H], RV, scale).
Combine Multiple Standards#
Robust Combined Calibration Curve#
Input: per-star calibration vectors
Default method: inverse-variance weighted mean
Iterative sigma clipping (default 3 sigma)
Optional smoothing: Savitzky-Golay (
CALIBFLUX_SMOOTH=True)
Special case:
If only one standard star is available, pass-through without combination.
QC metric:
RMS fractional scatter across stars vs wavelength
Apply Calibration to All Fibers#
Final Flux and Variance Update#
For every fiber spectrum:
F_cal = Counts * Cal_combinedVar_cal = Var_counts * Cal^2 + Counts^2 * Var_calibration
Write back to RED file:
Calibrated science image
Propagated variance
Header keywords:
BUNIT,FLUXCAL,FCALNSTR,FCALRMSHISTORY lines per standard star (template parameters, RV, scale)
Runtime Controls (args)#
Main FluxCal Arguments#
CALIBFLUX(bool): enable flux calibrationCALIBFLUX_CATALOG(str): standard-star catalog CSV pathCALIBFLUX_FWHM(float): instrument FWHM in AngstromCALIBFLUX_METRIC(chi2orhuber)CALIBFLUX_SMOOTH(bool): smooth combined curve
Recommended minimum:
set
CALIBFLUX=Trueprovide
CALIBFLUX_CATALOGensure fibers include at least one
TYPE='C'
Practical Example (Commissioning Data)#
Example Resource Paths#
Assign file:
resources/comm/assign/tile_058.assign.txtStandard-star catalog:
resources/comm/20260129/calib/standard_star_atlas_refcat2.csv
Example fiber classes from assign table:
target_class=8-> standard star ->TYPE='C'target_class=9-> sky fiber ->TYPE='S'
QC Checklist#
Validate Calibration Quality#
Confirm
FLUXCAL=Truein final RED headerCheck number of standards used (
FCALNSTR)Inspect scatter (
FCALRMS) and per-star HISTORY entriesPlot combined and per-star vectors (
fluxcal/qc.pyutilities)Verify calibrated spectra units are
erg/cm2/s/A
Known Gaps and Next Improvements#
Current Limitations#
Catalog-to-fiber matching is index-based; positional matching is TODO
Calibration quality depends on available standard stars and photometric bands
Telluric correction stage is separate and optional (
TELCOR)
Planned Enhancements#
RA/Dec-based catalog association
tighter QC gating and automated outlier rejection policies
richer nightly transfer-function handling
Summary#
Flux Calibration in This Pipeline#
Uses in-field standard stars (
TYPE='C')Fits BOSZ templates with RV + continuum normalization
Anchors absolute scale with catalog photometry
Combines per-star vectors robustly
Applies calibrated flux conversion to every fiber with full variance propagation
Deliverable: physically calibrated RED spectra ready for science analysis.