pymodaq 3.6.12__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.

Files changed (233) hide show
  1. pymodaq/__init__.py +13 -6
  2. pymodaq/control_modules/__init__.py +0 -7
  3. pymodaq/control_modules/daq_move.py +965 -2
  4. pymodaq/control_modules/daq_move_ui.py +319 -0
  5. pymodaq/control_modules/daq_viewer.py +1573 -3
  6. pymodaq/control_modules/daq_viewer_ui.py +393 -0
  7. pymodaq/control_modules/mocks.py +51 -0
  8. pymodaq/control_modules/move_utility_classes.py +709 -8
  9. pymodaq/control_modules/utils.py +256 -0
  10. pymodaq/control_modules/viewer_utility_classes.py +663 -6
  11. pymodaq/daq_utils.py +89 -0
  12. pymodaq/dashboard.py +91 -72
  13. pymodaq/examples/custom_app.py +12 -11
  14. pymodaq/examples/custom_viewer.py +10 -10
  15. pymodaq/examples/function_plotter.py +16 -13
  16. pymodaq/examples/nonlinearscanner.py +8 -6
  17. pymodaq/examples/parameter_ex.py +7 -7
  18. pymodaq/examples/preset_MockCamera.xml +1 -0
  19. pymodaq/extensions/__init__.py +16 -0
  20. pymodaq/extensions/console.py +76 -0
  21. pymodaq/{daq_logger.py → extensions/daq_logger.py} +115 -65
  22. pymodaq/extensions/daq_scan.py +1339 -0
  23. pymodaq/extensions/daq_scan_ui.py +240 -0
  24. pymodaq/extensions/h5browser.py +23 -0
  25. pymodaq/{pid → extensions/pid}/__init__.py +4 -2
  26. pymodaq/{pid → extensions/pid}/daq_move_PID.py +2 -2
  27. pymodaq/{pid → extensions/pid}/pid_controller.py +48 -36
  28. pymodaq/{pid → extensions/pid}/utils.py +52 -6
  29. pymodaq/extensions/utils.py +40 -0
  30. pymodaq/post_treatment/__init__.py +6 -0
  31. pymodaq/{daq_analysis → post_treatment/daq_analysis}/daq_analysis_main.py +17 -17
  32. pymodaq/{daq_measurement → post_treatment/daq_measurement}/daq_measurement_main.py +8 -14
  33. pymodaq/post_treatment/load_and_plot.py +219 -0
  34. pymodaq/post_treatment/process_to_scalar.py +263 -0
  35. pymodaq/resources/QtDesigner_Ressources/Icon_Library/run_all.png +0 -0
  36. pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop_all.png +0 -0
  37. pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.bat +1 -1
  38. pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.qrc +1 -0
  39. pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources_rc.py +109784 -109173
  40. pymodaq/resources/QtDesigner_Ressources/icons.svg +142 -0
  41. pymodaq/resources/VERSION +1 -1
  42. pymodaq/resources/config_template.toml +32 -13
  43. pymodaq/resources/preset_default.xml +1 -1
  44. pymodaq/{daq_utils → utils}/Tuto innosetup/script_full_setup.iss +1 -1
  45. pymodaq/utils/__init__.py +0 -29
  46. pymodaq/utils/abstract/__init__.py +48 -0
  47. pymodaq/{daq_utils → utils}/abstract/logger.py +7 -3
  48. pymodaq/utils/array_manipulation.py +379 -8
  49. pymodaq/{daq_utils → utils}/calibration_camera.py +6 -6
  50. pymodaq/{daq_utils → utils}/chrono_timer.py +1 -1
  51. pymodaq/utils/config.py +448 -0
  52. pymodaq/utils/conftests.py +5 -0
  53. pymodaq/utils/daq_utils.py +828 -8
  54. pymodaq/utils/data.py +1873 -7
  55. pymodaq/{daq_utils → utils}/db/db_logger/db_logger.py +86 -47
  56. pymodaq/{daq_utils → utils}/db/db_logger/db_logger_models.py +31 -10
  57. pymodaq/{daq_utils → utils}/enums.py +12 -7
  58. pymodaq/utils/exceptions.py +37 -0
  59. pymodaq/utils/factory.py +82 -0
  60. pymodaq/{daq_utils → utils}/gui_utils/__init__.py +1 -1
  61. pymodaq/utils/gui_utils/custom_app.py +129 -0
  62. pymodaq/utils/gui_utils/file_io.py +66 -0
  63. pymodaq/{daq_utils → utils}/gui_utils/layout.py +2 -2
  64. pymodaq/{daq_utils → utils}/gui_utils/utils.py +13 -3
  65. pymodaq/{daq_utils → utils}/gui_utils/widgets/__init__.py +2 -2
  66. pymodaq/utils/gui_utils/widgets/label.py +24 -0
  67. pymodaq/{daq_utils → utils}/gui_utils/widgets/lcd.py +12 -7
  68. pymodaq/{daq_utils → utils}/gui_utils/widgets/push.py +66 -2
  69. pymodaq/{daq_utils → utils}/gui_utils/widgets/qled.py +6 -4
  70. pymodaq/utils/gui_utils/widgets/spinbox.py +24 -0
  71. pymodaq/{daq_utils → utils}/gui_utils/widgets/table.py +2 -2
  72. pymodaq/utils/h5modules/__init__.py +1 -0
  73. pymodaq/{daq_utils/h5backend.py → utils/h5modules/backends.py} +200 -112
  74. pymodaq/utils/h5modules/browsing.py +683 -0
  75. pymodaq/utils/h5modules/data_saving.py +839 -0
  76. pymodaq/utils/h5modules/h5logging.py +110 -0
  77. pymodaq/utils/h5modules/module_saving.py +350 -0
  78. pymodaq/utils/h5modules/saving.py +914 -0
  79. pymodaq/utils/h5modules/utils.py +85 -0
  80. pymodaq/utils/logger.py +64 -6
  81. pymodaq/utils/managers/action_manager.py +460 -0
  82. pymodaq/{daq_utils → utils}/managers/batchscan_manager.py +144 -112
  83. pymodaq/{daq_utils → utils}/managers/modules_manager.py +188 -114
  84. pymodaq/{daq_utils → utils}/managers/overshoot_manager.py +3 -3
  85. pymodaq/utils/managers/parameter_manager.py +110 -0
  86. pymodaq/{daq_utils → utils}/managers/preset_manager.py +17 -13
  87. pymodaq/{daq_utils → utils}/managers/preset_manager_utils.py +8 -7
  88. pymodaq/{daq_utils → utils}/managers/remote_manager.py +7 -6
  89. pymodaq/{daq_utils → utils}/managers/roi_manager.py +148 -57
  90. pymodaq/utils/math_utils.py +546 -10
  91. pymodaq/{daq_utils → utils}/messenger.py +5 -1
  92. pymodaq/utils/parameter/__init__.py +2 -15
  93. pymodaq/{daq_utils → utils}/parameter/ioxml.py +12 -6
  94. pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/__init__.py +1 -3
  95. pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/filedir.py +1 -1
  96. pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/itemselect.py +3 -0
  97. pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/led.py +1 -1
  98. pymodaq/utils/parameter/pymodaq_ptypes/pixmap.py +161 -0
  99. pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/slide.py +1 -1
  100. pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/table.py +1 -1
  101. pymodaq/utils/parameter/utils.py +206 -11
  102. pymodaq/utils/plotting/data_viewers/__init__.py +6 -0
  103. pymodaq/utils/plotting/data_viewers/viewer.py +393 -0
  104. pymodaq/utils/plotting/data_viewers/viewer0D.py +251 -0
  105. pymodaq/utils/plotting/data_viewers/viewer1D.py +574 -0
  106. pymodaq/{daq_utils → utils}/plotting/data_viewers/viewer1Dbasic.py +8 -3
  107. pymodaq/{daq_utils → utils}/plotting/data_viewers/viewer2D.py +292 -357
  108. pymodaq/{daq_utils → utils}/plotting/data_viewers/viewer2D_basic.py +58 -75
  109. pymodaq/utils/plotting/data_viewers/viewerND.py +738 -0
  110. pymodaq/{daq_utils → utils}/plotting/gant_chart.py +2 -2
  111. pymodaq/{daq_utils → utils}/plotting/items/axis_scaled.py +4 -2
  112. pymodaq/{daq_utils → utils}/plotting/items/image.py +8 -6
  113. pymodaq/utils/plotting/navigator.py +355 -0
  114. pymodaq/utils/plotting/scan_selector.py +480 -0
  115. pymodaq/utils/plotting/utils/axes_viewer.py +88 -0
  116. pymodaq/utils/plotting/utils/filter.py +538 -0
  117. pymodaq/utils/plotting/utils/lineout.py +224 -0
  118. pymodaq/{daq_utils → utils}/plotting/utils/plot_utils.py +196 -84
  119. pymodaq/{daq_utils → utils}/plotting/utils/signalND.py +21 -13
  120. pymodaq/utils/plotting/widgets.py +76 -0
  121. pymodaq/utils/scanner/__init__.py +10 -0
  122. pymodaq/utils/scanner/scan_factory.py +204 -0
  123. pymodaq/utils/scanner/scanner.py +271 -0
  124. pymodaq/utils/scanner/scanners/_1d_scanners.py +117 -0
  125. pymodaq/utils/scanner/scanners/_2d_scanners.py +293 -0
  126. pymodaq/utils/scanner/scanners/sequential.py +192 -0
  127. pymodaq/utils/scanner/scanners/tabular.py +294 -0
  128. pymodaq/utils/scanner/utils.py +83 -0
  129. pymodaq/utils/slicing.py +47 -0
  130. pymodaq/utils/svg/__init__.py +6 -0
  131. pymodaq/utils/svg/svg_renderer.py +20 -0
  132. pymodaq/utils/svg/svg_view.py +35 -0
  133. pymodaq/utils/svg/svg_viewer2D.py +51 -0
  134. pymodaq/{daq_utils → utils}/tcp_server_client.py +36 -37
  135. pymodaq/{daq_utils → utils}/tree_layout/tree_layout_main.py +50 -35
  136. pymodaq/utils/units.py +216 -0
  137. pymodaq-4.0.1.dist-info/METADATA +159 -0
  138. {pymodaq-3.6.12.dist-info → pymodaq-4.0.1.dist-info}/RECORD +167 -170
  139. {pymodaq-3.6.12.dist-info → pymodaq-4.0.1.dist-info}/WHEEL +1 -2
  140. pymodaq-4.0.1.dist-info/entry_points.txt +8 -0
  141. pymodaq/daq_move/daq_move_gui.py +0 -279
  142. pymodaq/daq_move/daq_move_gui.ui +0 -534
  143. pymodaq/daq_move/daq_move_main.py +0 -1042
  144. pymodaq/daq_move/process_from_QtDesigner_DAQ_Move_GUI.bat +0 -2
  145. pymodaq/daq_move/utility_classes.py +0 -671
  146. pymodaq/daq_scan.py +0 -2160
  147. pymodaq/daq_utils/array_manipulation.py +0 -386
  148. pymodaq/daq_utils/config.py +0 -273
  149. pymodaq/daq_utils/conftests.py +0 -7
  150. pymodaq/daq_utils/custom_parameter_tree.py +0 -9
  151. pymodaq/daq_utils/daq_enums.py +0 -133
  152. pymodaq/daq_utils/daq_utils.py +0 -1402
  153. pymodaq/daq_utils/exceptions.py +0 -71
  154. pymodaq/daq_utils/gui_utils/custom_app.py +0 -103
  155. pymodaq/daq_utils/gui_utils/file_io.py +0 -75
  156. pymodaq/daq_utils/gui_utils/widgets/spinbox.py +0 -9
  157. pymodaq/daq_utils/h5exporter_hyperspy.py +0 -115
  158. pymodaq/daq_utils/h5exporters.py +0 -242
  159. pymodaq/daq_utils/h5modules.py +0 -1559
  160. pymodaq/daq_utils/h5utils.py +0 -241
  161. pymodaq/daq_utils/managers/action_manager.py +0 -236
  162. pymodaq/daq_utils/managers/parameter_manager.py +0 -57
  163. pymodaq/daq_utils/math_utils.py +0 -705
  164. pymodaq/daq_utils/parameter/__init__.py +0 -1
  165. pymodaq/daq_utils/parameter/oldpymodaq_ptypes.py +0 -1626
  166. pymodaq/daq_utils/parameter/pymodaq_ptypes/pixmap.py +0 -85
  167. pymodaq/daq_utils/parameter/utils.py +0 -136
  168. pymodaq/daq_utils/plotting/data_viewers/__init__.py +0 -0
  169. pymodaq/daq_utils/plotting/data_viewers/process_from_QtDesigner_0DViewer_GUI.bat +0 -2
  170. pymodaq/daq_utils/plotting/data_viewers/viewer0D.py +0 -204
  171. pymodaq/daq_utils/plotting/data_viewers/viewer0D_GUI.py +0 -89
  172. pymodaq/daq_utils/plotting/data_viewers/viewer0D_GUI.ui +0 -131
  173. pymodaq/daq_utils/plotting/data_viewers/viewer1D.py +0 -781
  174. pymodaq/daq_utils/plotting/data_viewers/viewerND.py +0 -894
  175. pymodaq/daq_utils/plotting/data_viewers/viewerbase.py +0 -64
  176. pymodaq/daq_utils/plotting/items/__init__.py +0 -0
  177. pymodaq/daq_utils/plotting/navigator.py +0 -500
  178. pymodaq/daq_utils/plotting/scan_selector.py +0 -289
  179. pymodaq/daq_utils/plotting/utils/__init__.py +0 -0
  180. pymodaq/daq_utils/plotting/utils/filter.py +0 -236
  181. pymodaq/daq_utils/plotting/viewer0D/__init__.py +0 -0
  182. pymodaq/daq_utils/plotting/viewer0D/viewer0D_main.py +0 -4
  183. pymodaq/daq_utils/plotting/viewer1D/__init__.py +0 -0
  184. pymodaq/daq_utils/plotting/viewer1D/viewer1D_main.py +0 -4
  185. pymodaq/daq_utils/plotting/viewer1D/viewer1Dbasic.py +0 -4
  186. pymodaq/daq_utils/plotting/viewer2D/viewer_2D_basic.py +0 -4
  187. pymodaq/daq_utils/plotting/viewer2D/viewer_2D_main.py +0 -4
  188. pymodaq/daq_utils/plotting/viewerND/__init__.py +0 -0
  189. pymodaq/daq_utils/plotting/viewerND/viewerND_main.py +0 -4
  190. pymodaq/daq_utils/scanner.py +0 -1289
  191. pymodaq/daq_utils/tree_layout/__init__.py +0 -0
  192. pymodaq/daq_viewer/__init__.py +0 -0
  193. pymodaq/daq_viewer/daq_gui_settings.py +0 -237
  194. pymodaq/daq_viewer/daq_gui_settings.ui +0 -441
  195. pymodaq/daq_viewer/daq_viewer_main.py +0 -2225
  196. pymodaq/daq_viewer/process_from_QtDesigner_DAQ_GUI_settings.bat +0 -2
  197. pymodaq/daq_viewer/utility_classes.py +0 -673
  198. pymodaq/examples/logger_image/__init__.py +0 -0
  199. pymodaq/examples/logger_image/logger_displayer.py +0 -121
  200. pymodaq/examples/logger_image/setup.svg +0 -3119
  201. pymodaq/examples/logger_image/setup_svg.py +0 -114
  202. pymodaq/h5browser.py +0 -39
  203. pymodaq/utils/scanner.py +0 -15
  204. pymodaq-3.6.12.dist-info/METADATA +0 -39
  205. pymodaq-3.6.12.dist-info/entry_points.txt +0 -8
  206. pymodaq-3.6.12.dist-info/top_level.txt +0 -1
  207. /pymodaq/{daq_analysis → post_treatment/daq_analysis}/__init__.py +0 -0
  208. /pymodaq/{daq_measurement → post_treatment/daq_measurement}/__init__.py +0 -0
  209. /pymodaq/{daq_measurement → post_treatment/daq_measurement}/daq_measurement_GUI.py +0 -0
  210. /pymodaq/{daq_measurement → post_treatment/daq_measurement}/daq_measurement_GUI.ui +0 -0
  211. /pymodaq/{daq_measurement → post_treatment/daq_measurement}/process_from_QtDesigner_DAQ_Measurement_GUI.bat +0 -0
  212. /pymodaq/{daq_utils → utils}/Tuto innosetup/Tuto innosetup.odt +0 -0
  213. /pymodaq/{daq_utils → utils}/Tuto innosetup/Tuto innosetup.pdf +0 -0
  214. /pymodaq/{daq_move → utils/db}/__init__.py +0 -0
  215. /pymodaq/{daq_utils → utils/db/db_logger}/__init__.py +0 -0
  216. /pymodaq/{daq_utils → utils}/gui_utils/dock.py +0 -0
  217. /pymodaq/{daq_utils → utils}/gui_utils/list_picker.py +0 -0
  218. /pymodaq/{daq_utils/abstract → utils/managers}/__init__.py +0 -0
  219. /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/bool.py +0 -0
  220. /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/date.py +0 -0
  221. /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/list.py +0 -0
  222. /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/numeric.py +0 -0
  223. /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/tableview.py +0 -0
  224. /pymodaq/{daq_utils → utils}/parameter/pymodaq_ptypes/text.py +0 -0
  225. /pymodaq/{daq_utils/db → utils/plotting}/__init__.py +0 -0
  226. /pymodaq/{daq_utils → utils}/plotting/image_viewer.py +0 -0
  227. /pymodaq/{daq_utils/db/db_logger → utils/plotting/items}/__init__.py +0 -0
  228. /pymodaq/{daq_utils → utils}/plotting/items/crosshair.py +0 -0
  229. /pymodaq/{daq_utils/managers → utils/plotting/utils}/__init__.py +0 -0
  230. /pymodaq/{daq_utils → utils}/qvariant.py +0 -0
  231. /pymodaq/{daq_utils/plotting/viewer2D → utils/scanner/scanners}/__init__.py +0 -0
  232. /pymodaq/{daq_utils/plotting → utils/tree_layout}/__init__.py +0 -0
  233. {pymodaq-3.6.12.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_())