Source code for gwcs.wcs._step
import warnings
from typing import NamedTuple, TypeAlias, Union
from astropy.modeling.core import Model
from gwcs.coordinate_frames import CoordinateFrame, EmptyFrame
__all__ = [
"IndexedStep",
"Step",
"StepTuple",
]
StepTuple: TypeAlias = tuple[CoordinateFrame, Union[Model, None]] # noqa: UP007
[docs]
class Step:
"""
Represents a ``step`` in the WCS pipeline.
Parameters
----------
frame : `~gwcs.coordinate_frames.CoordinateFrame`
A gwcs coordinate frame object.
transform : `~astropy.modeling.Model` or None
A transform from this step's frame to next step's frame.
The transform of the last step should be `None`.
"""
def __init__(self, frame: str | CoordinateFrame | None, transform=None):
# Allow for a string to be passed in for the frame but be turned into a
# frame object
self.frame = (
frame if isinstance(frame, CoordinateFrame) else EmptyFrame(name=frame)
)
self.transform = transform
@property
def frame(self):
return self._frame
@frame.setter
def frame(self, val):
if not isinstance(val, CoordinateFrame | str):
msg = '"frame" should be an instance of CoordinateFrame or a string.'
raise TypeError(msg)
self._frame = val
@property
def transform(self):
return self._transform
@transform.setter
def transform(self, val):
if val is not None and not isinstance(val, (Model)):
msg = '"transform" should be an instance of astropy.modeling.Model.'
raise TypeError(msg)
self._transform = val
@property
def frame_name(self):
if isinstance(self.frame, str):
return self.frame
return self.frame.name
def __getitem__(self, ind):
warnings.warn(
"Indexing a WCS.pipeline step is deprecated. "
"Use the `frame` and `transform` attributes instead.",
DeprecationWarning,
stacklevel=2,
)
if ind not in (0, 1):
msg = "Allowed inices are 0 (frame) and 1 (transform)."
raise IndexError(msg)
if ind == 0:
return self.frame
return self.transform
def __str__(self):
return (
f"{self.frame_name}\t "
f"{getattr(self.transform, 'name', 'None') or type(self.transform).__name__}" # noqa: E501
)
def __repr__(self):
return (
f"Step(frame={self.frame_name}, "
f"transform={getattr(self.transform, 'name', 'None') or type(self.transform).__name__})" # noqa: E501
)
[docs]
def copy(self):
return Step(self.frame, self.transform)
class IndexedStep(NamedTuple):
"""
Class to handle a step and its index in the pipeline.
"""
index: int
step: Step