Source code for exosim.tasks.detector.accumulateSubExposures
from typing import List
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"
):
if (
state_machine[chunk[0].start - 1]
== state_machine[chunk[0].start]
):
offset = subexposures.dataset[chunk[0].start - 1]
else:
offset = np.zeros_like(
subexposures.dataset[chunk[0].start - 1]
)
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