Source code for scarlet2.psf
"""PSF-related classes"""
import jax.numpy as jnp
from .module import Module
from .morphology import GaussianMorphology
[docs]
class PSF(Module):
"""PSF base class"""
@property
def shape(self):
"""Shape of the PSF model"""
return self.morphology.shape
[docs]
class ArrayPSF(PSF):
"""PSF defined by an image array
Warnings
--------
The number of pixels in `morphology` should be odd, and the centroid of the
PSF image should be in the central pixel. If that is not the case, one creates
an effective shift by the PSF, which is not captured by the coordinate
convention of the frame, e.g. its :py:attr:`~scarlet2.Frame.wcs`.
See :issue:`96` from more details.
"""
morphology: jnp.ndarray
"""The PSF morphology image. Can be 2D (height, width) or 3D (channel, height, width)"""
[docs]
def __call__(self):
"""Evaluate PSF
Returns
-------
array
2D image, normalized to total flux=1
"""
return self.morphology / self.morphology.sum((-2, -1), keepdims=True)
[docs]
class GaussianPSF(PSF):
"""Gaussian-shaped PSF"""
morphology: GaussianMorphology
"""Morphology model"""
def __init__(self, sigma):
"""Initialize Gaussian PSF
Parameters
----------
sigma: float
Standard deviation of Gaussian
"""
self.morphology = GaussianMorphology(sigma)
[docs]
def __call__(self):
"""What to run when the Gaussian PSF is called"""
morph = self.morphology()
morph /= morph.sum((-2, -1), keepdims=True)
return morph