edfcore 0.1.7 → 0.1.9
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/biosemi.d.ts +45 -0
- package/dist/biosemi.d.ts.map +1 -0
- package/dist/biosemi.js +122 -0
- package/dist/biosemi.js.map +1 -0
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/stream.d.ts +25 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +48 -0
- package/dist/stream.js.map +1 -0
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/biosemi.ts +156 -0
- package/src/constants.ts +1 -1
- package/src/index.ts +6 -0
- package/src/stream.ts +68 -0
- package/src/types.ts +31 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The BioSemi Status channel.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. BioSemi's ActiveTwo writes BDF files whose last channel is labelled `Status`, and its
|
|
5
|
+
* 24-bit samples are not a measurement — they are a bit field the amplifier latched at each
|
|
6
|
+
* sample. The low 16 bits are the parallel trigger input, which is how nearly every ERP
|
|
7
|
+
* experiment records stimulus onsets.
|
|
8
|
+
*
|
|
9
|
+
* Reading that is file access, not analysis. The codes were written by the hardware at
|
|
10
|
+
* acquisition time, exactly like an EDF+ annotation, and this module only reports what is in the
|
|
11
|
+
* bytes. Nothing here inspects a biosignal, so event detection remains a non-goal.
|
|
12
|
+
*
|
|
13
|
+
* Only the bits BioSemi documents are named. `raw` carries all 24 so a caller with a rig-specific
|
|
14
|
+
* convention can decode the rest without waiting for this module to learn about it — inventing
|
|
15
|
+
* meanings for the bits above 18 would be guessing, and a wrong trigger code is worse than none.
|
|
16
|
+
*/
|
|
17
|
+
import type { EdfHeader, EdfRecording, EdfSignal, EdfStatusWord, EdfTriggerEvent, ReadOptions, TriggerSelection } from './types.js';
|
|
18
|
+
/**
|
|
19
|
+
* The `Status` channel of a BDF file, or `undefined` when there is none.
|
|
20
|
+
*
|
|
21
|
+
* Returns `undefined` rather than throwing for a plain EDF or a BDF without the channel: a file
|
|
22
|
+
* having no Status channel is an ordinary fact about the file, not an error.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getStatusSignal(header: EdfHeader): EdfSignal | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Decodes one 24-bit Status sample.
|
|
27
|
+
*
|
|
28
|
+
* `decodeDigital` sign-extends BDF samples, as it must for a measurement, so bit 23 of a Status
|
|
29
|
+
* word arrives as a negative number. The bit field is unsigned, so it is masked back before
|
|
30
|
+
* anything is read out of it.
|
|
31
|
+
*/
|
|
32
|
+
export declare function decodeStatusWord(sample: number): EdfStatusWord;
|
|
33
|
+
/**
|
|
34
|
+
* Every change of the trigger word in a window, as timed events.
|
|
35
|
+
*
|
|
36
|
+
* A parallel trigger is held for as long as the stimulus computer asserts it, so the same code
|
|
37
|
+
* repeats over many samples. What an experimenter wants is the TRANSITION, which is why this
|
|
38
|
+
* reports changes rather than samples: one event per change, carrying the code it changed to.
|
|
39
|
+
*
|
|
40
|
+
* Code 0 is "no trigger asserted", so a return to 0 is reported as an event with `trigger: 0`
|
|
41
|
+
* and is easy to filter out. It is reported rather than dropped because the release time is what
|
|
42
|
+
* gives a trigger its duration.
|
|
43
|
+
*/
|
|
44
|
+
export declare function readTriggers(recording: EdfRecording, selection: TriggerSelection, options?: ReadOptions): Promise<readonly EdfTriggerEvent[]>;
|
|
45
|
+
//# sourceMappingURL=biosemi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biosemi.d.ts","sourceRoot":"","sources":["../src/biosemi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAOH,OAAO,KAAK,EACV,SAAS,EACT,YAAY,EACZ,SAAS,EACT,aAAa,EACb,eAAe,EACf,WAAW,EAEX,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAWpB;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAOxE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAS9D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,gBAAgB,EAC3B,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC,CAiErC"}
|
package/dist/biosemi.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The BioSemi Status channel.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. BioSemi's ActiveTwo writes BDF files whose last channel is labelled `Status`, and its
|
|
5
|
+
* 24-bit samples are not a measurement — they are a bit field the amplifier latched at each
|
|
6
|
+
* sample. The low 16 bits are the parallel trigger input, which is how nearly every ERP
|
|
7
|
+
* experiment records stimulus onsets.
|
|
8
|
+
*
|
|
9
|
+
* Reading that is file access, not analysis. The codes were written by the hardware at
|
|
10
|
+
* acquisition time, exactly like an EDF+ annotation, and this module only reports what is in the
|
|
11
|
+
* bytes. Nothing here inspects a biosignal, so event detection remains a non-goal.
|
|
12
|
+
*
|
|
13
|
+
* Only the bits BioSemi documents are named. `raw` carries all 24 so a caller with a rig-specific
|
|
14
|
+
* convention can decode the rest without waiting for this module to learn about it — inventing
|
|
15
|
+
* meanings for the bits above 18 would be guessing, and a wrong trigger code is worse than none.
|
|
16
|
+
*/
|
|
17
|
+
import { decodeDigitalCounted } from './decode/digital.js';
|
|
18
|
+
import { readRecordBytes } from './io/read.js';
|
|
19
|
+
import { scanChunkRecords } from './record-index.js';
|
|
20
|
+
import { ticksToSeconds } from './tal/ticks.js';
|
|
21
|
+
import { resolveTimeWindow } from './time/window.js';
|
|
22
|
+
/** BioSemi's own label for the channel. Matched case-insensitively after trimming. */
|
|
23
|
+
const STATUS_LABEL = 'status';
|
|
24
|
+
/** The parallel input occupies the low 16 bits; the flags sit immediately above it. */
|
|
25
|
+
const TRIGGER_MASK = 0xffff;
|
|
26
|
+
const EPOCH_BIT = 1 << 16;
|
|
27
|
+
const CMS_IN_RANGE_BIT = 1 << 17;
|
|
28
|
+
const BATTERY_LOW_BIT = 1 << 18;
|
|
29
|
+
/**
|
|
30
|
+
* The `Status` channel of a BDF file, or `undefined` when there is none.
|
|
31
|
+
*
|
|
32
|
+
* Returns `undefined` rather than throwing for a plain EDF or a BDF without the channel: a file
|
|
33
|
+
* having no Status channel is an ordinary fact about the file, not an error.
|
|
34
|
+
*/
|
|
35
|
+
export function getStatusSignal(header) {
|
|
36
|
+
if (header.bytesPerSample !== 3)
|
|
37
|
+
return undefined;
|
|
38
|
+
for (const index of header.dataSignalIndices) {
|
|
39
|
+
const signal = header.signals[index];
|
|
40
|
+
if (signal !== undefined && signal.label.trim().toLowerCase() === STATUS_LABEL)
|
|
41
|
+
return signal;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Decodes one 24-bit Status sample.
|
|
47
|
+
*
|
|
48
|
+
* `decodeDigital` sign-extends BDF samples, as it must for a measurement, so bit 23 of a Status
|
|
49
|
+
* word arrives as a negative number. The bit field is unsigned, so it is masked back before
|
|
50
|
+
* anything is read out of it.
|
|
51
|
+
*/
|
|
52
|
+
export function decodeStatusWord(sample) {
|
|
53
|
+
const raw = sample & 0xffffff;
|
|
54
|
+
return {
|
|
55
|
+
raw,
|
|
56
|
+
trigger: raw & TRIGGER_MASK,
|
|
57
|
+
newEpoch: (raw & EPOCH_BIT) !== 0,
|
|
58
|
+
cmsInRange: (raw & CMS_IN_RANGE_BIT) !== 0,
|
|
59
|
+
batteryLow: (raw & BATTERY_LOW_BIT) !== 0,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Every change of the trigger word in a window, as timed events.
|
|
64
|
+
*
|
|
65
|
+
* A parallel trigger is held for as long as the stimulus computer asserts it, so the same code
|
|
66
|
+
* repeats over many samples. What an experimenter wants is the TRANSITION, which is why this
|
|
67
|
+
* reports changes rather than samples: one event per change, carrying the code it changed to.
|
|
68
|
+
*
|
|
69
|
+
* Code 0 is "no trigger asserted", so a return to 0 is reported as an event with `trigger: 0`
|
|
70
|
+
* and is easy to filter out. It is reported rather than dropped because the release time is what
|
|
71
|
+
* gives a trigger its duration.
|
|
72
|
+
*/
|
|
73
|
+
export async function readTriggers(recording, selection, options) {
|
|
74
|
+
const { source, header, timeline } = recording;
|
|
75
|
+
const status = getStatusSignal(header);
|
|
76
|
+
if (status === undefined) {
|
|
77
|
+
throw new RangeError('readTriggers(): this file has no BioSemi Status channel — it is either not a BDF file, ' +
|
|
78
|
+
'or no signal is labelled "Status". Next: check header.signals, or read EDF+ ' +
|
|
79
|
+
'annotations with readAnnotations().');
|
|
80
|
+
}
|
|
81
|
+
const ranges = resolveTimeWindow(timeline, recording.index, selection.startSeconds, selection.durationSeconds);
|
|
82
|
+
const events = [];
|
|
83
|
+
// Carried across runs so a trigger held over a gap is not reported twice. `undefined` means
|
|
84
|
+
// nothing has been seen yet, which is what makes the very first sample an event.
|
|
85
|
+
let previous;
|
|
86
|
+
for (const records of ranges) {
|
|
87
|
+
const chunkRecords = scanChunkRecords(header, options?.maxMaterializeBytes);
|
|
88
|
+
let scanned = 0;
|
|
89
|
+
let scratch;
|
|
90
|
+
while (scanned < records.count) {
|
|
91
|
+
const slice = {
|
|
92
|
+
start: records.start + scanned,
|
|
93
|
+
count: Math.min(chunkRecords, records.count - scanned),
|
|
94
|
+
};
|
|
95
|
+
const bytes = await readRecordBytes(source, header, slice, options);
|
|
96
|
+
const decoded = decodeDigitalCounted(header, bytes, slice, status.index, scratch, options);
|
|
97
|
+
scratch = decoded.digital;
|
|
98
|
+
const sampleCount = status.samplesPerRecord * slice.count;
|
|
99
|
+
const firstSampleIndex = slice.start * status.samplesPerRecord;
|
|
100
|
+
for (let i = 0; i < sampleCount; i += 1) {
|
|
101
|
+
const word = decodeStatusWord(decoded.digital[i]);
|
|
102
|
+
if (previous !== undefined && word.trigger === previous)
|
|
103
|
+
continue;
|
|
104
|
+
previous = word.trigger;
|
|
105
|
+
const sampleIndex = firstSampleIndex + i;
|
|
106
|
+
const ticks = header.recordDurationTicks > 0n && status.samplesPerRecord > 0
|
|
107
|
+
? (BigInt(sampleIndex) * header.recordDurationTicks) / BigInt(status.samplesPerRecord)
|
|
108
|
+
: 0n;
|
|
109
|
+
events.push({
|
|
110
|
+
sampleIndex,
|
|
111
|
+
seconds: ticksToSeconds(ticks),
|
|
112
|
+
ticks,
|
|
113
|
+
trigger: word.trigger,
|
|
114
|
+
status: word,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
scanned += slice.count;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return Object.freeze(events);
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=biosemi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biosemi.js","sourceRoot":"","sources":["../src/biosemi.ts"],"names":[],"mappings":"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"}
|
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.9";
|
|
113
113
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.js
CHANGED
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, 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';
|
|
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, EdfStatusWord, EdfTimeline, EdfTriggerEvent, EdfVariant, EnvelopeSelection, FetchLike, HttpResponseLike, HttpSourceOptions, OpenOptions, ParseOptions, ReadOptions, RecordRange, RecordSelection, StreamSelection, TriggerSelection, 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,7 +41,9 @@ 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 { decodeStatusWord, getStatusSignal, readTriggers } from './biosemi.js';
|
|
44
45
|
export { envelopeOfSamples, readEnvelope, toPhysicalEnvelope } from './envelope.js';
|
|
45
46
|
export { inspectEdf } from './inspect.js';
|
|
46
47
|
export { openEdf, readAnnotations, readRecords, readWindow } from './recording.js';
|
|
48
|
+
export { streamRecords } from './stream.js';
|
|
47
49
|
//# 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,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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -54,7 +54,9 @@ export { buildRecordIndex, buildTimeline } from './record-index.js';
|
|
|
54
54
|
// ===========================================================================
|
|
55
55
|
// Convenience layer
|
|
56
56
|
// ===========================================================================
|
|
57
|
+
export { decodeStatusWord, getStatusSignal, readTriggers } from './biosemi.js';
|
|
57
58
|
export { envelopeOfSamples, readEnvelope, toPhysicalEnvelope } from './envelope.js';
|
|
58
59
|
export { inspectEdf } from './inspect.js';
|
|
59
60
|
export { openEdf, readAnnotations, readRecords, readWindow } from './recording.js';
|
|
61
|
+
export { streamRecords } from './stream.js';
|
|
60
62
|
//# 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;AAuEH,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,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/E,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;AACnF,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/stream.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming iteration over a window.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. `readWindow` returns every chunk at once, which is right for a window you are about to
|
|
5
|
+
* draw and wrong for a whole recording: the array holds every sample the window covers, so a
|
|
6
|
+
* twelve-hour pass costs twelve hours of memory.
|
|
7
|
+
*
|
|
8
|
+
* A pipeline wants the opposite — one bounded piece at a time, with the previous one collectable.
|
|
9
|
+
* That is spelled `for await`, and doing it by hand means reimplementing the record arithmetic and
|
|
10
|
+
* the gap handling that `readWindow` already owns.
|
|
11
|
+
*
|
|
12
|
+
* Chunks arrive in time order, never span a gap, and carry the same `precededByGap` a
|
|
13
|
+
* `readWindow` chunk would, so a consumer sees the discontinuities rather than a smooth lie.
|
|
14
|
+
*/
|
|
15
|
+
import type { EdfChunk, EdfRecording, ReadOptions, StreamSelection } from './types.js';
|
|
16
|
+
/**
|
|
17
|
+
* Yields a window one bounded chunk at a time.
|
|
18
|
+
*
|
|
19
|
+
* `chunkRecords` is the unit of I/O and of memory: each yielded chunk holds that many records of
|
|
20
|
+
* the requested signals and no more. It is a count of records rather than of bytes or seconds
|
|
21
|
+
* because the record is the only unit every signal in an EDF file shares — signals may sample at
|
|
22
|
+
* different rates, so "a second of data" is a different number of samples per channel.
|
|
23
|
+
*/
|
|
24
|
+
export declare function streamRecords(recording: EdfRecording, selection: StreamSelection, options?: ReadOptions): AsyncGenerator<EdfChunk, void, undefined>;
|
|
25
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAe,eAAe,EAAE,MAAM,YAAY,CAAC;AAKpG;;;;;;;GAOG;AACH,wBAAuB,aAAa,CAClC,SAAS,EAAE,YAAY,EACvB,SAAS,EAAE,eAAe,EAC1B,OAAO,CAAC,EAAE,WAAW,GACpB,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAiC3C"}
|
package/dist/stream.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming iteration over a window.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. `readWindow` returns every chunk at once, which is right for a window you are about to
|
|
5
|
+
* draw and wrong for a whole recording: the array holds every sample the window covers, so a
|
|
6
|
+
* twelve-hour pass costs twelve hours of memory.
|
|
7
|
+
*
|
|
8
|
+
* A pipeline wants the opposite — one bounded piece at a time, with the previous one collectable.
|
|
9
|
+
* That is spelled `for await`, and doing it by hand means reimplementing the record arithmetic and
|
|
10
|
+
* the gap handling that `readWindow` already owns.
|
|
11
|
+
*
|
|
12
|
+
* Chunks arrive in time order, never span a gap, and carry the same `precededByGap` a
|
|
13
|
+
* `readWindow` chunk would, so a consumer sees the discontinuities rather than a smooth lie.
|
|
14
|
+
*/
|
|
15
|
+
import { readRecords } from './recording.js';
|
|
16
|
+
import { resolveTimeWindow } from './time/window.js';
|
|
17
|
+
/** How many records to read at a time when the caller does not say. */
|
|
18
|
+
const DEFAULT_STREAM_RECORDS = 256;
|
|
19
|
+
/**
|
|
20
|
+
* Yields a window one bounded chunk at a time.
|
|
21
|
+
*
|
|
22
|
+
* `chunkRecords` is the unit of I/O and of memory: each yielded chunk holds that many records of
|
|
23
|
+
* the requested signals and no more. It is a count of records rather than of bytes or seconds
|
|
24
|
+
* because the record is the only unit every signal in an EDF file shares — signals may sample at
|
|
25
|
+
* different rates, so "a second of data" is a different number of samples per channel.
|
|
26
|
+
*/
|
|
27
|
+
export async function* streamRecords(recording, selection, options) {
|
|
28
|
+
const chunkRecords = selection.chunkRecords ?? DEFAULT_STREAM_RECORDS;
|
|
29
|
+
if (!Number.isSafeInteger(chunkRecords) || chunkRecords < 1) {
|
|
30
|
+
throw new RangeError(`streamRecords(): chunkRecords must be a positive whole number, received ${chunkRecords}. ` +
|
|
31
|
+
'Next: omit it for the default, or pass how many records you want to hold at once.');
|
|
32
|
+
}
|
|
33
|
+
const ranges = resolveTimeWindow(recording.timeline, recording.index, selection.startSeconds, selection.durationSeconds);
|
|
34
|
+
for (const run of ranges) {
|
|
35
|
+
let scanned = 0;
|
|
36
|
+
while (scanned < run.count) {
|
|
37
|
+
const records = {
|
|
38
|
+
start: run.start + scanned,
|
|
39
|
+
count: Math.min(chunkRecords, run.count - scanned),
|
|
40
|
+
};
|
|
41
|
+
// readRecords, not a private path: the chunk a consumer gets from streaming and the chunk
|
|
42
|
+
// it gets from reading must be the same object in every respect, including its diagnostics.
|
|
43
|
+
yield await readRecords(recording, { signalIndices: selection.signalIndices, records }, options);
|
|
44
|
+
scanned += records.count;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD,uEAAuE;AACvE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,aAAa,CAClC,SAAuB,EACvB,SAA0B,EAC1B,OAAqB;IAErB,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,IAAI,sBAAsB,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,UAAU,CAClB,2EAA2E,YAAY,IAAI;YACzF,mFAAmF,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAC9B,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,KAAK,EACf,SAAS,CAAC,YAAY,EACtB,SAAS,CAAC,eAAe,CAC1B,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,OAAO,OAAO,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAgB;gBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK,GAAG,OAAO;gBAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC;aACnD,CAAC;YACF,0FAA0F;YAC1F,4FAA4F;YAC5F,MAAM,MAAM,WAAW,CACrB,SAAS,EACT,EAAE,aAAa,EAAE,SAAS,CAAC,aAAa,EAAE,OAAO,EAAE,EACnD,OAAO,CACR,CAAC;YACF,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -356,6 +356,33 @@ export interface EdfPhysicalEnvelope {
|
|
|
356
356
|
readonly min: Float64Array;
|
|
357
357
|
readonly max: Float64Array;
|
|
358
358
|
}
|
|
359
|
+
export interface StreamSelection extends WindowSelection {
|
|
360
|
+
/** Records held at once. Defaults to 256. The record is the only unit every signal shares. */
|
|
361
|
+
readonly chunkRecords?: number;
|
|
362
|
+
}
|
|
363
|
+
/** One decoded BioSemi Status sample. Only the bits BioSemi documents are named. */
|
|
364
|
+
export interface EdfStatusWord {
|
|
365
|
+
/** All 24 bits, unsigned. Decode rig-specific conventions from this. */
|
|
366
|
+
readonly raw: number;
|
|
367
|
+
/** The parallel trigger input: the low 16 bits. */
|
|
368
|
+
readonly trigger: number;
|
|
369
|
+
readonly newEpoch: boolean;
|
|
370
|
+
readonly cmsInRange: boolean;
|
|
371
|
+
readonly batteryLow: boolean;
|
|
372
|
+
}
|
|
373
|
+
/** A change of the trigger word, timed on the Status channel's own sample grid. */
|
|
374
|
+
export interface EdfTriggerEvent {
|
|
375
|
+
readonly sampleIndex: number;
|
|
376
|
+
readonly seconds: number;
|
|
377
|
+
/** Exact, in 100 ns units. Compare with this, never with the float. */
|
|
378
|
+
readonly ticks: bigint;
|
|
379
|
+
readonly trigger: number;
|
|
380
|
+
readonly status: EdfStatusWord;
|
|
381
|
+
}
|
|
382
|
+
export interface TriggerSelection {
|
|
383
|
+
readonly startSeconds: number;
|
|
384
|
+
readonly durationSeconds: number;
|
|
385
|
+
}
|
|
359
386
|
export interface EdfAnnotation {
|
|
360
387
|
/** Verbatim on-disk value, relative to the header startdate/starttime (EDF+ 2.2.4). */
|
|
361
388
|
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/biosemi.ts
ADDED
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The BioSemi Status channel.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. BioSemi's ActiveTwo writes BDF files whose last channel is labelled `Status`, and its
|
|
5
|
+
* 24-bit samples are not a measurement — they are a bit field the amplifier latched at each
|
|
6
|
+
* sample. The low 16 bits are the parallel trigger input, which is how nearly every ERP
|
|
7
|
+
* experiment records stimulus onsets.
|
|
8
|
+
*
|
|
9
|
+
* Reading that is file access, not analysis. The codes were written by the hardware at
|
|
10
|
+
* acquisition time, exactly like an EDF+ annotation, and this module only reports what is in the
|
|
11
|
+
* bytes. Nothing here inspects a biosignal, so event detection remains a non-goal.
|
|
12
|
+
*
|
|
13
|
+
* Only the bits BioSemi documents are named. `raw` carries all 24 so a caller with a rig-specific
|
|
14
|
+
* convention can decode the rest without waiting for this module to learn about it — inventing
|
|
15
|
+
* meanings for the bits above 18 would be guessing, and a wrong trigger code is worse than none.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { decodeDigitalCounted } from './decode/digital.js';
|
|
19
|
+
import { readRecordBytes } from './io/read.js';
|
|
20
|
+
import { scanChunkRecords } from './record-index.js';
|
|
21
|
+
import { ticksToSeconds } from './tal/ticks.js';
|
|
22
|
+
import { resolveTimeWindow } from './time/window.js';
|
|
23
|
+
import type {
|
|
24
|
+
EdfHeader,
|
|
25
|
+
EdfRecording,
|
|
26
|
+
EdfSignal,
|
|
27
|
+
EdfStatusWord,
|
|
28
|
+
EdfTriggerEvent,
|
|
29
|
+
ReadOptions,
|
|
30
|
+
RecordRange,
|
|
31
|
+
TriggerSelection,
|
|
32
|
+
} from './types.js';
|
|
33
|
+
|
|
34
|
+
/** BioSemi's own label for the channel. Matched case-insensitively after trimming. */
|
|
35
|
+
const STATUS_LABEL = 'status';
|
|
36
|
+
|
|
37
|
+
/** The parallel input occupies the low 16 bits; the flags sit immediately above it. */
|
|
38
|
+
const TRIGGER_MASK = 0xffff;
|
|
39
|
+
const EPOCH_BIT = 1 << 16;
|
|
40
|
+
const CMS_IN_RANGE_BIT = 1 << 17;
|
|
41
|
+
const BATTERY_LOW_BIT = 1 << 18;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* The `Status` channel of a BDF file, or `undefined` when there is none.
|
|
45
|
+
*
|
|
46
|
+
* Returns `undefined` rather than throwing for a plain EDF or a BDF without the channel: a file
|
|
47
|
+
* having no Status channel is an ordinary fact about the file, not an error.
|
|
48
|
+
*/
|
|
49
|
+
export function getStatusSignal(header: EdfHeader): EdfSignal | undefined {
|
|
50
|
+
if (header.bytesPerSample !== 3) return undefined;
|
|
51
|
+
for (const index of header.dataSignalIndices) {
|
|
52
|
+
const signal = header.signals[index];
|
|
53
|
+
if (signal !== undefined && signal.label.trim().toLowerCase() === STATUS_LABEL) return signal;
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Decodes one 24-bit Status sample.
|
|
60
|
+
*
|
|
61
|
+
* `decodeDigital` sign-extends BDF samples, as it must for a measurement, so bit 23 of a Status
|
|
62
|
+
* word arrives as a negative number. The bit field is unsigned, so it is masked back before
|
|
63
|
+
* anything is read out of it.
|
|
64
|
+
*/
|
|
65
|
+
export function decodeStatusWord(sample: number): EdfStatusWord {
|
|
66
|
+
const raw = sample & 0xffffff;
|
|
67
|
+
return {
|
|
68
|
+
raw,
|
|
69
|
+
trigger: raw & TRIGGER_MASK,
|
|
70
|
+
newEpoch: (raw & EPOCH_BIT) !== 0,
|
|
71
|
+
cmsInRange: (raw & CMS_IN_RANGE_BIT) !== 0,
|
|
72
|
+
batteryLow: (raw & BATTERY_LOW_BIT) !== 0,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Every change of the trigger word in a window, as timed events.
|
|
78
|
+
*
|
|
79
|
+
* A parallel trigger is held for as long as the stimulus computer asserts it, so the same code
|
|
80
|
+
* repeats over many samples. What an experimenter wants is the TRANSITION, which is why this
|
|
81
|
+
* reports changes rather than samples: one event per change, carrying the code it changed to.
|
|
82
|
+
*
|
|
83
|
+
* Code 0 is "no trigger asserted", so a return to 0 is reported as an event with `trigger: 0`
|
|
84
|
+
* and is easy to filter out. It is reported rather than dropped because the release time is what
|
|
85
|
+
* gives a trigger its duration.
|
|
86
|
+
*/
|
|
87
|
+
export async function readTriggers(
|
|
88
|
+
recording: EdfRecording,
|
|
89
|
+
selection: TriggerSelection,
|
|
90
|
+
options?: ReadOptions,
|
|
91
|
+
): Promise<readonly EdfTriggerEvent[]> {
|
|
92
|
+
const { source, header, timeline } = recording;
|
|
93
|
+
|
|
94
|
+
const status = getStatusSignal(header);
|
|
95
|
+
if (status === undefined) {
|
|
96
|
+
throw new RangeError(
|
|
97
|
+
'readTriggers(): this file has no BioSemi Status channel — it is either not a BDF file, ' +
|
|
98
|
+
'or no signal is labelled "Status". Next: check header.signals, or read EDF+ ' +
|
|
99
|
+
'annotations with readAnnotations().',
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const ranges = resolveTimeWindow(
|
|
104
|
+
timeline,
|
|
105
|
+
recording.index,
|
|
106
|
+
selection.startSeconds,
|
|
107
|
+
selection.durationSeconds,
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const events: EdfTriggerEvent[] = [];
|
|
111
|
+
// Carried across runs so a trigger held over a gap is not reported twice. `undefined` means
|
|
112
|
+
// nothing has been seen yet, which is what makes the very first sample an event.
|
|
113
|
+
let previous: number | undefined;
|
|
114
|
+
|
|
115
|
+
for (const records of ranges) {
|
|
116
|
+
const chunkRecords = scanChunkRecords(header, options?.maxMaterializeBytes);
|
|
117
|
+
let scanned = 0;
|
|
118
|
+
let scratch: Int32Array | undefined;
|
|
119
|
+
|
|
120
|
+
while (scanned < records.count) {
|
|
121
|
+
const slice: RecordRange = {
|
|
122
|
+
start: records.start + scanned,
|
|
123
|
+
count: Math.min(chunkRecords, records.count - scanned),
|
|
124
|
+
};
|
|
125
|
+
const bytes = await readRecordBytes(source, header, slice, options);
|
|
126
|
+
const decoded = decodeDigitalCounted(header, bytes, slice, status.index, scratch, options);
|
|
127
|
+
scratch = decoded.digital;
|
|
128
|
+
|
|
129
|
+
const sampleCount = status.samplesPerRecord * slice.count;
|
|
130
|
+
const firstSampleIndex = slice.start * status.samplesPerRecord;
|
|
131
|
+
|
|
132
|
+
for (let i = 0; i < sampleCount; i += 1) {
|
|
133
|
+
const word = decodeStatusWord(decoded.digital[i] as number);
|
|
134
|
+
if (previous !== undefined && word.trigger === previous) continue;
|
|
135
|
+
previous = word.trigger;
|
|
136
|
+
|
|
137
|
+
const sampleIndex = firstSampleIndex + i;
|
|
138
|
+
const ticks =
|
|
139
|
+
header.recordDurationTicks > 0n && status.samplesPerRecord > 0
|
|
140
|
+
? (BigInt(sampleIndex) * header.recordDurationTicks) / BigInt(status.samplesPerRecord)
|
|
141
|
+
: 0n;
|
|
142
|
+
events.push({
|
|
143
|
+
sampleIndex,
|
|
144
|
+
seconds: ticksToSeconds(ticks),
|
|
145
|
+
ticks,
|
|
146
|
+
trigger: word.trigger,
|
|
147
|
+
status: word,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
scanned += slice.count;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return Object.freeze(events);
|
|
156
|
+
}
|
package/src/constants.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -62,7 +62,9 @@ export type {
|
|
|
62
62
|
EdfSeverity,
|
|
63
63
|
EdfSignal,
|
|
64
64
|
EdfStartTime,
|
|
65
|
+
EdfStatusWord,
|
|
65
66
|
EdfTimeline,
|
|
67
|
+
EdfTriggerEvent,
|
|
66
68
|
EdfVariant,
|
|
67
69
|
EnvelopeSelection,
|
|
68
70
|
FetchLike,
|
|
@@ -73,6 +75,8 @@ export type {
|
|
|
73
75
|
ReadOptions,
|
|
74
76
|
RecordRange,
|
|
75
77
|
RecordSelection,
|
|
78
|
+
StreamSelection,
|
|
79
|
+
TriggerSelection,
|
|
76
80
|
WindowSelection,
|
|
77
81
|
} from './types.js';
|
|
78
82
|
|
|
@@ -151,6 +155,8 @@ export { buildRecordIndex, buildTimeline } from './record-index.js';
|
|
|
151
155
|
// Convenience layer
|
|
152
156
|
// ===========================================================================
|
|
153
157
|
|
|
158
|
+
export { decodeStatusWord, getStatusSignal, readTriggers } from './biosemi.js';
|
|
154
159
|
export { envelopeOfSamples, readEnvelope, toPhysicalEnvelope } from './envelope.js';
|
|
155
160
|
export { inspectEdf } from './inspect.js';
|
|
156
161
|
export { openEdf, readAnnotations, readRecords, readWindow } from './recording.js';
|
|
162
|
+
export { streamRecords } from './stream.js';
|
package/src/stream.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Streaming iteration over a window.
|
|
3
|
+
*
|
|
4
|
+
* Layer 7. `readWindow` returns every chunk at once, which is right for a window you are about to
|
|
5
|
+
* draw and wrong for a whole recording: the array holds every sample the window covers, so a
|
|
6
|
+
* twelve-hour pass costs twelve hours of memory.
|
|
7
|
+
*
|
|
8
|
+
* A pipeline wants the opposite — one bounded piece at a time, with the previous one collectable.
|
|
9
|
+
* That is spelled `for await`, and doing it by hand means reimplementing the record arithmetic and
|
|
10
|
+
* the gap handling that `readWindow` already owns.
|
|
11
|
+
*
|
|
12
|
+
* Chunks arrive in time order, never span a gap, and carry the same `precededByGap` a
|
|
13
|
+
* `readWindow` chunk would, so a consumer sees the discontinuities rather than a smooth lie.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import { readRecords } from './recording.js';
|
|
17
|
+
import { resolveTimeWindow } from './time/window.js';
|
|
18
|
+
import type { EdfChunk, EdfRecording, ReadOptions, RecordRange, StreamSelection } from './types.js';
|
|
19
|
+
|
|
20
|
+
/** How many records to read at a time when the caller does not say. */
|
|
21
|
+
const DEFAULT_STREAM_RECORDS = 256;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Yields a window one bounded chunk at a time.
|
|
25
|
+
*
|
|
26
|
+
* `chunkRecords` is the unit of I/O and of memory: each yielded chunk holds that many records of
|
|
27
|
+
* the requested signals and no more. It is a count of records rather than of bytes or seconds
|
|
28
|
+
* because the record is the only unit every signal in an EDF file shares — signals may sample at
|
|
29
|
+
* different rates, so "a second of data" is a different number of samples per channel.
|
|
30
|
+
*/
|
|
31
|
+
export async function* streamRecords(
|
|
32
|
+
recording: EdfRecording,
|
|
33
|
+
selection: StreamSelection,
|
|
34
|
+
options?: ReadOptions,
|
|
35
|
+
): AsyncGenerator<EdfChunk, void, undefined> {
|
|
36
|
+
const chunkRecords = selection.chunkRecords ?? DEFAULT_STREAM_RECORDS;
|
|
37
|
+
if (!Number.isSafeInteger(chunkRecords) || chunkRecords < 1) {
|
|
38
|
+
throw new RangeError(
|
|
39
|
+
`streamRecords(): chunkRecords must be a positive whole number, received ${chunkRecords}. ` +
|
|
40
|
+
'Next: omit it for the default, or pass how many records you want to hold at once.',
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const ranges = resolveTimeWindow(
|
|
45
|
+
recording.timeline,
|
|
46
|
+
recording.index,
|
|
47
|
+
selection.startSeconds,
|
|
48
|
+
selection.durationSeconds,
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
for (const run of ranges) {
|
|
52
|
+
let scanned = 0;
|
|
53
|
+
while (scanned < run.count) {
|
|
54
|
+
const records: RecordRange = {
|
|
55
|
+
start: run.start + scanned,
|
|
56
|
+
count: Math.min(chunkRecords, run.count - scanned),
|
|
57
|
+
};
|
|
58
|
+
// readRecords, not a private path: the chunk a consumer gets from streaming and the chunk
|
|
59
|
+
// it gets from reading must be the same object in every respect, including its diagnostics.
|
|
60
|
+
yield await readRecords(
|
|
61
|
+
recording,
|
|
62
|
+
{ signalIndices: selection.signalIndices, records },
|
|
63
|
+
options,
|
|
64
|
+
);
|
|
65
|
+
scanned += records.count;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -420,6 +420,37 @@ export interface EdfPhysicalEnvelope {
|
|
|
420
420
|
readonly max: Float64Array;
|
|
421
421
|
}
|
|
422
422
|
|
|
423
|
+
export interface StreamSelection extends WindowSelection {
|
|
424
|
+
/** Records held at once. Defaults to 256. The record is the only unit every signal shares. */
|
|
425
|
+
readonly chunkRecords?: number;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/** One decoded BioSemi Status sample. Only the bits BioSemi documents are named. */
|
|
429
|
+
export interface EdfStatusWord {
|
|
430
|
+
/** All 24 bits, unsigned. Decode rig-specific conventions from this. */
|
|
431
|
+
readonly raw: number;
|
|
432
|
+
/** The parallel trigger input: the low 16 bits. */
|
|
433
|
+
readonly trigger: number;
|
|
434
|
+
readonly newEpoch: boolean;
|
|
435
|
+
readonly cmsInRange: boolean;
|
|
436
|
+
readonly batteryLow: boolean;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/** A change of the trigger word, timed on the Status channel's own sample grid. */
|
|
440
|
+
export interface EdfTriggerEvent {
|
|
441
|
+
readonly sampleIndex: number;
|
|
442
|
+
readonly seconds: number;
|
|
443
|
+
/** Exact, in 100 ns units. Compare with this, never with the float. */
|
|
444
|
+
readonly ticks: bigint;
|
|
445
|
+
readonly trigger: number;
|
|
446
|
+
readonly status: EdfStatusWord;
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
export interface TriggerSelection {
|
|
450
|
+
readonly startSeconds: number;
|
|
451
|
+
readonly durationSeconds: number;
|
|
452
|
+
}
|
|
453
|
+
|
|
423
454
|
export interface EdfAnnotation {
|
|
424
455
|
/** Verbatim on-disk value, relative to the header startdate/starttime (EDF+ 2.2.4). */
|
|
425
456
|
readonly onsetSecondsFromHeaderStart: number;
|