diff --git a/lcviz/plugins/ephemeris/ephemeris.py b/lcviz/plugins/ephemeris/ephemeris.py index 134ba99..66c05ba 100644 --- a/lcviz/plugins/ephemeris/ephemeris.py +++ b/lcviz/plugins/ephemeris/ephemeris.py @@ -12,7 +12,8 @@ from jdaviz.core.events import (NewViewerMessage, ViewerAddedMessage, ViewerRemovedMessage) from jdaviz.core.registries import tray_registry from jdaviz.core.template_mixin import (PluginTemplateMixin, DatasetSelectMixin, - SelectPluginComponent, EditableSelectPluginComponent) + SelectPluginComponent, EditableSelectPluginComponent, + with_spinner) from jdaviz.core.user_api import PluginUserApi from lightkurve import periodogram, FoldedLightCurve @@ -98,7 +99,7 @@ class Ephemeris(PluginTemplateMixin, DatasetSelectMixin): query_ra = FloatHandleEmpty().tag(sync=True) query_dec = FloatHandleEmpty().tag(sync=True) query_radius = FloatHandleEmpty(_default_query_radius).tag(sync=True) - query_result_names = List().tag(sync=True) + query_result_items = List().tag(sync=True) query_result_selected = Unicode().tag(sync=True) ra_dec_step = Float(0.01).tag(sync=True) period_from_catalog = FloatHandleEmpty().tag(sync=True) @@ -144,12 +145,16 @@ def __init__(self, *args, **kwargs): @property def user_api(self): - expose = ['component', 'period', 'dpdt', 't0', 'wrap_at', - 'ephemeris', 'ephemerides', - 'update_ephemeris', 'create_phase_viewer', - 'add_component', 'remove_component', 'rename_component', - 'times_to_phases', 'phases_to_times', 'get_data', - 'dataset', 'method', 'period_at_max_power', 'adopt_period_at_max_power'] + expose = [ + 'component', 'period', 'dpdt', 't0', 'wrap_at', + 'ephemeris', 'ephemerides', + 'update_ephemeris', 'create_phase_viewer', + 'add_component', 'remove_component', 'rename_component', + 'times_to_phases', 'phases_to_times', 'get_data', + 'dataset', 'method', 'period_at_max_power', + 'adopt_period_at_max_power', 'query_for_ephemeris', + 'query_result' + ] return PluginUserApi(self, expose=expose) def _phase_comp_lbl(self, component=None): @@ -611,42 +616,61 @@ def _query_params_from_metadata(self, *args): self.query_ra = self.dataset.selected_obj.meta.get('RA') self.query_dec = self.dataset.selected_obj.meta.get('DEC') - def _query_for_ephemeris(self, *args): + def query_for_ephemeris(self): + query_result = None + if self.query_name: - self._query_result = self.nasa_exoplanet_archive.query_object( + # first query by object name: + query_result = self.nasa_exoplanet_archive.query_object( self.query_name, table='pscomppars' ) - elif None not in (self.query_ra, self.query_dec): + if ( + (query_result is None or len(query_result) == 0) and + (None not in (self.query_ra, self.query_dec)) + ): + # next query by coordinates: coord = SkyCoord(ra=self.query_ra, dec=self.query_dec, unit=u.deg) - self._query_result = self.nasa_exoplanet_archive.query_region( + query_result = self.nasa_exoplanet_archive.query_region( coord, self.query_radius * u.arcsec, table='pscomppars' ) - else: + if query_result is None or len(query_result) == 0: # no metadata found for RA, Dec, or object name return None - if len(self._query_result): - self._query_result.add_index('pl_name') - self.query_result_names = sorted(list(self._query_result['pl_name'])) + else: + self.query_result = query_result + self.query_result.add_index('pl_name') + self.query_result_items = [ + { + 'name': name, + 'period': period, + 'epoch': epoch if not np.isnan(epoch) else 0 + } + for name, period, epoch in zip( + sorted(list(self.query_result['pl_name'])), + np.array(self.query_result['pl_orbper'].to_value(u.day)), + np.array(self.query_result['pl_tranmid'].to_value(u.day)) + ) + ] @observe('query_result_selected') - def _select_query_result(self, *args, selected_idx=None): - selected_query_result = self._query_result.loc[self.query_result_selected] - self.query_ra = selected_query_result['ra'].base.value - self.query_dec = selected_query_result['dec'].base.value + def _select_query_result(self, *args): + selected_query_result = self.query_result.loc[self.query_result_selected] self.period_from_catalog = selected_query_result['pl_orbper'].base.to_value(u.day) ref_time = self.app.data_collection[0].coords.reference_time.jd - self.t0_from_catalog = ( - selected_query_result['pl_tranmid'].base.to_value(u.day) - ref_time - ) % self.period_from_catalog + if np.isnan(selected_query_result['pl_tranmid'].base.to_value(u.day)): + self.t0_from_catalog = 0 + else: + self.t0_from_catalog = ( + selected_query_result['pl_tranmid'].base.to_value(u.day) - ref_time + ) % self.period_from_catalog + @with_spinner('query_spinner') def vue_query_for_ephemeris(self, *args): - self.query_spinner = True - self._query_for_ephemeris() - self.query_spinner = False + self.query_for_ephemeris() def adopt_from_catalog(self, *args): if not np.any(np.isnan([self.period_from_catalog, self.t0_from_catalog])): @@ -660,3 +684,8 @@ def adopt_from_catalog(self, *args): def vue_adopt_from_catalog(self, *args): self.adopt_from_catalog() + + def vue_adopt_from_catalog_in_new_viewer(self, *args): + self.add_component(self.query_result_selected.replace(' ', '')) + self.create_phase_viewer() + self.adopt_from_catalog() diff --git a/lcviz/plugins/ephemeris/ephemeris.vue b/lcviz/plugins/ephemeris/ephemeris.vue index 663c86f..c5f59c8 100644 --- a/lcviz/plugins/ephemeris/ephemeris.vue +++ b/lcviz/plugins/ephemeris/ephemeris.vue @@ -141,6 +141,17 @@ Query NASA Exoplanet Archive + + + Query the + + Planetary Systems Composite Data table from + + NASA Exoplanet Archive. Queries first by name, then falls back on + coordinates if the object name is not recognized. + + + + + + @@ -184,24 +206,56 @@ -
+
+ dense + > + + + + + - - - period: {{period_from_catalog}}, t0: {{t0_from_catalog}} - + + Period: {{period_from_catalog}} d, Epoch: {{t0_from_catalog}} d + + + + +
+ + Adopt in this viewer + +
+ + Adopt in a new viewer + +
+