os-optics-kit 0.1.0__py3-none-any.whl

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 (156) hide show
  1. os_optics_kit/__init__.py +9 -0
  2. os_optics_kit/__main__.py +3 -0
  3. os_optics_kit/_data/baseline.json +16 -0
  4. os_optics_kit/_data/cases/beam-expander/CASE.md +52 -0
  5. os_optics_kit/_data/cases/beam-expander/README.md +38 -0
  6. os_optics_kit/_data/cases/beam-expander/README.zh-CN.md +36 -0
  7. os_optics_kit/_data/cases/beam-expander/expected.json +10 -0
  8. os_optics_kit/_data/cases/beam-expander/images/iso.png +0 -0
  9. os_optics_kit/_data/cases/beam-expander/images/section.png +0 -0
  10. os_optics_kit/_data/cases/beam-expander/project.json +160 -0
  11. os_optics_kit/_data/cases/beam-expander/studies/beam_expander_l2_sweep.json +61 -0
  12. os_optics_kit/_data/cases/beam-expander/studies/beam_expander_move_l2.json +22 -0
  13. os_optics_kit/_data/cases/beam-expander/studies/beam_expander_swap_l2.json +22 -0
  14. os_optics_kit/_data/cases/detector-measurements/CASE.md +56 -0
  15. os_optics_kit/_data/cases/detector-measurements/README.md +37 -0
  16. os_optics_kit/_data/cases/detector-measurements/README.zh-CN.md +35 -0
  17. os_optics_kit/_data/cases/detector-measurements/data/README.md +60 -0
  18. os_optics_kit/_data/cases/detector-measurements/data/detector_response.csv +11 -0
  19. os_optics_kit/_data/cases/detector-measurements/data/reference_drift.csv +14 -0
  20. os_optics_kit/_data/cases/detector-measurements/expected.json +13 -0
  21. os_optics_kit/_data/cases/detector-measurements/images/top.png +0 -0
  22. os_optics_kit/_data/cases/detector-measurements/project.json +234 -0
  23. os_optics_kit/_data/cases/expansion-focus/CASE.md +55 -0
  24. os_optics_kit/_data/cases/expansion-focus/README.md +38 -0
  25. os_optics_kit/_data/cases/expansion-focus/README.zh-CN.md +37 -0
  26. os_optics_kit/_data/cases/expansion-focus/expected.json +12 -0
  27. os_optics_kit/_data/cases/expansion-focus/images/iso.png +0 -0
  28. os_optics_kit/_data/cases/expansion-focus/images/section.png +0 -0
  29. os_optics_kit/_data/cases/expansion-focus/project.json +278 -0
  30. os_optics_kit/_data/cases/expansion-focus/studies/compute_budget_default.json +1 -0
  31. os_optics_kit/_data/cases/expansion-focus/studies/compute_budget_limited.json +1 -0
  32. os_optics_kit/_data/cases/expansion-focus/studies/sensitivity_expander.json +21 -0
  33. os_optics_kit/_data/cases/expansion-focus/studies/sensitivity_expander_band_edge.json +65 -0
  34. os_optics_kit/_data/cases/expansion-focus/studies/tolerance_expander.json +89 -0
  35. os_optics_kit/_data/cases/expansion-focus/workflow.py +84 -0
  36. os_optics_kit/_data/cases/ideal-lens-focus/CASE.md +49 -0
  37. os_optics_kit/_data/cases/ideal-lens-focus/README.md +28 -0
  38. os_optics_kit/_data/cases/ideal-lens-focus/README.zh-CN.md +27 -0
  39. os_optics_kit/_data/cases/ideal-lens-focus/expected.json +10 -0
  40. os_optics_kit/_data/cases/ideal-lens-focus/ideal_lens_focus.py +76 -0
  41. os_optics_kit/_data/cases/ideal-lens-focus/images/section.png +0 -0
  42. os_optics_kit/_data/cases/ideal-lens-focus/project.json +133 -0
  43. os_optics_kit/_data/cases/interop-diffraction/CASE.md +58 -0
  44. os_optics_kit/_data/cases/interop-diffraction/README.md +38 -0
  45. os_optics_kit/_data/cases/interop-diffraction/README.zh-CN.md +35 -0
  46. os_optics_kit/_data/cases/interop-diffraction/expected.json +10 -0
  47. os_optics_kit/_data/cases/interop-diffraction/external_focus.py +349 -0
  48. os_optics_kit/_data/cases/interop-diffraction/hankel_reference.py +59 -0
  49. os_optics_kit/_data/cases/interop-diffraction/images/section.png +0 -0
  50. os_optics_kit/_data/cases/interop-diffraction/images/stop.png +0 -0
  51. os_optics_kit/_data/cases/interop-diffraction/opensci_handoff.py +201 -0
  52. os_optics_kit/_data/cases/interop-diffraction/project.json +215 -0
  53. os_optics_kit/_data/cases/interop-diffraction/requirements-diffractio.txt +9 -0
  54. os_optics_kit/_data/cases/interop-diffraction/requirements-diffraction.txt +13 -0
  55. os_optics_kit/_data/cases/interop-diffraction/tem00_field.py +62 -0
  56. os_optics_kit/_data/cases/interop-metasurface/CASE.md +57 -0
  57. os_optics_kit/_data/cases/interop-metasurface/README.md +38 -0
  58. os_optics_kit/_data/cases/interop-metasurface/README.zh-CN.md +37 -0
  59. os_optics_kit/_data/cases/interop-metasurface/expected.json +10 -0
  60. os_optics_kit/_data/cases/interop-metasurface/images/section.png +0 -0
  61. os_optics_kit/_data/cases/interop-metasurface/project.json +228 -0
  62. os_optics_kit/_data/cases/interop-metasurface/requirements-metasurface.txt +8 -0
  63. os_optics_kit/_data/cases/interop-metasurface/step1_unit_cells.py +113 -0
  64. os_optics_kit/_data/cases/interop-metasurface/step2_focusing.py +155 -0
  65. os_optics_kit/_data/cases/interop-metasurface/step3_fit_model.py +377 -0
  66. os_optics_kit/_data/cases/interop-metasurface/step4_engine_check.py +319 -0
  67. os_optics_kit/_data/cases/interop-optimization/CASE.md +52 -0
  68. os_optics_kit/_data/cases/interop-optimization/README.md +33 -0
  69. os_optics_kit/_data/cases/interop-optimization/README.zh-CN.md +31 -0
  70. os_optics_kit/_data/cases/interop-optimization/expected.json +10 -0
  71. os_optics_kit/_data/cases/interop-optimization/images/section.png +0 -0
  72. os_optics_kit/_data/cases/interop-optimization/optimize_expander.py +327 -0
  73. os_optics_kit/_data/cases/interop-optimization/project.json +168 -0
  74. os_optics_kit/_data/cases/interop-optimization/requirements-optimization.txt +8 -0
  75. os_optics_kit/_data/cases/interop-quantum/CASE.md +52 -0
  76. os_optics_kit/_data/cases/interop-quantum/README.md +35 -0
  77. os_optics_kit/_data/cases/interop-quantum/README.zh-CN.md +34 -0
  78. os_optics_kit/_data/cases/interop-quantum/build_layouts.py +188 -0
  79. os_optics_kit/_data/cases/interop-quantum/expected.json +11 -0
  80. os_optics_kit/_data/cases/interop-quantum/images/top.png +0 -0
  81. os_optics_kit/_data/cases/interop-quantum/network_io.py +278 -0
  82. os_optics_kit/_data/cases/interop-quantum/project.json +253 -0
  83. os_optics_kit/_data/cases/interop-quantum/quantum_inputs.json +64 -0
  84. os_optics_kit/_data/cases/interop-quantum/reference.py +110 -0
  85. os_optics_kit/_data/cases/interop-quantum/requirements-quantum.txt +12 -0
  86. os_optics_kit/_data/cases/interop-quantum/run_quantum.py +278 -0
  87. os_optics_kit/_data/cases/mirror-alignment/CASE.md +54 -0
  88. os_optics_kit/_data/cases/mirror-alignment/README.md +32 -0
  89. os_optics_kit/_data/cases/mirror-alignment/README.zh-CN.md +31 -0
  90. os_optics_kit/_data/cases/mirror-alignment/expected.json +15 -0
  91. os_optics_kit/_data/cases/mirror-alignment/images/iso.png +0 -0
  92. os_optics_kit/_data/cases/mirror-alignment/images/top.png +0 -0
  93. os_optics_kit/_data/cases/mirror-alignment/project.json +252 -0
  94. os_optics_kit/_data/cases/mirror-alignment/studies/sensitivity_alignment.json +126 -0
  95. os_optics_kit/_data/cases/mirror-alignment/studies/tolerance_alignment.json +138 -0
  96. os_optics_kit/_data/cases/mirror-alignment/workflow.py +272 -0
  97. os_optics_kit/_data/cases/polarization-control/CASE.md +54 -0
  98. os_optics_kit/_data/cases/polarization-control/README.md +34 -0
  99. os_optics_kit/_data/cases/polarization-control/README.zh-CN.md +32 -0
  100. os_optics_kit/_data/cases/polarization-control/expected.json +11 -0
  101. os_optics_kit/_data/cases/polarization-control/images/iso.png +0 -0
  102. os_optics_kit/_data/cases/polarization-control/project.json +265 -0
  103. os_optics_kit/_data/cases/polarization-control/studies/polarization_hwp_wavelength_sweep.json +75 -0
  104. os_optics_kit/_data/cases/polarization-control/studies/polarization_threshold.json +15 -0
  105. os_optics_kit/_data/cases/polarization-control/studies/sensitivity_polarization.json +98 -0
  106. os_optics_kit/_data/cases/polarization-control/studies/tolerance_polarization.json +102 -0
  107. os_optics_kit/_data/cases/polarization-control/workflow.py +107 -0
  108. os_optics_kit/_data/cases.json +348 -0
  109. os_optics_kit/_data/skills/candidates/SKILL.md +52 -0
  110. os_optics_kit/_data/skills/compare/SKILL.md +58 -0
  111. os_optics_kit/_data/skills/contrib-case/SKILL.md +66 -0
  112. os_optics_kit/_data/skills/contrib-tool/SKILL.md +65 -0
  113. os_optics_kit/_data/skills/edit/SKILL.md +66 -0
  114. os_optics_kit/_data/skills/measurements/SKILL.md +65 -0
  115. os_optics_kit/_data/skills/plot/SKILL.md +56 -0
  116. os_optics_kit/_data/skills/report/SKILL.md +53 -0
  117. os_optics_kit/_data/skills/run-case/SKILL.md +60 -0
  118. os_optics_kit/_data/skills/sensitivity/SKILL.md +66 -0
  119. os_optics_kit/_data/skills/summary/SKILL.md +55 -0
  120. os_optics_kit/_data/skills/sweep/SKILL.md +66 -0
  121. os_optics_kit/_data/skills/tolerance/SKILL.md +68 -0
  122. os_optics_kit/_data/skills.json +156 -0
  123. os_optics_kit/_data/templates/CASE.md +50 -0
  124. os_optics_kit/_data/templates/README.case.md +27 -0
  125. os_optics_kit/_data/templates/SKILL.md +56 -0
  126. os_optics_kit/_engine.py +148 -0
  127. os_optics_kit/_frontmatter.py +110 -0
  128. os_optics_kit/_resources.py +37 -0
  129. os_optics_kit/_version.py +3 -0
  130. os_optics_kit/analyze_measurements.py +362 -0
  131. os_optics_kit/build_report.py +354 -0
  132. os_optics_kit/cases.py +640 -0
  133. os_optics_kit/catalog_candidates.py +207 -0
  134. os_optics_kit/cli.py +74 -0
  135. os_optics_kit/compare_runs.py +361 -0
  136. os_optics_kit/contrib/__init__.py +44 -0
  137. os_optics_kit/contrib/_common.py +433 -0
  138. os_optics_kit/contrib/_templates.py +114 -0
  139. os_optics_kit/contrib/case.py +648 -0
  140. os_optics_kit/contrib/tool.py +444 -0
  141. os_optics_kit/design_workflow.py +607 -0
  142. os_optics_kit/edit_project.py +481 -0
  143. os_optics_kit/interop.py +162 -0
  144. os_optics_kit/optical_designs.py +861 -0
  145. os_optics_kit/plot_results.py +362 -0
  146. os_optics_kit/result_summary.py +172 -0
  147. os_optics_kit/sensitivity_analysis.py +913 -0
  148. os_optics_kit/skills.py +382 -0
  149. os_optics_kit/sweep_parameters.py +556 -0
  150. os_optics_kit/tolerance_study.py +594 -0
  151. os_optics_kit/workflow_common.py +557 -0
  152. os_optics_kit-0.1.0.dist-info/METADATA +140 -0
  153. os_optics_kit-0.1.0.dist-info/RECORD +156 -0
  154. os_optics_kit-0.1.0.dist-info/WHEEL +4 -0
  155. os_optics_kit-0.1.0.dist-info/entry_points.txt +2 -0
  156. os_optics_kit-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,9 @@
