import numpy as np
[docs]
def get_log_luminosity_2500(log_L_2_keV, alpha=0.952, beta=2.138, scatter=0.40):
"""
Return the 2500 ang° monochromatic luminosity (in erg/s).
It uses Lusso+10 eq. 5 (inverted) Lx = alpha L_opt - beta
"""
log_L_2_keV = np.atleast_1d(log_L_2_keV)
log_L_2500 = (log_L_2_keV + beta) / alpha
assert np.allclose(alpha * log_L_2500 - beta, log_L_2_keV)
# TODO: implement realistic scatter
log_L_2500 += np.random.normal(loc=0, scale=scatter, size=log_L_2_keV.size)
return log_L_2500
[docs]
def get_log_luminosity_2500_bisector(log_L_2_keV, dispersion=0.37):
"""Return Lusso+2010 log_L_2500 using the bisector."""
# NOTE: Lusso+2010 eq. (6)
log_L_2500 = (log_L_2_keV - 3.508) / 0.760
# Assuming
# x = log_L_2500
# y = log_L_2_keV
# dy/dx = 0.760
# dx/dy = 1 / 0.760
# Gives
# sigma_xy = (sigma_x ** 2 + sigma_y ** 2) ** .5
# sigma_x = sigma_xy / (1 + (dy/dx) ** 2) ** .5
# sigma_y = sigma_xy / (1 + (dx/dy) ** 2) ** .5
sigma = dispersion / (1 + 0.760**2) ** 0.5
scatter = np.random.normal(scale=sigma, size=log_L_2500.size)
return log_L_2500 + scatter