gratinglab 0.3.2__tar.gz → 0.3.3__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.
- {gratinglab-0.3.2/src/gratinglab.egg-info → gratinglab-0.3.3}/PKG-INFO +5 -5
- {gratinglab-0.3.2 → gratinglab-0.3.3}/README.md +2 -2
- {gratinglab-0.3.2 → gratinglab-0.3.3}/pyproject.toml +14 -1
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/__init__.py +1 -1
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/geometry.py +42 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/illumination.py +44 -1
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/io/boundary.py +6 -2
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/io/efficiency_table.py +1 -1
- gratinglab-0.3.3/src/gratinglab/io/ggp.py +824 -0
- gratinglab-0.3.3/src/gratinglab/io/txl.py +273 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/materials/optical.py +1 -1
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/measured.py +10 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/config.py +1 -1
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/boundary_view.py +3 -2
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/settings.py +13 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3/src/gratinglab.egg-info}/PKG-INFO +5 -5
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab.egg-info/SOURCES.txt +4 -1
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab.egg-info/requires.txt +2 -2
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_geometry.py +39 -0
- gratinglab-0.3.3/tests/test_ggp.py +757 -0
- gratinglab-0.3.3/tests/test_littrow.py +184 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_measured.py +1 -1
- gratinglab-0.3.3/tests/test_txl.py +326 -0
- gratinglab-0.3.2/src/gratinglab/io/ggp.py +0 -276
- gratinglab-0.3.2/tests/test_ggp.py +0 -254
- {gratinglab-0.3.2 → gratinglab-0.3.3}/LICENSE +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/setup.cfg +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/checks.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/compare.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/convergence.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/app.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/cmethod_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/comparison.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/diagram.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/diagram3d.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/docs.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/efficiency_plot.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/icon.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/integral_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/launcher.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/mathtext.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/orders.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/provenance.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/cmethod_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/compare_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/geometry_panel.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/geometry_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/integral_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/launcher.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/main_window.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/profile_plot_panel.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/rcwa_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/scalar_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/scene3d_panel.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/setup_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/sizing.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/theming.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/theory_viewer.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/qt/worker.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/rcwa_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/richtext.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/scalar_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/state.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/gui/theme.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/io/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/materials/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/materials/data/SOURCES.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/materials/fresnel.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/materials/refractiveindex.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/analyzer.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/boundary/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/boundary/average.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/boundary/cross_section.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/boundary/pipeline.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/boundary/swaths.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/cli.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/analysis.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/image_flatten.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/orientation.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/processing.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/region_mask.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/scars.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/core/tip.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/data/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/data/aggregation.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/icon.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/app.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/canvas.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/efficiency_dialog.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/import_view.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/layout.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/main_window.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/swath_dialog.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/wiki_view.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/qt/worker.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/gui/state.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/io/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/io/file_io.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/io/ibw.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/io/metrics.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/io/sem.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/io/spm.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/stats/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/stats/analysis.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/stats/icc.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/visualization/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/visualization/diagnostics.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/visualization/profiles.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/visualization/statistics.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/facet-fitting.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/file-formats.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/flattening.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/groove-orientation.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/icc-correction.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/overview.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/reading-outputs.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/row-groups.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/scars-and-masking.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/swath-statistics.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/wiki/tip-correction.md +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/metrology/workflows.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/problem.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/profiles.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/resolution.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/result.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/_conditioning.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/_execution.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/base.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/cmethod/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/cmethod/_core.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/cmethod/_series.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/integral/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/integral/_boundary.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/integral/_core.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/integral/_finite.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/integral/_greens.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/integral/_kernels.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/integral/_nystrom.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/rcwa/__init__.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/rcwa/_core.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/rcwa/_stack.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab/solvers/scalar.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab.egg-info/dependency_links.txt +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab.egg-info/entry_points.txt +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/src/gratinglab.egg-info/top_level.txt +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_changelog.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_checks.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_cmethod.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_compare.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_conditioning.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_convergence.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_cross_method.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_efficiency_table.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_four_way.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_fresnel.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_cmethod_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_cmethod_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_compare_tab.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_diagram.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_diagram3d.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_docs.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_integral_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_launcher.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_mathtext.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_orders.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_provenance.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_qt.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_rcwa_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_richtext.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_scalar_options.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_state.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_gui_theme.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_illumination.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_core.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_corpus.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_finite.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_graded.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_greens.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_kernels.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_measured_polygon.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_operators.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_integral_solver.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_io_boundary.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_materials.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_perturbation.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_profiles.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_rayleigh_anomaly.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_rcwa.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_rcwa_benchmarks.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_refractiveindex.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_resolution.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_result.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_scalar.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_solver_conformance.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_solver_execution.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_solver_progress.py +0 -0
- {gratinglab-0.3.2 → gratinglab-0.3.3}/tests/test_trapezoidal_solvers.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gratinglab
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.3
|
|
4
4
|
Summary: Open platform for diffraction grating groove metrology and efficiency analysis
|
|
5
5
|
Author: Jake McCoy, Aditi Gangadharan
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -25,11 +25,11 @@ Requires-Dist: pydantic>=2.6
|
|
|
25
25
|
Requires-Dist: endstation>=0.2.6
|
|
26
26
|
Requires-Dist: threadpoolctl>=3.1
|
|
27
27
|
Provides-Extra: dev
|
|
28
|
-
Requires-Dist: pytest>=
|
|
28
|
+
Requires-Dist: pytest>=9.2; extra == "dev"
|
|
29
29
|
Requires-Dist: pytest-qt>=4.5; extra == "dev"
|
|
30
30
|
Requires-Dist: matplotlib>=3.8; extra == "dev"
|
|
31
31
|
Requires-Dist: pandas>=2.1; extra == "dev"
|
|
32
|
-
Requires-Dist: ruff>=0.
|
|
32
|
+
Requires-Dist: ruff>=0.17; extra == "dev"
|
|
33
33
|
Provides-Extra: gui
|
|
34
34
|
Requires-Dist: matplotlib>=3.8; extra == "gui"
|
|
35
35
|
Requires-Dist: PySide6-Essentials!=6.12.0,>=6.7; python_version < "3.12" and extra == "gui"
|
|
@@ -287,8 +287,8 @@ same applies to the private reference corpus of efficiency tables:
|
|
|
287
287
|
|
|
288
288
|
| Data | Environment variable | Default |
|
|
289
289
|
|---|---|---|
|
|
290
|
-
| AFM scans | `GRATINGLAB_AFM_DIR` | `~/Documents/afm_scans` |
|
|
291
|
-
| Reference efficiency tables | `GRATINGLAB_REF_DIR` | `~/Documents/diffraction_efficiency` |
|
|
290
|
+
| AFM scans | `GRATINGLAB_AFM_DIR` | `~/Documents/Research/afm_scans` |
|
|
291
|
+
| Reference efficiency tables | `GRATINGLAB_REF_DIR` | `~/Documents/Research/diffraction_efficiency` |
|
|
292
292
|
|
|
293
293
|
Tests that need either are skipped when it is absent, so the suite passes on a fresh
|
|
294
294
|
clone. Most of the metrology tests do not need it: they run against a committed
|
|
@@ -242,8 +242,8 @@ same applies to the private reference corpus of efficiency tables:
|
|
|
242
242
|
|
|
243
243
|
| Data | Environment variable | Default |
|
|
244
244
|
|---|---|---|
|
|
245
|
-
| AFM scans | `GRATINGLAB_AFM_DIR` | `~/Documents/afm_scans` |
|
|
246
|
-
| Reference efficiency tables | `GRATINGLAB_REF_DIR` | `~/Documents/diffraction_efficiency` |
|
|
245
|
+
| AFM scans | `GRATINGLAB_AFM_DIR` | `~/Documents/Research/afm_scans` |
|
|
246
|
+
| Reference efficiency tables | `GRATINGLAB_REF_DIR` | `~/Documents/Research/diffraction_efficiency` |
|
|
247
247
|
|
|
248
248
|
Tests that need either are skipped when it is absent, so the suite passes on a fresh
|
|
249
249
|
clone. Most of the metrology tests do not need it: they run against a committed
|
|
@@ -62,7 +62,20 @@ dependencies = [
|
|
|
62
62
|
]
|
|
63
63
|
|
|
64
64
|
[project.optional-dependencies]
|
|
65
|
-
|
|
65
|
+
# The two floors that are not "the oldest version that works": pytest and ruff
|
|
66
|
+
# are the gate the suite is judged by, and a local copy older than the one CI
|
|
67
|
+
# resolves makes that gate quietly permissive rather than merely different.
|
|
68
|
+
# `pytest>=7` let a local 9.1.1 accept `pytest.approx` over a list of tuples
|
|
69
|
+
# that 9.2 refuses, so tests/test_txl.py passed here and failed on all four CI
|
|
70
|
+
# legs; ruff gains rules between minors the same way, so an older copy passes
|
|
71
|
+
# what `ruff check .` rejects there. Both floors therefore track what CI
|
|
72
|
+
# installs, and raising them is part of taking a new version of either.
|
|
73
|
+
#
|
|
74
|
+
# The library floors below stay as genuine minimums. CI installs the newest of
|
|
75
|
+
# everything on purpose -- that is what caught the pytest change -- and pinning
|
|
76
|
+
# matplotlib or pandas to whatever it resolved this week would throw that away
|
|
77
|
+
# while excluding environments the package supports.
|
|
78
|
+
dev = ["pytest>=9.2", "pytest-qt>=4.5", "matplotlib>=3.8", "pandas>=2.1", "ruff>=0.17"]
|
|
66
79
|
# The GUI is an optional extra: `pip install gratinglab` must never require
|
|
67
80
|
# a toolkit.
|
|
68
81
|
#
|
|
@@ -22,7 +22,7 @@ from .measured import MeasuredEfficiency, MeasurementProvenance
|
|
|
22
22
|
from .resolution import ResolvingPower, resolving_power
|
|
23
23
|
from .result import EfficiencyScan, OrderEfficiency, Provenance
|
|
24
24
|
|
|
25
|
-
__version__ = "0.3.
|
|
25
|
+
__version__ = "0.3.3"
|
|
26
26
|
|
|
27
27
|
__all__ = [
|
|
28
28
|
"Illumination",
|
|
@@ -27,6 +27,7 @@ __all__ = [
|
|
|
27
27
|
"horizon_weights",
|
|
28
28
|
"blaze_direction",
|
|
29
29
|
"blaze_wavelength",
|
|
30
|
+
"littrow_alpha",
|
|
30
31
|
"interference_factor",
|
|
31
32
|
]
|
|
32
33
|
|
|
@@ -466,6 +467,47 @@ def blaze_wavelength(
|
|
|
466
467
|
return np.where(m != 0, numerator / m, np.inf)
|
|
467
468
|
|
|
468
469
|
|
|
470
|
+
def littrow_alpha(order: int, wavelength: float, period: float, gamma: float) -> float:
|
|
471
|
+
r"""Azimuthal incidence angle that sends order ``order`` back along itself, in radians.
|
|
472
|
+
|
|
473
|
+
.. math::
|
|
474
|
+
\sin\alpha_L = \frac{m\lambda}{2 p \sin\gamma}
|
|
475
|
+
|
|
476
|
+
This is the grating equation with :math:`\beta_m = \alpha`, so the
|
|
477
|
+
diffracted order returns along the azimuth it arrived on. It is also the
|
|
478
|
+
facet angle a sawtooth needs to blaze into that order there, since
|
|
479
|
+
:func:`blaze_direction` gives :math:`\beta_b = 2\delta - \alpha = \alpha`
|
|
480
|
+
exactly when :math:`\delta = \alpha`.
|
|
481
|
+
|
|
482
|
+
Ported from PyXFocus ``grating.blazeYaw``, whose ``inc`` is the graze onto
|
|
483
|
+
the grating surface and whose yaw is measured in the surface from the
|
|
484
|
+
grooves. Neither is :math:`\gamma` or :math:`\alpha`; the two frames share
|
|
485
|
+
only the dispersion cosine, :math:`\cos(\text{inc})\sin\psi = \sin\gamma\sin\alpha`.
|
|
486
|
+
``docs/conventions.md`` §10 records the mapping.
|
|
487
|
+
|
|
488
|
+
Raises
|
|
489
|
+
------
|
|
490
|
+
ValueError
|
|
491
|
+
When :math:`|m\lambda| \ge 2 p \sin\gamma`, where no incidence angle
|
|
492
|
+
short of grazing reaches Littrow.
|
|
493
|
+
"""
|
|
494
|
+
if period <= 0:
|
|
495
|
+
raise ValueError(f"period must be positive, got {period}")
|
|
496
|
+
if wavelength <= 0:
|
|
497
|
+
raise ValueError(f"wavelength must be positive, got {wavelength}")
|
|
498
|
+
if not 0 < gamma <= np.pi / 2:
|
|
499
|
+
raise ValueError(f"gamma must lie in (0, pi/2], got {gamma}")
|
|
500
|
+
|
|
501
|
+
s = order * wavelength / (2.0 * period * np.sin(gamma))
|
|
502
|
+
if not -1.0 < s < 1.0:
|
|
503
|
+
raise ValueError(
|
|
504
|
+
f"order {order} at wavelength {wavelength} cannot reach Littrow on period "
|
|
505
|
+
f"{period} at gamma {np.degrees(gamma):g} deg: it needs sin(alpha) = {s:.4g}. "
|
|
506
|
+
"Littrow is reachable only while |m * wavelength| < 2 * period * sin(gamma)."
|
|
507
|
+
)
|
|
508
|
+
return float(np.arcsin(s))
|
|
509
|
+
|
|
510
|
+
|
|
469
511
|
def interference_factor(s: ArrayLike, n_grooves: int) -> NDArray[np.float64]:
|
|
470
512
|
r"""The finite-:math:`N` grating interference function, ISSI eq. (8).
|
|
471
513
|
|
|
@@ -5,11 +5,13 @@ incidence angle and the half-cone angle, because every mount reduces to it and i
|
|
|
5
5
|
serialises readably. Direction cosines are available as a derived property.
|
|
6
6
|
|
|
7
7
|
Three constructors exist so that each community can pass the angles it
|
|
8
|
-
uses; they all resolve to the same internal state
|
|
8
|
+
uses; they all resolve to the same internal state. A fourth places a mount at
|
|
9
|
+
Littrow for one order:
|
|
9
10
|
|
|
10
11
|
>>> Illumination.classical(alpha=10.0) # in-plane
|
|
11
12
|
>>> Illumination.conical(theta=10.0, phi=45.0) # RCWA-style polar/azimuth
|
|
12
13
|
>>> Illumination.offplane(graze=1.5, azimuth=0.97) # extreme off-plane, X-ray
|
|
14
|
+
>>> Illumination.littrow(1, 1.55, 400.0, graze=1.73) # order 1 back on itself
|
|
13
15
|
|
|
14
16
|
See ``docs/conventions.md`` §3 for the frame and the sign of ``alpha``.
|
|
15
17
|
"""
|
|
@@ -21,6 +23,8 @@ from typing import Literal
|
|
|
21
23
|
import numpy as np
|
|
22
24
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
23
25
|
|
|
26
|
+
from .geometry import littrow_alpha
|
|
27
|
+
|
|
24
28
|
__all__ = ["Illumination", "Polarization"]
|
|
25
29
|
|
|
26
30
|
Polarization = Literal["TE", "TM", "unpolarized"]
|
|
@@ -133,6 +137,45 @@ class Illumination(BaseModel):
|
|
|
133
137
|
"""
|
|
134
138
|
return cls(alpha_deg=azimuth, gamma_deg=graze, polarization=polarization)
|
|
135
139
|
|
|
140
|
+
@classmethod
|
|
141
|
+
def littrow(
|
|
142
|
+
cls,
|
|
143
|
+
order: int,
|
|
144
|
+
wavelength: float,
|
|
145
|
+
period: float,
|
|
146
|
+
graze: float = 90.0,
|
|
147
|
+
polarization: Polarization = "TE",
|
|
148
|
+
) -> "Illumination":
|
|
149
|
+
"""The Littrow mount for one order at one wavelength.
|
|
150
|
+
|
|
151
|
+
Order ``order`` leaves along the azimuth it arrived on,
|
|
152
|
+
:math:`\\beta_m = \\alpha`. The default ``graze = 90`` is the in-plane
|
|
153
|
+
Littrow mount; a small ``graze`` is the off-plane one, with ``graze``
|
|
154
|
+
the half-cone angle :math:`\\gamma` exactly as in :meth:`offplane`.
|
|
155
|
+
The azimuth found is also the facet angle that blazes into this order
|
|
156
|
+
here; see :func:`gratinglab.geometry.littrow_alpha`.
|
|
157
|
+
|
|
158
|
+
Parameters
|
|
159
|
+
----------
|
|
160
|
+
order
|
|
161
|
+
Diffraction order :math:`m`.
|
|
162
|
+
wavelength, period
|
|
163
|
+
In nm, or any unit the two share.
|
|
164
|
+
graze
|
|
165
|
+
Half-cone angle :math:`\\gamma`, degrees.
|
|
166
|
+
|
|
167
|
+
Raises
|
|
168
|
+
------
|
|
169
|
+
ValueError
|
|
170
|
+
When the order cannot reach Littrow at this wavelength and cone.
|
|
171
|
+
"""
|
|
172
|
+
alpha = littrow_alpha(order, wavelength, period, float(np.radians(graze)))
|
|
173
|
+
return cls(
|
|
174
|
+
alpha_deg=float(np.degrees(alpha)),
|
|
175
|
+
gamma_deg=graze,
|
|
176
|
+
polarization=polarization,
|
|
177
|
+
)
|
|
178
|
+
|
|
136
179
|
@classmethod
|
|
137
180
|
def from_direction_cosines(
|
|
138
181
|
cls, ux: float, uy: float, uz: float, polarization: Polarization = "TE"
|
|
@@ -225,8 +225,12 @@ def read_profile_file(path: "str | Path"):
|
|
|
225
225
|
|
|
226
226
|
The format is chosen by suffix, because the two are unrelated formats and
|
|
227
227
|
sniffing the content would only turn a clear refusal into a confusing one.
|
|
228
|
-
Only the JSON carries a period
|
|
229
|
-
|
|
228
|
+
Only the JSON carries a period *in nm*; a ``.ggp``'s control string may
|
|
229
|
+
carry the number without its unit, and ``read_ggp`` reports it. Read the
|
|
230
|
+
JSON with :func:`read_boundary_json` to get a period you can use.
|
|
231
|
+
|
|
232
|
+
All five of PCGrate's border profile types reach a profile through here --
|
|
233
|
+
see :mod:`gratinglab.io.ggp` -- so this is not polygonal-only.
|
|
230
234
|
"""
|
|
231
235
|
path = Path(path)
|
|
232
236
|
if path.suffix.lower() == ".json":
|
|
@@ -32,7 +32,7 @@ Format, confirmed by inspection of PCGrate-SX 6.7.1 output::
|
|
|
32
32
|
Every line is tab-separated and right-padded with empty fields.
|
|
33
33
|
|
|
34
34
|
Order indices come from the column headers, never from a positional offset.
|
|
35
|
-
The prototype scripts in ``~/Documents/diffraction_efficiency`` read columns as
|
|
35
|
+
The prototype scripts in ``~/Documents/Research/diffraction_efficiency`` read columns as
|
|
36
36
|
``data[i+11]``, which works only because ``np.genfromtxt`` splits the quoted
|
|
37
37
|
label ``" Wav., nm"`` into two whitespace-delimited fields. That offset is
|
|
38
38
|
different for every file and silently wrong if the order range changes.
|