pymodaq 4.2.3__py3-none-any.whl → 5.0.0__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.
Potentially problematic release.
This version of pymodaq might be problematic. Click here for more details.
- pymodaq/__init__.py +30 -23
- pymodaq/control_modules/daq_move.py +27 -14
- pymodaq/control_modules/daq_move_ui.py +33 -16
- pymodaq/control_modules/daq_viewer.py +38 -28
- pymodaq/control_modules/daq_viewer_ui.py +6 -6
- pymodaq/control_modules/mocks.py +1 -1
- pymodaq/control_modules/move_utility_classes.py +19 -10
- pymodaq/control_modules/utils.py +18 -12
- pymodaq/control_modules/viewer_utility_classes.py +13 -4
- pymodaq/dashboard.py +166 -118
- pymodaq/examples/custom_app.py +13 -16
- pymodaq/examples/custom_viewer.py +7 -7
- pymodaq/examples/function_plotter.py +13 -12
- pymodaq/examples/parameter_ex.py +50 -25
- pymodaq/examples/tcp_client.py +1 -1
- pymodaq/extensions/__init__.py +1 -1
- pymodaq/extensions/bayesian/bayesian_optimisation.py +15 -12
- pymodaq/extensions/bayesian/utils.py +10 -10
- pymodaq/extensions/console.py +10 -13
- pymodaq/extensions/{daq_logger.py → daq_logger/daq_logger.py} +36 -56
- pymodaq/{utils/db/db_logger → extensions/daq_logger/db}/db_logger.py +16 -15
- pymodaq/{utils/db/db_logger → extensions/daq_logger/db}/db_logger_models.py +2 -0
- pymodaq/{utils/h5modules → extensions/daq_logger}/h5logging.py +7 -8
- pymodaq/extensions/daq_scan.py +153 -247
- pymodaq/extensions/daq_scan_ui.py +11 -9
- pymodaq/extensions/h5browser.py +8 -8
- pymodaq/extensions/pid/__init__.py +6 -3
- pymodaq/extensions/pid/daq_move_PID.py +4 -2
- pymodaq/extensions/pid/pid_controller.py +15 -12
- pymodaq/extensions/pid/utils.py +10 -5
- pymodaq/extensions/utils.py +5 -3
- pymodaq/post_treatment/load_and_plot.py +10 -7
- pymodaq/resources/preset_default.xml +1 -1
- pymodaq/utils/array_manipulation.py +4 -384
- pymodaq/utils/calibration_camera.py +12 -9
- pymodaq/utils/chrono_timer.py +7 -5
- pymodaq/utils/config.py +3 -450
- pymodaq/utils/daq_utils.py +6 -664
- pymodaq/utils/data.py +9 -2774
- pymodaq/utils/exceptions.py +0 -4
- pymodaq/utils/gui_utils/__init__.py +8 -8
- pymodaq/utils/gui_utils/loader_utils.py +38 -0
- pymodaq/utils/gui_utils/utils.py +6 -138
- pymodaq/utils/h5modules/__init__.py +0 -4
- pymodaq/utils/h5modules/module_saving.py +15 -8
- pymodaq/utils/leco/__init__.py +2 -2
- pymodaq/utils/leco/daq_move_LECODirector.py +2 -2
- pymodaq/utils/leco/daq_xDviewer_LECODirector.py +2 -2
- pymodaq/utils/leco/director_utils.py +2 -2
- pymodaq/utils/leco/leco_director.py +3 -3
- pymodaq/utils/leco/pymodaq_listener.py +2 -2
- pymodaq/utils/leco/utils.py +1 -1
- pymodaq/utils/logger.py +4 -76
- pymodaq/utils/managers/batchscan_manager.py +16 -19
- pymodaq/utils/managers/modules_manager.py +10 -7
- pymodaq/utils/managers/overshoot_manager.py +3 -5
- pymodaq/utils/managers/preset_manager.py +37 -15
- pymodaq/utils/managers/preset_manager_utils.py +11 -9
- pymodaq/utils/managers/remote_manager.py +12 -10
- pymodaq/utils/math_utils.py +4 -572
- pymodaq/utils/parameter/__init__.py +4 -11
- pymodaq/utils/parameter/utils.py +4 -299
- pymodaq/utils/scanner/scan_config.py +1 -1
- pymodaq/utils/scanner/scan_factory.py +16 -12
- pymodaq/utils/{plotting → scanner}/scan_selector.py +19 -20
- pymodaq/utils/scanner/scanner.py +10 -8
- pymodaq/utils/scanner/scanners/_1d_scanners.py +8 -5
- pymodaq/utils/scanner/scanners/_2d_scanners.py +5 -5
- pymodaq/utils/scanner/scanners/sequential.py +8 -8
- pymodaq/utils/scanner/scanners/tabular.py +9 -9
- pymodaq/utils/scanner/utils.py +6 -4
- pymodaq/utils/svg/svg_viewer2D.py +3 -4
- pymodaq/utils/tcp_ip/serializer.py +64 -16
- pymodaq/utils/tcp_ip/tcp_server_client.py +10 -8
- {pymodaq-4.2.3.dist-info → pymodaq-5.0.0.dist-info}/METADATA +5 -3
- pymodaq-5.0.0.dist-info/RECORD +123 -0
- {pymodaq-4.2.3.dist-info → pymodaq-5.0.0.dist-info}/WHEEL +1 -1
- pymodaq/post_treatment/process_to_scalar.py +0 -263
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/1d.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/2d.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/3d.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Add2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Add_Step.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Approve.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Approve_All.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Browse_Dir_Path.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Calculator.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnGroup.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnNum.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnText.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnTime.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ChnWave.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Close3.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/CollapseAll.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/CollapseAll_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ColorPicker.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Contract.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Create.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/DeleteLayer.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/EditOpen.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/EditRedo.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/EditUndo.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Ellipse.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/EllipseFilled.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Error.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ErrorMessage.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Error_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Exit.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Expand.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ExpandAll.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ExpandAll_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/FFT.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/HLM.ico +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Help.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Help_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Histogram.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/LUT_LookUpTable.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/MagnifyingGlass.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/MagnifyingGlass_24.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Marker.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Math.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/MeasurementStudio_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Move.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/MoveDown.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/MoveUp.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Multiply.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/NewFile.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/NewLayer.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/New_File.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/New_Folder.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_1D.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_2D.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_File.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_File_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Open_sim.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Options.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Oscilloscope.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Oscilloscope_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Pass.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/RGB.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Rectangle.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/RectangleFilled.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Redo.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Refresh.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Refresh2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Refresh_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Region.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Rendezvous.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/SELECT.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Save.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAll.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAll_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAs.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/SaveAs_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Save_24.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Save_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Search.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/SelectPolygon.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Select_24.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Settings.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snap&Save.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot2_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Snapshot2_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Spreadsheet.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Statistics.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Statistics2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Status.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Subtract.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Vision.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Volts.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Wait2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_1_1.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_in.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_out.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/Zoom_to_Selection.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/abort.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/advanced2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/autoscale.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/b_icon.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/back.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/bg_icon.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/camera.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/camera_snap.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/cartesian.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/clear2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/clear_ROI.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/close2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/cluster2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/color.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/color2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/continuous.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/data.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/delay.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/download.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/download2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/error2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ethernet.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/exit2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/fan.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/filter2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/g_icon.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/gear2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/go_to.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/go_to_1.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/go_to_2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/grab.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/graph.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/greenLight2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/greenLight2_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/green_light.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/grey_icon.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/greyscale.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/help1.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/help1_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/home2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/information2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/ini.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/integrator.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/joystick.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_green.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_green_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_red.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_red_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_yellow.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/light_yellow_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/limiter.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/load_ROI.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/meshPlot.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/meter.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/meter2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/meter_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/move_contour.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/move_straight_line.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/movie.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/multi_point.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/multiplexer.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/new.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/openArrow.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/openTree.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/oscilloscope2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/oscilloscope3.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/overlay.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/pass2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/pass2_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/pass_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/pause.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/permute.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/phase.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/play.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/polar.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/pole_zero.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/powerMeter.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/powerSwitch.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/powerSwitch_16.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/print2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/print2_32.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/properties.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/r_icon.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/radiocontrolbutton.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/read2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/red_light.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/remove.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/reset.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/rgb_icon.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/robot.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/rotation2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/run2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/run_all.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/saturation.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/saveTree.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/save_ROI.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/scale_horizontally.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/scale_vertically.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/search2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/select2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/select_all.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/select_all2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/select_none.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/sequence.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/sequence2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/snap.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/sort_ascend.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/spectrumAnalyzer.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/start.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/status_cancelled.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop3.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/stop_all.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/sum.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/surfacePlot.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/tree.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/updateTree.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/utility2.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/utility_small.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/vector.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/verify.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/video.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/wait.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/waterfallPlot.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/watershed.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/yellow_light.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/zip_file.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/zoomAuto.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/Icon_Library/zoomReset.png +0 -0
- pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.bat +0 -2
- pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources.qrc +0 -234
- pymodaq/resources/QtDesigner_Ressources/QtDesigner_ressources_rc.py +0 -127150
- pymodaq/resources/QtDesigner_Ressources/icons.svg +0 -142
- pymodaq/resources/VERSION +0 -1
- pymodaq/resources/config_template.toml +0 -90
- pymodaq/resources/triangulation_data.npy +0 -0
- pymodaq/utils/abstract/__init__.py +0 -48
- pymodaq/utils/db/__init__.py +0 -0
- pymodaq/utils/db/db_logger/__init__.py +0 -0
- pymodaq/utils/enums.py +0 -76
- pymodaq/utils/factory.py +0 -82
- pymodaq/utils/gui_utils/custom_app.py +0 -133
- pymodaq/utils/gui_utils/dock.py +0 -107
- pymodaq/utils/gui_utils/file_io.py +0 -93
- pymodaq/utils/gui_utils/layout.py +0 -34
- pymodaq/utils/gui_utils/list_picker.py +0 -38
- pymodaq/utils/gui_utils/widgets/__init__.py +0 -5
- pymodaq/utils/gui_utils/widgets/label.py +0 -24
- pymodaq/utils/gui_utils/widgets/lcd.py +0 -111
- pymodaq/utils/gui_utils/widgets/push.py +0 -149
- pymodaq/utils/gui_utils/widgets/qled.py +0 -62
- pymodaq/utils/gui_utils/widgets/spinbox.py +0 -24
- pymodaq/utils/gui_utils/widgets/table.py +0 -263
- pymodaq/utils/gui_utils/widgets/tree_layout.py +0 -188
- pymodaq/utils/gui_utils/widgets/tree_toml.py +0 -102
- pymodaq/utils/h5modules/backends.py +0 -1022
- pymodaq/utils/h5modules/browsing.py +0 -625
- pymodaq/utils/h5modules/data_saving.py +0 -1101
- pymodaq/utils/h5modules/exporter.py +0 -119
- pymodaq/utils/h5modules/exporters/__init__.py +0 -0
- pymodaq/utils/h5modules/exporters/base.py +0 -111
- pymodaq/utils/h5modules/exporters/flimj.py +0 -63
- pymodaq/utils/h5modules/exporters/hyperspy.py +0 -143
- pymodaq/utils/h5modules/saving.py +0 -866
- pymodaq/utils/h5modules/utils.py +0 -115
- pymodaq/utils/managers/action_manager.py +0 -489
- pymodaq/utils/managers/parameter_manager.py +0 -282
- pymodaq/utils/managers/roi_manager.py +0 -726
- pymodaq/utils/messenger.py +0 -66
- pymodaq/utils/parameter/ioxml.py +0 -542
- pymodaq/utils/parameter/pymodaq_ptypes/__init__.py +0 -38
- pymodaq/utils/parameter/pymodaq_ptypes/bool.py +0 -31
- pymodaq/utils/parameter/pymodaq_ptypes/date.py +0 -126
- pymodaq/utils/parameter/pymodaq_ptypes/filedir.py +0 -143
- pymodaq/utils/parameter/pymodaq_ptypes/itemselect.py +0 -265
- pymodaq/utils/parameter/pymodaq_ptypes/led.py +0 -44
- pymodaq/utils/parameter/pymodaq_ptypes/list.py +0 -150
- pymodaq/utils/parameter/pymodaq_ptypes/numeric.py +0 -18
- pymodaq/utils/parameter/pymodaq_ptypes/pixmap.py +0 -175
- pymodaq/utils/parameter/pymodaq_ptypes/slide.py +0 -145
- pymodaq/utils/parameter/pymodaq_ptypes/table.py +0 -135
- pymodaq/utils/parameter/pymodaq_ptypes/tableview.py +0 -149
- pymodaq/utils/parameter/pymodaq_ptypes/text.py +0 -142
- pymodaq/utils/plotting/__init__.py +0 -0
- pymodaq/utils/plotting/data_viewers/__init__.py +0 -10
- pymodaq/utils/plotting/data_viewers/base.py +0 -286
- pymodaq/utils/plotting/data_viewers/viewer.py +0 -274
- pymodaq/utils/plotting/data_viewers/viewer0D.py +0 -298
- pymodaq/utils/plotting/data_viewers/viewer1D.py +0 -820
- pymodaq/utils/plotting/data_viewers/viewer1Dbasic.py +0 -231
- pymodaq/utils/plotting/data_viewers/viewer2D.py +0 -1118
- pymodaq/utils/plotting/data_viewers/viewer2D_basic.py +0 -146
- pymodaq/utils/plotting/data_viewers/viewerND.py +0 -800
- pymodaq/utils/plotting/gant_chart.py +0 -123
- pymodaq/utils/plotting/image_viewer.py +0 -97
- pymodaq/utils/plotting/items/__init__.py +0 -0
- pymodaq/utils/plotting/items/axis_scaled.py +0 -93
- pymodaq/utils/plotting/items/crosshair.py +0 -94
- pymodaq/utils/plotting/items/image.py +0 -388
- pymodaq/utils/plotting/navigator.py +0 -353
- pymodaq/utils/plotting/plotter/plotter.py +0 -94
- pymodaq/utils/plotting/plotter/plotters/__init__.py +0 -0
- pymodaq/utils/plotting/plotter/plotters/matplotlib_plotters.py +0 -134
- pymodaq/utils/plotting/plotter/plotters/qt_plotters.py +0 -78
- pymodaq/utils/plotting/utils/__init__.py +0 -0
- pymodaq/utils/plotting/utils/axes_viewer.py +0 -88
- pymodaq/utils/plotting/utils/filter.py +0 -585
- pymodaq/utils/plotting/utils/lineout.py +0 -226
- pymodaq/utils/plotting/utils/plot_utils.py +0 -579
- pymodaq/utils/plotting/utils/signalND.py +0 -1347
- pymodaq/utils/plotting/widgets.py +0 -76
- pymodaq/utils/qvariant.py +0 -12
- pymodaq/utils/slicing.py +0 -63
- pymodaq/utils/units.py +0 -216
- pymodaq-4.2.3.dist-info/RECORD +0 -438
- /pymodaq/{post_treatment/daq_analysis → extensions/daq_logger}/__init__.py +0 -0
- /pymodaq/{utils/abstract/logger.py → extensions/daq_logger/abstract.py} +0 -0
- /pymodaq/{resources/QtDesigner_Ressources → extensions/daq_logger/db}/__init__.py +0 -0
- {pymodaq-4.2.3.dist-info → pymodaq-5.0.0.dist-info}/entry_points.txt +0 -0
- {pymodaq-4.2.3.dist-info → pymodaq-5.0.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,579 +0,0 @@
|
|
|
1
|
-
from collections.abc import Iterable
|
|
2
|
-
from dataclasses import dataclass, field
|
|
3
|
-
|
|
4
|
-
import copy
|
|
5
|
-
from numbers import Real, Number
|
|
6
|
-
from typing import List, Union, Tuple
|
|
7
|
-
from typing import Iterable as IterableType
|
|
8
|
-
|
|
9
|
-
from easydict import EasyDict as edict
|
|
10
|
-
from multipledispatch import dispatch
|
|
11
|
-
import numpy as np
|
|
12
|
-
import pyqtgraph as pg
|
|
13
|
-
from qtpy import QtGui, QtCore, QtWidgets
|
|
14
|
-
from scipy.spatial import Delaunay as Triangulation
|
|
15
|
-
|
|
16
|
-
from pymodaq.utils import data as data_mod
|
|
17
|
-
from pymodaq.utils.managers.roi_manager import LinearROI, RectROI, EllipseROI, pgROI, pgLinearROI
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def make_dashed_pens(color: tuple, nstyle=3):
|
|
21
|
-
pens = [dict(color=color)]
|
|
22
|
-
if nstyle > 1:
|
|
23
|
-
for ind in range(nstyle - 1):
|
|
24
|
-
pens.append(dict(color=color, dash=np.array([5, 5]) * (ind + 1)))
|
|
25
|
-
return pens
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class Point:
|
|
29
|
-
def __init__(self, *elt: IterableType[float]):
|
|
30
|
-
"""Initialize a geometric point in an arbitrary number of dimensions
|
|
31
|
-
|
|
32
|
-
Parameters
|
|
33
|
-
----------
|
|
34
|
-
elt: either a tuple of floats, passed as multiple parameters or a single Iterable parameter
|
|
35
|
-
"""
|
|
36
|
-
if len(elt) == 1 and isinstance(elt[0], Iterable):
|
|
37
|
-
elt = elt[0]
|
|
38
|
-
|
|
39
|
-
self._coordinates: np.ndarray = np.atleast_1d(np.squeeze(elt))
|
|
40
|
-
self._ndim = len(elt)
|
|
41
|
-
|
|
42
|
-
@property
|
|
43
|
-
def coordinates(self):
|
|
44
|
-
return self._coordinates
|
|
45
|
-
|
|
46
|
-
def copy(self):
|
|
47
|
-
return Point(self.coordinates.copy())
|
|
48
|
-
|
|
49
|
-
def __getitem__(self, item: int) -> float:
|
|
50
|
-
return float(self._coordinates[item])
|
|
51
|
-
|
|
52
|
-
def __setitem__(self, key: int, value: float):
|
|
53
|
-
self._coordinates[key] = value
|
|
54
|
-
|
|
55
|
-
def __len__(self):
|
|
56
|
-
return self._ndim
|
|
57
|
-
|
|
58
|
-
def _compare_length(self, other: 'Point'):
|
|
59
|
-
if len(self) != len(other):
|
|
60
|
-
raise ValueError('Those points should be expressed in the same coordinate system and dimensions')
|
|
61
|
-
|
|
62
|
-
def __eq__(self, other):
|
|
63
|
-
if isinstance(other, Point):
|
|
64
|
-
return np.allclose(self.coordinates, other.coordinates)
|
|
65
|
-
else:
|
|
66
|
-
return False
|
|
67
|
-
|
|
68
|
-
def __add__(self, other: Union['Point', 'Vector']):
|
|
69
|
-
self._compare_length(other)
|
|
70
|
-
return Point(*(self._coordinates + other._coordinates))
|
|
71
|
-
|
|
72
|
-
def __sub__(self, other: 'Point'):
|
|
73
|
-
self._compare_length(other)
|
|
74
|
-
return Point(*(self._coordinates - other._coordinates))
|
|
75
|
-
|
|
76
|
-
def __repr__(self):
|
|
77
|
-
return f'Point({self.coordinates})'
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
class Vector:
|
|
81
|
-
def __init__(self, coordinates: Union[Point, np.ndarray], origin: Point = None):
|
|
82
|
-
if isinstance(coordinates, Point):
|
|
83
|
-
self._coordinates = coordinates.coordinates
|
|
84
|
-
else:
|
|
85
|
-
self._coordinates = coordinates
|
|
86
|
-
|
|
87
|
-
if origin is None:
|
|
88
|
-
origin = np.zeros((len(coordinates)))
|
|
89
|
-
else:
|
|
90
|
-
self._compare_length(origin)
|
|
91
|
-
|
|
92
|
-
self._origin = origin
|
|
93
|
-
|
|
94
|
-
def _compare_length(self, other: 'Point'):
|
|
95
|
-
if len(self) != len(other):
|
|
96
|
-
raise ValueError('Those Points/Vectors should be expressed in the same coordinate system and dimensions')
|
|
97
|
-
|
|
98
|
-
@property
|
|
99
|
-
def origin(self):
|
|
100
|
-
return self._origin
|
|
101
|
-
|
|
102
|
-
@property
|
|
103
|
-
def coordinates(self):
|
|
104
|
-
return self._coordinates
|
|
105
|
-
|
|
106
|
-
def copy(self):
|
|
107
|
-
return Vector(self.coordinates.copy(), origin=self.origin.copy())
|
|
108
|
-
|
|
109
|
-
def __len__(self):
|
|
110
|
-
return len(self._coordinates)
|
|
111
|
-
|
|
112
|
-
def norm(self):
|
|
113
|
-
return np.linalg.norm(self._coordinates)
|
|
114
|
-
|
|
115
|
-
def unit_vector(self):
|
|
116
|
-
return self * (1 / self.norm())
|
|
117
|
-
|
|
118
|
-
def __add__(self, other: 'Vector'):
|
|
119
|
-
self._compare_length(other)
|
|
120
|
-
return Vector(self.coordinates + other.coordinates, origin=self.origin.copy())
|
|
121
|
-
|
|
122
|
-
def __sub__(self, other: 'Vector'):
|
|
123
|
-
self._compare_length(other)
|
|
124
|
-
return Vector(self.coordinates - other.coordinates, origin=self.origin.copy())
|
|
125
|
-
|
|
126
|
-
def __mul__(self, other: Number):
|
|
127
|
-
if not isinstance(other, Number):
|
|
128
|
-
raise TypeError(f'Cannot multiply a vector with {other}')
|
|
129
|
-
return Vector(other * self.coordinates, origin=self.origin.copy())
|
|
130
|
-
|
|
131
|
-
def dot(self, other: 'Vector'):
|
|
132
|
-
self._compare_length(other)
|
|
133
|
-
return np.dot(self.coordinates, other.coordinates)
|
|
134
|
-
|
|
135
|
-
def cross(self, other: 'Vector'):
|
|
136
|
-
self._compare_length(other)
|
|
137
|
-
return np.cross(self.coordinates, other.coordinates)
|
|
138
|
-
|
|
139
|
-
def __repr__(self):
|
|
140
|
-
return f'Vector({self.coordinates})/Origin({self.origin.coordinates})'
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
def get_sub_segmented_positions(spacing: float, points: List[Point]) -> List[np.ndarray]:
|
|
144
|
-
"""Get Points coordinates spaced in between subsequent Points
|
|
145
|
-
|
|
146
|
-
Parameters
|
|
147
|
-
----------
|
|
148
|
-
spacing: float
|
|
149
|
-
Distance between two subpoints
|
|
150
|
-
points: List[Point]
|
|
151
|
-
List of Points in arbitrary dimension forming segments one want to sample with a distance equal to spacing
|
|
152
|
-
|
|
153
|
-
Returns
|
|
154
|
-
-------
|
|
155
|
-
List[np.ndarray]: The list of the coordinates of the points
|
|
156
|
-
"""
|
|
157
|
-
positions = []
|
|
158
|
-
for ind in range(len(points) - 1):
|
|
159
|
-
vect = Vector(points[ind+1]-points[ind], origin=points[ind])
|
|
160
|
-
npts = 0
|
|
161
|
-
while npts * spacing < vect.norm():
|
|
162
|
-
positions.append(
|
|
163
|
-
(vect.origin + vect.unit_vector() * npts * spacing).coordinates)
|
|
164
|
-
npts += 1
|
|
165
|
-
|
|
166
|
-
# # add_last point not taken into account
|
|
167
|
-
positions.append(points[-1].coordinates)
|
|
168
|
-
return positions
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
class QVector(QtCore.QLineF):
|
|
172
|
-
def __init__(self, *elt):
|
|
173
|
-
super().__init__(*elt)
|
|
174
|
-
|
|
175
|
-
def __repr__(self):
|
|
176
|
-
return f"PyMoDAQ's QVector({self.x1()}, {self.y1()}, {self.x2()}, {self.y2()})"
|
|
177
|
-
|
|
178
|
-
def __add__(self, qvect):
|
|
179
|
-
v = QVector(self.x1() + qvect.x1(), self.y1() + qvect.y1(), self.x2() + qvect.x2(), self.y2() + qvect.y2())
|
|
180
|
-
return v
|
|
181
|
-
|
|
182
|
-
def __sub__(self, qvect):
|
|
183
|
-
v = QVector(self.x1() - qvect.x1(), self.y1() - qvect.y1(), self.x2() - qvect.x2(), self.y2() - qvect.y2())
|
|
184
|
-
return v
|
|
185
|
-
|
|
186
|
-
def __mul__(self, coeff=float(1)):
|
|
187
|
-
v = QVector(coeff * self.x1(), coeff * self.y1(), coeff * self.x2(), coeff * self.y2())
|
|
188
|
-
return v
|
|
189
|
-
|
|
190
|
-
def copy(self):
|
|
191
|
-
vec = QVector()
|
|
192
|
-
vec.setPoints(copy.copy(self.p1()), copy.copy(self.p2()))
|
|
193
|
-
return vec
|
|
194
|
-
|
|
195
|
-
def vectorize(self):
|
|
196
|
-
v = QVector(QtCore.QPointF(0, 0), self.p2() - self.p1())
|
|
197
|
-
return v
|
|
198
|
-
|
|
199
|
-
def norm(self):
|
|
200
|
-
return self.length()
|
|
201
|
-
|
|
202
|
-
def unitVector(self):
|
|
203
|
-
vec = self * (1 / self.length())
|
|
204
|
-
return vec
|
|
205
|
-
|
|
206
|
-
def normalVector(self):
|
|
207
|
-
vec = self.vectorize()
|
|
208
|
-
vec = QVector(0, 0, -vec.p2().y(), vec.p2().x())
|
|
209
|
-
return vec
|
|
210
|
-
|
|
211
|
-
def normalVector_not_vectorized(self):
|
|
212
|
-
vec = self.vectorize()
|
|
213
|
-
vec = QVector(0, 0, -vec.p2().y(), vec.p2().x())
|
|
214
|
-
vec.translate(self.p1())
|
|
215
|
-
return vec
|
|
216
|
-
|
|
217
|
-
def dot(self, qvect):
|
|
218
|
-
"""
|
|
219
|
-
scalar product
|
|
220
|
-
"""
|
|
221
|
-
v1 = self.vectorize()
|
|
222
|
-
v2 = qvect.vectorize()
|
|
223
|
-
prod = v1.x2() * v2.x2() + v1.y2() * v2.y2()
|
|
224
|
-
return prod
|
|
225
|
-
|
|
226
|
-
def prod(self, qvect):
|
|
227
|
-
"""
|
|
228
|
-
vectoriel product length along z
|
|
229
|
-
"""
|
|
230
|
-
v1 = self.vectorize()
|
|
231
|
-
v2 = qvect.vectorize()
|
|
232
|
-
prod = v1.x2() * v2.y2() - v1.y2() * v2.x2()
|
|
233
|
-
return prod
|
|
234
|
-
|
|
235
|
-
def translate_to(self, point=QtCore.QPointF(0, 0)):
|
|
236
|
-
vec = self + QVector(self.p1(), point)
|
|
237
|
-
return vec
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
def makeAlphaTriangles(data, lut=None, levels=None, scale=None, useRGBA=False):
|
|
241
|
-
"""
|
|
242
|
-
Convert an array of values into an ARGB array suitable for building QImages,
|
|
243
|
-
OpenGL textures, etc.
|
|
244
|
-
|
|
245
|
-
Returns the ARGB array (unsigned byte) and a boolean indicating whether
|
|
246
|
-
there is alpha channel data. This is a two stage process:
|
|
247
|
-
0) compute the polygons (triangles) from triangulation of the points
|
|
248
|
-
1) Rescale the data based on the values in the *levels* argument (min, max).
|
|
249
|
-
2) Determine the final output by passing the rescaled values through a
|
|
250
|
-
lookup table.
|
|
251
|
-
|
|
252
|
-
Both stages are optional.
|
|
253
|
-
|
|
254
|
-
============== ==================================================================================
|
|
255
|
-
**Arguments:**
|
|
256
|
-
data numpy array of int/float types. If
|
|
257
|
-
levels List [min, max]; optionally rescale data before converting through the
|
|
258
|
-
lookup table. The data is rescaled such that min->0 and max->*scale*::
|
|
259
|
-
|
|
260
|
-
rescaled = (clip(data, min, max) - min) * (*scale* / (max - min))
|
|
261
|
-
|
|
262
|
-
It is also possible to use a 2D (N,2) array of values for levels. In this case,
|
|
263
|
-
it is assumed that each pair of min,max values in the levels array should be
|
|
264
|
-
applied to a different subset of the input data (for example, the input data may
|
|
265
|
-
already have RGB values and the levels are used to independently scale each
|
|
266
|
-
channel). The use of this feature requires that levels.shape[0] == data.shape[-1].
|
|
267
|
-
scale The maximum value to which data will be rescaled before being passed through the
|
|
268
|
-
lookup table (or returned if there is no lookup table). By default this will
|
|
269
|
-
be set to the length of the lookup table, or 255 if no lookup table is provided.
|
|
270
|
-
lut Optional lookup table (array with dtype=ubyte).
|
|
271
|
-
Values in data will be converted to color by indexing directly from lut.
|
|
272
|
-
The output data shape will be input.shape + lut.shape[1:].
|
|
273
|
-
Lookup tables can be built using ColorMap or GradientWidget.
|
|
274
|
-
useRGBA If True, the data is returned in RGBA order (useful for building OpenGL textures).
|
|
275
|
-
The default is False, which returns in ARGB order for use with QImage
|
|
276
|
-
(Note that 'ARGB' is a term used by the Qt documentation; the *actual* order
|
|
277
|
-
is BGRA).
|
|
278
|
-
============== ==================================================================================
|
|
279
|
-
"""
|
|
280
|
-
points = data[:, :2]
|
|
281
|
-
values = data[:, 2]
|
|
282
|
-
|
|
283
|
-
profile = pg.debug.Profiler()
|
|
284
|
-
if points.ndim not in (2,):
|
|
285
|
-
raise TypeError("points must be 1D sequence of points")
|
|
286
|
-
|
|
287
|
-
tri = Triangulation(points)
|
|
288
|
-
tri_data = np.zeros((len(tri.simplices),))
|
|
289
|
-
for ind, pts in enumerate(tri.simplices):
|
|
290
|
-
tri_data[ind] = np.mean(values[pts])
|
|
291
|
-
data = tri_data.copy()
|
|
292
|
-
if lut is not None and not isinstance(lut, np.ndarray):
|
|
293
|
-
lut = np.array(lut)
|
|
294
|
-
|
|
295
|
-
if levels is None:
|
|
296
|
-
# automatically decide levels based on data dtype
|
|
297
|
-
if data.dtype.kind == 'u':
|
|
298
|
-
levels = np.array([0, 2 ** (data.itemsize * 8) - 1])
|
|
299
|
-
elif data.dtype.kind == 'i':
|
|
300
|
-
s = 2 ** (data.itemsize * 8 - 1)
|
|
301
|
-
levels = np.array([-s, s - 1])
|
|
302
|
-
elif data.dtype.kind == 'b':
|
|
303
|
-
levels = np.array([0, 1])
|
|
304
|
-
else:
|
|
305
|
-
raise Exception('levels argument is required for float input types')
|
|
306
|
-
if not isinstance(levels, np.ndarray):
|
|
307
|
-
levels = np.array(levels)
|
|
308
|
-
if levels.ndim == 1:
|
|
309
|
-
if levels.shape[0] != 2:
|
|
310
|
-
raise Exception('levels argument must have length 2')
|
|
311
|
-
elif levels.ndim == 2:
|
|
312
|
-
if lut is not None and lut.ndim > 1:
|
|
313
|
-
raise Exception('Cannot make ARGB data when both levels and lut have ndim > 2')
|
|
314
|
-
if levels.shape != (data.shape[-1], 2):
|
|
315
|
-
raise Exception('levels must have shape (data.shape[-1], 2)')
|
|
316
|
-
else:
|
|
317
|
-
raise Exception("levels argument must be 1D or 2D (got shape=%s)." % repr(levels.shape))
|
|
318
|
-
|
|
319
|
-
profile()
|
|
320
|
-
|
|
321
|
-
# Decide on maximum scaled value
|
|
322
|
-
if scale is None:
|
|
323
|
-
if lut is not None:
|
|
324
|
-
scale = lut.shape[0] - 1
|
|
325
|
-
else:
|
|
326
|
-
scale = 255.
|
|
327
|
-
|
|
328
|
-
# Decide on the dtype we want after scaling
|
|
329
|
-
if lut is None:
|
|
330
|
-
dtype = np.ubyte
|
|
331
|
-
else:
|
|
332
|
-
dtype = np.min_scalar_type(lut.shape[0] - 1)
|
|
333
|
-
|
|
334
|
-
# Apply levels if given
|
|
335
|
-
if levels is not None:
|
|
336
|
-
if isinstance(levels, np.ndarray) and levels.ndim == 2:
|
|
337
|
-
# we are going to rescale each channel independently
|
|
338
|
-
if levels.shape[0] != data.shape[-1]:
|
|
339
|
-
raise Exception(
|
|
340
|
-
"When rescaling multi-channel data, there must be the same number of levels as channels (data.shape[-1] == levels.shape[0])")
|
|
341
|
-
newData = np.empty(data.shape, dtype=int)
|
|
342
|
-
for i in range(data.shape[-1]):
|
|
343
|
-
minVal, maxVal = levels[i]
|
|
344
|
-
if minVal == maxVal:
|
|
345
|
-
maxVal += 1e-16
|
|
346
|
-
newData[..., i] = pg.functions.rescaleData(data[..., i], scale / (maxVal - minVal), minVal, dtype=dtype)
|
|
347
|
-
data = newData
|
|
348
|
-
else:
|
|
349
|
-
# Apply level scaling unless it would have no effect on the data
|
|
350
|
-
minVal, maxVal = levels
|
|
351
|
-
if minVal != 0 or maxVal != scale:
|
|
352
|
-
if minVal == maxVal:
|
|
353
|
-
maxVal += 1e-16
|
|
354
|
-
data = pg.functions.rescaleData(data, scale / (maxVal - minVal), minVal, dtype=dtype)
|
|
355
|
-
|
|
356
|
-
profile()
|
|
357
|
-
|
|
358
|
-
# apply LUT if given
|
|
359
|
-
if lut is not None:
|
|
360
|
-
data = pg.functions.applyLookupTable(data, lut)
|
|
361
|
-
else:
|
|
362
|
-
if data.dtype is not np.ubyte:
|
|
363
|
-
data = np.clip(data, 0, 255).astype(np.ubyte)
|
|
364
|
-
|
|
365
|
-
profile()
|
|
366
|
-
|
|
367
|
-
# this will be the final image array
|
|
368
|
-
imgData = np.empty((data.shape[0],) + (4,), dtype=np.ubyte)
|
|
369
|
-
|
|
370
|
-
profile()
|
|
371
|
-
|
|
372
|
-
# decide channel order
|
|
373
|
-
if useRGBA:
|
|
374
|
-
order = [0, 1, 2, 3] # array comes out RGBA
|
|
375
|
-
else:
|
|
376
|
-
order = [2, 1, 0, 3] # for some reason, the colors line up as BGR in the final image.
|
|
377
|
-
|
|
378
|
-
# TODO check this
|
|
379
|
-
# copy data into image array
|
|
380
|
-
if data.ndim == 1:
|
|
381
|
-
# This is tempting:
|
|
382
|
-
# imgData[..., :3] = data[..., np.newaxis]
|
|
383
|
-
# ..but it turns out this is faster:
|
|
384
|
-
for i in range(3):
|
|
385
|
-
imgData[..., i] = data
|
|
386
|
-
elif data.shape[1] == 1:
|
|
387
|
-
for i in range(3):
|
|
388
|
-
imgData[..., i] = data[..., 0]
|
|
389
|
-
else:
|
|
390
|
-
for i in range(0, data.shape[1]):
|
|
391
|
-
imgData[..., i] = data[..., order[i]]
|
|
392
|
-
|
|
393
|
-
profile()
|
|
394
|
-
|
|
395
|
-
# add opaque alpha channel if needed
|
|
396
|
-
if data.ndim == 1 or data.shape[1] == 3:
|
|
397
|
-
alpha = False
|
|
398
|
-
imgData[..., 3] = 255
|
|
399
|
-
else:
|
|
400
|
-
alpha = True
|
|
401
|
-
|
|
402
|
-
profile()
|
|
403
|
-
return tri, tri_data, imgData, alpha
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
def makePolygons(tri):
|
|
407
|
-
polygons = []
|
|
408
|
-
for seq in tri.points[tri.simplices]:
|
|
409
|
-
polygons.append(QtGui.QPolygonF([QtCore.QPointF(*s) for s in seq] + [QtCore.QPointF(*seq[0])]))
|
|
410
|
-
return polygons
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
class Data0DWithHistory:
|
|
414
|
-
"""Object to store scalar values and keep a history of a given length to them"""
|
|
415
|
-
def __init__(self, Nsamples=200):
|
|
416
|
-
super().__init__()
|
|
417
|
-
self._datas = dict([])
|
|
418
|
-
self.last_data: data_mod.DataRaw = None
|
|
419
|
-
self._Nsamples = Nsamples
|
|
420
|
-
self._xaxis = None
|
|
421
|
-
self._data_length = 0
|
|
422
|
-
|
|
423
|
-
@property
|
|
424
|
-
def size(self):
|
|
425
|
-
return self._data_length
|
|
426
|
-
|
|
427
|
-
@property
|
|
428
|
-
def length(self):
|
|
429
|
-
return self._Nsamples
|
|
430
|
-
|
|
431
|
-
@length.setter
|
|
432
|
-
def length(self, history_length: int):
|
|
433
|
-
if history_length > 0:
|
|
434
|
-
self._Nsamples = history_length
|
|
435
|
-
|
|
436
|
-
def __len__(self):
|
|
437
|
-
return self.length
|
|
438
|
-
|
|
439
|
-
@dispatch(data_mod.DataWithAxes)
|
|
440
|
-
def add_datas(self, data: data_mod.DataWithAxes):
|
|
441
|
-
self.last_data = data
|
|
442
|
-
datas = {data.labels[ind]: data.data[ind] for ind in range(len(data))}
|
|
443
|
-
self.add_datas(datas)
|
|
444
|
-
|
|
445
|
-
@dispatch(list)
|
|
446
|
-
def add_datas(self, data: list):
|
|
447
|
-
"""
|
|
448
|
-
Add datas to the history
|
|
449
|
-
Parameters
|
|
450
|
-
----------
|
|
451
|
-
data: (list) list of floats or np.array(float)
|
|
452
|
-
"""
|
|
453
|
-
self.last_data = data_mod.DataRaw('Data0D', data=[np.array([dat]) for dat in data])
|
|
454
|
-
datas = {f'data_{ind:02d}': data[ind] for ind in range(len(data))}
|
|
455
|
-
self.add_datas(datas)
|
|
456
|
-
|
|
457
|
-
@dispatch(dict)
|
|
458
|
-
def add_datas(self, datas: dict):
|
|
459
|
-
"""
|
|
460
|
-
Add datas to the history on the form of a dict of key/data pairs (data is a numpy 0D array)
|
|
461
|
-
Parameters
|
|
462
|
-
----------
|
|
463
|
-
datas: (dict) dictionaary of floats or np.array(float)
|
|
464
|
-
"""
|
|
465
|
-
if datas.keys() != self._datas.keys():
|
|
466
|
-
self.clear_data()
|
|
467
|
-
|
|
468
|
-
self._data_length += 1
|
|
469
|
-
|
|
470
|
-
if self._data_length > self._Nsamples:
|
|
471
|
-
self._xaxis += 1
|
|
472
|
-
else:
|
|
473
|
-
self._xaxis = np.linspace(0, self._data_length, self._data_length, endpoint=False)
|
|
474
|
-
|
|
475
|
-
for data_key, data in datas.items():
|
|
476
|
-
if not isinstance(data, np.ndarray):
|
|
477
|
-
data = np.array([data])
|
|
478
|
-
|
|
479
|
-
if self._data_length == 1:
|
|
480
|
-
self._datas[data_key] = data
|
|
481
|
-
else:
|
|
482
|
-
self._datas[data_key] = np.concatenate((self._datas[data_key], data))
|
|
483
|
-
|
|
484
|
-
if self._data_length > self._Nsamples:
|
|
485
|
-
self._datas[data_key] = self._datas[data_key][1:]
|
|
486
|
-
|
|
487
|
-
@property
|
|
488
|
-
def datas(self):
|
|
489
|
-
return self._datas
|
|
490
|
-
|
|
491
|
-
@property
|
|
492
|
-
def xaxis(self):
|
|
493
|
-
return self._xaxis
|
|
494
|
-
|
|
495
|
-
def clear_data(self):
|
|
496
|
-
self._datas = dict([])
|
|
497
|
-
self._data_length = 0
|
|
498
|
-
self._xaxis = np.array([])
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
class View_cust(pg.ViewBox):
|
|
502
|
-
"""Custom ViewBox used to enable other properties compared to parent class: pg.ViewBox
|
|
503
|
-
|
|
504
|
-
"""
|
|
505
|
-
sig_double_clicked = QtCore.Signal(float, float)
|
|
506
|
-
|
|
507
|
-
def __init__(self, parent=None, border=None, lockAspect=False, enableMouse=True, invertY=False,
|
|
508
|
-
enableMenu=True, name=None, invertX=False):
|
|
509
|
-
super().__init__(parent, border, lockAspect, enableMouse, invertY, enableMenu, name, invertX)
|
|
510
|
-
|
|
511
|
-
def mouseClickEvent(self, ev):
|
|
512
|
-
if ev.button() == QtCore.Qt.RightButton and self.menuEnabled():
|
|
513
|
-
ev.accept()
|
|
514
|
-
self.raiseContextMenu(ev)
|
|
515
|
-
if ev.double():
|
|
516
|
-
pos = self.mapToView(ev.pos())
|
|
517
|
-
self.sig_double_clicked.emit(pos.x(), pos.y())
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
@dataclass
|
|
521
|
-
class RoiInfo:
|
|
522
|
-
""" DataClass holding info about a given ROI
|
|
523
|
-
|
|
524
|
-
Parameters
|
|
525
|
-
----------
|
|
526
|
-
origin
|
|
527
|
-
size
|
|
528
|
-
angle
|
|
529
|
-
centered
|
|
530
|
-
color
|
|
531
|
-
roi_class
|
|
532
|
-
index
|
|
533
|
-
"""
|
|
534
|
-
|
|
535
|
-
origin: Union[Point, IterableType[float]]
|
|
536
|
-
size: Union[Point, IterableType[float]]
|
|
537
|
-
angle: float = None
|
|
538
|
-
centered: bool = False
|
|
539
|
-
color: Tuple[int, int, int] = (255, 0, 0)
|
|
540
|
-
roi_class: type = None
|
|
541
|
-
index: int = 0
|
|
542
|
-
|
|
543
|
-
@classmethod
|
|
544
|
-
def info_from_linear_roi(cls, roi: LinearROI):
|
|
545
|
-
pos = roi.pos()
|
|
546
|
-
return cls(Point((pos[0],)), size=Point((pos[1] - pos[0],)), color=roi.color,
|
|
547
|
-
roi_class=type(roi), index=roi.index)
|
|
548
|
-
|
|
549
|
-
@classmethod
|
|
550
|
-
def info_from_rect_roi(cls, roi: RectROI):
|
|
551
|
-
return cls(Point(list(roi.pos())[::-1]), size=Point((roi.height(), roi.width())),
|
|
552
|
-
color=roi.color, roi_class=type(roi), index=roi.index)
|
|
553
|
-
|
|
554
|
-
def center_origin(self):
|
|
555
|
-
if not self.centered:
|
|
556
|
-
self.origin += Point((self.size[0] / 2, self.size[1] / 2))
|
|
557
|
-
self.centered = True
|
|
558
|
-
|
|
559
|
-
def to_slices(self) -> IterableType[slice]:
|
|
560
|
-
"""Get slices to be used directly to slice DataWithAxes"""
|
|
561
|
-
if issubclass(self.roi_class, pgROI):
|
|
562
|
-
if self.centered:
|
|
563
|
-
return (slice(int(self.origin[0] - self.size[0] / 2),
|
|
564
|
-
int(self.origin[0] + self.size[0] / 2)),
|
|
565
|
-
slice(int(self.origin[1] - self.size[1] / 2),
|
|
566
|
-
int(self.origin[1] + self.size[1] / 2)),
|
|
567
|
-
)
|
|
568
|
-
else:
|
|
569
|
-
return (slice(int(self.origin[0]),
|
|
570
|
-
int(self.origin[0] + self.size[0])),
|
|
571
|
-
slice(int(self.origin[1]),
|
|
572
|
-
int(self.origin[1] + self.size[1])),
|
|
573
|
-
)
|
|
574
|
-
elif issubclass(self.roi_class, pgLinearROI):
|
|
575
|
-
if self.centered:
|
|
576
|
-
return (slice(int(self.origin[0] - self.size[0] / 2),
|
|
577
|
-
int(self.origin[0] + self.size[0] / 2)),)
|
|
578
|
-
else:
|
|
579
|
-
return (slice(int(self.origin[0]), int(self.origin[0] + self.size[0])),)
|