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

Display units line analysis #2128

Merged

Conversation

kecnry
Copy link
Member

@kecnry kecnry commented Apr 4, 2023

Description

This pull request updates the line analysis plugin to support changes to the display unit.

Screen.Recording.2023-04-04.at.1.36.26.PM.mov

(Note that the limits resetting are reported in #2126)

Changelog will point to #2127 so is ignored from CI here.

Change log entry

  • Is a change log needed? If yes, is it added to CHANGES.rst? If you want to avoid merge conflicts,
    list the proposed change log here for review and add to CHANGES.rst before merge. If no, maintainer
    should add a no-changelog-entry-needed label.

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 milestone set? Set this to bugfix milestone if this is a bug fix and needs to be released ASAP; otherwise, set this to the next major release milestone.
  • After merge, any internal documentations need updating (e.g., JIRA, Innerspace)?

@kecnry kecnry added specviz no-changelog-entry-needed changelog bot directive labels Apr 4, 2023
@kecnry kecnry added this to the 3.5 milestone Apr 4, 2023
@kecnry kecnry force-pushed the display-units-line-analysis branch from 8499abc to 3dc8701 Compare April 4, 2023 17:34
@kecnry kecnry marked this pull request as ready for review April 4, 2023 17:37
@kecnry kecnry force-pushed the dev-display-units branch from 63f23d2 to ee8deb9 Compare April 4, 2023 17:43
@kecnry kecnry force-pushed the display-units-line-analysis branch from 3dc8701 to eef105e Compare April 4, 2023 17:44
Copy link
Contributor

@javerbukh javerbukh left a comment

Choose a reason for hiding this comment

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

Works well, thanks!

Copy link
Collaborator

@duytnguyendtn duytnguyendtn left a comment

Choose a reason for hiding this comment

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

Specviz works as the demo video shows on my end! Though I did run into this in Cubeviz example notebook. Confirmed this isn't on main for me. Anyone else seeing this? Should i report this in #2127?
image

@kecnry
Copy link
Member Author

kecnry commented Apr 5, 2023

Adding support for cubeviz and the slice plugin is definitely on the todo list, so I added a todo item in the description of #2127 pointing back here (I don't remember seeing this on my machine, but it could be data or update-version dependent).

@duytnguyendtn
Copy link
Collaborator

One more error to note in Mosviz (found in MosvizNIRISSExample). I'll add it to the list

ValueError: cannot detect unit conversion plugin

Traceback
>>> mosviz.load_data(directory=f"{data_dir}/niriss_1324_reprocessed/", instrument="niriss")
Loading: Images
Loading: 2D Spectra C sources
Loading: 2D Spectra R sources
Loading: 1D Spectra C sources
Loading: 1D Spectra R sources
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[5], line 1
----> 1 mosviz.load_data(directory=f"{data_dir}/niriss_1324_reprocessed/", instrument="niriss")

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\configs\mosviz\helper.py:534, in Mosviz.load_data(self, spectra_1d, spectra_2d, images, spectra_1d_label, spectra_2d_label, images_label, *args, **kwargs)
    529 self.app.get_viewer(
    530     self._default_image_viewer_reference_name
    531 ).figure.axes[1].label_offset = "-50"
    533 # Load the first object into the viewers automatically
--> 534 self.app.get_viewer(self._default_table_viewer_reference_name).figure_widget.highlighted = 0
    536 # Notify the user that this all loaded successfully
    537 loaded_msg = SnackbarMessage("MOS data loaded successfully", color="success", sender=self)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:732, in TraitType.__set__(self, obj, value)
    730     raise TraitError('The "%s" trait is read-only.' % self.name)
    731 else:
--> 732     self.set(obj, value)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:721, in TraitType.set(self, obj, value)
    717     silent = False
    718 if silent is not True:
    719     # we explicitly compare silent to True just in case the equality
    720     # comparison above returns something other than True/False
--> 721     obj._notify_trait(self.name, old_value, new_value)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:1505, in HasTraits._notify_trait(self, name, old_value, new_value)
   1504 def _notify_trait(self, name, old_value, new_value):
-> 1505     self.notify_change(
   1506         Bunch(
   1507             name=name,
   1508             old=old_value,
   1509             new=new_value,
   1510             owner=self,
   1511             type="change",
   1512         )
   1513     )

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\ipywidgets\widgets\widget.py:701, in Widget.notify_change(self, change)
    698     if name in self.keys and self._should_send_property(name, getattr(self, name)):
    699         # Send new state to front-end
    700         self.send_state(key=name)
--> 701 super().notify_change(change)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:1517, in HasTraits.notify_change(self, change)
   1515 def notify_change(self, change):
   1516     """Notify observers of a change event"""
-> 1517     return self._notify_observers(change)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:1564, in HasTraits._notify_observers(self, event)
   1561 elif isinstance(c, EventHandler) and c.name is not None:
   1562     c = getattr(self, c.name)
-> 1564 c(event)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\configs\mosviz\plugins\viewers.py:228, in MosvizTableViewer._on_row_selected(self, event)
    222                     self.session.hub.broadcast(remove_data_from_viewer_message)
    224         add_data_to_viewer_message = AddDataToViewerMessage(
    225             self._default_spectrum_viewer_reference_name,
    226             selected_data, sender=self
    227         )
--> 228         self.session.hub.broadcast(add_data_to_viewer_message)
    230         self._selected_data[
    231             self._default_spectrum_viewer_reference_name
    232         ] = selected_data
    234 if component.label == '2D Spectra':

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\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 E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\app.py:296, in Application.__init__.<locals>.<lambda>(msg)
    290 # Subscribe to the event fired when data is deleted from the
    291 #  application-level data collection object
    292 self.hub.subscribe(self, DataCollectionDeleteMessage,
    293                    handler=self._on_data_deleted)
    295 self.hub.subscribe(self, AddDataToViewerMessage,
--> 296                    handler=lambda msg: self.add_data_to_viewer(
    297                        msg.viewer_reference, msg.data_label))
    299 self.hub.subscribe(self, RemoveDataFromViewerMessage,
    300                    handler=lambda msg: self.remove_data_from_viewer(
    301                        msg.viewer_reference, msg.data_label))
    303 # Subscribe to snackbar messages and tie them to the display of the
    304 #  message box

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\app.py:1263, in Application.add_data_to_viewer(self, viewer_reference, data_label, visible, clear_other_data)
   1260 if viewer_item is None:
   1261     raise ValueError(f"Could not identify viewer with reference {viewer_reference}")
-> 1263 self.set_data_visibility(viewer_item, data_label, visible=visible, replace=clear_other_data)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\app.py:1606, in Application.set_data_visibility(self, viewer_reference, data_label, visible, replace)
   1601     viewer.add_data(data, percentile=95, color=viewer.color_cycler())
   1603     add_data_message = AddDataMessage(data, viewer,
   1604                                       viewer_id=viewer_id,
   1605                                       sender=self)
-> 1606     self.hub.broadcast(add_data_message)
   1608 # set visibility state of all applicable layers
   1609 for layer in viewer.layers:

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\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 E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\core\template_mixin.py:1606, in DatasetSelect._on_data_changed(self, msg)
   1602 if getattr(self, '_include_spatial_subsets', False):
   1603     # allow for spatial subsets to be listed
   1604     self.items = self.items + [_dc_to_dict(subset) for subset in self.app.data_collection.subset_groups  # noqa
   1605                                if _subset_type(subset) == 'spatial']
-> 1606 self._apply_default_selection()
   1607 # future improvement: only clear cache if the selected data entry was changed?
   1608 self._clear_cache(*self._cached_properties)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\core\template_mixin.py:608, in SelectPluginComponent._apply_default_selection(self, skip_if_current_valid)
    605     return
    607 if self.default_mode == 'first':
--> 608     self.selected = self.labels[0] if len(self.labels) else ''
    609 elif self.default_mode == 'default_text':
    610     self.selected = self._default_text if self._default_text else ''

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\core\template_mixin.py:343, in BasePluginComponent.__setattr__(self, attr, value, force_super)
    340 if attr[0] == '_' or force_super or attr not in self._plugin_traitlets.keys():
    341     return super().__setattr__(attr, value)
--> 343 return setattr(self._plugin, self._plugin_traitlets.get(attr), value)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:732, in TraitType.__set__(self, obj, value)
    730     raise TraitError('The "%s" trait is read-only.' % self.name)
    731 else:
--> 732     self.set(obj, value)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:721, in TraitType.set(self, obj, value)
    717     silent = False
    718 if silent is not True:
    719     # we explicitly compare silent to True just in case the equality
    720     # comparison above returns something other than True/False
--> 721     obj._notify_trait(self.name, old_value, new_value)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:1505, in HasTraits._notify_trait(self, name, old_value, new_value)
   1504 def _notify_trait(self, name, old_value, new_value):
-> 1505     self.notify_change(
   1506         Bunch(
   1507             name=name,
   1508             old=old_value,
   1509             new=new_value,
   1510             owner=self,
   1511             type="change",
   1512         )
   1513     )

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\ipywidgets\widgets\widget.py:701, in Widget.notify_change(self, change)
    698     if name in self.keys and self._should_send_property(name, getattr(self, name)):
    699         # Send new state to front-end
    700         self.send_state(key=name)
--> 701 super().notify_change(change)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:1517, in HasTraits.notify_change(self, change)
   1515 def notify_change(self, change):
   1516     """Notify observers of a change event"""
-> 1517     return self._notify_observers(change)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\traitlets\traitlets.py:1564, in HasTraits._notify_observers(self, event)
   1561 elif isinstance(c, EventHandler) and c.name is not None:
   1562     c = getattr(self, c.name)
-> 1564 c(event)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\configs\default\plugins\model_fitting\model_fitting.py:331, in ModelFitting._dataset_selected_changed(self, event)
    327 if not hasattr(self, 'dataset') or self.app._jdaviz_helper is None or self.dataset_selected == '':  # noqa
    328     # during initial init, this can trigger before the component is initialized
    329     return
--> 331 selected_spec = self._get_1d_spectrum()
    332 if selected_spec is None:
    333     return

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\configs\default\plugins\model_fitting\model_fitting.py:310, in ModelFitting._get_1d_spectrum(self)
    308 def _get_1d_spectrum(self):
    309     # retrieves the 1d spectrum (accounting for spatial subset for cubeviz, if necessary)
--> 310     return self.dataset.selected_spectrum_for_spatial_subset(self.spatial_subset_selected)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\core\template_mixin.py:1540, in DatasetSelect.selected_spectrum_for_spatial_subset(self, spatial_subset, use_display_units)
   1538 if spatial_subset == SPATIAL_DEFAULT_TEXT:
   1539     spatial_subset = None
-> 1540 return self.plugin._specviz_helper.get_data(data_label=self.selected,
   1541                                             subset_to_apply=spatial_subset,
   1542                                             use_display_units=use_display_units)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\configs\specviz\helper.py:306, in Specviz.get_data(self, data_label, cls, subset_to_apply, use_display_units)
    303 else:
    304     function = None
--> 306 return self._get_data(data_label=data_label, cls=cls, subset_to_apply=subset_to_apply,
    307                       function=function, use_display_units=use_display_units)

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\core\helpers.py:473, in ConfigHelper._get_data(self, data_label, cls, subset_to_apply, function, use_display_units)
    470     else:
    471         data = data.get_object(cls=cls, **object_kwargs)
--> 473     return _handle_display_units(data, use_display_units)
    475 if not cls and subset_to_apply:
    476     raise AttributeError(f"A valid cls must be provided to"
    477                          f" apply subset {subset_to_apply} to data. "
    478                          f"Instead, {cls} was given.")

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\core\helpers.py:415, in ConfigHelper._get_data.<locals>._handle_display_units(data, use_display_units)
    413 if use_display_units:
    414     if isinstance(data, Spectrum1D):
--> 415         spectral_unit = self.app._get_display_unit('spectral')
    416         flux_unit = self.app._get_display_unit('flux')
    417         # TODO: any other attributes (meta, wcs, etc)?
    418         # TODO: implement uncertainty.to upstream

File E:\STScI\gitRepos\jdaviz\envpr2128\lib\site-packages\jdaviz\app.py:1078, in Application._get_display_unit(self, axis)
   1076 def _get_display_unit(self, axis):
   1077     if self._jdaviz_helper is None or self._jdaviz_helper.plugins.get('Unit Conversion') is None:  # noqa
-> 1078         raise ValueError("cannot detect unit conversion plugin")
   1079     try:
   1080         return getattr(self._jdaviz_helper.plugins.get('Unit Conversion')._obj,
   1081                        f'{axis}_unit_selected')

ValueError: cannot detect unit conversion plugin

Copy link
Collaborator

@duytnguyendtn duytnguyendtn left a comment

Choose a reason for hiding this comment

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

Okay with the issues in Cubeviz and Mosviz noted and squarely looking at Specviz, the reported behavior does work for me! A quick runthrough of the code looks good, though I'm not going through with a fine-toothed comb for now; figured we do that at the end once we merge the whole branch in

@kecnry kecnry merged commit 72aafdc into spacetelescope:dev-display-units Apr 5, 2023
@kecnry kecnry deleted the display-units-line-analysis branch April 5, 2023 18:01
kecnry added a commit that referenced this pull request Apr 17, 2023
* emit event when display unit changed
* update line analysis for unit changes
kecnry added a commit that referenced this pull request Apr 18, 2023
* emit event when display unit changed
* update line analysis for unit changes
kecnry added a commit that referenced this pull request Apr 19, 2023
* emit event when display unit changed
* update line analysis for unit changes
kecnry added a commit that referenced this pull request May 4, 2023
* emit event when display unit changed
* update line analysis for unit changes
rosteen pushed a commit to rosteen/jdaviz that referenced this pull request May 11, 2023
* emit event when display unit changed
* update line analysis for unit changes
rosteen pushed a commit to rosteen/jdaviz that referenced this pull request May 15, 2023
* emit event when display unit changed
* update line analysis for unit changes
rosteen added a commit that referenced this pull request Jun 13, 2023
* Added .ico and .svg files

* app-wide display unit in specviz (#2048)

* basic app-wide display unit in specviz (not all plugins are updated yet)
* unit-aware select component which maps to glue-supported unit strings
* implement use_display_units option for get_data, get_subsets

Co-authored-by: Jesse Averbukh <javerbukh@gmail.com>
Co-authored-by: Kyle Conroy <kyleconroy@gmail.com>

* bump glue-core to necessary version for display units

* change PR number in changelog to main PR

* Display units line analysis (#2128)

* emit event when display unit changed
* update line analysis for unit changes

* cubeviz/slice plugin unit conversion support

(we might want to generalize some of this logic more into the mark's _update_data when adding support for spectral lines as well)

* Display units support for markers plugin (#2130)

* update markers plugin for display units
* move unit-updating logic to mark itself
* LineUncertainties to be unit-aware
* fix support for markers in cubeviz

* display units: fix failing tests (#2132)

* fix error raised when spectrum uncertainty is None
* fix RTD build failure because of missing mixin available in import
* fix test setting display unit now that um is preferred to micron
* add disabled unit conversion plugin to mosviz
* avoid unit-conversion error in cubeviz tests
* bump versions of glue/glue-jupyter
* fix deg intialization in cubeviz slice plugin
* add LinesAutoUnit to __all__ so RTD can find it
* add use_display_units kwarg to get_spectral_regions
* fix setting display units for unitless data
* Apply suggestions from code review

Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>

* Display units: line lists (#2148)

* BaseSpectrumVerticalLine to inherit unit-support from PluginMark
* convert units on internal rest value
* code cleanup

* remove unit conversion plugin from all bug specviz

* for initial implementation - eventually we'll want to implement across all plugins/viewers

* get_display_unit fallback for configs without unit conversion plugin

* Update glue-core dependency

* Update Subset Tools plugin to use display units (#2195)

* bump glue-core to necessary version for display units

* cubeviz/slice plugin unit conversion support

(we might want to generalize some of this logic more into the mark's _update_data when adding support for spectral lines as well)

* display units: fix failing tests (#2132)

* fix error raised when spectrum uncertainty is None
* fix RTD build failure because of missing mixin available in import
* fix test setting display unit now that um is preferred to micron
* add disabled unit conversion plugin to mosviz
* avoid unit-conversion error in cubeviz tests
* bump versions of glue/glue-jupyter
* fix deg intialization in cubeviz slice plugin
* add LinesAutoUnit to __all__ so RTD can find it
* add use_display_units kwarg to get_spectral_regions
* fix setting display units for unitless data
* Apply suggestions from code review

Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>

* remove unit conversion plugin from all bug specviz

* for initial implementation - eventually we'll want to implement across all plugins/viewers

* Working on unit conversion handling in subset plugin

* Get subset updating working in non-default units

* Add changelog

* Update jdaviz/configs/default/plugins/subset_plugin/subset_plugin.vue

Co-authored-by: Kyle Conroy <kyleconroy@gmail.com>

---------

Co-authored-by: Kyle Conroy <kyleconroy@gmail.com>
Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>

* allow downstream apps to set what classes are considered native marks

* Fix unit conversion for PluginMarks and y-limits (#2215)

* Fix unit conversion for PluginMarks and y-limits

* Only use equivalency if it's a spec viewer

* Store wavelength unit on data update

* Remove redundant line

* Better check in marks

* Replace subset_to_apply in docs where possible (#2223)

* Replace subset_to_apply in docs where possible (#2223)

* Avoid trying to convert units of empty marks arrays

* Add open method to automatically detect config and load data

* Update demo notebooks

* Codestyle

* Add autoconfig test coverage

* Revert "Update demo notebooks"

This reverts commit cc513b3.

* Add mention of open to relevant example notebooks

* Prepare to support open via cli

* Remove the need to open file twice for autoconfig detection

* Fix Helper vs App Docstring

* TST: Change PIP_EXTRA_INDEX_URL
because packages moved where they upload nightly builds.

* Display units: model fitting (#2216)

* model component compatibility based on display units
* equation validity based on display units
* allow re-estimating model parameters to update compat checks
* test coverage
* get_data(use_display_units) to pass spectral_density equivalency
* handle whitespace in model equation

* Add clarity for kwargs

* plugin results: support overwriting when data loaded in multiple viewers (#2222)

* reverts removal of call to set_plot_axes when loading data into viewer (#2235)

* fixes a bug in the axes labels on cube viewers in cubeviz as well as setting the correct attributes in lcviz

* Subsume failing identifier test into autoconfig test

* Update subset plugin UI (#2234)

* Update subset plugin UI

* Apply suggestions from code review

Co-authored-by: Kyle Conroy <kyleconroy@gmail.com>

---------

Co-authored-by: Kyle Conroy <kyleconroy@gmail.com>

* Changelog

* Add docs page to explain how to create jdaviz-readable products (#2228)

* Add page for data products

* Update index

* Fix title

* Capital letters

* Address first review comments

* Edit format

* Apply suggestions from code review

Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>

* Including reference in import_data

* Update docs/create_products.rst

* Update docs/create_products.rst

---------

Co-authored-by: Camilla Pacifici <cpacifici@stsci.edu>
Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>
Co-authored-by: Ricky O'Steen <39831871+rosteen@users.noreply.github.com>

* FEAT: Load annulus from file
and allow IMPORT DATA to load reg files.

Annulus support provided by glue-viz/glue#2403 and glue-viz/glue-astronomy#92

Add test for exception.

Bump minimum requirements for glue-core and glue-astronomy.

* disallow gaussian smooth output as input

* BUG: Fix ellipse translation
in app.get_subsets()

* DOC: Use pydata-sphinx-theme (#2243)

* DOC: Use pydata-sphinx-theme
that has dark mode, modern design, and mobile friendly

DOC: No longer need tomli

DOC: Now requires sphinx-astropy 1.9.1

* Add cards to index page
with icons

* Remove iframe hardcoding so it scales
in mobile mode

* DOC: Insert small logo next to title
instead of a giant logo above the title

* Add app method to simplify spectral subset (#2237)

* Add app method to simplify spectral subset

Add simplify button to subset plugin

* Fix xor bug exposed by simplify button

* Fix style checks

* Remove print statements

* Add tooltip to simplify button

* Make button appear only if the subset can be simplified

* Make simplify button appear only when applicable

* Apply suggestions from code review

Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>

* Update changes file

---------

Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>

* Fix missed conflict

---------

Co-authored-by: Jennifer Kotler <jkotler@esme.stsci.edu>
Co-authored-by: P. L. Lim <2090236+pllim@users.noreply.github.com>
Co-authored-by: Jesse Averbukh <javerbukh@gmail.com>
Co-authored-by: Ricky O'Steen <rosteen@stsci.edu>
Co-authored-by: Ricky O'Steen <39831871+rosteen@users.noreply.github.com>
Co-authored-by: Duy Nguyen <duytnguyendtn.open@gmail.com>
Co-authored-by: Camilla Pacifici <camilla.pacifici@gmail.com>
Co-authored-by: Camilla Pacifici <cpacifici@stsci.edu>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants