Source code for madcubapy.coordinates.transforms

import numpy as np

__all__ = [
    'transform_coords_fitsmap',
    'transform_coords_axes',
]

[docs] def transform_coords_fitsmap( ref_fitsmap, target_fitsmap, points, origin=0): """ Transform the pixel coordinates of one or more points between two maps. Parameters ---------- ref_fitsmap : `~madcubapy.io.MadcubaMap` or `~astropy.nddata.CCDData` Reference map. target_fitsmap : `~madcubapy.io.MadcubaMap` or `~astropy.nddata.CCDData` Map into which the points are transformed. points : `~numpy.ndarray` Points from ref_fitsmap to transform. origin : `int`, default:0 Origin of the coordinates of the image. 0 for numpy standards, and 1 for FITS standards. Returns ------- new_points : `~numpy.ndarray` Transformed points in the second image. """ if isinstance(points, tuple): points = np.array(points) if ref_fitsmap.header['NAXIS'] == 2: # Pixels to coordinates ra, dec = \ ref_fitsmap.wcs.wcs_pix2world(points.T[0], points.T[1], origin) # Coordinates to pixels from second image new_x, new_y = \ target_fitsmap.wcs.wcs_world2pix(ra, dec, origin) elif ref_fitsmap.header['NAXIS'] == 4: # Pixels to coordinates ra, dec, frec_world, pol_world = \ ref_fitsmap.wcs.wcs_pix2world( points.T[0], points.T[1], 1, 1, origin ) # Coordinates to pixels from second image new_x, new_y, nul_frec_pix, nul_pol_pix = \ target_fitsmap.wcs.wcs_world2pix( ra, dec, frec_world, pol_world, origin ) new_points = np.array([new_x, new_y]).T return new_points
[docs] def transform_coords_axes( ref_ax, target_ax, points): """ Transform the pixel coordinates of one or more points between two `~astropy.visualization.wcsaxes.WCSAxes`. Parameters ---------- ref_ax : `~astropy.visualization.wcsaxes.WCSAxes` Reference axes. target_ax : `~astropy.visualization.wcsaxes.WCSAxes` Axes into which the points are transformed. points : `~numpy.ndarray` Points from ref_axes to transform. Returns ------- new_points : `~numpy.ndarray` Transformed points in the second image. """ # Astropy does not provide a straightforward method to get world # coordinates from an image pixel. It does however provide # transformations between pixel or world coordinates and the screen # coordinates. To get the world coordinates using only the WCSAxes # object, we must convert from pixels to screen, and then screen to # pixels. reference_pix2screen = ref_ax.get_transform('pixel') reference_screen2world = ref_ax.get_transform('world').inverted() reference_screen_coords = reference_pix2screen.transform(points) world_coords = reference_screen2world.transform(reference_screen_coords) # Finally we can do the same but backwards for the second axes. final_world2screen = target_ax.get_transform('world') final_screen2pix = target_ax.get_transform('pixel').inverted() final_screen_coords = final_world2screen.transform(world_coords) new_points = final_screen2pix.transform(final_screen_coords) return new_points