@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spatio-spectral-reduction.js","sourceRoot":"","sources":["../../src/sensor/spatio-spectral-reduction.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"spatio-spectral-reduction.js","sourceRoot":"","sources":["../../src/sensor/spatio-spectral-reduction.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Spatio-spectral reduction: integrates spectral irradiance on the sensor over one site's area and\n * over wavelength, giving the incident light power on the site's geometric aperture.\n *\n * It stops before the sensor response: QE (quantum efficiency), A/W responsivity and colour-filter\n * transmission are applied in later steps.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport {\n approximationResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n sensorSpatialQuadratureNodeIdentityKey,\n validateSensorSpatialSamplingQuadrature,\n type SensorSpatialQuadratureNodeIdentity\n} from \"./spatial-sample-reduction.js\";\nimport type {\n SensorSpatialSamplingQuadrature\n} from \"./spatial-sampling-quadrature.js\";\nimport {\n validateSensorSpectralQuadrature,\n type SensorSpectralQuadrature,\n type SensorSpectralQuadratureNode\n} from \"./spectral-quadrature.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nconst SQUARE_MICROMETERS_TO_SQUARE_METERS = 1e-12;\nconst MAX_SPATIO_SPECTRAL_SAMPLE_VALUES = 100_000;\n\nexport interface SensorSpatioSpectralNodeIdentity {\n spatialNode: SensorSpatialQuadratureNodeIdentity;\n spectralSampleIndex: number;\n wavelengthNanometers: number;\n}\n\nexport interface SensorSpatioSpectralIrradianceSample {\n node: SensorSpatioSpectralNodeIdentity;\n /**\n * Spectral irradiance at the spatial node's preAntiAliasingSourcePointMm\n * and this spectral node's wavelength.\n *\n * Units: W/m^2/nm.\n */\n spectralIrradianceWattsPerSquareMeterPerNanometer: number;\n}\n\nexport interface ReduceSensorSpatioSpectralIrradianceInput {\n spatialQuadrature: SensorSpatialSamplingQuadrature;\n spectralQuadrature: SensorSpectralQuadrature;\n /**\n * Exactly one E_lambda(x,y) value, with its node identity, for every\n * combination of spatial node and spectral node.\n *\n * Order does not matter; the node identity does.\n */\n sampleValues: readonly SensorSpatioSpectralIrradianceSample[];\n}\n\nexport interface SensorSpatioSpectralWavelengthReduction {\n spectralSampleIndex: number;\n wavelengthNanometers: number;\n wavelengthMeasureNanometers: number;\n normalizedWavelengthWeight: number;\n /**\n * Spatially reduced spectral irradiance at this wavelength.\n * Units: W/m^2/nm.\n */\n normalizedSpatialAverageSpectralIrradianceWattsPerSquareMeterPerNanometer:\n number;\n /**\n * Spectral radiant flux reaching the geometric sensitive aperture, after the\n * declared normalized AA spreading. Units: W/nm.\n *\n * This uses geometric area, not an established light-collection area.\n */\n geometricApertureIncidentSpectralFluxWattsPerNanometer: number;\n /**\n * Contribution to the wavelength-integrated spatial average.\n * Units: W/m^2.\n */\n wavelengthIntegratedSpatialAverageContributionWattsPerSquareMeter: number;\n /**\n * Contribution to wavelength-integrated geometric-aperture incident flux.\n * Units: W.\n */\n wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts: number;\n}\n\nexport interface SensorSpatioSpectralIrradianceReduction {\n colorSamplingProfileId: string;\n samplingApertureProfileId?: string;\n opticalStackProfileId?: string;\n site: {\n x: number;\n y: number;\n };\n channelId: string;\n responseProfileId: string;\n sourceResponseKind:\n SensorSpectralQuadrature[\"sourceResponseKind\"];\n responseScope:\n SensorSpectralQuadrature[\"responseScope\"];\n responseScientificStatus:\n SensorSpectralQuadrature[\"responseScientificStatus\"];\n responseUncertainty:\n SensorSpectralQuadrature[\"responseUncertainty\"];\n responseChannelBinding?:\n SensorSpectralQuadrature[\"responseChannelBinding\"];\n responseReferenceConditions?:\n SensorSpectralQuadrature[\"responseReferenceConditions\"];\n wavelengthBasis:\n SensorSpectralQuadrature[\"wavelengthBasis\"];\n wavelengthBasisResolved: boolean;\n wavelengthRangeNanometers:\n SensorSpectralQuadrature[\"wavelengthRangeNanometers\"];\n responseDeclaredWavelengthRangeNanometers:\n SensorSpectralQuadrature[\"responseDeclaredWavelengthRangeNanometers\"];\n outputMeaning:\n \"pre-response-spatio-spectral-radiometric-reduction\";\n inputValueDomain: {\n kind: \"radiometric-spectral-irradiance\";\n unit: \"W/m^2/nm\";\n semantic:\n \"pre-aa-pre-response-sensor-plane-spectral-irradiance\";\n };\n spatialNodeCount: number;\n spectralNodeCount: number;\n combinedSampleCount: number;\n sourceValuesMatchedBy:\n \"spatial-node-identity-plus-spectral-sample-index-and-wavelength\";\n sourceValuesSuppliedForAllCombinedNodes: true;\n outsideImagingAreaSourceValuesRequired: boolean;\n geometricApertureAreaSquareMicrometers?: number;\n nominalSiteCellAreaSquareMicrometers?: number;\n geometricSensitiveAreaFractionOfLatticeCell?: number;\n perWavelength:\n readonly SensorSpatioSpectralWavelengthReduction[];\n /**\n * Integral over the requested wavelength interval of the spatially averaged\n * spectral irradiance. Units: W/m^2.\n */\n wavelengthIntegratedSpatialAverageIrradianceWattsPerSquareMeter:\n number;\n /**\n * Integral over the requested wavelength interval and the geometric\n * aperture area. Units: W.\n *\n * This is the incident radiant flux before the sensor response, over the\n * declared wavelength interval. It is not collected power or generated charge.\n */\n wavelengthIntegratedGeometricApertureIncidentFluxWatts:\n number;\n spatialIntegrationApplied: true;\n wavelengthIntegrationApplied: true;\n spectralResponsePlanUsedForWavelengthSupport: true;\n spectralResponseApplicationPerformed: false;\n responseScopeMatchedToSourcePlane: false;\n quantumEfficiencyApplied: false;\n spectralResponsivityApplied: false;\n channelFilterTransmissionApplied: false;\n opticalTransmissionAppliedByReducer: false;\n radiometricCollectionAreaEstablished: false;\n temporalIntegrationApplied: false;\n exposureDurationApplied: false;\n photonsCalculated: false;\n electronsCalculated: false;\n currentCalculated: false;\n shotNoiseApplied: false;\n readNoiseApplied: false;\n adcQuantizationApplied: false;\n rawCodeValueProduced: false;\n demosaicOrReconstructionApplied: false;\n convergenceErrorEstimated: false;\n componentEvidence: {\n spatial:\n SensorSpatialSamplingQuadrature[\"componentEvidence\"];\n spectral:\n SensorSpectralQuadrature[\"componentEvidence\"];\n };\n}\n\nfunction requireSafeNonNegativeInteger(\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 InvalidScientificInputError(\n path + \" must be a non-negative safe integer.\"\n );\n }\n return value;\n}\n\nfunction requireNonNegativeFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value) ||\n value < 0\n ) {\n throw new InvalidScientificInputError(\n path +\n \" must be finite and greater than or equal to zero.\"\n );\n }\n return value;\n}\n\nfunction sampleKey(\n spatialNode:\n SensorSpatialQuadratureNodeIdentity,\n spectralSampleIndex: number\n): string {\n return (\n sensorSpatialQuadratureNodeIdentityKey(\n spatialNode\n ) +\n \"|\" +\n spectralSampleIndex\n );\n}\n\nfunction parseSamples<T extends { node: SensorSpatioSpectralNodeIdentity }, V>(\n sampleValues:\n readonly T[],\n spatialNodesByKey: ReadonlyMap<\n string,\n SensorSpatialSamplingQuadrature[\"nodes\"][number]\n >,\n spectralNodesByIndex: ReadonlyMap<\n number,\n SensorSpectralQuadratureNode\n >,\n combinedSampleCount: number,\n valueForSample: (sample: T, sampleIndex: number) => V\n): Map<string, V> {\n if (!Array.isArray(sampleValues)) {\n throw new InvalidConfigurationError(\n \"sampleValues must be an array.\"\n );\n }\n if (\n sampleValues.length !==\n combinedSampleCount\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues must contain exactly one value for every spatial × spectral quadrature node.\"\n );\n }\n\n const valuesByKey =\n new Map<string, V>();\n\n sampleValues.forEach(\n (sample, sampleIndex) => {\n if (\n typeof sample !== \"object\" ||\n sample === null ||\n typeof sample.node !== \"object\" ||\n sample.node === null ||\n typeof sample.node.spatialNode !==\n \"object\" ||\n sample.node.spatialNode === null\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues[\" +\n sampleIndex +\n \"] must contain a complete spatio-spectral node identity.\"\n );\n }\n\n const spatialNode = {\n antiAliasingComponentIndex:\n requireSafeNonNegativeInteger(\n sample.node.spatialNode\n .antiAliasingComponentIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spatialNode.antiAliasingComponentIndex\"\n ),\n apertureSampleXIndex:\n requireSafeNonNegativeInteger(\n sample.node.spatialNode\n .apertureSampleXIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spatialNode.apertureSampleXIndex\"\n ),\n apertureSampleYIndex:\n requireSafeNonNegativeInteger(\n sample.node.spatialNode\n .apertureSampleYIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spatialNode.apertureSampleYIndex\"\n )\n };\n const spatialKey =\n sensorSpatialQuadratureNodeIdentityKey(\n spatialNode\n );\n if (\n !spatialNodesByKey.has(\n spatialKey\n )\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues identifies a spatial node that is not present in spatialQuadrature.\"\n );\n }\n\n const spectralSampleIndex =\n requireSafeNonNegativeInteger(\n sample.node.spectralSampleIndex,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.spectralSampleIndex\"\n );\n const spectralNode =\n spectralNodesByIndex.get(\n spectralSampleIndex\n );\n if (spectralNode === undefined) {\n throw new InvalidScientificInputError(\n \"sampleValues identifies a spectral node that is not present in spectralQuadrature.\"\n );\n }\n\n const wavelengthNanometers =\n requireNonNegativeFinite(\n sample.node.wavelengthNanometers,\n \"sampleValues[\" +\n sampleIndex +\n \"].node.wavelengthNanometers\"\n );\n if (\n wavelengthNanometers !==\n spectralNode.wavelengthNanometers\n ) {\n throw new InvalidScientificInputError(\n \"sampleValues wavelengthNanometers must exactly match the identified spectral quadrature node.\"\n );\n }\n\n const key = sampleKey(\n spatialNode,\n spectralSampleIndex\n );\n if (valuesByKey.has(key)) {\n throw new InvalidScientificInputError(\n \"sampleValues contains duplicate spatio-spectral node identities.\"\n );\n }\n\n valuesByKey.set(\n key,\n valueForSample(sample, sampleIndex)\n );\n }\n );\n\n if (valuesByKey.size !== combinedSampleCount) {\n throw new InvalidScientificInputError(\"sampleValues must not contain sparse or missing node entries.\");\n }\n return valuesByKey;\n}\n\n/** Internal: matches samples to their spatial × spectral nodes. Each caller still validates values and applies its own equations. */\nexport function bindSensorSpatioSpectralSamples<T extends { node: SensorSpatioSpectralNodeIdentity }, V>(\n input: { spatialQuadrature: SensorSpatialSamplingQuadrature; spectralQuadrature: SensorSpectralQuadrature; sampleValues: readonly T[] },\n valueForSample: (sample: T, sampleIndex: number) => V\n): { spatialNodesByKey: Map<string, SensorSpatialSamplingQuadrature[\"nodes\"][number]>;\n spectralNodesByIndex: Map<number, SensorSpectralQuadratureNode>; colorSamplingProfileId: string;\n combinedSampleCount: number; valuesByKey: Map<string, V> } {\n const spatialNodesByKey =\n validateSensorSpatialSamplingQuadrature(\n input.spatialQuadrature\n );\n const spectralNodesByIndex =\n validateSensorSpectralQuadrature(\n input.spectralQuadrature\n );\n\n const colorSamplingProfileId =\n input.spatialQuadrature\n .colorSamplingProfileId;\n if (\n typeof colorSamplingProfileId !==\n \"string\" ||\n colorSamplingProfileId.trim().length ===\n 0\n ) {\n throw new InvalidScientificInputError(\n \"spatialQuadrature.colorSamplingProfileId is required for spatio-spectral composition.\"\n );\n }\n if (\n colorSamplingProfileId !==\n input.spectralQuadrature\n .colorSamplingProfileId\n ) {\n throw new InvalidScientificInputError(\n \"Spatial and spectral quadratures must reference the same colorSamplingProfileId.\"\n );\n }\n if (\n input.spatialQuadrature.channelId !==\n input.spectralQuadrature.channelId\n ) {\n throw new InvalidScientificInputError(\n \"Spatial and spectral quadratures must reference the same exact channelId.\"\n );\n }\n\n if (\n input.spatialQuadrature.outputMeaning !==\n \"pre-aa-optical-field-spatial-quadrature-nodes\" ||\n input.spatialQuadrature\n .spectralResponseIncluded !== false ||\n input.spatialQuadrature\n .temporalIntegrationIncluded !== false\n ) {\n throw new InvalidScientificInputError(\n \"spatialQuadrature semantics are incompatible with pre-response spatio-spectral reduction.\"\n );\n }\n\n const combinedSampleCount =\n spatialNodesByKey.size *\n spectralNodesByIndex.size;\n if (\n !Number.isSafeInteger(\n combinedSampleCount\n ) ||\n combinedSampleCount <= 0\n ) {\n throw new InvalidScientificInputError(\n \"Spatial × spectral quadrature sample count must be a positive safe integer.\"\n );\n }\n if (\n combinedSampleCount >\n MAX_SPATIO_SPECTRAL_SAMPLE_VALUES\n ) {\n throw new InvalidScientificInputError(\n \"Spatial × spectral quadrature sample count exceeds the safety limit of \" +\n MAX_SPATIO_SPECTRAL_SAMPLE_VALUES +\n \". Tile/batch the evaluation instead of materializing one oversized Cartesian product.\"\n );\n }\n\n const valuesByKey =\n parseSamples(\n input.sampleValues,\n spatialNodesByKey,\n spectralNodesByIndex,\n combinedSampleCount,\n valueForSample\n );\n\n return { spatialNodesByKey, spectralNodesByIndex, colorSamplingProfileId, combinedSampleCount, valuesByKey };\n}\n\n/**\n * Integrates supplied spectral irradiance on the sensor plane, E_lambda(x,y),\n * over every combination of an existing spatial quadrature and spectral\n * quadrature.\n *\n * Units: the density is in W/m^2/nm and wavelengthMeasureNanometers is dλ in\n * nm, so their product is in W/m^2. Do not convert dλ to metres unless the\n * density's per-nanometre unit is converted to match.\n *\n * Area integration uses the spatial quadrature's geometric area measures,\n * converted from square micrometres to square metres. The result is the\n * incident radiant flux on the geometric aperture only; geometric area is not\n * treated as an effective light-collection area.\n *\n * It deliberately stops before the sensor response. The spectral plan comes\n * from a specific response channel, so its wavelength range and breakpoints\n * fit that channel, but QE, A/W responsivity and colour-filter transmission are\n * not applied here. Matching the response's scope and source plane is a\n * separate later step.\n */\nexport function reduceSensorSpatioSpectralIrradiance(\n input:\n ReduceSensorSpatioSpectralIrradianceInput\n): CalculationResult<SensorSpatioSpectralIrradianceReduction> {\n requireInputKeys(input, \"reduceSensorSpatioSpectralIrradiance\", [\"spatialQuadrature\", \"spectralQuadrature\", \"sampleValues\"]);\n const { spatialNodesByKey, spectralNodesByIndex, colorSamplingProfileId, combinedSampleCount, valuesByKey } =\n bindSensorSpatioSpectralSamples(input, (sample, sampleIndex) => requireNonNegativeFinite(\n sample.spectralIrradianceWattsPerSquareMeterPerNanometer,\n \"sampleValues[\" + sampleIndex + \"].spectralIrradianceWattsPerSquareMeterPerNanometer\"\n ));\n\n const perWavelength:\n SensorSpatioSpectralWavelengthReduction[] =\n [];\n let wavelengthIntegratedSpatialAverage = 0;\n let wavelengthIntegratedGeometricFlux = 0;\n\n for (\n let spectralSampleIndex = 0;\n spectralSampleIndex <\n input.spectralQuadrature.totalNodeCount;\n spectralSampleIndex += 1\n ) {\n const spectralNode =\n spectralNodesByIndex.get(\n spectralSampleIndex\n );\n if (spectralNode === undefined) {\n throw new InvalidScientificInputError(\n \"spectralQuadrature is missing a validated contiguous spectral sample.\"\n );\n }\n\n let spatialAverageSpectralIrradiance = 0;\n let geometricSpectralFluxWattsPerNanometer =\n 0;\n\n spatialNodesByKey.forEach(\n (spatialNode, spatialKey) => {\n const value =\n valuesByKey.get(\n spatialKey +\n \"|\" +\n spectralSampleIndex\n );\n if (value === undefined) {\n throw new InvalidScientificInputError(\n \"A spatio-spectral quadrature node is missing its explicit source value.\"\n );\n }\n\n spatialAverageSpectralIrradiance +=\n value *\n spatialNode\n .combinedNormalizedSpatialWeight;\n geometricSpectralFluxWattsPerNanometer +=\n value *\n (\n spatialNode\n .combinedAreaMeasureSquareMicrometers *\n SQUARE_MICROMETERS_TO_SQUARE_METERS\n );\n\n if (\n !Number.isFinite(\n spatialAverageSpectralIrradiance\n ) ||\n !Number.isFinite(\n geometricSpectralFluxWattsPerNanometer\n )\n ) {\n throw new InvalidScientificInputError(\n \"Reduced spatio-spectral values must remain finite.\"\n );\n }\n }\n );\n\n const spatialAverageContribution =\n spatialAverageSpectralIrradiance *\n spectralNode\n .wavelengthMeasureNanometers;\n const geometricFluxContribution =\n geometricSpectralFluxWattsPerNanometer *\n spectralNode\n .wavelengthMeasureNanometers;\n\n wavelengthIntegratedSpatialAverage +=\n spatialAverageContribution;\n wavelengthIntegratedGeometricFlux +=\n geometricFluxContribution;\n\n if (\n !Number.isFinite(\n wavelengthIntegratedSpatialAverage\n ) ||\n !Number.isFinite(\n wavelengthIntegratedGeometricFlux\n )\n ) {\n throw new InvalidScientificInputError(\n \"Wavelength-integrated spatio-spectral values must remain finite.\"\n );\n }\n\n perWavelength.push({\n spectralSampleIndex,\n wavelengthNanometers:\n spectralNode.wavelengthNanometers,\n wavelengthMeasureNanometers:\n spectralNode\n .wavelengthMeasureNanometers,\n normalizedWavelengthWeight:\n spectralNode\n .normalizedWavelengthWeight,\n normalizedSpatialAverageSpectralIrradianceWattsPerSquareMeterPerNanometer:\n spatialAverageSpectralIrradiance,\n geometricApertureIncidentSpectralFluxWattsPerNanometer:\n geometricSpectralFluxWattsPerNanometer,\n wavelengthIntegratedSpatialAverageContributionWattsPerSquareMeter:\n spatialAverageContribution,\n wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts:\n geometricFluxContribution\n });\n }\n\n return approximationResult(\n {\n colorSamplingProfileId,\n ...(input.spatialQuadrature\n .samplingApertureProfileId ===\n undefined\n ? {}\n : {\n samplingApertureProfileId:\n input.spatialQuadrature\n .samplingApertureProfileId\n }),\n ...(input.spatialQuadrature\n .opticalStackProfileId ===\n undefined\n ? {}\n : {\n opticalStackProfileId:\n input.spatialQuadrature\n .opticalStackProfileId\n }),\n site: {\n ...input.spatialQuadrature.site\n },\n channelId:\n input.spatialQuadrature.channelId,\n responseProfileId:\n input.spectralQuadrature.profileId,\n sourceResponseKind:\n input.spectralQuadrature\n .sourceResponseKind,\n responseScope:\n input.spectralQuadrature\n .responseScope,\n responseScientificStatus:\n input.spectralQuadrature\n .responseScientificStatus,\n responseUncertainty:\n input.spectralQuadrature\n .responseUncertainty,\n ...(input.spectralQuadrature\n .responseChannelBinding ===\n undefined\n ? {}\n : {\n responseChannelBinding:\n input.spectralQuadrature\n .responseChannelBinding\n }),\n ...(input.spectralQuadrature\n .responseReferenceConditions ===\n undefined\n ? {}\n : {\n responseReferenceConditions:\n input.spectralQuadrature\n .responseReferenceConditions\n }),\n wavelengthBasis:\n input.spectralQuadrature\n .wavelengthBasis,\n wavelengthBasisResolved:\n input.spectralQuadrature\n .wavelengthBasisResolved,\n wavelengthRangeNanometers: {\n ...input.spectralQuadrature\n .wavelengthRangeNanometers\n },\n responseDeclaredWavelengthRangeNanometers:\n {\n ...input.spectralQuadrature\n .responseDeclaredWavelengthRangeNanometers\n },\n outputMeaning:\n \"pre-response-spatio-spectral-radiometric-reduction\",\n inputValueDomain: {\n kind:\n \"radiometric-spectral-irradiance\",\n unit: \"W/m^2/nm\",\n semantic:\n \"pre-aa-pre-response-sensor-plane-spectral-irradiance\"\n },\n spatialNodeCount:\n input.spatialQuadrature\n .totalNodeCount,\n spectralNodeCount:\n input.spectralQuadrature\n .totalNodeCount,\n combinedSampleCount,\n sourceValuesMatchedBy:\n \"spatial-node-identity-plus-spectral-sample-index-and-wavelength\",\n sourceValuesSuppliedForAllCombinedNodes:\n true,\n outsideImagingAreaSourceValuesRequired:\n input.spatialQuadrature\n .preAntiAliasingSourceOutsideImagingAreaNodeCount >\n 0,\n geometricApertureAreaSquareMicrometers:\n input.spatialQuadrature\n .geometricApertureAreaSquareMicrometers,\n ...(input.spatialQuadrature\n .nominalSiteCellAreaSquareMicrometers ===\n undefined\n ? {}\n : {\n nominalSiteCellAreaSquareMicrometers:\n input.spatialQuadrature\n .nominalSiteCellAreaSquareMicrometers\n }),\n ...(input.spatialQuadrature\n .geometricSensitiveAreaFractionOfLatticeCell ===\n undefined\n ? {}\n : {\n geometricSensitiveAreaFractionOfLatticeCell:\n input.spatialQuadrature\n .geometricSensitiveAreaFractionOfLatticeCell\n }),\n perWavelength,\n wavelengthIntegratedSpatialAverageIrradianceWattsPerSquareMeter:\n wavelengthIntegratedSpatialAverage,\n wavelengthIntegratedGeometricApertureIncidentFluxWatts:\n wavelengthIntegratedGeometricFlux,\n spatialIntegrationApplied: true,\n wavelengthIntegrationApplied: true,\n spectralResponsePlanUsedForWavelengthSupport:\n true,\n spectralResponseApplicationPerformed:\n false,\n responseScopeMatchedToSourcePlane:\n false,\n quantumEfficiencyApplied: false,\n spectralResponsivityApplied: false,\n channelFilterTransmissionApplied:\n false,\n opticalTransmissionAppliedByReducer:\n false,\n radiometricCollectionAreaEstablished:\n false,\n temporalIntegrationApplied: false,\n exposureDurationApplied: false,\n photonsCalculated: false,\n electronsCalculated: false,\n currentCalculated: false,\n shotNoiseApplied: false,\n readNoiseApplied: false,\n adcQuantizationApplied: false,\n rawCodeValueProduced: false,\n demosaicOrReconstructionApplied:\n false,\n convergenceErrorEstimated: false,\n componentEvidence: {\n spatial:\n input.spatialQuadrature\n .componentEvidence,\n spectral:\n input.spectralQuadrature\n .componentEvidence\n }\n },\n \"sensor-spatio-spectral-irradiance-reduction\",\n \"1.0.0\",\n [\n \"Input values are nonnegative sensor-plane spectral irradiance E_lambda(x,y) in W/m^2/nm, evaluated at every spatial pre-AA source coordinate and spectral quadrature wavelength.\",\n \"Spatial and spectral plans must share the exact colorSamplingProfileId and channelId; a matching channel label alone is insufficient linkage.\",\n \"The full Cartesian product is explicit and capped at 100,000 supplied sample values to avoid multiplicative memory blowups.\",\n \"Spatial normalized weights form the per-wavelength average; geometric square-micrometre area measures are converted to square metres for incident spectral flux density.\",\n \"Physical wavelength integration multiplies W/m^2/nm or W/nm by d-lambda in nm. No extra 1e-9 factor is applied because the spectral density is already per nanometre.\",\n \"The spatial AA kernel is the existing normalized throughput-free spatial redistribution; this reducer adds no omitted optical-stack or microlens throughput.\",\n \"The spectral quadrature's response-derived support and breakpoints are consumed, but QE, A/W responsivity and channel-filter transmission are not applied.\",\n \"Response scope is preserved for downstream work but is not matched to a declared source plane in this version.\",\n \"Geometric aperture area is not promoted to effective radiometric collection area.\",\n \"Temporal exposure integration, photon/electron conversion, electrical current, noise, saturation, ADC/RAW conversion and reconstruction remain separate future work.\",\n \"No source-independent spatio-spectral convergence/error estimate is reported; downstream integrand structure controls numerical error.\"\n ]\n );\n}\n"]}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* This exposes support and interpolation knots only. It does not apply QE or A/W responsivity and does
|
|
5
|
-
* not establish scene/optics coverage.
|
|
2
|
+
* Describes a sensor response channel's wavelength coverage in the shared spectral-coverage format
|
|
3
|
+
* (core/spectral-composition), so it can be intersected with the light source and optics.
|
|
6
4
|
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
7
5
|
* limits.
|
|
8
6
|
*/
|
|
@@ -14,11 +12,10 @@ export interface CreateSensorSpectralCoverageParticipantInput {
|
|
|
14
12
|
participantId?: string;
|
|
15
13
|
}
|
|
16
14
|
/**
|
|
17
|
-
*
|
|
18
|
-
* spectral-coverage
|
|
15
|
+
* Converts one parsed sensor response channel into the shared continuous
|
|
16
|
+
* spectral-coverage format.
|
|
19
17
|
*
|
|
20
|
-
*
|
|
21
|
-
* A/W responsivity and
|
|
18
|
+
* It gives only the wavelength range and interpolation breakpoints. It does not
|
|
19
|
+
* apply QE or A/W responsivity, and says nothing about scene or optics coverage.
|
|
22
20
|
*/
|
|
23
21
|
export declare function createSensorSpectralCoverageParticipant(input: CreateSensorSpectralCoverageParticipantInput): SpectralCoverageParticipant;
|
|
24
|
-
//# sourceMappingURL=spectral-coverage.d.ts.map
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
3
3
|
import { parseSensorSpectralResponseProfile } from "./spectral-response.js";
|
|
4
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
5
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
4
6
|
function responseCurves(response) {
|
|
5
7
|
if (response.kind ===
|
|
6
8
|
"effective-external-quantum-efficiency") {
|
|
@@ -20,18 +22,19 @@ function responseCurves(response) {
|
|
|
20
22
|
];
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
|
-
*
|
|
24
|
-
* spectral-coverage
|
|
25
|
+
* Converts one parsed sensor response channel into the shared continuous
|
|
26
|
+
* spectral-coverage format.
|
|
25
27
|
*
|
|
26
|
-
*
|
|
27
|
-
* A/W responsivity and
|
|
28
|
+
* It gives only the wavelength range and interpolation breakpoints. It does not
|
|
29
|
+
* apply QE or A/W responsivity, and says nothing about scene or optics coverage.
|
|
28
30
|
*/
|
|
29
31
|
export function createSensorSpectralCoverageParticipant(input) {
|
|
32
|
+
requireInputKeys(input, "createSensorSpectralCoverageParticipant", ["spectralResponseProfile", "channelId", "participantId"]);
|
|
30
33
|
const profile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
|
|
31
34
|
if (typeof input.channelId !==
|
|
32
35
|
"string" ||
|
|
33
36
|
input.channelId.trim().length === 0) {
|
|
34
|
-
throw new
|
|
37
|
+
throw new InvalidConfigurationError("channelId must be a non-empty string.");
|
|
35
38
|
}
|
|
36
39
|
const response = profile.channels.find((entry) => entry.channelId ===
|
|
37
40
|
input.channelId);
|
|
@@ -70,7 +73,7 @@ export function createSensorSpectralCoverageParticipant(input) {
|
|
|
70
73
|
":" +
|
|
71
74
|
input.channelId;
|
|
72
75
|
if (participantId.trim().length === 0) {
|
|
73
|
-
throw new
|
|
76
|
+
throw new InvalidConfigurationError("participantId must be a non-empty string when supplied.");
|
|
74
77
|
}
|
|
75
78
|
return {
|
|
76
79
|
participantId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spectral-coverage.js","sourceRoot":"","sources":["../../src/sensor/spectral-coverage.ts"],"names":[],"mappings":"AAAA,sCAAsC;
|
|
1
|
+
{"version":3,"file":"spectral-coverage.js","sourceRoot":"","sources":["../../src/sensor/spectral-coverage.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Describes a sensor response channel's wavelength coverage in the shared spectral-coverage format\n * (core/spectral-composition), so it can be intersected with the light source and optics.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport type {\n SpectralCoverageParticipant\n} from \"../core/spectral-composition.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n parseSensorSpectralResponseProfile,\n type SensorSpectralChannelResponse,\n type SensorSpectralResponseProfile\n} from \"./spectral-response.js\";\nimport { requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\n\nexport interface CreateSensorSpectralCoverageParticipantInput {\n spectralResponseProfile:\n SensorSpectralResponseProfile;\n channelId: string;\n participantId?: string;\n}\n\ntype ResponseCurve =\n | Extract<\n SensorSpectralChannelResponse,\n {\n kind:\n \"effective-external-quantum-efficiency\";\n }\n >[\"externalQuantumEfficiency\"]\n | Extract<\n SensorSpectralChannelResponse,\n {\n kind:\n \"effective-spectral-responsivity\";\n }\n >[\"spectralResponsivity\"]\n | Extract<\n SensorSpectralChannelResponse,\n {\n kind:\n \"separable-channel-filter-and-detector-eqe\";\n }\n >[\"channelFilterTransmittance\"];\n\nfunction responseCurves(\n response:\n SensorSpectralChannelResponse\n): readonly ResponseCurve[] {\n if (\n response.kind ===\n \"effective-external-quantum-efficiency\"\n ) {\n return [\n response.externalQuantumEfficiency\n ];\n }\n if (\n response.kind ===\n \"effective-spectral-responsivity\"\n ) {\n return [\n response.spectralResponsivity\n ];\n }\n return [\n response.channelFilterTransmittance,\n response.detectorExternalQuantumEfficiency\n ];\n}\n\n/**\n * Converts one parsed sensor response channel into the shared continuous\n * spectral-coverage format.\n *\n * It gives only the wavelength range and interpolation breakpoints. It does not\n * apply QE or A/W responsivity, and says nothing about scene or optics coverage.\n */\nexport function createSensorSpectralCoverageParticipant(\n input:\n CreateSensorSpectralCoverageParticipantInput\n): SpectralCoverageParticipant {\n requireInputKeys(input, \"createSensorSpectralCoverageParticipant\", [\"spectralResponseProfile\", \"channelId\", \"participantId\"]);\n const profile =\n parseSensorSpectralResponseProfile(\n input.spectralResponseProfile\n );\n\n if (\n typeof input.channelId !==\n \"string\" ||\n input.channelId.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"channelId must be a non-empty string.\"\n );\n }\n\n const response =\n profile.channels.find(\n (entry) =>\n entry.channelId ===\n input.channelId\n );\n if (response === undefined) {\n throw new InvalidScientificInputError(\n \"No spectral response is declared for the requested channelId.\"\n );\n }\n\n const curves =\n responseCurves(response);\n const wavelengthBasis =\n curves[0]!.wavelengthBasis;\n if (wavelengthBasis === \"unspecified\") {\n throw new InvalidScientificInputError(\n \"Sensor spectral coverage requires a resolved air or vacuum wavelength basis.\"\n );\n }\n if (\n curves.some(\n (curve) =>\n curve.wavelengthBasis !==\n wavelengthBasis\n )\n ) {\n throw new InvalidScientificInputError(\n \"Sensor response component curves must share one wavelengthBasis before coverage composition.\"\n );\n }\n\n const minimum = Math.max(\n ...curves.map(\n (curve) =>\n curve.samples[0]!\n .wavelengthNanometers\n )\n );\n const maximum = Math.min(\n ...curves.map(\n (curve) =>\n curve.samples[\n curve.samples.length - 1\n ]!.wavelengthNanometers\n )\n );\n if (!(minimum < maximum)) {\n throw new InvalidScientificInputError(\n \"Sensor response component curves do not share a non-empty wavelength interval.\"\n );\n }\n\n const breakpoints =\n new Set<number>();\n for (const curve of curves) {\n for (const sample of curve.samples) {\n if (\n sample.wavelengthNanometers >\n minimum &&\n sample.wavelengthNanometers <\n maximum\n ) {\n breakpoints.add(\n sample.wavelengthNanometers\n );\n }\n }\n }\n\n const participantId =\n input.participantId ??\n \"sensor-response:\" +\n profile.profileId +\n \":\" +\n input.channelId;\n\n if (\n participantId.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n \"participantId must be a non-empty string when supplied.\"\n );\n }\n\n return {\n participantId,\n role: \"sensor-response\",\n wavelengthBasis,\n wavelengthRangeNanometers: {\n minimum,\n maximum\n },\n breakpointsNanometers:\n [...breakpoints].sort(\n (a, b) => a - b\n )\n };\n}\n"]}
|
|
@@ -1,21 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* response channel's declared usable range. Response-curve knots and optional caller-provided
|
|
10
|
-
* continuous-spectrum/optics breakpoints partition that range. Each segment is then subdivided so no
|
|
11
|
-
* midpoint subinterval exceeds maximumSubintervalWidthNanometers. wavelengthMeasureNanometers is
|
|
12
|
-
* d-lambda in nanometres. It is not a dimensionless response weight. Future integration must use a
|
|
13
|
-
* source spectral density expressed per nanometre or explicitly convert units before multiplying by
|
|
14
|
-
* this measure. This function deliberately does not apply QE or A/W responsivity. Those
|
|
15
|
-
* representations have different compatible downstream signal domains: QE is photon-to-electron
|
|
16
|
-
* efficiency, while A/W responsivity relates incident radiant power to electrical current. A later
|
|
17
|
-
* versioned composition must also match responseScope to the source plane and collection-area
|
|
18
|
-
* semantics before integrating any signal.
|
|
2
|
+
* Spectral quadrature: the wavelength sample points (nodes) and step widths used to integrate light
|
|
3
|
+
* over wavelength for one sensor response channel.
|
|
4
|
+
*
|
|
5
|
+
* Each node is the midpoint of a wavelength interval, with its width dλ in nanometres. The intervals
|
|
6
|
+
* stay inside the range the response supports. Lining nodes up with curve breakpoints does not prove
|
|
7
|
+
* the integral has converged. Discrete (delta-like) emission lines need their own integration and are
|
|
8
|
+
* never silently widened into continuous bins.
|
|
19
9
|
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
20
10
|
* limits.
|
|
21
11
|
*/
|
|
@@ -31,26 +21,26 @@ export interface CalculateSensorSpectralQuadratureInput {
|
|
|
31
21
|
channelId: string;
|
|
32
22
|
wavelengthBasis: SpectralWavelengthBasis;
|
|
33
23
|
/**
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
24
|
+
* Wavelength interval to sample. It is checked only against the range the
|
|
25
|
+
* sensor response supports, not against scene-spectrum or optical-transmission
|
|
26
|
+
* coverage.
|
|
37
27
|
*/
|
|
38
28
|
wavelengthRangeNanometers: SensorSpectralWavelengthRangeNanometers;
|
|
39
29
|
/**
|
|
40
|
-
*
|
|
30
|
+
* Strict upper limit on the width of each midpoint subinterval.
|
|
41
31
|
*
|
|
42
|
-
* Response
|
|
43
|
-
* range first
|
|
44
|
-
*
|
|
32
|
+
* Response breakpoints and any additional breakpoints split the requested
|
|
33
|
+
* range first. Each segment is then subdivided until every subinterval is
|
|
34
|
+
* no wider than this value.
|
|
45
35
|
*/
|
|
46
36
|
maximumSubintervalWidthNanometers: number;
|
|
47
37
|
/**
|
|
48
38
|
* Optional strictly increasing wavelength breakpoints from other continuous
|
|
49
|
-
* spectral
|
|
50
|
-
*
|
|
39
|
+
* spectral inputs, such as the interpolation points of a scene spectrum or of
|
|
40
|
+
* optical transmission. Values must be strictly inside the requested range.
|
|
51
41
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
42
|
+
* Passing them does not claim those other inputs are available or valid over
|
|
43
|
+
* the requested range.
|
|
54
44
|
*/
|
|
55
45
|
additionalBreakpointsNanometers?: readonly number[];
|
|
56
46
|
}
|
|
@@ -64,16 +54,16 @@ export interface SensorSpectralQuadratureNode {
|
|
|
64
54
|
*/
|
|
65
55
|
wavelengthNanometers: number;
|
|
66
56
|
/**
|
|
67
|
-
* d
|
|
57
|
+
* dλ (wavelength width) this node stands for. Units: nm.
|
|
68
58
|
*
|
|
69
|
-
*
|
|
70
|
-
* photon count, radiant energy, current
|
|
59
|
+
* It is only a wavelength width. It is not response-weighted throughput,
|
|
60
|
+
* a photon count, radiant energy, current or a dimensionless probability.
|
|
71
61
|
*/
|
|
72
62
|
wavelengthMeasureNanometers: number;
|
|
73
63
|
/**
|
|
74
|
-
*
|
|
64
|
+
* The wavelength width divided by the requested range width (dimensionless).
|
|
75
65
|
*
|
|
76
|
-
*
|
|
66
|
+
* Useful for averages, but it is not a sensor-response weight.
|
|
77
67
|
*/
|
|
78
68
|
normalizedWavelengthWeight: number;
|
|
79
69
|
}
|
|
@@ -94,7 +84,7 @@ export interface SensorSpectralQuadrature {
|
|
|
94
84
|
quadratureScheme: "response-breakpoint-aware-bounded-midpoint";
|
|
95
85
|
segmentBoundarySource: "requested-range-plus-response-knots-plus-optional-additional-breakpoints";
|
|
96
86
|
/**
|
|
97
|
-
*
|
|
87
|
+
* Sorted, unique segment boundaries, including the ends of the requested range.
|
|
98
88
|
*/
|
|
99
89
|
segmentBoundariesNanometers: readonly number[];
|
|
100
90
|
maximumSubintervalWidthNanometers: number;
|
|
@@ -111,7 +101,7 @@ export interface SensorSpectralQuadrature {
|
|
|
111
101
|
curves: readonly (readonly EvidenceProvenance[])[];
|
|
112
102
|
};
|
|
113
103
|
/**
|
|
114
|
-
*
|
|
104
|
+
* Fixed statements of what this result does not include.
|
|
115
105
|
*/
|
|
116
106
|
responseValuesIncluded: false;
|
|
117
107
|
responseApplicationPerformed: false;
|
|
@@ -131,39 +121,35 @@ export interface SensorSpectralQuadrature {
|
|
|
131
121
|
convergenceErrorEstimated: false;
|
|
132
122
|
}
|
|
133
123
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
124
|
+
* Rechecks a supplied wavelength plan (node identities, coverage and widths in nanometres) before it
|
|
125
|
+
* is used.
|
|
136
126
|
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* @
|
|
141
|
-
* @returns Map<number, SensorSpectralQuadratureNode>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
127
|
+
* Lining nodes up with breakpoints does not prove convergence. Discrete (delta-like) lines need their
|
|
128
|
+
* own integration and are never silently widened into continuous bins.
|
|
129
|
+
* @param quadrature - The input; see `SensorSpectralQuadrature` for its fields, units and coordinates.
|
|
130
|
+
* @returns The result. Success does not imply calibration.
|
|
142
131
|
*
|
|
143
|
-
* @see docs/API_REFERENCE.md for the
|
|
132
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
144
133
|
*/
|
|
145
134
|
export declare function validateSensorSpectralQuadrature(quadrature: SensorSpectralQuadrature): Map<number, SensorSpectralQuadratureNode>;
|
|
146
135
|
/**
|
|
147
|
-
* Builds deterministic wavelength
|
|
148
|
-
*
|
|
136
|
+
* Builds deterministic wavelength sample points for one exact sensor response
|
|
137
|
+
* channel. It does not apply the response to any spectrum.
|
|
149
138
|
*
|
|
150
|
-
* The requested
|
|
151
|
-
*
|
|
152
|
-
*
|
|
153
|
-
* then subdivided so no midpoint subinterval
|
|
139
|
+
* The requested range must lie fully inside the channel's declared usable
|
|
140
|
+
* range. The response curve's breakpoints, plus any caller-supplied breakpoints
|
|
141
|
+
* from the source spectrum or optics, split that range into segments. Each
|
|
142
|
+
* segment is then subdivided so no midpoint subinterval is wider than
|
|
154
143
|
* maximumSubintervalWidthNanometers.
|
|
155
144
|
*
|
|
156
|
-
* wavelengthMeasureNanometers is d
|
|
157
|
-
*
|
|
158
|
-
*
|
|
159
|
-
* multiplying by this measure.
|
|
145
|
+
* wavelengthMeasureNanometers is dλ in nanometres, not a dimensionless response
|
|
146
|
+
* weight. Multiply it only by a spectral density per nanometre, or convert
|
|
147
|
+
* units explicitly first.
|
|
160
148
|
*
|
|
161
|
-
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
166
|
-
* integrating any signal.
|
|
149
|
+
* QE and A/W responsivity are deliberately not applied. They lead to different
|
|
150
|
+
* signals: QE is photon-to-electron efficiency, while A/W responsivity relates
|
|
151
|
+
* incident radiant power to electrical current. A later step must also match
|
|
152
|
+
* responseScope to the source plane and collection area before integrating any
|
|
153
|
+
* signal.
|
|
167
154
|
*/
|
|
168
155
|
export declare function calculateSensorSpectralQuadrature(input: CalculateSensorSpectralQuadratureInput): CalculationResult<SensorSpectralQuadrature>;
|
|
169
|
-
//# sourceMappingURL=spectral-quadrature.d.ts.map
|
|
@@ -1,22 +1,12 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* response channel's declared usable range. Response-curve knots and optional caller-provided
|
|
11
|
-
* continuous-spectrum/optics breakpoints partition that range. Each segment is then subdivided so no
|
|
12
|
-
* midpoint subinterval exceeds maximumSubintervalWidthNanometers. wavelengthMeasureNanometers is
|
|
13
|
-
* d-lambda in nanometres. It is not a dimensionless response weight. Future integration must use a
|
|
14
|
-
* source spectral density expressed per nanometre or explicitly convert units before multiplying by
|
|
15
|
-
* this measure. This function deliberately does not apply QE or A/W responsivity. Those
|
|
16
|
-
* representations have different compatible downstream signal domains: QE is photon-to-electron
|
|
17
|
-
* efficiency, while A/W responsivity relates incident radiant power to electrical current. A later
|
|
18
|
-
* versioned composition must also match responseScope to the source plane and collection-area
|
|
19
|
-
* semantics before integrating any signal.
|
|
3
|
+
* Spectral quadrature: the wavelength sample points (nodes) and step widths used to integrate light
|
|
4
|
+
* over wavelength for one sensor response channel.
|
|
5
|
+
*
|
|
6
|
+
* Each node is the midpoint of a wavelength interval, with its width dλ in nanometres. The intervals
|
|
7
|
+
* stay inside the range the response supports. Lining nodes up with curve breakpoints does not prove
|
|
8
|
+
* the integral has converged. Discrete (delta-like) emission lines need their own integration and are
|
|
9
|
+
* never silently widened into continuous bins.
|
|
20
10
|
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
21
11
|
* limits.
|
|
22
12
|
*/
|
|
@@ -24,6 +14,8 @@ import { approximationResult } from "../core/calculation-result.js";
|
|
|
24
14
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
25
15
|
import { parseSensorColorSamplingProfile } from "./color-sampling.js";
|
|
26
16
|
import { createSensorSpectralResponseChannelBinding, parseSensorSpectralResponseProfile, resolveSensorSpectralResponseAtWavelength } from "./spectral-response.js";
|
|
17
|
+
import { requireInputKeys } from "../core/record-validation.js";
|
|
18
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
27
19
|
const MAX_SPECTRAL_QUADRATURE_NODES = 100_000;
|
|
28
20
|
function requirePositiveFinite(value, path) {
|
|
29
21
|
if (typeof value !== "number" ||
|
|
@@ -36,7 +28,7 @@ function requirePositiveFinite(value, path) {
|
|
|
36
28
|
function channelResponse(profile, channelId) {
|
|
37
29
|
if (typeof channelId !== "string" ||
|
|
38
30
|
channelId.trim().length === 0) {
|
|
39
|
-
throw new
|
|
31
|
+
throw new InvalidConfigurationError("channelId must be a non-empty string.");
|
|
40
32
|
}
|
|
41
33
|
const response = profile.channels.find((entry) => entry.channelId === channelId);
|
|
42
34
|
if (response === undefined) {
|
|
@@ -74,7 +66,7 @@ function usableResponseRange(curves) {
|
|
|
74
66
|
function parseRequestedRange(input, usable) {
|
|
75
67
|
if (typeof input !== "object" ||
|
|
76
68
|
input === null) {
|
|
77
|
-
throw new
|
|
69
|
+
throw new InvalidConfigurationError("wavelengthRangeNanometers must be an object.");
|
|
78
70
|
}
|
|
79
71
|
const minimum = requirePositiveFinite(input.minimum, "wavelengthRangeNanometers.minimum");
|
|
80
72
|
const maximum = requirePositiveFinite(input.maximum, "wavelengthRangeNanometers.maximum");
|
|
@@ -92,7 +84,7 @@ function additionalBreakpoints(value, range) {
|
|
|
92
84
|
return [];
|
|
93
85
|
}
|
|
94
86
|
if (!Array.isArray(value)) {
|
|
95
|
-
throw new
|
|
87
|
+
throw new InvalidConfigurationError("additionalBreakpointsNanometers must be an array when supplied.");
|
|
96
88
|
}
|
|
97
89
|
if (value.length >=
|
|
98
90
|
MAX_SPECTRAL_QUADRATURE_NODES) {
|
|
@@ -190,22 +182,21 @@ function approximatelyEqual(actual, expected, tolerance = SPECTRAL_VALIDATION_TO
|
|
|
190
182
|
tolerance * scale);
|
|
191
183
|
}
|
|
192
184
|
/**
|
|
193
|
-
*
|
|
194
|
-
*
|
|
185
|
+
* Rechecks a supplied wavelength plan (node identities, coverage and widths in nanometres) before it
|
|
186
|
+
* is used.
|
|
195
187
|
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
* @
|
|
200
|
-
* @returns Map<number, SensorSpectralQuadratureNode>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
188
|
+
* Lining nodes up with breakpoints does not prove convergence. Discrete (delta-like) lines need their
|
|
189
|
+
* own integration and are never silently widened into continuous bins.
|
|
190
|
+
* @param quadrature - The input; see `SensorSpectralQuadrature` for its fields, units and coordinates.
|
|
191
|
+
* @returns The result. Success does not imply calibration.
|
|
201
192
|
*
|
|
202
|
-
* @see docs/API_REFERENCE.md for the
|
|
193
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
203
194
|
*/
|
|
204
195
|
export function validateSensorSpectralQuadrature(quadrature) {
|
|
205
196
|
if (typeof quadrature !== "object" ||
|
|
206
197
|
quadrature === null ||
|
|
207
198
|
!Array.isArray(quadrature.nodes)) {
|
|
208
|
-
throw new
|
|
199
|
+
throw new InvalidConfigurationError("spectralQuadrature must contain a nodes array.");
|
|
209
200
|
}
|
|
210
201
|
for (const [field, value] of [
|
|
211
202
|
["profileId", quadrature.profileId],
|
|
@@ -217,7 +208,7 @@ export function validateSensorSpectralQuadrature(quadrature) {
|
|
|
217
208
|
]) {
|
|
218
209
|
if (typeof value !== "string" ||
|
|
219
210
|
value.trim().length === 0) {
|
|
220
|
-
throw new
|
|
211
|
+
throw new InvalidConfigurationError("spectralQuadrature." +
|
|
221
212
|
field +
|
|
222
213
|
" must be a non-empty string.");
|
|
223
214
|
}
|
|
@@ -225,7 +216,7 @@ export function validateSensorSpectralQuadrature(quadrature) {
|
|
|
225
216
|
if (quadrature.wavelengthBasis !== "air" &&
|
|
226
217
|
quadrature.wavelengthBasis !== "vacuum" &&
|
|
227
218
|
quadrature.wavelengthBasis !== "unspecified") {
|
|
228
|
-
throw new
|
|
219
|
+
throw new InvalidConfigurationError("spectralQuadrature.wavelengthBasis is invalid.");
|
|
229
220
|
}
|
|
230
221
|
const rangeMinimum = requirePositiveFinite(quadrature.wavelengthRangeNanometers.minimum, "spectralQuadrature.wavelengthRangeNanometers.minimum");
|
|
231
222
|
const rangeMaximum = requirePositiveFinite(quadrature.wavelengthRangeNanometers.maximum, "spectralQuadrature.wavelengthRangeNanometers.maximum");
|
|
@@ -386,33 +377,32 @@ export function validateSensorSpectralQuadrature(quadrature) {
|
|
|
386
377
|
return nodesByIndex;
|
|
387
378
|
}
|
|
388
379
|
/**
|
|
389
|
-
* Builds deterministic wavelength
|
|
390
|
-
*
|
|
380
|
+
* Builds deterministic wavelength sample points for one exact sensor response
|
|
381
|
+
* channel. It does not apply the response to any spectrum.
|
|
391
382
|
*
|
|
392
|
-
* The requested
|
|
393
|
-
*
|
|
394
|
-
*
|
|
395
|
-
* then subdivided so no midpoint subinterval
|
|
383
|
+
* The requested range must lie fully inside the channel's declared usable
|
|
384
|
+
* range. The response curve's breakpoints, plus any caller-supplied breakpoints
|
|
385
|
+
* from the source spectrum or optics, split that range into segments. Each
|
|
386
|
+
* segment is then subdivided so no midpoint subinterval is wider than
|
|
396
387
|
* maximumSubintervalWidthNanometers.
|
|
397
388
|
*
|
|
398
|
-
* wavelengthMeasureNanometers is d
|
|
399
|
-
*
|
|
400
|
-
*
|
|
401
|
-
* multiplying by this measure.
|
|
389
|
+
* wavelengthMeasureNanometers is dλ in nanometres, not a dimensionless response
|
|
390
|
+
* weight. Multiply it only by a spectral density per nanometre, or convert
|
|
391
|
+
* units explicitly first.
|
|
402
392
|
*
|
|
403
|
-
*
|
|
404
|
-
*
|
|
405
|
-
*
|
|
406
|
-
*
|
|
407
|
-
*
|
|
408
|
-
* integrating any signal.
|
|
393
|
+
* QE and A/W responsivity are deliberately not applied. They lead to different
|
|
394
|
+
* signals: QE is photon-to-electron efficiency, while A/W responsivity relates
|
|
395
|
+
* incident radiant power to electrical current. A later step must also match
|
|
396
|
+
* responseScope to the source plane and collection area before integrating any
|
|
397
|
+
* signal.
|
|
409
398
|
*/
|
|
410
399
|
export function calculateSensorSpectralQuadrature(input) {
|
|
400
|
+
requireInputKeys(input, "calculateSensorSpectralQuadrature", ["colorSamplingProfile", "spectralResponseProfile", "channelId", "wavelengthBasis", "wavelengthRangeNanometers", "maximumSubintervalWidthNanometers", "additionalBreakpointsNanometers"]);
|
|
411
401
|
const maximumSubintervalWidthNanometers = requirePositiveFinite(input.maximumSubintervalWidthNanometers, "maximumSubintervalWidthNanometers");
|
|
412
402
|
if (input.wavelengthBasis !== "air" &&
|
|
413
403
|
input.wavelengthBasis !== "vacuum" &&
|
|
414
404
|
input.wavelengthBasis !== "unspecified") {
|
|
415
|
-
throw new
|
|
405
|
+
throw new InvalidConfigurationError("wavelengthBasis is invalid.");
|
|
416
406
|
}
|
|
417
407
|
const colorProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
|
|
418
408
|
const responseProfile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
|