Source code for rubin_sim.maf.maf_contrib.lss_metrics
__all__ = ("GalaxyCountsMetric",)
import healpy as hp
import numpy as np
import scipy
from rubin_sim.maf.metrics import BaseMetric, ExgalM5
[docs]
class GalaxyCountsMetric(BaseMetric):
"""Estimate the number of galaxies expected at a particular (extragalactic)
coadded depth.
"""
def __init__(self, m5_col="fiveSigmaDepth", nside=128, metric_name="GalaxyCounts", **kwargs):
self.m5_col = m5_col
super(GalaxyCountsMetric, self).__init__(col=self.m5_col, metric_name=metric_name, **kwargs)
# Use the extinction corrected coadded depth metric to calculate
# the depth at each point.
self.coaddmetric = ExgalM5(m5_col=self.m5_col)
# Total of 41253.0 galaxies across the sky (at what magnitude?).
# This didn't seem to work quite right for me..
self.scale = 41253.0 / hp.nside2npix(nside) / 5000.0
# Reset units (otherwise uses magnitudes).
self.units = "Galaxy Counts"
def _gal_count(self, apparent_mag, coaddm5):
# Order for galCount must be apparent mag, then coaddm5,
# for scipy.integrate method.
dn_gal = np.power(10.0, -3.52) * np.power(10.0, 0.34 * apparent_mag)
completeness = 0.5 * scipy.special.erfc(apparent_mag - coaddm5)
return dn_gal * completeness
[docs]
def run(self, data_slice, slice_point=None):
# Calculate the coadded depth.
coaddm5 = self.coaddmetric.run(data_slice)
# Calculate the number of galaxies.
# From Carroll et al, 2014 SPIE (http://arxiv.org/abs/1501.04733)
# I'm not entirely certain this gives a properly calibrated number
# of galaxy counts, however it is proportional to the expected number
# at least (and should be within an order of magnitude)
num_gal, int_err = scipy.integrate.quad(self._gal_count, -np.inf, 32, args=coaddm5)
num_gal *= self.scale
return num_gal