Skip to content

[BUG] #4005

@bmorris3

Description

@bmorris3

Jdaviz component

Imviz

Description

While testing #4002, I was running this snippet:

import jdaviz as jd

jd.load('mast:JWST/product/jw06557001002_02101_00002_nrcb3_cal.fits')
jd.show()

### new cell ###

jd.loaders['astroquery'].open_in_tray()
jd.loaders['astroquery'].viewer = 'Image'

jd.plugins['Orientation'].align_by = 'WCS'

That worked fine. However, you put both of these lines in the same cell, you get a big traceback, collapsed below:

Traceback
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
Cell In[1], line 8
      5 jd.loaders['astroquery'].open_in_tray()
      6 jd.loaders['astroquery'].viewer = 'Image'
----> 8 jd.plugins['Orientation'].align_by = 'WCS'

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/user_api.py:113](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/user_api.py#line=112), in UserApiWrapper.__setattr__(self, attr, value)
    110         else:
    111             # allow setting by single index or name
    112             value = to_choice_single(value)
--> 113     exp_obj.selected = value
    114     return
    116 elif isinstance(exp_obj, AddResults):

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/template_mixin.py:1009](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/template_mixin.py#line=1008), in BasePluginComponent.__setattr__(self, attr, value, force_super)
   1007     return super().__setattr__(attr, value)
   1008 value = self.map_value(attr, value)
-> 1009 return setattr(self._plugin, self._plugin_traitlets.get(attr), value)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:716](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=715), in TraitType.__set__(self, obj, value)
    714 if self.read_only:
    715     raise TraitError('The "%s" trait is read-only.' % self.name)
--> 716 self.set(obj, value)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:706](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=705), in TraitType.set(self, obj, value)
    702     silent = False
    703 if silent is not True:
    704     # we explicitly compare silent to True just in case the equality
    705     # comparison above returns something other than True[/False](http://localhost:8890/False)
--> 706     obj._notify_trait(self.name, old_value, new_value)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:1513](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=1512), in HasTraits._notify_trait(self, name, old_value, new_value)
   1512 def _notify_trait(self, name: str, old_value: t.Any, new_value: t.Any) -> None:
-> 1513     self.notify_change(
   1514         Bunch(
   1515             name=name,
   1516             old=old_value,
   1517             new=new_value,
   1518             owner=self,
   1519             type="change",
   1520         )
   1521     )

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:701](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=700), 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 [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:1525](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=1524), in HasTraits.notify_change(self, change)
   1523 def notify_change(self, change: Bunch) -> None:
   1524     """Notify observers of a change event"""
-> 1525     return self._notify_observers(change)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py:1568](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/traitlets/traitlets.py#line=1567), in HasTraits._notify_observers(self, event)
   1565 elif isinstance(c, EventHandler) and c.name is not None:
   1566     c = getattr(self, c.name)
-> 1568 c(event)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:256](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=255), in Orientation._update_link(self, msg)
    253 if self.align_by.selected == 'Pixels':
    254     self.wcs_fast_approximation = True
--> 256 self._link_image_data()
    257 # NOTE: _link_image_data will reset linking_in_progress to False
    258 
    259 # load data into the viewer that are now compatible with the
    260 # new link type, remove data from the viewer that are now
    261 # incompatible:
    262 wcs_linked = self.align_by.selected == 'WCS'

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:178](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=177), in Orientation._link_image_data(self)
    176 try:
    177     align_by = self.align_by.selected.lower()
--> 178     link_image_data(
    179         self.app,
    180         align_by=align_by,
    181         wcs_fallback_scheme='pixels' if self.wcs_use_fallback else None,
    182         wcs_fast_approximation=self.wcs_fast_approximation,
    183         error_on_fail=False)
    184 except Exception:  # pragma: no cover
    185     raise

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:775](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=774), in link_image_data(app, align_by, wcs_fallback_scheme, wcs_fast_approximation, error_on_fail)
    773     rotation_angle = -degn * u.deg
    774     ndd = _get_rotated_nddata_from_label(app, default_reference_layer.label, rotation_angle)
