pymodaq_plugins_beam_shaping 5.3.0__tar.gz → 5.3.2__tar.gz
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.
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/AGENTS.md +9 -1
- pymodaq_plugins_beam_shaping-5.3.2/AGENTS_BEAM_SHAPING.md +108 -0
- pymodaq_plugins_beam_shaping-5.3.2/CLAUDE.md +3 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/PKG-INFO +2 -1
- pymodaq_plugins_beam_shaping-5.3.2/docs/scripts/binary_holograms_snapshots.py +93 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/_images/binary_holograms.png +0 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/_images/field_tool.png +0 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/_static/css/layout.css +61 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/_static/css/overflow.css +11 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/_static/js/sidebar_toggle.js +44 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/acknowledgments.rst +3 -3
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/bibtex.bib +47 -1
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/conf.py +10 -11
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/introduction.rst +1 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/quick_start.rst +3 -2
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/redirects.txt +1 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/references.rst +22 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/theory.rst +209 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/troubleshooting.rst +4 -3
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/user_guide/algorithm_reference.rst +276 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/user_guide/algorithms.rst +381 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/user_guide/calibration.rst +11 -6
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/user_guide/corrections.rst +4 -1
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/user_guide/custom_algorithm.rst +331 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/user_guide/data_management.rst +123 -25
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/user_guide/field_tool.rst +154 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/user_guide/fields.rst +6 -2
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/user_guide/index.rst +5 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/user_guide/interface.rst +1 -6
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/user_guide/shapers.rst +77 -0
- pymodaq_plugins_beam_shaping-5.3.2/docs/src/user_guide/slmsuite.rst +87 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/pyproject.toml +2 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/__init__.py +7 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algo_base.py +231 -21
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithm_app.py +289 -121
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/binary_holograms.py +386 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/checker_board.py +13 -22
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/diffractive.py +6 -4
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/direct.py +4 -2
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/minimizer.py +6 -6
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/optim.py +5 -4
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/projections.py +8 -19
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/torch_base.py +1 -1
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/compensation.py +133 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/compensations/divide_by_input.py +40 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/compensations/no_compensation.py +11 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/factory.py +8 -2
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/ini_phases/flat_phase.py +12 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/ini_phases/quadratic_phase.py +2 -2
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/ini_phases/random_phase.py +23 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/utils.py +15 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_move_plugins/daq_move_MockShaper.py +25 -6
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_viewer_plugins/plugins_2D/daq_2Dviewer_MockShaperCamera.py +1 -1
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/extensions/spatial_beam_shaping.py +287 -64
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/field.py +23 -3
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/field_loader_app.py +107 -38
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/field_tool_app.py +304 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/h5.py +67 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/loaders/from_functions_loader.py +0 -2
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/loaders/save_field_loader.py +2 -14
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/operations/__init__.py +3 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/operations/base.py +117 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/operations/compute.py +201 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/operations/linear_phase.py +53 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/operations/log_amplitude.py +26 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/operations/unwrap.py +41 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/operations/zernike.py +54 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/hardware/mock_shaper_camera.py +19 -10
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/resources/cat_field.h5 +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/config_template.toml +13 -17
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/resources/holography_calibration.scan +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/scanners/calibration.py +4 -2
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/scripts/algorithm_playground.py +130 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/scripts/calibrate_slm.py +2 -1
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/scripts/make_calibration_entry.py +56 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/scripts/plot_convergence.py +49 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/utilities/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/utilities/calibrating.py +8 -10
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/utilities/corrections.py +12 -5
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/utilities/h5saving.py +439 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/utilities/headless_algorithms.py +764 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/utilities/region_outline.py +59 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/utilities/regions.py +27 -8
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/utilities/shaper.py +21 -0
- pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/utilities/sizing.py +67 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/conftest.py +28 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/field_test.py +63 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_algo_app_settings.py +107 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_algo_helpers.py +261 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_algorithm_playground.py +486 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_algorithm_status.py +89 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_algorithms_by_modulator_type.py +69 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_binary_holograms.py +355 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_calibration.py +50 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_compensation.py +107 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_custom_apps.py +332 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_field_tool.py +237 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_region_outline.py +270 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/test_regions.py +11 -9
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_saved_version.py +69 -0
- pymodaq_plugins_beam_shaping-5.3.2/tests/test_shaper_interface.py +292 -0
- pymodaq_plugins_beam_shaping-5.3.0/CLAUDE.md +0 -3
- pymodaq_plugins_beam_shaping-5.3.0/docs/src/references.rst +0 -45
- pymodaq_plugins_beam_shaping-5.3.0/docs/src/theory.rst +0 -146
- pymodaq_plugins_beam_shaping-5.3.0/docs/src/user_guide/algorithms.rst +0 -223
- pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/algorithms/ini_phases/random_phase.py +0 -10
- pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/resources/holography_calibration.xml +0 -1
- pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/slm/slm.py +0 -13
- pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/utilities/h5saving.py +0 -79
- pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/utilities/shaper.py +0 -35
- pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/utilities/sizing.py +0 -71
- pymodaq_plugins_beam_shaping-5.3.0/tests/field_test.py +0 -28
- pymodaq_plugins_beam_shaping-5.3.0/tests/test_custom_apps.py +0 -80
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/.gitattributes +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/.github/workflows/compatibility.yml +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/.github/workflows/python-publish.yml +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/.github/workflows/tests.yml +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/.gitignore +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/LICENSE +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/MANIFEST.in +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/README.rst +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/Makefile +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/make.bat +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/requirements.txt +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/scripts/data_browse.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/calibration.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/corrections.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/field_loader.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/layout.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/main_app.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/measurement_amplitude.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/schema.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_images/setup_field_loader.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/add_circle.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/deblur.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/equalizer.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/file_open.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/grid_off.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/grid_on.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/ink_eraser.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/ink_eraser_off.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/input.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/save.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/icons/target.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_static/logo.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_templates/apidoc/module.rst_t +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_templates/apidoc/package.rst_t +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/_templates/apidoc/toc.rst_t +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/index.rst +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/installation.rst +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/tutorials.rst +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/hatch_build.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/icon.ico +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/readthedocs.yml +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algo_config.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/algorithms/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/algorithms/ini_phases → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/compensations}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/ini_phase.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/algorithms/stoppings → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/ini_phases}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/loss.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/stopping.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/field/loaders → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/algorithms/stoppings}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/algorithms/stoppings/stoppings_base.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_move_plugins/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_move_plugins/daq_move_FocalLength.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_move_plugins/daq_move_MockAutoFocus.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_move_plugins/daq_move_Zernike.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_viewer_plugins/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_viewer_plugins/plugins_2D/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/daq_viewer_plugins/plugins_2D/daq_2Dviewer_MockAutoFocus.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/extensions/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/factory.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/hardware → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/field/loaders}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/loaders/dashboard_loader.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/loaders/image_loader.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/field/utils.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/resources → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/hardware}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/hardware/autofocus.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/models/OptimizerModelAutoFocus.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/models/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/models/datamixer_autofocus.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/Cemes - Logo - Sigle - Blanc.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/Papillon_flower_BW_resized.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/Pymodaq.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/scanners → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/resources}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/cheshirecat_rect.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/darumas_BW_resized.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/dollars.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/dollars.svg +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/face.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/holography.xml +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/mock_holo.xml +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/one_piece.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/osama.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/resources/zernike.png +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/scripts → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/scanners}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/slm → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/scripts}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/setup/factory.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/setup/setup.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0/src/pymodaq_plugins_beam_shaping/utilities → pymodaq_plugins_beam_shaping-5.3.2/src/pymodaq_plugins_beam_shaping/slm}/__init__.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/utilities/data.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/utilities/masking.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/utilities/zernike.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/src/pymodaq_plugins_beam_shaping/utils.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/algorithm_entry_points_test.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/element_test.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/pytensor_fft.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/pytorch_fft.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/pytorch_test_v1.ipynb +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tests/test_plugin_package_structure.py +0 -0
- {pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/tox.ini +0 -0
|
@@ -4,6 +4,10 @@ Guidance for AI coding assistants (and humans) building on **PyMoDAQ 5.3.x** fro
|
|
|
4
4
|
PyMoDAQ is a Qt framework that drives lab experiments: hardware is added through small *plugins*, and PyMoDAQ
|
|
5
5
|
provides the GUI, threading, data model, scans and HDF5 saving. Python 3.10 to 3.13.
|
|
6
6
|
|
|
7
|
+
> **This repository has specific guidance in [AGENTS_BEAM_SHAPING.md](AGENTS_BEAM_SHAPING.md)** (where the field loaders,
|
|
8
|
+
> algorithms, Field Tool, shapers, tests and docs are, branch conventions). Read it first; the rest of this file is the
|
|
9
|
+
> generic PyMoDAQ plugin guidance from the template.
|
|
10
|
+
|
|
7
11
|
This repository is a plugin package named `pymodaq_plugins_<name>`. Rename everything that still says `template`
|
|
8
12
|
before publishing.
|
|
9
13
|
|
|
@@ -203,4 +207,8 @@ extensions already does the job and only the conversion of the measurements or o
|
|
|
203
207
|
- [ ] Tests added for new behaviour using a mock controller (no real hardware in CI).
|
|
204
208
|
- [ ] Docstring of each plugin class states: compatible devices, what was tested, PyMoDAQ and OS versions,
|
|
205
209
|
drivers to install.
|
|
206
|
-
- [ ] `README.rst` updated; target PyMoDAQ version stated.
|
|
210
|
+
- [ ] `README.rst` updated; target PyMoDAQ version stated. Keep its section order: a short description, then `Authors`
|
|
211
|
+
(then `Contributors` if needed), then `Instruments` (`Actuators`, `Viewer0D`...). `pymodaq_plugin_manager` reads the
|
|
212
|
+
README from `Authors` to `Instruments` (`extract_authors_from_description` in its `validate.py`), so write nothing
|
|
213
|
+
else before these sections or between them: requirements, installation, hardware notes or differences with
|
|
214
|
+
another branch come after the `Instruments` list.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# AGENTS_BEAM_SHAPING.md: `pymodaq_plugins_beam_shaping`
|
|
2
|
+
|
|
3
|
+
A PyMoDAQ extension that computes masks for spatial light modulators (SLM, DMD...) from an input field and a target
|
|
4
|
+
field, sends them to a **Shaper** actuator of the Dashboard and optionally optimizes them with a camera feedback.
|
|
5
|
+
Source in `src/pymodaq_plugins_beam_shaping/`. The generic PyMoDAQ guidance is in [AGENTS.md](AGENTS.md) (copied from the plugin template, keep it
|
|
6
|
+
close to the template so that it can be updated); this file is what is specific to this repository.
|
|
7
|
+
|
|
8
|
+
## Branches and PRs
|
|
9
|
+
|
|
10
|
+
- Target PyMoDAQ is **5.3.x** (`pymodaq>=5.3.2,<5.4`). `5.3.x` is the default and integration branch: branch from it
|
|
11
|
+
(`feature/<topic>`) and open PRs against it. Never push to it directly.
|
|
12
|
+
- A feature in several steps is a stack of PRs: the second PR is based on the branch of the first and is retargeted to
|
|
13
|
+
`5.3.x` once the first is merged (the binary holograms are #82, then the superpixel one in #83).
|
|
14
|
+
- Do not use the word "preset" (obsolete): say *experiment* and *state* (see section 4 of AGENTS.md).
|
|
15
|
+
- The version comes from git tags (`hatch-vcs`); do not edit it. Entry points are generated at build time by
|
|
16
|
+
`hatch_build.py` from the `[features]` flags and the folders.
|
|
17
|
+
|
|
18
|
+
## Map of the code
|
|
19
|
+
|
|
20
|
+
| Where | What |
|
|
21
|
+
|---|---|
|
|
22
|
+
| `extensions/spatial_beam_shaping.py` | The Dashboard extension (`beam_shaping` script). Hosts the algorithm app, the field loaders, the Shaper actuator and the camera. |
|
|
23
|
+
| `field/field.py` | `Field`: the data class (a `DataRaw` with amplitude and phase, FFT helpers, pixel sizes) passed everywhere. |
|
|
24
|
+
| `field/utils.py`, `field/factory.py` | `FieldLoader` base class and `LoaderFactory`. |
|
|
25
|
+
| `field/loaders/` | The **field loaders**: `from_functions_loader.py` (Gaussian, Laguerre-Gauss, Hermite-Gauss, vortex...), `image_loader.py`, `save_field_loader.py` (h5), `dashboard_loader.py` (from a detector). |
|
|
26
|
+
| `field/field_loader_app.py` | The widget that lets the user choose and parametrize a loader (input field, target field). |
|
|
27
|
+
| `field/field_tool_app.py` | The standalone **Field Tool** (`field_tool` script): loads a Field and applies a chain of operations. |
|
|
28
|
+
| `field/operations/` | Field Tool operations: `base.py` (`FieldOperation`, `OperationFactory`), `linear_phase.py`, `unwrap.py`, `zernike.py`. The numerical helpers they use are in `compute.py` (centered grid, support mask, unwrap, linear phase fit, Zernike fit, wrap...). |
|
|
29
|
+
| `algorithms/algo_base.py` | `AlgoBase`: base of every algorithm (see below). |
|
|
30
|
+
| `algorithms/factory.py` | `AlgorithmFactory`, `register_algorithms()` and the entry point group `pymodaq_plugins_beam_shaping.algorithms` for third party algorithms. |
|
|
31
|
+
| `algorithms/algorithms/` | The **algorithms**, one module per family (see below). |
|
|
32
|
+
| `algorithms/ini_phases/`, `stoppings/`, `loss.py` | Initial phases, stopping criteria and loss functions used by iterative algorithms. |
|
|
33
|
+
| `algorithms/compensation.py`, `compensations/` | Compensation of the input beam profile (factory like the initial phases, chosen in the AlgoApp settings); an algorithm sets `INPUT_COMPENSATION` to the `Compensations` (StrEnum, add a member for a new compensation) member of its default compensation (None: none) and calls `compensate_target`. |
|
|
34
|
+
| `algorithms/algorithm_app.py` | `AlgoApp`: the widget running an algorithm, owning the masks, the shaper and the fields. |
|
|
35
|
+
| `algorithms/utils.py` | Enums (`AlgoStatus`, `AlgoType`, `ApplyMaskTo`, `LensSetup`). |
|
|
36
|
+
| `utilities/shaper.py` | `Shaper` and `ModulatorType` (phase, amplitude, both), defined in `pymodaq_plugins_utils`; `get_default_shaper()` reads the config. |
|
|
37
|
+
| `utilities/` | Corrections, calibration (`calibrating.py`), `sizing.py` (needed field size), `regions.py`, h5 saving, and `headless_algorithms.py` (see "Testing"). |
|
|
38
|
+
| `daq_move_plugins/`, `daq_viewer_plugins/`, `hardware/` | Mock shaper, mock camera and autofocus instruments used for tests and demos; real shapers live in other packages. |
|
|
39
|
+
| `scanners/calibration.py` | Scan scheme for the SLM calibration. |
|
|
40
|
+
| `models/` | Optimizer / data mixer models (autofocus). |
|
|
41
|
+
| `scripts/` | `algorithm_playground.py` (see "Testing"), SLM calibration scripts. |
|
|
42
|
+
| `resources/` | `config_template.toml` (defaults, incl. `default_shaper`), sample fields. |
|
|
43
|
+
|
|
44
|
+
## Field loaders
|
|
45
|
+
|
|
46
|
+
A loader derives from `FieldLoader`, sets `LOADER_NAME`, declares its settings in `params`, implements the loading of
|
|
47
|
+
`self.field` and is registered with `@LoaderFactory.register_loader()`. `register_loaders()` imports every module of
|
|
48
|
+
`field/loaders/`, so **adding a loader = adding a file there** (or a class in an existing module); no other
|
|
49
|
+
registration is needed. Parameters of the needed size (pixel counts and sizes) come from the parent app
|
|
50
|
+
(`pixel_width`, `n_pixel_width`...).
|
|
51
|
+
|
|
52
|
+
## Algorithms
|
|
53
|
+
|
|
54
|
+
- A class derived from `AlgoBase` in a module of `algorithms/algorithms/`, registered with
|
|
55
|
+
`@AlgorithmFactory.register_algorithm()`. Modules are discovered automatically: no import to add elsewhere.
|
|
56
|
+
- Class attributes to set: `ALGO_NAME` (unique, shown in the app), `MODULATOR_TYPES` (default phase only; amplitude
|
|
57
|
+
modulators such as a DMD need `ModulatorType.AMPLITUDE`; an algorithm is only offered when it supports the shaper,
|
|
58
|
+
and a shaper modulating both accepts all), `STATUS` / `STATUS_NOTE` (`AlgoStatus`, written by hand and honest: say
|
|
59
|
+
what was verified and on what), `ITERATIVE`, `INI_PHASE`, `params`.
|
|
60
|
+
- Families: iterative/projection (`projections.py`: Gerchberg-Saxton, Projections), `direct.py`, `diffractive.py`
|
|
61
|
+
(broken, see its status), `checker_board.py`, optimizers on PyTorch (`optim.py`, `minimizer.py`, `torch_base.py`,
|
|
62
|
+
optional `pytorch` extra), and the **amplitude modulation** family for DMDs.
|
|
63
|
+
- Amplitude modulation / binary holograms: on 5.3.x today `dmd_lee.py` (`DMD Lee`) and `super_pixel.py`
|
|
64
|
+
(`SuperPixels`). **PR #82 replaces both by `binary_holograms.py`** (base class `BinaryHologram` with the carrier
|
|
65
|
+
grating `px`, `py` and the carrier removal; `Binary Threshold` phase only, `Parallel Lee` amplitude and phase), and
|
|
66
|
+
PR #83 adds `Superpixel` to it. If those PRs are merged, the module is `binary_holograms.py` and the two old files
|
|
67
|
+
are gone; check which state the branch you are on is in before editing.
|
|
68
|
+
- User documentation of an algorithm: `docs/src/user_guide/algorithm_reference.rst` (reference, overview table),
|
|
69
|
+
`algorithms.rst`, `custom_algorithm.rst` (how to write one, including from another package through the entry
|
|
70
|
+
point group) and `theory.rst`.
|
|
71
|
+
|
|
72
|
+
## Shapers
|
|
73
|
+
|
|
74
|
+
The extension asks the **Shaper** actuator for its geometry and properties (read only settings groups
|
|
75
|
+
`shaper_geometry` and `shaper_properties`, defined in `pymodaq_plugins_utils.hardware.shaper`). Without such an
|
|
76
|
+
actuator the `default_shaper` section of the config is used. Do not hardcode a shaper size or modulator type.
|
|
77
|
+
Mock instruments for tests: `daq_move_MockShaper`, `daq_2Dviewer_MockShaperCamera`.
|
|
78
|
+
|
|
79
|
+
## Testing
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
pytest tests/ # whole suite (Qt is needed: tests use the qapp fixture)
|
|
83
|
+
pytest tests/test_algorithms_by_modulator_type.py
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- `tests/conftest.py` imports `cv2` first and removes the Qt plugin path variables it sets; keep that.
|
|
87
|
+
- Tests by topic: algorithms (`test_algo_helpers.py`, `test_algorithm_status.py`, `test_algorithms_by_modulator_type.py`,
|
|
88
|
+
`algorithm_entry_points_test.py`, `test_dmd_lee.py` or `test_binary_holograms.py` after #82), fields (`field_test.py`,
|
|
89
|
+
`test_field_tool.py`), shapers and calibration (`test_shaper_interface.py`, `test_calibration.py`), apps
|
|
90
|
+
(`test_custom_apps.py`), package structure (`test_plugin_package_structure.py`).
|
|
91
|
+
- On 5.3.x two tests of `test_shaper_interface.py` already fail; mention it instead of hiding it, and do not
|
|
92
|
+
disable tests.
|
|
93
|
+
- **Script to try an algorithm without the GUI**: `scripts/algorithm_playground.py`, cells delimited by `# %%`, run
|
|
94
|
+
in an IDE or Jupyter. It uses `utilities/headless_algorithms.py` (`list_available`, `make_shaper`, `HeadlessApp`,
|
|
95
|
+
`load_field`, `create_algorithm`, `run_algorithm`, `plot_field`, `plot`...), the same helpers the tests use, and
|
|
96
|
+
calls the algorithm as `AlgoApp` does. Prefer it, and tests built on `headless_algorithms`, to launching the
|
|
97
|
+
Dashboard. It validates the code path only, not the hardware.
|
|
98
|
+
|
|
99
|
+
## Documentation (Sphinx)
|
|
100
|
+
|
|
101
|
+
- Sources in `docs/src/` (`index.rst`, `theory.rst`, `quick_start.rst`, `user_guide/*.rst`: interface, fields,
|
|
102
|
+
field_tool, algorithms, algorithm_reference, custom_algorithm, shapers, slmsuite, calibration, corrections,
|
|
103
|
+
data_management), bibliography in `docs/src/bibtex.bib`, figures in `docs/src/_images/`.
|
|
104
|
+
- Figures are generated by scripts in `docs/scripts/` (e.g. the binary holograms snapshots after #82); update the
|
|
105
|
+
script and the image together.
|
|
106
|
+
- Build: `pip install -r docs/requirements.txt && make -C docs html` (config in `docs/src/conf.py`, Read the Docs in
|
|
107
|
+
`readthedocs.yml`). A new algorithm, loader or operation needs its doc page entry in the same PR.
|
|
108
|
+
- Write the docs in the voice of the existing pages; cite papers through `bibtex.bib`.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: pymodaq_plugins_beam_shaping
|
|
3
|
-
Version: 5.3.
|
|
3
|
+
Version: 5.3.2
|
|
4
4
|
Summary: PyMoDAQ's extension plugin to run optical shaping from various shapers (focusing on amplitude and phase shaping) and the image propagation
|
|
5
5
|
Project-URL: Homepage, https://pymodaq.cnrs.fr
|
|
6
6
|
Project-URL: Documentation , https://pymodaq.cnrs.fr
|
|
@@ -47,6 +47,7 @@ Requires-Dist: opencv-python
|
|
|
47
47
|
Requires-Dist: pyfftw
|
|
48
48
|
Requires-Dist: pymodaq-data<5.4,>=5.3.0
|
|
49
49
|
Requires-Dist: pymodaq-gui<5.4,>=5.3.0
|
|
50
|
+
Requires-Dist: pymodaq-plugins-utils>=5.3.4
|
|
50
51
|
Requires-Dist: pymodaq-utils<5.4,>=5.3.1
|
|
51
52
|
Requires-Dist: pymodaq<5.4,>=5.3.2
|
|
52
53
|
Requires-Dist: scikit-image
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"""Makes the figure of the binary holograms of the documentation (docs/src/_images/binary_holograms.png)
|
|
2
|
+
|
|
3
|
+
The same target (the default *ImageFiles* loader: its image as amplitude and its associated phase) is computed with
|
|
4
|
+
each algorithm of the family (Binary Threshold, Parallel Lee, Superpixel), with the helpers of the script
|
|
5
|
+
``scripts/algorithm_playground.py``, and the part of the pattern sent to the modulator is shown. Run it with
|
|
6
|
+
``python binary_holograms_snapshots.py`` (the figure is written next to the other images of the documentation).
|
|
7
|
+
"""
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
import matplotlib
|
|
11
|
+
matplotlib.use('Agg')
|
|
12
|
+
from matplotlib import pyplot as plt
|
|
13
|
+
import numpy as np
|
|
14
|
+
|
|
15
|
+
from pymodaq_plugins_beam_shaping.algorithms.utils import ApplyMaskTo, AlgoType
|
|
16
|
+
from pymodaq_plugins_beam_shaping.utilities import headless_algorithms as pg, regions
|
|
17
|
+
|
|
18
|
+
OUTPUT = Path(__file__).parent.parent / 'src' / '_images' / 'binary_holograms.png'
|
|
19
|
+
ALGORITHMS = ('Binary Threshold', 'Parallel Lee', 'Superpixel')
|
|
20
|
+
# the periods of the grating, in pixels: wide for the amplitude levels of Parallel Lee, the superpixels are 4 x 4
|
|
21
|
+
PARAMS = {'Binary Threshold': {'px': 8, 'py': 64}, 'Parallel Lee': {'px': 8, 'py': 64}, 'Superpixel': {'px': 4}}
|
|
22
|
+
MASK_HALF_SIZE = 150. # um, half size of the elliptical mask of the intermediate plane around the selected order
|
|
23
|
+
|
|
24
|
+
pg.ensure_qapp()
|
|
25
|
+
app = pg.HeadlessApp(pg.make_shaper(modulator_type='amplitude'))
|
|
26
|
+
input_field = pg.load_field('GaussianIntensity', None, app)
|
|
27
|
+
target_field = pg.load_field('ImageFiles', None, app) # the default image and its associated phase
|
|
28
|
+
|
|
29
|
+
results = {}
|
|
30
|
+
for name in ALGORITHMS:
|
|
31
|
+
algo = pg.create_algorithm(pg.reload_algorithm(name), app, PARAMS[name])
|
|
32
|
+
pg.set_fields(algo, input_field, target_field)
|
|
33
|
+
# the order to filter, as given by the algorithm, in um from the center of the intermediate plane
|
|
34
|
+
y, x = np.array(algo.order_frequency()) * regions.pixel_sizes_in_um(algo.intermediate_pixel_sizes)
|
|
35
|
+
center_y, center_x = np.array(algo.shape) * regions.pixel_sizes_in_um(algo.intermediate_pixel_sizes) / 2
|
|
36
|
+
# in the frame of the extension: the origin is the corner of the field
|
|
37
|
+
mask = ((center_y + y - MASK_HALF_SIZE, center_y + y + MASK_HALF_SIZE),
|
|
38
|
+
(center_x + x - MASK_HALF_SIZE, center_x + x + MASK_HALF_SIZE))
|
|
39
|
+
pg.set_mask(app, ApplyMaskTo.INTERMEDIATE, mask, 'elliptical')
|
|
40
|
+
pg.run_algorithm(algo)
|
|
41
|
+
output = algo.output_field
|
|
42
|
+
results[name] = (output.amplitude, output.phase, algo.modulator_field.amplitude, algo.ALGOTYPE)
|
|
43
|
+
reference = pg.get_target_field(algo).amplitude # the same for both
|
|
44
|
+
reference_phase = pg.get_target_field(algo).phase
|
|
45
|
+
pixel_size = output.pixels_sizes[1].m_as('um')
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def correlation(a, b):
|
|
49
|
+
a, b = a - a.mean(), b - b.mean()
|
|
50
|
+
return float((a * b).sum() / np.sqrt((a * a).sum() * (b * b).sum()))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# the region of the output plane holding the target, with some margin
|
|
54
|
+
rows, columns = np.nonzero(reference > 0.05 * reference.max())
|
|
55
|
+
margin = 30
|
|
56
|
+
window = (slice(max(rows.min() - margin, 0), rows.max() + margin), slice(max(columns.min() - margin, 0),
|
|
57
|
+
columns.max() + margin))
|
|
58
|
+
target_region = (slice(rows.min(), rows.max()), slice(columns.min(), columns.max()))
|
|
59
|
+
ny, nx = reference.shape
|
|
60
|
+
extent = np.array([window[1].start - nx / 2, window[1].stop - nx / 2,
|
|
61
|
+
window[0].start - ny / 2, window[0].stop - ny / 2]) * pixel_size / 1000 # mm
|
|
62
|
+
|
|
63
|
+
figure, axes = plt.subplots(len(ALGORITHMS), 3, figsize=(11, 3.3 * len(ALGORITHMS)), constrained_layout=True)
|
|
64
|
+
for row, name in enumerate(ALGORITHMS):
|
|
65
|
+
amplitude, phase, pattern, algotype = results[name]
|
|
66
|
+
amplitude = amplitude / amplitude[window].max()
|
|
67
|
+
axes[row, 0].imshow(amplitude[window], extent=extent, origin='lower', cmap='viridis', vmin=0, vmax=1)
|
|
68
|
+
if algotype == AlgoType.PHASE: # the amplitude of the target is not encoded
|
|
69
|
+
axes[row, 0].set_title(f'{name}\nAmplitude (phase only: the amplitude of the target is not encoded)',
|
|
70
|
+
fontsize=9)
|
|
71
|
+
else:
|
|
72
|
+
axes[row, 0].set_title(f'{name}\nAmplitude (correlation with the target image: '
|
|
73
|
+
f'{correlation(results[name][0][target_region], reference[target_region]):.2f})',
|
|
74
|
+
fontsize=9)
|
|
75
|
+
shown_phase = np.where(amplitude > 0.1, phase, np.nan) # the phase only where there is light
|
|
76
|
+
image = axes[row, 1].imshow(shown_phase[window], extent=extent, origin='lower', cmap='twilight', vmin=-np.pi,
|
|
77
|
+
vmax=np.pi)
|
|
78
|
+
axes[row, 1].set_title('Phase (where the amplitude is above 10 %)', fontsize=9)
|
|
79
|
+
centre = np.array(pattern.shape) // 2
|
|
80
|
+
zoom = (slice(centre[0], centre[0] + 40), slice(centre[1], centre[1] + 40))
|
|
81
|
+
axes[row, 2].imshow(pattern[zoom], cmap='gray', vmin=0, vmax=1, interpolation='nearest', origin='lower')
|
|
82
|
+
axes[row, 2].set_title('Pattern on the modulator (40 x 40 pixels)', fontsize=9)
|
|
83
|
+
for ax in axes[row, :2]:
|
|
84
|
+
ax.set_xlabel('mm')
|
|
85
|
+
ax.set_ylabel('mm')
|
|
86
|
+
axes[row, 2].axis('off')
|
|
87
|
+
figure.colorbar(image, ax=axes[:, 1], label='rad', shrink=0.6, pad=0.02)
|
|
88
|
+
figure.savefig(OUTPUT, dpi=110)
|
|
89
|
+
print(f'written: {OUTPUT}')
|
|
90
|
+
for name in ALGORITHMS:
|
|
91
|
+
if results[name][3] != AlgoType.PHASE:
|
|
92
|
+
print(f'{name}: correlation of the amplitude with the target image = '
|
|
93
|
+
f'{correlation(results[name][0][target_region], reference[target_region]):.3f}')
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/* Let the page content use the whole browser width instead of the
|
|
2
|
+
theme's fixed 800px column. */
|
|
3
|
+
.wy-nav-content {
|
|
4
|
+
max-width: none;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/* Table cells wrap their text instead of pushing the table out of the page. */
|
|
8
|
+
.rst-content table.docutils td,
|
|
9
|
+
.rst-content table.docutils th,
|
|
10
|
+
.wy-table-responsive table td,
|
|
11
|
+
.wy-table-responsive table th {
|
|
12
|
+
white-space: normal;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/* Button showing/hiding the navigation sidebar (see sidebar_toggle.js). */
|
|
16
|
+
.pmq-sidebar-toggle {
|
|
17
|
+
position: fixed;
|
|
18
|
+
top: 8px;
|
|
19
|
+
left: 308px;
|
|
20
|
+
z-index: 300;
|
|
21
|
+
width: 32px;
|
|
22
|
+
height: 32px;
|
|
23
|
+
padding: 0;
|
|
24
|
+
border: 1px solid #c9c9c9;
|
|
25
|
+
border-radius: 4px;
|
|
26
|
+
background: #fcfcfc;
|
|
27
|
+
color: #404040;
|
|
28
|
+
font-size: 18px;
|
|
29
|
+
line-height: 30px;
|
|
30
|
+
text-align: center;
|
|
31
|
+
cursor: pointer;
|
|
32
|
+
opacity: 0.8;
|
|
33
|
+
}
|
|
34
|
+
.pmq-sidebar-toggle:hover {
|
|
35
|
+
opacity: 1;
|
|
36
|
+
background: #e7f2fa;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
body.pmq-sidebar-hidden .wy-nav-side {
|
|
40
|
+
display: none;
|
|
41
|
+
}
|
|
42
|
+
body.pmq-sidebar-hidden .wy-nav-content-wrap {
|
|
43
|
+
margin-left: 0;
|
|
44
|
+
}
|
|
45
|
+
body.pmq-sidebar-hidden .pmq-sidebar-toggle {
|
|
46
|
+
left: 8px;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* On small screens the theme already has its own menu button. */
|
|
50
|
+
@media screen and (max-width: 768px) {
|
|
51
|
+
.pmq-sidebar-toggle {
|
|
52
|
+
display: none;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* Keep the breadcrumbs clear of the toggle button. */
|
|
57
|
+
@media screen and (min-width: 769px) {
|
|
58
|
+
.wy-breadcrumbs {
|
|
59
|
+
padding-left: 36px;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Adds a button to show/hide the navigation sidebar of the Read the Docs theme.
|
|
2
|
+
// The choice is remembered between pages.
|
|
3
|
+
(function () {
|
|
4
|
+
var KEY = "beamshaping-docs-sidebar-hidden";
|
|
5
|
+
|
|
6
|
+
function stored() {
|
|
7
|
+
try {
|
|
8
|
+
return window.localStorage.getItem(KEY) === "1";
|
|
9
|
+
} catch (e) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function store(hidden) {
|
|
15
|
+
try {
|
|
16
|
+
window.localStorage.setItem(KEY, hidden ? "1" : "0");
|
|
17
|
+
} catch (e) {
|
|
18
|
+
// storage unavailable: the choice only lasts for this page
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
document.addEventListener("DOMContentLoaded", function () {
|
|
23
|
+
var button = document.createElement("button");
|
|
24
|
+
button.type = "button";
|
|
25
|
+
button.className = "pmq-sidebar-toggle";
|
|
26
|
+
|
|
27
|
+
function apply(hidden) {
|
|
28
|
+
document.body.classList.toggle("pmq-sidebar-hidden", hidden);
|
|
29
|
+
button.innerHTML = hidden ? "☰" : "«";
|
|
30
|
+
button.title = hidden ? "Show the navigation sidebar" : "Hide the navigation sidebar";
|
|
31
|
+
button.setAttribute("aria-label", button.title);
|
|
32
|
+
button.setAttribute("aria-expanded", hidden ? "false" : "true");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
button.addEventListener("click", function () {
|
|
36
|
+
var hidden = !document.body.classList.contains("pmq-sidebar-hidden");
|
|
37
|
+
apply(hidden);
|
|
38
|
+
store(hidden);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
apply(stored());
|
|
42
|
+
document.body.appendChild(button);
|
|
43
|
+
});
|
|
44
|
+
})();
|
|
@@ -41,7 +41,7 @@ Main Sources
|
|
|
41
41
|
- `GitHub: pymodaq_plugins_beam_shaping <https://github.com/PyMoDAQ/pymodaq_plugins_beam_shaping>`_
|
|
42
42
|
* - **Scientific Article**
|
|
43
43
|
- Full manuscript (PDF/LaTeX) provided by the authors (Rollo, Arbouet, Weber)
|
|
44
|
-
-
|
|
44
|
+
- To be cited
|
|
45
45
|
* - **PyMoDAQ Documentation**
|
|
46
46
|
- Official guide for extensions and documentation style
|
|
47
47
|
- `pymodaq.cnrs.fr <https://pymodaq.cnrs.fr/en/latest/>`_
|
|
@@ -54,10 +54,10 @@ Main Sources
|
|
|
54
54
|
|
|
55
55
|
|
|
56
56
|
Tools Used
|
|
57
|
-
|
|
57
|
+
----------
|
|
58
58
|
- **Sphinx** (with ``sphinx-rtd-theme``) for documentation generation.
|
|
59
59
|
- **reStructuredText** (``.rst``) for writing.
|
|
60
|
-
- **LaTeX** for mathematical equations (
|
|
60
|
+
- **LaTeX** syntax for mathematical equations (rendered in the browser by MathJax via ``sphinx.ext.mathjax``).
|
|
61
61
|
- **HDF5** for describing the structure of ``.h5beam`` files.
|
|
62
62
|
|
|
63
63
|
|
{pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/bibtex.bib
RENAMED
|
@@ -208,6 +208,7 @@
|
|
|
208
208
|
year = {1972},
|
|
209
209
|
pages = {237},
|
|
210
210
|
volume = {35},
|
|
211
|
+
url = {https://web.archive.org/web/20160328053000/http://www.u.arizona.edu/~ppoon/GerchbergandSaxton1972.pdf},
|
|
211
212
|
abstract = {An algorithm is presented for the rapid solution of the phase of the complete wave function whose intensity in the diffraction and imaging planes of an imaging system are known. A proof is given showing that a defined error between the estimated function and the correct function must decrease as the algorithm iterates. The problem of uniqueness is discussed and results are presented demonstrating the power of the method.},
|
|
212
213
|
groups = {pulse shaping},
|
|
213
214
|
}
|
|
@@ -639,4 +640,49 @@ year = {2013},
|
|
|
639
640
|
url = {https://opg.optica.org/ao/abstract.cfm?URI=ao-52-1-1},
|
|
640
641
|
doi = {10.1364/AO.52.000001},
|
|
641
642
|
abstract = {The addition of electronics, computers, and software to interferometry has enabled enormous improvements in optical metrology. This paper discusses four areas in which computerized interferometric measurement improvements have been made in the measurement of surface shape and surface roughness: (a)\&\#xA0;The use of computer-generated holograms for the testing of aspheric optics, (b)\&\#xA0;phase-shifting interferometry for getting interferometric data into a computer so the data can be analyzed, (c)\&\#xA0;computerized interference microscopes, including multiple-wavelength and coherence scanning, for the precision measurement of surface microstructure, and (d)\&\#xA0;vibration-insensitive dynamic interferometers for enabling precise measurements in noncontrolled environments.},
|
|
642
|
-
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
@article{gutierrez-cuevas_binary_2024,
|
|
646
|
+
title = {Binary holograms for shaping light with digital micromirror devices},
|
|
647
|
+
journal = {Journal of Physics: Photonics},
|
|
648
|
+
author = {Guti\'errez-Cuevas, R. and Popoff, S. M.},
|
|
649
|
+
volume = {6},
|
|
650
|
+
number = {4},
|
|
651
|
+
pages = {045022},
|
|
652
|
+
year = {2024},
|
|
653
|
+
url = {https://arxiv.org/abs/2311.16685},
|
|
654
|
+
note = {arXiv:2311.16685},
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
@article{lee_binary_1974,
|
|
658
|
+
title = {Binary {Synthetic} {Holograms}},
|
|
659
|
+
journal = {Applied Optics},
|
|
660
|
+
author = {Lee, Wai-Hon},
|
|
661
|
+
volume = {13},
|
|
662
|
+
number = {7},
|
|
663
|
+
pages = {1677--1682},
|
|
664
|
+
year = {1974},
|
|
665
|
+
doi = {10.1364/AO.13.001677},
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
@article{brown_complex_1966,
|
|
669
|
+
title = {Complex {Spatial} {Filtering} with {Binary} {Masks}},
|
|
670
|
+
journal = {Applied Optics},
|
|
671
|
+
author = {Brown, B. R. and Lohmann, A. W.},
|
|
672
|
+
volume = {5},
|
|
673
|
+
number = {6},
|
|
674
|
+
pages = {967--974},
|
|
675
|
+
year = {1966},
|
|
676
|
+
doi = {10.1364/AO.5.000967},
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
@article{bryngdahl_interferograms_1968,
|
|
680
|
+
title = {Interferograms are {Image} {Holograms}},
|
|
681
|
+
journal = {Journal of the Optical Society of America},
|
|
682
|
+
author = {Bryngdahl, O. and Lohmann, A. W.},
|
|
683
|
+
volume = {58},
|
|
684
|
+
number = {1},
|
|
685
|
+
pages = {141--142},
|
|
686
|
+
year = {1968},
|
|
687
|
+
doi = {10.1364/JOSA.58.000141},
|
|
688
|
+
}
|
|
@@ -33,7 +33,7 @@ extensions = [
|
|
|
33
33
|
"sphinx_autodoc_typehints",
|
|
34
34
|
'sphinx.ext.doctest',
|
|
35
35
|
'sphinx.ext.coverage',
|
|
36
|
-
'sphinx.ext.
|
|
36
|
+
'sphinx.ext.mathjax', # equations rendered in the browser, no LaTeX needed on the build machine (Read the Docs)
|
|
37
37
|
'sphinx.ext.githubpages',
|
|
38
38
|
'sphinx.ext.autosummary',
|
|
39
39
|
'releases',
|
|
@@ -53,19 +53,9 @@ numfig_format = {
|
|
|
53
53
|
'section': 'Section %s',
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
html_css_files = [
|
|
57
|
-
'https://fonts.googleapis.com/icon?family=Material+Icons',
|
|
58
|
-
'css/custom.css', # Pour styliser les icônes
|
|
59
|
-
]
|
|
60
|
-
|
|
61
56
|
bibtex_bibfiles = ['bibtex.bib'] # Chemin relatif à docs/
|
|
62
57
|
bibtex_reference_style = 'author_year' # Style de citation (ex: "Weber 2021")
|
|
63
58
|
|
|
64
|
-
# Configuration pour imgmath (équations LaTeX)
|
|
65
|
-
imgmath_image_format = 'png' # ou 'svg'
|
|
66
|
-
imgmath_font_size = 14
|
|
67
|
-
imgmath_dpi = 150
|
|
68
|
-
|
|
69
59
|
# -- Options for autodocumentation ---------------------------------------------
|
|
70
60
|
autodoc_member_order = "groupwise"
|
|
71
61
|
autoclass_content = "class"
|
|
@@ -120,7 +110,12 @@ html_theme_options = {
|
|
|
120
110
|
}
|
|
121
111
|
|
|
122
112
|
html_css_files = [
|
|
113
|
+
'https://fonts.googleapis.com/icon?family=Material+Icons',
|
|
123
114
|
'css/overflow.css',
|
|
115
|
+
'css/layout.css', # full-width content, tables kept within it
|
|
116
|
+
]
|
|
117
|
+
html_js_files = [
|
|
118
|
+
'js/sidebar_toggle.js', # button to hide the navigation sidebar
|
|
124
119
|
]
|
|
125
120
|
|
|
126
121
|
html_static_path = ["_static", "_images"] # NOUVEAU: Ajout de "_images"
|
|
@@ -134,6 +129,10 @@ datatables_options = {
|
|
|
134
129
|
'paging': True,
|
|
135
130
|
}
|
|
136
131
|
|
|
132
|
+
# -- Options for rediraffe -----------------------------------------------------
|
|
133
|
+
# Redirections of the pages that are renamed or removed, one "old_page new_page" per line (without the extension)
|
|
134
|
+
rediraffe_redirects = 'redirects.txt'
|
|
135
|
+
|
|
137
136
|
# -- Options for intersphinx ---------------------------------------------------
|
|
138
137
|
intersphinx_mapping = {
|
|
139
138
|
'python': ('https://docs.python.org/3', None),
|
{pymodaq_plugins_beam_shaping-5.3.0 → pymodaq_plugins_beam_shaping-5.3.2}/docs/src/quick_start.rst
RENAMED
|
@@ -7,7 +7,7 @@ Quick Start
|
|
|
7
7
|
:alt: Save
|
|
8
8
|
:align: middle
|
|
9
9
|
|
|
10
|
-
.. |file_open| image:: /_static/icons/
|
|
10
|
+
.. |file_open| image:: /_static/icons/file_open.png
|
|
11
11
|
:height: 20pt
|
|
12
12
|
:alt: Load
|
|
13
13
|
:align: middle
|
|
@@ -22,7 +22,7 @@ Quick Start
|
|
|
22
22
|
:alt: Input
|
|
23
23
|
:align: middle
|
|
24
24
|
|
|
25
|
-
.. |deblur| image:: /_static/icons/
|
|
25
|
+
.. |deblur| image:: /_static/icons/deblur.png
|
|
26
26
|
:height: 20pt
|
|
27
27
|
:alt: Corrections
|
|
28
28
|
:align: middle
|
|
@@ -128,6 +128,7 @@ Follow these steps to perform your first beam shaping:
|
|
|
128
128
|
For more details on the interface, see :numref:`FIG-quick-start`.
|
|
129
129
|
|
|
130
130
|
.. _FIG-quick-start:
|
|
131
|
+
|
|
131
132
|
.. figure:: /_images/main_app.png
|
|
132
133
|
:alt: BeamShaping User Interface
|
|
133
134
|
:width: 100%
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# "old_page new_page" for each page that is renamed or removed (paths relative to docs/src, without extension)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
References
|
|
2
|
+
==========
|
|
3
|
+
|
|
4
|
+
PyMoDAQ Documentation
|
|
5
|
+
---------------------
|
|
6
|
+
- To cite PyMoDAQ: :cite:p:`Weber2021`
|
|
7
|
+
- `PyMoDAQ Official Documentation <https://pymodaq.cnrs.fr/en/latest/>`_
|
|
8
|
+
- `Extension Plugins Guide <https://pymodaq.cnrs.fr/en/latest/developer_folder/extension_plugins.html>`_
|
|
9
|
+
- `Plugin Template Repository <https://github.com/PyMoDAQ/pymodaq_plugins_template>`_
|
|
10
|
+
|
|
11
|
+
Beam Shaping Literature
|
|
12
|
+
-----------------------
|
|
13
|
+
The articles cited in this documentation:
|
|
14
|
+
|
|
15
|
+
.. bibliography::
|
|
16
|
+
:cited:
|
|
17
|
+
:style: plain
|
|
18
|
+
|
|
19
|
+
Plugin Repository
|
|
20
|
+
-----------------
|
|
21
|
+
- `PyMoDAQ-BeamShaping GitHub <https://github.com/PyMoDAQ/pymodaq_plugins_beam_shaping>`_
|
|
22
|
+
|