Source code for stellarphot.gui_tools.photometry_widget_functions
from pathlib import Path
import ipywidgets as ipw
from ccdproc import ImageFileCollection
from stellarphot.settings import (
PhotometryApertures,
PhotometryFileSettings,
ui_generator,
)
__all__ = ["PhotometrySettings"]
[docs]
class PhotometrySettings:
"""
A class to hold the widgets for photometry settings.
Attributes
----------
aperture_locations : `pathlib.Path`
This is the path to the file containing the aperture locations.
box : `ipywidgets.VBox`
This is a box containing the widgets.
image_folder : `pathlib.Path`
This is the path to the folder containing the images.
ifc : `ccdproc.ImageFileCollection`
The ImageFileCollection for the selected folder.
object_name : str
The name of the object.
"""
def __init__(self):
self._file_loc_widget = ui_generator(PhotometryFileSettings)
self._object_name = ipw.Dropdown(
description="Choose object", style=dict(description_width="initial")
)
self._file_loc_widget.observe(self._update_locations)
self.ifc = None
self._box = ipw.VBox()
self._box.children = [self._file_loc_widget, self._object_name]
@property
def box(self):
"""
The box containing the widgets.
"""
return self._box
@property
def image_folder(self):
"""
The path to the folder containing the images.
"""
return self.file_locations.image_folder
@property
def aperture_locations(self):
"""
The path to the file containing the aperture locations
"""
return self.file_locations.aperture_locations_file
@property
def object_name(self):
"""
The name of the object.
"""
return self._object_name.value
def _update_locations(self, change):
self.file_locations = PhotometryFileSettings(**self._file_loc_widget.value)
self._update_ifc(change)
if Path(self.file_locations.aperture_settings_file).is_file():
self._update_aperture_settings(change)
def _update_ifc(self, change):
self.ifc = ImageFileCollection(self.file_locations.image_folder)
self._update_object_list(change)
def _update_object_list(self, change): # noqa: ARG002
"""
Widget callbacks need to accept a single argument, even if it is not used.
"""
if self.ifc.summary:
self._object_name.options = sorted(
set(self.ifc.summary["object"][~self.ifc.summary["object"].mask])
)
else:
self._object_name.options = []
def _update_aperture_settings(self, change): # noqa: ARG002
"""
Widget callbacks need to accept a single argument, even if it is not used.
"""
self.aperture_settings = PhotometryApertures.parse_file(
self.file_locations.aperture_settings_file
)