@photivra/engine 1.4.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +401 -6
- package/CITATION.cff +1 -1
- package/NODE_SUPPORT.md +64 -12
- package/README.md +301 -182
- package/SECURITY.md +37 -28
- package/THIRD_PARTY.md +148 -4
- package/dist/camera/equivalent-focal-length.d.ts +13 -14
- package/dist/camera/equivalent-focal-length.js +15 -13
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +30 -19
- package/dist/camera/field-of-view.js +67 -18
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/lens-projection.d.ts +170 -0
- package/dist/camera/lens-projection.js +444 -0
- package/dist/camera/lens-projection.js.map +1 -0
- package/dist/camera/projected-object-size.d.ts +10 -11
- package/dist/camera/projected-object-size.js +12 -10
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +9 -10
- package/dist/capture/capture-export-metadata.js +8 -5
- package/dist/capture/capture-export-metadata.js.map +1 -1
- package/dist/capture/dng-import.d.ts +91 -0
- package/dist/capture/dng-import.js +343 -0
- package/dist/capture/dng-import.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +37 -17
- package/dist/capture/environment-raw-producer.js +43 -19
- package/dist/capture/environment-raw-producer.js.map +1 -1
- package/dist/capture/export-jpeg.d.ts +35 -4
- package/dist/capture/export-jpeg.js +133 -47
- package/dist/capture/export-jpeg.js.map +1 -1
- package/dist/capture/export-tiff.d.ts +48 -24
- package/dist/capture/export-tiff.js +91 -31
- package/dist/capture/export-tiff.js.map +1 -1
- package/dist/capture/focus-control.d.ts +42 -65
- package/dist/capture/focus-control.js +56 -75
- package/dist/capture/focus-control.js.map +1 -1
- package/dist/capture/host-yield-cadence.d.ts +25 -0
- package/dist/capture/host-yield-cadence.js +25 -0
- package/dist/capture/host-yield-cadence.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +14 -12
- package/dist/capture/linear-encoding.js +14 -13
- package/dist/capture/linear-encoding.js.map +1 -1
- package/dist/capture/lossless-jpeg.d.ts +27 -0
- package/dist/capture/lossless-jpeg.js +237 -0
- package/dist/capture/lossless-jpeg.js.map +1 -0
- package/dist/capture/native-environment-lean.d.ts +227 -0
- package/dist/capture/native-environment-lean.js +974 -0
- package/dist/capture/native-environment-lean.js.map +1 -0
- package/dist/capture/native-environment-optical-stage.d.ts +97 -0
- package/dist/capture/native-environment-optical-stage.js +340 -0
- package/dist/capture/native-environment-optical-stage.js.map +1 -0
- package/dist/capture/native-environment-raw.d.ts +140 -6
- package/dist/capture/native-environment-raw.js +435 -34
- package/dist/capture/native-environment-raw.js.map +1 -1
- package/dist/capture/native-raw-development.d.ts +118 -5
- package/dist/capture/native-raw-development.js +224 -59
- package/dist/capture/native-raw-development.js.map +1 -1
- package/dist/capture/native-raw-dng.d.ts +60 -0
- package/dist/capture/native-raw-dng.js +167 -0
- package/dist/capture/native-raw-dng.js.map +1 -0
- package/dist/capture/native-raw.d.ts +67 -10
- package/dist/capture/native-raw.js +90 -24
- package/dist/capture/native-raw.js.map +1 -1
- package/dist/capture/packed-sensor-raw.d.ts +160 -0
- package/dist/capture/packed-sensor-raw.js +221 -0
- package/dist/capture/packed-sensor-raw.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +58 -35
- package/dist/capture/photographic-export.js +177 -70
- package/dist/capture/photographic-export.js.map +1 -1
- package/dist/capture/raw-development-kernel.d.ts +52 -0
- package/dist/capture/raw-development-kernel.js +88 -0
- package/dist/capture/raw-development-kernel.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +7 -7
- package/dist/capture/raw-frame-limits.js +7 -6
- package/dist/capture/raw-frame-limits.js.map +1 -1
- package/dist/capture/raw-frame-reconstruction.d.ts +8 -9
- package/dist/capture/raw-frame-reconstruction.js +9 -8
- package/dist/capture/raw-frame-reconstruction.js.map +1 -1
- package/dist/capture/raw-white-level.d.ts +55 -0
- package/dist/capture/raw-white-level.js +165 -0
- package/dist/capture/raw-white-level.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +5 -7
- package/dist/capture/release-sequence.js +15 -13
- package/dist/capture/release-sequence.js.map +1 -1
- package/dist/capture/sensor-raw-frame.d.ts +5 -6
- package/dist/capture/sensor-raw-frame.js +26 -9
- package/dist/capture/sensor-raw-frame.js.map +1 -1
- package/dist/capture/sensor-raw-producer.d.ts +21 -13
- package/dist/capture/sensor-raw-producer.js +86 -25
- package/dist/capture/sensor-raw-producer.js.map +1 -1
- package/dist/capture/simulated-capture.d.ts +15 -16
- package/dist/capture/simulated-capture.js +22 -12
- package/dist/capture/simulated-capture.js.map +1 -1
- package/dist/color/camera-color-matrix.d.ts +69 -0
- package/dist/color/camera-color-matrix.js +132 -0
- package/dist/color/camera-color-matrix.js.map +1 -0
- package/dist/color/capture-color.d.ts +17 -10
- package/dist/color/capture-color.js +50 -17
- package/dist/color/capture-color.js.map +1 -1
- package/dist/color/chromatic-adaptation.d.ts +63 -0
- package/dist/color/chromatic-adaptation.js +91 -0
- package/dist/color/chromatic-adaptation.js.map +1 -0
- package/dist/color/color-difference.d.ts +104 -0
- package/dist/color/color-difference.js +205 -0
- package/dist/color/color-difference.js.map +1 -0
- package/dist/color/color-matching-functions.d.ts +168 -0
- package/dist/color/color-matching-functions.js +309 -0
- package/dist/color/color-matching-functions.js.map +1 -0
- package/dist/color/colorimetry-math.d.ts +52 -0
- package/dist/color/colorimetry-math.js +144 -0
- package/dist/color/colorimetry-math.js.map +1 -0
- package/dist/color/gamut-mapping.d.ts +54 -0
- package/dist/color/gamut-mapping.js +107 -0
- package/dist/color/gamut-mapping.js.map +1 -0
- package/dist/color/illuminants.d.ts +182 -0
- package/dist/color/illuminants.js +434 -0
- package/dist/color/illuminants.js.map +1 -0
- package/dist/color/rgb-color-spaces.d.ts +79 -0
- package/dist/color/rgb-color-spaces.js +115 -0
- package/dist/color/rgb-color-spaces.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +33 -11
- package/dist/color/sensor-color-development.js +104 -30
- package/dist/color/sensor-color-development.js.map +1 -1
- package/dist/color/srgb-icc.d.ts +9 -2
- package/dist/color/srgb-icc.js +16 -5
- package/dist/color/srgb-icc.js.map +1 -1
- package/dist/color/srgb-transfer.d.ts +1 -2
- package/dist/color/srgb-transfer.js +1 -1
- package/dist/color/srgb-transfer.js.map +1 -1
- package/dist/color/white-balance.d.ts +68 -19
- package/dist/color/white-balance.js +168 -35
- package/dist/color/white-balance.js.map +1 -1
- package/dist/composition/image-formation-plan.d.ts +152 -128
- package/dist/composition/image-formation-plan.js +292 -138
- package/dist/composition/image-formation-plan.js.map +1 -1
- package/dist/composition/plan-consumer.d.ts +6 -7
- package/dist/composition/plan-consumer.js +14 -11
- package/dist/composition/plan-consumer.js.map +1 -1
- package/dist/core/calculation-result.d.ts +21 -14
- package/dist/core/calculation-result.js +209 -11
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +13 -8
- package/dist/core/canonical-json.js +34 -15
- package/dist/core/canonical-json.js.map +1 -1
- package/dist/core/configuration-error.d.ts +5 -4
- package/dist/core/configuration-error.js +5 -3
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +12 -12
- package/dist/core/evidence-provenance.js +10 -9
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +11 -10
- package/dist/core/image-formation.js +11 -9
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +9 -17
- package/dist/core/owned-data.js +9 -16
- package/dist/core/owned-data.js.map +1 -1
- package/dist/core/portable-math.d.ts +15 -0
- package/dist/core/portable-math.js +56 -0
- package/dist/core/portable-math.js.map +1 -0
- package/dist/core/record-validation.d.ts +48 -9
- package/dist/core/record-validation.js +93 -19
- package/dist/core/record-validation.js.map +1 -1
- package/dist/core/scientific-assurance.d.ts +16 -14
- package/dist/core/scientific-assurance.js +22 -18
- package/dist/core/scientific-assurance.js.map +1 -1
- package/dist/core/spectral-composition.d.ts +13 -14
- package/dist/core/spectral-composition.js +30 -27
- package/dist/core/spectral-composition.js.map +1 -1
- package/dist/core/spectral.d.ts +5 -6
- package/dist/core/spectral.js +9 -7
- package/dist/core/spectral.js.map +1 -1
- package/dist/core/validation.d.ts +3 -6
- package/dist/core/validation.js +3 -5
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +6 -6
- package/dist/core/version.js +6 -5
- package/dist/core/version.js.map +1 -1
- package/dist/equipment/exposure-capabilities.d.ts +10 -10
- package/dist/equipment/exposure-capabilities.js +40 -30
- package/dist/equipment/exposure-capabilities.js.map +1 -1
- package/dist/equipment/generic-tier-assets.d.ts +13 -6
- package/dist/equipment/generic-tier-assets.js +34 -15
- package/dist/equipment/generic-tier-assets.js.map +1 -1
- package/dist/equipment/generic-tier-presets.d.ts +5 -6
- package/dist/equipment/generic-tier-presets.js +15 -13
- package/dist/equipment/generic-tier-presets.js.map +1 -1
- package/dist/equipment/iso-capabilities.d.ts +21 -22
- package/dist/equipment/iso-capabilities.js +49 -44
- package/dist/equipment/iso-capabilities.js.map +1 -1
- package/dist/equipment/metering-capabilities.d.ts +5 -6
- package/dist/equipment/metering-capabilities.js +22 -19
- package/dist/equipment/metering-capabilities.js.map +1 -1
- package/dist/equipment/release-capabilities.d.ts +3 -4
- package/dist/equipment/release-capabilities.js +18 -14
- package/dist/equipment/release-capabilities.js.map +1 -1
- package/dist/exposure/exposure-duration-control.d.ts +19 -17
- package/dist/exposure/exposure-duration-control.js +27 -23
- package/dist/exposure/exposure-duration-control.js.map +1 -1
- package/dist/exposure/exposure-mode-resolver.d.ts +42 -39
- package/dist/exposure/exposure-mode-resolver.js +127 -82
- package/dist/exposure/exposure-mode-resolver.js.map +1 -1
- package/dist/exposure/exposure.d.ts +17 -16
- package/dist/exposure/exposure.js +22 -15
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash-ttl.d.ts +135 -0
- package/dist/exposure/flash-ttl.js +193 -0
- package/dist/exposure/flash-ttl.js.map +1 -0
- package/dist/exposure/flash.d.ts +144 -36
- package/dist/exposure/flash.js +259 -59
- package/dist/exposure/flash.js.map +1 -1
- package/dist/exposure/metering-scene-radiance.d.ts +10 -10
- package/dist/exposure/metering-scene-radiance.js +42 -23
- package/dist/exposure/metering-scene-radiance.js.map +1 -1
- package/dist/exposure/metering-target.d.ts +8 -8
- package/dist/exposure/metering-target.js +30 -20
- package/dist/exposure/metering-target.js.map +1 -1
- package/dist/exposure/metering-temporal.d.ts +16 -15
- package/dist/exposure/metering-temporal.js +41 -19
- package/dist/exposure/metering-temporal.js.map +1 -1
- package/dist/exposure/metering.d.ts +64 -17
- package/dist/exposure/metering.js +159 -30
- package/dist/exposure/metering.js.map +1 -1
- package/dist/exposure/program-line.d.ts +5 -5
- package/dist/exposure/program-line.js +20 -13
- package/dist/exposure/program-line.js.map +1 -1
- package/dist/facade/camera-preset.d.ts +8 -0
- package/dist/facade/camera-preset.js +102 -0
- package/dist/facade/camera-preset.js.map +1 -0
- package/dist/facade/chart-radiance-batch.d.ts +57 -0
- package/dist/facade/chart-radiance-batch.js +121 -0
- package/dist/facade/chart-radiance-batch.js.map +1 -0
- package/dist/facade/chart-scenes.d.ts +177 -0
- package/dist/facade/chart-scenes.js +232 -0
- package/dist/facade/chart-scenes.js.map +1 -0
- package/dist/facade/host-yield.d.ts +7 -0
- package/dist/facade/host-yield.js +23 -0
- package/dist/facade/host-yield.js.map +1 -0
- package/dist/facade/scene-radiance.d.ts +117 -0
- package/dist/facade/scene-radiance.js +205 -0
- package/dist/facade/scene-radiance.js.map +1 -0
- package/dist/facade/simulate-capture.d.ts +284 -0
- package/dist/facade/simulate-capture.js +1026 -0
- package/dist/facade/simulate-capture.js.map +1 -0
- package/dist/gpu/chart-radiance-gpu.d.ts +17 -0
- package/dist/gpu/chart-radiance-gpu.js +176 -0
- package/dist/gpu/chart-radiance-gpu.js.map +1 -0
- package/dist/gpu/image-kernel-accelerator.d.ts +132 -0
- package/dist/gpu/image-kernel-accelerator.js +720 -0
- package/dist/gpu/image-kernel-accelerator.js.map +1 -0
- package/dist/gpu/image-kernel-execution.d.ts +92 -0
- package/dist/gpu/image-kernel-execution.js +84 -0
- package/dist/gpu/image-kernel-execution.js.map +1 -0
- package/dist/gpu/sensor-stage-gpu.d.ts +44 -0
- package/dist/gpu/sensor-stage-gpu.js +317 -0
- package/dist/gpu/sensor-stage-gpu.js.map +1 -0
- package/dist/gpu/temporal-sum-gpu.d.ts +23 -0
- package/dist/gpu/temporal-sum-gpu.js +150 -0
- package/dist/gpu/temporal-sum-gpu.js.map +1 -0
- package/dist/gpu/webgpu-runtime.d.ts +63 -0
- package/dist/gpu/webgpu-runtime.js +215 -0
- package/dist/gpu/webgpu-runtime.js.map +1 -0
- package/dist/gpu/wgsl-chart-kernel.d.ts +30 -0
- package/dist/gpu/wgsl-chart-kernel.js +165 -0
- package/dist/gpu/wgsl-chart-kernel.js.map +1 -0
- package/dist/gpu/wgsl-kernels.d.ts +53 -0
- package/dist/gpu/wgsl-kernels.js +365 -0
- package/dist/gpu/wgsl-kernels.js.map +1 -0
- package/dist/gpu/wgsl-sensor-kernel.d.ts +64 -0
- package/dist/gpu/wgsl-sensor-kernel.js +409 -0
- package/dist/gpu/wgsl-sensor-kernel.js.map +1 -0
- package/dist/index.d.ts +89 -25
- package/dist/index.js +59 -15
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +92 -40
- package/dist/motion/camera-rotation.js +84 -47
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +37 -34
- package/dist/motion/capture-rotation-inverse-mapping.js +32 -24
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +39 -35
- package/dist/motion/capture-rotation-temporal-quadrature.js +37 -28
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +32 -28
- package/dist/motion/capture-rotation-trajectory.js +36 -26
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +23 -21
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +33 -14
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -1
- package/dist/motion/extended-object-projection.d.ts +19 -16
- package/dist/motion/extended-object-projection.js +38 -18
- package/dist/motion/extended-object-projection.js.map +1 -1
- package/dist/motion/projected-motion.d.ts +18 -17
- package/dist/motion/projected-motion.js +25 -17
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/motion/temporal-exposure-sum.d.ts +55 -0
- package/dist/motion/temporal-exposure-sum.js +141 -0
- package/dist/motion/temporal-exposure-sum.js.map +1 -0
- package/dist/motion/video-sequence.d.ts +111 -0
- package/dist/motion/video-sequence.js +179 -0
- package/dist/motion/video-sequence.js.map +1 -0
- package/dist/optics/aperture.d.ts +14 -15
- package/dist/optics/aperture.js +13 -11
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/atmospheric-haze.d.ts +83 -0
- package/dist/optics/atmospheric-haze.js +113 -0
- package/dist/optics/atmospheric-haze.js.map +1 -0
- package/dist/optics/brown-conrady-distortion.d.ts +116 -0
- package/dist/optics/brown-conrady-distortion.js +291 -0
- package/dist/optics/brown-conrady-distortion.js.map +1 -0
- package/dist/optics/circle-of-confusion.d.ts +10 -10
- package/dist/optics/circle-of-confusion.js +15 -11
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +64 -33
- package/dist/optics/complex-pupil-psf.js +190 -98
- package/dist/optics/complex-pupil-psf.js.map +1 -1
- package/dist/optics/depth-of-field.d.ts +25 -15
- package/dist/optics/depth-of-field.js +67 -27
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +14 -13
- package/dist/optics/diffraction.js +14 -10
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +88 -27
- package/dist/optics/focus-breathing.js +114 -23
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +18 -18
- package/dist/optics/focus-state.js +21 -15
- package/dist/optics/focus-state.js.map +1 -1
- package/dist/optics/front-of-lens-filter.d.ts +45 -14
- package/dist/optics/front-of-lens-filter.js +259 -88
- package/dist/optics/front-of-lens-filter.js.map +1 -1
- package/dist/optics/illumination-vignetting.d.ts +16 -17
- package/dist/optics/illumination-vignetting.js +40 -17
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/irradiance-convolution.d.ts +59 -0
- package/dist/optics/irradiance-convolution.js +138 -0
- package/dist/optics/irradiance-convolution.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts +33 -30
- package/dist/optics/lateral-chromatic-aberration.js +33 -23
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-kernels.d.ts +89 -0
- package/dist/optics/lens-psf-kernels.js +175 -0
- package/dist/optics/lens-psf-kernels.js.map +1 -0
- package/dist/optics/lens-psf-profile.d.ts +78 -46
- package/dist/optics/lens-psf-profile.js +335 -124
- package/dist/optics/lens-psf-profile.js.map +1 -1
- package/dist/optics/longitudinal-chromatic-aberration.d.ts +102 -0
- package/dist/optics/longitudinal-chromatic-aberration.js +210 -0
- package/dist/optics/longitudinal-chromatic-aberration.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +80 -23
- package/dist/optics/polygon-diffraction.js +130 -25
- package/dist/optics/polygon-diffraction.js.map +1 -1
- package/dist/optics/profile-contract.d.ts +5 -6
- package/dist/optics/profile-contract.js +14 -11
- package/dist/optics/profile-contract.js.map +1 -1
- package/dist/optics/psf-foundation.d.ts +23 -23
- package/dist/optics/psf-foundation.js +24 -21
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/pupil-vignetting.d.ts +118 -0
- package/dist/optics/pupil-vignetting.js +264 -0
- package/dist/optics/pupil-vignetting.js.map +1 -0
- package/dist/optics/radial-distortion.d.ts +34 -33
- package/dist/optics/radial-distortion.js +37 -30
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +47 -33
- package/dist/optics/scene-to-sensor-irradiance.js +73 -45
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts +23 -18
- package/dist/optics/scene-to-sensor-quadrature.js +16 -11
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -1
- package/dist/optics/sensor-aperture-rays.d.ts +20 -4
- package/dist/optics/sensor-aperture-rays.js +32 -14
- package/dist/optics/sensor-aperture-rays.js.map +1 -1
- package/dist/optics/sensor-environment-query.d.ts +81 -16
- package/dist/optics/sensor-environment-query.js +145 -12
- package/dist/optics/sensor-environment-query.js.map +1 -1
- package/dist/optics/sensor-psf-quadrature.d.ts +12 -10
- package/dist/optics/sensor-psf-quadrature.js +18 -11
- package/dist/optics/sensor-psf-quadrature.js.map +1 -1
- package/dist/optics/sensor-psf-support.d.ts +8 -6
- package/dist/optics/sensor-psf-support.js +8 -5
- package/dist/optics/sensor-psf-support.js.map +1 -1
- package/dist/optics/stray-light.d.ts +22 -19
- package/dist/optics/stray-light.js +18 -12
- package/dist/optics/stray-light.js.map +1 -1
- package/dist/optics/thin-lens.d.ts +10 -9
- package/dist/optics/thin-lens.js +12 -8
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/optics/zernike-wavefront.d.ts +154 -0
- package/dist/optics/zernike-wavefront.js +352 -0
- package/dist/optics/zernike-wavefront.js.map +1 -0
- package/dist/output/capture-corrected-sdr.d.ts +16 -8
- package/dist/output/capture-corrected-sdr.js +16 -8
- package/dist/output/capture-corrected-sdr.js.map +1 -1
- package/dist/output/capture-geometry.d.ts +34 -36
- package/dist/output/capture-geometry.js +52 -32
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +7 -6
- package/dist/output/capture-sdr.js +11 -8
- package/dist/output/capture-sdr.js.map +1 -1
- package/dist/output/crop.d.ts +22 -6
- package/dist/output/crop.js +40 -6
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +60 -23
- package/dist/output/geometric-transforms.js +111 -24
- package/dist/output/geometric-transforms.js.map +1 -1
- package/dist/output/lens-corrections.d.ts +27 -19
- package/dist/output/lens-corrections.js +29 -13
- package/dist/output/lens-corrections.js.map +1 -1
- package/dist/output/native-capture-sdr.d.ts +71 -16
- package/dist/output/native-capture-sdr.js +190 -33
- package/dist/output/native-capture-sdr.js.map +1 -1
- package/dist/output/png-encoder.d.ts +65 -0
- package/dist/output/png-encoder.js +461 -0
- package/dist/output/png-encoder.js.map +1 -0
- package/dist/output/print-contrast-reference.d.ts +10 -9
- package/dist/output/print-contrast-reference.js +10 -8
- package/dist/output/print-contrast-reference.js.map +1 -1
- package/dist/output/print-detail.d.ts +18 -17
- package/dist/output/print-detail.js +12 -10
- package/dist/output/print-detail.js.map +1 -1
- package/dist/output/print-jpeg.d.ts +26 -5
- package/dist/output/print-jpeg.js +117 -50
- package/dist/output/print-jpeg.js.map +1 -1
- package/dist/output/print-plan.d.ts +19 -19
- package/dist/output/print-plan.js +11 -10
- package/dist/output/print-plan.js.map +1 -1
- package/dist/output/print-region-statistics.d.ts +14 -15
- package/dist/output/print-region-statistics.js +11 -11
- package/dist/output/print-region-statistics.js.map +1 -1
- package/dist/output/sdr-rendering.d.ts +48 -10
- package/dist/output/sdr-rendering.js +114 -25
- package/dist/output/sdr-rendering.js.map +1 -1
- package/dist/output/subject-framing-crop.d.ts +6 -10
- package/dist/output/subject-framing-crop.js +23 -13
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/processing/demosaic.d.ts +90 -0
- package/dist/processing/demosaic.js +275 -0
- package/dist/processing/demosaic.js.map +1 -0
- package/dist/processing/denoise.d.ts +68 -0
- package/dist/processing/denoise.js +214 -0
- package/dist/processing/denoise.js.map +1 -0
- package/dist/processing/focus-stacking.d.ts +17 -0
- package/dist/processing/focus-stacking.js +80 -0
- package/dist/processing/focus-stacking.js.map +1 -0
- package/dist/processing/hdr.d.ts +54 -0
- package/dist/processing/hdr.js +172 -0
- package/dist/processing/hdr.js.map +1 -0
- package/dist/processing/image-ops.d.ts +66 -0
- package/dist/processing/image-ops.js +192 -0
- package/dist/processing/image-ops.js.map +1 -0
- package/dist/processing/panorama.d.ts +51 -0
- package/dist/processing/panorama.js +305 -0
- package/dist/processing/panorama.js.map +1 -0
- package/dist/processing/processing-task.d.ts +85 -0
- package/dist/processing/processing-task.js +164 -0
- package/dist/processing/processing-task.js.map +1 -0
- package/dist/processing/tone-mapping.d.ts +69 -0
- package/dist/processing/tone-mapping.js +310 -0
- package/dist/processing/tone-mapping.js.map +1 -0
- package/dist/schema/camera.d.ts +5 -4
- package/dist/schema/illumination-spectral.d.ts +13 -19
- package/dist/schema/illumination-spectral.js +23 -19
- package/dist/schema/illumination-spectral.js.map +1 -1
- package/dist/schema/illumination-temporal.d.ts +12 -15
- package/dist/schema/illumination-temporal.js +43 -28
- package/dist/schema/illumination-temporal.js.map +1 -1
- package/dist/schema/illumination.d.ts +5 -4
- package/dist/schema/illumination.js +55 -20
- package/dist/schema/illumination.js.map +1 -1
- package/dist/schema/scene-radiance-temporal.d.ts +9 -11
- package/dist/schema/scene-radiance-temporal.js +26 -23
- package/dist/schema/scene-radiance-temporal.js.map +1 -1
- package/dist/schema/scene-radiance.d.ts +17 -17
- package/dist/schema/scene-radiance.js +56 -34
- package/dist/schema/scene-radiance.js.map +1 -1
- package/dist/schema/scene.d.ts +14 -13
- package/dist/schema/validation.d.ts +0 -1
- package/dist/schema/validation.js +17 -15
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +45 -64
- package/dist/sensor/accumulated-charge.js +41 -47
- package/dist/sensor/accumulated-charge.js.map +1 -1
- package/dist/sensor/architecture.d.ts +22 -25
- package/dist/sensor/architecture.js +17 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +21 -28
- package/dist/sensor/camera-saturation-capacity.js +36 -34
- package/dist/sensor/camera-saturation-capacity.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +46 -51
- package/dist/sensor/capture-color-sampling-binding.js +39 -41
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +8 -9
- package/dist/sensor/capture-mode-timing.js +24 -21
- package/dist/sensor/capture-mode-timing.js.map +1 -1
- package/dist/sensor/capture-mode.d.ts +28 -30
- package/dist/sensor/capture-mode.js +33 -31
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts +30 -33
- package/dist/sensor/color-sampling.js +32 -37
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +19 -23
- package/dist/sensor/constant-rate-temporal-integration.js +28 -26
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -1
- package/dist/sensor/dark-current.d.ts +53 -49
- package/dist/sensor/dark-current.js +87 -46
- package/dist/sensor/dark-current.js.map +1 -1
- package/dist/sensor/environment-photo-signal.d.ts +71 -30
- package/dist/sensor/environment-photo-signal.js +127 -46
- package/dist/sensor/environment-photo-signal.js.map +1 -1
- package/dist/sensor/eqe-electron-rate.d.ts +14 -13
- package/dist/sensor/eqe-electron-rate.js +34 -14
- package/dist/sensor/eqe-electron-rate.js.map +1 -1
- package/dist/sensor/eqe-local-exposure.d.ts +24 -24
- package/dist/sensor/eqe-local-exposure.js +15 -11
- package/dist/sensor/eqe-local-exposure.js.map +1 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts +11 -11
- package/dist/sensor/eqe-temporal-exposure.js +15 -10
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/exposure-window.d.ts +48 -34
- package/dist/sensor/exposure-window.js +77 -36
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/fixed-pattern-noise.d.ts +108 -0
- package/dist/sensor/fixed-pattern-noise.js +166 -0
- package/dist/sensor/fixed-pattern-noise.js.map +1 -0
- package/dist/sensor/iso-gain.d.ts +44 -0
- package/dist/sensor/iso-gain.js +119 -0
- package/dist/sensor/iso-gain.js.map +1 -0
- package/dist/sensor/iso-signal-chain.d.ts +25 -48
- package/dist/sensor/iso-signal-chain.js +52 -66
- package/dist/sensor/iso-signal-chain.js.map +1 -1
- package/dist/sensor/local-exposure-binding.d.ts +21 -21
- package/dist/sensor/local-exposure-binding.js +22 -18
- package/dist/sensor/local-exposure-binding.js.map +1 -1
- package/dist/sensor/optical-stack.d.ts +36 -40
- package/dist/sensor/optical-stack.js +34 -37
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +22 -28
- package/dist/sensor/photon-energy.js +42 -34
- package/dist/sensor/photon-energy.js.map +1 -1
- package/dist/sensor/physical-charge-capacity.d.ts +20 -30
- package/dist/sensor/physical-charge-capacity.js +35 -36
- package/dist/sensor/physical-charge-capacity.js.map +1 -1
- package/dist/sensor/pixel-pitch.d.ts +2 -3
- package/dist/sensor/pixel-pitch.js +4 -2
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +13 -15
- package/dist/sensor/radiometry-readiness.js +20 -17
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +173 -83
- package/dist/sensor/raw-readout.js +425 -160
- package/dist/sensor/raw-readout.js.map +1 -1
- package/dist/sensor/raw-reconstruction.d.ts +112 -44
- package/dist/sensor/raw-reconstruction.js +200 -47
- package/dist/sensor/raw-reconstruction.js.map +1 -1
- package/dist/sensor/readout-exposure-linkage.d.ts +103 -34
- package/dist/sensor/readout-exposure-linkage.js +125 -27
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +43 -44
- package/dist/sensor/readout-timing.js +38 -30
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +21 -28
- package/dist/sensor/response-application-compatibility.js +35 -34
- package/dist/sensor/response-application-compatibility.js.map +1 -1
- package/dist/sensor/response-operating-range.d.ts +26 -35
- package/dist/sensor/response-operating-range.js +40 -39
- package/dist/sensor/response-operating-range.js.map +1 -1
- package/dist/sensor/responsivity-photocurrent.d.ts +21 -29
- package/dist/sensor/responsivity-photocurrent.js +57 -40
- package/dist/sensor/responsivity-photocurrent.js.map +1 -1
- package/dist/sensor/sampling-aperture.d.ts +21 -25
- package/dist/sensor/sampling-aperture.js +29 -28
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +14 -12
- package/dist/sensor/scene-eqe-temporal-exposure.js +13 -8
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -1
- package/dist/sensor/sensor-geometry.d.ts +28 -32
- package/dist/sensor/sensor-geometry.js +35 -20
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +14 -16
- package/dist/sensor/signal-noise.js +15 -13
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +45 -60
- package/dist/sensor/spatial-sample-reduction.js +39 -48
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +46 -54
- package/dist/sensor/spatial-sampling-quadrature.js +31 -36
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +32 -42
- package/dist/sensor/spatio-spectral-reduction.js +24 -29
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -1
- package/dist/sensor/spectral-coverage.d.ts +6 -9
- package/dist/sensor/spectral-coverage.js +9 -6
- package/dist/sensor/spectral-coverage.js.map +1 -1
- package/dist/sensor/spectral-quadrature.d.ts +46 -60
- package/dist/sensor/spectral-quadrature.js +38 -48
- package/dist/sensor/spectral-quadrature.js.map +1 -1
- package/dist/sensor/spectral-response.d.ts +53 -41
- package/dist/sensor/spectral-response.js +80 -47
- package/dist/sensor/spectral-response.js.map +1 -1
- package/dist/sensor/stochastic-seed.d.ts +50 -0
- package/dist/sensor/stochastic-seed.js +123 -0
- package/dist/sensor/stochastic-seed.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +2 -4
- package/dist/sensor/temporal-eqe-sum.js +5 -6
- package/dist/sensor/temporal-eqe-sum.js.map +1 -1
- package/dist/sensor/temporal-photo-signal.d.ts +5 -6
- package/dist/sensor/temporal-photo-signal.js +11 -10
- package/dist/sensor/temporal-photo-signal.js.map +1 -1
- package/dist/sensor/temporal-sample-binding.d.ts +1 -2
- package/dist/sensor/temporal-sample-binding.js +3 -3
- package/dist/sensor/temporal-sample-binding.js.map +1 -1
- package/dist/simulation/poc-simulation.d.ts +16 -16
- package/dist/simulation/poc-simulation.js +20 -15
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +42 -18
- package/dist/stabilization/camera-shake.js +43 -20
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +44 -41
- package/dist/stabilization/system.js +196 -108
- package/dist/stabilization/system.js.map +1 -1
- package/docs/AGENT_GUIDE.md +183 -0
- package/docs/API_REFERENCE.md +761 -2
- package/docs/QUICK_START.md +495 -0
- package/docs/USAGE.md +1719 -714
- package/docs/api/camera-equivalent-focal-length.md +6 -7
- package/docs/api/camera-field-of-view.md +16 -8
- package/docs/api/camera-lens-projection.md +246 -0
- package/docs/api/camera-projected-object-size.md +6 -5
- package/docs/api/capture-capture-export-metadata.md +10 -10
- package/docs/api/capture-dng-import.md +134 -0
- package/docs/api/capture-environment-raw-producer.md +17 -11
- package/docs/api/capture-export-jpeg.md +16 -0
- package/docs/api/capture-focus-control.md +25 -47
- package/docs/api/capture-linear-encoding.md +21 -12
- package/docs/api/capture-lossless-jpeg.md +49 -0
- package/docs/api/capture-native-environment-optical-stage.md +75 -0
- package/docs/api/capture-native-environment-raw.md +161 -4
- package/docs/api/capture-native-raw-development.md +69 -4
- package/docs/api/capture-native-raw-dng.md +84 -0
- package/docs/api/capture-native-raw.md +23 -8
- package/docs/api/capture-packed-sensor-raw.md +156 -0
- package/docs/api/capture-photographic-export.md +69 -31
- package/docs/api/capture-raw-frame-reconstruction.md +8 -8
- package/docs/api/capture-raw-white-level.md +37 -0
- package/docs/api/capture-release-sequence.md +6 -7
- package/docs/api/capture-sensor-raw-frame.md +6 -6
- package/docs/api/capture-sensor-raw-producer.md +17 -11
- package/docs/api/capture-simulated-capture.md +15 -15
- package/docs/api/color-camera-color-matrix.md +103 -0
- package/docs/api/color-capture-color.md +22 -11
- package/docs/api/color-chromatic-adaptation.md +82 -0
- package/docs/api/color-color-difference.md +134 -0
- package/docs/api/color-color-matching-functions.md +259 -0
- package/docs/api/color-colorimetry-math.md +54 -0
- package/docs/api/color-gamut-mapping.md +72 -0
- package/docs/api/color-illuminants.md +280 -0
- package/docs/api/color-rgb-color-spaces.md +151 -0
- package/docs/api/color-sensor-color-development.md +27 -0
- package/docs/api/color-srgb-icc.md +2 -4
- package/docs/api/color-white-balance.md +95 -19
- package/docs/api/composition-image-formation-plan.md +124 -95
- package/docs/api/composition-plan-consumer.md +7 -7
- package/docs/api/core-calculation-result.md +18 -14
- package/docs/api/core-configuration-error.md +1 -1
- package/docs/api/core-image-formation.md +7 -7
- package/docs/api/core-scientific-assurance.md +12 -10
- package/docs/api/core-spectral-composition.md +14 -14
- package/docs/api/core-spectral.md +6 -6
- package/docs/api/core-validation.md +3 -3
- package/docs/api/core-version.md +7 -6
- package/docs/api/equipment-exposure-capabilities.md +11 -10
- package/docs/api/equipment-generic-tier-assets.md +7 -2
- package/docs/api/equipment-generic-tier-presets.md +6 -6
- package/docs/api/equipment-iso-capabilities.md +18 -18
- package/docs/api/equipment-metering-capabilities.md +6 -6
- package/docs/api/equipment-release-capabilities.md +4 -4
- package/docs/api/exports.json +2213 -8
- package/docs/api/exposure-exposure-duration-control.md +9 -9
- package/docs/api/exposure-exposure-mode-resolver.md +35 -31
- package/docs/api/exposure-exposure.md +10 -10
- package/docs/api/exposure-flash-ttl.md +182 -0
- package/docs/api/exposure-flash.md +183 -28
- package/docs/api/exposure-metering-scene-radiance.md +11 -10
- package/docs/api/exposure-metering-target.md +9 -8
- package/docs/api/exposure-metering-temporal.md +8 -8
- package/docs/api/exposure-metering.md +69 -9
- package/docs/api/exposure-program-line.md +6 -5
- package/docs/api/facade-chart-radiance-batch.md +96 -0
- package/docs/api/facade-chart-scenes.md +240 -0
- package/docs/api/facade-scene-radiance.md +122 -0
- package/docs/api/facade-simulate-capture.md +324 -0
- package/docs/api/gpu-image-kernel-accelerator.md +157 -0
- package/docs/api/gpu-image-kernel-execution.md +152 -0
- package/docs/api/motion-camera-rotation.md +43 -26
- package/docs/api/motion-capture-rotation-inverse-mapping.md +24 -23
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +22 -22
- package/docs/api/motion-capture-rotation-trajectory.md +15 -15
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +15 -14
- package/docs/api/motion-extended-object-projection.md +10 -8
- package/docs/api/motion-projected-motion.md +8 -8
- package/docs/api/motion-temporal-exposure-sum.md +98 -0
- package/docs/api/motion-video-sequence.md +159 -0
- package/docs/api/optics-aperture.md +8 -8
- package/docs/api/optics-atmospheric-haze.md +104 -0
- package/docs/api/optics-brown-conrady-distortion.md +123 -0
- package/docs/api/optics-circle-of-confusion.md +5 -4
- package/docs/api/optics-complex-pupil-psf.md +57 -16
- package/docs/api/optics-depth-of-field.md +12 -6
- package/docs/api/optics-diffraction.md +8 -7
- package/docs/api/optics-focus-breathing.md +104 -16
- package/docs/api/optics-focus-state.md +9 -10
- package/docs/api/optics-front-of-lens-filter.md +72 -14
- package/docs/api/optics-illumination-vignetting.md +10 -10
- package/docs/api/optics-irradiance-convolution.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +22 -21
- package/docs/api/optics-lens-psf-kernels.md +72 -0
- package/docs/api/optics-lens-psf-profile.md +48 -26
- package/docs/api/optics-longitudinal-chromatic-aberration.md +128 -0
- package/docs/api/optics-polygon-diffraction.md +78 -13
- package/docs/api/optics-profile-contract.md +4 -4
- package/docs/api/optics-psf-foundation.md +12 -12
- package/docs/api/optics-pupil-vignetting.md +132 -0
- package/docs/api/optics-radial-distortion.md +12 -12
- package/docs/api/optics-scene-to-sensor-irradiance.md +25 -14
- package/docs/api/optics-scene-to-sensor-quadrature.md +15 -12
- package/docs/api/optics-sensor-aperture-rays.md +3 -2
- package/docs/api/optics-sensor-environment-query.md +52 -9
- package/docs/api/optics-sensor-psf-quadrature.md +13 -10
- package/docs/api/optics-stray-light.md +12 -11
- package/docs/api/optics-thin-lens.md +4 -3
- package/docs/api/optics-zernike-wavefront.md +229 -0
- package/docs/api/output-capture-corrected-sdr.md +10 -7
- package/docs/api/output-capture-geometry.md +35 -36
- package/docs/api/output-capture-sdr.md +4 -4
- package/docs/api/output-crop.md +7 -4
- package/docs/api/output-geometric-transforms.md +65 -19
- package/docs/api/output-lens-corrections.md +17 -15
- package/docs/api/output-native-capture-sdr.md +26 -13
- package/docs/api/output-png-encoder.md +105 -0
- package/docs/api/output-print-contrast-reference.md +8 -8
- package/docs/api/output-print-detail.md +14 -14
- package/docs/api/output-print-jpeg.md +22 -5
- package/docs/api/output-print-plan.md +18 -18
- package/docs/api/output-print-region-statistics.md +14 -14
- package/docs/api/output-sdr-rendering.md +52 -10
- package/docs/api/output-subject-framing-crop.md +5 -6
- package/docs/api/processing-demosaic.md +120 -0
- package/docs/api/processing-denoise.md +148 -0
- package/docs/api/processing-focus-stacking.md +41 -0
- package/docs/api/processing-hdr.md +113 -0
- package/docs/api/processing-panorama.md +82 -0
- package/docs/api/processing-processing-task.md +107 -0
- package/docs/api/processing-tone-mapping.md +142 -0
- package/docs/api/schema-camera.md +6 -4
- package/docs/api/schema-illumination-spectral.md +10 -11
- package/docs/api/schema-illumination-temporal.md +13 -15
- package/docs/api/schema-illumination.md +4 -4
- package/docs/api/schema-scene-radiance-temporal.md +10 -11
- package/docs/api/schema-scene-radiance.md +18 -17
- package/docs/api/schema-scene.md +9 -9
- package/docs/api/schema-validation.md +1 -1
- package/docs/api/sensor-accumulated-charge.md +12 -20
- package/docs/api/sensor-architecture.md +15 -16
- package/docs/api/sensor-camera-saturation-capacity.md +9 -11
- package/docs/api/sensor-capture-color-sampling-binding.md +47 -51
- package/docs/api/sensor-capture-mode-timing.md +9 -9
- package/docs/api/sensor-capture-mode.md +29 -30
- package/docs/api/sensor-color-sampling.md +31 -33
- package/docs/api/sensor-constant-rate-temporal-integration.md +10 -11
- package/docs/api/sensor-dark-current.md +30 -14
- package/docs/api/sensor-environment-photo-signal.md +13 -6
- package/docs/api/sensor-eqe-electron-rate.md +9 -8
- package/docs/api/sensor-eqe-local-exposure.md +18 -17
- package/docs/api/sensor-eqe-temporal-exposure.md +12 -11
- package/docs/api/sensor-exposure-window.md +24 -24
- package/docs/api/sensor-fixed-pattern-noise.md +104 -0
- package/docs/api/sensor-iso-gain.md +63 -0
- package/docs/api/sensor-iso-signal-chain.md +13 -22
- package/docs/api/sensor-local-exposure-binding.md +12 -13
- package/docs/api/sensor-optical-stack.md +37 -40
- package/docs/api/sensor-photon-energy.md +10 -11
- package/docs/api/sensor-physical-charge-capacity.md +8 -13
- package/docs/api/sensor-pixel-pitch.md +1 -1
- package/docs/api/sensor-radiometry-readiness.md +9 -9
- package/docs/api/sensor-raw-readout.md +118 -52
- package/docs/api/sensor-raw-reconstruction.md +97 -20
- package/docs/api/sensor-readout-exposure-linkage.md +120 -24
- package/docs/api/sensor-readout-timing.md +33 -35
- package/docs/api/sensor-response-application-compatibility.md +9 -11
- package/docs/api/sensor-response-operating-range.md +14 -18
- package/docs/api/sensor-responsivity-photocurrent.md +9 -12
- package/docs/api/sensor-sampling-aperture.md +22 -25
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +9 -8
- package/docs/api/sensor-sensor-geometry.md +23 -24
- package/docs/api/sensor-signal-noise.md +10 -10
- package/docs/api/sensor-spatial-sample-reduction.md +27 -30
- package/docs/api/sensor-spatial-sampling-quadrature.md +37 -39
- package/docs/api/sensor-spatio-spectral-reduction.md +27 -29
- package/docs/api/sensor-spectral-coverage.md +5 -5
- package/docs/api/sensor-spectral-quadrature.md +33 -35
- package/docs/api/sensor-spectral-response.md +28 -16
- package/docs/api/sensor-temporal-photo-signal.md +6 -6
- package/docs/api/simulation-poc-simulation.md +17 -16
- package/docs/api/stabilization-camera-shake.md +29 -10
- package/docs/api/stabilization-system.md +25 -21
- package/docs/examples/production-request.json +3821 -2157
- package/docs/examples/simulate-capture.mjs +14 -0
- package/llms.txt +35 -0
- package/package.json +32 -12
- package/AGENTS.md +0 -674
- package/CONTRIBUTING.md +0 -76
- package/DCO +0 -33
- package/dist/camera/equivalent-focal-length.d.ts.map +0 -1
- package/dist/camera/field-of-view.d.ts.map +0 -1
- package/dist/camera/projected-object-size.d.ts.map +0 -1
- package/dist/capture/capture-export-metadata.d.ts.map +0 -1
- package/dist/capture/environment-raw-producer.d.ts.map +0 -1
- package/dist/capture/export-jpeg.d.ts.map +0 -1
- package/dist/capture/export-tiff.d.ts.map +0 -1
- package/dist/capture/focus-control.d.ts.map +0 -1
- package/dist/capture/linear-encoding.d.ts.map +0 -1
- package/dist/capture/native-environment-raw.d.ts.map +0 -1
- package/dist/capture/native-raw-development.d.ts.map +0 -1
- package/dist/capture/native-raw.d.ts.map +0 -1
- package/dist/capture/photographic-export.d.ts.map +0 -1
- package/dist/capture/raw-frame-limits.d.ts.map +0 -1
- package/dist/capture/raw-frame-reconstruction.d.ts.map +0 -1
- package/dist/capture/release-sequence.d.ts.map +0 -1
- package/dist/capture/sensor-raw-frame.d.ts.map +0 -1
- package/dist/capture/sensor-raw-producer.d.ts.map +0 -1
- package/dist/capture/simulated-capture.d.ts.map +0 -1
- package/dist/color/capture-color.d.ts.map +0 -1
- package/dist/color/sensor-color-development.d.ts.map +0 -1
- package/dist/color/srgb-icc.d.ts.map +0 -1
- package/dist/color/srgb-transfer.d.ts.map +0 -1
- package/dist/color/white-balance.d.ts.map +0 -1
- package/dist/composition/image-formation-plan.d.ts.map +0 -1
- package/dist/composition/plan-consumer.d.ts.map +0 -1
- package/dist/core/calculation-result.d.ts.map +0 -1
- package/dist/core/canonical-json.d.ts.map +0 -1
- package/dist/core/configuration-error.d.ts.map +0 -1
- package/dist/core/evidence-provenance.d.ts.map +0 -1
- package/dist/core/image-formation.d.ts.map +0 -1
- package/dist/core/owned-data.d.ts.map +0 -1
- package/dist/core/record-validation.d.ts.map +0 -1
- package/dist/core/scientific-assurance.d.ts.map +0 -1
- package/dist/core/spectral-composition.d.ts.map +0 -1
- package/dist/core/spectral.d.ts.map +0 -1
- package/dist/core/validation.d.ts.map +0 -1
- package/dist/core/version.d.ts.map +0 -1
- package/dist/equipment/exposure-capabilities.d.ts.map +0 -1
- package/dist/equipment/generic-tier-assets.d.ts.map +0 -1
- package/dist/equipment/generic-tier-presets.d.ts.map +0 -1
- package/dist/equipment/iso-capabilities.d.ts.map +0 -1
- package/dist/equipment/metering-capabilities.d.ts.map +0 -1
- package/dist/equipment/release-capabilities.d.ts.map +0 -1
- package/dist/exposure/exposure-duration-control.d.ts.map +0 -1
- package/dist/exposure/exposure-mode-resolver.d.ts.map +0 -1
- package/dist/exposure/exposure.d.ts.map +0 -1
- package/dist/exposure/flash.d.ts.map +0 -1
- package/dist/exposure/metering-scene-radiance.d.ts.map +0 -1
- package/dist/exposure/metering-target.d.ts.map +0 -1
- package/dist/exposure/metering-temporal.d.ts.map +0 -1
- package/dist/exposure/metering.d.ts.map +0 -1
- package/dist/exposure/program-line.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/motion/camera-rotation.d.ts.map +0 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +0 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/capture-rotation-trajectory.d.ts.map +0 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +0 -1
- package/dist/motion/extended-object-projection.d.ts.map +0 -1
- package/dist/motion/projected-motion.d.ts.map +0 -1
- package/dist/optics/aperture.d.ts.map +0 -1
- package/dist/optics/circle-of-confusion.d.ts.map +0 -1
- package/dist/optics/complex-pupil-psf.d.ts.map +0 -1
- package/dist/optics/depth-of-field.d.ts.map +0 -1
- package/dist/optics/diffraction.d.ts.map +0 -1
- package/dist/optics/focus-breathing.d.ts.map +0 -1
- package/dist/optics/focus-state.d.ts.map +0 -1
- package/dist/optics/front-of-lens-filter.d.ts.map +0 -1
- package/dist/optics/illumination-vignetting.d.ts.map +0 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +0 -1
- package/dist/optics/lens-psf-profile.d.ts.map +0 -1
- package/dist/optics/polygon-diffraction.d.ts.map +0 -1
- package/dist/optics/profile-contract.d.ts.map +0 -1
- package/dist/optics/psf-foundation.d.ts.map +0 -1
- package/dist/optics/radial-distortion.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +0 -1
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-aperture-rays.d.ts.map +0 -1
- package/dist/optics/sensor-environment-query.d.ts.map +0 -1
- package/dist/optics/sensor-psf-quadrature.d.ts.map +0 -1
- package/dist/optics/sensor-psf-support.d.ts.map +0 -1
- package/dist/optics/stray-light.d.ts.map +0 -1
- package/dist/optics/thin-lens.d.ts.map +0 -1
- package/dist/output/capture-corrected-sdr.d.ts.map +0 -1
- package/dist/output/capture-geometry.d.ts.map +0 -1
- package/dist/output/capture-sdr.d.ts.map +0 -1
- package/dist/output/crop.d.ts.map +0 -1
- package/dist/output/geometric-transforms.d.ts.map +0 -1
- package/dist/output/lens-corrections.d.ts.map +0 -1
- package/dist/output/native-capture-sdr.d.ts.map +0 -1
- package/dist/output/print-contrast-reference.d.ts.map +0 -1
- package/dist/output/print-detail.d.ts.map +0 -1
- package/dist/output/print-jpeg.d.ts.map +0 -1
- package/dist/output/print-plan.d.ts.map +0 -1
- package/dist/output/print-region-statistics.d.ts.map +0 -1
- package/dist/output/sdr-rendering.d.ts.map +0 -1
- package/dist/output/subject-framing-crop.d.ts.map +0 -1
- package/dist/schema/camera.d.ts.map +0 -1
- package/dist/schema/camera.js +0 -3
- package/dist/schema/camera.js.map +0 -1
- package/dist/schema/illumination-spectral.d.ts.map +0 -1
- package/dist/schema/illumination-temporal.d.ts.map +0 -1
- package/dist/schema/illumination.d.ts.map +0 -1
- package/dist/schema/scene-radiance-temporal.d.ts.map +0 -1
- package/dist/schema/scene-radiance.d.ts.map +0 -1
- package/dist/schema/scene.d.ts.map +0 -1
- package/dist/schema/scene.js +0 -3
- package/dist/schema/scene.js.map +0 -1
- package/dist/schema/validation.d.ts.map +0 -1
- package/dist/sensor/accumulated-charge.d.ts.map +0 -1
- package/dist/sensor/architecture.d.ts.map +0 -1
- package/dist/sensor/camera-saturation-capacity.d.ts.map +0 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +0 -1
- package/dist/sensor/capture-mode-timing.d.ts.map +0 -1
- package/dist/sensor/capture-mode.d.ts.map +0 -1
- package/dist/sensor/color-sampling.d.ts.map +0 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +0 -1
- package/dist/sensor/dark-current.d.ts.map +0 -1
- package/dist/sensor/environment-photo-signal.d.ts.map +0 -1
- package/dist/sensor/eqe-electron-rate.d.ts.map +0 -1
- package/dist/sensor/eqe-local-exposure.d.ts.map +0 -1
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/exposure-window.d.ts.map +0 -1
- package/dist/sensor/iso-signal-chain.d.ts.map +0 -1
- package/dist/sensor/local-exposure-binding.d.ts.map +0 -1
- package/dist/sensor/optical-stack.d.ts.map +0 -1
- package/dist/sensor/photon-energy.d.ts.map +0 -1
- package/dist/sensor/physical-charge-capacity.d.ts.map +0 -1
- package/dist/sensor/pixel-pitch.d.ts.map +0 -1
- package/dist/sensor/radiometry-readiness.d.ts.map +0 -1
- package/dist/sensor/raw-readout.d.ts.map +0 -1
- package/dist/sensor/raw-reconstruction.d.ts.map +0 -1
- package/dist/sensor/readout-exposure-linkage.d.ts.map +0 -1
- package/dist/sensor/readout-timing.d.ts.map +0 -1
- package/dist/sensor/response-application-compatibility.d.ts.map +0 -1
- package/dist/sensor/response-operating-range.d.ts.map +0 -1
- package/dist/sensor/responsivity-photocurrent.d.ts.map +0 -1
- package/dist/sensor/sampling-aperture.d.ts.map +0 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +0 -1
- package/dist/sensor/sensor-geometry.d.ts.map +0 -1
- package/dist/sensor/signal-noise.d.ts.map +0 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +0 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +0 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +0 -1
- package/dist/sensor/spectral-coverage.d.ts.map +0 -1
- package/dist/sensor/spectral-quadrature.d.ts.map +0 -1
- package/dist/sensor/spectral-response.d.ts.map +0 -1
- package/dist/sensor/temporal-eqe-sum.d.ts.map +0 -1
- package/dist/sensor/temporal-photo-signal.d.ts.map +0 -1
- package/dist/sensor/temporal-sample-binding.d.ts.map +0 -1
- package/dist/simulation/poc-simulation.d.ts.map +0 -1
- package/dist/stabilization/camera-shake.d.ts.map +0 -1
- package/dist/stabilization/system.d.ts.map +0 -1
- package/docs/API_STYLE.md +0 -235
- package/docs/ARCHITECTURE.md +0 -356
- package/docs/AUTOMATION_COORDINATION.md +0 -190
- package/docs/CAPTURE_COLOR.md +0 -25
- package/docs/CAPTURE_CORRECTED_SDR.md +0 -25
- package/docs/CAPTURE_EXPORT_METADATA.md +0 -27
- package/docs/CAPTURE_SDR.md +0 -22
- package/docs/DEVELOPERS.md +0 -68
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +0 -69
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +0 -208
- package/docs/EXPORT_ACCEPTANCE.md +0 -133
- package/docs/GENERIC_TIER_PRESETS.md +0 -269
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +0 -141
- package/docs/IMAGE_FORMATION.md +0 -247
- package/docs/LINEAR_CAPTURE_ENCODING.md +0 -25
- package/docs/MOTION_AND_SIGNAL.md +0 -250
- package/docs/NATIVE_CAPTURE_SDR.md +0 -70
- package/docs/NATIVE_CAPTURE_SDR_REVIEW.md +0 -37
- package/docs/NATIVE_CAPTURE_SDR_VALIDATION.md +0 -34
- package/docs/NATIVE_RAW_AND_PRINT.md +0 -47
- package/docs/NUMERICAL_CORRECTNESS.md +0 -191
- package/docs/PERFORMANCE_BASELINE.md +0 -56
- package/docs/PHOTOGRAPHIC_EXPORT.md +0 -206
- package/docs/PHYSICS_FOUNDATION.md +0 -426
- package/docs/POC_API.md +0 -278
- package/docs/POC_PROJECTION_PLATFORM_REFERENCE.md +0 -12
- package/docs/POC_PROJECTION_REUSE.md +0 -124
- package/docs/PRINT_195_196_REVIEW.md +0 -93
- package/docs/PRINT_196_ENGINE_ACCEPTANCE.md +0 -45
- package/docs/PRINT_CONTRAST_REFERENCE.md +0 -43
- package/docs/PRINT_DETAIL_ASSESSMENT.md +0 -81
- package/docs/PRINT_DETAIL_JPEG_EVIDENCE.md +0 -36
- package/docs/PRINT_DETAIL_SDR_EVIDENCE.md +0 -29
- package/docs/PRINT_DETAIL_VALIDATION.md +0 -36
- package/docs/PRINT_PLANNING.md +0 -75
- package/docs/PRINT_REGION_STATISTICS.md +0 -38
- package/docs/PROCESSED_OUTPUT.md +0 -157
- package/docs/PRODUCTION_COMPOSITION.md +0 -373
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +0 -131
- package/docs/PROVENANCE.md +0 -115
- package/docs/PSF_FOUNDATION.md +0 -165
- package/docs/RAW_FRAME_ENVELOPE.md +0 -56
- package/docs/RAW_FRAME_RECONSTRUCTION.md +0 -30
- package/docs/RELEASE_1_0.md +0 -66
- package/docs/RELEASE_1_0_1.md +0 -61
- package/docs/RELEASE_1_1_0.md +0 -25
- package/docs/RELEASE_1_2_0.md +0 -51
- package/docs/RELEASE_1_3_0.md +0 -15
- package/docs/RELEASE_1_4_0.md +0 -23
- package/docs/RELEASE_AUDIT.md +0 -39
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +0 -298
- package/docs/SCENE_SENSOR_QUADRATURE.md +0 -98
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +0 -86
- package/docs/SCIENTIFIC_ASSURANCE.md +0 -280
- package/docs/SCIENTIFIC_CONFORMANCE.md +0 -83
- package/docs/SDR_RENDERING.md +0 -33
- package/docs/SENSOR_APERTURE_RAYS.md +0 -23
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +0 -86
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +0 -104
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +0 -74
- package/docs/SENSOR_PSF_QUADRATURE.md +0 -90
- package/docs/SENSOR_RAW_FRAME.md +0 -20
- package/docs/SENSOR_RAW_PRODUCER.md +0 -77
- package/docs/SIGNAL_CONFORMANCE.md +0 -23
- package/docs/SIMULATED_CAPTURE.md +0 -65
- package/docs/STABILIZATION.md +0 -234
- package/docs/TEMPORAL_PHOTO_RAW.md +0 -83
- package/docs/TIER_ACCEPTANCE.md +0 -129
- package/docs/TIER_PRESET_ACCEPTANCE.md +0 -59
- package/docs/V1_COMPOSITION_MAP.md +0 -123
- package/docs/V1_HELPER_REUSE_REVIEW.md +0 -60
- package/docs/V1_PERFORMANCE_DISPOSITION.md +0 -88
- package/docs/benchmarks/2026-10-01-main-baseline.json +0 -694
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +0 -2190
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +0 -2423
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +0 -210
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +0 -187
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +0 -756
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +0 -711
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +0 -885
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +0 -868
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +0 -868
- package/docs/licenses/castleCSF-MIT.txt +0 -21
- package/docs/validation/documentation-fragments.json +0 -212
- package/docs/validation/native-capture-sdr-darwin-arm64-node26-review.jsonl +0 -4
- package/docs/validation/native-capture-sdr-darwin-arm64.jsonl +0 -3
- package/docs/validation/native-raw-print-2026-10-04/fractional-asymmetric-crop.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/gray-ramp.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/linear-area-checker.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/manifest.json +0 -218
- package/docs/validation/native-raw-print-2026-10-04/megapixel-native.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/native-color.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel-validation.json +0 -9
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json +0 -29
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.codes.u16le.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.jpg +0 -0
- package/docs/validation/native-raw-print-2026-10-04/photivra-native-full-megapixel.json.rgb.gz +0 -0
- package/docs/validation/native-raw-print-2026-10-04/srgb.icc +0 -0
- package/docs/validation/native-raw-print-2026-10-04/validation.json +0 -41
- package/docs/validation/print-196-candidate-capabilities.json +0 -28
- package/docs/validation/print-196-candidate-evidence.json +0 -356
- package/docs/validation/print-196-engine-acceptance.json +0 -81
- package/docs/validation/print-detail-capabilities.json +0 -103
- package/docs/validation/print-detail-jpeg-evidence.json +0 -116
- package/docs/validation/print-detail-sdr-evidence.json +0 -81
- package/docs/validation/release-audit-inventory.json +0 -1306
- package/docs/validation/tier-acceptance-report-v1.json +0 -2538
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fixed-pattern-noise.js","sourceRoot":"","sources":["../../src/sensor/fixed-pattern-noise.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Fixed-pattern noise (FPN): the part of sensor noise that stays the same from shot to shot for one\n * physical sensor. It covers photo-response non-uniformity (PRNU), dark-signal non-uniformity (DSNU),\n * hot pixels and row and column readout offsets, as defined in EMVA Standard 1288 Release 4.0 (spatial\n * non-uniformity of the photo response and of the dark signal).\n *\n * The pattern is deterministic. It is seeded from an explicit sensor-instance seed and absolute\n * colour-sampling site coordinates, never from the per-capture noise seed, so the same sensor shows\n * the same pattern in every capture.\n *\n * Application points in the readout chain (see raw-readout.ts):\n * - PRNU multiplies the expected photo charge before photo shot-noise sampling;\n * - DSNU and hot pixels multiply the population-mean dark-current expectation before dark shot-noise\n * sampling, so their excess charge scales with exposure duration and with the declared\n * temperature model of the dark-current profile;\n * - row and column offsets are input-referred electron offsets added with read noise, before the\n * pre-ADC threshold.\n *\n * The dark-current model itself stays a population mean; this module is a separate spatial model that\n * must be attached explicitly. Values are declared by the caller (or are synthetic preset values).\n * Nothing here is a measured calibration.\n * @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support\n * limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { parseEvidenceList, type EvidenceBackedFact, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId, requireInputKeys } from \"../core/record-validation.js\";\nimport { InvalidScientificInputError } from \"../core/validation.js\";\nimport {\n createDeterministicUniformStream,\n deriveSensorFixedPatternSeedUint32,\n sampleDeterministicStandardNormal,\n SENSOR_FIXED_PATTERN_COLUMN_STREAM_ID,\n SENSOR_FIXED_PATTERN_DSNU_STREAM_ID,\n SENSOR_FIXED_PATTERN_HOT_PIXEL_STREAM_ID,\n SENSOR_FIXED_PATTERN_PRNU_STREAM_ID,\n SENSOR_FIXED_PATTERN_ROW_STREAM_ID\n} from \"./stochastic-seed.js\";\n\nexport const SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION = \"0.1.0\" as const;\n/** Versioned identity of the pattern-generation equations and seed schedule. */\nexport const SENSOR_FIXED_PATTERN_NOISE_MODEL = Object.freeze({ id: \"photivra-sensor-fixed-pattern\", version: \"1.0.0\" } as const);\n\n/**\n * Explicit fixed-pattern parameters for one sensor instance. Every component is required; a zero\n * standard deviation, fraction or RMS disables that component.\n */\nexport interface SensorFixedPatternNoiseProfile {\n schemaVersion: typeof SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION;\n profileId: string;\n /** The colour-sampling grid whose absolute site coordinates index the pattern. */\n colorSamplingProfileId: string;\n scientificStatus: \"approximation\";\n /** Identifies the physical sensor. Independent of every per-capture noise seed. */\n sensorInstanceSeedUint32: number;\n /** EMVA 1288 PRNU: spatial standard deviation of the photo response divided by its mean. */\n photoResponseNonUniformity: { relativeStandardDeviation: EvidenceBackedFact<number> };\n /** Spatial standard deviation of the dark-current rate divided by the population-mean rate. */\n darkSignalNonUniformity: { relativeStandardDeviation: EvidenceBackedFact<number> };\n /** Fraction of sites whose dark-current rate is the population mean times the multiplier. */\n hotPixels: { siteFraction: EvidenceBackedFact<number>; darkCurrentMultiplier: EvidenceBackedFact<number> };\n /** Fixed readout offset per row, in input-referred electrons, normally distributed with zero mean. */\n rowOffset: { rmsElectrons: EvidenceBackedFact<number> };\n /** Fixed readout offset per column, in input-referred electrons, normally distributed with zero mean. */\n columnOffset: { rmsElectrons: EvidenceBackedFact<number> };\n patternDistribution: \"normal-factors-truncated-at-zero\";\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n}\n\n/** The deterministic pattern values of one colour-sampling site. */\nexport interface SensorFixedPatternSiteValues {\n profileId: string;\n modelId: typeof SENSOR_FIXED_PATTERN_NOISE_MODEL.id;\n modelVersion: typeof SENSOR_FIXED_PATTERN_NOISE_MODEL.version;\n site: { x: number; y: number };\n /** Multiplies the expected photo charge (1 = no PRNU); never negative. */\n photoResponseGainFactor: number;\n /** Multiplies the population-mean dark expectation (1 = no DSNU); never negative. */\n darkCurrentFactor: number;\n hotPixel: boolean;\n rowOffsetElectrons: number;\n columnOffsetElectrons: number;\n /** rowOffsetElectrons + columnOffsetElectrons, added at readout. */\n readoutOffsetElectrons: number;\n}\n\nconst FACT_KEYS = [\"value\", \"evidence\"];\n\nfunction fact(value: unknown, path: string, maximum: number, minimum = 0): EvidenceBackedFact<number> {\n const record = requireAllowlistedRecord(value, FACT_KEYS, path + \" must be an evidence-backed fact.\");\n const v = record.value;\n if (typeof v !== \"number\" || !Number.isFinite(v) || v < minimum || v > maximum) {\n throw new InvalidConfigurationError(path + \".value must be finite from \" + minimum + \" through \" + maximum + \".\");\n }\n return { value: v, evidence: parseEvidenceList(record.evidence, path + \".evidence\") };\n}\n\nfunction limitations(value: unknown): readonly string[] {\n if (!Array.isArray(value) || value.some((entry) => typeof entry !== \"string\" || entry.trim().length === 0)) {\n throw new InvalidConfigurationError(\"sensorFixedPatternNoise.limitations must be an array of non-empty strings.\");\n }\n if (new Set(value).size !== value.length) {\n throw new InvalidConfigurationError(\"sensorFixedPatternNoise.limitations must not contain duplicates.\");\n }\n return value.map((entry: string) => entry.trim());\n}\n\n/**\n * Validates an untrusted fixed-pattern noise profile. Unknown keys, out-of-range parameters and\n * missing evidence are rejected. The PRNU and DSNU relative standard deviations are limited to 0.5\n * and 5, and the hot-pixel multiplier to 1–1e6.\n * @param value - Untrusted data. TypeScript types alone are not validation.\n * @returns The validated profile.\n * @see docs/MOTION_AND_SIGNAL.md for the model and its sources.\n */\nexport function parseSensorFixedPatternNoiseProfile(value: unknown): SensorFixedPatternNoiseProfile {\n const r = requireAllowlistedRecord(value, [\"schemaVersion\", \"profileId\", \"colorSamplingProfileId\", \"scientificStatus\",\n \"sensorInstanceSeedUint32\", \"photoResponseNonUniformity\", \"darkSignalNonUniformity\", \"hotPixels\", \"rowOffset\", \"columnOffset\",\n \"patternDistribution\", \"evidence\", \"limitations\"], \"Invalid sensor fixed-pattern noise profile fields.\");\n if (r.schemaVersion !== SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION) {\n throw new InvalidConfigurationError('sensorFixedPatternNoise.schemaVersion must be \"' + SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION + '\".');\n }\n if (r.scientificStatus !== \"approximation\") {\n throw new InvalidConfigurationError('sensorFixedPatternNoise.scientificStatus must be \"approximation\".');\n }\n if (r.patternDistribution !== \"normal-factors-truncated-at-zero\") {\n throw new InvalidConfigurationError('sensorFixedPatternNoise.patternDistribution must be \"normal-factors-truncated-at-zero\".');\n }\n const seed = r.sensorInstanceSeedUint32;\n if (typeof seed !== \"number\" || !Number.isSafeInteger(seed) || seed < 0 || seed > 0xffff_ffff) {\n throw new InvalidConfigurationError(\"sensorFixedPatternNoise.sensorInstanceSeedUint32 must be an unsigned 32-bit integer.\");\n }\n const prnu = requireAllowlistedRecord(r.photoResponseNonUniformity, [\"relativeStandardDeviation\"], \"Invalid PRNU fields.\");\n const dsnu = requireAllowlistedRecord(r.darkSignalNonUniformity, [\"relativeStandardDeviation\"], \"Invalid DSNU fields.\");\n const hot = requireAllowlistedRecord(r.hotPixels, [\"siteFraction\", \"darkCurrentMultiplier\"], \"Invalid hot-pixel fields.\");\n const row = requireAllowlistedRecord(r.rowOffset, [\"rmsElectrons\"], \"Invalid row-offset fields.\");\n const column = requireAllowlistedRecord(r.columnOffset, [\"rmsElectrons\"], \"Invalid column-offset fields.\");\n return {\n schemaVersion: SENSOR_FIXED_PATTERN_NOISE_PROFILE_SCHEMA_VERSION,\n profileId: requirePublicOpaqueId(r.profileId, \"sensorFixedPatternNoise.profileId must be a public opaque identifier.\"),\n colorSamplingProfileId: requirePublicOpaqueId(r.colorSamplingProfileId, \"sensorFixedPatternNoise.colorSamplingProfileId must be a public opaque identifier.\"),\n scientificStatus: \"approximation\",\n sensorInstanceSeedUint32: seed,\n photoResponseNonUniformity: { relativeStandardDeviation: fact(prnu.relativeStandardDeviation, \"photoResponseNonUniformity.relativeStandardDeviation\", 0.5) },\n darkSignalNonUniformity: { relativeStandardDeviation: fact(dsnu.relativeStandardDeviation, \"darkSignalNonUniformity.relativeStandardDeviation\", 5) },\n hotPixels: { siteFraction: fact(hot.siteFraction, \"hotPixels.siteFraction\", 1),\n darkCurrentMultiplier: fact(hot.darkCurrentMultiplier, \"hotPixels.darkCurrentMultiplier\", 1e6, 1) },\n rowOffset: { rmsElectrons: fact(row.rmsElectrons, \"rowOffset.rmsElectrons\", 1e6) },\n columnOffset: { rmsElectrons: fact(column.rmsElectrons, \"columnOffset.rmsElectrons\", 1e6) },\n patternDistribution: \"normal-factors-truncated-at-zero\",\n evidence: parseEvidenceList(r.evidence, \"sensorFixedPatternNoise.evidence\"),\n limitations: limitations(r.limitations)\n };\n}\n\nfunction normal(seed: number, x: number, y: number, stream: number): number {\n return sampleDeterministicStandardNormal(createDeterministicUniformStream(deriveSensorFixedPatternSeedUint32(seed, x, y, stream)));\n}\n\n/**\n * Computes the fixed-pattern values of one absolute colour-sampling site.\n *\n * - PRNU gain g = max(0, 1 + σ_PRNU·z₁);\n * - hot pixel when u < f_hot, then dark factor d = m_hot; otherwise d = max(0, 1 + σ_DSNU·z₂);\n * - row offset σ_row·z(row y), column offset σ_col·z(column x), in input-referred electrons.\n *\n * Each z is a standard normal value and u a uniform value, each from its own stream hashed with\n * MurmurHash3 from (sensorInstanceSeed, x, y, stream). Row values use x = 0 and column values y = 0,\n * so a whole row or column shares one value. Cutting negative factors off at zero shifts the mean\n * factor by less than 1e-6 for σ ≤ 0.2.\n * @param input - A parsed or untrusted profile plus a nonnegative integer site.\n * @returns The site's fixed-pattern values.\n */\nexport function calculateSensorFixedPatternSite(input: {\n profile: SensorFixedPatternNoiseProfile; site: { x: number; y: number };\n}): SensorFixedPatternSiteValues {\n requireInputKeys(input, \"calculateSensorFixedPatternSite\", [\"profile\", \"site\"]);\n const profile = parseSensorFixedPatternNoiseProfile(input.profile);\n return evaluateParsedFixedPatternSite(profile, input.site);\n}\n\n/** Internal: the PRNU gain, dark-current factor and hot-pixel state of one site (no readout offsets). */\nexport function evaluateFixedPatternSiteFactors(profile: SensorFixedPatternNoiseProfile, x: number, y: number):\n { photoResponseGainFactor: number; darkCurrentFactor: number; hotPixel: boolean } {\n const seed = profile.sensorInstanceSeedUint32;\n const prnuSd = profile.photoResponseNonUniformity.relativeStandardDeviation.value;\n const dsnuSd = profile.darkSignalNonUniformity.relativeStandardDeviation.value;\n const hotFraction = profile.hotPixels.siteFraction.value;\n const photoResponseGainFactor = prnuSd === 0 ? 1 : Math.max(0, 1 + prnuSd * normal(seed, x, y, SENSOR_FIXED_PATTERN_PRNU_STREAM_ID));\n const hotPixel = hotFraction > 0 &&\n createDeterministicUniformStream(deriveSensorFixedPatternSeedUint32(seed, x, y, SENSOR_FIXED_PATTERN_HOT_PIXEL_STREAM_ID)).next() < hotFraction;\n const darkCurrentFactor = hotPixel ? profile.hotPixels.darkCurrentMultiplier.value :\n dsnuSd === 0 ? 1 : Math.max(0, 1 + dsnuSd * normal(seed, x, y, SENSOR_FIXED_PATTERN_DSNU_STREAM_ID));\n return { photoResponseGainFactor, darkCurrentFactor, hotPixel };\n}\n\n/** Internal: the fixed readout offset of row `y`, in input-referred electrons. */\nexport function evaluateFixedPatternRowOffset(profile: SensorFixedPatternNoiseProfile, y: number): number {\n const rms = profile.rowOffset.rmsElectrons.value;\n return rms === 0 ? 0 : rms * normal(profile.sensorInstanceSeedUint32, 0, y, SENSOR_FIXED_PATTERN_ROW_STREAM_ID);\n}\n\n/** Internal: the fixed readout offset of column `x`, in input-referred electrons. */\nexport function evaluateFixedPatternColumnOffset(profile: SensorFixedPatternNoiseProfile, x: number): number {\n const rms = profile.columnOffset.rmsElectrons.value;\n return rms === 0 ? 0 : rms * normal(profile.sensorInstanceSeedUint32, x, 0, SENSOR_FIXED_PATTERN_COLUMN_STREAM_ID);\n}\n\n/** Internal: the same calculation for an already parsed profile. */\nexport function evaluateParsedFixedPatternSite(profile: SensorFixedPatternNoiseProfile,\n site: { x: number; y: number }): SensorFixedPatternSiteValues {\n const { x, y } = site ?? {};\n if (!Number.isSafeInteger(x) || !Number.isSafeInteger(y) || x < 0 || y < 0 || x > 0xffff_ffff || y > 0xffff_ffff) {\n throw new InvalidScientificInputError(\"Fixed-pattern site coordinates must be nonnegative uint32 integers.\");\n }\n const { photoResponseGainFactor, darkCurrentFactor, hotPixel } = evaluateFixedPatternSiteFactors(profile, x, y);\n const rowOffsetElectrons = evaluateFixedPatternRowOffset(profile, y);\n const columnOffsetElectrons = evaluateFixedPatternColumnOffset(profile, x);\n return {\n profileId: profile.profileId,\n modelId: SENSOR_FIXED_PATTERN_NOISE_MODEL.id,\n modelVersion: SENSOR_FIXED_PATTERN_NOISE_MODEL.version,\n site: { x, y },\n photoResponseGainFactor,\n darkCurrentFactor,\n hotPixel,\n rowOffsetElectrons,\n columnOffsetElectrons,\n readoutOffsetElectrons: rowOffsetElectrons + columnOffsetElectrons\n };\n}\n"]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type EvidenceBackedFact, type EvidenceProvenance } from "../core/evidence-provenance.js";
|
|
2
|
+
import { type SensorReadoutConversionRegime, type SensorReadoutExposureIndexGain } from "./raw-readout.js";
|
|
3
|
+
import type { GenericIsoStandardRegimeBand } from "./iso-signal-chain.js";
|
|
4
|
+
import type { SensorSpectralResponseScientificStatus } from "./spectral-response.js";
|
|
5
|
+
/** One conversion-gain mode, active from its minimum exposure index up to the next mode's. */
|
|
6
|
+
export interface IsoGainConversionGainMode {
|
|
7
|
+
mode: SensorReadoutExposureIndexGain["conversionGainMode"];
|
|
8
|
+
minimumExposureIndex: number;
|
|
9
|
+
readNoiseRmsElectrons: EvidenceBackedFact<number>;
|
|
10
|
+
/** Optional charge storage limit of this mode. Every regime's pre-ADC threshold must be at or below it. */
|
|
11
|
+
maximumChargeElectrons?: EvidenceBackedFact<number>;
|
|
12
|
+
}
|
|
13
|
+
export interface CreateIsoGainReadoutRegimesInput {
|
|
14
|
+
regimeIdPrefix: string;
|
|
15
|
+
scientificStatus: SensorSpectralResponseScientificStatus;
|
|
16
|
+
baseExposureIndex: number;
|
|
17
|
+
/** Strictly increasing settings, each at least the base exposure index. */
|
|
18
|
+
exposureIndices: readonly number[];
|
|
19
|
+
/** Q0: electron-equivalent signal that reaches digital saturation at the base exposure index. */
|
|
20
|
+
baseSaturationElectronEquivalent: EvidenceBackedFact<number>;
|
|
21
|
+
/** A_max: largest analog gain relative to the base regime (>= 1). */
|
|
22
|
+
maximumAnalogGain: EvidenceBackedFact<number>;
|
|
23
|
+
adc: {
|
|
24
|
+
bitDepth: number;
|
|
25
|
+
blackLevelCode: number;
|
|
26
|
+
digitalSaturationCode: number;
|
|
27
|
+
};
|
|
28
|
+
conversionGainModes: readonly IsoGainConversionGainMode[];
|
|
29
|
+
evidence: readonly EvidenceProvenance[];
|
|
30
|
+
limitations: readonly string[];
|
|
31
|
+
}
|
|
32
|
+
export interface IsoGainReadoutRegimes {
|
|
33
|
+
regimes: readonly SensorReadoutConversionRegime[];
|
|
34
|
+
/** One single-value band per setting, ready for a GenericIsoSignalChainProfile. */
|
|
35
|
+
standardRegimeBands: readonly GenericIsoStandardRegimeBand[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Builds a readout regime and signal-chain band for each exposure index (see the module comment
|
|
39
|
+
* for the equations). The result is checked with the same rules as parseSensorReadoutConversionProfile.
|
|
40
|
+
* Each regime carries an `exposureIndexGain` record of how it was derived.
|
|
41
|
+
* @param input - The sensor parameters and ISO settings; untrusted values are validated.
|
|
42
|
+
* @returns The readout regimes and bands.
|
|
43
|
+
*/
|
|
44
|
+
export declare function createIsoGainReadoutRegimes(input: CreateIsoGainReadoutRegimesInput): IsoGainReadoutRegimes;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* ISO gain: builds one explicit readout regime for each ISO (exposure index) setting from declared
|
|
4
|
+
* sensor parameters, so that raising ISO brightens the RAW the way a camera's programmable gain does.
|
|
5
|
+
*
|
|
6
|
+
* Model (exposure index S = 10 / H of CIPA DC-004-2020, free at https://www.cipa.jp/e/std/std-sec.html,
|
|
7
|
+
* also specified in ISO 12232:2019; EMVA Standard 1288 Release 4.0 linear camera model,
|
|
8
|
+
* where the system gain K in DN/e- multiplies the electron signal):
|
|
9
|
+
* R = S / S0 exposure-index ratio to the base exposure index S0
|
|
10
|
+
* a = min(R, A_max) analog (pre-ADC) gain relative to the base regime
|
|
11
|
+
* d = R / a post-ADC digital gain beyond the analog range
|
|
12
|
+
* g(S) = Q0 / (span * a) electrons per code (1/K), span = digitalSaturation - black
|
|
13
|
+
* Q_preADC(S) = Q0 / a electrons that drive the ADC to digital saturation
|
|
14
|
+
* So the electrons needed to reach digital saturation are Q0 * S0 / S.
|
|
15
|
+
*
|
|
16
|
+
* The exposure indices of CIPA DC-004 put the reference exposure H_ref in proportion to 1/S: standard
|
|
17
|
+
* output sensitivity (SOS) and REI (recommended exposure index) both use S = 10 / H (§3.2, §3.3). So a
|
|
18
|
+
* correct exposure for S gives the same black-subtracted fraction of digital saturation at every S.
|
|
19
|
+
*
|
|
20
|
+
* Read noise in electrons is declared per conversion-gain mode, never derived from S. (With dual
|
|
21
|
+
* conversion gain, the high-conversion-gain mode used at high S has lower input-referred read noise.)
|
|
22
|
+
*
|
|
23
|
+
* Inputs are explicit declarations; Photivra presets use synthetic teaching values. No camera
|
|
24
|
+
* calibration is implied.
|
|
25
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, sources and limits.
|
|
26
|
+
*/
|
|
27
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
28
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
29
|
+
import { requireAllowlistedRecord, requirePublicOpaqueId } from "../core/record-validation.js";
|
|
30
|
+
import { parseSensorReadoutConversionProfile } from "./raw-readout.js";
|
|
31
|
+
function positive(value, path) {
|
|
32
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
33
|
+
throw new InvalidConfigurationError(path + " must be finite and greater than zero.");
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
function positiveFact(value, path) {
|
|
38
|
+
const r = requireAllowlistedRecord(value, ["value", "evidence"], path + " must be an evidence-backed fact.");
|
|
39
|
+
return { value: positive(r.value, path + ".value"), evidence: parseEvidenceList(r.evidence, path + ".evidence") };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Builds a readout regime and signal-chain band for each exposure index (see the module comment
|
|
43
|
+
* for the equations). The result is checked with the same rules as parseSensorReadoutConversionProfile.
|
|
44
|
+
* Each regime carries an `exposureIndexGain` record of how it was derived.
|
|
45
|
+
* @param input - The sensor parameters and ISO settings; untrusted values are validated.
|
|
46
|
+
* @returns The readout regimes and bands.
|
|
47
|
+
*/
|
|
48
|
+
export function createIsoGainReadoutRegimes(input) {
|
|
49
|
+
const r = requireAllowlistedRecord(input, ["regimeIdPrefix", "scientificStatus", "baseExposureIndex", "exposureIndices",
|
|
50
|
+
"baseSaturationElectronEquivalent", "maximumAnalogGain", "adc", "conversionGainModes", "evidence", "limitations"], "Invalid ISO gain readout fields.");
|
|
51
|
+
const prefix = r.regimeIdPrefix === "" ? "" : requirePublicOpaqueId(r.regimeIdPrefix, "regimeIdPrefix must be empty or a public opaque identifier.");
|
|
52
|
+
const base = positive(r.baseExposureIndex, "baseExposureIndex");
|
|
53
|
+
const q0 = positiveFact(r.baseSaturationElectronEquivalent, "baseSaturationElectronEquivalent");
|
|
54
|
+
const aMax = positiveFact(r.maximumAnalogGain, "maximumAnalogGain");
|
|
55
|
+
if (aMax.value < 1)
|
|
56
|
+
throw new InvalidConfigurationError("maximumAnalogGain must be at least 1.");
|
|
57
|
+
const evidence = parseEvidenceList(r.evidence, "evidence");
|
|
58
|
+
const adc = requireAllowlistedRecord(r.adc, ["bitDepth", "blackLevelCode", "digitalSaturationCode"], "Invalid ISO gain ADC fields.");
|
|
59
|
+
if (!Array.isArray(r.exposureIndices) || r.exposureIndices.length === 0 || r.exposureIndices.length > 256) {
|
|
60
|
+
throw new InvalidConfigurationError("exposureIndices must contain 1 through 256 settings.");
|
|
61
|
+
}
|
|
62
|
+
const indices = r.exposureIndices.map((value, i) => positive(value, "exposureIndices[" + i + "]"));
|
|
63
|
+
if (indices[0] < base || indices.some((value, i) => i > 0 && value <= indices[i - 1])) {
|
|
64
|
+
throw new InvalidConfigurationError("exposureIndices must strictly increase from at least the base exposure index.");
|
|
65
|
+
}
|
|
66
|
+
if (!Array.isArray(r.conversionGainModes) || r.conversionGainModes.length === 0 || r.conversionGainModes.length > 8) {
|
|
67
|
+
throw new InvalidConfigurationError("conversionGainModes must contain 1 through 8 modes.");
|
|
68
|
+
}
|
|
69
|
+
const modes = r.conversionGainModes.map((value, i) => {
|
|
70
|
+
const m = requireAllowlistedRecord(value, ["mode", "minimumExposureIndex", "readNoiseRmsElectrons", "maximumChargeElectrons"], "Invalid conversion-gain mode fields.");
|
|
71
|
+
if (m.mode !== "single-conversion-gain" && m.mode !== "low-conversion-gain" && m.mode !== "high-conversion-gain") {
|
|
72
|
+
throw new InvalidConfigurationError("conversionGainModes[" + i + "].mode is invalid.");
|
|
73
|
+
}
|
|
74
|
+
const noise = requireAllowlistedRecord(m.readNoiseRmsElectrons, ["value", "evidence"], "Invalid read-noise fact.");
|
|
75
|
+
if (typeof noise.value !== "number" || !Number.isFinite(noise.value) || noise.value < 0) {
|
|
76
|
+
throw new InvalidConfigurationError("conversionGainModes[" + i + "].readNoiseRmsElectrons.value must be finite and nonnegative.");
|
|
77
|
+
}
|
|
78
|
+
return { mode: m.mode,
|
|
79
|
+
minimumExposureIndex: positive(m.minimumExposureIndex, "conversionGainModes[" + i + "].minimumExposureIndex"),
|
|
80
|
+
readNoiseRmsElectrons: { value: noise.value, evidence: parseEvidenceList(noise.evidence, "readNoiseRmsElectrons.evidence") },
|
|
81
|
+
...(m.maximumChargeElectrons === undefined ? {} :
|
|
82
|
+
{ maximumChargeElectrons: positiveFact(m.maximumChargeElectrons, "conversionGainModes[" + i + "].maximumChargeElectrons") }) };
|
|
83
|
+
});
|
|
84
|
+
if (modes[0].minimumExposureIndex !== base || modes.some((m, i) => i > 0 && m.minimumExposureIndex <= modes[i - 1].minimumExposureIndex)) {
|
|
85
|
+
throw new InvalidConfigurationError("conversionGainModes must start at the base exposure index and strictly increase.");
|
|
86
|
+
}
|
|
87
|
+
const gainEvidence = [...q0.evidence, ...aMax.evidence].filter((entry, i, all) => all.findIndex((other) => JSON.stringify(other) === JSON.stringify(entry)) === i);
|
|
88
|
+
const black = adc.blackLevelCode, saturation = adc.digitalSaturationCode;
|
|
89
|
+
const span = saturation - black;
|
|
90
|
+
const regimes = indices.map((exposureIndex) => {
|
|
91
|
+
const ratio = exposureIndex / base;
|
|
92
|
+
const analogGain = Math.min(ratio, aMax.value);
|
|
93
|
+
const digitalGain = ratio / analogGain;
|
|
94
|
+
const mode = modes.filter((m) => m.minimumExposureIndex <= exposureIndex).pop();
|
|
95
|
+
const preAdc = q0.value / analogGain;
|
|
96
|
+
if (mode.maximumChargeElectrons !== undefined && preAdc > mode.maximumChargeElectrons.value) {
|
|
97
|
+
throw new InvalidConfigurationError("A " + mode.mode + " regime would need more charge than its declared storage limit.");
|
|
98
|
+
}
|
|
99
|
+
const regimeEvidence = [...evidence];
|
|
100
|
+
return {
|
|
101
|
+
regimeId: prefix + "iso-" + exposureIndex,
|
|
102
|
+
scientificStatus: r.scientificStatus,
|
|
103
|
+
systemConversionGainElectronsPerCode: { value: preAdc / span, evidence: gainEvidence },
|
|
104
|
+
preAdcSaturationElectronEquivalent: { value: preAdc, evidence: gainEvidence },
|
|
105
|
+
readNoiseComponents: [{ componentId: "electronic", rmsElectrons: mode.readNoiseRmsElectrons, evidence: mode.readNoiseRmsElectrons.evidence }],
|
|
106
|
+
adc: { bitDepth: adc.bitDepth, blackLevelCode: black, digitalSaturationCode: saturation, transfer: "uniform-round-half-up",
|
|
107
|
+
...(digitalGain === 1 ? {} : { digitalGain }) },
|
|
108
|
+
exposureIndexGain: { exposureIndex, baseExposureIndex: base, analogGain, digitalGain, conversionGainMode: mode.mode, evidence: regimeEvidence },
|
|
109
|
+
evidence: regimeEvidence,
|
|
110
|
+
limitations: r.limitations
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
// Reuse the regime parser to check the ADC, limitations and consistency.
|
|
114
|
+
const parsed = parseSensorReadoutConversionProfile({ schemaVersion: "0.1.0", profileId: prefix + "validation", colorSamplingProfileId: "validation",
|
|
115
|
+
channelId: "validation", regimeSelectionOwnedBy: "explicit-upstream-camera-state-not-inferred-from-iso", regimes, evidence }).regimes;
|
|
116
|
+
return { regimes: parsed, standardRegimeBands: indices.map((exposureIndex, i) => ({ minimumExposureIndex: exposureIndex,
|
|
117
|
+
maximumExposureIndex: exposureIndex, readoutRegimeId: parsed[i].regimeId })) };
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=iso-gain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iso-gain.js","sourceRoot":"","sources":["../../src/sensor/iso-gain.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: Apache-2.0\n\n/**\n * ISO gain: builds one explicit readout regime for each ISO (exposure index) setting from declared\n * sensor parameters, so that raising ISO brightens the RAW the way a camera's programmable gain does.\n *\n * Model (exposure index S = 10 / H of CIPA DC-004-2020, free at https://www.cipa.jp/e/std/std-sec.html,\n * also specified in ISO 12232:2019; EMVA Standard 1288 Release 4.0 linear camera model,\n * where the system gain K in DN/e- multiplies the electron signal):\n * R = S / S0 exposure-index ratio to the base exposure index S0\n * a = min(R, A_max) analog (pre-ADC) gain relative to the base regime\n * d = R / a post-ADC digital gain beyond the analog range\n * g(S) = Q0 / (span * a) electrons per code (1/K), span = digitalSaturation - black\n * Q_preADC(S) = Q0 / a electrons that drive the ADC to digital saturation\n * So the electrons needed to reach digital saturation are Q0 * S0 / S.\n *\n * The exposure indices of CIPA DC-004 put the reference exposure H_ref in proportion to 1/S: standard\n * output sensitivity (SOS) and REI (recommended exposure index) both use S = 10 / H (§3.2, §3.3). So a\n * correct exposure for S gives the same black-subtracted fraction of digital saturation at every S.\n *\n * Read noise in electrons is declared per conversion-gain mode, never derived from S. (With dual\n * conversion gain, the high-conversion-gain mode used at high S has lower input-referred read noise.)\n *\n * Inputs are explicit declarations; Photivra presets use synthetic teaching values. No camera\n * calibration is implied.\n * @see docs/MOTION_AND_SIGNAL.md for equations, sources and limits.\n */\n\nimport { InvalidConfigurationError } from \"../core/configuration-error.js\";\nimport { parseEvidenceList, type EvidenceBackedFact, type EvidenceProvenance } from \"../core/evidence-provenance.js\";\nimport { requireAllowlistedRecord, requirePublicOpaqueId } from \"../core/record-validation.js\";\nimport { parseSensorReadoutConversionProfile, type SensorReadoutConversionRegime,\n type SensorReadoutExposureIndexGain } from \"./raw-readout.js\";\nimport type { GenericIsoStandardRegimeBand } from \"./iso-signal-chain.js\";\nimport type { SensorSpectralResponseScientificStatus } from \"./spectral-response.js\";\n\n/** One conversion-gain mode, active from its minimum exposure index up to the next mode's. */\nexport interface IsoGainConversionGainMode {\n mode: SensorReadoutExposureIndexGain[\"conversionGainMode\"];\n minimumExposureIndex: number;\n readNoiseRmsElectrons: EvidenceBackedFact<number>;\n /** Optional charge storage limit of this mode. Every regime's pre-ADC threshold must be at or below it. */\n maximumChargeElectrons?: EvidenceBackedFact<number>;\n}\n\nexport interface CreateIsoGainReadoutRegimesInput {\n regimeIdPrefix: string;\n scientificStatus: SensorSpectralResponseScientificStatus;\n baseExposureIndex: number;\n /** Strictly increasing settings, each at least the base exposure index. */\n exposureIndices: readonly number[];\n /** Q0: electron-equivalent signal that reaches digital saturation at the base exposure index. */\n baseSaturationElectronEquivalent: EvidenceBackedFact<number>;\n /** A_max: largest analog gain relative to the base regime (>= 1). */\n maximumAnalogGain: EvidenceBackedFact<number>;\n adc: { bitDepth: number; blackLevelCode: number; digitalSaturationCode: number };\n conversionGainModes: readonly IsoGainConversionGainMode[];\n evidence: readonly EvidenceProvenance[];\n limitations: readonly string[];\n}\n\nexport interface IsoGainReadoutRegimes {\n regimes: readonly SensorReadoutConversionRegime[];\n /** One single-value band per setting, ready for a GenericIsoSignalChainProfile. */\n standardRegimeBands: readonly GenericIsoStandardRegimeBand[];\n}\n\nfunction positive(value: unknown, path: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n throw new InvalidConfigurationError(path + \" must be finite and greater than zero.\");\n }\n return value;\n}\n\nfunction positiveFact(value: unknown, path: string): EvidenceBackedFact<number> {\n const r = requireAllowlistedRecord(value, [\"value\", \"evidence\"], path + \" must be an evidence-backed fact.\");\n return { value: positive(r.value, path + \".value\"), evidence: parseEvidenceList(r.evidence, path + \".evidence\") };\n}\n\n/**\n * Builds a readout regime and signal-chain band for each exposure index (see the module comment\n * for the equations). The result is checked with the same rules as parseSensorReadoutConversionProfile.\n * Each regime carries an `exposureIndexGain` record of how it was derived.\n * @param input - The sensor parameters and ISO settings; untrusted values are validated.\n * @returns The readout regimes and bands.\n */\nexport function createIsoGainReadoutRegimes(input: CreateIsoGainReadoutRegimesInput): IsoGainReadoutRegimes {\n const r = requireAllowlistedRecord(input, [\"regimeIdPrefix\", \"scientificStatus\", \"baseExposureIndex\", \"exposureIndices\",\n \"baseSaturationElectronEquivalent\", \"maximumAnalogGain\", \"adc\", \"conversionGainModes\", \"evidence\", \"limitations\"],\n \"Invalid ISO gain readout fields.\");\n const prefix = r.regimeIdPrefix === \"\" ? \"\" : requirePublicOpaqueId(r.regimeIdPrefix, \"regimeIdPrefix must be empty or a public opaque identifier.\");\n const base = positive(r.baseExposureIndex, \"baseExposureIndex\");\n const q0 = positiveFact(r.baseSaturationElectronEquivalent, \"baseSaturationElectronEquivalent\");\n const aMax = positiveFact(r.maximumAnalogGain, \"maximumAnalogGain\");\n if (aMax.value < 1) throw new InvalidConfigurationError(\"maximumAnalogGain must be at least 1.\");\n const evidence = parseEvidenceList(r.evidence, \"evidence\");\n const adc = requireAllowlistedRecord(r.adc, [\"bitDepth\", \"blackLevelCode\", \"digitalSaturationCode\"], \"Invalid ISO gain ADC fields.\");\n if (!Array.isArray(r.exposureIndices) || r.exposureIndices.length === 0 || r.exposureIndices.length > 256) {\n throw new InvalidConfigurationError(\"exposureIndices must contain 1 through 256 settings.\");\n }\n const indices = r.exposureIndices.map((value: unknown, i: number) => positive(value, \"exposureIndices[\" + i + \"]\"));\n if (indices[0]! < base || indices.some((value, i) => i > 0 && value <= indices[i - 1]!)) {\n throw new InvalidConfigurationError(\"exposureIndices must strictly increase from at least the base exposure index.\");\n }\n if (!Array.isArray(r.conversionGainModes) || r.conversionGainModes.length === 0 || r.conversionGainModes.length > 8) {\n throw new InvalidConfigurationError(\"conversionGainModes must contain 1 through 8 modes.\");\n }\n const modes = r.conversionGainModes.map((value: unknown, i: number) => {\n const m = requireAllowlistedRecord(value, [\"mode\", \"minimumExposureIndex\", \"readNoiseRmsElectrons\", \"maximumChargeElectrons\"],\n \"Invalid conversion-gain mode fields.\");\n if (m.mode !== \"single-conversion-gain\" && m.mode !== \"low-conversion-gain\" && m.mode !== \"high-conversion-gain\") {\n throw new InvalidConfigurationError(\"conversionGainModes[\" + i + \"].mode is invalid.\");\n }\n const noise = requireAllowlistedRecord(m.readNoiseRmsElectrons, [\"value\", \"evidence\"], \"Invalid read-noise fact.\");\n if (typeof noise.value !== \"number\" || !Number.isFinite(noise.value) || noise.value < 0) {\n throw new InvalidConfigurationError(\"conversionGainModes[\" + i + \"].readNoiseRmsElectrons.value must be finite and nonnegative.\");\n }\n return { mode: m.mode as IsoGainConversionGainMode[\"mode\"],\n minimumExposureIndex: positive(m.minimumExposureIndex, \"conversionGainModes[\" + i + \"].minimumExposureIndex\"),\n readNoiseRmsElectrons: { value: noise.value, evidence: parseEvidenceList(noise.evidence, \"readNoiseRmsElectrons.evidence\") },\n ...(m.maximumChargeElectrons === undefined ? {} :\n { maximumChargeElectrons: positiveFact(m.maximumChargeElectrons, \"conversionGainModes[\" + i + \"].maximumChargeElectrons\") }) };\n });\n if (modes[0]!.minimumExposureIndex !== base || modes.some((m, i) => i > 0 && m.minimumExposureIndex <= modes[i - 1]!.minimumExposureIndex)) {\n throw new InvalidConfigurationError(\"conversionGainModes must start at the base exposure index and strictly increase.\");\n }\n const gainEvidence = [...q0.evidence, ...aMax.evidence].filter((entry, i, all) =>\n all.findIndex((other) => JSON.stringify(other) === JSON.stringify(entry)) === i);\n const black = adc.blackLevelCode as number, saturation = adc.digitalSaturationCode as number;\n const span = saturation - black;\n const regimes = indices.map((exposureIndex) => {\n const ratio = exposureIndex / base;\n const analogGain = Math.min(ratio, aMax.value);\n const digitalGain = ratio / analogGain;\n const mode = modes.filter((m) => m.minimumExposureIndex <= exposureIndex).pop()!;\n const preAdc = q0.value / analogGain;\n if (mode.maximumChargeElectrons !== undefined && preAdc > mode.maximumChargeElectrons.value) {\n throw new InvalidConfigurationError(\"A \" + mode.mode + \" regime would need more charge than its declared storage limit.\");\n }\n const regimeEvidence = [...evidence];\n return {\n regimeId: prefix + \"iso-\" + exposureIndex,\n scientificStatus: r.scientificStatus as SensorSpectralResponseScientificStatus,\n systemConversionGainElectronsPerCode: { value: preAdc / span, evidence: gainEvidence },\n preAdcSaturationElectronEquivalent: { value: preAdc, evidence: gainEvidence },\n readNoiseComponents: [{ componentId: \"electronic\", rmsElectrons: mode.readNoiseRmsElectrons, evidence: mode.readNoiseRmsElectrons.evidence }],\n adc: { bitDepth: adc.bitDepth as number, blackLevelCode: black, digitalSaturationCode: saturation, transfer: \"uniform-round-half-up\" as const,\n ...(digitalGain === 1 ? {} : { digitalGain }) },\n exposureIndexGain: { exposureIndex, baseExposureIndex: base, analogGain, digitalGain, conversionGainMode: mode.mode, evidence: regimeEvidence },\n evidence: regimeEvidence,\n limitations: r.limitations as readonly string[]\n };\n });\n // Reuse the regime parser to check the ADC, limitations and consistency.\n const parsed = parseSensorReadoutConversionProfile({ schemaVersion: \"0.1.0\", profileId: prefix + \"validation\", colorSamplingProfileId: \"validation\",\n channelId: \"validation\", regimeSelectionOwnedBy: \"explicit-upstream-camera-state-not-inferred-from-iso\", regimes, evidence }).regimes;\n return { regimes: parsed, standardRegimeBands: indices.map((exposureIndex, i) => ({ minimumExposureIndex: exposureIndex,\n maximumExposureIndex: exposureIndex, readoutRegimeId: parsed[i]!.regimeId })) };\n}\n"]}
|
|
@@ -72,69 +72,47 @@ export interface GenericIsoSignalChainPresetCatalog {
|
|
|
72
72
|
realCameraRankingClaimed: false;
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
*
|
|
76
|
-
* missing required fields and
|
|
75
|
+
* Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
|
|
76
|
+
* missing required fields and inconsistent scientific data are rejected.
|
|
77
77
|
*
|
|
78
|
-
* The
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
* @
|
|
82
|
-
* @returns GenericIsoSignalChainProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
78
|
+
* The profile binds each ISO and capture-mode state to an explicit readout regime, whose gain,
|
|
79
|
+
* read noise and clipping are declared separately.
|
|
80
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
81
|
+
* @returns The result. Success does not imply calibration.
|
|
83
82
|
*
|
|
84
|
-
* @see docs/API_REFERENCE.md for the
|
|
83
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
85
84
|
*/
|
|
86
85
|
export declare function parseGenericIsoSignalChainProfile(value: unknown): GenericIsoSignalChainProfile;
|
|
87
86
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
87
|
+
* Picks the explicit readout regime bound to the resolved ISO and capture-mode state. Gain and noise
|
|
88
|
+
* are never derived from the ISO number.
|
|
89
|
+
* @param input - The input; see `ResolveGenericIsoSignalChainInput` for its fields, units and coordinates.
|
|
90
|
+
* @returns The result. Success does not imply calibration.
|
|
90
91
|
*
|
|
91
|
-
*
|
|
92
|
-
* shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
|
|
93
|
-
* declared. Generic tier labels do not calibrate or rank commercial equipment.
|
|
94
|
-
* @param input - ResolveGenericIsoSignalChainInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
95
|
-
* @returns ResolvedGenericIsoSignalChain. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
96
|
-
*
|
|
97
|
-
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
92
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
98
93
|
*/
|
|
99
94
|
export declare function resolveGenericIsoSignalChain(input: ResolveGenericIsoSignalChainInput): ResolvedGenericIsoSignalChain;
|
|
100
95
|
/**
|
|
101
|
-
*
|
|
102
|
-
* missing required fields and
|
|
96
|
+
* Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
|
|
97
|
+
* missing required fields and inconsistent scientific data are rejected.
|
|
103
98
|
*
|
|
104
|
-
*
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
108
|
-
* @returns GenericIsoSignalChainPresetCatalog. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
99
|
+
* Generic tier labels in the catalogue do not calibrate or rank real cameras.
|
|
100
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
101
|
+
* @returns The result. Success does not imply calibration.
|
|
109
102
|
*
|
|
110
|
-
* @see docs/API_REFERENCE.md for the
|
|
103
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
111
104
|
*/
|
|
112
105
|
export declare function parseGenericIsoSignalChainPresetCatalog(value: unknown): GenericIsoSignalChainPresetCatalog;
|
|
113
106
|
/**
|
|
114
|
-
*
|
|
115
|
-
* manufacturer calibration.
|
|
107
|
+
* Picks a generic preset from the catalogue and returns the signal-chain profile it uses. It makes
|
|
108
|
+
* no claim of manufacturer calibration.
|
|
116
109
|
*
|
|
117
|
-
*
|
|
118
|
-
*
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
catalog:
|
|
122
|
-
GenericIsoSignalChainPresetCatalog;
|
|
123
|
-
preset:
|
|
124
|
-
GenericIsoSignalChainPreset;
|
|
125
|
-
}. See the linked contract for coordinate, unit and profile binding semantics.
|
|
126
|
-
* @returns {
|
|
127
|
-
preset:
|
|
128
|
-
GenericIsoSignalChainPreset;
|
|
129
|
-
signalChainProfileId:
|
|
130
|
-
string;
|
|
131
|
-
performanceOrderingClaimed:
|
|
132
|
-
false;
|
|
133
|
-
realCameraRankingClaimed:
|
|
134
|
-
false;
|
|
135
|
-
}. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
110
|
+
* Generic tier labels do not calibrate or rank real cameras.
|
|
111
|
+
* @param input - The preset catalogue and the chosen preset.
|
|
112
|
+
* @returns The preset and its signal-chain profile ID. `performanceOrderingClaimed` and
|
|
113
|
+
* `realCameraRankingClaimed` are always false. Success does not imply calibration.
|
|
136
114
|
*
|
|
137
|
-
* @see docs/API_REFERENCE.md for the
|
|
115
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
138
116
|
*/
|
|
139
117
|
export declare function resolveGenericIsoSignalChainPreset(input: {
|
|
140
118
|
catalog: GenericIsoSignalChainPresetCatalog;
|
|
@@ -145,4 +123,3 @@ export declare function resolveGenericIsoSignalChainPreset(input: {
|
|
|
145
123
|
performanceOrderingClaimed: false;
|
|
146
124
|
realCameraRankingClaimed: false;
|
|
147
125
|
};
|
|
148
|
-
//# sourceMappingURL=iso-signal-chain.d.ts.map
|
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
// SPDX-License-Identifier: Apache-2.0
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* Select the explicit readout regime bound to the resolved ISO and capture-mode state; do not derive
|
|
10
|
-
* gain/noise from an ISO number. The selected ISO/capture-mode state binds an explicit generic readout
|
|
11
|
-
* regime. Photons and photo/dark shot-noise expectations remain upstream; regime gain, read noise and
|
|
12
|
-
* clipping are separately declared. Generic tier labels do not calibrate or rank commercial equipment.
|
|
3
|
+
* ISO signal chain: picks the explicit readout regime (gain, read noise, clipping) that belongs to the
|
|
4
|
+
* selected ISO and capture mode.
|
|
5
|
+
*
|
|
6
|
+
* Gain and noise are never derived from the ISO number itself; each regime is declared. Photons and
|
|
7
|
+
* photo or dark shot noise are computed earlier in the chain. Generic tier labels do not calibrate or
|
|
8
|
+
* rank real cameras.
|
|
13
9
|
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
14
10
|
* limits.
|
|
15
11
|
*/
|
|
@@ -18,14 +14,17 @@ import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
|
18
14
|
import { InvalidScientificInputError } from "../core/validation.js";
|
|
19
15
|
import { parseIsoCapabilityProfile, resolveIsoCapability } from "../equipment/iso-capabilities.js";
|
|
20
16
|
import { parseSensorReadoutConversionProfile, resolveSensorReadoutRegime } from "./raw-readout.js";
|
|
17
|
+
import { requireInputKeys, rejectUnknownFields } from "../core/record-validation.js";
|
|
21
18
|
export const GENERIC_ISO_SIGNAL_CHAIN_PROFILE_SCHEMA_VERSION = "0.1.0";
|
|
22
19
|
export const GENERIC_ISO_SIGNAL_CHAIN_PRESET_CATALOG_SCHEMA_VERSION = "0.1.0";
|
|
23
|
-
function requireRecord(value, path) {
|
|
20
|
+
function requireRecord(value, path, allowedKeys) {
|
|
24
21
|
if (typeof value !== "object" ||
|
|
25
22
|
value === null ||
|
|
26
23
|
Array.isArray(value)) {
|
|
27
24
|
throw new InvalidConfigurationError(path + " must be an object.");
|
|
28
25
|
}
|
|
26
|
+
if (allowedKeys !== null)
|
|
27
|
+
rejectUnknownFields(value, allowedKeys, path);
|
|
29
28
|
return value;
|
|
30
29
|
}
|
|
31
30
|
function requireNonEmptyString(value, path) {
|
|
@@ -61,7 +60,7 @@ function parseLimitations(value, path) {
|
|
|
61
60
|
return parsed;
|
|
62
61
|
}
|
|
63
62
|
function parseStandardBand(value, path) {
|
|
64
|
-
const record = requireRecord(value, path);
|
|
63
|
+
const record = requireRecord(value, path, ["minimumExposureIndex", "maximumExposureIndex", "readoutRegimeId"]);
|
|
65
64
|
const minimumExposureIndex = requirePositiveFinite(record.minimumExposureIndex, path +
|
|
66
65
|
".minimumExposureIndex");
|
|
67
66
|
const maximumExposureIndex = requirePositiveFinite(record.maximumExposureIndex, path +
|
|
@@ -79,7 +78,7 @@ function parseStandardBand(value, path) {
|
|
|
79
78
|
};
|
|
80
79
|
}
|
|
81
80
|
function parseCaptureModeBinding(value, path) {
|
|
82
|
-
const record = requireRecord(value, path);
|
|
81
|
+
const record = requireRecord(value, path, ["standardRegimeBands", "expandedRegimeBindings", "captureModeId", "evidence"]);
|
|
83
82
|
if (!Array.isArray(record.standardRegimeBands) ||
|
|
84
83
|
record.standardRegimeBands
|
|
85
84
|
.length === 0) {
|
|
@@ -109,7 +108,7 @@ function parseCaptureModeBinding(value, path) {
|
|
|
109
108
|
".expandedRegimeBindings[" +
|
|
110
109
|
index +
|
|
111
110
|
"]";
|
|
112
|
-
const binding = requireRecord(entry, entryPath);
|
|
111
|
+
const binding = requireRecord(entry, entryPath, ["expandedSettingId", "readoutRegimeId"]);
|
|
113
112
|
return {
|
|
114
113
|
expandedSettingId: requireNonEmptyString(binding.expandedSettingId, entryPath +
|
|
115
114
|
".expandedSettingId"),
|
|
@@ -131,19 +130,18 @@ function parseCaptureModeBinding(value, path) {
|
|
|
131
130
|
};
|
|
132
131
|
}
|
|
133
132
|
/**
|
|
134
|
-
*
|
|
135
|
-
* missing required fields and
|
|
133
|
+
* Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
|
|
134
|
+
* missing required fields and inconsistent scientific data are rejected.
|
|
136
135
|
*
|
|
137
|
-
* The
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
* @
|
|
141
|
-
* @returns GenericIsoSignalChainProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
136
|
+
* The profile binds each ISO and capture-mode state to an explicit readout regime, whose gain,
|
|
137
|
+
* read noise and clipping are declared separately.
|
|
138
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
139
|
+
* @returns The result. Success does not imply calibration.
|
|
142
140
|
*
|
|
143
|
-
* @see docs/API_REFERENCE.md for the
|
|
141
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
144
142
|
*/
|
|
145
143
|
export function parseGenericIsoSignalChainProfile(value) {
|
|
146
|
-
const record = requireRecord(value, "genericIsoSignalChainProfile");
|
|
144
|
+
const record = requireRecord(value, "genericIsoSignalChainProfile", ["schemaVersion", "scientificStatus", "behaviorMeaning", "photonShotNoiseOwnedUpstream", "processedImageBehaviorIncluded", "fixedPatternNoiseModeled", "lowSignalColorDegradationModeled", "captureModeBindings", "profileId", "profileVersion", "isoCapabilityProfileId", "readoutProfileId", "evidence", "limitations"]);
|
|
147
145
|
if (record.schemaVersion !==
|
|
148
146
|
GENERIC_ISO_SIGNAL_CHAIN_PROFILE_SCHEMA_VERSION) {
|
|
149
147
|
throw new InvalidConfigurationError('genericIsoSignalChainProfile.schemaVersion must be "' +
|
|
@@ -236,18 +234,15 @@ function regimeIdForIso(binding, iso) {
|
|
|
236
234
|
};
|
|
237
235
|
}
|
|
238
236
|
/**
|
|
239
|
-
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
* The
|
|
243
|
-
* shot-noise expectations remain upstream; regime gain, read noise and clipping are separately
|
|
244
|
-
* declared. Generic tier labels do not calibrate or rank commercial equipment.
|
|
245
|
-
* @param input - ResolveGenericIsoSignalChainInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
246
|
-
* @returns ResolvedGenericIsoSignalChain. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
237
|
+
* Picks the explicit readout regime bound to the resolved ISO and capture-mode state. Gain and noise
|
|
238
|
+
* are never derived from the ISO number.
|
|
239
|
+
* @param input - The input; see `ResolveGenericIsoSignalChainInput` for its fields, units and coordinates.
|
|
240
|
+
* @returns The result. Success does not imply calibration.
|
|
247
241
|
*
|
|
248
|
-
* @see docs/API_REFERENCE.md for the
|
|
242
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
249
243
|
*/
|
|
250
244
|
export function resolveGenericIsoSignalChain(input) {
|
|
245
|
+
requireInputKeys(input, "resolveGenericIsoSignalChain", ["profile", "isoCapability", "requestedIsoSetting", "captureModeId", "readoutProfile"]);
|
|
251
246
|
const profile = parseGenericIsoSignalChainProfile(input.profile);
|
|
252
247
|
const isoCapability = parseIsoCapabilityProfile(input.isoCapability);
|
|
253
248
|
const readoutProfile = parseSensorReadoutConversionProfile(input.readoutProfile);
|
|
@@ -263,7 +258,7 @@ export function resolveGenericIsoSignalChain(input) {
|
|
|
263
258
|
"string" ||
|
|
264
259
|
input.captureModeId.trim()
|
|
265
260
|
.length === 0) {
|
|
266
|
-
throw new
|
|
261
|
+
throw new InvalidConfigurationError("captureModeId must be a non-empty string.");
|
|
267
262
|
}
|
|
268
263
|
const binding = profile.captureModeBindings.find((entry) => entry.captureModeId ===
|
|
269
264
|
input.captureModeId);
|
|
@@ -281,6 +276,13 @@ export function resolveGenericIsoSignalChain(input) {
|
|
|
281
276
|
profile: readoutProfile,
|
|
282
277
|
regimeId: regime.regimeId
|
|
283
278
|
});
|
|
279
|
+
const gain = readout.regime
|
|
280
|
+
.exposureIndexGain;
|
|
281
|
+
if (gain !== undefined &&
|
|
282
|
+
gain.exposureIndex !==
|
|
283
|
+
iso.reportedExposureIndex) {
|
|
284
|
+
throw new InvalidScientificInputError("The bound readout regime declares an ISO-gain derivation for a different exposure index.");
|
|
285
|
+
}
|
|
284
286
|
return {
|
|
285
287
|
profileId: profile.profileId,
|
|
286
288
|
profileVersion: profile.profileVersion,
|
|
@@ -305,19 +307,17 @@ const PRESETS = new Set([
|
|
|
305
307
|
"best"
|
|
306
308
|
]);
|
|
307
309
|
/**
|
|
308
|
-
*
|
|
309
|
-
* missing required fields and
|
|
310
|
+
* Validates untrusted input and returns it as a normalized, typed value. Unknown enum values,
|
|
311
|
+
* missing required fields and inconsistent scientific data are rejected.
|
|
310
312
|
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
315
|
-
* @returns GenericIsoSignalChainPresetCatalog. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
313
|
+
* Generic tier labels in the catalogue do not calibrate or rank real cameras.
|
|
314
|
+
* @param value - Untrusted data. TypeScript types alone are not validation.
|
|
315
|
+
* @returns The result. Success does not imply calibration.
|
|
316
316
|
*
|
|
317
|
-
* @see docs/API_REFERENCE.md for the
|
|
317
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
318
318
|
*/
|
|
319
319
|
export function parseGenericIsoSignalChainPresetCatalog(value) {
|
|
320
|
-
const record = requireRecord(value, "genericIsoSignalChainPresetCatalog");
|
|
320
|
+
const record = requireRecord(value, "genericIsoSignalChainPresetCatalog", ["schemaVersion", "performanceOrderingClaimed", "realCameraRankingClaimed", "entries", "catalogId", "catalogVersion"]);
|
|
321
321
|
if (record.schemaVersion !==
|
|
322
322
|
GENERIC_ISO_SIGNAL_CHAIN_PRESET_CATALOG_SCHEMA_VERSION) {
|
|
323
323
|
throw new InvalidConfigurationError('genericIsoSignalChainPresetCatalog.schemaVersion must be "' +
|
|
@@ -338,7 +338,7 @@ export function parseGenericIsoSignalChainPresetCatalog(value) {
|
|
|
338
338
|
const path = "genericIsoSignalChainPresetCatalog.entries[" +
|
|
339
339
|
index +
|
|
340
340
|
"]";
|
|
341
|
-
const parsed = requireRecord(entry, path);
|
|
341
|
+
const parsed = requireRecord(entry, path, ["preset", "signalChainProfileId", "evidence"]);
|
|
342
342
|
if (typeof parsed.preset !==
|
|
343
343
|
"string" ||
|
|
344
344
|
!PRESETS.has(parsed.preset)) {
|
|
@@ -368,35 +368,21 @@ export function parseGenericIsoSignalChainPresetCatalog(value) {
|
|
|
368
368
|
};
|
|
369
369
|
}
|
|
370
370
|
/**
|
|
371
|
-
*
|
|
372
|
-
* manufacturer calibration.
|
|
371
|
+
* Picks a generic preset from the catalogue and returns the signal-chain profile it uses. It makes
|
|
372
|
+
* no claim of manufacturer calibration.
|
|
373
373
|
*
|
|
374
|
-
*
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
378
|
-
catalog:
|
|
379
|
-
GenericIsoSignalChainPresetCatalog;
|
|
380
|
-
preset:
|
|
381
|
-
GenericIsoSignalChainPreset;
|
|
382
|
-
}. See the linked contract for coordinate, unit and profile binding semantics.
|
|
383
|
-
* @returns {
|
|
384
|
-
preset:
|
|
385
|
-
GenericIsoSignalChainPreset;
|
|
386
|
-
signalChainProfileId:
|
|
387
|
-
string;
|
|
388
|
-
performanceOrderingClaimed:
|
|
389
|
-
false;
|
|
390
|
-
realCameraRankingClaimed:
|
|
391
|
-
false;
|
|
392
|
-
}. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
374
|
+
* Generic tier labels do not calibrate or rank real cameras.
|
|
375
|
+
* @param input - The preset catalogue and the chosen preset.
|
|
376
|
+
* @returns The preset and its signal-chain profile ID. `performanceOrderingClaimed` and
|
|
377
|
+
* `realCameraRankingClaimed` are always false. Success does not imply calibration.
|
|
393
378
|
*
|
|
394
|
-
* @see docs/API_REFERENCE.md for the
|
|
379
|
+
* @see docs/API_REFERENCE.md for the package export and its full type definitions.
|
|
395
380
|
*/
|
|
396
381
|
export function resolveGenericIsoSignalChainPreset(input) {
|
|
382
|
+
requireInputKeys(input, "resolveGenericIsoSignalChainPreset", ["catalog", "preset"]);
|
|
397
383
|
const catalog = parseGenericIsoSignalChainPresetCatalog(input.catalog);
|
|
398
384
|
if (!PRESETS.has(input.preset)) {
|
|
399
|
-
throw new
|
|
385
|
+
throw new InvalidConfigurationError("preset must be good, better, or best.");
|
|
400
386
|
}
|
|
401
387
|
const entry = catalog.entries.find((candidate) => candidate.preset ===
|
|
402
388
|
input.preset);
|