--> 775     add_wcs_data_to_app(app, ndd, data_label=base_wcs_layer_label)
    777 # set default layer to reference data in all viewers:
    778 for viewer_id in app.get_viewer_ids():

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:639](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=638), in add_wcs_data_to_app(app, data, data_label)
    638 def add_wcs_data_to_app(app, data, data_label=None):
--> 639     app._jdaviz_helper.load(data, format='Image',
    640                             data_label=data_label, viewer=[])
    641     # TODO: refactor logic to avoid having to send an AddDataMessage just to update icons
    642     # ensure that icons are updated by forcing a call to app._on_layers_changed
    643     image_viewer = app.get_viewers_of_cls(ImvizImageView)[0]

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/helpers.py:218](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/helpers.py#line=217), in ConfigHelper._load(self, inp, loader, format, target, **kwargs)
    216 importer = resolver.importer
    217 importer._obj._apply_kwargs(kwargs)
--> 218 out = resolver.load()
    219 # force cleanup before returning
    220 resolver._obj._cleanup()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/resolvers/resolver.py:886](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/resolvers/resolver.py#line=885), in BaseResolver.load(self)
    882 def load(self):
    883     """
    884     Import into jdaviz with all selected options.
    885     """
--> 886     return self.importer()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/image/image.py:353](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/image/image.py#line=352), in ImageImporter.__call__(self)
    350     if self.gwcs_to_fits_sip:
    351         output = self._glue_data_wcs_to_fits(output)
--> 353     self.add_to_data_collection(output, data_label, data_hash=ext_item.get('data_hash'),
    354                                 parent=parent_data_label if parent_data_label != data_label else None,  # noqa
    355                                 cls=CCDData)
    357 align_plg = self.app._jdaviz_helper.plugins.get('Orientation', None)
    358 if align_plg is not None:

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/importer.py:285](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/core/loaders/importers/importer.py#line=284), in BaseImporterToDataCollection.add_to_data_collection(self, data, data_label, data_hash, parent, viewer_select, cls)
    282 # Create a hashed representation of the data if not already present
    283 data.meta['_data_hash'] = data_hash if data_hash is not None else create_data_hash(data)
--> 285 self.app.add_data(data, data_label=data_label)
    286 if parent is not None:
    287     self.app._set_assoc_data_as_child(data_label, parent)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/app.py:1731](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/app.py#line=1730), in Application.add_data(self, data, data_label, notify_done, parent)
   1728 if data_label in self.data_collection.labels:
   1729     warnings.warn(f"Overwriting existing data entry with label '{data_label}'")
-> 1731 self.data_collection[data_label] = data
   1733 # manage associated Data entries:
   1734 self._add_assoc_data_as_parent(data_label)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:444](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=443), in DataCollection.__setitem__(self, key, data)
    441     if existing_data.label == key:
    442         self.remove(existing_data)
--> 444 self.append(data)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:90](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=89), in DataCollection.append(self, data)
     88         s.register()
     89     msg = DataCollectionAddMessage(self, data)
---> 90     self.hub.broadcast(msg)
     92 self._sync_link_manager()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py:225](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py#line=224), in Hub.broadcast(self, message)
    223 logging.getLogger(__name__).info("Broadcasting %s", message)
    224 for subscriber, handler in self._find_handlers(message):
--> 225     handler(message)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:215](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=214), in Orientation._on_new_app_data(self, msg)
    207         if "ra" in components or "Lon" in components:
    208             # linking currently removes any markers, so we want to skip
    209             # linking immediately after new markers are added. Check if
   (...)    212             # want to support linking WITH markers, # at which point this
    213             # if-statement should be removed.
    214             return
--> 215 self._link_image_data()
    216 self._check_if_data_with_wcs_exists()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:178](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=177), in Orientation._link_image_data(self)
    176 try:
    177     align_by = self.align_by.selected.lower()
