Source code for skypy.galaxies.luminosity
r"""Models of galaxy luminosities.
"""
import numpy as np
from ..utils.random import schechter
from ..utils import dependent_argument
__all__ = [
'schechter_lf_magnitude',
]
[docs]@dependent_argument('M_star', 'redshift')
@dependent_argument('alpha', 'redshift')
def schechter_lf_magnitude(redshift, M_star, alpha, m_lim, cosmology, size=None,
x_max=1e3, resolution=1000):
r'''Sample magnitudes from a Schechter luminosity function.
Given a list of galaxy redshifts, and an apparent magnitude limit, sample
galaxy absolute magnitudes from a Schechter luminosity function.
Parameters
----------
redshift : array_like
Galaxy redshifts for which to sample magnitudes.
M_star : array_like or function
Characteristic absolute magnitude, either constant, or an array with
values for each galaxy, or a function of galaxy redshift.
alpha : array_like or function
Schechter function index, either a constant, or an array of values for
each galaxy, or a function of galaxy redshift.
m_lim : float
Apparent magnitude limit.
cosmology : Cosmology
Cosmology object for converting apparent and absolute magnitudes.
size : int, optional
Explicit size for the sampling. If not given, one magnitude is sampled
for each redshift.
Returns
-------
magnitude : array_like
Absolute magnitude sampled from a Schechter luminosity function for
each input galaxy redshift.
'''
# only alpha scalars supported at the moment
if np.ndim(alpha) > 0:
raise NotImplementedError('only scalar alpha is supported')
# get x_min for each galaxy
x_min = m_lim - cosmology.distmod(redshift).value
x_min -= M_star
x_min *= -0.4
if np.ndim(x_min) > 0:
np.power(10., x_min, out=x_min)
else:
x_min = 10.**x_min
# sample magnitudes
# x == 10**(-0.4*(M - M_star))
M = schechter(alpha, x_min, x_max, resolution, size=size)
np.log10(M, out=M)
M *= -2.5
M += M_star
return M