Source code for ndcube.wcs.wrappers.reordered_wcs



import numpy as np
from astropy.wcs.wcsapi.wrappers.base import BaseWCSWrapper

__all__ = ['ReorderedLowLevelWCS']


[docs] class ReorderedLowLevelWCS(BaseWCSWrapper): """ A wrapper for a low-level WCS object that has re-ordered pixel and/or world axes. Parameters ---------- wcs : `~astropy.wcs.wcsapi.BaseLowLevelWCS` The original WCS for which to reorder axes pixel_order : iterable The indices of the original axes in the order of the new WCS. world_order : iterable The indices of the original axes in the order of the new WCS. """ def __init__(self, wcs, pixel_order, world_order): if sorted(pixel_order) != list(range(wcs.pixel_n_dim)): raise ValueError(f'pixel_order should be a permutation of {list(range(wcs.pixel_n_dim))}') if sorted(world_order) != list(range(wcs.world_n_dim)): raise ValueError(f'world_order should be a permutation of {list(range(wcs.world_n_dim))}') self._wcs = wcs self._pixel_order = pixel_order self._world_order = world_order self._pixel_order_inv = np.argsort(pixel_order) self._world_order_inv = np.argsort(world_order) @property def world_axis_physical_types(self): return [self._wcs.world_axis_physical_types[idx] for idx in self._world_order] @property def world_axis_units(self): return [self._wcs.world_axis_units[idx] for idx in self._world_order] @property def pixel_axis_names(self): return [self._wcs.pixel_axis_names[idx] for idx in self._pixel_order] @property def world_axis_names(self): return [self._wcs.world_axis_names[idx] for idx in self._world_order]
[docs] def pixel_to_world_values(self, *pixel_arrays): pixel_arrays = [pixel_arrays[idx] for idx in self._pixel_order_inv] world_arrays = self._wcs.pixel_to_world_values(*pixel_arrays) world_arrays = [world_arrays[idx] for idx in self._world_order] return world_arrays
[docs] def world_to_pixel_values(self, *world_arrays): world_arrays = [world_arrays[idx] for idx in self._world_order_inv] pixel_arrays = self._wcs.world_to_pixel_values(*world_arrays) pixel_arrays = [pixel_arrays[idx] for idx in self._pixel_order] return pixel_arrays
@property def world_axis_object_components(self): return [self._wcs.world_axis_object_components[idx] for idx in self._world_order] @property def pixel_shape(self): if self._wcs.pixel_shape: return tuple([self._wcs.pixel_shape[idx] for idx in self._pixel_order]) @property def pixel_bounds(self): if self._wcs.pixel_bounds: return tuple([self._wcs.pixel_bounds[idx] for idx in self._pixel_order]) @property def axis_correlation_matrix(self): return self._wcs.axis_correlation_matrix[self._world_order][:, self._pixel_order]