@photivra/engine 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/CITATION.cff +1 -1
- package/README.md +37 -3
- package/dist/index.d.ts +15 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -2
- package/dist/index.js.map +1 -1
- package/dist/motion/camera-rotation.d.ts +60 -0
- package/dist/motion/camera-rotation.d.ts.map +1 -1
- package/dist/motion/camera-rotation.js +95 -0
- package/dist/motion/camera-rotation.js.map +1 -1
- package/dist/motion/capture-rotation-inverse-mapping.d.ts +100 -0
- package/dist/motion/capture-rotation-inverse-mapping.d.ts.map +1 -0
- package/dist/motion/capture-rotation-inverse-mapping.js +171 -0
- package/dist/motion/capture-rotation-inverse-mapping.js.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts +89 -0
- package/dist/motion/capture-rotation-temporal-quadrature.d.ts.map +1 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js +116 -0
- package/dist/motion/capture-rotation-temporal-quadrature.js.map +1 -0
- package/dist/motion/capture-rotation-trajectory.d.ts +98 -0
- package/dist/motion/capture-rotation-trajectory.d.ts.map +1 -0
- package/dist/motion/capture-rotation-trajectory.js +153 -0
- package/dist/motion/capture-rotation-trajectory.js.map +1 -0
- package/dist/optics/lateral-chromatic-aberration.d.ts.map +1 -1
- package/dist/optics/lateral-chromatic-aberration.js +12 -4
- package/dist/optics/lateral-chromatic-aberration.js.map +1 -1
- package/dist/optics/radial-distortion.d.ts +4 -2
- package/dist/optics/radial-distortion.d.ts.map +1 -1
- package/dist/optics/radial-distortion.js +103 -28
- package/dist/optics/radial-distortion.js.map +1 -1
- package/dist/output/capture-geometry.d.ts.map +1 -1
- package/dist/output/capture-geometry.js +24 -11
- package/dist/output/capture-geometry.js.map +1 -1
- package/dist/sensor/capture-color-sampling-binding.d.ts +211 -0
- package/dist/sensor/capture-color-sampling-binding.d.ts.map +1 -0
- package/dist/sensor/capture-color-sampling-binding.js +423 -0
- package/dist/sensor/capture-color-sampling-binding.js.map +1 -0
- package/dist/sensor/capture-mode.d.ts +157 -0
- package/dist/sensor/capture-mode.d.ts.map +1 -0
- package/dist/sensor/capture-mode.js +434 -0
- package/dist/sensor/capture-mode.js.map +1 -0
- package/dist/sensor/color-sampling.d.ts +133 -0
- package/dist/sensor/color-sampling.d.ts.map +1 -0
- package/dist/sensor/color-sampling.js +226 -0
- package/dist/sensor/color-sampling.js.map +1 -0
- package/dist/sensor/exposure-window.d.ts +103 -0
- package/dist/sensor/exposure-window.d.ts.map +1 -0
- package/dist/sensor/exposure-window.js +291 -0
- package/dist/sensor/exposure-window.js.map +1 -0
- package/dist/sensor/optical-stack.d.ts +132 -0
- package/dist/sensor/optical-stack.d.ts.map +1 -0
- package/dist/sensor/optical-stack.js +286 -0
- package/dist/sensor/optical-stack.js.map +1 -0
- package/dist/sensor/readout-exposure-linkage.d.ts +111 -0
- package/dist/sensor/readout-exposure-linkage.d.ts.map +1 -0
- package/dist/sensor/readout-exposure-linkage.js +210 -0
- package/dist/sensor/readout-exposure-linkage.js.map +1 -0
- package/dist/sensor/readout-timing.d.ts +124 -0
- package/dist/sensor/readout-timing.d.ts.map +1 -0
- package/dist/sensor/readout-timing.js +230 -0
- package/dist/sensor/readout-timing.js.map +1 -0
- package/dist/sensor/sampling-aperture.d.ts +154 -0
- package/dist/sensor/sampling-aperture.d.ts.map +1 -0
- package/dist/sensor/sampling-aperture.js +374 -0
- package/dist/sensor/sampling-aperture.js.map +1 -0
- package/dist/sensor/spatial-sample-reduction.d.ts +128 -0
- package/dist/sensor/spatial-sample-reduction.d.ts.map +1 -0
- package/dist/sensor/spatial-sample-reduction.js +299 -0
- package/dist/sensor/spatial-sample-reduction.js.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts +155 -0
- package/dist/sensor/spatial-sampling-quadrature.d.ts.map +1 -0
- package/dist/sensor/spatial-sampling-quadrature.js +197 -0
- package/dist/sensor/spatial-sampling-quadrature.js.map +1 -0
- package/docs/ARCHITECTURE.md +17 -0
- package/docs/AUTOMATION_COORDINATION.md +188 -0
- package/docs/IMAGE_FORMATION.md +26 -0
- package/docs/MOTION_AND_SIGNAL.md +142 -0
- package/docs/USAGE.md +1273 -3
- package/package.json +5 -3
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
2
|
+
import { approximationResult } from "../core/calculation-result.js";
|
|
3
|
+
import { parseEvidenceList } from "../core/evidence-provenance.js";
|
|
4
|
+
import { InvalidScientificInputError, requirePositiveInteger } from "../core/validation.js";
|
|
5
|
+
const SHUTTER_MECHANISMS = new Set([
|
|
6
|
+
"mechanical",
|
|
7
|
+
"electronic-first-curtain",
|
|
8
|
+
"electronic"
|
|
9
|
+
]);
|
|
10
|
+
const SCAN_DIRECTIONS = new Set([
|
|
11
|
+
"top-to-bottom",
|
|
12
|
+
"bottom-to-top",
|
|
13
|
+
"left-to-right",
|
|
14
|
+
"right-to-left"
|
|
15
|
+
]);
|
|
16
|
+
const BOUNDARY_KINDS = new Set([
|
|
17
|
+
"simultaneous",
|
|
18
|
+
"uniform-linear-native-scan"
|
|
19
|
+
]);
|
|
20
|
+
function requireRecord(value, path) {
|
|
21
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
22
|
+
throw new InvalidScientificInputError(path + " must be an object.");
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function requireNonNegativeInteger(name, value) {
|
|
27
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
28
|
+
throw new InvalidScientificInputError(name + " must be a non-negative safe integer.");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function requirePositiveFinite(name, value) {
|
|
32
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
33
|
+
throw new InvalidScientificInputError(name + " must be a finite number greater than zero.");
|
|
34
|
+
}
|
|
35
|
+
return value;
|
|
36
|
+
}
|
|
37
|
+
function parseSecondsFact(value, path) {
|
|
38
|
+
const record = requireRecord(value, path);
|
|
39
|
+
if (record.unit !== "s") {
|
|
40
|
+
throw new InvalidScientificInputError(path + '.unit must be "s".');
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
value: requirePositiveFinite(path + ".value", record.value),
|
|
44
|
+
unit: "s",
|
|
45
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function parseDirectionFact(value, path) {
|
|
49
|
+
const record = requireRecord(value, path);
|
|
50
|
+
if (typeof record.value !== "string" ||
|
|
51
|
+
!SCAN_DIRECTIONS.has(record.value)) {
|
|
52
|
+
throw new InvalidScientificInputError(path + ".value is invalid.");
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
value: record.value,
|
|
56
|
+
evidence: parseEvidenceList(record.evidence, path + ".evidence")
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function parseBoundarySchedule(value, path) {
|
|
60
|
+
const record = requireRecord(value, path);
|
|
61
|
+
if (typeof record.kind !== "string" ||
|
|
62
|
+
!BOUNDARY_KINDS.has(record.kind)) {
|
|
63
|
+
throw new InvalidScientificInputError(path + ".kind is invalid.");
|
|
64
|
+
}
|
|
65
|
+
if (record.kind === "simultaneous") {
|
|
66
|
+
if (record.directionNative !== undefined) {
|
|
67
|
+
throw new InvalidScientificInputError(path + ".directionNative must be omitted for a simultaneous boundary.");
|
|
68
|
+
}
|
|
69
|
+
if (record.traversalDurationSeconds !== undefined) {
|
|
70
|
+
throw new InvalidScientificInputError(path +
|
|
71
|
+
".traversalDurationSeconds must be omitted for a simultaneous boundary.");
|
|
72
|
+
}
|
|
73
|
+
return { kind: "simultaneous" };
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
kind: "uniform-linear-native-scan",
|
|
77
|
+
directionNative: parseDirectionFact(record.directionNative, path + ".directionNative"),
|
|
78
|
+
traversalDurationSeconds: parseSecondsFact(record.traversalDurationSeconds, path + ".traversalDurationSeconds")
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
function validateNativeRaster(raster) {
|
|
82
|
+
requirePositiveInteger("nativeRaster.pixelWidth", raster.pixelWidth);
|
|
83
|
+
requirePositiveInteger("nativeRaster.pixelHeight", raster.pixelHeight);
|
|
84
|
+
}
|
|
85
|
+
function fullRect(raster) {
|
|
86
|
+
return {
|
|
87
|
+
x: 0,
|
|
88
|
+
y: 0,
|
|
89
|
+
width: raster.pixelWidth,
|
|
90
|
+
height: raster.pixelHeight
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function validateActiveCaptureRect(rect, raster) {
|
|
94
|
+
requireNonNegativeInteger("activeCaptureRect.x", rect.x);
|
|
95
|
+
requireNonNegativeInteger("activeCaptureRect.y", rect.y);
|
|
96
|
+
requirePositiveInteger("activeCaptureRect.width", rect.width);
|
|
97
|
+
requirePositiveInteger("activeCaptureRect.height", rect.height);
|
|
98
|
+
if (rect.x + rect.width > raster.pixelWidth ||
|
|
99
|
+
rect.y + rect.height > raster.pixelHeight) {
|
|
100
|
+
throw new InvalidScientificInputError("activeCaptureRect must fit entirely within nativeRaster.");
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function validateShutterMechanism(value) {
|
|
104
|
+
if (typeof value !== "string" ||
|
|
105
|
+
!SHUTTER_MECHANISMS.has(value)) {
|
|
106
|
+
throw new InvalidScientificInputError("shutterMechanism is invalid.");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
function validatePointWithinActiveCapture(point, rect, path) {
|
|
110
|
+
if (!Number.isFinite(point.x) || !Number.isFinite(point.y)) {
|
|
111
|
+
throw new InvalidScientificInputError(path + " coordinates must be finite.");
|
|
112
|
+
}
|
|
113
|
+
if (point.x < rect.x ||
|
|
114
|
+
point.x > rect.x + rect.width ||
|
|
115
|
+
point.y < rect.y ||
|
|
116
|
+
point.y > rect.y + rect.height) {
|
|
117
|
+
throw new InvalidScientificInputError(path + " must lie within activeCaptureRect edge-coordinate bounds.");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function scanVector(direction) {
|
|
121
|
+
switch (direction) {
|
|
122
|
+
case "top-to-bottom":
|
|
123
|
+
return { x: 0, y: 1 };
|
|
124
|
+
case "bottom-to-top":
|
|
125
|
+
return { x: 0, y: -1 };
|
|
126
|
+
case "left-to-right":
|
|
127
|
+
return { x: 1, y: 0 };
|
|
128
|
+
case "right-to-left":
|
|
129
|
+
return { x: -1, y: 0 };
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function normalizedScanPosition(point, rect, direction) {
|
|
133
|
+
switch (direction) {
|
|
134
|
+
case "top-to-bottom":
|
|
135
|
+
return (point.y - rect.y) / rect.height;
|
|
136
|
+
case "bottom-to-top":
|
|
137
|
+
return 1 - (point.y - rect.y) / rect.height;
|
|
138
|
+
case "left-to-right":
|
|
139
|
+
return (point.x - rect.x) / rect.width;
|
|
140
|
+
case "right-to-left":
|
|
141
|
+
return 1 - (point.x - rect.x) / rect.width;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function boundaryPhase(point, rect, schedule) {
|
|
145
|
+
if (schedule.kind === "simultaneous") {
|
|
146
|
+
return {
|
|
147
|
+
normalizedScanPosition: null,
|
|
148
|
+
phaseOffsetSeconds: 0
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const normalized = normalizedScanPosition(point, rect, schedule.directionNative.value);
|
|
152
|
+
return {
|
|
153
|
+
normalizedScanPosition: normalized,
|
|
154
|
+
phaseOffsetSeconds: normalized * schedule.traversalDurationSeconds.value
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
function resolveBoundaryActuators(mechanism) {
|
|
158
|
+
switch (mechanism) {
|
|
159
|
+
case "mechanical":
|
|
160
|
+
return {
|
|
161
|
+
opening: "mechanical",
|
|
162
|
+
closing: "mechanical"
|
|
163
|
+
};
|
|
164
|
+
case "electronic-first-curtain":
|
|
165
|
+
return {
|
|
166
|
+
opening: "electronic",
|
|
167
|
+
closing: "mechanical"
|
|
168
|
+
};
|
|
169
|
+
case "electronic":
|
|
170
|
+
return {
|
|
171
|
+
opening: "electronic",
|
|
172
|
+
closing: "electronic"
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
function resolveBoundary(actuator, schedule) {
|
|
177
|
+
if (schedule.kind === "simultaneous") {
|
|
178
|
+
return {
|
|
179
|
+
actuator,
|
|
180
|
+
schedule: {
|
|
181
|
+
kind: "simultaneous"
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
actuator,
|
|
187
|
+
schedule: {
|
|
188
|
+
kind: "uniform-linear-native-scan",
|
|
189
|
+
directionNative: schedule.directionNative,
|
|
190
|
+
unitVectorNative: scanVector(schedule.directionNative.value),
|
|
191
|
+
traversalDurationSeconds: schedule.traversalDurationSeconds
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function createWindowSample(point, rect, opening, closing, nominalExposureDurationSeconds) {
|
|
196
|
+
const openingPhase = boundaryPhase(point, rect, opening);
|
|
197
|
+
const closingPhase = boundaryPhase(point, rect, closing);
|
|
198
|
+
const startOffsetSecondsFromOpeningReference = openingPhase.phaseOffsetSeconds;
|
|
199
|
+
const endOffsetSecondsFromOpeningReference = nominalExposureDurationSeconds + closingPhase.phaseOffsetSeconds;
|
|
200
|
+
const localExposureDurationSeconds = endOffsetSecondsFromOpeningReference -
|
|
201
|
+
startOffsetSecondsFromOpeningReference;
|
|
202
|
+
return {
|
|
203
|
+
pointNative: { ...point },
|
|
204
|
+
openingNormalizedScanPosition: openingPhase.normalizedScanPosition,
|
|
205
|
+
closingNormalizedScanPosition: closingPhase.normalizedScanPosition,
|
|
206
|
+
startOffsetSecondsFromOpeningReference,
|
|
207
|
+
endOffsetSecondsFromOpeningReference,
|
|
208
|
+
localExposureDurationSeconds
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function activeRectCorners(rect) {
|
|
212
|
+
return [
|
|
213
|
+
{ x: rect.x, y: rect.y },
|
|
214
|
+
{ x: rect.x + rect.width, y: rect.y },
|
|
215
|
+
{ x: rect.x, y: rect.y + rect.height },
|
|
216
|
+
{
|
|
217
|
+
x: rect.x + rect.width,
|
|
218
|
+
y: rect.y + rect.height
|
|
219
|
+
}
|
|
220
|
+
];
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Resolves local capture exposure windows from independent opening and closing
|
|
224
|
+
* boundary schedules.
|
|
225
|
+
*
|
|
226
|
+
* The returned time basis is seconds from the first opening-boundary phase.
|
|
227
|
+
* This is intentionally not the existing camera-rotation API's global
|
|
228
|
+
* "exposure start" semantic; a later integration layer must bind those time
|
|
229
|
+
* bases explicitly.
|
|
230
|
+
*
|
|
231
|
+
* The mechanism identifies whether each boundary is mechanical or electronic,
|
|
232
|
+
* but does not supply any traversal duration or direction. Every non-simultaneous
|
|
233
|
+
* timing value and direction is caller-declared with evidence.
|
|
234
|
+
*
|
|
235
|
+
* The first model supports simultaneous boundaries and uniform-linear
|
|
236
|
+
* single-axis native-sensor scans only. It does not model curtain acceleration,
|
|
237
|
+
* segmented/nonlinear electronic schedules, flash/flicker, rolling-shutter
|
|
238
|
+
* image distortion, shutter shock, or EFCS-specific pupil/bokeh behavior.
|
|
239
|
+
*/
|
|
240
|
+
export function calculateCaptureExposureWindows(input) {
|
|
241
|
+
validateNativeRaster(input.nativeRaster);
|
|
242
|
+
validateShutterMechanism(input.shutterMechanism);
|
|
243
|
+
const nominalExposureDurationSeconds = parseSecondsFact(input.nominalExposureDurationSeconds, "nominalExposureDurationSeconds");
|
|
244
|
+
const opening = parseBoundarySchedule(input.opening, "opening");
|
|
245
|
+
const closing = parseBoundarySchedule(input.closing, "closing");
|
|
246
|
+
const activeCaptureRect = input.activeCaptureRect ?? fullRect(input.nativeRaster);
|
|
247
|
+
validateActiveCaptureRect(activeCaptureRect, input.nativeRaster);
|
|
248
|
+
if (input.samplePointsNative !== undefined &&
|
|
249
|
+
!Array.isArray(input.samplePointsNative)) {
|
|
250
|
+
throw new InvalidScientificInputError("samplePointsNative must be an array when supplied.");
|
|
251
|
+
}
|
|
252
|
+
const cornerSamples = activeRectCorners(activeCaptureRect).map((point) => createWindowSample(point, activeCaptureRect, opening, closing, nominalExposureDurationSeconds.value));
|
|
253
|
+
const localDurations = cornerSamples.map((sample) => sample.localExposureDurationSeconds);
|
|
254
|
+
const minimumLocalExposureDurationSeconds = Math.min(...localDurations);
|
|
255
|
+
const maximumLocalExposureDurationSeconds = Math.max(...localDurations);
|
|
256
|
+
if (!Number.isFinite(minimumLocalExposureDurationSeconds) ||
|
|
257
|
+
minimumLocalExposureDurationSeconds <= 0) {
|
|
258
|
+
throw new InvalidScientificInputError("The declared opening/closing schedules produce a zero or negative local exposure duration somewhere within activeCaptureRect.");
|
|
259
|
+
}
|
|
260
|
+
const samples = (input.samplePointsNative ?? []).map((point, index) => {
|
|
261
|
+
validatePointWithinActiveCapture(point, activeCaptureRect, "samplePointsNative[" + index + "]");
|
|
262
|
+
return createWindowSample(point, activeCaptureRect, opening, closing, nominalExposureDurationSeconds.value);
|
|
263
|
+
});
|
|
264
|
+
const actuators = resolveBoundaryActuators(input.shutterMechanism);
|
|
265
|
+
return approximationResult({
|
|
266
|
+
shutterMechanism: input.shutterMechanism,
|
|
267
|
+
timeReference: "first-opening-boundary-phase",
|
|
268
|
+
nativeRaster: { ...input.nativeRaster },
|
|
269
|
+
activeCaptureRect: { ...activeCaptureRect },
|
|
270
|
+
nominalExposureDurationSeconds,
|
|
271
|
+
opening: resolveBoundary(actuators.opening, opening),
|
|
272
|
+
closing: resolveBoundary(actuators.closing, closing),
|
|
273
|
+
localExposureDurationRangeSeconds: {
|
|
274
|
+
minimum: minimumLocalExposureDurationSeconds,
|
|
275
|
+
maximum: maximumLocalExposureDurationSeconds
|
|
276
|
+
},
|
|
277
|
+
samples
|
|
278
|
+
}, "capture-exposure-window-schedule", "1.0.0", [
|
|
279
|
+
"Time is reported in seconds from the first opening-boundary phase, not from a universal local exposure-start event.",
|
|
280
|
+
"Nominal exposure duration, opening traversal, and closing traversal are independent declared quantities.",
|
|
281
|
+
"Mechanical, electronic-first-curtain, and electronic mechanisms determine boundary actuator categories only; they do not supply timing or direction.",
|
|
282
|
+
"Uniform-linear scan boundaries are an explicit approximation over continuous effective native-raster coordinates and do not assert one raster row/column equals one physical curtain line, photodiode row, or hardware readout line.",
|
|
283
|
+
"Opening and closing directions and traversal durations are independent and may produce spatially varying local exposure duration.",
|
|
284
|
+
"The complete active rectangle is validated using the extrema of the affine boundary schedules, so unsampled invalid corners cannot pass.",
|
|
285
|
+
"Active-capture timing is caller-declared and is not inferred by scaling full-frame timing from crop dimensions.",
|
|
286
|
+
"Physical camera orientation and digital output crop/resolution remain downstream of the invariant native timing schedule.",
|
|
287
|
+
"Sensor readout timing remains a separate contract; this model does not automatically equate a sensor readout phase with an exposure boundary.",
|
|
288
|
+
"This model does not include curtain acceleration, segmented/nonlinear electronic timing, rolling-shutter image distortion, motion integration, flash/flicker interaction, shutter shock, or EFCS-specific pupil/bokeh behavior."
|
|
289
|
+
]);
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=exposure-window.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exposure-window.js","sourceRoot":"","sources":["../../src/sensor/exposure-window.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { type EvidenceProvenance } from "../core/evidence-provenance.js";
|
|
2
|
+
export type SensorOpticalStackComponentRole = "cover-glass" | "infrared-cut" | "ultraviolet-cut" | "anti-reflection" | "birefringent-low-pass" | "wave-plate" | "other-optical-filter";
|
|
3
|
+
export interface SensorOpticalStackComponent {
|
|
4
|
+
componentId: string;
|
|
5
|
+
/**
|
|
6
|
+
* Roles may be combined because one physical element can provide multiple
|
|
7
|
+
* optical/filter functions.
|
|
8
|
+
*/
|
|
9
|
+
roles: readonly SensorOpticalStackComponentRole[];
|
|
10
|
+
evidence: readonly EvidenceProvenance[];
|
|
11
|
+
}
|
|
12
|
+
export interface SensorMicrolensDeclaration {
|
|
13
|
+
presence: "present" | "absent";
|
|
14
|
+
evidence: readonly EvidenceProvenance[];
|
|
15
|
+
/**
|
|
16
|
+
* Presence alone does not establish an angular, spectral, fill-factor, or
|
|
17
|
+
* collection-efficiency model.
|
|
18
|
+
*/
|
|
19
|
+
opticalEffectModel: "unresolved";
|
|
20
|
+
}
|
|
21
|
+
export interface AntiAliasingPointSplitComponent {
|
|
22
|
+
/**
|
|
23
|
+
* Native sensor physical offset from the nominal landing point.
|
|
24
|
+
* +X right, +Y down. Units: micrometres.
|
|
25
|
+
*/
|
|
26
|
+
offsetMicrometers: {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* Dimensionless normalized spatial weight. Point-splitting kernels describe
|
|
32
|
+
* spatial redistribution only; total stack throughput is outside this field.
|
|
33
|
+
*/
|
|
34
|
+
normalizedWeight: number;
|
|
35
|
+
}
|
|
36
|
+
export type SensorEffectiveAntiAliasingSpatialResponse = {
|
|
37
|
+
/**
|
|
38
|
+
* Documented absence/cancellation of intentional anti-aliasing spatial
|
|
39
|
+
* splitting. This does not mean the whole sensor stack is optically
|
|
40
|
+
* identity.
|
|
41
|
+
*/
|
|
42
|
+
kind: "absent";
|
|
43
|
+
evidence: readonly EvidenceProvenance[];
|
|
44
|
+
} | {
|
|
45
|
+
/**
|
|
46
|
+
* An effective anti-aliasing response is known to exist, but its spatial
|
|
47
|
+
* response is not defensibly specified.
|
|
48
|
+
*/
|
|
49
|
+
kind: "present-unresolved";
|
|
50
|
+
evidence: readonly EvidenceProvenance[];
|
|
51
|
+
} | {
|
|
52
|
+
/**
|
|
53
|
+
* Generic normalized point-splitting approximation in native sensor
|
|
54
|
+
* physical coordinates.
|
|
55
|
+
*/
|
|
56
|
+
kind: "normalized-point-splitting-kernel";
|
|
57
|
+
evidence: readonly EvidenceProvenance[];
|
|
58
|
+
coordinateSystem: "native-sensor-physical";
|
|
59
|
+
scope: "field-wavelength-polarization-invariant-approximation";
|
|
60
|
+
components: readonly AntiAliasingPointSplitComponent[];
|
|
61
|
+
};
|
|
62
|
+
export interface SensorOpticalStackProfile {
|
|
63
|
+
schemaVersion: "0.1.0";
|
|
64
|
+
profileId: string;
|
|
65
|
+
evidence: readonly EvidenceProvenance[];
|
|
66
|
+
/**
|
|
67
|
+
* Ordered from incident-light side toward the sensor.
|
|
68
|
+
*
|
|
69
|
+
* These components are descriptive metadata only. Their presence does not
|
|
70
|
+
* create transmission, focus-shift, aberration, or spectral effects.
|
|
71
|
+
*/
|
|
72
|
+
orderedComponents?: readonly SensorOpticalStackComponent[];
|
|
73
|
+
/**
|
|
74
|
+
* Omitted means unknown/unasserted.
|
|
75
|
+
*
|
|
76
|
+
* This is intentionally separate from physical component presence so a
|
|
77
|
+
* stack can contain low-pass-related hardware while its net effective
|
|
78
|
+
* anti-aliasing response is absent/cancelled.
|
|
79
|
+
*/
|
|
80
|
+
effectiveAntiAliasingSpatialResponse?: SensorEffectiveAntiAliasingSpatialResponse;
|
|
81
|
+
/**
|
|
82
|
+
* Omitted means unknown/unasserted.
|
|
83
|
+
*/
|
|
84
|
+
microlens?: SensorMicrolensDeclaration;
|
|
85
|
+
}
|
|
86
|
+
export interface ResolvedAntiAliasingSpatialKernel {
|
|
87
|
+
profileId: string;
|
|
88
|
+
effectiveResponse: "absent" | "normalized-point-splitting-kernel";
|
|
89
|
+
coordinateSystem: "native-sensor-physical";
|
|
90
|
+
components: readonly AntiAliasingPointSplitComponent[];
|
|
91
|
+
normalizedWeightSum: number;
|
|
92
|
+
throughputIncluded: false;
|
|
93
|
+
spectralTransmissionIncluded: false;
|
|
94
|
+
fieldDependenceIncluded: false;
|
|
95
|
+
wavelengthDependenceIncluded: false;
|
|
96
|
+
polarizationDependenceIncluded: false;
|
|
97
|
+
microlensResponseIncluded: false;
|
|
98
|
+
coverFilterStackEffectsIncluded: false;
|
|
99
|
+
wholeSensorOpticalStackResponse: false;
|
|
100
|
+
provenance: {
|
|
101
|
+
profile: readonly EvidenceProvenance[];
|
|
102
|
+
antiAliasingResponse: readonly EvidenceProvenance[];
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Parses descriptive sensor optical-stack metadata plus an optional explicitly
|
|
107
|
+
* declared effective anti-aliasing spatial response.
|
|
108
|
+
*
|
|
109
|
+
* Unknown facts are omitted instead of inferred. Physical component presence
|
|
110
|
+
* is intentionally separate from effective anti-aliasing response so the
|
|
111
|
+
* schema can represent cancellation/neutralization designs without claiming
|
|
112
|
+
* the physical assembly is absent.
|
|
113
|
+
*
|
|
114
|
+
* Cover/filter-stack and microlens presence do not create optical effects in
|
|
115
|
+
* schema 0.1.0. Thickness, refractive index, spectral transmission, angular
|
|
116
|
+
* acceptance, focus shift and microlens collection behavior require later
|
|
117
|
+
* explicit models/calibration.
|
|
118
|
+
*/
|
|
119
|
+
export declare function parseSensorOpticalStackProfile(value: unknown): SensorOpticalStackProfile;
|
|
120
|
+
/**
|
|
121
|
+
* Resolves only the effective anti-aliasing spatial kernel.
|
|
122
|
+
*
|
|
123
|
+
* This is not a whole optical-stack PSF. Cover/filter transmission, refraction,
|
|
124
|
+
* microlens behavior, field/wavelength/polarization dependence, and total
|
|
125
|
+
* throughput remain excluded.
|
|
126
|
+
*
|
|
127
|
+
* A documented absent effective anti-aliasing response resolves to an identity
|
|
128
|
+
* component at zero offset. An unknown response (field omitted) or a
|
|
129
|
+
* present-but-unresolved response fails closed.
|
|
130
|
+
*/
|
|
131
|
+
export declare function resolveAntiAliasingSpatialKernel(profileInput: SensorOpticalStackProfile): ResolvedAntiAliasingSpatialKernel;
|
|
132
|
+
//# sourceMappingURL=optical-stack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optical-stack.d.ts","sourceRoot":"","sources":["../../src/sensor/optical-stack.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAKxC,MAAM,MAAM,+BAA+B,GACvC,aAAa,GACb,cAAc,GACd,iBAAiB,GACjB,iBAAiB,GACjB,uBAAuB,GACvB,YAAY,GACZ,sBAAsB,CAAC;AAE3B,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,KAAK,EAAE,SAAS,+BAA+B,EAAE,CAAC;IAClD,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACzC;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC/B,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC;;;OAGG;IACH,kBAAkB,EAAE,YAAY,CAAC;CAClC;AAED,MAAM,WAAW,+BAA+B;IAC9C;;;OAGG;IACH,iBAAiB,EAAE;QACjB,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACX,CAAC;IACF;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,0CAA0C,GAClD;IACE;;;;OAIG;IACH,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACzC,GACD;IACE;;;OAGG;IACH,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACzC,GACD;IACE;;;OAGG;IACH,IAAI,EAAE,mCAAmC,CAAC;IAC1C,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,KAAK,EACH,uDAAuD,CAAC;IAC1D,UAAU,EAAE,SAAS,+BAA+B,EAAE,CAAC;CACxD,CAAC;AAEN,MAAM,WAAW,yBAAyB;IACxC,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACxC;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,SAAS,2BAA2B,EAAE,CAAC;IAC3D;;;;;;OAMG;IACH,oCAAoC,CAAC,EAAE,0CAA0C,CAAC;IAClF;;OAEG;IACH,SAAS,CAAC,EAAE,0BAA0B,CAAC;CACxC;AAED,MAAM,WAAW,iCAAiC;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EACb,QAAQ,GACR,mCAAmC,CAAC;IACxC,gBAAgB,EAAE,wBAAwB,CAAC;IAC3C,UAAU,EAAE,SAAS,+BAA+B,EAAE,CAAC;IACvD,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,KAAK,CAAC;IAC1B,4BAA4B,EAAE,KAAK,CAAC;IACpC,uBAAuB,EAAE,KAAK,CAAC;IAC/B,4BAA4B,EAAE,KAAK,CAAC;IACpC,8BAA8B,EAAE,KAAK,CAAC;IACtC,yBAAyB,EAAE,KAAK,CAAC;IACjC,+BAA+B,EAAE,KAAK,CAAC;IACvC,+BAA+B,EAAE,KAAK,CAAC;IACvC,UAAU,EAAE;QACV,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;QACvC,oBAAoB,EAAE,SAAS,kBAAkB,EAAE,CAAC;KACrD,CAAC;CACH;AA0TD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,OAAO,GACb,yBAAyB,CAuE3B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,yBAAyB,GACtC,iCAAiC,CAyFnC"}
|