Source code for gwcs.coordinate_frames._spectral
import warnings
import numpy as np
from astropy import coordinates as coord
from astropy import units as u
from ._core import CoordinateFrame
__all__ = ["SpectralFrame"]
[docs]
class SpectralFrame(CoordinateFrame):
"""
Represents Spectral Frame
Parameters
----------
axes_order : tuple or int
A dimension in the input data that corresponds to this axis.
reference_frame : astropy.coordinates.builtin_frames
Reference frame (usually used with output_frame to convert to world
coordinate objects).
unit : str or units.Unit instance
Spectral unit.
axes_names : str
Spectral axis name.
name : str
Name for this frame.
"""
def __init__(
self,
axes_order=(0,),
reference_frame=None,
unit=None,
axes_names=None,
name=None,
axis_physical_types=None,
):
if not np.iterable(unit):
unit = (unit,)
unit = [u.Unit(un) for un in unit]
pht = axis_physical_types or self._default_axis_physical_types(unit)
super().__init__(
naxes=1,
axes_type="SPECTRAL",
axes_order=axes_order,
axes_names=axes_names,
reference_frame=reference_frame,
unit=unit,
name=name,
axis_physical_types=pht,
)
def _default_axis_physical_types(self, unit):
if unit[0].physical_type == "frequency":
return ("em.freq",)
if unit[0].physical_type == "length":
return ("em.wl",)
if unit[0].physical_type == "energy":
return ("em.energy",)
if unit[0].physical_type == "speed":
warnings.warn(
"Physical type may be ambiguous. Consider "
"setting the physical type explicitly as "
"either 'spect.dopplerVeloc.optical' or "
"'spect.dopplerVeloc.radio'."
)
return ("spect.dopplerVeloc",)
return (f"custom:{unit[0].physical_type}",)
@property
def world_axis_object_classes(self):
return {"spectral": (coord.SpectralCoord, (), {"unit": self.unit[0]})}
@property
def _native_world_axis_object_components(self):
return [("spectral", 0, lambda sc: sc.to_value(self.unit[0]))]