Source code for exosim.tasks.radiometric.computePhotonNoise
from exosim.tasks.task import Task
[docs]class ComputePhotonNoise(Task):
r"""
Computes the photon noise.
Given the incoming signal :math:`S` the resulting photon noise variance is :math:`Var[S]=S`.
If photon gain factor :math:`gain_{phot}` is given, then :math:`Var[S]= gain_{phot} \cdot Var[S]`.
If photon noise margin :math:`\chi` is found in the description, then :math:`Var[S]= (1+\chi) \cdot Var[S]`.
The noise returned is :math:`\sigma = \sqrt{Var[S]}`
Returns
-------
astropy.table.QTable:
photon noise
"""
def __init__(self):
"""
Parameters
----------
signal: :class:`astropy.units.Quantity`
signal
description: dic (optional)
channel description
multiaccum_gain: :class:`numpy.ndarray` (optional)
multiaccum gain factor for shotnoise
"""
self.add_task_param("signal", "signal array")
self.add_task_param("description", "channel description", None)
self.add_task_param("multiaccum_gain", "channel description", None)
[docs] def execute(self):
self.debug("compute photon noise")
signal = self.get_task_param("signal")
description = self.get_task_param("description")
multiaccum_gain = self.get_task_param("multiaccum_gain")
variance = signal * signal.unit
if description:
if "photon_margin" in description["radiometric"].keys():
self.debug(
"photon margin found: {}".format(
description["radiometric"]["photon_margin"]
),
)
variance *= 1 + description["radiometric"]["photon_margin"]
if multiaccum_gain is not None:
variance *= multiaccum_gain
self.set_output(variance**0.5)