import numpy as np
from .models.enum_models import WavelengthUnit, FluxUnit
#https://en.wikipedia.org/wiki/AB_magnitude
[docs]def fnu_to_abmag(fnu):
if fnu <= 0:
return None
else:
return -2.5 * np.log10(fnu) - 48.60
[docs]def fnu_to_flambda(fnu, lam, wavelength_unit):
if wavelength_unit == WavelengthUnit.NANOMETER:
lam = lam * 10.0
return 1.0 / (10 ** -23 * 3.33564095 * 10 ** 4 * (lam) ** 2) * fnu
[docs]def fnu_to_jansky(fnu):
return fnu * 10**23
[docs]def flambda_to_fnu(flam, lam, wavelength_unit):
if wavelength_unit == WavelengthUnit.NANOMETER:
lam = lam * 10.0
return 10 ** -23 * 3.33564095 * 10 ** 4 * (lam) ** 2 * flam
[docs]def flambda_to_abmag(flam,lam, wavelength_unit):
return fnu_to_abmag(flambda_to_fnu(flam,lam,wavelength_unit))
[docs]def flambda_to_jansky(flam,lam, wavelength_unit):
return fnu_to_jansky(flambda_to_fnu(flam,lam,wavelength_unit))
[docs]def abmag_to_fnu(abmag):
return 10.0 ** ((abmag + 48.60) / -2.5)
[docs]def abmag_to_flambda(abmag,lam, wavelength_unit):
return fnu_to_flambda(abmag_to_fnu(abmag),lam,wavelength_unit)
[docs]def abmag_to_jansky(abmag):
return fnu_to_jansky(abmag_to_fnu(abmag))
[docs]def jansky_to_fnu(jy):
return jy * 10**-23
[docs]def jansky_to_flambda(jy, lam, wavelength_unit):
return fnu_to_flambda(jansky_to_fnu(jy), lam, wavelength_unit)
[docs]def jansky_to_absmag(jy):
return fnu_to_abmag(jansky_to_fnu(jy))
[docs]def convert_flux(flux = [], wavelength = [], from_flux_unit = FluxUnit.F_lambda, to_flux_unit = FluxUnit.F_lambda, to_wavelength_unit=WavelengthUnit.ANGSTROM):
if from_flux_unit != to_flux_unit and from_flux_unit is not None:
if from_flux_unit == FluxUnit.F_lambda and to_flux_unit == FluxUnit.F_nu:
return [flambda_to_fnu(flam, wavelength[i], to_wavelength_unit) if flam is not None else None for (i, flam) in enumerate(flux)]
elif from_flux_unit == FluxUnit.F_lambda and to_flux_unit == FluxUnit.AB_magnitude:
return [flambda_to_abmag(flam, wavelength[i], to_wavelength_unit) if flam is not None else None for (i, flam) in enumerate(flux)]
elif from_flux_unit == FluxUnit.F_lambda and to_flux_unit == FluxUnit.Jansky:
return [flambda_to_jansky(flam, wavelength[i], to_wavelength_unit) if flam is not None else None for (i, flam) in enumerate(flux)]
elif from_flux_unit == FluxUnit.F_nu and to_flux_unit == FluxUnit.F_lambda:
return [fnu_to_flambda(fnu, wavelength[i], to_wavelength_unit) if fnu is not None else None for (i, fnu) in enumerate(flux)]
elif from_flux_unit == FluxUnit.F_nu and to_flux_unit == FluxUnit.AB_magnitude:
return [fnu_to_abmag(fnu) if fnu is not None else None for fnu in flux]
elif from_flux_unit == FluxUnit.F_nu and to_flux_unit == FluxUnit.Jansky:
return [fnu_to_jansky(fnu) if fnu is not None else None for fnu in flux]
elif from_flux_unit == FluxUnit.AB_magnitude and to_flux_unit == FluxUnit.F_lambda:
return [abmag_to_flambda(absmag, wavelength[i], to_wavelength_unit) if absmag is not None else None for (i, absmag) in enumerate(flux)]
elif from_flux_unit == FluxUnit.AB_magnitude and to_flux_unit == FluxUnit.F_nu:
return [abmag_to_fnu(absmag) if absmag is not None else None for (i, absmag) in enumerate(flux)]
elif from_flux_unit == FluxUnit.AB_magnitude and to_flux_unit == FluxUnit.Jansky:
return [abmag_to_jansky(abmag) if abmag is not None else None for (i, abmag) in enumerate(flux)]
elif from_flux_unit == FluxUnit.Jansky and to_flux_unit == FluxUnit.F_lambda:
return [jansky_to_flambda(jy, wavelength[i], to_wavelength_unit) if jy is not None else None for (i, jy) in enumerate(flux)]
elif from_flux_unit == FluxUnit.Jansky and to_flux_unit == FluxUnit.F_nu:
return [jansky_to_fnu(jy) if jy is not None else None for (i, jy) in enumerate(flux)]
elif from_flux_unit == FluxUnit.Jansky and to_flux_unit == FluxUnit.AB_magnitude:
return [jansky_to_absmag(jy) if jy is not None else None for (i, jy) in enumerate(flux)]
else:
raise Exception(
"Unsupported unit " + str(to_flux_unit) + " . Parameter to_flux_unit takes values from class FluxUnit.")
else:
return [x for x in flux]
[docs]def convert_wavelength(wavelength, from_wavelength_unit=WavelengthUnit.ANGSTROM, to_wavelength_unit=WavelengthUnit.ANGSTROM):
if from_wavelength_unit != to_wavelength_unit and to_wavelength_unit is not None:
if from_wavelength_unit == WavelengthUnit.ANGSTROM and to_wavelength_unit == WavelengthUnit.NANOMETER:
return [x / 10.0 for x in wavelength]
elif from_wavelength_unit == WavelengthUnit.NANOMETER and to_wavelength_unit == WavelengthUnit.ANGSTROM:
return [x * 10.0 for x in wavelength]
else:
raise Exception("Unsupported unit " + str(
to_wavelength_unit) + " . Parameter to_wavelength_unit takes values from class WavelengthUnit.")
else:
return [x for x in wavelength]