Source code for exosim.tasks.subexposures.estimateChJitter

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

import exosim.utils as utils
from exosim.tasks.instrument.computeSourcesPointingOffset import angle_of_view
from exosim.tasks.task import Task
from exosim.utils.checks import check_units


[docs]class EstimateChJitter(Task): """ It scales the pointing jitter expressed as :math:`deg` into the pixel unit according to the channel plate scale and interpolates it to a time grid which is aligned to the detector readout time grid. Returns -------- (:class:`~numpy.ndarray`, :class:`~numpy.ndarray`) Tuple containing the pointing jitter in the spatial and spectral direction expressed in units of pixels. """ def __init__(self): """ Parameters __________ pointing_jitter: (:class:`~astropy.units.Quantity`, :class:`~astropy.units.Quantity`, :class:`~astropy.units.Quantity`) Tuple containing the pointing jitter in the spatial and spectral direction expressed in units of deg. parameters: dict dictionary containing the channel parameters. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions` """ self.add_task_param("pointing_jitter", " ") self.add_task_param("parameters", "channel parameters dict")
[docs] def execute(self): parameters = self.get_task_param("parameters") jitter_spa, jitter_spe, jitter_time = self.get_task_param( "pointing_jitter" ) jitter_time = check_units(jitter_time, "s") jitter_time_step = jitter_time[1] - jitter_time[0] jitter_freq = check_units(jitter_time_step, "Hz") readout_freq = check_units( parameters["readout"]["readout_frequency"], "Hz" ) new_freq = ( np.ceil(jitter_freq.value / readout_freq.value) * readout_freq ) new_step = check_units(new_freq, "s") new_jitter_time = utils.grids.time_grid( jitter_time[0], jitter_time[-1], new_step ) new_jitter_time = new_jitter_time.to(u.s) jitter_spe_inter = interp1d(jitter_time, jitter_spe) jitter_spe = jitter_spe_inter(new_jitter_time) * jitter_spe.unit jitter_spa_inter = interp1d(jitter_time, jitter_spa) jitter_spa = jitter_spa_inter(new_jitter_time) * jitter_spa.unit aov_spatial, aov_spectral = angle_of_view( parameters["detector"]["plate_scale"], parameters["detector"]["delta_pix"], parameters["detector"]["oversampling"], ) offset_spatial = jitter_spa.to(u.deg) / aov_spatial offset_spectral = jitter_spe.to(u.deg) / aov_spectral self.set_output( [ jitter_spe, jitter_spa, offset_spatial, offset_spectral, new_jitter_time, ] )