Source code for exosim.tasks.detector.applyPixelsNonLinearity
from copy import deepcopy
import h5py
import numpy as np
from exosim.models.signal import Counts
from exosim.tasks.task import Task
from exosim.utils.iterators import iterate_over_chunks
from exosim.utils.types import HDF5OutputType
[docs]class ApplyPixelsNonLinearity(Task):
r"""
Given the pixel non-linearity parameters,
this Task correct the ideal measured signal rate to the pixel linearity.
.. math::
Q_{det} = Q \cdot (a + b \cdot Q + c \cdot Q^2 + d \cdot Q^3 + e \cdot Q^4)
The input is a dictionary with a `map` keyword containg an array with the coefficients for each pixel.
The map shape is (n_pixels_x, n_pixels_y, coefficient order).
The user can list any number of coefficients, that will be parsed in the following model
.. math::
Q_{det} = Q \cdot (a_0 + \sum_i a_i \cdot Q^i)
"""
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 non linearity dictionary")
[docs] def execute(self):
self.info("applying pixel non-linearity map")
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:
pnl_map = parameters["map"][:]
for chunk in iterate_over_chunks(
subexposures.dataset, desc="applying pixel non-linearity map"
):
data = deepcopy(subexposures.dataset[chunk])
npl = 0
for i in range(0, len(pnl_map)):
npl += data ** (i + 1) * np.repeat(
pnl_map[np.newaxis, i], data.shape[0], axis=0
)
subexposures.dataset[chunk] = npl
subexposures.output.flush()