Source code for lenstronomy.Data.pixel_grid
import numpy as np
from lenstronomy.Data.coord_transforms import Coordinates
from lenstronomy.Data.angular_sensitivity import AngularSensitivity
__all__ = ["PixelGrid"]
[docs]
class PixelGrid(Coordinates, AngularSensitivity):
"""Class that manages a specified pixel grid (rectangular at the moment) and its
coordinates."""
[docs]
def __init__(
self,
nx,
ny,
transform_pix2angle,
ra_at_xy_0,
dec_at_xy_0,
antenna_primary_beam=None,
):
"""
:param nx: number of pixels in x-axis
:param ny: number of pixels in y-axis
:param transform_pix2angle: 2x2 matrix, mapping of pixel to coordinate
:param ra_at_xy_0: ra coordinate at pixel (0,0)
:param dec_at_xy_0: dec coordinate at pixel (0,0)
:param antenna_primary_beam: 2d numpy array with the same size of imaga_data;
more descriptions of the primary beam can be found in the AngularSensitivity class
"""
super(PixelGrid, self).__init__(transform_pix2angle, ra_at_xy_0, dec_at_xy_0)
self._nx = nx
self._ny = ny
self._x_grid, self._y_grid = self.coordinate_grid(nx, ny)
if antenna_primary_beam is not None:
pbx, pby = np.shape(antenna_primary_beam)
if (pbx, pby) != (nx, ny):
raise ValueError(
"The primary beam should have the same size with the image data!"
)
AngularSensitivity.__init__(self, antenna_primary_beam)
@property
def num_pixel(self):
"""
:return: number of pixels in the data
"""
return self._nx * self._ny
@property
def num_pixel_axes(self):
"""
:return: number of pixels per axis, nx ny
"""
return self._nx, self._ny
@property
def width(self):
"""
:return: width of data frame
"""
return self._nx * self.pixel_width, self._ny * self.pixel_width
@property
def center(self):
"""
:return: center_x, center_y of coordinate system
"""
return np.mean(self._x_grid), np.mean(self._y_grid)
[docs]
def shift_coordinate_system(self, x_shift, y_shift, pixel_unit=False):
"""Shifts the coordinate system :param x_shift: shift in x (or RA) :param
y_shift: shift in y (or DEC) :param pixel_unit: bool, if True, units of pixels
in input, otherwise RA/DEC :return: updated data class with change in coordinate
system."""
self._shift_coordinates(x_shift, y_shift, pixel_unit=pixel_unit)
self._x_grid, self._y_grid = self.coordinate_grid(self._nx, self._ny)
@property
def pixel_coordinates(self):
"""
:return: RA coords, DEC coords
"""
return self._x_grid, self._y_grid