Source code for eloy.photometry
"""
Aperture photometry utilities for astronomical images.
This module provides functions for performing aperture photometry and
estimating background using annular sigma-clipping.
"""
from photutils.aperture import aperture_photometry as photutils_aperture_photometry
from photutils.aperture import CircularAperture, CircularAnnulus
from astropy.stats import sigma_clipped_stats
import numpy as np
[docs]
def aperture_photometry(data, coords, radii):
"""
Perform aperture photometry for a set of coordinates and radii usin photutils.
Parameters
----------
data : np.ndarray
2D image data.
coords : np.ndarray
Array of (x, y) coordinates.
radii : array-like
List of aperture radii.
Returns
-------
np.ndarray
Array of aperture fluxes.
"""
apertures = [CircularAperture(coords, r=r) for r in radii]
aperture_fluxes = np.array(
[photutils_aperture_photometry(data, a)["aperture_sum"].data for a in apertures]
).T
return aperture_fluxes
[docs]
def annulus_sigma_clip_median(data, coords, r_in, r_out, sigma=3):
"""
Compute the sigma-clipped median background in an annulus around each coordinate
using photutils.
Parameters
----------
data : np.ndarray
2D image data.
coords : np.ndarray
Array of (x, y) coordinates.
r_in : float
Inner radius of the annulus.
r_out : float
Outer radius of the annulus.
sigma : float, optional
Sigma for sigma-clipping.
Returns
-------
np.ndarray
Array of median background values for each coordinate.
"""
annulus = CircularAnnulus(coords, r_in, r_out)
annulus_masks = annulus.to_mask(method="center")
bkg_median = []
for mask in annulus_masks:
annulus_data = mask.multiply(data)
if annulus_data is not None:
annulus_data_1d = annulus_data[mask.data > 0]
_, median_sigma_clip, _ = sigma_clipped_stats(annulus_data_1d, sigma=sigma)
bkg_median.append(median_sigma_clip)
else:
bkg_median.append(0.0)
return np.array(bkg_median)