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.
- datalab/__init__.py +35 -2
- datalab/adapters_metadata/__init__.py +31 -0
- datalab/adapters_metadata/base_adapter.py +316 -0
- datalab/adapters_metadata/common.py +422 -0
- datalab/adapters_metadata/geometry_adapter.py +98 -0
- datalab/adapters_metadata/table_adapter.py +84 -0
- datalab/adapters_plotpy/__init__.py +54 -0
- datalab/adapters_plotpy/annotations.py +124 -0
- datalab/adapters_plotpy/base.py +110 -0
- datalab/adapters_plotpy/converters.py +86 -0
- datalab/adapters_plotpy/factories.py +80 -0
- datalab/adapters_plotpy/objects/__init__.py +0 -0
- datalab/adapters_plotpy/objects/base.py +197 -0
- datalab/adapters_plotpy/objects/image.py +157 -0
- datalab/adapters_plotpy/objects/scalar.py +565 -0
- datalab/adapters_plotpy/objects/signal.py +264 -0
- datalab/adapters_plotpy/roi/__init__.py +0 -0
- datalab/adapters_plotpy/roi/base.py +146 -0
- datalab/adapters_plotpy/roi/factory.py +93 -0
- datalab/adapters_plotpy/roi/image.py +207 -0
- datalab/adapters_plotpy/roi/signal.py +72 -0
- datalab/app.py +98 -0
- datalab/config.py +817 -0
- datalab/control/__init__.py +0 -0
- datalab/control/baseproxy.py +776 -0
- datalab/control/proxy.py +343 -0
- datalab/control/remote.py +1005 -0
- datalab/data/doc/DataLab_en.pdf +0 -0
- datalab/data/doc/DataLab_fr.pdf +0 -0
- datalab/data/icons/analysis/delete_results.svg +109 -0
- datalab/data/icons/analysis/fw1e2.svg +156 -0
- datalab/data/icons/analysis/fwhm.svg +156 -0
- datalab/data/icons/analysis/histogram.svg +49 -0
- datalab/data/icons/analysis/peak_detect.svg +160 -0
- datalab/data/icons/analysis/plot_results.svg +151 -0
- datalab/data/icons/analysis/show_results.svg +83 -0
- datalab/data/icons/analysis/stats.svg +49 -0
- datalab/data/icons/analysis.svg +120 -0
- datalab/data/icons/apply.svg +3 -0
- datalab/data/icons/check_all.svg +15 -0
- datalab/data/icons/collapse.svg +44 -0
- datalab/data/icons/collapse_selection.svg +63 -0
- datalab/data/icons/console.svg +101 -0
- datalab/data/icons/create/1d-normal.svg +8 -0
- datalab/data/icons/create/1d-poisson.svg +9 -0
- datalab/data/icons/create/1d-uniform.svg +8 -0
- datalab/data/icons/create/1d-zero.svg +57 -0
- datalab/data/icons/create/2d-gaussian.svg +56 -0
- datalab/data/icons/create/2d-normal.svg +38 -0
- datalab/data/icons/create/2d-poisson.svg +38 -0
- datalab/data/icons/create/2d-ramp.svg +90 -0
- datalab/data/icons/create/2d-sinc.svg +62 -0
- datalab/data/icons/create/2d-uniform.svg +38 -0
- datalab/data/icons/create/2d-zero.svg +13 -0
- datalab/data/icons/create/checkerboard.svg +39 -0
- datalab/data/icons/create/cosine.svg +12 -0
- datalab/data/icons/create/exponential.svg +55 -0
- datalab/data/icons/create/gaussian.svg +12 -0
- datalab/data/icons/create/grating.svg +29 -0
- datalab/data/icons/create/linear_chirp.svg +7 -0
- datalab/data/icons/create/logistic.svg +7 -0
- datalab/data/icons/create/lorentzian.svg +12 -0
- datalab/data/icons/create/planck.svg +12 -0
- datalab/data/icons/create/polynomial.svg +7 -0
- datalab/data/icons/create/pulse.svg +12 -0
- datalab/data/icons/create/ring.svg +18 -0
- datalab/data/icons/create/sawtooth.svg +7 -0
- datalab/data/icons/create/siemens.svg +35 -0
- datalab/data/icons/create/sinc.svg +12 -0
- datalab/data/icons/create/sine.svg +7 -0
- datalab/data/icons/create/square.svg +7 -0
- datalab/data/icons/create/square_pulse.svg +7 -0
- datalab/data/icons/create/step.svg +7 -0
- datalab/data/icons/create/step_pulse.svg +12 -0
- datalab/data/icons/create/triangle.svg +7 -0
- datalab/data/icons/create/voigt.svg +12 -0
- datalab/data/icons/edit/annotations.svg +72 -0
- datalab/data/icons/edit/annotations_copy.svg +114 -0
- datalab/data/icons/edit/annotations_delete.svg +83 -0
- datalab/data/icons/edit/annotations_edit.svg +98 -0
- datalab/data/icons/edit/annotations_export.svg +85 -0
- datalab/data/icons/edit/annotations_import.svg +85 -0
- datalab/data/icons/edit/annotations_paste.svg +100 -0
- datalab/data/icons/edit/copy_titles.svg +109 -0
- datalab/data/icons/edit/delete.svg +84 -0
- datalab/data/icons/edit/delete_all.svg +214 -0
- datalab/data/icons/edit/duplicate.svg +64 -0
- datalab/data/icons/edit/goto_source.svg +60 -0
- datalab/data/icons/edit/metadata.svg +60 -0
- datalab/data/icons/edit/metadata_add.svg +80 -0
- datalab/data/icons/edit/metadata_copy.svg +96 -0
- datalab/data/icons/edit/metadata_delete.svg +62 -0
- datalab/data/icons/edit/metadata_export.svg +68 -0
- datalab/data/icons/edit/metadata_import.svg +68 -0
- datalab/data/icons/edit/metadata_paste.svg +79 -0
- datalab/data/icons/edit/move_down.svg +55 -0
- datalab/data/icons/edit/move_up.svg +54 -0
- datalab/data/icons/edit/new_group.svg +76 -0
- datalab/data/icons/edit/recompute.svg +60 -0
- datalab/data/icons/edit/rename.svg +49 -0
- datalab/data/icons/edit.svg +16 -0
- datalab/data/icons/expand.svg +44 -0
- datalab/data/icons/expand_selection.svg +63 -0
- datalab/data/icons/fit/cdf_fit.svg +56 -0
- datalab/data/icons/fit/exponential_fit.svg +55 -0
- datalab/data/icons/fit/gaussian_fit.svg +62 -0
- datalab/data/icons/fit/interactive_fit.svg +101 -0
- datalab/data/icons/fit/linear_fit.svg +57 -0
- datalab/data/icons/fit/lorentzian_fit.svg +209 -0
- datalab/data/icons/fit/multigaussian_fit.svg +85 -0
- datalab/data/icons/fit/multilorentzian_fit.svg +85 -0
- datalab/data/icons/fit/piecewiseexponential_fit.svg +209 -0
- datalab/data/icons/fit/planckian_fit.svg +62 -0
- datalab/data/icons/fit/polynomial_fit.svg +59 -0
- datalab/data/icons/fit/sigmoid_fit.svg +56 -0
- datalab/data/icons/fit/sinusoidal_fit.svg +72 -0
- datalab/data/icons/fit/twohalfgaussian_fit.svg +63 -0
- datalab/data/icons/fit/voigt_fit.svg +57 -0
- datalab/data/icons/group.svg +56 -0
- datalab/data/icons/h5/h5array.svg +59 -0
- datalab/data/icons/h5/h5attrs.svg +75 -0
- datalab/data/icons/h5/h5browser.svg +133 -0
- datalab/data/icons/h5/h5file.svg +69 -0
- datalab/data/icons/h5/h5group.svg +49 -0
- datalab/data/icons/h5/h5scalar.svg +1 -0
- datalab/data/icons/help_pdf.svg +46 -0
- datalab/data/icons/history.svg +7 -0
- datalab/data/icons/image.svg +135 -0
- datalab/data/icons/io/fileopen_directory.svg +60 -0
- datalab/data/icons/io/fileopen_h5.svg +84 -0
- datalab/data/icons/io/fileopen_ima.svg +187 -0
- datalab/data/icons/io/fileopen_py.svg +123 -0
- datalab/data/icons/io/fileopen_sig.svg +138 -0
- datalab/data/icons/io/filesave_h5.svg +97 -0
- datalab/data/icons/io/filesave_ima.svg +200 -0
- datalab/data/icons/io/filesave_py.svg +136 -0
- datalab/data/icons/io/filesave_sig.svg +151 -0
- datalab/data/icons/io/import_text.svg +144 -0
- datalab/data/icons/io/save_to_directory.svg +134 -0
- datalab/data/icons/io.svg +84 -0
- datalab/data/icons/libre-camera-flash-off.svg +1 -0
- datalab/data/icons/libre-camera-flash-on.svg +1 -0
- datalab/data/icons/libre-gui-about.svg +1 -0
- datalab/data/icons/libre-gui-action-delete.svg +1 -0
- datalab/data/icons/libre-gui-add.svg +1 -0
- datalab/data/icons/libre-gui-arrow-down.svg +1 -0
- datalab/data/icons/libre-gui-arrow-left.svg +1 -0
- datalab/data/icons/libre-gui-arrow-right.svg +1 -0
- datalab/data/icons/libre-gui-arrow-up.svg +1 -0
- datalab/data/icons/libre-gui-close.svg +40 -0
- datalab/data/icons/libre-gui-cogs.svg +1 -0
- datalab/data/icons/libre-gui-globe.svg +1 -0
- datalab/data/icons/libre-gui-help.svg +1 -0
- datalab/data/icons/libre-gui-link.svg +1 -0
- datalab/data/icons/libre-gui-menu.svg +1 -0
- datalab/data/icons/libre-gui-pencil.svg +1 -0
- datalab/data/icons/libre-gui-plugin.svg +1 -0
- datalab/data/icons/libre-gui-questions.svg +1 -0
- datalab/data/icons/libre-gui-settings.svg +1 -0
- datalab/data/icons/libre-gui-unlink.svg +1 -0
- datalab/data/icons/libre-tech-ram.svg +1 -0
- datalab/data/icons/libre-toolbox.svg +1 -0
- datalab/data/icons/logs.svg +1 -0
- datalab/data/icons/markers.svg +74 -0
- datalab/data/icons/menu.svg +13 -0
- datalab/data/icons/new_ima.svg +148 -0
- datalab/data/icons/new_sig.svg +123 -0
- datalab/data/icons/operations/abs.svg +116 -0
- datalab/data/icons/operations/arithmetic.svg +123 -0
- datalab/data/icons/operations/average.svg +124 -0
- datalab/data/icons/operations/complex_from_magnitude_phase.svg +116 -0
- datalab/data/icons/operations/complex_from_real_imag.svg +124 -0
- datalab/data/icons/operations/constant.svg +116 -0
- datalab/data/icons/operations/constant_add.svg +109 -0
- datalab/data/icons/operations/constant_divide.svg +109 -0
- datalab/data/icons/operations/constant_multiply.svg +109 -0
- datalab/data/icons/operations/constant_subtract.svg +109 -0
- datalab/data/icons/operations/convert_dtype.svg +117 -0
- datalab/data/icons/operations/convolution.svg +46 -0
- datalab/data/icons/operations/deconvolution.svg +57 -0
- datalab/data/icons/operations/derivative.svg +127 -0
- datalab/data/icons/operations/difference.svg +52 -0
- datalab/data/icons/operations/division.svg +139 -0
- datalab/data/icons/operations/exp.svg +116 -0
- datalab/data/icons/operations/flip_horizontally.svg +69 -0
- datalab/data/icons/operations/flip_vertically.svg +74 -0
- datalab/data/icons/operations/im.svg +124 -0
- datalab/data/icons/operations/integral.svg +50 -0
- datalab/data/icons/operations/inverse.svg +143 -0
- datalab/data/icons/operations/log10.svg +109 -0
- datalab/data/icons/operations/phase.svg +116 -0
- datalab/data/icons/operations/power.svg +118 -0
- datalab/data/icons/operations/product.svg +124 -0
- datalab/data/icons/operations/profile.svg +379 -0
- datalab/data/icons/operations/profile_average.svg +399 -0
- datalab/data/icons/operations/profile_radial.svg +261 -0
- datalab/data/icons/operations/profile_segment.svg +262 -0
- datalab/data/icons/operations/quadratic_difference.svg +84 -0
- datalab/data/icons/operations/re.svg +124 -0
- datalab/data/icons/operations/rotate_left.svg +72 -0
- datalab/data/icons/operations/rotate_right.svg +72 -0
- datalab/data/icons/operations/signals_to_image.svg +314 -0
- datalab/data/icons/operations/sqrt.svg +110 -0
- datalab/data/icons/operations/std.svg +124 -0
- datalab/data/icons/operations/sum.svg +102 -0
- datalab/data/icons/play_demo.svg +9 -0
- datalab/data/icons/processing/axis_transform.svg +62 -0
- datalab/data/icons/processing/bandpass.svg +79 -0
- datalab/data/icons/processing/bandstop.svg +71 -0
- datalab/data/icons/processing/binning.svg +126 -0
- datalab/data/icons/processing/clip.svg +119 -0
- datalab/data/icons/processing/detrending.svg +173 -0
- datalab/data/icons/processing/distribute_on_grid.svg +769 -0
- datalab/data/icons/processing/edge_detection.svg +46 -0
- datalab/data/icons/processing/erase.svg +1 -0
- datalab/data/icons/processing/exposure.svg +143 -0
- datalab/data/icons/processing/fourier.svg +104 -0
- datalab/data/icons/processing/highpass.svg +59 -0
- datalab/data/icons/processing/interpolation.svg +71 -0
- datalab/data/icons/processing/level_adjustment.svg +70 -0
- datalab/data/icons/processing/lowpass.svg +60 -0
- datalab/data/icons/processing/morphology.svg +49 -0
- datalab/data/icons/processing/noise_addition.svg +114 -0
- datalab/data/icons/processing/noise_reduction.svg +38 -0
- datalab/data/icons/processing/normalize.svg +84 -0
- datalab/data/icons/processing/offset_correction.svg +131 -0
- datalab/data/icons/processing/resampling1d.svg +101 -0
- datalab/data/icons/processing/resampling2d.svg +240 -0
- datalab/data/icons/processing/reset_positions.svg +185 -0
- datalab/data/icons/processing/resize.svg +9 -0
- datalab/data/icons/processing/reverse_signal_x.svg +171 -0
- datalab/data/icons/processing/stability.svg +11 -0
- datalab/data/icons/processing/swap_x_y.svg +65 -0
- datalab/data/icons/processing/thresholding.svg +63 -0
- datalab/data/icons/processing/windowing.svg +45 -0
- datalab/data/icons/properties.svg +26 -0
- datalab/data/icons/reset.svg +9 -0
- datalab/data/icons/restore.svg +40 -0
- datalab/data/icons/roi/roi.svg +76 -0
- datalab/data/icons/roi/roi_coordinate.svg +78 -0
- datalab/data/icons/roi/roi_copy.svg +112 -0
- datalab/data/icons/roi/roi_delete.svg +81 -0
- datalab/data/icons/roi/roi_export.svg +87 -0
- datalab/data/icons/roi/roi_graphical.svg +78 -0
- datalab/data/icons/roi/roi_grid.svg +67 -0
- datalab/data/icons/roi/roi_ima.svg +188 -0
- datalab/data/icons/roi/roi_import.svg +87 -0
- datalab/data/icons/roi/roi_new.svg +81 -0
- datalab/data/icons/roi/roi_new_circle.svg +95 -0
- datalab/data/icons/roi/roi_new_polygon.svg +110 -0
- datalab/data/icons/roi/roi_new_rectangle.svg +70 -0
- datalab/data/icons/roi/roi_paste.svg +98 -0
- datalab/data/icons/roi/roi_sig.svg +124 -0
- datalab/data/icons/shapes.svg +134 -0
- datalab/data/icons/signal.svg +103 -0
- datalab/data/icons/table.svg +85 -0
- datalab/data/icons/table_unavailable.svg +102 -0
- datalab/data/icons/to_signal.svg +124 -0
- datalab/data/icons/tour/next.svg +44 -0
- datalab/data/icons/tour/previous.svg +44 -0
- datalab/data/icons/tour/rewind.svg +51 -0
- datalab/data/icons/tour/stop.svg +47 -0
- datalab/data/icons/tour/tour.svg +16 -0
- datalab/data/icons/uncheck_all.svg +78 -0
- datalab/data/icons/view/curve_antialiasing.svg +50 -0
- datalab/data/icons/view/new_window.svg +98 -0
- datalab/data/icons/view/refresh-auto.svg +57 -0
- datalab/data/icons/view/refresh-manual.svg +51 -0
- datalab/data/icons/view/reset_curve_styles.svg +96 -0
- datalab/data/icons/view/show_first.svg +55 -0
- datalab/data/icons/view/show_titles.svg +46 -0
- datalab/data/icons/visualization.svg +51 -0
- datalab/data/logo/DataLab-Banner-150.png +0 -0
- datalab/data/logo/DataLab-Banner-200.png +0 -0
- datalab/data/logo/DataLab-Banner2-100.png +0 -0
- datalab/data/logo/DataLab-Splash.png +0 -0
- datalab/data/logo/DataLab-watermark.png +0 -0
- datalab/data/logo/DataLab.svg +83 -0
- datalab/data/tests/reordering_test.h5 +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot1.jpg +0 -0
- datalab/data/tutorials/fabry_perot/fabry-perot2.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_13.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_18.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_23.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_30.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_35.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_40.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_45.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_50.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_55.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_60.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_65.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_70.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_75.jpg +0 -0
- datalab/data/tutorials/laser_beam/TEM00_z_80.jpg +0 -0
- datalab/env.py +542 -0
- datalab/gui/__init__.py +89 -0
- datalab/gui/actionhandler.py +1701 -0
- datalab/gui/docks.py +473 -0
- datalab/gui/h5io.py +150 -0
- datalab/gui/macroeditor.py +310 -0
- datalab/gui/main.py +2081 -0
- datalab/gui/newobject.py +217 -0
- datalab/gui/objectview.py +766 -0
- datalab/gui/panel/__init__.py +48 -0
- datalab/gui/panel/base.py +3254 -0
- datalab/gui/panel/image.py +157 -0
- datalab/gui/panel/macro.py +607 -0
- datalab/gui/panel/signal.py +164 -0
- datalab/gui/plothandler.py +800 -0
- datalab/gui/processor/__init__.py +84 -0
- datalab/gui/processor/base.py +2456 -0
- datalab/gui/processor/catcher.py +75 -0
- datalab/gui/processor/image.py +1214 -0
- datalab/gui/processor/signal.py +755 -0
- datalab/gui/profiledialog.py +333 -0
- datalab/gui/roieditor.py +633 -0
- datalab/gui/roigrideditor.py +208 -0
- datalab/gui/settings.py +612 -0
- datalab/gui/tour.py +908 -0
- datalab/h5/__init__.py +12 -0
- datalab/h5/common.py +314 -0
- datalab/h5/generic.py +580 -0
- datalab/h5/native.py +39 -0
- datalab/h5/utils.py +95 -0
- datalab/objectmodel.py +640 -0
- datalab/plugins/_readme_.txt +9 -0
- datalab/plugins/datalab_imageformats.py +175 -0
- datalab/plugins/datalab_testdata.py +190 -0
- datalab/plugins.py +355 -0
- datalab/tests/__init__.py +199 -0
- datalab/tests/backbone/__init__.py +1 -0
- datalab/tests/backbone/config_unit_test.py +170 -0
- datalab/tests/backbone/config_versioning_unit_test.py +34 -0
- datalab/tests/backbone/dictlistserial_app_test.py +38 -0
- datalab/tests/backbone/errorcatcher_unit_test.py +69 -0
- datalab/tests/backbone/errormsgbox_unit_test.py +50 -0
- datalab/tests/backbone/execenv_unit.py +262 -0
- datalab/tests/backbone/loadtest_gdi.py +147 -0
- datalab/tests/backbone/long_callback.py +96 -0
- datalab/tests/backbone/main_app_test.py +137 -0
- datalab/tests/backbone/memory_leak.py +43 -0
- datalab/tests/backbone/procisolation1_unit.py +128 -0
- datalab/tests/backbone/procisolation2_unit.py +171 -0
- datalab/tests/backbone/procisolation_unit_test.py +22 -0
- datalab/tests/backbone/profiling_app.py +27 -0
- datalab/tests/backbone/strings_unit_test.py +65 -0
- datalab/tests/backbone/title_formatting_unit_test.py +82 -0
- datalab/tests/conftest.py +131 -0
- datalab/tests/features/__init__.py +1 -0
- datalab/tests/features/applauncher/__init__.py +1 -0
- datalab/tests/features/applauncher/launcher1_app_test.py +28 -0
- datalab/tests/features/applauncher/launcher2_app_test.py +30 -0
- datalab/tests/features/common/__init__.py +1 -0
- datalab/tests/features/common/add_metadata_app_test.py +134 -0
- datalab/tests/features/common/add_metadata_unit_test.py +267 -0
- datalab/tests/features/common/annotations_management_unit_test.py +152 -0
- datalab/tests/features/common/auto_analysis_recompute_unit_test.py +240 -0
- datalab/tests/features/common/createobject_unit_test.py +50 -0
- datalab/tests/features/common/geometry_results_app_test.py +135 -0
- datalab/tests/features/common/interactive_processing_test.py +1109 -0
- datalab/tests/features/common/io_app_test.py +75 -0
- datalab/tests/features/common/large_results_app_test.py +187 -0
- datalab/tests/features/common/metadata_all_patterns_test.py +103 -0
- datalab/tests/features/common/metadata_app_test.py +139 -0
- datalab/tests/features/common/metadata_io_unit_test.py +60 -0
- datalab/tests/features/common/misc_app_test.py +236 -0
- datalab/tests/features/common/multiple_geometry_results_unit_test.py +122 -0
- datalab/tests/features/common/multiple_table_results_unit_test.py +64 -0
- datalab/tests/features/common/operation_modes_app_test.py +392 -0
- datalab/tests/features/common/plot_results_app_test.py +278 -0
- datalab/tests/features/common/reorder_app_test.py +75 -0
- datalab/tests/features/common/result_deletion_unit_test.py +96 -0
- datalab/tests/features/common/result_merged_label_unit_test.py +154 -0
- datalab/tests/features/common/result_shape_settings_unit_test.py +223 -0
- datalab/tests/features/common/roi_plotitem_unit_test.py +64 -0
- datalab/tests/features/common/roieditor_unit_test.py +102 -0
- datalab/tests/features/common/save_to_dir_app_test.py +163 -0
- datalab/tests/features/common/save_to_dir_unit_test.py +474 -0
- datalab/tests/features/common/stat_app_test.py +40 -0
- datalab/tests/features/common/stats_tools_unit_test.py +77 -0
- datalab/tests/features/common/table_results_app_test.py +52 -0
- datalab/tests/features/common/textimport_unit_test.py +131 -0
- datalab/tests/features/common/uuid_preservation_test.py +281 -0
- datalab/tests/features/common/worker_unit_test.py +402 -0
- datalab/tests/features/control/__init__.py +1 -0
- datalab/tests/features/control/connect_dialog.py +28 -0
- datalab/tests/features/control/embedded1_unit_test.py +304 -0
- datalab/tests/features/control/embedded2_unit_test.py +52 -0
- datalab/tests/features/control/remoteclient_app_test.py +219 -0
- datalab/tests/features/control/remoteclient_unit.py +75 -0
- datalab/tests/features/control/simpleclient_unit_test.py +321 -0
- datalab/tests/features/hdf5/__init__.py +1 -0
- datalab/tests/features/hdf5/h5browser1_unit_test.py +31 -0
- datalab/tests/features/hdf5/h5browser2_unit.py +55 -0
- datalab/tests/features/hdf5/h5browser_app_test.py +77 -0
- datalab/tests/features/hdf5/h5import_app_test.py +25 -0
- datalab/tests/features/hdf5/h5importer_app_test.py +34 -0
- datalab/tests/features/image/__init__.py +1 -0
- datalab/tests/features/image/annotations_app_test.py +28 -0
- datalab/tests/features/image/annotations_unit_test.py +80 -0
- datalab/tests/features/image/average_app_test.py +46 -0
- datalab/tests/features/image/background_dialog_test.py +70 -0
- datalab/tests/features/image/blobs_app_test.py +50 -0
- datalab/tests/features/image/contour_app_test.py +42 -0
- datalab/tests/features/image/contour_fabryperot_app_test.py +51 -0
- datalab/tests/features/image/denoise_app_test.py +31 -0
- datalab/tests/features/image/distribute_on_grid_app_test.py +95 -0
- datalab/tests/features/image/edges_app_test.py +31 -0
- datalab/tests/features/image/erase_app_test.py +21 -0
- datalab/tests/features/image/fft2d_app_test.py +27 -0
- datalab/tests/features/image/flatfield_app_test.py +40 -0
- datalab/tests/features/image/geometry_transform_unit_test.py +396 -0
- datalab/tests/features/image/imagetools_app_test.py +51 -0
- datalab/tests/features/image/imagetools_unit_test.py +27 -0
- datalab/tests/features/image/load_app_test.py +73 -0
- datalab/tests/features/image/morph_app_test.py +32 -0
- datalab/tests/features/image/offsetcorrection_app_test.py +30 -0
- datalab/tests/features/image/peak2d_app_test.py +53 -0
- datalab/tests/features/image/profile_app_test.py +73 -0
- datalab/tests/features/image/profile_dialog_test.py +56 -0
- datalab/tests/features/image/roi_app_test.py +98 -0
- datalab/tests/features/image/roi_circ_app_test.py +62 -0
- datalab/tests/features/image/roi_manipulation_app_test.py +268 -0
- datalab/tests/features/image/roigrid_unit_test.py +60 -0
- datalab/tests/features/image/side_by_side_app_test.py +52 -0
- datalab/tests/features/macro/__init__.py +1 -0
- datalab/tests/features/macro/macro_app_test.py +28 -0
- datalab/tests/features/macro/macroeditor_unit_test.py +102 -0
- datalab/tests/features/signal/__init__.py +1 -0
- datalab/tests/features/signal/baseline_dialog_test.py +53 -0
- datalab/tests/features/signal/deltax_dialog_unit_test.py +34 -0
- datalab/tests/features/signal/fft1d_app_test.py +26 -0
- datalab/tests/features/signal/filter_app_test.py +44 -0
- datalab/tests/features/signal/fitdialog_unit_test.py +50 -0
- datalab/tests/features/signal/interpolation_app_test.py +110 -0
- datalab/tests/features/signal/loadbigsignal_app_test.py +80 -0
- datalab/tests/features/signal/multiple_rois_unit_test.py +132 -0
- datalab/tests/features/signal/pulse_features_app_test.py +118 -0
- datalab/tests/features/signal/pulse_features_roi_app_test.py +55 -0
- datalab/tests/features/signal/roi_app_test.py +78 -0
- datalab/tests/features/signal/roi_manipulation_app_test.py +261 -0
- datalab/tests/features/signal/select_xy_cursor_unit_test.py +46 -0
- datalab/tests/features/signal/signalpeakdetection_dialog_test.py +33 -0
- datalab/tests/features/signal/signals_to_image_app_test.py +98 -0
- datalab/tests/features/signal/xarray_compat_app_test.py +128 -0
- datalab/tests/features/tour_unit_test.py +22 -0
- datalab/tests/features/utilities/__init__.py +1 -0
- datalab/tests/features/utilities/installconf_unit_test.py +21 -0
- datalab/tests/features/utilities/logview_app_test.py +21 -0
- datalab/tests/features/utilities/logview_error.py +24 -0
- datalab/tests/features/utilities/logview_unit_test.py +21 -0
- datalab/tests/features/utilities/memstatus_app_test.py +42 -0
- datalab/tests/features/utilities/settings_unit_test.py +88 -0
- datalab/tests/scenarios/__init__.py +1 -0
- datalab/tests/scenarios/beautiful_app.py +121 -0
- datalab/tests/scenarios/common.py +463 -0
- datalab/tests/scenarios/demo.py +212 -0
- datalab/tests/scenarios/example_app_test.py +47 -0
- datalab/tests/scenarios/scenario_h5_app_test.py +75 -0
- datalab/tests/scenarios/scenario_ima1_app_test.py +34 -0
- datalab/tests/scenarios/scenario_ima2_app_test.py +34 -0
- datalab/tests/scenarios/scenario_mac_app_test.py +58 -0
- datalab/tests/scenarios/scenario_sig1_app_test.py +36 -0
- datalab/tests/scenarios/scenario_sig2_app_test.py +35 -0
- datalab/utils/__init__.py +1 -0
- datalab/utils/conf.py +304 -0
- datalab/utils/dephash.py +105 -0
- datalab/utils/qthelpers.py +633 -0
- datalab/utils/strings.py +34 -0
- datalab/utils/tests.py +0 -0
- datalab/widgets/__init__.py +1 -0
- datalab/widgets/connection.py +138 -0
- datalab/widgets/filedialog.py +91 -0
- datalab/widgets/fileviewer.py +84 -0
- datalab/widgets/fitdialog.py +788 -0
- datalab/widgets/h5browser.py +1048 -0
- datalab/widgets/imagebackground.py +111 -0
- datalab/widgets/instconfviewer.py +175 -0
- datalab/widgets/logviewer.py +80 -0
- datalab/widgets/signalbaseline.py +90 -0
- datalab/widgets/signalcursor.py +208 -0
- datalab/widgets/signaldeltax.py +151 -0
- datalab/widgets/signalpeak.py +199 -0
- datalab/widgets/status.py +249 -0
- datalab/widgets/textimport.py +786 -0
- datalab/widgets/warningerror.py +223 -0
- datalab/widgets/wizard.py +286 -0
- datalab_platform-1.0.1.dist-info/METADATA +121 -0
- datalab_platform-1.0.1.dist-info/RECORD +494 -0
- datalab_platform-0.0.1.dev0.dist-info/METADATA +0 -67
- datalab_platform-0.0.1.dev0.dist-info/RECORD +0 -7
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/WHEEL +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/entry_points.txt +0 -0
- {datalab_platform-0.0.1.dev0.dist-info → datalab_platform-1.0.1.dist-info}/licenses/LICENSE +0 -0
- {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()
|