Skip to content
New issue

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

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

Already on GitHub? # to your account

re-usable dataset select component #1221

Merged
merged 13 commits into from
Apr 6, 2022

Conversation

kecnry
Copy link
Member

@kecnry kecnry commented Mar 31, 2022

Description

This pull request implements a re-usable dataset select component with:

  • entry-filtering (some cases only want 1d spectra, only spectra in the current mosviz row, excluding output from model fitting plugin, etc).
  • automatic hiding when only one entry (by default - this can be disabled)
  • default selection to first entry
  • convenience functionality to access the selected Spectrum1D or data-collection objects from within the plugin.

This also creates a new BaseSelectPluginComponent which holds shared logic between the DatasetSelect, ViewerSelect (#1195), and SubsetSelect (#1156, #1175).

Finally, this splits the spatial subsets into their own dropdown in model fitting. For cubeviz this will effectively replace the data dropdown since the data dropdown is hidden as it is only populated with a single choice (unless more data is manually added).

Below are some before (left) & after (right) screenshots:

mosviz metadata before mosviz metadata after
cubeviz fitting before cubeviz fitting after

Fixes #1220

Checklist for package maintainer(s)

This checklist is meant to remind the package maintainer(s) who will review this pull request of some common things to look for. This list is not exhaustive.

  • Are two approvals required? Branch protection rule does not check for the second approval. If a second approval is not necessary, please apply the trivial label.
  • Do the proposed changes actually accomplish desired goals? Also manually run the affected example notebooks, if necessary.
  • Do the proposed changes follow the STScI Style Guides?
  • Are tests added/updated as required? If so, do they follow the STScI Style Guides?
  • Are docs added/updated as required? If so, do they follow the STScI Style Guides?
  • Did the CI pass? If not, are the failures related?
  • Is a change log needed? If yes, is it added to CHANGES.rst?
  • Is a milestone set?
  • After merge, any internal documentations need updating (e.g., JIRA, Innerspace)?

@kecnry kecnry added the plugin Label for plugins common to multiple configurations label Mar 31, 2022
@kecnry kecnry added this to the 2.5 milestone Mar 31, 2022
@kecnry kecnry force-pushed the data-select-component branch 5 times, most recently from 492b218 to d959d72 Compare April 1, 2022 18:57
@codecov
Copy link

codecov bot commented Apr 1, 2022

Codecov Report

Merging #1221 (4fe5f58) into main (2dbfeb8) will decrease coverage by 0.03%.
The diff coverage is 91.69%.

@@            Coverage Diff             @@
##             main    #1221      +/-   ##
==========================================
- Coverage   78.00%   77.96%   -0.04%     
==========================================
  Files          90       90              
  Lines        7187     7179       -8     
==========================================
- Hits         5606     5597       -9     
- Misses       1581     1582       +1     
Impacted Files Coverage Δ
...specviz/plugins/unit_conversion/unit_conversion.py 68.10% <73.68%> (-1.69%) ⬇️
...default/plugins/metadata_viewer/metadata_viewer.py 94.23% <83.33%> (-0.94%) ⬇️
...igs/default/plugins/model_fitting/model_fitting.py 34.15% <83.33%> (+3.51%) ⬆️
...igs/specviz/plugins/line_analysis/line_analysis.py 78.72% <90.90%> (-0.51%) ⬇️
jdaviz/core/template_mixin.py 92.65% <93.58%> (+0.34%) ⬆️
jdaviz/app.py 91.06% <100.00%> (+0.01%) ⬆️
...configs/cubeviz/plugins/moment_maps/moment_maps.py 91.80% <100.00%> (-2.32%) ⬇️
...daviz/configs/default/plugins/collapse/collapse.py 96.07% <100.00%> (+0.07%) ⬆️
...default/plugins/gaussian_smooth/gaussian_smooth.py 86.30% <100.00%> (+3.37%) ⬆️
...z/configs/default/plugins/line_lists/line_lists.py 65.66% <100.00%> (ø)
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 2dbfeb8...4fe5f58. Read the comment docs.

v-model="n_moment"
v-model.number="n_moment"
Copy link
Member Author

Choose a reason for hiding this comment

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

fixed this while I was here... using .number along with IntHandleEmpty removes the need for error handling in the plugin.

Comment on lines 45 to 46
# retrieve the data from the cube, not the collapsed 1d spectrum
self.dataset._viewer_refs = ['flux-viewer', 'spectrum-viewer']
Copy link
Member Author

Choose a reason for hiding this comment

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

this feels a little hacky - is it worth generalizing more or exposing a more friendly method to do this?

if ndec > 0:
if ndec > 0 and not np.isinf(ndec):
Copy link
Member Author

Choose a reason for hiding this comment

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

ran into a traceback when testing and clearing all data from the viewer (range goes to zero, ndec goes to infinity)

Comment on lines 18 to 19
assert mv.dc_items == ['has_simple_meta[DATA]', 'has_nested_meta[DATA]', 'no_meta']
assert mv.dataset.labels == ['has_simple_meta[DATA]', 'has_nested_meta[DATA]']
Copy link
Member Author

Choose a reason for hiding this comment

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

entries without metadata are filtered out by the DatasetSelect component now

Copy link
Contributor

Choose a reason for hiding this comment

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

Will this confuse the users when they don't see it under selection even though they loaded it?

Copy link
Contributor

@pllim pllim Apr 6, 2022

Choose a reason for hiding this comment

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

Also, this list does not update when metadata is added later (see snippet). I propose we don't try to be too smart here, just list everything and user sees nothing if there is no metadata, as before.

import numpy as np
from jdaviz import Imviz

a = np.random.random((10, 10))

imviz = Imviz()
imviz.load_data(a, data_label='test1')
imviz.app

imviz.app.data_collection[0].meta['1'] = 1  # Dropdown still shows nothing

Copy link
Member Author

Choose a reason for hiding this comment

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

I don't think it would be confusing, but we can ask Jenn. All of the dropdowns now filter to relevant entries, so I see this as consistent with that (it doesn't make much sense to be able to fit a model to a model, etc). But if we want to show "no metadata for ..." and still include them in the dropdown, I can make that happen.

