pymodaq 3.6.13__py3-none-any.whl → 4.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pymodaq might be problematic. Click here for more details.
- pymodaq/__init__.py +13 -6
- pymodaq/control_modules/__init__.py +0 -7
- pymodaq/control_modules/daq_move.py +965 -2
- pymodaq/control_modules/daq_move_ui.py +319 -0
- pymodaq/control_modules/daq_viewer.py +1573 -3
- pymodaq/control_modules/daq_viewer_ui.py +393 -0
- pymodaq/control_modules/mocks.py +51 -0
- pymodaq/control_modules/move_utility_classes.py +709 -8
- pymodaq/control_modules/utils.py +256 -0
- pymodaq/control_modules/viewer_utility_classes.py +663 -6
- pymodaq/daq_utils.py +89 -0
- pymodaq/dashboard.py +91 -72
- pymodaq/examples/custom_app.py +12 -11
- pymodaq/examples/custom_viewer.py +10 -10
- pymodaq/examples/function_plotter.py +16 -13
- pymodaq/examples/nonlinearscanner.py +8 -6
- pymodaq/examples/parameter_ex.py +7 -7
- pymodaq/examples/preset_MockCamera.xml +1 -0
- pymodaq/extensions/__init__.py +16 -0
- pymodaq/extensions/console.py +76 -0
- pymodaq/{daq_logger.py → extensions/daq_logger.py} +115 -65
- pymodaq/extensions/daq_scan.py +1339 -0
- pymodaq/extensions/daq_scan_ui.py +240 -0
- pymodaq/extensions/h5browser.py +23 -0
- pymodaq/{pid → extensions/pid}/__init__.py +4 -2
- pymodaq/{pid → extensions/pid}/daq_move_PID.py +2 -2
- pymodaq/{pid → extensions/pid}/pid_controller.py +48 -36
- pymodaq/{pid → extensions/pid}/utils.py +52 -6
- pymodaq/extensions/utils.py +40 -0
- pymodaq/post_treatment/__init__.py +6 -0
- pymodaq/{daq_analysis → post_treatment/daq_analysis}/daq_analysis_main.py +17 -17
- pymodaq/{daq_measurement → post_treatment/daq_measurement}/daq_measurement_main.py +8 -14
- pymodaq/post_treatment/load_and_plot.py +219 -0
- pymodaq/post_treatment/process_to_scalar.py +263 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/run_all.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop_all.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.bat +1 -1
- pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.qrc +1 -0
- pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources_rc.py +109784 -109173
- pymodaq/resources/QtDesigner_Ressources/icons.svg +142 -0
- pymodaq/resources/VERSION +1 -1
- pymodaq/resources/config_template.toml +32 -13
- pymodaq/resources/preset_default.xml +1 -1
- pymodaq/{daq_utils → utils}/Tuto innosetup/script_full_setup.iss +1 -1
- pymodaq/utils/__init__.py +0 -29
- pymodaq/utils/abstract/__init__.py +48 -0
- pymodaq/{daq_utils → utils}/abstract/logger.py +7 -3
- pymodaq/utils/array_manipulation.py +379 -8
- pymodaq/{daq_utils → utils}/calibration_camera.py +6 -6
- pymodaq/{daq_utils → utils}/chrono_timer.py +1 -1
- pymodaq/utils/config.py +448 -0
- pymodaq/utils/conftests.py +5 -0
- pymodaq/utils/daq_utils.py +828 -8
- pymodaq/utils/data.py +1873 -7
- pymodaq/{daq_utils → utils}/db/db_logger/db_logger.py +86 -47
- pymodaq/{daq_utils → utils}/db/db_logger/db_logger_models.py +31 -10
- pymodaq/{daq_utils → utils}/enums.py +12 -7
- pymodaq/utils/exceptions.py +37 -0
- pymodaq/utils/factory.py +82 -0
- pymodaq/{daq_utils → utils}/gui_utils/__init__.py +1 -1
- pymodaq/utils/gui_utils/custom_app.py +129 -0
- pymodaq/utils/gui_utils/file_io.py +66 -0
- pymodaq/{daq_utils → utils}/gui_utils/layout.py +2 -2
- pymodaq/{daq_utils → utils}/gui_utils/utils.py +13 -3
- pymodaq/{daq_utils → utils}/gui_utils/widgets/__init__.py +2 -2
- pymodaq/utils/gui_utils/widgets/label.py +24 -0
- pymodaq/{daq_utils → utils}/gui_utils/widgets/lcd.py +12 -7
- pymodaq/{daq_utils → utils}/gui_utils/widgets/push.py +66 -2
- pymodaq/{daq_utils → utils}/gui_utils/widgets/qled.py +6 -4
- pymodaq/utils/gui_utils/widgets/spinbox.py +24 -0
- pymodaq/{daq_utils → utils}/gui_utils/widgets/table.py +2 -2
- pymodaq/utils/h5modules/__init__.py +1 -0
- pymodaq/{daq_utils/h5backend.py → utils/h5modules/backends.py} +200 -112
- pymodaq/utils/h5modules/browsing.py +683 -0
- pymodaq/utils/h5modules/data_saving.py +839 -0
- pymodaq/utils/h5modules/h5logging.py +110 -0
- pymodaq/utils/h5modules/module_saving.py +350 -0
- pymodaq/utils/h5modules/saving.py +914 -0
- pymodaq/utils/h5modules/utils.py +85 -0
- pymodaq/utils/logger.py +64 -6
- pymodaq/utils/managers/action_manager.py +460 -0
- pymodaq/{daq_utils → utils}/managers/batchscan_manager.py +144 -112
- pymodaq/{daq_utils → utils}/managers/modules_manager.py +188 -114
- pymodaq/{daq_utils → utils}/managers/overshoot_manager.py +3 -3
- pymodaq/utils/managers/parameter_manager.py +110 -0
- pymodaq/{daq_utils → utils}/managers/preset_manager.py +17 -13
- pymodaq/{daq_utils → utils}/managers/preset_manager_utils.py +8 -7
- pymodaq/{daq_utils → utils}/managers/remote_manager.py +7 -6
- pymodaq/{daq_utils → utils}/managers/roi_manager.py +148 -57
- pymodaq/utils/math_utils.py +546 -10
- pymodaq/{daq_utils → utils}/messenger.py +5 -1
- pymodaq/utils/parameter/__init__.py +2 -15
- pymodaq/{daq_utils → utils}/parameter/ioxml.py +12 -6
- pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/__init__.py +1 -3
- pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/filedir.py +1 -1
- pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/itemselect.py +3 -0
- pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/led.py +1 -1
- pymodaq/utils/parameter/pymodaq_ptypes/pixmap.py +161 -0
- pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/slide.py +1 -1
- pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/table.py +1 -1
- pymodaq/utils/parameter/utils.py +206 -11
- pymodaq/utils/plotting/data_viewers/__init__.py +6 -0
- pymodaq/utils/plotting/data_viewers/viewer.py +393 -0
- pymodaq/utils/plotting/data_viewers/viewer0D.py +251 -0
- pymodaq/utils/plotting/data_viewers/viewer1D.py +574 -0
- pymodaq/{daq_utils → utils}/plotting/data_viewers/viewer1Dbasic.py +8 -3
- pymodaq/{daq_utils → utils}/plotting/data_viewers/viewer2D.py +292 -357
- pymodaq/{daq_utils → utils}/plotting/data_viewers/viewer2D_basic.py +58 -75
- pymodaq/utils/plotting/data_viewers/viewerND.py +738 -0
- pymodaq/{daq_utils → utils}/plotting/gant_chart.py +2 -2
- pymodaq/{daq_utils → utils}/plotting/items/axis_scaled.py +4 -2
- pymodaq/{daq_utils → utils}/plotting/items/image.py +8 -6
- pymodaq/utils/plotting/navigator.py +355 -0
- pymodaq/utils/plotting/scan_selector.py +480 -0
- pymodaq/utils/plotting/utils/axes_viewer.py +88 -0
- pymodaq/utils/plotting/utils/filter.py +538 -0
- pymodaq/utils/plotting/utils/lineout.py +224 -0
- pymodaq/{daq_utils → utils}/plotting/utils/plot_utils.py +196 -84
- pymodaq/{daq_utils → utils}/plotting/utils/signalND.py +21 -13
- pymodaq/utils/plotting/widgets.py +76 -0
- pymodaq/utils/scanner/__init__.py +10 -0
- pymodaq/utils/scanner/scan_factory.py +204 -0
- pymodaq/utils/scanner/scanner.py +271 -0
- pymodaq/utils/scanner/scanners/_1d_scanners.py +117 -0
- pymodaq/utils/scanner/scanners/_2d_scanners.py +293 -0
- pymodaq/utils/scanner/scanners/sequential.py +192 -0
- pymodaq/utils/scanner/scanners/tabular.py +294 -0
- pymodaq/utils/scanner/utils.py +83 -0
- pymodaq/utils/slicing.py +47 -0
- pymodaq/utils/svg/__init__.py +6 -0
- pymodaq/utils/svg/svg_renderer.py +20 -0
- pymodaq/utils/svg/svg_view.py +35 -0
- pymodaq/utils/svg/svg_viewer2D.py +51 -0
- pymodaq/{daq_utils → utils}/tcp_server_client.py +36 -37
- pymodaq/{daq_utils → utils}/tree_layout/tree_layout_main.py +50 -35
- pymodaq/utils/units.py +216 -0
- pymodaq-4.0.1.dist-info/METADATA +159 -0
- {pymodaq-3.6.13.dist-info → pymodaq-4.0.1.dist-info}/RECORD +167 -170
- {pymodaq-3.6.13.dist-info → pymodaq-4.0.1.dist-info}/WHEEL +1 -2
- pymodaq-4.0.1.dist-info/entry_points.txt +8 -0
- pymodaq/daq_move/daq_move_gui.py +0 -279
- pymodaq/daq_move/daq_move_gui.ui +0 -534
- pymodaq/daq_move/daq_move_main.py +0 -1042
- pymodaq/daq_move/process_from_QtDesigner_DAQ_Move_GUI.bat +0 -2
- pymodaq/daq_move/utility_classes.py +0 -686
- pymodaq/daq_scan.py +0 -2160
- pymodaq/daq_utils/array_manipulation.py +0 -386
- pymodaq/daq_utils/config.py +0 -273
- pymodaq/daq_utils/conftests.py +0 -7
- pymodaq/daq_utils/custom_parameter_tree.py +0 -9
- pymodaq/daq_utils/daq_enums.py +0 -133
- pymodaq/daq_utils/daq_utils.py +0 -1402
- pymodaq/daq_utils/exceptions.py +0 -71
- pymodaq/daq_utils/gui_utils/custom_app.py +0 -103
- pymodaq/daq_utils/gui_utils/file_io.py +0 -75
- pymodaq/daq_utils/gui_utils/widgets/spinbox.py +0 -9
- pymodaq/daq_utils/h5exporter_hyperspy.py +0 -115
- pymodaq/daq_utils/h5exporters.py +0 -242
- pymodaq/daq_utils/h5modules.py +0 -1559
- pymodaq/daq_utils/h5utils.py +0 -241
- pymodaq/daq_utils/managers/action_manager.py +0 -236
- pymodaq/daq_utils/managers/parameter_manager.py +0 -57
- pymodaq/daq_utils/math_utils.py +0 -705
- pymodaq/daq_utils/parameter/__init__.py +0 -1
- pymodaq/daq_utils/parameter/oldpymodaq_ptypes.py +0 -1626
- pymodaq/daq_utils/parameter/pymodaq_ptypes/pixmap.py +0 -85
- pymodaq/daq_utils/parameter/utils.py +0 -136
- pymodaq/daq_utils/plotting/data_viewers/__init__.py +0 -0
- pymodaq/daq_utils/plotting/data_viewers/process_from_QtDesigner_0DViewer_GUI.bat +0 -2
- pymodaq/daq_utils/plotting/data_viewers/viewer0D.py +0 -204
- pymodaq/daq_utils/plotting/data_viewers/viewer0D_GUI.py +0 -89
- pymodaq/daq_utils/plotting/data_viewers/viewer0D_GUI.ui +0 -131
- pymodaq/daq_utils/plotting/data_viewers/viewer1D.py +0 -781
- pymodaq/daq_utils/plotting/data_viewers/viewerND.py +0 -894
- pymodaq/daq_utils/plotting/data_viewers/viewerbase.py +0 -64
- pymodaq/daq_utils/plotting/items/__init__.py +0 -0
- pymodaq/daq_utils/plotting/navigator.py +0 -500
- pymodaq/daq_utils/plotting/scan_selector.py +0 -289
- pymodaq/daq_utils/plotting/utils/__init__.py +0 -0
- pymodaq/daq_utils/plotting/utils/filter.py +0 -236
- pymodaq/daq_utils/plotting/viewer0D/__init__.py +0 -0
- pymodaq/daq_utils/plotting/viewer0D/viewer0D_main.py +0 -4
- pymodaq/daq_utils/plotting/viewer1D/__init__.py +0 -0
- pymodaq/daq_utils/plotting/viewer1D/viewer1D_main.py +0 -4
- pymodaq/daq_utils/plotting/viewer1D/viewer1Dbasic.py +0 -4
- pymodaq/daq_utils/plotting/viewer2D/viewer_2D_basic.py +0 -4
- pymodaq/daq_utils/plotting/viewer2D/viewer_2D_main.py +0 -4
- pymodaq/daq_utils/plotting/viewerND/__init__.py +0 -0
- pymodaq/daq_utils/plotting/viewerND/viewerND_main.py +0 -4
- pymodaq/daq_utils/scanner.py +0 -1289
- pymodaq/daq_utils/tree_layout/__init__.py +0 -0
- pymodaq/daq_viewer/__init__.py +0 -0
- pymodaq/daq_viewer/daq_gui_settings.py +0 -237
- pymodaq/daq_viewer/daq_gui_settings.ui +0 -441
- pymodaq/daq_viewer/daq_viewer_main.py +0 -2225
- pymodaq/daq_viewer/process_from_QtDesigner_DAQ_GUI_settings.bat +0 -2
- pymodaq/daq_viewer/utility_classes.py +0 -673
- pymodaq/examples/logger_image/__init__.py +0 -0
- pymodaq/examples/logger_image/logger_displayer.py +0 -121
- pymodaq/examples/logger_image/setup.svg +0 -3119
- pymodaq/examples/logger_image/setup_svg.py +0 -114
- pymodaq/h5browser.py +0 -39
- pymodaq/utils/scanner.py +0 -15
- pymodaq-3.6.13.dist-info/METADATA +0 -39
- pymodaq-3.6.13.dist-info/entry_points.txt +0 -8
- pymodaq-3.6.13.dist-info/top_level.txt +0 -1
- /pymodaq/{daq_analysis → post_treatment/daq_analysis}/__init__.py +0 -0
- /pymodaq/{daq_measurement → post_treatment/daq_measurement}/__init__.py +0 -0
- /pymodaq/{daq_measurement → post_treatment/daq_measurement}/daq_measurement_GUI.py +0 -0
- /pymodaq/{daq_measurement → post_treatment/daq_measurement}/daq_measurement_GUI.ui +0 -0
- /pymodaq/{daq_measurement → post_treatment/daq_measurement}/process_from_QtDesigner_DAQ_Measurement_GUI.bat +0 -0
- /pymodaq/{daq_utils → utils}/Tuto innosetup/Tuto innosetup.odt +0 -0
- /pymodaq/{daq_utils → utils}/Tuto innosetup/Tuto innosetup.pdf +0 -0
- /pymodaq/{daq_move → utils/db}/__init__.py +0 -0
- /pymodaq/{daq_utils → utils/db/db_logger}/__init__.py +0 -0
- /pymodaq/{daq_utils → utils}/gui_utils/dock.py +0 -0
- /pymodaq/{daq_utils → utils}/gui_utils/list_picker.py +0 -0
- /pymodaq/{daq_utils/abstract → utils/managers}/__init__.py +0 -0
- /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/bool.py +0 -0
- /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/date.py +0 -0
- /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/list.py +0 -0
- /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/numeric.py +0 -0
- /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/tableview.py +0 -0
- /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/text.py +0 -0
- /pymodaq/{daq_utils/db → utils/plotting}/__init__.py +0 -0
- /pymodaq/{daq_utils → utils}/plotting/image_viewer.py +0 -0
- /pymodaq/{daq_utils/db/db_logger → utils/plotting/items}/__init__.py +0 -0
- /pymodaq/{daq_utils → utils}/plotting/items/crosshair.py +0 -0
- /pymodaq/{daq_utils/managers → utils/plotting/utils}/__init__.py +0 -0
- /pymodaq/{daq_utils → utils}/qvariant.py +0 -0
- /pymodaq/{daq_utils/plotting/viewer2D → utils/scanner/scanners}/__init__.py +0 -0
- /pymodaq/{daq_utils/plotting → utils/tree_layout}/__init__.py +0 -0
- {pymodaq-3.6.13.dist-info → pymodaq-4.0.1.dist-info/licenses}/LICENSE +0 -0
|
@@ -1,894 +0,0 @@
|
|
|
1
|
-
from pymodaq.daq_utils.gui_utils.dock import DockArea, Dock
|
|
2
|
-
from pymodaq.daq_utils.managers.action_manager import addaction
|
|
3
|
-
from qtpy import QtWidgets
|
|
4
|
-
from qtpy.QtCore import QObject, Slot, Signal, QRectF, \
|
|
5
|
-
QPointF
|
|
6
|
-
import sys
|
|
7
|
-
from pymodaq.daq_utils.plotting.data_viewers.viewer1D import Viewer1D
|
|
8
|
-
from pymodaq.daq_utils.plotting.data_viewers.viewer1Dbasic import Viewer1DBasic
|
|
9
|
-
from pymodaq.daq_utils.plotting.data_viewers.viewer2D import Viewer2D
|
|
10
|
-
from pymodaq.daq_utils.daq_utils import Axis
|
|
11
|
-
from collections import OrderedDict
|
|
12
|
-
import numpy as np
|
|
13
|
-
from pyqtgraph.parametertree import Parameter, ParameterTree
|
|
14
|
-
import pymodaq.daq_utils.daq_utils as utils
|
|
15
|
-
|
|
16
|
-
from pyqtgraph import LinearRegionItem
|
|
17
|
-
from pymodaq.daq_utils import gui_utils as gutils
|
|
18
|
-
import copy
|
|
19
|
-
from pymodaq.daq_utils.plotting.utils.signalND import Signal as SignalND
|
|
20
|
-
import datetime
|
|
21
|
-
|
|
22
|
-
logger = utils.set_logger(utils.get_module_name(__file__))
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class ViewerND(QtWidgets.QWidget, QObject):
|
|
26
|
-
"""
|
|
27
|
-
|
|
28
|
-
======================== =========================================
|
|
29
|
-
**Attributes** **Type**
|
|
30
|
-
|
|
31
|
-
*DockArea* instance of gutils.DockArea
|
|
32
|
-
*mainwindow* instance of gutils.DockArea
|
|
33
|
-
*title* string
|
|
34
|
-
*waitime* int
|
|
35
|
-
*x_axis* float array
|
|
36
|
-
*y_axis* float array
|
|
37
|
-
*data_buffer* list of data
|
|
38
|
-
*ui* QObject
|
|
39
|
-
======================== =========================================
|
|
40
|
-
|
|
41
|
-
Raises
|
|
42
|
-
------
|
|
43
|
-
parent Exception
|
|
44
|
-
If parent argument is None in constructor abort
|
|
45
|
-
|
|
46
|
-
See Also
|
|
47
|
-
--------
|
|
48
|
-
set_GUI
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
References
|
|
52
|
-
----------
|
|
53
|
-
qtpy, pyqtgraph, QtWidgets, QObject
|
|
54
|
-
|
|
55
|
-
"""
|
|
56
|
-
command_DAQ_signal = Signal(list)
|
|
57
|
-
log_signal = Signal(str)
|
|
58
|
-
data_to_export_signal = Signal(OrderedDict) # edict(name=self.DAQ_type,data0D=None,data1D=None,data2D=None)
|
|
59
|
-
|
|
60
|
-
def __init__(self, parent=None):
|
|
61
|
-
|
|
62
|
-
super(ViewerND, self).__init__()
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if parent is None:
|
|
66
|
-
area = DockArea()
|
|
67
|
-
area.show()
|
|
68
|
-
self.area = area
|
|
69
|
-
elif isinstance(parent, DockArea):
|
|
70
|
-
self.area = parent
|
|
71
|
-
elif isinstance(parent, QtWidgets.QWidget):
|
|
72
|
-
area = DockArea()
|
|
73
|
-
self.area = area
|
|
74
|
-
parent.setLayout(QtWidgets.QVBoxLayout())
|
|
75
|
-
parent.layout().addWidget(area)
|
|
76
|
-
|
|
77
|
-
self.wait_time = 2000
|
|
78
|
-
self.viewer_type = 'DataND' # ☺by default but coul dbe used for 3D visualization
|
|
79
|
-
self.distribution = 'uniform'
|
|
80
|
-
self.nav_axes_viewers = []
|
|
81
|
-
self.nav_axes_dicts = []
|
|
82
|
-
|
|
83
|
-
self.x_axis = dict(data=None, label='', units='')
|
|
84
|
-
self.y_axis = dict(data=None, label='', units='')
|
|
85
|
-
|
|
86
|
-
self.data_buffer = [] # convenience list to store 0D data to be displayed
|
|
87
|
-
self.datas = None
|
|
88
|
-
self.datas_settings = None
|
|
89
|
-
# set default data shape case
|
|
90
|
-
self.data_axes = None
|
|
91
|
-
# self.set_nav_axes(3)
|
|
92
|
-
self.ui = QObject() # the user interface
|
|
93
|
-
self.set_GUI()
|
|
94
|
-
self.setup_spread_UI()
|
|
95
|
-
self.title = ""
|
|
96
|
-
self.data_to_export = OrderedDict(name=self.title, data0D=OrderedDict(), data1D=OrderedDict(),
|
|
97
|
-
data2D=OrderedDict(),
|
|
98
|
-
dataND=OrderedDict())
|
|
99
|
-
|
|
100
|
-
@Slot(OrderedDict)
|
|
101
|
-
def export_data(self, datas):
|
|
102
|
-
self.data_to_export['acq_time_s'] = datetime.datetime.now().timestamp()
|
|
103
|
-
for key in datas.keys():
|
|
104
|
-
if key in self.data_to_export.keys():
|
|
105
|
-
if isinstance(datas[key], OrderedDict):
|
|
106
|
-
if list(datas[key].keys()) != []:
|
|
107
|
-
self.data_to_export[key].update(datas[key])
|
|
108
|
-
self.data_to_export_signal.emit(self.data_to_export)
|
|
109
|
-
|
|
110
|
-
def get_data_dimension(self):
|
|
111
|
-
try:
|
|
112
|
-
dimension = "("
|
|
113
|
-
for ind, ax in enumerate(self.datas.axes_manager.navigation_shape):
|
|
114
|
-
if ind != len(self.datas.axes_manager.navigation_shape) - 1:
|
|
115
|
-
dimension += str(ax) + ','
|
|
116
|
-
else:
|
|
117
|
-
dimension += str(ax) + '|'
|
|
118
|
-
for ind, ax in enumerate(self.datas.axes_manager.signal_shape):
|
|
119
|
-
if ind != len(self.datas.axes_manager.signal_shape) - 1:
|
|
120
|
-
dimension += str(ax) + ','
|
|
121
|
-
else:
|
|
122
|
-
dimension += str(ax) + ')'
|
|
123
|
-
return dimension
|
|
124
|
-
except Exception as e:
|
|
125
|
-
self.update_status(utils.getLineInfo() + str(e), self.wait_time, log='log')
|
|
126
|
-
logger.exception(str(e))
|
|
127
|
-
return ""
|
|
128
|
-
|
|
129
|
-
def parameter_tree_changed(self, param, changes):
|
|
130
|
-
"""
|
|
131
|
-
Foreach value changed, update :
|
|
132
|
-
* Viewer in case of **DAQ_type** parameter name
|
|
133
|
-
* visibility of button in case of **show_averaging** parameter name
|
|
134
|
-
* visibility of naverage in case of **live_averaging** parameter name
|
|
135
|
-
* scale of axis **else** (in 2D pymodaq type)
|
|
136
|
-
|
|
137
|
-
Once done emit the update settings signal to link the commit.
|
|
138
|
-
|
|
139
|
-
=============== =================================== ================================================================
|
|
140
|
-
**Parameters** **Type** **Description**
|
|
141
|
-
*param* instance of ppyqtgraph parameter the parameter to be checked
|
|
142
|
-
*changes* tuple list Contain the (param,changes,info) list listing the changes made
|
|
143
|
-
=============== =================================== ================================================================
|
|
144
|
-
"""
|
|
145
|
-
try:
|
|
146
|
-
for param, change, data in changes:
|
|
147
|
-
path = self.settings.childPath(param)
|
|
148
|
-
if path is not None:
|
|
149
|
-
childName = '.'.join(path)
|
|
150
|
-
else:
|
|
151
|
-
childName = param.name()
|
|
152
|
-
if change == 'childAdded':
|
|
153
|
-
pass
|
|
154
|
-
|
|
155
|
-
elif change == 'value':
|
|
156
|
-
pass
|
|
157
|
-
# if param.name()=='navigator_axes':
|
|
158
|
-
# self.update_data_signal()
|
|
159
|
-
# self.settings.child('data_shape_settings', 'data_shape').setValue(str(datas_transposed))
|
|
160
|
-
# self.set_data(self.datas)
|
|
161
|
-
|
|
162
|
-
except Exception as e:
|
|
163
|
-
logger.exception(str(e))
|
|
164
|
-
self.update_status(utils.getLineInfo() + str(e), self.wait_time, 'log')
|
|
165
|
-
|
|
166
|
-
def set_axis(self, Npts):
|
|
167
|
-
"""
|
|
168
|
-
| Set axis values from node and a linspace regular distribution
|
|
169
|
-
|
|
170
|
-
================ ======================= ==========================================
|
|
171
|
-
**Parameters** **Type** **Description**
|
|
172
|
-
|
|
173
|
-
*node* tables Group instance the root node of the local treated tree
|
|
174
|
-
================ ======================= ==========================================
|
|
175
|
-
|
|
176
|
-
Returns
|
|
177
|
-
-------
|
|
178
|
-
float array
|
|
179
|
-
the computed values axis.
|
|
180
|
-
|
|
181
|
-
"""
|
|
182
|
-
axis = np.linspace(0, Npts, Npts, endpoint=False)
|
|
183
|
-
return axis
|
|
184
|
-
|
|
185
|
-
def restore_nav_axes(self, navigation_axes, nav_axes=None):
|
|
186
|
-
if nav_axes is None:
|
|
187
|
-
N_nav_axes = len(self.datas.data.shape)
|
|
188
|
-
else:
|
|
189
|
-
N_nav_axes = len([ax for ax in navigation_axes if 'nav' in ax])
|
|
190
|
-
nav_axes_dicts = []
|
|
191
|
-
sorted_indexes = []
|
|
192
|
-
for k in navigation_axes:
|
|
193
|
-
if 'nav' in k:
|
|
194
|
-
if navigation_axes[k]['nav_index'] < N_nav_axes:
|
|
195
|
-
sorted_indexes.append(navigation_axes[k]['nav_index'])
|
|
196
|
-
nav_axes_dicts.append(copy.deepcopy(navigation_axes[k]))
|
|
197
|
-
|
|
198
|
-
for ind in range(N_nav_axes): # in case there was no nav axes in kwargs
|
|
199
|
-
if ind not in sorted_indexes:
|
|
200
|
-
sorted_indexes.append(ind)
|
|
201
|
-
nav_axes_dicts.append(Axis(nav_index=ind, label=f'Nav {ind:02d}'))
|
|
202
|
-
N = self.datas.data.shape[ind]
|
|
203
|
-
nav_axes_dicts[-1]['data'] = np.linspace(0, N - 1, N)
|
|
204
|
-
|
|
205
|
-
# sort nav axes:
|
|
206
|
-
sorted_index = np.argsort(sorted_indexes)
|
|
207
|
-
self.nav_axes_dicts = []
|
|
208
|
-
for ind in sorted_index:
|
|
209
|
-
self.nav_axes_dicts.append(nav_axes_dicts[ind])
|
|
210
|
-
|
|
211
|
-
def set_data(self, datas_transposed, temp_data=False, restore_nav_axes=True, **kwargs):
|
|
212
|
-
"""
|
|
213
|
-
"""
|
|
214
|
-
try:
|
|
215
|
-
|
|
216
|
-
if restore_nav_axes:
|
|
217
|
-
nav_axes = dict([])
|
|
218
|
-
for ind, ax in enumerate(self.nav_axes_dicts):
|
|
219
|
-
nav_axes[f'nav_{ind}'] = ax
|
|
220
|
-
self.restore_nav_axes(nav_axes)
|
|
221
|
-
|
|
222
|
-
##########################################################################
|
|
223
|
-
# display the correct signal viewer
|
|
224
|
-
if len(datas_transposed.axes_manager.signal_shape) == 0: # signal data are 0D
|
|
225
|
-
self.ui.viewer1D.parent.setVisible(True)
|
|
226
|
-
self.ui.viewer2D.parent.setVisible(False)
|
|
227
|
-
elif len(datas_transposed.axes_manager.signal_shape) == 1: # signal data are 1D
|
|
228
|
-
self.ui.viewer1D.parent.setVisible(True)
|
|
229
|
-
self.ui.viewer2D.parent.setVisible(False)
|
|
230
|
-
elif len(datas_transposed.axes_manager.signal_shape) == 2: # signal data are 2D
|
|
231
|
-
self.ui.viewer1D.parent.setVisible(False)
|
|
232
|
-
self.ui.viewer2D.parent.setVisible(True)
|
|
233
|
-
self.x_axis = Axis()
|
|
234
|
-
self.y_axis = Axis()
|
|
235
|
-
if len(datas_transposed.axes_manager.signal_shape) == 1 or len(
|
|
236
|
-
datas_transposed.axes_manager.signal_shape) == 2: # signal data are 1D
|
|
237
|
-
|
|
238
|
-
if 'x_axis' in kwargs:
|
|
239
|
-
if not isinstance(kwargs['x_axis'], dict):
|
|
240
|
-
self.x_axis['data'] = kwargs['x_axis'][:]
|
|
241
|
-
self.x_axis = kwargs['x_axis']
|
|
242
|
-
else:
|
|
243
|
-
self.x_axis = copy.deepcopy(kwargs['x_axis'])
|
|
244
|
-
else:
|
|
245
|
-
self.x_axis['data'] = self.set_axis(datas_transposed.axes_manager.signal_shape[0])
|
|
246
|
-
if 'y_axis' in kwargs:
|
|
247
|
-
self.ui.viewer1D.set_axis_label(axis_settings=dict(orientation='left',
|
|
248
|
-
label=kwargs['y_axis']['label'],
|
|
249
|
-
units=kwargs['y_axis']['units']))
|
|
250
|
-
|
|
251
|
-
if len(datas_transposed.axes_manager.signal_shape) == 2: # signal data is 2D
|
|
252
|
-
if 'y_axis' in kwargs:
|
|
253
|
-
if not isinstance(kwargs['y_axis'], dict):
|
|
254
|
-
self.y_axis['data'] = kwargs['y_axis'][:]
|
|
255
|
-
self.y_axis = kwargs['y_axis']
|
|
256
|
-
else:
|
|
257
|
-
self.y_axis = copy.deepcopy(kwargs['y_axis'])
|
|
258
|
-
else:
|
|
259
|
-
self.y_axis['data'] = self.set_axis(datas_transposed.axes_manager.signal_shape[1])
|
|
260
|
-
|
|
261
|
-
axes_nav = self.get_selected_axes_indexes()
|
|
262
|
-
if len(axes_nav) == 0 or len(axes_nav) == 1:
|
|
263
|
-
self.update_viewer_data(*self.ui.navigator1D.ui.crosshair.get_positions())
|
|
264
|
-
elif len(axes_nav) == 2:
|
|
265
|
-
self.update_viewer_data(*self.ui.navigator2D.crosshair.get_positions())
|
|
266
|
-
|
|
267
|
-
# #get ROI bounds from viewers if any
|
|
268
|
-
ROI_bounds_1D = []
|
|
269
|
-
try:
|
|
270
|
-
self.ROI1D.getRegion()
|
|
271
|
-
indexes_values = utils.find_index(self.ui.viewer1D.x_axis, self.ROI1D.getRegion())
|
|
272
|
-
ROI_bounds_1D.append(QPointF(indexes_values[0][0], indexes_values[1][0]))
|
|
273
|
-
except Exception as e:
|
|
274
|
-
logger.warning(str(e))
|
|
275
|
-
|
|
276
|
-
ROI_bounds_2D = []
|
|
277
|
-
try:
|
|
278
|
-
ROI_bounds_2D.append(QRectF(self.ROI2D.pos().x(), self.ROI2D.pos().y(),
|
|
279
|
-
self.ROI2D.size().x(), self.ROI2D.size().y()))
|
|
280
|
-
except Exception as e:
|
|
281
|
-
logger.warning(str(e))
|
|
282
|
-
|
|
283
|
-
#############################################################
|
|
284
|
-
# display the correct navigator viewer and set some parameters
|
|
285
|
-
if len(axes_nav) <= 2:
|
|
286
|
-
for view in self.nav_axes_viewers:
|
|
287
|
-
self.ui.nav_axes_widget.layout().removeWidget(view.parent)
|
|
288
|
-
view.parent.close()
|
|
289
|
-
self.nav_axes_viewers = []
|
|
290
|
-
|
|
291
|
-
nav_axes = self.get_selected_axes()
|
|
292
|
-
|
|
293
|
-
if len(nav_axes) == 0: # no Navigator
|
|
294
|
-
self.ui.navigator1D.parent.setVisible(False)
|
|
295
|
-
self.ui.navigator2D.parent.setVisible(False)
|
|
296
|
-
# self.navigator_label.setVisible(False)
|
|
297
|
-
self.ui.nav_axes_widget.setVisible(False)
|
|
298
|
-
self.ROI1D.setVisible(False)
|
|
299
|
-
self.ROI2D.setVisible(False)
|
|
300
|
-
navigator_data = []
|
|
301
|
-
|
|
302
|
-
elif len(nav_axes) == 1: # 1D Navigator
|
|
303
|
-
self.ROI1D.setVisible(True)
|
|
304
|
-
self.ROI2D.setVisible(True)
|
|
305
|
-
self.ui.navigator1D.parent.setVisible(True)
|
|
306
|
-
self.ui.navigator2D.parent.setVisible(False)
|
|
307
|
-
self.ui.nav_axes_widget.setVisible(False)
|
|
308
|
-
# self.navigator_label.setVisible(True)
|
|
309
|
-
self.ui.navigator1D.remove_plots()
|
|
310
|
-
self.ui.navigator1D.x_axis = nav_axes[0]
|
|
311
|
-
|
|
312
|
-
labels = []
|
|
313
|
-
units = []
|
|
314
|
-
if self.scan_type.lower() == 'tabular' or self.is_spread:
|
|
315
|
-
if 'datas' in self.nav_axes_dicts[0]:
|
|
316
|
-
navigator_data = self.nav_axes_dicts[0]['datas'][:]
|
|
317
|
-
if 'labels' in self.nav_axes_dicts[0]:
|
|
318
|
-
labels = self.nav_axes_dicts[0]['labels'][:]
|
|
319
|
-
if 'all_units' in self.nav_axes_dicts[0]:
|
|
320
|
-
units = self.nav_axes_dicts[0]['all_units'][:]
|
|
321
|
-
else:
|
|
322
|
-
navigator_data = [self.nav_axes_dicts[0]['data']]
|
|
323
|
-
if self.is_spread:
|
|
324
|
-
if self.scan_type.lower() == 'tabular':
|
|
325
|
-
data_spread = []
|
|
326
|
-
for ind_label, lab in enumerate(labels):
|
|
327
|
-
if 'curvilinear' in lab.lower():
|
|
328
|
-
data_spread = [self.nav_axes_dicts[0]['datas'][ind]]
|
|
329
|
-
else:
|
|
330
|
-
data_spread = self.nav_axes_dicts[0]['datas'][:]
|
|
331
|
-
|
|
332
|
-
data_spread.append(self.get_nav_data(datas_transposed, ROI_bounds_1D, ROI_bounds_2D)[0])
|
|
333
|
-
data_spread = np.vstack(data_spread).T
|
|
334
|
-
|
|
335
|
-
else:
|
|
336
|
-
navigator_data = self.get_nav_data(datas_transposed, ROI_bounds_1D, ROI_bounds_2D)
|
|
337
|
-
|
|
338
|
-
if self.is_spread:
|
|
339
|
-
self.ui.spread_viewer_2D.parent.setVisible(data_spread.shape[1] == 3)
|
|
340
|
-
self.ui.spread_viewer_1D.parent.setVisible(data_spread.shape[1] == 2)
|
|
341
|
-
if data_spread.shape[1] == 3:
|
|
342
|
-
self.ui.spread_viewer_2D.setImage(data_spread=data_spread)
|
|
343
|
-
if len(labels) > 1 and len(units) > 1:
|
|
344
|
-
self.ui.spread_viewer_2D.set_axis_label(dict(orientation='bottom', label=labels[0],
|
|
345
|
-
units=units[0]))
|
|
346
|
-
self.ui.spread_viewer_2D.set_axis_label(dict(orientation='left', label=labels[1],
|
|
347
|
-
units=units[1]))
|
|
348
|
-
else:
|
|
349
|
-
ind_sorted = np.argsort(data_spread[:, 0])
|
|
350
|
-
self.ui.spread_viewer_1D.show_data([data_spread[:, 1][ind_sorted]], labels=['data'],
|
|
351
|
-
x_axis=data_spread[:, 0][ind_sorted])
|
|
352
|
-
self.ui.spread_viewer_1D.set_axis_label(dict(orientation='bottom',
|
|
353
|
-
label='Curvilinear value', units=''))
|
|
354
|
-
|
|
355
|
-
if temp_data:
|
|
356
|
-
self.ui.navigator1D.show_data_temp(navigator_data)
|
|
357
|
-
self.ui.navigator1D.update_labels(labels)
|
|
358
|
-
else:
|
|
359
|
-
self.ui.navigator1D.show_data(navigator_data)
|
|
360
|
-
self.ui.navigator1D.update_labels(labels)
|
|
361
|
-
|
|
362
|
-
elif len(nav_axes) == 2: # 2D Navigator:
|
|
363
|
-
self.ROI1D.setVisible(True)
|
|
364
|
-
self.ROI2D.setVisible(True)
|
|
365
|
-
|
|
366
|
-
self.ui.navigator1D.parent.setVisible(False)
|
|
367
|
-
self.ui.navigator2D.parent.setVisible(True)
|
|
368
|
-
self.ui.nav_axes_widget.setVisible(False)
|
|
369
|
-
# self.navigator_label.setVisible(True)
|
|
370
|
-
|
|
371
|
-
self.ui.navigator2D.x_axis = nav_axes[0]
|
|
372
|
-
self.ui.navigator2D.y_axis = nav_axes[1]
|
|
373
|
-
|
|
374
|
-
navigator_data = self.get_nav_data(datas_transposed, ROI_bounds_1D, ROI_bounds_2D)
|
|
375
|
-
|
|
376
|
-
if temp_data:
|
|
377
|
-
self.ui.navigator2D.setImageTemp(*navigator_data)
|
|
378
|
-
else:
|
|
379
|
-
self.ui.navigator2D.setImage(*navigator_data)
|
|
380
|
-
|
|
381
|
-
else: # more than 2 nv axes, display all nav axes in 1D plots
|
|
382
|
-
|
|
383
|
-
self.ui.navigator1D.parent.setVisible(False)
|
|
384
|
-
self.ui.navigator2D.parent.setVisible(False)
|
|
385
|
-
self.ui.nav_axes_widget.setVisible(True)
|
|
386
|
-
if len(self.nav_axes_viewers) != len(axes_nav):
|
|
387
|
-
for view in self.nav_axes_viewers:
|
|
388
|
-
self.ui.nav_axes_widget.layout().removeWidget(view.parent)
|
|
389
|
-
view.parent.close()
|
|
390
|
-
widgets = []
|
|
391
|
-
self.nav_axes_viewers = []
|
|
392
|
-
for ind in range(len(axes_nav)):
|
|
393
|
-
widgets.append(QtWidgets.QWidget())
|
|
394
|
-
self.ui.nav_axes_widget.layout().addWidget(widgets[-1])
|
|
395
|
-
self.nav_axes_viewers.append(Viewer1DBasic(widgets[-1], show_line=True))
|
|
396
|
-
|
|
397
|
-
for ind in range(len(axes_nav)):
|
|
398
|
-
self.nav_axes_viewers[ind].roi_line_signal.connect(self.update_viewer_data)
|
|
399
|
-
self.nav_axes_viewers[ind].show_data([nav_axes[ind]['data']])
|
|
400
|
-
self.nav_axes_viewers[ind].set_axis_label(dict(orientation='bottom',
|
|
401
|
-
label=nav_axes[ind]['label'],
|
|
402
|
-
units=nav_axes[ind]['units']))
|
|
403
|
-
|
|
404
|
-
self.update_viewer_data()
|
|
405
|
-
|
|
406
|
-
except Exception as e:
|
|
407
|
-
logger.exception(str(e))
|
|
408
|
-
self.update_status(utils.getLineInfo() + str(e), self.wait_time, 'log')
|
|
409
|
-
|
|
410
|
-
def get_data_from_1Dsignal_roi(self, datas_transposed, ROI_bounds_1D):
|
|
411
|
-
if ROI_bounds_1D != []:
|
|
412
|
-
if self.ui.combomath.currentText() == 'Sum':
|
|
413
|
-
navigator_data = [datas_transposed.isig[pt.x():pt.y() + 1].sum((-1)).data for pt in
|
|
414
|
-
ROI_bounds_1D]
|
|
415
|
-
elif self.ui.combomath.currentText() == 'Mean':
|
|
416
|
-
navigator_data = [datas_transposed.isig[pt.x():pt.y() + 1].mean((-1)).data for pt in
|
|
417
|
-
ROI_bounds_1D]
|
|
418
|
-
elif self.ui.combomath.currentText() == 'Half-life':
|
|
419
|
-
navigator_data = [datas_transposed.isig[pt.x():pt.y() + 1].halflife((-1)).data for pt in
|
|
420
|
-
ROI_bounds_1D]
|
|
421
|
-
else:
|
|
422
|
-
if self.ui.combomath.currentText() == 'Sum':
|
|
423
|
-
navigator_data = [datas_transposed.isig[:].sum((-1)).data]
|
|
424
|
-
elif self.ui.combomath.currentText() == 'Mean':
|
|
425
|
-
navigator_data = [datas_transposed.isig[:].mean((-1)).data]
|
|
426
|
-
elif self.ui.combomath.currentText() == 'Half-life':
|
|
427
|
-
navigator_data = [datas_transposed.isig[:].halflife((-1)).data]
|
|
428
|
-
return navigator_data
|
|
429
|
-
|
|
430
|
-
def get_nav_data(self, datas_transposed, ROI_bounds_1D, ROI_bounds_2D):
|
|
431
|
-
|
|
432
|
-
if len(datas_transposed.axes_manager.signal_shape) == 0: # signal data is 0D
|
|
433
|
-
navigator_data = [datas_transposed.data]
|
|
434
|
-
|
|
435
|
-
elif len(datas_transposed.axes_manager.signal_shape) == 1: # signal data is 1D
|
|
436
|
-
navigator_data = self.get_data_from_1Dsignal_roi(datas_transposed, ROI_bounds_1D)
|
|
437
|
-
|
|
438
|
-
elif len(datas_transposed.axes_manager.signal_shape) == 2: # signal data is 2D
|
|
439
|
-
if ROI_bounds_2D != []:
|
|
440
|
-
navigator_data = [datas_transposed.isig[rect.x():rect.x() + rect.width(),
|
|
441
|
-
rect.y():rect.y() + rect.height()].sum((-1, -2)).data for rect in
|
|
442
|
-
ROI_bounds_2D]
|
|
443
|
-
else:
|
|
444
|
-
navigator_data = [datas_transposed.sum((-1, -2)).data]
|
|
445
|
-
else:
|
|
446
|
-
navigator_data = None
|
|
447
|
-
return navigator_data
|
|
448
|
-
|
|
449
|
-
def init_ROI(self):
|
|
450
|
-
nav_axes = self.get_selected_axes()
|
|
451
|
-
if len(nav_axes) != 0:
|
|
452
|
-
self.ui.navigator1D.ui.crosshair.set_crosshair_position(np.mean(nav_axes[0]['data']))
|
|
453
|
-
if len(nav_axes) > 1:
|
|
454
|
-
x, y = self.ui.navigator2D.unscale_axis(np.mean(nav_axes[0]['data']),
|
|
455
|
-
np.mean(nav_axes[1]['data']))
|
|
456
|
-
self.ui.navigator2D.crosshair.set_crosshair_position(x, y)
|
|
457
|
-
|
|
458
|
-
if self.x_axis['data'] is not None:
|
|
459
|
-
self.ROI1D.setRegion((np.min(self.x_axis['data']), np.max(self.x_axis['data'])))
|
|
460
|
-
if self.x_axis['data'] is not None and self.y_axis['data'] is not None:
|
|
461
|
-
self.ROI2D.setPos((np.min(self.x_axis['data']), np.min(self.y_axis['data'])))
|
|
462
|
-
self.ROI2D.setSize((np.max(self.x_axis['data']) - np.min(self.x_axis['data']),
|
|
463
|
-
np.max(self.y_axis['data']) - np.min(self.y_axis['data'])))
|
|
464
|
-
|
|
465
|
-
self.update_Navigator()
|
|
466
|
-
|
|
467
|
-
def set_data_test(self, data_shape='3D'):
|
|
468
|
-
|
|
469
|
-
x = utils.linspace_step(-10, 10, 0.2)
|
|
470
|
-
y = utils.linspace_step(-30, 30, 2)
|
|
471
|
-
t = utils.linspace_step(-200, 200, 2)
|
|
472
|
-
z = utils.linspace_step(-50, 50, 0.5)
|
|
473
|
-
datas = np.zeros((len(y), len(x), len(t), len(z)))
|
|
474
|
-
amp = utils.gauss2D(x, 0, 1, y, 0, 2)
|
|
475
|
-
for indx in range(len(x)):
|
|
476
|
-
for indy in range(len(y)):
|
|
477
|
-
datas[indy, indx, :, :] = amp[indy, indx] * (
|
|
478
|
-
utils.gauss2D(z, 0 + indx * 2, 20, t, 0 + 3 * indy, 30) + np.random.rand(len(t), len(z)) / 10)
|
|
479
|
-
|
|
480
|
-
nav_axis = dict(nav00=Axis(data=y, nav_index=0, label='y_axis', units='yunits'),
|
|
481
|
-
nav01=Axis(data=x, nav_index=1, label='x_axis', units='xunits'),
|
|
482
|
-
nav02=Axis(data=t, nav_index=2, label='t_axis', units='tunits'),
|
|
483
|
-
nav03=Axis(data=z, nav_index=3, label='z_axis', units='zunits'))
|
|
484
|
-
|
|
485
|
-
if data_shape == '4D':
|
|
486
|
-
nav_axes = [2, 3]
|
|
487
|
-
self.show_data(datas, temp_data=False, nav_axes=nav_axes, **nav_axis)
|
|
488
|
-
elif data_shape == '3D':
|
|
489
|
-
self.show_data(np.sum(datas, axis=3), temp_data=False, nav_axes=[0, 1], **nav_axis)
|
|
490
|
-
elif data_shape == '2D':
|
|
491
|
-
self.show_data(np.sum(datas, axis=(2, 3)), **nav_axis)
|
|
492
|
-
elif data_shape == '1D':
|
|
493
|
-
self.show_data(np.sum(datas, axis=(1, 2, 3)), **nav_axis)
|
|
494
|
-
|
|
495
|
-
def set_nav_axes(self, Ndim, nav_axes=None):
|
|
496
|
-
self.data_axes = [ind for ind in range(Ndim)]
|
|
497
|
-
if nav_axes is None:
|
|
498
|
-
if Ndim > 0:
|
|
499
|
-
nav_axes = self.data_axes[0:2]
|
|
500
|
-
else:
|
|
501
|
-
nav_axes = self.data_axes[0]
|
|
502
|
-
|
|
503
|
-
self.settings.child('data_shape_settings', 'navigator_axes').setValue(
|
|
504
|
-
dict(all_items=[ax['label'] for ax in self.nav_axes_dicts],
|
|
505
|
-
selected=[self.nav_axes_dicts[ind]['label'] for ind in nav_axes]))
|
|
506
|
-
|
|
507
|
-
def set_GUI(self):
|
|
508
|
-
"""
|
|
509
|
-
|
|
510
|
-
"""
|
|
511
|
-
# %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
512
|
-
|
|
513
|
-
# main_layout = QtWidgets.QGridLayout()
|
|
514
|
-
# self.area.setLayout(main_layout)
|
|
515
|
-
|
|
516
|
-
# vsplitter = QtWidgets.QSplitter(Qt.Vertical)
|
|
517
|
-
# Hsplitter=QtWidgets.QSplitter(Qt.Horizontal)
|
|
518
|
-
|
|
519
|
-
params = [
|
|
520
|
-
{'title': 'Set data 4D', 'name': 'set_data_4D', 'type': 'action', 'visible': False},
|
|
521
|
-
{'title': 'Set data 3D', 'name': 'set_data_3D', 'type': 'action', 'visible': False},
|
|
522
|
-
{'title': 'Set data 2D', 'name': 'set_data_2D', 'type': 'action', 'visible': False},
|
|
523
|
-
{'title': 'Set data 1D', 'name': 'set_data_1D', 'type': 'action', 'visible': False},
|
|
524
|
-
{'title': 'Signal shape', 'name': 'data_shape_settings', 'type': 'group', 'children': [
|
|
525
|
-
{'title': 'Initial Data shape:', 'name': 'data_shape_init', 'type': 'str', 'value': "",
|
|
526
|
-
'readonly': True},
|
|
527
|
-
{'title': 'Axes shape:', 'name': 'nav_axes_shapes', 'type': 'group', 'children': [],
|
|
528
|
-
'readonly': True},
|
|
529
|
-
{'title': 'Data shape:', 'name': 'data_shape', 'type': 'str', 'value': "", 'readonly': True},
|
|
530
|
-
{'title': 'Navigator axes:', 'name': 'navigator_axes', 'type': 'itemselect'},
|
|
531
|
-
{'title': 'Set Nav axes:', 'name': 'set_nav_axes', 'type': 'action', 'visible': True},
|
|
532
|
-
]},
|
|
533
|
-
]
|
|
534
|
-
|
|
535
|
-
self.settings = Parameter.create(name='Param', type='group', children=params)
|
|
536
|
-
# #self.signal_axes_selection()
|
|
537
|
-
|
|
538
|
-
# connecting from tree
|
|
539
|
-
self.settings.sigTreeStateChanged.connect(self.parameter_tree_changed) # any changes on the settings
|
|
540
|
-
self.settings.child(('set_data_1D')).sigActivated.connect(lambda: self.set_data_test('1D'))
|
|
541
|
-
self.settings.child(('set_data_2D')).sigActivated.connect(lambda: self.set_data_test('2D'))
|
|
542
|
-
self.settings.child(('set_data_3D')).sigActivated.connect(lambda: self.set_data_test('3D'))
|
|
543
|
-
self.settings.child(('set_data_4D')).sigActivated.connect(lambda: self.set_data_test('4D'))
|
|
544
|
-
self.settings.child('data_shape_settings', 'set_nav_axes').sigActivated.connect(self.update_data)
|
|
545
|
-
# #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
546
|
-
# #% 1D signalviewer
|
|
547
|
-
viewer1D_widget = QtWidgets.QWidget()
|
|
548
|
-
self.ui.viewer1D = Viewer1D(viewer1D_widget)
|
|
549
|
-
self.ROI1D = LinearRegionItem()
|
|
550
|
-
self.ui.viewer1D.viewer.plotwidget.plotItem.addItem(self.ROI1D)
|
|
551
|
-
self.ui.combomath = QtWidgets.QComboBox()
|
|
552
|
-
self.ui.combomath.addItems(['Sum', 'Mean', 'Half-life'])
|
|
553
|
-
self.ui.viewer1D.ui.button_widget.addWidget(self.ui.combomath)
|
|
554
|
-
self.ui.combomath.currentIndexChanged.connect(self.update_Navigator)
|
|
555
|
-
|
|
556
|
-
self.ROI1D.sigRegionChangeFinished.connect(self.update_Navigator)
|
|
557
|
-
|
|
558
|
-
# % 2D viewer Dock
|
|
559
|
-
viewer2D_widget = QtWidgets.QWidget()
|
|
560
|
-
self.ui.viewer2D = Viewer2D(viewer2D_widget)
|
|
561
|
-
self.ui.viewer2D.set_action_visible('flip_ud', False)
|
|
562
|
-
self.ui.viewer2D.set_action_visible('flip_lr', False)
|
|
563
|
-
self.ui.viewer2D.set_action_visible('rotate', False)
|
|
564
|
-
self.ui.viewer2D.get_action('autolevels').trigger()
|
|
565
|
-
self.ui.viewer2D.get_action('ROIselect').trigger()
|
|
566
|
-
self.ROI2D = self.ui.viewer2D.ROIselect
|
|
567
|
-
self.ui.viewer2D.ROI_select_signal.connect(self.update_Navigator)
|
|
568
|
-
|
|
569
|
-
Dock_signal = Dock('Signal')
|
|
570
|
-
Dock_signal.addWidget(viewer1D_widget)
|
|
571
|
-
Dock_signal.addWidget(viewer2D_widget)
|
|
572
|
-
|
|
573
|
-
# #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
574
|
-
# #% Navigator viewer Dock
|
|
575
|
-
navigator1D_widget = QtWidgets.QWidget()
|
|
576
|
-
self.ui.navigator1D = Viewer1D(navigator1D_widget)
|
|
577
|
-
self.ui.navigator1D.ui.crosshair.crosshair_dragged.connect(self.update_viewer_data)
|
|
578
|
-
self.ui.navigator1D.ui.crosshair_pb.click()
|
|
579
|
-
self.ui.navigator1D.data_to_export_signal.connect(self.export_data)
|
|
580
|
-
navigator2D_widget = QtWidgets.QWidget()
|
|
581
|
-
self.ui.navigator2D = Viewer2D(navigator2D_widget)
|
|
582
|
-
self.ui.navigator2D.get_action('autolevels').trigger()
|
|
583
|
-
self.ui.navigator2D.crosshair_dragged.connect(
|
|
584
|
-
self.update_viewer_data) # export scaled position in conjonction with 2D scaled axes
|
|
585
|
-
self.ui.navigator2D.get_action('crosshair').trigger()
|
|
586
|
-
self.ui.navigator2D.data_to_export_signal.connect(self.export_data)
|
|
587
|
-
|
|
588
|
-
self.ui.navigation_widget = QtWidgets.QWidget()
|
|
589
|
-
# vlayout_navigation = QtWidgets.QVBoxLayout()
|
|
590
|
-
# self.navigator_label = QtWidgets.QLabel('Navigation View')
|
|
591
|
-
# self.navigator_label.setMaximumHeight(15)
|
|
592
|
-
# layout_navigation.addWidget(self.navigator_label)
|
|
593
|
-
self.ui.nav_axes_widget = QtWidgets.QWidget()
|
|
594
|
-
self.ui.nav_axes_widget.setLayout(QtWidgets.QVBoxLayout())
|
|
595
|
-
# vlayout_navigation.addWidget(navigator2D_widget)
|
|
596
|
-
# vlayout_navigation.addWidget(self.ui.nav_axes_widget)
|
|
597
|
-
self.ui.nav_axes_widget.setVisible(False)
|
|
598
|
-
# vlayout_navigation.addWidget(navigator1D_widget)
|
|
599
|
-
# self.ui.navigation_widget.setLayout(vlayout_navigation)
|
|
600
|
-
# vsplitter.insertWidget(0, self.ui.navigation_widget)
|
|
601
|
-
|
|
602
|
-
Dock_navigation = Dock('Navigation')
|
|
603
|
-
Dock_navigation.addWidget(navigator1D_widget)
|
|
604
|
-
Dock_navigation.addWidget(navigator2D_widget)
|
|
605
|
-
|
|
606
|
-
self.area.addDock(Dock_navigation)
|
|
607
|
-
self.area.addDock(Dock_signal, 'right', Dock_navigation)
|
|
608
|
-
|
|
609
|
-
# self.ui.signal_widget = QtWidgets.QWidget()
|
|
610
|
-
# VLayout1 = QtWidgets.QVBoxLayout()
|
|
611
|
-
# self.viewer_label = QtWidgets.QLabel('Data View')
|
|
612
|
-
# self.viewer_label.setMaximumHeight(15)
|
|
613
|
-
# VLayout1.addWidget(self.viewer_label)
|
|
614
|
-
# VLayout1.addWidget(viewer1D_widget)
|
|
615
|
-
# VLayout1.addWidget(viewer2D_widget)
|
|
616
|
-
# self.ui.signal_widget.setLayout(VLayout1)
|
|
617
|
-
# vsplitter.insertWidget(1, self.ui.signal_widget)
|
|
618
|
-
|
|
619
|
-
self.ui.set_signals_pb_1D = addaction('', icon_name='cartesian', checkable=True,
|
|
620
|
-
tip='Change navigation/signal axes')
|
|
621
|
-
|
|
622
|
-
self.ui.set_signals_pb_1D_bis = addaction('', icon_name='cartesian', checkable=True,
|
|
623
|
-
tip='Change navigation/signal axes')
|
|
624
|
-
self.ui.set_signals_pb_2D = addaction('', icon_name='cartesian', checkable=True,
|
|
625
|
-
tip='Change navigation/signal axes')
|
|
626
|
-
self.ui.set_signals_pb_2D_bis = addaction('', icon_name='cartesian', checkable=True,
|
|
627
|
-
tip='Change navigation/signal axes')
|
|
628
|
-
|
|
629
|
-
self.ui.navigator1D.ui.button_widget.addAction(self.ui.set_signals_pb_1D)
|
|
630
|
-
self.ui.navigator2D.toolbar.addAction(self.ui.set_signals_pb_2D)
|
|
631
|
-
self.ui.viewer1D.ui.button_widget.addAction(self.ui.set_signals_pb_1D_bis)
|
|
632
|
-
self.ui.viewer2D.toolbar.addAction(self.ui.set_signals_pb_2D_bis)
|
|
633
|
-
|
|
634
|
-
# main_layout.addWidget(vsplitter)
|
|
635
|
-
|
|
636
|
-
self.ui.set_signals_pb_1D.clicked.connect(self.signal_axes_selection)
|
|
637
|
-
self.ui.set_signals_pb_2D.clicked.connect(self.signal_axes_selection)
|
|
638
|
-
self.ui.set_signals_pb_1D_bis.clicked.connect(self.signal_axes_selection)
|
|
639
|
-
self.ui.set_signals_pb_2D_bis.clicked.connect(self.signal_axes_selection)
|
|
640
|
-
|
|
641
|
-
# to start: display as default a 2D navigator and a 1D viewer
|
|
642
|
-
self.ui.navigator1D.parent.setVisible(False)
|
|
643
|
-
self.ui.viewer2D.parent.setVisible(True)
|
|
644
|
-
|
|
645
|
-
def setup_spread_UI(self):
|
|
646
|
-
self.ui.spread_widget = QtWidgets.QWidget()
|
|
647
|
-
self.ui.spread_widget.setLayout(QtWidgets.QVBoxLayout())
|
|
648
|
-
widget1D = QtWidgets.QWidget()
|
|
649
|
-
widget2D = QtWidgets.QWidget()
|
|
650
|
-
self.ui.spread_viewer_1D = Viewer1D(widget1D)
|
|
651
|
-
self.ui.spread_viewer_2D = Viewer2D(widget2D)
|
|
652
|
-
self.ui.spread_widget.layout().addWidget(widget1D)
|
|
653
|
-
self.ui.spread_widget.layout().addWidget(widget2D)
|
|
654
|
-
# todo: better connection as discussed
|
|
655
|
-
self.ui.spread_viewer_1D.ui.crosshair.crosshair_dragged.connect(self.get_nav_position)
|
|
656
|
-
self.ui.spread_viewer_1D.ui.crosshair_pb.click()
|
|
657
|
-
self.ui.spread_viewer_2D.get_action('autolevels').click()
|
|
658
|
-
# todo: better connection as discussed
|
|
659
|
-
self.ui.spread_viewer_2D.crosshair_dragged.connect(self.get_nav_position)
|
|
660
|
-
self.ui.spread_viewer_2D.get_action('crosshair').trigger()
|
|
661
|
-
|
|
662
|
-
self.ui.spread_widget.show()
|
|
663
|
-
self.ui.spread_widget.setVisible(False)
|
|
664
|
-
|
|
665
|
-
def show_data_temp(self, datas, nav_axes=None, distribution='uniform', **kwargs):
|
|
666
|
-
"""
|
|
667
|
-
"""
|
|
668
|
-
self.show_data(datas, temp_data=True, nav_axes=nav_axes, distribution=distribution, **kwargs)
|
|
669
|
-
|
|
670
|
-
def set_nav_shapes(self):
|
|
671
|
-
for child in self.settings.child('data_shape_settings', 'nav_axes_shapes').children():
|
|
672
|
-
child.remove()
|
|
673
|
-
|
|
674
|
-
for ind_ax, ax in enumerate(self.nav_axes_dicts):
|
|
675
|
-
self.settings.child('data_shape_settings', 'nav_axes_shapes').addChild(
|
|
676
|
-
{'title': ax['label'], 'name': f'nav_{ind_ax:02d}_shape', 'type': 'str', 'value': str(ax['data'].shape),
|
|
677
|
-
'readonly': True},
|
|
678
|
-
)
|
|
679
|
-
|
|
680
|
-
def show_data(self, datas, temp_data=False, nav_axes=None, is_spread=False, scan_type='', **kwargs):
|
|
681
|
-
"""Display datas as a hyperspaced dataset
|
|
682
|
-
only one numpy ndarray should be used
|
|
683
|
-
"""
|
|
684
|
-
self.is_spread = is_spread
|
|
685
|
-
self.ui.spread_widget.setVisible(is_spread)
|
|
686
|
-
|
|
687
|
-
self.scan_type = scan_type
|
|
688
|
-
self.data_buffer = []
|
|
689
|
-
self.data_to_export = OrderedDict(name=self.title, data0D=OrderedDict(), data1D=OrderedDict(),
|
|
690
|
-
data2D=OrderedDict(), dataND=OrderedDict(), )
|
|
691
|
-
self.data_to_export['dataND']['CH000'] = OrderedDict(data=datas, source='raw', nav_axes=nav_axes)
|
|
692
|
-
for key in kwargs:
|
|
693
|
-
self.data_to_export['dataND']['CH000'][key] = kwargs[key]
|
|
694
|
-
self._datas = datas
|
|
695
|
-
self.datas = SignalND(datas)
|
|
696
|
-
self.datas_settings = kwargs
|
|
697
|
-
self.restore_nav_axes(kwargs, nav_axes=nav_axes)
|
|
698
|
-
self.set_nav_shapes()
|
|
699
|
-
|
|
700
|
-
try:
|
|
701
|
-
if self.data_axes is not None:
|
|
702
|
-
if datas.ndim != len(self.data_axes) or self.get_selected_axes_indexes() != nav_axes:
|
|
703
|
-
self.set_nav_axes(datas.ndim, nav_axes) # init the list of axes and set the managers to nav_axes
|
|
704
|
-
else:
|
|
705
|
-
self.set_nav_axes(datas.ndim, nav_axes) # init the list of axes and set the managers to nav_axes
|
|
706
|
-
|
|
707
|
-
# self.datas=hs.signals.BaseSignal(datas)
|
|
708
|
-
|
|
709
|
-
self.update_data_signal()
|
|
710
|
-
self.settings.child('data_shape_settings', 'data_shape_init').setValue(str(datas.shape))
|
|
711
|
-
self.settings.child('data_shape_settings', 'data_shape').setValue(self.get_data_dimension())
|
|
712
|
-
self.set_data(self.datas, temp_data=temp_data, **kwargs)
|
|
713
|
-
|
|
714
|
-
except Exception as e:
|
|
715
|
-
logger.exception(str(e))
|
|
716
|
-
self.update_status(utils.getLineInfo() + str(e), self.wait_time, 'log')
|
|
717
|
-
|
|
718
|
-
def signal_axes_selection(self):
|
|
719
|
-
self.ui.settings_tree = ParameterTree()
|
|
720
|
-
self.ui.settings_tree.setMinimumWidth(300)
|
|
721
|
-
self.ui.settings_tree.setParameters(self.settings, showTop=False)
|
|
722
|
-
self.signal_axes_widget = QtWidgets.QWidget()
|
|
723
|
-
layout = QtWidgets.QVBoxLayout()
|
|
724
|
-
self.signal_axes_widget.setLayout(layout)
|
|
725
|
-
layout.addWidget(self.ui.settings_tree)
|
|
726
|
-
self.signal_axes_widget.adjustSize()
|
|
727
|
-
self.signal_axes_widget.show()
|
|
728
|
-
|
|
729
|
-
def get_selected_axes_indexes(self):
|
|
730
|
-
if self.settings.child('data_shape_settings', 'navigator_axes').value() is None:
|
|
731
|
-
return []
|
|
732
|
-
labels = self.settings.child('data_shape_settings', 'navigator_axes').value()['selected']
|
|
733
|
-
axes_nav = []
|
|
734
|
-
for lab in labels:
|
|
735
|
-
for ax in self.nav_axes_dicts:
|
|
736
|
-
if ax['label'] == lab:
|
|
737
|
-
axes_nav.append(ax['nav_index'])
|
|
738
|
-
return axes_nav
|
|
739
|
-
|
|
740
|
-
def get_selected_axes(self):
|
|
741
|
-
axes_nav = []
|
|
742
|
-
if self.settings.child('data_shape_settings', 'navigator_axes').value() is not None:
|
|
743
|
-
labels = self.settings.child('data_shape_settings', 'navigator_axes').value()['selected']
|
|
744
|
-
for lab in labels:
|
|
745
|
-
for ax in self.nav_axes_dicts:
|
|
746
|
-
if ax['label'] == lab:
|
|
747
|
-
axes_nav.append(ax)
|
|
748
|
-
break
|
|
749
|
-
return axes_nav
|
|
750
|
-
|
|
751
|
-
def update_data(self):
|
|
752
|
-
restore_nav_axes = self.get_selected_axes_indexes() != self.get_selected_axes_indexes()
|
|
753
|
-
|
|
754
|
-
self.update_data_signal()
|
|
755
|
-
self.settings.child('data_shape_settings', 'data_shape').setValue(self.get_data_dimension())
|
|
756
|
-
|
|
757
|
-
nav_axes = dict([])
|
|
758
|
-
for ind, ax in enumerate(self.nav_axes_dicts):
|
|
759
|
-
nav_axes[f'nav_{ind}'] = ax
|
|
760
|
-
|
|
761
|
-
self.set_data(self.datas, restore_nav_axes=restore_nav_axes, **nav_axes)
|
|
762
|
-
|
|
763
|
-
def update_data_signal(self):
|
|
764
|
-
try:
|
|
765
|
-
axes_nav = [len(self.data_axes) - ind - 1 for ind in self.get_selected_axes_indexes()]
|
|
766
|
-
axes_signal = [ax for ax in self.data_axes if ax not in axes_nav]
|
|
767
|
-
self.datas = SignalND(self._datas)
|
|
768
|
-
self.datas = self.datas.transpose(signal_axes=axes_signal, navigation_axes=axes_nav)
|
|
769
|
-
|
|
770
|
-
except Exception as e:
|
|
771
|
-
logger.exception(str(e))
|
|
772
|
-
self.update_status(utils.getLineInfo() + str(e), self.wait_time, 'log')
|
|
773
|
-
|
|
774
|
-
def update_Navigator(self):
|
|
775
|
-
# #self.update_data_signal()
|
|
776
|
-
self.set_data(self.datas, **self.datas_settings)
|
|
777
|
-
|
|
778
|
-
def update_status(self, txt, wait_time=1000, log=''):
|
|
779
|
-
"""
|
|
780
|
-
| Update the statut bar showing a Message with a delay of wait_time ms (1s by default)
|
|
781
|
-
|
|
782
|
-
================ ======== ===========================
|
|
783
|
-
**Parameters** **Type** **Description**
|
|
784
|
-
|
|
785
|
-
*txt* string the text message to show
|
|
786
|
-
|
|
787
|
-
*wait_time* int the delay time of showing
|
|
788
|
-
================ ======== ===========================
|
|
789
|
-
|
|
790
|
-
"""
|
|
791
|
-
if log != '':
|
|
792
|
-
self.log_signal.emit(txt)
|
|
793
|
-
|
|
794
|
-
def get_axis_from_label(self):
|
|
795
|
-
pass
|
|
796
|
-
|
|
797
|
-
def get_nav_position(self, posx=0, posy=None):
|
|
798
|
-
"""
|
|
799
|
-
crosshair position from the "spread" data viewer. Should return scan index where the scan was closest to posx,
|
|
800
|
-
posy coordinates
|
|
801
|
-
Parameters
|
|
802
|
-
----------
|
|
803
|
-
posx
|
|
804
|
-
posy
|
|
805
|
-
|
|
806
|
-
See Also
|
|
807
|
-
--------
|
|
808
|
-
update_viewer_data
|
|
809
|
-
"""
|
|
810
|
-
nav_axes = self.get_selected_axes()
|
|
811
|
-
if len(nav_axes) != 0:
|
|
812
|
-
if 'datas' in nav_axes[0]:
|
|
813
|
-
datas = nav_axes[0]['datas']
|
|
814
|
-
xaxis = datas[0]
|
|
815
|
-
if len(datas) > 1:
|
|
816
|
-
yaxis = datas[1]
|
|
817
|
-
ind_scan = utils.find_common_index(xaxis, yaxis, posx, posy)
|
|
818
|
-
else:
|
|
819
|
-
ind_scan = utils.find_index(xaxis, posx)[0]
|
|
820
|
-
|
|
821
|
-
self.ui.navigator1D.ui.crosshair.set_crosshair_position(ind_scan[0])
|
|
822
|
-
|
|
823
|
-
def update_viewer_data(self, posx=0, posy=0):
|
|
824
|
-
"""
|
|
825
|
-
|qtpy slot triggered by the crosshair signal from the 1D or 2D Navigator
|
|
826
|
-
| Update the viewer informations from an x/y given position and store data.
|
|
827
|
-
Parameters
|
|
828
|
-
----------
|
|
829
|
-
posx: (float) from the 1D or 2D Navigator crosshair or from one of the navigation axis viewer (in that case
|
|
830
|
-
nav_axis tells from wich navigation axis the position comes from)
|
|
831
|
-
posy: (float) from the 2D Navigator crosshair
|
|
832
|
-
nav_axis: (int) index of the navigation axis from where posx comes from
|
|
833
|
-
|
|
834
|
-
"""
|
|
835
|
-
if self.datas is not None:
|
|
836
|
-
try:
|
|
837
|
-
nav_axes = self.get_selected_axes()
|
|
838
|
-
# datas_transposed=self.update_data_signal(self.datas)
|
|
839
|
-
if len(nav_axes) == 0:
|
|
840
|
-
data = self.datas.data
|
|
841
|
-
|
|
842
|
-
elif len(nav_axes) == 1:
|
|
843
|
-
if posx < nav_axes[0]['data'][0] or posx > nav_axes[0]['data'][-1]:
|
|
844
|
-
return
|
|
845
|
-
ind_x = utils.find_index(nav_axes[0]['data'], posx)[0][0]
|
|
846
|
-
data = self.datas.inav[ind_x].data
|
|
847
|
-
elif len(nav_axes) == 2:
|
|
848
|
-
if posx < nav_axes[0]['data'][0] or posx > nav_axes[0]['data'][-1]:
|
|
849
|
-
return
|
|
850
|
-
if posy < nav_axes[1]['data'][0] or posy > nav_axes[1]['data'][-1]:
|
|
851
|
-
return
|
|
852
|
-
ind_x = utils.find_index(nav_axes[0]['data'], posx)[0][0]
|
|
853
|
-
ind_y = utils.find_index(nav_axes[1]['data'], posy)[0][0]
|
|
854
|
-
data = self.datas.inav[ind_x, ind_y].data
|
|
855
|
-
|
|
856
|
-
else:
|
|
857
|
-
pos = []
|
|
858
|
-
for ind_view, view in enumerate(self.nav_axes_viewers):
|
|
859
|
-
p = view.roi_line.getPos()[0]
|
|
860
|
-
if p < 0 or p > len(nav_axes[ind_view]['data']):
|
|
861
|
-
return
|
|
862
|
-
ind = int(np.rint(p))
|
|
863
|
-
pos.append(ind)
|
|
864
|
-
data = self.datas.inav.__getitem__(pos).data
|
|
865
|
-
|
|
866
|
-
if len(self.datas.axes_manager.signal_shape) == 0: # means 0D data, plot on 1D viewer
|
|
867
|
-
self.data_buffer.extend(data)
|
|
868
|
-
self.ui.viewer1D.show_data([self.data_buffer])
|
|
869
|
-
|
|
870
|
-
elif len(self.datas.axes_manager.signal_shape) == 1: # means 1D data, plot on 1D viewer
|
|
871
|
-
self.ui.viewer1D.remove_plots()
|
|
872
|
-
self.ui.viewer1D.x_axis = self.x_axis
|
|
873
|
-
self.ui.viewer1D.show_data([data])
|
|
874
|
-
|
|
875
|
-
elif len(self.datas.axes_manager.signal_shape) == 2: # means 2D data, plot on 2D viewer
|
|
876
|
-
self.ui.viewer2D.x_axis = self.x_axis
|
|
877
|
-
self.ui.viewer2D.y_axis = self.y_axis
|
|
878
|
-
self.ui.viewer2D.setImage(data)
|
|
879
|
-
except Exception as e:
|
|
880
|
-
logger.exception(str(e))
|
|
881
|
-
self.update_status(utils.getLineInfo() + str(e), wait_time=self.wait_time, log='log')
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
if __name__ == '__main__':
|
|
885
|
-
app = QtWidgets.QApplication(sys.argv)
|
|
886
|
-
area = DockArea()
|
|
887
|
-
prog = ViewerND(area)
|
|
888
|
-
prog.settings.child(('set_data_4D')).show(True)
|
|
889
|
-
prog.settings.child(('set_data_3D')).show(True)
|
|
890
|
-
prog.settings.child(('set_data_2D')).show(True)
|
|
891
|
-
prog.settings.child(('set_data_1D')).show(True)
|
|
892
|
-
prog.signal_axes_selection()
|
|
893
|
-
area.show()
|
|
894
|
-
sys.exit(app.exec_())
|