r"""Parse pointing error parameters.
Pointing error is corrected by the following equation:
.. math::
\Delta x =& \chi \sin ( \omega - Az ) \sin ( El ) \\
&+ \epsilon \sin ( El ) \\
&+ \chi_2 \sin ( 2 ( \omega_2 - Az ) ) \sin ( El ) \\
&+ \mathrm{d}Az \cos ( El ) \\
&+ \mathrm{d}e \\
&+ \mathrm{cor}_v \cos ( El + \mathrm{cor}_p ) \\
&+ \mathrm{d}e_\mathrm{radio} \\
\Delta Az =& \Delta x / \cos ( El ) \\
\Delta y =& - \chi \cos ( \omega - Az ) \\
&- \chi_2 \cos ( 2 ( \omega_2 - Az ) ) \\
&+ g_1 \cos ( El ) + g_2 \sin ( El ) \\
&+ \mathrm{d} el \\
&+ g_{ 1,\mathrm{radio} } \cos ( El ) + g_{ 2,\mathrm{radio} } \sin ( El ) \\
&- \mathrm{cor}_v \sin ( El + \mathrm{cor}_p ) \\
&+ \mathrm{d}el_\mathrm{radio} \\
\Delta El =& \Delta y
"""
__all__ = ["PointingError"]
import os
from typing import Any, Dict
try:
from typing import Annotated
except ImportError:
from typing_extensions import Annotated # For Python<3.9
import astropy.units as u
from tomlkit.toml_file import TOMLFile
from .data_format import DataClass
[docs]class PointingError(DataClass):
"""Errors of telescope and its system installation.
Notes
-----
All quantities with [arcsec] are offset or inclination of somewhere
in the system. Quantities with [deg] are phases of offsets.
Quantities with [dimensionless] are coefficients of polynomial
fitting.
"""
dAz: Annotated[float, u.arcsec] = None
"""Offset of encoder reading."""
de: Annotated[float, u.arcsec] = None
"""Az offset."""
chi_Az: Annotated[float, u.arcsec] = None
"""Offset from Az axis inclination."""
omega_Az: Annotated[float, u.deg] = None
"""Phase of Az axis inclination."""
eps: Annotated[float, u.arcsec] = None
"""Az-El axes skew angle."""
chi2_Az: Annotated[float, u.arcsec] = None
"""Offset from 180 deg periodic error."""
omega2_Az: Annotated[float, u.deg] = None
"""Phase of 180 deg periodic error."""
chi_El: Annotated[float, u.arcsec] = None
"""Offset from Az axis inclination."""
omega_El: Annotated[float, u.deg] = None
"""Phase of Az axis inclination."""
chi2_El: Annotated[float, u.arcsec] = None
"""Offset from 180 deg periodic error."""
omega2_El: Annotated[float, u.deg] = None
"""Phase of 180 deg periodic error."""
g: Annotated[float, u.dimensionless_unscaled] = None
"""Optical gravitational deflection."""
gg: Annotated[float, u.dimensionless_unscaled] = None
"""Optical gravitational deflection."""
ggg: Annotated[float, u.dimensionless_unscaled] = None
"""Optical gravitational deflection."""
gggg: Annotated[float, u.dimensionless_unscaled] = None
"""Optical gravitational deflection."""
dEl: Annotated[float, u.arcsec] = None
"""Offset of encoder reading."""
de_radio: Annotated[float, u.arcsec] = None
"""Az offset."""
dEl_radio: Annotated[float, u.arcsec] = None
cor_v: Annotated[float, u.arcsec] = None
"""Offset from collimation error."""
cor_p: Annotated[float, u.deg] = None
"""Phase of collimation error."""
g_radio: Annotated[float, u.dimensionless_unscaled] = None
"""Radio gravitational deflection."""
gg_radio: Annotated[float, u.dimensionless_unscaled] = None
"""Radio gravitational deflection."""
ggg_radio: Annotated[float, u.dimensionless_unscaled] = None
"""Radio gravitational deflection."""
gggg_radio: Annotated[float, u.dimensionless_unscaled] = None
"""Radio gravitational deflection."""
def __init__(self, **kwargs) -> None:
kwargs = self._make_quantity(kwargs)
super().__init__(**kwargs)
def _make_quantity(self, parameters: Dict[str, Any]) -> Dict[str, u.Quantity]:
for (name, field_type) in self.__annotations__.items():
try:
parameters[name] *= field_type.__metadata__[0]
except TypeError:
raise ValueError(f"Parameter {name} should be given via kisa-file.")
return parameters
[docs] @classmethod
def from_file(cls, path: os.PathLike, key: str = "pointing_params"):
"""Parse toml file.
Parameters
----------
path
Path to pointing error parameter file.
key
Table name in the TOML file.
"""
params = TOMLFile(path).read()
return cls(**params[key])