gratinglab 0.1.2__tar.gz → 0.1.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.
Files changed (148) hide show
  1. {gratinglab-0.1.2/src/gratinglab.egg-info → gratinglab-0.1.3}/PKG-INFO +1 -1
  2. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/__init__.py +1 -1
  3. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/boundary/average.py +18 -6
  4. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/reading-outputs.md +12 -7
  5. {gratinglab-0.1.2 → gratinglab-0.1.3/src/gratinglab.egg-info}/PKG-INFO +1 -1
  6. {gratinglab-0.1.2 → gratinglab-0.1.3}/LICENSE +0 -0
  7. {gratinglab-0.1.2 → gratinglab-0.1.3}/README.md +0 -0
  8. {gratinglab-0.1.2 → gratinglab-0.1.3}/pyproject.toml +0 -0
  9. {gratinglab-0.1.2 → gratinglab-0.1.3}/setup.cfg +0 -0
  10. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/checks.py +0 -0
  11. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/compare.py +0 -0
  12. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/convergence.py +0 -0
  13. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/geometry.py +0 -0
  14. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/__init__.py +0 -0
  15. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/app.py +0 -0
  16. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/diagram.py +0 -0
  17. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/diagram3d.py +0 -0
  18. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/docs.py +0 -0
  19. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/icon.py +0 -0
  20. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/integral_options.py +0 -0
  21. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/mathtext.py +0 -0
  22. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/orders.py +0 -0
  23. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/provenance.py +0 -0
  24. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/__init__.py +0 -0
  25. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/geometry_panel.py +0 -0
  26. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/geometry_tab.py +0 -0
  27. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/integral_tab.py +0 -0
  28. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/main_window.py +0 -0
  29. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/profile_plot_panel.py +0 -0
  30. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/scalar_tab.py +0 -0
  31. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/scene3d_panel.py +0 -0
  32. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/setup_tab.py +0 -0
  33. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/sizing.py +0 -0
  34. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/theory_viewer.py +0 -0
  35. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/qt/worker.py +0 -0
  36. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/richtext.py +0 -0
  37. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/scalar_options.py +0 -0
  38. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/gui/state.py +0 -0
  39. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/illumination.py +0 -0
  40. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/io/__init__.py +0 -0
  41. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/io/efficiency_table.py +0 -0
  42. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/io/ggp.py +0 -0
  43. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/materials/__init__.py +0 -0
  44. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/materials/data/SOURCES.md +0 -0
  45. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/materials/fresnel.py +0 -0
  46. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/materials/optical.py +0 -0
  47. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/materials/refractiveindex.py +0 -0
  48. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/__init__.py +0 -0
  49. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/analyzer.py +0 -0
  50. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/boundary/__init__.py +0 -0
  51. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/boundary/pipeline.py +0 -0
  52. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/cli.py +0 -0
  53. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/config.py +0 -0
  54. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/core/__init__.py +0 -0
  55. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/core/analysis.py +0 -0
  56. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/core/image_flatten.py +0 -0
  57. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/core/processing.py +0 -0
  58. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/core/tip.py +0 -0
  59. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/data/__init__.py +0 -0
  60. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/data/aggregation.py +0 -0
  61. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/__init__.py +0 -0
  62. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/icon.py +0 -0
  63. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/__init__.py +0 -0
  64. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/app.py +0 -0
  65. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/boundary_view.py +0 -0
  66. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/canvas.py +0 -0
  67. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/efficiency_dialog.py +0 -0
  68. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/import_view.py +0 -0
  69. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/main_window.py +0 -0
  70. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/wiki_view.py +0 -0
  71. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/qt/worker.py +0 -0
  72. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/gui/state.py +0 -0
  73. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/io/__init__.py +0 -0
  74. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/io/file_io.py +0 -0
  75. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/io/metrics.py +0 -0
  76. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/io/spm.py +0 -0
  77. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/settings.py +0 -0
  78. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/stats/__init__.py +0 -0
  79. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/stats/analysis.py +0 -0
  80. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/stats/icc.py +0 -0
  81. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/visualization/__init__.py +0 -0
  82. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/visualization/diagnostics.py +0 -0
  83. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/visualization/profiles.py +0 -0
  84. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/visualization/statistics.py +0 -0
  85. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/__init__.py +0 -0
  86. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/facet-fitting.md +0 -0
  87. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/file-formats.md +0 -0
  88. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/flattening.md +0 -0
  89. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/icc-correction.md +0 -0
  90. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/overview.md +0 -0
  91. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/row-groups.md +0 -0
  92. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/wiki/tip-correction.md +0 -0
  93. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/metrology/workflows.py +0 -0
  94. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/problem.py +0 -0
  95. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/profiles.py +0 -0
  96. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/resolution.py +0 -0
  97. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/result.py +0 -0
  98. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/__init__.py +0 -0
  99. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/base.py +0 -0
  100. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/integral/__init__.py +0 -0
  101. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/integral/_boundary.py +0 -0
  102. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/integral/_core.py +0 -0
  103. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/integral/_finite.py +0 -0
  104. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/integral/_greens.py +0 -0
  105. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/integral/_kernels.py +0 -0
  106. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/integral/_nystrom.py +0 -0
  107. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab/solvers/scalar.py +0 -0
  108. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab.egg-info/SOURCES.txt +0 -0
  109. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab.egg-info/dependency_links.txt +0 -0
  110. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab.egg-info/entry_points.txt +0 -0
  111. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab.egg-info/requires.txt +0 -0
  112. {gratinglab-0.1.2 → gratinglab-0.1.3}/src/gratinglab.egg-info/top_level.txt +0 -0
  113. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_checks.py +0 -0
  114. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_compare.py +0 -0
  115. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_convergence.py +0 -0
  116. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_cross_method.py +0 -0
  117. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_efficiency_table.py +0 -0
  118. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_fresnel.py +0 -0
  119. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_geometry.py +0 -0
  120. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_ggp.py +0 -0
  121. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_diagram.py +0 -0
  122. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_diagram3d.py +0 -0
  123. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_docs.py +0 -0
  124. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_integral_options.py +0 -0
  125. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_mathtext.py +0 -0
  126. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_orders.py +0 -0
  127. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_provenance.py +0 -0
  128. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_qt.py +0 -0
  129. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_richtext.py +0 -0
  130. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_scalar_options.py +0 -0
  131. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_gui_state.py +0 -0
  132. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_illumination.py +0 -0
  133. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_integral_core.py +0 -0
  134. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_integral_corpus.py +0 -0
  135. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_integral_finite.py +0 -0
  136. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_integral_greens.py +0 -0
  137. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_integral_kernels.py +0 -0
  138. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_integral_operators.py +0 -0
  139. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_integral_solver.py +0 -0
  140. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_materials.py +0 -0
  141. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_perturbation.py +0 -0
  142. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_profiles.py +0 -0
  143. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_refractiveindex.py +0 -0
  144. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_resolution.py +0 -0
  145. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_result.py +0 -0
  146. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_scalar.py +0 -0
  147. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_solver_conformance.py +0 -0
  148. {gratinglab-0.1.2 → gratinglab-0.1.3}/tests/test_solver_progress.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gratinglab
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Open platform for diffraction grating groove metrology and efficiency analysis
5
5
  Author: Jake McCoy
