From 77662ea350f17110e911df4032b1da381ddca3f7 Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Fri, 17 Oct 2025 12:56:00 -0400 Subject: [PATCH 1/6] Use pixel matrix to get order mapping between components. --- glue_vispy_viewers/volume/layer_artist.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/glue_vispy_viewers/volume/layer_artist.py b/glue_vispy_viewers/volume/layer_artist.py index f2872688..48ed6907 100644 --- a/glue_vispy_viewers/volume/layer_artist.py +++ b/glue_vispy_viewers/volume/layer_artist.py @@ -6,7 +6,7 @@ from matplotlib.colors import ColorConverter from glue.core.data import Subset, Data -from glue.core.link_manager import equivalent_pixel_cids +from glue.core.link_manager import equivalent_pixel_cids, pixel_cid_to_pixel_cid_matrix from glue.core.exceptions import IncompatibleAttribute from glue.core.fixed_resolution_buffer import ARRAY_CACHE, PIXEL_CACHE from .colors import get_mpl_cmap, get_translucent_cmap @@ -31,17 +31,22 @@ def layer_artist(self): def viewer_state(self): return self._viewer_state() + def _pixel_cid_order(self): + mat = pixel_cid_to_pixel_cid_matrix(self.viewer_state.reference_data, + self.layer_artist.layer) + return [np.argmax(mat[:, i]) for i in range(mat.shape[1])] + @property def shape(self): - order = equivalent_pixel_cids(self.viewer_state.reference_data, - self.layer_artist.layer) + order = self._pixel_cid_order() try: x_axis = order.index(self.viewer_state.x_att.axis) y_axis = order.index(self.viewer_state.y_att.axis) z_axis = order.index(self.viewer_state.z_att.axis) except (AttributeError, ValueError): + self.layer_artist.disable('Layer data is not fully linked to reference data') return 0, 0, 0 if isinstance(self.layer_artist.layer, Subset): @@ -58,8 +63,7 @@ def compute_fixed_resolution_buffer(self, bounds=None): if self.layer_artist is None or self.viewer_state is None: return np.broadcast_to(0, shape) - order = equivalent_pixel_cids(self.viewer_state.reference_data, - self.layer_artist.layer) + order = self._pixel_cid_order() reference_axes = [self.viewer_state.x_att.axis, self.viewer_state.y_att.axis, self.viewer_state.z_att.axis] From a06d119e1aeac097978ce952ad9f00ea762e6eaf Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Fri, 17 Oct 2025 13:40:16 -0400 Subject: [PATCH 2/6] We need to check that the argmax index actually gives a true value. --- glue_vispy_viewers/volume/layer_artist.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/glue_vispy_viewers/volume/layer_artist.py b/glue_vispy_viewers/volume/layer_artist.py index 48ed6907..ad6d7d53 100644 --- a/glue_vispy_viewers/volume/layer_artist.py +++ b/glue_vispy_viewers/volume/layer_artist.py @@ -34,7 +34,12 @@ def viewer_state(self): def _pixel_cid_order(self): mat = pixel_cid_to_pixel_cid_matrix(self.viewer_state.reference_data, self.layer_artist.layer) - return [np.argmax(mat[:, i]) for i in range(mat.shape[1])] + order = [] + for i in range(mat.shape[1]): + idx = np.argmax(mat[:, i]) + order.append(idx if mat[idx, i] else None) + return order + @property def shape(self): From cec940bdfb607808234d4f102c2a774754c77802 Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Fri, 17 Oct 2025 13:46:33 -0400 Subject: [PATCH 3/6] Codestyle fixes. --- glue_vispy_viewers/volume/layer_artist.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/glue_vispy_viewers/volume/layer_artist.py b/glue_vispy_viewers/volume/layer_artist.py index ad6d7d53..c294513c 100644 --- a/glue_vispy_viewers/volume/layer_artist.py +++ b/glue_vispy_viewers/volume/layer_artist.py @@ -6,7 +6,7 @@ from matplotlib.colors import ColorConverter from glue.core.data import Subset, Data -from glue.core.link_manager import equivalent_pixel_cids, pixel_cid_to_pixel_cid_matrix +from glue.core.link_manager import pixel_cid_to_pixel_cid_matrix from glue.core.exceptions import IncompatibleAttribute from glue.core.fixed_resolution_buffer import ARRAY_CACHE, PIXEL_CACHE from .colors import get_mpl_cmap, get_translucent_cmap @@ -40,7 +40,6 @@ def _pixel_cid_order(self): order.append(idx if mat[idx, i] else None) return order - @property def shape(self): From ac4f2fb841f63a36c87704844e804f5e28b26982 Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Fri, 17 Oct 2025 13:51:04 -0400 Subject: [PATCH 4/6] Order won't be None now, so simplify check. --- glue_vispy_viewers/volume/layer_artist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/glue_vispy_viewers/volume/layer_artist.py b/glue_vispy_viewers/volume/layer_artist.py index c294513c..12ce4253 100644 --- a/glue_vispy_viewers/volume/layer_artist.py +++ b/glue_vispy_viewers/volume/layer_artist.py @@ -71,7 +71,7 @@ def compute_fixed_resolution_buffer(self, bounds=None): reference_axes = [self.viewer_state.x_att.axis, self.viewer_state.y_att.axis, self.viewer_state.z_att.axis] - if order is not None and not set(reference_axes) <= set(order): + if set(reference_axes) > set([t for t in order if t is not None]): self.layer_artist.disable('Layer data is not fully linked to x/y/z attributes') return np.broadcast_to(0, shape) From 0104b334ade26036ba2ae4db68fc55c547277a2e Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Mon, 20 Oct 2025 12:10:09 -0400 Subject: [PATCH 5/6] Rather than look for linked components, just let FRB calculation fail if not linked. --- glue_vispy_viewers/volume/layer_artist.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/glue_vispy_viewers/volume/layer_artist.py b/glue_vispy_viewers/volume/layer_artist.py index 12ce4253..b64ef1c2 100644 --- a/glue_vispy_viewers/volume/layer_artist.py +++ b/glue_vispy_viewers/volume/layer_artist.py @@ -67,13 +67,9 @@ def compute_fixed_resolution_buffer(self, bounds=None): if self.layer_artist is None or self.viewer_state is None: return np.broadcast_to(0, shape) - order = self._pixel_cid_order() reference_axes = [self.viewer_state.x_att.axis, self.viewer_state.y_att.axis, self.viewer_state.z_att.axis] - if set(reference_axes) > set([t for t in order if t is not None]): - self.layer_artist.disable('Layer data is not fully linked to x/y/z attributes') - return np.broadcast_to(0, shape) # For this method, we make use of Data.compute_fixed_resolution_buffer, # which requires us to specify bounds in the form (min, max, nsteps). From 5192ba5fb6d1fd2c9d29d9ffd13a905c3aa18490 Mon Sep 17 00:00:00 2001 From: Carifio24 Date: Thu, 6 Nov 2025 11:46:25 -0500 Subject: [PATCH 6/6] Use pixel matrix from data for a subset layer. --- glue_vispy_viewers/volume/layer_artist.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/glue_vispy_viewers/volume/layer_artist.py b/glue_vispy_viewers/volume/layer_artist.py index b64ef1c2..74ddd428 100644 --- a/glue_vispy_viewers/volume/layer_artist.py +++ b/glue_vispy_viewers/volume/layer_artist.py @@ -32,8 +32,11 @@ def viewer_state(self): return self._viewer_state() def _pixel_cid_order(self): + data = self.layer_artist.layer + if isinstance(self.layer_artist.layer, Subset): + data = data.data mat = pixel_cid_to_pixel_cid_matrix(self.viewer_state.reference_data, - self.layer_artist.layer) + data) order = [] for i in range(mat.shape[1]): idx = np.argmax(mat[:, i])