Source code for exosim.tasks.instrument.loadResponsivity
import astropy.constants as const
import astropy.units as u
import exosim.models.signal as signal
from exosim.tasks.task import Task
[docs]class LoadResponsivity(Task):
"""
Returns the channel responsivity (in counts/Joule) from the quantum efficiency (QE)
This default implementation loads the quantum efficiency from the input parameters,
then converts it to responsivity using the relation:
R(λ) = QE(λ) × λ / (h × c)
where λ is the wavelength, h is Planck’s constant and c is the speed of light.
Returns
--------
:class:`~exosim.models.signal.Signal`
channel responsivity
Raises
------
TypeError:
if the output is not a :class:`~exosim.models.signal.Signal` class
UnitConversionError
if the output has not the right units (counts/Joule)
Notes
-----
This is a default class with standardised inputs and outputs.
The user can load this class and overwrite the "model" method
to implement a custom Task to replace this.
"""
def __init__(self):
"""
Parameters
__________
parameters: dict
dictionary containing the parameters. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions`
wavelength: :class:`~astropy.units.Quantity`
wavelength grid.
time: :class:`~astropy.units.Quantity`
time grid
"""
self.add_task_param("parameters", "parameters dict")
self.add_task_param("wavelength", "wavelength grid")
self.add_task_param("time", "time grid")
[docs] def execute(self):
parameters = self.get_task_param("parameters")
wl = self.get_task_param("wavelength")
tt = self.get_task_param("time")
responsivity = self.model(parameters, wl, tt)
# checking output
if not isinstance(responsivity, signal.Signal):
self.error("wrong output format")
raise TypeError("wrong output format")
try:
responsivity.data_units.to(u.m / const.c / const.h * u.count)
except u.UnitConversionError:
self.error(
"{} are not convertible in {}".format(
responsivity.data_units,
(u.m / const.c / const.h * u.count).unit,
)
)
raise u.UnitConversionError(
"{} are not convertible in {}".format(
responsivity.data_units,
(u.m / const.c / const.h * u.count).unit,
)
)
self.debug("responsivity: {}".format(responsivity.data))
self.set_output(responsivity)
[docs] def model(self, parameters, wavelength, time):
"""
Parameters
----------
parameters: dict
dictionary contained the channel parameters. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions`
wavelength: :class:`~astropy.units.Quantity`
wavelength grid.
time: :class:`~astropy.units.Quantity`
time grid.
Returns
--------
:class:`~exosim.models.signal.Signal`
channel responsivity
"""
qe_data = parameters["qe"]["data"]
wl_ = qe_data["Wavelength"]
qe_ = qe_data[parameters["value"]]
qe = signal.Dimensionless(data=qe_, spectral=wl_)
qe.spectral_rebin(wavelength)
qe.temporal_rebin(time)
responsivity = signal.Signal(
spectral=wavelength,
time=time,
data=qe.data * wavelength.to(u.m) / const.c / const.h * u.count,
)
return responsivity