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,240 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ Unit test for automatic recomputation of 1-to-0 analysis operations.
5
+
6
+ This test verifies that analysis results (like centroid) are automatically updated
7
+ when data changes through various methods:
8
+ - ROI modifications (adding, deleting ROIs)
9
+ - Data transformations via recompute_1_to_1 (modifying processing parameters)
10
+
11
+ The tests create a Gaussian image, compute its centroid, then verify that:
12
+ 1. The centroid changes when a ROI is added to restrict the calculation region
13
+ 2. Two centroid rows are generated when two ROIs are added
14
+ 3. One centroid row remains after deleting the first ROI
15
+ 4. The centroid returns to the original value when all ROIs are deleted
16
+ 5. The centroid is recomputed when processing parameters are modified
17
+ """
18
+
19
+ # guitest: show
20
+
21
+ from __future__ import annotations
22
+
23
+ import numpy as np
24
+ from sigima.objects import Gauss2DParam, create_image_from_param, create_image_roi
25
+ from sigima.params import RotateParam
26
+
27
+ from datalab.adapters_metadata import GeometryAdapter
28
+ from datalab.config import Conf
29
+ from datalab.tests import datalab_test_app_context
30
+
31
+
32
+ def get_centroid_coords(obj) -> tuple[float, float] | None:
33
+ """Extract centroid coordinates from object metadata.
34
+
35
+ Args:
36
+ obj: Image object with centroid results
37
+
38
+ Returns:
39
+ Tuple (x, y) of centroid coordinates, or None if no centroid found
40
+ """
41
+ adapter = GeometryAdapter.from_obj(obj, "centroid")
42
+ if adapter is not None:
43
+ print("adapter.result.coords:", adapter.result.coords)
44
+ return tuple(adapter.result.coords[0])
45
+ return None
46
+
47
+
48
+ def test_analysis_recompute_after_roi_change():
49
+ """Test automatic recomputation of analysis results when ROI changes."""
50
+ with datalab_test_app_context(console=False) as win:
51
+ panel = win.imagepanel
52
+
53
+ # Create a 2D Gaussian image in a 200x200 image
54
+ size = 200
55
+ param = Gauss2DParam.create(height=size, width=size, sigma=20)
56
+ img = create_image_from_param(param)
57
+ panel.add_object(img)
58
+
59
+ # Compute centroid on the full image
60
+ with Conf.proc.show_result_dialog.temp(False):
61
+ panel.processor.run_feature("centroid")
62
+ centroid = get_centroid_coords(img)
63
+ assert centroid is not None, "Centroid should be computed"
64
+ x0, y0 = centroid
65
+ print(f"\nInitial centroid (full image): ({x0:.1f}, {y0:.1f})")
66
+
67
+ # Step 1: Add ROI (simulating edit_roi_graphically)
68
+ # Add a rectangular ROI in the upper-left quadrant
69
+ roi = create_image_roi("rectangle", [25, 25, 50, 50]) # x0, y0, width, height
70
+ img.roi = roi
71
+ panel.refresh_plot("selected", update_items=True)
72
+ # Trigger auto-recompute by simulating ROI modification
73
+ panel.processor.auto_recompute_analysis(img)
74
+
75
+ # Verify centroid was updated
76
+ centroid = get_centroid_coords(img)
77
+ assert centroid is not None, "Centroid should still exist after ROI change"
78
+ x1, y1 = centroid
79
+ print(f"Centroid after adding ROI (upper-left): ({x1:.1f}, {y1:.1f})")
80
+ # Centroid should have moved (different from initial)
81
+ centroid_changed = not (
82
+ np.isclose(x1, x0, atol=0.1) and np.isclose(y1, y0, atol=0.1)
83
+ )
84
+ assert centroid_changed, (
85
+ f"Centroid should have changed from ({x0:.1f}, {y0:.1f}) "
86
+ f"to ({x1:.1f}, {y1:.1f})"
87
+ )
88
+
89
+ # Step 2: Add two ROIs at once
90
+ # Create a multi-ROI object with two rectangular regions
91
+ roi1 = create_image_roi("rectangle", [25, 25, 50, 50]) # Upper-left
92
+ roi2 = create_image_roi("rectangle", [150, 150, 40, 40]) # Lower-right
93
+ roi1.add_roi(roi2) # Combine both ROIs
94
+ img.roi = roi1
95
+ panel.refresh_plot("selected", update_items=True)
96
+ panel.processor.auto_recompute_analysis(img)
97
+
98
+ # Verify centroid now has TWO rows (one for each ROI)
99
+ adapter = GeometryAdapter.from_obj(img, "centroid")
100
+ assert adapter is not None, "Centroid adapter should exist"
101
+ coords = adapter.result.coords
102
+ print(f"Centroid coords after adding two ROIs:\n{coords}")
103
+ assert len(coords) == 2, f"Should have 2 centroid rows, got {len(coords)}"
104
+ x2_roi0, y2_roi0 = coords[0]
105
+ x2_roi1, y2_roi1 = coords[1]
106
+ print(
107
+ f"Centroid ROI 0 (upper-left): ({x2_roi0:.1f}, {y2_roi0:.1f}), "
108
+ f"ROI 1 (lower-right): ({x2_roi1:.1f}, {y2_roi1:.1f})"
109
+ )
110
+
111
+ # Step 3: Delete the first ROI using delete_single_roi
112
+ panel.processor.delete_single_roi(roi_index=0)
113
+
114
+ # Verify centroid now has ONE row (for the remaining ROI)
115
+ adapter = GeometryAdapter.from_obj(img, "centroid")
116
+ assert adapter is not None, "Centroid adapter should exist after ROI deletion"
117
+ coords = adapter.result.coords
118
+ print(f"Centroid coords after deleting first ROI:\n{coords}")
119
+ assert len(coords) == 1, f"Should have 1 centroid row, got {len(coords)}"
120
+ x3, y3 = coords[0]
121
+ print(f"Centroid after deleting first ROI: ({x3:.1f}, {y3:.1f})")
122
+ # The remaining ROI should be the second one (lower-right), so centroid should
123
+ # be close to what was previously in ROI 1
124
+ assert np.isclose(x3, x2_roi1, atol=1.0), (
125
+ f"X centroid should be close to {x2_roi1:.1f}, got {x3:.1f}"
126
+ )
127
+ assert np.isclose(y3, y2_roi1, atol=1.0), (
128
+ f"Y centroid should be close to {y2_roi1:.1f}, got {y3:.1f}"
129
+ )
130
+
131
+ # Step 4: Delete all remaining ROIs using delete_regions_of_interest
132
+ panel.processor.delete_regions_of_interest()
133
+
134
+ # Verify centroid was updated back to original
135
+ centroid = get_centroid_coords(img)
136
+ assert centroid is not None, "Centroid should exist after deleting all ROIs"
137
+ x4, y4 = centroid
138
+ print(f"Centroid after delete_regions_of_interest: ({x4:.1f}, {y4:.1f})")
139
+ # Should return to original centroid of full image
140
+ assert np.isclose(x4, x0, atol=1.0), (
141
+ f"X centroid should return to {x0:.1f}, got {x4:.1f}"
142
+ )
143
+ assert np.isclose(y4, y0, atol=1.0), (
144
+ f"Y centroid should return to {y0:.1f}, got {y4:.1f}"
145
+ )
146
+
147
+ print("\n✓ All ROI auto-recompute tests passed!")
148
+
149
+
150
+ def test_analysis_recompute_after_recompute_1_to_1():
151
+ """Test automatic recomputation of analysis after processing parameter changes."""
152
+ with datalab_test_app_context(console=False) as win:
153
+ panel = win.imagepanel
154
+
155
+ # Create a Gaussian image offset from center
156
+ size = 200
157
+ # In Gauss2DParam, x0 and y0 are the center coordinates with Xmin=-10.0,
158
+ # Ymin=-10.0, Xmax=10.0, Ymax=10.0 by default.
159
+ # The centroid position should be at (49.75, 99.5).
160
+ # After a 45° rotation, it should move closer to (64.32, 134.68).
161
+ # Or after a 90° rotation, it should move to (99.5, 149.2).
162
+ param = Gauss2DParam.create(height=size, width=size, x0=-5.0)
163
+ img = create_image_from_param(param)
164
+ panel.add_object(img)
165
+
166
+ # Apply a rotation transformation with 45° angle
167
+ rot_param = RotateParam.create(angle=45.0)
168
+ with Conf.proc.show_result_dialog.temp(False):
169
+ panel.processor.run_feature("rotate", rot_param)
170
+
171
+ # Get the rotated image
172
+ img_rotated = panel.objview.get_sel_objects()[0]
173
+ print(f"\nRotated image title: {img_rotated.title}")
174
+
175
+ # Compute centroid on the rotated image
176
+ with Conf.proc.show_result_dialog.temp(False):
177
+ panel.processor.run_feature("centroid")
178
+
179
+ # Get initial centroid (after 45° rotation)
180
+ centroid = get_centroid_coords(img_rotated)
181
+ assert centroid is not None, "Centroid should be computed"
182
+ x0, y0 = centroid
183
+ print(f"Initial centroid (45° rotation): ({x0:.1f}, {y0:.1f})")
184
+ expected_x0 = 64.32
185
+ expected_y0 = 134.68
186
+ assert np.isclose(x0, expected_x0, atol=0.2), (
187
+ f"X centroid should be near {expected_x0:.1f}, got {x0:.1f}"
188
+ )
189
+ assert np.isclose(y0, expected_y0, atol=0.2), (
190
+ f"Y centroid should be near {expected_y0:.1f}, got {y0:.1f}"
191
+ )
192
+
193
+ # Now modify the rotation angle to 90° via the Processing tab
194
+ # The rotated object is already selected, just ensure we're accessing it
195
+ panel.objview.select_objects([img_rotated])
196
+
197
+ # Get the processing parameter editor and change the angle
198
+ assert panel.objprop.processing_param_editor is not None
199
+ editor = panel.objprop.processing_param_editor
200
+ editor.dataset.angle = 90.0 # Change from 45° to 90°
201
+
202
+ # Apply the modified parameters (this triggers recompute_1_to_1)
203
+ report = panel.objprop.apply_processing_parameters(interactive=False)
204
+
205
+ assert report.success, f"Recompute failed: {report.message}"
206
+ print("Processing parameters recomputed with new angle (90°)")
207
+
208
+ # Verify centroid was automatically recomputed
209
+ centroid = get_centroid_coords(img_rotated)
210
+ assert centroid is not None, "Centroid should still exist after recompute"
211
+ x1, y1 = centroid
212
+ print(f"Centroid after recompute (90° rotation): ({x1:.1f}, {y1:.1f})")
213
+
214
+ # After 90° rotation: the Gaussian blob that was at upper-right (after 45°)
215
+ # moves toward the center-right area
216
+ # Empirical measurements show approximately (99.5, 149.2)
217
+ expected_x1 = 99.5
218
+ expected_y1 = 149.2
219
+ assert np.isclose(x1, expected_x1, atol=0.2), (
220
+ f"X centroid should be near {expected_x1:.1f}, got {x1:.1f}"
221
+ )
222
+ assert np.isclose(y1, expected_y1, atol=0.2), (
223
+ f"Y centroid should be near {expected_y1:.1f}, got {y1:.1f}"
224
+ )
225
+
226
+ # Most importantly, verify the centroid changed from 90° rotation
227
+ centroid_changed = not (
228
+ np.isclose(x1, x0, atol=5.0) and np.isclose(y1, y0, atol=5.0)
229
+ )
230
+ assert centroid_changed, (
231
+ f"Centroid should have changed from ({x0:.1f}, {y0:.1f}) "
232
+ f"to ({x1:.1f}, {y1:.1f}) after changing rotation angle"
233
+ )
234
+
235
+ print("\n✓ Recompute_1_to_1 auto-analysis test passed!")
236
+
237
+
238
+ if __name__ == "__main__":
239
+ test_analysis_recompute_after_roi_change()
240
+ test_analysis_recompute_after_recompute_1_to_1()
@@ -0,0 +1,50 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ New signal/image test
5
+
6
+ Testing GUI functions related to signal/image creation.
7
+ """
8
+
9
+ # pylint: disable=invalid-name # Allows short reference names like x, y, ...
10
+ # pylint: disable=duplicate-code
11
+ # guitest: show
12
+
13
+ from __future__ import annotations
14
+
15
+ import sigima.objects
16
+ from guidata.qthelpers import qt_app_context
17
+ from sigima.tests.vistools import view_curves, view_images
18
+
19
+ from datalab.env import execenv
20
+ from datalab.gui.newobject import create_image_gui, create_signal_gui
21
+
22
+
23
+ def test_new_signal() -> None:
24
+ """Test new signal feature"""
25
+ edit = not execenv.unattended
26
+ with qt_app_context():
27
+ signal = create_signal_gui(None, edit=edit)
28
+ if signal is not None:
29
+ data = (signal.x, signal.y)
30
+ view_curves([data], name=test_new_signal.__name__, title=signal.title)
31
+
32
+
33
+ def test_new_image() -> None:
34
+ """Test new image feature"""
35
+ # Test with no input parameter
36
+ edit = not execenv.unattended
37
+ with qt_app_context():
38
+ image = create_image_gui(None, edit=edit)
39
+ if image is not None:
40
+ view_images(image.data, name=test_new_image.__name__, title=image.title)
41
+ # Test with parametered 2D-Gaussian
42
+ param = sigima.objects.Gauss2DParam.create(x0=3, y0=3, sigma=5)
43
+ image = create_image_gui(param, edit=edit)
44
+ if image is not None:
45
+ view_images(image.data, name=test_new_image.__name__, title=image.title)
46
+
47
+
48
+ if __name__ == "__main__":
49
+ test_new_signal()
50
+ test_new_image()
@@ -0,0 +1,135 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ Result shapes application test:
5
+
6
+ - Create an image with metadata shapes and ROI
7
+ - Further tests to be done manually: check if copy/paste metadata works
8
+ """
9
+
10
+ # guitest: show
11
+
12
+ from __future__ import annotations
13
+
14
+ import pandas as pd
15
+ import sigima.objects
16
+ import sigima.params
17
+ from sigima.tests import data as test_data
18
+
19
+ from datalab.adapters_metadata import GeometryAdapter
20
+ from datalab.config import Conf
21
+ from datalab.tests import datalab_test_app_context
22
+
23
+
24
+ def __create_image_with_geometry_results() -> sigima.objects.ImageObj:
25
+ """Create test image with geometry results"""
26
+ param = sigima.objects.Gauss2DParam.create(
27
+ height=600,
28
+ width=600,
29
+ title="Test image (with geometry results)",
30
+ dtype=sigima.objects.ImageDatatypes.UINT16,
31
+ x0=2,
32
+ y0=3,
33
+ )
34
+ image = sigima.objects.create_image_from_param(param)
35
+ for geometry in test_data.generate_geometry_results():
36
+ GeometryAdapter(geometry).add_to(image)
37
+ return image
38
+
39
+
40
+ def __check_geometry_results_merge(
41
+ obj1: sigima.objects.SignalObj | sigima.objects.ImageObj,
42
+ obj2: sigima.objects.SignalObj | sigima.objects.ImageObj,
43
+ ) -> None:
44
+ """Check if geometry results merge properly: the scenario is to duplicate an object,
45
+ then compute average. We thus have to check if the second object (average) has the
46
+ expected geometry results (i.e. twice the number of geometry results of the original
47
+ object for each geometry result type).
48
+
49
+ Args:
50
+ obj1: Original object
51
+ obj2: Merged object
52
+ """
53
+ rsl1, rsl2 = (
54
+ list(GeometryAdapter.iterate_from_obj(obj1)),
55
+ list(GeometryAdapter.iterate_from_obj(obj2)),
56
+ )
57
+ assert len(rsl2) == len(rsl1), (
58
+ f"Result shapes length mismatch: {len(rsl1)} != {len(rsl2)}"
59
+ )
60
+ for rs1, rs2 in zip(rsl1, rsl2):
61
+ df1 = rs1.to_dataframe()
62
+ df2 = rs2.to_dataframe()
63
+ assert len(df1) * 2 == len(df2), (
64
+ f"Result shape dataframe length mismatch: {len(df1)} * 2 != {len(df2)}"
65
+ )
66
+ # Check that the second dataframe contains double the data
67
+ # (original geometry result concatenated with itself)
68
+ coord_cols = [col for col in df1.columns if col != "roi_index"]
69
+ df1_doubled = pd.concat([df1, df1], ignore_index=True)
70
+ pd.testing.assert_frame_equal(
71
+ df2[coord_cols].sort_values(coord_cols[0]).reset_index(drop=True),
72
+ df1_doubled[coord_cols].sort_values(coord_cols[0]).reset_index(drop=True),
73
+ )
74
+
75
+
76
+ def __check_roi_merge(
77
+ obj1: sigima.objects.SignalObj | sigima.objects.ImageObj,
78
+ obj2: sigima.objects.SignalObj | sigima.objects.ImageObj,
79
+ ) -> None:
80
+ """Check if ROI merge properly: the scenario is to duplicate an object,
81
+ then compute average. We thus have to check if the second object (average) has the
82
+ expected ROI (i.e. the union of the original object's ROI).
83
+
84
+ Args:
85
+ obj1: Original object
86
+ obj2: Merged object
87
+ """
88
+ roi1 = obj1.roi
89
+ roi2 = obj2.roi
90
+ for single_roi2 in roi2:
91
+ assert roi1.get_single_roi(0) == single_roi2
92
+
93
+
94
+ def test_geometry_results() -> None:
95
+ """Geometry results test"""
96
+ with datalab_test_app_context() as win:
97
+ obj1 = test_data.create_sincos_image()
98
+ obj2 = __create_image_with_geometry_results()
99
+ obj2.roi = sigima.objects.create_image_roi("rectangle", [10, 10, 50, 400])
100
+ panel = win.signalpanel
101
+ for noised in (False, True):
102
+ sig = test_data.create_noisy_signal(noised=noised)
103
+ panel.add_object(sig)
104
+ panel.processor.run_feature("fwhm", sigima.params.FWHMParam())
105
+ panel.processor.run_feature("fw1e2")
106
+ panel.objview.select_objects((1, 2))
107
+ panel.show_results()
108
+ panel.plot_results()
109
+ win.set_current_panel("image")
110
+ panel = win.imagepanel
111
+ for obj in (obj1, obj2):
112
+ panel.add_object(obj)
113
+ panel.show_results()
114
+ panel.plot_results()
115
+ for keep_results in (False, True):
116
+ with Conf.proc.keep_results.temp(keep_results):
117
+ # Test merging result shapes (duplicate obj, then compute average):
118
+ for panel in (win.signalpanel, win.imagepanel):
119
+ panel.objview.select_objects((2,))
120
+ panel.duplicate_object()
121
+ panel.objview.select_objects((2, len(panel)))
122
+ panel.processor.run_feature("average")
123
+ last_obj = panel[len(panel)]
124
+ if keep_results:
125
+ __check_geometry_results_merge(panel[2], last_obj)
126
+ if panel is win.imagepanel:
127
+ __check_roi_merge(panel[2], last_obj)
128
+ else:
129
+ assert (
130
+ len(list(GeometryAdapter.iterate_from_obj(last_obj))) == 0
131
+ )
132
+
133
+
134
+ if __name__ == "__main__":
135
+ test_geometry_results()