--> 178     link_image_data(
    179         self.app,
    180         align_by=align_by,
    181         wcs_fallback_scheme='pixels' if self.wcs_use_fallback else None,
    182         wcs_fast_approximation=self.wcs_fast_approximation,
    183         error_on_fail=False)
    184 except Exception:  # pragma: no cover
    185     raise

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py:910](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/jdaviz/configs/imviz/plugins/orientation/orientation.py#line=909), in link_image_data(app, align_by, wcs_fallback_scheme, wcs_fast_approximation, error_on_fail)
    907         links_list += new_links
    909 if len(links_list) > 0:
--> 910     with app.data_collection.delay_link_manager_update():
    911         if len(data_already_linked):
    912             app.data_collection.add_link(links_list)  # Add to existing

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py:144](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py#line=143), in _GeneratorContextManager.__exit__(self, typ, value, traceback)
    142 if typ is None:
    143     try:
--> 144         next(self.gen)
    145     except StopIteration:
    146         return False

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:166](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=165), in DataCollection.delay_link_manager_update(self)
    164 yield
    165 self._disable_sync_link_manager -= 1
--> 166 self._sync_link_manager()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py:144](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data_collection.py#line=143), in DataCollection._sync_link_manager(self)
    142 # Avoid circular calls
    143 with self._ignore_link_manager_update():
--> 144     self._link_manager.update_externally_derivable_components()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/link_manager.py:255](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/link_manager.py#line=254), in LinkManager.update_externally_derivable_components(self, data)
    253         d = DerivedComponent(data, link)
    254         comps[cid] = d
--> 255     data._set_externally_derivable_components(comps)
    257 # Now update information about pixel-aligned data
    258 for data1 in data_collection:

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data.py:662](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/data.py#line=661), in BaseCartesianData._set_externally_derivable_components(self, derivable_components)
    660 if self.hub:
    661     msg = ExternallyDerivableComponentsChangedMessage(self)
--> 662     self.hub.broadcast(msg)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py:225](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/core/hub.py#line=224), in Hub.broadcast(self, message)
    223 logging.getLogger(__name__).info("Broadcasting %s", message)
    224 for subscriber, handler in self._find_handlers(message):
--> 225     handler(message)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/common/viewer.py:302](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/common/viewer.py#line=301), in Viewer._update_data(self, message)
    300 else:
    301     if layer_artist.layer is message.data:
--> 302         layer_artist.update()
    303         try:
    304             components_changed = message.components_changed

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/utils/matplotlib.py:172](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/utils/matplotlib.py#line=171), in defer_draw.<locals>.wrapper(*args, **kwargs)
    168 @wraps(func)
    169 def wrapper(*args, **kwargs):
    171     if len(DEFER_DRAW_BACKENDS) == 0:
--> 172         return func(*args, **kwargs)
    174     # Don't recursively defer draws. We just check the first draw_idle
    175     # method since all should be modified in sync.
    176     if isinstance(DEFER_DRAW_BACKENDS[0].draw_idle, DeferredMethod):

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/image/layer_artist.py:215](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue/viewers/image/layer_artist.py#line=214), in ImageLayerArtist.update(self, *event)
    213 ARRAY_CACHE.pop(self.state.uuid, None)
    214 PIXEL_CACHE.pop(self.state.uuid, None)
--> 215 self._update_image(force=True)
    216 self.redraw()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py:125](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py#line=124), in BqplotImageLayerArtist._update_image(self, force, **kwargs)
    121 changed = self.pop_changed_properties()
    123 if force or any(prop in changed for prop in ('layer', 'attribute',
    124                                              'slices', 'x_att', 'y_att')):
--> 125     self._update_image_data()
    126     force = True  # make sure scaling and visual attributes are updated
    128 if force or any(prop in changed for prop in ('v_min', 'v_max', 'contrast',
    129                                              'bias', 'alpha', 'color_mode',
    130                                              'cmap', 'color', 'zorder',
    131                                              'visible', 'stretch', 'stretch_parameters',
    132                                              'bitmap_visible', 'contour_visible')):

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py:138](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/layer_artist.py#line=137), in BqplotImageLayerArtist._update_image_data(self, *args, **kwargs)
    137 def _update_image_data(self, *args, **kwargs):
--> 138     self.composite_image.invalidate_cache()
    139     # if the image data change, the contour lines are invalid
    140     self._contour_line_cache.clear()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py:116](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py#line=115), in FRBImage.invalidate_cache(self)
    115 def invalidate_cache(self):
--> 116     self.update(force=True)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py:106](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/glue_jupyter/bqplot/image/frb_mark.py#line=105), in FRBImage.update(self, force, *args, **kwargs)
    104 if image.dtype == np.dtype("float64"):
    105     image = image.astype(np.float32)
--> 106 with self.hold_sync():
    107     self.image = image
    108     self.x = (xmin, xmax)

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py:144](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/contextlib.py#line=143), in _GeneratorContextManager.__exit__(self, typ, value, traceback)
    142 if typ is None:
    143     try:
--> 144         next(self.gen)
    145     except StopIteration:
    146         return False

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:736](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=735), in Widget.hold_sync(self)
    734 finally:
    735     self._holding_sync = False
