@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,644 @@
|
|
|
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. A/W response
|
|
6
|
+
* converts per-bin radiant power to quasi-static detector-terminal current magnitude. Electrical
|
|
7
|
+
* bias/load applicability is explicit. This is not EQE, electron rate, transimpedance voltage or RAW;
|
|
8
|
+
* rapidly varying current requires a separate temporal detector-response model.
|
|
9
|
+
* Integrate per-wavelength A/W times radiant-power contributions to steady-state current magnitude
|
|
10
|
+
* with explicit electrical applicability. A/W response converts per-bin radiant power to quasi-static
|
|
11
|
+
* detector-terminal current magnitude. Electrical bias/load applicability is explicit. This is not
|
|
12
|
+
* EQE, electron rate, transimpedance voltage or RAW; rapidly varying current requires a separate
|
|
13
|
+
* temporal detector-response model.
|
|
14
|
+
* @see docs/MOTION_AND_SIGNAL.md for equations, coordinate/unit conventions, blockers and support
|
|
15
|
+
* limits.
|
|
16
|
+
*/
|
|
17
|
+
import { approximationResult } from "../core/calculation-result.js";
|
|
18
|
+
import { InvalidConfigurationError } from "../core/configuration-error.js";
|
|
19
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
20
|
+
import { InvalidScientificInputError } from "../core/validation.js";
|
|
21
|
+
import { parseSensorColorSamplingProfile } from "./color-sampling.js";
|
|
22
|
+
import { createSensorSpectralResponseChannelBinding, parseSensorSpectralResponseProfile, resolveParsedSensorSpectralResponseAtWavelength } from "./spectral-response.js";
|
|
23
|
+
const REDUCTION_TOLERANCE = 1e-10;
|
|
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 requireFiniteNonNegative(value, path) {
|
|
47
|
+
if (typeof value !== "number" ||
|
|
48
|
+
!Number.isFinite(value) ||
|
|
49
|
+
value < 0) {
|
|
50
|
+
throw new InvalidConfigurationError(path +
|
|
51
|
+
" must be finite and greater than or equal to zero.");
|
|
52
|
+
}
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
function requirePositiveFiniteConfiguration(value, path) {
|
|
56
|
+
if (typeof value !== "number" ||
|
|
57
|
+
!Number.isFinite(value) ||
|
|
58
|
+
value <= 0) {
|
|
59
|
+
throw new InvalidConfigurationError(path +
|
|
60
|
+
" must be finite and greater than zero.");
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
function requirePositiveFiniteInput(value, path) {
|
|
65
|
+
if (typeof value !== "number" ||
|
|
66
|
+
!Number.isFinite(value) ||
|
|
67
|
+
value <= 0) {
|
|
68
|
+
throw new InvalidScientificInputError(path +
|
|
69
|
+
" must be finite and greater than zero.");
|
|
70
|
+
}
|
|
71
|
+
return value;
|
|
72
|
+
}
|
|
73
|
+
function requireNonNegativeFiniteInput(value, path) {
|
|
74
|
+
if (typeof value !== "number" ||
|
|
75
|
+
!Number.isFinite(value) ||
|
|
76
|
+
value < 0) {
|
|
77
|
+
throw new InvalidScientificInputError(path +
|
|
78
|
+
" must be finite and greater than or equal to zero.");
|
|
79
|
+
}
|
|
80
|
+
return value;
|
|
81
|
+
}
|
|
82
|
+
function requireSafeNonNegativeInteger(value, path) {
|
|
83
|
+
if (typeof value !== "number" ||
|
|
84
|
+
!Number.isSafeInteger(value) ||
|
|
85
|
+
value < 0) {
|
|
86
|
+
throw new InvalidScientificInputError(path +
|
|
87
|
+
" must be a non-negative safe integer.");
|
|
88
|
+
}
|
|
89
|
+
return value;
|
|
90
|
+
}
|
|
91
|
+
function parseUncertainty(value, path) {
|
|
92
|
+
const record = requireRecord(value, path);
|
|
93
|
+
if (record.kind === "relative") {
|
|
94
|
+
const fraction = requireFiniteNonNegative(record.fraction, path + ".fraction");
|
|
95
|
+
return {
|
|
96
|
+
kind: "relative",
|
|
97
|
+
fraction,
|
|
98
|
+
basis: requireNonEmptyString(record.basis, path + ".basis")
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (record.kind === "not-quantified") {
|
|
102
|
+
return {
|
|
103
|
+
kind: "not-quantified",
|
|
104
|
+
limitation: requireNonEmptyString(record.limitation, path + ".limitation")
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
108
|
+
}
|
|
109
|
+
function parseElectricalConditions(value, path) {
|
|
110
|
+
const record = requireRecord(value, path);
|
|
111
|
+
const bias = requireRecord(record.bias, path + ".bias");
|
|
112
|
+
const readoutLoad = requireRecord(record.readoutLoad, path + ".readoutLoad");
|
|
113
|
+
const parsedBias = bias.kind ===
|
|
114
|
+
"zero-bias-photovoltaic"
|
|
115
|
+
? {
|
|
116
|
+
kind: "zero-bias-photovoltaic"
|
|
117
|
+
}
|
|
118
|
+
: bias.kind ===
|
|
119
|
+
"reverse-biased"
|
|
120
|
+
? {
|
|
121
|
+
kind: "reverse-biased",
|
|
122
|
+
magnitudeVolts: requirePositiveFiniteConfiguration(bias.magnitudeVolts, path +
|
|
123
|
+
".bias.magnitudeVolts")
|
|
124
|
+
}
|
|
125
|
+
: (() => {
|
|
126
|
+
throw new InvalidConfigurationError(path +
|
|
127
|
+
".bias.kind is invalid.");
|
|
128
|
+
})();
|
|
129
|
+
const parsedReadout = readoutLoad.kind ===
|
|
130
|
+
"virtual-ground-current-readout"
|
|
131
|
+
? {
|
|
132
|
+
kind: "virtual-ground-current-readout"
|
|
133
|
+
}
|
|
134
|
+
: readoutLoad.kind ===
|
|
135
|
+
"finite-input-impedance"
|
|
136
|
+
? {
|
|
137
|
+
kind: "finite-input-impedance",
|
|
138
|
+
inputImpedanceOhms: requirePositiveFiniteConfiguration(readoutLoad
|
|
139
|
+
.inputImpedanceOhms, path +
|
|
140
|
+
".readoutLoad.inputImpedanceOhms")
|
|
141
|
+
}
|
|
142
|
+
: (() => {
|
|
143
|
+
throw new InvalidConfigurationError(path +
|
|
144
|
+
".readoutLoad.kind is invalid.");
|
|
145
|
+
})();
|
|
146
|
+
return {
|
|
147
|
+
bias: parsedBias,
|
|
148
|
+
readoutLoad: parsedReadout
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function parseConditionPolicy(value, path) {
|
|
152
|
+
const record = requireRecord(value, path);
|
|
153
|
+
if (record.kind ===
|
|
154
|
+
"exact-match-required") {
|
|
155
|
+
return {
|
|
156
|
+
kind: "exact-match-required"
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (record.kind ===
|
|
160
|
+
"assume-compatible") {
|
|
161
|
+
return {
|
|
162
|
+
kind: "assume-compatible",
|
|
163
|
+
limitation: requireNonEmptyString(record.limitation, path + ".limitation"),
|
|
164
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
throw new InvalidConfigurationError(path + ".kind is invalid.");
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Validate an untrusted declaration and return the normalized typed contract. Unknown enum values,
|
|
171
|
+
* missing required fields and incompatible scientific data fail at this boundary.
|
|
172
|
+
*
|
|
173
|
+
* A/W response converts per-bin radiant power to quasi-static detector-terminal current magnitude.
|
|
174
|
+
* Electrical bias/load applicability is explicit. This is not EQE, electron rate, transimpedance
|
|
175
|
+
* voltage or RAW; rapidly varying current requires a separate temporal detector-response model.
|
|
176
|
+
* @param value - unknown. Treated as untrusted data; static typing alone is not validation.
|
|
177
|
+
* @returns SensorResponsivityElectricalApplicabilityProfile. 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 function parseSensorResponsivityElectricalApplicabilityProfile(value) {
|
|
182
|
+
const record = requireRecord(value, "sensorResponsivityElectricalApplicability");
|
|
183
|
+
if (record.schemaVersion !== "0.1.0") {
|
|
184
|
+
throw new InvalidConfigurationError('sensorResponsivityElectricalApplicability.schemaVersion must be "0.1.0".');
|
|
185
|
+
}
|
|
186
|
+
if (record.outputMeaning !==
|
|
187
|
+
"detector-terminal-photocurrent-magnitude") {
|
|
188
|
+
throw new InvalidConfigurationError("sensorResponsivityElectricalApplicability.outputMeaning is invalid.");
|
|
189
|
+
}
|
|
190
|
+
if (record.scientificStatus !==
|
|
191
|
+
"calibrated" &&
|
|
192
|
+
record.scientificStatus !==
|
|
193
|
+
"approximation") {
|
|
194
|
+
throw new InvalidConfigurationError("sensorResponsivityElectricalApplicability.scientificStatus is invalid.");
|
|
195
|
+
}
|
|
196
|
+
const uncertainty = parseUncertainty(record.uncertainty, "sensorResponsivityElectricalApplicability.uncertainty");
|
|
197
|
+
if (record.scientificStatus ===
|
|
198
|
+
"calibrated" &&
|
|
199
|
+
uncertainty.kind ===
|
|
200
|
+
"not-quantified") {
|
|
201
|
+
throw new InvalidConfigurationError("A calibrated electrical applicability profile must declare quantified relative uncertainty.");
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
schemaVersion: "0.1.0",
|
|
205
|
+
profileId: requireNonEmptyString(record.profileId, "sensorResponsivityElectricalApplicability.profileId"),
|
|
206
|
+
responseApplicationProfileId: requireNonEmptyString(record
|
|
207
|
+
.responseApplicationProfileId, "sensorResponsivityElectricalApplicability.responseApplicationProfileId"),
|
|
208
|
+
spectralResponseProfileId: requireNonEmptyString(record
|
|
209
|
+
.spectralResponseProfileId, "sensorResponsivityElectricalApplicability.spectralResponseProfileId"),
|
|
210
|
+
colorSamplingProfileId: requireNonEmptyString(record.colorSamplingProfileId, "sensorResponsivityElectricalApplicability.colorSamplingProfileId"),
|
|
211
|
+
channelId: requireNonEmptyString(record.channelId, "sensorResponsivityElectricalApplicability.channelId"),
|
|
212
|
+
outputMeaning: "detector-terminal-photocurrent-magnitude",
|
|
213
|
+
referenceConditions: parseElectricalConditions(record.referenceConditions, "sensorResponsivityElectricalApplicability.referenceConditions"),
|
|
214
|
+
conditionPolicy: parseConditionPolicy(record.conditionPolicy, "sensorResponsivityElectricalApplicability.conditionPolicy"),
|
|
215
|
+
scientificStatus: record.scientificStatus,
|
|
216
|
+
uncertainty,
|
|
217
|
+
evidence: parseEvidenceList(record.evidence, "sensorResponsivityElectricalApplicability.evidence")
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
function canonicalJson(value) {
|
|
221
|
+
return JSON.stringify(value);
|
|
222
|
+
}
|
|
223
|
+
function approximatelyEqual(actual, expected) {
|
|
224
|
+
const scale = Math.max(1, Math.abs(actual), Math.abs(expected));
|
|
225
|
+
return (Math.abs(actual - expected) <=
|
|
226
|
+
REDUCTION_TOLERANCE * scale);
|
|
227
|
+
}
|
|
228
|
+
function electricalConditionsMatch(reference, operating) {
|
|
229
|
+
return (canonicalJson(reference) ===
|
|
230
|
+
canonicalJson(operating));
|
|
231
|
+
}
|
|
232
|
+
function validateAuthorizationChain(reduction, compatibility, operatingRange) {
|
|
233
|
+
if (reduction.outputMeaning !==
|
|
234
|
+
"pre-response-spatio-spectral-radiometric-reduction" ||
|
|
235
|
+
reduction
|
|
236
|
+
.spectralResponseApplicationPerformed !==
|
|
237
|
+
false ||
|
|
238
|
+
reduction
|
|
239
|
+
.spectralResponsivityApplied !==
|
|
240
|
+
false ||
|
|
241
|
+
reduction.temporalIntegrationApplied !==
|
|
242
|
+
false) {
|
|
243
|
+
throw new InvalidScientificInputError("reduction must remain pre-response and pre-temporal before A/W photocurrent conversion.");
|
|
244
|
+
}
|
|
245
|
+
if (!compatibility
|
|
246
|
+
.structuralCompatibilityEstablished ||
|
|
247
|
+
compatibility.compatibilityStatus ===
|
|
248
|
+
"blocked" ||
|
|
249
|
+
compatibility.blockers.length !== 0 ||
|
|
250
|
+
!compatibility.sourcePlaneMatched ||
|
|
251
|
+
compatibility.requiredSignalPath !==
|
|
252
|
+
"radiant-power-to-current") {
|
|
253
|
+
throw new InvalidScientificInputError("compatibility must establish a non-blocked radiant-power-to-current response path.");
|
|
254
|
+
}
|
|
255
|
+
if (compatibility
|
|
256
|
+
.spectralResponseProfileId !==
|
|
257
|
+
reduction.responseProfileId ||
|
|
258
|
+
compatibility.colorSamplingProfileId !==
|
|
259
|
+
reduction.colorSamplingProfileId ||
|
|
260
|
+
compatibility.channelId !==
|
|
261
|
+
reduction.channelId ||
|
|
262
|
+
compatibility.responseScope !==
|
|
263
|
+
reduction.responseScope) {
|
|
264
|
+
throw new InvalidScientificInputError("compatibility identities must exactly match the reduction.");
|
|
265
|
+
}
|
|
266
|
+
if (!operatingRange
|
|
267
|
+
.operatingRangeCompatibilityAssessed ||
|
|
268
|
+
!operatingRange
|
|
269
|
+
.instantaneousResponseRangeCompatible ||
|
|
270
|
+
!operatingRange
|
|
271
|
+
.responseRateConversionAuthorized ||
|
|
272
|
+
operatingRange.status === "blocked" ||
|
|
273
|
+
operatingRange.blockers.length !== 0 ||
|
|
274
|
+
operatingRange.requiredSignalPath !==
|
|
275
|
+
"radiant-power-to-current" ||
|
|
276
|
+
operatingRange
|
|
277
|
+
.responseApplicationPerformed !==
|
|
278
|
+
false ||
|
|
279
|
+
operatingRange
|
|
280
|
+
.currentConversionPerformed !== false ||
|
|
281
|
+
operatingRange
|
|
282
|
+
.temporalIntegrationAuthorized !== false ||
|
|
283
|
+
!operatingRange
|
|
284
|
+
.spectralNodeRangeCompatibilityAssessed ||
|
|
285
|
+
operatingRange
|
|
286
|
+
.spectralInputModel.kind !==
|
|
287
|
+
"per-spectral-bin" ||
|
|
288
|
+
operatingRange
|
|
289
|
+
.spatialLinearityModel.kind !==
|
|
290
|
+
"linear-superposition-over-geometric-aperture") {
|
|
291
|
+
throw new InvalidScientificInputError("operatingRange must authorize a clean per-bin radiant-power-to-current path.");
|
|
292
|
+
}
|
|
293
|
+
if (operatingRange
|
|
294
|
+
.spectralResponseProfileId !==
|
|
295
|
+
reduction.responseProfileId ||
|
|
296
|
+
operatingRange
|
|
297
|
+
.colorSamplingProfileId !==
|
|
298
|
+
reduction.colorSamplingProfileId ||
|
|
299
|
+
operatingRange.channelId !==
|
|
300
|
+
reduction.channelId ||
|
|
301
|
+
operatingRange
|
|
302
|
+
.responseApplicationProfileId !==
|
|
303
|
+
compatibility.applicationProfileId) {
|
|
304
|
+
throw new InvalidScientificInputError("operatingRange identities must exactly match the reduction and compatibility assessment.");
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
function validateReductionNodes(reduction) {
|
|
308
|
+
if (!Array.isArray(reduction.perWavelength) ||
|
|
309
|
+
!Number.isSafeInteger(reduction.spectralNodeCount) ||
|
|
310
|
+
reduction.spectralNodeCount <= 0 ||
|
|
311
|
+
reduction.perWavelength.length !==
|
|
312
|
+
reduction.spectralNodeCount) {
|
|
313
|
+
throw new InvalidScientificInputError("reduction.perWavelength must contain exactly spectralNodeCount entries.");
|
|
314
|
+
}
|
|
315
|
+
let priorWavelength = Number.NEGATIVE_INFINITY;
|
|
316
|
+
let normalizedWeightSum = 0;
|
|
317
|
+
const totalPower = {
|
|
318
|
+
sum: 0,
|
|
319
|
+
correction: 0
|
|
320
|
+
};
|
|
321
|
+
reduction.perWavelength.forEach((node, arrayIndex) => {
|
|
322
|
+
const sampleIndex = requireSafeNonNegativeInteger(node.spectralSampleIndex, "reduction.perWavelength[" +
|
|
323
|
+
arrayIndex +
|
|
324
|
+
"].spectralSampleIndex");
|
|
325
|
+
if (sampleIndex !== arrayIndex) {
|
|
326
|
+
throw new InvalidScientificInputError("reduction spectralSampleIndex values must form the exact contiguous range 0..spectralNodeCount-1.");
|
|
327
|
+
}
|
|
328
|
+
const wavelength = requirePositiveFiniteInput(node.wavelengthNanometers, "reduction.perWavelength[" +
|
|
329
|
+
arrayIndex +
|
|
330
|
+
"].wavelengthNanometers");
|
|
331
|
+
if (wavelength <= priorWavelength) {
|
|
332
|
+
throw new InvalidScientificInputError("reduction wavelength nodes must be strictly increasing.");
|
|
333
|
+
}
|
|
334
|
+
priorWavelength = wavelength;
|
|
335
|
+
const measure = requirePositiveFiniteInput(node.wavelengthMeasureNanometers, "reduction.perWavelength[" +
|
|
336
|
+
arrayIndex +
|
|
337
|
+
"].wavelengthMeasureNanometers");
|
|
338
|
+
const normalizedWeight = requirePositiveFiniteInput(node.normalizedWavelengthWeight, "reduction.perWavelength[" +
|
|
339
|
+
arrayIndex +
|
|
340
|
+
"].normalizedWavelengthWeight");
|
|
341
|
+
const fluxDensity = requireNonNegativeFiniteInput(node
|
|
342
|
+
.geometricApertureIncidentSpectralFluxWattsPerNanometer, "reduction.perWavelength[" +
|
|
343
|
+
arrayIndex +
|
|
344
|
+
"].geometricApertureIncidentSpectralFluxWattsPerNanometer");
|
|
345
|
+
const power = requireNonNegativeFiniteInput(node
|
|
346
|
+
.wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts, "reduction.perWavelength[" +
|
|
347
|
+
arrayIndex +
|
|
348
|
+
"].wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts");
|
|
349
|
+
const expected = fluxDensity * measure;
|
|
350
|
+
if (!Number.isFinite(expected) ||
|
|
351
|
+
!approximatelyEqual(power, expected)) {
|
|
352
|
+
throw new InvalidScientificInputError("reduction per-wavelength radiant-power contribution must equal spectral flux density × d-lambda.");
|
|
353
|
+
}
|
|
354
|
+
normalizedWeightSum +=
|
|
355
|
+
normalizedWeight;
|
|
356
|
+
addCompensated(totalPower, power);
|
|
357
|
+
});
|
|
358
|
+
if (!Number.isFinite(normalizedWeightSum) ||
|
|
359
|
+
!approximatelyEqual(normalizedWeightSum, 1)) {
|
|
360
|
+
throw new InvalidScientificInputError("reduction normalized wavelength weights must sum to 1.");
|
|
361
|
+
}
|
|
362
|
+
const reductionPower = requireNonNegativeFiniteInput(reduction
|
|
363
|
+
.wavelengthIntegratedGeometricApertureIncidentFluxWatts, "reduction.wavelengthIntegratedGeometricApertureIncidentFluxWatts");
|
|
364
|
+
if (!approximatelyEqual(totalPower.sum, reductionPower)) {
|
|
365
|
+
throw new InvalidScientificInputError("reduction total geometric-aperture radiant power must match the per-wavelength sum.");
|
|
366
|
+
}
|
|
367
|
+
return reduction.perWavelength;
|
|
368
|
+
}
|
|
369
|
+
function validateOperatingRangeNodeBinding(reduction, nodes, operatingRange) {
|
|
370
|
+
const evaluated = operatingRange
|
|
371
|
+
.evaluatedSpectralNodeInputs;
|
|
372
|
+
if (evaluated === undefined ||
|
|
373
|
+
evaluated.length !== nodes.length) {
|
|
374
|
+
throw new InvalidScientificInputError("operatingRange must carry one evaluated spectral-node input per reduction wavelength node.");
|
|
375
|
+
}
|
|
376
|
+
if (operatingRange
|
|
377
|
+
.evaluatedWavelengthRangeNanometers
|
|
378
|
+
.minimum !==
|
|
379
|
+
reduction.wavelengthRangeNanometers
|
|
380
|
+
.minimum ||
|
|
381
|
+
operatingRange
|
|
382
|
+
.evaluatedWavelengthRangeNanometers
|
|
383
|
+
.maximum !==
|
|
384
|
+
reduction.wavelengthRangeNanometers
|
|
385
|
+
.maximum) {
|
|
386
|
+
throw new InvalidScientificInputError("operatingRange wavelength range must exactly match the reduction.");
|
|
387
|
+
}
|
|
388
|
+
evaluated.forEach((entry, index) => {
|
|
389
|
+
const node = nodes[index];
|
|
390
|
+
if (entry.spectralSampleIndex !==
|
|
391
|
+
node.spectralSampleIndex ||
|
|
392
|
+
entry.wavelengthNanometers !==
|
|
393
|
+
node.wavelengthNanometers ||
|
|
394
|
+
entry.wavelengthMeasureNanometers !==
|
|
395
|
+
node.wavelengthMeasureNanometers) {
|
|
396
|
+
throw new InvalidScientificInputError("operatingRange spectral-node identities must exactly match the reduction.");
|
|
397
|
+
}
|
|
398
|
+
const expected = operatingRange.inputRange.kind ===
|
|
399
|
+
"wavelength-integrated-geometric-aperture-radiant-power"
|
|
400
|
+
? node
|
|
401
|
+
.wavelengthIntegratedGeometricApertureIncidentFluxContributionWatts
|
|
402
|
+
: node
|
|
403
|
+
.wavelengthIntegratedSpatialAverageContributionWattsPerSquareMeter;
|
|
404
|
+
if (entry.kind !==
|
|
405
|
+
operatingRange.inputRange.kind ||
|
|
406
|
+
entry.unit !==
|
|
407
|
+
operatingRange.inputRange.unit ||
|
|
408
|
+
!approximatelyEqual(entry.value, expected)) {
|
|
409
|
+
throw new InvalidScientificInputError("operatingRange spectral-node values must match the reduction values in the calibrated input domain.");
|
|
410
|
+
}
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
function validateResponseBinding(resolved, reduction) {
|
|
414
|
+
if (resolved.profileId !==
|
|
415
|
+
reduction.responseProfileId ||
|
|
416
|
+
resolved.colorSamplingProfileId !==
|
|
417
|
+
reduction.colorSamplingProfileId ||
|
|
418
|
+
resolved.channelId !==
|
|
419
|
+
reduction.channelId ||
|
|
420
|
+
resolved.sourceResponseKind !==
|
|
421
|
+
reduction.sourceResponseKind ||
|
|
422
|
+
resolved.responseScope !==
|
|
423
|
+
reduction.responseScope ||
|
|
424
|
+
resolved.scientificStatus !==
|
|
425
|
+
reduction.responseScientificStatus ||
|
|
426
|
+
canonicalJson(resolved.uncertainty) !==
|
|
427
|
+
canonicalJson(reduction.responseUncertainty) ||
|
|
428
|
+
canonicalJson(resolved.componentEvidence) !==
|
|
429
|
+
canonicalJson({
|
|
430
|
+
profile: reduction.componentEvidence
|
|
431
|
+
.spectral.profile,
|
|
432
|
+
channel: reduction.componentEvidence
|
|
433
|
+
.spectral.channel,
|
|
434
|
+
curves: reduction.componentEvidence
|
|
435
|
+
.spectral.curves
|
|
436
|
+
})) {
|
|
437
|
+
throw new InvalidScientificInputError("Resolved A/W response calibration metadata/evidence must exactly match the reduction.");
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
function validateExactResponseDataBinding(responseProfile, reduction) {
|
|
441
|
+
const response = responseProfile.channels.find((entry) => entry.channelId ===
|
|
442
|
+
reduction.channelId);
|
|
443
|
+
if (response === undefined ||
|
|
444
|
+
reduction.responseChannelBinding ===
|
|
445
|
+
undefined ||
|
|
446
|
+
canonicalJson(createSensorSpectralResponseChannelBinding(response)) !==
|
|
447
|
+
canonicalJson(reduction.responseChannelBinding)) {
|
|
448
|
+
throw new InvalidScientificInputError("Supplied spectral response channel data must exactly match the response-channel binding carried by the reduction.");
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
function validateElectricalBinding(profile, input) {
|
|
452
|
+
if (profile.responseApplicationProfileId !==
|
|
453
|
+
input.compatibility
|
|
454
|
+
.applicationProfileId ||
|
|
455
|
+
profile.spectralResponseProfileId !==
|
|
456
|
+
input.reduction
|
|
457
|
+
.responseProfileId ||
|
|
458
|
+
profile.colorSamplingProfileId !==
|
|
459
|
+
input.reduction
|
|
460
|
+
.colorSamplingProfileId ||
|
|
461
|
+
profile.channelId !==
|
|
462
|
+
input.reduction.channelId) {
|
|
463
|
+
throw new InvalidScientificInputError("Electrical applicability profile identities must exactly match the response pipeline.");
|
|
464
|
+
}
|
|
465
|
+
if (profile.conditionPolicy.kind ===
|
|
466
|
+
"exact-match-required") {
|
|
467
|
+
if (!electricalConditionsMatch(profile.referenceConditions, input.operatingElectricalConditions)) {
|
|
468
|
+
throw new InvalidScientificInputError("Operating electrical conditions must exactly match the A/W calibration reference conditions.");
|
|
469
|
+
}
|
|
470
|
+
return {
|
|
471
|
+
compatibility: "exact-match",
|
|
472
|
+
assumptionEvidence: []
|
|
473
|
+
};
|
|
474
|
+
}
|
|
475
|
+
return {
|
|
476
|
+
compatibility: "assumed-compatible",
|
|
477
|
+
assumptionEvidence: profile.conditionPolicy.evidence
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Integrate per-wavelength A/W times radiant-power contributions to steady-state current magnitude
|
|
482
|
+
* with explicit electrical applicability.
|
|
483
|
+
*
|
|
484
|
+
* A/W response converts per-bin radiant power to quasi-static detector-terminal current magnitude.
|
|
485
|
+
* Electrical bias/load applicability is explicit. This is not EQE, electron rate, transimpedance
|
|
486
|
+
* voltage or RAW; rapidly varying current requires a separate temporal detector-response model.
|
|
487
|
+
* @param input - CalculateSensorResponsivityPhotocurrentInput. See the linked contract for coordinate, unit and profile binding semantics.
|
|
488
|
+
* @returns CalculationResult<SensorResponsivityPhotocurrent>. Return shape and scientific status are explicit; no calibration is inferred from successful execution.
|
|
489
|
+
*
|
|
490
|
+
* @see docs/API_REFERENCE.md for the root export and exact type graph.
|
|
491
|
+
*/
|
|
492
|
+
export function calculateSensorResponsivityPhotocurrent(input) {
|
|
493
|
+
validateAuthorizationChain(input.reduction, input.compatibility, input.operatingRange);
|
|
494
|
+
if (input.reduction
|
|
495
|
+
.sourceResponseKind !==
|
|
496
|
+
"effective-spectral-responsivity") {
|
|
497
|
+
throw new InvalidScientificInputError("A/W photocurrent conversion requires effective spectral responsivity, not EQE.");
|
|
498
|
+
}
|
|
499
|
+
const colorProfile = parseSensorColorSamplingProfile(input.colorSamplingProfile);
|
|
500
|
+
const responseProfile = parseSensorSpectralResponseProfile(input.spectralResponseProfile);
|
|
501
|
+
const electricalProfile = parseSensorResponsivityElectricalApplicabilityProfile(input.electricalApplicabilityProfile);
|
|
502
|
+
if (colorProfile.profileId !==
|
|
503
|
+
input.reduction
|
|
504
|
+
.colorSamplingProfileId ||
|
|
505
|
+
responseProfile.profileId !==
|
|
506
|
+
input.reduction
|
|
507
|
+
.responseProfileId ||
|
|
508
|
+
responseProfile
|
|
509
|
+
.colorSamplingProfileId !==
|
|
510
|
+
colorProfile.profileId) {
|
|
511
|
+
throw new InvalidScientificInputError("Supplied color/spectral response profiles must exactly match the reduction identities.");
|
|
512
|
+
}
|
|
513
|
+
validateExactResponseDataBinding(responseProfile, input.reduction);
|
|
514
|
+
const electrical = validateElectricalBinding(electricalProfile, input);
|
|
515
|
+
const nodes = validateReductionNodes(input.reduction);
|
|
516
|
+
validateOperatingRangeNodeBinding(input.reduction, nodes, input.operatingRange);
|
|
517
|
+
const currentSum = {
|
|
518
|
+
sum: 0,
|
|
519
|
+
correction: 0
|
|
520
|
+
};
|
|
521
|
+
const perWavelength = [];
|
|
522
|
+
let responseBindingValidated = false;
|
|
523
|
+
for (const node of nodes) {
|
|
524
|
+
const resolved = resolveParsedSensorSpectralResponseAtWavelength({
|
|
525
|
+
colorSamplingProfile: colorProfile,
|
|
526
|
+
spectralResponseProfile: responseProfile,
|
|
527
|
+
channelId: input.reduction.channelId,
|
|
528
|
+
wavelengthNanometers: node.wavelengthNanometers,
|
|
529
|
+
wavelengthBasis: input.reduction
|
|
530
|
+
.wavelengthBasis
|
|
531
|
+
});
|
|
532
|
+
if (!responseBindingValidated) {
|
|
533
|
+
validateResponseBinding(resolved.value, input.reduction);
|
|
534
|
+
responseBindingValidated =
|
|
535
|
+
true;
|
|
536
|
+
}
|
|
537
|
+
const responsivity = resolved.value.response;
|
|
538
|
+
const radiantPowerContributionWatts = node
|
|
539
|
+
.geometricApertureIncidentSpectralFluxWattsPerNanometer *
|
|
540
|
+
node.wavelengthMeasureNanometers;
|
|
541
|
+
const photocurrentMagnitudeContributionAmperes = radiantPowerContributionWatts *
|
|
542
|
+
responsivity.amperesPerWatt;
|
|
543
|
+
if (!Number.isFinite(radiantPowerContributionWatts) ||
|
|
544
|
+
!Number.isFinite(photocurrentMagnitudeContributionAmperes) ||
|
|
545
|
+
photocurrentMagnitudeContributionAmperes <
|
|
546
|
+
0) {
|
|
547
|
+
throw new InvalidScientificInputError("A/W wavelength-node photocurrent calculation must remain finite and nonnegative.");
|
|
548
|
+
}
|
|
549
|
+
addCompensated(currentSum, photocurrentMagnitudeContributionAmperes);
|
|
550
|
+
perWavelength.push({
|
|
551
|
+
spectralSampleIndex: node.spectralSampleIndex,
|
|
552
|
+
wavelengthNanometers: node.wavelengthNanometers,
|
|
553
|
+
wavelengthMeasureNanometers: node.wavelengthMeasureNanometers,
|
|
554
|
+
geometricApertureIncidentSpectralFluxWattsPerNanometer: node
|
|
555
|
+
.geometricApertureIncidentSpectralFluxWattsPerNanometer,
|
|
556
|
+
radiantPowerContributionWatts,
|
|
557
|
+
spectralResponsivityAmperesPerWatt: responsivity.amperesPerWatt,
|
|
558
|
+
responseInterpolationUsed: resolved.value
|
|
559
|
+
.interpolationUsed,
|
|
560
|
+
photocurrentMagnitudeContributionAmperes
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
if (!Number.isFinite(currentSum.sum) ||
|
|
564
|
+
currentSum.sum < 0) {
|
|
565
|
+
throw new InvalidScientificInputError("Total A/W photocurrent magnitude must remain finite and nonnegative.");
|
|
566
|
+
}
|
|
567
|
+
return approximationResult({
|
|
568
|
+
colorSamplingProfileId: input.reduction
|
|
569
|
+
.colorSamplingProfileId,
|
|
570
|
+
responseProfileId: input.reduction
|
|
571
|
+
.responseProfileId,
|
|
572
|
+
responseApplicationProfileId: input.compatibility
|
|
573
|
+
.applicationProfileId,
|
|
574
|
+
operatingRangeProfileId: input.operatingRange
|
|
575
|
+
.operatingRangeProfileId,
|
|
576
|
+
electricalApplicabilityProfileId: electricalProfile.profileId,
|
|
577
|
+
site: {
|
|
578
|
+
...input.reduction.site
|
|
579
|
+
},
|
|
580
|
+
channelId: input.reduction.channelId,
|
|
581
|
+
sourceResponseKind: "effective-spectral-responsivity",
|
|
582
|
+
responseScope: input.reduction.responseScope,
|
|
583
|
+
responseReferencePlane: input.compatibility
|
|
584
|
+
.requiredSourcePlane,
|
|
585
|
+
wavelengthBasis: input.reduction
|
|
586
|
+
.wavelengthBasis,
|
|
587
|
+
wavelengthRangeNanometers: {
|
|
588
|
+
...input.reduction
|
|
589
|
+
.wavelengthRangeNanometers
|
|
590
|
+
},
|
|
591
|
+
electricalReferenceConditions: electricalProfile
|
|
592
|
+
.referenceConditions,
|
|
593
|
+
operatingElectricalConditions: input.operatingElectricalConditions,
|
|
594
|
+
electricalConditionPolicy: electricalProfile
|
|
595
|
+
.conditionPolicy,
|
|
596
|
+
electricalCompatibility: electrical.compatibility,
|
|
597
|
+
spectralNodeCount: nodes.length,
|
|
598
|
+
perWavelength,
|
|
599
|
+
photocurrentMagnitudeAmperes: currentSum.sum,
|
|
600
|
+
currentSignConvention: "magnitude-only-no-circuit-polarity",
|
|
601
|
+
summationMethod: "kahan-compensated",
|
|
602
|
+
responseApplicationPerformed: true,
|
|
603
|
+
spectralResponsivityApplied: true,
|
|
604
|
+
quantumEfficiencyApplied: false,
|
|
605
|
+
photonRateCalculated: false,
|
|
606
|
+
electronRateCalculated: false,
|
|
607
|
+
currentCalculated: true,
|
|
608
|
+
chargeCalculated: false,
|
|
609
|
+
temporalResponseModel: "quasi-static-steady-state-only",
|
|
610
|
+
detectorBandwidthModeled: false,
|
|
611
|
+
transimpedanceGainApplied: false,
|
|
612
|
+
voltageCalculated: false,
|
|
613
|
+
temporalIntegrationApplied: false,
|
|
614
|
+
exposureDurationApplied: false,
|
|
615
|
+
saturationAssessed: false,
|
|
616
|
+
readoutElectronicsLinearityAssessed: false,
|
|
617
|
+
shotNoiseApplied: false,
|
|
618
|
+
readNoiseApplied: false,
|
|
619
|
+
adcQuantizationApplied: false,
|
|
620
|
+
rawCodeValueProduced: false,
|
|
621
|
+
responseUncertaintyPropagated: false,
|
|
622
|
+
electricalApplicabilityUncertaintyPropagated: false,
|
|
623
|
+
quadratureConvergenceErrorEstimated: false,
|
|
624
|
+
componentEvidence: {
|
|
625
|
+
electricalApplicability: electricalProfile.evidence,
|
|
626
|
+
electricalConditionAssumption: electrical
|
|
627
|
+
.assumptionEvidence
|
|
628
|
+
}
|
|
629
|
+
}, "sensor-spectral-responsivity-photocurrent", "1.0.0", [
|
|
630
|
+
"Spectral responsivity in A/W is applied independently at every wavelength quadrature node as detector-terminal photocurrent magnitude per incident radiant power.",
|
|
631
|
+
"Current sign/polarity is deliberately not modeled; the result is a nonnegative photocurrent magnitude and does not imply a circuit current direction.",
|
|
632
|
+
"The A/W calibration is bound to explicit detector electrical conditions. Exact-match mode requires identical bias and readout-load semantics; approximation mode requires evidence and a stated limitation.",
|
|
633
|
+
"Virtual-ground current readout and finite input impedance are modeled as calibration-condition identities only; this function does not simulate amplifier circuits or prove impedance adequacy.",
|
|
634
|
+
"NIST photodiode guidance shows detector/electronics/loading can affect linear operation, so transimpedance/current-readout conditions are not treated as scientifically inert.",
|
|
635
|
+
"Structural compatibility, geometric-aperture linear superposition and per-spectral-bin operating-range applicability must already authorize the radiant-power→current path.",
|
|
636
|
+
"Response metadata/evidence and operating-range spectral-node values are rebound to the exact reduction so matching IDs alone or stale authorization cannot enable conversion.",
|
|
637
|
+
"The calculation does not use photon energy, QE, photon rate or electron rate. A/W remains a distinct current-domain response representation.",
|
|
638
|
+
"No transimpedance gain or voltage conversion is performed; current-to-voltage converter gain/offset/linearity remain downstream electronics contracts.",
|
|
639
|
+
"The A/W response is used only as a quasi-static steady-state power→current mapping. Detector impulse response, bandwidth, modulation-frequency response and transient settling are not modeled.",
|
|
640
|
+
"Outputs are instantaneous current only. Exposure-time integration to charge, saturation, noise, ADC/RAW conversion and reconstruction remain downstream.",
|
|
641
|
+
"Response/electrical uncertainties and quadrature convergence error are not propagated into a combined current uncertainty by this version."
|
|
642
|
+
]);
|
|
643
|
+
}
|
|
644
|
+
//# sourceMappingURL=responsivity-photocurrent.js.map
|