Source code for exosim.tasks.instrument.computeSaturation
from copy import copy
import astropy.units as u
import numpy as np
from exosim.models.signal import CountsPerSecond, Signal
from exosim.tasks.task import Task
from exosim.utils.checks import check_units
[docs]class ComputeSaturation(Task):
"""
It computes the saturation time given the focal plane and the detector parameters.
Returns
--------
:class:`~astropy.units.Quantity`
saturation time
:class:`~astropy.units.Quantity`
frame time
:class:`~astropy.units.Quantity`
maximum signal
:class:`~astropy.units.Quantity`
minimum signal
"""
def __init__(self):
"""
Parameters
__________
well_depth: :class:`~astropy.units.Quantity`
detector well depth
f_well_depth: float
fraction of detector well depth to use
focal_plane: :class:`~astropy.units.Quantity`
focal plane array (with time evolution)
frg_focal_plane: :class:`~astropy.units.Quantity`
foreground focal plane array (with time evolution)
"""
self.add_task_param("well_depth", "detector well depth")
self.add_task_param(
"f_well_depth", "fraction of detector well depth to use", None
)
self.add_task_param("focal_plane", "focal plane")
self.add_task_param("frg_focal_plane", "foreground focal plane", None)
[docs] def execute(self):
well_depth = self.get_task_param("well_depth")
f_well_depth = self.get_task_param("f_well_depth")
focal_plane = self.get_task_param("focal_plane")
frg_focal_plane = self.get_task_param("frg_focal_plane")
well_depth = check_units(
well_depth, desired_units=u.ct, calling_class=self
)
if isinstance(focal_plane, (Signal, CountsPerSecond)):
focal_plane = focal_plane.data * focal_plane.data_units
else:
focal_plane = check_units(
focal_plane, desired_units=u.ct / u.s, calling_class=self
)
if frg_focal_plane is not None:
if isinstance(frg_focal_plane, (Signal, CountsPerSecond)):
frg_focal_plane = (
frg_focal_plane.data * frg_focal_plane.data_units
)
else:
frg_focal_plane = check_units(
frg_focal_plane,
desired_units=u.ct / u.s,
calling_class=self,
)
focal_plane += frg_focal_plane
max_signal = np.max(focal_plane)
min_signal = np.min(focal_plane)
saturation_time = well_depth / max_signal
self.debug("saturation time : {}".format(saturation_time))
integration_time = copy(saturation_time)
if f_well_depth is not None:
integration_time *= f_well_depth
self.debug("integration_time time : {}".format(integration_time))
self.set_output(
[saturation_time, integration_time, max_signal, min_signal]
)