edfcore 0.1.6 → 0.1.7
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/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/envelope.d.ts +48 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +263 -0
- package/dist/envelope.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +49 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/constants.ts +1 -1
- package/src/envelope.ts +352 -0
- package/src/index.ts +5 -0
- package/src/types.ts +53 -0
package/dist/constants.d.ts
CHANGED
|
@@ -109,5 +109,5 @@ export declare const SIGNAL_FIELD_BLOCK_OFFSETS: {
|
|
|
109
109
|
readonly reserved: 224;
|
|
110
110
|
};
|
|
111
111
|
/** Published package version. Kept in sync with package.json by a test. */
|
|
112
|
-
export declare const VERSION = "0.1.
|
|
112
|
+
export declare const VERSION = "0.1.7";
|
|
113
113
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.js
CHANGED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Min/max envelope decimation.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. A twelve-hour recording at 256 Hz is eleven million samples per channel, and a plot is
|
|
5
|
+
* a thousand pixels wide. Something has to reduce eleven million numbers to a thousand, and which
|
|
6
|
+
* reduction you pick decides whether the picture is true.
|
|
7
|
+
*
|
|
8
|
+
* Taking every 11,000th sample is the obvious choice and the wrong one: a spike, a spindle or an
|
|
9
|
+
* artifact is a handful of samples wide, so subsampling hits it with probability near zero and
|
|
10
|
+
* the trace looks calm exactly where a reader most needs it not to. Keeping the MINIMUM and
|
|
11
|
+
* MAXIMUM of each bucket keeps every extreme, at two numbers per pixel. That is the reduction a
|
|
12
|
+
* waveform viewer wants, and it is why this exists as its own function rather than as an option
|
|
13
|
+
* on `readWindow`: the return type is different, so an option would have to change it.
|
|
14
|
+
*
|
|
15
|
+
* This is decimation for display, not analysis. There is no filtering and no anti-aliasing —
|
|
16
|
+
* an envelope is a faithful summary of the samples that are there, not a resampled signal, and
|
|
17
|
+
* resampling remains a permanent non-goal.
|
|
18
|
+
*
|
|
19
|
+
* Memory is bounded by the record chunk, never by the window: a run of a million records is
|
|
20
|
+
* folded into the buckets a chunk at a time, so an envelope over a whole recording costs the
|
|
21
|
+
* buckets plus one chunk.
|
|
22
|
+
*/
|
|
23
|
+
import type { EdfChunkSignal, EdfEnvelopeChunk, EdfEnvelopeSignal, EdfPhysicalEnvelope, EdfRecording, EdfSignal, EnvelopeSelection, ReadOptions } from './types.js';
|
|
24
|
+
/**
|
|
25
|
+
* Reduces a time window to per-bucket minima and maxima, one chunk per contiguous run.
|
|
26
|
+
*
|
|
27
|
+
* The shape mirrors `readWindow` exactly — an array of chunks, one per run, empty when the window
|
|
28
|
+
* selects nothing — so a caller that already handles gaps handles envelopes for free.
|
|
29
|
+
*/
|
|
30
|
+
export declare function readEnvelope(recording: EdfRecording, selection: EnvelopeSelection, options?: ReadOptions): Promise<readonly EdfEnvelopeChunk[]>;
|
|
31
|
+
/**
|
|
32
|
+
* Converts a digital envelope to physical units.
|
|
33
|
+
*
|
|
34
|
+
* Not `toPhysical` applied twice, and the reason is the sign of the gain. The affine transform
|
|
35
|
+
* `bitValue * (offset + digital)` is DECREASING when `bitValue` is negative — a spec-sanctioned
|
|
36
|
+
* arrangement that edfcore reports rather than rejects — and a decreasing map sends the smallest
|
|
37
|
+
* digital value to the largest physical one. Mapping `min` to `min` would then produce an
|
|
38
|
+
* envelope whose lower bound is above its upper bound, and a viewer would draw it inside out.
|
|
39
|
+
*/
|
|
40
|
+
export declare function toPhysicalEnvelope(signal: EdfSignal, envelope: EdfEnvelopeSignal): EdfPhysicalEnvelope;
|
|
41
|
+
/**
|
|
42
|
+
* The envelope of an already-decoded chunk signal, without another read.
|
|
43
|
+
*
|
|
44
|
+
* For a caller who has samples in hand and wants them plotted: same reduction, same bucket rule,
|
|
45
|
+
* no I/O.
|
|
46
|
+
*/
|
|
47
|
+
export declare function envelopeOfSamples(chunkSignal: EdfChunkSignal, buckets: number): EdfEnvelopeSignal;
|
|
48
|
+
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AASH,OAAO,KAAK,EACV,cAAc,EAEd,gBAAgB,EAChB,iBAAiB,EAEjB,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,WAAW,EAEZ,MAAM,YAAY,CAAC;AAsBpB;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,iBAAiB,EAC5B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,SAAS,gBAAgB,EAAE,CAAC,CAkBtC;AAsLD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,iBAAiB,GAC1B,mBAAmB,CAuBrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,iBAAiB,CAkCjG"}
|
package/dist/envelope.js
ADDED
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Min/max envelope decimation.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. A twelve-hour recording at 256 Hz is eleven million samples per channel, and a plot is
|
|
5
|
+
* a thousand pixels wide. Something has to reduce eleven million numbers to a thousand, and which
|
|
6
|
+
* reduction you pick decides whether the picture is true.
|
|
7
|
+
*
|
|
8
|
+
* Taking every 11,000th sample is the obvious choice and the wrong one: a spike, a spindle or an
|
|
9
|
+
* artifact is a handful of samples wide, so subsampling hits it with probability near zero and
|
|
10
|
+
* the trace looks calm exactly where a reader most needs it not to. Keeping the MINIMUM and
|
|
11
|
+
* MAXIMUM of each bucket keeps every extreme, at two numbers per pixel. That is the reduction a
|
|
12
|
+
* waveform viewer wants, and it is why this exists as its own function rather than as an option
|
|
13
|
+
* on `readWindow`: the return type is different, so an option would have to change it.
|
|
14
|
+
*
|
|
15
|
+
* This is decimation for display, not analysis. There is no filtering and no anti-aliasing —
|
|
16
|
+
* an envelope is a faithful summary of the samples that are there, not a resampled signal, and
|
|
17
|
+
* resampling remains a permanent non-goal.
|
|
18
|
+
*
|
|
19
|
+
* Memory is bounded by the record chunk, never by the window: a run of a million records is
|
|
20
|
+
* folded into the buckets a chunk at a time, so an envelope over a whole recording costs the
|
|
21
|
+
* buckets plus one chunk.
|
|
22
|
+
*/
|
|
23
|
+
import { decodeDigitalCounted } from './decode/digital.js';
|
|
24
|
+
import { EdfScalingError } from './errors.js';
|
|
25
|
+
import { readRecordBytes } from './io/read.js';
|
|
26
|
+
import { scanChunkRecords } from './record-index.js';
|
|
27
|
+
import { decodeAnnotations } from './tal/annotations.js';
|
|
28
|
+
import { ticksToSeconds } from './tal/ticks.js';
|
|
29
|
+
import { resolveTimeWindow } from './time/window.js';
|
|
30
|
+
function assertPositiveInteger(value, name) {
|
|
31
|
+
if (Number.isSafeInteger(value) && value > 0)
|
|
32
|
+
return;
|
|
33
|
+
throw new RangeError(`readEnvelope(): ${name} must be a positive whole number, received ${value}. ` +
|
|
34
|
+
'Next: pass the pixel width of the plot you are drawing into.');
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Reduces a time window to per-bucket minima and maxima, one chunk per contiguous run.
|
|
38
|
+
*
|
|
39
|
+
* The shape mirrors `readWindow` exactly — an array of chunks, one per run, empty when the window
|
|
40
|
+
* selects nothing — so a caller that already handles gaps handles envelopes for free.
|
|
41
|
+
*/
|
|
42
|
+
export async function readEnvelope(recording, selection, options) {
|
|
43
|
+
assertPositiveInteger(selection.buckets, 'buckets');
|
|
44
|
+
// Validated before the window is resolved, for the same reason readWindow does it: a bad
|
|
45
|
+
// signalIndices must not read back as an empty stretch of recording.
|
|
46
|
+
resolveEnvelopeSignals(recording.header, selection.signalIndices);
|
|
47
|
+
const ranges = resolveTimeWindow(recording.timeline, recording.index, selection.startSeconds, selection.durationSeconds);
|
|
48
|
+
const chunks = [];
|
|
49
|
+
for (const records of ranges) {
|
|
50
|
+
chunks.push(await reduceRange(recording, records, selection, options));
|
|
51
|
+
}
|
|
52
|
+
return Object.freeze(chunks);
|
|
53
|
+
}
|
|
54
|
+
function resolveEnvelopeSignals(header, signalIndices) {
|
|
55
|
+
const seen = new Set();
|
|
56
|
+
const signals = [];
|
|
57
|
+
for (const signalIndex of signalIndices) {
|
|
58
|
+
if (seen.has(signalIndex))
|
|
59
|
+
continue;
|
|
60
|
+
seen.add(signalIndex);
|
|
61
|
+
const signal = header.signals[signalIndex];
|
|
62
|
+
if (signal === undefined) {
|
|
63
|
+
throw new RangeError(`readEnvelope(): signalIndex ${signalIndex} is outside the ${header.signals.length} ` +
|
|
64
|
+
'signals this file declares. Next: pass an index from header.dataSignalIndices.');
|
|
65
|
+
}
|
|
66
|
+
if (signal.kind === 'annotations') {
|
|
67
|
+
throw new RangeError(`readEnvelope(): signal ${signalIndex} (${JSON.stringify(signal.label)}) is this file's ` +
|
|
68
|
+
'annotations channel; its bytes are TAL text, not samples, so an envelope over them ' +
|
|
69
|
+
'would be an envelope over ASCII. Next: call readAnnotations() instead.');
|
|
70
|
+
}
|
|
71
|
+
signals.push(signal);
|
|
72
|
+
}
|
|
73
|
+
return signals;
|
|
74
|
+
}
|
|
75
|
+
async function reduceRange(recording, records, selection, options) {
|
|
76
|
+
const { source, header, timeline } = recording;
|
|
77
|
+
const signals = resolveEnvelopeSignals(header, selection.signalIndices);
|
|
78
|
+
const diagnostics = [];
|
|
79
|
+
// More buckets than the densest signal has samples in this run would leave holes that mean
|
|
80
|
+
// nothing, so the request is clamped rather than honoured literally.
|
|
81
|
+
const densestSamples = signals.reduce((most, signal) => Math.max(most, signal.samplesPerRecord * records.count), 0);
|
|
82
|
+
const bucketCount = Math.max(1, Math.min(selection.buckets, densestSamples));
|
|
83
|
+
const accumulators = signals.map((signal) => ({
|
|
84
|
+
signal,
|
|
85
|
+
// Int32Array zero-fills, so the sentinels have to be written explicitly: a bucket nothing
|
|
86
|
+
// landed in must be distinguishable from a bucket whose samples were all zero.
|
|
87
|
+
min: new Int32Array(bucketCount).fill(0),
|
|
88
|
+
max: new Int32Array(bucketCount).fill(0),
|
|
89
|
+
counts: new Int32Array(bucketCount),
|
|
90
|
+
consumed: 0,
|
|
91
|
+
outOfRange: 0,
|
|
92
|
+
scratch: undefined,
|
|
93
|
+
}));
|
|
94
|
+
const chunkRecords = scanChunkRecords(header, options?.maxMaterializeBytes);
|
|
95
|
+
let byteLength = 0;
|
|
96
|
+
let firstOnsetTicks;
|
|
97
|
+
let lastOnsetTicks;
|
|
98
|
+
let scanned = 0;
|
|
99
|
+
while (scanned < records.count) {
|
|
100
|
+
const slice = {
|
|
101
|
+
start: records.start + scanned,
|
|
102
|
+
count: Math.min(chunkRecords, records.count - scanned),
|
|
103
|
+
};
|
|
104
|
+
const bytes = await readRecordBytes(source, header, slice, options);
|
|
105
|
+
byteLength += bytes.length;
|
|
106
|
+
// Never strict: a defect in one record must not cost the caller the whole picture.
|
|
107
|
+
const annotations = decodeAnnotations(header, bytes, slice, {
|
|
108
|
+
originTicks: timeline.startOffsetTicks,
|
|
109
|
+
});
|
|
110
|
+
for (const diagnostic of annotations.diagnostics)
|
|
111
|
+
diagnostics.push(diagnostic);
|
|
112
|
+
const onsets = annotations.recordOnsetTicks;
|
|
113
|
+
if (firstOnsetTicks === undefined)
|
|
114
|
+
firstOnsetTicks = onsets[0];
|
|
115
|
+
const lastInSlice = onsets[slice.count - 1];
|
|
116
|
+
if (lastInSlice !== undefined)
|
|
117
|
+
lastOnsetTicks = lastInSlice;
|
|
118
|
+
for (const accumulator of accumulators) {
|
|
119
|
+
foldChunk(accumulator, header, bytes, slice, records, bucketCount, options);
|
|
120
|
+
}
|
|
121
|
+
scanned += slice.count;
|
|
122
|
+
}
|
|
123
|
+
const durationTicks = header.recordDurationTicks;
|
|
124
|
+
const startTicks = (firstOnsetTicks ?? timeline.startOffsetTicks) - timeline.startOffsetTicks;
|
|
125
|
+
const spanTicks = firstOnsetTicks !== undefined && lastOnsetTicks !== undefined
|
|
126
|
+
? lastOnsetTicks + durationTicks - firstOnsetTicks
|
|
127
|
+
: durationTicks * BigInt(records.count);
|
|
128
|
+
const startSeconds = ticksToSeconds(startTicks);
|
|
129
|
+
const durationSeconds = ticksToSeconds(spanTicks);
|
|
130
|
+
const envelopeSignals = accumulators.map((accumulator) => ({
|
|
131
|
+
signalIndex: accumulator.signal.index,
|
|
132
|
+
min: accumulator.min,
|
|
133
|
+
max: accumulator.max,
|
|
134
|
+
counts: accumulator.counts,
|
|
135
|
+
sampleCount: accumulator.consumed,
|
|
136
|
+
firstSampleIndex: records.start * accumulator.signal.samplesPerRecord,
|
|
137
|
+
startSeconds,
|
|
138
|
+
outOfDigitalRangeCount: accumulator.outOfRange,
|
|
139
|
+
}));
|
|
140
|
+
return Object.freeze({
|
|
141
|
+
records,
|
|
142
|
+
startSeconds,
|
|
143
|
+
durationSeconds,
|
|
144
|
+
bucketCount,
|
|
145
|
+
secondsPerBucket: bucketCount > 0 ? durationSeconds / bucketCount : 0,
|
|
146
|
+
byteLength,
|
|
147
|
+
signals: Object.freeze(envelopeSignals),
|
|
148
|
+
precededByGap: undefined,
|
|
149
|
+
diagnostics: Object.freeze(diagnostics),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Folds one chunk of one signal into the buckets.
|
|
154
|
+
*
|
|
155
|
+
* The bucket of a sample is decided by its position on the WHOLE run's grid, not the chunk's, so
|
|
156
|
+
* the chunk size cannot move a sample from one bucket to another. That is the same rule the
|
|
157
|
+
* record scan learned the hard way: chunking bounds memory and must never change the answer.
|
|
158
|
+
*/
|
|
159
|
+
function foldChunk(accumulator, header, bytes, slice, run, bucketCount, options) {
|
|
160
|
+
const totalSamples = accumulator.signal.samplesPerRecord * run.count;
|
|
161
|
+
if (totalSamples === 0)
|
|
162
|
+
return;
|
|
163
|
+
const decoded = decodeDigitalCounted(header, bytes, slice, accumulator.signal.index, accumulator.scratch, options);
|
|
164
|
+
// decodeDigitalCounted reuses the buffer when it is large enough, so the allocation happens
|
|
165
|
+
// once per signal per run rather than once per chunk.
|
|
166
|
+
accumulator.scratch = decoded.digital;
|
|
167
|
+
accumulator.outOfRange += decoded.outOfDigitalRangeCount;
|
|
168
|
+
const samples = decoded.digital;
|
|
169
|
+
// The buffer is reused across chunks, so it can be LONGER than this slice. The slice's own
|
|
170
|
+
// sample count is what must be folded, or the tail of a previous, larger chunk is counted again.
|
|
171
|
+
const sampleCount = accumulator.signal.samplesPerRecord * slice.count;
|
|
172
|
+
const { min, max, counts } = accumulator;
|
|
173
|
+
let position = accumulator.consumed;
|
|
174
|
+
for (let i = 0; i < sampleCount; i += 1) {
|
|
175
|
+
const value = samples[i];
|
|
176
|
+
// Integer arithmetic on the run grid: floor(position * buckets / totalSamples).
|
|
177
|
+
const bucket = Math.min(bucketCount - 1, Math.floor((position * bucketCount) / totalSamples));
|
|
178
|
+
const seen = counts[bucket];
|
|
179
|
+
if (seen === 0) {
|
|
180
|
+
min[bucket] = value;
|
|
181
|
+
max[bucket] = value;
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
if (value < min[bucket])
|
|
185
|
+
min[bucket] = value;
|
|
186
|
+
if (value > max[bucket])
|
|
187
|
+
max[bucket] = value;
|
|
188
|
+
}
|
|
189
|
+
counts[bucket] = seen + 1;
|
|
190
|
+
position += 1;
|
|
191
|
+
}
|
|
192
|
+
accumulator.consumed = position;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Converts a digital envelope to physical units.
|
|
196
|
+
*
|
|
197
|
+
* Not `toPhysical` applied twice, and the reason is the sign of the gain. The affine transform
|
|
198
|
+
* `bitValue * (offset + digital)` is DECREASING when `bitValue` is negative — a spec-sanctioned
|
|
199
|
+
* arrangement that edfcore reports rather than rejects — and a decreasing map sends the smallest
|
|
200
|
+
* digital value to the largest physical one. Mapping `min` to `min` would then produce an
|
|
201
|
+
* envelope whose lower bound is above its upper bound, and a viewer would draw it inside out.
|
|
202
|
+
*/
|
|
203
|
+
export function toPhysicalEnvelope(signal, envelope) {
|
|
204
|
+
const scale = signal.scale;
|
|
205
|
+
if (scale === undefined) {
|
|
206
|
+
throw new EdfScalingError(`signal ${signal.index} (${JSON.stringify(signal.label)}) has no usable scale, so its ` +
|
|
207
|
+
'envelope has no physical units. Next: check signal.scale before converting, or plot ' +
|
|
208
|
+
'the digital envelope as it is.', { code: 'SCALE_UNAVAILABLE', signalIndex: signal.index, label: signal.label });
|
|
209
|
+
}
|
|
210
|
+
const length = envelope.min.length;
|
|
211
|
+
const low = new Float64Array(length);
|
|
212
|
+
const high = new Float64Array(length);
|
|
213
|
+
const decreasing = scale.bitValue < 0;
|
|
214
|
+
for (let i = 0; i < length; i += 1) {
|
|
215
|
+
const a = scale.bitValue * (scale.offset + envelope.min[i]);
|
|
216
|
+
const b = scale.bitValue * (scale.offset + envelope.max[i]);
|
|
217
|
+
low[i] = decreasing ? b : a;
|
|
218
|
+
high[i] = decreasing ? a : b;
|
|
219
|
+
}
|
|
220
|
+
return { min: low, max: high };
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* The envelope of an already-decoded chunk signal, without another read.
|
|
224
|
+
*
|
|
225
|
+
* For a caller who has samples in hand and wants them plotted: same reduction, same bucket rule,
|
|
226
|
+
* no I/O.
|
|
227
|
+
*/
|
|
228
|
+
export function envelopeOfSamples(chunkSignal, buckets) {
|
|
229
|
+
assertPositiveInteger(buckets, 'buckets');
|
|
230
|
+
const samples = chunkSignal.digital;
|
|
231
|
+
const total = samples.length;
|
|
232
|
+
const bucketCount = Math.max(1, Math.min(buckets, total));
|
|
233
|
+
const min = new Int32Array(bucketCount);
|
|
234
|
+
const max = new Int32Array(bucketCount);
|
|
235
|
+
const counts = new Int32Array(bucketCount);
|
|
236
|
+
for (let i = 0; i < total; i += 1) {
|
|
237
|
+
const value = samples[i];
|
|
238
|
+
const bucket = Math.min(bucketCount - 1, Math.floor((i * bucketCount) / total));
|
|
239
|
+
const seen = counts[bucket];
|
|
240
|
+
if (seen === 0) {
|
|
241
|
+
min[bucket] = value;
|
|
242
|
+
max[bucket] = value;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
if (value < min[bucket])
|
|
246
|
+
min[bucket] = value;
|
|
247
|
+
if (value > max[bucket])
|
|
248
|
+
max[bucket] = value;
|
|
249
|
+
}
|
|
250
|
+
counts[bucket] = seen + 1;
|
|
251
|
+
}
|
|
252
|
+
return {
|
|
253
|
+
signalIndex: chunkSignal.signalIndex,
|
|
254
|
+
min,
|
|
255
|
+
max,
|
|
256
|
+
counts,
|
|
257
|
+
sampleCount: total,
|
|
258
|
+
firstSampleIndex: chunkSignal.firstSampleIndex,
|
|
259
|
+
startSeconds: chunkSignal.startSeconds,
|
|
260
|
+
outOfDigitalRangeCount: chunkSignal.outOfDigitalRangeCount,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=envelope.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"envelope.js","sourceRoot":"","sources":["../src/envelope.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
/** The trailing `options` argument shared by every primitive that can allocate. */
|
|
23
23
|
export type { MaterializeOptions } from './decode/digital.js';
|
|
24
24
|
export type { FormatDiagnosticsOptions } from './diagnostics/format.js';
|
|
25
|
-
export type { AbortSignalLike, BlobLike, BuildIndexOptions, ByteSource, CacheOptions, DecodeAnnotationsOptions, EdfAnnotation, EdfAnnotationsResult, EdfCalendarDate, EdfChunk, EdfChunkSignal, EdfClockTime, EdfDiagnostic, EdfDiagnosticCode, EdfGap, EdfHeader, EdfInspection, EdfKnownDiagnosticCode, EdfLocation, EdfPatientId, EdfRawHeaderFields, EdfRawSignalFields, EdfRecordIndex, EdfRecording, EdfRecordingId, EdfScale, EdfSegment, EdfSeverity, EdfSignal, EdfStartTime, EdfTimeline, EdfVariant, FetchLike, HttpResponseLike, HttpSourceOptions, OpenOptions, ParseOptions, ReadOptions, RecordRange, RecordSelection, WindowSelection, } from './types.js';
|
|
25
|
+
export type { AbortSignalLike, BlobLike, BuildIndexOptions, ByteSource, CacheOptions, DecodeAnnotationsOptions, EdfAnnotation, EdfAnnotationsResult, EdfCalendarDate, EdfChunk, EdfChunkSignal, EdfClockTime, EdfDiagnostic, EdfDiagnosticCode, EdfEnvelopeChunk, EdfEnvelopeSignal, EdfGap, EdfHeader, EdfInspection, EdfKnownDiagnosticCode, EdfLocation, EdfPatientId, EdfPhysicalEnvelope, EdfRawHeaderFields, EdfRawSignalFields, EdfRecordIndex, EdfRecording, EdfRecordingId, EdfScale, EdfSegment, EdfSeverity, EdfSignal, EdfStartTime, EdfTimeline, EdfVariant, EnvelopeSelection, FetchLike, HttpResponseLike, HttpSourceOptions, OpenOptions, ParseOptions, ReadOptions, RecordRange, RecordSelection, WindowSelection, } from './types.js';
|
|
26
26
|
export type { AnyEdfError, EdfErrorKind, EdfFormatErrorInit } from './errors.js';
|
|
27
27
|
export { EdfAmbiguousChannelError, EdfBudgetError, EdfChannelNotFoundError, EdfError, EdfFormatError, EdfRangeError, EdfScalingError, EdfSourceError, isEdfError, } from './errors.js';
|
|
28
28
|
export { BDF_ANNOTATIONS_LABEL, BDF_DIGITAL_MAX, BDF_DIGITAL_MIN, EDF_ANNOTATIONS_LABEL, EDF_DIGITAL_MAX, EDF_DIGITAL_MIN, EDF_HEADER_BLOCK_BYTES, EDF_RECOMMENDED_MAX_RECORD_BYTES, TICKS_PER_SECOND, VERSION, } from './constants.js';
|
|
@@ -41,6 +41,7 @@ export { cachedSource } from './io/cached.js';
|
|
|
41
41
|
export { httpSource } from './io/http.js';
|
|
42
42
|
export { readHeader, readRecordBytes } from './io/read.js';
|
|
43
43
|
export { buildRecordIndex, buildTimeline } from './record-index.js';
|
|
44
|
+
export { envelopeOfSamples, readEnvelope, toPhysicalEnvelope } from './envelope.js';
|
|
44
45
|
export { inspectEdf } from './inspect.js';
|
|
45
46
|
export { openEdf, readAnnotations, readRecords, readWindow } from './recording.js';
|
|
46
47
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,mFAAmF;AACnF,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,YAAY,EACV,eAAe,EACf,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAUpB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EACvB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gCAAgC,EAChC,gBAAgB,EAChB,OAAO,GACR,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,mFAAmF;AACnF,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,YAAY,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACxE,YAAY,EACV,eAAe,EACf,QAAQ,EACR,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,wBAAwB,EACxB,aAAa,EACb,oBAAoB,EACpB,eAAe,EACf,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,aAAa,EACb,sBAAsB,EACtB,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,cAAc,EACd,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAUpB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EACvB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,aAAa,CAAC;AAMrB,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gCAAgC,EAChC,gBAAgB,EAChB,OAAO,GACR,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAQnE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAM1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAMpE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -54,6 +54,7 @@ export { buildRecordIndex, buildTimeline } from './record-index.js';
|
|
|
54
54
|
// ===========================================================================
|
|
55
55
|
// Convenience layer
|
|
56
56
|
// ===========================================================================
|
|
57
|
+
export { envelopeOfSamples, readEnvelope, toPhysicalEnvelope } from './envelope.js';
|
|
57
58
|
export { inspectEdf } from './inspect.js';
|
|
58
59
|
export { openEdf, readAnnotations, readRecords, readWindow } from './recording.js';
|
|
59
60
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAmEH,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EACvB,QAAQ,EACR,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,gCAAgC,EAChC,gBAAgB,EAChB,OAAO,GACR,MAAM,gBAAgB,CAAC;AAExB,8EAA8E;AAC9E,2EAA2E;AAC3E,2CAA2C;AAC3C,8EAA8E;AAE9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEnE,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAC3E,6CAA6C;AAC7C,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEpE,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -307,6 +307,55 @@ export interface EdfChunk {
|
|
|
307
307
|
readonly precededByGap: EdfGap | undefined;
|
|
308
308
|
readonly diagnostics: readonly EdfDiagnostic[];
|
|
309
309
|
}
|
|
310
|
+
/**
|
|
311
|
+
* One signal's min/max envelope over a window, at a resolution the caller chose.
|
|
312
|
+
*
|
|
313
|
+
* The unit is the bucket, not the sample: `min[i]` and `max[i]` are the extremes of every sample
|
|
314
|
+
* that fell in bucket `i`. Drawing a twelve-hour recording into a thousand pixels needs exactly
|
|
315
|
+
* this and nothing else — the peaks are what a reader of an EEG trace is looking at, and they
|
|
316
|
+
* are the first thing naive subsampling throws away.
|
|
317
|
+
*/
|
|
318
|
+
export interface EdfEnvelopeSignal {
|
|
319
|
+
readonly signalIndex: number;
|
|
320
|
+
/** Digital extremes per bucket. Convert with `toPhysicalEnvelope`, never with `toPhysical`. */
|
|
321
|
+
readonly min: Int32Array;
|
|
322
|
+
readonly max: Int32Array;
|
|
323
|
+
/** Samples that landed in each bucket. Zero where the window had no samples to cover it. */
|
|
324
|
+
readonly counts: Int32Array;
|
|
325
|
+
/** Total samples reduced, i.e. the sum of `counts`. */
|
|
326
|
+
readonly sampleCount: number;
|
|
327
|
+
readonly firstSampleIndex: number;
|
|
328
|
+
readonly startSeconds: number;
|
|
329
|
+
readonly outOfDigitalRangeCount: number;
|
|
330
|
+
}
|
|
331
|
+
/** A contiguous run of records, reduced to buckets. One per run, exactly as `readWindow` splits. */
|
|
332
|
+
export interface EdfEnvelopeChunk {
|
|
333
|
+
readonly records: RecordRange;
|
|
334
|
+
readonly startSeconds: number;
|
|
335
|
+
readonly durationSeconds: number;
|
|
336
|
+
/** Buckets actually filled. Never more than requested, and fewer for a short run. */
|
|
337
|
+
readonly bucketCount: number;
|
|
338
|
+
readonly secondsPerBucket: number;
|
|
339
|
+
readonly byteLength: number;
|
|
340
|
+
readonly signals: readonly EdfEnvelopeSignal[];
|
|
341
|
+
readonly precededByGap: EdfGap | undefined;
|
|
342
|
+
readonly diagnostics: readonly EdfDiagnostic[];
|
|
343
|
+
}
|
|
344
|
+
export interface EnvelopeSelection extends WindowSelection {
|
|
345
|
+
/**
|
|
346
|
+
* How many buckets to reduce the window into — in a viewer, the pixel width of the plot.
|
|
347
|
+
*
|
|
348
|
+
* A bucket per pixel is the point: asking for more buckets than the window has samples wastes
|
|
349
|
+
* work and yields empty buckets, so the count is clamped to the sample count of the densest
|
|
350
|
+
* signal in the run.
|
|
351
|
+
*/
|
|
352
|
+
readonly buckets: number;
|
|
353
|
+
}
|
|
354
|
+
/** A physical-unit envelope. Separate from the digital one for the same reason `toPhysical` is. */
|
|
355
|
+
export interface EdfPhysicalEnvelope {
|
|
356
|
+
readonly min: Float64Array;
|
|
357
|
+
readonly max: Float64Array;
|
|
358
|
+
}
|
|
310
359
|
export interface EdfAnnotation {
|
|
311
360
|
/** Verbatim on-disk value, relative to the header startdate/starttime (EDF+ 2.2.4). */
|
|
312
361
|
readonly onsetSecondsFromHeaderStart: number;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/constants.ts
CHANGED
package/src/envelope.ts
ADDED
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Min/max envelope decimation.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. A twelve-hour recording at 256 Hz is eleven million samples per channel, and a plot is
|
|
5
|
+
* a thousand pixels wide. Something has to reduce eleven million numbers to a thousand, and which
|
|
6
|
+
* reduction you pick decides whether the picture is true.
|
|
7
|
+
*
|
|
8
|
+
* Taking every 11,000th sample is the obvious choice and the wrong one: a spike, a spindle or an
|
|
9
|
+
* artifact is a handful of samples wide, so subsampling hits it with probability near zero and
|
|
10
|
+
* the trace looks calm exactly where a reader most needs it not to. Keeping the MINIMUM and
|
|
11
|
+
* MAXIMUM of each bucket keeps every extreme, at two numbers per pixel. That is the reduction a
|
|
12
|
+
* waveform viewer wants, and it is why this exists as its own function rather than as an option
|
|
13
|
+
* on `readWindow`: the return type is different, so an option would have to change it.
|
|
14
|
+
*
|
|
15
|
+
* This is decimation for display, not analysis. There is no filtering and no anti-aliasing —
|
|
16
|
+
* an envelope is a faithful summary of the samples that are there, not a resampled signal, and
|
|
17
|
+
* resampling remains a permanent non-goal.
|
|
18
|
+
*
|
|
19
|
+
* Memory is bounded by the record chunk, never by the window: a run of a million records is
|
|
20
|
+
* folded into the buckets a chunk at a time, so an envelope over a whole recording costs the
|
|
21
|
+
* buckets plus one chunk.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { decodeDigitalCounted } from './decode/digital.js';
|
|
25
|
+
import { EdfScalingError } from './errors.js';
|
|
26
|
+
import { readRecordBytes } from './io/read.js';
|
|
27
|
+
import { scanChunkRecords } from './record-index.js';
|
|
28
|
+
import { decodeAnnotations } from './tal/annotations.js';
|
|
29
|
+
import { ticksToSeconds } from './tal/ticks.js';
|
|
30
|
+
import { resolveTimeWindow } from './time/window.js';
|
|
31
|
+
import type {
|
|
32
|
+
EdfChunkSignal,
|
|
33
|
+
EdfDiagnostic,
|
|
34
|
+
EdfEnvelopeChunk,
|
|
35
|
+
EdfEnvelopeSignal,
|
|
36
|
+
EdfHeader,
|
|
37
|
+
EdfPhysicalEnvelope,
|
|
38
|
+
EdfRecording,
|
|
39
|
+
EdfSignal,
|
|
40
|
+
EnvelopeSelection,
|
|
41
|
+
ReadOptions,
|
|
42
|
+
RecordRange,
|
|
43
|
+
} from './types.js';
|
|
44
|
+
|
|
45
|
+
/** Per-signal accumulator, reused across every chunk of one contiguous run. */
|
|
46
|
+
interface Accumulator {
|
|
47
|
+
readonly signal: EdfSignal;
|
|
48
|
+
readonly min: Int32Array;
|
|
49
|
+
readonly max: Int32Array;
|
|
50
|
+
readonly counts: Int32Array;
|
|
51
|
+
/** Samples of this signal already folded in, i.e. its position on the run's sample grid. */
|
|
52
|
+
consumed: number;
|
|
53
|
+
outOfRange: number;
|
|
54
|
+
scratch: Int32Array | undefined;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function assertPositiveInteger(value: number, name: string): void {
|
|
58
|
+
if (Number.isSafeInteger(value) && value > 0) return;
|
|
59
|
+
throw new RangeError(
|
|
60
|
+
`readEnvelope(): ${name} must be a positive whole number, received ${value}. ` +
|
|
61
|
+
'Next: pass the pixel width of the plot you are drawing into.',
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Reduces a time window to per-bucket minima and maxima, one chunk per contiguous run.
|
|
67
|
+
*
|
|
68
|
+
* The shape mirrors `readWindow` exactly — an array of chunks, one per run, empty when the window
|
|
69
|
+
* selects nothing — so a caller that already handles gaps handles envelopes for free.
|
|
70
|
+
*/
|
|
71
|
+
export async function readEnvelope(
|
|
72
|
+
recording: EdfRecording,
|
|
73
|
+
selection: EnvelopeSelection,
|
|
74
|
+
options?: ReadOptions,
|
|
75
|
+
): Promise<readonly EdfEnvelopeChunk[]> {
|
|
76
|
+
assertPositiveInteger(selection.buckets, 'buckets');
|
|
77
|
+
// Validated before the window is resolved, for the same reason readWindow does it: a bad
|
|
78
|
+
// signalIndices must not read back as an empty stretch of recording.
|
|
79
|
+
resolveEnvelopeSignals(recording.header, selection.signalIndices);
|
|
80
|
+
|
|
81
|
+
const ranges = resolveTimeWindow(
|
|
82
|
+
recording.timeline,
|
|
83
|
+
recording.index,
|
|
84
|
+
selection.startSeconds,
|
|
85
|
+
selection.durationSeconds,
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
const chunks: EdfEnvelopeChunk[] = [];
|
|
89
|
+
for (const records of ranges) {
|
|
90
|
+
chunks.push(await reduceRange(recording, records, selection, options));
|
|
91
|
+
}
|
|
92
|
+
return Object.freeze(chunks);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function resolveEnvelopeSignals(
|
|
96
|
+
header: EdfHeader,
|
|
97
|
+
signalIndices: readonly number[],
|
|
98
|
+
): readonly EdfSignal[] {
|
|
99
|
+
const seen = new Set<number>();
|
|
100
|
+
const signals: EdfSignal[] = [];
|
|
101
|
+
for (const signalIndex of signalIndices) {
|
|
102
|
+
if (seen.has(signalIndex)) continue;
|
|
103
|
+
seen.add(signalIndex);
|
|
104
|
+
const signal = header.signals[signalIndex];
|
|
105
|
+
if (signal === undefined) {
|
|
106
|
+
throw new RangeError(
|
|
107
|
+
`readEnvelope(): signalIndex ${signalIndex} is outside the ${header.signals.length} ` +
|
|
108
|
+
'signals this file declares. Next: pass an index from header.dataSignalIndices.',
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
if (signal.kind === 'annotations') {
|
|
112
|
+
throw new RangeError(
|
|
113
|
+
`readEnvelope(): signal ${signalIndex} (${JSON.stringify(signal.label)}) is this file's ` +
|
|
114
|
+
'annotations channel; its bytes are TAL text, not samples, so an envelope over them ' +
|
|
115
|
+
'would be an envelope over ASCII. Next: call readAnnotations() instead.',
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
signals.push(signal);
|
|
119
|
+
}
|
|
120
|
+
return signals;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async function reduceRange(
|
|
124
|
+
recording: EdfRecording,
|
|
125
|
+
records: RecordRange,
|
|
126
|
+
selection: EnvelopeSelection,
|
|
127
|
+
options?: ReadOptions,
|
|
128
|
+
): Promise<EdfEnvelopeChunk> {
|
|
129
|
+
const { source, header, timeline } = recording;
|
|
130
|
+
const signals = resolveEnvelopeSignals(header, selection.signalIndices);
|
|
131
|
+
const diagnostics: EdfDiagnostic[] = [];
|
|
132
|
+
|
|
133
|
+
// More buckets than the densest signal has samples in this run would leave holes that mean
|
|
134
|
+
// nothing, so the request is clamped rather than honoured literally.
|
|
135
|
+
const densestSamples = signals.reduce(
|
|
136
|
+
(most, signal) => Math.max(most, signal.samplesPerRecord * records.count),
|
|
137
|
+
0,
|
|
138
|
+
);
|
|
139
|
+
const bucketCount = Math.max(1, Math.min(selection.buckets, densestSamples));
|
|
140
|
+
|
|
141
|
+
const accumulators: Accumulator[] = signals.map((signal) => ({
|
|
142
|
+
signal,
|
|
143
|
+
// Int32Array zero-fills, so the sentinels have to be written explicitly: a bucket nothing
|
|
144
|
+
// landed in must be distinguishable from a bucket whose samples were all zero.
|
|
145
|
+
min: new Int32Array(bucketCount).fill(0),
|
|
146
|
+
max: new Int32Array(bucketCount).fill(0),
|
|
147
|
+
counts: new Int32Array(bucketCount),
|
|
148
|
+
consumed: 0,
|
|
149
|
+
outOfRange: 0,
|
|
150
|
+
scratch: undefined,
|
|
151
|
+
}));
|
|
152
|
+
|
|
153
|
+
const chunkRecords = scanChunkRecords(header, options?.maxMaterializeBytes);
|
|
154
|
+
let byteLength = 0;
|
|
155
|
+
let firstOnsetTicks: bigint | undefined;
|
|
156
|
+
let lastOnsetTicks: bigint | undefined;
|
|
157
|
+
let scanned = 0;
|
|
158
|
+
|
|
159
|
+
while (scanned < records.count) {
|
|
160
|
+
const slice: RecordRange = {
|
|
161
|
+
start: records.start + scanned,
|
|
162
|
+
count: Math.min(chunkRecords, records.count - scanned),
|
|
163
|
+
};
|
|
164
|
+
const bytes = await readRecordBytes(source, header, slice, options);
|
|
165
|
+
byteLength += bytes.length;
|
|
166
|
+
|
|
167
|
+
// Never strict: a defect in one record must not cost the caller the whole picture.
|
|
168
|
+
const annotations = decodeAnnotations(header, bytes, slice, {
|
|
169
|
+
originTicks: timeline.startOffsetTicks,
|
|
170
|
+
});
|
|
171
|
+
for (const diagnostic of annotations.diagnostics) diagnostics.push(diagnostic);
|
|
172
|
+
const onsets = annotations.recordOnsetTicks;
|
|
173
|
+
if (firstOnsetTicks === undefined) firstOnsetTicks = onsets[0];
|
|
174
|
+
const lastInSlice = onsets[slice.count - 1];
|
|
175
|
+
if (lastInSlice !== undefined) lastOnsetTicks = lastInSlice;
|
|
176
|
+
|
|
177
|
+
for (const accumulator of accumulators) {
|
|
178
|
+
foldChunk(accumulator, header, bytes, slice, records, bucketCount, options);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
scanned += slice.count;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const durationTicks = header.recordDurationTicks;
|
|
185
|
+
const startTicks = (firstOnsetTicks ?? timeline.startOffsetTicks) - timeline.startOffsetTicks;
|
|
186
|
+
const spanTicks =
|
|
187
|
+
firstOnsetTicks !== undefined && lastOnsetTicks !== undefined
|
|
188
|
+
? lastOnsetTicks + durationTicks - firstOnsetTicks
|
|
189
|
+
: durationTicks * BigInt(records.count);
|
|
190
|
+
const startSeconds = ticksToSeconds(startTicks);
|
|
191
|
+
const durationSeconds = ticksToSeconds(spanTicks);
|
|
192
|
+
|
|
193
|
+
const envelopeSignals: EdfEnvelopeSignal[] = accumulators.map((accumulator) => ({
|
|
194
|
+
signalIndex: accumulator.signal.index,
|
|
195
|
+
min: accumulator.min,
|
|
196
|
+
max: accumulator.max,
|
|
197
|
+
counts: accumulator.counts,
|
|
198
|
+
sampleCount: accumulator.consumed,
|
|
199
|
+
firstSampleIndex: records.start * accumulator.signal.samplesPerRecord,
|
|
200
|
+
startSeconds,
|
|
201
|
+
outOfDigitalRangeCount: accumulator.outOfRange,
|
|
202
|
+
}));
|
|
203
|
+
|
|
204
|
+
return Object.freeze({
|
|
205
|
+
records,
|
|
206
|
+
startSeconds,
|
|
207
|
+
durationSeconds,
|
|
208
|
+
bucketCount,
|
|
209
|
+
secondsPerBucket: bucketCount > 0 ? durationSeconds / bucketCount : 0,
|
|
210
|
+
byteLength,
|
|
211
|
+
signals: Object.freeze(envelopeSignals),
|
|
212
|
+
precededByGap: undefined,
|
|
213
|
+
diagnostics: Object.freeze(diagnostics),
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Folds one chunk of one signal into the buckets.
|
|
219
|
+
*
|
|
220
|
+
* The bucket of a sample is decided by its position on the WHOLE run's grid, not the chunk's, so
|
|
221
|
+
* the chunk size cannot move a sample from one bucket to another. That is the same rule the
|
|
222
|
+
* record scan learned the hard way: chunking bounds memory and must never change the answer.
|
|
223
|
+
*/
|
|
224
|
+
function foldChunk(
|
|
225
|
+
accumulator: Accumulator,
|
|
226
|
+
header: EdfHeader,
|
|
227
|
+
bytes: Uint8Array,
|
|
228
|
+
slice: RecordRange,
|
|
229
|
+
run: RecordRange,
|
|
230
|
+
bucketCount: number,
|
|
231
|
+
options?: ReadOptions,
|
|
232
|
+
): void {
|
|
233
|
+
const totalSamples = accumulator.signal.samplesPerRecord * run.count;
|
|
234
|
+
if (totalSamples === 0) return;
|
|
235
|
+
|
|
236
|
+
const decoded = decodeDigitalCounted(
|
|
237
|
+
header,
|
|
238
|
+
bytes,
|
|
239
|
+
slice,
|
|
240
|
+
accumulator.signal.index,
|
|
241
|
+
accumulator.scratch,
|
|
242
|
+
options,
|
|
243
|
+
);
|
|
244
|
+
// decodeDigitalCounted reuses the buffer when it is large enough, so the allocation happens
|
|
245
|
+
// once per signal per run rather than once per chunk.
|
|
246
|
+
accumulator.scratch = decoded.digital;
|
|
247
|
+
accumulator.outOfRange += decoded.outOfDigitalRangeCount;
|
|
248
|
+
|
|
249
|
+
const samples = decoded.digital;
|
|
250
|
+
// The buffer is reused across chunks, so it can be LONGER than this slice. The slice's own
|
|
251
|
+
// sample count is what must be folded, or the tail of a previous, larger chunk is counted again.
|
|
252
|
+
const sampleCount = accumulator.signal.samplesPerRecord * slice.count;
|
|
253
|
+
const { min, max, counts } = accumulator;
|
|
254
|
+
let position = accumulator.consumed;
|
|
255
|
+
|
|
256
|
+
for (let i = 0; i < sampleCount; i += 1) {
|
|
257
|
+
const value = samples[i] as number;
|
|
258
|
+
// Integer arithmetic on the run grid: floor(position * buckets / totalSamples).
|
|
259
|
+
const bucket = Math.min(bucketCount - 1, Math.floor((position * bucketCount) / totalSamples));
|
|
260
|
+
const seen = counts[bucket] as number;
|
|
261
|
+
if (seen === 0) {
|
|
262
|
+
min[bucket] = value;
|
|
263
|
+
max[bucket] = value;
|
|
264
|
+
} else {
|
|
265
|
+
if (value < (min[bucket] as number)) min[bucket] = value;
|
|
266
|
+
if (value > (max[bucket] as number)) max[bucket] = value;
|
|
267
|
+
}
|
|
268
|
+
counts[bucket] = seen + 1;
|
|
269
|
+
position += 1;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
accumulator.consumed = position;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Converts a digital envelope to physical units.
|
|
277
|
+
*
|
|
278
|
+
* Not `toPhysical` applied twice, and the reason is the sign of the gain. The affine transform
|
|
279
|
+
* `bitValue * (offset + digital)` is DECREASING when `bitValue` is negative — a spec-sanctioned
|
|
280
|
+
* arrangement that edfcore reports rather than rejects — and a decreasing map sends the smallest
|
|
281
|
+
* digital value to the largest physical one. Mapping `min` to `min` would then produce an
|
|
282
|
+
* envelope whose lower bound is above its upper bound, and a viewer would draw it inside out.
|
|
283
|
+
*/
|
|
284
|
+
export function toPhysicalEnvelope(
|
|
285
|
+
signal: EdfSignal,
|
|
286
|
+
envelope: EdfEnvelopeSignal,
|
|
287
|
+
): EdfPhysicalEnvelope {
|
|
288
|
+
const scale = signal.scale;
|
|
289
|
+
if (scale === undefined) {
|
|
290
|
+
throw new EdfScalingError(
|
|
291
|
+
`signal ${signal.index} (${JSON.stringify(signal.label)}) has no usable scale, so its ` +
|
|
292
|
+
'envelope has no physical units. Next: check signal.scale before converting, or plot ' +
|
|
293
|
+
'the digital envelope as it is.',
|
|
294
|
+
{ code: 'SCALE_UNAVAILABLE', signalIndex: signal.index, label: signal.label },
|
|
295
|
+
);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
const length = envelope.min.length;
|
|
299
|
+
const low = new Float64Array(length);
|
|
300
|
+
const high = new Float64Array(length);
|
|
301
|
+
const decreasing = scale.bitValue < 0;
|
|
302
|
+
|
|
303
|
+
for (let i = 0; i < length; i += 1) {
|
|
304
|
+
const a = scale.bitValue * (scale.offset + (envelope.min[i] as number));
|
|
305
|
+
const b = scale.bitValue * (scale.offset + (envelope.max[i] as number));
|
|
306
|
+
low[i] = decreasing ? b : a;
|
|
307
|
+
high[i] = decreasing ? a : b;
|
|
308
|
+
}
|
|
309
|
+
return { min: low, max: high };
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* The envelope of an already-decoded chunk signal, without another read.
|
|
314
|
+
*
|
|
315
|
+
* For a caller who has samples in hand and wants them plotted: same reduction, same bucket rule,
|
|
316
|
+
* no I/O.
|
|
317
|
+
*/
|
|
318
|
+
export function envelopeOfSamples(chunkSignal: EdfChunkSignal, buckets: number): EdfEnvelopeSignal {
|
|
319
|
+
assertPositiveInteger(buckets, 'buckets');
|
|
320
|
+
const samples = chunkSignal.digital;
|
|
321
|
+
const total = samples.length;
|
|
322
|
+
const bucketCount = Math.max(1, Math.min(buckets, total));
|
|
323
|
+
|
|
324
|
+
const min = new Int32Array(bucketCount);
|
|
325
|
+
const max = new Int32Array(bucketCount);
|
|
326
|
+
const counts = new Int32Array(bucketCount);
|
|
327
|
+
|
|
328
|
+
for (let i = 0; i < total; i += 1) {
|
|
329
|
+
const value = samples[i] as number;
|
|
330
|
+
const bucket = Math.min(bucketCount - 1, Math.floor((i * bucketCount) / total));
|
|
331
|
+
const seen = counts[bucket] as number;
|
|
332
|
+
if (seen === 0) {
|
|
333
|
+
min[bucket] = value;
|
|
334
|
+
max[bucket] = value;
|
|
335
|
+
} else {
|
|
336
|
+
if (value < (min[bucket] as number)) min[bucket] = value;
|
|
337
|
+
if (value > (max[bucket] as number)) max[bucket] = value;
|
|
338
|
+
}
|
|
339
|
+
counts[bucket] = seen + 1;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return {
|
|
343
|
+
signalIndex: chunkSignal.signalIndex,
|
|
344
|
+
min,
|
|
345
|
+
max,
|
|
346
|
+
counts,
|
|
347
|
+
sampleCount: total,
|
|
348
|
+
firstSampleIndex: chunkSignal.firstSampleIndex,
|
|
349
|
+
startSeconds: chunkSignal.startSeconds,
|
|
350
|
+
outOfDigitalRangeCount: chunkSignal.outOfDigitalRangeCount,
|
|
351
|
+
};
|
|
352
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -43,12 +43,15 @@ export type {
|
|
|
43
43
|
EdfClockTime,
|
|
44
44
|
EdfDiagnostic,
|
|
45
45
|
EdfDiagnosticCode,
|
|
46
|
+
EdfEnvelopeChunk,
|
|
47
|
+
EdfEnvelopeSignal,
|
|
46
48
|
EdfGap,
|
|
47
49
|
EdfHeader,
|
|
48
50
|
EdfInspection,
|
|
49
51
|
EdfKnownDiagnosticCode,
|
|
50
52
|
EdfLocation,
|
|
51
53
|
EdfPatientId,
|
|
54
|
+
EdfPhysicalEnvelope,
|
|
52
55
|
EdfRawHeaderFields,
|
|
53
56
|
EdfRawSignalFields,
|
|
54
57
|
EdfRecordIndex,
|
|
@@ -61,6 +64,7 @@ export type {
|
|
|
61
64
|
EdfStartTime,
|
|
62
65
|
EdfTimeline,
|
|
63
66
|
EdfVariant,
|
|
67
|
+
EnvelopeSelection,
|
|
64
68
|
FetchLike,
|
|
65
69
|
HttpResponseLike,
|
|
66
70
|
HttpSourceOptions,
|
|
@@ -147,5 +151,6 @@ export { buildRecordIndex, buildTimeline } from './record-index.js';
|
|
|
147
151
|
// Convenience layer
|
|
148
152
|
// ===========================================================================
|
|
149
153
|
|
|
154
|
+
export { envelopeOfSamples, readEnvelope, toPhysicalEnvelope } from './envelope.js';
|
|
150
155
|
export { inspectEdf } from './inspect.js';
|
|
151
156
|
export { openEdf, readAnnotations, readRecords, readWindow } from './recording.js';
|
package/src/types.ts
CHANGED
|
@@ -367,6 +367,59 @@ export interface EdfChunk {
|
|
|
367
367
|
readonly diagnostics: readonly EdfDiagnostic[];
|
|
368
368
|
}
|
|
369
369
|
|
|
370
|
+
/**
|
|
371
|
+
* One signal's min/max envelope over a window, at a resolution the caller chose.
|
|
372
|
+
*
|
|
373
|
+
* The unit is the bucket, not the sample: `min[i]` and `max[i]` are the extremes of every sample
|
|
374
|
+
* that fell in bucket `i`. Drawing a twelve-hour recording into a thousand pixels needs exactly
|
|
375
|
+
* this and nothing else — the peaks are what a reader of an EEG trace is looking at, and they
|
|
376
|
+
* are the first thing naive subsampling throws away.
|
|
377
|
+
*/
|
|
378
|
+
export interface EdfEnvelopeSignal {
|
|
379
|
+
readonly signalIndex: number;
|
|
380
|
+
/** Digital extremes per bucket. Convert with `toPhysicalEnvelope`, never with `toPhysical`. */
|
|
381
|
+
readonly min: Int32Array;
|
|
382
|
+
readonly max: Int32Array;
|
|
383
|
+
/** Samples that landed in each bucket. Zero where the window had no samples to cover it. */
|
|
384
|
+
readonly counts: Int32Array;
|
|
385
|
+
/** Total samples reduced, i.e. the sum of `counts`. */
|
|
386
|
+
readonly sampleCount: number;
|
|
387
|
+
readonly firstSampleIndex: number;
|
|
388
|
+
readonly startSeconds: number;
|
|
389
|
+
readonly outOfDigitalRangeCount: number;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
/** A contiguous run of records, reduced to buckets. One per run, exactly as `readWindow` splits. */
|
|
393
|
+
export interface EdfEnvelopeChunk {
|
|
394
|
+
readonly records: RecordRange;
|
|
395
|
+
readonly startSeconds: number;
|
|
396
|
+
readonly durationSeconds: number;
|
|
397
|
+
/** Buckets actually filled. Never more than requested, and fewer for a short run. */
|
|
398
|
+
readonly bucketCount: number;
|
|
399
|
+
readonly secondsPerBucket: number;
|
|
400
|
+
readonly byteLength: number;
|
|
401
|
+
readonly signals: readonly EdfEnvelopeSignal[];
|
|
402
|
+
readonly precededByGap: EdfGap | undefined;
|
|
403
|
+
readonly diagnostics: readonly EdfDiagnostic[];
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
export interface EnvelopeSelection extends WindowSelection {
|
|
407
|
+
/**
|
|
408
|
+
* How many buckets to reduce the window into — in a viewer, the pixel width of the plot.
|
|
409
|
+
*
|
|
410
|
+
* A bucket per pixel is the point: asking for more buckets than the window has samples wastes
|
|
411
|
+
* work and yields empty buckets, so the count is clamped to the sample count of the densest
|
|
412
|
+
* signal in the run.
|
|
413
|
+
*/
|
|
414
|
+
readonly buckets: number;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/** A physical-unit envelope. Separate from the digital one for the same reason `toPhysical` is. */
|
|
418
|
+
export interface EdfPhysicalEnvelope {
|
|
419
|
+
readonly min: Float64Array;
|
|
420
|
+
readonly max: Float64Array;
|
|
421
|
+
}
|
|
422
|
+
|
|
370
423
|
export interface EdfAnnotation {
|
|
371
424
|
/** Verbatim on-disk value, relative to the header startdate/starttime (EDF+ 2.2.4). */
|
|
372
425
|
readonly onsetSecondsFromHeaderStart: number;
|