If updating metadata manually is something we want to support, I can try to support that... but it also was not fully supported before this PR. Although the entry may have always shown in the dropdown, the displayed metadata would not update if you changed it manually after load, unless possibly if changing the selection.

Copy link
Contributor

Choose a reason for hiding this comment

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

The problem with the notebook workflow is that we cannot predict what user wanna do with this thing. Say, they load data, and then they do some funky processing with it and decide to attach history of said processing as metadata, who are we to deny them?

Should updating metadata trigger display update? Maybe and can be future PR if requested.

Should plugin just not allow showing metadata at all if it is not there on load? I think that is a step backward.

Copy link
Member Author

Choose a reason for hiding this comment

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

Do we consider accessing and modifying app.data_collection as user-facing? I suspect changing items in the data collection directly will cause issues across the app as we don't listen to changes from there anywhere (aperture photometry, for example, pulls values from metadata when the dropdown changes but won't update in real-time either, etc). I'm just worried this is a slippery slope. But if we do want to support user changes to things within data collection, then I would prefer disabling that ability entirely until a full solution is implemented rather than relying on the user to realize the distinction between live-updates and having to toggle a selection to pull the latest values.

I think the decision of whether items without metadata should be excluded or show "no metadata" is independent though, and I don't have a terribly strong opinion except that I always personally prefer self-consistency and showing a message is actually additional logic in the plugin.

Comment on lines -345 to +293
self.results_centroid = temp_result.to_value(u.AA)
self.results_centroid = temp_result.to_value(u.AA, equivalencies=u.spectral())
Copy link
Member Author

Choose a reason for hiding this comment

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

ran into a bug when testing when the spectrum was in frequencies

