#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# magnitudes.py - Waqas Bhatti (wbhatti@astro.princeton.edu) - Sept 2013
# License: MIT - See LICENSE for full text.
'''
Contains various useful functions for converting between magnitude systems.
'''
import numpy as np
###############################################
## MAGIC CONSTANTS FOR 2MASS TO COUSINS/SDSS ##
###############################################
# converting from JHK to BVRI
BJHK = [0.1922, 5.2634, 0.0203, -4.2810]
BJH = [0.7013, 6.2321, -5.2769]
BJK = [0.1935, 5.2676, -4.2650]
BHK = [0.7108, 18.5256, -17.5197]
BJ = [5.5599, 0.6320]
BH = [6.7509, 0.5269]
BK = [7.0739, 0.4971]
VJHK = [-0.0053,3.5326, 1.3141, -3.8331]
VJH = [0.2948, 4.2168, -3.2251]
VJK = [0.0631, 3.7103, -2.7004]
VHK = [1.4044, 12.1719,-11.2331]
VJ = [3.8512, 0.7671]
VH = [4.8834, 0.6895]
VK = [5.1466, 0.6682]
RJHK = [0.0606, 2.7823, 0.8922, -2.6713]
RJH = [0.3678, 3.4181, -2.4434]
RJK = [0.1063, 2.9828, -1.9846]
RHK = [0.4826, 10.3926, -9.4021]
RJ = [2.8217, 0.8101]
RH = [3.9934, 0.7154]
RK = [4.3327, 0.6862]
IJHK = [0.0560, 2.0812, 0.4074, -1.4889]
IJH = [0.2453, 2.4061, -1.4236]
IJK = [0.0994, 2.1576, -1.1622]
IHK = [0.1403, 8.0510, -7.0394]
IJ = [1.5585, 0.8979]
IH = [2.6453, 0.8138]
IK = [2.9959, 0.7839]
# converting from JHK to SDSS ugriz
SDSSU_JHK = [3.5675, 5.4894, -2.8007, -1.8600]
SDSSU_JH = [4.2568, 5.3802, -4.5899]
SDSSU_JK = [3.8707, 4.6353, -3.8165]
SDSSU_HK = [10.4029, 0.6696, -0.1827]
SDSSU_J = [7.4786, 0.6779]
SDSSU_H = [10.2512, 0.4984]
SDSSU_K = [10.7584, 0.4662]
SDSSG_JHK = [0.9922, 4.3197, -1.6916, -1.6751]
SDSSG_JH = [0.6890, 4.4356, -3.4537]
SDSSG_JK = [1.5487, 4.1286, -3.2193]
SDSSG_HK = [4.3634, 2.7802, -1.9456]
SDSSG_J = [2.4949, 0.9537]
SDSSG_H = [4.7010, 0.8227]
SDSSG_K = [5.2323, 0.7899]
SDSSR_JHK = [0.6975, 2.9782, -0.8809, -1.1230]
SDSSR_JH = [1.0935, 2.9289, -1.9766]
SDSSR_JK = [0.7277, 2.7746, -1.8005]
SDSSR_HK = [5.7039, 1.4010, -0.7037]
SDSSR_J = [3.0033, 0.8713]
SDSSR_H = [5.6142, 0.7069]
SDSSR_K = [5.8755, 0.6913]
SDSSI_JHK = [0.8875, 2.3210, -0.6825, -0.6724]
SDSSI_JH = [0.9052, 2.3750, -1.4074]
SDSSI_JK = [0.8117, 2.1503, -1.1763]
SDSSI_HK = [6.2356, 2.7331, -2.1008]
SDSSI_J = [2.1593, 0.9168]
SDSSI_H = [6.4280, 0.6295]
SDSSI_K = [5.8109, 0.6773]
SDSSZ_JHK = [0.8346, 1.7668, -0.1778, -0.6084]
SDSSZ_JH = [0.9037, 1.8245, -0.8472]
SDSSZ_JK = [0.9220, 1.7158, -0.7411]
SDSSZ_HK = [4.3827, 2.4788, -1.7118]
SDSSZ_J = [1.5408, 0.9557]
SDSSZ_H = [6.1351, 0.6509]
SDSSZ_K = [6.6213, 0.6183]
##############################################
## JHK TO COUSINS/SDSS CONVERSION FUNCTIONS ##
##############################################
[docs]def convert_constants(jmag, hmag, kmag,
cjhk,
cjh, cjk, chk,
cj, ch, ck):
'''This converts between JHK and BVRI/SDSS mags.
Not meant to be used directly. See the functions below for more sensible
interface. This function does the grunt work of converting from JHK to
either BVRI or SDSS ugriz. while taking care of missing values for any of
jmag, hmag, or kmag.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags to use to convert.
cjhk,cjh,cjk,chk,cj,ch,ck : lists
Constants to use when converting.
Returns
-------
float
The converted magnitude in SDSS or BVRI system.
'''
if jmag is not None:
if hmag is not None:
if kmag is not None:
return cjhk[0] + cjhk[1]*jmag + cjhk[2]*hmag + cjhk[3]*kmag
else:
return cjh[0] + cjh[1]*jmag + cjh[2]*hmag
else:
if kmag is not None:
return cjk[0] + cjk[1]*jmag + cjk[2]*kmag
else:
return cj[0] + cj[1]*jmag
else:
if hmag is not None:
if kmag is not None:
return chk[0] + chk[1]*hmag + chk[2]*kmag
else:
return ch[0] + ch[1]*hmag
else:
if kmag is not None:
return ck[0] + ck[1]*kmag
else:
return np.nan
###############################
# conversion from JHK to BVRI #
###############################
[docs]def jhk_to_bmag(jmag, hmag, kmag):
'''Converts given J, H, Ks mags to a B magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted B band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
BJHK,
BJH, BJK, BHK,
BJ, BH, BK)
[docs]def jhk_to_vmag(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to a V magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted V band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
VJHK,
VJH, VJK, VHK,
VJ, VH, VK)
[docs]def jhk_to_rmag(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to an R magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted R band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
RJHK,
RJH, RJK, RHK,
RJ, RH, RK)
[docs]def jhk_to_imag(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to an I magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted I band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
IJHK,
IJH, IJK, IHK,
IJ, IH, IK)
#####################################
# conversion from JHK to SDSS ugriz #
#####################################
[docs]def jhk_to_sdssu(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to an SDSS u magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted SDSS u band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
SDSSU_JHK,
SDSSU_JH, SDSSU_JK, SDSSU_HK,
SDSSU_J, SDSSU_H, SDSSU_K)
[docs]def jhk_to_sdssg(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to an SDSS g magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted SDSS g band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
SDSSG_JHK,
SDSSG_JH, SDSSG_JK, SDSSG_HK,
SDSSG_J, SDSSG_H, SDSSG_K)
[docs]def jhk_to_sdssr(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to an SDSS r magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted SDSS r band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
SDSSR_JHK,
SDSSR_JH, SDSSR_JK, SDSSR_HK,
SDSSR_J, SDSSR_H, SDSSR_K)
[docs]def jhk_to_sdssi(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to an SDSS i magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted SDSS i band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
SDSSI_JHK,
SDSSI_JH, SDSSI_JK, SDSSI_HK,
SDSSI_J, SDSSI_H, SDSSI_K)
[docs]def jhk_to_sdssz(jmag,hmag,kmag):
'''Converts given J, H, Ks mags to an SDSS z magnitude value.
Parameters
----------
jmag,hmag,kmag : float
2MASS J, H, Ks mags of the object.
Returns
-------
float
The converted SDSS z band magnitude.
'''
return convert_constants(jmag,hmag,kmag,
SDSSZ_JHK,
SDSSZ_JH, SDSSZ_JK, SDSSZ_HK,
SDSSZ_J, SDSSZ_H, SDSSZ_K)
#########################################
## CONVERTING BETWEEN COUSINS AND SDSS ##
#########################################
# Smith et al. 2002: https://ui.adsabs.harvard.edu/#abs/2002AJ....123.2121S
# FIXME: implement the following tables
####################
## UBVRI -> ugriz ##
####################
# g = V + 0.54(B-V) - 0.07
# r = V - 0.44(B-V) + 0.12
# r for V-R < 1.00 = V - 0.81(V-R) + 0.13
# r for V-R > 1.00 = V - 0.84(V-R) + 0.13
# u-g = 1.33(U-B) + 1.12
# g-r = 0.98(B-V) - 0.19
# r-i for R-I < 1.15 = 1.00(R-I) - 0.21
# r-i for R-I > 1.15 = 1.42(R-I) - 0.69
# r-z for R-I < 1.65 = 1.65(R-I) - 0.38
# r-z for R-I > 1.65 = 2.64(R-I) - 2.16
####################
## ugriz -> UBVRI ##
####################
# B = g + 0.47(g-r) + 0.17
# V = g - 0.55(g-r) - 0.03
# U-B = 0.75(u-g) - 0.83
# B-V = 1.02(g-r) + 0.20
# V-R = 0.59(g-r) + 0.11
# R-I for r-i < 0.95 = 1.00(r-i) + 0.21
# R-I for r-i > 0.95 = 0.70(r-i) + 0.49
[docs]def absolute_gaia_magnitude(gaia_mag,
gaia_parallax_mas,
gaia_mag_err=None,
gaia_parallax_err_mas=None):
'''Calculates the GAIA absolute magnitude for object (or array of objects).
Given a G mag and the parallax measured by GAIA, gets the absolute mag using
the usual equation::
G - M_G = 5 x log10(d_pc) - 5
M_G = 5 - 5log10(d_pc) + G
Parameters
----------
gaia_mag : float or array-like
The measured GAIA G magnitude.
gaia_parallax_max : float or array-like
The measured parallax of the object in mas.
gaia_mag_err : float or array-like or None
The measurement error in GAIA G magnitude.
gaia_parallax_err_mas : float or array-like or None
The measurement error in GAIA parallax in mas.
Returns
-------
float or array-like
The absolute magnitude M_G of the object(s).
If both `_err` input kwargs are provided, will return a tuple of the form::
(M_G float or array-like, M_G_err float or array-like)
'''
# get the distance
# we're using the naive calculation of d. this is inaccurate as stated in
# Bailer-Jones 2015 (http://arxiv.org/abs/1507.02105) if the error in
# parallax is a significant fraction of parallax
d_pc = np.abs(1000.0/gaia_parallax_mas)
# get the distance error
if gaia_parallax_err_mas is not None:
d_pc_err = (
(1000.0/(gaia_parallax_mas*gaia_parallax_mas)) *
gaia_parallax_err_mas
)
else:
d_pc_err = None
# calculate the absolute mag from the relation
# FIXME: this is NOT corrected for extinction in G mag. see Jordi+ 2010
# (http://adsabs.harvard.edu/abs/2010A%26A...523A..48J) to figure out
# A_G/A_V as a function of (V-I)_0, then apply it here
M_G = 5 - 5.0*np.log10(d_pc) + gaia_mag
# calculate the err in M_G
if d_pc_err is not None and gaia_mag_err is not None:
M_G_err = np.sqrt(
((5.0/(d_pc * np.log(10.0)))**2 * (d_pc_err)**2) +
gaia_mag_err*gaia_mag_err
)
else:
M_G_err = None
if M_G_err is not None:
return M_G, M_G_err
else:
return M_G