6
6
  License: BSD-3-Clause
@@ -21,7 +21,7 @@ from .illumination import Illumination, Polarization
21
21
  from .resolution import ResolvingPower, resolving_power
22
22
  from .result import EfficiencyScan, OrderEfficiency, Provenance
23
23
 
24
- __version__ = "0.1.2"
24
+ __version__ = "0.1.3"
25
25
 
26
26
  __all__ = [
27
27
  "Illumination",
@@ -30,16 +30,24 @@ def flatten_endpoints(x, y):
30
30
 
31
31
 
32
32
  def average_grooves(x, y, groove_centers, period_nm, margin=0.0, n_points=2000,
33
- min_half_width=10):
33
+ min_half_width=10, require_full_period=True):
34
34
  """
35
35
  Extract each groove symmetrically and average them onto a common axis.
36
36
 
37
37
  Parameters:
38
38
  min_half_width: skip grooves whose symmetric half-extent is at or below
39
- this many samples. A groove near a scan edge cannot be extracted
40
- symmetrically - the scan stops part-way through it - so including it
41
- would distort the average. This is the boundary-profile equivalent of
42
- EDGE_EXCLUSION_PERIODS in the blaze-angle path.
39
+ this many samples, a floor on how coarsely a groove may be sampled.
40
+ require_full_period: skip any groove whose full one-period window does
41
+ not fit inside the scan. The common axis below is the narrowest
42
+ window in the set, and normalize_profile stretches that window to a
43
+ full period, so a single groove the scan edge cuts into would
44
+ truncate every other groove to its window and then stretch the
45
+ result. On the synthetic sawtooth one partial groove narrowed the
46
+ window to 0.66 of a period, turned a 70 degree anti-blaze facet
47
+ into 58 and took 13% off the depth. EDGE_EXCLUSION_PERIODS upstream
48
+ usually keeps such grooves out, but it is a user setting, so this
49
+ check does not rely on it. False reproduces the retired rev3
50
+ script, which tests/metrology/test_ggp_equivalence.py pins.
43
51
 
44
52
  Returns:
45
53
  x_common, y_avg, y_std, n_used
@@ -50,6 +58,8 @@ def average_grooves(x, y, groove_centers, period_nm, margin=0.0, n_points=2000,
50
58
 
51
59
  for center in groove_centers:
52
60
  L = min(half_width, center, len(x) - 1 - center)
61
+ if require_full_period and L < half_width:
62
+ continue # the scan edge cuts into this groove's period
53
63
  if L > min_half_width:
54
64
  x_g, y_g = extract_single_groove(x, y, center, period_nm, margin,
55
65
  allow_asymmetric=False)
@@ -59,7 +69,9 @@ def average_grooves(x, y, groove_centers, period_nm, margin=0.0, n_points=2000,
59
69
  grooves.append((x_g, y_g))
60
70
 
61
71
  if len(grooves) == 0:
62
- raise ValueError("No grooves could be extracted.")
72
+ raise ValueError(
73
+ "No grooves could be extracted: none has a full period inside the "
74
+ "scan, or the sampling is coarser than min_half_width allows.")
63
75
 
64
76
  # Common symmetric extent = most restrictive of the set
65
77
  max_left = min(-g[0][0] for g in grooves)
@@ -117,17 +117,22 @@ plots the profile rather than only reporting numbers.
117
117
  | Max slope magnitude | Steepest gradient |
118
118
  | Max curvature | Sharpest bend, a proxy for how rounded the groove is |
119
119
 
120
- ### Why edge exclusion matters especially here
120
+ ### Partial grooves are skipped
121
121
 
122
- `average_grooves` trims every groove to the **most restrictive** common extent,
123
- so one groove near a scan edge narrows the window shared by all of them. The
124
- normalisation step then stretches whatever window it has to span a full period.
122
+ `average_grooves` averages every groove over the **narrowest** window in the set,
123
+ and the normalisation step then stretches that window to span a full period. So a
124
+ single groove the scan edge cuts into would narrow the window for all of them and
125
+ distort the exported shape. It therefore skips any groove whose full period does
126
+ not fit inside the scan, whatever the edge-exclusion setting is. The summary's
127
+ "n of m grooves averaged" counts the skipped ones.
125
128
 
129
+ Before this check, edge exclusion was the only protection, and it is a setting.
126
130
  On the TASTE scan the last groove sits 38 samples from the edge against a
127
131
  half-width of 40, which stretched the exported profile horizontally by **5.5%**.
128
- With the edge rule applied: **0.31%**. A 5% error in the groove's aspect ratio is
129
- a real error in the efficiency it predicts, and nothing about the file would have
130
- shown it.
132
+ On the synthetic sawtooth, one partial groove narrowed the window to 0.66 of a
133
+ period, turned a 70° anti-blaze facet into 58° and took 13% off the depth. A
134
+ change that large in the groove's shape is a real change in the efficiency it
135
+ predicts, and nothing in the file would show it.
131
136
 
132
137
  ### Controls worth understanding
133
138
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gratinglab
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Summary: Open platform for diffraction grating groove metrology and efficiency analysis
5
5
  Author: Jake McCoy
6
6
  License: BSD-3-Clause
File without changes
File without changes
File without changes
File without changes
File without changes