Copy link
Contributor

Choose a reason for hiding this comment

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

Is this bug out of scope here? If so, is there a follow-up issue?

Comment on lines -260 to +269
assert len(specviz_viewer.figure.marks) == 1
assert len([m for m in specviz_viewer.figure.marks if isinstance(m, LineUncertainties)]) == 0

specviz_viewer.show_uncertainties()

assert len(specviz_viewer.figure.marks) == 2
assert len([m for m in specviz_viewer.figure.marks if isinstance(m, LineUncertainties)]) == 1

specviz_viewer.clean()

assert len(specviz_viewer.figure.marks) == 1
assert len([m for m in specviz_viewer.figure.marks if isinstance(m, LineUncertainties)]) == 0
Copy link
Member Author

Choose a reason for hiding this comment

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

changed this since the LineAnalysis plugin might add (hidden) marks, so let's just check against the ones we expect for uncertainties.

@cached_property
def selected_obj(self):
if self.selected == self._default_text:
if self.selected == self._default_text or self.selected not in self.labels:
Copy link
Member Author

Choose a reason for hiding this comment

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

this is needed since this could be triggered by an observer in a plugin WHILE an error is raised on an invalid selection and before the default can be applied

@kecnry kecnry force-pushed the data-select-component branch from d959d72 to 023d846 Compare April 1, 2022 20:00
@kecnry kecnry marked this pull request as ready for review April 1, 2022 20:06
Copy link
Contributor

@pllim pllim left a comment

Choose a reason for hiding this comment

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

In the Moment Map plugin, I dunno how I feel about "Spectral Region" dropdown not appearing until there is a spectral subset created. At first I thought it was a bug and got confused. Also, I use that dropdown to remind me that I can actually create moment map with Subset. Without that dropdown to remind me, I won't get reminded until I create a Subset, which I might not. Maybe that's just me? 🤷

@kecnry
Copy link
Member Author

kecnry commented Apr 4, 2022

I dunno how I feel about "Spectral Region" dropdown not appearing until there is a spectral subset created.

I did this in a number of places, but it is easily changed by setting show_if_single_entry="true" in the template. Alternatively, especially for subsets, we could have the dropdown replaced with text explaining how to add a subset etc if there are no subsets?

@rosteen
Copy link
Collaborator

rosteen commented Apr 4, 2022

+1 from me for keeping the subset dropdowns visible even if there are currently none as a reminder that subsets could be applied to the operations in the plugin.

Copy link
Collaborator

@rosteen rosteen left a comment

Choose a reason for hiding this comment

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

Looks pretty good, other than agreeing with @pllim's comment as I said already. The filter logic made enough sense for me to see how it's used, but I'm definitely adding that to my mental list of "things that should be explained in the developer docs." I'm going to hold off on approving until the subset selection default behavior is updated.

</v-row>
</div>
</template>
<script>
Copy link
Collaborator

Choose a reason for hiding this comment

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

Looking through this, I realized I don't have a good idea of what module.exports does on top of the other vuetify stuff, despite it being used in a bunch of the .vue files. I should go do some reading 😅

Copy link
Member Author

Choose a reason for hiding this comment

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

You can do a lot in the exports, but here the props are the properties/arguments that are accepted when calling the template component from another template.

@kecnry
Copy link
Member Author

kecnry commented Apr 4, 2022

I changed it so that all subset dropdowns are always visible (and dataset dropdowns are always visible in mosviz, since I think its important to give some indication of the change as you change rows).

@pllim
Copy link
Contributor

pllim commented Apr 4, 2022

"Plot all" of SDSS lines on Cubeviz example notebook seems very slow but I can't tell if it is related to this refactoring or not.

@kecnry kecnry force-pushed the data-select-component branch from fe6831c to a30cbfa Compare April 5, 2022 15:13
@javerbukh
Copy link
Contributor

javerbukh commented Apr 5, 2022

