gratinglab 0.3.1__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.
Files changed (200) hide show
  1. {gratinglab-0.3.1/src/gratinglab.egg-info → gratinglab-0.3.2}/PKG-INFO +1 -1
  2. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/__init__.py +1 -1
  3. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/processing.py +39 -12
  4. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/io/spm.py +22 -3
  5. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/facet-fitting.md +5 -5
  6. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/file-formats.md +51 -15
  7. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/row-groups.md +19 -0
  8. {gratinglab-0.3.1 → gratinglab-0.3.2/src/gratinglab.egg-info}/PKG-INFO +1 -1
  9. {gratinglab-0.3.1 → gratinglab-0.3.2}/LICENSE +0 -0
  10. {gratinglab-0.3.1 → gratinglab-0.3.2}/README.md +0 -0
  11. {gratinglab-0.3.1 → gratinglab-0.3.2}/pyproject.toml +0 -0
  12. {gratinglab-0.3.1 → gratinglab-0.3.2}/setup.cfg +0 -0
  13. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/checks.py +0 -0
  14. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/compare.py +0 -0
  15. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/convergence.py +0 -0
  16. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/geometry.py +0 -0
  17. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/__init__.py +0 -0
  18. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/app.py +0 -0
  19. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/cmethod_options.py +0 -0
  20. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/comparison.py +0 -0
  21. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/diagram.py +0 -0
  22. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/diagram3d.py +0 -0
  23. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/docs.py +0 -0
  24. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/efficiency_plot.py +0 -0
  25. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/icon.py +0 -0
  26. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/integral_options.py +0 -0
  27. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/launcher.py +0 -0
  28. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/mathtext.py +0 -0
  29. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/orders.py +0 -0
  30. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/provenance.py +0 -0
  31. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/__init__.py +0 -0
  32. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/cmethod_tab.py +0 -0
  33. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/compare_tab.py +0 -0
  34. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/geometry_panel.py +0 -0
  35. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/geometry_tab.py +0 -0
  36. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/integral_tab.py +0 -0
  37. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/launcher.py +0 -0
  38. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/main_window.py +0 -0
  39. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/profile_plot_panel.py +0 -0
  40. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/rcwa_tab.py +0 -0
  41. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/scalar_tab.py +0 -0
  42. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/scene3d_panel.py +0 -0
  43. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/setup_tab.py +0 -0
  44. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/sizing.py +0 -0
  45. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/theming.py +0 -0
  46. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/theory_viewer.py +0 -0
  47. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/qt/worker.py +0 -0
  48. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/rcwa_options.py +0 -0
  49. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/richtext.py +0 -0
  50. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/scalar_options.py +0 -0
  51. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/state.py +0 -0
  52. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/gui/theme.py +0 -0
  53. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/illumination.py +0 -0
  54. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/io/__init__.py +0 -0
  55. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/io/boundary.py +0 -0
  56. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/io/efficiency_table.py +0 -0
  57. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/io/ggp.py +0 -0
  58. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/materials/__init__.py +0 -0
  59. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/materials/data/SOURCES.md +0 -0
  60. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/materials/fresnel.py +0 -0
  61. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/materials/optical.py +0 -0
  62. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/materials/refractiveindex.py +0 -0
  63. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/measured.py +0 -0
  64. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/__init__.py +0 -0
  65. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/analyzer.py +0 -0
  66. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/__init__.py +0 -0
  67. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/average.py +0 -0
  68. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/cross_section.py +0 -0
  69. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/pipeline.py +0 -0
  70. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/boundary/swaths.py +0 -0
  71. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/cli.py +0 -0
  72. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/config.py +0 -0
  73. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/__init__.py +0 -0
  74. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/analysis.py +0 -0
  75. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/image_flatten.py +0 -0
  76. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/orientation.py +0 -0
  77. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/region_mask.py +0 -0
  78. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/scars.py +0 -0
  79. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/core/tip.py +0 -0
  80. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/data/__init__.py +0 -0
  81. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/data/aggregation.py +0 -0
  82. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/__init__.py +0 -0
  83. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/icon.py +0 -0
  84. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/__init__.py +0 -0
  85. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/app.py +0 -0
  86. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/boundary_view.py +0 -0
  87. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/canvas.py +0 -0
  88. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/efficiency_dialog.py +0 -0
  89. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/import_view.py +0 -0
  90. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/layout.py +0 -0
  91. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/main_window.py +0 -0
  92. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/swath_dialog.py +0 -0
  93. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/wiki_view.py +0 -0
  94. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/qt/worker.py +0 -0
  95. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/gui/state.py +0 -0
  96. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/io/__init__.py +0 -0
  97. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/io/file_io.py +0 -0
  98. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/io/ibw.py +0 -0
  99. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/io/metrics.py +0 -0
  100. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/io/sem.py +0 -0
  101. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/settings.py +0 -0
  102. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/stats/__init__.py +0 -0
  103. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/stats/analysis.py +0 -0
  104. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/stats/icc.py +0 -0
  105. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/__init__.py +0 -0
  106. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/diagnostics.py +0 -0
  107. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/profiles.py +0 -0
  108. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/visualization/statistics.py +0 -0
  109. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/__init__.py +0 -0
  110. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/flattening.md +0 -0
  111. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/groove-orientation.md +0 -0
  112. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/icc-correction.md +0 -0
  113. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/overview.md +0 -0
  114. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/reading-outputs.md +0 -0
  115. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/scars-and-masking.md +0 -0
  116. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/swath-statistics.md +0 -0
  117. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/wiki/tip-correction.md +0 -0
  118. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/metrology/workflows.py +0 -0
  119. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/problem.py +0 -0
  120. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/profiles.py +0 -0
  121. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/resolution.py +0 -0
  122. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/result.py +0 -0
  123. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/__init__.py +0 -0
  124. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/_conditioning.py +0 -0
  125. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/_execution.py +0 -0
  126. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/base.py +0 -0
  127. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/cmethod/__init__.py +0 -0
  128. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/cmethod/_core.py +0 -0
  129. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/cmethod/_series.py +0 -0
  130. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/__init__.py +0 -0
  131. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_boundary.py +0 -0
  132. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_core.py +0 -0
  133. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_finite.py +0 -0
  134. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_greens.py +0 -0
  135. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_kernels.py +0 -0
  136. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/integral/_nystrom.py +0 -0
  137. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/rcwa/__init__.py +0 -0
  138. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/rcwa/_core.py +0 -0
  139. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/rcwa/_stack.py +0 -0
  140. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab/solvers/scalar.py +0 -0
  141. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab.egg-info/SOURCES.txt +0 -0
  142. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab.egg-info/dependency_links.txt +0 -0
  143. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab.egg-info/entry_points.txt +0 -0
  144. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab.egg-info/requires.txt +0 -0
  145. {gratinglab-0.3.1 → gratinglab-0.3.2}/src/gratinglab.egg-info/top_level.txt +0 -0
  146. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_changelog.py +0 -0
  147. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_checks.py +0 -0
  148. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_cmethod.py +0 -0
  149. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_compare.py +0 -0
  150. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_conditioning.py +0 -0
  151. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_convergence.py +0 -0
  152. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_cross_method.py +0 -0
  153. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_efficiency_table.py +0 -0
  154. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_four_way.py +0 -0
  155. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_fresnel.py +0 -0
  156. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_geometry.py +0 -0
  157. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_ggp.py +0 -0
  158. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_cmethod_options.py +0 -0
  159. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_cmethod_tab.py +0 -0
  160. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_compare_tab.py +0 -0
  161. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_diagram.py +0 -0
  162. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_diagram3d.py +0 -0
  163. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_docs.py +0 -0
  164. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_integral_options.py +0 -0
  165. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_launcher.py +0 -0
  166. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_mathtext.py +0 -0
  167. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_orders.py +0 -0
  168. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_provenance.py +0 -0
  169. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_qt.py +0 -0
  170. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_rcwa_options.py +0 -0
  171. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_richtext.py +0 -0
  172. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_scalar_options.py +0 -0
  173. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_state.py +0 -0
  174. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_gui_theme.py +0 -0
  175. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_illumination.py +0 -0
  176. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_core.py +0 -0
  177. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_corpus.py +0 -0
  178. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_finite.py +0 -0
  179. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_graded.py +0 -0
  180. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_greens.py +0 -0
  181. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_kernels.py +0 -0
  182. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_measured_polygon.py +0 -0
  183. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_operators.py +0 -0
  184. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_integral_solver.py +0 -0
  185. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_io_boundary.py +0 -0
  186. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_materials.py +0 -0
  187. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_measured.py +0 -0
  188. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_perturbation.py +0 -0
  189. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_profiles.py +0 -0
  190. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_rayleigh_anomaly.py +0 -0
  191. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_rcwa.py +0 -0
  192. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_rcwa_benchmarks.py +0 -0
  193. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_refractiveindex.py +0 -0
  194. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_resolution.py +0 -0
  195. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_result.py +0 -0
  196. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_scalar.py +0 -0
  197. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_solver_conformance.py +0 -0
  198. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_solver_execution.py +0 -0
  199. {gratinglab-0.3.1 → gratinglab-0.3.2}/tests/test_solver_progress.py +0 -0
  200. {gratinglab-0.3.1 → gratinglab-0.3.2}/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.1
