@photivra/engine 0.6.0 → 1.0.1
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/AGENTS.md +674 -0
- package/CHANGELOG.md +191 -0
- package/CITATION.cff +1 -1
- package/CONTRIBUTING.md +76 -0
- package/DCO +33 -0
- package/NODE_SUPPORT.md +37 -0
- package/NOTICE +2 -0
- package/README.md +139 -72
- package/SECURITY.md +55 -0
- package/THIRD_PARTY.md +63 -0
- package/dist/camera/equivalent-focal-length.d.ts +9 -0
- package/dist/camera/equivalent-focal-length.d.ts.map +1 -1
- package/dist/camera/equivalent-focal-length.js +9 -0
- package/dist/camera/equivalent-focal-length.js.map +1 -1
- package/dist/camera/field-of-view.d.ts +13 -0
- package/dist/camera/field-of-view.d.ts.map +1 -1
- package/dist/camera/field-of-view.js +13 -0
- package/dist/camera/field-of-view.js.map +1 -1
- package/dist/camera/projected-object-size.d.ts +8 -0
- package/dist/camera/projected-object-size.d.ts.map +1 -1
- package/dist/camera/projected-object-size.js +8 -0
- package/dist/camera/projected-object-size.js.map +1 -1
- package/dist/capture/capture-export-metadata.d.ts +60 -0
- package/dist/capture/capture-export-metadata.d.ts.map +1 -0
- package/dist/capture/capture-export-metadata.js +62 -0
- package/dist/capture/capture-export-metadata.js.map +1 -0
- package/dist/capture/environment-raw-producer.d.ts +55 -0
- package/dist/capture/environment-raw-producer.d.ts.map +1 -0
- package/dist/capture/environment-raw-producer.js +88 -0
- package/dist/capture/environment-raw-producer.js.map +1 -0
- package/dist/capture/export-jpeg.d.ts +12 -0
- package/dist/capture/export-jpeg.d.ts.map +1 -0
- package/dist/capture/export-jpeg.js +126 -0
- package/dist/capture/export-jpeg.js.map +1 -0
- package/dist/capture/export-tiff.d.ts +45 -0
- package/dist/capture/export-tiff.d.ts.map +1 -0
- package/dist/capture/export-tiff.js +129 -0
- package/dist/capture/export-tiff.js.map +1 -0
- package/dist/capture/focus-control.d.ts +210 -0
- package/dist/capture/focus-control.d.ts.map +1 -0
- package/dist/capture/focus-control.js +664 -0
- package/dist/capture/focus-control.js.map +1 -0
- package/dist/capture/linear-encoding.d.ts +59 -0
- package/dist/capture/linear-encoding.d.ts.map +1 -0
- package/dist/capture/linear-encoding.js +98 -0
- package/dist/capture/linear-encoding.js.map +1 -0
- package/dist/capture/photographic-export.d.ts +135 -0
- package/dist/capture/photographic-export.d.ts.map +1 -0
- package/dist/capture/photographic-export.js +273 -0
- package/dist/capture/photographic-export.js.map +1 -0
- package/dist/capture/raw-frame-limits.d.ts +12 -0
- package/dist/capture/raw-frame-limits.d.ts.map +1 -0
- package/dist/capture/raw-frame-limits.js +13 -0
- package/dist/capture/raw-frame-limits.js.map +1 -0
- package/dist/capture/raw-frame-reconstruction.d.ts +48 -0
- package/dist/capture/raw-frame-reconstruction.d.ts.map +1 -0
- package/dist/capture/raw-frame-reconstruction.js +146 -0
- package/dist/capture/raw-frame-reconstruction.js.map +1 -0
- package/dist/capture/release-sequence.d.ts +120 -0
- package/dist/capture/release-sequence.d.ts.map +1 -0
- package/dist/capture/release-sequence.js +446 -0
- package/dist/capture/release-sequence.js.map +1 -0
- package/dist/capture/sensor-raw-frame.d.ts +34 -0
- package/dist/capture/sensor-raw-frame.d.ts.map +1 -0
- package/dist/capture/sensor-raw-frame.js +106 -0
- package/dist/capture/sensor-raw-frame.js.map +1 -0
- package/dist/capture/sensor-raw-producer.d.ts +51 -0
- package/dist/capture/sensor-raw-producer.d.ts.map +1 -0
- package/dist/capture/sensor-raw-producer.js +235 -0
- package/dist/capture/sensor-raw-producer.js.map +1 -0
- package/dist/capture/simulated-capture.d.ts +125 -0
- package/dist/capture/simulated-capture.d.ts.map +1 -0
- package/dist/capture/simulated-capture.js +248 -0
- package/dist/capture/simulated-capture.js.map +1 -0
- package/dist/color/capture-color.d.ts +73 -0
- package/dist/color/capture-color.d.ts.map +1 -0
- package/dist/color/capture-color.js +145 -0
- package/dist/color/capture-color.js.map +1 -0
- package/dist/color/sensor-color-development.d.ts +23 -0
- package/dist/color/sensor-color-development.d.ts.map +1 -0
- package/dist/color/sensor-color-development.js +56 -0
- package/dist/color/sensor-color-development.js.map +1 -0
- package/dist/color/white-balance.d.ts +175 -0
- package/dist/color/white-balance.d.ts.map +1 -0
- package/dist/color/white-balance.js +606 -0
- package/dist/color/white-balance.js.map +1 -0
- package/dist/composition/image-formation-plan.d.ts +481 -0
- package/dist/composition/image-formation-plan.d.ts.map +1 -0
- package/dist/composition/image-formation-plan.js +2499 -0
- package/dist/composition/image-formation-plan.js.map +1 -0
- package/dist/composition/plan-consumer.d.ts +53 -0
- package/dist/composition/plan-consumer.d.ts.map +1 -0
- package/dist/composition/plan-consumer.js +119 -0
- package/dist/composition/plan-consumer.js.map +1 -0
- package/dist/core/calculation-result.d.ts.map +1 -1
- package/dist/core/calculation-result.js +6 -0
- package/dist/core/calculation-result.js.map +1 -1
- package/dist/core/canonical-json.d.ts +18 -0
- package/dist/core/canonical-json.d.ts.map +1 -0
- package/dist/core/canonical-json.js +44 -0
- package/dist/core/canonical-json.js.map +1 -0
- package/dist/core/configuration-error.d.ts +6 -0
- package/dist/core/configuration-error.d.ts.map +1 -1
- package/dist/core/configuration-error.js +6 -0
- package/dist/core/configuration-error.js.map +1 -1
- package/dist/core/evidence-provenance.d.ts +6 -0
- package/dist/core/evidence-provenance.d.ts.map +1 -1
- package/dist/core/evidence-provenance.js +7 -0
- package/dist/core/evidence-provenance.js.map +1 -1
- package/dist/core/image-formation.d.ts +9 -3
- package/dist/core/image-formation.d.ts.map +1 -1
- package/dist/core/image-formation.js +29 -5
- package/dist/core/image-formation.js.map +1 -1
- package/dist/core/owned-data.d.ts +25 -0
- package/dist/core/owned-data.d.ts.map +1 -0
- package/dist/core/owned-data.js +34 -0
- package/dist/core/owned-data.js.map +1 -0
- package/dist/core/record-validation.d.ts +17 -0
- package/dist/core/record-validation.d.ts.map +1 -0
- package/dist/core/record-validation.js +44 -0
- package/dist/core/record-validation.js.map +1 -0
- package/dist/core/scientific-assurance.d.ts +101 -0
- package/dist/core/scientific-assurance.d.ts.map +1 -0
- package/dist/core/scientific-assurance.js +301 -0
- package/dist/core/scientific-assurance.js.map +1 -0
- package/dist/core/spectral-composition.d.ts +106 -0
- package/dist/core/spectral-composition.d.ts.map +1 -0
- package/dist/core/spectral-composition.js +334 -0
- package/dist/core/spectral-composition.js.map +1 -0
- package/dist/core/spectral.d.ts +34 -0
- package/dist/core/spectral.d.ts.map +1 -0
- package/dist/core/spectral.js +57 -0
- package/dist/core/spectral.js.map +1 -0
- package/dist/core/validation.d.ts +6 -0
- package/dist/core/validation.d.ts.map +1 -1
- package/dist/core/validation.js +6 -0
- package/dist/core/validation.js.map +1 -1
- package/dist/core/version.d.ts +9 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +10 -0
- package/dist/core/version.js.map +1 -0
- package/dist/equipment/exposure-capabilities.d.ts +125 -0
- package/dist/equipment/exposure-capabilities.d.ts.map +1 -0
- package/dist/equipment/exposure-capabilities.js +391 -0
- package/dist/equipment/exposure-capabilities.js.map +1 -0
- package/dist/equipment/generic-tier-assets.d.ts +82 -0
- package/dist/equipment/generic-tier-assets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-assets.js +119 -0
- package/dist/equipment/generic-tier-assets.js.map +1 -0
- package/dist/equipment/generic-tier-presets.d.ts +57 -0
- package/dist/equipment/generic-tier-presets.d.ts.map +1 -0
- package/dist/equipment/generic-tier-presets.js +122 -0
- package/dist/equipment/generic-tier-presets.js.map +1 -0
- package/dist/equipment/iso-capabilities.d.ts +143 -0
- package/dist/equipment/iso-capabilities.d.ts.map +1 -0
- package/dist/equipment/iso-capabilities.js +578 -0
- package/dist/equipment/iso-capabilities.js.map +1 -0
- package/dist/equipment/metering-capabilities.d.ts +58 -0
- package/dist/equipment/metering-capabilities.d.ts.map +1 -0
- package/dist/equipment/metering-capabilities.js +151 -0
- package/dist/equipment/metering-capabilities.js.map +1 -0
- package/dist/equipment/release-capabilities.d.ts +33 -0
- package/dist/equipment/release-capabilities.d.ts.map +1 -0
- package/dist/equipment/release-capabilities.js +176 -0
- package/dist/equipment/release-capabilities.js.map +1 -0
- package/dist/exposure/exposure-duration-control.d.ts +72 -0
- package/dist/exposure/exposure-duration-control.d.ts.map +1 -0
- package/dist/exposure/exposure-duration-control.js +161 -0
- package/dist/exposure/exposure-duration-control.js.map +1 -0
- package/dist/exposure/exposure-mode-resolver.d.ts +637 -0
- package/dist/exposure/exposure-mode-resolver.d.ts.map +1 -0
- package/dist/exposure/exposure-mode-resolver.js +1905 -0
- package/dist/exposure/exposure-mode-resolver.js.map +1 -0
- package/dist/exposure/exposure.d.ts +8 -0
- package/dist/exposure/exposure.d.ts.map +1 -1
- package/dist/exposure/exposure.js +8 -0
- package/dist/exposure/exposure.js.map +1 -1
- package/dist/exposure/flash.d.ts +179 -0
- package/dist/exposure/flash.d.ts.map +1 -0
- package/dist/exposure/flash.js +644 -0
- package/dist/exposure/flash.js.map +1 -0
- package/dist/exposure/metering-scene-radiance.d.ts +72 -0
- package/dist/exposure/metering-scene-radiance.d.ts.map +1 -0
- package/dist/exposure/metering-scene-radiance.js +222 -0
- package/dist/exposure/metering-scene-radiance.js.map +1 -0
- package/dist/exposure/metering-target.d.ts +67 -0
- package/dist/exposure/metering-target.d.ts.map +1 -0
- package/dist/exposure/metering-target.js +265 -0
- package/dist/exposure/metering-target.js.map +1 -0
- package/dist/exposure/metering-temporal.d.ts +76 -0
- package/dist/exposure/metering-temporal.d.ts.map +1 -0
- package/dist/exposure/metering-temporal.js +210 -0
- package/dist/exposure/metering-temporal.js.map +1 -0
- package/dist/exposure/metering.d.ts +124 -0
- package/dist/exposure/metering.d.ts.map +1 -0
- package/dist/exposure/metering.js +422 -0
- package/dist/exposure/metering.js.map +1 -0
- package/dist/exposure/program-line.d.ts +29 -0
- package/dist/exposure/program-line.d.ts.map +1 -0
- package/dist/exposure/program-line.js +126 -0
- package/dist/exposure/program-line.js.map +1 -0
- package/dist/index.d.ts +87 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +85 -6
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +16 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +16 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.js +13 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -1
- package/dist/motion/capture-rotation-temporal-quadrature.js +15 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -1
- package/dist/motion/capture-rotation-trajectory.d.ts +15 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -1
- package/dist/motion/capture-rotation-trajectory.js +15 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -1
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts +119 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js +263 -0
- package/dist/motion/capture-translation-parallax-temporal-quadrature.js.map +1 -0
- package/dist/motion/extended-object-projection.d.ts +175 -0
- package/dist/motion/extended-object-projection.d.ts.map +1 -0
- package/dist/motion/extended-object-projection.js +402 -0
- package/dist/motion/extended-object-projection.js.map +1 -0
- package/dist/motion/projected-motion.d.ts +11 -0
- package/dist/motion/projected-motion.d.ts.map +1 -1
- package/dist/motion/projected-motion.js +11 -0
- package/dist/motion/projected-motion.js.map +1 -1
- package/dist/optics/aperture.d.ts +9 -0
- package/dist/optics/aperture.d.ts.map +1 -1
- package/dist/optics/aperture.js +9 -0
- package/dist/optics/aperture.js.map +1 -1
- package/dist/optics/circle-of-confusion.d.ts +8 -0
- package/dist/optics/circle-of-confusion.d.ts.map +1 -1
- package/dist/optics/circle-of-confusion.js +8 -0
- package/dist/optics/circle-of-confusion.js.map +1 -1
- package/dist/optics/complex-pupil-psf.d.ts +128 -0
- package/dist/optics/complex-pupil-psf.d.ts.map +1 -0
- package/dist/optics/complex-pupil-psf.js +462 -0
- package/dist/optics/complex-pupil-psf.js.map +1 -0
- package/dist/optics/depth-of-field.d.ts +18 -0
- package/dist/optics/depth-of-field.d.ts.map +1 -1
- package/dist/optics/depth-of-field.js +29 -4
- package/dist/optics/depth-of-field.js.map +1 -1
- package/dist/optics/diffraction.d.ts +8 -0
- package/dist/optics/diffraction.d.ts.map +1 -1
- package/dist/optics/diffraction.js +8 -0
- package/dist/optics/diffraction.js.map +1 -1
- package/dist/optics/focus-breathing.d.ts +13 -0
- package/dist/optics/focus-breathing.d.ts.map +1 -1
- package/dist/optics/focus-breathing.js +13 -0
- package/dist/optics/focus-breathing.js.map +1 -1
- package/dist/optics/focus-state.d.ts +47 -0
- package/dist/optics/focus-state.d.ts.map +1 -0
- package/dist/optics/focus-state.js +78 -0
- package/dist/optics/focus-state.js.map +1 -0
- package/dist/optics/front-of-lens-filter.d.ts +114 -0
- package/dist/optics/front-of-lens-filter.d.ts.map +1 -0
- package/dist/optics/front-of-lens-filter.js +468 -0
- package/dist/optics/front-of-lens-filter.js.map +1 -0
- package/dist/optics/illumination-vignetting.d.ts +9 -0
- package/dist/optics/illumination-vignetting.d.ts.map +1 -1
- package/dist/optics/illumination-vignetting.js +9 -0
- package/dist/optics/illumination-vignetting.js.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.d.ts +11 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.js +11 -0
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/lens-psf-profile.d.ts +217 -0
- package/dist/optics/lens-psf-profile.d.ts.map +1 -0
- package/dist/optics/lens-psf-profile.js +823 -0
- package/dist/optics/lens-psf-profile.js.map +1 -0
- package/dist/optics/polygon-diffraction.d.ts +67 -0
- package/dist/optics/polygon-diffraction.d.ts.map +1 -0
- package/dist/optics/polygon-diffraction.js +145 -0
- package/dist/optics/polygon-diffraction.js.map +1 -0
- package/dist/optics/profile-contract.d.ts +42 -0
- package/dist/optics/profile-contract.d.ts.map +1 -0
- package/dist/optics/profile-contract.js +92 -0
- package/dist/optics/profile-contract.js.map +1 -0
- package/dist/optics/psf-foundation.d.ts +16 -3
- package/dist/optics/psf-foundation.d.ts.map +1 -1
- package/dist/optics/psf-foundation.js +28 -15
- package/dist/optics/psf-foundation.js.map +1 -1
- package/dist/optics/radial-distortion.d.ts +18 -0
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +18 -0
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/optics/scene-to-sensor-irradiance.d.ts +213 -0
- package/dist/optics/scene-to-sensor-irradiance.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-irradiance.js +662 -0
- package/dist/optics/scene-to-sensor-irradiance.js.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts +63 -0
- package/dist/optics/scene-to-sensor-quadrature.d.ts.map +1 -0
- package/dist/optics/scene-to-sensor-quadrature.js +82 -0
- package/dist/optics/scene-to-sensor-quadrature.js.map +1 -0
- package/dist/optics/sensor-environment-query.d.ts +60 -0
- package/dist/optics/sensor-environment-query.d.ts.map +1 -0
- package/dist/optics/sensor-environment-query.js +50 -0
- package/dist/optics/sensor-environment-query.js.map +1 -0
- package/dist/optics/sensor-psf-quadrature.d.ts +70 -0
- package/dist/optics/sensor-psf-quadrature.d.ts.map +1 -0
- package/dist/optics/sensor-psf-quadrature.js +101 -0
- package/dist/optics/sensor-psf-quadrature.js.map +1 -0
- package/dist/optics/sensor-psf-support.d.ts +20 -0
- package/dist/optics/sensor-psf-support.d.ts.map +1 -0
- package/dist/optics/sensor-psf-support.js +13 -0
- package/dist/optics/sensor-psf-support.js.map +1 -0
- package/dist/optics/stray-light.d.ts +91 -0
- package/dist/optics/stray-light.d.ts.map +1 -0
- package/dist/optics/stray-light.js +110 -0
- package/dist/optics/stray-light.js.map +1 -0
- package/dist/optics/thin-lens.d.ts +8 -0
- package/dist/optics/thin-lens.d.ts.map +1 -1
- package/dist/optics/thin-lens.js +8 -0
- package/dist/optics/thin-lens.js.map +1 -1
- package/dist/output/capture-corrected-sdr.d.ts +49 -0
- package/dist/output/capture-corrected-sdr.d.ts.map +1 -0
- package/dist/output/capture-corrected-sdr.js +149 -0
- package/dist/output/capture-corrected-sdr.js.map +1 -0
- package/dist/output/capture-geometry.d.ts.map +1 -1
- package/dist/output/capture-geometry.js +8 -0
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/output/capture-sdr.d.ts +49 -0
- package/dist/output/capture-sdr.d.ts.map +1 -0
- package/dist/output/capture-sdr.js +90 -0
- package/dist/output/capture-sdr.js.map +1 -0
- package/dist/output/crop.d.ts +6 -0
- package/dist/output/crop.d.ts.map +1 -1
- package/dist/output/crop.js +6 -0
- package/dist/output/crop.js.map +1 -1
- package/dist/output/geometric-transforms.d.ts +137 -0
- package/dist/output/geometric-transforms.d.ts.map +1 -0
- package/dist/output/geometric-transforms.js +225 -0
- package/dist/output/geometric-transforms.js.map +1 -0
- package/dist/output/lens-corrections.d.ts +121 -0
- package/dist/output/lens-corrections.d.ts.map +1 -0
- package/dist/output/lens-corrections.js +210 -0
- package/dist/output/lens-corrections.js.map +1 -0
- package/dist/output/sdr-rendering.d.ts +81 -0
- package/dist/output/sdr-rendering.d.ts.map +1 -0
- package/dist/output/sdr-rendering.js +106 -0
- package/dist/output/sdr-rendering.js.map +1 -0
- package/dist/output/subject-framing-crop.d.ts +8 -0
- package/dist/output/subject-framing-crop.d.ts.map +1 -1
- package/dist/output/subject-framing-crop.js +8 -0
- package/dist/output/subject-framing-crop.js.map +1 -1
- package/dist/schema/camera.d.ts +6 -0
- package/dist/schema/camera.d.ts.map +1 -1
- package/dist/schema/illumination-spectral.d.ts +51 -0
- package/dist/schema/illumination-spectral.d.ts.map +1 -0
- package/dist/schema/illumination-spectral.js +132 -0
- package/dist/schema/illumination-spectral.js.map +1 -0
- package/dist/schema/illumination-temporal.d.ts +156 -0
- package/dist/schema/illumination-temporal.d.ts.map +1 -0
- package/dist/schema/illumination-temporal.js +554 -0
- package/dist/schema/illumination-temporal.js.map +1 -0
- package/dist/schema/illumination.d.ts +138 -0
- package/dist/schema/illumination.d.ts.map +1 -0
- package/dist/schema/illumination.js +483 -0
- package/dist/schema/illumination.js.map +1 -0
- package/dist/schema/scene-radiance-temporal.d.ts +107 -0
- package/dist/schema/scene-radiance-temporal.d.ts.map +1 -0
- package/dist/schema/scene-radiance-temporal.js +259 -0
- package/dist/schema/scene-radiance-temporal.js.map +1 -0
- package/dist/schema/scene-radiance.d.ts +185 -0
- package/dist/schema/scene-radiance.d.ts.map +1 -0
- package/dist/schema/scene-radiance.js +535 -0
- package/dist/schema/scene-radiance.js.map +1 -0
- package/dist/schema/scene.d.ts +7 -0
- package/dist/schema/scene.d.ts.map +1 -1
- package/dist/schema/validation.d.ts.map +1 -1
- package/dist/schema/validation.js +7 -0
- package/dist/schema/validation.js.map +1 -1
- package/dist/sensor/accumulated-charge.d.ts +199 -0
- package/dist/sensor/accumulated-charge.d.ts.map +1 -0
- package/dist/sensor/accumulated-charge.js +450 -0
- package/dist/sensor/accumulated-charge.js.map +1 -0
- package/dist/sensor/architecture.d.ts +48 -13
- package/dist/sensor/architecture.d.ts.map +1 -1
- package/dist/sensor/architecture.js +58 -16
- package/dist/sensor/architecture.js.map +1 -1
- package/dist/sensor/camera-saturation-capacity.d.ts +138 -0
- package/dist/sensor/camera-saturation-capacity.d.ts.map +1 -0
- package/dist/sensor/camera-saturation-capacity.js +356 -0
- package/dist/sensor/camera-saturation-capacity.js.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts +1 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.js +14 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -1
- package/dist/sensor/capture-mode-timing.d.ts +63 -0
- package/dist/sensor/capture-mode-timing.d.ts.map +1 -0
- package/dist/sensor/capture-mode-timing.js +270 -0
- package/dist/sensor/capture-mode-timing.js.map +1 -0
- package/dist/sensor/capture-mode.d.ts.map +1 -1
- package/dist/sensor/capture-mode.js +13 -0
- package/dist/sensor/capture-mode.js.map +1 -1
- package/dist/sensor/color-sampling.d.ts.map +1 -1
- package/dist/sensor/color-sampling.js +19 -0
- package/dist/sensor/color-sampling.js.map +1 -1
- package/dist/sensor/constant-rate-temporal-integration.d.ts +126 -0
- package/dist/sensor/constant-rate-temporal-integration.d.ts.map +1 -0
- package/dist/sensor/constant-rate-temporal-integration.js +382 -0
- package/dist/sensor/constant-rate-temporal-integration.js.map +1 -0
- package/dist/sensor/dark-current.d.ts +169 -0
- package/dist/sensor/dark-current.d.ts.map +1 -0
- package/dist/sensor/dark-current.js +427 -0
- package/dist/sensor/dark-current.js.map +1 -0
- package/dist/sensor/environment-photo-signal.d.ts +123 -0
- package/dist/sensor/environment-photo-signal.d.ts.map +1 -0
- package/dist/sensor/environment-photo-signal.js +186 -0
- package/dist/sensor/environment-photo-signal.js.map +1 -0
- package/dist/sensor/eqe-electron-rate.d.ts +107 -0
- package/dist/sensor/eqe-electron-rate.d.ts.map +1 -0
- package/dist/sensor/eqe-electron-rate.js +561 -0
- package/dist/sensor/eqe-electron-rate.js.map +1 -0
- package/dist/sensor/eqe-local-exposure.d.ts +65 -0
- package/dist/sensor/eqe-local-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-local-exposure.js +84 -0
- package/dist/sensor/eqe-local-exposure.js.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts +55 -0
- package/dist/sensor/eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/eqe-temporal-exposure.js +62 -0
- package/dist/sensor/eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/exposure-window.d.ts +14 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -1
- package/dist/sensor/exposure-window.js +14 -0
- package/dist/sensor/exposure-window.js.map +1 -1
- package/dist/sensor/iso-signal-chain.d.ts +148 -0
- package/dist/sensor/iso-signal-chain.d.ts.map +1 -0
- package/dist/sensor/iso-signal-chain.js +411 -0
- package/dist/sensor/iso-signal-chain.js.map +1 -0
- package/dist/sensor/local-exposure-binding.d.ts +87 -0
- package/dist/sensor/local-exposure-binding.d.ts.map +1 -0
- package/dist/sensor/local-exposure-binding.js +214 -0
- package/dist/sensor/local-exposure-binding.js.map +1 -0
- package/dist/sensor/optical-stack.d.ts.map +1 -1
- package/dist/sensor/optical-stack.js +17 -0
- package/dist/sensor/optical-stack.js.map +1 -1
- package/dist/sensor/photon-energy.d.ts +97 -0
- package/dist/sensor/photon-energy.d.ts.map +1 -0
- package/dist/sensor/photon-energy.js +390 -0
- package/dist/sensor/photon-energy.js.map +1 -0
- package/dist/sensor/physical-charge-capacity.d.ts +130 -0
- package/dist/sensor/physical-charge-capacity.d.ts.map +1 -0
- package/dist/sensor/physical-charge-capacity.js +345 -0
- package/dist/sensor/physical-charge-capacity.js.map +1 -0
- package/dist/sensor/pixel-pitch.d.ts +6 -0
- package/dist/sensor/pixel-pitch.d.ts.map +1 -1
- package/dist/sensor/pixel-pitch.js +6 -0
- package/dist/sensor/pixel-pitch.js.map +1 -1
- package/dist/sensor/radiometry-readiness.d.ts +10 -0
- package/dist/sensor/radiometry-readiness.d.ts.map +1 -1
- package/dist/sensor/radiometry-readiness.js +10 -0
- package/dist/sensor/radiometry-readiness.js.map +1 -1
- package/dist/sensor/raw-readout.d.ts +314 -0
- package/dist/sensor/raw-readout.d.ts.map +1 -0
- package/dist/sensor/raw-readout.js +914 -0
- package/dist/sensor/raw-readout.js.map +1 -0
- package/dist/sensor/raw-reconstruction.d.ts +170 -0
- package/dist/sensor/raw-reconstruction.d.ts.map +1 -0
- package/dist/sensor/raw-reconstruction.js +424 -0
- package/dist/sensor/raw-reconstruction.js.map +1 -0
- package/dist/sensor/readout-exposure-linkage.d.ts +12 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -1
- package/dist/sensor/readout-exposure-linkage.js +12 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -1
- package/dist/sensor/readout-timing.d.ts +13 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -1
- package/dist/sensor/readout-timing.js +13 -0
- package/dist/sensor/readout-timing.js.map +1 -1
- package/dist/sensor/response-application-compatibility.d.ts +136 -0
- package/dist/sensor/response-application-compatibility.d.ts.map +1 -0
- package/dist/sensor/response-application-compatibility.js +408 -0
- package/dist/sensor/response-application-compatibility.js.map +1 -0
- package/dist/sensor/response-operating-range.d.ts +173 -0
- package/dist/sensor/response-operating-range.d.ts.map +1 -0
- package/dist/sensor/response-operating-range.js +672 -0
- package/dist/sensor/response-operating-range.js.map +1 -0
- package/dist/sensor/responsivity-photocurrent.d.ts +158 -0
- package/dist/sensor/responsivity-photocurrent.d.ts.map +1 -0
- package/dist/sensor/responsivity-photocurrent.js +644 -0
- package/dist/sensor/responsivity-photocurrent.js.map +1 -0
- package/dist/sensor/sampling-aperture.d.ts.map +1 -1
- package/dist/sensor/sampling-aperture.js +14 -0
- package/dist/sensor/sampling-aperture.js.map +1 -1
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts +45 -0
- package/dist/sensor/scene-eqe-temporal-exposure.d.ts.map +1 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js +64 -0
- package/dist/sensor/scene-eqe-temporal-exposure.js.map +1 -0
- package/dist/sensor/sensor-geometry.d.ts +12 -0
- package/dist/sensor/sensor-geometry.d.ts.map +1 -1
- package/dist/sensor/sensor-geometry.js +12 -0
- package/dist/sensor/sensor-geometry.js.map +1 -1
- package/dist/sensor/signal-noise.d.ts +10 -0
- package/dist/sensor/signal-noise.d.ts.map +1 -1
- package/dist/sensor/signal-noise.js +10 -0
- package/dist/sensor/signal-noise.js.map +1 -1
- package/dist/sensor/spatial-sample-reduction.d.ts +44 -1
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -1
- package/dist/sensor/spatial-sample-reduction.js +51 -5
- package/dist/sensor/spatial-sample-reduction.js.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.d.ts +24 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -1
- package/dist/sensor/spatial-sampling-quadrature.js +27 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -1
- package/dist/sensor/spatio-spectral-reduction.d.ts +187 -0
- package/dist/sensor/spatio-spectral-reduction.d.ts.map +1 -0
- package/dist/sensor/spatio-spectral-reduction.js +373 -0
- package/dist/sensor/spatio-spectral-reduction.js.map +1 -0
- package/dist/sensor/spectral-coverage.d.ts +24 -0
- package/dist/sensor/spectral-coverage.d.ts.map +1 -0
- package/dist/sensor/spectral-coverage.js +86 -0
- package/dist/sensor/spectral-coverage.js.map +1 -0
- package/dist/sensor/spectral-quadrature.d.ts +169 -0
- package/dist/sensor/spectral-quadrature.d.ts.map +1 -0
- package/dist/sensor/spectral-quadrature.js +542 -0
- package/dist/sensor/spectral-quadrature.js.map +1 -0
- package/dist/sensor/spectral-response.d.ts +192 -0
- package/dist/sensor/spectral-response.d.ts.map +1 -0
- package/dist/sensor/spectral-response.js +664 -0
- package/dist/sensor/spectral-response.js.map +1 -0
- package/dist/sensor/temporal-eqe-sum.d.ts +15 -0
- package/dist/sensor/temporal-eqe-sum.d.ts.map +1 -0
- package/dist/sensor/temporal-eqe-sum.js +30 -0
- package/dist/sensor/temporal-eqe-sum.js.map +1 -0
- package/dist/sensor/temporal-photo-signal.d.ts +38 -0
- package/dist/sensor/temporal-photo-signal.d.ts.map +1 -0
- package/dist/sensor/temporal-photo-signal.js +110 -0
- package/dist/sensor/temporal-photo-signal.js.map +1 -0
- package/dist/sensor/temporal-sample-binding.d.ts +6 -0
- package/dist/sensor/temporal-sample-binding.d.ts.map +1 -0
- package/dist/sensor/temporal-sample-binding.js +32 -0
- package/dist/sensor/temporal-sample-binding.js.map +1 -0
- package/dist/simulation/poc-simulation.d.ts.map +1 -1
- package/dist/simulation/poc-simulation.js +34 -11
- package/dist/simulation/poc-simulation.js.map +1 -1
- package/dist/stabilization/camera-shake.d.ts +11 -0
- package/dist/stabilization/camera-shake.d.ts.map +1 -1
- package/dist/stabilization/camera-shake.js +11 -0
- package/dist/stabilization/camera-shake.js.map +1 -1
- package/dist/stabilization/system.d.ts +218 -0
- package/dist/stabilization/system.d.ts.map +1 -0
- package/dist/stabilization/system.js +695 -0
- package/dist/stabilization/system.js.map +1 -0
- package/docs/API_REFERENCE.md +2017 -0
- package/docs/API_STYLE.md +139 -3
- package/docs/ARCHITECTURE.md +134 -24
- package/docs/AUTOMATION_COORDINATION.md +2 -0
- package/docs/CAPTURE_COLOR.md +25 -0
- package/docs/CAPTURE_CORRECTED_SDR.md +25 -0
- package/docs/CAPTURE_EXPORT_METADATA.md +27 -0
- package/docs/CAPTURE_SDR.md +20 -0
- package/docs/DEVELOPERS.md +60 -0
- package/docs/DIGITAL_OPTICS_FOUNDATION.md +69 -0
- package/docs/ENVIRONMENT_RAW_CAPTURE.md +187 -0
- package/docs/EXPORT_ACCEPTANCE.md +133 -0
- package/docs/GENERIC_TIER_PRESETS.md +269 -0
- package/docs/GEOMETRIC_PREPARATION_REUSE.md +141 -0
- package/docs/IMAGE_FORMATION.md +80 -10
- package/docs/LINEAR_CAPTURE_ENCODING.md +25 -0
- package/docs/MOTION_AND_SIGNAL.md +5 -3
- package/docs/NUMERICAL_CORRECTNESS.md +191 -0
- package/docs/PERFORMANCE_BASELINE.md +56 -0
- package/docs/PHOTOGRAPHIC_EXPORT.md +206 -0
- package/docs/PHYSICS_FOUNDATION.md +152 -5
- package/docs/POC_API.md +2 -0
- package/docs/POC_PROJECTION_REUSE.md +124 -0
- package/docs/PROCESSED_OUTPUT.md +157 -0
- package/docs/PRODUCTION_COMPOSITION.md +373 -0
- package/docs/PRODUCTION_ENVIRONMENT_CAPTURE.md +131 -0
- package/docs/PROVENANCE.md +4 -0
- package/docs/PSF_FOUNDATION.md +110 -88
- package/docs/RAW_FRAME_ENVELOPE.md +56 -0
- package/docs/RAW_FRAME_RECONSTRUCTION.md +30 -0
- package/docs/RELEASE_1_0.md +66 -0
- package/docs/RELEASE_1_0_1.md +61 -0
- package/docs/RELEASE_AUDIT.md +39 -0
- package/docs/SCENE_RADIANCE_AND_ILLUMINATION.md +298 -0
- package/docs/SCENE_SENSOR_QUADRATURE.md +98 -0
- package/docs/SCENE_SENSOR_TEMPORAL_EXPOSURE.md +86 -0
- package/docs/SCIENTIFIC_ASSURANCE.md +280 -0
- package/docs/SCIENTIFIC_CONFORMANCE.md +83 -0
- package/docs/SDR_RENDERING.md +33 -0
- package/docs/SENSOR_ENVIRONMENT_QUERY.md +86 -0
- package/docs/SENSOR_EQE_LOCAL_EXPOSURE.md +104 -0
- package/docs/SENSOR_EQE_TEMPORAL_EXPOSURE.md +74 -0
- package/docs/SENSOR_PSF_QUADRATURE.md +90 -0
- package/docs/SENSOR_RAW_FRAME.md +20 -0
- package/docs/SENSOR_RAW_PRODUCER.md +77 -0
- package/docs/SIGNAL_CONFORMANCE.md +23 -0
- package/docs/SIMULATED_CAPTURE.md +65 -0
- package/docs/STABILIZATION.md +160 -17
- package/docs/TEMPORAL_PHOTO_RAW.md +83 -0
- package/docs/TIER_ACCEPTANCE.md +129 -0
- package/docs/TIER_PRESET_ACCEPTANCE.md +59 -0
- package/docs/USAGE.md +5050 -1047
- package/docs/V1_COMPOSITION_MAP.md +123 -0
- package/docs/V1_HELPER_REUSE_REVIEW.md +60 -0
- package/docs/V1_PERFORMANCE_DISPOSITION.md +88 -0
- package/docs/api/camera-equivalent-focal-length.md +53 -0
- package/docs/api/camera-field-of-view.md +119 -0
- package/docs/api/camera-projected-object-size.md +54 -0
- package/docs/api/capture-capture-export-metadata.md +107 -0
- package/docs/api/capture-environment-raw-producer.md +56 -0
- package/docs/api/capture-focus-control.md +419 -0
- package/docs/api/capture-linear-encoding.md +99 -0
- package/docs/api/capture-photographic-export.md +172 -0
- package/docs/api/capture-raw-frame-reconstruction.md +87 -0
- package/docs/api/capture-release-sequence.md +252 -0
- package/docs/api/capture-sensor-raw-frame.md +66 -0
- package/docs/api/capture-sensor-raw-producer.md +98 -0
- package/docs/api/capture-simulated-capture.md +179 -0
- package/docs/api/color-capture-color.md +122 -0
- package/docs/api/color-white-balance.md +386 -0
- package/docs/api/composition-image-formation-plan.md +825 -0
- package/docs/api/composition-plan-consumer.md +98 -0
- package/docs/api/core-calculation-result.md +220 -0
- package/docs/api/core-configuration-error.md +19 -0
- package/docs/api/core-image-formation.md +204 -0
- package/docs/api/core-scientific-assurance.md +214 -0
- package/docs/api/core-spectral-composition.md +268 -0
- package/docs/api/core-spectral.md +78 -0
- package/docs/api/core-validation.md +34 -0
- package/docs/api/core-version.md +14 -0
- package/docs/api/equipment-exposure-capabilities.md +270 -0
- package/docs/api/equipment-generic-tier-assets.md +82 -0
- package/docs/api/equipment-generic-tier-presets.md +103 -0
- package/docs/api/equipment-iso-capabilities.md +295 -0
- package/docs/api/equipment-metering-capabilities.md +126 -0
- package/docs/api/equipment-release-capabilities.md +91 -0
- package/docs/api/exports.json +5656 -0
- package/docs/api/exposure-exposure-duration-control.md +115 -0
- package/docs/api/exposure-exposure-mode-resolver.md +966 -0
- package/docs/api/exposure-exposure.md +150 -0
- package/docs/api/exposure-flash.md +327 -0
- package/docs/api/exposure-metering-scene-radiance.md +154 -0
- package/docs/api/exposure-metering-target.md +134 -0
- package/docs/api/exposure-metering-temporal.md +77 -0
- package/docs/api/exposure-metering.md +172 -0
- package/docs/api/exposure-program-line.md +64 -0
- package/docs/api/motion-camera-rotation.md +215 -0
- package/docs/api/motion-capture-rotation-inverse-mapping.md +128 -0
- package/docs/api/motion-capture-rotation-temporal-quadrature.md +127 -0
- package/docs/api/motion-capture-rotation-trajectory.md +132 -0
- package/docs/api/motion-capture-translation-parallax-temporal-quadrature.md +171 -0
- package/docs/api/motion-extended-object-projection.md +312 -0
- package/docs/api/motion-projected-motion.md +60 -0
- package/docs/api/optics-aperture.md +69 -0
- package/docs/api/optics-circle-of-confusion.md +46 -0
- package/docs/api/optics-complex-pupil-psf.md +193 -0
- package/docs/api/optics-depth-of-field.md +92 -0
- package/docs/api/optics-diffraction.md +46 -0
- package/docs/api/optics-focus-breathing.md +119 -0
- package/docs/api/optics-focus-state.md +64 -0
- package/docs/api/optics-front-of-lens-filter.md +263 -0
- package/docs/api/optics-illumination-vignetting.md +95 -0
- package/docs/api/optics-lateral-chromatic-aberration.md +225 -0
- package/docs/api/optics-lens-psf-profile.md +380 -0
- package/docs/api/optics-polygon-diffraction.md +68 -0
- package/docs/api/optics-profile-contract.md +47 -0
- package/docs/api/optics-psf-foundation.md +181 -0
- package/docs/api/optics-radial-distortion.md +194 -0
- package/docs/api/optics-scene-to-sensor-irradiance.md +371 -0
- package/docs/api/optics-scene-to-sensor-quadrature.md +78 -0
- package/docs/api/optics-sensor-environment-query.md +58 -0
- package/docs/api/optics-sensor-psf-quadrature.md +81 -0
- package/docs/api/optics-stray-light.md +109 -0
- package/docs/api/optics-thin-lens.md +53 -0
- package/docs/api/output-capture-corrected-sdr.md +71 -0
- package/docs/api/output-capture-geometry.md +500 -0
- package/docs/api/output-capture-sdr.md +69 -0
- package/docs/api/output-crop.md +47 -0
- package/docs/api/output-geometric-transforms.md +199 -0
- package/docs/api/output-lens-corrections.md +162 -0
- package/docs/api/output-sdr-rendering.md +122 -0
- package/docs/api/output-subject-framing-crop.md +59 -0
- package/docs/api/schema-camera.md +84 -0
- package/docs/api/schema-illumination-spectral.md +77 -0
- package/docs/api/schema-illumination-temporal.md +289 -0
- package/docs/api/schema-illumination.md +246 -0
- package/docs/api/schema-scene-radiance-temporal.md +215 -0
- package/docs/api/schema-scene-radiance.md +415 -0
- package/docs/api/schema-scene.md +105 -0
- package/docs/api/schema-validation.md +25 -0
- package/docs/api/sensor-accumulated-charge.md +273 -0
- package/docs/api/sensor-architecture.md +155 -0
- package/docs/api/sensor-camera-saturation-capacity.md +215 -0
- package/docs/api/sensor-capture-color-sampling-binding.md +323 -0
- package/docs/api/sensor-capture-mode-timing.md +123 -0
- package/docs/api/sensor-capture-mode.md +321 -0
- package/docs/api/sensor-color-sampling.md +228 -0
- package/docs/api/sensor-constant-rate-temporal-integration.md +152 -0
- package/docs/api/sensor-dark-current.md +227 -0
- package/docs/api/sensor-environment-photo-signal.md +77 -0
- package/docs/api/sensor-eqe-electron-rate.md +166 -0
- package/docs/api/sensor-eqe-local-exposure.md +68 -0
- package/docs/api/sensor-eqe-temporal-exposure.md +73 -0
- package/docs/api/sensor-exposure-window.md +183 -0
- package/docs/api/sensor-iso-signal-chain.md +264 -0
- package/docs/api/sensor-local-exposure-binding.md +126 -0
- package/docs/api/sensor-optical-stack.md +211 -0
- package/docs/api/sensor-photon-energy.md +149 -0
- package/docs/api/sensor-physical-charge-capacity.md +196 -0
- package/docs/api/sensor-pixel-pitch.md +41 -0
- package/docs/api/sensor-radiometry-readiness.md +240 -0
- package/docs/api/sensor-raw-readout.md +499 -0
- package/docs/api/sensor-raw-reconstruction.md +260 -0
- package/docs/api/sensor-readout-exposure-linkage.md +172 -0
- package/docs/api/sensor-readout-timing.md +209 -0
- package/docs/api/sensor-response-application-compatibility.md +256 -0
- package/docs/api/sensor-response-operating-range.md +293 -0
- package/docs/api/sensor-responsivity-photocurrent.md +245 -0
- package/docs/api/sensor-sampling-aperture.md +221 -0
- package/docs/api/sensor-scene-eqe-temporal-exposure.md +56 -0
- package/docs/api/sensor-sensor-geometry.md +143 -0
- package/docs/api/sensor-signal-noise.md +75 -0
- package/docs/api/sensor-spatial-sample-reduction.md +186 -0
- package/docs/api/sensor-spatial-sampling-quadrature.md +188 -0
- package/docs/api/sensor-spatio-spectral-reduction.md +217 -0
- package/docs/api/sensor-spectral-coverage.md +33 -0
- package/docs/api/sensor-spectral-quadrature.md +183 -0
- package/docs/api/sensor-spectral-response.md +291 -0
- package/docs/api/sensor-temporal-photo-signal.md +62 -0
- package/docs/api/simulation-poc-simulation.md +364 -0
- package/docs/api/stabilization-camera-shake.md +71 -0
- package/docs/api/stabilization-system.md +442 -0
- package/docs/benchmarks/2026-10-01-main-baseline.json +694 -0
- package/docs/benchmarks/2026-10-02-geometric-preparation-reuse.json +2190 -0
- package/docs/benchmarks/2026-10-02-poc-projection-reuse.json +2423 -0
- package/docs/benchmarks/2026-10-02-v1-environment-gc-profile.json +210 -0
- package/docs/benchmarks/2026-10-02-v1-environment-ordinary.json +187 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-gc-profile.json +756 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-1.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-geometry-ordinary-2.json +711 -0
- package/docs/benchmarks/2026-10-02-v1-poc-gc-profile.json +885 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-1.json +868 -0
- package/docs/benchmarks/2026-10-02-v1-poc-ordinary-2.json +868 -0
- package/docs/examples/production-capture.mjs +34 -0
- package/docs/examples/production-request.json +4613 -0
- package/docs/examples/quick-start.mjs +12 -0
- package/docs/validation/documentation-fragments.json +212 -0
- package/docs/validation/release-audit-inventory.json +1306 -0
- package/docs/validation/tier-acceptance-report-v1.json +2538 -0
- package/package.json +15 -3
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Module boundary and integration notes.
|
|
3
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
4
|
+
* missing required fields and incompatible scientific data fail at this boundary. Photo, dark and
|
|
5
|
+
* explicitly incremental stored-electron components must share the exact site/channel/local shutter
|
|
6
|
+
* event. Completeness is an evidence-backed declaration, not the consequence of an empty component
|
|
7
|
+
* array. Expected stored charge remains distinct from a stochastic realization or nonlinear full-well
|
|
8
|
+
* clamp.
|
|
9
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
10
|
+
* missing required fields and incompatible scientific data fail at this boundary. Photo, dark and
|
|
11
|
+
* explicitly incremental stored-electron components must share the exact site/channel/local shutter
|
|
12
|
+
* event. Completeness is an evidence-backed declaration, not the consequence of an empty component
|
|
13
|
+
* array. Expected stored charge remains distinct from a stochastic realization or nonlinear full-well
|
|
14
|
+
* clamp.
|
|
15
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
16
|
+
* limits.
|
|
17
|
+
*/
|
|
18
|
+
import { type CalculationResult } from "../core/calculation-result.js";
|
|
19
|
+
import { type EvidenceProvenance } from "../core/evidence-provenance.js";
|
|
20
|
+
import type { SensorEqeExposureIntegration } from "./constant-rate-temporal-integration.js";
|
|
21
|
+
import type { SensorEqePhotoExposure, SensorEqeTemporalPhotoSignal } from "./temporal-photo-signal.js";
|
|
22
|
+
import type { SensorPhotoDarkCurrentCharge, SensorDarkCurrentCharge, SensorTemporalDarkCurrentCharge } from "./dark-current.js";
|
|
23
|
+
import type { SensorSpectralResponseScientificStatus, SensorSpectralResponseUncertainty } from "./spectral-response.js";
|
|
24
|
+
export type SensorAdditionalStoredChargeKind = "hot-pixel-defect-excess" | "leakage" | "charge-injection" | "clock-induced-charge" | "other";
|
|
25
|
+
export interface SensorAdditionalStoredChargeComponent {
|
|
26
|
+
componentId: string;
|
|
27
|
+
kind: SensorAdditionalStoredChargeKind;
|
|
28
|
+
colorSamplingProfileId: string;
|
|
29
|
+
channelId: string;
|
|
30
|
+
site: {
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
};
|
|
34
|
+
bindingId: string;
|
|
35
|
+
timeReference: "first-opening-boundary-phase";
|
|
36
|
+
startOffsetSecondsFromOpeningReference: number;
|
|
37
|
+
endOffsetSecondsFromOpeningReference: number;
|
|
38
|
+
accountingMeaning: "incremental-stored-electrons-beyond-photo-and-modeled-dark-current";
|
|
39
|
+
expectedElectronCount: number;
|
|
40
|
+
scientificStatus: SensorSpectralResponseScientificStatus;
|
|
41
|
+
uncertainty: SensorSpectralResponseUncertainty;
|
|
42
|
+
evidence: readonly EvidenceProvenance[];
|
|
43
|
+
}
|
|
44
|
+
export interface SensorAccumulatedChargeCompletenessProfile {
|
|
45
|
+
schemaVersion: "0.1.0";
|
|
46
|
+
profileId: string;
|
|
47
|
+
colorSamplingProfileId: string;
|
|
48
|
+
channelId: string;
|
|
49
|
+
site: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
};
|
|
53
|
+
bindingId: string;
|
|
54
|
+
timeReference: "first-opening-boundary-phase";
|
|
55
|
+
startOffsetSecondsFromOpeningReference: number;
|
|
56
|
+
endOffsetSecondsFromOpeningReference: number;
|
|
57
|
+
darkCurrentProfileId: string;
|
|
58
|
+
includedAdditionalComponentIds: readonly string[];
|
|
59
|
+
coverageMeaning: "all-material-stored-electron-contributors-accounted-for";
|
|
60
|
+
scientificStatus: SensorSpectralResponseScientificStatus;
|
|
61
|
+
evidence: readonly EvidenceProvenance[];
|
|
62
|
+
limitation?: string;
|
|
63
|
+
}
|
|
64
|
+
export interface ComposeSensorAccumulatedChargeInput<Photo extends SensorEqePhotoExposure = SensorEqeExposureIntegration, Dark extends SensorPhotoDarkCurrentCharge = SensorDarkCurrentCharge> {
|
|
65
|
+
photoSignal: Photo;
|
|
66
|
+
darkCharge: Dark;
|
|
67
|
+
additionalChargeComponents?: readonly SensorAdditionalStoredChargeComponent[];
|
|
68
|
+
completenessProfile: SensorAccumulatedChargeCompletenessProfile;
|
|
69
|
+
}
|
|
70
|
+
export type ComposeSensorPhotoAccumulatedChargeInput = ComposeSensorAccumulatedChargeInput<SensorEqePhotoExposure, SensorPhotoDarkCurrentCharge>;
|
|
71
|
+
export interface SensorAccumulatedChargeComposition<Photo extends SensorEqePhotoExposure = SensorEqeExposureIntegration, Dark extends SensorPhotoDarkCurrentCharge = SensorDarkCurrentCharge> {
|
|
72
|
+
completenessProfileId: string;
|
|
73
|
+
colorSamplingProfileId: string;
|
|
74
|
+
channelId: string;
|
|
75
|
+
site: {
|
|
76
|
+
x: number;
|
|
77
|
+
y: number;
|
|
78
|
+
};
|
|
79
|
+
bindingId: string;
|
|
80
|
+
timeReference: "first-opening-boundary-phase";
|
|
81
|
+
startOffsetSecondsFromOpeningReference: number;
|
|
82
|
+
endOffsetSecondsFromOpeningReference: number;
|
|
83
|
+
localExposureDurationSeconds: number;
|
|
84
|
+
photoExpectedElectronCount: number;
|
|
85
|
+
darkExpectedElectronCount: number;
|
|
86
|
+
additionalExpectedElectronCount: number;
|
|
87
|
+
totalExpectedStoredElectronCount: number;
|
|
88
|
+
additionalComponents: readonly {
|
|
89
|
+
componentId: string;
|
|
90
|
+
kind: SensorAdditionalStoredChargeKind;
|
|
91
|
+
expectedElectronCount: number;
|
|
92
|
+
scientificStatus: SensorSpectralResponseScientificStatus;
|
|
93
|
+
uncertainty: SensorSpectralResponseUncertainty;
|
|
94
|
+
evidence: readonly EvidenceProvenance[];
|
|
95
|
+
}[];
|
|
96
|
+
accumulatedChargeCompleteness: "complete-for-physical-storage-capacity-assessment";
|
|
97
|
+
completenessScientificStatus: SensorSpectralResponseScientificStatus;
|
|
98
|
+
allCountsAreExpectationValues: true;
|
|
99
|
+
integerChargeSampled: false;
|
|
100
|
+
photoSignalIncluded: true;
|
|
101
|
+
darkChargeIncluded: true;
|
|
102
|
+
otherChargeIncluded: boolean;
|
|
103
|
+
darkShotNoiseApplied: false;
|
|
104
|
+
photoShotNoiseApplied: false;
|
|
105
|
+
readNoiseApplied: false;
|
|
106
|
+
physicalFullWellAssessmentAuthorized: true;
|
|
107
|
+
cameraSaturationAssessmentAuthorized: false;
|
|
108
|
+
saturationAssessed: false;
|
|
109
|
+
bloomingModeled: false;
|
|
110
|
+
adcQuantizationApplied: false;
|
|
111
|
+
rawCodeValueProduced: false;
|
|
112
|
+
componentEvidence: {
|
|
113
|
+
completeness: readonly EvidenceProvenance[];
|
|
114
|
+
photoSignal: Photo["componentEvidence"];
|
|
115
|
+
darkCurrent: Dark["componentEvidence"];
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
export type SensorPhotoAccumulatedChargeComposition = SensorAccumulatedChargeComposition<SensorEqePhotoExposure, SensorPhotoDarkCurrentCharge>;
|
|
119
|
+
/**
|
|
120
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
121
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
122
|
+
*
|
|
123
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
124
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
125
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
126
|
+
* realization or nonlinear full-well clamp.
|
|
127
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
128
|
+
* @returns SensorAdditionalStoredChargeComponent. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
129
|
+
*
|
|
130
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
131
|
+
*/
|
|
132
|
+
export declare function parseSensorAdditionalStoredChargeComponent(value: unknown): SensorAdditionalStoredChargeComponent;
|
|
133
|
+
/**
|
|
134
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
135
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
136
|
+
*
|
|
137
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
138
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
139
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
140
|
+
* realization or nonlinear full-well clamp.
|
|
141
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
142
|
+
* @returns SensorAccumulatedChargeCompletenessProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
143
|
+
*
|
|
144
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
145
|
+
*/
|
|
146
|
+
export declare function parseSensorAccumulatedChargeCompletenessProfile(value: unknown): SensorAccumulatedChargeCompletenessProfile;
|
|
147
|
+
/**
|
|
148
|
+
* Compose photo, independently evaluated dark and explicitly incremental charge by exact local
|
|
149
|
+
* exposure identity, retaining completeness assessment before capacity/noise.
|
|
150
|
+
*
|
|
151
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
152
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
153
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
154
|
+
* realization or nonlinear full-well clamp.
|
|
155
|
+
* @param input - Omit<ComposeSensorAccumulatedChargeInput, "photoSignal" | "darkCharge"> & {
|
|
156
|
+
photoSignal: SensorEqeExposureIntegration; darkCharge: SensorDarkCurrentCharge;
|
|
157
|
+
}. See the linked contract for coordinate, unit and profile binding semantics.
|
|
158
|
+
* @returns CalculationResult<SensorAccumulatedChargeComposition>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
159
|
+
*
|
|
160
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
161
|
+
*/
|
|
162
|
+
export declare function composeSensorAccumulatedCharge(input: Omit<ComposeSensorAccumulatedChargeInput, "photoSignal" | "darkCharge"> & {
|
|
163
|
+
photoSignal: SensorEqeExposureIntegration;
|
|
164
|
+
darkCharge: SensorDarkCurrentCharge;
|
|
165
|
+
}): CalculationResult<SensorAccumulatedChargeComposition>;
|
|
166
|
+
/**
|
|
167
|
+
* Compose photo, independently evaluated dark and explicitly incremental charge by exact local
|
|
168
|
+
* exposure identity, retaining completeness assessment before capacity/noise.
|
|
169
|
+
*
|
|
170
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
171
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
172
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
173
|
+
* realization or nonlinear full-well clamp.
|
|
174
|
+
* @param input - Omit<ComposeSensorAccumulatedChargeInput, "photoSignal" | "darkCharge"> & {
|
|
175
|
+
photoSignal: SensorEqeTemporalPhotoSignal; darkCharge: SensorTemporalDarkCurrentCharge;
|
|
176
|
+
}. See the linked contract for coordinate, unit and profile binding semantics.
|
|
177
|
+
* @returns CalculationResult<SensorAccumulatedChargeComposition<SensorEqeTemporalPhotoSignal, SensorTemporalDarkCurrentCharge>>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
178
|
+
*
|
|
179
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
180
|
+
*/
|
|
181
|
+
export declare function composeSensorAccumulatedCharge(input: Omit<ComposeSensorAccumulatedChargeInput, "photoSignal" | "darkCharge"> & {
|
|
182
|
+
photoSignal: SensorEqeTemporalPhotoSignal;
|
|
183
|
+
darkCharge: SensorTemporalDarkCurrentCharge;
|
|
184
|
+
}): CalculationResult<SensorAccumulatedChargeComposition<SensorEqeTemporalPhotoSignal, SensorTemporalDarkCurrentCharge>>;
|
|
185
|
+
/**
|
|
186
|
+
* Compose photo, independently evaluated dark and explicitly incremental charge by exact local
|
|
187
|
+
* exposure identity, retaining completeness assessment before capacity/noise.
|
|
188
|
+
*
|
|
189
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
190
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
191
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
192
|
+
* realization or nonlinear full-well clamp.
|
|
193
|
+
* @param input - ComposeSensorPhotoAccumulatedChargeInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
194
|
+
* @returns CalculationResult<SensorPhotoAccumulatedChargeComposition>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
195
|
+
*
|
|
196
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
197
|
+
*/
|
|
198
|
+
export declare function composeSensorAccumulatedCharge(input: ComposeSensorPhotoAccumulatedChargeInput): CalculationResult<SensorPhotoAccumulatedChargeComposition>;
|
|
199
|
+
//# sourceMappingURL=accumulated-charge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accumulated-charge.d.ts","sourceRoot":"","sources":["../../src/sensor/accumulated-charge.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,yCAAyC,CAAC;AAE5F,OAAO,KAAK,EACV,sBAAsB,EAAE,4BAA4B,EACrD,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EACV,4BAA4B,EAAE,uBAAuB,EAAE,+BAA+B,EACvF,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,sCAAsC,EACtC,iCAAiC,EAClC,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,gCAAgC,GACxC,yBAAyB,GACzB,SAAS,GACT,kBAAkB,GAClB,sBAAsB,GACtB,OAAO,CAAC;AAEZ,MAAM,WAAW,qCAAqC;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EACF,gCAAgC,CAAC;IACnC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACX,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EACX,8BAA8B,CAAC;IACjC,sCAAsC,EACpC,MAAM,CAAC;IACT,oCAAoC,EAClC,MAAM,CAAC;IACT,iBAAiB,EACf,oEAAoE,CAAC;IACvE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EACd,sCAAsC,CAAC;IACzC,WAAW,EACT,iCAAiC,CAAC;IACpC,QAAQ,EACN,SAAS,kBAAkB,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,0CAA0C;IACzD,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACX,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EACX,8BAA8B,CAAC;IACjC,sCAAsC,EACpC,MAAM,CAAC;IACT,oCAAoC,EAClC,MAAM,CAAC;IACT,oBAAoB,EAAE,MAAM,CAAC;IAC7B,8BAA8B,EAC5B,SAAS,MAAM,EAAE,CAAC;IACpB,eAAe,EACb,yDAAyD,CAAC;IAC5D,gBAAgB,EACd,sCAAsC,CAAC;IACzC,QAAQ,EACN,SAAS,kBAAkB,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mCAAmC,CAClD,KAAK,SAAS,sBAAsB,GAAG,4BAA4B,EACnE,IAAI,SAAS,4BAA4B,GAAG,uBAAuB;IAEnE,WAAW,EACT,KAAK,CAAC;IACR,UAAU,EACR,IAAI,CAAC;IACP,0BAA0B,CAAC,EACzB,SAAS,qCAAqC,EAAE,CAAC;IACnD,mBAAmB,EACjB,0CAA0C,CAAC;CAC9C;AAED,MAAM,MAAM,wCAAwC,GAAG,mCAAmC,CAAC,sBAAsB,EAAE,4BAA4B,CAAC,CAAC;AAEjJ,MAAM,WAAW,kCAAkC,CACjD,KAAK,SAAS,sBAAsB,GAAG,4BAA4B,EACnE,IAAI,SAAS,4BAA4B,GAAG,uBAAuB;IAEnE,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACX,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EACX,8BAA8B,CAAC;IACjC,sCAAsC,EACpC,MAAM,CAAC;IACT,oCAAoC,EAClC,MAAM,CAAC;IACT,4BAA4B,EAC1B,MAAM,CAAC;IACT,0BAA0B,EACxB,MAAM,CAAC;IACT,yBAAyB,EACvB,MAAM,CAAC;IACT,+BAA+B,EAC7B,MAAM,CAAC;IACT,gCAAgC,EAC9B,MAAM,CAAC;IACT,oBAAoB,EAClB,SAAS;QACP,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EACF,gCAAgC,CAAC;QACnC,qBAAqB,EAAE,MAAM,CAAC;QAC9B,gBAAgB,EACd,sCAAsC,CAAC;QACzC,WAAW,EACT,iCAAiC,CAAC;QACpC,QAAQ,EACN,SAAS,kBAAkB,EAAE,CAAC;KACjC,EAAE,CAAC;IACN,6BAA6B,EAC3B,mDAAmD,CAAC;IACtD,4BAA4B,EAC1B,sCAAsC,CAAC;IACzC,6BAA6B,EAAE,IAAI,CAAC;IACpC,oBAAoB,EAAE,KAAK,CAAC;IAC5B,mBAAmB,EAAE,IAAI,CAAC;IAC1B,kBAAkB,EAAE,IAAI,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,oBAAoB,EAAE,KAAK,CAAC;IAC5B,qBAAqB,EAAE,KAAK,CAAC;IAC7B,gBAAgB,EAAE,KAAK,CAAC;IACxB,oCAAoC,EAClC,IAAI,CAAC;IACP,oCAAoC,EAClC,KAAK,CAAC;IACR,kBAAkB,EAAE,KAAK,CAAC;IAC1B,eAAe,EAAE,KAAK,CAAC;IACvB,sBAAsB,EAAE,KAAK,CAAC;IAC9B,oBAAoB,EAAE,KAAK,CAAC;IAC5B,iBAAiB,EAAE;QACjB,YAAY,EACV,SAAS,kBAAkB,EAAE,CAAC;QAChC,WAAW,EACT,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC7B,WAAW,EACT,IAAI,CAAC,mBAAmB,CAAC,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,MAAM,uCAAuC,GAAG,kCAAkC,CAAC,sBAAsB,EAAE,4BAA4B,CAAC,CAAC;AA8M/I;;;;;;;;;;;;GAYG;AACH,wBAAgB,0CAA0C,CACxD,KAAK,EAAE,OAAO,GACb,qCAAqC,CAiHvC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,+CAA+C,CAC7D,KAAK,EAAE,OAAO,GACb,0CAA0C,CAkI5C;AAyID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,IAAI,CAAC,mCAAmC,EAAE,aAAa,GAAG,YAAY,CAAC,GAAG;IAC/E,WAAW,EAAE,4BAA4B,CAAC;IAAC,UAAU,EAAE,uBAAuB,CAAC;CAChF,GACA,iBAAiB,CAAC,kCAAkC,CAAC,CAAC;AACzD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,IAAI,CAAC,mCAAmC,EAAE,aAAa,GAAG,YAAY,CAAC,GAAG;IAC/E,WAAW,EAAE,4BAA4B,CAAC;IAAC,UAAU,EAAE,+BAA+B,CAAC;CACxF,GACA,iBAAiB,CAAC,kCAAkC,CAAC,4BAA4B,EAAE,+BAA+B,CAAC,CAAC,CAAC;AACxH;;;;;;;;;;;;GAYG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,wCAAwC,GAC9C,iBAAiB,CAAC,uCAAuC,CAAC,CAAC"}
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Module boundary and integration notes.
|
|
4
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
5
|
+
* missing required fields and incompatible scientific data fail at this boundary. Photo, dark and
|
|
6
|
+
* explicitly incremental stored-electron components must share the exact site/channel/local shutter
|
|
7
|
+
* event. Completeness is an evidence-backed declaration, not the consequence of an empty component
|
|
8
|
+
* array. Expected stored charge remains distinct from a stochastic realization or nonlinear full-well
|
|
9
|
+
* clamp.
|
|
10
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
11
|
+
* missing required fields and incompatible scientific data fail at this boundary. Photo, dark and
|
|
12
|
+
* explicitly incremental stored-electron components must share the exact site/channel/local shutter
|
|
13
|
+
* event. Completeness is an evidence-backed declaration, not the consequence of an empty component
|
|
14
|
+
* array. Expected stored charge remains distinct from a stochastic realization or nonlinear full-well
|
|
15
|
+
* clamp.
|
|
16
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
17
|
+
* limits.
|
|
18
|
+
*/
|
|
19
|
+
import { approximationResult, calculatedResult } from "../core/calculation-result.js";
|
|
20
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
21
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
22
|
+
import { parseSensorEqeTemporalPhotoSignal } from "./temporal-photo-signal.js";
|
|
23
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
24
|
+
function addCompensated(state, value) {
|
|
25
|
+
const adjusted = value - state.correction;
|
|
26
|
+
const next = state.sum + adjusted;
|
|
27
|
+
state.correction =
|
|
28
|
+
(next - state.sum) - adjusted;
|
|
29
|
+
state.sum = next;
|
|
30
|
+
}
|
|
31
|
+
function requireRecord(value, path) {
|
|
32
|
+
if (typeof value !== "object" ||
|
|
33
|
+
value === null ||
|
|
34
|
+
Array.isArray(value)) {
|
|
35
|
+
throw new InvalidConfigurationError(path + " must be an object.");
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
function requireNonEmptyString(value, path) {
|
|
40
|
+
if (typeof value !== "string" ||
|
|
41
|
+
value.trim().length === 0) {
|
|
42
|
+
throw new InvalidConfigurationError(path + " must be a non-empty string.");
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
function requireFinite(value, path) {
|
|
47
|
+
if (typeof value !== "number" ||
|
|
48
|
+
!Number.isFinite(value)) {
|
|
49
|
+
throw new InvalidConfigurationError(path + " must be finite.");
|
|
50
|
+
}
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
53
|
+
function requireNonNegativeFinite(value, path) {
|
|
54
|
+
const parsed = requireFinite(value, path);
|
|
55
|
+
if (parsed < 0) {
|
|
56
|
+
throw new InvalidConfigurationError(path +
|
|
57
|
+
" must be greater than or equal to zero.");
|
|
58
|
+
}
|
|
59
|
+
return parsed;
|
|
60
|
+
}
|
|
61
|
+
function requireSiteIndex(value, path) {
|
|
62
|
+
if (typeof value !== "number" ||
|
|
63
|
+
!Number.isSafeInteger(value) ||
|
|
64
|
+
value < 0) {
|
|
65
|
+
throw new InvalidConfigurationError(path +
|
|
66
|
+
" must be a non-negative safe integer.");
|
|
67
|
+
}
|
|
68
|
+
return value;
|
|
69
|
+
}
|
|
70
|
+
function parseUncertainty(value, path) {
|
|
71
|
+
const record = requireRecord(value, path);
|
|
72
|
+
if (record.kind === "relative") {
|
|
73
|
+
const fraction = requireNonNegativeFinite(record.fraction, path + ".fraction");
|
|
74
|
+
return {
|
|
75
|
+
kind: "relative",
|
|
76
|
+
fraction,
|
|
77
|
+
basis: requireNonEmptyString(record.basis, path + ".basis")
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (record.kind === "not-quantified") {
|
|
81
|
+
return {
|
|
82
|
+
kind: "not-quantified",
|
|
83
|
+
limitation: requireNonEmptyString(record.limitation, path + ".limitation")
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
87
|
+
}
|
|
88
|
+
function parseStatus(value, path) {
|
|
89
|
+
if (value !== "calibrated" &&
|
|
90
|
+
value !== "approximation") {
|
|
91
|
+
throw new InvalidConfigurationError(path + " is invalid.");
|
|
92
|
+
}
|
|
93
|
+
return value;
|
|
94
|
+
}
|
|
95
|
+
function parseWindowIdentity(record, path) {
|
|
96
|
+
if (record.timeReference !==
|
|
97
|
+
"first-opening-boundary-phase") {
|
|
98
|
+
throw new InvalidConfigurationError(path +
|
|
99
|
+
'.timeReference must be "first-opening-boundary-phase".');
|
|
100
|
+
}
|
|
101
|
+
const start = requireFinite(record.startOffsetSecondsFromOpeningReference, path +
|
|
102
|
+
".startOffsetSecondsFromOpeningReference");
|
|
103
|
+
const end = requireFinite(record.endOffsetSecondsFromOpeningReference, path +
|
|
104
|
+
".endOffsetSecondsFromOpeningReference");
|
|
105
|
+
if (!(end > start)) {
|
|
106
|
+
throw new InvalidConfigurationError(path +
|
|
107
|
+
" exposure window end must be greater than start.");
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
bindingId: requireNonEmptyString(record.bindingId, path + ".bindingId"),
|
|
111
|
+
timeReference: "first-opening-boundary-phase",
|
|
112
|
+
start,
|
|
113
|
+
end
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
118
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
119
|
+
*
|
|
120
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
121
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
122
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
123
|
+
* realization or nonlinear full-well clamp.
|
|
124
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
125
|
+
* @returns SensorAdditionalStoredChargeComponent. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
126
|
+
*
|
|
127
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
128
|
+
*/
|
|
129
|
+
export function parseSensorAdditionalStoredChargeComponent(value) {
|
|
130
|
+
const record = requireRecord(value, "sensorAdditionalStoredCharge");
|
|
131
|
+
const kinds = new Set([
|
|
132
|
+
"hot-pixel-defect-excess",
|
|
133
|
+
"leakage",
|
|
134
|
+
"charge-injection",
|
|
135
|
+
"clock-induced-charge",
|
|
136
|
+
"other"
|
|
137
|
+
]);
|
|
138
|
+
if (typeof record.kind !== "string" ||
|
|
139
|
+
!kinds.has(record.kind)) {
|
|
140
|
+
throw new InvalidConfigurationError("sensorAdditionalStoredCharge.kind is invalid.");
|
|
141
|
+
}
|
|
142
|
+
if (record.accountingMeaning !==
|
|
143
|
+
"incremental-stored-electrons-beyond-photo-and-modeled-dark-current") {
|
|
144
|
+
throw new InvalidConfigurationError("sensorAdditionalStoredCharge.accountingMeaning is invalid.");
|
|
145
|
+
}
|
|
146
|
+
const site = requireRecord(record.site, "sensorAdditionalStoredCharge.site");
|
|
147
|
+
const window = parseWindowIdentity(record, "sensorAdditionalStoredCharge");
|
|
148
|
+
const scientificStatus = parseStatus(record.scientificStatus, "sensorAdditionalStoredCharge.scientificStatus");
|
|
149
|
+
const uncertainty = parseUncertainty(record.uncertainty, "sensorAdditionalStoredCharge.uncertainty");
|
|
150
|
+
if (scientificStatus === "calibrated" &&
|
|
151
|
+
uncertainty.kind ===
|
|
152
|
+
"not-quantified") {
|
|
153
|
+
throw new InvalidConfigurationError("A calibrated additional stored-charge component must declare quantified relative uncertainty.");
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
componentId: requireNonEmptyString(record.componentId, "sensorAdditionalStoredCharge.componentId"),
|
|
157
|
+
kind: record.kind,
|
|
158
|
+
colorSamplingProfileId: requireNonEmptyString(record.colorSamplingProfileId, "sensorAdditionalStoredCharge.colorSamplingProfileId"),
|
|
159
|
+
channelId: requireNonEmptyString(record.channelId, "sensorAdditionalStoredCharge.channelId"),
|
|
160
|
+
site: {
|
|
161
|
+
x: requireSiteIndex(site.x, "sensorAdditionalStoredCharge.site.x"),
|
|
162
|
+
y: requireSiteIndex(site.y, "sensorAdditionalStoredCharge.site.y")
|
|
163
|
+
},
|
|
164
|
+
bindingId: window.bindingId,
|
|
165
|
+
timeReference: window.timeReference,
|
|
166
|
+
startOffsetSecondsFromOpeningReference: window.start,
|
|
167
|
+
endOffsetSecondsFromOpeningReference: window.end,
|
|
168
|
+
accountingMeaning: "incremental-stored-electrons-beyond-photo-and-modeled-dark-current",
|
|
169
|
+
expectedElectronCount: requireNonNegativeFinite(record.expectedElectronCount, "sensorAdditionalStoredCharge.expectedElectronCount"),
|
|
170
|
+
scientificStatus,
|
|
171
|
+
uncertainty,
|
|
172
|
+
evidence: parseEvidenceList(record.evidence, "sensorAdditionalStoredCharge.evidence")
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
177
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
178
|
+
*
|
|
179
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
180
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
181
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
182
|
+
* realization or nonlinear full-well clamp.
|
|
183
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
184
|
+
* @returns SensorAccumulatedChargeCompletenessProfile. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
185
|
+
*
|
|
186
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
187
|
+
*/
|
|
188
|
+
export function parseSensorAccumulatedChargeCompletenessProfile(value) {
|
|
189
|
+
const record = requireRecord(value, "sensorAccumulatedChargeCompleteness");
|
|
190
|
+
if (record.schemaVersion !== "0.1.0") {
|
|
191
|
+
throw new InvalidConfigurationError('sensorAccumulatedChargeCompleteness.schemaVersion must be "0.1.0".');
|
|
192
|
+
}
|
|
193
|
+
if (record.coverageMeaning !==
|
|
194
|
+
"all-material-stored-electron-contributors-accounted-for") {
|
|
195
|
+
throw new InvalidConfigurationError("sensorAccumulatedChargeCompleteness.coverageMeaning is invalid.");
|
|
196
|
+
}
|
|
197
|
+
const site = requireRecord(record.site, "sensorAccumulatedChargeCompleteness.site");
|
|
198
|
+
const window = parseWindowIdentity(record, "sensorAccumulatedChargeCompleteness");
|
|
199
|
+
const scientificStatus = parseStatus(record.scientificStatus, "sensorAccumulatedChargeCompleteness.scientificStatus");
|
|
200
|
+
const limitation = record.limitation === undefined
|
|
201
|
+
? undefined
|
|
202
|
+
: requireNonEmptyString(record.limitation, "sensorAccumulatedChargeCompleteness.limitation");
|
|
203
|
+
if (scientificStatus === "approximation" &&
|
|
204
|
+
limitation === undefined) {
|
|
205
|
+
throw new InvalidConfigurationError("sensorAccumulatedChargeCompleteness.limitation is required for an approximation.");
|
|
206
|
+
}
|
|
207
|
+
if (!Array.isArray(record.includedAdditionalComponentIds)) {
|
|
208
|
+
throw new InvalidConfigurationError("sensorAccumulatedChargeCompleteness.includedAdditionalComponentIds must be an array.");
|
|
209
|
+
}
|
|
210
|
+
const ids = record.includedAdditionalComponentIds.map((entry, index) => requireNonEmptyString(entry, "sensorAccumulatedChargeCompleteness.includedAdditionalComponentIds[" +
|
|
211
|
+
index +
|
|
212
|
+
"]"));
|
|
213
|
+
if (new Set(ids).size !== ids.length) {
|
|
214
|
+
throw new InvalidConfigurationError("sensorAccumulatedChargeCompleteness.includedAdditionalComponentIds must not contain duplicates.");
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
schemaVersion: "0.1.0",
|
|
218
|
+
profileId: requireNonEmptyString(record.profileId, "sensorAccumulatedChargeCompleteness.profileId"),
|
|
219
|
+
colorSamplingProfileId: requireNonEmptyString(record.colorSamplingProfileId, "sensorAccumulatedChargeCompleteness.colorSamplingProfileId"),
|
|
220
|
+
channelId: requireNonEmptyString(record.channelId, "sensorAccumulatedChargeCompleteness.channelId"),
|
|
221
|
+
site: {
|
|
222
|
+
x: requireSiteIndex(site.x, "sensorAccumulatedChargeCompleteness.site.x"),
|
|
223
|
+
y: requireSiteIndex(site.y, "sensorAccumulatedChargeCompleteness.site.y")
|
|
224
|
+
},
|
|
225
|
+
bindingId: window.bindingId,
|
|
226
|
+
timeReference: window.timeReference,
|
|
227
|
+
startOffsetSecondsFromOpeningReference: window.start,
|
|
228
|
+
endOffsetSecondsFromOpeningReference: window.end,
|
|
229
|
+
darkCurrentProfileId: requireNonEmptyString(record.darkCurrentProfileId, "sensorAccumulatedChargeCompleteness.darkCurrentProfileId"),
|
|
230
|
+
includedAdditionalComponentIds: [...ids].sort(),
|
|
231
|
+
coverageMeaning: "all-material-stored-electron-contributors-accounted-for",
|
|
232
|
+
scientificStatus,
|
|
233
|
+
evidence: parseEvidenceList(record.evidence, "sensorAccumulatedChargeCompleteness.evidence"),
|
|
234
|
+
...(limitation === undefined
|
|
235
|
+
? {}
|
|
236
|
+
: { limitation })
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function sameSite(a, b) {
|
|
240
|
+
return a.x === b.x && a.y === b.y;
|
|
241
|
+
}
|
|
242
|
+
function sameWindow(startA, endA, startB, endB) {
|
|
243
|
+
return (startA === startB &&
|
|
244
|
+
endA === endB);
|
|
245
|
+
}
|
|
246
|
+
function validatePhoto(photo) {
|
|
247
|
+
if (photo.kind === "eqe-temporal-photo-signal")
|
|
248
|
+
parseSensorEqeTemporalPhotoSignal(photo);
|
|
249
|
+
if ((photo.kind !== "eqe-expected-counts" && photo.kind !== "eqe-temporal-photo-signal") ||
|
|
250
|
+
photo.temporalIntegrationApplied !==
|
|
251
|
+
true ||
|
|
252
|
+
photo.accumulatedSignalCompleteness !==
|
|
253
|
+
"photo-signal-only" ||
|
|
254
|
+
photo.darkChargeIncluded !== false ||
|
|
255
|
+
photo.otherChargeIncluded !== false ||
|
|
256
|
+
photo
|
|
257
|
+
.physicalFullWellAssessmentAuthorized !==
|
|
258
|
+
false) {
|
|
259
|
+
throw new InvalidScientificInputError("Charge composition requires an unmodified photo-signal-only EQE exposure result.");
|
|
260
|
+
}
|
|
261
|
+
if (!Number.isFinite(photo
|
|
262
|
+
.expectedGeneratedElectronCount) ||
|
|
263
|
+
photo
|
|
264
|
+
.expectedGeneratedElectronCount < 0) {
|
|
265
|
+
throw new InvalidScientificInputError("Photo expected electron count must be finite and nonnegative.");
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function validateDarkBinding(photo, dark) {
|
|
269
|
+
if (dark.colorSamplingProfileId !==
|
|
270
|
+
photo.colorSamplingProfileId ||
|
|
271
|
+
dark.channelId !==
|
|
272
|
+
photo.channelId ||
|
|
273
|
+
!sameSite(dark.site, photo.site) ||
|
|
274
|
+
dark.bindingId !==
|
|
275
|
+
photo.bindingId ||
|
|
276
|
+
(photo.kind === "eqe-temporal-photo-signal"
|
|
277
|
+
? dark.stationarityProfileId !== undefined || dark.temporalIntegrationId !== photo.temporalIntegrationId
|
|
278
|
+
: dark.temporalIntegrationId !== undefined || dark.stationarityProfileId !== photo.stationarityProfileId) ||
|
|
279
|
+
dark.timeReference !==
|
|
280
|
+
photo.timeReference ||
|
|
281
|
+
!sameWindow(dark.startOffsetSecondsFromOpeningReference, dark.endOffsetSecondsFromOpeningReference, photo.startOffsetSecondsFromOpeningReference, photo.endOffsetSecondsFromOpeningReference) ||
|
|
282
|
+
dark.localExposureDurationSeconds !==
|
|
283
|
+
photo.localExposureDurationSeconds ||
|
|
284
|
+
dark.photoSignalIncluded !== false ||
|
|
285
|
+
dark.otherChargeIncluded !== false ||
|
|
286
|
+
dark
|
|
287
|
+
.physicalFullWellAssessmentAuthorized !==
|
|
288
|
+
false) {
|
|
289
|
+
throw new InvalidScientificInputError("Dark charge must bind to the exact same uncombined EQE local exposure event.");
|
|
290
|
+
}
|
|
291
|
+
if (!Number.isFinite(dark.expectedDarkElectronCount) ||
|
|
292
|
+
dark.expectedDarkElectronCount < 0) {
|
|
293
|
+
throw new InvalidScientificInputError("Dark expected electron count must be finite and nonnegative.");
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
function validateComponentBinding(component, photo) {
|
|
297
|
+
if (component.colorSamplingProfileId !==
|
|
298
|
+
photo.colorSamplingProfileId ||
|
|
299
|
+
component.channelId !==
|
|
300
|
+
photo.channelId ||
|
|
301
|
+
!sameSite(component.site, photo.site) ||
|
|
302
|
+
component.bindingId !==
|
|
303
|
+
photo.bindingId ||
|
|
304
|
+
component.timeReference !==
|
|
305
|
+
photo.timeReference ||
|
|
306
|
+
!sameWindow(component.startOffsetSecondsFromOpeningReference, component.endOffsetSecondsFromOpeningReference, photo.startOffsetSecondsFromOpeningReference, photo.endOffsetSecondsFromOpeningReference)) {
|
|
307
|
+
throw new InvalidScientificInputError("Additional stored-charge component must bind to the exact same local exposure event.");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Compose photo, independently evaluated dark and explicitly incremental charge by exact local
|
|
312
|
+
* exposure identity, retaining completeness assessment before capacity/noise.
|
|
313
|
+
*
|
|
314
|
+
* Photo, dark and explicitly incremental stored-electron components must share the exact
|
|
315
|
+
* site/channel/local shutter event. Completeness is an evidence-backed declaration, not the
|
|
316
|
+
* consequence of an empty component array. Expected stored charge remains distinct from a stochastic
|
|
317
|
+
* realization or nonlinear full-well clamp.
|
|
318
|
+
* @param input - ComposeSensorPhotoAccumulatedChargeInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
319
|
+
* @returns CalculationResult<SensorPhotoAccumulatedChargeComposition>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
320
|
+
*
|
|
321
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
322
|
+
*/
|
|
323
|
+
export function composeSensorAccumulatedCharge(input) {
|
|
324
|
+
validatePhoto(input.photoSignal);
|
|
325
|
+
validateDarkBinding(input.photoSignal, input.darkCharge);
|
|
326
|
+
const profile = parseSensorAccumulatedChargeCompletenessProfile(input.completenessProfile);
|
|
327
|
+
const components = (input.additionalChargeComponents ??
|
|
328
|
+
[]).map(parseSensorAdditionalStoredChargeComponent);
|
|
329
|
+
if (profile.colorSamplingProfileId !==
|
|
330
|
+
input.photoSignal
|
|
331
|
+
.colorSamplingProfileId ||
|
|
332
|
+
profile.channelId !==
|
|
333
|
+
input.photoSignal.channelId ||
|
|
334
|
+
!sameSite(profile.site, input.photoSignal.site) ||
|
|
335
|
+
profile.bindingId !==
|
|
336
|
+
input.photoSignal.bindingId ||
|
|
337
|
+
profile.timeReference !==
|
|
338
|
+
input.photoSignal.timeReference ||
|
|
339
|
+
!sameWindow(profile.startOffsetSecondsFromOpeningReference, profile.endOffsetSecondsFromOpeningReference, input.photoSignal.startOffsetSecondsFromOpeningReference, input.photoSignal.endOffsetSecondsFromOpeningReference) ||
|
|
340
|
+
profile.darkCurrentProfileId !==
|
|
341
|
+
input.darkCharge
|
|
342
|
+
.darkCurrentProfileId) {
|
|
343
|
+
throw new InvalidScientificInputError("Charge-completeness profile must bind to the exact photo/dark exposure pipeline.");
|
|
344
|
+
}
|
|
345
|
+
const seen = new Set();
|
|
346
|
+
for (const component of components) {
|
|
347
|
+
validateComponentBinding(component, input.photoSignal);
|
|
348
|
+
if (seen.has(component.componentId)) {
|
|
349
|
+
throw new InvalidScientificInputError("Additional stored-charge component IDs must be unique.");
|
|
350
|
+
}
|
|
351
|
+
seen.add(component.componentId);
|
|
352
|
+
}
|
|
353
|
+
const actualIds = [...seen].sort();
|
|
354
|
+
if (JSON.stringify(actualIds) !==
|
|
355
|
+
JSON.stringify(profile
|
|
356
|
+
.includedAdditionalComponentIds)) {
|
|
357
|
+
throw new InvalidScientificInputError("Charge-completeness profile additional component IDs must exactly match the supplied components.");
|
|
358
|
+
}
|
|
359
|
+
const sum = {
|
|
360
|
+
sum: 0,
|
|
361
|
+
correction: 0
|
|
362
|
+
};
|
|
363
|
+
addCompensated(sum, input.photoSignal
|
|
364
|
+
.expectedGeneratedElectronCount);
|
|
365
|
+
addCompensated(sum, input.darkCharge
|
|
366
|
+
.expectedDarkElectronCount);
|
|
367
|
+
let additionalTotal = 0;
|
|
368
|
+
for (const component of components) {
|
|
369
|
+
additionalTotal +=
|
|
370
|
+
component.expectedElectronCount;
|
|
371
|
+
addCompensated(sum, component.expectedElectronCount);
|
|
372
|
+
}
|
|
373
|
+
if (!Number.isFinite(additionalTotal) ||
|
|
374
|
+
!Number.isFinite(sum.sum) ||
|
|
375
|
+
sum.sum < 0) {
|
|
376
|
+
throw new InvalidScientificInputError("Accumulated stored-electron totals must remain finite and nonnegative.");
|
|
377
|
+
}
|
|
378
|
+
const result = {
|
|
379
|
+
completenessProfileId: profile.profileId,
|
|
380
|
+
colorSamplingProfileId: input.photoSignal
|
|
381
|
+
.colorSamplingProfileId,
|
|
382
|
+
channelId: input.photoSignal.channelId,
|
|
383
|
+
site: {
|
|
384
|
+
...input.photoSignal.site
|
|
385
|
+
},
|
|
386
|
+
bindingId: input.photoSignal.bindingId,
|
|
387
|
+
timeReference: input.photoSignal.timeReference,
|
|
388
|
+
startOffsetSecondsFromOpeningReference: input.photoSignal
|
|
389
|
+
.startOffsetSecondsFromOpeningReference,
|
|
390
|
+
endOffsetSecondsFromOpeningReference: input.photoSignal
|
|
391
|
+
.endOffsetSecondsFromOpeningReference,
|
|
392
|
+
localExposureDurationSeconds: input.photoSignal
|
|
393
|
+
.localExposureDurationSeconds,
|
|
394
|
+
photoExpectedElectronCount: input.photoSignal
|
|
395
|
+
.expectedGeneratedElectronCount,
|
|
396
|
+
darkExpectedElectronCount: input.darkCharge
|
|
397
|
+
.expectedDarkElectronCount,
|
|
398
|
+
additionalExpectedElectronCount: additionalTotal,
|
|
399
|
+
totalExpectedStoredElectronCount: sum.sum,
|
|
400
|
+
additionalComponents: components.map((component) => ({
|
|
401
|
+
componentId: component.componentId,
|
|
402
|
+
kind: component.kind,
|
|
403
|
+
expectedElectronCount: component.expectedElectronCount,
|
|
404
|
+
scientificStatus: component.scientificStatus,
|
|
405
|
+
uncertainty: component.uncertainty,
|
|
406
|
+
evidence: component.evidence
|
|
407
|
+
})),
|
|
408
|
+
accumulatedChargeCompleteness: "complete-for-physical-storage-capacity-assessment",
|
|
409
|
+
completenessScientificStatus: profile.scientificStatus,
|
|
410
|
+
allCountsAreExpectationValues: true,
|
|
411
|
+
integerChargeSampled: false,
|
|
412
|
+
photoSignalIncluded: true,
|
|
413
|
+
darkChargeIncluded: true,
|
|
414
|
+
otherChargeIncluded: components.length > 0,
|
|
415
|
+
darkShotNoiseApplied: false,
|
|
416
|
+
photoShotNoiseApplied: false,
|
|
417
|
+
readNoiseApplied: false,
|
|
418
|
+
physicalFullWellAssessmentAuthorized: true,
|
|
419
|
+
cameraSaturationAssessmentAuthorized: false,
|
|
420
|
+
saturationAssessed: false,
|
|
421
|
+
bloomingModeled: false,
|
|
422
|
+
adcQuantizationApplied: false,
|
|
423
|
+
rawCodeValueProduced: false,
|
|
424
|
+
componentEvidence: {
|
|
425
|
+
completeness: profile.evidence,
|
|
426
|
+
photoSignal: input.photoSignal
|
|
427
|
+
.componentEvidence,
|
|
428
|
+
darkCurrent: input.darkCharge
|
|
429
|
+
.componentEvidence
|
|
430
|
+
}
|
|
431
|
+
};
|
|
432
|
+
const assumptions = [
|
|
433
|
+
"Stored-electron accounting is bound to one exact EQE local exposure event; equal duration alone is insufficient.",
|
|
434
|
+
"Photo-signal expected electrons and thermally generated dark electrons are separate terms.",
|
|
435
|
+
"Every additional component must declare itself incremental beyond both modeled photo signal and modeled dark current to avoid silent double counting.",
|
|
436
|
+
"The completeness profile is an evidence-backed scientific assertion that all material stored-electron contributors for physical charge-capacity assessment are accounted for; it is not inferred from an empty additional-component list.",
|
|
437
|
+
"All values remain expectation counts. Photo/dark shot noise, read noise and stochastic integer sampling are not applied.",
|
|
438
|
+
"Physical full-well assessment becomes structurally authorized, but no saturation or blooming behavior is calculated by this composition.",
|
|
439
|
+
"Camera/digital saturation remains a separate response-chain property and is not authorized by physical charge completeness.",
|
|
440
|
+
"A/W current/charge results remain outside this stored-electron composition until a separate carrier/storage mapping exists."
|
|
441
|
+
];
|
|
442
|
+
return profile.scientificStatus ===
|
|
443
|
+
"calibrated"
|
|
444
|
+
? calculatedResult(result, "sensor-accumulated-charge-composition", input.photoSignal.kind === "eqe-temporal-photo-signal" ? "1.1.0" : "1.0.0", assumptions)
|
|
445
|
+
: approximationResult(result, "sensor-accumulated-charge-composition", input.photoSignal.kind === "eqe-temporal-photo-signal" ? "1.1.0" : "1.0.0", [
|
|
446
|
+
...assumptions,
|
|
447
|
+
profile.limitation
|
|
448
|
+
]);
|
|
449
|
+
}
|
|
450
|
+
//# sourceMappingURL=accumulated-charge.js.map
|