datalab-platform 0.0.1.dev0__py3-none-any.whl → 1.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.
Files changed (496) hide show
  1. datalab/__init__.py +35 -2
  2. datalab/adapters_metadata/__init__.py +31 -0
  3. datalab/adapters_metadata/base_adapter.py +316 -0
  4. datalab/adapters_metadata/common.py +422 -0
  5. datalab/adapters_metadata/geometry_adapter.py +98 -0
  6. datalab/adapters_metadata/table_adapter.py +84 -0
  7. datalab/adapters_plotpy/__init__.py +54 -0
  8. datalab/adapters_plotpy/annotations.py +124 -0
  9. datalab/adapters_plotpy/base.py +110 -0
  10. datalab/adapters_plotpy/converters.py +86 -0
  11. datalab/adapters_plotpy/factories.py +80 -0
  12. datalab/adapters_plotpy/objects/__init__.py +0 -0
  13. datalab/adapters_plotpy/objects/base.py +197 -0
  14. datalab/adapters_plotpy/objects/image.py +157 -0
  15. datalab/adapters_plotpy/objects/scalar.py +565 -0
  16. datalab/adapters_plotpy/objects/signal.py +264 -0
  17. datalab/adapters_plotpy/roi/__init__.py +0 -0
  18. datalab/adapters_plotpy/roi/base.py +146 -0
  19. datalab/adapters_plotpy/roi/factory.py +93 -0
  20. datalab/adapters_plotpy/roi/image.py +207 -0
  21. datalab/adapters_plotpy/roi/signal.py +72 -0
  22. datalab/app.py +98 -0
  23. datalab/config.py +817 -0
  24. datalab/control/__init__.py +0 -0
  25. datalab/control/baseproxy.py +776 -0
  26. datalab/control/proxy.py +343 -0
  27. datalab/control/remote.py +1005 -0
  28. datalab/data/doc/DataLab_en.pdf +0 -0
  29. datalab/data/doc/DataLab_fr.pdf +0 -0
  30. datalab/data/icons/analysis/delete_results.svg +109 -0
  31. datalab/data/icons/analysis/fw1e2.svg +156 -0
  32. datalab/data/icons/analysis/fwhm.svg +156 -0
  33. datalab/data/icons/analysis/histogram.svg +49 -0
  34. datalab/data/icons/analysis/peak_detect.svg +160 -0
  35. datalab/data/icons/analysis/plot_results.svg +151 -0
  36. datalab/data/icons/analysis/show_results.svg +83 -0
  37. datalab/data/icons/analysis/stats.svg +49 -0
  38. datalab/data/icons/analysis.svg +120 -0
  39. datalab/data/icons/apply.svg +3 -0
  40. datalab/data/icons/check_all.svg +15 -0
  41. datalab/data/icons/collapse.svg +44 -0
  42. datalab/data/icons/collapse_selection.svg +63 -0
  43. datalab/data/icons/console.svg +101 -0
  44. datalab/data/icons/create/1d-normal.svg +8 -0
  45. datalab/data/icons/create/1d-poisson.svg +9 -0
  46. datalab/data/icons/create/1d-uniform.svg +8 -0
  47. datalab/data/icons/create/1d-zero.svg +57 -0
  48. datalab/data/icons/create/2d-gaussian.svg +56 -0
  49. datalab/data/icons/create/2d-normal.svg +38 -0
  50. datalab/data/icons/create/2d-poisson.svg +38 -0
  51. datalab/data/icons/create/2d-ramp.svg +90 -0
  52. datalab/data/icons/create/2d-sinc.svg +62 -0
  53. datalab/data/icons/create/2d-uniform.svg +38 -0
  54. datalab/data/icons/create/2d-zero.svg +13 -0
  55. datalab/data/icons/create/checkerboard.svg +39 -0
  56. datalab/data/icons/create/cosine.svg +12 -0
  57. datalab/data/icons/create/exponential.svg +55 -0
  58. datalab/data/icons/create/gaussian.svg +12 -0
  59. datalab/data/icons/create/grating.svg +29 -0
  60. datalab/data/icons/create/linear_chirp.svg +7 -0
  61. datalab/data/icons/create/logistic.svg +7 -0
  62. datalab/data/icons/create/lorentzian.svg +12 -0
  63. datalab/data/icons/create/planck.svg +12 -0
  64. datalab/data/icons/create/polynomial.svg +7 -0
  65. datalab/data/icons/create/pulse.svg +12 -0
  66. datalab/data/icons/create/ring.svg +18 -0
  67. datalab/data/icons/create/sawtooth.svg +7 -0
  68. datalab/data/icons/create/siemens.svg +35 -0
  69. datalab/data/icons/create/sinc.svg +12 -0
  70. datalab/data/icons/create/sine.svg +7 -0
  71. datalab/data/icons/create/square.svg +7 -0
  72. datalab/data/icons/create/square_pulse.svg +7 -0
  73. datalab/data/icons/create/step.svg +7 -0
  74. datalab/data/icons/create/step_pulse.svg +12 -0
  75. datalab/data/icons/create/triangle.svg +7 -0
  76. datalab/data/icons/create/voigt.svg +12 -0
  77. datalab/data/icons/edit/annotations.svg +72 -0
  78. datalab/data/icons/edit/annotations_copy.svg +114 -0
  79. datalab/data/icons/edit/annotations_delete.svg +83 -0
  80. datalab/data/icons/edit/annotations_edit.svg +98 -0
  81. datalab/data/icons/edit/annotations_export.svg +85 -0
  82. datalab/data/icons/edit/annotations_import.svg +85 -0
  83. datalab/data/icons/edit/annotations_paste.svg +100 -0
  84. datalab/data/icons/edit/copy_titles.svg +109 -0
  85. datalab/data/icons/edit/delete.svg +84 -0
  86. datalab/data/icons/edit/delete_all.svg +214 -0
  87. datalab/data/icons/edit/duplicate.svg +64 -0
  88. datalab/data/icons/edit/goto_source.svg +60 -0
  89. datalab/data/icons/edit/metadata.svg +60 -0
  90. datalab/data/icons/edit/metadata_add.svg +80 -0
  91. datalab/data/icons/edit/metadata_copy.svg +96 -0
  92. datalab/data/icons/edit/metadata_delete.svg +62 -0
  93. datalab/data/icons/edit/metadata_export.svg +68 -0
  94. datalab/data/icons/edit/metadata_import.svg +68 -0
  95. datalab/data/icons/edit/metadata_paste.svg +79 -0
  96. datalab/data/icons/edit/move_down.svg +55 -0
  97. datalab/data/icons/edit/move_up.svg +54 -0
  98. datalab/data/icons/edit/new_group.svg +76 -0
  99. datalab/data/icons/edit/recompute.svg +60 -0
  100. datalab/data/icons/edit/rename.svg +49 -0
  101. datalab/data/icons/edit.svg +16 -0
  102. datalab/data/icons/expand.svg +44 -0
  103. datalab/data/icons/expand_selection.svg +63 -0
  104. datalab/data/icons/fit/cdf_fit.svg +56 -0
  105. datalab/data/icons/fit/exponential_fit.svg +55 -0
  106. datalab/data/icons/fit/gaussian_fit.svg +62 -0
  107. datalab/data/icons/fit/interactive_fit.svg +101 -0
  108. datalab/data/icons/fit/linear_fit.svg +57 -0
  109. datalab/data/icons/fit/lorentzian_fit.svg +209 -0
  110. datalab/data/icons/fit/multigaussian_fit.svg +85 -0
  111. datalab/data/icons/fit/multilorentzian_fit.svg +85 -0
  112. datalab/data/icons/fit/piecewiseexponential_fit.svg +209 -0
  113. datalab/data/icons/fit/planckian_fit.svg +62 -0
  114. datalab/data/icons/fit/polynomial_fit.svg +59 -0
  115. datalab/data/icons/fit/sigmoid_fit.svg +56 -0
  116. datalab/data/icons/fit/sinusoidal_fit.svg +72 -0
  117. datalab/data/icons/fit/twohalfgaussian_fit.svg +63 -0
  118. datalab/data/icons/fit/voigt_fit.svg +57 -0
  119. datalab/data/icons/group.svg +56 -0
  120. datalab/data/icons/h5/h5array.svg +59 -0
  121. datalab/data/icons/h5/h5attrs.svg +75 -0
  122. datalab/data/icons/h5/h5browser.svg +133 -0
  123. datalab/data/icons/h5/h5file.svg +69 -0
  124. datalab/data/icons/h5/h5group.svg +49 -0
  125. datalab/data/icons/h5/h5scalar.svg +1 -0
  126. datalab/data/icons/help_pdf.svg +46 -0
  127. datalab/data/icons/history.svg +7 -0
  128. datalab/data/icons/image.svg +135 -0
  129. datalab/data/icons/io/fileopen_directory.svg +60 -0
  130. datalab/data/icons/io/fileopen_h5.svg +84 -0
  131. datalab/data/icons/io/fileopen_ima.svg +187 -0
  132. datalab/data/icons/io/fileopen_py.svg +123 -0
  133. datalab/data/icons/io/fileopen_sig.svg +138 -0
  134. datalab/data/icons/io/filesave_h5.svg +97 -0
  135. datalab/data/icons/io/filesave_ima.svg +200 -0
  136. datalab/data/icons/io/filesave_py.svg +136 -0
  137. datalab/data/icons/io/filesave_sig.svg +151 -0
  138. datalab/data/icons/io/import_text.svg +144 -0
  139. datalab/data/icons/io/save_to_directory.svg +134 -0
  140. datalab/data/icons/io.svg +84 -0
  141. datalab/data/icons/libre-camera-flash-off.svg +1 -0
  142. datalab/data/icons/libre-camera-flash-on.svg +1 -0
  143. datalab/data/icons/libre-gui-about.svg +1 -0
  144. datalab/data/icons/libre-gui-action-delete.svg +1 -0
  145. datalab/data/icons/libre-gui-add.svg +1 -0
  146. datalab/data/icons/libre-gui-arrow-down.svg +1 -0
  147. datalab/data/icons/libre-gui-arrow-left.svg +1 -0
  148. datalab/data/icons/libre-gui-arrow-right.svg +1 -0
  149. datalab/data/icons/libre-gui-arrow-up.svg +1 -0
  150. datalab/data/icons/libre-gui-close.svg +40 -0
  151. datalab/data/icons/libre-gui-cogs.svg +1 -0
  152. datalab/data/icons/libre-gui-globe.svg +1 -0
  153. datalab/data/icons/libre-gui-help.svg +1 -0
  154. datalab/data/icons/libre-gui-link.svg +1 -0
  155. datalab/data/icons/libre-gui-menu.svg +1 -0
  156. datalab/data/icons/libre-gui-pencil.svg +1 -0
  157. datalab/data/icons/libre-gui-plugin.svg +1 -0
  158. datalab/data/icons/libre-gui-questions.svg +1 -0
  159. datalab/data/icons/libre-gui-settings.svg +1 -0
  160. datalab/data/icons/libre-gui-unlink.svg +1 -0
  161. datalab/data/icons/libre-tech-ram.svg +1 -0
  162. datalab/data/icons/libre-toolbox.svg +1 -0
  163. datalab/data/icons/logs.svg +1 -0
  164. datalab/data/icons/markers.svg +74 -0
  165. datalab/data/icons/menu.svg +13 -0
  166. datalab/data/icons/new_ima.svg +148 -0
  167. datalab/data/icons/new_sig.svg +123 -0
  168. datalab/data/icons/operations/abs.svg +116 -0
  169. datalab/data/icons/operations/arithmetic.svg +123 -0
  170. datalab/data/icons/operations/average.svg +124 -0
  171. datalab/data/icons/operations/complex_from_magnitude_phase.svg +116 -0
  172. datalab/data/icons/operations/complex_from_real_imag.svg +124 -0
  173. datalab/data/icons/operations/constant.svg +116 -0
  174. datalab/data/icons/operations/constant_add.svg +109 -0
  175. datalab/data/icons/operations/constant_divide.svg +109 -0
  176. datalab/data/icons/operations/constant_multiply.svg +109 -0
  177. datalab/data/icons/operations/constant_subtract.svg +109 -0
  178. datalab/data/icons/operations/convert_dtype.svg +117 -0
  179. datalab/data/icons/operations/convolution.svg +46 -0
  180. datalab/data/icons/operations/deconvolution.svg +57 -0
  181. datalab/data/icons/operations/derivative.svg +127 -0
  182. datalab/data/icons/operations/difference.svg +52 -0
  183. datalab/data/icons/operations/division.svg +139 -0
  184. datalab/data/icons/operations/exp.svg +116 -0
  185. datalab/data/icons/operations/flip_horizontally.svg +69 -0
  186. datalab/data/icons/operations/flip_vertically.svg +74 -0
  187. datalab/data/icons/operations/im.svg +124 -0
  188. datalab/data/icons/operations/integral.svg +50 -0
  189. datalab/data/icons/operations/inverse.svg +143 -0
  190. datalab/data/icons/operations/log10.svg +109 -0
  191. datalab/data/icons/operations/phase.svg +116 -0
  192. datalab/data/icons/operations/power.svg +118 -0
  193. datalab/data/icons/operations/product.svg +124 -0
  194. datalab/data/icons/operations/profile.svg +379 -0
  195. datalab/data/icons/operations/profile_average.svg +399 -0
  196. datalab/data/icons/operations/profile_radial.svg +261 -0
  197. datalab/data/icons/operations/profile_segment.svg +262 -0
  198. datalab/data/icons/operations/quadratic_difference.svg +84 -0
  199. datalab/data/icons/operations/re.svg +124 -0
  200. datalab/data/icons/operations/rotate_left.svg +72 -0
  201. datalab/data/icons/operations/rotate_right.svg +72 -0
  202. datalab/data/icons/operations/signals_to_image.svg +314 -0
  203. datalab/data/icons/operations/sqrt.svg +110 -0
  204. datalab/data/icons/operations/std.svg +124 -0
  205. datalab/data/icons/operations/sum.svg +102 -0
  206. datalab/data/icons/play_demo.svg +9 -0
  207. datalab/data/icons/processing/axis_transform.svg +62 -0
  208. datalab/data/icons/processing/bandpass.svg +79 -0
  209. datalab/data/icons/processing/bandstop.svg +71 -0
  210. datalab/data/icons/processing/binning.svg +126 -0
  211. datalab/data/icons/processing/clip.svg +119 -0
  212. datalab/data/icons/processing/detrending.svg +173 -0
  213. datalab/data/icons/processing/distribute_on_grid.svg +769 -0
  214. datalab/data/icons/processing/edge_detection.svg +46 -0
  215. datalab/data/icons/processing/erase.svg +1 -0
  216. datalab/data/icons/processing/exposure.svg +143 -0
  217. datalab/data/icons/processing/fourier.svg +104 -0
  218. datalab/data/icons/processing/highpass.svg +59 -0
  219. datalab/data/icons/processing/interpolation.svg +71 -0
  220. datalab/data/icons/processing/level_adjustment.svg +70 -0
  221. datalab/data/icons/processing/lowpass.svg +60 -0
  222. datalab/data/icons/processing/morphology.svg +49 -0
  223. datalab/data/icons/processing/noise_addition.svg +114 -0
  224. datalab/data/icons/processing/noise_reduction.svg +38 -0
  225. datalab/data/icons/processing/normalize.svg +84 -0
  226. datalab/data/icons/processing/offset_correction.svg +131 -0
  227. datalab/data/icons/processing/resampling1d.svg +101 -0
  228. datalab/data/icons/processing/resampling2d.svg +240 -0
  229. datalab/data/icons/processing/reset_positions.svg +185 -0
  230. datalab/data/icons/processing/resize.svg +9 -0
  231. datalab/data/icons/processing/reverse_signal_x.svg +171 -0
  232. datalab/data/icons/processing/stability.svg +11 -0
  233. datalab/data/icons/processing/swap_x_y.svg +65 -0
  234. datalab/data/icons/processing/thresholding.svg +63 -0
  235. datalab/data/icons/processing/windowing.svg +45 -0
  236. datalab/data/icons/properties.svg +26 -0
  237. datalab/data/icons/reset.svg +9 -0
  238. datalab/data/icons/restore.svg +40 -0
  239. datalab/data/icons/roi/roi.svg +76 -0
  240. datalab/data/icons/roi/roi_coordinate.svg +78 -0
  241. datalab/data/icons/roi/roi_copy.svg +112 -0
  242. datalab/data/icons/roi/roi_delete.svg +81 -0
  243. datalab/data/icons/roi/roi_export.svg +87 -0
  244. datalab/data/icons/roi/roi_graphical.svg +78 -0
  245. datalab/data/icons/roi/roi_grid.svg +67 -0
  246. datalab/data/icons/roi/roi_ima.svg +188 -0
  247. datalab/data/icons/roi/roi_import.svg +87 -0
  248. datalab/data/icons/roi/roi_new.svg +81 -0
  249. datalab/data/icons/roi/roi_new_circle.svg +95 -0
  250. datalab/data/icons/roi/roi_new_polygon.svg +110 -0
  251. datalab/data/icons/roi/roi_new_rectangle.svg +70 -0
  252. datalab/data/icons/roi/roi_paste.svg +98 -0
  253. datalab/data/icons/roi/roi_sig.svg +124 -0
  254. datalab/data/icons/shapes.svg +134 -0
  255. datalab/data/icons/signal.svg +103 -0
  256. datalab/data/icons/table.svg +85 -0
  257. datalab/data/icons/table_unavailable.svg +102 -0
  258. datalab/data/icons/to_signal.svg +124 -0
  259. datalab/data/icons/tour/next.svg +44 -0
  260. datalab/data/icons/tour/previous.svg +44 -0
  261. datalab/data/icons/tour/rewind.svg +51 -0
  262. datalab/data/icons/tour/stop.svg +47 -0
  263. datalab/data/icons/tour/tour.svg +16 -0
  264. datalab/data/icons/uncheck_all.svg +78 -0
  265. datalab/data/icons/view/curve_antialiasing.svg +50 -0
  266. datalab/data/icons/view/new_window.svg +98 -0
  267. datalab/data/icons/view/refresh-auto.svg +57 -0
  268. datalab/data/icons/view/refresh-manual.svg +51 -0
  269. datalab/data/icons/view/reset_curve_styles.svg +96 -0
  270. datalab/data/icons/view/show_first.svg +55 -0
  271. datalab/data/icons/view/show_titles.svg +46 -0
  272. datalab/data/icons/visualization.svg +51 -0
  273. datalab/data/logo/DataLab-Banner-150.png +0 -0
  274. datalab/data/logo/DataLab-Banner-200.png +0 -0
  275. datalab/data/logo/DataLab-Banner2-100.png +0 -0
  276. datalab/data/logo/DataLab-Splash.png +0 -0
  277. datalab/data/logo/DataLab-watermark.png +0 -0
  278. datalab/data/logo/DataLab.svg +83 -0
  279. datalab/data/tests/reordering_test.h5 +0 -0
  280. datalab/data/tutorials/fabry_perot/fabry-perot1.jpg +0 -0
  281. datalab/data/tutorials/fabry_perot/fabry-perot2.jpg +0 -0
  282. datalab/data/tutorials/laser_beam/TEM00_z_13.jpg +0 -0
  283. datalab/data/tutorials/laser_beam/TEM00_z_18.jpg +0 -0
  284. datalab/data/tutorials/laser_beam/TEM00_z_23.jpg +0 -0
  285. datalab/data/tutorials/laser_beam/TEM00_z_30.jpg +0 -0
  286. datalab/data/tutorials/laser_beam/TEM00_z_35.jpg +0 -0
  287. datalab/data/tutorials/laser_beam/TEM00_z_40.jpg +0 -0
  288. datalab/data/tutorials/laser_beam/TEM00_z_45.jpg +0 -0
  289. datalab/data/tutorials/laser_beam/TEM00_z_50.jpg +0 -0
  290. datalab/data/tutorials/laser_beam/TEM00_z_55.jpg +0 -0
  291. datalab/data/tutorials/laser_beam/TEM00_z_60.jpg +0 -0
  292. datalab/data/tutorials/laser_beam/TEM00_z_65.jpg +0 -0
  293. datalab/data/tutorials/laser_beam/TEM00_z_70.jpg +0 -0
  294. datalab/data/tutorials/laser_beam/TEM00_z_75.jpg +0 -0
  295. datalab/data/tutorials/laser_beam/TEM00_z_80.jpg +0 -0
  296. datalab/env.py +542 -0
  297. datalab/gui/__init__.py +89 -0
  298. datalab/gui/actionhandler.py +1701 -0
  299. datalab/gui/docks.py +473 -0
  300. datalab/gui/h5io.py +150 -0
  301. datalab/gui/macroeditor.py +310 -0
  302. datalab/gui/main.py +2081 -0
  303. datalab/gui/newobject.py +217 -0
  304. datalab/gui/objectview.py +766 -0
  305. datalab/gui/panel/__init__.py +48 -0
  306. datalab/gui/panel/base.py +3254 -0
  307. datalab/gui/panel/image.py +157 -0
  308. datalab/gui/panel/macro.py +607 -0
  309. datalab/gui/panel/signal.py +164 -0
  310. datalab/gui/plothandler.py +800 -0
  311. datalab/gui/processor/__init__.py +84 -0
  312. datalab/gui/processor/base.py +2456 -0
  313. datalab/gui/processor/catcher.py +75 -0
  314. datalab/gui/processor/image.py +1214 -0
  315. datalab/gui/processor/signal.py +755 -0
  316. datalab/gui/profiledialog.py +333 -0
  317. datalab/gui/roieditor.py +633 -0
  318. datalab/gui/roigrideditor.py +208 -0
  319. datalab/gui/settings.py +612 -0
  320. datalab/gui/tour.py +908 -0
  321. datalab/h5/__init__.py +12 -0
  322. datalab/h5/common.py +314 -0
  323. datalab/h5/generic.py +580 -0
  324. datalab/h5/native.py +39 -0
  325. datalab/h5/utils.py +95 -0
  326. datalab/objectmodel.py +640 -0
  327. datalab/plugins/_readme_.txt +9 -0
  328. datalab/plugins/datalab_imageformats.py +175 -0
  329. datalab/plugins/datalab_testdata.py +190 -0
  330. datalab/plugins.py +355 -0
  331. datalab/tests/__init__.py +199 -0
  332. datalab/tests/backbone/__init__.py +1 -0
  333. datalab/tests/backbone/config_unit_test.py +170 -0
  334. datalab/tests/backbone/config_versioning_unit_test.py +34 -0
  335. datalab/tests/backbone/dictlistserial_app_test.py +38 -0
  336. datalab/tests/backbone/errorcatcher_unit_test.py +69 -0
  337. datalab/tests/backbone/errormsgbox_unit_test.py +50 -0
  338. datalab/tests/backbone/execenv_unit.py +262 -0
  339. datalab/tests/backbone/loadtest_gdi.py +147 -0
  340. datalab/tests/backbone/long_callback.py +96 -0
  341. datalab/tests/backbone/main_app_test.py +137 -0
  342. datalab/tests/backbone/memory_leak.py +43 -0
  343. datalab/tests/backbone/procisolation1_unit.py +128 -0
  344. datalab/tests/backbone/procisolation2_unit.py +171 -0
  345. datalab/tests/backbone/procisolation_unit_test.py +22 -0
  346. datalab/tests/backbone/profiling_app.py +27 -0
  347. datalab/tests/backbone/strings_unit_test.py +65 -0
  348. datalab/tests/backbone/title_formatting_unit_test.py +82 -0
  349. datalab/tests/conftest.py +131 -0
  350. datalab/tests/features/__init__.py +1 -0
  351. datalab/tests/features/applauncher/__init__.py +1 -0
  352. datalab/tests/features/applauncher/launcher1_app_test.py +28 -0
  353. datalab/tests/features/applauncher/launcher2_app_test.py +30 -0
  354. datalab/tests/features/common/__init__.py +1 -0
  355. datalab/tests/features/common/add_metadata_app_test.py +134 -0
  356. datalab/tests/features/common/add_metadata_unit_test.py +267 -0
  357. datalab/tests/features/common/annotations_management_unit_test.py +152 -0
  358. datalab/tests/features/common/auto_analysis_recompute_unit_test.py +240 -0
  359. datalab/tests/features/common/createobject_unit_test.py +50 -0
  360. datalab/tests/features/common/geometry_results_app_test.py +135 -0
  361. datalab/tests/features/common/interactive_processing_test.py +1109 -0
  362. datalab/tests/features/common/io_app_test.py +75 -0
  363. datalab/tests/features/common/large_results_app_test.py +187 -0
  364. datalab/tests/features/common/metadata_all_patterns_test.py +103 -0
  365. datalab/tests/features/common/metadata_app_test.py +139 -0
  366. datalab/tests/features/common/metadata_io_unit_test.py +60 -0
  367. datalab/tests/features/common/misc_app_test.py +236 -0
  368. datalab/tests/features/common/multiple_geometry_results_unit_test.py +122 -0
  369. datalab/tests/features/common/multiple_table_results_unit_test.py +64 -0
  370. datalab/tests/features/common/operation_modes_app_test.py +392 -0
  371. datalab/tests/features/common/plot_results_app_test.py +278 -0
  372. datalab/tests/features/common/reorder_app_test.py +75 -0
  373. datalab/tests/features/common/result_deletion_unit_test.py +96 -0
  374. datalab/tests/features/common/result_merged_label_unit_test.py +154 -0
  375. datalab/tests/features/common/result_shape_settings_unit_test.py +223 -0
  376. datalab/tests/features/common/roi_plotitem_unit_test.py +64 -0
  377. datalab/tests/features/common/roieditor_unit_test.py +102 -0
  378. datalab/tests/features/common/save_to_dir_app_test.py +163 -0
  379. datalab/tests/features/common/save_to_dir_unit_test.py +474 -0
  380. datalab/tests/features/common/stat_app_test.py +40 -0
  381. datalab/tests/features/common/stats_tools_unit_test.py +77 -0
  382. datalab/tests/features/common/table_results_app_test.py +52 -0
  383. datalab/tests/features/common/textimport_unit_test.py +131 -0
  384. datalab/tests/features/common/uuid_preservation_test.py +281 -0
  385. datalab/tests/features/common/worker_unit_test.py +402 -0
  386. datalab/tests/features/control/__init__.py +1 -0
  387. datalab/tests/features/control/connect_dialog.py +28 -0
  388. datalab/tests/features/control/embedded1_unit_test.py +304 -0
  389. datalab/tests/features/control/embedded2_unit_test.py +52 -0
  390. datalab/tests/features/control/remoteclient_app_test.py +219 -0
  391. datalab/tests/features/control/remoteclient_unit.py +75 -0
  392. datalab/tests/features/control/simpleclient_unit_test.py +321 -0
  393. datalab/tests/features/hdf5/__init__.py +1 -0
  394. datalab/tests/features/hdf5/h5browser1_unit_test.py +31 -0
  395. datalab/tests/features/hdf5/h5browser2_unit.py +55 -0
  396. datalab/tests/features/hdf5/h5browser_app_test.py +77 -0
  397. datalab/tests/features/hdf5/h5import_app_test.py +25 -0
  398. datalab/tests/features/hdf5/h5importer_app_test.py +34 -0
  399. datalab/tests/features/image/__init__.py +1 -0
  400. datalab/tests/features/image/annotations_app_test.py +28 -0
  401. datalab/tests/features/image/annotations_unit_test.py +80 -0
  402. datalab/tests/features/image/average_app_test.py +46 -0
  403. datalab/tests/features/image/background_dialog_test.py +70 -0
  404. datalab/tests/features/image/blobs_app_test.py +50 -0
  405. datalab/tests/features/image/contour_app_test.py +42 -0
  406. datalab/tests/features/image/contour_fabryperot_app_test.py +51 -0
  407. datalab/tests/features/image/denoise_app_test.py +31 -0
  408. datalab/tests/features/image/distribute_on_grid_app_test.py +95 -0
  409. datalab/tests/features/image/edges_app_test.py +31 -0
  410. datalab/tests/features/image/erase_app_test.py +21 -0
  411. datalab/tests/features/image/fft2d_app_test.py +27 -0
  412. datalab/tests/features/image/flatfield_app_test.py +40 -0
  413. datalab/tests/features/image/geometry_transform_unit_test.py +396 -0
  414. datalab/tests/features/image/imagetools_app_test.py +51 -0
  415. datalab/tests/features/image/imagetools_unit_test.py +27 -0
  416. datalab/tests/features/image/load_app_test.py +73 -0
  417. datalab/tests/features/image/morph_app_test.py +32 -0
  418. datalab/tests/features/image/offsetcorrection_app_test.py +30 -0
  419. datalab/tests/features/image/peak2d_app_test.py +53 -0
  420. datalab/tests/features/image/profile_app_test.py +73 -0
  421. datalab/tests/features/image/profile_dialog_test.py +56 -0
  422. datalab/tests/features/image/roi_app_test.py +98 -0
  423. datalab/tests/features/image/roi_circ_app_test.py +62 -0
  424. datalab/tests/features/image/roi_manipulation_app_test.py +268 -0
  425. datalab/tests/features/image/roigrid_unit_test.py +60 -0
  426. datalab/tests/features/image/side_by_side_app_test.py +52 -0
  427. datalab/tests/features/macro/__init__.py +1 -0
  428. datalab/tests/features/macro/macro_app_test.py +28 -0
  429. datalab/tests/features/macro/macroeditor_unit_test.py +102 -0
  430. datalab/tests/features/signal/__init__.py +1 -0
  431. datalab/tests/features/signal/baseline_dialog_test.py +53 -0
  432. datalab/tests/features/signal/deltax_dialog_unit_test.py +34 -0
  433. datalab/tests/features/signal/fft1d_app_test.py +26 -0
  434. datalab/tests/features/signal/filter_app_test.py +44 -0
  435. datalab/tests/features/signal/fitdialog_unit_test.py +50 -0
  436. datalab/tests/features/signal/interpolation_app_test.py +110 -0
  437. datalab/tests/features/signal/loadbigsignal_app_test.py +80 -0
  438. datalab/tests/features/signal/multiple_rois_unit_test.py +132 -0
  439. datalab/tests/features/signal/pulse_features_app_test.py +118 -0
  440. datalab/tests/features/signal/pulse_features_roi_app_test.py +55 -0
  441. datalab/tests/features/signal/roi_app_test.py +78 -0
  442. datalab/tests/features/signal/roi_manipulation_app_test.py +261 -0
  443. datalab/tests/features/signal/select_xy_cursor_unit_test.py +46 -0
  444. datalab/tests/features/signal/signalpeakdetection_dialog_test.py +33 -0
  445. datalab/tests/features/signal/signals_to_image_app_test.py +98 -0
  446. datalab/tests/features/signal/xarray_compat_app_test.py +128 -0
  447. datalab/tests/features/tour_unit_test.py +22 -0
  448. datalab/tests/features/utilities/__init__.py +1 -0
  449. datalab/tests/features/utilities/installconf_unit_test.py +21 -0
  450. datalab/tests/features/utilities/logview_app_test.py +21 -0
  451. datalab/tests/features/utilities/logview_error.py +24 -0
  452. datalab/tests/features/utilities/logview_unit_test.py +21 -0
  453. datalab/tests/features/utilities/memstatus_app_test.py +42 -0
  454. datalab/tests/features/utilities/settings_unit_test.py +88 -0
  455. datalab/tests/scenarios/__init__.py +1 -0
  456. datalab/tests/scenarios/beautiful_app.py +121 -0
  457. datalab/tests/scenarios/common.py +463 -0
  458. datalab/tests/scenarios/demo.py +212 -0
  459. datalab/tests/scenarios/example_app_test.py +47 -0
  460. datalab/tests/scenarios/scenario_h5_app_test.py +75 -0
  461. datalab/tests/scenarios/scenario_ima1_app_test.py +34 -0
  462. datalab/tests/scenarios/scenario_ima2_app_test.py +34 -0
  463. datalab/tests/scenarios/scenario_mac_app_test.py +58 -0
  464. datalab/tests/scenarios/scenario_sig1_app_test.py +36 -0
  465. datalab/tests/scenarios/scenario_sig2_app_test.py +35 -0
  466. datalab/utils/__init__.py +1 -0
  467. datalab/utils/conf.py +304 -0
  468. datalab/utils/dephash.py +105 -0
  469. datalab/utils/qthelpers.py +633 -0
  470. datalab/utils/strings.py +34 -0
  471. datalab/utils/tests.py +0 -0
  472. datalab/widgets/__init__.py +1 -0
  473. datalab/widgets/connection.py +138 -0
  474. datalab/widgets/filedialog.py +91 -0
  475. datalab/widgets/fileviewer.py +84 -0
  476. datalab/widgets/fitdialog.py +788 -0
  477. datalab/widgets/h5browser.py +1048 -0
  478. datalab/widgets/imagebackground.py +111 -0
  479. datalab/widgets/instconfviewer.py +175 -0
  480. datalab/widgets/logviewer.py +80 -0
  481. datalab/widgets/signalbaseline.py +90 -0
  482. datalab/widgets/signalcursor.py +208 -0
  483. datalab/widgets/signaldeltax.py +151 -0
  484. datalab/widgets/signalpeak.py +199 -0
  485. datalab/widgets/status.py +249 -0
  486. datalab/widgets/textimport.py +786 -0
  487. datalab/widgets/warningerror.py +223 -0
  488. datalab/widgets/wizard.py +286 -0
  489. datalab_platform-1.0.1.dist-info/METADATA +121 -0
  490. datalab_platform-1.0.1.dist-info/RECORD +494 -0
  491. datalab_platform-0.0.1.dev0.dist-info/METADATA +0 -67
  492. datalab_platform-0.0.1.dev0.dist-info/RECORD +0 -7
  493. {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/WHEEL +0 -0
  494. {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/entry_points.txt +0 -0
  495. {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/licenses/LICENSE +0 -0
  496. {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,776 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ DataLab base proxy module
5
+ -------------------------
6
+ """
7
+
8
+ # How to add a new method to the proxy:
9
+ # -------------------------------------
10
+ #
11
+ # 1. Add the method to the AbstractDLControl class, as an abstract method
12
+ #
13
+ # 2a. If the method requires any data conversion to get through the XML-RPC layer,
14
+ # implement the method in both LocalProxy and RemoteClient classes
15
+ #
16
+ # 2b. If the method does not require any data conversion, implement the method
17
+ # directly in the BaseProxy class, so that it is available to both LocalProxy
18
+ # and RemoteClient classes without any code duplication
19
+ #
20
+ # 3. Implement the method in the DLMainWindow class
21
+ #
22
+ # 4. Implement the method in the RemoteServer class (it will be automatically
23
+ # registered as an XML-RPC method, like all methods of AbstractDLControl)
24
+
25
+ from __future__ import annotations
26
+
27
+ import abc
28
+ from contextlib import contextmanager
29
+ from typing import TYPE_CHECKING, Generator
30
+
31
+ import guidata.dataset as gds
32
+ import numpy as np
33
+ from sigima import ImageObj, SignalObj
34
+
35
+ if TYPE_CHECKING:
36
+ from collections.abc import Iterator
37
+
38
+ from datalab.control.remote import ServerProxy
39
+ from datalab.gui.main import DLMainWindow
40
+
41
+
42
+ class AbstractDLControl(abc.ABC):
43
+ """Abstract base class for controlling DataLab (main window or remote server)"""
44
+
45
+ def __len__(self) -> int:
46
+ """Return number of objects"""
47
+ return len(self.get_object_uuids())
48
+
49
+ def __getitem__(self, nb_id_title: int | str | None = None) -> SignalObj | ImageObj:
50
+ """Return object"""
51
+ return self.get_object(nb_id_title)
52
+
53
+ def __iter__(self) -> Iterator[SignalObj | ImageObj]:
54
+ """Iterate over objects"""
55
+ uuids = self.get_object_uuids()
56
+ for uuid in uuids:
57
+ yield self.get_object(uuid)
58
+
59
+ def __str__(self) -> str:
60
+ """Return object string representation"""
61
+ return super().__repr__()
62
+
63
+ def __repr__(self) -> str:
64
+ """Return object representation"""
65
+ titles = self.get_object_titles()
66
+ uuids = self.get_object_uuids()
67
+ text = f"{str(self)} (DataLab, {len(titles)} items):\n"
68
+ for uuid, title in zip(uuids, titles):
69
+ text += f" {uuid}: {title}\n"
70
+ return text
71
+
72
+ def __bool__(self) -> bool:
73
+ """Return True if model is not empty"""
74
+ return bool(self.get_object_uuids())
75
+
76
+ def __contains__(self, id_title: str) -> bool:
77
+ """Return True if object (UUID or title) is in model"""
78
+ return id_title in (self.get_object_titles() + self.get_object_uuids())
79
+
80
+ @classmethod
81
+ def get_public_methods(cls) -> list[str]:
82
+ """Return all public methods of the class, except itself.
83
+
84
+ Returns:
85
+ List of public methods
86
+ """
87
+ return [
88
+ method
89
+ for method in dir(cls)
90
+ if not method.startswith(("_", "context_"))
91
+ and method != "get_public_methods"
92
+ ]
93
+
94
+ @abc.abstractmethod
95
+ def get_version(self) -> str:
96
+ """Return DataLab public version.
97
+
98
+ Returns:
99
+ DataLab version
100
+ """
101
+
102
+ @abc.abstractmethod
103
+ def close_application(self) -> None:
104
+ """Close DataLab application"""
105
+
106
+ @abc.abstractmethod
107
+ def raise_window(self) -> None:
108
+ """Raise DataLab window"""
109
+
110
+ @abc.abstractmethod
111
+ def get_current_panel(self) -> str:
112
+ """Return current panel name.
113
+
114
+ Returns:
115
+ Panel name (valid values: "signal", "image", "macro"))
116
+ """
117
+
118
+ @abc.abstractmethod
119
+ def set_current_panel(self, panel: str) -> None:
120
+ """Switch to panel.
121
+
122
+ Args:
123
+ panel: Panel name (valid values: "signal", "image", "macro"))
124
+ """
125
+
126
+ @abc.abstractmethod
127
+ def reset_all(self) -> None:
128
+ """Reset all application data"""
129
+
130
+ @abc.abstractmethod
131
+ def toggle_auto_refresh(self, state: bool) -> None:
132
+ """Toggle auto refresh state.
133
+
134
+ Args:
135
+ state: Auto refresh state
136
+ """
137
+
138
+ # Returns a context manager to temporarily disable autorefresh
139
+ @contextmanager
140
+ def context_no_refresh(self) -> Generator[None, None, None]:
141
+ """Return a context manager to temporarily disable auto refresh.
142
+
143
+ Returns:
144
+ Context manager
145
+
146
+ Example:
147
+
148
+ >>> with proxy.context_no_refresh():
149
+ ... proxy.add_image("image1", data1)
150
+ ... proxy.calc("fft")
151
+ ... proxy.calc("wiener")
152
+ ... proxy.calc("ifft")
153
+ ... # Auto refresh is disabled during the above operations
154
+ """
155
+ self.toggle_auto_refresh(False)
156
+ try:
157
+ yield
158
+ finally:
159
+ self.toggle_auto_refresh(True)
160
+
161
+ @abc.abstractmethod
162
+ def toggle_show_titles(self, state: bool) -> None:
163
+ """Toggle show titles state.
164
+
165
+ Args:
166
+ state: Show titles state
167
+ """
168
+
169
+ @abc.abstractmethod
170
+ def save_to_h5_file(self, filename: str) -> None:
171
+ """Save to a DataLab HDF5 file.
172
+
173
+ Args:
174
+ filename: HDF5 file name
175
+ """
176
+
177
+ @abc.abstractmethod
178
+ def open_h5_files(
179
+ self,
180
+ h5files: list[str] | None = None,
181
+ import_all: bool | None = None,
182
+ reset_all: bool | None = None,
183
+ ) -> None:
184
+ """Open a DataLab HDF5 file or import from any other HDF5 file.
185
+
186
+ Args:
187
+ h5files: List of HDF5 files to open. Defaults to None.
188
+ import_all: Import all objects from HDF5 files. Defaults to None.
189
+ reset_all: Reset all application data. Defaults to None.
190
+ """
191
+
192
+ @abc.abstractmethod
193
+ def import_h5_file(self, filename: str, reset_all: bool | None = None) -> None:
194
+ """Open DataLab HDF5 browser to Import HDF5 file.
195
+
196
+ Args:
197
+ filename: HDF5 file name
198
+ reset_all: Reset all application data. Defaults to None.
199
+ """
200
+
201
+ @abc.abstractmethod
202
+ def load_from_files(self, filenames: list[str]) -> None:
203
+ """Open objects from files in current panel (signals/images).
204
+
205
+ Args:
206
+ filenames: list of file names
207
+ """
208
+
209
+ @abc.abstractmethod
210
+ def load_from_directory(self, path: str) -> None:
211
+ """Open objects from directory in current panel (signals/images).
212
+
213
+ Args:
214
+ path: directory path
215
+ """
216
+
217
+ @abc.abstractmethod
218
+ def add_signal(
219
+ self,
220
+ title: str,
221
+ xdata: np.ndarray,
222
+ ydata: np.ndarray,
223
+ xunit: str = "",
224
+ yunit: str = "",
225
+ xlabel: str = "",
226
+ ylabel: str = "",
227
+ group_id: str = "",
228
+ set_current: bool = True,
229
+ ) -> bool: # pylint: disable=too-many-arguments
230
+ """Add signal data to DataLab.
231
+
232
+ Args:
233
+ title: Signal title
234
+ xdata: X data
235
+ ydata: Y data
236
+ xunit: X unit. Defaults to ""
237
+ yunit: Y unit. Defaults to ""
238
+ xlabel: X label. Defaults to ""
239
+ ylabel: Y label. Defaults to ""
240
+ group_id: group id in which to add the signal. Defaults to ""
241
+ set_current: if True, set the added signal as current
242
+
243
+ Returns:
244
+ True if signal was added successfully, False otherwise
245
+
246
+ Raises:
247
+ ValueError: Invalid xdata dtype
248
+ ValueError: Invalid ydata dtype
249
+ """
250
+
251
+ @abc.abstractmethod
252
+ def add_image(
253
+ self,
254
+ title: str,
255
+ data: np.ndarray,
256
+ xunit: str = "",
257
+ yunit: str = "",
258
+ zunit: str = "",
259
+ xlabel: str = "",
260
+ ylabel: str = "",
261
+ zlabel: str = "",
262
+ group_id: str = "",
263
+ set_current: bool = True,
264
+ ) -> bool: # pylint: disable=too-many-arguments
265
+ """Add image data to DataLab.
266
+
267
+ Args:
268
+ title: Image title
269
+ data: Image data
270
+ xunit: X unit. Defaults to ""
271
+ yunit: Y unit. Defaults to ""
272
+ zunit: Z unit. Defaults to ""
273
+ xlabel: X label. Defaults to ""
274
+ ylabel: Y label. Defaults to ""
275
+ zlabel: Z label. Defaults to ""
276
+ group_id: group id in which to add the image. Defaults to ""
277
+ set_current: if True, set the added image as current
278
+
279
+ Returns:
280
+ True if image was added successfully, False otherwise
281
+
282
+ Raises:
283
+ ValueError: Invalid data dtype
284
+ """
285
+
286
+ @abc.abstractmethod
287
+ def add_object(
288
+ self, obj: SignalObj | ImageObj, group_id: str = "", set_current: bool = True
289
+ ) -> None:
290
+ """Add object to DataLab.
291
+
292
+ Args:
293
+ obj: Signal or image object
294
+ group_id: group id in which to add the object. Defaults to ""
295
+ set_current: if True, set the added object as current
296
+
297
+ Returns:
298
+ True if object was added successfully, False otherwise
299
+ """
300
+
301
+ @abc.abstractmethod
302
+ def add_group(
303
+ self, title: str, panel: str | None = None, select: bool = False
304
+ ) -> None:
305
+ """Add group to DataLab.
306
+
307
+ Args:
308
+ title: Group title
309
+ panel: Panel name (valid values: "signal", "image"). Defaults to None.
310
+ select: Select the group after creation. Defaults to False.
311
+ """
312
+
313
+ @abc.abstractmethod
314
+ def get_sel_object_uuids(self, include_groups: bool = False) -> list[str]:
315
+ """Return selected objects uuids.
316
+
317
+ Args:
318
+ include_groups: If True, also return objects from selected groups.
319
+
320
+ Returns:
321
+ List of selected objects uuids.
322
+ """
323
+
324
+ @abc.abstractmethod
325
+ def select_objects(
326
+ self,
327
+ selection: list[int | str],
328
+ panel: str | None = None,
329
+ ) -> None:
330
+ """Select objects in current panel.
331
+
332
+ Args:
333
+ selection: List of object numbers (1 to N) or uuids to select
334
+ panel: panel name (valid values: "signal", "image").
335
+ If None, current panel is used. Defaults to None.
336
+ """
337
+
338
+ @abc.abstractmethod
339
+ def select_groups(
340
+ self, selection: list[int | str] | None = None, panel: str | None = None
341
+ ) -> None:
342
+ """Select groups in current panel.
343
+
344
+ Args:
345
+ selection: List of group numbers (1 to N), or list of group uuids,
346
+ or None to select all groups. Defaults to None.
347
+ panel: panel name (valid values: "signal", "image").
348
+ If None, current panel is used. Defaults to None.
349
+ """
350
+
351
+ @abc.abstractmethod
352
+ def delete_metadata(
353
+ self, refresh_plot: bool = True, keep_roi: bool = False
354
+ ) -> None:
355
+ """Delete metadata of selected objects
356
+
357
+ Args:
358
+ refresh_plot: Refresh plot. Defaults to True.
359
+ keep_roi: Keep ROI. Defaults to False.
360
+ """
361
+
362
+ @abc.abstractmethod
363
+ def get_group_titles_with_object_info(
364
+ self,
365
+ ) -> tuple[list[str], list[list[str]], list[list[str]]]:
366
+ """Return groups titles and lists of inner objects uuids and titles.
367
+
368
+ Returns:
369
+ Groups titles, lists of inner objects uuids and titles
370
+ """
371
+
372
+ @abc.abstractmethod
373
+ def get_object_titles(self, panel: str | None = None) -> list[str]:
374
+ """Get object (signal/image) list for current panel.
375
+ Objects are sorted by group number and object index in group.
376
+
377
+ Args:
378
+ panel: panel name (valid values: "signal", "image", "macro").
379
+ If None, current data panel is used (i.e. signal or image panel).
380
+
381
+ Returns:
382
+ List of object titles
383
+
384
+ Raises:
385
+ ValueError: if panel not found
386
+ """
387
+
388
+ @abc.abstractmethod
389
+ def get_object(
390
+ self, nb_id_title: int | str | None = None, panel: str | None = None
391
+ ) -> SignalObj | ImageObj:
392
+ """Get object (signal/image) from index.
393
+
394
+ Args:
395
+ nb_id_title: Object number, or object id, or object title.
396
+ Defaults to None (current object).
397
+ panel: Panel name. Defaults to None (current panel).
398
+
399
+ Returns:
400
+ Object
401
+
402
+ Raises:
403
+ KeyError: if object not found
404
+ """
405
+
406
+ @abc.abstractmethod
407
+ def get_object_uuids(
408
+ self, panel: str | None = None, group: int | str | None = None
409
+ ) -> list[str]:
410
+ """Get object (signal/image) uuid list for current panel.
411
+ Objects are sorted by group number and object index in group.
412
+
413
+ Args:
414
+ panel: panel name (valid values: "signal", "image").
415
+ If None, current panel is used.
416
+ group: Group number, or group id, or group title.
417
+ Defaults to None (all groups).
418
+
419
+ Returns:
420
+ List of object uuids
421
+
422
+ Raises:
423
+ ValueError: if panel not found
424
+ """
425
+
426
+ @abc.abstractmethod
427
+ def get_object_shapes(
428
+ self,
429
+ nb_id_title: int | str | None = None,
430
+ panel: str | None = None,
431
+ ) -> list:
432
+ """Get plot item shapes associated to object (signal/image).
433
+
434
+ Args:
435
+ nb_id_title: Object number, or object id, or object title.
436
+ Defaults to None (current object).
437
+ panel: Panel name. Defaults to None (current panel).
438
+
439
+ Returns:
440
+ List of plot item shapes
441
+ """
442
+
443
+ @abc.abstractmethod
444
+ def add_annotations_from_items(
445
+ self, items: list, refresh_plot: bool = True, panel: str | None = None
446
+ ) -> None:
447
+ """Add object annotations (annotation plot items).
448
+
449
+ Args:
450
+ items: annotation plot items
451
+ refresh_plot: refresh plot. Defaults to True.
452
+ panel: panel name (valid values: "signal", "image").
453
+ If None, current panel is used.
454
+ """
455
+
456
+ @abc.abstractmethod
457
+ def add_label_with_title(
458
+ self, title: str | None = None, panel: str | None = None
459
+ ) -> None:
460
+ """Add a label with object title on the associated plot
461
+
462
+ Args:
463
+ title: Label title. Defaults to None.
464
+ If None, the title is the object title.
465
+ panel: panel name (valid values: "signal", "image").
466
+ If None, current panel is used.
467
+ """
468
+
469
+ @abc.abstractmethod
470
+ def run_macro(self, number_or_title: int | str | None = None) -> None:
471
+ """Run macro.
472
+
473
+ Args:
474
+ number: Number of the macro (starting at 1). Defaults to None (run
475
+ current macro, or does nothing if there is no macro).
476
+ """
477
+
478
+ @abc.abstractmethod
479
+ def stop_macro(self, number_or_title: int | str | None = None) -> None:
480
+ """Stop macro.
481
+
482
+ Args:
483
+ number: Number of the macro (starting at 1). Defaults to None (stop
484
+ current macro, or does nothing if there is no macro).
485
+ """
486
+
487
+ @abc.abstractmethod
488
+ def import_macro_from_file(self, filename: str) -> None:
489
+ """Import macro from file
490
+
491
+ Args:
492
+ filename: Filename.
493
+ """
494
+
495
+ @abc.abstractmethod
496
+ def calc(self, name: str, param: gds.DataSet | None = None) -> gds.DataSet:
497
+ """Call computation feature ``name``
498
+
499
+ .. note::
500
+
501
+ This calls either the processor's ``compute_<name>`` method (if it exists),
502
+ or the processor's ``<name>`` computation feature (if it is registered,
503
+ using the ``run_feature`` method).
504
+ It looks for the function in all panels, starting with the current one.
505
+
506
+ Args:
507
+ name: Compute function name
508
+ param: Compute function parameter. Defaults to None.
509
+
510
+ Raises:
511
+ ValueError: unknown function
512
+ """
513
+
514
+
515
+ class BaseProxy(AbstractDLControl, metaclass=abc.ABCMeta):
516
+ """Common base class for DataLab proxies
517
+
518
+ Args:
519
+ datalab: DLMainWindow instance or ServerProxy instance. If None, then the proxy
520
+ implementation will have to set it later (e.g. see RemoteClient).
521
+ """
522
+
523
+ def __init__(self, datalab: DLMainWindow | ServerProxy | None = None) -> None:
524
+ self._datalab = datalab
525
+
526
+ def get_version(self) -> str:
527
+ """Return DataLab public version.
528
+
529
+ Returns:
530
+ DataLab version
531
+ """
532
+ return self._datalab.get_version()
533
+
534
+ def close_application(self) -> None:
535
+ """Close DataLab application"""
536
+ self._datalab.close_application()
537
+
538
+ def raise_window(self) -> None:
539
+ """Raise DataLab window"""
540
+ self._datalab.raise_window()
541
+
542
+ def get_current_panel(self) -> str:
543
+ """Return current panel name.
544
+
545
+ Returns:
546
+ Panel name (valid values: "signal", "image", "macro"))
547
+ """
548
+ return self._datalab.get_current_panel()
549
+
550
+ def set_current_panel(self, panel: str) -> None:
551
+ """Switch to panel.
552
+
553
+ Args:
554
+ panel: Panel name (valid values: "signal", "image", "macro"))
555
+ """
556
+ self._datalab.set_current_panel(panel)
557
+
558
+ def reset_all(self) -> None:
559
+ """Reset all application data"""
560
+ self._datalab.reset_all()
561
+
562
+ def toggle_auto_refresh(self, state: bool) -> None:
563
+ """Toggle auto refresh state.
564
+
565
+ Args:
566
+ state: Auto refresh state
567
+ """
568
+ self._datalab.toggle_auto_refresh(state)
569
+
570
+ def toggle_show_titles(self, state: bool) -> None:
571
+ """Toggle show titles state.
572
+
573
+ Args:
574
+ state: Show titles state
575
+ """
576
+ self._datalab.toggle_show_titles(state)
577
+
578
+ def save_to_h5_file(self, filename: str) -> None:
579
+ """Save to a DataLab HDF5 file.
580
+
581
+ Args:
582
+ filename: HDF5 file name
583
+ """
584
+ self._datalab.save_to_h5_file(filename)
585
+
586
+ def open_h5_files(
587
+ self,
588
+ h5files: list[str] | None = None,
589
+ import_all: bool | None = None,
590
+ reset_all: bool | None = None,
591
+ ) -> None:
592
+ """Open a DataLab HDF5 file or import from any other HDF5 file.
593
+
594
+ Args:
595
+ h5files: List of HDF5 files to open. Defaults to None.
596
+ import_all: Import all objects from HDF5 files. Defaults to None.
597
+ reset_all: Reset all application data. Defaults to None.
598
+ """
599
+ self._datalab.open_h5_files(h5files, import_all, reset_all)
600
+
601
+ def import_h5_file(self, filename: str, reset_all: bool | None = None) -> None:
602
+ """Open DataLab HDF5 browser to Import HDF5 file.
603
+
604
+ Args:
605
+ filename: HDF5 file name
606
+ reset_all: Reset all application data. Defaults to None.
607
+ """
608
+ self._datalab.import_h5_file(filename, reset_all)
609
+
610
+ def load_from_files(self, filenames: list[str]) -> None:
611
+ """Open objects from files in current panel (signals/images).
612
+
613
+ Args:
614
+ filenames: list of file names
615
+ """
616
+ self._datalab.load_from_files(filenames)
617
+
618
+ def load_from_directory(self, path: str) -> None:
619
+ """Open objects from directory in current panel (signals/images).
620
+
621
+ Args:
622
+ path: directory path
623
+ """
624
+ self._datalab.load_from_directory(path)
625
+
626
+ def get_sel_object_uuids(self, include_groups: bool = False) -> list[str]:
627
+ """Return selected objects uuids.
628
+
629
+ Args:
630
+ include_groups: If True, also return objects from selected groups.
631
+
632
+ Returns:
633
+ List of selected objects uuids.
634
+ """
635
+ return self._datalab.get_sel_object_uuids(include_groups)
636
+
637
+ def add_group(
638
+ self, title: str, panel: str | None = None, select: bool = False
639
+ ) -> None:
640
+ """Add group to DataLab.
641
+
642
+ Args:
643
+ title: Group title
644
+ panel: Panel name (valid values: "signal", "image"). Defaults to None.
645
+ select: Select the group after creation. Defaults to False.
646
+ """
647
+ self._datalab.add_group(title, panel, select)
648
+
649
+ def select_objects(
650
+ self,
651
+ selection: list[int | str],
652
+ panel: str | None = None,
653
+ ) -> None:
654
+ """Select objects in current panel.
655
+
656
+ Args:
657
+ selection: List of object numbers (1 to N) or uuids to select
658
+ panel: panel name (valid values: "signal", "image").
659
+ If None, current panel is used. Defaults to None.
660
+ """
661
+ self._datalab.select_objects(selection, panel)
662
+
663
+ def select_groups(
664
+ self, selection: list[int | str] | None = None, panel: str | None = None
665
+ ) -> None:
666
+ """Select groups in current panel.
667
+
668
+ Args:
669
+ selection: List of group numbers (1 to N), or list of group uuids,
670
+ or None to select all groups. Defaults to None.
671
+ panel: panel name (valid values: "signal", "image").
672
+ If None, current panel is used. Defaults to None.
673
+ """
674
+ self._datalab.select_groups(selection, panel)
675
+
676
+ def delete_metadata(
677
+ self, refresh_plot: bool = True, keep_roi: bool = False
678
+ ) -> None:
679
+ """Delete metadata of selected objects
680
+
681
+ Args:
682
+ refresh_plot: Refresh plot. Defaults to True.
683
+ keep_roi: Keep ROI. Defaults to False.
684
+ """
685
+ self._datalab.delete_metadata(refresh_plot, keep_roi)
686
+
687
+ def get_group_titles_with_object_info(
688
+ self,
689
+ ) -> tuple[list[str], list[list[str]], list[list[str]]]:
690
+ """Return groups titles and lists of inner objects uuids and titles.
691
+
692
+ Returns:
693
+ Tuple: groups titles, lists of inner objects uuids and titles
694
+ """
695
+ return self._datalab.get_group_titles_with_object_info()
696
+
697
+ def get_object_titles(self, panel: str | None = None) -> list[str]:
698
+ """Get object (signal/image) list for current panel.
699
+ Objects are sorted by group number and object index in group.
700
+
701
+ Args:
702
+ panel: panel name (valid values: "signal", "image", "macro").
703
+ If None, current data panel is used (i.e. signal or image panel).
704
+
705
+ Returns:
706
+ List of object titles
707
+
708
+ Raises:
709
+ ValueError: if panel not found
710
+ """
711
+ return self._datalab.get_object_titles(panel)
712
+
713
+ def get_object_uuids(
714
+ self, panel: str | None = None, group: int | str | None = None
715
+ ) -> list[str]:
716
+ """Get object (signal/image) uuid list for current panel.
717
+ Objects are sorted by group number and object index in group.
718
+
719
+ Args:
720
+ panel: panel name (valid values: "signal", "image").
721
+ If None, current panel is used.
722
+ group: Group number, or group id, or group title.
723
+ Defaults to None (all groups).
724
+
725
+ Returns:
726
+ List of object uuids
727
+
728
+ Raises:
729
+ ValueError: if panel not found
730
+ """
731
+ return self._datalab.get_object_uuids(panel, group)
732
+
733
+ def add_label_with_title(
734
+ self, title: str | None = None, panel: str | None = None
735
+ ) -> None:
736
+ """Add a label with object title on the associated plot
737
+
738
+ Args:
739
+ title: Label title. Defaults to None.
740
+ If None, the title is the object title.
741
+ panel: panel name (valid values: "signal", "image").
742
+ If None, current panel is used.
743
+ """
744
+ self._datalab.add_label_with_title(title, panel)
745
+
746
+ def run_macro(self, number_or_title: int | str | None = None) -> None:
747
+ """Run macro.
748
+
749
+ Args:
750
+ number_or_title: Macro number, or macro title.
751
+ Defaults to None (current macro).
752
+
753
+ Raises:
754
+ ValueError: if macro not found
755
+ """
756
+ self._datalab.run_macro(number_or_title)
757
+
758
+ def stop_macro(self, number_or_title: int | str | None = None) -> None:
759
+ """Stop macro.
760
+
761
+ Args:
762
+ number_or_title: Macro number, or macro title.
763
+ Defaults to None (current macro).
764
+
765
+ Raises:
766
+ ValueError: if macro not found
767
+ """
768
+ self._datalab.stop_macro(number_or_title)
769
+
770
+ def import_macro_from_file(self, filename: str) -> None:
771
+ """Import macro from file
772
+
773
+ Args:
774
+ filename: Filename.
775
+ """
776
+ return self._datalab.import_macro_from_file(filename)