Example #1
0
    def _update_radius(self, timepoint=None):
        """Update marker's radius."""
        logger.debug("Weird edge arround markers (source_obj.py)")
        if not hasattr(self, 'radius'):
            if np.unique(self._data).size == 1:
                self.radius = self._radius_min * np.ones((len(self, )))
            else:
                self.radius = normalize(self._data.copy(),
                                        tomin=self._radius_min,
                                        tomax=self._radius_max)

        if timepoint:
            self._sources._data['a_size'] = self.radius[:, int(
                timepoint)]  # fs/time
            if not hasattr(self, '_timer'):
                self._timer = visuals.Text(str(int(timepoint)),
                                           pos=[0, 100, 0],
                                           bold=True,
                                           name='Text',
                                           color=color2vb('white'),
                                           font_size=50,
                                           parent=None)  #self._node)
            self._timer.text = str(int(timepoint))
            self._timer.update()

        else:
            if len(self.radius.shape) == 2:
                self._sources._data['a_size'] = np.mean(self.radius, axis=1)
            else:
                self._sources._data['a_size'] = self.radius

        to_hide = self.hide
        # Marker size + egde width = 0 and text='' for hidden sources :
        self._sources._data['a_size'][to_hide] = 0.
        self._sources._data['a_edgewidth'][to_hide] = 0.
        if isinstance(self._mask_radius, (int, float)):
            self._sources._data['a_size'][self._mask] = self._mask_radius
        text = np.array(self._text.copy())
        text[to_hide] = ''
        self._sources_text.text = text
        self.update()
Example #2
0
    def add_overlay(self,
                    data,
                    vertices=None,
                    to_overlay=None,
                    mask_data=None,
                    **kwargs):
        """Add an overlay to the mesh.

        Note that the current implementation limit to a number of of four
        overlays.

        Parameters
        ----------
        data : array_like
            Array of data of shape (n_data,).
        vertices : array_like | None
            The vertices to color with the data of shape (n_data,).
        to_overlay : int | None
            Add data to a specific overlay. This parameter must be a integer.
        mask_data : array_like | None
            Array to specify if some vertices have to be considered as masked
            (and use the `mask_color` color)
        kwargs : dict | {}
            Additional color color properties (cmap, clim, vmin, vmax, under,
            over, translucent)
        """
        # Check input variables :
        if vertices is None:
            vertices = np.ones((len(self), ), dtype=bool)
        # Send data to the mask :
        if isinstance(mask_data, np.ndarray) and len(mask_data) == len(self):
            self._bgd_data[mask_data] = .5
            self._bgd_buffer.set_data(self._bgd_data)
        if not len(vertices):
            logger.warning('Vertices array is empty. Abandoning.')
            return

        data = np.asarray(data)
        to_overlay = self._n_overlay if to_overlay is None else to_overlay
        data_lim = (data.min(), data.max())
        if len(self._data_lim) < to_overlay + 1:
            self._data_lim.append(data_lim)
        else:
            self._data_lim[to_overlay] = data_lim
        # -------------------------------------------------------------
        # TEXTURE COORDINATES
        # -------------------------------------------------------------
        need_reshape = to_overlay >= self._xrange.shape[1]
        if need_reshape:
            # Add column of zeros :
            z_ = np.zeros((len(self), ), dtype=np.float32)
            z_text = np.zeros((1, LUT_LEN, 4), dtype=np.float32)
            self._xrange = np.c_[self._xrange, z_]
            self._alphas = np.c_[self._alphas, z_]
            self._text2d_data = np.concatenate((self._text2d_data, z_text))
        # (x, y) coordinates of the overlay for the texture :
        self._xrange[vertices, to_overlay] = normalize(data)
        # Transparency :
        self._alphas[vertices, to_overlay] = 1.  # transparency level

        # -------------------------------------------------------------
        # TEXTURE COLOR
        # -------------------------------------------------------------
        # Colormap interpolation (if needed):
        colormap = Colormap(**kwargs)
        vec = np.linspace(data_lim[0], data_lim[1], LUT_LEN)
        self._text2d_data[to_overlay, ...] = colormap.to_rgba(vec)

        # -------------------------------------------------------------
        # BUFFERS
        # -------------------------------------------------------------
        if need_reshape:
            # Re-define buffers :
            self._xrange_buffer = gloo.VertexBuffer(self._xrange)
            self._text2d = gloo.Texture2D(self._text2d_data)
            self._alphas_buffer = gloo.VertexBuffer(self._alphas)
            # Send buffers to vertex shader :
            self.shared_program.vert['u_range'] = self._xrange_buffer
            self.shared_program.vert['u_alphas'] = self._alphas_buffer
            self.shared_program.vert['u_over_text'] = self._text2d
        else:
            self._xrange_buffer.set_data(self._xrange)
            self._text2d.set_data(self._text2d_data)
            self._alphas_buffer.set_data(self._alphas)
        # Update the number of overlays :
        self._n_overlay = to_overlay + 1
        self.shared_program.vert['u_n_overlays'] = self._n_overlay
