Reprojection

Spectral-cube has several tools to enable reprojection of cubes onto different spatial and spectral grids.

Prior to reprojecting data, in order to minimize resampling artifacts, it is a good idea to smooth the data first. A worked example of spatial and spectral smoothing is given on the reprojection tutorial.

Spatial Reprojection

To reproject a cube onto a different spatial world coordinate system, use the reproject() function. The function requires a target header as an input. You might generate this header by grabbing it from another FITS file, for example, from another SpectralCube:

from spectral_cube import SpectralCube

cube = SpectralCube.read('/some_path/some_file.fits')
other_cube = SpectralCube.read('/some_path/other_file.fits')

reprojected_cube = cube.reproject(other_cube.header)

Instead, the target header can be generated it with a helper tool (e.g., the find_optimal_celestial_wcs function in the reproject package), or by manually editing a FITS header.

The spatial reprojection tool uses reproject under the hood and defaults to using a bilinear interpolation scheme, though this is configurable using the order keyword in reproject. Interpolation onto a differently-spaced grid, after appropriate smoothing, can be used to rebin or decimate the data.

A simple example for rebinning, assuming no smoothing is needed (appropriate for when the data are oversampled):

from spectral_cube import SpectralCube

cube = SpectralCube.read('/some_path/some_file.fits')

# create a target header to reproject to by making the pixel size 2 times larger
target_header = cube.wcs.celestial[::2, ::2].to_header()
target_header['NAXIS1'] = cube.shape[2] / 2
target_header['NAXIS2'] = cube.shape[1] / 2

downsampled_cube = cube.reproject(target_header)

Reprojection for 2D images uses the same syntax with a Projection or Slice object. For example, to match the spatial grid of a 2D image to that of a cube:

from spectral_cube import SpectralCube, Projection
from astropy.io import fits

cube = SpectralCube.read('/some_path/some_file.fits')
image = Projection.from_hdu(fits.open('/some_path/twod_image.fits')[0])

cube_header_spatial = cube.wcs.celestial.to_header()
reprojected_image = image.reproject(cube_header_spatial)

Spectral Reprojection

Spectral reprojection behaves similar to spatial reprojection. The spectral_interpolate() function allows interpolation of the data onto a new spectral grid. Unlike spatial reprojection, though, the expected input is a list of pixel coordinates. See the example in the Spectral Smoothing section of the Smoothing document.