Source code for lcviz.plugins.time_selector.time_selector

from traitlets import observe

from jdaviz.core.template_mixin import ViewerSelectMixin
from jdaviz.configs.cubeviz.plugins import Slice
from jdaviz.core.registries import tray_registry

from lcviz.events import EphemerisChangedMessage
from lcviz.viewers import CubeView, TimeScatterView, PhaseScatterView

__all__ = ['TimeSelector']


[docs] @tray_registry('time-selector', label="Time Selector", category='app:options') class TimeSelector(Slice, ViewerSelectMixin): """ See the :ref:`Time Selector Plugin Documentation <time-selector>` for more details. Only the following attributes and methods are available through the :ref:`public plugin API <plugin-apis>`: * :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.show` * :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.open_in_tray` * :meth:`~jdaviz.core.template_mixin.PluginTemplateMixin.close_in_tray` * ``value`` Time of the indicator. When setting this directly, it will update automatically to the value corresponding to the nearest slice, if ``snap_to_slice`` is enabled and a cube is loaded. * ``show_indicator`` Whether to show indicator in spectral viewer when slice tool is inactive. * ``show_value`` Whether to show slice value in label to right of indicator. * ``snap_to_slice`` Whether the indicator (and ``value``) should snap to the value of the nearest slice in the cube (if one exists). """ _cube_viewer_cls = CubeView _cube_viewer_default_label = 'image' def __init__(self, *args, **kwargs): """ """ super().__init__(*args, **kwargs) self.plugin_key = "Time Selector" self._plugin_description = 'Select active time across all viewers.' self.docs_description = "Select time to sync across all viewers (as an indicator in all time/phase viewers or to select the active slice in any image/cube viewers). The slice can also be changed interactively in any time viewer by activating the slice tool." # noqa self.value_label = 'Time' self.value_unit = 'd' self.allow_disable_snapping = True self.session.hub.subscribe(self, EphemerisChangedMessage, handler=self._on_ephemeris_changed) self.viewer.add_filter(lambda viewer: isinstance(viewer, (TimeScatterView, PhaseScatterView, CubeView))) # noqa self._set_relevant() @observe('viewer_items') def _set_relevant(self, *args): if not len(self.viewer_items): self.irrelevant_msg = 'No valid viewers' else: self.irrelevant_msg = '' @observe('vdocs') def _update_docs_link(self, *args): self.docs_link = f"https://lcviz.readthedocs.io/en/{self.vdocs}/plugins.html#time-selector" @property def slice_display_unit_name(self): # global display unit "axis" corresponding to the slice axis return 'time' @property def valid_slice_att_names(self): return ["time", "dt"] @property def user_api(self): api = super().user_api # can be removed after deprecated upstream attributes for wavelength/wavelength_value # are removed in the lowest supported version of jdaviz api._expose = [e for e in api._expose if e not in ('slice', 'wavelength', 'wavelength_value', 'show_wavelength')] return api def _on_select_slice_message(self, msg): viewer = msg.sender.viewer if isinstance(viewer, PhaseScatterView): prev_phase = viewer.times_to_phases(self.value) new_phase = msg.value self.value = self.value + (new_phase - prev_phase) * viewer.ephemeris.get('period', 1.0) else: super()._on_select_slice_message(msg) def _on_ephemeris_changed(self, msg): for viewer in self.slice_indicator_viewers: if not isinstance(viewer, PhaseScatterView): continue if viewer._ephemeris_component != msg.ephemeris_label: continue viewer._set_slice_indicator_value(self.value)