// Parsed representation of a pulseq .seq file (format v1.4.x / v1.5.x). export interface SeqVersion { major: number minor: number revision: string combined: number // 1000000*major + 1000*minor + numeric revision } /** One [DEFINITIONS] entry: numeric values when every token parses, else raw string. */ export type DefinitionValue = number[] | string export interface RfEvent { id: number /** Peak amplitude, Hz */ amp: number magShapeId: number phaseShapeId: number timeShapeId: number /** Center of the pulse relative to its start, s (NaN in v1.4 files) */ center: number /** Delay from block start, s */ delay: number freqPPM: number phasePPM: number /** Frequency offset, Hz */ freq: number /** Phase offset, rad */ phase: number /** Initial of excitation/refocusing/inversion/saturation/preparation/other/undefined */ use: string } export interface TrapGradEvent { id: number kind: 'trap' /** Hz/m */ amp: number rise: number flat: number fall: number delay: number } export interface ArbGradEvent { id: number kind: 'grad' /** Hz/m */ amp: number /** Waveform value at the start/end edge, Hz/m (NaN in v1.4 files) */ first: number last: number shapeId: number timeShapeId: number delay: number } export type GradEvent = TrapGradEvent | ArbGradEvent export interface AdcEvent { id: number num: number /** s */ dwell: number /** s */ delay: number freqPPM: number phasePPM: number /** Hz */ freq: number /** rad */ phase: number phaseShapeId: number } export interface Shape { id: number numSamples: number /** Decompressed samples (numSamples long) */ samples: Float64Array /** Sample count as stored in the file (=== numSamples when uncompressed) */ storedSamples: number } /** One row of the [EXTENSIONS] linked lists: id -> (type, ref) + next row. */ export interface ExtensionRef { id: number type: number ref: number next: number } /** One `extension NAME typeId` specification section, rows kept as tokens. */ export interface ExtensionSpec { name: string typeId: number rows: string[][] } export interface SeqBlock { id: number /** s */ duration: number rfId: number gxId: number gyId: number gzId: number adcId: number extId: number } export interface ParsedSeq { version: SeqVersion /** Insertion-ordered [DEFINITIONS] */ definitions: Map rasters: { blockDuration: number gradient: number rf: number adc: number } blocks: SeqBlock[] rf: Map grads: Map adcs: Map shapes: Map extensions: Map extensionSpecs: ExtensionSpec[] signature?: { type: string; hash: string; valid?: boolean } /** s, sum of block durations */ totalDuration: number }