Source code for mirar.processors.astromatic.sextractor.background_subtractor
"""
Module for subtracting the background from an image using Sextractor
"""
from pathlib import Path
import numpy as np
from mirar.data import Image, ImageBatch
from mirar.io import open_fits
from mirar.paths import BASE_NAME_KEY
from mirar.processors import BaseImageProcessor
from mirar.processors.astromatic.sextractor.sextractor import (
Sextractor,
sextractor_checkimg_map,
)
from mirar.processors.base_processor import PrerequisiteError, logger
[docs]
class SextractorBkgSubtractor(BaseImageProcessor):
"""
Processor to subtract the background from an image using Sextractor.
This processor requires that Sextractor has been run previously with
CHECKIMAGE_TYPE -BACKGROUND. This processor loads and returns the
background-subtracted image.
"""
base_key = "sextractorbkgsubtractor"
[docs]
def description(self) -> str:
return "Subtract background from image using recent Sextractor output"
def _apply_to_images(
self,
batch: ImageBatch,
) -> ImageBatch:
new_batch = ImageBatch()
for image in batch:
if sextractor_checkimg_map["-BACKGROUND"] not in image.header:
raise PrerequisiteError(
f"{sextractor_checkimg_map['-BACKGROUND']} key not found in image. "
f"Sextractor must be run with CHECKIMAGE_TYPE -BACKGROUND before "
"running this processor"
)
bkgsub_path = Path(image[sextractor_checkimg_map["-BACKGROUND"]])
bkgsub_data, bkgsub_header = open_fits(bkgsub_path)
# Mask the data with the original image's mask
mask = np.isnan(image.get_data())
bkgsub_data[mask] = np.nan
# Update headers with any new keys that may have been added
for key in image.header:
if key not in bkgsub_header:
bkgsub_header[key] = image.header[key]
# Copy over BASENAME
bkgsub_header[BASE_NAME_KEY] = image.header[BASE_NAME_KEY]
bkgsub_image = Image(data=bkgsub_data, header=bkgsub_header)
new_batch.append(bkgsub_image)
# Delete the original background file
bkgsub_path.unlink()
return new_batch
[docs]
def get_sextractor_module(self) -> Sextractor:
"""
Get the Sextractor module from the preceding steps
"""
mask = [isinstance(x, Sextractor) for x in self.preceding_steps]
return np.array(self.preceding_steps)[mask][-1]
[docs]
def check_prerequisites(
self,
):
"""
Check that Sextractor has been run previously with CHECKIMAGE_TYPE -BACKGROUND
"""
mask = [isinstance(x, Sextractor) for x in self.preceding_steps[-1:]]
if np.sum(mask) < 1:
err = (
f"{self.__module__} requires running {Sextractor} immediately "
f"preceding this processor as a prerequisite. "
f"However, the following steps were found: {self.preceding_steps}."
)
logger.error(err)
raise PrerequisiteError(err)
sextractor_checkimg_types = self.get_sextractor_module().checkimage_type
if "-BACKGROUND" not in sextractor_checkimg_types:
err = (
f"{self.__module__} requires that Sextractor be run with "
f"CHECKIMAGE_TYPE -BACKGROUND. However, the following "
f"CHECKIMAGE_TYPEs were found: {sextractor_checkimg_types}."
)
logger.error(err)
raise PrerequisiteError(err)