1
+ """os-optics-kit: tools, cases and agent skills for OS Optics.
2
+
3
+ The tools are modules of this package and subcommands of ``os-optics-kit``; the cases and skills ship as package
4
+ data. The engine (``os_optics``, PyPI ``os-optics``) is imported only by the functions that need it.
5
+ """
6
+
7
+ from ._version import __version__
8
+
9
+ __all__ = ["__version__"]
@@ -0,0 +1,3 @@
1
+ from .cli import main
2
+
3
+ raise SystemExit(main())
@@ -0,0 +1,16 @@
1
+ {
2
+ "schema": "os-optics-kit.baseline",
3
+ "schema_version": 1,
4
+ "kit_version": "0.1.0",
5
+ "engine": {
6
+ "distribution": "os-optics",
7
+ "requirement": ">=0.12,<0.13",
8
+ "verified_version": "0.12.0"
9
+ },
10
+ "catalog": {
11
+ "version": "2026-10-28.1",
12
+ "schema_version": "3.2",
13
+ "sha256": "7d7f5f0a6fa1db7ce32503a6a1d86c5bdcd167035782b47b73c2ac00fc1acf30"
14
+ },
15
+ "python": ["3.11", "3.14"]
16
+ }
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: beam-expander
3
+ title: Catalog beam expander: swap a lens, sweep its spacing, restore collimation
4
+ summary: A Keplerian beam expander of two catalog plano-convex lenses (f = 50 mm and 100 mm, 780 nm, 1 mm waist) reaches its 1.9961 mm output waist. The studies swap L2 for a 100.3 mm fused-silica lens, sweep L2 along the beam and apply the best shift.
5
+ engine: 0.12.0
6
+ catalog: 2026-10-28.1
7
+ project: project.json
8
+ tools: candidates, edit, sweep, compare, plot, report
9
+ tags: catalog, beam-expander, lens-swap, parameter-sweep, edit-by-id
10
+ license: MIT
11
+ ---
12
+
13
+ ## What it shows
14
+
15
+ `project.json` is the engine's reference design `os-optics project example --kind beam_expander`; its components
16
+ pin catalog release 2026-10-28.1. The target `expanded_waist` (waist radius of the output beam, a collimation
17
+ measure) asks for 1.9961 mm ± 1 %. The study files edit the design by ID: swapping L2 for the 100.3 mm lens breaks
18
+ collimation (`expanded_waist` 1.4407 mm, UNMET, while the radius at the plane, `output_beam_radius`, stays MET);
19
+ a twelve-sample sweep of the L2 position finds +0.54 mm (1.99645 mm, 5 of 12 samples PASS); applying it passes.
20
+
21
+ ## Run
22
+
23
+ ```bash
24
+ os-optics project run project.json --out-dir run
25
+ os-optics results targets run
26
+ os-optics-kit candidates --category LENS --form PLANO_CONVEX_LENS --wavelength-nm 780 \
27
+ --range focal_length_mm=95..105 --range outer_diameter_mm=12.7..12.7 --near focal_length_mm=100 --limit 8
28
+ os-optics-kit edit project.json --edits studies/beam_expander_swap_l2.json --out swapped.json --run swapped-run
29
+ os-optics-kit sweep studies/beam_expander_l2_sweep.json --base swapped.json --out l2-sweep
30
+ os-optics-kit plot sweep l2-sweep --y target:expanded_waist
31
+ os-optics-kit edit swapped.json --edits studies/beam_expander_move_l2.json --out final.json --run final-run
32
+ os-optics-kit compare run swapped-run final-run --project final.json --out compare
33
+ os-optics-kit report l2-sweep --project final.json --plots l2-sweep/plots --changes swapped.changes.json
34
+ ```
35
+
36
+ ## Targets
37
+
38
+ | Target | Metric | Plane | Bound | Verified |
39
+ | --- | --- | --- | --- | --- |
40
+ | `expanded_waist` | `waist_radius_x_mm` | `output` | 1.99612 mm ± 1 % | 1.99607 mm, MET |
41
+
42
+ ## Baseline
43
+
44
+ os-optics 0.12.0, catalog 2026-10-28.1: run status PASS (`expected.json`).
45
+ `os-optics-kit cases verify beam-expander` repeats the run and compares it.
46
+
47
+ ## Files
48
+
49
+ - `project.json`, `expected.json`: the design and its verified outcome.
50
+ - `studies/beam_expander_swap_l2.json`, `studies/beam_expander_l2_sweep.json`, `studies/beam_expander_move_l2.json`:
51
+ the lens swap, the L2 sweep and the final move.
52
+ - `README.md`, `README.zh-CN.md`, `images/`: the illustrated page.
@@ -0,0 +1,38 @@
1
+ # Catalog beam expander
2
+
3
+ Two catalog plano-convex lenses (f = 50 mm and 100 mm, N-BK7, 12.7 mm diameter) expand a 780 nm Gaussian beam with a
4
+ 1 mm waist radius twice. The target `expanded_waist` asks for an output waist radius of 1.9961 mm ± 1 %, a measure
5
+ of collimation. The components pin catalog release 2026-10-28.1.
6
+
7
+ ![Section along the lens axis: L1 focuses, L2 collimates, the plane output receives the expanded beam](images/section.png)
8
+
9
+ ![Isometric view of the expander](images/iso.png)
10
+
11
+ ## Run it
12
+
13
+ ```bash
14
+ os-optics-kit cases copy beam-expander --dest .
15
+ cd beam-expander
16
+ os-optics project run project.json --out-dir run
17
+ os-optics results targets run
18
+ ```
19
+
20
+ ## Results
21
+
22
+ | Target | Value | Bound | Assessment |
23
+ | --- | --- | --- | --- |
24
+ | `expanded_waist` | 1.99607 mm | 1.99612 mm ± 1 % | MET |
25
+
26
+ ## Swap a lens and restore collimation
27
+
28
+ The study files in `studies/` change the design by ID with `os-optics-kit edit` and `os-optics-kit sweep`:
29
+
30
+ | Step | Design | `expanded_waist` | Outcome |
31
+ | --- | --- | --- | --- |
32
+ | Swap L2 for a fused-silica lens, f = 100.3 mm | `swapped.json` | 1.4407 mm | FAIL |
33
+ | Sweep L2 along the beam, −1 … +2 mm, 12 samples | `l2-sweep/` | 0.7323 … 2.0098 mm | 5 PASS, 7 FAIL |
34
+ | Move L2 by the best shift, +0.54 mm | `final.json` | 1.99645 mm | PASS |
35
+
36
+ The beam radius at the output plane (`output_beam_radius`, added by the swap) stays within 1 % throughout: the
37
+ waist radius reacts to collimation, the radius at one plane barely does. Verified with os-optics 0.12.0 and catalog
38
+ 2026-10-28.1; run status PASS.
@@ -0,0 +1,36 @@
1
+ # 目录扩束器
2
+
3
+ 两片目录中的平凸透镜(f = 50 mm 与 100 mm,N-BK7,直径 12.7 mm)把波长 780 nm、束腰半径 1 mm 的高斯光束扩束两倍。
4
+ 目标 `expanded_waist` 要求输出束腰半径为 1.9961 mm ± 1 %,用于衡量准直程度。元件固定在目录版本 2026-10-28.1。
5
+
6
+ ![沿透镜光轴的截面:L1 聚焦,L2 准直,output 面接收扩束后的光束](images/section.png)
7
+
8
+ ![扩束器的等轴测视图](images/iso.png)
9
+
10
+ ## 运行
11
+
12
+ ```bash
13
+ os-optics-kit cases copy beam-expander --dest .
14
+ cd beam-expander
15
+ os-optics project run project.json --out-dir run
16
+ os-optics results targets run
17
+ ```
18
+
19
+ ## 结果
20
+
21
+ | 目标 | 数值 | 界限 | 评估 |
22
+ | --- | --- | --- | --- |
23
+ | `expanded_waist` | 1.99607 mm | 1.99612 mm ± 1 % | MET |
24
+
25
+ ## 更换透镜并恢复准直
26
+
27
+ `studies/` 中的研究文件通过 `os-optics-kit edit` 与 `os-optics-kit sweep` 按 ID 修改设计:
28
+
29
+ | 步骤 | 设计 | `expanded_waist` | 结果 |
30
+ | --- | --- | --- | --- |
31
+ | 把 L2 换成熔融石英透镜,f = 100.3 mm | `swapped.json` | 1.4407 mm | FAIL |
32
+ | 沿光束扫描 L2,−1 … +2 mm,12 个样本 | `l2-sweep/` | 0.7323 … 2.0098 mm | 5 个 PASS,7 个 FAIL |
33
+ | 按最佳位移 +0.54 mm 移动 L2 | `final.json` | 1.99645 mm | PASS |
34
+
35
+ 输出面上的光束半径(换镜时新增的 `output_beam_radius`)始终在 1 % 以内:束腰半径对准直敏感,单个面上的半径几乎不变。
36
+ 已用 os-optics 0.12.0 与目录 2026-10-28.1 验证;运行状态 PASS。
@@ -0,0 +1,10 @@
1
+ {
2
+ "catalog": "2026-10-28.1",
3
+ "engine": "0.12.0",
4
+ "schema": "os-optics-kit.case-expected",
5
+ "schema_version": 1,
6
+ "status": "PASS",
7
+ "targets": {
8
+ "expanded_waist": "MET"
9
+ }
10
+ }
@@ -0,0 +1,160 @@
1
+ {
2
+ "components": [
3
+ {
4
+ "custom_part": {
5
+ "custom_part_key": "user-laser",
6
+ "description": "User-supplied laser source."
7
+ },
8
+ "instance_id": "SRC",
9
+ "nominal_pose": {
10
+ "position_mm": [
11
+ -200.0,
12
+ 0.0,
13
+ 0.0
14
+ ],
15
+ "quaternion_wxyz": [
16
+ 0.5,
17
+ 0.5,
18
+ 0.5,
19
+ 0.5
20
+ ]
21
+ },
22
+ "optical_role": "source",
23
+ "retained_dofs": [],
24
+ "selected_parameters": [],
25
+ "source_model": {
26
+ "m2": 1.0,
27
+ "model_kind": "GAUSSIAN_BEAM",
28
+ "polarization": {
29
+ "angle_deg": 0.0,
30
+ "kind": "LINEAR"
31
+ },
32
+ "power_w": 0.001,
33
+ "waist_position_mm": 0.0,
34
+ "waist_radius_mm": 1.0,
35
+ "wavelength_nm": 780.0
36
+ }
37
+ },
38
+ {
39
+ "instance_id": "L1",
40
+ "nominal_pose": {
41
+ "position_mm": [
42
+ 0.0,
43
+ 0.0,
44
+ 0.0
45
+ ],
46
+ "quaternion_wxyz": [
47
+ 0.5,
48
+ 0.5,
49
+ 0.5,
50
+ 0.5
51
+ ]
52
+ },
53
+ "optical_role": "lens",
54
+ "product": {
55
+ "catalog_version": "2026-10-28.1",
56
+ "optical_sku": "OS-OPT-LENS-PCX-D12P7-F50-T2P6-R25P8-NBK7-AR400-1100-W587P6"
57
+ },
58
+ "retained_dofs": [
59
+ {
60
+ "axis": "Tx",
61
+ "control": "MANUAL",
62
+ "frame": "COMPONENT_LOCAL"
63
+ },
64
+ {
65
+ "axis": "Ty",
66
+ "control": "MANUAL",
67
+ "frame": "COMPONENT_LOCAL"
68
+ },
69
+ {
70
+ "axis": "Tz",
71
+ "control": "NUMERICAL",
72
+ "frame": "COMPONENT_LOCAL"
73
+ }
74
+ ],
75
+ "selected_parameters": []
76
+ },
77
+ {
78
+ "instance_id": "L2",
79
+ "nominal_pose": {
80
+ "position_mm": [
81
+ 152.841,
82
+ 0.0,
83
+ 0.0
84
+ ],
85
+ "quaternion_wxyz": [
86
+ 0.5,
87
+ 0.5,
88
+ -0.5,
89
+ -0.5
90
+ ]
91
+ },
92
+ "optical_role": "lens",
93
+ "product": {
94
+ "catalog_version": "2026-10-28.1",
95
+ "optical_sku": "OS-OPT-LENS-PCX-D12P7-F100-T2P2-R51P5-NBK7-AR400-1100-W587P6"
96
+ },
97
+ "retained_dofs": [
98
+ {
99
+ "axis": "Tx",
100
+ "control": "MANUAL",
101
+ "frame": "COMPONENT_LOCAL"
102
+ },
103
+ {
104
+ "axis": "Ty",
105
+ "control": "MANUAL",
106
+ "frame": "COMPONENT_LOCAL"
107
+ },
108
+ {
109
+ "axis": "Tz",
110
+ "control": "NUMERICAL",
111
+ "frame": "COMPONENT_LOCAL"
112
+ }
113
+ ],
114
+ "selected_parameters": []
115
+ }
116
+ ],
117
+ "materials": [],
118
+ "observations": [
119
+ {
120
+ "absorbing": false,
121
+ "aperture": {
122
+ "center_offset_mm": [
123
+ 0.0,
124
+ 0.0
125
+ ],
126
+ "obstruction_radius_mm": 0.0,
127
+ "radius_mm": 12.5,
128
+ "shape": "circle"
129
+ },
130
+ "medium": "air",
131
+ "observation_id": "output",
132
+ "pose": {
133
+ "position_mm": [
134
+ 252.841,
135
+ 0.0,
136
+ 0.0
137
+ ],
138
+ "quaternion_wxyz": [
139
+ 0.5,
140
+ 0.5,
141
+ 0.5,
142
+ 0.5
143
+ ]
144
+ }
145
+ }
146
+ ],
147
+ "project_schema_version": "2.0",
148
+ "schema": "opensci.project",
149
+ "targets": [
150
+ {
151
+ "metric": "waist_radius_x_mm",
152
+ "observation_id": "output",
153
+ "parameters": [],
154
+ "target_id": "expanded_waist",
155
+ "target_value": 1.9961240310077522,
156
+ "tolerance_rel": 0.01,
157
+ "unit": "mm"
158
+ }
159
+ ]
160
+ }
@@ -0,0 +1,61 @@
1
+ {
2
+ "description": "Sweep of the L2 position along the beam (design +X) of the edited beam expander (--base: the Project written with beam_expander_swap_l2.json). Each sample moves L2 by the value with a rigid transform in the design frame. Both output targets are recorded: expanded_waist (waist_radius_x_mm) changes strongly with spacing because the nearly collimated output has a Rayleigh range of metres and its waist moves by metres per millimetre of defocus; output_beam_radius (beam_radius_mm at the plane 100 mm after L2) changes by less than 0.1 % over the same range. Feasible: expanded_waist PASS; best: smallest |expanded_waist - 1.9961240310077522 mm|.",
3
+ "parameters": [
4
+ {
5
+ "name": "l2_shift",
6
+ "unit": "mm",
7
+ "values": [
8
+ -1,
9
+ -0.5,
10
+ 0,
11
+ 0.25,
12
+ 0.4,
13
+ 0.5,
14
+ 0.54,
15
+ 0.55,
16
+ 0.6,
17
+ 0.7,
18
+ 1,
19
+ 2
20
+ ],
21
+ "ops": [
22
+ {
23
+ "op": "transform",
24
+ "selector": {
25
+ "ids": [
26
+ "L2"
27
+ ]
28
+ },
29
+ "translation_mm": [
30
+ "$value",
31
+ 0,
32
+ 0
33
+ ],
34
+ "frame": "design"
35
+ }
36
+ ]
37
+ }
38
+ ],
39
+ "max_evaluations": 20,
40
+ "constraints": [
41
+ {
42
+ "target": "expanded_waist",
43
+ "assessment": [
44
+ "MET"
45
+ ]
46
+ }
47
+ ],
48
+ "derived": [
49
+ {
50
+ "name": "waist_error_mm",
51
+ "op": "abs_diff",
52
+ "a": "target:expanded_waist",
53
+ "b": 1.9961240310077522,
54
+ "unit": "mm"
55
+ }
56
+ ],
57
+ "objective": {
58
+ "column": "derived:waist_error_mm",
59
+ "sense": "minimize"
60
+ }
61
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "description": "Apply the best sweep sample to the edited beam expander: move L2 by 540 um along design +X (given in um, converted to mm by os-optics-kit edit).",
3
+ "ops": [
4
+ {
5
+ "op": "transform",
6
+ "selector": {
7
+ "ids": [
8
+ "L2"
9
+ ]
10
+ },
11
+ "translation_mm": [
12
+ {
13
+ "value": 540,
14
+ "unit": "um"
15
+ },
16
+ 0,
17
+ 0
18
+ ],
19
+ "frame": "design"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "description": "Edit of the catalog beam_expander example (os-optics project example --kind beam_expander). Op 0 adds target output_beam_radius: beam_radius_mm (1/e^2 radius at the output plane) with the same target value and 1 % tolerance as the example's expanded_waist target (waist_radius_x_mm: radius of the waist the output beam has or had, a collimation measure). Op 1 replaces L2 (N-BK7, focal length 100 mm) by the fused-silica plano-convex lens with focal length 100.3 mm listed by os-optics-kit candidates for 780 nm (catalog 2026-10-28.1); L2 keeps its pose, so the pair is no longer afocal.",
3
+ "ops": [
4
+ {
5
+ "op": "add_target",
6
+ "target": {
7
+ "target_id": "output_beam_radius",
8
+ "metric": "beam_radius_mm",
9
+ "observation_id": "output",
10
+ "unit": "mm",
11
+ "target_value": 1.9961240310077522,
12
+ "tolerance_rel": 0.01,
13
+ "parameters": []
14
+ }
15
+ },
16
+ {
17
+ "op": "set_component_product",
18
+ "instance_id": "L2",
19
+ "optical_sku": "OS-OPT-LENS-PCX-D12P7-F100P3-T2P2-R46-UVFS-AR400-1100-W587P6"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: detector-measurements
3
+ title: Detector linearity and reference-channel normalization
4
+ summary: A 1 mW, 532 nm beam is split 50:50 onto a signal and a reference detector, each with a 2.5 mm radius active area. Two synthetic data sets with known answers calibrate the signal detector's linearity and normalize slow source drift by the reference channel.
5
+ engine: 0.12.0
6
+ catalog: none
7
+ project: project.json
8
+ tools: measurements
9
+ tags: catalog-free, measurements, detector, calibration, beam-splitter, reference-channel
10
+ license: MIT
11
+ ---
12
+
13
+ ## What it shows
14
+
15
+ `project.json` is the measurement setup: Gaussian source `SRC` (0.5 mm waist), native plate splitter `BS`
16
+ (R = T = 0.5) at 45°, absorbing planes `signal` (transmitted) and `reference` (reflected) 100 mm away. The run confirms
17
+ that each detector receives 0.5 mW and that the beam (0.5046 mm radius) fits the active area, the conditions the
18
+ analysis assumes. `os-optics-kit measurements` subtracts dark readings, optionally divides by the reference
19
+ channel, fits a line and checks the RMSE. The CSV readings are synthetic, with deliberate bad rows:
20
+
21
+ | Data | Rows used | Fit |
22
+ | --- | --- | --- |
23
+ | `data/detector_response.csv` | 7 of 10 | 2 V/mW · P + 0.005 V, RMSE 0.002 V |
24
+ | `data/reference_drift.csv` | 8 of 13 | ratio 0.4, slope 0, RMSE 0 |
25
+
26
+ Both analyses return WARNING (rows excluded) with the RMSE target PASS.
27
+
28
+ ## Run
29
+
30
+ ```bash
31
+ os-optics project run project.json --out-dir run
32
+ os-optics results targets run
33
+ os-optics-kit measurements data/detector_response.csv --x input_power_mW --signal signal_V \
34
+ --background dark_V --x-unit mW --signal-unit V --maximum-rmse 0.003 --out detector
35
+ os-optics-kit measurements data/reference_drift.csv --x time_s --signal signal_V --background dark_V \
36
+ --x-unit s --signal-unit V --reference reference_V --reference-background reference_dark_V \
37
+ --reference-unit V --maximum-rmse 0.000000000001 --out reference
38
+ ```
39
+
40
+ ## Targets
41
+
42
+ | Target | Metric | Plane | Bound | Verified |
43
+ | --- | --- | --- | --- | --- |
44
+ | `signal_power`, `reference_power` | `power_W` | `signal`, `reference` | 0.5 mW ± 1 % | 0.5 mW, MET |
45
+ | `signal_beam_radius`, `reference_beam_radius` | `beam_radius_mm` | `signal`, `reference` | ≤ 1 mm | 0.5046 mm, MET |
46
+
47
+ ## Baseline
48
+
49
+ os-optics 0.12.0, no catalog: run status PASS (`expected.json`).
50
+ `os-optics-kit cases verify detector-measurements` repeats the run and compares it.
51
+
52
+ ## Files
53
+
54
+ - `project.json`, `expected.json`: the setup and its verified outcome.
55
+ - `data/`: the two CSV files and their construction and attribution (`data/README.md`).
56
+ - `README.md`, `README.zh-CN.md`, `images/top.png`: the illustrated page.
@@ -0,0 +1,37 @@
1
+ # Detector linearity and reference-channel normalization
2
+
3
+ A 1 mW, 532 nm laser beam is split 50:50 by a plate beam splitter. The transmitted half reaches the signal detector,
4
+ the reflected half the reference detector; both detectors have a 2.5 mm radius active area. The engine run confirms
5
+ the power on each detector and that the beam fits the active area. Two synthetic data sets then calibrate the
6
+ signal detector and remove slow source drift with the reference channel.
7
+
8
+ ![Top view: source SRC, splitter BS, signal detector along +X and reference detector along +Y](images/top.png)
9
+
10
+ ## Run it
11
+
12
+ ```bash
13
+ os-optics-kit cases copy detector-measurements --dest .
14
+ cd detector-measurements
15
+ os-optics project run project.json --out-dir run
16
+ os-optics-kit measurements data/detector_response.csv --x input_power_mW --signal signal_V \
17
+ --background dark_V --x-unit mW --signal-unit V --maximum-rmse 0.003 --out detector
18
+ ```
19
+
20
+ ## Results
21
+
22
+ | Target | Value | Bound | Assessment |
23
+ | --- | --- | --- | --- |
24
+ | `signal_power` | 0.5 mW | 0.5 mW ± 1 % | MET |
25
+ | `reference_power` | 0.5 mW | 0.5 mW ± 1 % | MET |
26
+ | `signal_beam_radius` | 0.5046 mm | ≤ 1 mm | MET |
27
+ | `reference_beam_radius` | 0.5046 mm | ≤ 1 mm | MET |
28
+
29
+ | Data | Rows used | Fitted response |
30
+ | --- | --- | --- |
31
+ | `data/detector_response.csv` (dark-subtracted signal vs incident power) | 7 of 10 | 2 V/mW · P + 0.005 V, RMSE 0.002 V |
32
+ | `data/reference_drift.csv` (signal / reference, both dark-subtracted, over 7 s) | 8 of 13 | 0.4, constant, RMSE 0 |
33
+
34
+ Both channels drift by 7 % over the scan; their ratio does not. Rows with a missing or invalid reading or a
35
+ non-positive dark-subtracted reference are excluded and listed in `processed.csv`; the analyses report WARNING for the exclusions and PASS for the
36
+ RMSE targets. `data/README.md` gives the formulas behind the data and their attribution. Verified with
37
+ os-optics 0.12.0; run status PASS.
@@ -0,0 +1,35 @@
1
+ # 探测器线性度与参考通道归一化
2
+
3
+ 1 mW、532 nm 的激光束由平板分束镜按 50:50 分开:透射光到达信号探测器,反射光到达参考探测器;两个探测器的有效区域
4
+ 半径均为 2.5 mm。引擎运行确认每个探测器上的功率,并确认光束落在有效区域之内。随后用两组合成数据标定信号探测器,
5
+ 并借助参考通道消除光源的缓慢漂移。
6
+
7
+ ![俯视图:光源 SRC、分束镜 BS、沿 +X 的信号探测器与沿 +Y 的参考探测器](images/top.png)
8
+
9
+ ## 运行
10
+
11
+ ```bash
12
+ os-optics-kit cases copy detector-measurements --dest .
13
+ cd detector-measurements
14
+ os-optics project run project.json --out-dir run
15
+ os-optics-kit measurements data/detector_response.csv --x input_power_mW --signal signal_V \
16
+ --background dark_V --x-unit mW --signal-unit V --maximum-rmse 0.003 --out detector
17
+ ```
18
+
19
+ ## 结果
20
+
21
+ | 目标 | 数值 | 界限 | 评估 |
22
+ | --- | --- | --- | --- |
23
+ | `signal_power` | 0.5 mW | 0.5 mW ± 1 % | MET |
24
+ | `reference_power` | 0.5 mW | 0.5 mW ± 1 % | MET |
25
+ | `signal_beam_radius` | 0.5046 mm | ≤ 1 mm | MET |
26
+ | `reference_beam_radius` | 0.5046 mm | ≤ 1 mm | MET |
27
+
28
+ | 数据 | 使用行数 | 拟合响应 |
29
+ | --- | --- | --- |
30
+ | `data/detector_response.csv`(扣除暗读数的信号对入射功率) | 10 行中 7 行 | 2 V/mW · P + 0.005 V,RMSE 0.002 V |
31
+ | `data/reference_drift.csv`(信号 / 参考,均扣除暗读数,7 s 内) | 13 行中 8 行 | 0.4,恒定,RMSE 0 |
32
+
33
+ 两个通道在扫描期间都漂移了 7 %,二者之比保持不变。读数缺失或无效、或扣除暗读数后参考值非正的行被排除,并列在 `processed.csv` 中;
34
+ 两项分析因排除行而报告 WARNING,RMSE 目标为 PASS。`data/README.md` 给出数据的构造公式与来源说明。
35
+ 已用 os-optics 0.12.0 验证;运行状态 PASS。
@@ -0,0 +1,60 @@
1
+ # Synthetic measurement data and attribution
2
+
3
+ The readings in these two CSV files are synthetic: constructed from the formulas
4
+ below with known answers, for the `os-optics-kit measurements` analysis of this
5
+ case ([README](../README.md)).
6
+
7
+ ## Detector response
8
+
9
+ `detector_response.csv` has `input_power_mW` (mW), `signal_V` (V), `dark_V` (V),
10
+ and the textual `data_origin` label. For the seven valid rows, indexed `i = 0..6`:
11
+
12
+ ```text
13
+ input_power_mW = i / 10
14
+ dark_V = 0.020
15
+ signal_V = dark_V + 2 * input_power_mW + 0.005 + residual_V[i]
16
+ residual_V = [0.002, -0.003, 0.001, 0, 0.001, -0.003, 0.002]
17
+ ```
18
+
19
+ The residuals sum to zero and have zero covariance with x. Thus the OLS slope is
20
+ 2 V/mW, intercept is 0.005 V, and RMSE is exactly 0.002 V in real arithmetic.
21
+ Tests accept absolute error of 1e-12 for these quantities. Three appended rows
22
+ exercise missing signal, invalid incident power, and missing dark background.
23
+
24
+ ## Reference drift
25
+
26
+ `reference_drift.csv` adds `time_s` (s), `reference_V` (V), and
27
+ `reference_dark_V` (V). For eight valid rows, `time_s = i = 0..7`:
28
+
29
+ ```text
30
+ reference_dark_V = 0.010
31
+ dark_V = 0.020
32
+ reference_V = reference_dark_V + 1 + 0.01 * i
33
+ signal_V = dark_V + 0.4 * (1 + 0.01 * i)
34
+ ```
35
+
36
+ The dark-subtracted channels grow by 7%; their quotient stays 0.4. The ratio's
37
+ fitted slope is zero, intercept is 0.4, and RMSE is zero in real arithmetic.
38
+ Tests use absolute tolerance 1e-12. R² is undefined for this constant response.
39
+ Five appended rows exercise zero corrected reference, missing reference,
40
+ invalid signal, negative corrected reference, and missing reference background.
41
+
42
+ ## Sources and changes
43
+
44
+ The workflow ideas adapt **JunLin615 and contributors**, *Free-space Optical
45
+ Experiment Benchmark*, at commit
46
+ `e72ad3a9b6be12c7f0dbb00121fda23289c4e908`:
47
+
48
+ - [EX-DETECT-01: Detector linearity calibration](https://github.com/JunLin615/free-space-optical-experiment-benchmark/blob/e72ad3a9b6be12c7f0dbb00121fda23289c4e908/benchmark/case_library/EX-DETECT-01.md), blob `81fc82e61aec5e3929b51f45eea4eb8c6b869817`.
49
+ - [EX-DRIFT-01: Reference channel for slow drift](https://github.com/JunLin615/free-space-optical-experiment-benchmark/blob/e72ad3a9b6be12c7f0dbb00121fda23289c4e908/benchmark/case_library/EX-DRIFT-01.md), blob `55374f93e53046837423e909b2e55696bbe12854`.
50
+
51
+ Benchmark case content is licensed under [Creative Commons Attribution 4.0
52
+ International](https://creativecommons.org/licenses/by/4.0/), as recorded in its
53
+ [LICENSE-CONTENT](https://github.com/JunLin615/free-space-optical-experiment-benchmark/blob/e72ad3a9b6be12c7f0dbb00121fda23289c4e908/LICENSE-CONTENT).
54
+ These adaptations replace the detector case's illustrative 12% filter test with
55
+ a calibrated-power scan, add explicit offsets, deterministic residuals and
56
+ invalid records, and turn the reference case's 7% shared-drift idea into concrete
57
+ CSV values. The Python implementation, equations for these fixtures, and actual
58
+ data values were created for this repository. No benchmark dataset, gold answer,
59
+ or scorer is copied. The case README explains the adapted workflows;
60
+ generated provenance records these source links and the exact revision.
@@ -0,0 +1,11 @@
1
+ input_power_mW,signal_V,dark_V,data_origin
2
+ 0,0.027,0.020,synthetic
3
+ 0.1,0.222,0.020,synthetic
4
+ 0.2,0.426,0.020,synthetic
5
+ 0.3,0.625,0.020,synthetic
6
+ 0.4,0.826,0.020,synthetic
7
+ 0.5,1.022,0.020,synthetic
8
+ 0.6,1.227,0.020,synthetic
9
+ 0.7,,0.020,synthetic_missing_signal
10
+ invalid,1.625,0.020,synthetic_invalid_power
11
+ 0.9,1.825,,synthetic_missing_background
@@ -0,0 +1,14 @@
1
+ time_s,signal_V,dark_V,reference_V,reference_dark_V,data_origin
2
+ 0,0.420,0.020,1.010,0.010,synthetic
3
+ 1,0.424,0.020,1.020,0.010,synthetic
4
+ 2,0.428,0.020,1.030,0.010,synthetic
5
+ 3,0.432,0.020,1.040,0.010,synthetic
6
+ 4,0.436,0.020,1.050,0.010,synthetic
7
+ 5,0.440,0.020,1.060,0.010,synthetic
8
+ 6,0.444,0.020,1.070,0.010,synthetic
9
+ 7,0.448,0.020,1.080,0.010,synthetic
10
+ 8,0.452,0.020,0.010,0.010,synthetic_zero_corrected_reference
11
+ 9,0.456,0.020,,0.010,synthetic_missing_reference
12
+ 10,invalid,0.020,1.110,0.010,synthetic_invalid_signal
13
+ 11,0.464,0.020,0.005,0.010,synthetic_negative_corrected_reference
14
+ 12,0.468,0.020,1.130,,synthetic_missing_reference_background