SFR(Hα) Calibrations

Simulation-informed SFR(Hα) calibrations for high-z (4 < z < 10) galaxies, from Kramarenko et al. (2026). Both take the dust-corrected Hα luminosity (LHα) as input and are calibrated on the SPHINX cosmological simulations for the observed LHα > 1041 erg s⁻¹.

Eq. 2 | RMSE = 0.13 dex

Luminosity-only calibration

Depends on LHα alone. Reduces the RMSE in the predicted SFR by ΔRMSE ≈ 0.04 dex relative to the Theios et al. (2019) calibration.

log₁₀ [SFR / M☉ yr⁻¹] = log₁₀ [LHα / erg s⁻¹] − 41.45
  + 0.06 (log₁₀ [LHα / erg s⁻¹] − 41.90)
Eq. 3 | RMSE = 0.11 dex | recommended

Luminosity + equivalent width calibration

Adds a correction depending on the Hα equivalent width, EWHα [Å], which traces stellar metallicity and age. Reduces the RMSE by ΔRMSE ≈ 0.06 dex relative to Theios et al. (2019); the best-performing calibration in the paper.

log₁₀ [SFR / M☉ yr⁻¹] = log₁₀ [LHα / erg s⁻¹] − 41.45
  − 0.01 (log₁₀ [LHα / erg s⁻¹] − 41.90)
  − 0.26 (log₁₀ [EWHα / Å] − 2.67)
Extra

Python function

The new SFR(Hα) calibrations implemented in Python (omit ew_ha to fall back to the luminosity-only calibration).

import numpy as np


def sfr_halpha(l_ha, ew_ha=None):
    """
    Convert the Halpha luminosity to a star formation rate.

    Parameters
    ----------
    l_ha : float or array_like
        Dust-corrected Halpha luminosity, in erg / s.
    ew_ha : float or array_like, optional
        Halpha equivalent width, in angstrom.
        If given, the luminosity + equivalent width
        calibration (Eq. 3) is used instead of the
        luminosity-only calibration (Eq. 2).

    Returns
    -------
    sfr : float or array_like
        Star formation rate, in solar masses per year.

    References
    ----------
    .. [1] Kramarenko, I. G., Rosdahl, J., Blaizot, J.,
       Matthee, J., Katz, H., & Di Cesare, C. 2026, A&A,
       707, A184, "Halpha as a tracer of star formation
       in the SPHINX cosmological simulations",
       https://doi.org/10.1051/0004-6361/202557114
    """
    log_l = np.log10(l_ha)

    if ew_ha is None:
        log_sfr = log_l - 41.45 + 0.06 * (log_l - 41.90)  # Eq. 2
    else:
        log_ew = np.log10(ew_ha)
        log_sfr = (log_l - 41.45
                   - 0.01 * (log_l - 41.90)
                   - 0.26 * (log_ew - 2.67))  # Eq. 3

    return 10 ** log_sfr