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,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)
|