Source code for rubin_sim.maf.metrics.star_density
__all__ = ("StarDensityMetric",)
import warnings
from scipy.interpolate import interp1d
from .base_metric import BaseMetric
[docs]
class StarDensityMetric(BaseMetric):
    """Interpolate the stellar luminosity function to return the number of
    stars per square arcsecond brighter than the mag_limit.
    Note that the map is built from CatSim stars in the range 20 < r < 28.
    mag_limit values outside that the range of the map's starMapBins will
    return self.badval
    The stellar density maps are available in any bandpass, but bandpasses
    other than r band must use a pre-configured StellarDensityMap (not just the
    default). In other words, when setting up the metric bundle for an i-band
    stellar density using (as an example) a HealpixSlicer:
    ```
    map = maf.StellarDensityMap(filtername='i')
    metric = maf.StarDensityMetric(filtername='i', mag_limit=25.0)
    slicer = maf.HealpixSlicer()
    bundle = maf.MetricBundle(metric, slicer, "", mapsList=[map])
    ```
    Parameters
    ----------
    mag_limit : `float`, opt
        Magnitude limit at which to evaluate the stellar luminosity function.
        Returns number of stars per square arcsecond brighter than this limit.
        Default 25.
    filtername : `str`, opt
        Which filter to evaluate the luminosity function in; Note that using
        bands other than r will require setting up a custom (rather than
        default) version of the stellar density map.
        Default r.
    units : `str`, opt
        Units for the output values. Default "stars/sq arcsec".
    maps : `list` of `str`, opt
        Names for the maps required. Default "StellarDensityMap".
    Returns
    -------
    result : `float`
        Number of stars brighter than mag_limit in filtername, based on the
        stellar density map.
    """
    def __init__(
        self, mag_limit=25.0, filtername="r", units="stars/sq arcsec", maps=["StellarDensityMap"], **kwargs
    ):
        super(StarDensityMetric, self).__init__(col=[], maps=maps, units=units, **kwargs)
        self.mag_limit = mag_limit
        if "rmagLimit" in kwargs:
            warnings.warn(
                "rmagLimit is deprecated; please use mag_limit instead "
                "(will use the provided rmagLimit for now)."
            )
            self.mag_limit = kwargs["rmagLimit"]
        self.filtername = filtername
[docs]
    def run(self, data_slice, slice_point=None):
        # Interpolate the data to the requested mag
        interp = interp1d(
            slice_point["starMapBins_%s" % self.filtername][1:],
            slice_point["starLumFunc_%s" % self.filtername],
        )
        # convert from stars/sq degree to stars/sq arcsec
        try:
            result = interp(self.mag_limit) / (3600.0**2)
        except ValueError:
            # This probably means the interpolation went out of range
            # (magLimit <15 or >28)
            return self.badval
        return result