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,740 +0,0 @@
1
- from abc import abstractmethod
2
- import os
3
- import sys
4
- from typing import List, TYPE_CHECKING, Tuple, Union
5
- import pymodaq.utils
6
- from qtpy import QtCore, QtGui, QtWidgets
7
- from qtpy.QtCore import QObject, Slot, Signal, QPointF
8
- from qtpy.QtGui import QIcon, QPixmap
9
- from collections import OrderedDict
10
-
11
- from pymodaq.utils.parameter import ioxml
12
- from pymodaq.utils.parameter import utils as putils
13
- from pymodaq.utils.parameter import ParameterTree, Parameter
14
- from pyqtgraph.parametertree.parameterTypes.basetypes import GroupParameter
15
- from pymodaq.utils.parameter import pymodaq_ptypes
16
- from pymodaq.utils.managers.action_manager import QAction
17
- from pyqtgraph import ROI as pgROI
18
- from pyqtgraph import RectROI as pgRectROI
19
- from pyqtgraph import functions as fn
20
- from pyqtgraph import LinearRegionItem as pgLinearROI
21
- from pymodaq.utils.daq_utils import plot_colors
22
- from pymodaq.utils.logger import get_module_name, set_logger
23
- from pymodaq.utils.config import get_set_roi_path
24
- from pymodaq.utils.gui_utils import select_file
25
- from pymodaq.utils.math_utils import rotate2D
26
-
27
- import numpy as np
28
- from pathlib import Path
29
- from pymodaq.post_treatment.process_to_scalar import DataProcessorFactory
30
-
31
- if TYPE_CHECKING:
32
- from pymodaq.control_modules.daq_viewer import DAQ_Viewer
33
-
34
- data_processors = DataProcessorFactory()
35
-
36
- roi_path = get_set_roi_path()
37
- logger = set_logger(get_module_name(__file__))
38
-
39
-
40
- class ROIPositionMapper(QtWidgets.QWidget):
41
- """ Widget presenting a Tree structure representing a ROI positions.
42
- """
43
-
44
- def __init__(self, roi_pos, roi_size):
45
- super().__init__()
46
- self.roi_pos = roi_pos
47
- self.roi_size = roi_size
48
-
49
- def show_dialog(self):
50
- self.params = [
51
- {'name': 'position', 'type': 'group', 'children': [
52
- {'name': 'x0', 'type': 'float', 'value': self.roi_pos[0] + self.roi_size[0] / 2, 'step': 1},
53
- {'name': 'y0', 'type': 'float', 'value': self.roi_pos[1] + self.roi_size[1] / 2, 'step': 1}
54
- ]},
55
- {'name': 'size', 'type': 'group', 'children': [
56
- {'name': 'width', 'type': 'float', 'value': self.roi_size[0], 'step': 1},
57
- {'name': 'height', 'type': 'float', 'value': self.roi_size[1], 'step': 1}]
58
- }]
59
-
60
- dialog = QtWidgets.QDialog(self)
61
- vlayout = QtWidgets.QVBoxLayout()
62
- self.settings_tree = ParameterTree()
63
- vlayout.addWidget(self.settings_tree, 10)
64
- self.settings_tree.setMinimumWidth(300)
65
- self.settings = Parameter.create(name='settings', type='group', children=self.params)
66
- self.settings_tree.setParameters(self.settings, showTop=False)
67
- dialog.setLayout(vlayout)
68
-
69
- buttonBox = QtWidgets.QDialogButtonBox(parent=self)
70
- buttonBox.addButton('Apply', buttonBox.AcceptRole)
71
- buttonBox.accepted.connect(dialog.accept)
72
- buttonBox.addButton('Cancel', buttonBox.RejectRole)
73
- buttonBox.rejected.connect(dialog.reject)
74
-
75
- vlayout.addWidget(buttonBox)
76
- self.setWindowTitle('Set Precise positions for the ROI')
77
- res = dialog.exec()
78
-
79
- if res == dialog.Accepted:
80
-
81
- return self.settings
82
- else:
83
- return None
84
-
85
-
86
- class ROI(pgROI):
87
- index_signal = Signal(int)
88
-
89
- def __init__(self, *args, index=0, name='roi', **kwargs):
90
- super().__init__(*args, **kwargs)
91
- self.name = name
92
- self.index = index
93
- self._menu = QtWidgets.QMenu()
94
- self._menu.addAction('Set ROI positions', self.set_positions)
95
- self.sigRegionChangeFinished.connect(self.emit_index_signal)
96
-
97
- def emit_index_signal(self):
98
- self.index_signal.emit(self.index)
99
-
100
- @property
101
- def color(self):
102
- return self.pen.color()
103
-
104
- def center(self) -> QPointF:
105
- """ Get the center position of the ROI """
106
- return QPointF(self.pos().x() + self.size().x() / 2, self.pos().y() + self.size().y() / 2)
107
-
108
- def set_center(self, center: Union[QPointF, Tuple[float, float]]):
109
- size = self.size()
110
- self.setPos(np.array(center) - np.array(size) / 2)
111
-
112
- def set_positions(self):
113
- mapper = ROIPositionMapper(self.pos(), self.size())
114
- settings = mapper.show_dialog()
115
- if settings is not None:
116
- self.setSize((settings['size', 'width'], settings['size', 'height']))
117
- self.setPos((settings['position', 'x0'] - settings['size', 'width'] / 2,
118
- settings['position', 'y0'] - settings['size', 'height'] / 2))
119
-
120
- def contextMenuEvent(self, event):
121
- if self._menu is not None:
122
- self._menu.exec(event.screenPos())
123
-
124
- def width(self) -> float:
125
- return self.size().x()
126
-
127
- def height(self) -> float:
128
- return self.size().y()
129
-
130
-
131
- class ROIBrushable(ROI):
132
- def __init__(self, brush=None, *args, **kwargs):
133
- super().__init__(*args, **kwargs)
134
-
135
- if brush is None:
136
- brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 50))
137
- self.setBrush(brush)
138
-
139
- def setBrush(self, *br, **kargs):
140
- """Set the brush that fills the region. Can have any arguments that are valid
141
- for :func:`mkBrush <pyqtgraph.mkBrush>`.
142
- """
143
- self.brush = fn.mkBrush(*br, **kargs)
144
- self.currentBrush = self.brush
145
-
146
- def paint(self, p, opt, widget):
147
- # p.save()
148
- # Note: don't use self.boundingRect here, because subclasses may need to redefine it.
149
- r = QtCore.QRectF(0, 0, self.state['size'][0], self.state['size'][1]).normalized()
150
-
151
- p.setRenderHint(QtGui.QPainter.Antialiasing)
152
- p.setPen(self.currentPen)
153
- p.setBrush(self.currentBrush)
154
- p.translate(r.left(), r.top())
155
- p.scale(r.width(), r.height())
156
- p.drawRect(0, 0, 1, 1)
157
- # p.restore()
158
-
159
-
160
- class LinearROI(pgLinearROI):
161
- index_signal = Signal(int)
162
-
163
- def __init__(self, index=0, pos=[0, 10], name = 'roi', **kwargs):
164
- super().__init__(values=pos, **kwargs)
165
- self.name = name
166
- self.index = index
167
- self.sigRegionChangeFinished.connect(self.emit_index_signal)
168
-
169
- def pos(self) -> Tuple[float, float]:
170
- return self.getRegion()
171
-
172
- def center(self) -> float:
173
- pos = self.pos()
174
- return (pos[0] + pos[1]) / 2
175
-
176
- def setPos(self, pos: Tuple[int, int]):
177
- self.setRegion(pos)
178
-
179
- def setPen(self, color):
180
- self.setBrush(color)
181
-
182
- @property
183
- def color(self):
184
- return self.brush.color()
185
-
186
- def emit_index_signal(self):
187
- self.index_signal.emit(self.index)
188
-
189
-
190
- class EllipseROI(ROI):
191
- """
192
- Elliptical ROI subclass with one scale handle and one rotation handle.
193
-
194
-
195
- ============== =============================================================
196
- **Arguments**
197
- pos (length-2 sequence) The position of the ROI's origin.
198
- size (length-2 sequence) The size of the ROI's bounding rectangle.
199
- **args All extra keyword arguments are passed to ROI()
200
- ============== =============================================================
201
-
202
- """
203
-
204
-
205
- def __init__(self, index=0, pos=[0, 0], size=[10, 10], **kwargs):
206
- # QtGui.QGraphicsRectItem.__init__(self, 0, 0, size[0], size[1])
207
- super().__init__(pos=pos, size=size, index=index, **kwargs)
208
- self.addRotateHandle([1.0, 0.5], [0.5, 0.5])
209
- self.addScaleHandle([0.5 * 2. ** -0.5 + 0.5, 0.5 * 2. ** -0.5 + 0.5], [0.5, 0.5])
210
-
211
- def getArrayRegion(self, arr, img=None, axes=(0, 1), **kwds):
212
- """
213
- Return the result of ROI.getArrayRegion() masked by the elliptical shape
214
- of the ROI. Regions outside the ellipse are set to 0.
215
- """
216
- # Note: we could use the same method as used by PolyLineROI, but this
217
- # implementation produces a nicer mask.
218
- if kwds["returnMappedCoords"]:
219
- arr, coords = pgROI.getArrayRegion(self, arr, img, axes, **kwds)
220
- else:
221
- arr = pgROI.getArrayRegion(self, arr, img, axes, **kwds)
222
- if arr is None or arr.shape[axes[0]] == 0 or arr.shape[axes[1]] == 0:
223
- return arr
224
- w = arr.shape[axes[0]]
225
- h = arr.shape[axes[1]]
226
- # generate an ellipsoidal mask
227
- mask = np.fromfunction(
228
- lambda x, y: (((x + 0.5) / (w / 2.) - 1) ** 2 + ((y + 0.5) / (h / 2.) - 1) ** 2) ** 0.5 < 1, (w, h))
229
-
230
- # reshape to match array axes
231
- if axes[0] > axes[1]:
232
- mask = mask.T
233
- shape = [(n if i in axes else 1) for i, n in enumerate(arr.shape)]
234
- mask = mask.reshape(shape)
235
- if kwds["returnMappedCoords"]:
236
- return arr * mask, coords
237
- else:
238
- return arr * mask
239
-
240
- def paint(self, p, opt, widget):
241
- r = self.boundingRect()
242
- p.setRenderHint(QtGui.QPainter.Antialiasing)
243
- p.setPen(self.currentPen)
244
-
245
- p.scale(r.width(), r.height()) # workaround for GL bug
246
- r = QtCore.QRectF(r.x() / r.width(), r.y() / r.height(), 1, 1)
247
-
248
- p.drawEllipse(r)
249
-
250
- def shape(self):
251
- self.path = QtGui.QPainterPath()
252
- self.path.addEllipse(self.boundingRect())
253
- return self.path
254
-
255
-
256
- class CircularROI(EllipseROI):
257
- def __init__(self, index=0, pos=[0, 0], size=[10, 10], **kwargs):
258
- ROI.__init__(self, pos=pos, size=size, index=index, **kwargs)
259
- self.addScaleHandle([0.5 * 2. ** -0.5 + 0.5, 0.5 * 2. ** -0.5 + 0.5], [0.5, 0.5],
260
- lockAspect=True)
261
-
262
-
263
- class SimpleRectROI(ROI):
264
- r"""
265
- Rectangular ROI subclass with a single scale handle at the top-right corner.
266
- """
267
-
268
- def __init__(self, pos=[0, 0], size=[10, 10], centered=False, sideScalers=False, **args):
269
- super().__init__(pos, size, **args)
270
- if centered:
271
- center = [0.5, 0.5]
272
- else:
273
- center = [0, 0]
274
-
275
- self.addScaleHandle([1, 1], center)
276
- if sideScalers:
277
- self.addScaleHandle([1, 0.5], [center[0], 0.5])
278
- self.addScaleHandle([0.5, 1], [0.5, center[1]])
279
-
280
-
281
- class RectROI(ROI):
282
- def __init__(self, index=0, pos=[0, 0], size=[10, 10], **kwargs):
283
- super().__init__(pos=pos, size=size, index=index, **kwargs) # , scaleSnap=True, translateSnap=True)
284
- self.addScaleHandle([1, 1], [0, 0])
285
- self.addRotateHandle([0, 0], [0.5, 0.5])
286
-
287
-
288
- ROI_NAME_PREFIX = 'ROI_'
289
- ROI2D_TYPES = ['RectROI', 'EllipseROI', 'CircularROI']
290
-
291
-
292
- class ROIScalableGroup(GroupParameter):
293
- def __init__(self, roi_type='1D', **opts):
294
- opts['type'] = 'group'
295
- opts['addText'] = "Add"
296
- self.roi_type = roi_type
297
- if roi_type != '1D':
298
- opts['addList'] = ROI2D_TYPES
299
- self.color_list = ROIManager.color_list
300
- super().__init__(**opts)
301
-
302
- def addNew(self, typ=''):
303
- name_prefix = ROI_NAME_PREFIX
304
- child_indexes = [int(par.name()[len(name_prefix) + 1:]) for par in self.children()]
305
- if not child_indexes:
306
- newindex = 0
307
- else:
308
- newindex = max(child_indexes) + 1
309
-
310
- child = {'name': ROIManager.roi_format(newindex), 'type': 'group', 'removable': True, 'renamable': False}
311
-
312
- children = [{'name': 'type', 'type': 'str', 'value': self.roi_type, 'readonly': True, 'visible': False}, ]
313
- if self.roi_type == '2D':
314
- children.extend([{'title': 'ROI Type', 'name': 'roi_type', 'type': 'str', 'value': typ, 'readonly': True},
315
- {'title': 'Use channel', 'name': 'use_channel', 'type': 'list',
316
- 'limits': ['red', 'green', 'blue']}, ])
317
- children.append({'title': 'Math type:', 'name': 'math_function', 'type': 'list',
318
- 'limits': data_processors.functions_filtered('Data2D')})
319
- else:
320
- children.append({'title': 'Use channel', 'name': 'use_channel', 'type': 'list'})
321
- children.append({'title': 'Math type:', 'name': 'math_function', 'type': 'list',
322
- 'limits': data_processors.functions_filtered('Data1D')})
323
-
324
- children.extend([
325
- {'name': 'Color', 'type': 'color', 'value': list(np.roll(self.color_list, newindex)[0])}, ])
326
- if self.roi_type == '2D':
327
- children.extend([{'name': 'position', 'type': 'group', 'children': [
328
- {'name': 'x', 'type': 'float', 'value': 0, 'step': 1},
329
- {'name': 'y', 'type': 'float', 'value': 0, 'step': 1}
330
- ]}, ])
331
- else:
332
- children.extend([{'name': 'position', 'type': 'group', 'children': [
333
- {'name': 'left', 'type': 'float', 'value': 0, 'step': 1},
334
- {'name': 'right', 'type': 'float', 'value': 10, 'step': 1}
335
- ]}, ])
336
- if self.roi_type == '2D':
337
- children.extend([
338
- {'name': 'size', 'type': 'group', 'children': [
339
- {'name': 'width', 'type': 'float', 'value': 10, 'step': 1},
340
- {'name': 'height', 'type': 'float', 'value': 10, 'step': 1}
341
- ]},
342
- {'name': 'angle', 'type': 'float', 'value': 0, 'step': 1}])
343
-
344
- child['children'] = children
345
-
346
- self.addChild(child)
347
-
348
-
349
- class ROIManager(QObject):
350
-
351
- new_ROI_signal = Signal(int, str, str)
352
- remove_ROI_signal = Signal(str)
353
- roi_value_changed = Signal(str, tuple)
354
- color_signal = Signal(list)
355
- roi_update_children = Signal(list)
356
- roi_changed = Signal()
357
- color_list = np.array(plot_colors)
358
-
359
- def __init__(self, viewer_widget=None, ROI_type='1D'):
360
- super().__init__()
361
- self.ROI_type = ROI_type
362
- self.roiwidget = QtWidgets.QWidget()
363
- self.viewer_widget = viewer_widget # either a PlotWidget or a ImageWidget
364
- self._ROIs: OrderedDict[str, ROI] = OrderedDict([])
365
- self.setupUI()
366
-
367
- @staticmethod
368
- def roi_format(index):
369
- return f'{ROI_NAME_PREFIX}{index:02d}'
370
-
371
- @property
372
- def ROIs(self):
373
- return self._ROIs
374
-
375
- def __len__(self):
376
- return len(self._ROIs)
377
-
378
- def get_roi_from_index(self, index: int) -> ROI:
379
- return self.ROIs[self.roi_format(index)]
380
-
381
- def _set_roi_from_index(self, index: int, roi):
382
- self.ROIs[self.roi_format(index)] = roi
383
-
384
- def get_roi(self, roi_key):
385
- if roi_key in self.ROIs:
386
- return self.ROIs[roi_key]
387
- else:
388
- raise KeyError(f'{roi_key} is not a valid ROI identifier for {self.ROIs}')
389
-
390
- def emit_colors(self):
391
- self.color_signal.emit([self._ROIs[roi_key].color for roi_key in self._ROIs])
392
-
393
- def add_roi_programmatically(self, roitype=ROI2D_TYPES[0]):
394
- self.settings.child('ROIs').addNew(roitype)
395
-
396
- def remove_roi_programmatically(self, index: int):
397
- self.settings.child('ROIs').removeChild(self.settings.child('ROIs', self.roi_format(index)))
398
-
399
- def setupUI(self):
400
-
401
- vlayout = QtWidgets.QVBoxLayout()
402
- self.roiwidget.setLayout(vlayout)
403
-
404
- self.toolbar = QtWidgets.QToolBar()
405
- vlayout.addWidget(self.toolbar)
406
-
407
- self.save_ROI_pb = QAction(QIcon(QPixmap(":/icons/Icon_Library/save_ROI.png")), 'Save ROIs')
408
- self.load_ROI_pb = QAction(QIcon(QPixmap(":/icons/Icon_Library/load_ROI.png")), 'Load ROIs')
409
- self.clear_ROI_pb = QAction(QIcon(QPixmap(":/icons/Icon_Library/clear_ROI.png")), 'Clear ROIs')
410
- self.toolbar.addActions([self.save_ROI_pb, self.load_ROI_pb, self.clear_ROI_pb])
411
-
412
-
413
- self.roitree = ParameterTree()
414
- vlayout.addWidget(self.roitree)
415
- self.roiwidget.setMinimumWidth(250)
416
- self.roiwidget.setMaximumWidth(300)
417
-
418
- params = [
419
- {'title': 'Measurements:', 'name': 'measurements', 'type': 'table', 'value': OrderedDict([]), 'Ncol': 2,
420
- 'header': ["LO", "Value"]},
421
- ROIScalableGroup(roi_type=self.ROI_type, name="ROIs")]
422
- self.settings = Parameter.create(title='ROIs Settings', name='rois_settings', type='group', children=params)
423
- self.roitree.setParameters(self.settings, showTop=False)
424
- self.settings.sigTreeStateChanged.connect(self.roi_tree_changed)
425
-
426
- self.save_ROI_pb.triggered.connect(self.save_ROI)
427
- self.load_ROI_pb.triggered.connect(lambda: self.load_ROI(None))
428
- self.clear_ROI_pb.triggered.connect(self.clear_ROI)
429
-
430
- def roi_tree_changed(self, param, changes):
431
-
432
- for param, change, data in changes:
433
- path = self.settings.childPath(param)
434
- if path is not None:
435
- childName = '.'.join(path)
436
- else:
437
- childName = param.name()
438
- if change == 'childAdded': # new roi to create
439
- par: Parameter = data[0]
440
- newindex = int(par.name()[-2:])
441
- roi_type = ''
442
- if par.child('type').value() == '1D':
443
- roi_type = ''
444
-
445
- pos = self.viewer_widget.plotItem.vb.viewRange()[0]
446
- pos = pos[0] + np.diff(pos)*np.array([2,4])/6
447
- newroi = LinearROI(index=newindex, pos=pos)
448
-
449
- newroi.setZValue(-10)
450
- newroi.setBrush(par.child('Color').value())
451
- newroi.setOpacity(0.2)
452
-
453
- elif par.child('type').value() == '2D':
454
- roi_type = par.child('roi_type').value()
455
- xrange = self.viewer_widget.plotItem.vb.viewRange()[0]
456
- yrange = self.viewer_widget.plotItem.vb.viewRange()[1]
457
- width = np.max(((xrange[1] - xrange[0]) / 10, 2))
458
- height = np.max(((yrange[1] - yrange[0]) / 10, 2))
459
- pos = [int(np.mean(xrange) - width / 2), int(np.mean(yrange) - width / 2)]
460
-
461
- if roi_type == 'RectROI':
462
- newroi = RectROI(index=newindex, pos=pos,
463
- size=[width, height], name=par.name())
464
- elif roi_type == 'EllipseROI':
465
- newroi = EllipseROI(index=newindex, pos=pos,
466
- size=[width, height], name=par.name())
467
- elif roi_type == 'CircularROI':
468
- newroi = CircularROI(index=newindex, pos=pos,
469
- size=[width, height], name=par.name())
470
- newroi.setPen(par['Color'])
471
-
472
- newroi.sigRegionChangeFinished.connect(lambda: self.roi_changed.emit())
473
- newroi.index_signal[int].connect(self.update_roi_tree)
474
- try:
475
- self.settings.sigTreeStateChanged.disconnect()
476
- except Exception:
477
- pass
478
- self.settings.sigTreeStateChanged.connect(self.roi_tree_changed)
479
- self.viewer_widget.plotItem.addItem(newroi)
480
-
481
- self._set_roi_from_index(newindex, newroi)
482
-
483
- self.new_ROI_signal.emit(newindex, roi_type, par.name())
484
- self.update_roi_tree(newindex)
485
- self.emit_colors()
486
- self.roi_changed.emit()
487
-
488
- elif change == 'value':
489
- if param.name() in putils.iter_children(self.settings.child('ROIs'), []):
490
- parent_name = putils.get_param_path(param)[putils.get_param_path(param).index('ROIs')+1]
491
- self.update_roi(parent_name, param)
492
- self.roi_value_changed.emit(parent_name, (param, param.value()))
493
- if param.name() == 'Color':
494
- self.emit_colors()
495
-
496
- elif change == 'parent':
497
- if 'ROI' in param.name():
498
- roi = self._ROIs.pop(param.name())
499
- self.viewer_widget.plotItem.removeItem(roi)
500
- self.remove_ROI_signal.emit(param.name())
501
- self.emit_colors()
502
-
503
- def update_use_channel(self, channels: List[str]):
504
- channels.append('All')
505
- for ind in range(len(self)):
506
- val = self.settings['ROIs', self.roi_format(ind), 'use_channel']
507
- self.settings.child('ROIs', self.roi_format(ind), 'use_channel').setLimits(channels)
508
- if val not in channels:
509
- self.settings.child('ROIs', self.roi_format(ind), 'use_channel').setValue(channels[0])
510
-
511
- def update_roi(self, roi_key, param):
512
- self._ROIs[roi_key].index_signal[int].disconnect()
513
- if param.name() == 'Color':
514
- self._ROIs[roi_key].setPen(param.value())
515
- self.emit_colors()
516
- elif param.name() == 'left' or param.name() == 'x':
517
- pos = self._ROIs[roi_key].pos()
518
- poss = [param.value(), pos[1]]
519
- if self.settings.child('ROIs', roi_key, 'type').value() == '1D':
520
- poss.sort()
521
- self._ROIs[roi_key].setPos(poss)
522
-
523
- elif param.name() == 'right' or param.name() == 'y':
524
- pos = self._ROIs[roi_key].pos()
525
- poss = [pos[0], param.value()]
526
- if self.settings.child('ROIs', roi_key, 'type').value() == '1D':
527
- poss.sort()
528
- self._ROIs[roi_key].setPos(poss)
529
-
530
- elif param.name() == 'angle':
531
- self._ROIs[roi_key].setAngle(param.value(),center=[0.5,0.5])
532
- elif param.name() == 'width':
533
- size = self._ROIs[roi_key].size()
534
- self._ROIs[roi_key].setSize((param.value(), size[1]))
535
- elif param.name() == 'height':
536
- size = self._ROIs[roi_key].size()
537
- self._ROIs[roi_key].setSize((size[0], param.value()))
538
- self._ROIs[roi_key].index_signal[int].connect(self.update_roi_tree)
539
-
540
- @Slot(int)
541
- def update_roi_tree(self, index):
542
- roi = self.get_roi_from_index(index)
543
- par = self.settings.child(*('ROIs', self.roi_format(index)))
544
- if isinstance(roi, LinearROI):
545
- pos = roi.getRegion()
546
- else:
547
- pos = roi.pos()
548
- size = roi.size()
549
- angle = roi.angle()
550
-
551
- try:
552
- self.settings.sigTreeStateChanged.disconnect()
553
- except Exception:
554
- pass
555
- if isinstance(roi, LinearROI):
556
- par.child(*('position', 'left')).setValue(pos[0])
557
- par.child(*('position', 'right')).setValue(pos[1])
558
- if not isinstance(roi, LinearROI):
559
- par.child(*('position', 'x')).setValue(pos[0])
560
- par.child(*('position', 'y')).setValue(pos[1])
561
- par.child(*('size', 'width')).setValue(size[0])
562
- par.child(*('size', 'height')).setValue(size[1])
563
- par.child('angle').setValue(angle)
564
-
565
- self.settings.sigTreeStateChanged.connect(self.roi_tree_changed)
566
-
567
- def save_ROI(self):
568
-
569
- try:
570
- data = ioxml.parameter_to_xml_string(self.settings.child(('ROIs')))
571
- path = select_file(start_path=Path.home(), ext='xml', save=True, force_save_extension=True)
572
-
573
- if path != '':
574
- with open(path, 'wb') as f:
575
- f.write(data)
576
- except Exception as e:
577
- print(e)
578
-
579
- def clear_ROI(self):
580
- indexes = [roi.index for roi in self._ROIs.values()]
581
- for index in indexes:
582
- self.settings.child(*('ROIs', self.roi_format(index))).remove()
583
- # self.settings.sigTreeStateChanged.connect(self.roi_tree_changed)
584
-
585
- def load_ROI(self, path=None, params=None):
586
- try:
587
- if params is None:
588
- if path is None:
589
- path = select_file(start_path=Path.home(), save=False, ext='xml', filter='XML files (*.xml)')
590
- if path != '':
591
- params = Parameter.create(title='Settings', name='settings', type='group',
592
- children=ioxml.XML_file_to_parameter(path))
593
-
594
- if params is not None:
595
- self.clear_ROI()
596
- QtWidgets.QApplication.processEvents()
597
-
598
- for param in params:
599
- if 'roi_type' in putils.iter_children(param, []):
600
- self.settings.child('ROIs').addNew(param.child('roi_type').value())
601
- else:
602
- self.settings.child('ROIs').addNew()
603
- QtWidgets.QApplication.processEvents()
604
- self.set_roi(self.settings.child('ROIs').children(), params)
605
- except Exception as e:
606
- logger.exception(str(e))
607
-
608
- def set_roi(self, roi_params, roi_params_new):
609
- for child, new_child in zip(roi_params, roi_params_new):
610
- if 'group' not in child.opts['type']:
611
- child.setValue(new_child.value())
612
- else:
613
- self.set_roi(child.children(), new_child.children())
614
-
615
-
616
- class ROISaver:
617
- def __init__(self, msgbox=False, det_modules=[]):
618
-
619
- self.roi_presets = None
620
- self.detector_modules = det_modules
621
-
622
- if msgbox:
623
- msgBox = QtWidgets.QMessageBox()
624
- msgBox.setText("ROI Manager?")
625
- msgBox.setInformativeText("What do you want to do?")
626
- cancel_button = msgBox.addButton(QtWidgets.QMessageBox.Cancel)
627
- modify_button = msgBox.addButton('Modify', QtWidgets.QMessageBox.AcceptRole)
628
- msgBox.setDefaultButton(QtWidgets.QMessageBox.Cancel)
629
- ret = msgBox.exec()
630
-
631
- if msgBox.clickedButton() == modify_button:
632
- path = select_file(start_path=roi_path, save=False, ext='xml')
633
- if path != '':
634
- self.set_file_roi(str(path))
635
- else: # cancel
636
- pass
637
-
638
- def set_file_roi(self, filename, show=True):
639
- """
640
-
641
- """
642
-
643
- children = ioxml.XML_file_to_parameter(filename)
644
- self.roi_presets = Parameter.create(title='roi', name='rois', type='group', children=children)
645
-
646
- det_children = [child for child in self.roi_presets.children() if 'det' in child.opts['name']]
647
- det_names = [child.child('detname').value() for child in self.roi_presets.children() if
648
- 'det' in child.opts['name']]
649
- det_module_names = [det.title for det in self.detector_modules]
650
- for ind_det, det_roi in enumerate(det_children):
651
- det_module: DAQ_Viewer = self.detector_modules[det_module_names.index(det_names[ind_det])]
652
- viewer_children = [child for child in det_roi.children() if 'viewer' in child.opts['name']]
653
- for ind_viewer, viewer in enumerate(det_module.viewers):
654
- rois_params = [child for child in viewer_children[ind_viewer].children() if 'ROI' in child.opts['name']]
655
- if len(rois_params) > 0:
656
- if hasattr(viewer, 'roi_manager'):
657
- if hasattr(viewer, 'activate_roi'): # because for viewer 0D it is irrelevant
658
- viewer.activate_roi()
659
- viewer.roi_manager.load_ROI(params=rois_params)
660
- QtWidgets.QApplication.processEvents()
661
-
662
- if show:
663
- self.show_rois()
664
-
665
- def set_new_roi(self, file=None):
666
- if file is None:
667
- file = 'roi_default'
668
-
669
- self.roi_presets = Parameter.create(name='roi_settings', type='group', children=[
670
- {'title': 'Filename:', 'name': 'filename', 'type': 'str', 'value': file}, ])
671
-
672
- for ind_det, det in enumerate(self.detector_modules):
673
- det_param = Parameter.create(name=f'det_{ind_det:03d}', type='group', children=[
674
- {'title': 'Det Name:', 'name': 'detname', 'type': 'str', 'value': det.title}, ])
675
-
676
- for ind_viewer, viewer in enumerate(det.ui.viewers):
677
- viewer_param = Parameter.create(name=f'viewer_{ind_viewer:03d}', type='group', children=[
678
- {'title': 'Viewer:', 'name': 'viewername', 'type': 'str',
679
- 'value': det.ui.viewer_docks[ind_viewer].name()}, ])
680
-
681
- if hasattr(viewer, 'roi_manager'):
682
- viewer_param.addChild({'title': 'ROI type:', 'name': 'roi_type', 'type': 'str',
683
- 'value': viewer.roi_manager.settings.child('ROIs').roi_type})
684
- viewer_param.addChildren(viewer.roi_manager.settings.child('ROIs').children())
685
- det_param.addChild(viewer_param)
686
- self.roi_presets.addChild(det_param)
687
-
688
- ioxml.parameter_to_xml_file(self.roi_presets, os.path.join(roi_path, file))
689
- self.show_rois()
690
-
691
- def show_rois(self):
692
- """
693
-
694
- """
695
- dialog = QtWidgets.QDialog()
696
- vlayout = QtWidgets.QVBoxLayout()
697
- tree = ParameterTree()
698
- tree.setMinimumWidth(400)
699
- tree.setMinimumHeight(500)
700
- tree.setParameters(self.roi_presets, showTop=False)
701
-
702
- vlayout.addWidget(tree)
703
- dialog.setLayout(vlayout)
704
- buttonBox = QtWidgets.QDialogButtonBox(parent=dialog)
705
-
706
- buttonBox.addButton('Save', buttonBox.AcceptRole)
707
- buttonBox.accepted.connect(dialog.accept)
708
- buttonBox.addButton('Cancel', buttonBox.RejectRole)
709
- buttonBox.rejected.connect(dialog.reject)
710
-
711
- vlayout.addWidget(buttonBox)
712
- dialog.setWindowTitle('Fill in information about this manager')
713
- res = dialog.exec()
714
-
715
- if res == dialog.Accepted:
716
- # save managers parameters in a xml file
717
- # start = os.path.split(os.path.split(os.path.realpath(__file__))[0])[0]
718
- # start = os.path.join("..",'daq_scan')
719
- ioxml.parameter_to_xml_file(
720
- self.roi_presets, os.path.join(roi_path, self.roi_presets.child('filename').value()))
721
-
722
-
723
- if __name__ == '__main__':
724
- app = QtWidgets.QApplication(sys.argv)
725
- from pymodaq.utils.plotting.widgets import ImageWidget
726
- from pyqtgraph import PlotWidget
727
-
728
- im = ImageWidget()
729
- im = PlotWidget()
730
- prog = ROIManager(im, '2D')
731
- widget = QtWidgets.QWidget()
732
- layout = QtWidgets.QHBoxLayout()
733
- widget.setLayout(layout)
734
- layout.addWidget(im)
735
- layout.addWidget(prog.roiwidget)
736
- widget.show()
737
- prog.add_roi_programmatically(ROI2D_TYPES[0])
738
- prog.add_roi_programmatically(ROI2D_TYPES[1])
739
- prog.add_roi_programmatically(ROI2D_TYPES[2])
740
- sys.exit(app.exec_())