Source code for astrophot.image.mixins.cmos_mixin
from typing import Optional, Tuple
from .. import func
from ... import config
from ...param import forward
[docs]
class CMOSMixin:
"""
A mixin class for CMOS image processing. This class can be used to add
CMOS-specific functionality to image processing classes.
"""
def __init__(
self,
*args,
subpixel_loc: Tuple[float, float] = (0, 0),
subpixel_scale: float = 1.0,
filename: Optional[str] = None,
**kwargs,
):
super().__init__(*args, filename=filename, **kwargs)
if filename is not None:
return
self.subpixel_loc = subpixel_loc
self.subpixel_scale = subpixel_scale
@property
def base_scale(self):
"""Get the base scale of the image, which is the subpixel scale."""
return self.subpixel_scale
[docs]
@forward
def pixel_collecting_area(self, I_, J_, upsample):
# CMOS pixels only sensitive in sub area, so scale the pixel collecting area
return self.pixel_area * self.subpixel_scale**2 / upsample**2
[docs]
def pixel_center_meshgrid(self, window=None, pad=0, upsample=1):
"""Get a meshgrid of pixel coordinates in the image, centered on the pixel grid."""
if window is None:
window = self.window
return func.cmos_pixel_center_meshgrid(
window.extent, pad, upsample, self.subpixel_loc, config.DTYPE, config.DEVICE
)
[docs]
def copy(self, **kwargs):
return super().copy(
subpixel_loc=self.subpixel_loc, subpixel_scale=self.subpixel_scale, **kwargs
)
[docs]
def fits_info(self):
info = super().fits_info()
info["SPIXLOC1"] = self.subpixel_loc[0]
info["SPIXLOC2"] = self.subpixel_loc[1]
info["SPIXSCL"] = self.subpixel_scale
return info
[docs]
def load(self, filename: str, hduext: int = 0):
hdulist = super().load(filename, hduext=hduext)
if "SPIXLOC1" in hdulist[hduext].header:
self.subpixel_loc = (
hdulist[0].header.get("SPIXLOC1", 0),
hdulist[0].header.get("SPIXLOC2", 0),
)
if "SPIXSCL" in hdulist[hduext].header:
self.subpixel_scale = hdulist[0].header.get("SPIXSCL", 1.0)
return hdulist