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