예제 #1
0
    def show_data(self, datas, temp_data=False, nav_axes=None, **kwargs):
        """Display datas as a hyperspaced dataset
        only one numpy ndarray should be used
        """
        self.data_buffer = []
        try:
            if self.data_axes is not None:
                if datas.ndim != len(
                        self.data_axes) or self.axes_nav != nav_axes:
                    self.set_nav_axes(
                        datas.ndim, nav_axes
                    )  #init the list of axes and set the preset to nav_axes
            else:
                self.set_nav_axes(
                    datas.ndim, nav_axes
                )  #init the list of axes and set the preset to nav_axes

            #self.datas=hs.signals.BaseSignal(datas)
            self.datas = Signal(datas)
            self.datas_settings = kwargs
            self.update_data_signal()

            self.settings.child('data_shape_settings', 'data_shape').setValue(
                self.get_data_dimension())
            self.set_data(self.datas, temp_data=temp_data, **kwargs)

        except Exception as e:
            self.update_status(utils.getLineInfo() + str(e), self.wait_time,
                               'log')
예제 #2
0
class ViewerND(QtWidgets.QWidget, QObject):
    """

        ======================== =========================================
        **Attributes**            **Type**

        *dockarea*                instance of pyqtgraph.DockArea
        *mainwindow*              instance of pyqtgraph.DockArea
        *title*                   string
        *waitime*                 int
        *x_axis*                  float array
        *y_axis*                  float array
        *data_buffer*             list of data
        *ui*                      QObject
        ======================== =========================================

        Raises
        ------
        parent Exception
            If parent argument is None in constructor abort

        See Also
        --------
        set_GUI


        References
        ----------
        PyQt5, pyqtgraph, QtWidgets, QObject

    """
    command_DAQ_signal = pyqtSignal(list)
    log_signal = pyqtSignal(str)
    data_to_export_signal = pyqtSignal(
        OrderedDict
    )  #edict(name=self.DAQ_type,data0D=None,data1D=None,data2D=None)

    def __init__(self, parent=None):
        QLocale.setDefault(QLocale(QLocale.English, QLocale.UnitedStates))
        super(ViewerND, self).__init__()
        # if parent is None:
        #     raise Exception('no valid parent container, expected dockarea')
        # parent=DockArea()
        # exit(0)

        if parent is None:
            parent = QtWidgets.QWidget()
            parent.show()
        self.parent = parent

        self.wait_time = 2000
        self.viewer_type = 'DataND'  # ☺by default but coul dbe used for 3D visualization

        self.x_axis = dict(data=None, label='', units='')
        self.y_axis = dict(data=None, label='', units='')

        self.data_buffer = [
        ]  # convenience list to store 0D data to be displayed
        self.datas = None
        self.datas_settings = None
        # set default data shape case
        self.axes_nav = None
        self.data_axes = None
        # self.set_nav_axes(3)
        self.ui = QObject()  # the user interface
        self.set_GUI()

    @pyqtSlot(OrderedDict)
    def export_data(self, datas):
        datas['acq_time_s'] = datetime.datetime.now().timestamp()
        self.data_to_export_signal.emit(datas)

    def get_data_dimension(self):
        try:
            dimension = "("
            for ind, ax in enumerate(self.datas.axes_manager.navigation_shape):
                if ind != len(self.datas.axes_manager.navigation_shape) - 1:
                    dimension += str(ax) + ','
                else:
                    dimension += str(ax) + '|'
            for ind, ax in enumerate(self.datas.axes_manager.signal_shape):
                if ind != len(self.datas.axes_manager.signal_shape) - 1:
                    dimension += str(ax) + ','
                else:
                    dimension += str(ax) + ')'
            return dimension
        except Exception as e:
            self.update_status(utils.getLineInfo() + str(e), self.wait_time)
            return ""

    def parameter_tree_changed(self, param, changes):
        """
            Foreach value changed, update :
                * Viewer in case of **DAQ_type** parameter name
                * visibility of button in case of **show_averaging** parameter name
                * visibility of naverage in case of **live_averaging** parameter name
                * scale of axis **else** (in 2D pymodaq type)

            Once done emit the update settings signal to link the commit.

            =============== =================================== ================================================================
            **Parameters**    **Type**                           **Description**
            *param*           instance of ppyqtgraph parameter   the parameter to be checked
            *changes*         tuple list                         Contain the (param,changes,info) list listing the changes made
            =============== =================================== ================================================================

            See Also
            --------
            change_viewer, daq_utils.custom_parameter_tree.iter_children
        """
        try:
            for param, change, data in changes:
                path = self.settings.childPath(param)
                if path is not None:
                    childName = '.'.join(path)
                else:
                    childName = param.name()
                if change == 'childAdded':
                    pass

                elif change == 'value':
                    pass
                    #if param.name()=='navigator_axes':
                    #    self.update_data_signal()
                    #    self.settings.child('data_shape_settings', 'data_shape').setValue(str(datas_transposed))
                    #    self.set_data(self.datas)

        except Exception as e:
            self.update_status(utils.getLineInfo() + str(e), self.wait_time,
                               'log')

    def set_axis(self, Npts):
        """
            | Set axis values from node and a linspace regular distribution

            ================ ======================= ==========================================
            **Parameters**     **Type**                **Description**

             *node*           tables Group instance   the root node of the local treated tree
            ================ ======================= ==========================================

            Returns
            -------
            float array
                the computed values axis.

        """
        axis = np.linspace(0, Npts, Npts, endpoint=False)
        return axis

    def set_data(self, datas_transposed, temp_data=False, **kwargs):
        """
        """
        try:
            self.nav_x_axis = dict(data=None, label='', units='')
            self.nav_y_axis = dict(data=None, label='', units='')
            if len(self.axes_nav) == 1 or len(
                    self.axes_nav) == 2:  #1D Navigator
                self.nav_y_axis['data'] = [0]
                if 'nav_x_axis' in kwargs:
                    if not isinstance(kwargs['nav_x_axis'], dict):
                        self.nav_x_axis['data'] = kwargs['nav_x_axis'][:]
                    else:
                        self.nav_x_axis = copy.deepcopy(kwargs['nav_x_axis'])
                else:
                    self.nav_x_axis['data'] = self.set_axis(
                        datas_transposed.axes_manager.navigation_shape[0])

            if len(self.axes_nav) == 2:  #2D Navigator:
                if 'nav_y_axis' in kwargs:
                    if not isinstance(kwargs['nav_y_axis'], dict):
                        self.nav_y_axis['data'] = kwargs['nav_y_axis'][:]
                    else:
                        self.nav_y_axis = copy.deepcopy(kwargs['nav_y_axis'])
                else:
                    self.nav_y_axis['data'] = self.set_axis(
                        datas_transposed.axes_manager.navigation_shape[1])

            ##########################################################################
            #display the correct signal viewer
            if len(datas_transposed.axes_manager.signal_shape
                   ) == 0:  #signal data are 0D
                self.ui.viewer1D.parent.setVisible(True)
                self.ui.viewer2D.parent.setVisible(False)
            elif len(datas_transposed.axes_manager.signal_shape
                     ) == 1:  #signal data are 1D
                self.ui.viewer1D.parent.setVisible(True)
                self.ui.viewer2D.parent.setVisible(False)
            elif len(datas_transposed.axes_manager.signal_shape
                     ) == 2:  #signal data are 2D
                self.ui.viewer1D.parent.setVisible(False)
                self.ui.viewer2D.parent.setVisible(True)
            self.x_axis = dict(data=None, label='', units='')
            self.y_axis = dict(data=None, label='', units='')
            if len(datas_transposed.axes_manager.signal_shape) == 1 or len(
                    datas_transposed.axes_manager.signal_shape
            ) == 2:  #signal data are 1D

                if 'x_axis' in kwargs:
                    if not isinstance(kwargs['x_axis'], dict):
                        self.x_axis['data'] = kwargs['x_axis'][:]
                        self.x_axis = kwargs['x_axis']
                    else:
                        self.x_axis = copy.deepcopy(kwargs['x_axis'])
                else:
                    self.x_axis['data'] = self.set_axis(
                        datas_transposed.axes_manager.signal_shape[0])
                if 'y_axis' in kwargs:
                    self.ui.viewer1D.set_axis_label(
                        axis_settings=dict(orientation='left',
                                           label=kwargs['y_axis']['label'],
                                           units=kwargs['y_axis']['units']))

            if len(datas_transposed.axes_manager.signal_shape
                   ) == 2:  #signal data is 2D
                if 'y_axis' in kwargs:
                    if not isinstance(kwargs['y_axis'], dict):
                        self.y_axis['data'] = kwargs['y_axis'][:]
                        self.y_axis = kwargs['y_axis']
                    else:
                        self.y_axis = copy.deepcopy(kwargs['y_axis'])
                else:
                    self.y_axis['data'] = self.set_axis(
                        datas_transposed.axes_manager.signal_shape[1])

            if len(self.axes_nav) == 0 or len(self.axes_nav) == 1:
                self.update_viewer_data(
                    *self.ui.navigator1D.ui.crosshair.get_positions())
            elif len(self.axes_nav) == 2:
                self.update_viewer_data(
                    *self.ui.navigator2D.ui.crosshair.get_positions())

            ##get ROI bounds from viewers if any
            ROI_bounds_1D = []
            try:
                self.ROI1D.getRegion()
                indexes_values = utils.find_index(self.ui.viewer1D.x_axis,
                                                  self.ROI1D.getRegion())
                ROI_bounds_1D.append(
                    QPointF(indexes_values[0][0], indexes_values[1][0]))
            except:
                pass

            ROI_bounds_2D = []
            try:
                ROI_bounds_2D.append(
                    QRectF(self.ROI2D.pos().x(),
                           self.ROI2D.pos().y(),
                           self.ROI2D.size().x(),
                           self.ROI2D.size().y()))
            except:
                pass

            #############################################################
            #display the correct navigator viewer and set some parameters
            if len(self.axes_nav) == 0:  #no Navigator
                self.ui.navigator1D.parent.setVisible(False)
                self.ui.navigator2D.parent.setVisible(False)
                self.navigator_label.setVisible(False)
                self.ROI1D.setVisible(False)
                self.ROI2D.setVisible(False)
                navigator_data = []

            elif len(self.axes_nav) == 1:  #1D Navigator
                self.ROI1D.setVisible(True)
                self.ROI2D.setVisible(True)
                self.ui.navigator1D.parent.setVisible(True)
                self.ui.navigator2D.parent.setVisible(False)
                self.navigator_label.setVisible(True)
                self.ui.navigator1D.remove_plots()
                self.ui.navigator1D.x_axis = self.nav_x_axis

                if len(datas_transposed.axes_manager.signal_shape
                       ) == 0:  #signal data are 0D
                    navigator_data = [datas_transposed.data]

                elif len(datas_transposed.axes_manager.signal_shape
                         ) == 1:  #signal data are 1D
                    if ROI_bounds_1D != []:
                        if self.ui.combomath.currentText() == 'Sum':
                            navigator_data = [
                                datas_transposed.isig[pt.x():pt.y() + 1].sum(
                                    (-1)).data for pt in ROI_bounds_1D
                            ]
                        elif self.ui.combomath.currentText() == 'Mean':
                            navigator_data = [
                                datas_transposed.isig[pt.x():pt.y() + 1].mean(
                                    (-1)).data for pt in ROI_bounds_1D
                            ]
                        elif self.ui.combomath.currentText() == 'Half-life':
                            navigator_data = [
                                datas_transposed.isig[pt.x():pt.y() +
                                                      1].halflife((-1)).data
                                for pt in ROI_bounds_1D
                            ]
                    else:
                        if self.ui.combomath.currentText() == 'Sum':
                            navigator_data = [
                                datas_transposed.isig[:].sum((-1)).data
                            ]
                        elif self.ui.combomath.currentText() == 'Mean':
                            navigator_data = [
                                datas_transposed.isig[:].mean((-1)).data
                            ]
                        elif self.ui.combomath.currentText() == 'Half-life':
                            navigator_data = [
                                datas_transposed.isig[:].halflife((-1)).data
                            ]

                elif len(datas_transposed.axes_manager.signal_shape
                         ) == 2:  #signal data is 2D
                    if ROI_bounds_2D != []:
                        navigator_data = [
                            datas_transposed.isig[rect.x():rect.x() +
                                                  rect.width(),
                                                  rect.y():rect.y() +
                                                  rect.height()].sum(
                                                      (-1, -2)).data
                            for rect in ROI_bounds_2D
                        ]
                    else:
                        navigator_data = [datas_transposed.sum((-1, -2)).data]

                else:
                    pass
                if temp_data:
                    self.ui.navigator1D.show_data_temp(navigator_data)
                else:
                    self.ui.navigator1D.show_data(navigator_data)

            elif len(self.axes_nav) == 2:  #2D Navigator:
                self.ROI1D.setVisible(True)
                self.ROI2D.setVisible(True)

                self.ui.navigator1D.parent.setVisible(False)
                self.ui.navigator2D.parent.setVisible(True)
                self.navigator_label.setVisible(True)
                self.ui.navigator2D.x_axis = self.nav_x_axis
                self.ui.navigator2D.y_axis = self.nav_y_axis

                if len(datas_transposed.axes_manager.signal_shape
                       ) == 0:  #signal data is 0D
                    navigator_data = [datas_transposed.data]

                elif len(datas_transposed.axes_manager.signal_shape
                         ) == 1:  #signal data is 1D
                    if ROI_bounds_1D != []:
                        if self.ui.combomath.currentText() == 'Sum':
                            navigator_data = [
                                datas_transposed.isig[pt.x():pt.y() + 1].sum(
                                    (-1)).data for pt in ROI_bounds_1D
                            ]
                        elif self.ui.combomath.currentText() == 'Mean':
                            navigator_data = [
                                datas_transposed.isig[pt.x():pt.y() + 1].mean(
                                    (-1)).data for pt in ROI_bounds_1D
                            ]
                        elif self.ui.combomath.currentText() == 'Half-life':
                            navigator_data = [
                                datas_transposed.isig[pt.x():pt.y() +
                                                      1].halflife((-1)).data
                                for pt in ROI_bounds_1D
                            ]
                    else:
                        if self.ui.combomath.currentText() == 'Sum':
                            navigator_data = [
                                datas_transposed.isig[:].sum((-1)).data
                            ]
                        elif self.ui.combomath.currentText() == 'Mean':
                            navigator_data = [
                                datas_transposed.isig[:].mean((-1)).data
                            ]
                        elif self.ui.combomath.currentText() == 'Half-life':
                            navigator_data = [
                                datas_transposed.isig[:].halflife((-1)).data
                            ]

                elif len(datas_transposed.axes_manager.signal_shape
                         ) == 2:  #signal data is 2D
                    if ROI_bounds_2D != []:
                        navigator_data = [
                            datas_transposed.isig[rect.x():rect.x() +
                                                  rect.width(),
                                                  rect.y():rect.y() +
                                                  rect.height()].sum(
                                                      (-1, -2)).data
                            for rect in ROI_bounds_2D
                        ]
                    else:
                        navigator_data = [datas_transposed.sum((-1, -2)).data]

                else:
                    pass
                if temp_data:
                    self.ui.navigator2D.setImageTemp(*navigator_data)
                else:
                    self.ui.navigator2D.setImage(*navigator_data)

            else:
                raise Exception('No valid Navigator shape')

        except Exception as e:
            self.update_status(utils.getLineInfo() + str(e), self.wait_time,
                               'log')

    def init_ROI(self):

        self.ui.navigator1D.ui.crosshair.set_crosshair_position(
            np.mean(self.nav_x_axis['data']))
        x, y = self.ui.navigator2D.unscale_axis(
            np.mean(self.nav_x_axis['data']), np.mean(self.nav_y_axis['data']))
        self.ui.navigator2D.ui.crosshair.set_crosshair_position(x, y)

        if self.x_axis['data'] is not None:
            self.ROI1D.setRegion(
                (np.min(self.x_axis['data']), np.max(self.x_axis['data'])))
        if self.x_axis['data'] is not None and self.y_axis['data'] is not None:
            self.ROI2D.setPos(
                (np.min(self.x_axis['data']), np.min(self.y_axis['data'])))
            self.ROI2D.setSize(
                (np.max(self.x_axis['data']) - np.min(self.x_axis['data']),
                 np.max(self.y_axis['data']) - np.min(self.y_axis['data'])))

        self.update_Navigator()

    def set_data_test(self, data_shape='3D'):

        x = utils.linspace_step(0, 20, 1)
        y = utils.linspace_step(0, 30, 1)
        t = utils.linspace_step(0, 200, 1)
        z = utils.linspace_step(0, 200, 1)
        datas = np.zeros((len(y), len(x), len(t), len(z)))
        amp = utils.gauss2D(x, 7, 5, y, 12, 10)
        for indx in range(len(x)):
            for indy in range(len(y)):
                datas[indy, indx, :, :] = amp[indy, indx] * (
                    utils.gauss2D(z, 50 + indx * 2, 20, t, 50 + 3 * indy, 30) +
                    np.random.rand(len(t), len(z)) / 10)

        if data_shape == '4D':
            self.show_data(datas, temp_data=False, nav_axes=[2, 3])
        elif data_shape == '3D':
            self.show_data(np.sum(datas, axis=3),
                           temp_data=False,
                           nav_axes=[0, 1])
        elif data_shape == '2D':
            self.show_data(np.sum(datas, axis=(2, 3)))
        elif data_shape == '1D':
            self.show_data(np.sum(datas, axis=(1, 2, 3)))

    def set_nav_axes(self, Ndim, nav_axes=None):
        self.data_axes = [ind for ind in range(Ndim)]
        if nav_axes is None:
            if Ndim > 0:
                self.axes_nav = self.data_axes[0:2]
            else:
                self.axes_nav = self.data_axes[0]
        else:
            self.axes_nav = [
                Ndim - ind_ax - 1 for ind_ax in nav_axes
            ]  #because hyperspy array order is reversed compared to numpy....
        self.axes_signal = [
            ax for ax in self.data_axes if ax not in self.axes_nav
        ]
        self.settings.child('data_shape_settings', 'navigator_axes').setValue(
            dict(all_items=[str(ax) for ax in self.data_axes],
                 selected=[str(ax) for ax in self.axes_nav]))

    def set_GUI(self):
        """

        """
        #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        main_layout = QtWidgets.QGridLayout()
        self.parent.setLayout(main_layout)

        Vsplitter = QtWidgets.QSplitter(Qt.Vertical)
        #Hsplitter=QtWidgets.QSplitter(Qt.Horizontal)

        #%%create status bar
        self.ui.statusbar = QtWidgets.QStatusBar()
        self.ui.statusbar.setMaximumHeight(25)
        Vsplitter.addWidget(self.ui.statusbar)

        params = [
            {
                'title': 'set data:',
                'name': 'set_data_4D',
                'type': 'action',
                'visible': False
            },
            {
                'title': 'set data:',
                'name': 'set_data_3D',
                'type': 'action',
                'visible': False
            },
            {
                'title': 'set data:',
                'name': 'set_data_2D',
                'type': 'action',
                'visible': False
            },
            {
                'title': 'set data:',
                'name': 'set_data_1D',
                'type': 'action',
                'visible': False
            },
            {
                'title':
                'Signal shape',
                'name':
                'data_shape_settings',
                'type':
                'group',
                'children': [
                    {
                        'title': 'Data shape:',
                        'name': 'data_shape',
                        'type': 'str',
                        'value': "",
                        'readonly': True
                    },
                    {
                        'title': 'Navigator axes:',
                        'name': 'navigator_axes',
                        'type': 'itemselect'
                    },
                    {
                        'title': 'Set Nav axes:',
                        'name': 'set_nav_axes',
                        'type': 'action',
                        'visible': True
                    },
                ]
            },
        ]

        self.settings = Parameter.create(name='Param',
                                         type='group',
                                         children=params)
        ##self.signal_axes_selection()

        #connecting from tree
        self.settings.sigTreeStateChanged.connect(
            self.parameter_tree_changed)  #any changes on the settings
        self.settings.child(
            ('set_data_1D'
             )).sigActivated.connect(lambda: self.set_data_test('1D'))
        self.settings.child(
            ('set_data_2D'
             )).sigActivated.connect(lambda: self.set_data_test('2D'))
        self.settings.child(
            ('set_data_3D'
             )).sigActivated.connect(lambda: self.set_data_test('3D'))
        self.settings.child(
            ('set_data_4D'
             )).sigActivated.connect(lambda: self.set_data_test('4D'))
        self.settings.child('data_shape_settings',
                            'set_nav_axes').sigActivated.connect(
                                self.update_data)
        ##%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        ##% 1D signalviewer
        viewer1D_widget = QtWidgets.QWidget()
        self.ui.viewer1D = Viewer1D(viewer1D_widget)
        self.ROI1D = LinearRegionItem()
        self.ui.viewer1D.viewer.plotwidget.plotItem.addItem(self.ROI1D)
        self.ui.combomath = QtWidgets.QComboBox()
        self.ui.combomath.addItems(['Sum', 'Mean', 'Half-life'])
        self.ui.viewer1D.ui.horizontalLayout.insertWidget(4, self.ui.combomath)
        self.ui.combomath.currentIndexChanged.connect(self.update_Navigator)

        self.ROI1D.sigRegionChangeFinished.connect(self.update_Navigator)
        #% 2D viewer Dock
        viewer2D_widget = QtWidgets.QWidget()
        self.ui.viewer2D = Viewer2D(viewer2D_widget)
        self.ui.viewer2D.ui.Ini_plot_pb.setVisible(False)
        self.ui.viewer2D.ui.FlipUD_pb.setVisible(False)
        self.ui.viewer2D.ui.FlipLR_pb.setVisible(False)
        self.ui.viewer2D.ui.rotate_pb.setVisible(False)
        self.ui.viewer2D.ui.auto_levels_pb.click()
        self.ui.viewer2D.ui.ROIselect_pb.click()
        self.ROI2D = self.ui.viewer2D.ui.ROIselect
        self.ui.viewer2D.ROI_select_signal.connect(self.update_Navigator)

        ###dock_viewer=Dock('Signal')
        ###dock_viewer.addWidget(viewer1D_widget)
        ###dock_viewer.addWidget(viewer2D_widget)

        ##%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        ##% Navigator viewer Dock
        navigator1D_widget = QtWidgets.QWidget()
        self.ui.navigator1D = Viewer1D(navigator1D_widget)
        self.ui.navigator1D.ui.crosshair.crosshair_dragged.connect(
            self.update_viewer_data)
        self.ui.navigator1D.ui.crosshair_pb.click()
        self.ui.navigator1D.data_to_export_signal.connect(self.export_data)
        navigator2D_widget = QtWidgets.QWidget()
        self.ui.navigator2D = Viewer2D(navigator2D_widget)
        self.ui.navigator2D.ui.auto_levels_pb.click()
        self.ui.navigator2D.crosshair_dragged.connect(
            self.update_viewer_data
        )  #export scaled position in conjonction with 2D scaled axes
        self.ui.navigator2D.ui.crosshair_pb.click()
        self.ui.navigator2D.data_to_export_signal.connect(self.export_data)

        widg0 = QtWidgets.QWidget()
        VLayout0 = QtWidgets.QVBoxLayout()
        self.navigator_label = QtWidgets.QLabel('Navigation View')
        self.navigator_label.setMaximumHeight(15)
        VLayout0.addWidget(self.navigator_label)
        VLayout0.addWidget(navigator1D_widget)
        VLayout0.addWidget(navigator2D_widget)
        widg0.setLayout(VLayout0)
        Vsplitter.insertWidget(0, widg0)

        widg1 = QtWidgets.QWidget()
        VLayout1 = QtWidgets.QVBoxLayout()
        self.viewer_label = QtWidgets.QLabel('Data View')
        self.viewer_label.setMaximumHeight(15)
        VLayout1.addWidget(self.viewer_label)
        VLayout1.addWidget(viewer1D_widget)
        VLayout1.addWidget(viewer2D_widget)
        widg1.setLayout(VLayout1)
        Vsplitter.insertWidget(1, widg1)

        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/icons/Icon_Library/cartesian.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.ui.set_signals_pb_1D = QtWidgets.QPushButton('')
        self.ui.set_signals_pb_1D.setToolTip('Change navigation/signal axes')
        self.ui.set_signals_pb_1D_bis = QtWidgets.QPushButton('')
        self.ui.set_signals_pb_1D_bis.setToolTip(
            'Change navigation/signal axes')
        self.ui.set_signals_pb_1D.setIcon(icon)
        self.ui.set_signals_pb_1D_bis.setIcon(icon)
        self.ui.set_signals_pb_2D = QtWidgets.QPushButton('')
        self.ui.set_signals_pb_2D.setToolTip('Change navigation/signal axes')
        self.ui.set_signals_pb_2D.setIcon(icon)
        self.ui.set_signals_pb_2D_bis = QtWidgets.QPushButton('')
        self.ui.set_signals_pb_2D_bis.setToolTip(
            'Change navigation/signal axes')
        self.ui.set_signals_pb_2D_bis.setIcon(icon)

        self.ui.navigator1D.ui.horizontalLayout.insertWidget(
            0, self.ui.set_signals_pb_1D)
        self.ui.navigator2D.ui.horizontalLayout_2.insertWidget(
            0, self.ui.set_signals_pb_2D)
        self.ui.viewer1D.ui.horizontalLayout.insertWidget(
            0, self.ui.set_signals_pb_1D_bis)
        self.ui.viewer2D.ui.horizontalLayout_2.insertWidget(
            0, self.ui.set_signals_pb_2D_bis)

        main_layout.addWidget(Vsplitter)

        self.ui.set_signals_pb_1D.clicked.connect(self.signal_axes_selection)
        self.ui.set_signals_pb_2D.clicked.connect(self.signal_axes_selection)
        self.ui.set_signals_pb_1D_bis.clicked.connect(
            self.signal_axes_selection)
        self.ui.set_signals_pb_2D_bis.clicked.connect(
            self.signal_axes_selection)

        #to start: display as default a 2D navigator and a 1D viewer
        self.ui.navigator1D.parent.setVisible(False)
        self.ui.viewer2D.parent.setVisible(True)

    def show_data_temp(self, datas, nav_axes=None, **kwargs):
        """
        """
        self.show_data(datas, temp_data=True, nav_axes=nav_axes, **kwargs)

    def show_data(self, datas, temp_data=False, nav_axes=None, **kwargs):
        """Display datas as a hyperspaced dataset
        only one numpy ndarray should be used
        """
        self.data_buffer = []
        try:
            if self.data_axes is not None:
                if datas.ndim != len(
                        self.data_axes) or self.axes_nav != nav_axes:
                    self.set_nav_axes(
                        datas.ndim, nav_axes
                    )  #init the list of axes and set the preset to nav_axes
            else:
                self.set_nav_axes(
                    datas.ndim, nav_axes
                )  #init the list of axes and set the preset to nav_axes

            #self.datas=hs.signals.BaseSignal(datas)
            self.datas = Signal(datas)
            self.datas_settings = kwargs
            self.update_data_signal()

            self.settings.child('data_shape_settings', 'data_shape').setValue(
                self.get_data_dimension())
            self.set_data(self.datas, temp_data=temp_data, **kwargs)

        except Exception as e:
            self.update_status(utils.getLineInfo() + str(e), self.wait_time,
                               'log')

    def signal_axes_selection(self):
        self.ui.settings_tree = ParameterTree()
        self.ui.settings_tree.setMinimumWidth(300)
        self.ui.settings_tree.setParameters(self.settings, showTop=False)
        self.signal_axes_widget = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout()
        self.signal_axes_widget.setLayout(layout)
        layout.addWidget(self.ui.settings_tree)
        self.signal_axes_widget.adjustSize()
        self.signal_axes_widget.show()

    def update_data(self):
        self.update_data_signal()
        self.settings.child('data_shape_settings',
                            'data_shape').setValue(self.get_data_dimension())
        self.set_data(self.datas)

    def update_data_signal(self):
        try:
            self.axes_nav = [
                int(ax) for ax in self.settings.child(
                    'data_shape_settings', 'navigator_axes').value()
                ['selected']
            ]
            self.axes_signal = [
                ax for ax in self.data_axes if ax not in self.axes_nav
            ]

            self.datas = self.datas.transpose(signal_axes=self.axes_signal,
                                              navigation_axes=self.axes_nav)

        except Exception as e:
            self.update_status(utils.getLineInfo() + str(e), self.wait_time,
                               'log')

    def update_Navigator(self):
        ##self.update_data_signal()
        self.set_data(self.datas, **self.datas_settings)

    def update_status(self, txt, wait_time=1000, log=''):
        """
            | Update the statut bar showing a Message with a delay of wait_time ms (1s by default)

            ================ ======== ===========================
            **Parameters**   **Type**     **Description**

             *txt*            string   the text message to show

             *wait_time*      int      the delay time of showing
            ================ ======== ===========================

        """
        self.ui.statusbar.showMessage(txt, wait_time)
        if log == 'log':
            self.log_signal.emit(txt)

    def update_viewer_data(self, posx=0, posy=0):
        """
            |PyQt5 slot triggered by the crosshair signal from the 1D or 2D Navigator
            | Update the viewer informations from an x/y given position and store data.
            | Ruled by the viewer type (0D,1D,2D)

            ================ ========= ==============================
            **Parameters**   **Type**        **Description**

             *posx*           int       the x position of the viewer

             *posy*           int       the y position of the viewer
            ================ ========= ==============================

            See Also
            --------
            update_status
        """
        try:
            #datas_transposed=self.update_data_signal(self.datas)
            if len(self.axes_nav) == 0:
                data = self.datas.data

            elif len(self.axes_nav) == 1:
                ind_x = utils.find_index(self.nav_x_axis['data'], posx)[0][0]
                data = self.datas.inav[ind_x].data
            elif len(self.axes_nav) == 2:
                ind_x = utils.find_index(self.nav_x_axis['data'], posx)[0][0]
                ind_y = utils.find_index(self.nav_y_axis['data'], posy)[0][0]
                data = self.datas.inav[ind_x, ind_y].data

            if len(self.datas.axes_manager.signal_shape
                   ) == 0:  #means 0D data, plot on 1D viewer
                self.data_buffer.extend(data)
                self.ui.viewer1D.show_data([self.data_buffer])

            elif len(self.datas.axes_manager.signal_shape
                     ) == 1:  #means 1D data, plot on 1D viewer
                self.ui.viewer1D.remove_plots()
                self.ui.viewer1D.x_axis = self.x_axis
                self.ui.viewer1D.show_data([data])

            elif len(self.datas.axes_manager.signal_shape
                     ) == 2:  #means 2D data, plot on 2D viewer
                self.ui.viewer2D.x_axis = self.x_axis
                self.ui.viewer2D.y_axis = self.y_axis
                self.ui.viewer2D.setImage(data)
        except Exception as e:
            self.update_status(utils.getLineInfo() + str(e),
                               wait_time=self.wait_time)