Source code for exosim.tasks.subexposures.estimatePointingJitter
import astropy.units as u
import numpy as np
import exosim.output as output
import exosim.utils as utils
from exosim.tasks.task import Task
from exosim.utils import RunConfig
from exosim.utils.checks import check_units
[docs]class EstimatePointingJitter(Task):
"""
Produces the telescope pointing jitter expressed as deg on the line of sight.
Returns
--------
:class:`~astropy.units.Quantity`,
pointing jitter in the spatial and spectral direction expressed in units of :math:`deg`.
:class:`~astropy.units.Quantity`
pointing jitter in the spatial and spectral direction expressed in units of :math:`deg`.
:class:`~astropy.units.Quantity`
pointing jitter in the spatial and spectral direction expressed in units of :math:`deg`.
Raises
------
TypeError:
if the output is not a :class:`~astropy.units.Quantity` class
Notes
-----
This is a default class with standardised inputs and outputs.
The user can load this class and overwrite the "model" method
to implement a custom Task to replace this.
"""
def __init__(self):
"""
Parameters
__________
parameters: dict
dictionary containing the parameters. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions`
output: :class:`~exosim.output.output.Output` (optional)
output file
"""
self.add_task_param("parameters", "main parameters dict")
self.add_task_param("output_file", "output file", None)
[docs] def execute(self):
self.info("estimating pointing jitter")
main_parameters = self.get_task_param("parameters")
jitter_spa, jitter_spe, jitter_time = self.model(main_parameters)
# checking output
if not isinstance(jitter_spa, u.Quantity):
self.error("wrong output format")
raise TypeError("wrong output format")
if not isinstance(jitter_spe, u.Quantity):
self.error("wrong output format")
raise TypeError("wrong output format")
if not isinstance(jitter_time, u.Quantity):
self.error("wrong output format")
raise TypeError("wrong output format")
# converting into dec
jitter_spa = utils.check_units(jitter_spa, u.deg)
jitter_spe = utils.check_units(jitter_spe, u.deg)
jitter_time = utils.check_units(jitter_time, u.s)
self.debug("pointing jitter: {} {}".format(jitter_spa, jitter_spe))
output_file = self.get_task_param("output_file")
if output_file:
if issubclass(output_file.__class__, output.Output):
store_dict = {
"jitter_spa": jitter_spa,
"jitter_spe": jitter_spe,
"jitter_time": jitter_time,
}
output_file.store_dictionary(store_dict, "pointing_jitter")
self.set_output([jitter_spa, jitter_spe, jitter_time])
[docs] def model(self, parameters):
"""
This default model builds the pointing jitter using random values.
Starting from the spectral and spatial standard deviations, expressed as angles,
it computes the pointing position as normally distributed around zero in the two direction.
The input dictionary, under the `jitter` keyword, must contain `spatial` and `spectral` keyword for the standard deviation.
The time grid is built using the `high_frequencies_resolution` under the `time_grid` keyword.
Parameters
__________
parameters: dict
dictionary containing the parameters. This is usually parsed from :class:`~exosim.tasks.load.loadOptions.LoadOptions`
Returns
--------
:class:`~astropy.units.Quantity`
pointing jitter in the spatial direction expressed in units of :math:`deg`.
:class:`~astropy.units.Quantity`)
pointing jitter in the spectral direction expressed in units of :math:`deg`.
:class:`~astropy.units.Quantity`)
pointing jitter timeline expressed in units of :math:`s`.
"""
jitter_time_step = check_units(
parameters["jitter"]["frequency_resolution"], "s"
)
jitter_time = utils.grids.time_grid(
parameters["time_grid"]["start_time"],
parameters["time_grid"]["end_time"]
+ 1 * parameters["time_grid"]["end_time"].unit,
jitter_time_step,
)
jitter_spa = (
RunConfig.random_generator.normal(
0, parameters["jitter"]["spatial"].value, jitter_time.size
)
* parameters["jitter"]["spatial"].unit
)
jitter_spe = (
RunConfig.random_generator.normal(
0, parameters["jitter"]["spectral"].value, jitter_time.size
)
* parameters["jitter"]["spectral"].unit
)
return jitter_spa, jitter_spe, jitter_time