--> 736     self.send_state(self._states_to_send)
    737     self._states_to_send.clear()

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:578](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=577), in Widget.send_state(self, key)
    570 def send_state(self, key=None):
    571     """Sends the widget state, or a piece of it, to the front-end, if it exists.
    572 
    573     Parameters
   (...)    576         A single property's name or iterable of property names to sync with the front-end.
    577     """
--> 578     state = self.get_state(key=key)
    579     if len(state) > 0:
    580         if self._property_lock:  # we need to keep this dict up to date with the front-end values

File [~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py:613](http://localhost:8890/lab/tree/notebooks/~/miniconda3/envs/jdaviz-12/lib/python3.12/site-packages/ipywidgets/widgets/widget.py#line=612), in Widget.get_state(self, key, drop_defaults)
    611 state = {}
    612 traits = self.traits()
--> 613 for k in keys:
    614     to_json = self.trait_metadata(k, 'to_json', self._trait_to_json)
    615     value = to_json(getattr(self, k), self)

RuntimeError: Set changed size during iteration

The traceback goes down into glue-jupyter, glue, bqplot, and ipywidgets, leaving jdaviz at jdaviz/configs/imviz/plugins/orientation/orientation.py:910:

    909 if len(links_list) > 0:
--> 910     with app.data_collection.delay_link_manager_update():
    911         if len(data_already_linked):
    912             app.data_collection.add_link(links_list)  # Add to existing

How to Reproduce

  1. Run the following in one cell:
import jdaviz as jd

jd.load('mast:JWST/product/jw06557001002_02101_00002_nrcb3_cal.fits')
jd.show()

jd.loaders['astroquery'].open_in_tray()
jd.loaders['astroquery'].viewer = 'Image'

jd.plugins['Orientation'].align_by = 'WCS'

Expected behavior

The WCS linking should be completed and bqplot shouldn't raise an error.

Browser

No response

Jupyter

jupyter --version

IPython          : 9.8.0
ipykernel        : 7.1.0
ipywidgets       : 8.1.8
jupyter_client   : 8.7.0
jupyter_core     : 5.9.1
jupyter_server   : 2.17.0
jupyterlab       : 4.5.1
nbclient         : 0.10.2
nbconvert        : 7.16.6
nbformat         : 5.10.4
notebook         : 7.5.1
qtconsole        : not installed
traitlets        : 5.14.3

Software versions

macOS-26.2-arm64-arm-64bit
Python 3.12.12 | packaged by Anaconda, Inc. | (main, Oct 21 2025, 20:07:49) [Clang 20.1.8 ]
Numpy 2.3.5
astropy 7.2.0
matplotlib 3.10.8
scipy 1.16.3
scikit-image 0.25.2
asdf 5.1.0
stdatamodels 4.1.0
gwcs 0.26.1
regions 0.11
specutils 2.2.0
specreduce 1.7.0
photutils 2.3.0
astroquery 0.4.11
pyyaml 6.0.3
asteval 1.0.8
idna 3.11
traitlets 5.14.3
bqplot 0.12.45
bqplot-image-gl 1.8.0
glue-core 1.24.1
glue-jupyter 0.25.0
glue-astronomy 0.14.0
echo 0.11.1
ipyvue 1.11.3
ipyvuetify 1.11.3
ipysplitpanes 0.2.0
ipygoldenlayout 0.4.0
ipypopout 2.0.1
Jinja2 3.1.6
solara 1.55.1
vispy 0.16.0
sidecar 0.8.0
Jdaviz 4.6.dev33+g1f55b5389.d20260203

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-triageIssue opened via template and needs triaging

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions