Source code for astrophot.models.group_psf_model
from typing import Optional
from .group_model_object import Group_Model
from ..image import PSF_Image
from ..image import PSF_Image, Image, Window, Model_Image, Model_Image_List, Window_List
from ..errors import InvalidTarget
from ..param import Parameter_Node
__all__ = ["PSF_Group_Model"]
[docs]
class PSF_Group_Model(Group_Model):
model_type = f"psf {Group_Model.model_type}"
usable = True
normalize_psf = True
@property
def psf_mode(self):
return "none"
@psf_mode.setter
def psf_mode(self, value):
pass
@property
def target(self):
try:
return self._target
except AttributeError:
return None
@target.setter
def target(self, tar):
if not (tar is None or isinstance(tar, PSF_Image)):
raise InvalidTarget("Group_Model target must be a PSF_Image instance.")
self._target = tar
if hasattr(self, "models"):
for model in self.models.values():
model.target = tar
[docs]
def sample(
self,
image: Optional[Image] = None,
window: Optional[Window] = None,
parameters: Optional[Parameter_Node] = None,
):
# Note: same as group model except working_image is normalized at the end
self._param_tuple = None
if image is None:
sample_window = True
image = self.make_model_image(window=window)
else:
sample_window = False
if window is None:
window = image.window
working_image = image[window].blank_copy()
if parameters is None:
parameters = self.parameters
for model in self.models.values():
if window is not None and isinstance(window, Window_List):
indices = self.target.match_indices(model.target)
if isinstance(indices, (tuple, list)):
use_window = Window_List(
window_list=list(window.window_list[ind] for ind in indices)
)
else:
use_window = window.window_list[indices]
else:
use_window = window
if sample_window:
# Will sample the model fit window then add to the image
working_image += model(window=use_window, parameters=parameters[model.name])
else:
# Will sample the entire image
model(working_image, window=use_window, parameters=parameters[model.name])
if self.normalize_psf:
working_image.data /= working_image.data.sum()
image += working_image
return image