@photivra/engine 1.4.0 → 2.0.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.
- package/CHANGELOG.md +401 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +118 -5
- package/dist/capture/native-raw-development.js +224 -59
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +67 -10
- package/dist/capture/native-raw.js +90 -24
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +23 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +284 -0
- package/dist/facade/simulate-capture.js +1026 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +89 -25
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +761 -2
- package/docs/QUICK_START.md +495 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -4
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +23 -8
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2213 -8
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +324 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -12
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* scalar blur radius. Numeric profiles require owned or reusable-data provenance.
|
|
15
|
-
* @see docs/PSF_FOUNDATION.md for equations, coordinate/unit conventions, blockers and support limits.
|
|
3
|
+
* PSF (point-spread function) from a declared complex pupil: amplitude and phase sampled on a grid.
|
|
4
|
+
*
|
|
5
|
+
* The profile parser validates untrusted input and returns the normalized typed contract. Unknown
|
|
6
|
+
* enum values, missing required fields and incompatible scientific data are rejected.
|
|
7
|
+
*
|
|
8
|
+
* The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular
|
|
9
|
+
* pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius
|
|
10
|
+
* cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the
|
|
11
|
+
* profile applies. Numeric profiles need provenance showing the data is owned or reusable.
|
|
12
|
+
* @see docs/PSF_FOUNDATION.md for the equations, units, coordinate conventions, known blockers and
|
|
13
|
+
* support limits.
|
|
16
14
|
*/
|
|
17
15
|
import { approximationResult } from "../core/calculation-result.js";
|
|
18
16
|
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
19
17
|
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
20
18
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
21
19
|
import { parseFocusPlane } from "./focus-state.js";
|
|
20
|
+
import { requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from "../core/record-validation.js";
|
|
22
21
|
export const LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION = "0.1.0";
|
|
23
|
-
function requireRecord(value, path) {
|
|
22
|
+
function requireRecord(value, path, allowedKeys) {
|
|
24
23
|
if (typeof value !== "object" ||
|
|
25
24
|
value === null ||
|
|
26
25
|
Array.isArray(value)) {
|
|
27
26
|
throw new InvalidConfigurationError(path + " must be an object.");
|
|
28
27
|
}
|
|
28
|
+
if (allowedKeys !== null)
|
|
29
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
29
30
|
return value;
|
|
30
31
|
}
|
|
31
32
|
function requireNonEmptyString(value, path) {
|
|
@@ -86,7 +87,8 @@ function parseStatus(value, path) {
|
|
|
86
87
|
return value;
|
|
87
88
|
}
|
|
88
89
|
function parseUncertainty(value, path) {
|
|
89
|
-
const record = requireRecord(value, path);
|
|
90
|
+
const record = requireRecord(value, path, null);
|
|
91
|
+
rejectUnknownVariantFields(record, "kind", UNCERTAINTY_VARIANT_FIELDS, path);
|
|
90
92
|
if (record.kind === "relative") {
|
|
91
93
|
const fraction = requireFinite(record.fraction, path + ".fraction");
|
|
92
94
|
if (fraction < 0) {
|
|
@@ -125,7 +127,7 @@ function parseLimitations(value, path) {
|
|
|
125
127
|
return parsed;
|
|
126
128
|
}
|
|
127
129
|
function parseGrid(value) {
|
|
128
|
-
const record = requireRecord(value, "lensComplexPupil.grid");
|
|
130
|
+
const record = requireRecord(value, "lensComplexPupil.grid", ["widthSamples", "heightSamples", "centerSampleX", "centerSampleY", "relativeAmplitude", "opticalPathDifferenceMicrometers", "pupilSamplePitchMmX", "pupilSamplePitchMmY"]);
|
|
129
131
|
const widthSamples = requirePositiveSafeInteger(record.widthSamples, "lensComplexPupil.grid.widthSamples");
|
|
130
132
|
const heightSamples = requirePositiveSafeInteger(record.heightSamples, "lensComplexPupil.grid.heightSamples");
|
|
131
133
|
const total = widthSamples *
|
|
@@ -179,20 +181,20 @@ function parseGrid(value) {
|
|
|
179
181
|
};
|
|
180
182
|
}
|
|
181
183
|
/**
|
|
182
|
-
*
|
|
183
|
-
* missing required fields and incompatible scientific data
|
|
184
|
+
* Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,
|
|
185
|
+
* missing required fields and incompatible scientific data are rejected here.
|
|
184
186
|
*
|
|
185
|
-
*
|
|
186
|
-
* shape is normalized separately from pupil throughput
|
|
187
|
-
*
|
|
188
|
-
* owned or reusable
|
|
189
|
-
* @param value - unknown.
|
|
190
|
-
* @returns LensComplexPupilProfile.
|
|
187
|
+
* The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular
|
|
188
|
+
* pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius
|
|
189
|
+
* cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the
|
|
190
|
+
* profile applies. Numeric profiles need provenance showing the data is owned or reusable.
|
|
191
|
+
* @param value - unknown. Untrusted input; TypeScript types alone are not validation.
|
|
192
|
+
* @returns LensComplexPupilProfile. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
191
193
|
*
|
|
192
194
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
193
195
|
*/
|
|
194
196
|
export function parseLensComplexPupilProfile(value) {
|
|
195
|
-
const record = requireRecord(value, "lensComplexPupil");
|
|
197
|
+
const record = requireRecord(value, "lensComplexPupil", ["schemaVersion", "opticalDomain", "representation", "pupilCoordinateSystem", "imageFieldAxes", "amplitudeMeaning", "wavefrontMeaning", "throughputOwnership", "kernelEnergyNormalization", "propagationModel", "sensorOpticalStackIncluded", "sensorSamplingIncluded", "reconstructionIncluded", "strayLightIncluded", "scientificStatus", "uncertainty", "context", "responseIncludes", "profileId", "profileVersion", "relativePupilThroughputFactor", "grid", "evidence", "limitations"]);
|
|
196
198
|
if (record.schemaVersion !==
|
|
197
199
|
LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION) {
|
|
198
200
|
throw new InvalidConfigurationError('lensComplexPupil.schemaVersion must be "' +
|
|
@@ -236,9 +238,9 @@ export function parseLensComplexPupilProfile(value) {
|
|
|
236
238
|
"not-quantified") {
|
|
237
239
|
throw new InvalidConfigurationError("Calibrated complex-pupil profiles must declare quantified relative uncertainty.");
|
|
238
240
|
}
|
|
239
|
-
const context = requireRecord(record.context, "lensComplexPupil.context");
|
|
240
|
-
const field = requireRecord(context.fieldPointMm, "lensComplexPupil.context.fieldPointMm");
|
|
241
|
-
const response = requireRecord(record.responseIncludes, "lensComplexPupil.responseIncludes");
|
|
241
|
+
const context = requireRecord(record.context, "lensComplexPupil.context", ["fieldPointMm", "focalLengthMm", "focus", "apertureFNumber", "wavelengthNm", "signedDefocusImagePlaneMicrometers"]);
|
|
242
|
+
const field = requireRecord(context.fieldPointMm, "lensComplexPupil.context.fieldPointMm", ["x", "y"]);
|
|
243
|
+
const response = requireRecord(record.responseIncludes, "lensComplexPupil.responseIncludes", ["diffraction", "aberration", "defocus", "pupilClippingShape"]);
|
|
242
244
|
if (response.diffraction !==
|
|
243
245
|
true ||
|
|
244
246
|
typeof response.aberration !==
|
|
@@ -306,59 +308,151 @@ function pupilComplexValue(amplitude, opdMicrometers, wavelengthMicrometers) {
|
|
|
306
308
|
Math.sin(phase)
|
|
307
309
|
};
|
|
308
310
|
}
|
|
309
|
-
function
|
|
311
|
+
function supportSpan(grid, axis) {
|
|
312
|
+
let minimum = Number.POSITIVE_INFINITY;
|
|
313
|
+
let maximum = Number.NEGATIVE_INFINITY;
|
|
314
|
+
grid.relativeAmplitude.forEach((amplitude, index) => {
|
|
315
|
+
if (amplitude > 0) {
|
|
316
|
+
const coordinate = axis === "x"
|
|
317
|
+
? index % grid.widthSamples
|
|
318
|
+
: Math.floor(index / grid.widthSamples);
|
|
319
|
+
minimum = Math.min(minimum, coordinate);
|
|
320
|
+
maximum = Math.max(maximum, coordinate);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
return maximum - minimum + 1;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Sampling guard for the discrete Fraunhofer reference (Ban et al.,
|
|
327
|
+
* arXiv:2511.06936, eqs. 6-9, free: N*dp = lambda*f/dc, Q = lambda*F/dc and
|
|
328
|
+
* Q >= 2. Also see: Goodman, Introduction to Fourier Optics, sampling of
|
|
329
|
+
* DFT/FFT Fraunhofer propagation).
|
|
330
|
+
*
|
|
331
|
+
* A DFT (discrete Fourier transform) of size M over pupil pitch dp gives an
|
|
332
|
+
* image-plane pitch of lambda*z/(M*dp).
|
|
333
|
+
*
|
|
334
|
+
* The intensity PSF is the transform of the pupil autocorrelation. That
|
|
335
|
+
* autocorrelation is twice as wide as the pupil. So Nyquist sampling of the
|
|
336
|
+
* intensity needs Q = lambda*(z/D)/pitch = M*dp/D >= 2.
|
|
337
|
+
*
|
|
338
|
+
* For a pupil spanning S samples, the discrete autocorrelation has 2S-1 lags.
|
|
339
|
+
* So M >= 2S-1 is the exact condition for no circular wrap-around, and it
|
|
340
|
+
* implies Q = M/(S-1) > 2. The declared grid is zero padded to that size.
|
|
341
|
+
*
|
|
342
|
+
* The non-zero support must also fit inside the declared f/N cone. Its
|
|
343
|
+
* diameter D may not exceed z/N for the resolved propagation distance z; that
|
|
344
|
+
* is, the image-side cone D/z may not be wider than 1/N. With the nominal
|
|
345
|
+
* focal-plane reference (z = f) this is the entrance-aperture diameter f/N. An
|
|
346
|
+
* exit pupil declared at its own distance z uses that distance
|
|
347
|
+
* (docs/PSF_FOUNDATION.md).
|
|
348
|
+
*/
|
|
349
|
+
function planPupilSampling(profile, propagationDistanceMm) {
|
|
350
|
+
const grid = profile.grid;
|
|
351
|
+
const supportX = supportSpan(grid, "x");
|
|
352
|
+
const supportY = supportSpan(grid, "y");
|
|
353
|
+
const diameterX = (supportX - 1) * grid.pupilSamplePitchMmX;
|
|
354
|
+
const diameterY = (supportY - 1) * grid.pupilSamplePitchMmY;
|
|
355
|
+
const declaredDiameter = propagationDistanceMm / profile.context.apertureFNumber;
|
|
356
|
+
// Relative allowance for floating-point rounding only.
|
|
357
|
+
const limit = declaredDiameter * (1 + 1e-9);
|
|
358
|
+
if (diameterX > limit || diameterY > limit) {
|
|
359
|
+
throw new InvalidScientificInputError("Complex-pupil amplitude support spans " +
|
|
360
|
+
diameterX.toPrecision(6) +
|
|
361
|
+
" x " +
|
|
362
|
+
diameterY.toPrecision(6) +
|
|
363
|
+
" mm between outermost non-zero samples, wider than the declared f/N cone diameter " +
|
|
364
|
+
declaredDiameter.toPrecision(6) +
|
|
365
|
+
" mm (propagationDistanceMm / apertureFNumber).");
|
|
366
|
+
}
|
|
367
|
+
const transformWidth = Math.max(grid.widthSamples, 2 * supportX - 1);
|
|
368
|
+
const transformHeight = Math.max(grid.heightSamples, 2 * supportY - 1);
|
|
369
|
+
return {
|
|
370
|
+
sampling: {
|
|
371
|
+
criterion: "discrete-intensity-alias-free-goodman-q-above-2",
|
|
372
|
+
pupilSupportSamplesX: supportX,
|
|
373
|
+
pupilSupportSamplesY: supportY,
|
|
374
|
+
pupilSupportDiameterMmX: diameterX,
|
|
375
|
+
pupilSupportDiameterMmY: diameterY,
|
|
376
|
+
declaredPupilDiameterMm: declaredDiameter,
|
|
377
|
+
pupilGridWidthSamples: grid.widthSamples,
|
|
378
|
+
pupilGridHeightSamples: grid.heightSamples,
|
|
379
|
+
transformWidthSamples: transformWidth,
|
|
380
|
+
transformHeightSamples: transformHeight,
|
|
381
|
+
zeroPaddingApplied: transformWidth !== grid.widthSamples ||
|
|
382
|
+
transformHeight !== grid.heightSamples,
|
|
383
|
+
samplingFactorQX: supportX > 1 ? transformWidth / (supportX - 1) : null,
|
|
384
|
+
samplingFactorQY: supportY > 1 ? transformHeight / (supportY - 1) : null
|
|
385
|
+
},
|
|
386
|
+
// Symmetric padding keeps zero frequency at the declared centre, shifted
|
|
387
|
+
// by the leading padding.
|
|
388
|
+
outputCenterX: grid.centerSampleX +
|
|
389
|
+
Math.floor((transformWidth - grid.widthSamples) / 2),
|
|
390
|
+
outputCenterY: grid.centerSampleY +
|
|
391
|
+
Math.floor((transformHeight - grid.heightSamples) / 2)
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
function twiddleTable(size) {
|
|
395
|
+
const cos = [];
|
|
396
|
+
const sin = [];
|
|
397
|
+
for (let index = 0; index < size; index += 1) {
|
|
398
|
+
const angle = (-2 * Math.PI * index) / size;
|
|
399
|
+
cos.push(Math.cos(angle));
|
|
400
|
+
sin.push(Math.sin(angle));
|
|
401
|
+
}
|
|
402
|
+
return { cos, sin };
|
|
403
|
+
}
|
|
404
|
+
function positiveModulo(value, size) {
|
|
405
|
+
const remainder = value % size;
|
|
406
|
+
return remainder < 0 ? remainder + size : remainder;
|
|
407
|
+
}
|
|
408
|
+
function calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm, plan) {
|
|
310
409
|
const grid = profile.grid;
|
|
311
410
|
const width = grid.widthSamples;
|
|
312
411
|
const height = grid.heightSamples;
|
|
313
|
-
const
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const wavelengthMm = profile.context
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
for (let outX = 0; outX <
|
|
326
|
-
const kx = outX -
|
|
327
|
-
|
|
412
|
+
const outWidth = plan.sampling.transformWidthSamples;
|
|
413
|
+
const outHeight = plan.sampling.transformHeightSamples;
|
|
414
|
+
const wavelengthMicrometers = profile.context.wavelengthNm / 1000;
|
|
415
|
+
const wavelengthMm = profile.context.wavelengthNm / 1_000_000;
|
|
416
|
+
const pupil = grid.relativeAmplitude.map((amplitude, index) => pupilComplexValue(amplitude, grid.opticalPathDifferenceMicrometers[index], wavelengthMicrometers));
|
|
417
|
+
// Separable zero-padded DFT: pupil rows to image kx first, then columns.
|
|
418
|
+
// Padding samples are zero, so only declared pupil samples are summed.
|
|
419
|
+
const twiddleX = twiddleTable(outWidth);
|
|
420
|
+
const twiddleY = twiddleTable(outHeight);
|
|
421
|
+
const rowRe = new Float64Array(height * outWidth);
|
|
422
|
+
const rowIm = new Float64Array(height * outWidth);
|
|
423
|
+
for (let y = 0; y < height; y += 1) {
|
|
424
|
+
for (let outX = 0; outX < outWidth; outX += 1) {
|
|
425
|
+
const kx = outX - plan.outputCenterX;
|
|
426
|
+
let re = 0;
|
|
427
|
+
let im = 0;
|
|
428
|
+
for (let x = 0; x < width; x += 1) {
|
|
429
|
+
const source = pupil[y * width + x];
|
|
430
|
+
const t = positiveModulo(kx * (x - grid.centerSampleX), outWidth);
|
|
431
|
+
const cos = twiddleX.cos[t];
|
|
432
|
+
const sin = twiddleX.sin[t];
|
|
433
|
+
re += source.re * cos - source.im * sin;
|
|
434
|
+
im += source.re * sin + source.im * cos;
|
|
435
|
+
}
|
|
436
|
+
rowRe[y * outWidth + outX] = re;
|
|
437
|
+
rowIm[y * outWidth + outX] = im;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
const intensity = new Array(outWidth * outHeight).fill(0);
|
|
441
|
+
for (let outY = 0; outY < outHeight; outY += 1) {
|
|
442
|
+
const ky = outY - plan.outputCenterY;
|
|
443
|
+
for (let outX = 0; outX < outWidth; outX += 1) {
|
|
328
444
|
let re = 0;
|
|
329
445
|
let im = 0;
|
|
330
446
|
for (let y = 0; y < height; y += 1) {
|
|
331
|
-
const
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
const angle = -2 *
|
|
339
|
-
Math.PI *
|
|
340
|
-
(kx * px /
|
|
341
|
-
width +
|
|
342
|
-
ky * py /
|
|
343
|
-
height);
|
|
344
|
-
const cos = Math.cos(angle);
|
|
345
|
-
const sin = Math.sin(angle);
|
|
346
|
-
re +=
|
|
347
|
-
source.re *
|
|
348
|
-
cos -
|
|
349
|
-
source.im *
|
|
350
|
-
sin;
|
|
351
|
-
im +=
|
|
352
|
-
source.re *
|
|
353
|
-
sin +
|
|
354
|
-
source.im *
|
|
355
|
-
cos;
|
|
356
|
-
}
|
|
447
|
+
const sourceRe = rowRe[y * outWidth + outX];
|
|
448
|
+
const sourceIm = rowIm[y * outWidth + outX];
|
|
449
|
+
const t = positiveModulo(ky * (y - grid.centerSampleY), outHeight);
|
|
450
|
+
const cos = twiddleY.cos[t];
|
|
451
|
+
const sin = twiddleY.sin[t];
|
|
452
|
+
re += sourceRe * cos - sourceIm * sin;
|
|
453
|
+
im += sourceRe * sin + sourceIm * cos;
|
|
357
454
|
}
|
|
358
|
-
intensity[outY *
|
|
359
|
-
outX] =
|
|
360
|
-
re * re +
|
|
361
|
-
im * im;
|
|
455
|
+
intensity[outY * outWidth + outX] = re * re + im * im;
|
|
362
456
|
}
|
|
363
457
|
}
|
|
364
458
|
const sum = intensity.reduce((acc, value) => acc + value, 0);
|
|
@@ -367,16 +461,10 @@ function calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm) {
|
|
|
367
461
|
throw new InvalidScientificInputError("Complex-pupil propagation must produce finite positive PSF energy.");
|
|
368
462
|
}
|
|
369
463
|
const normalized = intensity.map((value) => value / sum);
|
|
370
|
-
const samplePitchMmX = wavelengthMm *
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
.pupilSamplePitchMmX);
|
|
375
|
-
const samplePitchMmY = wavelengthMm *
|
|
376
|
-
propagationDistanceMm /
|
|
377
|
-
(height *
|
|
378
|
-
grid
|
|
379
|
-
.pupilSamplePitchMmY);
|
|
464
|
+
const samplePitchMmX = wavelengthMm * propagationDistanceMm /
|
|
465
|
+
(outWidth * grid.pupilSamplePitchMmX);
|
|
466
|
+
const samplePitchMmY = wavelengthMm * propagationDistanceMm /
|
|
467
|
+
(outHeight * grid.pupilSamplePitchMmY);
|
|
380
468
|
if (!Number.isFinite(samplePitchMmX) ||
|
|
381
469
|
!Number.isFinite(samplePitchMmY) ||
|
|
382
470
|
samplePitchMmX <= 0 ||
|
|
@@ -384,35 +472,37 @@ function calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm) {
|
|
|
384
472
|
throw new InvalidScientificInputError("Complex-pupil PSF sample pitch must remain finite and positive.");
|
|
385
473
|
}
|
|
386
474
|
return {
|
|
387
|
-
widthSamples:
|
|
388
|
-
heightSamples:
|
|
475
|
+
widthSamples: outWidth,
|
|
476
|
+
heightSamples: outHeight,
|
|
389
477
|
samplePitchMicrometersX: samplePitchMmX *
|
|
390
478
|
1000,
|
|
391
479
|
samplePitchMicrometersY: samplePitchMmY *
|
|
392
480
|
1000,
|
|
393
|
-
centerSampleX:
|
|
394
|
-
centerSampleY:
|
|
481
|
+
centerSampleX: plan.outputCenterX,
|
|
482
|
+
centerSampleY: plan.outputCenterY,
|
|
395
483
|
normalizedIntensity: normalized
|
|
396
484
|
};
|
|
397
485
|
}
|
|
398
486
|
/**
|
|
399
|
-
*
|
|
400
|
-
* shape and
|
|
487
|
+
* Evaluates a declared complex pupil with explicit amplitude, phase and sampling support. Returns the
|
|
488
|
+
* normalized PSF shape, and the pupil throughput as a separate quantity.
|
|
401
489
|
*
|
|
402
|
-
*
|
|
403
|
-
* shape is normalized separately from pupil throughput
|
|
404
|
-
*
|
|
405
|
-
* owned or reusable
|
|
406
|
-
* @param input - CalculateLensComplexPupilPsfInput. See
|
|
407
|
-
* @returns CalculationResult<LensComplexPupilPsf>.
|
|
490
|
+
* The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular
|
|
491
|
+
* pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius
|
|
492
|
+
* cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the
|
|
493
|
+
* profile applies. Numeric profiles need provenance showing the data is owned or reusable.
|
|
494
|
+
* @param input - CalculateLensComplexPupilPsfInput. See that type for coordinates, units and profile binding.
|
|
495
|
+
* @returns CalculationResult<LensComplexPupilPsf>. The result states its shape and scientific status; a successful call does not imply calibration.
|
|
408
496
|
*
|
|
409
497
|
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
410
498
|
*/
|
|
411
499
|
export function calculateLensComplexPupilPsf(input) {
|
|
500
|
+
requireInputKeys(input, "calculateLensComplexPupilPsf", ["profile", "propagationDistanceMm"]);
|
|
412
501
|
const profile = parseLensComplexPupilProfile(input.profile);
|
|
413
502
|
const propagationDistanceMm = input.propagationDistanceMm === undefined ? profile.context.focalLengthMm : input.propagationDistanceMm;
|
|
414
503
|
requirePositiveFinite(propagationDistanceMm, "propagationDistanceMm");
|
|
415
|
-
const
|
|
504
|
+
const plan = planPupilSampling(profile, propagationDistanceMm);
|
|
505
|
+
const kernel = calculateDiscreteFraunhoferKernel(profile, propagationDistanceMm, plan);
|
|
416
506
|
return approximationResult({
|
|
417
507
|
propagationDistanceMm,
|
|
418
508
|
propagationDistanceSource: input.propagationDistanceMm === undefined ? "nominal-focal-plane-reference" : "explicit",
|
|
@@ -430,6 +520,7 @@ export function calculateLensComplexPupilPsf(input) {
|
|
|
430
520
|
}
|
|
431
521
|
},
|
|
432
522
|
kernel,
|
|
523
|
+
sampling: plan.sampling,
|
|
433
524
|
relativePupilThroughputFactor: profile
|
|
434
525
|
.relativePupilThroughputFactor,
|
|
435
526
|
throughputOwnership: "separate-relative-pupil-throughput-factor",
|
|
@@ -451,8 +542,9 @@ export function calculateLensComplexPupilPsf(input) {
|
|
|
451
542
|
pupilProfile: profile.evidence
|
|
452
543
|
},
|
|
453
544
|
uncertainty: profile.uncertainty
|
|
454
|
-
}, "lens-complex-pupil-fraunhofer-psf", "
|
|
545
|
+
}, "lens-complex-pupil-fraunhofer-psf", "2.0.0", [
|
|
455
546
|
"The reference evaluator performs deterministic scalar Fraunhofer propagation of one explicit complex pupil amplitude plus optical-path-difference grid.",
|
|
547
|
+
"The pupil is zero padded so the DFT spans at least 2S-1 samples for a non-zero support of S samples per axis: the discrete intensity PSF then has no wrap-around aliasing and Goodman's sampling factor Q = lambda*N/pitch exceeds 2. Pupil support wider than the declared f/N aperture is rejected.",
|
|
456
548
|
"Physical sample pitch uses the explicit propagation distance when supplied; omission preserves the nominal focal-plane reference. Finite focus metadata does not resolve the pupil-to-image geometry automatically.",
|
|
457
549
|
"Diffraction and aberration phase are evaluated together in the same pupil propagation; callers must not stack an independent diffraction blur over this result.",
|
|
458
550
|
"The output PSF is unit-energy normalized. The explicit relativePupilThroughputFactor is not multiplied into the kernel and remains owned by the separate optical-throughput path.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complex-pupil-psf.js","sourceRoot":"","sources":["../../src/optics/complex-pupil-psf.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"complex-pupil-psf.js","sourceRoot":"","sources":["../../src/optics/complex-pupil-psf.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * PSF (point-spread function) from a declared complex pupil: amplitude and phase sampled on a grid.\n *\n * The profile parser validates untrusted input and returns the normalized typed contract. Unknown\n * enum values, missing required fields and incompatible scientific data are rejected.\n *\n * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular\n * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius\n * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the\n * profile applies. Numeric profiles need provenance showing the data is owned or reusable.\n * @see docs/PSF_FOUNDATION.md for the equations, units, coordinate conventions, known blockers and\n * support limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n parseFocusPlane,\n type FocusPlane\n} from \"./focus-state.js\";\nimport type {\n LensPsfKernel,\n LensPsfScientificStatus,\n LensPsfUncertainty\n} from \"./lens-psf-profile.js\";\nimport { requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from \"../core/record-validation.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport const LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION =\n \"0.1.0\" as const;\n\nexport interface LensComplexPupilGrid {\n widthSamples: number;\n heightSamples: number;\n pupilSamplePitchMmX: number;\n pupilSamplePitchMmY: number;\n centerSampleX: number;\n centerSampleY: number;\n relativeAmplitude:\n readonly number[];\n opticalPathDifferenceMicrometers:\n readonly number[];\n}\n\nexport interface LensComplexPupilProfile {\n schemaVersion:\n typeof LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION;\n profileId: string;\n profileVersion: string;\n scientificStatus:\n LensPsfScientificStatus;\n opticalDomain:\n \"lens-primary-optical-path-only\";\n representation:\n \"complex-pupil-amplitude-plus-opd\";\n pupilCoordinateSystem:\n \"pupil-plane-metric-aligned-to-image-plane\";\n imageFieldAxes:\n \"+X right, +Y up\";\n amplitudeMeaning:\n \"relative-complex-pupil-amplitude-shape\";\n wavefrontMeaning:\n \"optical-path-difference-micrometers\";\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\";\n kernelEnergyNormalization:\n \"unit-energy-shape\";\n propagationModel:\n \"scalar-fraunhofer-discrete-reference\";\n context: {\n focalLengthMm: number;\n focus: FocusPlane;\n apertureFNumber: number;\n fieldPointMm: {\n x: number;\n y: number;\n };\n wavelengthNm: number;\n signedDefocusImagePlaneMicrometers:\n number;\n };\n responseIncludes: {\n diffraction: true;\n aberration: boolean;\n defocus: boolean;\n pupilClippingShape:\n boolean;\n };\n relativePupilThroughputFactor:\n number;\n grid: LensComplexPupilGrid;\n sensorOpticalStackIncluded:\n false;\n sensorSamplingIncluded:\n false;\n reconstructionIncluded:\n false;\n strayLightIncluded: false;\n evidence:\n readonly EvidenceProvenance[];\n uncertainty:\n LensPsfUncertainty;\n limitations: readonly string[];\n}\n\nexport interface CalculateLensComplexPupilPsfInput {\n profile:\n LensComplexPupilProfile;\n /** Physical propagation distance from pupil to image, in mm. If omitted, the\n * nominal focal-plane reference is used. At finite focus the caller must\n * resolve the supported principal-plane geometry; profile metadata does not. */\n propagationDistanceMm?: number;\n}\n\nexport interface LensComplexPupilPsf {\n propagationDistanceMm: number;\n propagationDistanceSource: \"explicit\" | \"nominal-focal-plane-reference\";\n profileId: string;\n profileVersion: string;\n scientificStatus:\n LensPsfScientificStatus;\n context:\n LensComplexPupilProfile[\"context\"];\n kernel: LensPsfKernel;\n /** Nyquist sampling diagnostics and the applied zero padding. */\n sampling: LensComplexPupilPsfSampling;\n relativePupilThroughputFactor:\n number;\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\";\n diffractionAndAberrationJointlyEvaluated:\n true;\n pupilClippingShapeIncluded:\n boolean;\n pupilClippingThroughputAppliedToKernel:\n false;\n scalarFraunhoferReference:\n true;\n full2dOrientationPreserved:\n true;\n geometricDistortionModified:\n false;\n lateralChromaticPositionShiftApplied:\n false;\n sensorOpticalStackIncluded:\n false;\n sensorSamplingIncluded: false;\n reconstructionIncluded: false;\n strayLightIncluded: false;\n scalarSharpnessScoreProduced:\n false;\n componentEvidence: {\n pupilProfile:\n readonly EvidenceProvenance[];\n };\n uncertainty:\n LensPsfUncertainty;\n}\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a non-empty string.\"\n );\n }\n return value.trim();\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requirePositiveFinite(\n value: unknown,\n path: string\n): number {\n const parsed =\n requireFinite(value, path);\n if (parsed <= 0) {\n throw new InvalidConfigurationError(\n path +\n \" must be greater than zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireUnitInterval(\n value: unknown,\n path: string\n): number {\n const parsed =\n requireFinite(value, path);\n if (\n parsed < 0 ||\n parsed > 1\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must lie from zero through one.\"\n );\n }\n return parsed;\n}\n\nfunction requirePositiveSafeInteger(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value <= 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a positive safe integer.\"\n );\n }\n return value;\n}\n\nfunction requireNonNegativeSafeInteger(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value < 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a non-negative safe integer.\"\n );\n }\n return value;\n}\n\nfunction parseStatus(\n value: unknown,\n path: string\n): LensPsfScientificStatus {\n if (\n value !== \"calibrated\" &&\n value !== \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n path + \" is invalid.\"\n );\n }\n return value;\n}\n\nfunction parseUncertainty(\n value: unknown,\n path: string\n): LensPsfUncertainty {\n const record =\n requireRecord(value, path, null);\n rejectUnknownVariantFields(record, \"kind\", UNCERTAINTY_VARIANT_FIELDS, path);\n if (record.kind === \"relative\") {\n const fraction =\n requireFinite(\n record.fraction,\n path + \".fraction\"\n );\n if (fraction < 0) {\n throw new InvalidConfigurationError(\n path +\n \".fraction must be nonnegative.\"\n );\n }\n return {\n kind: \"relative\",\n fraction,\n basis:\n requireNonEmptyString(\n record.basis,\n path + \".basis\"\n )\n };\n }\n if (\n record.kind ===\n \"not-quantified\"\n ) {\n return {\n kind: \"not-quantified\",\n limitation:\n requireNonEmptyString(\n record.limitation,\n path +\n \".limitation\"\n )\n };\n }\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseLimitations(\n value: unknown,\n path: string\n): readonly string[] {\n if (!Array.isArray(value)) {\n throw new InvalidConfigurationError(\n path + \" must be an array.\"\n );\n }\n const parsed =\n value.map(\n (entry, index) =>\n requireNonEmptyString(\n entry,\n path +\n \"[\" +\n index +\n \"]\"\n )\n );\n if (\n new Set(parsed).size !==\n parsed.length\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must not contain duplicates.\"\n );\n }\n return parsed;\n}\n\nfunction parseGrid(\n value: unknown\n): LensComplexPupilGrid {\n const record =\n requireRecord(\n value,\n \"lensComplexPupil.grid\", [\"widthSamples\", \"heightSamples\", \"centerSampleX\", \"centerSampleY\", \"relativeAmplitude\", \"opticalPathDifferenceMicrometers\", \"pupilSamplePitchMmX\", \"pupilSamplePitchMmY\"]\n );\n const widthSamples =\n requirePositiveSafeInteger(\n record.widthSamples,\n \"lensComplexPupil.grid.widthSamples\"\n );\n const heightSamples =\n requirePositiveSafeInteger(\n record.heightSamples,\n \"lensComplexPupil.grid.heightSamples\"\n );\n const total =\n widthSamples *\n heightSamples;\n if (\n !Number.isSafeInteger(total) ||\n total > 4096\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil grid must contain at most 4096 samples.\"\n );\n }\n const centerSampleX =\n requireNonNegativeSafeInteger(\n record.centerSampleX,\n \"lensComplexPupil.grid.centerSampleX\"\n );\n const centerSampleY =\n requireNonNegativeSafeInteger(\n record.centerSampleY,\n \"lensComplexPupil.grid.centerSampleY\"\n );\n if (\n centerSampleX >=\n widthSamples ||\n centerSampleY >=\n heightSamples\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil grid center must lie within the pupil array.\"\n );\n }\n if (\n !Array.isArray(\n record.relativeAmplitude\n ) ||\n record.relativeAmplitude\n .length !== total\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil.grid.relativeAmplitude length must equal widthSamples × heightSamples.\"\n );\n }\n if (\n !Array.isArray(\n record\n .opticalPathDifferenceMicrometers\n ) ||\n record\n .opticalPathDifferenceMicrometers\n .length !== total\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil.grid.opticalPathDifferenceMicrometers length must equal widthSamples × heightSamples.\"\n );\n }\n\n const relativeAmplitude =\n record.relativeAmplitude.map(\n (entry, index) =>\n requireUnitInterval(\n entry,\n \"lensComplexPupil.grid.relativeAmplitude[\" +\n index +\n \"]\"\n )\n );\n if (\n !relativeAmplitude.some(\n (value) =>\n value > 0\n )\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil must contain at least one non-zero pupil-amplitude sample.\"\n );\n }\n const opd =\n record\n .opticalPathDifferenceMicrometers\n .map(\n (entry, index) =>\n requireFinite(\n entry,\n \"lensComplexPupil.grid.opticalPathDifferenceMicrometers[\" +\n index +\n \"]\"\n )\n );\n\n return {\n widthSamples,\n heightSamples,\n pupilSamplePitchMmX:\n requirePositiveFinite(\n record\n .pupilSamplePitchMmX,\n \"lensComplexPupil.grid.pupilSamplePitchMmX\"\n ),\n pupilSamplePitchMmY:\n requirePositiveFinite(\n record\n .pupilSamplePitchMmY,\n \"lensComplexPupil.grid.pupilSamplePitchMmY\"\n ),\n centerSampleX,\n centerSampleY,\n relativeAmplitude,\n opticalPathDifferenceMicrometers:\n opd\n };\n}\n\n/**\n * Validates an untrusted declaration and returns the normalized typed contract. Unknown enum values,\n * missing required fields and incompatible scientific data are rejected here.\n *\n * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular\n * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius\n * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the\n * profile applies. Numeric profiles need provenance showing the data is owned or reusable.\n * @param value - unknown. Untrusted input; TypeScript types alone are not validation.\n * @returns LensComplexPupilProfile. The result states its shape and scientific status; a successful call does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the root export and exact type graph.\n */\nexport function parseLensComplexPupilProfile(\n value: unknown\n): LensComplexPupilProfile {\n const record =\n requireRecord(\n value,\n \"lensComplexPupil\", [\"schemaVersion\", \"opticalDomain\", \"representation\", \"pupilCoordinateSystem\", \"imageFieldAxes\", \"amplitudeMeaning\", \"wavefrontMeaning\", \"throughputOwnership\", \"kernelEnergyNormalization\", \"propagationModel\", \"sensorOpticalStackIncluded\", \"sensorSamplingIncluded\", \"reconstructionIncluded\", \"strayLightIncluded\", \"scientificStatus\", \"uncertainty\", \"context\", \"responseIncludes\", \"profileId\", \"profileVersion\", \"relativePupilThroughputFactor\", \"grid\", \"evidence\", \"limitations\"]\n );\n if (\n record.schemaVersion !==\n LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION\n ) {\n throw new InvalidConfigurationError(\n 'lensComplexPupil.schemaVersion must be \"' +\n LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION +\n '\".'\n );\n }\n if (\n record.opticalDomain !==\n \"lens-primary-optical-path-only\" ||\n record.representation !==\n \"complex-pupil-amplitude-plus-opd\" ||\n record.pupilCoordinateSystem !==\n \"pupil-plane-metric-aligned-to-image-plane\" ||\n record.imageFieldAxes !==\n \"+X right, +Y up\" ||\n record.amplitudeMeaning !==\n \"relative-complex-pupil-amplitude-shape\" ||\n record.wavefrontMeaning !==\n \"optical-path-difference-micrometers\" ||\n record.throughputOwnership !==\n \"separate-relative-pupil-throughput-factor\" ||\n record.kernelEnergyNormalization !==\n \"unit-energy-shape\" ||\n record.propagationModel !==\n \"scalar-fraunhofer-discrete-reference\"\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil representation/coordinate/energy semantics are invalid.\"\n );\n }\n if (\n record.sensorOpticalStackIncluded !==\n false ||\n record.sensorSamplingIncluded !==\n false ||\n record.reconstructionIncluded !==\n false ||\n record.strayLightIncluded !==\n false\n ) {\n throw new InvalidConfigurationError(\n \"V1 complex pupil profiles must exclude sensor/reconstruction/stray-light effects.\"\n );\n }\n const status =\n parseStatus(\n record.scientificStatus,\n \"lensComplexPupil.scientificStatus\"\n );\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n \"lensComplexPupil.uncertainty\"\n );\n if (\n status === \"calibrated\" &&\n uncertainty.kind ===\n \"not-quantified\"\n ) {\n throw new InvalidConfigurationError(\n \"Calibrated complex-pupil profiles must declare quantified relative uncertainty.\"\n );\n }\n const context =\n requireRecord(\n record.context,\n \"lensComplexPupil.context\", [\"fieldPointMm\", \"focalLengthMm\", \"focus\", \"apertureFNumber\", \"wavelengthNm\", \"signedDefocusImagePlaneMicrometers\"]\n );\n const field =\n requireRecord(\n context.fieldPointMm,\n \"lensComplexPupil.context.fieldPointMm\", [\"x\", \"y\"]\n );\n const response =\n requireRecord(\n record.responseIncludes,\n \"lensComplexPupil.responseIncludes\", [\"diffraction\", \"aberration\", \"defocus\", \"pupilClippingShape\"]\n );\n if (\n response.diffraction !==\n true ||\n typeof response.aberration !==\n \"boolean\" ||\n typeof response.defocus !==\n \"boolean\" ||\n typeof response.pupilClippingShape !==\n \"boolean\"\n ) {\n throw new InvalidConfigurationError(\n \"lensComplexPupil.responseIncludes is invalid; diffraction must be included in this pupil propagation path.\"\n );\n }\n\n return {\n schemaVersion:\n LENS_COMPLEX_PUPIL_PROFILE_SCHEMA_VERSION,\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"lensComplexPupil.profileId\"\n ),\n profileVersion:\n requireNonEmptyString(\n record.profileVersion,\n \"lensComplexPupil.profileVersion\"\n ),\n scientificStatus:\n status,\n opticalDomain:\n \"lens-primary-optical-path-only\",\n representation:\n \"complex-pupil-amplitude-plus-opd\",\n pupilCoordinateSystem:\n \"pupil-plane-metric-aligned-to-image-plane\",\n imageFieldAxes:\n \"+X right, +Y up\",\n amplitudeMeaning:\n \"relative-complex-pupil-amplitude-shape\",\n wavefrontMeaning:\n \"optical-path-difference-micrometers\",\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\",\n kernelEnergyNormalization:\n \"unit-energy-shape\",\n propagationModel:\n \"scalar-fraunhofer-discrete-reference\",\n context: {\n focalLengthMm:\n requirePositiveFinite(\n context.focalLengthMm,\n \"lensComplexPupil.context.focalLengthMm\"\n ),\n focus:\n parseFocusPlane(\n context.focus\n ),\n apertureFNumber:\n requirePositiveFinite(\n context.apertureFNumber,\n \"lensComplexPupil.context.apertureFNumber\"\n ),\n fieldPointMm: {\n x:\n requireFinite(\n field.x,\n \"lensComplexPupil.context.fieldPointMm.x\"\n ),\n y:\n requireFinite(\n field.y,\n \"lensComplexPupil.context.fieldPointMm.y\"\n )\n },\n wavelengthNm:\n requirePositiveFinite(\n context.wavelengthNm,\n \"lensComplexPupil.context.wavelengthNm\"\n ),\n signedDefocusImagePlaneMicrometers:\n requireFinite(\n context\n .signedDefocusImagePlaneMicrometers,\n \"lensComplexPupil.context.signedDefocusImagePlaneMicrometers\"\n )\n },\n responseIncludes: {\n diffraction: true,\n aberration:\n response.aberration as boolean,\n defocus:\n response.defocus as boolean,\n pupilClippingShape:\n response\n .pupilClippingShape as boolean\n },\n relativePupilThroughputFactor:\n requireUnitInterval(\n record\n .relativePupilThroughputFactor,\n \"lensComplexPupil.relativePupilThroughputFactor\"\n ),\n grid:\n parseGrid(record.grid),\n sensorOpticalStackIncluded:\n false,\n sensorSamplingIncluded:\n false,\n reconstructionIncluded:\n false,\n strayLightIncluded:\n false,\n evidence:\n parseEvidenceList(\n record.evidence,\n \"lensComplexPupil.evidence\"\n ),\n uncertainty,\n limitations:\n parseLimitations(\n record.limitations,\n \"lensComplexPupil.limitations\"\n )\n };\n}\n\ninterface ComplexValue {\n re: number;\n im: number;\n}\n\nfunction pupilComplexValue(\n amplitude: number,\n opdMicrometers: number,\n wavelengthMicrometers:\n number\n): ComplexValue {\n const phase =\n 2 *\n Math.PI *\n opdMicrometers /\n wavelengthMicrometers;\n return {\n re:\n amplitude *\n Math.cos(phase),\n im:\n amplitude *\n Math.sin(phase)\n };\n}\n\nexport interface LensComplexPupilPsfSampling {\n criterion: \"discrete-intensity-alias-free-goodman-q-above-2\";\n /** Number of pupil samples spanned by non-zero amplitude, per axis. */\n pupilSupportSamplesX: number;\n pupilSupportSamplesY: number;\n /**\n * Sampled pupil diameter D = (support samples - 1) x pupil pitch: the\n * centre-to-centre span of the outermost non-zero samples, in millimetres.\n */\n pupilSupportDiameterMmX: number;\n pupilSupportDiameterMmY: number;\n /**\n * Widest support allowed by the declared f-number at the resolved propagation distance:\n * propagationDistanceMm / apertureFNumber, in millimetres. For the nominal focal-plane reference\n * this is focalLengthMm / apertureFNumber.\n */\n declaredPupilDiameterMm: number;\n /** Declared pupil grid size before zero padding. */\n pupilGridWidthSamples: number;\n pupilGridHeightSamples: number;\n /** DFT size after zero padding; equals the output kernel size. */\n transformWidthSamples: number;\n transformHeightSamples: number;\n zeroPaddingApplied: boolean;\n /**\n * Achieved Goodman sampling factor Q = lambda*(z/D)/imagePitch =\n * transform samples / (support samples - 1). Always greater than 2. Null\n * when the support is a single sample on that axis (no finite diameter).\n */\n samplingFactorQX: number | null;\n samplingFactorQY: number | null;\n}\n\ninterface PupilSamplingPlan {\n sampling: LensComplexPupilPsfSampling;\n outputCenterX: number;\n outputCenterY: number;\n}\n\nfunction supportSpan(\n grid: LensComplexPupilGrid,\n axis: \"x\" | \"y\"\n): number {\n let minimum = Number.POSITIVE_INFINITY;\n let maximum = Number.NEGATIVE_INFINITY;\n grid.relativeAmplitude.forEach((amplitude, index) => {\n if (amplitude > 0) {\n const coordinate =\n axis === \"x\"\n ? index % grid.widthSamples\n : Math.floor(index / grid.widthSamples);\n minimum = Math.min(minimum, coordinate);\n maximum = Math.max(maximum, coordinate);\n }\n });\n return maximum - minimum + 1;\n}\n\n/**\n * Sampling guard for the discrete Fraunhofer reference (Ban et al.,\n * arXiv:2511.06936, eqs. 6-9, free: N*dp = lambda*f/dc, Q = lambda*F/dc and\n * Q >= 2. Also see: Goodman, Introduction to Fourier Optics, sampling of\n * DFT/FFT Fraunhofer propagation).\n *\n * A DFT (discrete Fourier transform) of size M over pupil pitch dp gives an\n * image-plane pitch of lambda*z/(M*dp).\n *\n * The intensity PSF is the transform of the pupil autocorrelation. That\n * autocorrelation is twice as wide as the pupil. So Nyquist sampling of the\n * intensity needs Q = lambda*(z/D)/pitch = M*dp/D >= 2.\n *\n * For a pupil spanning S samples, the discrete autocorrelation has 2S-1 lags.\n * So M >= 2S-1 is the exact condition for no circular wrap-around, and it\n * implies Q = M/(S-1) > 2. The declared grid is zero padded to that size.\n *\n * The non-zero support must also fit inside the declared f/N cone. Its\n * diameter D may not exceed z/N for the resolved propagation distance z; that\n * is, the image-side cone D/z may not be wider than 1/N. With the nominal\n * focal-plane reference (z = f) this is the entrance-aperture diameter f/N. An\n * exit pupil declared at its own distance z uses that distance\n * (docs/PSF_FOUNDATION.md).\n */\nfunction planPupilSampling(\n profile: LensComplexPupilProfile,\n propagationDistanceMm: number\n): PupilSamplingPlan {\n const grid = profile.grid;\n const supportX = supportSpan(grid, \"x\");\n const supportY = supportSpan(grid, \"y\");\n const diameterX = (supportX - 1) * grid.pupilSamplePitchMmX;\n const diameterY = (supportY - 1) * grid.pupilSamplePitchMmY;\n const declaredDiameter =\n propagationDistanceMm / profile.context.apertureFNumber;\n // Relative allowance for floating-point rounding only.\n const limit = declaredDiameter * (1 + 1e-9);\n if (diameterX > limit || diameterY > limit) {\n throw new InvalidScientificInputError(\n \"Complex-pupil amplitude support spans \" +\n diameterX.toPrecision(6) +\n \" x \" +\n diameterY.toPrecision(6) +\n \" mm between outermost non-zero samples, wider than the declared f/N cone diameter \" +\n declaredDiameter.toPrecision(6) +\n \" mm (propagationDistanceMm / apertureFNumber).\"\n );\n }\n const transformWidth = Math.max(grid.widthSamples, 2 * supportX - 1);\n const transformHeight = Math.max(grid.heightSamples, 2 * supportY - 1);\n return {\n sampling: {\n criterion: \"discrete-intensity-alias-free-goodman-q-above-2\",\n pupilSupportSamplesX: supportX,\n pupilSupportSamplesY: supportY,\n pupilSupportDiameterMmX: diameterX,\n pupilSupportDiameterMmY: diameterY,\n declaredPupilDiameterMm: declaredDiameter,\n pupilGridWidthSamples: grid.widthSamples,\n pupilGridHeightSamples: grid.heightSamples,\n transformWidthSamples: transformWidth,\n transformHeightSamples: transformHeight,\n zeroPaddingApplied:\n transformWidth !== grid.widthSamples ||\n transformHeight !== grid.heightSamples,\n samplingFactorQX:\n supportX > 1 ? transformWidth / (supportX - 1) : null,\n samplingFactorQY:\n supportY > 1 ? transformHeight / (supportY - 1) : null\n },\n // Symmetric padding keeps zero frequency at the declared centre, shifted\n // by the leading padding.\n outputCenterX:\n grid.centerSampleX +\n Math.floor((transformWidth - grid.widthSamples) / 2),\n outputCenterY:\n grid.centerSampleY +\n Math.floor((transformHeight - grid.heightSamples) / 2)\n };\n}\n\nfunction twiddleTable(size: number): { cos: number[]; sin: number[] } {\n const cos: number[] = [];\n const sin: number[] = [];\n for (let index = 0; index < size; index += 1) {\n const angle = (-2 * Math.PI * index) / size;\n cos.push(Math.cos(angle));\n sin.push(Math.sin(angle));\n }\n return { cos, sin };\n}\n\nfunction positiveModulo(value: number, size: number): number {\n const remainder = value % size;\n return remainder < 0 ? remainder + size : remainder;\n}\n\nfunction calculateDiscreteFraunhoferKernel(\n profile:\n LensComplexPupilProfile,\n propagationDistanceMm: number,\n plan: PupilSamplingPlan\n): LensPsfKernel {\n const grid = profile.grid;\n const width = grid.widthSamples;\n const height = grid.heightSamples;\n const outWidth = plan.sampling.transformWidthSamples;\n const outHeight = plan.sampling.transformHeightSamples;\n const wavelengthMicrometers = profile.context.wavelengthNm / 1000;\n const wavelengthMm = profile.context.wavelengthNm / 1_000_000;\n const pupil: ComplexValue[] =\n grid.relativeAmplitude.map(\n (amplitude, index) =>\n pupilComplexValue(\n amplitude,\n grid.opticalPathDifferenceMicrometers[index]!,\n wavelengthMicrometers\n )\n );\n\n // Separable zero-padded DFT: pupil rows to image kx first, then columns.\n // Padding samples are zero, so only declared pupil samples are summed.\n const twiddleX = twiddleTable(outWidth);\n const twiddleY = twiddleTable(outHeight);\n const rowRe = new Float64Array(height * outWidth);\n const rowIm = new Float64Array(height * outWidth);\n for (let y = 0; y < height; y += 1) {\n for (let outX = 0; outX < outWidth; outX += 1) {\n const kx = outX - plan.outputCenterX;\n let re = 0;\n let im = 0;\n for (let x = 0; x < width; x += 1) {\n const source = pupil[y * width + x]!;\n const t = positiveModulo(kx * (x - grid.centerSampleX), outWidth);\n const cos = twiddleX.cos[t]!;\n const sin = twiddleX.sin[t]!;\n re += source.re * cos - source.im * sin;\n im += source.re * sin + source.im * cos;\n }\n rowRe[y * outWidth + outX] = re;\n rowIm[y * outWidth + outX] = im;\n }\n }\n\n const intensity = new Array<number>(outWidth * outHeight).fill(0);\n for (let outY = 0; outY < outHeight; outY += 1) {\n const ky = outY - plan.outputCenterY;\n for (let outX = 0; outX < outWidth; outX += 1) {\n let re = 0;\n let im = 0;\n for (let y = 0; y < height; y += 1) {\n const sourceRe = rowRe[y * outWidth + outX]!;\n const sourceIm = rowIm[y * outWidth + outX]!;\n const t = positiveModulo(ky * (y - grid.centerSampleY), outHeight);\n const cos = twiddleY.cos[t]!;\n const sin = twiddleY.sin[t]!;\n re += sourceRe * cos - sourceIm * sin;\n im += sourceRe * sin + sourceIm * cos;\n }\n intensity[outY * outWidth + outX] = re * re + im * im;\n }\n }\n\n const sum =\n intensity.reduce(\n (acc, value) =>\n acc + value,\n 0\n );\n if (\n !Number.isFinite(sum) ||\n sum <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Complex-pupil propagation must produce finite positive PSF energy.\"\n );\n }\n const normalized =\n intensity.map(\n (value) =>\n value / sum\n );\n\n const samplePitchMmX =\n wavelengthMm * propagationDistanceMm /\n (outWidth * grid.pupilSamplePitchMmX);\n const samplePitchMmY =\n wavelengthMm * propagationDistanceMm /\n (outHeight * grid.pupilSamplePitchMmY);\n\n if (\n !Number.isFinite(\n samplePitchMmX\n ) ||\n !Number.isFinite(\n samplePitchMmY\n ) ||\n samplePitchMmX <= 0 ||\n samplePitchMmY <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Complex-pupil PSF sample pitch must remain finite and positive.\"\n );\n }\n\n return {\n widthSamples: outWidth,\n heightSamples: outHeight,\n samplePitchMicrometersX:\n samplePitchMmX *\n 1000,\n samplePitchMicrometersY:\n samplePitchMmY *\n 1000,\n centerSampleX: plan.outputCenterX,\n centerSampleY: plan.outputCenterY,\n normalizedIntensity:\n normalized\n };\n}\n\n/**\n * Evaluates a declared complex pupil with explicit amplitude, phase and sampling support. Returns the\n * normalized PSF shape, and the pupil throughput as a separate quantity.\n *\n * The complex pupil is evaluated by summing the declared amplitude and phase over a bounded, regular\n * pupil grid. The PSF shape is normalized separately from the pupil throughput. A single blur radius\n * cannot stand in for coherent phase, pupil energy, or the wavelength and field range where the\n * profile applies. Numeric profiles need provenance showing the data is owned or reusable.\n * @param input - CalculateLensComplexPupilPsfInput. See that type for coordinates, units and profile binding.\n * @returns CalculationResult<LensComplexPupilPsf>. The result states its shape and scientific status; a successful call does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the root export and exact type graph.\n */\nexport function calculateLensComplexPupilPsf(\n input:\n CalculateLensComplexPupilPsfInput\n): CalculationResult<LensComplexPupilPsf> {\n requireInputKeys(input, \"calculateLensComplexPupilPsf\", [\"profile\", \"propagationDistanceMm\"]);\n const profile =\n parseLensComplexPupilProfile(\n input.profile\n );\n const propagationDistanceMm = input.propagationDistanceMm === undefined ? profile.context.focalLengthMm : input.propagationDistanceMm;\n requirePositiveFinite(propagationDistanceMm, \"propagationDistanceMm\");\n const plan = planPupilSampling(profile, propagationDistanceMm);\n const kernel =\n calculateDiscreteFraunhoferKernel(\n profile,\n propagationDistanceMm,\n plan\n );\n\n return approximationResult(\n {\n propagationDistanceMm,\n propagationDistanceSource: input.propagationDistanceMm === undefined ? \"nominal-focal-plane-reference\" : \"explicit\",\n profileId:\n profile.profileId,\n profileVersion:\n profile.profileVersion,\n scientificStatus:\n profile.scientificStatus,\n context: {\n ...profile.context,\n focus: {\n ...profile.context.focus\n },\n fieldPointMm: {\n ...profile.context\n .fieldPointMm\n }\n },\n kernel,\n sampling: plan.sampling,\n relativePupilThroughputFactor:\n profile\n .relativePupilThroughputFactor,\n throughputOwnership:\n \"separate-relative-pupil-throughput-factor\",\n diffractionAndAberrationJointlyEvaluated:\n true,\n pupilClippingShapeIncluded:\n profile\n .responseIncludes\n .pupilClippingShape,\n pupilClippingThroughputAppliedToKernel:\n false,\n scalarFraunhoferReference:\n true,\n full2dOrientationPreserved:\n true,\n geometricDistortionModified:\n false,\n lateralChromaticPositionShiftApplied:\n false,\n sensorOpticalStackIncluded:\n false,\n sensorSamplingIncluded:\n false,\n reconstructionIncluded:\n false,\n strayLightIncluded:\n false,\n scalarSharpnessScoreProduced:\n false,\n componentEvidence: {\n pupilProfile:\n profile.evidence\n },\n uncertainty:\n profile.uncertainty\n },\n \"lens-complex-pupil-fraunhofer-psf\",\n \"2.0.0\",\n [\n \"The reference evaluator performs deterministic scalar Fraunhofer propagation of one explicit complex pupil amplitude plus optical-path-difference grid.\",\n \"The pupil is zero padded so the DFT spans at least 2S-1 samples for a non-zero support of S samples per axis: the discrete intensity PSF then has no wrap-around aliasing and Goodman's sampling factor Q = lambda*N/pitch exceeds 2. Pupil support wider than the declared f/N aperture is rejected.\",\n \"Physical sample pitch uses the explicit propagation distance when supplied; omission preserves the nominal focal-plane reference. Finite focus metadata does not resolve the pupil-to-image geometry automatically.\",\n \"Diffraction and aberration phase are evaluated together in the same pupil propagation; callers must not stack an independent diffraction blur over this result.\",\n \"The output PSF is unit-energy normalized. The explicit relativePupilThroughputFactor is not multiplied into the kernel and remains owned by the separate optical-throughput path.\",\n \"Pupil amplitude shape can represent mechanical clipping/cat-eye geometry without silently encoding unknown transmission loss.\",\n \"The pupil and image-plane axes preserve full 2D orientation; no radial or sagittal/tangential averaging is imposed.\",\n \"This scalar Fraunhofer grid is a bounded reference approximation, not a full vector electromagnetic, polarization, stray-light or sensor-system model.\",\n \"Sensor OLPF, microlens, CFA, sampling and reconstruction are downstream and excluded.\"\n ]\n );\n}\n"]}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
2
|
+
* Thin-lens depth of field (DoF) and defocus blur.
|
|
3
|
+
*
|
|
4
|
+
* Depth-of-field limits are exact for a thin lens. They use the hyperfocal distance
|
|
5
|
+
* H = f^2/(Nc) + f:
|
|
6
|
+
* near = s(H - f)/(H + s - 2f)
|
|
7
|
+
* far = s(H - f)/(H - s), infinite (null) when s >= H
|
|
8
|
+
* The model is geometric. It does not include diffraction, aberrations, focus breathing, pupil
|
|
9
|
+
* magnification or macro (high-magnification) effects.
|
|
10
|
+
*
|
|
11
|
+
* The defocus circle is the geometric blur-circle diameter at the sensor for a subject plane that is
|
|
12
|
+
* not at the focus distance.
|
|
13
|
+
* @see docs/PHYSICS_FOUNDATION.md for the equations, units, coordinate conventions, known blockers
|
|
14
|
+
* and support limits.
|
|
10
15
|
*/
|
|
11
16
|
import { type CalculationResult } from "../core/calculation-result.js";
|
|
12
17
|
export interface CalculateDepthOfFieldInput {
|
|
@@ -28,11 +33,16 @@ export interface DepthOfField {
|
|
|
28
33
|
totalDepthOfFieldM: number | null;
|
|
29
34
|
}
|
|
30
35
|
/**
|
|
31
|
-
* Calculates thin-lens depth-of-field limits
|
|
32
|
-
*
|
|
36
|
+
* Calculates exact thin-lens depth-of-field limits. With hyperfocal
|
|
37
|
+
* distance H = f^2/(Nc) + f and focus distance s, the near limit is
|
|
38
|
+
* s(H - f)/(H + s - 2f) and the far limit is s(H - f)/(H - s), which is
|
|
39
|
+
* infinite (`null`) when s >= H. At both limits the geometric defocus circle
|
|
40
|
+
* from {@link calculateDefocusCircle} equals the supplied circle of confusion.
|
|
41
|
+
* The circle of confusion must be smaller than the aperture diameter f/N;
|
|
42
|
+
* otherwise the near limit would fall inside the focal length.
|
|
33
43
|
*
|
|
34
|
-
* The model is geometric
|
|
35
|
-
* focus breathing, pupil magnification
|
|
44
|
+
* The model is geometric. It does not include diffraction, aberrations,
|
|
45
|
+
* focus breathing, pupil magnification or macro (high-magnification) effects.
|
|
36
46
|
*
|
|
37
47
|
* @param input Lens, focus, aperture, and acceptable blur-circle inputs.
|
|
38
48
|
* @returns Hyperfocal, near, and far depth-of-field distances.
|
|
@@ -54,13 +64,14 @@ export interface DefocusCircle {
|
|
|
54
64
|
}
|
|
55
65
|
/**
|
|
56
66
|
* Calculates the geometric defocus-circle diameter at the sensor plane for a
|
|
57
|
-
* subject plane away from the selected focus plane
|
|
67
|
+
* subject plane away from the selected focus plane, using the stable closed
|
|
68
|
+
* form c = f^2 |s - d| / (N d (s - f)) (model 1.1.0).
|
|
58
69
|
*
|
|
59
70
|
* @param input Lens, aperture, focus-plane, and subject-plane distances.
|
|
60
71
|
* @returns Geometric blur-circle diameter.
|
|
61
72
|
*/
|
|
62
73
|
export declare function calculateDefocusCircle(input: CalculateDefocusCircleInput): CalculationResult<DefocusCircle>;
|
|
63
|
-
/** @internal Immutable request
|
|
74
|
+
/** @internal Immutable identity for one request. Not a public cache or API. */
|
|
64
75
|
export interface ResolvedDefocusFocusProjection {
|
|
65
76
|
readonly focalLengthMm: number;
|
|
66
77
|
readonly focusDistanceM: number;
|
|
@@ -68,4 +79,3 @@ export interface ResolvedDefocusFocusProjection {
|
|
|
68
79
|
}
|
|
69
80
|
/** @internal Reuses a projection already calculated for this exact POC request. */
|
|
70
81
|
export declare function calculateDefocusCircleUsingFocusProjection(input: CalculateDefocusCircleInput, projection?: ResolvedDefocusFocusProjection): CalculationResult<DefocusCircle>;
|
|
71
|
-
//# sourceMappingURL=depth-of-field.d.ts.map
|