Going off of @pllim's review, I do see another weird interaction.

  1. Start Imviz example notebook
  2. Create new viewer
  3. Open plot options
  4. De-select data from imviz-0
  5. Select data in imviz-1
  6. Look at plot options for imviz-1

There should be nothing showing in the drop down for layer options and a traceback in the console.

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/ipyvue/VueTemplateWidget.py:60, in Events._handle_event(self, _, content, buffers)
     58     getattr(self, "vue_" + event)(data, buffers)
     59 else:
---> 60     getattr(self, "vue_" + event)(data)

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/app.py:1117, in Application.vue_data_item_selected(self, event)
   1113 else:
   1114     selected_items = list(filter(
   1115         lambda id: id != item_id, viewer_item['selected_data_items']))
-> 1117 self._update_selected_data_items(viewer_id, selected_items)

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/app.py:1162, in Application._update_selected_data_items(self, viewer_id, selected_items)
   1157     viewer.add_data(data)
   1159     add_data_message = AddDataMessage(data, viewer,
   1160                                       viewer_id=viewer_id,
   1161                                       sender=self)
-> 1162     self.hub.broadcast(add_data_message)
   1164 # Remove any deselected data objects from viewer
   1165 viewer_data = [layer_state.layer
   1166                for layer_state in viewer.state.layers
   1167                if hasattr(layer_state, 'layer') and
   1168                isinstance(layer_state.layer, BaseData)]

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/glue/core/hub.py:215, in Hub.broadcast(self, message)
    213 logging.getLogger(__name__).info("Broadcasting %s", message)
    214 for subscriber, handler in self._find_handlers(message):
--> 215     handler(message)

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/core/template_mixin.py:795, in DatasetSelect._on_data_changed(self, msg)
    790 def _on_data_changed(self, msg=None):
    791     # NOTE: _on_data_changed is passed without a msg object during init
    792     # future improvement: don't recreate the entire list when msg is passed
    793     self.items = [{"label": data.label} for data in self.app.data_collection
    794                   if self._is_valid_item(data)]
--> 795     self._apply_default_selection()
    796     # future improvement: only clear cache if the selected data entry was changed?
    797     self._clear_cache(*self._cached_properties)

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/core/template_mixin.py:235, in BaseSelectPluginComponent._apply_default_selection(self)
    232     return
    234 if self.default_mode == 'first':
--> 235     self.selected = self.labels[0] if len(self.labels) else ''
    236 elif self.default_mode == 'default_text':
    237     self.selected = self._default_text if self._default_text else ''

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/core/template_mixin.py:111, in BasePluginComponent.__setattr__(self, attr, value, force_super)
    108 if attr[0] == '_' or force_super or attr not in self._plugin_traitlets.keys():
    109     return super().__setattr__(attr, value)
--> 111 return setattr(self._plugin, self._plugin_traitlets.get(attr), value)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/traitlets/traitlets.py:606, in TraitType.__set__(self, obj, value)
    604     raise TraitError('The "%s" trait is read-only.' % self.name)
    605 else:
--> 606     self.set(obj, value)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/traitlets/traitlets.py:595, in TraitType.set(self, obj, value)
    591     silent = False
    592 if silent is not True:
    593     # we explicitly compare silent to True just in case the equality
    594     # comparison above returns something other than True/False
--> 595     obj._notify_trait(self.name, old_value, new_value)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/traitlets/traitlets.py:1219, in HasTraits._notify_trait(self, name, old_value, new_value)
   1218 def _notify_trait(self, name, old_value, new_value):
-> 1219     self.notify_change(Bunch(
   1220         name=name,
   1221         old=old_value,
   1222         new=new_value,
   1223         owner=self,
   1224         type='change',
   1225     ))

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/ipywidgets/widgets/widget.py:686, in Widget.notify_change(self, change)
    683     if name in self.keys and self._should_send_property(name, getattr(self, name)):
    684         # Send new state to front-end
    685         self.send_state(key=name)
