diff --git a/docs/source/configuration/target.rst b/docs/source/configuration/target.rst index 5f96229..e006683 100644 --- a/docs/source/configuration/target.rst +++ b/docs/source/configuration/target.rst @@ -21,7 +21,7 @@ Model a target as a black body of a given temperature and apparent magnitude. .. code-block:: xml - + Attributes: * | **temp:** float @@ -32,8 +32,10 @@ Attributes: | The apparent magnitude of the black body in magnitudes. In case of None or magnitude per solid angle, an extended target is assumed. * | **mag_unit:** str, *optional* = "mag" | The unit of the black body's magnitude. This has to be [``mag``, ``mag / arcsec**2``, ``mag / sr``]. The default is ``mag``. - * | **band:** str + * | **band:** str, *optional* | The band used for fitting the black body's flux density to Vega's flux density. This has to be one of [``U``, ``B``, ``V``, ``R``, ``I``, ``J``, ``H``, ``K``, ``L``, ``M``, ``N``]. + * | **law:** str, *optional* + | The law used for the black body emission. This can be either ``Planck`` for using Planck's law or ``RJ`` for using the Rayleigh-Jeans approximation of Planck's law. .. _filetarget: diff --git a/esbo_etc/classes/target/BlackBodyTarget.py b/esbo_etc/classes/target/BlackBodyTarget.py index f8223cc..4479d80 100644 --- a/esbo_etc/classes/target/BlackBodyTarget.py +++ b/esbo_etc/classes/target/BlackBodyTarget.py @@ -2,6 +2,7 @@ from ..target.ATarget import ATarget from ..SpectralQty import SpectralQty import astropy.units as u from astropy.modeling.models import BlackBody +from astropy.constants import c, k_B from ...lib.logger import logger from ..Entry import Entry from typing import Union @@ -26,7 +27,7 @@ class BlackBodyTarget(ATarget): @u.quantity_input(wl_bins='length', temp=[u.Kelvin, u.Celsius], mag=[u.mag, u.mag / u.sr]) def __init__(self, wl_bins: u.Quantity, temp: u.Quantity = 5778 * u.K, mag: u.Quantity = None, - band: str = "V"): + band: str = "V", law: str = "Planck"): """ Initialize a new black body point source @@ -41,6 +42,9 @@ class BlackBodyTarget(ATarget): unit, an extended source will be assumed. band : str Band used for fitting the planck curve to a star of 0th magnitude. Can be one of [U, B, V, R, I, J, H, K]. + law : str + Which law to use for the calculation of the flux values. Can be either 'Planck' for using Planck's law or + 'RJ' to use the Rayleigh-Jeans approximation. Returns ------- @@ -48,8 +52,13 @@ class BlackBodyTarget(ATarget): if band.upper() not in self._band.keys(): logger.error("Band has to be one of '[" + ", ".join(list(self._band.keys())) + "]'") # Create blackbody model with given temperature - bb = BlackBody(temperature=temp, scale=1 * u.W / (u.m ** 2 * u.nm * u.sr)) - + bb = None + if law.lower() == "planck": + bb = BlackBody(temperature=temp, scale=1 * u.W / (u.m ** 2 * u.nm * u.sr)) + elif law.upper() == "RJ": + bb = self.__rayleigh_jeans_factory(temp) + else: + logger.error("Unknown law '" + law + "' for target type BlackBody.") if mag is not None: # Calculate the correction factor for a star of 0th magnitude using the spectral flux density # for the central wavelength of the given band @@ -67,6 +76,24 @@ class BlackBodyTarget(ATarget): # Initialize super class super().__init__(SpectralQty(wl_bins, sfd), wl_bins) + @staticmethod + @u.quantity_input(temp=[u.Kelvin, u.Celsius]) + def __rayleigh_jeans_factory(temp: u.Quantity): + """ + Create a lambda function for the Rayleigh-Jeans law + + Parameters + ---------- + temp : u.Quantity + The temperature in Kelvins + + Returns + ------- + res : lambda + A lambda function for the Rayleigh-Jeans law with the variable lambda wavelength + """ + return lambda wl: (2 * c * k_B * temp / wl ** 4 / u.sr).to(u.W / (u.m ** 2 * u.nm * u.sr)) + @staticmethod def check_config(conf: Entry) -> Union[None, str]: """ @@ -94,3 +121,7 @@ class BlackBodyTarget(ATarget): mes = conf.check_selection("band", ["U", "B", "V", "R", "I", "J", "H", "K", "L", "M", "N"]) if mes is not None: return mes + if hasattr(conf, "law"): + mes = conf.check_selection("law", ["Planck", "RJ"]) + if mes is not None: + return mes