Source code for gwcs.coordinate_frames._celestial
from astropy import coordinates as coord
from astropy import units as u
from ._core import CoordinateFrame
__all__ = ["CelestialFrame"]
STANDARD_REFERENCE_FRAMES = [frame.upper() for frame in coord.builtin_frames.__all__]
[docs]
class CelestialFrame(CoordinateFrame):
"""
Representation of a Celesital coordinate system.
This class has a native order of longitude then latitude, meaning
``axes_names``, ``unit`` and ``axis_physical_types`` should be lon, lat
ordered. If your transform is in a different order this should be specified
with ``axes_order``.
Parameters
----------
axes_order : tuple of int
A dimension in the input data that corresponds to this axis.
reference_frame : astropy.coordinates.builtin_frames
A reference frame.
unit : str or units.Unit instance or iterable of those
Units on axes.
axes_names : list
Names of the axes in this frame.
name : str
Name of this frame.
axis_physical_types : list
The UCD 1+ physical types for the axes, in frame order (lon, lat).
"""
def __init__(
self,
axes_order=None,
reference_frame=None,
unit=None,
axes_names=None,
name=None,
axis_physical_types=None,
):
if (
reference_frame is not None
and not isinstance(reference_frame, str)
and reference_frame.name.upper() in STANDARD_REFERENCE_FRAMES
):
_axes_names = list(reference_frame.representation_component_names.values())
if "distance" in _axes_names:
_axes_names.remove("distance")
if axes_names is None:
axes_names = _axes_names
naxes = len(axes_names) if axes_names is not None else 2
self.native_axes_order = tuple(range(naxes))
if axes_order is None:
axes_order = self.native_axes_order
if unit is None:
unit = tuple([u.degree] * naxes)
axes_type = ["SPATIAL"] * naxes
pht = axis_physical_types or self._default_axis_physical_types(
reference_frame, axes_names
)
super().__init__(
naxes=naxes,
axes_type=axes_type,
axes_order=axes_order,
reference_frame=reference_frame,
unit=unit,
axes_names=axes_names,
name=name,
axis_physical_types=pht,
)
def _default_axis_physical_types(self, reference_frame, axes_names):
if isinstance(reference_frame, coord.Galactic):
return "pos.galactic.lon", "pos.galactic.lat"
if isinstance(
reference_frame,
coord.GeocentricTrueEcliptic | coord.GCRS | coord.PrecessedGeocentric,
):
return "pos.bodyrc.lon", "pos.bodyrc.lat"
if isinstance(reference_frame, coord.builtin_frames.BaseRADecFrame):
return "pos.eq.ra", "pos.eq.dec"
if isinstance(reference_frame, coord.builtin_frames.BaseEclipticFrame):
return "pos.ecliptic.lon", "pos.ecliptic.lat"
return tuple(f"custom:{t}" for t in axes_names)
@property
def world_axis_object_classes(self):
return {
"celestial": (
coord.SkyCoord,
(),
{"frame": self.reference_frame, "unit": self._prop.unit},
)
}
@property
def _native_world_axis_object_components(self):
return [
("celestial", 0, lambda sc: sc.spherical.lon.to_value(self._prop.unit[0])),
("celestial", 1, lambda sc: sc.spherical.lat.to_value(self._prop.unit[1])),
]