--> 686 super(Widget, self).notify_change(change)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/traitlets/traitlets.py:1229, in HasTraits.notify_change(self, change)
   1227 def notify_change(self, change):
   1228     """Notify observers of a change event"""
-> 1229     return self._notify_observers(change)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/traitlets/traitlets.py:1266, in HasTraits._notify_observers(self, event)
   1263 elif isinstance(c, EventHandler) and c.name is not None:
   1264     c = getattr(self, c.name)
-> 1266 c(event)

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/configs/default/plugins/metadata_viewer/metadata_viewer.py:23, in MetadataViewer._show_metadata(self, event)
     21 @observe("dataset_selected")
     22 def _show_metadata(self, event):
---> 23     data = self.dataset.selected_obj
     24     if data is None:
     25         self.has_metadata = False

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/functools.py:967, in cached_property.__get__(self, instance, owner)
    965 val = cache.get(self.attrname, _NOT_FOUND)
    966 if val is _NOT_FOUND:
--> 967     val = self.func(instance)
    968     try:
    969         cache[self.attrname] = val

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/core/template_mixin.py:749, in DatasetSelect.selected_obj(self)
    746         return match
    747 # handle the case of empty Application with no viewer, we'll just pull directly
    748 # from the data collection
--> 749 return self.get_object(cls=Spectrum1D)

File ~/Documents/jdaviz_dev/jdaviz/jdaviz/core/template_mixin.py:729, in DatasetSelect.get_object(self, *args, **kwargs)
    726 if self.selected not in self.labels:
    727     # _apply_default_selection will override shortly anyways
    728     return None
--> 729 return self.selected_dc_item.get_object(*args, **kwargs)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/glue/core/data.py:289, in BaseData.get_object(self, cls, **kwargs)
    284         raise ValueError('Specify the object class to use with cls= - supported '
    285                          'classes are:' + format_choices(data_translator.supported_classes))
    287 handler, _ = data_translator.get_handler_for(cls)
--> 289 return handler.to_object(self, **kwargs)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/glue_astronomy/translators/spectrum1d.py:288, in Specutils1DHandler.to_object(self, data_or_subset, attribute, statistic)
    283     return data_kwargs
    285 data_kwargs = parse_attributes(
    286     [attribute] if not hasattr(attribute, '__len__') else attribute)
--> 288 return Spectrum1D(**data_kwargs, **kwargs)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/specutils/spectra/spectrum1d.py:276, in Spectrum1D.__init__(self, flux, spectral_axis, wcs, velocity_convention, rest_value, redshift, radial_velocity, bin_specification, **kwargs)
    271 # If no spectral_axis was provided, create a SpectralCoord based on
    272 # the WCS
    273 if spectral_axis is None:
    274     # If the WCS doesn't have a spectral attribute, we assume it's the
    275     # dummy GWCS we created or a solely spectral WCS
--> 276     if hasattr(self.wcs, "spectral"):
    277         # Handle generated 1D WCS that aren't set to spectral
    278         if not self.wcs.is_spectral and self.wcs.naxis == 1:
    279             spec_axis = self.wcs.pixel_to_world(np.arange(self.flux.shape[-1]))

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/astropy/wcs/wcs.py:3212, in WCS.spectral(self)
   3207 @property
   3208 def spectral(self):
   3209     """
   3210     A copy of the current WCS with only the spectral axes included
   3211     """
-> 3212     return self.sub([WCSSUB_SPECTRAL])

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/astropy/wcs/wcs.py:592, in WCS.sub(self, axes)
    590 def sub(self, axes=None):
--> 592     copy = self.deepcopy()
    594     # We need to know which axes have been dropped, but there is no easy
    595     # way to do this with the .sub function, so instead we assign UUIDs to
    596     # the CNAME parameters in copy.wcs. We can later access the original
    597     # CNAME properties from self.wcs.
    598     cname_uuid = [str(uuid.uuid4()) for i in range(copy.wcs.naxis)]

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/astropy/wcs/wcs.py:588, in WCS.deepcopy(self)
    581 def deepcopy(self):
    582     """
    583     Return a deep copy of the object.
    584 
    585     Convenience method so user doesn't have to import the
    586     :mod:`copy` stdlib module.
    587     """
