gratinglab 0.3.0__tar.gz → 0.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.
- {gratinglab-0.3.0/src/gratinglab.egg-info → gratinglab-0.3.2}/PKG-INFO +1 -1
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/__init__.py +1 -1
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/config.py +0 -1
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/processing.py +39 -12
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/boundary_view.py +1 -14
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/io/spm.py +22 -3
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/settings.py +0 -2
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/facet-fitting.md +5 -5
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/file-formats.md +51 -15
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/reading-outputs.md +3 -3
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/row-groups.md +19 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/workflows.py +1 -2
- {gratinglab-0.3.0 → gratinglab-0.3.2/src/gratinglab.egg-info}/PKG-INFO +1 -1
- {gratinglab-0.3.0 → gratinglab-0.3.2}/LICENSE +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/README.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/pyproject.toml +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/setup.cfg +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/checks.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/compare.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/convergence.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/geometry.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/app.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/cmethod_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/comparison.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/diagram.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/diagram3d.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/docs.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/efficiency_plot.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/icon.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/integral_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/launcher.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/mathtext.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/orders.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/provenance.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/cmethod_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/compare_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/geometry_panel.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/geometry_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/integral_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/launcher.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/main_window.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/profile_plot_panel.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/rcwa_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/scalar_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/scene3d_panel.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/setup_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/sizing.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/theming.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/theory_viewer.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/qt/worker.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/rcwa_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/richtext.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/scalar_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/state.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/gui/theme.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/illumination.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/io/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/io/boundary.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/io/efficiency_table.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/io/ggp.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/materials/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/materials/data/SOURCES.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/materials/fresnel.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/materials/optical.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/materials/refractiveindex.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/measured.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/analyzer.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/average.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/cross_section.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/pipeline.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/swaths.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/cli.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/analysis.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/image_flatten.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/orientation.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/region_mask.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/scars.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/core/tip.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/data/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/data/aggregation.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/icon.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/app.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/canvas.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/efficiency_dialog.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/import_view.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/layout.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/main_window.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/swath_dialog.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/wiki_view.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/worker.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/state.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/io/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/io/file_io.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/io/ibw.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/io/metrics.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/io/sem.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/stats/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/stats/analysis.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/stats/icc.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/diagnostics.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/profiles.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/statistics.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/flattening.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/groove-orientation.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/icc-correction.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/overview.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/scars-and-masking.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/swath-statistics.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/tip-correction.md +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/problem.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/profiles.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/resolution.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/result.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/_conditioning.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/_execution.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/base.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/cmethod/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/cmethod/_core.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/cmethod/_series.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_boundary.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_core.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_finite.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_greens.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_kernels.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_nystrom.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/rcwa/__init__.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/rcwa/_core.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/rcwa/_stack.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab/solvers/scalar.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab.egg-info/SOURCES.txt +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab.egg-info/dependency_links.txt +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab.egg-info/entry_points.txt +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab.egg-info/requires.txt +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/src/gratinglab.egg-info/top_level.txt +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_changelog.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_checks.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_cmethod.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_compare.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_conditioning.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_convergence.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_cross_method.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_efficiency_table.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_four_way.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_fresnel.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_geometry.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_ggp.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_cmethod_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_cmethod_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_compare_tab.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_diagram.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_diagram3d.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_docs.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_integral_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_launcher.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_mathtext.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_orders.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_provenance.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_qt.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_rcwa_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_richtext.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_scalar_options.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_state.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_gui_theme.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_illumination.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_core.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_corpus.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_finite.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_graded.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_greens.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_kernels.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_measured_polygon.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_operators.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_integral_solver.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_io_boundary.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_materials.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_measured.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_perturbation.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_profiles.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_rayleigh_anomaly.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_rcwa.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_rcwa_benchmarks.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_refractiveindex.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_resolution.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_result.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_scalar.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_solver_conformance.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_solver_execution.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_solver_progress.py +0 -0
- {gratinglab-0.3.0 → gratinglab-0.3.2}/tests/test_trapezoidal_solvers.py +0 -0
|
@@ -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.2"
|
|
26
26
|
|
|
27
27
|
__all__ = [
|
|
28
28
|
"Illumination",
|
|
@@ -172,7 +172,6 @@ GGP_N_POINTS = 2000 # Points in the exported profile
|
|
|
172
172
|
GGP_APPLY_SMOOTHING = True # Light smoothing to remove interpolation kinks
|
|
173
173
|
GGP_SMOOTHING_WINDOW = 5 # Larger = smoother
|
|
174
174
|
GGP_MIN_HALF_WIDTH = 10 # Skip grooves whose symmetric half-extent is <= this
|
|
175
|
-
GGP_WRITE_HEADER = False # Start the .ggp with "3 0 - Polygonal type" / "Period: 1 PSC: 1"
|
|
176
175
|
# many samples (i.e. clipped by the scan edge)
|
|
177
176
|
|
|
178
177
|
# ============ FILE SELECTION ============
|
|
@@ -303,21 +303,42 @@ def raw_data_multi_group(data, scan_x_size, n_groups=10):
|
|
|
303
303
|
n_groups = max(1, n_rows // 3)
|
|
304
304
|
rows_per_group = n_rows // n_groups
|
|
305
305
|
|
|
306
|
+
# `n_rows` rarely divides by `n_groups`, and where the leftover lines go
|
|
307
|
+
# decides whether the bands survive reading the scan the other way up.
|
|
308
|
+
# Giving them all to the last band -- what this did until 0.3.2 -- moves
|
|
309
|
+
# every boundary by `leftover` when the rows are reversed, so one scan read
|
|
310
|
+
# by two routes is cut into two different sets of bands. Harmless while the
|
|
311
|
+
# image is untouched (0.002 deg of blaze angle), but `align_grooves` shears
|
|
312
|
+
# each row by an amount that depends on its distance from the centre, and
|
|
313
|
+
# on a sheared image the same reshuffle cost 0.067 deg between the raw
|
|
314
|
+
# .spm and the Gwyddion .txt export of one grating.
|
|
315
|
+
#
|
|
316
|
+
# So the leftover comes off the centre line and the two ends instead, which
|
|
317
|
+
# leaves the set of bands unchanged under a reversal. Exactly unchanged
|
|
318
|
+
# when `n_rows` is odd, since only then does the centre line map to itself;
|
|
319
|
+
# with an even line count and an odd leftover, one line is still unbanded
|
|
320
|
+
# from the near side, and that much asymmetry cannot be removed.
|
|
321
|
+
#
|
|
322
|
+
# With an even band count the dropped centre line falls on a boundary. With
|
|
323
|
+
# an odd one the middle band spans it, so that band's `group_ranges` entry
|
|
324
|
+
# is a line wider than the band -- the same way a masked gap already widens
|
|
325
|
+
# one -- and a caller slicing by that range reads the extra line.
|
|
326
|
+
banded = rows_per_group * n_groups
|
|
327
|
+
leftover = n_rows - banded
|
|
328
|
+
centre_line = leftover % 2
|
|
329
|
+
per_end = (leftover - centre_line) // 2
|
|
330
|
+
rows = np.arange(per_end, n_rows - per_end)
|
|
331
|
+
if centre_line:
|
|
332
|
+
rows = rows[rows != (n_rows - 1) // 2]
|
|
333
|
+
|
|
306
334
|
profiles_nm = []
|
|
307
335
|
group_ranges = []
|
|
308
|
-
|
|
336
|
+
|
|
309
337
|
for i in range(n_groups):
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
# For the last group, include any remaining rows
|
|
314
|
-
if i == n_groups - 1:
|
|
315
|
-
end_row = n_rows
|
|
316
|
-
else:
|
|
317
|
-
end_row = (i + 1) * rows_per_group
|
|
318
|
-
|
|
338
|
+
band = rows[i * rows_per_group:(i + 1) * rows_per_group]
|
|
339
|
+
|
|
319
340
|
# Extract and average rows in this group
|
|
320
|
-
group_data = data[
|
|
341
|
+
group_data = data[band, :]
|
|
321
342
|
profile_avg = nan_mean_rows(group_data)
|
|
322
343
|
|
|
323
344
|
# Convert to nm and subtract minimum
|
|
@@ -325,7 +346,7 @@ def raw_data_multi_group(data, scan_x_size, n_groups=10):
|
|
|
325
346
|
|
|
326
347
|
profiles_nm.append(profile_nm)
|
|
327
348
|
# In the image's own line numbers, so a masked gap shows as a wider band
|
|
328
|
-
group_ranges.append((int(kept_rows[
|
|
349
|
+
group_ranges.append((int(kept_rows[band[0]]), int(kept_rows[band[-1]]) + 1))
|
|
329
350
|
|
|
330
351
|
# Package metadata
|
|
331
352
|
group_info = {
|
|
@@ -334,11 +355,17 @@ def raw_data_multi_group(data, scan_x_size, n_groups=10):
|
|
|
334
355
|
'rows_per_group': rows_per_group,
|
|
335
356
|
'group_ranges': group_ranges,
|
|
336
357
|
'rows_excluded': rows_excluded,
|
|
358
|
+
# Lines inside the image that no band could take, left out at the
|
|
359
|
+
# centre and the ends to keep the stack symmetric. Distinct from
|
|
360
|
+
# `rows_excluded`, which counts lines masked or dropped as scars.
|
|
361
|
+
'rows_unbanded': int(leftover),
|
|
337
362
|
}
|
|
338
363
|
|
|
339
364
|
print(f" Extracted {n_groups} row-group profiles")
|
|
340
365
|
print(f" Rows per group: {rows_per_group}")
|
|
341
366
|
print(f" Total rows used: {n_groups * rows_per_group} of {n_rows}")
|
|
367
|
+
if leftover:
|
|
368
|
+
print(f" Lines outside the bands (centre and ends): {leftover}")
|
|
342
369
|
if rows_excluded:
|
|
343
370
|
print(f" Lines excluded (masked or dropped): {rows_excluded} of {all_rows}")
|
|
344
371
|
|
|
@@ -131,17 +131,6 @@ class BoundaryView(QWidget):
|
|
|
131
131
|
self.min_half_spin.valueChanged.connect(self.refresh)
|
|
132
132
|
layout.addWidget(self.min_half_spin)
|
|
133
133
|
|
|
134
|
-
# Only the written file changes, not the profile, so no refresh.
|
|
135
|
-
self.header_check = QCheckBox("Write the PCGrate header")
|
|
136
|
-
self.header_check.setChecked(self._defaults.ggp_write_header)
|
|
137
|
-
self.header_check.setToolTip(
|
|
138
|
-
"Start the .ggp with the two lines\n"
|
|
139
|
-
" 3 0 - Polygonal type\n"
|
|
140
|
-
" Period: 1 PSC: 1\n"
|
|
141
|
-
"Off by default: PCGrate's border-profile import\n"
|
|
142
|
-
"takes the points alone.")
|
|
143
|
-
layout.addWidget(self.header_check)
|
|
144
|
-
|
|
145
134
|
self.export_btn = QPushButton("Export…")
|
|
146
135
|
self.export_btn.setEnabled(False)
|
|
147
136
|
self.export_btn.setToolTip(
|
|
@@ -214,7 +203,6 @@ class BoundaryView(QWidget):
|
|
|
214
203
|
ggp_apply_smoothing=self.smoothing_check.isChecked(),
|
|
215
204
|
ggp_smoothing_window=self.smoothing_spin.value(),
|
|
216
205
|
ggp_min_half_width=self.min_half_spin.value(),
|
|
217
|
-
ggp_write_header=self.header_check.isChecked(),
|
|
218
206
|
)
|
|
219
207
|
|
|
220
208
|
@property
|
|
@@ -456,8 +444,7 @@ class BoundaryView(QWidget):
|
|
|
456
444
|
metrics_path = os.path.splitext(path)[0] + '_metrics.txt'
|
|
457
445
|
write_profile_metrics(metrics_path, self._profile.metrics)
|
|
458
446
|
else:
|
|
459
|
-
write_ggp(path, t=self._profile.x_norm, y=self._profile.y_norm
|
|
460
|
-
header=self.header_check.isChecked())
|
|
447
|
+
write_ggp(path, t=self._profile.x_norm, y=self._profile.y_norm)
|
|
461
448
|
metrics_path = os.path.splitext(path)[0] + '_metrics.txt'
|
|
462
449
|
write_profile_metrics(metrics_path, self._profile.metrics)
|
|
463
450
|
return path, metrics_path
|
|
@@ -8,9 +8,9 @@ header section says where its bytes are and how to turn them into nanometres.
|
|
|
8
8
|
|
|
9
9
|
The reader was written here instead of taken from a library because the format
|
|
10
10
|
is small, this project depends on nothing beyond numpy/scipy/matplotlib, and
|
|
11
|
-
the conversion has
|
|
11
|
+
the conversion has two pitfalls (described below) that are best handled here.
|
|
12
12
|
|
|
13
|
-
The
|
|
13
|
+
The first is the height scale, which comes from a line like::
|
|
14
14
|
|
|
15
15
|
\\@2:Z scale: V [Sens. ZsensSens] (0.0000000001872337 V/LSB) 0.804163 V
|
|
16
16
|
|
|
@@ -25,6 +25,20 @@ The result shows no visible sign of the error: the image is the right shape,
|
|
|
25
25
|
the grooves are in the right places, and every blaze angle is silently
|
|
26
26
|
incorrect. The reader was verified against a known export: with the right
|
|
27
27
|
parameter, the peak-to-peak height matches to 1.0000.
|
|
28
|
+
|
|
29
|
+
The second is the direction of the slow axis. The rows are returned reversed
|
|
30
|
+
against the order the plane stores them, because that is what Gwyddion does
|
|
31
|
+
and this project's measurements all came through Gwyddion exports. Gwyddion
|
|
32
|
+
reverses every Nanoscope import unconditionally -- ``modules/file/nanoscope.c``
|
|
33
|
+
calls ``gwy_data_field_invert(dfield, TRUE, FALSE, FALSE)`` straight after
|
|
34
|
+
scaling the plane, and that first argument is ``yflipped``, documented as "the
|
|
35
|
+
image will be flipped upside down". It does not consult ``\\Frame direction``,
|
|
36
|
+
which reads ``Down`` on the files here.
|
|
37
|
+
|
|
38
|
+
This showed up as a sign: the same grating measured -0.3722 deg of groove
|
|
39
|
+
rotation read as a .spm and +0.3721 deg read as the Gwyddion .txt export of
|
|
40
|
+
that scan. A flip does not move the blaze angle, so it went unnoticed until
|
|
41
|
+
``groove_orientation`` began correcting for the rotation it reported.
|
|
28
42
|
"""
|
|
29
43
|
from __future__ import annotations
|
|
30
44
|
|
|
@@ -299,7 +313,12 @@ def read_spm(path, channel: str = DEFAULT_CHANNEL,
|
|
|
299
313
|
heights_nm = plane.reshape(described.rows, described.cols).astype(float) \
|
|
300
314
|
* volts_per_lsb * nm_per_volt
|
|
301
315
|
|
|
302
|
-
|
|
316
|
+
# Reversed: see the module docstring. Gwyddion's importer flips every
|
|
317
|
+
# Nanoscope plane upside down, so its text export of a scan is
|
|
318
|
+
# row-reversed against the plane as stored, and this reader exists to
|
|
319
|
+
# agree with those exports -- the same reason DEFAULT_DIRECTION is
|
|
320
|
+
# Retrace.
|
|
321
|
+
return heights_nm[::-1] * 1e-9, described.scan_x_size_um
|
|
303
322
|
|
|
304
323
|
available = list_channels(path)
|
|
305
324
|
raise ValueError(
|
|
@@ -131,7 +131,6 @@ class AnalysisSettings:
|
|
|
131
131
|
ggp_apply_smoothing: bool = True
|
|
132
132
|
ggp_smoothing_window: int = 5
|
|
133
133
|
ggp_min_half_width: int = 10
|
|
134
|
-
ggp_write_header: bool = False # the legacy two-line header; see io/ggp.py
|
|
135
134
|
|
|
136
135
|
# Row groups
|
|
137
136
|
use_row_groups: bool = True
|
|
@@ -188,7 +187,6 @@ class AnalysisSettings:
|
|
|
188
187
|
ggp_apply_smoothing=getattr(config, 'GGP_APPLY_SMOOTHING', True),
|
|
189
188
|
ggp_smoothing_window=getattr(config, 'GGP_SMOOTHING_WINDOW', 5),
|
|
190
189
|
ggp_min_half_width=getattr(config, 'GGP_MIN_HALF_WIDTH', 10),
|
|
191
|
-
ggp_write_header=getattr(config, 'GGP_WRITE_HEADER', False),
|
|
192
190
|
use_row_groups=config.USE_ROW_GROUPS,
|
|
193
191
|
n_row_groups=config.N_ROW_GROUPS,
|
|
194
192
|
show_2d_image=config.SHOW_2D_IMAGE,
|
|
@@ -61,11 +61,11 @@ On the master sample:
|
|
|
61
61
|
|
|
62
62
|
| FACET_TRIM | Mean blaze angle |
|
|
63
63
|
|---|---|
|
|
64
|
-
| 0.05 | 32.
|
|
65
|
-
| 0.10 | 33.
|
|
66
|
-
| 0.15 | 32.
|
|
67
|
-
| 0.20 | 31.
|
|
68
|
-
| 0.25 | 29.
|
|
64
|
+
| 0.05 | 32.89° |
|
|
65
|
+
| 0.10 | 33.13° |
|
|
66
|
+
| 0.15 | 32.71° |
|
|
67
|
+
| 0.20 | 31.49° |
|
|
68
|
+
| 0.25 | 29.94° |
|
|
69
69
|
|
|
70
70
|
This is a 3.2° change across a plausible range of a single parameter, larger
|
|
71
71
|
than most of the between-sample differences that this software is used to
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Three input formats are supported: the Bruker/Veeco Nanoscope `.spm` file,
|
|
4
4
|
the Asylum Research `.ibw` file, and a text export from Gwyddion. On the same
|
|
5
|
-
scan the `.spm` and text routes agree to within 0.
|
|
5
|
+
scan the `.spm` and text routes agree to within 0.005°, and to 0.000009°
|
|
6
|
+
with groove-orientation correction off. The `.ibw` route has
|
|
6
7
|
not yet been checked against a file from an instrument; see its section.
|
|
7
8
|
|
|
8
9
|
## Text exports
|
|
@@ -68,11 +69,34 @@ signal and does not represent topography; passing it through a blaze-angle
|
|
|
68
69
|
pipeline produces a plausible-looking number with no physical meaning.
|
|
69
70
|
|
|
70
71
|
Retrace is the default because it is the plane from which this project's
|
|
71
|
-
existing Gwyddion exports were taken: it correlates
|
|
72
|
-
Trace correlates 0.
|
|
72
|
+
existing Gwyddion exports were taken: it correlates 1.000000 with the export,
|
|
73
|
+
while Trace correlates 0.92. With this default the two input routes agree by
|
|
73
74
|
construction. Both directions image the same grooves and either is a legitimate
|
|
74
75
|
choice, and the GUI offers a selector when a `.spm` is loaded.
|
|
75
76
|
|
|
77
|
+
### Which way up
|
|
78
|
+
|
|
79
|
+
The rows are returned reversed against the order the plane stores them.
|
|
80
|
+
|
|
81
|
+
Gwyddion reverses the rows of every Nanoscope import, unconditionally:
|
|
82
|
+
`modules/file/nanoscope.c` calls `gwy_data_field_invert(dfield, TRUE, FALSE,
|
|
83
|
+
FALSE)` immediately after scaling the plane, and the first argument of that
|
|
84
|
+
function is `yflipped`, documented as "the image will be flipped upside down".
|
|
85
|
+
It does not consult `\Frame direction`, which reads `Down` on the files here.
|
|
86
|
+
So a Gwyddion export is upside down against the plane as stored, and since
|
|
87
|
+
every measurement this project has made came through such an export, the
|
|
88
|
+
reader follows Gwyddion rather than the file.
|
|
89
|
+
|
|
90
|
+
Reading the plane as stored, which is what this did until 0.3.2, left the two
|
|
91
|
+
routes mirror images of each other. A flip does not move the blaze angle, so
|
|
92
|
+
nothing showed until `groove_orientation` began measuring the groove rotation:
|
|
93
|
+
the same grating then read -0.3722° as a `.spm` and +0.3721° as the Gwyddion
|
|
94
|
+
export of that scan. Both routes now report +0.372°.
|
|
95
|
+
|
|
96
|
+
With the rows the right way up, the plane and the export agree to 0.00027 nm
|
|
97
|
+
rms on a scan 115 nm deep, which is the five significant digits the text export
|
|
98
|
+
writes and nothing else.
|
|
99
|
+
|
|
76
100
|
### The height scale, and how to misread it
|
|
77
101
|
|
|
78
102
|
Raw samples are integers. They are converted to nanometres using a line such
|
|
@@ -137,24 +161,36 @@ reader's was.
|
|
|
137
161
|
|
|
138
162
|
## The two routes compared
|
|
139
163
|
|
|
140
|
-
The same scan was processed by both routes:
|
|
164
|
+
The same scan was processed by both routes, at the current defaults:
|
|
141
165
|
|
|
142
166
|
| Route | N | Mean blaze angle | σ | Period |
|
|
143
167
|
|---|---|---|---|---|
|
|
144
|
-
| Gwyddion `.txt` | 100 | 27.
|
|
145
|
-
| Raw `.spm` | 100 | 27.
|
|
146
|
-
|
|
147
|
-
The means differ by 0.
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
168
|
+
| Gwyddion `.txt` | 100 | 27.888° | 2.053° | 313.89 nm |
|
|
169
|
+
| Raw `.spm` | 100 | 27.883° | 2.049° | 313.89 nm |
|
|
170
|
+
|
|
171
|
+
The means differ by 0.005°, against a standard deviation of 2.05°. With
|
|
172
|
+
`groove_orientation` off both routes read 27.915°, σ 2.165°, 314.33 nm — the
|
|
173
|
+
same to every digit printed, and 0.000009° apart in full. The 0.005° with the
|
|
174
|
+
correction on is not a disagreement about the heights: it is the slow-axis
|
|
175
|
+
size, which the `.spm` header gives as 1.56640625 µm while Gwyddion's
|
|
176
|
+
`# Height:` line rounds it to 1.566, so the two shear in slightly different
|
|
177
|
+
pixels.
|
|
178
|
+
|
|
179
|
+
The underlying arrays agree to 0.00027 nm RMS on a scan 115 nm deep, which is
|
|
180
|
+
the five significant digits the text export writes and nothing else: no per-row
|
|
181
|
+
offset (0.00001 nm), no plane, and no scale difference. The export is the plane.
|
|
182
|
+
|
|
183
|
+
That is not what this page said until 0.3.2. It reported a 7 nm RMS difference
|
|
184
|
+
and explained it as Gwyddion's flattening, which the pipeline's own row-group
|
|
185
|
+
flattening then removed. Both the figure and the explanation were artefacts of
|
|
186
|
+
reading the plane upside down (see "Which way up"): comparing a grating with
|
|
187
|
+
its own mirror image is what produced the 7 nm. Together with the finding
|
|
188
|
+
below, the `_flatten` in that filename appears to describe nothing that was
|
|
189
|
+
ever done to the data.
|
|
154
190
|
|
|
155
191
|
A further finding was made during this verification: the `_flatten.0_00003`
|
|
156
192
|
companion file beside the raw scan is byte-identical to it. Gwyddion never wrote
|
|
157
|
-
modified data, and the
|
|
193
|
+
modified data, and on the evidence above the text export carries none either.
|
|
158
194
|
|
|
159
195
|
## Practical notes
|
|
160
196
|
|
|
@@ -108,9 +108,9 @@ which is what PCGrate's border-profile import takes:
|
|
|
108
108
|
0.000500 0.000001
|
|
109
109
|
```
|
|
110
110
|
|
|
111
|
-
|
|
112
|
-
`
|
|
113
|
-
|
|
111
|
+
Files written before 0.3.0 may start with the legacy
|
|
112
|
+
`3 0 - Polygonal type` / `Period: 1 PSC: 1` lines; they still load. A script
|
|
113
|
+
that needs those lines can call `write_ggp(..., header=True)`.
|
|
114
114
|
|
|
115
115
|
Both columns are normalised: x runs from 0 to 1 across exactly one period, and
|
|
116
116
|
y is the height as a fraction of that period. A groove 0.33 deep in this file is
|
|
@@ -22,6 +22,25 @@ straightforwardly add information.
|
|
|
22
22
|
Each band is flattened independently, because the background tilt is not
|
|
23
23
|
necessarily uniform across the image.
|
|
24
24
|
|
|
25
|
+
## Where the leftover lines go
|
|
26
|
+
|
|
27
|
+
A line count rarely divides by the number of bands. The lines left over are
|
|
28
|
+
left out, from the centre line and from the two ends, so that the bands sit
|
|
29
|
+
symmetrically about the middle of the image. The count is reported as
|
|
30
|
+
`rows_unbanded`, separately from the lines dropped as scars or masked away.
|
|
31
|
+
|
|
32
|
+
The placement matters because the same scan can arrive either way up: a
|
|
33
|
+
Nanoscope `.spm` and the Gwyddion text export of that scan disagree about
|
|
34
|
+
which end of the slow axis is stored first. Until 0.3.2 the leftover lines
|
|
35
|
+
were given to the last band, which made every boundary move when the rows were
|
|
36
|
+
reversed. On an image that `groove_orientation` has sheared, each line is
|
|
37
|
+
shifted by an amount that depends on its distance from the centre, so the
|
|
38
|
+
reshuffle changed what each band averaged: on one 401-line scan it moved the
|
|
39
|
+
mean blaze angle by 0.067°, where the two readings of that scan now agree to
|
|
40
|
+
0.005° with the correction on and 0.000009° with it off. Centred bands are the
|
|
41
|
+
same set of bands read either way, so the measurement no longer depends on the
|
|
42
|
+
direction of the slow axis.
|
|
43
|
+
|
|
25
44
|
## Why grooves at a scan edge are rejected
|
|
26
45
|
|
|
27
46
|
`EDGE_EXCLUSION_PERIODS` (0.6 by default) discards any groove detected within
|
|
@@ -205,8 +205,7 @@ def run_boundary_profile_export(settings=None, filename=None):
|
|
|
205
205
|
stem = os.path.splitext(os.path.basename(filename))[0]
|
|
206
206
|
ggp_path = os.path.join(RESULTS_DIR, f'averaged_groove_profile_{stem}.ggp')
|
|
207
207
|
met_path = os.path.join(RESULTS_DIR, f'groove_analysis_metrics_{stem}.txt')
|
|
208
|
-
write_ggp(ggp_path, t=profile.x_norm, y=profile.y_norm
|
|
209
|
-
header=settings.ggp_write_header)
|
|
208
|
+
write_ggp(ggp_path, t=profile.x_norm, y=profile.y_norm)
|
|
210
209
|
write_profile_metrics(met_path, profile.metrics)
|
|
211
210
|
|
|
212
211
|
print(f"\n Groove depth: {profile.metrics['groove_depth']:.4f} of period")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|