@photivra/engine 1.5.0 → 2.1.0

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 (1085) hide show
  1. package/CHANGELOG.md +414 -6
  2. package/CITATION.cff +1 -1
  3. package/NODE_SUPPORT.md +64 -12
  4. package/README.md +301 -182
  5. package/SECURITY.md +37 -28
  6. package/THIRD_PARTY.md +148 -4
  7. package/dist/camera/equivalent-focal-length.d.ts +13 -14
  8. package/dist/camera/equivalent-focal-length.js +15 -13
  9. package/dist/camera/equivalent-focal-length.js.map +1 -1
  10. package/dist/camera/field-of-view.d.ts +30 -19
  11. package/dist/camera/field-of-view.js +67 -18
  12. package/dist/camera/field-of-view.js.map +1 -1
  13. package/dist/camera/lens-projection.d.ts +170 -0
  14. package/dist/camera/lens-projection.js +444 -0
  15. package/dist/camera/lens-projection.js.map +1 -0
  16. package/dist/camera/projected-object-size.d.ts +10 -11
  17. package/dist/camera/projected-object-size.js +12 -10
  18. package/dist/camera/projected-object-size.js.map +1 -1
  19. package/dist/capture/capture-export-metadata.d.ts +9 -10
  20. package/dist/capture/capture-export-metadata.js +8 -5
  21. package/dist/capture/capture-export-metadata.js.map +1 -1
  22. package/dist/capture/dng-import.d.ts +91 -0
  23. package/dist/capture/dng-import.js +343 -0
  24. package/dist/capture/dng-import.js.map +1 -0
  25. package/dist/capture/environment-raw-producer.d.ts +37 -17
  26. package/dist/capture/environment-raw-producer.js +43 -19
  27. package/dist/capture/environment-raw-producer.js.map +1 -1
  28. package/dist/capture/export-jpeg.d.ts +35 -4
  29. package/dist/capture/export-jpeg.js +133 -47
  30. package/dist/capture/export-jpeg.js.map +1 -1
  31. package/dist/capture/export-tiff.d.ts +48 -24
  32. package/dist/capture/export-tiff.js +91 -31
  33. package/dist/capture/export-tiff.js.map +1 -1
  34. package/dist/capture/focus-control.d.ts +42 -65
  35. package/dist/capture/focus-control.js +56 -75
  36. package/dist/capture/focus-control.js.map +1 -1
  37. package/dist/capture/host-yield-cadence.d.ts +25 -0
  38. package/dist/capture/host-yield-cadence.js +25 -0
  39. package/dist/capture/host-yield-cadence.js.map +1 -0
  40. package/dist/capture/linear-encoding.d.ts +14 -12
  41. package/dist/capture/linear-encoding.js +14 -13
  42. package/dist/capture/linear-encoding.js.map +1 -1
  43. package/dist/capture/lossless-jpeg.d.ts +27 -0
  44. package/dist/capture/lossless-jpeg.js +237 -0
  45. package/dist/capture/lossless-jpeg.js.map +1 -0
  46. package/dist/capture/native-environment-lean.d.ts +227 -0
  47. package/dist/capture/native-environment-lean.js +974 -0
  48. package/dist/capture/native-environment-lean.js.map +1 -0
  49. package/dist/capture/native-environment-optical-stage.d.ts +97 -0
  50. package/dist/capture/native-environment-optical-stage.js +340 -0
  51. package/dist/capture/native-environment-optical-stage.js.map +1 -0
  52. package/dist/capture/native-environment-raw.d.ts +140 -6
  53. package/dist/capture/native-environment-raw.js +435 -34
  54. package/dist/capture/native-environment-raw.js.map +1 -1
  55. package/dist/capture/native-raw-development.d.ts +116 -9
  56. package/dist/capture/native-raw-development.js +221 -62
  57. package/dist/capture/native-raw-development.js.map +1 -1
  58. package/dist/capture/native-raw-dng.d.ts +60 -0
  59. package/dist/capture/native-raw-dng.js +167 -0
  60. package/dist/capture/native-raw-dng.js.map +1 -0
  61. package/dist/capture/native-raw.d.ts +65 -12
  62. package/dist/capture/native-raw.js +81 -19
  63. package/dist/capture/native-raw.js.map +1 -1
  64. package/dist/capture/packed-sensor-raw.d.ts +160 -0
  65. package/dist/capture/packed-sensor-raw.js +221 -0
  66. package/dist/capture/packed-sensor-raw.js.map +1 -0
  67. package/dist/capture/photographic-export.d.ts +58 -35
  68. package/dist/capture/photographic-export.js +177 -70
  69. package/dist/capture/photographic-export.js.map +1 -1
  70. package/dist/capture/raw-development-kernel.d.ts +52 -0
  71. package/dist/capture/raw-development-kernel.js +88 -0
  72. package/dist/capture/raw-development-kernel.js.map +1 -0
  73. package/dist/capture/raw-frame-limits.d.ts +7 -7
  74. package/dist/capture/raw-frame-limits.js +7 -6
  75. package/dist/capture/raw-frame-limits.js.map +1 -1
  76. package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
  77. package/dist/capture/raw-frame-reconstruction.js +9 -8
  78. package/dist/capture/raw-frame-reconstruction.js.map +1 -1
  79. package/dist/capture/raw-white-level.d.ts +55 -0
  80. package/dist/capture/raw-white-level.js +165 -0
  81. package/dist/capture/raw-white-level.js.map +1 -0
  82. package/dist/capture/release-sequence.d.ts +5 -7
  83. package/dist/capture/release-sequence.js +15 -13
  84. package/dist/capture/release-sequence.js.map +1 -1
  85. package/dist/capture/sensor-raw-frame.d.ts +5 -6
  86. package/dist/capture/sensor-raw-frame.js +26 -9
  87. package/dist/capture/sensor-raw-frame.js.map +1 -1
  88. package/dist/capture/sensor-raw-producer.d.ts +21 -13
  89. package/dist/capture/sensor-raw-producer.js +86 -25
  90. package/dist/capture/sensor-raw-producer.js.map +1 -1
  91. package/dist/capture/simulated-capture.d.ts +15 -16
  92. package/dist/capture/simulated-capture.js +22 -12
  93. package/dist/capture/simulated-capture.js.map +1 -1
  94. package/dist/color/camera-color-matrix.d.ts +69 -0
  95. package/dist/color/camera-color-matrix.js +132 -0
  96. package/dist/color/camera-color-matrix.js.map +1 -0
  97. package/dist/color/capture-color.d.ts +17 -10
  98. package/dist/color/capture-color.js +50 -17
  99. package/dist/color/capture-color.js.map +1 -1
  100. package/dist/color/chromatic-adaptation.d.ts +63 -0
  101. package/dist/color/chromatic-adaptation.js +91 -0
  102. package/dist/color/chromatic-adaptation.js.map +1 -0
  103. package/dist/color/color-difference.d.ts +104 -0
  104. package/dist/color/color-difference.js +205 -0
  105. package/dist/color/color-difference.js.map +1 -0
  106. package/dist/color/color-matching-functions.d.ts +168 -0
  107. package/dist/color/color-matching-functions.js +309 -0
  108. package/dist/color/color-matching-functions.js.map +1 -0
  109. package/dist/color/colorimetry-math.d.ts +52 -0
  110. package/dist/color/colorimetry-math.js +144 -0
  111. package/dist/color/colorimetry-math.js.map +1 -0
  112. package/dist/color/gamut-mapping.d.ts +54 -0
  113. package/dist/color/gamut-mapping.js +107 -0
  114. package/dist/color/gamut-mapping.js.map +1 -0
  115. package/dist/color/illuminants.d.ts +182 -0
  116. package/dist/color/illuminants.js +434 -0
  117. package/dist/color/illuminants.js.map +1 -0
  118. package/dist/color/rgb-color-spaces.d.ts +79 -0
  119. package/dist/color/rgb-color-spaces.js +115 -0
  120. package/dist/color/rgb-color-spaces.js.map +1 -0
  121. package/dist/color/sensor-color-development.d.ts +33 -11
  122. package/dist/color/sensor-color-development.js +104 -30
  123. package/dist/color/sensor-color-development.js.map +1 -1
  124. package/dist/color/srgb-icc.d.ts +9 -2
  125. package/dist/color/srgb-icc.js +16 -5
  126. package/dist/color/srgb-icc.js.map +1 -1
  127. package/dist/color/srgb-transfer.d.ts +1 -2
  128. package/dist/color/srgb-transfer.js +1 -1
  129. package/dist/color/srgb-transfer.js.map +1 -1
  130. package/dist/color/white-balance.d.ts +68 -19
  131. package/dist/color/white-balance.js +168 -35
  132. package/dist/color/white-balance.js.map +1 -1
  133. package/dist/composition/image-formation-plan.d.ts +152 -128
  134. package/dist/composition/image-formation-plan.js +292 -138
  135. package/dist/composition/image-formation-plan.js.map +1 -1
  136. package/dist/composition/plan-consumer.d.ts +6 -7
  137. package/dist/composition/plan-consumer.js +14 -11
  138. package/dist/composition/plan-consumer.js.map +1 -1
  139. package/dist/core/calculation-result.d.ts +21 -14
  140. package/dist/core/calculation-result.js +209 -11
  141. package/dist/core/calculation-result.js.map +1 -1
  142. package/dist/core/canonical-json.d.ts +13 -8
  143. package/dist/core/canonical-json.js +34 -15
  144. package/dist/core/canonical-json.js.map +1 -1
  145. package/dist/core/configuration-error.d.ts +5 -4
  146. package/dist/core/configuration-error.js +5 -3
  147. package/dist/core/configuration-error.js.map +1 -1
  148. package/dist/core/evidence-provenance.d.ts +12 -12
  149. package/dist/core/evidence-provenance.js +10 -9
  150. package/dist/core/evidence-provenance.js.map +1 -1
  151. package/dist/core/image-formation.d.ts +11 -10
  152. package/dist/core/image-formation.js +11 -9
  153. package/dist/core/image-formation.js.map +1 -1
  154. package/dist/core/owned-data.d.ts +9 -17
  155. package/dist/core/owned-data.js +9 -16
  156. package/dist/core/owned-data.js.map +1 -1
  157. package/dist/core/portable-math.d.ts +15 -0
  158. package/dist/core/portable-math.js +56 -0
  159. package/dist/core/portable-math.js.map +1 -0
  160. package/dist/core/record-validation.d.ts +48 -9
  161. package/dist/core/record-validation.js +93 -19
  162. package/dist/core/record-validation.js.map +1 -1
  163. package/dist/core/scientific-assurance.d.ts +16 -14
  164. package/dist/core/scientific-assurance.js +22 -18
  165. package/dist/core/scientific-assurance.js.map +1 -1
  166. package/dist/core/spectral-composition.d.ts +13 -14
  167. package/dist/core/spectral-composition.js +30 -27
  168. package/dist/core/spectral-composition.js.map +1 -1
  169. package/dist/core/spectral.d.ts +5 -6
  170. package/dist/core/spectral.js +9 -7
  171. package/dist/core/spectral.js.map +1 -1
  172. package/dist/core/validation.d.ts +3 -6
  173. package/dist/core/validation.js +3 -5
  174. package/dist/core/validation.js.map +1 -1
  175. package/dist/core/version.d.ts +6 -6
  176. package/dist/core/version.js +6 -5
  177. package/dist/core/version.js.map +1 -1
  178. package/dist/equipment/exposure-capabilities.d.ts +10 -10
  179. package/dist/equipment/exposure-capabilities.js +40 -30
  180. package/dist/equipment/exposure-capabilities.js.map +1 -1
  181. package/dist/equipment/generic-tier-assets.d.ts +13 -6
  182. package/dist/equipment/generic-tier-assets.js +34 -15
  183. package/dist/equipment/generic-tier-assets.js.map +1 -1
  184. package/dist/equipment/generic-tier-presets.d.ts +5 -6
  185. package/dist/equipment/generic-tier-presets.js +15 -13
  186. package/dist/equipment/generic-tier-presets.js.map +1 -1
  187. package/dist/equipment/iso-capabilities.d.ts +21 -22
  188. package/dist/equipment/iso-capabilities.js +49 -44
  189. package/dist/equipment/iso-capabilities.js.map +1 -1
  190. package/dist/equipment/metering-capabilities.d.ts +5 -6
  191. package/dist/equipment/metering-capabilities.js +22 -19
  192. package/dist/equipment/metering-capabilities.js.map +1 -1
  193. package/dist/equipment/release-capabilities.d.ts +3 -4
  194. package/dist/equipment/release-capabilities.js +18 -14
  195. package/dist/equipment/release-capabilities.js.map +1 -1
  196. package/dist/exposure/exposure-duration-control.d.ts +19 -17
  197. package/dist/exposure/exposure-duration-control.js +27 -23
  198. package/dist/exposure/exposure-duration-control.js.map +1 -1
  199. package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
  200. package/dist/exposure/exposure-mode-resolver.js +127 -82
  201. package/dist/exposure/exposure-mode-resolver.js.map +1 -1
  202. package/dist/exposure/exposure.d.ts +17 -16
  203. package/dist/exposure/exposure.js +22 -15
  204. package/dist/exposure/exposure.js.map +1 -1
  205. package/dist/exposure/flash-ttl.d.ts +135 -0
  206. package/dist/exposure/flash-ttl.js +193 -0
  207. package/dist/exposure/flash-ttl.js.map +1 -0
  208. package/dist/exposure/flash.d.ts +144 -36
  209. package/dist/exposure/flash.js +259 -59
  210. package/dist/exposure/flash.js.map +1 -1
  211. package/dist/exposure/metering-scene-radiance.d.ts +10 -10
  212. package/dist/exposure/metering-scene-radiance.js +42 -23
  213. package/dist/exposure/metering-scene-radiance.js.map +1 -1
  214. package/dist/exposure/metering-target.d.ts +8 -8
  215. package/dist/exposure/metering-target.js +30 -20
  216. package/dist/exposure/metering-target.js.map +1 -1
  217. package/dist/exposure/metering-temporal.d.ts +16 -15
  218. package/dist/exposure/metering-temporal.js +41 -19
  219. package/dist/exposure/metering-temporal.js.map +1 -1
  220. package/dist/exposure/metering.d.ts +64 -17
  221. package/dist/exposure/metering.js +159 -30
  222. package/dist/exposure/metering.js.map +1 -1
  223. package/dist/exposure/program-line.d.ts +5 -5
  224. package/dist/exposure/program-line.js +20 -13
  225. package/dist/exposure/program-line.js.map +1 -1
  226. package/dist/facade/camera-preset.d.ts +8 -0
  227. package/dist/facade/camera-preset.js +102 -0
  228. package/dist/facade/camera-preset.js.map +1 -0
  229. package/dist/facade/chart-radiance-batch.d.ts +57 -0
  230. package/dist/facade/chart-radiance-batch.js +121 -0
  231. package/dist/facade/chart-radiance-batch.js.map +1 -0
  232. package/dist/facade/chart-scenes.d.ts +177 -0
  233. package/dist/facade/chart-scenes.js +232 -0
  234. package/dist/facade/chart-scenes.js.map +1 -0
  235. package/dist/facade/diffraction-provider.d.ts +30 -0
  236. package/dist/facade/diffraction-provider.js +127 -0
  237. package/dist/facade/diffraction-provider.js.map +1 -0
  238. package/dist/facade/host-yield.d.ts +7 -0
  239. package/dist/facade/host-yield.js +19 -0
  240. package/dist/facade/host-yield.js.map +1 -0
  241. package/dist/facade/scene-radiance.d.ts +117 -0
  242. package/dist/facade/scene-radiance.js +205 -0
  243. package/dist/facade/scene-radiance.js.map +1 -0
  244. package/dist/facade/simulate-capture.d.ts +363 -0
  245. package/dist/facade/simulate-capture.js +1281 -0
  246. package/dist/facade/simulate-capture.js.map +1 -0
  247. package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
  248. package/dist/gpu/chart-radiance-gpu.js +176 -0
  249. package/dist/gpu/chart-radiance-gpu.js.map +1 -0
  250. package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
  251. package/dist/gpu/image-kernel-accelerator.js +720 -0
  252. package/dist/gpu/image-kernel-accelerator.js.map +1 -0
  253. package/dist/gpu/image-kernel-execution.d.ts +92 -0
  254. package/dist/gpu/image-kernel-execution.js +84 -0
  255. package/dist/gpu/image-kernel-execution.js.map +1 -0
  256. package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
  257. package/dist/gpu/sensor-stage-gpu.js +317 -0
  258. package/dist/gpu/sensor-stage-gpu.js.map +1 -0
  259. package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
  260. package/dist/gpu/temporal-sum-gpu.js +150 -0
  261. package/dist/gpu/temporal-sum-gpu.js.map +1 -0
  262. package/dist/gpu/webgpu-runtime.d.ts +63 -0
  263. package/dist/gpu/webgpu-runtime.js +215 -0
  264. package/dist/gpu/webgpu-runtime.js.map +1 -0
  265. package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
  266. package/dist/gpu/wgsl-chart-kernel.js +165 -0
  267. package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
  268. package/dist/gpu/wgsl-kernels.d.ts +53 -0
  269. package/dist/gpu/wgsl-kernels.js +365 -0
  270. package/dist/gpu/wgsl-kernels.js.map +1 -0
  271. package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
  272. package/dist/gpu/wgsl-sensor-kernel.js +409 -0
  273. package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
  274. package/dist/index.d.ts +91 -25
  275. package/dist/index.js +60 -15
  276. package/dist/index.js.map +1 -1
  277. package/dist/motion/camera-rotation.d.ts +92 -40
  278. package/dist/motion/camera-rotation.js +84 -47
  279. package/dist/motion/camera-rotation.js.map +1 -1
  280. package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
  281. package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
  282. package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
  283. package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
  284. package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
  285. package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
  286. package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
  287. package/dist/motion/capture-rotation-trajectory.js +36 -26
  288. package/dist/motion/capture-rotation-trajectory.js.map +1 -1
  289. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
  290. package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
  291. package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
  292. package/dist/motion/extended-object-projection.d.ts +19 -16
  293. package/dist/motion/extended-object-projection.js +38 -18
  294. package/dist/motion/extended-object-projection.js.map +1 -1
  295. package/dist/motion/projected-motion.d.ts +18 -17
  296. package/dist/motion/projected-motion.js +25 -17
  297. package/dist/motion/projected-motion.js.map +1 -1
  298. package/dist/motion/temporal-exposure-sum.d.ts +55 -0
  299. package/dist/motion/temporal-exposure-sum.js +141 -0
  300. package/dist/motion/temporal-exposure-sum.js.map +1 -0
  301. package/dist/motion/video-sequence.d.ts +111 -0
  302. package/dist/motion/video-sequence.js +179 -0
  303. package/dist/motion/video-sequence.js.map +1 -0
  304. package/dist/optics/aperture.d.ts +14 -15
  305. package/dist/optics/aperture.js +13 -11
  306. package/dist/optics/aperture.js.map +1 -1
  307. package/dist/optics/atmospheric-haze.d.ts +83 -0
  308. package/dist/optics/atmospheric-haze.js +113 -0
  309. package/dist/optics/atmospheric-haze.js.map +1 -0
  310. package/dist/optics/brown-conrady-distortion.d.ts +116 -0
  311. package/dist/optics/brown-conrady-distortion.js +291 -0
  312. package/dist/optics/brown-conrady-distortion.js.map +1 -0
  313. package/dist/optics/circle-of-confusion.d.ts +10 -10
  314. package/dist/optics/circle-of-confusion.js +15 -11
  315. package/dist/optics/circle-of-confusion.js.map +1 -1
  316. package/dist/optics/complex-pupil-psf.d.ts +64 -33
  317. package/dist/optics/complex-pupil-psf.js +190 -98
  318. package/dist/optics/complex-pupil-psf.js.map +1 -1
  319. package/dist/optics/depth-of-field.d.ts +25 -15
  320. package/dist/optics/depth-of-field.js +67 -27
  321. package/dist/optics/depth-of-field.js.map +1 -1
  322. package/dist/optics/diffraction-psf-profile.d.ts +118 -0
  323. package/dist/optics/diffraction-psf-profile.js +252 -0
  324. package/dist/optics/diffraction-psf-profile.js.map +1 -0
  325. package/dist/optics/diffraction.d.ts +14 -13
  326. package/dist/optics/diffraction.js +14 -10
  327. package/dist/optics/diffraction.js.map +1 -1
  328. package/dist/optics/focus-breathing.d.ts +88 -27
  329. package/dist/optics/focus-breathing.js +114 -23
  330. package/dist/optics/focus-breathing.js.map +1 -1
  331. package/dist/optics/focus-state.d.ts +18 -18
  332. package/dist/optics/focus-state.js +21 -15
  333. package/dist/optics/focus-state.js.map +1 -1
  334. package/dist/optics/front-of-lens-filter.d.ts +45 -14
  335. package/dist/optics/front-of-lens-filter.js +259 -88
  336. package/dist/optics/front-of-lens-filter.js.map +1 -1
  337. package/dist/optics/illumination-vignetting.d.ts +16 -17
  338. package/dist/optics/illumination-vignetting.js +40 -17
  339. package/dist/optics/illumination-vignetting.js.map +1 -1
  340. package/dist/optics/irradiance-convolution.d.ts +59 -0
  341. package/dist/optics/irradiance-convolution.js +138 -0
  342. package/dist/optics/irradiance-convolution.js.map +1 -0
  343. package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
  344. package/dist/optics/lateral-chromatic-aberration.js +33 -23
  345. package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
  346. package/dist/optics/lens-psf-kernels.d.ts +89 -0
  347. package/dist/optics/lens-psf-kernels.js +175 -0
  348. package/dist/optics/lens-psf-kernels.js.map +1 -0
  349. package/dist/optics/lens-psf-profile.d.ts +78 -46
  350. package/dist/optics/lens-psf-profile.js +335 -124
  351. package/dist/optics/lens-psf-profile.js.map +1 -1
  352. package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
  353. package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
  354. package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
  355. package/dist/optics/polygon-diffraction.d.ts +80 -23
  356. package/dist/optics/polygon-diffraction.js +130 -25
  357. package/dist/optics/polygon-diffraction.js.map +1 -1
  358. package/dist/optics/profile-contract.d.ts +5 -6
  359. package/dist/optics/profile-contract.js +14 -11
  360. package/dist/optics/profile-contract.js.map +1 -1
  361. package/dist/optics/psf-foundation.d.ts +23 -23
  362. package/dist/optics/psf-foundation.js +24 -21
  363. package/dist/optics/psf-foundation.js.map +1 -1
  364. package/dist/optics/pupil-vignetting.d.ts +118 -0
  365. package/dist/optics/pupil-vignetting.js +264 -0
  366. package/dist/optics/pupil-vignetting.js.map +1 -0
  367. package/dist/optics/radial-distortion.d.ts +34 -33
  368. package/dist/optics/radial-distortion.js +37 -30
  369. package/dist/optics/radial-distortion.js.map +1 -1
  370. package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
  371. package/dist/optics/scene-to-sensor-irradiance.js +73 -45
  372. package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
  373. package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
  374. package/dist/optics/scene-to-sensor-quadrature.js +16 -11
  375. package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
  376. package/dist/optics/sensor-aperture-rays.d.ts +20 -4
  377. package/dist/optics/sensor-aperture-rays.js +32 -14
  378. package/dist/optics/sensor-aperture-rays.js.map +1 -1
  379. package/dist/optics/sensor-environment-query.d.ts +81 -16
  380. package/dist/optics/sensor-environment-query.js +145 -12
  381. package/dist/optics/sensor-environment-query.js.map +1 -1
  382. package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
  383. package/dist/optics/sensor-psf-quadrature.js +18 -11
  384. package/dist/optics/sensor-psf-quadrature.js.map +1 -1
  385. package/dist/optics/sensor-psf-support.d.ts +8 -6
  386. package/dist/optics/sensor-psf-support.js +8 -5
  387. package/dist/optics/sensor-psf-support.js.map +1 -1
  388. package/dist/optics/stray-light.d.ts +22 -19
  389. package/dist/optics/stray-light.js +18 -12
  390. package/dist/optics/stray-light.js.map +1 -1
  391. package/dist/optics/thin-lens.d.ts +10 -9
  392. package/dist/optics/thin-lens.js +12 -8
  393. package/dist/optics/thin-lens.js.map +1 -1
  394. package/dist/optics/zernike-wavefront.d.ts +154 -0
  395. package/dist/optics/zernike-wavefront.js +352 -0
  396. package/dist/optics/zernike-wavefront.js.map +1 -0
  397. package/dist/output/capture-corrected-sdr.d.ts +16 -8
  398. package/dist/output/capture-corrected-sdr.js +16 -8
  399. package/dist/output/capture-corrected-sdr.js.map +1 -1
  400. package/dist/output/capture-geometry.d.ts +34 -36
  401. package/dist/output/capture-geometry.js +52 -32
  402. package/dist/output/capture-geometry.js.map +1 -1
  403. package/dist/output/capture-sdr.d.ts +7 -6
  404. package/dist/output/capture-sdr.js +11 -8
  405. package/dist/output/capture-sdr.js.map +1 -1
  406. package/dist/output/crop.d.ts +22 -6
  407. package/dist/output/crop.js +40 -6
  408. package/dist/output/crop.js.map +1 -1
  409. package/dist/output/geometric-transforms.d.ts +60 -23
  410. package/dist/output/geometric-transforms.js +111 -24
  411. package/dist/output/geometric-transforms.js.map +1 -1
  412. package/dist/output/lens-corrections.d.ts +27 -19
  413. package/dist/output/lens-corrections.js +29 -13
  414. package/dist/output/lens-corrections.js.map +1 -1
  415. package/dist/output/native-capture-sdr.d.ts +71 -16
  416. package/dist/output/native-capture-sdr.js +190 -33
  417. package/dist/output/native-capture-sdr.js.map +1 -1
  418. package/dist/output/png-encoder.d.ts +65 -0
  419. package/dist/output/png-encoder.js +461 -0
  420. package/dist/output/png-encoder.js.map +1 -0
  421. package/dist/output/print-contrast-reference.d.ts +10 -9
  422. package/dist/output/print-contrast-reference.js +10 -8
  423. package/dist/output/print-contrast-reference.js.map +1 -1
  424. package/dist/output/print-detail.d.ts +18 -17
  425. package/dist/output/print-detail.js +12 -10
  426. package/dist/output/print-detail.js.map +1 -1
  427. package/dist/output/print-jpeg.d.ts +26 -5
  428. package/dist/output/print-jpeg.js +117 -50
  429. package/dist/output/print-jpeg.js.map +1 -1
  430. package/dist/output/print-plan.d.ts +19 -19
  431. package/dist/output/print-plan.js +11 -10
  432. package/dist/output/print-plan.js.map +1 -1
  433. package/dist/output/print-region-statistics.d.ts +14 -15
  434. package/dist/output/print-region-statistics.js +11 -11
  435. package/dist/output/print-region-statistics.js.map +1 -1
  436. package/dist/output/sdr-rendering.d.ts +48 -10
  437. package/dist/output/sdr-rendering.js +114 -25
  438. package/dist/output/sdr-rendering.js.map +1 -1
  439. package/dist/output/subject-framing-crop.d.ts +6 -10
  440. package/dist/output/subject-framing-crop.js +23 -13
  441. package/dist/output/subject-framing-crop.js.map +1 -1
  442. package/dist/processing/demosaic.d.ts +90 -0
  443. package/dist/processing/demosaic.js +275 -0
  444. package/dist/processing/demosaic.js.map +1 -0
  445. package/dist/processing/denoise.d.ts +68 -0
  446. package/dist/processing/denoise.js +214 -0
  447. package/dist/processing/denoise.js.map +1 -0
  448. package/dist/processing/focus-stacking.d.ts +17 -0
  449. package/dist/processing/focus-stacking.js +80 -0
  450. package/dist/processing/focus-stacking.js.map +1 -0
  451. package/dist/processing/hdr.d.ts +54 -0
  452. package/dist/processing/hdr.js +172 -0
  453. package/dist/processing/hdr.js.map +1 -0
  454. package/dist/processing/image-ops.d.ts +66 -0
  455. package/dist/processing/image-ops.js +192 -0
  456. package/dist/processing/image-ops.js.map +1 -0
  457. package/dist/processing/panorama.d.ts +51 -0
  458. package/dist/processing/panorama.js +305 -0
  459. package/dist/processing/panorama.js.map +1 -0
  460. package/dist/processing/processing-task.d.ts +85 -0
  461. package/dist/processing/processing-task.js +164 -0
  462. package/dist/processing/processing-task.js.map +1 -0
  463. package/dist/processing/tone-mapping.d.ts +69 -0
  464. package/dist/processing/tone-mapping.js +310 -0
  465. package/dist/processing/tone-mapping.js.map +1 -0
  466. package/dist/schema/camera.d.ts +5 -4
  467. package/dist/schema/illumination-spectral.d.ts +13 -19
  468. package/dist/schema/illumination-spectral.js +23 -19
  469. package/dist/schema/illumination-spectral.js.map +1 -1
  470. package/dist/schema/illumination-temporal.d.ts +12 -15
  471. package/dist/schema/illumination-temporal.js +43 -28
  472. package/dist/schema/illumination-temporal.js.map +1 -1
  473. package/dist/schema/illumination.d.ts +5 -4
  474. package/dist/schema/illumination.js +55 -20
  475. package/dist/schema/illumination.js.map +1 -1
  476. package/dist/schema/scene-radiance-temporal.d.ts +9 -11
  477. package/dist/schema/scene-radiance-temporal.js +26 -23
  478. package/dist/schema/scene-radiance-temporal.js.map +1 -1
  479. package/dist/schema/scene-radiance.d.ts +17 -17
  480. package/dist/schema/scene-radiance.js +56 -34
  481. package/dist/schema/scene-radiance.js.map +1 -1
  482. package/dist/schema/scene.d.ts +14 -13
  483. package/dist/schema/validation.d.ts +0 -1
  484. package/dist/schema/validation.js +17 -15
  485. package/dist/schema/validation.js.map +1 -1
  486. package/dist/sensor/accumulated-charge.d.ts +45 -64
  487. package/dist/sensor/accumulated-charge.js +41 -47
  488. package/dist/sensor/accumulated-charge.js.map +1 -1
  489. package/dist/sensor/architecture.d.ts +22 -25
  490. package/dist/sensor/architecture.js +17 -16
  491. package/dist/sensor/architecture.js.map +1 -1
  492. package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
  493. package/dist/sensor/camera-saturation-capacity.js +36 -34
  494. package/dist/sensor/camera-saturation-capacity.js.map +1 -1
  495. package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
  496. package/dist/sensor/capture-color-sampling-binding.js +39 -41
  497. package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
  498. package/dist/sensor/capture-mode-timing.d.ts +8 -9
  499. package/dist/sensor/capture-mode-timing.js +24 -21
  500. package/dist/sensor/capture-mode-timing.js.map +1 -1
  501. package/dist/sensor/capture-mode.d.ts +28 -30
  502. package/dist/sensor/capture-mode.js +33 -31
  503. package/dist/sensor/capture-mode.js.map +1 -1
  504. package/dist/sensor/color-sampling.d.ts +30 -33
  505. package/dist/sensor/color-sampling.js +32 -37
  506. package/dist/sensor/color-sampling.js.map +1 -1
  507. package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
  508. package/dist/sensor/constant-rate-temporal-integration.js +28 -26
  509. package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
  510. package/dist/sensor/dark-current.d.ts +53 -49
  511. package/dist/sensor/dark-current.js +87 -46
  512. package/dist/sensor/dark-current.js.map +1 -1
  513. package/dist/sensor/environment-photo-signal.d.ts +71 -30
  514. package/dist/sensor/environment-photo-signal.js +127 -46
  515. package/dist/sensor/environment-photo-signal.js.map +1 -1
  516. package/dist/sensor/eqe-electron-rate.d.ts +14 -13
  517. package/dist/sensor/eqe-electron-rate.js +34 -14
  518. package/dist/sensor/eqe-electron-rate.js.map +1 -1
  519. package/dist/sensor/eqe-local-exposure.d.ts +24 -24
  520. package/dist/sensor/eqe-local-exposure.js +15 -11
  521. package/dist/sensor/eqe-local-exposure.js.map +1 -1
  522. package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
  523. package/dist/sensor/eqe-temporal-exposure.js +15 -10
  524. package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
  525. package/dist/sensor/exposure-window.d.ts +48 -34
  526. package/dist/sensor/exposure-window.js +77 -36
  527. package/dist/sensor/exposure-window.js.map +1 -1
  528. package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
  529. package/dist/sensor/fixed-pattern-noise.js +166 -0
  530. package/dist/sensor/fixed-pattern-noise.js.map +1 -0
  531. package/dist/sensor/iso-gain.d.ts +44 -0
  532. package/dist/sensor/iso-gain.js +119 -0
  533. package/dist/sensor/iso-gain.js.map +1 -0
  534. package/dist/sensor/iso-signal-chain.d.ts +25 -48
  535. package/dist/sensor/iso-signal-chain.js +52 -66
  536. package/dist/sensor/iso-signal-chain.js.map +1 -1
  537. package/dist/sensor/local-exposure-binding.d.ts +21 -21
  538. package/dist/sensor/local-exposure-binding.js +22 -18
  539. package/dist/sensor/local-exposure-binding.js.map +1 -1
  540. package/dist/sensor/optical-stack.d.ts +36 -40
  541. package/dist/sensor/optical-stack.js +34 -37
  542. package/dist/sensor/optical-stack.js.map +1 -1
  543. package/dist/sensor/photon-energy.d.ts +22 -28
  544. package/dist/sensor/photon-energy.js +42 -34
  545. package/dist/sensor/photon-energy.js.map +1 -1
  546. package/dist/sensor/physical-charge-capacity.d.ts +20 -30
  547. package/dist/sensor/physical-charge-capacity.js +35 -36
  548. package/dist/sensor/physical-charge-capacity.js.map +1 -1
  549. package/dist/sensor/pixel-pitch.d.ts +2 -3
  550. package/dist/sensor/pixel-pitch.js +4 -2
  551. package/dist/sensor/pixel-pitch.js.map +1 -1
  552. package/dist/sensor/radiometry-readiness.d.ts +13 -15
  553. package/dist/sensor/radiometry-readiness.js +20 -17
  554. package/dist/sensor/radiometry-readiness.js.map +1 -1
  555. package/dist/sensor/raw-readout.d.ts +173 -83
  556. package/dist/sensor/raw-readout.js +425 -160
  557. package/dist/sensor/raw-readout.js.map +1 -1
  558. package/dist/sensor/raw-reconstruction.d.ts +112 -44
  559. package/dist/sensor/raw-reconstruction.js +200 -47
  560. package/dist/sensor/raw-reconstruction.js.map +1 -1
  561. package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
  562. package/dist/sensor/readout-exposure-linkage.js +125 -27
  563. package/dist/sensor/readout-exposure-linkage.js.map +1 -1
  564. package/dist/sensor/readout-timing.d.ts +43 -44
  565. package/dist/sensor/readout-timing.js +38 -30
  566. package/dist/sensor/readout-timing.js.map +1 -1
  567. package/dist/sensor/response-application-compatibility.d.ts +21 -28
  568. package/dist/sensor/response-application-compatibility.js +35 -34
  569. package/dist/sensor/response-application-compatibility.js.map +1 -1
  570. package/dist/sensor/response-operating-range.d.ts +26 -35
  571. package/dist/sensor/response-operating-range.js +40 -39
  572. package/dist/sensor/response-operating-range.js.map +1 -1
  573. package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
  574. package/dist/sensor/responsivity-photocurrent.js +57 -40
  575. package/dist/sensor/responsivity-photocurrent.js.map +1 -1
  576. package/dist/sensor/sampling-aperture.d.ts +21 -25
  577. package/dist/sensor/sampling-aperture.js +29 -28
  578. package/dist/sensor/sampling-aperture.js.map +1 -1
  579. package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
  580. package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
  581. package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
  582. package/dist/sensor/sensor-geometry.d.ts +28 -32
  583. package/dist/sensor/sensor-geometry.js +35 -20
  584. package/dist/sensor/sensor-geometry.js.map +1 -1
  585. package/dist/sensor/signal-noise.d.ts +14 -16
  586. package/dist/sensor/signal-noise.js +15 -13
  587. package/dist/sensor/signal-noise.js.map +1 -1
  588. package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
  589. package/dist/sensor/spatial-sample-reduction.js +39 -48
  590. package/dist/sensor/spatial-sample-reduction.js.map +1 -1
  591. package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
  592. package/dist/sensor/spatial-sampling-quadrature.js +31 -36
  593. package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
  594. package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
  595. package/dist/sensor/spatio-spectral-reduction.js +24 -29
  596. package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
  597. package/dist/sensor/spectral-coverage.d.ts +6 -9
  598. package/dist/sensor/spectral-coverage.js +9 -6
  599. package/dist/sensor/spectral-coverage.js.map +1 -1
  600. package/dist/sensor/spectral-quadrature.d.ts +46 -60
  601. package/dist/sensor/spectral-quadrature.js +38 -48
  602. package/dist/sensor/spectral-quadrature.js.map +1 -1
  603. package/dist/sensor/spectral-response.d.ts +53 -41
  604. package/dist/sensor/spectral-response.js +80 -47
  605. package/dist/sensor/spectral-response.js.map +1 -1
  606. package/dist/sensor/stochastic-seed.d.ts +50 -0
  607. package/dist/sensor/stochastic-seed.js +123 -0
  608. package/dist/sensor/stochastic-seed.js.map +1 -0
  609. package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
  610. package/dist/sensor/temporal-eqe-sum.js +5 -6
  611. package/dist/sensor/temporal-eqe-sum.js.map +1 -1
  612. package/dist/sensor/temporal-photo-signal.d.ts +5 -6
  613. package/dist/sensor/temporal-photo-signal.js +11 -10
  614. package/dist/sensor/temporal-photo-signal.js.map +1 -1
  615. package/dist/sensor/temporal-sample-binding.d.ts +1 -2
  616. package/dist/sensor/temporal-sample-binding.js +3 -3
  617. package/dist/sensor/temporal-sample-binding.js.map +1 -1
  618. package/dist/simulation/poc-simulation.d.ts +16 -16
  619. package/dist/simulation/poc-simulation.js +20 -15
  620. package/dist/simulation/poc-simulation.js.map +1 -1
  621. package/dist/stabilization/camera-shake.d.ts +42 -18
  622. package/dist/stabilization/camera-shake.js +43 -20
  623. package/dist/stabilization/camera-shake.js.map +1 -1
  624. package/dist/stabilization/system.d.ts +44 -41
  625. package/dist/stabilization/system.js +196 -108
  626. package/dist/stabilization/system.js.map +1 -1
  627. package/docs/AGENT_GUIDE.md +183 -0
  628. package/docs/API_REFERENCE.md +777 -2
  629. package/docs/QUICK_START.md +663 -0
  630. package/docs/USAGE.md +1719 -714
  631. package/docs/api/camera-equivalent-focal-length.md +6 -7
  632. package/docs/api/camera-field-of-view.md +16 -8
  633. package/docs/api/camera-lens-projection.md +246 -0
  634. package/docs/api/camera-projected-object-size.md +6 -5
  635. package/docs/api/capture-capture-export-metadata.md +10 -10
  636. package/docs/api/capture-dng-import.md +134 -0
  637. package/docs/api/capture-environment-raw-producer.md +17 -11
  638. package/docs/api/capture-export-jpeg.md +16 -0
  639. package/docs/api/capture-focus-control.md +25 -47
  640. package/docs/api/capture-linear-encoding.md +21 -12
  641. package/docs/api/capture-lossless-jpeg.md +49 -0
  642. package/docs/api/capture-native-environment-optical-stage.md +75 -0
  643. package/docs/api/capture-native-environment-raw.md +161 -4
  644. package/docs/api/capture-native-raw-development.md +69 -8
  645. package/docs/api/capture-native-raw-dng.md +84 -0
  646. package/docs/api/capture-native-raw.md +21 -10
  647. package/docs/api/capture-packed-sensor-raw.md +156 -0
  648. package/docs/api/capture-photographic-export.md +69 -31
  649. package/docs/api/capture-raw-frame-reconstruction.md +8 -8
  650. package/docs/api/capture-raw-white-level.md +37 -0
  651. package/docs/api/capture-release-sequence.md +6 -7
  652. package/docs/api/capture-sensor-raw-frame.md +6 -6
  653. package/docs/api/capture-sensor-raw-producer.md +17 -11
  654. package/docs/api/capture-simulated-capture.md +15 -15
  655. package/docs/api/color-camera-color-matrix.md +103 -0
  656. package/docs/api/color-capture-color.md +22 -11
  657. package/docs/api/color-chromatic-adaptation.md +82 -0
  658. package/docs/api/color-color-difference.md +134 -0
  659. package/docs/api/color-color-matching-functions.md +259 -0
  660. package/docs/api/color-colorimetry-math.md +54 -0
  661. package/docs/api/color-gamut-mapping.md +72 -0
  662. package/docs/api/color-illuminants.md +280 -0
  663. package/docs/api/color-rgb-color-spaces.md +151 -0
  664. package/docs/api/color-sensor-color-development.md +27 -0
  665. package/docs/api/color-srgb-icc.md +2 -4
  666. package/docs/api/color-white-balance.md +95 -19
  667. package/docs/api/composition-image-formation-plan.md +124 -95
  668. package/docs/api/composition-plan-consumer.md +7 -7
  669. package/docs/api/core-calculation-result.md +18 -14
  670. package/docs/api/core-configuration-error.md +1 -1
  671. package/docs/api/core-image-formation.md +7 -7
  672. package/docs/api/core-scientific-assurance.md +12 -10
  673. package/docs/api/core-spectral-composition.md +14 -14
  674. package/docs/api/core-spectral.md +6 -6
  675. package/docs/api/core-validation.md +3 -3
  676. package/docs/api/core-version.md +7 -6
  677. package/docs/api/equipment-exposure-capabilities.md +11 -10
  678. package/docs/api/equipment-generic-tier-assets.md +7 -2
  679. package/docs/api/equipment-generic-tier-presets.md +6 -6
  680. package/docs/api/equipment-iso-capabilities.md +18 -18
  681. package/docs/api/equipment-metering-capabilities.md +6 -6
  682. package/docs/api/equipment-release-capabilities.md +4 -4
  683. package/docs/api/exports.json +2253 -3
  684. package/docs/api/exposure-exposure-duration-control.md +9 -9
  685. package/docs/api/exposure-exposure-mode-resolver.md +35 -31
  686. package/docs/api/exposure-exposure.md +10 -10
  687. package/docs/api/exposure-flash-ttl.md +182 -0
  688. package/docs/api/exposure-flash.md +183 -28
  689. package/docs/api/exposure-metering-scene-radiance.md +11 -10
  690. package/docs/api/exposure-metering-target.md +9 -8
  691. package/docs/api/exposure-metering-temporal.md +8 -8
  692. package/docs/api/exposure-metering.md +69 -9
  693. package/docs/api/exposure-program-line.md +6 -5
  694. package/docs/api/facade-chart-radiance-batch.md +96 -0
  695. package/docs/api/facade-chart-scenes.md +240 -0
  696. package/docs/api/facade-scene-radiance.md +122 -0
  697. package/docs/api/facade-simulate-capture.md +397 -0
  698. package/docs/api/gpu-image-kernel-accelerator.md +157 -0
  699. package/docs/api/gpu-image-kernel-execution.md +152 -0
  700. package/docs/api/motion-camera-rotation.md +43 -26
  701. package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
  702. package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
  703. package/docs/api/motion-capture-rotation-trajectory.md +15 -15
  704. package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
  705. package/docs/api/motion-extended-object-projection.md +10 -8
  706. package/docs/api/motion-projected-motion.md +8 -8
  707. package/docs/api/motion-temporal-exposure-sum.md +98 -0
  708. package/docs/api/motion-video-sequence.md +159 -0
  709. package/docs/api/optics-aperture.md +8 -8
  710. package/docs/api/optics-atmospheric-haze.md +104 -0
  711. package/docs/api/optics-brown-conrady-distortion.md +123 -0
  712. package/docs/api/optics-circle-of-confusion.md +5 -4
  713. package/docs/api/optics-complex-pupil-psf.md +57 -16
  714. package/docs/api/optics-depth-of-field.md +12 -6
  715. package/docs/api/optics-diffraction-psf-profile.md +96 -0
  716. package/docs/api/optics-diffraction.md +8 -7
  717. package/docs/api/optics-focus-breathing.md +104 -16
  718. package/docs/api/optics-focus-state.md +9 -10
  719. package/docs/api/optics-front-of-lens-filter.md +72 -14
  720. package/docs/api/optics-illumination-vignetting.md +10 -10
  721. package/docs/api/optics-irradiance-convolution.md +95 -0
  722. package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
  723. package/docs/api/optics-lens-psf-kernels.md +72 -0
  724. package/docs/api/optics-lens-psf-profile.md +48 -26
  725. package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
  726. package/docs/api/optics-polygon-diffraction.md +78 -13
  727. package/docs/api/optics-profile-contract.md +4 -4
  728. package/docs/api/optics-psf-foundation.md +12 -12
  729. package/docs/api/optics-pupil-vignetting.md +132 -0
  730. package/docs/api/optics-radial-distortion.md +12 -12
  731. package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
  732. package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
  733. package/docs/api/optics-sensor-aperture-rays.md +3 -2
  734. package/docs/api/optics-sensor-environment-query.md +52 -9
  735. package/docs/api/optics-sensor-psf-quadrature.md +13 -10
  736. package/docs/api/optics-stray-light.md +12 -11
  737. package/docs/api/optics-thin-lens.md +4 -3
  738. package/docs/api/optics-zernike-wavefront.md +229 -0
  739. package/docs/api/output-capture-corrected-sdr.md +10 -7
  740. package/docs/api/output-capture-geometry.md +35 -36
  741. package/docs/api/output-capture-sdr.md +4 -4
  742. package/docs/api/output-crop.md +7 -4
  743. package/docs/api/output-geometric-transforms.md +65 -19
  744. package/docs/api/output-lens-corrections.md +17 -15
  745. package/docs/api/output-native-capture-sdr.md +26 -13
  746. package/docs/api/output-png-encoder.md +105 -0
  747. package/docs/api/output-print-contrast-reference.md +8 -8
  748. package/docs/api/output-print-detail.md +14 -14
  749. package/docs/api/output-print-jpeg.md +22 -5
  750. package/docs/api/output-print-plan.md +18 -18
  751. package/docs/api/output-print-region-statistics.md +14 -14
  752. package/docs/api/output-sdr-rendering.md +52 -10
  753. package/docs/api/output-subject-framing-crop.md +5 -6
  754. package/docs/api/processing-demosaic.md +120 -0
  755. package/docs/api/processing-denoise.md +148 -0
  756. package/docs/api/processing-focus-stacking.md +41 -0
  757. package/docs/api/processing-hdr.md +113 -0
  758. package/docs/api/processing-panorama.md +82 -0
  759. package/docs/api/processing-processing-task.md +107 -0
  760. package/docs/api/processing-tone-mapping.md +142 -0
  761. package/docs/api/schema-camera.md +6 -4
  762. package/docs/api/schema-illumination-spectral.md +10 -11
  763. package/docs/api/schema-illumination-temporal.md +13 -15
  764. package/docs/api/schema-illumination.md +4 -4
  765. package/docs/api/schema-scene-radiance-temporal.md +10 -11
  766. package/docs/api/schema-scene-radiance.md +18 -17
  767. package/docs/api/schema-scene.md +9 -9
  768. package/docs/api/schema-validation.md +1 -1
  769. package/docs/api/sensor-accumulated-charge.md +12 -20
  770. package/docs/api/sensor-architecture.md +15 -16
  771. package/docs/api/sensor-camera-saturation-capacity.md +9 -11
  772. package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
  773. package/docs/api/sensor-capture-mode-timing.md +9 -9
  774. package/docs/api/sensor-capture-mode.md +29 -30
  775. package/docs/api/sensor-color-sampling.md +31 -33
  776. package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
  777. package/docs/api/sensor-dark-current.md +30 -14
  778. package/docs/api/sensor-environment-photo-signal.md +13 -6
  779. package/docs/api/sensor-eqe-electron-rate.md +9 -8
  780. package/docs/api/sensor-eqe-local-exposure.md +18 -17
  781. package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
  782. package/docs/api/sensor-exposure-window.md +24 -24
  783. package/docs/api/sensor-fixed-pattern-noise.md +104 -0
  784. package/docs/api/sensor-iso-gain.md +63 -0
  785. package/docs/api/sensor-iso-signal-chain.md +13 -22
  786. package/docs/api/sensor-local-exposure-binding.md +12 -13
  787. package/docs/api/sensor-optical-stack.md +37 -40
  788. package/docs/api/sensor-photon-energy.md +10 -11
  789. package/docs/api/sensor-physical-charge-capacity.md +8 -13
  790. package/docs/api/sensor-pixel-pitch.md +1 -1
  791. package/docs/api/sensor-radiometry-readiness.md +9 -9
  792. package/docs/api/sensor-raw-readout.md +118 -52
  793. package/docs/api/sensor-raw-reconstruction.md +97 -20
  794. package/docs/api/sensor-readout-exposure-linkage.md +120 -24
  795. package/docs/api/sensor-readout-timing.md +33 -35
  796. package/docs/api/sensor-response-application-compatibility.md +9 -11
  797. package/docs/api/sensor-response-operating-range.md +14 -18
  798. package/docs/api/sensor-responsivity-photocurrent.md +9 -12
  799. package/docs/api/sensor-sampling-aperture.md +22 -25
  800. package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
  801. package/docs/api/sensor-sensor-geometry.md +23 -24
  802. package/docs/api/sensor-signal-noise.md +10 -10
  803. package/docs/api/sensor-spatial-sample-reduction.md +27 -30
  804. package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
  805. package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
  806. package/docs/api/sensor-spectral-coverage.md +5 -5
  807. package/docs/api/sensor-spectral-quadrature.md +33 -35
  808. package/docs/api/sensor-spectral-response.md +28 -16
  809. package/docs/api/sensor-temporal-photo-signal.md +6 -6
  810. package/docs/api/simulation-poc-simulation.md +17 -16
  811. package/docs/api/stabilization-camera-shake.md +29 -10
  812. package/docs/api/stabilization-system.md +25 -21
  813. package/docs/examples/production-request.json +3821 -2157
  814. package/docs/examples/simulate-capture.mjs +14 -0
  815. package/llms.txt +35 -0
  816. package/package.json +32 -11
  817. package/AGENTS.md +0 -674
  818. package/CONTRIBUTING.md +0 -76
  819. package/DCO +0 -33
  820. package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
  821. package/dist/camera/field-of-view.d.ts.map +0 -1
  822. package/dist/camera/projected-object-size.d.ts.map +0 -1
  823. package/dist/capture/capture-export-metadata.d.ts.map +0 -1
  824. package/dist/capture/environment-raw-producer.d.ts.map +0 -1
  825. package/dist/capture/export-jpeg.d.ts.map +0 -1
  826. package/dist/capture/export-tiff.d.ts.map +0 -1
  827. package/dist/capture/focus-control.d.ts.map +0 -1
  828. package/dist/capture/linear-encoding.d.ts.map +0 -1
  829. package/dist/capture/native-environment-raw.d.ts.map +0 -1
  830. package/dist/capture/native-raw-development.d.ts.map +0 -1
  831. package/dist/capture/native-raw.d.ts.map +0 -1
  832. package/dist/capture/photographic-export.d.ts.map +0 -1
  833. package/dist/capture/raw-frame-limits.d.ts.map +0 -1
  834. package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
  835. package/dist/capture/release-sequence.d.ts.map +0 -1
  836. package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
  837. package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
  838. package/dist/capture/simulated-capture.d.ts.map +0 -1
  839. package/dist/color/capture-color.d.ts.map +0 -1
  840. package/dist/color/sensor-color-development.d.ts.map +0 -1
  841. package/dist/color/srgb-icc.d.ts.map +0 -1
  842. package/dist/color/srgb-transfer.d.ts.map +0 -1
  843. package/dist/color/white-balance.d.ts.map +0 -1
  844. package/dist/composition/image-formation-plan.d.ts.map +0 -1
  845. package/dist/composition/plan-consumer.d.ts.map +0 -1
  846. package/dist/core/calculation-result.d.ts.map +0 -1
  847. package/dist/core/canonical-json.d.ts.map +0 -1
  848. package/dist/core/configuration-error.d.ts.map +0 -1
  849. package/dist/core/evidence-provenance.d.ts.map +0 -1
  850. package/dist/core/image-formation.d.ts.map +0 -1
  851. package/dist/core/owned-data.d.ts.map +0 -1
  852. package/dist/core/record-validation.d.ts.map +0 -1
  853. package/dist/core/scientific-assurance.d.ts.map +0 -1
  854. package/dist/core/spectral-composition.d.ts.map +0 -1
  855. package/dist/core/spectral.d.ts.map +0 -1
  856. package/dist/core/validation.d.ts.map +0 -1
  857. package/dist/core/version.d.ts.map +0 -1
  858. package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
  859. package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
  860. package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
  861. package/dist/equipment/iso-capabilities.d.ts.map +0 -1
  862. package/dist/equipment/metering-capabilities.d.ts.map +0 -1
  863. package/dist/equipment/release-capabilities.d.ts.map +0 -1
  864. package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
  865. package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
  866. package/dist/exposure/exposure.d.ts.map +0 -1
  867. package/dist/exposure/flash.d.ts.map +0 -1
  868. package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
  869. package/dist/exposure/metering-target.d.ts.map +0 -1
  870. package/dist/exposure/metering-temporal.d.ts.map +0 -1
  871. package/dist/exposure/metering.d.ts.map +0 -1
  872. package/dist/exposure/program-line.d.ts.map +0 -1
  873. package/dist/index.d.ts.map +0 -1
  874. package/dist/motion/camera-rotation.d.ts.map +0 -1
  875. package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
  876. package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
  877. package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
  878. package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
  879. package/dist/motion/extended-object-projection.d.ts.map +0 -1
  880. package/dist/motion/projected-motion.d.ts.map +0 -1
  881. package/dist/optics/aperture.d.ts.map +0 -1
  882. package/dist/optics/circle-of-confusion.d.ts.map +0 -1
  883. package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
  884. package/dist/optics/depth-of-field.d.ts.map +0 -1
  885. package/dist/optics/diffraction.d.ts.map +0 -1
  886. package/dist/optics/focus-breathing.d.ts.map +0 -1
  887. package/dist/optics/focus-state.d.ts.map +0 -1
  888. package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
  889. package/dist/optics/illumination-vignetting.d.ts.map +0 -1
  890. package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
  891. package/dist/optics/lens-psf-profile.d.ts.map +0 -1
  892. package/dist/optics/polygon-diffraction.d.ts.map +0 -1
  893. package/dist/optics/profile-contract.d.ts.map +0 -1
  894. package/dist/optics/psf-foundation.d.ts.map +0 -1
  895. package/dist/optics/radial-distortion.d.ts.map +0 -1
  896. package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
  897. package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
  898. package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
  899. package/dist/optics/sensor-environment-query.d.ts.map +0 -1
  900. package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
  901. package/dist/optics/sensor-psf-support.d.ts.map +0 -1
  902. package/dist/optics/stray-light.d.ts.map +0 -1
  903. package/dist/optics/thin-lens.d.ts.map +0 -1
  904. package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
  905. package/dist/output/capture-geometry.d.ts.map +0 -1
  906. package/dist/output/capture-sdr.d.ts.map +0 -1
  907. package/dist/output/crop.d.ts.map +0 -1
  908. package/dist/output/geometric-transforms.d.ts.map +0 -1
  909. package/dist/output/lens-corrections.d.ts.map +0 -1
  910. package/dist/output/native-capture-sdr.d.ts.map +0 -1
  911. package/dist/output/print-contrast-reference.d.ts.map +0 -1
  912. package/dist/output/print-detail.d.ts.map +0 -1
  913. package/dist/output/print-jpeg.d.ts.map +0 -1
  914. package/dist/output/print-plan.d.ts.map +0 -1
  915. package/dist/output/print-region-statistics.d.ts.map +0 -1
  916. package/dist/output/sdr-rendering.d.ts.map +0 -1
  917. package/dist/output/subject-framing-crop.d.ts.map +0 -1
  918. package/dist/schema/camera.d.ts.map +0 -1
  919. package/dist/schema/camera.js +0 -3
  920. package/dist/schema/camera.js.map +0 -1
  921. package/dist/schema/illumination-spectral.d.ts.map +0 -1
  922. package/dist/schema/illumination-temporal.d.ts.map +0 -1
  923. package/dist/schema/illumination.d.ts.map +0 -1
  924. package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
  925. package/dist/schema/scene-radiance.d.ts.map +0 -1
  926. package/dist/schema/scene.d.ts.map +0 -1
  927. package/dist/schema/scene.js +0 -3
  928. package/dist/schema/scene.js.map +0 -1
  929. package/dist/schema/validation.d.ts.map +0 -1
  930. package/dist/sensor/accumulated-charge.d.ts.map +0 -1
  931. package/dist/sensor/architecture.d.ts.map +0 -1
  932. package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
  933. package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
  934. package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
  935. package/dist/sensor/capture-mode.d.ts.map +0 -1
  936. package/dist/sensor/color-sampling.d.ts.map +0 -1
  937. package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
  938. package/dist/sensor/dark-current.d.ts.map +0 -1
  939. package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
  940. package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
  941. package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
  942. package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
  943. package/dist/sensor/exposure-window.d.ts.map +0 -1
  944. package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
  945. package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
  946. package/dist/sensor/optical-stack.d.ts.map +0 -1
  947. package/dist/sensor/photon-energy.d.ts.map +0 -1
  948. package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
  949. package/dist/sensor/pixel-pitch.d.ts.map +0 -1
  950. package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
  951. package/dist/sensor/raw-readout.d.ts.map +0 -1
  952. package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
  953. package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
  954. package/dist/sensor/readout-timing.d.ts.map +0 -1
  955. package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
  956. package/dist/sensor/response-operating-range.d.ts.map +0 -1
  957. package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
  958. package/dist/sensor/sampling-aperture.d.ts.map +0 -1
  959. package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
  960. package/dist/sensor/sensor-geometry.d.ts.map +0 -1
  961. package/dist/sensor/signal-noise.d.ts.map +0 -1
  962. package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
  963. package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
  964. package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
  965. package/dist/sensor/spectral-coverage.d.ts.map +0 -1
  966. package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
  967. package/dist/sensor/spectral-response.d.ts.map +0 -1
  968. package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
  969. package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
  970. package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
  971. package/dist/simulation/poc-simulation.d.ts.map +0 -1
  972. package/dist/stabilization/camera-shake.d.ts.map +0 -1
  973. package/dist/stabilization/system.d.ts.map +0 -1
  974. package/docs/API_STYLE.md +0 -235
  975. package/docs/ARCHITECTURE.md +0 -356
  976. package/docs/AUTOMATION_COORDINATION.md +0 -190
  977. package/docs/CAPTURE_COLOR.md +0 -25
  978. package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
  979. package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
  980. package/docs/CAPTURE_SDR.md +0 -22
  981. package/docs/DENSE_PUPIL_QUALIFICATION.md +0 -121
  982. package/docs/DEVELOPERS.md +0 -68
  983. package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
  984. package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
  985. package/docs/EXPORT_ACCEPTANCE.md +0 -133
  986. package/docs/GENERIC_TIER_PRESETS.md +0 -269
  987. package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
  988. package/docs/IMAGE_FORMATION.md +0 -247
  989. package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
  990. package/docs/MOTION_AND_SIGNAL.md +0 -250
  991. package/docs/NATIVE_CAPTURE_SDR.md +0 -70
  992. package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
  993. package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
  994. package/docs/NATIVE_RAW_AND_PRINT.md +0 -54
  995. package/docs/NUMERICAL_CORRECTNESS.md +0 -191
  996. package/docs/PERFORMANCE_BASELINE.md +0 -56
  997. package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
  998. package/docs/PHYSICS_FOUNDATION.md +0 -426
  999. package/docs/POC_API.md +0 -278
  1000. package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
  1001. package/docs/POC_PROJECTION_REUSE.md +0 -124
  1002. package/docs/PRINT_195_196_REVIEW.md +0 -93
  1003. package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
  1004. package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
  1005. package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
  1006. package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
  1007. package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
  1008. package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
  1009. package/docs/PRINT_PLANNING.md +0 -75
  1010. package/docs/PRINT_REGION_STATISTICS.md +0 -38
  1011. package/docs/PROCESSED_OUTPUT.md +0 -157
  1012. package/docs/PRODUCTION_COMPOSITION.md +0 -373
  1013. package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
  1014. package/docs/PROVENANCE.md +0 -115
  1015. package/docs/PSF_FOUNDATION.md +0 -165
  1016. package/docs/RAW_FRAME_ENVELOPE.md +0 -56
  1017. package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
  1018. package/docs/RELEASE_1_0.md +0 -66
  1019. package/docs/RELEASE_1_0_1.md +0 -61
  1020. package/docs/RELEASE_1_1_0.md +0 -25
  1021. package/docs/RELEASE_1_2_0.md +0 -51
  1022. package/docs/RELEASE_1_3_0.md +0 -15
  1023. package/docs/RELEASE_1_4_0.md +0 -23
  1024. package/docs/RELEASE_1_5_0.md +0 -105
  1025. package/docs/RELEASE_AUDIT.md +0 -39
  1026. package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
  1027. package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
  1028. package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
  1029. package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
  1030. package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
  1031. package/docs/SDR_RENDERING.md +0 -33
  1032. package/docs/SENSOR_APERTURE_RAYS.md +0 -23
  1033. package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
  1034. package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
  1035. package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
  1036. package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
  1037. package/docs/SENSOR_RAW_FRAME.md +0 -20
  1038. package/docs/SENSOR_RAW_PRODUCER.md +0 -77
  1039. package/docs/SEPARABLE_EMISSION_DRAFT.md +0 -103
  1040. package/docs/SIGNAL_CONFORMANCE.md +0 -23
  1041. package/docs/SIMULATED_CAPTURE.md +0 -65
  1042. package/docs/STABILIZATION.md +0 -234
  1043. package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
  1044. package/docs/TIER_ACCEPTANCE.md +0 -129
  1045. package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
  1046. package/docs/V1_COMPOSITION_MAP.md +0 -123
  1047. package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
  1048. package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
  1049. package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
  1050. package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
  1051. package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
  1052. package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
  1053. package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
  1054. package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
  1055. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
  1056. package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
  1057. package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
  1058. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
  1059. package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
  1060. package/docs/licenses/castleCSF-MIT.txt +0 -21
  1061. package/docs/validation/dense-pupil-2026-10-06/pilot.jsonl +0 -6
  1062. package/docs/validation/documentation-fragments.json +0 -212
  1063. package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
  1064. package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
  1065. package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
  1066. package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
  1067. package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
  1068. package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
  1069. package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
  1070. package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
  1071. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
  1072. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
  1073. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
  1074. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
  1075. package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
  1076. package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
  1077. package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
  1078. package/docs/validation/print-196-candidate-capabilities.json +0 -28
  1079. package/docs/validation/print-196-candidate-evidence.json +0 -356
  1080. package/docs/validation/print-196-engine-acceptance.json +0 -81
  1081. package/docs/validation/print-detail-capabilities.json +0 -103
  1082. package/docs/validation/print-detail-jpeg-evidence.json +0 -116
  1083. package/docs/validation/print-detail-sdr-evidence.json +0 -81
  1084. package/docs/validation/release-audit-inventory.json +0 -1306
  1085. package/docs/validation/tier-acceptance-report-v1.json +0 -2538
