{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://micarrsim.local/schemas/result.schema.json", "title": "micarrsim simulation result", "type": "object", "additionalProperties": false, "required": [ "schemaVersion", "kind", "experimentId", "arrayId", "sceneId", "createdAt", "algorithm", "backend", "inputHash", "signalStats", "timingMs", "bands" ], "properties": { "schemaVersion": { "const": "1.1.0" }, "kind": { "const": "micarrsim.result" }, "experimentId": { "type": "string", "minLength": 1 }, "arrayId": { "type": "string", "minLength": 1 }, "sceneId": { "type": "string", "minLength": 1 }, "createdAt": { "type": "string", "format": "date-time" }, "algorithm": { "enum": ["das", "das-phat", "gcc-phat"] }, "backend": { "enum": ["cpu", "webgpu"] }, "inputHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" }, "signalStats": { "type": "object", "additionalProperties": false, "required": ["preNormalizationPeak", "appliedScale", "clippedSampleCount", "sampling"], "properties": { "preNormalizationPeak": { "type": "number", "minimum": 0 }, "appliedScale": { "type": "number", "minimum": 0 }, "clippedSampleCount": { "type": "integer", "minimum": 0 }, "acousticModel": { "enum": ["free-field", "shoebox"] }, "acousticPathCount": { "type": "integer", "minimum": 0 }, "acousticPathCounts": { "type": "object", "additionalProperties": false, "properties": { "direct": { "type": "integer", "minimum": 0 }, "reflection": { "type": "integer", "minimum": 0 }, "scattering": { "type": "integer", "minimum": 0 }, "diffraction": { "type": "integer", "minimum": 0 }, "diffuse": { "type": "integer", "minimum": 0 } } }, "sampling": { "$ref": "#/$defs/sampling" } } }, "timingMs": { "type": "object", "additionalProperties": false, "required": ["total", "localization", "beamforming"], "properties": { "total": { "type": "number", "minimum": 0 }, "signalGeneration": { "type": "number", "minimum": 0 }, "localization": { "type": "number", "minimum": 0 }, "beamforming": { "type": "number", "minimum": 0 } } }, "environment": { "type": "object", "additionalProperties": { "type": ["string", "number", "boolean"] } }, "bands": { "type": "array", "minItems": 1, "maxItems": 8, "items": { "$ref": "#/$defs/bandResult" } } }, "$defs": { "position": { "type": "array", "prefixItems": [{ "type": "number" }, { "type": "number" }, { "type": "number" }], "items": false, "minItems": 3, "maxItems": 3 }, "sampling": { "type": "object", "additionalProperties": false, "required": ["model", "sampleRate", "nyquistHz", "toneObservations"], "properties": { "model": { "const": "ideal-real-sampler-no-antialias-filter" }, "sampleRate": { "type": "integer", "minimum": 8000, "maximum": 192000 }, "nyquistHz": { "type": "number", "exclusiveMinimum": 0 }, "toneObservations": { "type": "array", "maxItems": 64, "items": { "type": "object", "additionalProperties": false, "required": [ "scope", "id", "analogFrequencyHz", "adcFrequencyHz", "signedAdcFrequencyHz", "aliased", "spectralInversion", "dcEdge", "nyquistEdge", "phaseDegenerate" ], "properties": { "scope": { "enum": ["source", "ambient"] }, "id": { "type": "string", "minLength": 1 }, "analogFrequencyHz": { "type": "number", "exclusiveMinimum": 0, "maximum": 1000000 }, "adcFrequencyHz": { "type": "number", "minimum": 0 }, "signedAdcFrequencyHz": { "type": "number" }, "aliased": { "type": "boolean" }, "spectralInversion": { "type": "boolean" }, "dcEdge": { "type": "boolean" }, "nyquistEdge": { "type": "boolean" }, "phaseDegenerate": { "type": "boolean" } } } } } }, "frequencyObservation": { "type": "object", "additionalProperties": false, "required": [ "model", "sampleRate", "nyquistHz", "fftSize", "binWidthHz", "requestedMinHz", "requestedMaxHz", "aliased", "crossesFirstNyquist", "localizationInputModel", "selectionModel", "localizationModel", "originalCarrierUsed", "aliasOrderResolution", "foldBoundaryCount", "continuousManyToOne", "gridManyToOne", "foldSegments", "adcBins", "adcBinCenterRanges", "adcBinSetKey", "equivalentBandIds" ], "properties": { "model": { "const": "ideal-real-sampler-no-antialias-filter" }, "sampleRate": { "type": "integer", "minimum": 8000, "maximum": 192000 }, "nyquistHz": { "type": "number", "exclusiveMinimum": 0 }, "fftSize": { "enum": [128, 256, 512, 1024, 2048, 4096] }, "binWidthHz": { "type": "number", "exclusiveMinimum": 0 }, "requestedMinHz": { "type": "number", "minimum": 0, "maximum": 1000000 }, "requestedMaxHz": { "type": "number", "exclusiveMinimum": 0, "maximum": 1000000 }, "aliased": { "type": "boolean" }, "crossesFirstNyquist": { "type": "boolean" }, "localizationInputModel": { "const": "observed-one-sided-real-fft-bins" }, "selectionModel": { "const": "fft-bin-center-membership" }, "localizationModel": { "enum": [ "spherical-steering-at-positive-adc-bin-frequency", "band-limited-gcc-phat-geometric-lag" ] }, "originalCarrierUsed": { "const": false }, "aliasOrderResolution": { "enum": ["not-applicable", "not-attempted"] }, "foldBoundaryCount": { "type": "integer", "minimum": 0, "maximum": 512 }, "continuousManyToOne": { "type": "boolean" }, "gridManyToOne": { "type": "boolean" }, "foldSegments": { "type": "array", "minItems": 1, "maxItems": 513, "items": { "$ref": "#/$defs/foldSegment" } }, "adcBins": { "type": "array", "minItems": 1, "maxItems": 2049, "uniqueItems": true, "items": { "type": "integer", "minimum": 0, "maximum": 2048 } }, "adcBinCenterRanges": { "type": "array", "minItems": 1, "maxItems": 2049, "items": { "type": "object", "additionalProperties": false, "required": [ "firstBin", "lastBin", "firstBinCenterHz", "lastBinCenterHz" ], "properties": { "firstBin": { "type": "integer", "minimum": 0, "maximum": 2048 }, "lastBin": { "type": "integer", "minimum": 0, "maximum": 2048 }, "firstBinCenterHz": { "type": "number", "minimum": 0 }, "lastBinCenterHz": { "type": "number", "minimum": 0 } } } }, "adcBinSetKey": { "type": "string", "minLength": 1, "maxLength": 16384 }, "equivalentBandIds": { "type": "array", "maxItems": 7, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } } } }, "foldSegment": { "type": "object", "additionalProperties": false, "required": [ "analogMinHz", "analogMaxHz", "signedAdcStartHz", "signedAdcEndHz", "inverted", "aliasOrder", "nyquistZone" ], "properties": { "analogMinHz": { "type": "number", "minimum": 0, "maximum": 1000000 }, "analogMaxHz": { "type": "number", "exclusiveMinimum": 0, "maximum": 1000000 }, "signedAdcStartHz": { "type": "number" }, "signedAdcEndHz": { "type": "number" }, "inverted": { "type": "boolean" }, "aliasOrder": { "type": "integer", "minimum": 0 }, "nyquistZone": { "type": "integer", "minimum": 1 } } }, "map": { "type": "object", "additionalProperties": false, "required": ["rows", "columns", "scale", "values"], "properties": { "rows": { "type": "integer", "minimum": 1, "maximum": 512 }, "columns": { "type": "integer", "minimum": 1, "maximum": 512 }, "scale": { "enum": ["power", "score", "normalized", "db"] }, "values": { "type": "array", "minItems": 1, "maxItems": 262144, "items": { "type": "number" } } } }, "peak": { "type": "object", "additionalProperties": false, "required": ["position", "value"], "properties": { "sourceId": { "type": "string", "minLength": 1 }, "position": { "$ref": "#/$defs/position" }, "value": { "type": "number", "minimum": 0 }, "beamSpread": { "$ref": "#/$defs/beamSpread" }, "localizationErrorM": { "type": "number", "minimum": 0 }, "localizationErrorPixels": { "type": "number", "minimum": 0 } } }, "beamSpread": { "type": "object", "additionalProperties": false, "required": [ "calibrated", "method", "halfPowerRatio", "thresholdValue", "pixelCount", "centroid", "covarianceM2", "ellipse" ], "properties": { "calibrated": { "const": false }, "method": { "enum": [ "connected-half-power-power-weighted-covariance", "connected-half-maximum-score-weighted-covariance" ] }, "halfPowerRatio": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 }, "thresholdValue": { "type": "number", "minimum": 0 }, "pixelCount": { "type": "integer", "minimum": 0, "maximum": 262144 }, "centroid": { "$ref": "#/$defs/position" }, "covarianceM2": { "type": "object", "additionalProperties": false, "required": ["xx", "xy", "yy"], "properties": { "xx": { "type": "number", "minimum": 0 }, "xy": { "type": "number" }, "yy": { "type": "number", "minimum": 0 } } }, "ellipse": { "type": "object", "additionalProperties": false, "required": [ "axisScale", "angleReference", "majorRmsRadiusM", "minorRmsRadiusM", "angleDeg" ], "properties": { "axisScale": { "const": "rms" }, "angleReference": { "const": "counterclockwise-from-positive-x" }, "majorRmsRadiusM": { "type": "number", "minimum": 0 }, "minorRmsRadiusM": { "type": "number", "minimum": 0 }, "angleDeg": { "type": "number", "minimum": -180, "maximum": 180 } } } } }, "evaluation": { "type": "object", "additionalProperties": false, "required": [ "version", "truthRadiusM", "matchToleranceM", "detectionThresholdRatio", "detectionThresholdValue", "minimumPeakDistanceM", "sidelobeExclusionRadiusM", "halfPowerRatio", "dynamicRangeDb", "maximumDetections", "truthSelection" ], "properties": { "version": { "const": "1.0.0" }, "truthRadiusM": { "type": "number", "minimum": 0 }, "matchToleranceM": { "type": "number", "minimum": 0 }, "detectionThresholdRatio": { "type": "number", "minimum": 0, "maximum": 1 }, "detectionThresholdValue": { "type": "number", "minimum": 0 }, "detectionMethod": { "enum": ["local-max", "connected-components", "watershed"] }, "minimumPeakDistanceM": { "type": "number", "minimum": 0 }, "sidelobeExclusionRadiusM": { "type": "number", "minimum": 0 }, "halfPowerRatio": { "type": "number", "exclusiveMinimum": 0, "maximum": 1 }, "dynamicRangeDb": { "type": "number", "minimum": 0 }, "maximumDetections": { "type": "integer", "minimum": 1, "maximum": 128 }, "truthSelection": { "const": "tone-analog-interval-or-nearest-adc-bin-and-all-nontone-sources" } } }, "processedMap": { "type": "object", "additionalProperties": false, "required": ["algorithm", "map"], "properties": { "algorithm": { "enum": ["damas", "clean-sc", "custom"] }, "map": { "$ref": "#/$defs/map" } } }, "bandResult": { "type": "object", "additionalProperties": false, "required": ["id", "color", "rawMap", "frequencyObservation", "peaks", "metrics"], "properties": { "id": { "type": "string", "minLength": 1 }, "color": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$" }, "rawMap": { "$ref": "#/$defs/map" }, "displayMap": { "$ref": "#/$defs/map" }, "frequencyObservation": { "$ref": "#/$defs/frequencyObservation" }, "evaluation": { "$ref": "#/$defs/evaluation" }, "processedMaps": { "type": "array", "maxItems": 8, "items": { "$ref": "#/$defs/processedMap" } }, "peaks": { "type": "array", "maxItems": 128, "items": { "$ref": "#/$defs/peak" } }, "metrics": { "type": "object", "additionalProperties": false, "properties": { "peakToSidelobeDb": { "type": "number" }, "energyInsideTruthRatio": { "type": "number", "minimum": 0, "maximum": 1 }, "precision": { "type": "number", "minimum": 0, "maximum": 1 }, "recall": { "type": "number", "minimum": 0, "maximum": 1 }, "mainLobeWidthM": { "type": "number", "minimum": 0 } } } } } } }