Source code for exosim.tasks.detector.applySimpleSaturation
from copy import deepcopy
import numpy as np
from exosim.models.signal import Counts
from exosim.tasks.task import Task
from exosim.utils.checks import check_units
from exosim.utils.iterators import iterate_over_chunks
[docs]class ApplySimpleSaturation(Task):
r"""
This Task applies a simple model of saturation to pixel counts.
If the counts in a pixel are higher than the well depth, the counts are set to the well capacity.
"""
def __init__(self):
"""
Parameters
----------
subexposures: :class:`~exosim.models.signal.Counts`
sub-exposures cached signal
parameters: dict
channel parameters dictionary
"""
self.add_task_param("subexposures", " ")
self.add_task_param("parameters", "channel parameters dictionary")
[docs] def execute(self):
self.info("applying saturation")
subexposures = self.get_task_param("subexposures")
parameters = self.get_task_param("parameters")
self.model(subexposures, parameters)
[docs] def model(self, subexposures: Counts, parameters: dict) -> None:
"""
Applies the saturation model to the subexposures.
Parameters
----------
subexposures : Counts
The subexposures to be saturated.
parameters : dict
Dictionary containing saturation parameters like 'detector' and 'well_depth'.
Returns
-------
None
"""
sat = parameters["detector"]["well_depth"]
sat = check_units(sat, "ct", force=True).value
self.info("saturation: {}".format(sat))
self.info("max counts: {}".format(np.max(subexposures.dataset)))
for chunk in iterate_over_chunks(
subexposures.dataset, desc="applying pixel saturation"
):
data = deepcopy(subexposures.dataset[chunk])
data[data > sat] = sat
subexposures.dataset[chunk] = data
subexposures.output.flush()