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,755 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ .. Signal processor object (see parent package :mod:`datalab.gui.processor`)
5
+ """
6
+
7
+ # pylint: disable=invalid-name # Allows short reference names like x, y, ...
8
+
9
+ from __future__ import annotations
10
+
11
+ import re
12
+ from collections.abc import Callable
13
+
14
+ import numpy as np
15
+ import sigima.params
16
+ import sigima.proc.base as sigima_base
17
+ import sigima.proc.signal as sips
18
+ from guidata.qthelpers import exec_dialog
19
+ from sigima.objects import (
20
+ NormalDistributionParam,
21
+ PoissonDistributionParam,
22
+ ROI1DParam,
23
+ SignalObj,
24
+ SignalROI,
25
+ UniformDistributionParam,
26
+ create_signal,
27
+ )
28
+ from sigima.objects.scalar import GeometryResult, TableResult
29
+
30
+ from datalab.config import _
31
+ from datalab.gui.processor.base import BaseProcessor
32
+ from datalab.utils.qthelpers import qt_try_except
33
+ from datalab.widgets import (
34
+ fitdialog,
35
+ signalbaseline,
36
+ signalcursor,
37
+ signaldeltax,
38
+ signalpeak,
39
+ )
40
+
41
+
42
+ class SignalProcessor(BaseProcessor[SignalROI, ROI1DParam]):
43
+ """Object handling signal processing: operations, processing, analysis"""
44
+
45
+ FIT_FUNCTIONS = (
46
+ (_("Linear fit"), sips.linear_fit),
47
+ (_("Polynomial fit"), sips.polynomial_fit),
48
+ (_("Gaussian fit"), sips.gaussian_fit),
49
+ (_("Lorentzian fit"), sips.lorentzian_fit),
50
+ (_("Voigt fit"), sips.voigt_fit),
51
+ (_("Planckian fit"), sips.planckian_fit),
52
+ (_("Two Half-Gaussians fit"), sips.twohalfgaussian_fit),
53
+ (_("Piecewise exponential fit"), sips.piecewiseexponential_fit),
54
+ (_("Exponential fit"), sips.exponential_fit),
55
+ (_("Sinusoidal fit"), sips.sinusoidal_fit),
56
+ (_("CDF fit"), sips.cdf_fit),
57
+ (_("Sigmoid fit"), sips.sigmoid_fit),
58
+ )
59
+
60
+ # pylint: disable=duplicate-code
61
+
62
+ def register_operations(self) -> None:
63
+ """Register operations."""
64
+ self.register_n_to_1(sips.addition, _("Sum"), icon_name="sum.svg")
65
+ self.register_n_to_1(sips.average, _("Average"), icon_name="average.svg")
66
+ self.register_n_to_1(
67
+ sips.standard_deviation,
68
+ _("Standard deviation"),
69
+ icon_name="std.svg",
70
+ )
71
+ self.register_2_to_1(
72
+ sips.difference,
73
+ _("Difference"),
74
+ icon_name="difference.svg",
75
+ obj2_name=_("signal to subtract"),
76
+ )
77
+ self.register_2_to_1(
78
+ sips.quadratic_difference,
79
+ _("Quadratic Difference"),
80
+ icon_name="quadratic_difference.svg",
81
+ obj2_name=_("signal to subtract"),
82
+ )
83
+ self.register_n_to_1(sips.product, _("Product"), icon_name="product.svg")
84
+ self.register_2_to_1(
85
+ sips.division,
86
+ _("Division"),
87
+ icon_name="division.svg",
88
+ obj2_name=_("divider"),
89
+ )
90
+ self.register_1_to_1(sips.inverse, _("Inverse"), icon_name="inverse.svg")
91
+ self.register_2_to_1(
92
+ sips.arithmetic,
93
+ _("Arithmetic"),
94
+ paramclass=sigima_base.ArithmeticParam,
95
+ icon_name="arithmetic.svg",
96
+ obj2_name=_("signal to operate with"),
97
+ )
98
+ self.register_1_to_1(
99
+ sips.addition_constant,
100
+ _("Add constant"),
101
+ paramclass=sigima_base.ConstantParam,
102
+ icon_name="constant_add.svg",
103
+ )
104
+ self.register_1_to_1(
105
+ sips.difference_constant,
106
+ _("Subtract constant"),
107
+ paramclass=sigima_base.ConstantParam,
108
+ icon_name="constant_subtract.svg",
109
+ )
110
+ self.register_1_to_1(
111
+ sips.product_constant,
112
+ _("Multiply by constant"),
113
+ paramclass=sigima_base.ConstantParam,
114
+ icon_name="constant_multiply.svg",
115
+ )
116
+ self.register_1_to_1(
117
+ sips.division_constant,
118
+ _("Divide by constant"),
119
+ paramclass=sigima_base.ConstantParam,
120
+ icon_name="constant_divide.svg",
121
+ )
122
+ self.register_1_to_1(sips.absolute, _("Absolute value"), icon_name="abs.svg")
123
+ self.register_1_to_1(
124
+ sips.phase,
125
+ _("Phase"),
126
+ paramclass=sigima.params.PhaseParam,
127
+ icon_name="phase.svg",
128
+ )
129
+ self.register_2_to_1(
130
+ sips.complex_from_magnitude_phase,
131
+ _("Combine with phase"),
132
+ paramclass=sigima_base.AngleUnitParam,
133
+ icon_name="complex_from_magnitude_phase.svg",
134
+ comment=_("Create a complex-valued signal from magnitude and phase"),
135
+ obj2_name=_("phase"),
136
+ )
137
+ self.register_1_to_1(sips.real, _("Real part"), icon_name="re.svg")
138
+ self.register_1_to_1(sips.imag, _("Imaginary part"), icon_name="im.svg")
139
+ self.register_2_to_1(
140
+ sips.complex_from_real_imag,
141
+ _("Combine with imaginary part"),
142
+ icon_name="complex_from_real_imag.svg",
143
+ comment=_("Create a complex-valued signal from real and imaginary parts"),
144
+ obj2_name=_("imaginary part"),
145
+ )
146
+ self.register_1_to_1(
147
+ sips.astype,
148
+ _("Convert data type"),
149
+ paramclass=sigima.params.DataTypeSParam,
150
+ icon_name="convert_dtype.svg",
151
+ )
152
+ self.register_1_to_1(sips.exp, _("Exponential"), icon_name="exp.svg")
153
+ self.register_1_to_1(
154
+ sips.log10, _("Logarithm (base 10)"), icon_name="log10.svg"
155
+ )
156
+ self.register_1_to_1(sips.sqrt, _("Square root"), icon_name="sqrt.svg")
157
+ self.register_1_to_1(
158
+ sips.derivative, _("Derivative"), icon_name="derivative.svg"
159
+ )
160
+ self.register_1_to_1(sips.integral, _("Integral"), icon_name="integral.svg")
161
+ self.register_2_to_1(
162
+ sips.convolution,
163
+ _("Convolution"),
164
+ icon_name="convolution.svg",
165
+ obj2_name=_("signal to convolve with"),
166
+ )
167
+ self.register_2_to_1(
168
+ sips.deconvolution,
169
+ _("Deconvolution"),
170
+ icon_name="deconvolution.svg",
171
+ obj2_name=_("signal to deconvolve with"),
172
+ )
173
+ self.register_n_to_1(
174
+ sips.signals_to_image,
175
+ _("Assemble signals into image"),
176
+ paramclass=sigima_base.SignalsToImageParam,
177
+ icon_name="signals_to_image.svg",
178
+ comment=_(
179
+ "Assemble multiple signals into a 2D image.\n"
180
+ "Signals can be stacked as rows or columns, "
181
+ "with optional normalization."
182
+ ),
183
+ )
184
+
185
+ def register_processing(self) -> None:
186
+ """Register processing functions."""
187
+ # Axis transformation
188
+ self.register_1_to_1(
189
+ sips.calibration,
190
+ _("Linear calibration"),
191
+ sips.XYCalibrateParam,
192
+ comment=_(
193
+ "Apply linear calibration to the X or Y axis:\n"
194
+ " • x' = ax + b\n"
195
+ " • y' = ay + b"
196
+ ),
197
+ )
198
+ self.register_1_to_1(
199
+ sips.transpose, _("Swap X/Y axes"), icon_name="swap_x_y.svg"
200
+ )
201
+ self.register_1_to_1(
202
+ sips.reverse_x,
203
+ _("Reverse X-axis"),
204
+ icon_name="reverse_signal_x.svg",
205
+ )
206
+ self.register_1_to_1(
207
+ sips.to_polar,
208
+ _("Convert to polar coordinates"),
209
+ paramclass=sigima.params.AngleUnitParam,
210
+ )
211
+ self.register_1_to_1(
212
+ sips.to_cartesian,
213
+ _("Convert to cartesian coordinates"),
214
+ paramclass=sigima.params.AngleUnitParam,
215
+ )
216
+ # Level adjustment
217
+ self.register_1_to_1(
218
+ sips.normalize,
219
+ _("Normalize"),
220
+ sigima_base.NormalizeParam,
221
+ "normalize.svg",
222
+ )
223
+ self.register_1_to_1(
224
+ sips.clip, _("Clipping"), sigima_base.ClipParam, "clip.svg"
225
+ )
226
+ self.register_1_to_1(
227
+ sips.offset_correction,
228
+ _("Offset correction"),
229
+ icon_name="offset_correction.svg",
230
+ comment=_("Evaluate and subtract the offset value from the data"),
231
+ )
232
+ # Noise addition
233
+ self.register_1_to_1(
234
+ sips.add_gaussian_noise, _("Add Gaussian noise"), NormalDistributionParam
235
+ )
236
+ self.register_1_to_1(
237
+ sips.add_poisson_noise, _("Add Poisson noise"), PoissonDistributionParam
238
+ )
239
+ self.register_1_to_1(
240
+ sips.add_uniform_noise, _("Add uniform noise"), UniformDistributionParam
241
+ )
242
+ # Noise reduction
243
+ self.register_1_to_1(
244
+ sips.gaussian_filter,
245
+ _("Gaussian filter"),
246
+ sigima_base.GaussianParam,
247
+ )
248
+ self.register_1_to_1(
249
+ sips.moving_average,
250
+ _("Moving average"),
251
+ sigima_base.MovingAverageParam,
252
+ )
253
+ self.register_1_to_1(
254
+ sips.moving_median,
255
+ _("Moving median"),
256
+ sigima_base.MovingMedianParam,
257
+ )
258
+ self.register_1_to_1(sips.wiener, _("Wiener filter"))
259
+ # Fourier analysis
260
+ self.register_1_to_1(
261
+ sips.zero_padding,
262
+ _("Zero padding"),
263
+ sips.ZeroPadding1DParam,
264
+ comment=_(
265
+ "Zero padding is used to increase the frequency resolution of the FFT"
266
+ ),
267
+ )
268
+ self.register_1_to_1(
269
+ sips.fft,
270
+ _("FFT"),
271
+ sigima_base.FFTParam,
272
+ comment=_(
273
+ "Fast Fourier Transform (FFT) is an estimation of the "
274
+ "Discrete Fourier Transform (DFT). "
275
+ "Results are complex numbers, but only the real part is plotted."
276
+ ),
277
+ edit=False,
278
+ )
279
+ self.register_1_to_1(
280
+ sips.ifft,
281
+ _("Inverse FFT"),
282
+ comment=_(
283
+ "Inverse Fast Fourier Transform (IFFT) is an estimation of the "
284
+ "Inverse Discrete Fourier Transform (IDFT). "
285
+ "Results are complex numbers, but only the real part is plotted."
286
+ ),
287
+ edit=False,
288
+ )
289
+ self.register_1_to_1(
290
+ sips.magnitude_spectrum,
291
+ _("Magnitude spectrum"),
292
+ paramclass=sigima.params.SpectrumParam,
293
+ comment=_(
294
+ "Magnitude spectrum is the absolute value of the FFT result. "
295
+ "It is a measure of the amplitude of the frequency components."
296
+ ),
297
+ )
298
+ self.register_1_to_1(
299
+ sips.phase_spectrum,
300
+ _("Phase spectrum"),
301
+ comment=_(
302
+ "Phase spectrum is the angle of the FFT result. "
303
+ "It is a measure of the phase of the frequency components."
304
+ ),
305
+ )
306
+ self.register_1_to_1(
307
+ sips.psd,
308
+ _("Power spectral density"),
309
+ paramclass=sigima.params.SpectrumParam,
310
+ comment=_(
311
+ "Power spectral density (PSD) is the square of the magnitude spectrum. "
312
+ "It is a measure of the power of the frequency components."
313
+ ),
314
+ )
315
+
316
+ self.register_1_to_1(
317
+ sips.power,
318
+ _("Power"),
319
+ paramclass=sigima.params.PowerParam,
320
+ icon_name="power.svg",
321
+ )
322
+ self.register_1_to_1(
323
+ sips.peak_detection,
324
+ _("Peak detection"),
325
+ paramclass=sigima.params.PeakDetectionParam,
326
+ icon_name="peak_detect.svg",
327
+ )
328
+ # Frequency filters
329
+ self.register_1_to_1(
330
+ sips.lowpass,
331
+ _("Low-pass filter"),
332
+ sigima.params.LowPassFilterParam,
333
+ "lowpass.svg",
334
+ )
335
+ self.register_1_to_1(
336
+ sips.highpass,
337
+ _("High-pass filter"),
338
+ sigima.params.HighPassFilterParam,
339
+ "highpass.svg",
340
+ )
341
+ self.register_1_to_1(
342
+ sips.bandpass,
343
+ _("Band-pass filter"),
344
+ sigima.params.BandPassFilterParam,
345
+ "bandpass.svg",
346
+ )
347
+ self.register_1_to_1(
348
+ sips.bandstop,
349
+ _("Band-stop filter"),
350
+ sigima.params.BandStopFilterParam,
351
+ "bandstop.svg",
352
+ )
353
+ # Curve fitting
354
+ for fit_name, fit_func in self.FIT_FUNCTIONS:
355
+ icon_name = f"{fit_func.__name__}.svg"
356
+ self.register_1_to_1(fit_func, fit_name, icon_name=icon_name)
357
+
358
+ # Evaluate fit on another signal's x-axis
359
+ self.register_2_to_1(
360
+ sips.evaluate_fit,
361
+ _("Evaluate fit"),
362
+ obj2_name=_("signal for X values"),
363
+ comment=_("Evaluate a fitting curve on the x-axis of another signal"),
364
+ )
365
+
366
+ # Other processing
367
+ self.register_1_to_1(
368
+ sips.apply_window,
369
+ _("Windowing"),
370
+ paramclass=sigima.params.WindowingParam,
371
+ icon_name="windowing.svg",
372
+ comment=_("Apply a window (apodization) function: Hann, Hamming..."),
373
+ )
374
+ self.register_1_to_1(
375
+ sips.detrending,
376
+ _("Detrending"),
377
+ sips.DetrendingParam,
378
+ icon_name="detrending.svg",
379
+ )
380
+ self.register_2_to_1(
381
+ sips.interpolate,
382
+ _("Interpolation"),
383
+ paramclass=sigima.params.InterpolationParam,
384
+ obj2_name=_("signal for X values"),
385
+ icon_name="interpolation.svg",
386
+ skip_xarray_compat=True,
387
+ )
388
+
389
+ self.register_1_to_1(
390
+ sips.resampling,
391
+ _("Resampling"),
392
+ sips.Resampling1DParam,
393
+ icon_name="resampling1d.svg",
394
+ )
395
+ # Stability analysis
396
+ self.register_1_to_1(
397
+ sips.allan_variance,
398
+ _("Allan variance"),
399
+ paramclass=sigima.params.AllanVarianceParam,
400
+ )
401
+ self.register_1_to_1(
402
+ sips.allan_deviation,
403
+ _("Allan deviation"),
404
+ paramclass=sigima.params.AllanVarianceParam,
405
+ )
406
+ self.register_1_to_1(
407
+ sips.overlapping_allan_variance,
408
+ _("Overlapping Allan variance"),
409
+ paramclass=sigima.params.AllanVarianceParam,
410
+ )
411
+ self.register_1_to_1(
412
+ sips.modified_allan_variance,
413
+ _("Modified Allan variance"),
414
+ paramclass=sigima.params.AllanVarianceParam,
415
+ )
416
+ self.register_1_to_1(
417
+ sips.hadamard_variance,
418
+ _("Hadamard variance"),
419
+ paramclass=sigima.params.AllanVarianceParam,
420
+ )
421
+ self.register_1_to_1(
422
+ sips.modified_allan_variance,
423
+ _("Modified Allan variance"),
424
+ paramclass=sigima.params.AllanVarianceParam,
425
+ )
426
+ self.register_1_to_1(
427
+ sips.hadamard_variance,
428
+ _("Hadamard variance"),
429
+ paramclass=sigima.params.AllanVarianceParam,
430
+ )
431
+ self.register_1_to_1(
432
+ sips.modified_allan_variance,
433
+ _("Modified Allan variance"),
434
+ paramclass=sigima.params.AllanVarianceParam,
435
+ )
436
+ self.register_1_to_1(
437
+ sips.hadamard_variance,
438
+ _("Hadamard variance"),
439
+ paramclass=sigima.params.AllanVarianceParam,
440
+ )
441
+ self.register_1_to_1(
442
+ sips.total_variance,
443
+ _("Total variance"),
444
+ paramclass=sigima.params.AllanVarianceParam,
445
+ )
446
+ self.register_1_to_1(
447
+ sips.time_deviation,
448
+ _("Time deviation"),
449
+ paramclass=sigima.params.AllanVarianceParam,
450
+ )
451
+ # Other processing
452
+ self.register_2_to_1(
453
+ sips.xy_mode,
454
+ _("X-Y mode"),
455
+ obj2_name=_("Y-signal of the X-Y mode"),
456
+ comment=_("Plot one signal as a fonction of the other one"),
457
+ )
458
+ self.register_1_to_n(sips.extract_roi, "ROI", icon_name="roi.svg")
459
+
460
+ def register_analysis(self) -> None:
461
+ """Register analysis functions."""
462
+ self.register_1_to_0(sips.stats, _("Statistics"), icon_name="stats.svg")
463
+ self.register_1_to_1(
464
+ sips.histogram,
465
+ _("Histogram"),
466
+ paramclass=sigima.params.HistogramParam,
467
+ icon_name="histogram.svg",
468
+ )
469
+ self.register_1_to_0(
470
+ sips.fwhm,
471
+ _("Full width at half-maximum"),
472
+ paramclass=sips.FWHMParam,
473
+ icon_name="fwhm.svg",
474
+ )
475
+ self.register_1_to_0(
476
+ sips.fw1e2,
477
+ _("Full width at") + " 1/e²",
478
+ icon_name="fw1e2.svg",
479
+ )
480
+ self.register_1_to_0(
481
+ sips.full_width_at_y,
482
+ _("Full width at y=..."),
483
+ paramclass=sips.OrdinateParam,
484
+ comment=_("Compute the full width at a given y value"),
485
+ )
486
+ self.register_1_to_0(
487
+ sips.x_at_y,
488
+ _("First abscissa at y=..."),
489
+ paramclass=sips.OrdinateParam,
490
+ comment=_(
491
+ "Compute the first abscissa at a given y value (linear interpolation)"
492
+ ),
493
+ )
494
+ self.register_1_to_0(
495
+ sips.y_at_x,
496
+ _("Ordinate at x=..."),
497
+ paramclass=sips.AbscissaParam,
498
+ comment=_("Compute the ordinate at a given x value (linear interpolation)"),
499
+ )
500
+ self.register_1_to_0(
501
+ sips.extract_pulse_features,
502
+ _("Extract pulse features"),
503
+ paramclass=sips.PulseFeaturesParam,
504
+ comment=_("Extract pulse features (amplitude, rise time, fall time...)"),
505
+ )
506
+ self.register_1_to_0(
507
+ sips.x_at_minmax,
508
+ _("Abscissa of the minimum and maximum"),
509
+ comment=_(
510
+ "Compute the smallest argument of the minima and the smallest "
511
+ "argument of the maxima"
512
+ ),
513
+ )
514
+ self.register_1_to_0(
515
+ sips.sampling_rate_period,
516
+ _("Sampling rate and period"),
517
+ comment=_(
518
+ "Compute sampling rate and period for a constant sampling signal"
519
+ ),
520
+ )
521
+ self.register_1_to_0(
522
+ sips.dynamic_parameters,
523
+ _("Dynamic parameters"),
524
+ paramclass=sips.DynamicParam,
525
+ comment=_("Compute dynamic parameters: ENOB, SNR, SINAD, THD, ..."),
526
+ )
527
+ self.register_1_to_0(
528
+ sips.bandwidth_3db,
529
+ _("Bandwidth at -3dB"),
530
+ comment=_(
531
+ "Compute bandwidth at -3dB assuming a low-pass filter "
532
+ "already expressed in dB"
533
+ ),
534
+ )
535
+ self.register_1_to_0(
536
+ sips.contrast,
537
+ _("Contrast"),
538
+ comment=_(
539
+ "Compute contrast of a signal, i.e. (max-min)/(max+min), "
540
+ "e.g. for an image profile"
541
+ ),
542
+ )
543
+
544
+ @qt_try_except()
545
+ def compute_offset_correction(self, param: ROI1DParam | None = None) -> None:
546
+ """Compute offset correction
547
+ with :py:func:`sigima.proc.signal.offset_correction`"""
548
+ obj = self.panel.objview.get_sel_objects(include_groups=True)[0]
549
+ if param is None:
550
+ dlg = signalbaseline.SignalBaselineDialog(obj, parent=self.mainwindow)
551
+ if exec_dialog(dlg):
552
+ param = ROI1DParam()
553
+ param.xmin, param.xmax = dlg.get_x_range()
554
+ else:
555
+ return
556
+ self.run_feature("offset_correction", param)
557
+
558
+ @qt_try_except()
559
+ def compute_all_stability(
560
+ self, param: sigima.params.AllanVarianceParam | None = None
561
+ ) -> None:
562
+ """Compute all stability analysis features
563
+ using the following functions:
564
+
565
+ - :py:func:`sigima.proc.signal.allan_variance`
566
+ - :py:func:`sigima.proc.signal.allan_deviation`
567
+ - :py:func:`sigima.proc.signal.overlapping_allan_variance`
568
+ - :py:func:`sigima.proc.signal.modified_allan_variance`
569
+ - :py:func:`sigima.proc.signal.hadamard_variance`
570
+ - :py:func:`sigima.proc.signal.total_variance`
571
+ - :py:func:`sigima.proc.signal.time_deviation`
572
+ """
573
+ if param is None:
574
+ param = sips.AllanVarianceParam()
575
+ if not param.edit(parent=self.mainwindow):
576
+ return
577
+ funcs = [
578
+ sips.allan_variance,
579
+ sips.allan_deviation,
580
+ sips.overlapping_allan_variance,
581
+ sips.modified_allan_variance,
582
+ sips.hadamard_variance,
583
+ sips.total_variance,
584
+ sips.time_deviation,
585
+ ]
586
+ self.compute_multiple_1_to_1(
587
+ funcs, [param] * len(funcs), "Stability", edit=False
588
+ )
589
+
590
+ @qt_try_except()
591
+ def compute_peak_detection(
592
+ self, param: sigima.params.PeakDetectionParam | None = None
593
+ ) -> None:
594
+ """Detect peaks from data
595
+ with :py:func:`sigima.proc.signal.peak_detection`"""
596
+ obj = self.panel.objview.get_sel_objects(include_groups=True)[0]
597
+ edit, param = self.init_param(
598
+ param, sips.PeakDetectionParam, _("Peak detection")
599
+ )
600
+ if edit:
601
+ dlg = signalpeak.SignalPeakDetectionDialog(obj, parent=self.mainwindow)
602
+ if exec_dialog(dlg):
603
+ param.threshold = int(dlg.get_threshold() * 100)
604
+ param.min_dist = dlg.get_min_dist()
605
+ else:
606
+ return
607
+ self.run_feature("peak_detection", param)
608
+
609
+ @qt_try_except()
610
+ def compute_polyfit(
611
+ self, param: sigima.params.PolynomialFitParam | None = None
612
+ ) -> None:
613
+ """Compute polynomial fitting curve"""
614
+ txt = _("Polynomial fit")
615
+ edit, param = self.init_param(param, sips.PolynomialFitParam, txt)
616
+ if not edit or param.edit(self.mainwindow):
617
+ dlgfunc = fitdialog.polynomial_fit
618
+
619
+ def polynomialfit(x, y, parent=None):
620
+ """Polynomial fit dialog function"""
621
+ return dlgfunc(x, y, param.degree, parent=parent)
622
+
623
+ self.compute_fit(txt, polynomialfit)
624
+
625
+ def __row_compute_fit(
626
+ self, obj: SignalObj, name: str, fitdlgfunc: Callable
627
+ ) -> None:
628
+ """Curve fitting computing sub-method"""
629
+ output = fitdlgfunc(obj.x, obj.y, parent=self.mainwindow)
630
+ if output is not None:
631
+ y, params = output
632
+ params: list[fitdialog.FitParam]
633
+ pvalues = {}
634
+ for param in params:
635
+ if re.match(r"[\S\_]*\d{2}$", param.name):
636
+ shname = param.name[:-2]
637
+ value = pvalues.get(shname, np.array([]))
638
+ pvalues[shname] = np.array(list(value) + [param.value])
639
+ else:
640
+ pvalues[param.name] = param.value
641
+ # Creating new signal
642
+ metadata = {fitdlgfunc.__name__: pvalues}
643
+ signal = create_signal(f"{name}({obj.title})", obj.x, y, metadata=metadata)
644
+ # Creating new plot item
645
+ self.panel.add_object(signal)
646
+
647
+ @qt_try_except()
648
+ def compute_fit(self, title: str, fitdlgfunc: Callable) -> None:
649
+ """Compute fitting curve using an interactive dialog
650
+
651
+ Args:
652
+ title: Title of the dialog
653
+ fitdlgfunc: Fitting dialog function
654
+ """
655
+ for obj in self.panel.objview.get_sel_objects():
656
+ self.__row_compute_fit(obj, title, fitdlgfunc)
657
+
658
+ @qt_try_except()
659
+ def compute_multigaussianfit(self) -> None:
660
+ """Compute multi-Gaussian fitting curve using an interactive dialog"""
661
+ fitdlgfunc = fitdialog.multigaussian_fit
662
+ for obj in self.panel.objview.get_sel_objects():
663
+ dlg = signalpeak.SignalPeakDetectionDialog(obj, parent=self.mainwindow)
664
+ if exec_dialog(dlg):
665
+ # Computing x, y
666
+ peaks = dlg.get_peak_indices()
667
+
668
+ def multigaussianfit(x, y, parent=None):
669
+ """Multi-Gaussian fit dialog function"""
670
+ # pylint: disable=cell-var-from-loop
671
+ return fitdlgfunc(x, y, peaks, parent=parent)
672
+
673
+ self.__row_compute_fit(obj, _("Multi-Gaussian fit"), multigaussianfit)
674
+
675
+ @qt_try_except()
676
+ def compute_multilorentzianfit(self) -> None:
677
+ """Compute Multi-Lorentzian fitting curve using an interactive dialog"""
678
+ fitdlgfunc = fitdialog.multilorentzian_fit
679
+ for obj in self.panel.objview.get_sel_objects():
680
+ dlg = signalpeak.SignalPeakDetectionDialog(obj, parent=self.mainwindow)
681
+ if exec_dialog(dlg):
682
+ # Computing x, y
683
+ peaks = dlg.get_peak_indices()
684
+
685
+ def multilorentzianfit(x, y, parent=None):
686
+ """Multi-Lorentzian fit dialog function"""
687
+ # pylint: disable=cell-var-from-loop
688
+ return fitdlgfunc(x, y, peaks, parent=parent)
689
+
690
+ self.__row_compute_fit(
691
+ obj, _("Multi-Lorentzian fit"), multilorentzianfit
692
+ )
693
+
694
+ @qt_try_except()
695
+ def _extract_multiple_roi_in_single_object(self, params: list[ROI1DParam]) -> None:
696
+ """Extract multiple Regions Of Interest (ROIs) from data in a single object"""
697
+ # TODO: This `compute_1_to_1` call is not ideal, as it passes a list of
698
+ # parameter sets (`params` is a list of `DataSet` objects) instead of a single
699
+ # parameter set as expected by the method. Currently, the method implementation
700
+ # is compatible with this call, and it simply passes the second argument through
701
+ # to the `extract_rois` function. However, this should be rectified in the
702
+ # future to ensure that the method signature and its usage are consistent.
703
+ self.compute_1_to_1(sips.extract_rois, params, title=_("Extract ROI"))
704
+
705
+ # ------Signal Analysis
706
+
707
+ @qt_try_except()
708
+ def compute_full_width_at_y(
709
+ self, param: sigima.params.OrdinateParam | None = None
710
+ ) -> dict[str, GeometryResult] | None:
711
+ """Compute full width at a given y
712
+ with :py:func:`sigima.proc.signal.full_width_at_y`"""
713
+ if param is None:
714
+ obj = self.panel.objview.get_sel_objects(include_groups=True)[0]
715
+ dlg = signaldeltax.SignalDeltaXDialog(obj, parent=self.mainwindow)
716
+ if exec_dialog(dlg):
717
+ param = sips.OrdinateParam(_("Full width at y"))
718
+ param.y = dlg.get_y_value()
719
+ else:
720
+ return None
721
+ return self.run_feature("full_width_at_y", param)
722
+
723
+ @qt_try_except()
724
+ def compute_x_at_y(
725
+ self, param: sips.OrdinateParam | None = None
726
+ ) -> dict[str, TableResult] | None:
727
+ """Compute x at y with :py:func:`sigima.proc.signal.x_at_y`."""
728
+ if param is None:
729
+ obj = self.panel.objview.get_sel_objects(include_groups=True)[0]
730
+ dlg = signalcursor.SignalCursorDialog(
731
+ obj, cursor_orientation="horizontal", parent=self.mainwindow
732
+ )
733
+ if exec_dialog(dlg):
734
+ param = sips.OrdinateParam(_("Abscissa at y"))
735
+ param.y = dlg.get_y_value()
736
+ else:
737
+ return None
738
+ return self.run_feature("x_at_y", param)
739
+
740
+ @qt_try_except()
741
+ def compute_y_at_x(
742
+ self, param: sips.AbscissaParam | None = None
743
+ ) -> dict[str, TableResult] | None:
744
+ """Compute y at x with :py:func:`sigima.proc.signal.y_at_x`."""
745
+ if param is None:
746
+ obj = self.panel.objview.get_sel_objects(include_groups=True)[0]
747
+ dlg = signalcursor.SignalCursorDialog(
748
+ obj, cursor_orientation="vertical", parent=self.mainwindow
749
+ )
750
+ if exec_dialog(dlg):
751
+ param = sips.AbscissaParam(_("Ordinate at x"))
752
+ param.x = dlg.get_x_value()
753
+ else:
754
+ return None
755
+ return self.run_feature("y_at_x", param)