3
+ Version: 0.3.2
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
@@ -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.1"
25
+ __version__ = "0.3.2"
26
26
 
27
27
  __all__ = [
28
28
  "Illumination",
@@ -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
- # Calculate row range for this group
311
- start_row = i * rows_per_group
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[start_row:end_row, :]
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[start_row]), int(kept_rows[end_row - 1]) + 1))
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
 
@@ -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 one pitfall (described below) that is best handled here.
11
+ the conversion has two pitfalls (described below) that are best handled here.
12
12
 
13
- The pitfall is as follows. The height scale comes from a line like::
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
- return heights_nm * 1e-9, described.scan_x_size_um
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(
@@ -61,11 +61,11 @@ On the master sample:
61
61
 
62
62
  | FACET_TRIM | Mean blaze angle |
63
63
  |---|---|
64
- | 0.05 | 32.94° |
65
- | 0.10 | 33.23° |
66
- | 0.15 | 32.84° |
67
- | 0.20 | 31.58° |
68
- | 0.25 | 29.99° |
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.002°. The `.ibw` route has
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 0.98 with the export, while
72
- Trace correlates 0.90. With this default the two input routes agree by
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.913° | 2.127° | 314.33 nm |
145
- | Raw `.spm` | 100 | 27.911° | 2.126° | 314.33 nm |
146
-
147
- The means differ by 0.002°, against a standard deviation of 2.13°.
148
-
149
- The results are not bit-identical, and they are not expected to be: the export
150
- was flattened by Gwyddion while the `.spm` is raw, and the two differ by 7 nm
151
- RMS. This software, however, flattens every row-group profile itself before
152
- fitting, which removes the same background. The Gwyddion flattening step is
153
- therefore redundant for this pipeline.
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 flattening existed only in the text export.
193
+ modified data, and on the evidence above the text export carries none either.
158
194
 
159
195
  ## Practical notes
160
196
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gratinglab
3
- Version: 0.3.1
3
+ Version: 0.3.2
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
File without changes
File without changes
File without changes
File without changes
File without changes