Source code for rubin_sim.maf.maf_contrib.depth_limited_num_gal_metric

import numpy as np

import rubin_sim.maf.metrics as metrics
from rubin_sim.maf.maf_contrib.lss_obs_strategy.galaxy_counts_metric_extended import (
    GalaxyCountsMetricExtended as GalaxyCountsMetric,
)


[docs] class DepthLimitedNumGalMetric(metrics.BaseMetric): """This metric calculates the number of galaxies while accounting for the extragalactic footprint. Parameters ---------- m5_col : `str`, optional Name of column for depth in the data. Default: 'fiveSigmaDepth' filter_col : `str`, optional Name of column for filter in the data. Default: 'filter' maps : `list` [`str`], optional List of map names. Default: ['DustMap'] nside : `int`, optional HEALpix resolution parameter. Default: 256. This should match slicer nside. filter_band : `str`, optional Filter to use to calculate galaxy counts. Any one of 'u', 'g', 'r', 'i', 'z', 'y'. Default: 'i' redshiftBin: `str`, optional options include '0.<z<0.15', '0.15<z<0.37', '0.37<z<0.66, '0.66<z<1.0', '1.0<z<1.5', '1.5<z<2.0', '2.0<z<2.5', '2.5<z<3.0','3.0<z<3.5', '3.5<z<4.0', 'all' for no redshift restriction (so consider 0.<z<4.0) Default: 'all' nfilters_needed : `int`, optional Number of filters in which to require coverage. Default: 6 lim_mag_i_ptsrc : `float`, optional Point-source limiting mag for the i-band coadded dust-corrected depth. Default: 26.0 lim_ebv : `float`, optional Limiting EBV value. Default: 0.2 Returns ------- ngal : `float` Number of galaxies in healpix if the slice_point passes the extragalactic cuts; otherwise self.badval """ def __init__( self, m5_col="fiveSigmaDepth", filter_col="filter", nside=128, filter_band="i", redshift_bin="all", nfilters_needed=6, lim_mag_i_ptsrc=26.0, lim_ebv=0.2, metric_name="DepthLimitedNumGalaxiesMetric", units="Galaxy Counts", **kwargs, ): self.m5_col = m5_col self.filter_col = filter_col self.filter_band = filter_band # set up the extended source limiting mag # galaxies are x2 as seeing: seeing is generally 0.7arcsec # and a typical galaxies is 1arcsec # => for extended source limiting mag of x, we'd need x + 0.7 # as the point-source limiting mag; # 0.7 comes from $\sqrt{1/2}$; # basically have x2 difference in magnitudes between # point source and extended source. lim_mag_i_extsrc = lim_mag_i_ptsrc - 0.7 # set up the metric for galaxy counts self.galmetric = GalaxyCountsMetric( m5_col=self.m5_col, nside=nside, upper_mag_limit=lim_mag_i_extsrc, include_dust_extinction=True, filter_band=self.filter_band, redshift_bin=redshift_bin, cfht_ls_counts=False, normalized_mock_catalog_counts=True, ) # set up the metric for extragalactic footprint self.eg_metric = metrics.ExgalM5WithCuts( m5_col=self.m5_col, filter_col=self.filter_col, lsst_filter=self.filter_band, n_filters=nfilters_needed, extinction_cut=lim_ebv, depth_cut=lim_mag_i_ptsrc, ) maps = self.eg_metric.maps + self.galmetric.maps maps = set(maps) super().__init__( col=[self.m5_col, self.filter_col], maps=maps, metric_name=metric_name, units=units, **kwargs )
[docs] def run(self, data_slice, slice_point=None): # see if this slice_point is in the extragalactic footprint pass_egcuts = self.eg_metric.run(data_slice, slice_point=slice_point) if pass_egcuts == self.badval: # failed dust/depth cuts return self.badval # Otherwise, find the galaxy counts in_filt = np.where(data_slice[self.filter_col] == self.filter_band)[0] return self.galmetric.run(data_slice[in_filt], slice_point=slice_point)