Source code for astrophot.utils.initialize.construct_psf
import numpy as np
[docs]
def gaussian_psf(sigma, img_width, pixelscale, upsample=4, normalize=True):
"""
create a gaussian point spread function (PSF) image.
**Args:**
- `sigma`: Standard deviation of the Gaussian in arcseconds.
- `img_width`: Width of the PSF image in pixels.
- `pixelscale`: Pixel scale in arcseconds per pixel.
- `upsample`: Upsampling factor to more accurately create the PSF (the outputted PSF is not upsampled).
- `normalize`: Whether to normalize the PSF so that the sum of all pixels equals 1. If False, the PSF will not be normalized.
"""
assert img_width % 2 == 1, "psf images should have an odd shape"
# Number of super sampled pixels
N = img_width * upsample
# Grid of centered pixel locations
XX, YY = np.meshgrid(
np.linspace(
-(N - 1) * pixelscale / (2 * upsample),
(N - 1) * pixelscale / (2 * upsample),
N,
),
np.linspace(
-(N - 1) * pixelscale / (2 * upsample),
(N - 1) * pixelscale / (2 * upsample),
N,
),
)
# Evaluate the Gaussian at each pixel
ZZ = np.exp(-0.5 * (XX**2 + YY**2) / sigma**2)
# Reduce the super-sampling back to native resolution
ZZ = ZZ.reshape(img_width, upsample, img_width, upsample).sum(axis=(1, 3)) / (upsample**2)
# Normalize the PSF
if normalize:
return ZZ / np.sum(ZZ)
return ZZ
[docs]
def moffat_psf(n, Rd, img_width, pixelscale, upsample=4, normalize=True):
"""
Create a Moffat point spread function (PSF) image.
**Args:**
- `n`: Moffat index (power-law index).
- `Rd`: Scale radius of the Moffat profile in arcseconds.
- `img_width`: Width of the PSF image in pixels.
- `pixelscale`: Pixel scale in arcseconds per pixel.
- `upsample`: Upsampling factor to more accurately create the PSF (the outputted PSF is not upsampled).
- `normalize`: Whether to normalize the PSF so that the sum of all pixels equals 1. If False, the PSF will not be normalized.
"""
assert img_width % 2 == 1, "psf images should have an odd shape"
# Number of super sampled pixels
N = img_width * upsample
# Grid of centered pixel locations
XX, YY = np.meshgrid(
np.linspace(
-(N - 1) * pixelscale / (2 * upsample),
(N - 1) * pixelscale / (2 * upsample),
N,
),
np.linspace(
-(N - 1) * pixelscale / (2 * upsample),
(N - 1) * pixelscale / (2 * upsample),
N,
),
)
# Evaluate the Moffat at each pixel
ZZ = 1.0 / (1.0 + (XX**2 + YY**2) / (Rd**2)) ** n
# Reduce the super-sampling back to native resolution
ZZ = ZZ.reshape(img_width, upsample, img_width, upsample).sum(axis=(1, 3)) / (upsample**2)
# Normalize the PSF
if normalize:
return ZZ / np.sum(ZZ)
return ZZ