class LineInSignal1D(t.HasTraits): """Adds a vertical draggable line to a spectrum that reports its position to the position attribute of the class. Attributes: ----------- position : float The position of the vertical line in the one dimensional signal. Moving the line changes the position but the reverse is not true. on : bool Turns on and off the line color : wx.Colour The color of the line. It automatically redraws the line. """ position = t.Float() is_ok = t.Bool(False) on = t.Bool(False) color = t.Color("black") def __init__(self, signal): if signal.axes_manager.signal_dimension != 1: raise SignalDimensionError(signal.axes_manager.signal_dimension, 1) self.signal = signal self.signal.plot() axis_dict = signal.axes_manager.signal_axes[0].get_axis_dictionary() am = AxesManager([ axis_dict, ]) am._axes[0].navigate = True # Set the position of the line in the middle of the spectral # range by default am._axes[0].index = int(round(am._axes[0].size / 2)) self.axes_manager = am self.axes_manager.events.indices_changed.connect( self.update_position, []) self.on_trait_change(self.switch_on_off, 'on') def draw(self): self.signal._plot.signal_plot.figure.canvas.draw() def switch_on_off(self, obj, trait_name, old, new): if not self.signal._plot.is_active(): return if new is True and old is False: self._line = VerticalLineWidget(self.axes_manager) self._line.set_mpl_ax(self.signal._plot.signal_plot.ax) self._line.patch.set_linewidth(2) self._color_changed("black", "black") # There is not need to call draw because setting the # color calls it. elif new is False and old is True: self._line.close() self._line = None self.draw() def update_position(self, *args, **kwargs): if not self.signal._plot.is_active(): return self.position = self.axes_manager.coordinates[0] def _color_changed(self, old, new): if self.on is False: return self._line.patch.set_color(( self.color.Red() / 255., self.color.Green() / 255., self.color.Blue() / 255., )) self.draw()
class Smoothing(t.HasTraits): line_color = t.Color('blue') differential_order = t.Int(0) @property def line_color_rgb(self): try: # PyQt and WX return self.line_color.Get() except AttributeError: try: # PySide return self.line_color.getRgb() except: raise def __init__(self, signal): self.ax = None self.data_line = None self.smooth_line = None self.signal = signal self.single_spectrum = self.signal.get_current_signal().deepcopy() self.axis = self.signal.axes_manager.signal_axes[0].axis self.plot() def plot(self): if self.signal._plot is None or not \ self.signal._plot.is_active(): self.signal.plot() hse = self.signal._plot l1 = hse.signal_plot.ax_lines[0] self.original_color = l1.line.get_color() l1.set_line_properties(color=self.original_color, type='scatter') l2 = drawing.signal1d.Signal1DLine() l2.data_function = self.model2plot l2.set_line_properties(color=np.array(self.line_color_rgb) / 255., type='line') # Add the line to the figure hse.signal_plot.add_line(l2) l2.plot() self.data_line = l1 self.smooth_line = l2 self.smooth_diff_line = None def update_lines(self): self.smooth_line.update() if self.smooth_diff_line is not None: self.smooth_diff_line.update() def turn_diff_line_on(self, diff_order): self.signal._plot.signal_plot.create_right_axis() self.smooth_diff_line = drawing.signal1d.Signal1DLine() self.smooth_diff_line.data_function = self.diff_model2plot self.smooth_diff_line.set_line_properties( color=np.array(self.line_color_rgb) / 255., type='line') self.signal._plot.signal_plot.add_line(self.smooth_diff_line, ax='right') self.smooth_diff_line.axes_manager = self.signal.axes_manager def turn_diff_line_off(self): if self.smooth_diff_line is None: return self.smooth_diff_line.close() self.smooth_diff_line = None def _differential_order_changed(self, old, new): if old == 0: self.turn_diff_line_on(new) self.smooth_diff_line.plot() if new == 0: self.turn_diff_line_off() return self.smooth_diff_line.update(force_replot=False) def _line_color_changed(self, old, new): self.smooth_line.line_properties = { 'color': np.array(self.line_color_rgb) / 255. } if self.smooth_diff_line is not None: self.smooth_diff_line.line_properties = { 'color': np.array(self.line_color_rgb) / 255. } self.update_lines() def diff_model2plot(self, axes_manager=None): smoothed = np.diff(self.model2plot(axes_manager), self.differential_order) return smoothed def close(self): if self.signal._plot.is_active(): if self.differential_order != 0: self.turn_diff_line_off() self.smooth_line.close() self.data_line.set_line_properties(color=self.original_color, type='line')
class Smoothing(t.HasTraits): line_color = t.Color('blue') differential_order = t.Int(0) crop_diff_axis = True def __init__(self, signal): self.ax = None self.data_line = None self.smooth_line = None self.signal = signal self.axis = self.signal.axes_manager.signal_axes[0].axis self.plot() def plot(self): if self.signal._plot is None or not \ self.signal._plot.is_active(): self.signal.plot() hse = self.signal._plot l1 = hse.signal_plot.ax_lines[0] self.original_color = l1.line.get_color() l1.set_line_properties(color=self.original_color, type='scatter') l2 = drawing.spectrum.SpectrumLine() l2.data_function = self.model2plot l2.set_line_properties(color=np.array(self.line_color.Get()) / 255., type='line') # Add the line to the figure hse.signal_plot.add_line(l2) l2.plot() self.data_line = l1 self.smooth_line = l2 self.smooth_diff_line = None def update_lines(self): self.smooth_line.update() if self.smooth_diff_line is not None: self.smooth_diff_line.update() def turn_diff_line_on(self, diff_order): self.signal._plot.signal_plot.create_right_axis() self.smooth_diff_line = drawing.spectrum.SpectrumLine() self.smooth_diff_line.data_function = self.diff_model2plot self.smooth_diff_line.set_line_properties( color=np.array(self.line_color.Get()) / 255., type='line') self.signal._plot.signal_plot.add_line(self.smooth_diff_line, ax='right') self.smooth_diff_line.axes_manager = self.signal.axes_manager def turn_diff_line_off(self): if self.smooth_diff_line is None: return self.smooth_diff_line.close() self.smooth_diff_line = None def _differential_order_changed(self, old, new): if old == 0: self.turn_diff_line_on(new) if new == 0: self.turn_diff_line_off() return if self.crop_diff_axis is True: self.smooth_diff_line.axis =\ self.axis[:-new] + (self.axis[1] - self.axis[0]) * new if old == 0: self.smooth_diff_line.plot() self.smooth_diff_line.update(force_replot=True) def _line_color_changed(self, old, new): self.smooth_line.line_properties = { 'color': np.array(self.line_color.Get()) / 255. } if self.smooth_diff_line is not None: self.smooth_diff_line.line_properties = { 'color': np.array(self.line_color.Get()) / 255. } self.update_lines() def diff_model2plot(self, axes_manager=None): smoothed = np.diff(self.model2plot(axes_manager), self.differential_order) return smoothed def apply(self): self.signal._plot.auto_update_plot = False maxval = self.signal.axes_manager.navigation_size if maxval > 0: pbar = progressbar(maxval=maxval) up_to = None if self.differential_order == 0: f = self.model2plot else: f = self.diff_model2plot if self.crop_diff_axis is True: up_to = -self.differential_order i = 0 for spectrum in self.signal: spectrum.data[:] = f() i += 1 if maxval > 0: pbar.update(i) if maxval > 0: pbar.finish() if self.differential_order > 0: self.signal.axes_manager.signal_axes[0].offset = \ self.smooth_diff_line.axis[0] self.signal.crop(-1, 0, int(-self.differential_order)) self.signal._replot() self.signal._plot.auto_update_plot = True def close(self): if self.signal._plot.is_active(): if self.differential_order != 0: self.turn_diff_line_off() self.smooth_line.close() self.data_line.set_line_properties(color=self.original_color, type='line')