Source code for exosim.tasks.detector.accumulate_sub_exposures

import numpy as np
from numba import jit

from exosim.tasks.task import Task
from exosim.utils.iterators import iterate_over_chunks


[docs] class AccumulateSubExposures(Task): """ It accumulates sub-exposures of the same ramp. """ def __init__(self): """ Parameters ---------- subexposures: :class:`~exosim.models.signal.Counts` sub-exposures cached signal state_machine: :class:`numpy.ndarray` array indicating the exposures number of each sub-exposure. ` """ self.add_task_param("subexposures", "sub-exposures cached signal") self.add_task_param("state_machine", "ramp state machine")
[docs] def execute(self) -> None: self.info("accumulating sub-exposures") subexposures = self.get_task_param("subexposures") state_machine = self.get_task_param("state_machine") for chunk in iterate_over_chunks( subexposures.dataset, desc="accumulating sub-exposures" ): start = chunk[0].start # the first chunk has no preceding sub-exposure; carrying an offset # over from ``start - 1`` (which wraps to the last frame) would # corrupt the ramp, e.g. for a single-exposure state machine. if start > 0 and state_machine[start - 1] == state_machine[start]: offset = subexposures.dataset[start - 1] else: offset = np.zeros_like(subexposures.dataset[start]) subexposures.dataset[chunk] = self.sub_exposures_cumsum( subexposures.dataset[chunk], state_machine[chunk[0]], offset ) subexposures.output.flush()
@staticmethod @jit(nopython=True)
[docs] def sub_exposures_cumsum( dset: np.ndarray, state_machine: list[int], offset: list[int] ) -> np.ndarray: dset[0] += offset for i in range(1, dset.shape[0]): if state_machine[i] == state_machine[i - 1]: dset[i] += dset[i - 1] return dset