Source code for exosim.tools.quantumEfficiencyMap

import astropy.units as u
import numpy as np
from scipy.interpolate import interp1d

import exosim.models.signal as signal
import exosim.utils as utils
from exosim.output import SetOutput
from exosim.utils import RunConfig, check_units

from .exosimTool import ExoSimTool


[docs]class QuantumEfficiencyMap(ExoSimTool): """ Produces the channels quantum efficiency variation map Returns -------- dict: channels' quantum efficiency map Raises ------ TypeError: if the output is not a :class:`~exosim.models.signal.Signal` class Examples ---------- >>> import exosim.tools as tools >>> >>> results = tools.QuantumEfficiencyMap(options_file='tools_input_example.xml', >>> output='output_qe_map.h5') """ def __init__(self, options_file, output=None): """ Parameters __________ parameters: str or dict dictionary containing the parameters. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions` output: str (optional) output file """ super().__init__(options_file) self.info("creating qe map") time_grid = utils.grids.time_grid( self.options["time_grid"]["start_time"], self.options["time_grid"]["end_time"], self.options["time_grid"]["low_frequencies_resolution"], ) output = SetOutput(output) with output.use() as out: for ch in self.ch_list: qe_map = self.model(self.ch_param[ch], time_grid) self.results.update({ch: qe_map}) self.debug("qe variation map: {}".format(qe_map.data)) qe_map.write(out, ch)
[docs] def model(self, parameters, time): """ Parameters ---------- parameters: dict dictionary contained the sources parameters. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions` time: :class:`~astropy.units.Quantity` time grid. Returns -------- :class:`~exosim.models.signal.Signal` channel quantum efficiency map """ # variance map variance_map = RunConfig.random_generator.normal( 1, parameters["detector"]["qe_sigma"], ( 1, parameters["detector"]["spatial_pix"], parameters["detector"]["spectral_pix"], ), ) t = [0] * u.hr # temporal variation if "qe_aging_factor" in parameters["detector"].keys(): t0 = parameters["detector"]["qe_aging_time_scale"] t0 = check_units(t0, u.hr, force=True) # creates the aging effect qe_aging = RunConfig.random_generator.normal( 1, parameters["detector"]["qe_aging_factor"], ( 1, parameters["detector"]["spatial_pix"], parameters["detector"]["spectral_pix"], ), ) # remove values greater than 1, because QE should become smaller qe_aging[qe_aging > 1] = 2 - qe_aging[qe_aging > 1] # create the map evolution over time variance_map = np.vstack((variance_map, variance_map * qe_aging)) t = np.hstack((t, t0)) variance_map = variance_map.reshape( t.size, variance_map.shape[1] * variance_map.shape[2] ) f = interp1d(t, variance_map, fill_value="extrapolate", axis=0) variance_map = f(time) variance_map = variance_map.reshape( time.size, parameters["detector"]["spatial_pix"], parameters["detector"]["spectral_pix"], ) t = time qe_map = signal.Dimensionless( data=variance_map, spectral=np.arange(0, parameters["detector"]["spectral_pix"]) * u.pix, time=t, ) qe_map.temporal_rebin(time) return qe_map