Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Prevent duplicate sub-interval data labels #120

Merged
merged 3 commits into from
Jun 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
0.5.0 (unreleased)
------------------

* Prevent duplicate sub-intervals (quarter/sector/campaign) in data labels. [#120]

0.4.1 (unreleased)
------------------

Expand Down
3 changes: 3 additions & 0 deletions lcviz/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ def light_curve_like_kepler_quarter(seed=42):
)
lc['flux_alt'] = flux + 1
lc['flux_alt_err'] = flux_err
lc.meta['MISSION'] = 'KEPLER'
lc.meta['QUARTER'] = 10

return lc


Expand Down
46 changes: 27 additions & 19 deletions lcviz/parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@

__all__ = ["light_curve_parser"]

mission_sub_intervals = {
'kepler': {'prefix': 'Q', 'card': 'QUARTER'},
'k2': {'prefix': 'C', 'card': 'CAMPAIGN'},
'tess': {'prefix': 'S', 'card': 'SECTOR'},
}


@data_parser_registry("light_curve_parser")
def light_curve_parser(app, file_obj, data_label=None, show_in_viewer=True, **kwargs):
Expand All @@ -31,23 +37,25 @@ def light_curve_parser(app, file_obj, data_label=None, show_in_viewer=True, **kw
else:
raise NotImplementedError(f"could not parse light_curve with type {type(file_obj)}")

# make a data label:
if data_label is not None:
new_data_label = f'{data_label}'
else:
new_data_label = light_curve.meta.get('OBJECT', 'Light curve')

# handle flux_origin default
mission = light_curve.meta.get('MISSION', '').lower()
flux_origin = light_curve.meta.get('FLUX_ORIGIN', None) # i.e. PDCSAP or SAP
if isinstance(light_curve, lightkurve.targetpixelfile.TargetPixelFile):
new_data_label += '[TPF]'
elif mission == 'kepler':
new_data_label += f' Q{light_curve.meta.get("QUARTER")}'
elif mission == 'k2':
new_data_label += f' C{light_curve.meta.get("CAMPAIGN")}'
elif mission == 'tess':
new_data_label += f' S{light_curve.meta.get("SECTOR")}'

# make a data label:
if data_label is None:
data_label = light_curve.meta.get('OBJECT', 'Light curve')

if isinstance(light_curve, lightkurve.targetpixelfile.TargetPixelFile):
data_label += '[TPF]'
elif mission in mission_sub_intervals:
# the sub-interval label is something like "Q9" for Kepler or
# "S9" for TESS. If it's already in the proposed data label, skip;
# otherwise, append it.
sub_interval_label = (
f' [{mission_sub_intervals[mission]["prefix"]}'
f'{light_curve.meta.get(mission_sub_intervals[mission]["card"])}]'
)
data_label += sub_interval_label

if flux_origin == 'flux' or (flux_origin is None and 'flux' in getattr(light_curve, 'columns', [])): # noqa
# then make a copy of this column so it won't be lost when changing with the flux_column
Expand All @@ -58,7 +66,7 @@ def light_curve_parser(app, file_obj, data_label=None, show_in_viewer=True, **kw
light_curve.meta['FLUX_ORIGIN'] = 'flux:orig'

data = _data_with_reftime(app, light_curve)
app.add_data(data, new_data_label)
app.add_data(data, data_label)

if isinstance(light_curve, lightkurve.targetpixelfile.TargetPixelFile):
# ensure an image/cube/TPF viewer exists
Expand All @@ -69,12 +77,12 @@ def light_curve_parser(app, file_obj, data_label=None, show_in_viewer=True, **kw
found_viewer = False
for viewer_id, viewer in app._viewer_store.items():
if isinstance(viewer, CubeView):
app.add_data_to_viewer(viewer_id, new_data_label)
app.add_data_to_viewer(viewer_id, data_label)
found_viewer = True
if not found_viewer:
app._on_new_viewer(NewViewerMessage(CubeView, data=None, sender=app),
vid='image', name='image')
app.add_data_to_viewer('image', new_data_label)
app.add_data_to_viewer('image', data_label)

# set TPF viewer's stretch to custom defaults:
plot_options_plugin = PlotOptions(app=app)
Expand All @@ -85,13 +93,13 @@ def light_curve_parser(app, file_obj, data_label=None, show_in_viewer=True, **kw
if show_in_viewer:
for viewer_id, viewer in app._viewer_store.items():
if isinstance(viewer, (TimeScatterView, PhaseScatterView)):
app.add_data_to_viewer(viewer_id, new_data_label)
app.add_data_to_viewer(viewer_id, data_label)

# add to any known phase viewers
ephem_plugin = app._jdaviz_helper.plugins.get('Ephemeris', None)
if ephem_plugin is not None:
for viewer in ephem_plugin._obj._get_phase_viewers():
app.add_data_to_viewer(viewer.reference, new_data_label)
app.add_data_to_viewer(viewer.reference, data_label)


def _data_with_reftime(app, light_curve):
Expand Down
11 changes: 11 additions & 0 deletions lcviz/tests/test_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,14 @@ def test_apply_yrangerois(helper, light_curve_like_kepler_quarter):
subset_state = subsets['Subset 1'][0]['subset_state']

np.testing.assert_allclose([subset_state.lo, subset_state.hi], [1, 1.05])


def test_data_label(helper, light_curve_like_kepler_quarter):
# add data without specifying data label:
helper.load_data(light_curve_like_kepler_quarter)
assert helper.app.data_collection[-1].label == 'Light curve [Q10]'

# specify label, check that quarter isn't appended:
data_label = 'Cool target'
helper.load_data(light_curve_like_kepler_quarter, data_label=data_label)
assert helper.app.data_collection[-1].label == data_label
4 changes: 2 additions & 2 deletions lcviz/tests/test_plugin_markers.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def test_plugin_markers(helper, light_curve_like_kepler_quarter):
'Time 5.45833e+00 d',
'Flux 9.67587e-01')

_assert_dict_allclose(label_mouseover.as_dict(), {'data_label': 'Light curve',
_assert_dict_allclose(label_mouseover.as_dict(), {'data_label': 'Light curve [Q10]',
'time': 5.4583335,
'time:unit': 'd',
'phase': np.nan,
Expand Down Expand Up @@ -81,7 +81,7 @@ def test_plugin_markers(helper, light_curve_like_kepler_quarter):
'Phase 0.45833',
'Flux 9.67587e-01')

_assert_dict_allclose(label_mouseover.as_dict(), {'data_label': 'Light curve',
_assert_dict_allclose(label_mouseover.as_dict(), {'data_label': 'Light curve [Q10]',
'time': 5.458333374001086,
'time:unit': 'd',
'phase': 0.4583333730697632,
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ dependencies = [
# to devdeps in tox.ini
"jdaviz>=3.10.2,<3.11",
"lightkurve>=2.4.1",
"numpy<2",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

backported in #126

]
dynamic = [
"version",
Expand Down
Loading