pymodaq 4.4.7__py3-none-any.whl → 5.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 (415) hide show
  1. pymodaq/__init__.py +57 -91
  2. pymodaq/control_modules/daq_move.py +64 -46
  3. pymodaq/control_modules/daq_move_ui.py +34 -12
  4. pymodaq/control_modules/daq_viewer.py +55 -30
  5. pymodaq/control_modules/daq_viewer_ui.py +6 -6
  6. pymodaq/control_modules/mocks.py +1 -1
  7. pymodaq/control_modules/move_utility_classes.py +51 -43
  8. pymodaq/control_modules/utils.py +43 -20
  9. pymodaq/control_modules/viewer_utility_classes.py +54 -18
  10. pymodaq/daq_utils/daq_utils.py +6 -0
  11. pymodaq/dashboard.py +639 -323
  12. pymodaq/examples/function_plotter.py +13 -12
  13. pymodaq/examples/tcp_client.py +1 -1
  14. pymodaq/extensions/__init__.py +1 -1
  15. pymodaq/extensions/bayesian/bayesian_optimisation.py +44 -32
  16. pymodaq/extensions/bayesian/utils.py +10 -10
  17. pymodaq/extensions/console.py +7 -6
  18. pymodaq/extensions/daq_logger/__init__.py +1 -0
  19. pymodaq/extensions/{daq_logger.py → daq_logger/daq_logger.py} +30 -30
  20. pymodaq/{utils/db/db_logger → extensions/daq_logger/db}/db_logger.py +16 -15
  21. pymodaq/{utils/db/db_logger → extensions/daq_logger/db}/db_logger_models.py +2 -0
  22. pymodaq/{utils/h5modules → extensions/daq_logger}/h5logging.py +7 -8
  23. pymodaq/extensions/daq_scan.py +42 -34
  24. pymodaq/extensions/daq_scan_ui.py +18 -18
  25. pymodaq/extensions/h5browser.py +2 -3
  26. pymodaq/extensions/pid/__init__.py +4 -2
  27. pymodaq/extensions/pid/daq_move_PID.py +3 -3
  28. pymodaq/extensions/pid/pid_controller.py +59 -50
  29. pymodaq/extensions/pid/utils.py +10 -5
  30. pymodaq/extensions/utils.py +33 -3
  31. pymodaq/post_treatment/load_and_plot.py +10 -7
  32. pymodaq/resources/preset_default.xml +1 -1
  33. pymodaq/updater.py +107 -0
  34. pymodaq/utils/array_manipulation.py +4 -384
  35. pymodaq/utils/calibration_camera.py +12 -9
  36. pymodaq/utils/chrono_timer.py +11 -10
  37. pymodaq/utils/config.py +3 -458
  38. pymodaq/utils/daq_utils.py +9 -715
  39. pymodaq/utils/data.py +17 -2959
  40. pymodaq/utils/enums.py +4 -74
  41. pymodaq/utils/exceptions.py +0 -4
  42. pymodaq/utils/gui_utils/__init__.py +8 -8
  43. pymodaq/utils/gui_utils/loader_utils.py +26 -1
  44. pymodaq/utils/gui_utils/utils.py +8 -162
  45. pymodaq/utils/gui_utils/widgets/lcd.py +6 -109
  46. pymodaq/utils/h5modules/__init__.py +0 -4
  47. pymodaq/utils/h5modules/module_saving.py +9 -8
  48. pymodaq/utils/leco/__init__.py +2 -2
  49. pymodaq/utils/leco/daq_move_LECODirector.py +3 -6
  50. pymodaq/utils/leco/daq_xDviewer_LECODirector.py +5 -5
  51. pymodaq/utils/leco/director_utils.py +2 -2
  52. pymodaq/utils/leco/leco_director.py +3 -3
  53. pymodaq/utils/leco/pymodaq_listener.py +4 -3
  54. pymodaq/utils/leco/utils.py +11 -9
  55. pymodaq/utils/logger.py +4 -76
  56. pymodaq/utils/managers/batchscan_manager.py +16 -19
  57. pymodaq/utils/managers/modules_manager.py +30 -17
  58. pymodaq/utils/managers/overshoot_manager.py +48 -6
  59. pymodaq/utils/managers/preset_manager.py +39 -59
  60. pymodaq/utils/managers/preset_manager_utils.py +28 -22
  61. pymodaq/utils/managers/remote_manager.py +12 -10
  62. pymodaq/utils/math_utils.py +4 -582
  63. pymodaq/utils/messenger.py +4 -64
  64. pymodaq/utils/parameter/__init__.py +6 -9
  65. pymodaq/utils/parameter/utils.py +4 -328
  66. pymodaq/utils/scanner/scan_config.py +1 -1
  67. pymodaq/utils/scanner/scan_factory.py +16 -12
  68. pymodaq/utils/{plotting → scanner}/scan_selector.py +19 -20
  69. pymodaq/utils/scanner/scanner.py +10 -8
  70. pymodaq/utils/scanner/scanners/_1d_scanners.py +8 -5
  71. pymodaq/utils/scanner/scanners/_2d_scanners.py +5 -5
  72. pymodaq/utils/scanner/scanners/sequential.py +8 -8
  73. pymodaq/utils/scanner/scanners/tabular.py +9 -9
  74. pymodaq/utils/scanner/utils.py +6 -4
  75. pymodaq/utils/svg/svg_viewer2D.py +3 -4
  76. pymodaq/utils/tcp_ip/mysocket.py +4 -110
  77. pymodaq/utils/tcp_ip/serializer.py +4 -801
  78. pymodaq/utils/tcp_ip/tcp_server_client.py +15 -13
  79. pymodaq-5.0.1.dist-info/METADATA +242 -0
  80. pymodaq-5.0.1.dist-info/RECORD +122 -0
  81. {pymodaq-4.4.7.dist-info → pymodaq-5.0.1.dist-info}/WHEEL +1 -1
  82. {pymodaq-4.4.7.dist-info → pymodaq-5.0.1.dist-info}/entry_points.txt +1 -0
  83. pymodaq/examples/custom_app.py +0 -258
  84. pymodaq/examples/custom_viewer.py +0 -112
  85. pymodaq/examples/parameter_ex.py +0 -138
  86. pymodaq/examples/preset_MockCamera.xml +0 -1
  87. pymodaq/post_treatment/daq_measurement/daq_measurement_GUI.py +0 -142
  88. pymodaq/post_treatment/daq_measurement/daq_measurement_GUI.ui +0 -232
  89. pymodaq/post_treatment/daq_measurement/daq_measurement_main.py +0 -391
  90. pymodaq/post_treatment/daq_measurement/process_from_QtDesigner_DAQ_Measurement_GUI.bat +0 -2
  91. pymodaq/post_treatment/process_to_scalar.py +0 -263
  92. pymodaq/resources/QtDesigner_Ressources/Icon_Library/1d.png +0 -0
  93. pymodaq/resources/QtDesigner_Ressources/Icon_Library/2d.png +0 -0
  94. pymodaq/resources/QtDesigner_Ressources/Icon_Library/3d.png +0 -0
  95. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Add2.png +0 -0
  96. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Add_Step.png +0 -0
  97. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Approve.png +0 -0
  98. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Approve_All.png +0 -0
  99. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Browse_Dir_Path.png +0 -0
  100. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Calculator.png +0 -0
  101. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnGroup.png +0 -0
  102. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnNum.png +0 -0
  103. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnText.png +0 -0
  104. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnTime.png +0 -0
  105. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnWave.png +0 -0
  106. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Close3.png +0 -0
  107. pymodaq/resources/QtDesigner_Ressources/Icon_Library/CollapseAll.png +0 -0
  108. pymodaq/resources/QtDesigner_Ressources/Icon_Library/CollapseAll_32.png +0 -0
  109. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ColorPicker.png +0 -0
  110. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Contract.png +0 -0
  111. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Create.png +0 -0
  112. pymodaq/resources/QtDesigner_Ressources/Icon_Library/DeleteLayer.png +0 -0
  113. pymodaq/resources/QtDesigner_Ressources/Icon_Library/EditOpen.png +0 -0
  114. pymodaq/resources/QtDesigner_Ressources/Icon_Library/EditRedo.png +0 -0
  115. pymodaq/resources/QtDesigner_Ressources/Icon_Library/EditUndo.png +0 -0
  116. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Ellipse.png +0 -0
  117. pymodaq/resources/QtDesigner_Ressources/Icon_Library/EllipseFilled.png +0 -0
  118. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Error.png +0 -0
  119. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ErrorMessage.png +0 -0
  120. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Error_16.png +0 -0
  121. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Exit.png +0 -0
  122. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Expand.png +0 -0
  123. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ExpandAll.png +0 -0
  124. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ExpandAll_32.png +0 -0
  125. pymodaq/resources/QtDesigner_Ressources/Icon_Library/FFT.png +0 -0
  126. pymodaq/resources/QtDesigner_Ressources/Icon_Library/HLM.ico +0 -0
  127. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Help.png +0 -0
  128. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Help_32.png +0 -0
  129. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Histogram.png +0 -0
  130. pymodaq/resources/QtDesigner_Ressources/Icon_Library/LUT_LookUpTable.png +0 -0
  131. pymodaq/resources/QtDesigner_Ressources/Icon_Library/MagnifyingGlass.png +0 -0
  132. pymodaq/resources/QtDesigner_Ressources/Icon_Library/MagnifyingGlass_24.png +0 -0
  133. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Marker.png +0 -0
  134. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Math.png +0 -0
  135. pymodaq/resources/QtDesigner_Ressources/Icon_Library/MeasurementStudio_32.png +0 -0
  136. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Move.png +0 -0
  137. pymodaq/resources/QtDesigner_Ressources/Icon_Library/MoveDown.png +0 -0
  138. pymodaq/resources/QtDesigner_Ressources/Icon_Library/MoveUp.png +0 -0
  139. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Multiply.png +0 -0
  140. pymodaq/resources/QtDesigner_Ressources/Icon_Library/NewFile.png +0 -0
  141. pymodaq/resources/QtDesigner_Ressources/Icon_Library/NewLayer.png +0 -0
  142. pymodaq/resources/QtDesigner_Ressources/Icon_Library/New_File.png +0 -0
  143. pymodaq/resources/QtDesigner_Ressources/Icon_Library/New_Folder.png +0 -0
  144. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open.png +0 -0
  145. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_1D.png +0 -0
  146. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_2D.png +0 -0
  147. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_File.png +0 -0
  148. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_File_32.png +0 -0
  149. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_sim.png +0 -0
  150. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Options.png +0 -0
  151. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Oscilloscope.png +0 -0
  152. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Oscilloscope_16.png +0 -0
  153. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Pass.png +0 -0
  154. pymodaq/resources/QtDesigner_Ressources/Icon_Library/RGB.png +0 -0
  155. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Rectangle.png +0 -0
  156. pymodaq/resources/QtDesigner_Ressources/Icon_Library/RectangleFilled.png +0 -0
  157. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Redo.png +0 -0
  158. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Refresh.png +0 -0
  159. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Refresh2.png +0 -0
  160. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Refresh_32.png +0 -0
  161. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Region.png +0 -0
  162. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Rendezvous.png +0 -0
  163. pymodaq/resources/QtDesigner_Ressources/Icon_Library/SELECT.png +0 -0
  164. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Save.png +0 -0
  165. pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAll.png +0 -0
  166. pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAll_32.png +0 -0
  167. pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAs.png +0 -0
  168. pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAs_32.png +0 -0
  169. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Save_24.png +0 -0
  170. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Save_32.png +0 -0
  171. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Search.png +0 -0
  172. pymodaq/resources/QtDesigner_Ressources/Icon_Library/SelectPolygon.png +0 -0
  173. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Select_24.png +0 -0
  174. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Settings.png +0 -0
  175. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snap&Save.png +0 -0
  176. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot.png +0 -0
  177. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot2.png +0 -0
  178. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot2_16.png +0 -0
  179. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot2_32.png +0 -0
  180. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Spreadsheet.png +0 -0
  181. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Statistics.png +0 -0
  182. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Statistics2.png +0 -0
  183. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Status.png +0 -0
  184. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Subtract.png +0 -0
  185. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Vision.png +0 -0
  186. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Volts.png +0 -0
  187. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Wait2.png +0 -0
  188. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_1_1.png +0 -0
  189. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_in.png +0 -0
  190. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_out.png +0 -0
  191. pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_to_Selection.png +0 -0
  192. pymodaq/resources/QtDesigner_Ressources/Icon_Library/abort.png +0 -0
  193. pymodaq/resources/QtDesigner_Ressources/Icon_Library/advanced2.png +0 -0
  194. pymodaq/resources/QtDesigner_Ressources/Icon_Library/algo.png +0 -0
  195. pymodaq/resources/QtDesigner_Ressources/Icon_Library/autoscale.png +0 -0
  196. pymodaq/resources/QtDesigner_Ressources/Icon_Library/b_icon.png +0 -0
  197. pymodaq/resources/QtDesigner_Ressources/Icon_Library/back.png +0 -0
  198. pymodaq/resources/QtDesigner_Ressources/Icon_Library/bg_icon.png +0 -0
  199. pymodaq/resources/QtDesigner_Ressources/Icon_Library/camera.png +0 -0
  200. pymodaq/resources/QtDesigner_Ressources/Icon_Library/camera_snap.png +0 -0
  201. pymodaq/resources/QtDesigner_Ressources/Icon_Library/cartesian.png +0 -0
  202. pymodaq/resources/QtDesigner_Ressources/Icon_Library/clear2.png +0 -0
  203. pymodaq/resources/QtDesigner_Ressources/Icon_Library/clear_ROI.png +0 -0
  204. pymodaq/resources/QtDesigner_Ressources/Icon_Library/close2.png +0 -0
  205. pymodaq/resources/QtDesigner_Ressources/Icon_Library/cluster2.png +0 -0
  206. pymodaq/resources/QtDesigner_Ressources/Icon_Library/color.png +0 -0
  207. pymodaq/resources/QtDesigner_Ressources/Icon_Library/color2.png +0 -0
  208. pymodaq/resources/QtDesigner_Ressources/Icon_Library/continuous.png +0 -0
  209. pymodaq/resources/QtDesigner_Ressources/Icon_Library/data.png +0 -0
  210. pymodaq/resources/QtDesigner_Ressources/Icon_Library/delay.png +0 -0
  211. pymodaq/resources/QtDesigner_Ressources/Icon_Library/download.png +0 -0
  212. pymodaq/resources/QtDesigner_Ressources/Icon_Library/download2.png +0 -0
  213. pymodaq/resources/QtDesigner_Ressources/Icon_Library/error2.png +0 -0
  214. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ethernet.png +0 -0
  215. pymodaq/resources/QtDesigner_Ressources/Icon_Library/exit2.png +0 -0
  216. pymodaq/resources/QtDesigner_Ressources/Icon_Library/fan.png +0 -0
  217. pymodaq/resources/QtDesigner_Ressources/Icon_Library/filter2.png +0 -0
  218. pymodaq/resources/QtDesigner_Ressources/Icon_Library/g_icon.png +0 -0
  219. pymodaq/resources/QtDesigner_Ressources/Icon_Library/gear2.png +0 -0
  220. pymodaq/resources/QtDesigner_Ressources/Icon_Library/go_to.png +0 -0
  221. pymodaq/resources/QtDesigner_Ressources/Icon_Library/go_to_1.png +0 -0
  222. pymodaq/resources/QtDesigner_Ressources/Icon_Library/go_to_2.png +0 -0
  223. pymodaq/resources/QtDesigner_Ressources/Icon_Library/grab.png +0 -0
  224. pymodaq/resources/QtDesigner_Ressources/Icon_Library/graph.png +0 -0
  225. pymodaq/resources/QtDesigner_Ressources/Icon_Library/greenLight2.png +0 -0
  226. pymodaq/resources/QtDesigner_Ressources/Icon_Library/greenLight2_32.png +0 -0
  227. pymodaq/resources/QtDesigner_Ressources/Icon_Library/green_light.png +0 -0
  228. pymodaq/resources/QtDesigner_Ressources/Icon_Library/grey_icon.png +0 -0
  229. pymodaq/resources/QtDesigner_Ressources/Icon_Library/greyscale.png +0 -0
  230. pymodaq/resources/QtDesigner_Ressources/Icon_Library/help1.png +0 -0
  231. pymodaq/resources/QtDesigner_Ressources/Icon_Library/help1_32.png +0 -0
  232. pymodaq/resources/QtDesigner_Ressources/Icon_Library/home2.png +0 -0
  233. pymodaq/resources/QtDesigner_Ressources/Icon_Library/information2.png +0 -0
  234. pymodaq/resources/QtDesigner_Ressources/Icon_Library/ini.png +0 -0
  235. pymodaq/resources/QtDesigner_Ressources/Icon_Library/input.png +0 -0
  236. pymodaq/resources/QtDesigner_Ressources/Icon_Library/integrator.png +0 -0
  237. pymodaq/resources/QtDesigner_Ressources/Icon_Library/joystick.png +0 -0
  238. pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_green.png +0 -0
  239. pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_green_16.png +0 -0
  240. pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_red.png +0 -0
  241. pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_red_16.png +0 -0
  242. pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_yellow.png +0 -0
  243. pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_yellow_16.png +0 -0
  244. pymodaq/resources/QtDesigner_Ressources/Icon_Library/limiter.png +0 -0
  245. pymodaq/resources/QtDesigner_Ressources/Icon_Library/load_ROI.png +0 -0
  246. pymodaq/resources/QtDesigner_Ressources/Icon_Library/meshPlot.png +0 -0
  247. pymodaq/resources/QtDesigner_Ressources/Icon_Library/meter.png +0 -0
  248. pymodaq/resources/QtDesigner_Ressources/Icon_Library/meter2.png +0 -0
  249. pymodaq/resources/QtDesigner_Ressources/Icon_Library/meter_32.png +0 -0
  250. pymodaq/resources/QtDesigner_Ressources/Icon_Library/move_contour.png +0 -0
  251. pymodaq/resources/QtDesigner_Ressources/Icon_Library/move_straight_line.png +0 -0
  252. pymodaq/resources/QtDesigner_Ressources/Icon_Library/movie.png +0 -0
  253. pymodaq/resources/QtDesigner_Ressources/Icon_Library/multi_point.png +0 -0
  254. pymodaq/resources/QtDesigner_Ressources/Icon_Library/multiplexer.png +0 -0
  255. pymodaq/resources/QtDesigner_Ressources/Icon_Library/new.png +0 -0
  256. pymodaq/resources/QtDesigner_Ressources/Icon_Library/openArrow.png +0 -0
  257. pymodaq/resources/QtDesigner_Ressources/Icon_Library/openTree.png +0 -0
  258. pymodaq/resources/QtDesigner_Ressources/Icon_Library/oscilloscope2.png +0 -0
  259. pymodaq/resources/QtDesigner_Ressources/Icon_Library/oscilloscope3.png +0 -0
  260. pymodaq/resources/QtDesigner_Ressources/Icon_Library/overlay.png +0 -0
  261. pymodaq/resources/QtDesigner_Ressources/Icon_Library/pass2.png +0 -0
  262. pymodaq/resources/QtDesigner_Ressources/Icon_Library/pass2_16.png +0 -0
  263. pymodaq/resources/QtDesigner_Ressources/Icon_Library/pass_32.png +0 -0
  264. pymodaq/resources/QtDesigner_Ressources/Icon_Library/pause.png +0 -0
  265. pymodaq/resources/QtDesigner_Ressources/Icon_Library/permute.png +0 -0
  266. pymodaq/resources/QtDesigner_Ressources/Icon_Library/phase.png +0 -0
  267. pymodaq/resources/QtDesigner_Ressources/Icon_Library/play.png +0 -0
  268. pymodaq/resources/QtDesigner_Ressources/Icon_Library/polar.png +0 -0
  269. pymodaq/resources/QtDesigner_Ressources/Icon_Library/pole_zero.png +0 -0
  270. pymodaq/resources/QtDesigner_Ressources/Icon_Library/powerMeter.png +0 -0
  271. pymodaq/resources/QtDesigner_Ressources/Icon_Library/powerSwitch.png +0 -0
  272. pymodaq/resources/QtDesigner_Ressources/Icon_Library/powerSwitch_16.png +0 -0
  273. pymodaq/resources/QtDesigner_Ressources/Icon_Library/print2.png +0 -0
  274. pymodaq/resources/QtDesigner_Ressources/Icon_Library/print2_32.png +0 -0
  275. pymodaq/resources/QtDesigner_Ressources/Icon_Library/properties.png +0 -0
  276. pymodaq/resources/QtDesigner_Ressources/Icon_Library/r_icon.png +0 -0
  277. pymodaq/resources/QtDesigner_Ressources/Icon_Library/radiocontrolbutton.png +0 -0
  278. pymodaq/resources/QtDesigner_Ressources/Icon_Library/random.png +0 -0
  279. pymodaq/resources/QtDesigner_Ressources/Icon_Library/read2.png +0 -0
  280. pymodaq/resources/QtDesigner_Ressources/Icon_Library/red_light.png +0 -0
  281. pymodaq/resources/QtDesigner_Ressources/Icon_Library/remove.png +0 -0
  282. pymodaq/resources/QtDesigner_Ressources/Icon_Library/reset.png +0 -0
  283. pymodaq/resources/QtDesigner_Ressources/Icon_Library/rgb_icon.png +0 -0
  284. pymodaq/resources/QtDesigner_Ressources/Icon_Library/robot.png +0 -0
  285. pymodaq/resources/QtDesigner_Ressources/Icon_Library/rotation2.png +0 -0
  286. pymodaq/resources/QtDesigner_Ressources/Icon_Library/run2.png +0 -0
  287. pymodaq/resources/QtDesigner_Ressources/Icon_Library/run_all.png +0 -0
  288. pymodaq/resources/QtDesigner_Ressources/Icon_Library/saturation.png +0 -0
  289. pymodaq/resources/QtDesigner_Ressources/Icon_Library/saveTree.png +0 -0
  290. pymodaq/resources/QtDesigner_Ressources/Icon_Library/save_ROI.png +0 -0
  291. pymodaq/resources/QtDesigner_Ressources/Icon_Library/scale_horizontally.png +0 -0
  292. pymodaq/resources/QtDesigner_Ressources/Icon_Library/scale_vertically.png +0 -0
  293. pymodaq/resources/QtDesigner_Ressources/Icon_Library/search2.png +0 -0
  294. pymodaq/resources/QtDesigner_Ressources/Icon_Library/select2.png +0 -0
  295. pymodaq/resources/QtDesigner_Ressources/Icon_Library/select_all.png +0 -0
  296. pymodaq/resources/QtDesigner_Ressources/Icon_Library/select_all2.png +0 -0
  297. pymodaq/resources/QtDesigner_Ressources/Icon_Library/select_none.png +0 -0
  298. pymodaq/resources/QtDesigner_Ressources/Icon_Library/sequence.png +0 -0
  299. pymodaq/resources/QtDesigner_Ressources/Icon_Library/sequence2.png +0 -0
  300. pymodaq/resources/QtDesigner_Ressources/Icon_Library/snap.png +0 -0
  301. pymodaq/resources/QtDesigner_Ressources/Icon_Library/sort_ascend.png +0 -0
  302. pymodaq/resources/QtDesigner_Ressources/Icon_Library/spectrumAnalyzer.png +0 -0
  303. pymodaq/resources/QtDesigner_Ressources/Icon_Library/start.png +0 -0
  304. pymodaq/resources/QtDesigner_Ressources/Icon_Library/status_cancelled.png +0 -0
  305. pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop.png +0 -0
  306. pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop2.png +0 -0
  307. pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop3.png +0 -0
  308. pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop_all.png +0 -0
  309. pymodaq/resources/QtDesigner_Ressources/Icon_Library/sum.png +0 -0
  310. pymodaq/resources/QtDesigner_Ressources/Icon_Library/surfacePlot.png +0 -0
  311. pymodaq/resources/QtDesigner_Ressources/Icon_Library/target.png +0 -0
  312. pymodaq/resources/QtDesigner_Ressources/Icon_Library/tree.png +0 -0
  313. pymodaq/resources/QtDesigner_Ressources/Icon_Library/updateTree.png +0 -0
  314. pymodaq/resources/QtDesigner_Ressources/Icon_Library/utility2.png +0 -0
  315. pymodaq/resources/QtDesigner_Ressources/Icon_Library/utility_small.png +0 -0
  316. pymodaq/resources/QtDesigner_Ressources/Icon_Library/vector.png +0 -0
  317. pymodaq/resources/QtDesigner_Ressources/Icon_Library/verify.png +0 -0
  318. pymodaq/resources/QtDesigner_Ressources/Icon_Library/video.png +0 -0
  319. pymodaq/resources/QtDesigner_Ressources/Icon_Library/wait.png +0 -0
  320. pymodaq/resources/QtDesigner_Ressources/Icon_Library/waterfallPlot.png +0 -0
  321. pymodaq/resources/QtDesigner_Ressources/Icon_Library/watershed.png +0 -0
  322. pymodaq/resources/QtDesigner_Ressources/Icon_Library/yellow_light.png +0 -0
  323. pymodaq/resources/QtDesigner_Ressources/Icon_Library/zip_file.png +0 -0
  324. pymodaq/resources/QtDesigner_Ressources/Icon_Library/zoomAuto.png +0 -0
  325. pymodaq/resources/QtDesigner_Ressources/Icon_Library/zoomReset.png +0 -0
  326. pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.bat +0 -2
  327. pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.qrc +0 -238
  328. pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources_rc.py +0 -127453
  329. pymodaq/resources/QtDesigner_Ressources/__init__.py +0 -0
  330. pymodaq/resources/QtDesigner_Ressources/credit.rst +0 -7
  331. pymodaq/resources/QtDesigner_Ressources/icons.svg +0 -142
  332. pymodaq/resources/VERSION +0 -2
  333. pymodaq/resources/config_template.toml +0 -96
  334. pymodaq/resources/triangulation_data.npy +0 -0
  335. pymodaq/utils/abstract/__init__.py +0 -48
  336. pymodaq/utils/db/__init__.py +0 -0
  337. pymodaq/utils/db/db_logger/__init__.py +0 -0
  338. pymodaq/utils/factory.py +0 -82
  339. pymodaq/utils/gui_utils/custom_app.py +0 -133
  340. pymodaq/utils/gui_utils/dock.py +0 -107
  341. pymodaq/utils/gui_utils/file_io.py +0 -94
  342. pymodaq/utils/gui_utils/layout.py +0 -34
  343. pymodaq/utils/gui_utils/list_picker.py +0 -38
  344. pymodaq/utils/gui_utils/widgets/__init__.py +0 -5
  345. pymodaq/utils/gui_utils/widgets/label.py +0 -24
  346. pymodaq/utils/gui_utils/widgets/push.py +0 -149
  347. pymodaq/utils/gui_utils/widgets/qled.py +0 -62
  348. pymodaq/utils/gui_utils/widgets/spinbox.py +0 -24
  349. pymodaq/utils/gui_utils/widgets/table.py +0 -263
  350. pymodaq/utils/gui_utils/widgets/tree_layout.py +0 -188
  351. pymodaq/utils/gui_utils/widgets/tree_toml.py +0 -110
  352. pymodaq/utils/h5modules/backends.py +0 -1022
  353. pymodaq/utils/h5modules/browsing.py +0 -627
  354. pymodaq/utils/h5modules/data_saving.py +0 -1107
  355. pymodaq/utils/h5modules/exporter.py +0 -119
  356. pymodaq/utils/h5modules/exporters/__init__.py +0 -0
  357. pymodaq/utils/h5modules/exporters/base.py +0 -111
  358. pymodaq/utils/h5modules/exporters/flimj.py +0 -63
  359. pymodaq/utils/h5modules/exporters/hyperspy.py +0 -143
  360. pymodaq/utils/h5modules/saving.py +0 -866
  361. pymodaq/utils/h5modules/utils.py +0 -115
  362. pymodaq/utils/managers/action_manager.py +0 -489
  363. pymodaq/utils/managers/parameter_manager.py +0 -279
  364. pymodaq/utils/managers/roi_manager.py +0 -740
  365. pymodaq/utils/parameter/ioxml.py +0 -545
  366. pymodaq/utils/parameter/pymodaq_ptypes/__init__.py +0 -38
  367. pymodaq/utils/parameter/pymodaq_ptypes/bool.py +0 -31
  368. pymodaq/utils/parameter/pymodaq_ptypes/date.py +0 -126
  369. pymodaq/utils/parameter/pymodaq_ptypes/filedir.py +0 -143
  370. pymodaq/utils/parameter/pymodaq_ptypes/itemselect.py +0 -265
  371. pymodaq/utils/parameter/pymodaq_ptypes/led.py +0 -44
  372. pymodaq/utils/parameter/pymodaq_ptypes/list.py +0 -150
  373. pymodaq/utils/parameter/pymodaq_ptypes/numeric.py +0 -18
  374. pymodaq/utils/parameter/pymodaq_ptypes/pixmap.py +0 -175
  375. pymodaq/utils/parameter/pymodaq_ptypes/slide.py +0 -166
  376. pymodaq/utils/parameter/pymodaq_ptypes/table.py +0 -135
  377. pymodaq/utils/parameter/pymodaq_ptypes/tableview.py +0 -149
  378. pymodaq/utils/parameter/pymodaq_ptypes/text.py +0 -142
  379. pymodaq/utils/plotting/__init__.py +0 -0
  380. pymodaq/utils/plotting/data_viewers/__init__.py +0 -10
  381. pymodaq/utils/plotting/data_viewers/base.py +0 -286
  382. pymodaq/utils/plotting/data_viewers/viewer.py +0 -275
  383. pymodaq/utils/plotting/data_viewers/viewer0D.py +0 -298
  384. pymodaq/utils/plotting/data_viewers/viewer1D.py +0 -826
  385. pymodaq/utils/plotting/data_viewers/viewer1Dbasic.py +0 -231
  386. pymodaq/utils/plotting/data_viewers/viewer2D.py +0 -1118
  387. pymodaq/utils/plotting/data_viewers/viewer2D_basic.py +0 -146
  388. pymodaq/utils/plotting/data_viewers/viewerND.py +0 -800
  389. pymodaq/utils/plotting/gant_chart.py +0 -123
  390. pymodaq/utils/plotting/image_viewer.py +0 -97
  391. pymodaq/utils/plotting/items/__init__.py +0 -0
  392. pymodaq/utils/plotting/items/axis_scaled.py +0 -93
  393. pymodaq/utils/plotting/items/crosshair.py +0 -94
  394. pymodaq/utils/plotting/items/image.py +0 -388
  395. pymodaq/utils/plotting/navigator.py +0 -353
  396. pymodaq/utils/plotting/plotter/plotter.py +0 -94
  397. pymodaq/utils/plotting/plotter/plotters/__init__.py +0 -0
  398. pymodaq/utils/plotting/plotter/plotters/matplotlib_plotters.py +0 -134
  399. pymodaq/utils/plotting/plotter/plotters/qt_plotters.py +0 -78
  400. pymodaq/utils/plotting/utils/__init__.py +0 -0
  401. pymodaq/utils/plotting/utils/axes_viewer.py +0 -88
  402. pymodaq/utils/plotting/utils/filter.py +0 -585
  403. pymodaq/utils/plotting/utils/lineout.py +0 -226
  404. pymodaq/utils/plotting/utils/plot_utils.py +0 -579
  405. pymodaq/utils/plotting/utils/signalND.py +0 -1347
  406. pymodaq/utils/plotting/widgets.py +0 -76
  407. pymodaq/utils/qvariant.py +0 -12
  408. pymodaq/utils/slicing.py +0 -63
  409. pymodaq/utils/units.py +0 -216
  410. pymodaq-4.4.7.dist-info/METADATA +0 -163
  411. pymodaq-4.4.7.dist-info/RECORD +0 -446
  412. /pymodaq/{post_treatment/daq_analysis → daq_utils}/__init__.py +0 -0
  413. /pymodaq/{utils/abstract/logger.py → extensions/daq_logger/abstract.py} +0 -0
  414. /pymodaq/{post_treatment/daq_measurement → extensions/daq_logger/db}/__init__.py +0 -0
  415. {pymodaq-4.4.7.dist-info → pymodaq-5.0.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,579 +0,0 @@
1
- from collections.abc import Iterable
2
- from dataclasses import dataclass, field
3
-
4
- import copy
5
- from numbers import Real, Number
6
- from typing import List, Union, Tuple
7
- from typing import Iterable as IterableType
8
-
9
- from easydict import EasyDict as edict
10
- from multipledispatch import dispatch
11
- import numpy as np
12
- import pyqtgraph as pg
13
- from qtpy import QtGui, QtCore, QtWidgets
14
- from scipy.spatial import Delaunay as Triangulation
15
-
16
- from pymodaq.utils import data as data_mod
17
- from pymodaq.utils.managers.roi_manager import LinearROI, RectROI, EllipseROI, pgROI, pgLinearROI
18
-
19
-
20
- def make_dashed_pens(color: tuple, nstyle=3):
21
- pens = [dict(color=color)]
22
- if nstyle > 1:
23
- for ind in range(nstyle - 1):
24
- pens.append(dict(color=color, dash=np.array([5, 5]) * (ind + 1)))
25
- return pens
26
-
27
-
28
- class Point:
29
- def __init__(self, *elt: IterableType[float]):
30
- """Initialize a geometric point in an arbitrary number of dimensions
31
-
32
- Parameters
33
- ----------
34
- elt: either a tuple of floats, passed as multiple parameters or a single Iterable parameter
35
- """
36
- if len(elt) == 1 and isinstance(elt[0], Iterable):
37
- elt = elt[0]
38
-
39
- self._coordinates: np.ndarray = np.atleast_1d(np.squeeze(elt))
40
- self._ndim = len(elt)
41
-
42
- @property
43
- def coordinates(self):
44
- return self._coordinates
45
-
46
- def copy(self):
47
- return Point(self.coordinates.copy())
48
-
49
- def __getitem__(self, item: int) -> float:
50
- return float(self._coordinates[item])
51
-
52
- def __setitem__(self, key: int, value: float):
53
- self._coordinates[key] = value
54
-
55
- def __len__(self):
56
- return self._ndim
57
-
58
- def _compare_length(self, other: 'Point'):
59
- if len(self) != len(other):
60
- raise ValueError('Those points should be expressed in the same coordinate system and dimensions')
61
-
62
- def __eq__(self, other):
63
- if isinstance(other, Point):
64
- return np.allclose(self.coordinates, other.coordinates)
65
- else:
66
- return False
67
-
68
- def __add__(self, other: Union['Point', 'Vector']):
69
- self._compare_length(other)
70
- return Point(*(self._coordinates + other._coordinates))
71
-
72
- def __sub__(self, other: 'Point'):
73
- self._compare_length(other)
74
- return Point(*(self._coordinates - other._coordinates))
75
-
76
- def __repr__(self):
77
- return f'Point({self.coordinates})'
78
-
79
-
80
- class Vector:
81
- def __init__(self, coordinates: Union[Point, np.ndarray], origin: Point = None):
82
- if isinstance(coordinates, Point):
83
- self._coordinates = coordinates.coordinates
84
- else:
85
- self._coordinates = coordinates
86
-
87
- if origin is None:
88
- origin = np.zeros((len(coordinates)))
89
- else:
90
- self._compare_length(origin)
91
-
92
- self._origin = origin
93
-
94
- def _compare_length(self, other: 'Point'):
95
- if len(self) != len(other):
96
- raise ValueError('Those Points/Vectors should be expressed in the same coordinate system and dimensions')
97
-
98
- @property
99
- def origin(self):
100
- return self._origin
101
-
102
- @property
103
- def coordinates(self):
104
- return self._coordinates
105
-
106
- def copy(self):
107
- return Vector(self.coordinates.copy(), origin=self.origin.copy())
108
-
109
- def __len__(self):
110
- return len(self._coordinates)
111
-
112
- def norm(self):
113
- return np.linalg.norm(self._coordinates)
114
-
115
- def unit_vector(self):
116
- return self * (1 / self.norm())
117
-
118
- def __add__(self, other: 'Vector'):
119
- self._compare_length(other)
120
- return Vector(self.coordinates + other.coordinates, origin=self.origin.copy())
121
-
122
- def __sub__(self, other: 'Vector'):
123
- self._compare_length(other)
124
- return Vector(self.coordinates - other.coordinates, origin=self.origin.copy())
125
-
126
- def __mul__(self, other: Number):
127
- if not isinstance(other, Number):
128
- raise TypeError(f'Cannot multiply a vector with {other}')
129
- return Vector(other * self.coordinates, origin=self.origin.copy())
130
-
131
- def dot(self, other: 'Vector'):
132
- self._compare_length(other)
133
- return np.dot(self.coordinates, other.coordinates)
134
-
135
- def cross(self, other: 'Vector'):
136
- self._compare_length(other)
137
- return np.cross(self.coordinates, other.coordinates)
138
-
139
- def __repr__(self):
140
- return f'Vector({self.coordinates})/Origin({self.origin.coordinates})'
141
-
142
-
143
- def get_sub_segmented_positions(spacing: float, points: List[Point]) -> List[np.ndarray]:
144
- """Get Points coordinates spaced in between subsequent Points
145
-
146
- Parameters
147
- ----------
148
- spacing: float
149
- Distance between two subpoints
150
- points: List[Point]
151
- List of Points in arbitrary dimension forming segments one want to sample with a distance equal to spacing
152
-
153
- Returns
154
- -------
155
- List[np.ndarray]: The list of the coordinates of the points
156
- """
157
- positions = []
158
- for ind in range(len(points) - 1):
159
- vect = Vector(points[ind+1]-points[ind], origin=points[ind])
160
- npts = 0
161
- while npts * spacing < vect.norm():
162
- positions.append(
163
- (vect.origin + vect.unit_vector() * npts * spacing).coordinates)
164
- npts += 1
165
-
166
- # # add_last point not taken into account
167
- positions.append(points[-1].coordinates)
168
- return positions
169
-
170
-
171
- class QVector(QtCore.QLineF):
172
- def __init__(self, *elt):
173
- super().__init__(*elt)
174
-
175
- def __repr__(self):
176
- return f"PyMoDAQ's QVector({self.x1()}, {self.y1()}, {self.x2()}, {self.y2()})"
177
-
178
- def __add__(self, qvect):
179
- v = QVector(self.x1() + qvect.x1(), self.y1() + qvect.y1(), self.x2() + qvect.x2(), self.y2() + qvect.y2())
180
- return v
181
-
182
- def __sub__(self, qvect):
183
- v = QVector(self.x1() - qvect.x1(), self.y1() - qvect.y1(), self.x2() - qvect.x2(), self.y2() - qvect.y2())
184
- return v
185
-
186
- def __mul__(self, coeff=float(1)):
187
- v = QVector(coeff * self.x1(), coeff * self.y1(), coeff * self.x2(), coeff * self.y2())
188
- return v
189
-
190
- def copy(self):
191
- vec = QVector()
192
- vec.setPoints(copy.copy(self.p1()), copy.copy(self.p2()))
193
- return vec
194
-
195
- def vectorize(self):
196
- v = QVector(QtCore.QPointF(0, 0), self.p2() - self.p1())
197
- return v
198
-
199
- def norm(self):
200
- return self.length()
201
-
202
- def unitVector(self):
203
- vec = self * (1 / self.length())
204
- return vec
205
-
206
- def normalVector(self):
207
- vec = self.vectorize()
208
- vec = QVector(0, 0, -vec.p2().y(), vec.p2().x())
209
- return vec
210
-
211
- def normalVector_not_vectorized(self):
212
- vec = self.vectorize()
213
- vec = QVector(0, 0, -vec.p2().y(), vec.p2().x())
214
- vec.translate(self.p1())
215
- return vec
216
-
217
- def dot(self, qvect):
218
- """
219
- scalar product
220
- """
221
- v1 = self.vectorize()
222
- v2 = qvect.vectorize()
223
- prod = v1.x2() * v2.x2() + v1.y2() * v2.y2()
224
- return prod
225
-
226
- def prod(self, qvect):
227
- """
228
- vectoriel product length along z
229
- """
230
- v1 = self.vectorize()
231
- v2 = qvect.vectorize()
232
- prod = v1.x2() * v2.y2() - v1.y2() * v2.x2()
233
- return prod
234
-
235
- def translate_to(self, point=QtCore.QPointF(0, 0)):
236
- vec = self + QVector(self.p1(), point)
237
- return vec
238
-
239
-
240
- def makeAlphaTriangles(data, lut=None, levels=None, scale=None, useRGBA=False):
241
- """
242
- Convert an array of values into an ARGB array suitable for building QImages,
243
- OpenGL textures, etc.
244
-
245
- Returns the ARGB array (unsigned byte) and a boolean indicating whether
246
- there is alpha channel data. This is a two stage process:
247
- 0) compute the polygons (triangles) from triangulation of the points
248
- 1) Rescale the data based on the values in the *levels* argument (min, max).
249
- 2) Determine the final output by passing the rescaled values through a
250
- lookup table.
251
-
252
- Both stages are optional.
253
-
254
- ============== ==================================================================================
255
- **Arguments:**
256
- data numpy array of int/float types. If
257
- levels List [min, max]; optionally rescale data before converting through the
258
- lookup table. The data is rescaled such that min->0 and max->*scale*::
259
-
260
- rescaled = (clip(data, min, max) - min) * (*scale* / (max - min))
261
-
262
- It is also possible to use a 2D (N,2) array of values for levels. In this case,
263
- it is assumed that each pair of min,max values in the levels array should be
264
- applied to a different subset of the input data (for example, the input data may
265
- already have RGB values and the levels are used to independently scale each
266
- channel). The use of this feature requires that levels.shape[0] == data.shape[-1].
267
- scale The maximum value to which data will be rescaled before being passed through the
268
- lookup table (or returned if there is no lookup table). By default this will
269
- be set to the length of the lookup table, or 255 if no lookup table is provided.
270
- lut Optional lookup table (array with dtype=ubyte).
271
- Values in data will be converted to color by indexing directly from lut.
272
- The output data shape will be input.shape + lut.shape[1:].
273
- Lookup tables can be built using ColorMap or GradientWidget.
274
- useRGBA If True, the data is returned in RGBA order (useful for building OpenGL textures).
275
- The default is False, which returns in ARGB order for use with QImage
276
- (Note that 'ARGB' is a term used by the Qt documentation; the *actual* order
277
- is BGRA).
278
- ============== ==================================================================================
279
- """
280
- points = data[:, :2]
281
- values = data[:, 2]
282
-
283
- profile = pg.debug.Profiler()
284
- if points.ndim not in (2,):
285
- raise TypeError("points must be 1D sequence of points")
286
-
287
- tri = Triangulation(points)
288
- tri_data = np.zeros((len(tri.simplices),))
289
- for ind, pts in enumerate(tri.simplices):
290
- tri_data[ind] = np.mean(values[pts])
291
- data = tri_data.copy()
292
- if lut is not None and not isinstance(lut, np.ndarray):
293
- lut = np.array(lut)
294
-
295
- if levels is None:
296
- # automatically decide levels based on data dtype
297
- if data.dtype.kind == 'u':
298
- levels = np.array([0, 2 ** (data.itemsize * 8) - 1])
299
- elif data.dtype.kind == 'i':
300
- s = 2 ** (data.itemsize * 8 - 1)
301
- levels = np.array([-s, s - 1])
302
- elif data.dtype.kind == 'b':
303
- levels = np.array([0, 1])
304
- else:
305
- raise Exception('levels argument is required for float input types')
306
- if not isinstance(levels, np.ndarray):
307
- levels = np.array(levels)
308
- if levels.ndim == 1:
309
- if levels.shape[0] != 2:
310
- raise Exception('levels argument must have length 2')
311
- elif levels.ndim == 2:
312
- if lut is not None and lut.ndim > 1:
313
- raise Exception('Cannot make ARGB data when both levels and lut have ndim > 2')
314
- if levels.shape != (data.shape[-1], 2):
315
- raise Exception('levels must have shape (data.shape[-1], 2)')
316
- else:
317
- raise Exception("levels argument must be 1D or 2D (got shape=%s)." % repr(levels.shape))
318
-
319
- profile()
320
-
321
- # Decide on maximum scaled value
322
- if scale is None:
323
- if lut is not None:
324
- scale = lut.shape[0] - 1
325
- else:
326
- scale = 255.
327
-
328
- # Decide on the dtype we want after scaling
329
- if lut is None:
330
- dtype = np.ubyte
331
- else:
332
- dtype = np.min_scalar_type(lut.shape[0] - 1)
333
-
334
- # Apply levels if given
335
- if levels is not None:
336
- if isinstance(levels, np.ndarray) and levels.ndim == 2:
337
- # we are going to rescale each channel independently
338
- if levels.shape[0] != data.shape[-1]:
339
- raise Exception(
340
- "When rescaling multi-channel data, there must be the same number of levels as channels (data.shape[-1] == levels.shape[0])")
341
- newData = np.empty(data.shape, dtype=int)
342
- for i in range(data.shape[-1]):
343
- minVal, maxVal = levels[i]
344
- if minVal == maxVal:
345
- maxVal += 1e-16
346
- newData[..., i] = pg.functions.rescaleData(data[..., i], scale / (maxVal - minVal), minVal, dtype=dtype)
347
- data = newData
348
- else:
349
- # Apply level scaling unless it would have no effect on the data
350
- minVal, maxVal = levels
351
- if minVal != 0 or maxVal != scale:
352
- if minVal == maxVal:
353
- maxVal += 1e-16
354
- data = pg.functions.rescaleData(data, scale / (maxVal - minVal), minVal, dtype=dtype)
355
-
356
- profile()
357
-
358
- # apply LUT if given
359
- if lut is not None:
360
- data = pg.functions.applyLookupTable(data, lut)
361
- else:
362
- if data.dtype is not np.ubyte:
363
- data = np.clip(data, 0, 255).astype(np.ubyte)
364
-
365
- profile()
366
-
367
- # this will be the final image array
368
- imgData = np.empty((data.shape[0],) + (4,), dtype=np.ubyte)
369
-
370
- profile()
371
-
372
- # decide channel order
373
- if useRGBA:
374
- order = [0, 1, 2, 3] # array comes out RGBA
375
- else:
376
- order = [2, 1, 0, 3] # for some reason, the colors line up as BGR in the final image.
377
-
378
- # TODO check this
379
- # copy data into image array
380
- if data.ndim == 1:
381
- # This is tempting:
382
- # imgData[..., :3] = data[..., np.newaxis]
383
- # ..but it turns out this is faster:
384
- for i in range(3):
385
- imgData[..., i] = data
386
- elif data.shape[1] == 1:
387
- for i in range(3):
388
- imgData[..., i] = data[..., 0]
389
- else:
390
- for i in range(0, data.shape[1]):
391
- imgData[..., i] = data[..., order[i]]
392
-
393
- profile()
394
-
395
- # add opaque alpha channel if needed
396
- if data.ndim == 1 or data.shape[1] == 3:
397
- alpha = False
398
- imgData[..., 3] = 255
399
- else:
400
- alpha = True
401
-
402
- profile()
403
- return tri, tri_data, imgData, alpha
404
-
405
-
406
- def makePolygons(tri):
407
- polygons = []
408
- for seq in tri.points[tri.simplices]:
409
- polygons.append(QtGui.QPolygonF([QtCore.QPointF(*s) for s in seq] + [QtCore.QPointF(*seq[0])]))
410
- return polygons
411
-
412
-
413
- class Data0DWithHistory:
414
- """Object to store scalar values and keep a history of a given length to them"""
415
- def __init__(self, Nsamples=200):
416
- super().__init__()
417
- self._datas = dict([])
418
- self.last_data: data_mod.DataRaw = None
419
- self._Nsamples = Nsamples
420
- self._xaxis = None
421
- self._data_length = 0
422
-
423
- @property
424
- def size(self):
425
- return self._data_length
426
-
427
- @property
428
- def length(self):
429
- return self._Nsamples
430
-
431
- @length.setter
432
- def length(self, history_length: int):
433
- if history_length > 0:
434
- self._Nsamples = history_length
435
-
436
- def __len__(self):
437
- return self.length
438
-
439
- @dispatch(data_mod.DataWithAxes)
440
- def add_datas(self, data: data_mod.DataWithAxes):
441
- self.last_data = data
442
- datas = {data.labels[ind]: data.data[ind] for ind in range(len(data))}
443
- self.add_datas(datas)
444
-
445
- @dispatch(list)
446
- def add_datas(self, data: list):
447
- """
448
- Add datas to the history
449
- Parameters
450
- ----------
451
- data: (list) list of floats or np.array(float)
452
- """
453
- self.last_data = data_mod.DataRaw('Data0D', data=[np.array([dat]) for dat in data])
454
- datas = {f'data_{ind:02d}': data[ind] for ind in range(len(data))}
455
- self.add_datas(datas)
456
-
457
- @dispatch(dict)
458
- def add_datas(self, datas: dict):
459
- """
460
- Add datas to the history on the form of a dict of key/data pairs (data is a numpy 0D array)
461
- Parameters
462
- ----------
463
- datas: (dict) dictionaary of floats or np.array(float)
464
- """
465
- if datas.keys() != self._datas.keys():
466
- self.clear_data()
467
-
468
- self._data_length += 1
469
-
470
- if self._data_length > self._Nsamples:
471
- self._xaxis += 1
472
- else:
473
- self._xaxis = np.linspace(0, self._data_length, self._data_length, endpoint=False)
474
-
475
- for data_key, data in datas.items():
476
- if not isinstance(data, np.ndarray):
477
- data = np.array([data])
478
-
479
- if self._data_length == 1:
480
- self._datas[data_key] = data
481
- else:
482
- self._datas[data_key] = np.concatenate((self._datas[data_key], data))
483
-
484
- if self._data_length > self._Nsamples:
485
- self._datas[data_key] = self._datas[data_key][1:]
486
-
487
- @property
488
- def datas(self):
489
- return self._datas
490
-
491
- @property
492
- def xaxis(self):
493
- return self._xaxis
494
-
495
- def clear_data(self):
496
- self._datas = dict([])
497
- self._data_length = 0
498
- self._xaxis = np.array([])
499
-
500
-
501
- class View_cust(pg.ViewBox):
502
- """Custom ViewBox used to enable other properties compared to parent class: pg.ViewBox
503
-
504
- """
505
- sig_double_clicked = QtCore.Signal(float, float)
506
-
507
- def __init__(self, parent=None, border=None, lockAspect=False, enableMouse=True, invertY=False,
508
- enableMenu=True, name=None, invertX=False):
509
- super().__init__(parent, border, lockAspect, enableMouse, invertY, enableMenu, name, invertX)
510
-
511
- def mouseClickEvent(self, ev):
512
- if ev.button() == QtCore.Qt.RightButton and self.menuEnabled():
513
- ev.accept()
514
- self.raiseContextMenu(ev)
515
- if ev.double():
516
- pos = self.mapToView(ev.pos())
517
- self.sig_double_clicked.emit(pos.x(), pos.y())
518
-
519
-
520
- @dataclass
521
- class RoiInfo:
522
- """ DataClass holding info about a given ROI
523
-
524
- Parameters
525
- ----------
526
- origin
527
- size
528
- angle
529
- centered
530
- color
531
- roi_class
532
- index
533
- """
534
-
535
- origin: Union[Point, IterableType[float]]
536
- size: Union[Point, IterableType[float]]
537
- angle: float = None
538
- centered: bool = False
539
- color: Tuple[int, int, int] = (255, 0, 0)
540
- roi_class: type = None
541
- index: int = 0
542
-
543
- @classmethod
544
- def info_from_linear_roi(cls, roi: LinearROI):
545
- pos = roi.pos()
546
- return cls(Point((pos[0],)), size=Point((pos[1] - pos[0],)), color=roi.color,
547
- roi_class=type(roi), index=roi.index)
548
-
549
- @classmethod
550
- def info_from_rect_roi(cls, roi: RectROI):
551
- return cls(Point(list(roi.pos())[::-1]), size=Point((roi.height(), roi.width())),
552
- color=roi.color, roi_class=type(roi), index=roi.index)
553
-
554
- def center_origin(self):
555
- if not self.centered:
556
- self.origin += Point((self.size[0] / 2, self.size[1] / 2))
557
- self.centered = True
558
-
559
- def to_slices(self) -> IterableType[slice]:
560
- """Get slices to be used directly to slice DataWithAxes"""
561
- if issubclass(self.roi_class, pgROI):
562
- if self.centered:
563
- return (slice(int(self.origin[0] - self.size[0] / 2),
564
- int(self.origin[0] + self.size[0] / 2)),
565
- slice(int(self.origin[1] - self.size[1] / 2),
566
- int(self.origin[1] + self.size[1] / 2)),
567
- )
568
- else:
569
- return (slice(int(self.origin[0]),
570
- int(self.origin[0] + self.size[0])),
571
- slice(int(self.origin[1]),
572
- int(self.origin[1] + self.size[1])),
573
- )
574
- elif issubclass(self.roi_class, pgLinearROI):
575
- if self.centered:
576
- return (slice(int(self.origin[0] - self.size[0] / 2),
577
- int(self.origin[0] + self.size[0] / 2)),)
578
- else:
579
- return (slice(int(self.origin[0]), int(self.origin[0] + self.size[0])),)