@photivra/engine 1.5.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +414 -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 +116 -9
- package/dist/capture/native-raw-development.js +221 -62
- 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 +65 -12
- package/dist/capture/native-raw.js +81 -19
- 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/diffraction-provider.d.ts +30 -0
- package/dist/facade/diffraction-provider.js +127 -0
- package/dist/facade/diffraction-provider.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +19 -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 +363 -0
- package/dist/facade/simulate-capture.js +1281 -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 +91 -25
- package/dist/index.js +60 -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-psf-profile.d.ts +118 -0
- package/dist/optics/diffraction-psf-profile.js +252 -0
- package/dist/optics/diffraction-psf-profile.js.map +1 -0
- 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 +777 -2
- package/docs/QUICK_START.md +663 -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 -8
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +21 -10
- 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 +2253 -3
- 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 +397 -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-psf-profile.md +96 -0
- 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 -11
- 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/DENSE_PUPIL_QUALIFICATION.md +0 -121
- 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 -54
- 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_1_5_0.md +0 -105
- 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/SEPARABLE_EMISSION_DRAFT.md +0 -103
- 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/dense-pupil-2026-10-06/pilot.jsonl +0 -6
- 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,16 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* thermal electron rate. Exact-temperature or sampled linear interpolation is supported only within
|
|
12
|
-
* declared applicability; no universal doubling-temperature law is inferred. Population means remain
|
|
13
|
-
* approximations and do not model hot-pixel/DCNU structure.
|
|
3
|
+
* Dark current: electrons generated by heat in a sensor site even with no light, and the dark charge
|
|
4
|
+
* they add over one exposure.
|
|
5
|
+
*
|
|
6
|
+
* The dark-current rate (electrons per second, before any compensation) is declared separately as a
|
|
7
|
+
* function of temperature. It is given either at an exact temperature or as samples, interpolated
|
|
8
|
+
* log-linearly (or with the legacy linear rule) only within the declared range. No universal
|
|
9
|
+
* "doubles every N degrees" law is assumed. Rates are population means, an approximation; hot pixels
|
|
10
|
+
* and DCNU (dark-current non-uniformity) are not modelled.
|
|
14
11
|
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
15
12
|
* limits.
|
|
16
13
|
*/
|
|
@@ -19,12 +16,15 @@ import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
|
19
16
|
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
20
17
|
import { parseSensorEqeTemporalPhotoSignal } from "./temporal-photo-signal.js";
|
|
21
18
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
22
|
-
|
|
19
|
+
import { requireInputObject, requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from "../core/record-validation.js";
|
|
20
|
+
function requireRecord(value, path, allowedKeys) {
|
|
23
21
|
if (typeof value !== "object" ||
|
|
24
22
|
value === null ||
|
|
25
23
|
Array.isArray(value)) {
|
|
26
24
|
throw new InvalidConfigurationError(path + " must be an object.");
|
|
27
25
|
}
|
|
26
|
+
if (allowedKeys !== null)
|
|
27
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
28
28
|
return value;
|
|
29
29
|
}
|
|
30
30
|
function requireNonEmptyString(value, path) {
|
|
@@ -59,7 +59,8 @@ function requireSiteIndex(value, path) {
|
|
|
59
59
|
return value;
|
|
60
60
|
}
|
|
61
61
|
function parseUncertainty(value, path) {
|
|
62
|
-
const record = requireRecord(value, path);
|
|
62
|
+
const record = requireRecord(value, path, null);
|
|
63
|
+
rejectUnknownVariantFields(record, "kind", UNCERTAINTY_VARIANT_FIELDS, path);
|
|
63
64
|
if (record.kind === "relative") {
|
|
64
65
|
const fraction = requireNonNegativeFinite(record.fraction, path + ".fraction");
|
|
65
66
|
if (typeof record.basis !== "string" ||
|
|
@@ -82,9 +83,10 @@ function parseUncertainty(value, path) {
|
|
|
82
83
|
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
83
84
|
}
|
|
84
85
|
function parseSiteApplicability(value) {
|
|
85
|
-
const record = requireRecord(value, "sensorDarkCurrent.siteApplicability");
|
|
86
|
+
const record = requireRecord(value, "sensorDarkCurrent.siteApplicability", null);
|
|
87
|
+
rejectUnknownVariantFields(record, "kind", { "exact-site": ["kind", "site"], "uniform-site-mean-approximation": ["kind", "limitation", "evidence"] }, "sensorDarkCurrent.siteApplicability");
|
|
86
88
|
if (record.kind === "exact-site") {
|
|
87
|
-
const site = requireRecord(record.site, "sensorDarkCurrent.siteApplicability.site");
|
|
89
|
+
const site = requireRecord(record.site, "sensorDarkCurrent.siteApplicability.site", ["x", "y"]);
|
|
88
90
|
return {
|
|
89
91
|
kind: "exact-site",
|
|
90
92
|
site: {
|
|
@@ -104,7 +106,12 @@ function parseSiteApplicability(value) {
|
|
|
104
106
|
throw new InvalidConfigurationError("sensorDarkCurrent.siteApplicability.kind is invalid.");
|
|
105
107
|
}
|
|
106
108
|
function parseTemperatureModel(value) {
|
|
107
|
-
const record = requireRecord(value, "sensorDarkCurrent.temperatureModel");
|
|
109
|
+
const record = requireRecord(value, "sensorDarkCurrent.temperatureModel", null);
|
|
110
|
+
rejectUnknownVariantFields(record, "kind", {
|
|
111
|
+
"fixed-reference-temperature": ["kind", "referenceTemperatureC", "darkCurrentElectronsPerSecond"],
|
|
112
|
+
"piecewise-linear-temperature-table": ["kind", "interpolation", "outsideRangeBehavior", "samples"],
|
|
113
|
+
"log-linear-temperature-table": ["kind", "interpolation", "outsideRangeBehavior", "samples"]
|
|
114
|
+
}, "sensorDarkCurrent.temperatureModel");
|
|
108
115
|
if (record.kind ===
|
|
109
116
|
"fixed-reference-temperature") {
|
|
110
117
|
return {
|
|
@@ -113,13 +120,18 @@ function parseTemperatureModel(value) {
|
|
|
113
120
|
darkCurrentElectronsPerSecond: requireNonNegativeFinite(record.darkCurrentElectronsPerSecond, "sensorDarkCurrent.temperatureModel.darkCurrentElectronsPerSecond")
|
|
114
121
|
};
|
|
115
122
|
}
|
|
123
|
+
const logLinear = record.kind ===
|
|
124
|
+
"log-linear-temperature-table";
|
|
116
125
|
if (record.kind !==
|
|
117
|
-
"piecewise-linear-temperature-table"
|
|
126
|
+
"piecewise-linear-temperature-table" &&
|
|
127
|
+
!logLinear) {
|
|
118
128
|
throw new InvalidConfigurationError("sensorDarkCurrent.temperatureModel.kind is invalid.");
|
|
119
129
|
}
|
|
120
130
|
if (record.interpolation !==
|
|
121
|
-
"piecewise-linear") {
|
|
122
|
-
throw new InvalidConfigurationError(
|
|
131
|
+
(logLinear ? "log-linear" : "piecewise-linear")) {
|
|
132
|
+
throw new InvalidConfigurationError(logLinear
|
|
133
|
+
? 'sensorDarkCurrent.temperatureModel.interpolation must be "log-linear".'
|
|
134
|
+
: 'sensorDarkCurrent.temperatureModel.interpolation must be "piecewise-linear".');
|
|
123
135
|
}
|
|
124
136
|
if (record.outsideRangeBehavior !==
|
|
125
137
|
"fail-closed") {
|
|
@@ -133,7 +145,7 @@ function parseTemperatureModel(value) {
|
|
|
133
145
|
const samples = record.samples.map((sample, index) => {
|
|
134
146
|
const parsed = requireRecord(sample, "sensorDarkCurrent.temperatureModel.samples[" +
|
|
135
147
|
index +
|
|
136
|
-
"]");
|
|
148
|
+
"]", ["temperatureC", "darkCurrentElectronsPerSecond"]);
|
|
137
149
|
const temperatureC = requireFinite(parsed.temperatureC, "sensorDarkCurrent.temperatureModel.samples[" +
|
|
138
150
|
index +
|
|
139
151
|
"].temperatureC");
|
|
@@ -150,28 +162,40 @@ function parseTemperatureModel(value) {
|
|
|
150
162
|
"].darkCurrentElectronsPerSecond")
|
|
151
163
|
};
|
|
152
164
|
});
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
samples
|
|
158
|
-
}
|
|
165
|
+
if (logLinear &&
|
|
166
|
+
samples.some((sample) => sample
|
|
167
|
+
.darkCurrentElectronsPerSecond <=
|
|
168
|
+
0)) {
|
|
169
|
+
throw new InvalidConfigurationError("sensorDarkCurrent.temperatureModel log-linear samples require strictly positive rates.");
|
|
170
|
+
}
|
|
171
|
+
return logLinear
|
|
172
|
+
? {
|
|
173
|
+
kind: "log-linear-temperature-table",
|
|
174
|
+
interpolation: "log-linear",
|
|
175
|
+
outsideRangeBehavior: "fail-closed",
|
|
176
|
+
samples
|
|
177
|
+
}
|
|
178
|
+
: {
|
|
179
|
+
kind: "piecewise-linear-temperature-table",
|
|
180
|
+
interpolation: "piecewise-linear",
|
|
181
|
+
outsideRangeBehavior: "fail-closed",
|
|
182
|
+
samples
|
|
183
|
+
};
|
|
159
184
|
}
|
|
160
185
|
/**
|
|
161
|
-
*
|
|
162
|
-
* missing required fields and
|
|
186
|
+
* Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
|
|
187
|
+
* missing required fields and inconsistent scientific data are rejected.
|
|
163
188
|
*
|
|
164
|
-
*
|
|
165
|
-
* or
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
* @
|
|
169
|
-
* @returns SensorDarkCurrentProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
189
|
+
* The profile declares the dark-current rate (before compensation) against temperature, at an exact
|
|
190
|
+
* temperature or as samples. Interpolation (log-linear, or the legacy linear rule) is allowed only
|
|
191
|
+
* within the declared range. No universal doubling-temperature law is assumed.
|
|
192
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
193
|
+
* @returns The result. Success does not imply calibration.
|
|
170
194
|
*
|
|
171
|
-
* @see docs/API_REFERENCE.md for the
|
|
195
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
172
196
|
*/
|
|
173
197
|
export function parseSensorDarkCurrentProfile(value) {
|
|
174
|
-
const record = requireRecord(value, "sensorDarkCurrent");
|
|
198
|
+
const record = requireRecord(value, "sensorDarkCurrent", ["schemaVersion", "chargeMeaning", "scientificStatus", "darkCurrentCompensationIncluded", "spatialDarkCurrentNonuniformityModeled", "uncertainty", "siteApplicability", "profileId", "colorSamplingProfileId", "channelId", "evidence", "temperatureModel"]);
|
|
175
199
|
if (record.schemaVersion !== "0.1.0") {
|
|
176
200
|
throw new InvalidConfigurationError('sensorDarkCurrent.schemaVersion must be "0.1.0".');
|
|
177
201
|
}
|
|
@@ -275,6 +299,20 @@ function resolveDarkCurrentRate(model, operatingTemperatureC) {
|
|
|
275
299
|
lower.temperatureC) /
|
|
276
300
|
(upper.temperatureC -
|
|
277
301
|
lower.temperatureC);
|
|
302
|
+
if (model.kind ===
|
|
303
|
+
"log-linear-temperature-table") {
|
|
304
|
+
// r = r0^(1-alpha) * r1^alpha, written as r0 * (r1/r0)^alpha.
|
|
305
|
+
return {
|
|
306
|
+
rate: lower
|
|
307
|
+
.darkCurrentElectronsPerSecond *
|
|
308
|
+
(upper
|
|
309
|
+
.darkCurrentElectronsPerSecond /
|
|
310
|
+
lower
|
|
311
|
+
.darkCurrentElectronsPerSecond) **
|
|
312
|
+
alpha,
|
|
313
|
+
interpolationUsed: true
|
|
314
|
+
};
|
|
315
|
+
}
|
|
278
316
|
const rate = lower
|
|
279
317
|
.darkCurrentElectronsPerSecond +
|
|
280
318
|
alpha *
|
|
@@ -288,6 +326,7 @@ function resolveDarkCurrentRate(model, operatingTemperatureC) {
|
|
|
288
326
|
};
|
|
289
327
|
}
|
|
290
328
|
function validateExposure(exposure) {
|
|
329
|
+
requireInputObject(exposure, "exposure input");
|
|
291
330
|
if (exposure.kind === "eqe-temporal-photo-signal")
|
|
292
331
|
parseSensorEqeTemporalPhotoSignal(exposure);
|
|
293
332
|
if ((exposure.kind !== "eqe-expected-counts" && exposure.kind !== "eqe-temporal-photo-signal") ||
|
|
@@ -316,19 +355,18 @@ function validateExposure(exposure) {
|
|
|
316
355
|
}
|
|
317
356
|
}
|
|
318
357
|
/**
|
|
319
|
-
*
|
|
320
|
-
*
|
|
358
|
+
* Evaluates the declared dark-current rate at the sensor temperature and integrates it over the exact
|
|
359
|
+
* local exposure of the photo signal.
|
|
321
360
|
*
|
|
322
|
-
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
* @param input - CalculateSensorDarkCurrentChargeInput<SensorEqePhotoExposure>. See the linked contract for coordinate, unit and profile binding semantics.
|
|
327
|
-
* @returns CalculationResult<SensorPhotoDarkCurrentCharge>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
361
|
+
* The rate is a population mean, an approximation. Hot pixels and DCNU (dark-current non-uniformity)
|
|
362
|
+
* are not modelled. No universal doubling-temperature law is assumed.
|
|
363
|
+
* @param input - The input; see `CalculateSensorDarkCurrentChargeInput` for its fields, units and coordinates.
|
|
364
|
+
* @returns The result. Success does not imply calibration.
|
|
328
365
|
*
|
|
329
|
-
* @see docs/API_REFERENCE.md for the
|
|
366
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
330
367
|
*/
|
|
331
368
|
export function calculateSensorDarkCurrentCharge(input) {
|
|
369
|
+
requireInputKeys(input, "calculateSensorDarkCurrentCharge", ["exposure", "darkCurrentProfile", "operatingTemperatureC"]);
|
|
332
370
|
validateExposure(input.exposure);
|
|
333
371
|
const profile = parseSensorDarkCurrentProfile(input.darkCurrentProfile);
|
|
334
372
|
if (profile.colorSamplingProfileId !==
|
|
@@ -402,7 +440,10 @@ export function calculateSensorDarkCurrentCharge(input) {
|
|
|
402
440
|
const assumptions = [
|
|
403
441
|
"Dark current is modeled as pre-compensation thermally generated electron rate in electrons per second.",
|
|
404
442
|
"Release 4.0 style temperature handling is data-driven: no universal exponential or doubling-temperature law is inferred.",
|
|
405
|
-
|
|
443
|
+
profile.temperatureModel.kind ===
|
|
444
|
+
"log-linear-temperature-table"
|
|
445
|
+
? "Log-linear (exponential-in-temperature) interpolation between adjacent declared samples is allowed only inside the sampled table; extrapolation fails closed."
|
|
446
|
+
: "Piecewise-linear interpolation is allowed only inside an explicitly sampled temperature table; extrapolation fails closed.",
|
|
406
447
|
"Dark-current compensation, dark offset, hot-pixel/defect excess, leakage and charge injection remain separate from this thermal dark-current expectation.",
|
|
407
448
|
"Expected dark-electron count is rate × the exact local exposure duration; no integer sampling or dark-current shot-noise realization is performed.",
|
|
408
449
|
"This result is dark charge only. Photo-signal and other accumulated charge are not included, so physical full-well assessment remains unauthorized.",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dark-current.js","sourceRoot":"","sources":["../../src/sensor/dark-current.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dark-current.js","sourceRoot":"","sources":["../../src/sensor/dark-current.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Dark current: electrons generated by heat in a sensor site even with no light, and the dark charge\n * they add over one exposure.\n *\n * The dark-current rate (electrons per second, before any compensation) is declared separately as a\n * function of temperature. It is given either at an exact temperature or as samples, interpolated\n * log-linearly (or with the legacy linear rule) only within the declared range. No universal\n * \"doubles every N degrees\" law is assumed. Rates are population means, an approximation; hot pixels\n * and DCNU (dark-current non-uniformity) are not modelled.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport {\n approximationResult,\n calculatedResult,\n type CalculationResult\n} from \"../core/calculation-result.js\";\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport {\n parseEvidenceList,\n type EvidenceProvenance\n} from \"../core/evidence-provenance.js\";\nimport type { SensorEqeExposureIntegration } from \"./constant-rate-temporal-integration.js\";\nimport { parseSensorEqeTemporalPhotoSignal } from \"./temporal-photo-signal.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport type {\n SensorEqePhotoExposure, SensorEqeTemporalPhotoSignal\n} from \"./temporal-photo-signal.js\";\nimport type {\n SensorSpectralResponseScientificStatus,\n SensorSpectralResponseUncertainty\n} from \"./spectral-response.js\";\nimport { requireInputObject, requireInputKeys, rejectUnknownFields, rejectUnknownVariantFields, UNCERTAINTY_VARIANT_FIELDS } from \"../core/record-validation.js\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport type SensorDarkCurrentSiteApplicability =\n | {\n kind: \"exact-site\";\n site: {\n x: number;\n y: number;\n };\n }\n | {\n kind:\n \"uniform-site-mean-approximation\";\n limitation: string;\n evidence:\n readonly EvidenceProvenance[];\n };\n\nexport type SensorDarkCurrentTemperatureModel =\n | {\n kind:\n \"fixed-reference-temperature\";\n referenceTemperatureC: number;\n darkCurrentElectronsPerSecond:\n number;\n }\n | {\n /** Legacy interpolation, linear in rate. Between samples of an exponential curve it gives values that are too high. */\n kind:\n \"piecewise-linear-temperature-table\";\n interpolation: \"piecewise-linear\";\n outsideRangeBehavior:\n \"fail-closed\";\n samples: readonly {\n temperatureC: number;\n darkCurrentElectronsPerSecond:\n number;\n }[];\n }\n | {\n /**\n * Linear interpolation of ln(rate) between neighbouring samples. That makes the rate exponential\n * in temperature within each interval, matching the roughly exponential (Arrhenius, or\n * \"doubling temperature\") behaviour of thermally generated dark current. Rates must be strictly\n * positive. No single doubling temperature is imposed; each interval follows its own two samples.\n */\n kind:\n \"log-linear-temperature-table\";\n interpolation: \"log-linear\";\n outsideRangeBehavior:\n \"fail-closed\";\n samples: readonly {\n temperatureC: number;\n darkCurrentElectronsPerSecond:\n number;\n }[];\n };\n\nexport interface SensorDarkCurrentProfile {\n schemaVersion: \"0.1.0\";\n profileId: string;\n colorSamplingProfileId: string;\n channelId: string;\n scientificStatus:\n SensorSpectralResponseScientificStatus;\n uncertainty:\n SensorSpectralResponseUncertainty;\n evidence: readonly EvidenceProvenance[];\n chargeMeaning:\n \"pre-compensation-thermally-generated-electrons\";\n siteApplicability:\n SensorDarkCurrentSiteApplicability;\n temperatureModel:\n SensorDarkCurrentTemperatureModel;\n darkCurrentCompensationIncluded: false;\n spatialDarkCurrentNonuniformityModeled:\n boolean;\n}\n\nexport interface CalculateSensorDarkCurrentChargeInput<Exposure extends SensorEqePhotoExposure = SensorEqeExposureIntegration> {\n exposure:\n Exposure;\n darkCurrentProfile:\n SensorDarkCurrentProfile;\n operatingTemperatureC: number;\n}\n\nexport interface SensorDarkCurrentCharge {\n darkCurrentProfileId: string;\n colorSamplingProfileId: string;\n channelId: string;\n site: {\n x: number;\n y: number;\n };\n bindingId: string;\n stationarityProfileId: string;\n temporalIntegrationId?: never;\n timeReference:\n \"first-opening-boundary-phase\";\n startOffsetSecondsFromOpeningReference:\n number;\n endOffsetSecondsFromOpeningReference:\n number;\n operatingTemperatureC: number;\n temperatureModel:\n SensorDarkCurrentTemperatureModel[\"kind\"];\n temperatureInterpolationUsed:\n boolean;\n darkCurrentElectronsPerSecond:\n number;\n localExposureDurationSeconds:\n number;\n expectedDarkElectronCount:\n number;\n countMeaning:\n \"expected-thermally-generated-electrons\";\n expectationValueOnly: true;\n integerDarkElectronCountSampled:\n false;\n darkShotNoiseApplied: false;\n darkCurrentCompensationApplied:\n false;\n spatialDarkCurrentNonuniformityModeled:\n boolean;\n photoSignalIncluded: false;\n otherChargeIncluded: false;\n physicalFullWellAssessmentAuthorized:\n false;\n saturationAssessed: false;\n componentEvidence: {\n darkCurrent:\n readonly EvidenceProvenance[];\n siteApproximation:\n readonly EvidenceProvenance[];\n exposure:\n SensorEqeExposureIntegration[\"componentEvidence\"];\n };\n}\n\n/** Dark charge for the exact same time-resolved photo event. It has no stationarity ID. */\nexport type SensorTemporalDarkCurrentCharge = Omit<SensorDarkCurrentCharge, \"stationarityProfileId\" | \"temporalIntegrationId\" | \"componentEvidence\"> & {\n stationarityProfileId?: never;\n temporalIntegrationId: string;\n componentEvidence: Omit<SensorDarkCurrentCharge[\"componentEvidence\"], \"exposure\"> & { exposure: SensorEqeTemporalPhotoSignal[\"componentEvidence\"] };\n};\nexport type SensorPhotoDarkCurrentCharge = SensorDarkCurrentCharge | SensorTemporalDarkCurrentCharge;\n\nfunction requireRecord(\n value: unknown,\n path: string,\n allowedKeys: readonly string[] | null\n): UnknownRecord {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be an object.\"\n );\n }\n if (allowedKeys !== null) rejectUnknownFields(value, allowedKeys, path);\n return value as UnknownRecord;\n}\n\nfunction requireNonEmptyString(\n value: unknown,\n path: string\n): string {\n if (\n typeof value !== \"string\" ||\n value.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path + \" must be a non-empty string.\"\n );\n }\n return value;\n}\n\nfunction requireFinite(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isFinite(value)\n ) {\n throw new InvalidConfigurationError(\n path + \" must be finite.\"\n );\n }\n return value;\n}\n\nfunction requireNonNegativeFinite(\n value: unknown,\n path: string\n): number {\n const parsed =\n requireFinite(value, path);\n if (parsed < 0) {\n throw new InvalidConfigurationError(\n path +\n \" must be greater than or equal to zero.\"\n );\n }\n return parsed;\n}\n\nfunction requireSiteIndex(\n value: unknown,\n path: string\n): number {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value < 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \" must be a non-negative safe integer.\"\n );\n }\n return value;\n}\n\nfunction parseUncertainty(\n value: unknown,\n path: string\n): SensorSpectralResponseUncertainty {\n const record =\n requireRecord(value, path, null);\n rejectUnknownVariantFields(record, \"kind\", UNCERTAINTY_VARIANT_FIELDS, path);\n\n if (record.kind === \"relative\") {\n const fraction =\n requireNonNegativeFinite(\n record.fraction,\n path + \".fraction\"\n );\n if (\n typeof record.basis !== \"string\" ||\n record.basis.trim().length === 0\n ) {\n throw new InvalidConfigurationError(\n path +\n \".basis must be a non-empty string.\"\n );\n }\n return {\n kind: \"relative\",\n fraction,\n basis: record.basis\n };\n }\n\n if (\n record.kind === \"not-quantified\"\n ) {\n return {\n kind: \"not-quantified\",\n limitation:\n requireNonEmptyString(\n record.limitation,\n path + \".limitation\"\n )\n };\n }\n\n throw new InvalidConfigurationError(\n path + \".kind is invalid.\"\n );\n}\n\nfunction parseSiteApplicability(\n value: unknown\n): SensorDarkCurrentSiteApplicability {\n const record = requireRecord(\n value,\n \"sensorDarkCurrent.siteApplicability\", null\n );\n rejectUnknownVariantFields(record, \"kind\", { \"exact-site\": [\"kind\", \"site\"], \"uniform-site-mean-approximation\": [\"kind\", \"limitation\", \"evidence\"] }, \"sensorDarkCurrent.siteApplicability\");\n\n if (record.kind === \"exact-site\") {\n const site = requireRecord(\n record.site,\n \"sensorDarkCurrent.siteApplicability.site\", [\"x\", \"y\"]\n );\n return {\n kind: \"exact-site\",\n site: {\n x: requireSiteIndex(\n site.x,\n \"sensorDarkCurrent.siteApplicability.site.x\"\n ),\n y: requireSiteIndex(\n site.y,\n \"sensorDarkCurrent.siteApplicability.site.y\"\n )\n }\n };\n }\n\n if (\n record.kind ===\n \"uniform-site-mean-approximation\"\n ) {\n return {\n kind:\n \"uniform-site-mean-approximation\",\n limitation:\n requireNonEmptyString(\n record.limitation,\n \"sensorDarkCurrent.siteApplicability.limitation\"\n ),\n evidence: parseEvidenceList(\n record.evidence,\n \"sensorDarkCurrent.siteApplicability.evidence\"\n )\n };\n }\n\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.siteApplicability.kind is invalid.\"\n );\n}\n\nfunction parseTemperatureModel(\n value: unknown\n): SensorDarkCurrentTemperatureModel {\n const record = requireRecord(\n value,\n \"sensorDarkCurrent.temperatureModel\", null\n );\n rejectUnknownVariantFields(record, \"kind\", {\n \"fixed-reference-temperature\": [\"kind\", \"referenceTemperatureC\", \"darkCurrentElectronsPerSecond\"],\n \"piecewise-linear-temperature-table\": [\"kind\", \"interpolation\", \"outsideRangeBehavior\", \"samples\"],\n \"log-linear-temperature-table\": [\"kind\", \"interpolation\", \"outsideRangeBehavior\", \"samples\"]\n }, \"sensorDarkCurrent.temperatureModel\");\n\n if (\n record.kind ===\n \"fixed-reference-temperature\"\n ) {\n return {\n kind:\n \"fixed-reference-temperature\",\n referenceTemperatureC:\n requireFinite(\n record.referenceTemperatureC,\n \"sensorDarkCurrent.temperatureModel.referenceTemperatureC\"\n ),\n darkCurrentElectronsPerSecond:\n requireNonNegativeFinite(\n record.darkCurrentElectronsPerSecond,\n \"sensorDarkCurrent.temperatureModel.darkCurrentElectronsPerSecond\"\n )\n };\n }\n\n const logLinear =\n record.kind ===\n \"log-linear-temperature-table\";\n if (\n record.kind !==\n \"piecewise-linear-temperature-table\" &&\n !logLinear\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.temperatureModel.kind is invalid.\"\n );\n }\n if (\n record.interpolation !==\n (logLinear ? \"log-linear\" : \"piecewise-linear\")\n ) {\n throw new InvalidConfigurationError(\n logLinear\n ? 'sensorDarkCurrent.temperatureModel.interpolation must be \"log-linear\".'\n : 'sensorDarkCurrent.temperatureModel.interpolation must be \"piecewise-linear\".'\n );\n }\n if (\n record.outsideRangeBehavior !==\n \"fail-closed\"\n ) {\n throw new InvalidConfigurationError(\n 'sensorDarkCurrent.temperatureModel.outsideRangeBehavior must be \"fail-closed\".'\n );\n }\n if (\n !Array.isArray(record.samples) ||\n record.samples.length < 2\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.temperatureModel.samples must contain at least two samples.\"\n );\n }\n\n let previousTemperature =\n Number.NEGATIVE_INFINITY;\n const samples =\n record.samples.map(\n (sample, index) => {\n const parsed = requireRecord(\n sample,\n \"sensorDarkCurrent.temperatureModel.samples[\" +\n index +\n \"]\", [\"temperatureC\", \"darkCurrentElectronsPerSecond\"]\n );\n const temperatureC =\n requireFinite(\n parsed.temperatureC,\n \"sensorDarkCurrent.temperatureModel.samples[\" +\n index +\n \"].temperatureC\"\n );\n if (\n temperatureC <=\n previousTemperature\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.temperatureModel.samples must be strictly increasing in temperature.\"\n );\n }\n previousTemperature =\n temperatureC;\n return {\n temperatureC,\n darkCurrentElectronsPerSecond:\n requireNonNegativeFinite(\n parsed.darkCurrentElectronsPerSecond,\n \"sensorDarkCurrent.temperatureModel.samples[\" +\n index +\n \"].darkCurrentElectronsPerSecond\"\n )\n };\n }\n );\n\n if (\n logLinear &&\n samples.some(\n (sample) =>\n sample\n .darkCurrentElectronsPerSecond <=\n 0\n )\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.temperatureModel log-linear samples require strictly positive rates.\"\n );\n }\n\n return logLinear\n ? {\n kind:\n \"log-linear-temperature-table\",\n interpolation: \"log-linear\",\n outsideRangeBehavior:\n \"fail-closed\",\n samples\n }\n : {\n kind:\n \"piecewise-linear-temperature-table\",\n interpolation: \"piecewise-linear\",\n outsideRangeBehavior:\n \"fail-closed\",\n samples\n };\n}\n\n/**\n * Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,\n * missing required fields and inconsistent scientific data are rejected.\n *\n * The profile declares the dark-current rate (before compensation) against temperature, at an exact\n * temperature or as samples. Interpolation (log-linear, or the legacy linear rule) is allowed only\n * within the declared range. No universal doubling-temperature law is assumed.\n * @param value - Untrusted data. TypeScript types alone are not validation.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function parseSensorDarkCurrentProfile(\n value: unknown\n): SensorDarkCurrentProfile {\n const record = requireRecord(\n value,\n \"sensorDarkCurrent\", [\"schemaVersion\", \"chargeMeaning\", \"scientificStatus\", \"darkCurrentCompensationIncluded\", \"spatialDarkCurrentNonuniformityModeled\", \"uncertainty\", \"siteApplicability\", \"profileId\", \"colorSamplingProfileId\", \"channelId\", \"evidence\", \"temperatureModel\"]\n );\n\n if (\n record.schemaVersion !== \"0.1.0\"\n ) {\n throw new InvalidConfigurationError(\n 'sensorDarkCurrent.schemaVersion must be \"0.1.0\".'\n );\n }\n if (\n record.chargeMeaning !==\n \"pre-compensation-thermally-generated-electrons\"\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.chargeMeaning is invalid.\"\n );\n }\n if (\n record.scientificStatus !==\n \"calibrated\" &&\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.scientificStatus is invalid.\"\n );\n }\n if (\n record.darkCurrentCompensationIncluded !==\n false\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.darkCurrentCompensationIncluded must be false.\"\n );\n }\n if (\n typeof record\n .spatialDarkCurrentNonuniformityModeled !==\n \"boolean\"\n ) {\n throw new InvalidConfigurationError(\n \"sensorDarkCurrent.spatialDarkCurrentNonuniformityModeled must be boolean.\"\n );\n }\n\n const uncertainty =\n parseUncertainty(\n record.uncertainty,\n \"sensorDarkCurrent.uncertainty\"\n );\n if (\n record.scientificStatus ===\n \"calibrated\" &&\n uncertainty.kind ===\n \"not-quantified\"\n ) {\n throw new InvalidConfigurationError(\n \"A calibrated dark-current profile must declare quantified relative uncertainty.\"\n );\n }\n\n const siteApplicability =\n parseSiteApplicability(\n record.siteApplicability\n );\n if (\n siteApplicability.kind ===\n \"uniform-site-mean-approximation\" &&\n record.scientificStatus !==\n \"approximation\"\n ) {\n throw new InvalidConfigurationError(\n \"Uniform site-mean dark current must remain an approximation.\"\n );\n }\n if (\n siteApplicability.kind ===\n \"uniform-site-mean-approximation\" &&\n record\n .spatialDarkCurrentNonuniformityModeled !==\n false\n ) {\n throw new InvalidConfigurationError(\n \"Uniform site-mean dark current cannot claim spatial dark-current nonuniformity is modeled.\"\n );\n }\n\n return {\n schemaVersion: \"0.1.0\",\n profileId:\n requireNonEmptyString(\n record.profileId,\n \"sensorDarkCurrent.profileId\"\n ),\n colorSamplingProfileId:\n requireNonEmptyString(\n record.colorSamplingProfileId,\n \"sensorDarkCurrent.colorSamplingProfileId\"\n ),\n channelId:\n requireNonEmptyString(\n record.channelId,\n \"sensorDarkCurrent.channelId\"\n ),\n scientificStatus:\n record.scientificStatus,\n uncertainty,\n evidence: parseEvidenceList(\n record.evidence,\n \"sensorDarkCurrent.evidence\"\n ),\n chargeMeaning:\n \"pre-compensation-thermally-generated-electrons\",\n siteApplicability,\n temperatureModel:\n parseTemperatureModel(\n record.temperatureModel\n ),\n darkCurrentCompensationIncluded:\n false,\n spatialDarkCurrentNonuniformityModeled:\n record\n .spatialDarkCurrentNonuniformityModeled\n };\n}\n\nfunction sameSite(\n a: { x: number; y: number },\n b: { x: number; y: number }\n): boolean {\n return a.x === b.x && a.y === b.y;\n}\n\nfunction resolveDarkCurrentRate(\n model:\n SensorDarkCurrentTemperatureModel,\n operatingTemperatureC: number\n): {\n rate: number;\n interpolationUsed: boolean;\n} {\n if (\n !Number.isFinite(\n operatingTemperatureC\n )\n ) {\n throw new InvalidScientificInputError(\n \"operatingTemperatureC must be finite.\"\n );\n }\n\n if (\n model.kind ===\n \"fixed-reference-temperature\"\n ) {\n if (\n operatingTemperatureC !==\n model.referenceTemperatureC\n ) {\n throw new InvalidScientificInputError(\n \"Fixed-reference dark current may only be used at its exact reference temperature.\"\n );\n }\n return {\n rate:\n model\n .darkCurrentElectronsPerSecond,\n interpolationUsed: false\n };\n }\n\n const first =\n model.samples[0]!;\n const last =\n model.samples[\n model.samples.length - 1\n ]!;\n if (\n operatingTemperatureC <\n first.temperatureC ||\n operatingTemperatureC >\n last.temperatureC\n ) {\n throw new InvalidScientificInputError(\n \"operatingTemperatureC is outside the measured dark-current temperature range; extrapolation is not permitted.\"\n );\n }\n\n const exact =\n model.samples.find(\n (sample) =>\n sample.temperatureC ===\n operatingTemperatureC\n );\n if (exact !== undefined) {\n return {\n rate:\n exact\n .darkCurrentElectronsPerSecond,\n interpolationUsed: false\n };\n }\n\n const upperIndex =\n model.samples.findIndex(\n (sample) =>\n sample.temperatureC >\n operatingTemperatureC\n );\n const upper =\n model.samples[upperIndex]!;\n const lower =\n model.samples[upperIndex - 1]!;\n const alpha =\n (operatingTemperatureC -\n lower.temperatureC) /\n (upper.temperatureC -\n lower.temperatureC);\n if (\n model.kind ===\n \"log-linear-temperature-table\"\n ) {\n // r = r0^(1-alpha) * r1^alpha, written as r0 * (r1/r0)^alpha.\n return {\n rate:\n lower\n .darkCurrentElectronsPerSecond *\n (upper\n .darkCurrentElectronsPerSecond /\n lower\n .darkCurrentElectronsPerSecond) **\n alpha,\n interpolationUsed: true\n };\n }\n const rate =\n lower\n .darkCurrentElectronsPerSecond +\n alpha *\n (\n upper\n .darkCurrentElectronsPerSecond -\n lower\n .darkCurrentElectronsPerSecond\n );\n\n return {\n rate,\n interpolationUsed: true\n };\n}\n\nfunction validateExposure(\n exposure:\n SensorEqePhotoExposure\n): void {\n requireInputObject(exposure, \"exposure input\");\n if (exposure.kind === \"eqe-temporal-photo-signal\") parseSensorEqeTemporalPhotoSignal(exposure);\n if (\n (exposure.kind !== \"eqe-expected-counts\" && exposure.kind !== \"eqe-temporal-photo-signal\") ||\n exposure.temporalIntegrationApplied !==\n true ||\n exposure.exposureDurationApplied !==\n true ||\n exposure.accumulatedSignalCompleteness !==\n \"photo-signal-only\" ||\n exposure.darkChargeIncluded !== false ||\n exposure.otherChargeIncluded !== false ||\n exposure\n .physicalFullWellAssessmentAuthorized !==\n false\n ) {\n throw new InvalidScientificInputError(\n \"Dark-current composition requires an unmodified photo-signal-only EQE exposure integration.\"\n );\n }\n\n if (\n typeof exposure\n .localExposureDurationSeconds !==\n \"number\" ||\n !Number.isFinite(\n exposure\n .localExposureDurationSeconds\n ) ||\n exposure\n .localExposureDurationSeconds <=\n 0\n ) {\n throw new InvalidScientificInputError(\n \"EQE exposure local duration must be finite and positive.\"\n );\n }\n}\n\n/**\n * Evaluates the declared dark-current rate at the sensor temperature and integrates it over the exact\n * local exposure of the photo signal.\n *\n * The rate is a population mean, an approximation. Hot pixels and DCNU (dark-current non-uniformity)\n * are not modelled. No universal doubling-temperature law is assumed.\n * @param input - Dark-current input whose exposure is a per-exposure photo signal (SensorEqeExposureIntegration); see `CalculateSensorDarkCurrentChargeInput`.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function calculateSensorDarkCurrentCharge(\n input: Omit<CalculateSensorDarkCurrentChargeInput, \"exposure\"> & { exposure: SensorEqeExposureIntegration }\n): CalculationResult<SensorDarkCurrentCharge>;\n/**\n * Evaluates the declared dark-current rate at the sensor temperature and integrates it over the exact\n * local exposure of the photo signal.\n *\n * The rate is a population mean, an approximation. Hot pixels and DCNU (dark-current non-uniformity)\n * are not modelled. No universal doubling-temperature law is assumed.\n * @param input - Dark-current input whose exposure is a time-resolved photo signal (SensorEqeTemporalPhotoSignal); see `CalculateSensorDarkCurrentChargeInput`.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function calculateSensorDarkCurrentCharge(\n input: Omit<CalculateSensorDarkCurrentChargeInput, \"exposure\"> & { exposure: SensorEqeTemporalPhotoSignal }\n): CalculationResult<SensorTemporalDarkCurrentCharge>;\n/**\n * Evaluates the declared dark-current rate at the sensor temperature and integrates it over the exact\n * local exposure of the photo signal.\n *\n * The rate is a population mean, an approximation. Hot pixels and DCNU (dark-current non-uniformity)\n * are not modelled. No universal doubling-temperature law is assumed.\n * @param input - The input; see `CalculateSensorDarkCurrentChargeInput` for its fields, units and coordinates.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function calculateSensorDarkCurrentCharge(\n input: CalculateSensorDarkCurrentChargeInput<SensorEqePhotoExposure>\n): CalculationResult<SensorPhotoDarkCurrentCharge>;\n/**\n * Evaluates the declared dark-current rate at the sensor temperature and integrates it over the exact\n * local exposure of the photo signal.\n *\n * The rate is a population mean, an approximation. Hot pixels and DCNU (dark-current non-uniformity)\n * are not modelled. No universal doubling-temperature law is assumed.\n * @param input - The input; see `CalculateSensorDarkCurrentChargeInput` for its fields, units and coordinates.\n * @returns The result. Success does not imply calibration.\n *\n * @see docs/API_REFERENCE.md for the package export and its full type definitions.\n */\nexport function calculateSensorDarkCurrentCharge(\n input:\n CalculateSensorDarkCurrentChargeInput<SensorEqePhotoExposure>\n): CalculationResult<SensorPhotoDarkCurrentCharge> {\n requireInputKeys(input, \"calculateSensorDarkCurrentCharge\", [\"exposure\", \"darkCurrentProfile\", \"operatingTemperatureC\"]);\n validateExposure(input.exposure);\n const profile =\n parseSensorDarkCurrentProfile(\n input.darkCurrentProfile\n );\n\n if (\n profile.colorSamplingProfileId !==\n input.exposure\n .colorSamplingProfileId ||\n profile.channelId !==\n input.exposure.channelId\n ) {\n throw new InvalidScientificInputError(\n \"Dark-current profile color/channel identity must match the EQE exposure.\"\n );\n }\n\n const site =\n input.exposure.site;\n if (\n profile.siteApplicability.kind ===\n \"exact-site\" &&\n !sameSite(\n profile.siteApplicability.site,\n site\n )\n ) {\n throw new InvalidScientificInputError(\n \"Exact-site dark-current profile does not apply to the exposure site.\"\n );\n }\n\n const resolved =\n resolveDarkCurrentRate(\n profile.temperatureModel,\n input.operatingTemperatureC\n );\n const expectedDarkElectronCount =\n resolved.rate *\n input.exposure\n .localExposureDurationSeconds;\n\n if (\n !Number.isFinite(\n expectedDarkElectronCount\n ) ||\n expectedDarkElectronCount < 0\n ) {\n throw new InvalidScientificInputError(\n \"Expected dark-electron count must remain finite and nonnegative.\"\n );\n }\n\n const result:\n SensorPhotoDarkCurrentCharge = {\n darkCurrentProfileId:\n profile.profileId,\n colorSamplingProfileId:\n input.exposure\n .colorSamplingProfileId,\n channelId:\n input.exposure.channelId,\n site: {\n ...site\n },\n bindingId:\n input.exposure.bindingId,\n ...(input.exposure.kind === \"eqe-temporal-photo-signal\"\n ? { temporalIntegrationId: input.exposure.temporalIntegrationId }\n : { stationarityProfileId: input.exposure.stationarityProfileId }),\n timeReference:\n input.exposure.timeReference,\n startOffsetSecondsFromOpeningReference:\n input.exposure\n .startOffsetSecondsFromOpeningReference,\n endOffsetSecondsFromOpeningReference:\n input.exposure\n .endOffsetSecondsFromOpeningReference,\n operatingTemperatureC:\n input.operatingTemperatureC,\n temperatureModel:\n profile.temperatureModel.kind,\n temperatureInterpolationUsed:\n resolved.interpolationUsed,\n darkCurrentElectronsPerSecond:\n resolved.rate,\n localExposureDurationSeconds:\n input.exposure\n .localExposureDurationSeconds,\n expectedDarkElectronCount,\n countMeaning:\n \"expected-thermally-generated-electrons\",\n expectationValueOnly: true,\n integerDarkElectronCountSampled:\n false,\n darkShotNoiseApplied: false,\n darkCurrentCompensationApplied:\n false,\n spatialDarkCurrentNonuniformityModeled:\n profile\n .spatialDarkCurrentNonuniformityModeled,\n photoSignalIncluded: false,\n otherChargeIncluded: false,\n physicalFullWellAssessmentAuthorized:\n false,\n saturationAssessed: false,\n componentEvidence: {\n darkCurrent:\n profile.evidence,\n siteApproximation:\n profile.siteApplicability.kind ===\n \"uniform-site-mean-approximation\"\n ? profile\n .siteApplicability\n .evidence\n : [],\n exposure:\n input.exposure\n .componentEvidence\n }\n } as SensorPhotoDarkCurrentCharge;\n\n const assumptions = [\n \"Dark current is modeled as pre-compensation thermally generated electron rate in electrons per second.\",\n \"Release 4.0 style temperature handling is data-driven: no universal exponential or doubling-temperature law is inferred.\",\n profile.temperatureModel.kind ===\n \"log-linear-temperature-table\"\n ? \"Log-linear (exponential-in-temperature) interpolation between adjacent declared samples is allowed only inside the sampled table; extrapolation fails closed.\"\n : \"Piecewise-linear interpolation is allowed only inside an explicitly sampled temperature table; extrapolation fails closed.\",\n \"Dark-current compensation, dark offset, hot-pixel/defect excess, leakage and charge injection remain separate from this thermal dark-current expectation.\",\n \"Expected dark-electron count is rate × the exact local exposure duration; no integer sampling or dark-current shot-noise realization is performed.\",\n \"This result is dark charge only. Photo-signal and other accumulated charge are not included, so physical full-well assessment remains unauthorized.\",\n \"A/W current-domain exposure results cannot enter this electron-storage path without a separate carrier/storage mapping.\"\n ];\n\n return profile.scientificStatus ===\n \"calibrated\"\n ? calculatedResult(\n result,\n \"sensor-dark-current-charge\",\n input.exposure.kind === \"eqe-temporal-photo-signal\" ? \"1.1.0\" : \"1.0.0\",\n assumptions\n )\n : approximationResult(\n result,\n \"sensor-dark-current-charge\",\n input.exposure.kind === \"eqe-temporal-photo-signal\" ? \"1.1.0\" : \"1.0.0\",\n [\n ...assumptions,\n ...(profile\n .siteApplicability.kind ===\n \"uniform-site-mean-approximation\"\n ? [\n profile\n .siteApplicability\n .limitation\n ]\n : [])\n ]\n );\n}\n"]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
2
|
+
* Photo signal for one sensor site from a scene-radiance provider (the "environment"): asks the
|
|
3
|
+
* provider for radiance along each sampled direction, then applies optics and the sensor response.
|
|
4
|
+
*
|
|
5
|
+
* Work is split into a plan and an execution step. Planning checks spatial, spectral and temporal
|
|
6
|
+
* coverage and builds an internal plan before any provider code runs. Each query gives an explicit
|
|
7
|
+
* scene direction, a wavelength (air or vacuum) and a time in seconds from the shutter's opening
|
|
8
|
+
* reference. Optical throughput, an optional local PSF (point-spread function) and the EQE (external
|
|
9
|
+
* quantum efficiency) response then give the expected photo signal. Calling the provider does not
|
|
10
|
+
* verify its light transport, visibility or calibration.
|
|
11
11
|
* @see docs/ENVIRONMENT_RAW_CAPTURE.md for equations, coordinate/unit conventions, blockers and
|
|
12
12
|
* support limits.
|
|
13
13
|
*/
|
|
14
14
|
import { type CalculationResult } from "../core/calculation-result.js";
|
|
15
15
|
import { type EvidenceProvenance } from "../core/evidence-provenance.js";
|
|
16
16
|
import { validateSceneRadianceEvaluationBindings, type SceneRadianceEvaluationRequest, type SceneRadianceEvaluationResult } from "../schema/scene-radiance.js";
|
|
17
|
-
import { calculateSensorEnvironmentRadianceQuery, type CalculateSensorEnvironmentRadianceQueryInput } from "../optics/sensor-environment-query.js";
|
|
17
|
+
import { calculateSensorEnvironmentRadianceQuery, type CalculateSensorEnvironmentRadianceQueryInput, type EnvironmentLensFieldMapping } from "../optics/sensor-environment-query.js";
|
|
18
18
|
import { calculateSceneRadianceToSensorIrradiance, type CalculateSceneRadianceToSensorIrradianceInput } from "../optics/scene-to-sensor-irradiance.js";
|
|
19
19
|
import { calculateSensorPsfIrradianceQuadrature, type CalculateSensorPsfIrradianceQuadratureInput } from "../optics/sensor-psf-quadrature.js";
|
|
20
20
|
import { type IlluminationVignettingProfile } from "../optics/illumination-vignetting.js";
|
|
@@ -24,7 +24,7 @@ import { calculateSensorSpectralQuadrature } from "./spectral-quadrature.js";
|
|
|
24
24
|
import { createSensorEqeTemporalPhotoSignal } from "./temporal-photo-signal.js";
|
|
25
25
|
import type { CalculateSensorEqeTemporalExposureInput } from "./eqe-temporal-exposure.js";
|
|
26
26
|
import type { CalculateSceneToSensorIrradianceQuadratureInput } from "../optics/scene-to-sensor-quadrature.js";
|
|
27
|
-
/**
|
|
27
|
+
/** Caller-supplied synchronous radiance function, run locally. Calling it does not prove its light transport is physical. */
|
|
28
28
|
export type EnvironmentRadianceEvaluator = (request: Readonly<SceneRadianceEvaluationRequest>) => SceneRadianceEvaluationResult;
|
|
29
29
|
export type EnvironmentApertureRadianceEvaluator = (request: Readonly<SceneRadianceEvaluationRequest>, apertureRay: Readonly<SensorApertureRay>) => SceneRadianceEvaluationResult;
|
|
30
30
|
export interface CalculateEnvironmentSensorPhotoSignalInput {
|
|
@@ -34,9 +34,16 @@ export interface CalculateEnvironmentSensorPhotoSignalInput {
|
|
|
34
34
|
optics: Omit<CalculateSceneRadianceToSensorIrradianceInput, "sceneRadianceRequest" | "sceneRadianceResult" | "imagePointMm" | "fieldThroughput">;
|
|
35
35
|
motion: Pick<CalculateSensorEnvironmentRadianceQueryInput, "angularVelocityRadPerSec" | "timeReference" | "environmentDirectionConvention">;
|
|
36
36
|
temporalSampleCount: number;
|
|
37
|
-
/** Optional ideal geometric DOF
|
|
37
|
+
/** Optional ideal circular pupil, for geometric depth of field (DOF) and visibility. Cannot be combined with a sampled PSF. */
|
|
38
38
|
pupil?: IdealCircularPupil;
|
|
39
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Optional lens field mapping (added in 2.0): a projection model and radial or Brown-Conrady
|
|
41
|
+
* distortion for the scene-ray query. Its distortion area factor is applied to irradiance exactly
|
|
42
|
+
* once. If omitted, the ideal rectilinear, distortion-free path is unchanged. Cannot be combined
|
|
43
|
+
* with `pupil`.
|
|
44
|
+
*/
|
|
45
|
+
lensFieldMapping?: EnvironmentLensFieldMapping;
|
|
46
|
+
/** Explicit attenuation across the field (such as vignetting), applied once before the PSF spreads the light. */
|
|
40
47
|
fieldThroughput: {
|
|
41
48
|
kind: "unity";
|
|
42
49
|
evidence: readonly EvidenceProvenance[];
|
|
@@ -56,7 +63,7 @@ export interface CalculateEnvironmentSensorPhotoSignalInput {
|
|
|
56
63
|
configuration: Pick<CalculateSensorPsfIrradianceQuadratureInput, "psf" | "psfWavelengthBasis" | "spatialModel">;
|
|
57
64
|
};
|
|
58
65
|
evaluateRadiance: EnvironmentRadianceEvaluator;
|
|
59
|
-
/** Required with pupil
|
|
66
|
+
/** Required with `pupil`: rays start at different points on the aperture, so a direction-only function cannot be used. */
|
|
60
67
|
evaluateApertureRadiance?: EnvironmentApertureRadianceEvaluator;
|
|
61
68
|
}
|
|
62
69
|
export interface EnvironmentSensorPhotoSignal {
|
|
@@ -91,7 +98,7 @@ export interface EnvironmentSensorPhotoSignal {
|
|
|
91
98
|
}[];
|
|
92
99
|
}[];
|
|
93
100
|
}
|
|
94
|
-
/** Internal
|
|
101
|
+
/** Internal plan, shared with the full-frame composer, so all work is bounded before any callback runs. */
|
|
95
102
|
interface EnvironmentPhotoPlan {
|
|
96
103
|
owned: Omit<CalculateEnvironmentSensorPhotoSignalInput, "evaluateRadiance" | "evaluateApertureRadiance">;
|
|
97
104
|
sceneBindings: CalculateSceneToSensorIrradianceQuadratureInput["sceneBindings"];
|
|
@@ -112,30 +119,64 @@ interface EnvironmentPhotoPlan {
|
|
|
112
119
|
x: number;
|
|
113
120
|
y: number;
|
|
114
121
|
};
|
|
115
|
-
query
|
|
122
|
+
/** Deep-frozen provider request of the planned query (the same object as query.value.request). */
|
|
123
|
+
request: SceneRadianceEvaluationRequest;
|
|
124
|
+
/** The planned query's image-plane source point (the same object as query.value.sourcePointImagePlaneMm). */
|
|
125
|
+
sourcePointImagePlaneMm: {
|
|
126
|
+
x: number;
|
|
127
|
+
y: number;
|
|
128
|
+
};
|
|
129
|
+
/** The complete query result. Kept only by "full" plans, whose per-evaluation records include it. */
|
|
130
|
+
query?: ReturnType<typeof calculateSensorEnvironmentRadianceQuery>;
|
|
116
131
|
apertureRays?: readonly SensorApertureRay[];
|
|
132
|
+
/** 1 / det(d distorted / d ideal), the change in area from distortion. Present only with a lens field mapping. */
|
|
133
|
+
distortionAreaFactor?: number;
|
|
117
134
|
fieldThroughput: CalculateSceneRadianceToSensorIrradianceInput["fieldThroughput"];
|
|
118
135
|
}[];
|
|
119
136
|
}[];
|
|
120
137
|
}[];
|
|
121
138
|
}
|
|
122
139
|
/**
|
|
123
|
-
*
|
|
124
|
-
* without
|
|
140
|
+
* Builds an internal execution plan covering all optical, spatial, spectral and temporal sampling,
|
|
141
|
+
* without calling any provider code.
|
|
125
142
|
*
|
|
126
|
-
*
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
130
|
-
* @param
|
|
131
|
-
*
|
|
143
|
+
* Coverage is checked completely before any supplied radiance function runs. Each query gives an
|
|
144
|
+
* explicit scene direction, a wavelength (air or vacuum) and seconds from the opening reference.
|
|
145
|
+
* @param input - The photo-signal input without its radiance functions; see
|
|
146
|
+
* `CalculateEnvironmentSensorPhotoSignalInput`.
|
|
147
|
+
* @param ownership - Internal. "copy" (default) makes a structured clone of the input. "engine-owned"
|
|
148
|
+
* uses the input as the plan's own data without cloning again. Only engine callers that already hold a
|
|
149
|
+
* private structured clone, never shown to supplied code and never changed afterwards, may pass it.
|
|
150
|
+
* @param retention - Internal. "full" (default) keeps every planned query result for "full" execution
|
|
151
|
+
* records. "photo-only" keeps only each query's frozen request and image-plane point, which is all that
|
|
152
|
+
* photo-only execution reads. Every query is still computed and validated at plan time, so limit checks
|
|
153
|
+
* and errors are unchanged.
|
|
154
|
+
* @returns The result. Success does not imply calibration.
|
|
132
155
|
*
|
|
133
|
-
* @see docs/API_REFERENCE.md for the
|
|
156
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
157
|
+
*/
|
|
158
|
+
export declare function planEnvironmentSensorPhotoSignal(input: Omit<CalculateEnvironmentSensorPhotoSignalInput, "evaluateRadiance" | "evaluateApertureRadiance">, ownership?: "copy" | "engine-owned", retention?: "full" | "photo-only"): EnvironmentPhotoPlan;
|
|
159
|
+
/**
|
|
160
|
+
* Internal: the frozen provider request and frozen private ray copy of one ideal-pupil query (sample ID suffix "-a"
|
|
161
|
+
* and the pupil index, reversed ray direction). If prebuildApertureRadianceQuery already built this query for a batch,
|
|
162
|
+
* the same objects are returned once, so the batch and the executor share them; otherwise new ones are built.
|
|
163
|
+
*/
|
|
164
|
+
export declare function apertureRadianceQuery(base: SceneRadianceEvaluationRequest, ray: SensorApertureRay): {
|
|
165
|
+
request: SceneRadianceEvaluationRequest;
|
|
166
|
+
apertureRay: SensorApertureRay;
|
|
167
|
+
};
|
|
168
|
+
/** Internal: builds a pupil query for a batched provider and keeps it for the executor's apertureRadianceQuery call. */
|
|
169
|
+
export declare function prebuildApertureRadianceQuery(base: SceneRadianceEvaluationRequest, ray: SensorApertureRay): {
|
|
170
|
+
request: SceneRadianceEvaluationRequest;
|
|
171
|
+
apertureRay: SensorApertureRay;
|
|
172
|
+
};
|
|
173
|
+
/**
|
|
174
|
+
* Internal: runs a completed, bounded plan. On failure nothing partial is returned.
|
|
175
|
+
* With retention "full" (default), every per-evaluation record is kept in value.instants[].evaluations.
|
|
176
|
+
* With "photo-only", those lists are empty, for engine callers that read only value.photo. Photo values
|
|
177
|
+
* are identical either way.
|
|
134
178
|
*/
|
|
135
|
-
export declare function
|
|
136
|
-
/**
|
|
137
|
-
export declare function executeEnvironmentSensorPhotoSignal(plan: ReturnType<typeof planEnvironmentSensorPhotoSignal>, evaluate: EnvironmentRadianceEvaluator, evaluateAperture?: EnvironmentApertureRadianceEvaluator): CalculationResult<EnvironmentSensorPhotoSignal>;
|
|
138
|
-
/** Generate, evaluate and integrate one site's actual local midpoint environment support. */
|
|
179
|
+
export declare function executeEnvironmentSensorPhotoSignal(plan: ReturnType<typeof planEnvironmentSensorPhotoSignal>, evaluate: EnvironmentRadianceEvaluator, evaluateAperture?: EnvironmentApertureRadianceEvaluator, retention?: "full" | "photo-only"): CalculationResult<EnvironmentSensorPhotoSignal>;
|
|
180
|
+
/** Plans, queries the provider and integrates the photo signal for one site, at the site's own midpoint sample positions. */
|
|
139
181
|
export declare function calculateEnvironmentSensorPhotoSignal(input: CalculateEnvironmentSensorPhotoSignalInput): CalculationResult<EnvironmentSensorPhotoSignal>;
|
|
140
182
|
export {};
|
|
141
|
-
//# sourceMappingURL=environment-photo-signal.d.ts.map
|