@@ -7,7 +7,7 @@ export interface SensorPsfSourceSample {
7
7
  timeSecondsFromOpeningReference: number;
8
8
  kernelSampleX: number;
9
9
  kernelSampleY: number;
10
- /** Optical-axis origin, +X right/+Y down, millimetres; no native crop clipping. */
10
+ /** Origin on the optical axis, +X right, +Y down, in millimetres. Not clipped to the native crop. */
11
11
  sourcePointNativeSensorMm: {
12
12
  x: number;
13
13
  y: number;
@@ -15,18 +15,18 @@ export interface SensorPsfSourceSample {
15
15
  spectralIrradianceWattsPerSquareMeterPerNanometer: number;
16
16
  }
17
17
  export interface CalculateSensorPsfIrradianceQuadratureInput {
18
- /** One instant on the explicitly declared shutter opening reference. */
18
+ /** One instant, measured on the declared shutter-opening time reference. */
19
19
  timeSecondsFromOpeningReference: number;
20
20
  spatialQuadrature: ReduceSensorSpatioSpectralIrradianceInput["spatialQuadrature"];
21
21
  spectralQuadrature: ReduceSensorSpatioSpectralIrradianceInput["spectralQuadrature"];
22
- /** The adapter owns wavelength and image-plane field position for each node. */
22
+ /** The adapter supplies the wavelength and image-plane field position for each node. */
23
23
  psf: Omit<ResolveLensSampledPsfInput, "fieldPointMm" | "wavelengthNm">;
24
- /** Schema 0.1.0 PSF profiles lack a basis field; bind that source meaning explicitly. */
24
+ /** Schema 0.1.0 PSF profiles have no basis field, so the caller states what the source means. */
25
25
  psfWavelengthBasis: {
26
26
  value: "air" | "vacuum";
27
27
  evidence: readonly EvidenceProvenance[];
28
28
  };
29
- /** Explicit local approximation; a varying PSF grid is not a global convolution. */
29
+ /** Explicit local approximation. A PSF that varies across a grid is not a global convolution. */
30
30
  spatialModel: {
31
31
  kind: "destination-local-shift-invariant-approximation";
32
32
  evidence: readonly EvidenceProvenance[];
@@ -61,10 +61,12 @@ export interface SensorPsfIrradianceQuadrature {
61
61
  }[];
62
62
  }
63
63
  /**
64
- * Apply each resolved unit-energy PSF as a destination-local inverse sample sum.
65
- * Native +Y-down support converts explicitly to optical +Y-up kernel orientation.
66
- * No boundary extension, missing-support renormalization or extra throughput is
67
- * applied. This approximation is not a field-dependent forward energy transport.
64
+ * Applies each resolved unit-energy PSF as an inverse sum of samples around
65
+ * each destination pixel.
66
+ *
67
+ * Support in native coordinates (+Y down) is converted explicitly to the
68
+ * optical kernel orientation (+Y up). The edges are not extended, missing
69
+ * support is not renormalized and no extra throughput is applied. This
70
+ * approximation is not a field-dependent forward transport of energy.
68
71
  */
69
72
  export declare function calculateSensorPsfIrradianceQuadrature(input: CalculateSensorPsfIrradianceQuadratureInput): CalculationResult<SensorPsfIrradianceQuadrature>;
70
- //# sourceMappingURL=sensor-psf-quadrature.d.ts.map
@@ -1,12 +1,14 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Apply each resolved unit-energy PSF as a destination-local inverse sample sum. Native +Y-down
5
- * support converts explicitly to optical +Y-up kernel orientation. No boundary extension,
6
- * missing-support renormalization or extra throughput is applied. This approximation is not a
7
- * field-dependent forward energy transport.
8
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
9
- * limits.
3
+ * Applies each resolved PSF (point-spread function, normalized to unit energy) as an inverse sum of
4
+ * samples around each destination pixel.
5
+ *
6
+ * Support offsets in native sensor coordinates (+Y down) are converted explicitly to the optical
7
+ * kernel orientation (+Y up). The edges are not extended. Missing support is not renormalized. No
8
+ * extra throughput is applied. This approximation is not a field-dependent forward transport of
9
+ * energy.
10
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
11
+ * and support limits.
10
12
  */
11
13
  import { sensorPsfSourcePoint } from "./sensor-psf-support.js";
12
14
  import { approximationResult } from "../core/calculation-result.js";
@@ -15,13 +17,18 @@ import { InvalidScientificInputError, InvalidScientificResultError } from "../co
15
17
  import { bindSensorSpatioSpectralSamples, reduceSensorSpatioSpectralIrradiance } from "../sensor/spatio-spectral-reduction.js";
16
18
  import { sensorSpatialQuadratureNodeIdentityKey } from "../sensor/spatial-sample-reduction.js";
17
19
  import { resolveLensSampledPsf } from "./lens-psf-profile.js";
20
+ import { requireInputKeys } from "../core/record-validation.js";
18
21
  /**
19
- * Apply each resolved unit-energy PSF as a destination-local inverse sample sum.
20
- * Native +Y-down support converts explicitly to optical +Y-up kernel orientation.
21
- * No boundary extension, missing-support renormalization or extra throughput is
22
- * applied. This approximation is not a field-dependent forward energy transport.
22
+ * Applies each resolved unit-energy PSF as an inverse sum of samples around
23
+ * each destination pixel.
24
+ *
25
+ * Support in native coordinates (+Y down) is converted explicitly to the
26
+ * optical kernel orientation (+Y up). The edges are not extended, missing
27
+ * support is not renormalized and no extra throughput is applied. This
28
+ * approximation is not a field-dependent forward transport of energy.
23
29
  */
24
30
  export function calculateSensorPsfIrradianceQuadrature(input) {
31
+ requireInputKeys(input, "calculateSensorPsfIrradianceQuadrature", ["timeSecondsFromOpeningReference", "spatialQuadrature", "spectralQuadrature", "psf", "psfWavelengthBasis", "spatialModel", "inputMeaning", "samples"]);
25
32
  if (!Number.isFinite(input.timeSecondsFromOpeningReference) || input.timeSecondsFromOpeningReference < 0) {
26
33
  throw new InvalidScientificInputError("PSF source time must be finite and nonnegative.");
27
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sensor-psf-quadrature.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-quadrature.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;GAQG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAA0B,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAA2B,MAAM,gCAAgC,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,EAAE,+BAA+B,EAAE,oCAAoC,EACW,MAAM,wCAAwC,CAAC;AACxI,OAAO,EAAE,sCAAsC,EAAE,MAAM,uCAAuC,CAAC;AAC/F,OAAO,EAAE,qBAAqB,EAAmC,MAAM,uBAAuB,CAAC;AAgD/F;;;;;GAKG;AACH,MAAM,UAAU,sCAAsC,CACpD,KAAkD;IAElD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,+BAA+B,CAAC,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,2BAA2B,CAAC,iDAAiD,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,KAAK,CAAC,YAAY,KAAK,qDAAqD;QAC9E,KAAK,CAAC,YAAY,EAAE,IAAI,KAAK,iDAAiD;QAC9E,OAAO,KAAK,CAAC,YAAY,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;QAC7F,MAAM,IAAI,2BAA2B,CAAC,kGAAkG,CAAC,CAAC;IAC5I,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,kBAAkB,EAAE,KAAK,KAAK,QAAQ,CAAC;QAC7F,KAAK,CAAC,kBAAkB,CAAC,KAAK,KAAK,KAAK,CAAC,kBAAkB,CAAC,eAAe,EAAE,CAAC;QAC9E,MAAM,IAAI,2BAA2B,CAAC,+DAA+D,CAAC,CAAC;IACzG,CAAC;IACD,MAAM,oBAAoB,GAAG,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,0BAA0B,CAAC,CAAC;IACxG,MAAM,uBAAuB,GAAG,iBAAiB,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;IACpH,MAAM,KAAK,GAAG,+BAA+B,CAAC,EAAE,GAAG,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjG,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC;YAAE,MAAM,IAAI,2BAA2B,CAAC,2CAA2C,CAAC,CAAC;QAC7H,KAAK,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;QACrC,IAAI,KAAK,GAAG,MAAM;YAAE,MAAM,IAAI,2BAA2B,CAAC,oDAAoD,CAAC,CAAC;IAClH,CAAC;IACD,MAAM,OAAO,GAAuD,EAAE,CAAC;IACvE,MAAM,iBAAiB,GAAwE,EAAE,CAAC;IAClG,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACtD,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;YACpD,MAAM,WAAW,GAAG,EAAE,0BAA0B,EAAE,OAAO,CAAC,0BAA0B;gBAClF,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,EAAE,CAAC;YAC3G,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YACrI,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,sCAAsC,CAAC,WAAW,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,mBAAmB,CAAE,CAAC;YAClI,MAAM,WAAW,GAAG,OAAO,CAAC,4BAA4B,CAAC;YACzD,MAAM,GAAG,GAAG,qBAAqB,CAAC,EAAE,GAAG,KAAK,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,CAAC,oBAAoB;gBAC3F,YAAY,EAAE,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YAChC,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC;gBACjF,MAAM,IAAI,2BAA2B,CAAC,4EAA4E,CAAC,CAAC;YACtH,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAiC,CAAC;YACzD,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBAC5C,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,+BAA+B,KAAK,KAAK,CAAC,+BAA+B;oBAC7F,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,aAAa,CAAC;oBAC1F,MAAM,CAAC,aAAa,GAAG,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,YAAY;oBACvE,MAAM,CAAC,aAAa,GAAG,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa;oBACxE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,iDAAiD,CAAC,IAAI,MAAM,CAAC,iDAAiD,GAAG,CAAC,EAAE,CAAC;oBAC7I,MAAM,IAAI,2BAA2B,CAAC,kFAAkF,CAAC,CAAC;gBAC5H,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC;gBAChF,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBACvG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,yBAAyB,EAAE,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,yBAAyB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjH,MAAM,IAAI,2BAA2B,CAAC,yFAAyF,CAAC,CAAC;gBACnI,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,EAAE,yBAAyB,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;YACvG,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,iDAAiD,EAAE,CAAC,CAAC,CAAC;YACtJ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,MAAM,IAAI,4BAA4B,CAAC,6CAA6C,CAAC,CAAC;YACxH,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC;YAC3C,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iDAAiD,EAAE,UAAU,EAAE,CAAC,CAAC;QAClG,CAAC;IACH,CAAC;IACD,MAAM,SAAS,GAAG,oCAAoC,CAAC,EAAE,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;QACjG,kBAAkB,EAAE,KAAK,CAAC,kBAAkB,EAAE,YAAY,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACnF,OAAO,mBAAmB,CAAC,EAAE,+BAA+B,EAAE,KAAK,CAAC,+BAA+B;QACjG,eAAe,EAAE,KAAK,CAAC,kBAAkB,CAAC,KAAK;QAC/C,WAAW,EAAE,yBAAyB,EAAE,aAAa,EAAE,wDAAwD;QAC/G,wBAAwB,EAAE,IAAI,EAAE,+BAA+B,EAAE,KAAK,EAAE,wCAAwC,EAAE,KAAK;QACvH,sBAAsB,EAAE,KAAK,EAAE,8BAA8B,EAAE,KAAK,EAAE,oBAAoB,EAAE,uBAAuB;QACnH,sBAAsB,EAAE,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS;KAC7F,EAAE,wCAAwC,EAAE,OAAO,EAAE;QACpD,uHAAuH;QACvH,wHAAwH;QACxH,qHAAqH;KACtH,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"sensor-psf-quadrature.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-quadrature.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Applies each resolved PSF (point-spread function, normalized to unit energy) as an inverse sum of\n * samples around each destination pixel.\n *\n * Support offsets in native sensor coordinates (+Y down) are converted explicitly to the optical\n * kernel orientation (+Y up). The edges are not extended. Missing support is not renormalized. No\n * extra throughput is applied. This approximation is not a field-dependent forward transport of\n * energy.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport { sensorPsfSourcePoint } from \"./sensor-psf-support.js\";\nimport { approximationResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { parseEvidenceList, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError, InvalidScientificResultError } from \"../core/validation.js\";\nimport { bindSensorSpatioSpectralSamples, reduceSensorSpatioSpectralIrradiance,\n type ReduceSensorSpatioSpectralIrradianceInput, type SensorSpatioSpectralNodeIdentity } from \"../sensor/spatio-spectral-reduction.js\";\nimport { sensorSpatialQuadratureNodeIdentityKey } from \"../sensor/spatial-sample-reduction.js\";\nimport { resolveLensSampledPsf, type ResolveLensSampledPsfInput } from \"./lens-psf-profile.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\n/** One pre-PSF incident irradiance value per explicitly identified kernel tap. */\nexport interface SensorPsfSourceSample {\n timeSecondsFromOpeningReference: number;\n kernelSampleX: number;\n kernelSampleY: number;\n /** Origin on the optical axis, +X right, +Y down, in millimetres. Not clipped to the native crop. */\n sourcePointNativeSensorMm: { x: number; y: number };\n spectralIrradianceWattsPerSquareMeterPerNanometer: number;\n}\n\nexport interface CalculateSensorPsfIrradianceQuadratureInput {\n /** One instant, measured on the declared shutter-opening time reference. */\n timeSecondsFromOpeningReference: number;\n spatialQuadrature: ReduceSensorSpatioSpectralIrradianceInput[\"spatialQuadrature\"];\n spectralQuadrature: ReduceSensorSpatioSpectralIrradianceInput[\"spectralQuadrature\"];\n /** The adapter supplies the wavelength and image-plane field position for each node. */\n psf: Omit<ResolveLensSampledPsfInput, \"fieldPointMm\" | \"wavelengthNm\">;\n /** Schema 0.1.0 PSF profiles have no basis field, so the caller states what the source means. */\n psfWavelengthBasis: { value: \"air\" | \"vacuum\"; evidence: readonly EvidenceProvenance[] };\n /** Explicit local approximation. A PSF that varies across a grid is not a global convolution. */\n spatialModel: { kind: \"destination-local-shift-invariant-approximation\";\n evidence: readonly EvidenceProvenance[]; limitation: string };\n inputMeaning: \"pre-psf-pre-sensor-stack-pre-aa-spectral-irradiance\";\n /** All nodes and all kernel taps, including zero weights, must be supplied. */\n samples: readonly { node: SensorSpatioSpectralNodeIdentity; sourceSamples: readonly SensorPsfSourceSample[] }[];\n}\n\nexport interface SensorPsfIrradianceQuadrature {\n timeSecondsFromOpeningReference: number;\n wavelengthBasis: \"air\" | \"vacuum\";\n sourcePlane: \"sensor-package-incident\";\n outputMeaning: \"post-psf-pre-sensor-stack-pre-aa-irradiance-quadrature\";\n psfRedistributionApplied: true;\n localShiftInvarianceEstablished: false;\n globalFieldEnergyConservationEstablished: false;\n pupilThroughputApplied: false;\n sceneProviderExecutionVerified: false;\n spatialModelEvidence: readonly EvidenceProvenance[];\n wavelengthBasisEvidence: readonly EvidenceProvenance[];\n spatialModelLimitation: string;\n irradianceSamples: ReduceSensorSpatioSpectralIrradianceInput[\"sampleValues\"];\n reduction: ReturnType<typeof reduceSensorSpatioSpectralIrradiance>;\n samples: readonly { node: SensorSpatioSpectralNodeIdentity;\n psf: ReturnType<typeof resolveLensSampledPsf>; sourceSamples: readonly SensorPsfSourceSample[] }[];\n}\n\n/**\n * Applies each resolved unit-energy PSF as an inverse sum of samples around\n * each destination pixel.\n *\n * Support in native coordinates (+Y down) is converted explicitly to the\n * optical kernel orientation (+Y up). The edges are not extended, missing\n * support is not renormalized and no extra throughput is applied. This\n * approximation is not a field-dependent forward transport of energy.\n */\nexport function calculateSensorPsfIrradianceQuadrature(\n input: CalculateSensorPsfIrradianceQuadratureInput\n): CalculationResult<SensorPsfIrradianceQuadrature> {\n requireInputKeys(input, \"calculateSensorPsfIrradianceQuadrature\", [\"timeSecondsFromOpeningReference\", \"spatialQuadrature\", \"spectralQuadrature\", \"psf\", \"psfWavelengthBasis\", \"spatialModel\", \"inputMeaning\", \"samples\"]);\n if (!Number.isFinite(input.timeSecondsFromOpeningReference) || input.timeSecondsFromOpeningReference < 0) {\n throw new InvalidScientificInputError(\"PSF source time must be finite and nonnegative.\");\n }\n if (input.inputMeaning !== \"pre-psf-pre-sensor-stack-pre-aa-spectral-irradiance\" ||\n input.spatialModel?.kind !== \"destination-local-shift-invariant-approximation\" ||\n typeof input.spatialModel.limitation !== \"string\" || !input.spatialModel.limitation.trim()) {\n throw new InvalidScientificInputError(\"PSF execution requires explicit pre-PSF light and a limited local shift-invariant approximation.\");\n }\n if ((input.psfWavelengthBasis?.value !== \"air\" && input.psfWavelengthBasis?.value !== \"vacuum\") ||\n input.psfWavelengthBasis.value !== input.spectralQuadrature.wavelengthBasis) {\n throw new InvalidScientificInputError(\"PSF wavelength basis must explicitly match the spectral plan.\");\n }\n const spatialModelEvidence = parseEvidenceList(input.spatialModel.evidence, \"psfSpatialModel.evidence\");\n const wavelengthBasisEvidence = parseEvidenceList(input.psfWavelengthBasis.evidence, \"psfWavelengthBasis.evidence\");\n const bound = bindSensorSpatioSpectralSamples({ ...input, sampleValues: input.samples }, s => s);\n let count = 0;\n for (const sample of input.samples) {\n if (!Array.isArray(sample.sourceSamples)) throw new InvalidScientificInputError(\"PSF source samples must be a dense array.\");\n count += sample.sourceSamples.length;\n if (count > 100000) throw new InvalidScientificInputError(\"PSF support exceeds the 100000-source-node budget.\");\n }\n const samples: SensorPsfIrradianceQuadrature[\"samples\"][number][] = [];\n const irradianceSamples: ReduceSensorSpatioSpectralIrradianceInput[\"sampleValues\"][number][] = [];\n for (const spectral of input.spectralQuadrature.nodes) {\n for (const spatial of input.spatialQuadrature.nodes) {\n const spatialNode = { antiAliasingComponentIndex: spatial.antiAliasingComponentIndex,\n apertureSampleXIndex: spatial.apertureSampleXIndex, apertureSampleYIndex: spatial.apertureSampleYIndex };\n const node = { spatialNode, spectralSampleIndex: spectral.spectralSampleIndex, wavelengthNanometers: spectral.wavelengthNanometers };\n const declared = bound.valuesByKey.get(sensorSpatialQuadratureNodeIdentityKey(spatialNode) + \"|\" + spectral.spectralSampleIndex)!;\n const destination = spatial.preAntiAliasingSourcePointMm;\n const psf = resolveLensSampledPsf({ ...input.psf, wavelengthNm: spectral.wavelengthNanometers,\n fieldPointMm: { x: destination.x, y: -destination.y } });\n const kernel = psf.value.kernel;\n if (declared.sourceSamples.length !== kernel.widthSamples * kernel.heightSamples) {\n throw new InvalidScientificInputError(\"PSF source coverage must include every kernel tap without renormalization.\");\n }\n const byIndex = new Map<number, SensorPsfSourceSample>();\n for (const source of declared.sourceSamples) {\n if (!source || source.timeSecondsFromOpeningReference !== input.timeSecondsFromOpeningReference ||\n !Number.isSafeInteger(source.kernelSampleX) || !Number.isSafeInteger(source.kernelSampleY) ||\n source.kernelSampleX < 0 || source.kernelSampleX >= kernel.widthSamples ||\n source.kernelSampleY < 0 || source.kernelSampleY >= kernel.heightSamples ||\n !Number.isFinite(source.spectralIrradianceWattsPerSquareMeterPerNanometer) || source.spectralIrradianceWattsPerSquareMeterPerNanometer < 0) {\n throw new InvalidScientificInputError(\"PSF support requires valid unique tap indices and finite nonnegative irradiance.\");\n }\n const index = source.kernelSampleY * kernel.widthSamples + source.kernelSampleX;\n const { x, y } = sensorPsfSourcePoint(destination, kernel, source.kernelSampleX, source.kernelSampleY);\n if (byIndex.has(index) || source.sourcePointNativeSensorMm?.x !== x || source.sourcePointNativeSensorMm?.y !== y) {\n throw new InvalidScientificInputError(\"PSF source coordinate must match the exact inverse kernel offset in native sensor axes.\");\n }\n byIndex.set(index, { ...source, sourcePointNativeSensorMm: { x, y } });\n }\n const sourceSamples = Array.from({ length: declared.sourceSamples.length }, (_, i) => byIndex.get(i)!);\n const irradiance = sourceSamples.reduce((sum, s, i) => sum + kernel.normalizedIntensity[i]! * s.spectralIrradianceWattsPerSquareMeterPerNanometer, 0);\n if (!Number.isFinite(irradiance)) throw new InvalidScientificResultError(\"PSF weighted irradiance must remain finite.\");\n samples.push({ node, psf, sourceSamples });\n irradianceSamples.push({ node, spectralIrradianceWattsPerSquareMeterPerNanometer: irradiance });\n }\n }\n const reduction = reduceSensorSpatioSpectralIrradiance({ spatialQuadrature: input.spatialQuadrature,\n spectralQuadrature: input.spectralQuadrature, sampleValues: irradianceSamples });\n return approximationResult({ timeSecondsFromOpeningReference: input.timeSecondsFromOpeningReference,\n wavelengthBasis: input.psfWavelengthBasis.value,\n sourcePlane: \"sensor-package-incident\", outputMeaning: \"post-psf-pre-sensor-stack-pre-aa-irradiance-quadrature\",\n psfRedistributionApplied: true, localShiftInvarianceEstablished: false, globalFieldEnergyConservationEstablished: false,\n pupilThroughputApplied: false, sceneProviderExecutionVerified: false, spatialModelEvidence, wavelengthBasisEvidence,\n spatialModelLimitation: input.spatialModel.limitation, samples, irradianceSamples, reduction\n }, \"sensor-local-psf-irradiance-quadrature\", \"0.1.0\", [\n \"Destination-local shift invariance is a declared approximation, not a proof of full field-dependent energy transport.\",\n \"Normalized PSF shape is applied once; separate pupil throughput and source transport remain upstream responsibilities.\",\n \"Complete finite-kernel support does not establish infinite-support convergence or calibrated photographic accuracy.\"\n ]);\n}\n"]}
@@ -1,10 +1,13 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Shared inverse PSF support in native +Y-down coordinates; kernel +Y is up.
4
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
5
- * limits.
2
+ * Shared inverse support for a PSF (point-spread function). Support offsets use native sensor
3
+ * coordinates, where +Y is down; the PSF kernel itself uses +Y up.
4
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
5
+ * and support limits.
6
+ */
7
+ /**
8
+ * Shared inverse support for a PSF (point-spread function), in native sensor coordinates (+Y down).
9
+ * The PSF kernel itself uses +Y up.
6
10
  */
7
- /** Shared inverse PSF support in native +Y-down coordinates; kernel +Y is up. */
8
11
  export declare function sensorPsfSourcePoint(destination: {
9
12
  x: number;
10
13
  y: number;
@@ -17,4 +20,3 @@ export declare function sensorPsfSourcePoint(destination: {
17
20
  x: number;
18
21
  y: number;
19
22
  };
20
- //# sourceMappingURL=sensor-psf-support.d.ts.map
@@ -1,11 +1,14 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Shared inverse PSF support in native +Y-down coordinates; kernel +Y is up.
5
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
6
- * limits.
3
+ * Shared inverse support for a PSF (point-spread function). Support offsets use native sensor
4
+ * coordinates, where +Y is down; the PSF kernel itself uses +Y up.
5
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
6
+ * and support limits.
7
+ */
8
+ /**
9
+ * Shared inverse support for a PSF (point-spread function), in native sensor coordinates (+Y down).
10
+ * The PSF kernel itself uses +Y up.
7
11
  */
8
- /** Shared inverse PSF support in native +Y-down coordinates; kernel +Y is up. */
9
12
  export function sensorPsfSourcePoint(destination, kernel, kernelSampleX, kernelSampleY) {
10
13
  return { x: destination.x - (kernelSampleX - kernel.centerSampleX) * kernel.samplePitchMicrometersX / 1000,
11
14
  y: destination.y + (kernelSampleY - kernel.centerSampleY) * kernel.samplePitchMicrometersY / 1000 };
@@ -1 +1 @@
1
- {"version":3,"file":"sensor-psf-support.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AAEH,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,WAAqC,EAAE,MAE3E,EAAE,aAAqB,EAAE,aAAqB;IAC7C,OAAO,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,GAAC,MAAM,CAAC,aAAa,CAAC,GAAC,MAAM,CAAC,uBAAuB,GAAC,IAAI;QAClG,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,GAAC,MAAM,CAAC,aAAa,CAAC,GAAC,MAAM,CAAC,uBAAuB,GAAC,IAAI,EAAE,CAAC;AAClG,CAAC"}
1
+ {"version":3,"file":"sensor-psf-support.js","sourceRoot":"","sources":["../../src/optics/sensor-psf-support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,WAAqC,EAAE,MAE3E,EAAE,aAAqB,EAAE,aAAqB;IAC7C,OAAO,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,GAAC,MAAM,CAAC,aAAa,CAAC,GAAC,MAAM,CAAC,uBAAuB,GAAC,IAAI;QAClG,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,aAAa,GAAC,MAAM,CAAC,aAAa,CAAC,GAAC,MAAM,CAAC,uBAAuB,GAAC,IAAI,EAAE,CAAC;AAClG,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Shared inverse support for a PSF (point-spread function). Support offsets use native sensor\n * coordinates, where +Y is down; the PSF kernel itself uses +Y up.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\n/**\n * Shared inverse support for a PSF (point-spread function), in native sensor coordinates (+Y down).\n * The PSF kernel itself uses +Y up.\n */\nexport function sensorPsfSourcePoint(destination: { x: number; y: number }, kernel: {\n centerSampleX: number; centerSampleY: number; samplePitchMicrometersX: number; samplePitchMicrometersY: number;\n}, kernelSampleX: number, kernelSampleY: number): { x: number; y: number } {\n return { x: destination.x - (kernelSampleX-kernel.centerSampleX)*kernel.samplePitchMicrometersX/1000,\n y: destination.y + (kernelSampleY-kernel.centerSampleY)*kernel.samplePitchMicrometersY/1000 };\n}\n"]}
@@ -1,17 +1,20 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Strict generic profile parser; bounds passivity across the whole angular envelope.
4
- * Adds off-path spectral irradiance before sensor/exposure integration, never after tone mapping.
5
- * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant/wavelength.
6
- * Gaussian templates are independently parameterized approximations, not lens prescription ray
7
- * tracing.
8
- * @see docs/DIGITAL_OPTICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and
9
- * support limits.
2
+ * Stray light (flare and veiling glare) from bright sources.
3
+ *
4
+ * The profile parser is strict. It checks that the profile stays passive (adds no energy) across the
5
+ * whole range of source angles.
6
+ *
7
+ * The model adds off-path spectral irradiance before the sensor integrates the exposure. It never
8
+ * adds it after tone mapping. Source powers are integrated over profile.referenceEntranceAreaMm2 at
9
+ * one instant and one wavelength. The Gaussian templates are independently parameterized
10
+ * approximations, not ray tracing through a lens prescription.
11
+ * @see docs/DIGITAL_OPTICS_FOUNDATION.md for the equations, units, coordinate conventions, known
12
+ * blockers and support limits.
10
13
  */
11
14
  import { type CalculationResult } from "../core/calculation-result.js";
12
15
  import { type GenericOpticalEvidence, type OpticalProfileState } from "./profile-contract.js";
13
16
  import type { LensFieldPointMm } from "./radial-distortion.js";
14
- /** One reflected-path or broad scatter response, normalized over the infinite image plane. */
17
+ /** One ghost (reflection path) or veil (broad scatter) response. Its shape is normalized over the infinite image plane. */
15
18
  export interface ParametricStrayLightResponse {
16
19
  id: string;
17
20
  kind: "ghost" | "veil";
@@ -21,10 +24,10 @@ export interface ParametricStrayLightResponse {
21
24
  sigmaMm: number;
22
25
  /** Fraction of source power entering this response at the axis. */
23
26
  axisPowerFraction: number;
24
- /** F(rho)=F(0)*(1+slope*rho²), rho=source angle/max angle. */
27
+ /** Power fraction versus angle: F(rho) = F(0) * (1 + slope * rho²), where rho = source angle / maximum angle. */
25
28
  angularSlope: number;
26
29
  }
27
- /** Single explicit wavelength and exact generic camera state; clean optics only. */
30
+ /** One explicit wavelength and an exact generic camera state. Models clean optics only. */
28
31
  export interface LensStrayLightProfile {
29
32
  schemaVersion: "0.1.0";
30
33
  id: string;
@@ -39,13 +42,13 @@ export interface LensStrayLightProfile {
39
42
  referenceEntranceAreaMm2: number;
40
43
  responses: readonly ParametricStrayLightResponse[];
41
44
  }
42
- /** Direction remains available beyond the active frame; no crop clipping. */
45
+ /** The direction can lie outside the active frame. It is not clipped to the crop. */
43
46
  export interface StrayLightSource {
44
47
  id: string;
45
48
  fieldAngleXDegrees: number;
46
49
  fieldAngleYDegrees: number;
47
50
  incidentSpectralPowerWPerNm: number;
48
- /** Explicit source/path admission, e.g. a flag/hood decision; not a global hood scalar. */
51
+ /** Fraction of this source let in, for example after a flag or hood decision. Not a global hood factor. */
49
52
  admittedFraction: number;
50
53
  }
51
54
  export interface StrayLightIrradiance {
@@ -60,7 +63,7 @@ export interface StrayLightIrradiance {
60
63
  ghostSpectralIrradianceWPerM2PerNm: number;
61
64
  veilSpectralIrradianceWPerM2PerNm: number;
62
65
  totalSpectralIrradianceWPerM2PerNm: number;
63
- /** If primary-only, the meter excludes these additions; sensor always receives total. */
66
+ /** If primary-only, the meter leaves these additions out. The sensor always receives the total. */
64
67
  meterDomain: "primary-only" | "primary-plus-stray";
65
68
  meterSpectralIrradianceWPerM2PerNm: number;
66
69
  contributions: readonly {
@@ -70,11 +73,12 @@ export interface StrayLightIrradiance {
70
73
  spectralIrradianceWPerM2PerNm: number;
71
74
  }[];
72
75
  }
73
- /** Strict generic profile parser; bounds passivity across the whole angular envelope. */
76
+ /** Strict generic profile parser. Checks that the profile adds no energy at any source angle in its range. */
74
77
  export declare function parseLensStrayLightProfile(value: unknown): LensStrayLightProfile;
75
- /** Adds off-path spectral irradiance before sensor/exposure integration, never after tone mapping.
76
- * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant/wavelength.
77
- * Gaussian templates are independently parameterized approximations, not lens prescription ray tracing.
78
+ /** Adds off-path spectral irradiance before the sensor integrates the exposure, never after tone mapping.
79
+ * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant and wavelength.
80
+ * The Gaussian templates are independently parameterized approximations, not ray tracing through a
81
+ * lens prescription.
78
82
  */
79
83
  export declare function calculateLensStrayLightIrradiance(input: {
80
84
  profile: LensStrayLightProfile;
@@ -88,4 +92,3 @@ export declare function calculateLensStrayLightIrradiance(input: {
88
92
  sources: readonly StrayLightSource[];
89
93
  meterDomain: "primary-only" | "primary-plus-stray";
90
94
  }): CalculationResult<StrayLightIrradiance>;
91
- //# sourceMappingURL=stray-light.d.ts.map
@@ -1,17 +1,21 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Strict generic profile parser; bounds passivity across the whole angular envelope.
5
- * Adds off-path spectral irradiance before sensor/exposure integration, never after tone mapping.
6
- * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant/wavelength.
7
- * Gaussian templates are independently parameterized approximations, not lens prescription ray
8
- * tracing.
9
- * @see docs/DIGITAL_OPTICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and
10
- * support limits.
3
+ * Stray light (flare and veiling glare) from bright sources.
4
+ *
5
+ * The profile parser is strict. It checks that the profile stays passive (adds no energy) across the
6
+ * whole range of source angles.
7
+ *
8
+ * The model adds off-path spectral irradiance before the sensor integrates the exposure. It never
9
+ * adds it after tone mapping. Source powers are integrated over profile.referenceEntranceAreaMm2 at
10
+ * one instant and one wavelength. The Gaussian templates are independently parameterized
11
+ * approximations, not ray tracing through a lens prescription.
12
+ * @see docs/DIGITAL_OPTICS_FOUNDATION.md for the equations, units, coordinate conventions, known
13
+ * blockers and support limits.
11
14
  */
12
15
  import { approximationResult } from "../core/calculation-result.js";
13
16
  import { InvalidScientificInputError } from "../core/validation.js";
14
17
  import { choice, finite, list, parseEvidence, parseOpticalProfileState, positive, record, requireSameState, textValue } from "./profile-contract.js";
18
+ import { requireInputKeys } from "../core/record-validation.js";
15
19
  function fraction(value, name) {
16
20
  const n = finite(value, name);
17
21
  if (n < 0 || n > 1)
@@ -22,7 +26,7 @@ function point(value) {
22
26
  const p = record(value, ["x", "y"]);
23
27
  return { x: finite(p.x, "x"), y: finite(p.y, "y") };
24
28
  }
25
- /** Strict generic profile parser; bounds passivity across the whole angular envelope. */
29
+ /** Strict generic profile parser. Checks that the profile adds no energy at any source angle in its range. */
26
30
  export function parseLensStrayLightProfile(value) {
27
31
  const r = record(value, ["schemaVersion", "id", "version", "state", "evidence", "interaction",
28
32
  "wavelengthNm", "wavelengthBasis", "maximumSourceAngleDegrees", "referenceEntranceAreaMm2", "responses"]);
@@ -52,11 +56,13 @@ export function parseLensStrayLightProfile(value) {
52
56
  wavelengthNm: positive(r.wavelengthNm, "wavelengthNm"), wavelengthBasis: choice(r.wavelengthBasis, ["air", "vacuum"]),
53
57
  maximumSourceAngleDegrees: maximum, referenceEntranceAreaMm2: positive(r.referenceEntranceAreaMm2, "referenceEntranceAreaMm2"), responses };
54
58
  }
55
- /** Adds off-path spectral irradiance before sensor/exposure integration, never after tone mapping.
56
- * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant/wavelength.
57
- * Gaussian templates are independently parameterized approximations, not lens prescription ray tracing.
59
+ /** Adds off-path spectral irradiance before the sensor integrates the exposure, never after tone mapping.
60
+ * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant and wavelength.
61
+ * The Gaussian templates are independently parameterized approximations, not ray tracing through a
62
+ * lens prescription.
58
63
  */
59
64
  export function calculateLensStrayLightIrradiance(input) {
65
+ requireInputKeys(input, "calculateLensStrayLightIrradiance", ["profile", "state", "enabled", "imagePointMm", "wavelengthNm", "wavelengthBasis", "timeSeconds", "primarySpectralIrradianceWPerM2PerNm", "sources", "meterDomain"]);
60
66
  const profile = parseLensStrayLightProfile(input.profile);
61
67
  requireSameState(profile.state, input.state);
62
68
  const p = point(input.imagePointMm), time = finite(input.timeSeconds, "timeSeconds");
@@ -1 +1 @@
1
- {"version":3,"file":"stray-light.js","sourceRoot":"","sources":["../../src/optics/stray-light.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;;GASG;AAEH,OAAO,EAAE,mBAAmB,EAA0B,MAAM,+BAA+B,CAAC;AAC5F,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EACL,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAC/E,gBAAgB,EAAE,SAAS,EAC5B,MAAM,uBAAuB,CAAC;AAyD/B,SAAS,QAAQ,CAAC,KAAc,EAAE,IAAY;IAC5C,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,2BAA2B,CAAC,GAAG,IAAI,qBAAqB,CAAC,CAAC;IACxF,OAAO,CAAC,CAAC;AACX,CAAC;AACD,SAAS,KAAK,CAAC,KAAc;IAC3B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IAAC,OAAO,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC3F,CAAC;AACD,yFAAyF;AACzF,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,aAAa;QAC3F,cAAc,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,0BAA0B,EAAE,WAAW,CAAC,CAAC,CAAC;IAC5G,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAgC,EAAE;QAClF,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,UAAU,EAAE,SAAS,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3H,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAAC,CAAC;QAC5F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,2BAA2B,CAAC,wCAAwC,CAAC,CAAC;QACzG,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;QACrD,IAAI,KAAK,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,2BAA2B,CAAC,uCAAuC,CAAC,CAAC;QAC/F,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACnE,mBAAmB,EAAE,MAA0C,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC5F,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,CAAC,CAAC,iBAAiB,EAAE,mBAAmB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;IAC1I,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;QAC7D,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC;QAC5D,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAC,CAAC,CAAC,iBAAiB,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACpF,MAAM,IAAI,2BAA2B,CAAC,kDAAkD,CAAC,CAAC;IAC5F,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,yBAAyB,EAAE,2BAA2B,CAAC,CAAC;IACnF,IAAI,OAAO,IAAI,EAAE;QAAE,MAAM,IAAI,2BAA2B,CAAC,iDAAiD,CAAC,CAAC;IAC5G,OAAO,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5G,KAAK,EAAE,wBAAwB,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC7E,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;QACnF,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACrH,yBAAyB,EAAE,OAAO,EAAE,wBAAwB,EAAE,QAAQ,CAAC,CAAC,CAAC,wBAAwB,EAAE,0BAA0B,CAAC,EAAE,SAAS,EAAE,CAAC;AAChJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iCAAiC,CAAC,KAKjD;IACC,MAAM,OAAO,GAAG,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1D,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,oCAAoC,EAAE,oBAAoB,CAAC,CAAC;IACzF,IAAI,IAAI,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,IAAI,2BAA2B,CAAC,oDAAoD,CAAC,CAAC;IAC/J,IAAI,KAAK,CAAC,YAAY,KAAK,OAAO,CAAC,YAAY,IAAI,KAAK,CAAC,eAAe,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC;QACrG,MAAM,IAAI,2BAA2B,CAAC,8DAA8D,CAAC,CAAC;IACxG,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC,CAAC;IAChF,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAoB,EAAE;QACvE,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAC/H,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC;QAC7G,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,2BAA2B,EAAE,cAAc,CAAC,CAAC;QACpE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,yBAAyB,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,2BAA2B,CAAC,kDAAkD,CAAC,CAAC;QACjK,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,EAAE,CAAC;YACxE,2BAA2B,EAAE,KAAK,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,EAAE,CAAC;IAC7G,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,2BAA2B,CAAC,uBAAuB,CAAC,CAAC;IAC9H,MAAM,aAAa,GAAoD,EAAE,CAAC;IAC1E,IAAI,KAAK,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC;IACxB,IAAI,KAAK,CAAC,OAAO;QAAE,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAC9E,MAAM,CAAC,GAAG,CAAC,CAAC,mBAAmB,CAAC;gBAChC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,kBAAkB,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,kBAAkB,GAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAClF,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,kBAAkB,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,kBAAkB,GAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBACxE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,kBAAkB,CAAC,GAAC,OAAO,CAAC,yBAAyB,CAAC;gBACrG,MAAM,QAAQ,GAAG,CAAC,CAAC,iBAAiB,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,YAAY,GAAC,GAAG,GAAC,GAAG,CAAC,CAAC;gBAChE,oEAAoE;gBACpE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,CAAC,CAAC,IAAE,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,CAAC,CAAC,IAAE,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,CAAC,CAAC,OAAO,IAAE,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,GAAC,IAAI,CAAC,EAAE,GAAC,CAAC,CAAC,OAAO,IAAE,CAAC,CAAC,GAAC,GAAG,CAAC;gBACpH,MAAM,UAAU,GAAG,CAAC,CAAC,2BAA2B,GAAC,CAAC,CAAC,gBAAgB,GAAC,QAAQ,GAAC,YAAY,CAAC;gBAC1F,aAAa,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,6BAA6B,EAAE,UAAU,EAAE,CAAC,CAAC;gBAClH,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO;oBAAE,KAAK,IAAI,UAAU,CAAC;;oBAAM,IAAI,IAAI,UAAU,CAAC;YACvE,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,GAAC,KAAK,GAAC,IAAI,CAAC;IACjC,OAAO,mBAAmB,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,cAAc,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW;QACnH,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe;QAC7F,WAAW,EAAE,IAAI,EAAE,oCAAoC,EAAE,OAAO,EAAE,kCAAkC,EAAE,KAAK;QAC3G,iCAAiC,EAAE,IAAI,EAAE,kCAAkC,EAAE,KAAK;QAClF,WAAW,EAAE,KAAK,EAAE,kCAAkC,EAAE,KAAK,KAAK,cAAc,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,aAAa,EAAE,EACrH,mCAAmC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY;QAClG,kFAAkF;QAClF,8FAA8F;QAC9F,kFAAkF,CAAC,CAAC,CAAC;AACzF,CAAC"}
1
+ {"version":3,"file":"stray-light.js","sourceRoot":"","sources":["../../src/optics/stray-light.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Stray light (flare and veiling glare) from bright sources.\n *\n * The profile parser is strict. It checks that the profile stays passive (adds no energy) across the\n * whole range of source angles.\n *\n * The model adds off-path spectral irradiance before the sensor integrates the exposure. It never\n * adds it after tone mapping. Source powers are integrated over profile.referenceEntranceAreaMm2 at\n * one instant and one wavelength. The Gaussian templates are independently parameterized\n * approximations, not ray tracing through a lens prescription.\n * @see docs/DIGITAL_OPTICS_FOUNDATION.md for the equations, units, coordinate conventions, known\n * blockers and support limits.\n */\n\nimport { approximationResult, type CalculationResult } from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n choice, finite, list, parseEvidence, parseOpticalProfileState, positive, record,\n requireSameState, textValue, type GenericOpticalEvidence, type OpticalProfileState\n} from \"./profile-contract.js\";\nimport type { LensFieldPointMm } from \"./radial-distortion.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\n/** One ghost (reflection path) or veil (broad scatter) response. Its shape is normalized over the infinite image plane. */\nexport interface ParametricStrayLightResponse {\n id: string;\n kind: \"ghost\" | \"veil\";\n /** Centroid response in mm per degree of the two declared source field angles. */\n centroidMmPerDegree: readonly [number, number, number, number];\n offsetMm: LensFieldPointMm;\n sigmaMm: number;\n /** Fraction of source power entering this response at the axis. */\n axisPowerFraction: number;\n /** Power fraction versus angle: F(rho) = F(0) * (1 + slope * rho²), where rho = source angle / maximum angle. */\n angularSlope: number;\n}\n/** One explicit wavelength and an exact generic camera state. Models clean optics only. */\nexport interface LensStrayLightProfile {\n schemaVersion: \"0.1.0\";\n id: string;\n version: string;\n state: OpticalProfileState;\n evidence: GenericOpticalEvidence;\n interaction: \"lens-reflections\" | \"sensor-lens-reflections\";\n wavelengthNm: number;\n wavelengthBasis: \"air\" | \"vacuum\";\n maximumSourceAngleDegrees: number;\n /** Area over which the caller's incident source power was integrated. */\n referenceEntranceAreaMm2: number;\n responses: readonly ParametricStrayLightResponse[];\n}\n/** The direction can lie outside the active frame. It is not clipped to the crop. */\nexport interface StrayLightSource {\n id: string;\n fieldAngleXDegrees: number;\n fieldAngleYDegrees: number;\n incidentSpectralPowerWPerNm: number;\n /** Fraction of this source let in, for example after a flag or hood decision. Not a global hood factor. */\n admittedFraction: number;\n}\nexport interface StrayLightIrradiance {\n profileId: string;\n profileVersion: string;\n interaction: LensStrayLightProfile[\"interaction\"];\n imagePointMm: LensFieldPointMm;\n wavelengthNm: number;\n wavelengthBasis: \"air\" | \"vacuum\";\n timeSeconds: number;\n primarySpectralIrradianceWPerM2PerNm: number;\n ghostSpectralIrradianceWPerM2PerNm: number;\n veilSpectralIrradianceWPerM2PerNm: number;\n totalSpectralIrradianceWPerM2PerNm: number;\n /** If primary-only, the meter leaves these additions out. The sensor always receives the total. */\n meterDomain: \"primary-only\" | \"primary-plus-stray\";\n meterSpectralIrradianceWPerM2PerNm: number;\n contributions: readonly { sourceId: string; responseId: string; kind: \"ghost\" | \"veil\"; spectralIrradianceWPerM2PerNm: number }[];\n}\nfunction fraction(value: unknown, name: string): number {\n const n = finite(value, name);\n if (n < 0 || n > 1) throw new InvalidScientificInputError(`${name} must lie in [0,1].`);\n return n;\n}\nfunction point(value: unknown): LensFieldPointMm {\n const p = record(value, [\"x\", \"y\"]); return { x: finite(p.x, \"x\"), y: finite(p.y, \"y\") };\n}\n/** Strict generic profile parser. Checks that the profile adds no energy at any source angle in its range. */\nexport function parseLensStrayLightProfile(value: unknown): LensStrayLightProfile {\n const r = record(value, [\"schemaVersion\", \"id\", \"version\", \"state\", \"evidence\", \"interaction\",\n \"wavelengthNm\", \"wavelengthBasis\", \"maximumSourceAngleDegrees\", \"referenceEntranceAreaMm2\", \"responses\"]);\n const responses = list(r.responses, 32).map((value): ParametricStrayLightResponse => {\n const s = record(value, [\"id\", \"kind\", \"centroidMmPerDegree\", \"offsetMm\", \"sigmaMm\", \"axisPowerFraction\", \"angularSlope\"]);\n const matrix = list(s.centroidMmPerDegree, 4).map((v) => finite(v, \"centroid coefficient\"));\n if (matrix.length !== 4) throw new InvalidScientificInputError(\"Centroid matrix requires four entries.\");\n const slope = finite(s.angularSlope, \"angularSlope\");\n if (slope < -1) throw new InvalidScientificInputError(\"Angular response must be nonnegative.\");\n return { id: textValue(s.id), kind: choice(s.kind, [\"ghost\", \"veil\"]),\n centroidMmPerDegree: matrix as [number, number, number, number], offsetMm: point(s.offsetMm),\n sigmaMm: positive(s.sigmaMm, \"sigmaMm\"), axisPowerFraction: fraction(s.axisPowerFraction, \"axisPowerFraction\"), angularSlope: slope };\n });\n if (new Set(responses.map((s) => s.id)).size !== responses.length ||\n responses.reduce((sum, s) => sum+s.axisPowerFraction, 0) > 1 ||\n responses.reduce((sum, s) => sum+s.axisPowerFraction*(1+s.angularSlope), 0) > 1) {\n throw new InvalidScientificInputError(\"Duplicate response or nonpassive total response.\");\n }\n const maximum = positive(r.maximumSourceAngleDegrees, \"maximumSourceAngleDegrees\");\n if (maximum >= 90) throw new InvalidScientificInputError(\"Source angular domain must be below 90 degrees.\");\n return { schemaVersion: choice(r.schemaVersion, [\"0.1.0\"]), id: textValue(r.id), version: textValue(r.version),\n state: parseOpticalProfileState(r.state), evidence: parseEvidence(r.evidence),\n interaction: choice(r.interaction, [\"lens-reflections\", \"sensor-lens-reflections\"]),\n wavelengthNm: positive(r.wavelengthNm, \"wavelengthNm\"), wavelengthBasis: choice(r.wavelengthBasis, [\"air\", \"vacuum\"]),\n maximumSourceAngleDegrees: maximum, referenceEntranceAreaMm2: positive(r.referenceEntranceAreaMm2, \"referenceEntranceAreaMm2\"), responses };\n}\n\n/** Adds off-path spectral irradiance before the sensor integrates the exposure, never after tone mapping.\n * Source powers are integrated over profile.referenceEntranceAreaMm2 at this instant and wavelength.\n * The Gaussian templates are independently parameterized approximations, not ray tracing through a\n * lens prescription.\n */\nexport function calculateLensStrayLightIrradiance(input: {\n profile: LensStrayLightProfile; state: OpticalProfileState; enabled: boolean;\n imagePointMm: LensFieldPointMm; wavelengthNm: number; wavelengthBasis: \"air\" | \"vacuum\";\n timeSeconds: number; primarySpectralIrradianceWPerM2PerNm: number;\n sources: readonly StrayLightSource[]; meterDomain: \"primary-only\" | \"primary-plus-stray\";\n}): CalculationResult<StrayLightIrradiance> {\n requireInputKeys(input, \"calculateLensStrayLightIrradiance\", [\"profile\", \"state\", \"enabled\", \"imagePointMm\", \"wavelengthNm\", \"wavelengthBasis\", \"timeSeconds\", \"primarySpectralIrradianceWPerM2PerNm\", \"sources\", \"meterDomain\"]);\n const profile = parseLensStrayLightProfile(input.profile);\n requireSameState(profile.state, input.state);\n const p = point(input.imagePointMm), time = finite(input.timeSeconds, \"timeSeconds\");\n const primary = finite(input.primarySpectralIrradianceWPerM2PerNm, \"primary irradiance\");\n if (time < 0 || primary < 0 || typeof input.enabled !== \"boolean\") throw new InvalidScientificInputError(\"Invalid time, primary irradiance or enabled state.\");\n if (input.wavelengthNm !== profile.wavelengthNm || input.wavelengthBasis !== profile.wavelengthBasis) {\n throw new InvalidScientificInputError(\"Wavelength/basis mismatch; select an explicit profile slice.\");\n }\n const meter = choice(input.meterDomain, [\"primary-only\", \"primary-plus-stray\"]);\n const sources = list(input.sources, 128).map((value): StrayLightSource => {\n const s = record(value, [\"id\", \"fieldAngleXDegrees\", \"fieldAngleYDegrees\", \"incidentSpectralPowerWPerNm\", \"admittedFraction\"]);\n const x = finite(s.fieldAngleXDegrees, \"source angle X\"), y = finite(s.fieldAngleYDegrees, \"source angle Y\");\n const power = finite(s.incidentSpectralPowerWPerNm, \"source power\");\n if (Math.hypot(x, y) > profile.maximumSourceAngleDegrees || power < 0) throw new InvalidScientificInputError(\"Source outside profile domain or negative power.\");\n return { id: textValue(s.id), fieldAngleXDegrees: x, fieldAngleYDegrees: y,\n incidentSpectralPowerWPerNm: power, admittedFraction: fraction(s.admittedFraction, \"admittedFraction\") };\n });\n if (new Set(sources.map((s) => s.id)).size !== sources.length) throw new InvalidScientificInputError(\"Duplicate source IDs.\");\n const contributions: StrayLightIrradiance[\"contributions\"][number][] = [];\n let ghost = 0, veil = 0;\n if (input.enabled) for (const s of sources) for (const r of profile.responses) {\n const m = r.centroidMmPerDegree;\n const center = { x: m[0]*s.fieldAngleXDegrees+m[1]*s.fieldAngleYDegrees+r.offsetMm.x,\n y: m[2]*s.fieldAngleXDegrees+m[3]*s.fieldAngleYDegrees+r.offsetMm.y };\n const rho = Math.hypot(s.fieldAngleXDegrees, s.fieldAngleYDegrees)/profile.maximumSourceAngleDegrees;\n const response = r.axisPowerFraction*(1+r.angularSlope*rho*rho);\n // Infinite-plane unit-integral density in 1/mm², converted to 1/m².\n const densityPerM2 = Math.exp(-((p.x-center.x)**2+(p.y-center.y)**2)/(2*r.sigmaMm**2))/(2*Math.PI*r.sigmaMm**2)*1e6;\n const irradiance = s.incidentSpectralPowerWPerNm*s.admittedFraction*response*densityPerM2;\n contributions.push({ sourceId: s.id, responseId: r.id, kind: r.kind, spectralIrradianceWPerM2PerNm: irradiance });\n if (r.kind === \"ghost\") ghost += irradiance; else veil += irradiance;\n }\n const total = primary+ghost+veil;\n return approximationResult({ profileId: profile.id, profileVersion: profile.version, interaction: profile.interaction,\n imagePointMm: p, wavelengthNm: profile.wavelengthNm, wavelengthBasis: profile.wavelengthBasis,\n timeSeconds: time, primarySpectralIrradianceWPerM2PerNm: primary, ghostSpectralIrradianceWPerM2PerNm: ghost,\n veilSpectralIrradianceWPerM2PerNm: veil, totalSpectralIrradianceWPerM2PerNm: total,\n meterDomain: meter, meterSpectralIrradianceWPerM2PerNm: meter === \"primary-only\" ? primary : total, contributions },\n \"parametric-clean-lens-stray-light\", \"0.1.0\", [profile.evidence.basis, profile.evidence.residualNote,\n \"Additive pre-sensor irradiance; exposure, saturation and noise remain downstream\",\n \"No diffraction, primary PSF, contamination, cosmetic sprites or calibrated branded signature\",\n \"One instant and one wavelength slice; no implicit temporal or spectral averaging\"]);\n}\n"]}
@@ -1,10 +1,11 @@
1
1
  /**
2
- * Module boundary and integration notes.
3
- * Calculates Gaussian thin-lens image distance: 1/f = 1/s + 1/v where f is focal length, s is object
4
- * distance, and v is image distance. This is a paraxial ideal-lens model. It does not model real-lens
5
- * focus breathing, pupil magnification, principal-plane movement, or aberrations.
6
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
7
- * limits.
2
+ * Gaussian thin-lens image distance: 1/f = 1/s + 1/v, where f is the focal length, s the object
3
+ * distance and v the image distance.
4
+ *
5
+ * This is a paraxial (small-angle) ideal-lens model. It does not model real-lens focus breathing,
6
+ * pupil magnification, principal-plane movement or aberrations.
7
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
8
+ * and support limits.
8
9
  */
9
10
  import { type CalculationResult } from "../core/calculation-result.js";
10
11
  export interface CalculateThinLensImageDistanceInput {
@@ -31,8 +32,8 @@ export interface ThinLensImageDistance {
31
32
  *
32
33
  * where f is focal length, s is object distance, and v is image distance.
33
34
  *
34
- * This is a paraxial ideal-lens model. It does not model real-lens focus
35
- * breathing, pupil magnification, principal-plane movement, or aberrations.
35
+ * This is a paraxial (small-angle) ideal-lens model. It does not model
36
+ * real-lens focus breathing, pupil magnification, principal-plane movement
37
+ * or aberrations.
36
38
  */
37
39
  export declare function calculateThinLensImageDistance(input: CalculateThinLensImageDistanceInput): CalculationResult<ThinLensImageDistance>;
38
- //# sourceMappingURL=thin-lens.d.ts.map
@@ -1,14 +1,16 @@
1
1
  // SPDX-License-Identifier: Apache-2.0
2
2
  /**
3
- * Module boundary and integration notes.
4
- * Calculates Gaussian thin-lens image distance: 1/f = 1/s + 1/v where f is focal length, s is object
5
- * distance, and v is image distance. This is a paraxial ideal-lens model. It does not model real-lens
6
- * focus breathing, pupil magnification, principal-plane movement, or aberrations.
7
- * @see docs/PHYSICS_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support
8
- * limits.
3
+ * Gaussian thin-lens image distance: 1/f = 1/s + 1/v, where f is the focal length, s the object
4
+ * distance and v the image distance.
5
+ *
6
+ * This is a paraxial (small-angle) ideal-lens model. It does not model real-lens focus breathing,
7
+ * pupil magnification, principal-plane movement or aberrations.
8
+ * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
9
+ * and support limits.
9
10
  */
10
11
  import { calculatedResult } from "../core/calculation-result.js";
11
12
  import { InvalidScientificInputError, requirePositiveFinite } from "../core/validation.js";
13
+ import { requireInputKeys } from "../core/record-validation.js";
12
14
  /**
13
15
  * Calculates Gaussian thin-lens image distance:
14
16
  *
@@ -16,10 +18,12 @@ import { InvalidScientificInputError, requirePositiveFinite } from "../core/vali
16
18
  *
17
19
  * where f is focal length, s is object distance, and v is image distance.
18
20
  *
19
- * This is a paraxial ideal-lens model. It does not model real-lens focus
20
- * breathing, pupil magnification, principal-plane movement, or aberrations.
21
+ * This is a paraxial (small-angle) ideal-lens model. It does not model
22
+ * real-lens focus breathing, pupil magnification, principal-plane movement
23
+ * or aberrations.
21
24
  */
22
25
  export function calculateThinLensImageDistance(input) {
26
+ requireInputKeys(input, "calculateThinLensImageDistance", ["focalLengthMm", "objectDistanceM"]);
23
27
  requirePositiveFinite("focalLengthMm", input.focalLengthMm);
24
28
  requirePositiveFinite("objectDistanceM", input.objectDistanceM);
25
29
  const objectDistanceMm = input.objectDistanceM * 1000;
@@ -1 +1 @@
1
- {"version":3,"file":"thin-lens.js","sourceRoot":"","sources":["../../src/optics/thin-lens.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAqB/B;;;;;;;;;GASG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAA0C;IAE1C,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5D,qBAAqB,CAAC,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAEhE,MAAM,gBAAgB,GAAG,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;IACtD,IAAI,gBAAgB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,IAAI,2BAA2B,CACnC,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GACnB,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAAC;QACxC,CAAC,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IAE3C,OAAO,gBAAgB,CACrB;QACE,eAAe;QACf,aAAa,EAAE,eAAe,GAAG,gBAAgB;QACjD,uBAAuB,EAAE,eAAe,GAAG,KAAK,CAAC,aAAa;KAC/D,EACD,mCAAmC,EACnC,OAAO,EACP;QACE,mCAAmC;QACnC,oDAAoD;QACpD,mEAAmE;KACpE,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"thin-lens.js","sourceRoot":"","sources":["../../src/optics/thin-lens.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC;;;;;;;;GAQG;AAEH,OAAO,EACL,gBAAgB,EAEjB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAqBhE;;;;;;;;;;GAUG;AACH,MAAM,UAAU,8BAA8B,CAC5C,KAA0C;IAE1C,gBAAgB,CAAC,KAAK,EAAE,gCAAgC,EAAE,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAChG,qBAAqB,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC5D,qBAAqB,CAAC,iBAAiB,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC;IAEhE,MAAM,gBAAgB,GAAG,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC;IACtD,IAAI,gBAAgB,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;QAC5C,MAAM,IAAI,2BAA2B,CACnC,sEAAsE,CACvE,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GACnB,CAAC,KAAK,CAAC,aAAa,GAAG,gBAAgB,CAAC;QACxC,CAAC,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IAE3C,OAAO,gBAAgB,CACrB;QACE,eAAe;QACf,aAAa,EAAE,eAAe,GAAG,gBAAgB;QACjD,uBAAuB,EAAE,eAAe,GAAG,KAAK,CAAC,aAAa;KAC/D,EACD,mCAAmC,EACnC,OAAO,EACP;QACE,mCAAmC;QACnC,oDAAoD;QACpD,mEAAmE;KACpE,CACF,CAAC;AACJ,CAAC","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Gaussian thin-lens image distance: 1/f = 1/s + 1/v, where f is the focal length, s the object\n * distance and v the image distance.\n *\n * This is a paraxial (small-angle) ideal-lens model. It does not model real-lens focus breathing,\n * pupil magnification, principal-plane movement or aberrations.\n * @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers\n * and support limits.\n */\n\nimport {\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport {\n InvalidScientificInputError,\n requirePositiveFinite\n} from \"../core/validation.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\n\nexport interface CalculateThinLensImageDistanceInput {\n /** Lens focal length in millimetres. */\n focalLengthMm: number;\n /** Object/focus-plane distance from the lens principal plane in metres. */\n objectDistanceM: number;\n}\n\nexport interface ThinLensImageDistance {\n /** Image/sensor-plane distance from the lens principal plane in millimetres. */\n imageDistanceMm: number;\n /** Absolute paraxial magnification at the supplied object distance. */\n magnification: number;\n /**\n * Image-distance scale relative to the infinity-focus approximation f.\n * Values approach 1 as object distance becomes large.\n */\n infinityProjectionScale: number;\n}\n\n/**\n * Calculates Gaussian thin-lens image distance:\n *\n * 1/f = 1/s + 1/v\n *\n * where f is focal length, s is object distance, and v is image distance.\n *\n * This is a paraxial (small-angle) ideal-lens model. It does not model\n * real-lens focus breathing, pupil magnification, principal-plane movement\n * or aberrations.\n */\nexport function calculateThinLensImageDistance(\n input: CalculateThinLensImageDistanceInput\n): CalculationResult<ThinLensImageDistance> {\n requireInputKeys(input, \"calculateThinLensImageDistance\", [\"focalLengthMm\", \"objectDistanceM\"]);\n requirePositiveFinite(\"focalLengthMm\", input.focalLengthMm);\n requirePositiveFinite(\"objectDistanceM\", input.objectDistanceM);\n\n const objectDistanceMm = input.objectDistanceM * 1000;\n if (objectDistanceMm <= input.focalLengthMm) {\n throw new InvalidScientificInputError(\n \"objectDistanceM must place the object plane beyond the focal length.\"\n );\n }\n\n const imageDistanceMm =\n (input.focalLengthMm * objectDistanceMm) /\n (objectDistanceMm - input.focalLengthMm);\n\n return calculatedResult(\n {\n imageDistanceMm,\n magnification: imageDistanceMm / objectDistanceMm,\n infinityProjectionScale: imageDistanceMm / input.focalLengthMm\n },\n \"gaussian-thin-lens-image-distance\",\n \"1.0.0\",\n [\n \"Paraxial Gaussian thin-lens model\",\n \"Distances are measured from ideal principal planes\",\n \"Real-lens focus breathing and pupil magnification are not modeled\"\n ]\n );\n}\n"]}