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