--> 588     return copy.deepcopy(self)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/copy.py:153, in deepcopy(x, memo, _nil)
    151 copier = getattr(x, "__deepcopy__", None)
    152 if copier is not None:
--> 153     y = copier(memo)
    154 else:
    155     reductor = dispatch_table.get(cls)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/site-packages/astropy/wcs/wcs.py:561, in WCS.__deepcopy__(self, memo)
    556 new_copy = self.__class__()
    557 new_copy.naxis = deepcopy(self.naxis, memo)
    558 WCSBase.__init__(new_copy, deepcopy(self.sip, memo),
    559                  (deepcopy(self.cpdis1, memo),
    560                   deepcopy(self.cpdis2, memo)),
--> 561                  deepcopy(self.wcs, memo),
    562                  (deepcopy(self.det2im1, memo),
    563                   deepcopy(self.det2im2, memo)))
    564 for key, val in self.__dict__.items():
    565     new_copy.__dict__[key] = deepcopy(val, memo)

File ~/opt/anaconda3/envs/dataset_select_dev/lib/python3.8/copy.py:153, in deepcopy(x, memo, _nil)
    151 copier = getattr(x, "__deepcopy__", None)
    152 if copier is not None:
--> 153     y = copier(memo)
    154 else:
    155     reductor = dispatch_table.get(cls)

RuntimeError: NULL error object in wcslib

@pllim
Copy link
Contributor

pllim commented Apr 5, 2022

Hmm weird that Metadata Viewer from Imviz would call this:

--> 749 return self.get_object(cls=Spectrum1D)

kecnry added 9 commits April 5, 2022 14:32
TODO:
* implement spatial subset support for model fitting
* test/finish gaussian smooth in cubeviz
* cleanup model fitting
* to make it clear that the plugin does take subsets as an option and give a hint to the user to create them
calls to get_data/subset still require passing ref, so both are stored internally
@kecnry kecnry force-pushed the data-select-component branch from a30cbfa to 1a56f01 Compare April 5, 2022 18:33
kecnry added 2 commits April 5, 2022 15:01
* although calling this will still likely raise an error... bottom line is that we can't call get_object or selected_obj in imviz for viewers without ids.
*  otherwise calling for imviz viewers without assigned references will fail without passing a known object class (which we cannot always assume to be Spectrum1D)
@pllim pllim mentioned this pull request Apr 5, 2022
15 tasks
* and show message saying no metadata is available
* see spacetelescope#1221 (comment)
@pllim
Copy link
Contributor

pllim commented Apr 6, 2022

Found one more thing: Layer does not show anything when imviz-0 has no data but other viewer does.

Screenshot 2022-04-06 120125

Copy link
Contributor

@pllim pllim left a comment

Choose a reason for hiding this comment

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

I think this is good now, as far as Imviz is concerned. I found a bug in Line Profile but it is also in main so I will open a separate issue for that (#1238).

@pllim pllim merged commit 48ea2f3 into spacetelescope:main Apr 6, 2022
@pllim
Copy link
Contributor

pllim commented Apr 6, 2022

Thanks!

pllim added a commit to pllim/jdaviz that referenced this pull request Apr 6, 2022
@kecnry kecnry deleted the data-select-component branch April 7, 2022 17:53
pllim added a commit to pllim/jdaviz that referenced this pull request Apr 8, 2022
pllim added a commit to pllim/jdaviz that referenced this pull request Apr 26, 2022
pllim added a commit to pllim/jdaviz that referenced this pull request Apr 29, 2022
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
imviz plugin Label for plugins common to multiple configurations Ready for final review specviz
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Line Analysis crashes when opened with no data loaded
4 participants