Source code for vip_hci.objects.ppmediansub
#! /usr/bin/env python
"""Module for the post-processing median subtraction algorithm."""
__author__ = "Thomas Bédrine"
__all__ = ["MedianBuilder", "PPMedianSub"]
from typing import Optional
from dataclasses import dataclass
import numpy as np
from dataclass_builder import dataclass_builder
from .dataset import Dataset
from .postproc import PostProc
from ..psfsub import median_sub, MEDIAN_SUB_Params
from ..config.utils_conf import algo_calculates_decorator as calculates
[docs]
@dataclass
class PPMedianSub(PostProc, MEDIAN_SUB_Params):
"""
Object used as a wrapper for the ``vip_hci.psfsub.median_sub``.
Gets its parameters from the MedsubParams dataclass.
Parameters
----------
full_output: bool, optional
Whether to return the final median combined image only or with other
intermediate arrays.
_algo_name: str, optional
Name of the algorithm wrapped by the object.
"""
full_output: bool = True
_algo_name: str = "median_sub"
cube_residuals: np.ndarray = None
cube_residuals_der: np.ndarray = None
# TODO: write test
[docs]
@calculates("cube_residuals", "cube_residuals_der", "frame_final")
def run(
self,
dataset: Optional[Dataset] = None,
nproc: Optional[int] = None,
full_output: Optional[bool] = None,
**rot_options: Optional[dict]
) -> None:
"""
Run the post-processing median subtraction algorithm for model PSF subtraction.
Parameters
----------
results : PPResult object, optional
Container for the results of the algorithm. May hold the parameters used,
as well as the ``frame_final`` (and the ``snr_map`` if generated).
dataset : Dataset object, optional
An Dataset object to be processed.
nproc : None or int, optional
Number of processes for parallel computing. If None the number of
processes will be set to cpu_count()/2. By default the algorithm works
in single-process mode.
full_output: bool, optional
Whether to return the final median combined image only or with other
intermediate arrays.
verbose : bool, optional
If True prints to stdout intermediate info.
rot_options: dictionary, optional
Dictionary with optional keyword values for "border_mode", "mask_val",
"edge_blend", "interp_zeros", "ker" (see documentation of
``vip_hci.preproc.frame_rotate``).
"""
self.snr_map = None
self._update_dataset(dataset)
if self.mode == "annular" and self.dataset.fwhm is None:
raise ValueError("`fwhm` has not been set")
if nproc is not None:
self.nproc = nproc
if full_output is not None:
self.full_output = full_output
self._explicit_dataset()
params_dict = self._create_parameters_dict(MEDIAN_SUB_Params)
all_params = {"algo_params": self, **rot_options}
res = median_sub(**all_params)
self.cube_residuals, self.cube_residuals_der, self.frame_final = res
if self.results is not None:
self.results.register_session(
params=params_dict,
frame=self.frame_final,
algo_name=self._algo_name,
)
MedianBuilder = dataclass_builder(PPMedianSub)