Source code for exosim.tasks.detector.add_dark_current_map_numpy

from copy import deepcopy

import astropy.units as u
import numpy as np

from exosim.models.signal import Signal
from exosim.utils.checks import check_units
from exosim.utils.iterators import iterate_over_chunks
from exosim.utils.types import ArrayType

from .add_constant_dark_current import AddConstantDarkCurrent


[docs] class AddDarkCurrentMapNumpy(AddConstantDarkCurrent): """ It adds a dark current map to the array. The map must be indicated under the `dc_map_filename` keyword. The dark current is loaded from a NPY format file (see `numpy documentation <https://numpy.org/devdocs/reference/generated/numpy.lib.format.html>`_.). """
[docs] def model( self, subexposures: Signal, parameters: dict, integration_times: ArrayType, output=None, ) -> None: """ Parameters ---------- subexposures: :class:`~exosim.models.signal.Counts` sub-exposures cached signal parameters: dict channel parameters dictionary integration_times: :class:`~astropy.units.Quantity` sub-exposures integration times outputs: :class:`~exosim.output.output.Output` (optional) output file """ dc_file = parameters["detector"]["dc_map_filename"] dc = np.load(dc_file) dc = check_units(dc, "ct/s", force=True) if dc.shape != subexposures.dataset[0].shape: self.error( f"wrong shape: expected {subexposures.dataset[0].shape} but got {dc.shape}" ) raise OSError("Map dimensions do not match signal shape") self.info("dark current map loaded") for chunk in iterate_over_chunks( subexposures.dataset, desc="adding dark current" ): dc_map = ( dc[np.newaxis, :, :].value * integration_times[chunk[0], np.newaxis, np.newaxis].to(u.s).value ) data = deepcopy(subexposures.dataset[chunk]) subexposures.dataset[chunk] = data + dc_map subexposures.output.flush()