Example #3
0
sc = SceneObj(size=(1800, 500), bgcolor=(.1, .1, .1))
for psd_file, channel_coo_file in zip(psd_files, channel_coo_files):
    path_xyz, basename, ext = split_filename(psd_file)

    arch = np.load(psd_file)
    psds, freqs = arch['psds'], arch['freqs']
    xyz = np.genfromtxt(channel_coo_file, dtype=float)
    freq_bands = np.asarray(freq_bands)
    clim = (psds.min(), psds.max())

    # Find indices of frequencies :
    idx_fplt = np.abs(
        (freqs.reshape(1, 1, -1) - freq_bands[..., np.newaxis])).argmin(2)
    psdf = np.array([psds[:, k[0]:k[1]].mean(1) for k in idx_fplt])
    radius = normalize(np.c_[psdf.min(1), psdf.max(1)], 5, 25).astype(float)

    for num, (fb, fbn, psd,
              rx) in enumerate(zip(freq_bands, freq_band_names, psdf, radius)):
        s_obj = SourceObj('s',
                          xyz,
                          data=psd,
                          radius_min=rx[0],
                          radius_max=rx[1])  # noqa
        s_obj.color_sources(data=psd, cmap='cool', clim=clim)
        sc.add_to_subplot(s_obj,
                          col=num,
                          title=str(fb) + ' - ' + fbn,
                          title_color='white',
                          rotate='top',
                          zoom=.6)
Example #4
0
    def add_overlay(self, data, vertices=None, to_overlay=None, mask_data=None,
                    **kwargs):
        """Add an overlay to the mesh.

        Note that the current implementation limit to a number of of four
        overlays.

        Parameters
        ----------
        data : array_like
            Array of data of shape (n_data,).
        vertices : array_like | None
            The vertices to color with the data of shape (n_data,).
        to_overlay : int | None
            Add data to a specific overlay. This parameter must be a integer.
        mask_data : array_like | None
            Array to specify if some vertices have to be considered as masked
            (and use the `mask_color` color)
        kwargs : dict | {}
            Additional color color properties (cmap, clim, vmin, vmax, under,
            over, translucent)
        """
        # Check input variables :
        if vertices is None:
            vertices = np.ones((len(self),), dtype=bool)
        # Send data to the mask :
        if isinstance(mask_data, np.ndarray) and len(mask_data) == len(self):
            self._bgd_data[mask_data] = .5
            self._bgd_buffer.set_data(self._bgd_data)
        if not len(vertices):
            logger.warning('Vertices array is empty. Abandoning.')
            return

        data = np.asarray(data)
        to_overlay = self._n_overlay if to_overlay is None else to_overlay
        data_lim = (data.min(), data.max())
        if len(self._data_lim) < to_overlay + 1:
            self._data_lim.append(data_lim)
        else:
            self._data_lim[to_overlay] = data_lim
        # -------------------------------------------------------------
        # TEXTURE COORDINATES
        # -------------------------------------------------------------
        need_reshape = to_overlay >= self._xrange.shape[1]
        if need_reshape:
            # Add column of zeros :
            z_ = np.zeros((len(self),), dtype=np.float32)
            z_text = np.zeros((1, LUT_LEN, 4), dtype=np.float32)
            self._xrange = np.c_[self._xrange, z_]
            self._alphas = np.c_[self._alphas, z_]
            self._text2d_data = np.concatenate((self._text2d_data, z_text))
        # (x, y) coordinates of the overlay for the texture :
        self._xrange[vertices, to_overlay] = normalize(data)
        # Transparency :
        self._alphas[vertices, to_overlay] = 1.  # transparency level

        # -------------------------------------------------------------
        # TEXTURE COLOR
        # -------------------------------------------------------------
        # Colormap interpolation (if needed):
        colormap = Colormap(**kwargs)
        vec = np.linspace(data_lim[0], data_lim[1], LUT_LEN)
        self._text2d_data[to_overlay, ...] = colormap.to_rgba(vec)

        # -------------------------------------------------------------
        # BUFFERS
        # -------------------------------------------------------------
        if need_reshape:
            # Re-define buffers :
            self._xrange_buffer = gloo.VertexBuffer(self._xrange)
            self._text2d = gloo.Texture2D(self._text2d_data)
            self._alphas_buffer = gloo.VertexBuffer(self._alphas)
            # Send buffers to vertex shader :
            self.shared_program.vert['u_range'] = self._xrange_buffer
            self.shared_program.vert['u_alphas'] = self._alphas_buffer
            self.shared_program.vert['u_over_text'] = self._text2d
        else:
            self._xrange_buffer.set_data(self._xrange)
            self._text2d.set_data(self._text2d_data)
            self._alphas_buffer.set_data(self._alphas)
        # Update the number of overlays :
        self._n_overlay = to_overlay + 1
        self.shared_program.vert['u_n_overlays'] = self._n_overlay