@fishka/seqio 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -39
- package/dist/abif/index.d.mts +192 -97
- package/dist/abif/index.d.ts +192 -97
- package/dist/abif/index.js +1 -1
- package/dist/abif/index.js.map +1 -1
- package/dist/abif/index.mjs +1 -1
- package/dist/abif/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/abif/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/abif/bytes.ts","../../src/abif/raw.ts","../../src/abif/view.ts","../../src/abif/setters.ts","../../src/abif/parser.ts"],"names":["asciiString","bytes","s","i","asciiBytes","out","asDataView","subview","start","length","tagNameFromInt32","n","HEADER_SIZE","ENTRY_SIZE","readAbif","macBinaryOffset","base","view","version","dirEntry","decodeEntry","rawDirCount","numEntries","dirOffset","entries","dirDataSize","entriesEnd","padLen","tdir","headerReserved","macBinaryHeader","unreferencedRanges","computeUnreferencedRanges","total","covered","dirCovered","e","norm","en","a","b","merged","last","gaps","cursor","off","tagName","tagNumber","elementType","elementSize","rawElementCount","declaredDataSize","dataHandle","computedDataSize","payloadSize","inline","elementCount","payload","dataOffset","at","dataOffsetBytes","writeAbif","file","dirSize","payloadCursor","externalOffsets","dataSize","totalSize","outView","writeEntry","externalOffset","externalDataSize","explicitDirOffset","findEntry","name","number","findEntries","upsertEntry","defaults","existing","getDataChannel","arr","getFwo","isFwoPermutation","fwo","hasData9To12Block","dataChannelRole","getReverseComplemented","getChannelMap","getSequence","read","e2","e1","getConfidences","getPositions","getSamplingRate","v","setSequence","sequence","setConfidences","q","buf","setPositions","positions","setAveragePeakSpacing","spacing","basecallerName","f1","nameBytes","len","p","f3","averagePeakSpacing","ensureRawDataChannels","src","target","TYPE_NAMES","typeName","t","previewNumbers","max","truncate","previewBytes","slice","hex","asNumbers","d","decodeNumeric","byteLength","size","decodePayload","o","year","month","day","previewDecoded","hour","minute","second","parseAbif","input","fileName","decoded","baseOrder","dataChannels","data1To4","data9To12","metadata","pbas","pcon","ploc","channelKey","idx","nums","baseCallVariants","baseCalls","pbasVersion","seq","confidences","c","pp","pos","data9Len","chromatogram","hasSignals","channelMaxLength"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Tiny binary helpers used across the ABIF reader/writer.\n *\n * Everything here operates on Uint8Array + DataView so the same code runs in\n * Node (where Buffer extends Uint8Array) and the browser.\n */\n\nexport function asciiString(bytes: Uint8Array): string {\n let s = '';\n for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);\n return s;\n}\n\nexport function asciiBytes(s: string): Uint8Array {\n const out = new Uint8Array(s.length);\n for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 0xff;\n return out;\n}\n\n/** Returns a DataView over the given bytes, regardless of input shape. */\nexport function asDataView(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\n/** Returns a Uint8Array view over a slice; never copies. */\nexport function subview(bytes: Uint8Array, start: number, length: number): Uint8Array {\n return bytes.subarray(start, start + length);\n}\n\n/** Tag name encoded as a big-endian uint32 (e.g. \"DATA\" → 0x44415441). */\nexport function tagNameToInt32(tag: string): number {\n return (\n ((tag.charCodeAt(0) & 0xff) << 24) |\n ((tag.charCodeAt(1) & 0xff) << 16) |\n ((tag.charCodeAt(2) & 0xff) << 8) |\n (tag.charCodeAt(3) & 0xff)\n );\n}\n\nexport function tagNameFromInt32(n: number): string {\n return String.fromCharCode((n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff);\n}\n","/**\n * Low-level ABIF reader/writer.\n *\n * Round-trip without loss: every directory entry (including unknown vendor\n * tags) is preserved as a raw payload (Uint8Array). The high-level layer\n * (view.ts, parser.ts) provides typed access on top of this.\n *\n * ABIF file layout:\n * [0..3] \"ABIF\" magic\n * [4..5] version (int16 BE; 101 = v1.01)\n * [6..33] TdirEntry describing the directory itself\n * [34..127] reserved (94 bytes, zero-filled)\n * [...] directory block (N * 28-byte entries) and payload blocks\n *\n * TdirEntry (28 bytes, big-endian):\n * off size field\n * 0 4 tagName (ASCII)\n * 4 4 tagNumber (int32)\n * 8 2 elementType (int16)\n * 10 2 elementSize (int16)\n * 12 4 elementCount (int32)\n * 16 4 dataSize (int32; total payload bytes — authoritative; for\n * well-formed entries equals count*size, but user/\n * opaque types may differ, so we read by dataSize)\n * 20 4 dataOffset (int32) OR inline data if dataSize <= 4\n * 24 4 dataHandle (int32; usually 0)\n *\n * Inline rule (per ABIF spec): when the declared dataSize <= 4 the payload bytes\n * are stored directly in the dataOffset field (left-aligned, padded to 4 bytes).\n *\n * MacBinary preamble: some ABIF files (older Mac-origin) start with a 128-byte\n * MacBinary header before the actual ABIF magic. We detect and skip it.\n */\n\nimport { asciiBytes, asciiString, asDataView, subview, tagNameFromInt32 } from './bytes';\nimport { AbifByteRange, AbifDirectory, AbifEntry, AbifFile } from './types';\n\nexport const HEADER_SIZE = 128;\nexport const ENTRY_SIZE = 28;\n\n/**\n * Parse an ABIF file from raw bytes into its verbatim directory structure.\n *\n * This is the RAW source of truth: it reads the tdir header and every entry as\n * stored — real dataSize, dataOffset, numElements (see `entry.raw`), the 4 inline\n * bytes, and the tdir/directory metadata — and interprets nothing. For a\n * high-level, opinionated view (typed channels, basecalls, metadata) layer\n * {@link parseAbif} on top.\n *\n * Accepts Uint8Array (works in Node and the browser). Node's Buffer extends\n * Uint8Array, so `readAbif(buffer)` and `readAbif(new Uint8Array(arrayBuffer))`\n * both work.\n *\n * Throws if the magic header is missing. Does NOT require any specific tags\n * (PBAS, DATA, ...) to be present — raw pre-basecalled files are supported.\n */\nexport function readAbif(bytes: Uint8Array): AbifFile {\n if (bytes.byteLength < HEADER_SIZE) {\n throw new Error(`ABIF too small: ${bytes.byteLength} bytes`);\n }\n\n // MacBinary wrap support: skip 128 bytes if magic is at offset 128.\n let macBinaryOffset = 0;\n if (asciiString(subview(bytes, 0, 4)) !== 'ABIF') {\n if (bytes.byteLength >= 128 + 4 && asciiString(subview(bytes, 128, 4)) === 'ABIF') {\n macBinaryOffset = 128;\n } else {\n throw new Error('Not an ABIF file: missing \"ABIF\" magic.');\n }\n }\n const base = macBinaryOffset;\n // After skipping any MacBinary wrap, the ABIF part itself must still hold a full 128-byte header;\n // otherwise reading version/tdir below would run past the DataView (a raw RangeError, not ours).\n if (bytes.byteLength - base < HEADER_SIZE) {\n throw new Error(`ABIF too small: ${bytes.byteLength - base} bytes after offset ${base}`);\n }\n const view = asDataView(bytes);\n\n const version = view.getInt16(base + 4, false);\n\n // Header bytes [base+6 .. base+34) are a TdirEntry describing the directory itself.\n const dirEntry = decodeEntry(bytes, view, base + 6, base);\n if (dirEntry.tagName !== 'tdir') {\n throw new Error(`Expected \"tdir\" header entry, got \"${dirEntry.tagName}\"`);\n }\n if (dirEntry.elementSize !== ENTRY_SIZE) {\n throw new Error(`Expected dir element size ${ENTRY_SIZE}, got ${dirEntry.elementSize}`);\n }\n\n // The directory's numElements (raw) is the authoritative entry count — like BioPython, we trust\n // it rather than clamp against tdir.dataSize, which is a redundant byte-count that some writers\n // desync. Physical bounds are enforced below; a negative/garbage count just yields 0 entries.\n const rawDirCount = dirEntry.raw?.elementCount ?? dirEntry.elementCount;\n const numEntries = Math.max(0, rawDirCount);\n // tdir.dataSize is always > 4 (28*N), so the dataOffset field is an external offset.\n const dirOffset = view.getInt32(base + 6 + 20, false);\n if (dirOffset < 0 || dirOffset + numEntries * ENTRY_SIZE > bytes.byteLength - base) {\n throw new Error(\n `Directory out of bounds: offset=${dirOffset}, entries=${numEntries}, file=${bytes.byteLength - base}`,\n );\n }\n\n const entries: AbifEntry[] = [];\n for (let i = 0; i < numEntries; i++) {\n entries.push(decodeEntry(bytes, view, base + dirOffset + i * ENTRY_SIZE, base));\n }\n\n // Root directory (tdir) header, as read — its dataSize may exceed numEntries*28 (directory padding).\n const dirDataSize = dirEntry.raw?.dataSize ?? numEntries * ENTRY_SIZE;\n const entriesEnd = base + dirOffset + numEntries * ENTRY_SIZE;\n const padLen = Math.min(\n Math.max(0, dirDataSize - numEntries * ENTRY_SIZE),\n Math.max(0, bytes.byteLength - entriesEnd),\n );\n const tdir: AbifDirectory = {\n entryCount: numEntries, // effective count actually read (== entries.length)\n rawEntryCount: rawDirCount, // tdir numElements verbatim, before any reconciliation\n elementType: dirEntry.elementType, // 1023 (tdir)\n tagNumber: dirEntry.tagNumber, // usually 1\n entrySize: dirEntry.elementSize,\n dataSize: dirDataSize,\n dataOffset: dirOffset,\n dataOffsetBytes: dirEntry.raw?.dataOffsetBytes ?? new Uint8Array(4),\n dataHandle: dirEntry.dataHandle,\n paddingBytes: new Uint8Array(subview(bytes, entriesEnd, padLen)),\n };\n\n // Reserved header bytes [base+34 .. base+128) — verbatim, so a raw reader keeps the whole header.\n const headerReserved = new Uint8Array(subview(bytes, base + 6 + ENTRY_SIZE, HEADER_SIZE - 6 - ENTRY_SIZE));\n\n // The MacBinary preamble bytes themselves, when present — verbatim, so the wrapper is reproducible.\n const macBinaryHeader = macBinaryOffset === 128 ? new Uint8Array(subview(bytes, 0, 128)) : undefined;\n\n const unreferencedRanges = computeUnreferencedRanges(bytes, base, dirOffset, dirDataSize, entries, macBinaryOffset);\n\n return { version, tdir, entries, macBinaryOffset, macBinaryHeader, headerReserved, unreferencedRanges };\n}\n\n/**\n * Find the file's physical byte ranges that no header/directory/entry payload covers — orphaned\n * blocks, trailing padding, etc. Computes the complement of every referenced interval so a raw\n * reader can account for all bytes without the writer having to be byte-exact.\n */\nfunction computeUnreferencedRanges(\n bytes: Uint8Array,\n base: number,\n dirOffset: number,\n dirDataSize: number,\n entries: AbifEntry[],\n macBinaryOffset: number,\n): AbifByteRange[] {\n const total = bytes.byteLength;\n const covered: Array<[number, number]> = [];\n if (macBinaryOffset === 128) covered.push([0, 128]); // preamble\n covered.push([base, base + HEADER_SIZE]); // 128-byte header (magic/version/tdir/reserved)\n // Directory spans the bytes actually read (numElements entries) OR the declared dataSize when it is\n // larger (padding) — whichever is bigger, so a desynced dataSize < numElements*28 doesn't mislabel\n // already-read entries as orphan bytes. A negative dataSize collapses to the physical entry span.\n const dirCovered = Math.max(entries.length * ENTRY_SIZE, Math.max(0, dirDataSize));\n covered.push([base + dirOffset, base + dirOffset + dirCovered]);\n for (const e of entries) {\n if (e.raw && !e.raw.inline) {\n const start = base + e.raw.dataOffset;\n covered.push([start, start + e.payload.byteLength]); // external payload\n }\n }\n\n const norm = covered\n .map(([s, en]): [number, number] => [Math.max(0, Math.min(s, total)), Math.max(0, Math.min(en, total))])\n .filter(([s, en]) => en > s)\n .sort((a, b) => a[0] - b[0]);\n\n const merged: Array<[number, number]> = [];\n for (const [s, en] of norm) {\n const last = merged[merged.length - 1];\n if (last && s <= last[1]) last[1] = Math.max(last[1], en);\n else merged.push([s, en]);\n }\n\n const gaps: AbifByteRange[] = [];\n let cursor = 0;\n for (const [s, en] of merged) {\n if (s > cursor) gaps.push({ offset: cursor, bytes: new Uint8Array(subview(bytes, cursor, s - cursor)) });\n cursor = Math.max(cursor, en);\n }\n if (cursor < total) gaps.push({ offset: cursor, bytes: new Uint8Array(subview(bytes, cursor, total - cursor)) });\n return gaps;\n}\n\n/**\n * Decode a 28-byte TdirEntry at the given absolute byte offset.\n *\n * Two robustness measures applied here that BioPython also uses and that real\n * ABIF files in the wild require:\n *\n * 1. The payload is exactly `dataSize` bytes — the authoritative directory field.\n * ABIF allows `numElements * elementSize != dataSize` for user/opaque types,\n * so we never derive the payload length from count*size (that both truncates\n * a larger declared payload and over-reads a smaller one).\n *\n * 2. Inline vs external follows the spec: inline iff `dataSize <= 4` (the payload\n * fits in the 4-byte dataOffset field). Data > 4 bytes is always external,\n * even when count*size <= 4. We fall back to count*size only when the declared\n * field is negative/garbage.\n *\n * 3. `elementCount` is reconciled down to what the payload can hold, so a desynced\n * (over-large) count can't drive readers past the real bytes.\n *\n * 4. External payload offsets are relative to the ABIF start, so we add `base`\n * (the MacBinary preamble length) when reading them.\n */\nfunction decodeEntry(bytes: Uint8Array, view: DataView, off: number, base: number): AbifEntry {\n const tagName = asciiString(subview(bytes, off, 4));\n const tagNumber = view.getInt32(off + 4, false);\n const elementType = view.getInt16(off + 8, false);\n const elementSize = view.getInt16(off + 10, false);\n const rawElementCount = view.getInt32(off + 12, false);\n const declaredDataSize = view.getInt32(off + 16, false);\n const dataHandle = view.getInt32(off + 24, false);\n\n const computedDataSize = Math.max(0, rawElementCount * Math.max(0, elementSize));\n // Payload length is the declared dataSize; a negative/garbage declared field falls back to the\n // computed count*size (consistent with the inline decision below).\n const payloadSize = declaredDataSize >= 0 ? declaredDataSize : computedDataSize;\n // Inline iff dataSize <= 4; fall back to computed size only for an invalid declared field.\n const inline = declaredDataSize >= 0 ? declaredDataSize <= 4 : computedDataSize <= 4;\n // Reconcile the element count down to what the payload holds, and never expose a negative count\n // (a malformed numElements would otherwise crash Array/TypedArray helpers downstream). When\n // elementSize <= 0 the per-element stride is unknown, so cap by payloadSize (≤ 1 byte/element)\n // rather than trusting the raw count — otherwise a typed getter reads past a 0-byte payload.\n const elementCount = Math.max(\n 0,\n elementSize > 0 ? Math.min(rawElementCount, Math.floor(payloadSize / elementSize)) : Math.min(rawElementCount, payloadSize),\n );\n\n let payload: Uint8Array;\n let dataOffset: number;\n if (inline) {\n dataOffset = -1;\n payload = new Uint8Array(subview(bytes, off + 20, Math.min(4, payloadSize)));\n } else {\n dataOffset = view.getInt32(off + 20, false);\n const at = base + dataOffset;\n if (dataOffset < 0 || at + payloadSize > bytes.byteLength) {\n throw new Error(\n `Entry ${tagName}${tagNumber}: payload out of bounds (offset=${dataOffset}, size=${payloadSize})`,\n );\n }\n payload = new Uint8Array(subview(bytes, at, payloadSize));\n }\n\n // The raw 4 bytes of the data/offset slot, verbatim (payload+padding when inline, offset when external).\n const dataOffsetBytes = new Uint8Array(subview(bytes, off + 20, 4));\n\n return {\n tagName,\n tagNumber,\n elementType,\n elementSize,\n elementCount,\n payload,\n dataHandle,\n raw: { elementCount: rawElementCount, dataSize: declaredDataSize, dataOffset, inline, dataOffsetBytes },\n };\n}\n\n/**\n * Serialize an AbifFile back to a Uint8Array.\n *\n * Layout produced: header (128 B) + directory (N*28 B) + payload block.\n * External payloads are packed tightly in entry order. Payloads <= 4 bytes are\n * stored inline inside their directory entry.\n *\n * Meaning-lossless, not byte-exact: the payload bytes, tag fields and dataSize\n * (= payload length) round-trip, but physical layout does not — payloads are\n * repacked, directory/header padding and any MacBinary preamble are dropped. A\n * byte-exact layout-preserving mode is a possible future opt-in.\n */\nexport function writeAbif(file: AbifFile): Uint8Array {\n const numEntries = file.entries.length;\n const dirOffset = HEADER_SIZE;\n const dirSize = numEntries * ENTRY_SIZE;\n\n // Compute external payload offsets. The payload bytes are authoritative: dataSize\n // written = payload.byteLength (may differ from count*size for user/opaque types).\n let payloadCursor = dirOffset + dirSize;\n const externalOffsets: number[] = new Array(numEntries);\n for (let i = 0; i < numEntries; i++) {\n const dataSize = file.entries[i].payload.byteLength;\n if (dataSize > 4) {\n externalOffsets[i] = payloadCursor;\n payloadCursor += dataSize;\n } else {\n externalOffsets[i] = -1; // inline\n }\n }\n\n const totalSize = payloadCursor;\n const out = new Uint8Array(totalSize);\n const outView = asDataView(out);\n\n // Header: \"ABIF\" + version (int16 BE) + tdir entry + zeros.\n out.set(asciiBytes('ABIF'), 0);\n outView.setInt16(4, file.version, false);\n // The tdir entry's dataOffset is the directory offset (explicit, not from\n // the AbifEntry payload — the tdir is structural).\n writeEntry(\n {\n tagName: 'tdir',\n tagNumber: 1,\n elementType: 1023,\n elementSize: ENTRY_SIZE,\n elementCount: numEntries,\n payload: new Uint8Array(0),\n dataHandle: 0,\n },\n out,\n outView,\n 6,\n /* externalOffset */ -1,\n /* externalDataSize */ dirSize,\n /* explicitDirOffset */ dirOffset,\n );\n\n // Directory entries.\n for (let i = 0; i < numEntries; i++) {\n const e = file.entries[i];\n writeEntry(e, out, outView, dirOffset + i * ENTRY_SIZE, externalOffsets[i]);\n }\n\n // Payload block.\n for (let i = 0; i < numEntries; i++) {\n const off = externalOffsets[i];\n if (off >= 0) {\n out.set(file.entries[i].payload, off);\n }\n }\n\n return out;\n}\n\nfunction writeEntry(\n e: AbifEntry,\n out: Uint8Array,\n outView: DataView,\n off: number,\n externalOffset: number,\n externalDataSize?: number,\n explicitDirOffset?: number,\n): void {\n if (e.tagName.length !== 4) {\n throw new Error(`tagName must be 4 chars: \"${e.tagName}\"`);\n }\n out.set(asciiBytes(e.tagName), off);\n outView.setInt32(off + 4, e.tagNumber, false);\n outView.setInt16(off + 8, e.elementType, false);\n outView.setInt16(off + 10, e.elementSize, false);\n outView.setInt32(off + 12, e.elementCount, false);\n const dataSize = externalDataSize ?? e.payload.byteLength;\n outView.setInt32(off + 16, dataSize, false);\n\n if (explicitDirOffset !== undefined) {\n outView.setInt32(off + 20, explicitDirOffset, false);\n } else if (dataSize <= 4) {\n // Inline: clear 4 bytes then place payload at off+20.\n out.fill(0, off + 20, off + 24);\n out.set(e.payload.subarray(0, dataSize), off + 20);\n } else {\n if (externalOffset < 0) {\n throw new Error(`External payload requires offset for ${e.tagName}${e.tagNumber}`);\n }\n outView.setInt32(off + 20, externalOffset, false);\n }\n outView.setInt32(off + 24, e.dataHandle, false);\n}\n\n// =====================================================================\n// Lookup / mutation helpers\n// =====================================================================\n\n/** Find an entry by name+number, or undefined. */\nexport function findEntry(file: AbifFile, name: string, number: number): AbifEntry | undefined {\n return file.entries.find(e => e.tagName === name && e.tagNumber === number);\n}\n\n/** Find all entries with the given tag name. */\nexport function findEntries(file: AbifFile, name: string): AbifEntry[] {\n return file.entries.filter(e => e.tagName === name);\n}\n\n/**\n * Replace the payload of an existing entry, or append a new one.\n * elementType/elementSize/elementCount must be supplied for new entries.\n */\nexport function upsertEntry(\n file: AbifFile,\n name: string,\n number: number,\n payload: Uint8Array,\n defaults: { elementType: number; elementSize: number; elementCount: number },\n): void {\n if (payload.byteLength !== defaults.elementCount * defaults.elementSize) {\n throw new Error(\n `upsertEntry ${name}${number}: payload length ${payload.byteLength} != count*size`,\n );\n }\n const existing = findEntry(file, name, number);\n if (existing) {\n existing.elementType = defaults.elementType;\n existing.elementSize = defaults.elementSize;\n existing.elementCount = defaults.elementCount;\n existing.payload = payload;\n } else {\n file.entries.push({\n tagName: name,\n tagNumber: number,\n elementType: defaults.elementType,\n elementSize: defaults.elementSize,\n elementCount: defaults.elementCount,\n payload,\n dataHandle: 0,\n });\n }\n}\n\n/** Re-export for users who want to interpret raw tag bytes themselves. */\nexport { tagNameFromInt32 };\n","/**\n * High-level typed view over an AbifFile.\n *\n * Reading helpers that interpret the raw payloads of well-known tags. For\n * mutation helpers (setSequence, setConfidences, ...) see ./setters.\n */\n\nimport { asciiString, asDataView } from './bytes';\nimport { findEntry } from './raw';\nimport { AbifDataChannelRole, AbifEntry, AbifFile } from './types';\n\n/** Get DATA<n> as a signed-int16 array, or undefined. */\nexport function getDataChannel(file: AbifFile, n: number): Int16Array | undefined {\n const e = findEntry(file, 'DATA', n);\n if (!e) return undefined;\n if (e.elementSize !== 2) {\n throw new Error(`DATA${n}: expected elementSize=2, got ${e.elementSize}`);\n }\n const arr = new Int16Array(e.elementCount);\n const view = asDataView(e.payload);\n for (let i = 0; i < e.elementCount; i++) {\n arr[i] = view.getInt16(i * 2, false);\n }\n return arr;\n}\n\n/**\n * Dye order, 4 ASCII chars (e.g. \"GATC\"). Defaults to \"GATC\" if FWO_ absent.\n *\n * GATC is the dye order produced by modern ABI 3730/3500 instruments and the\n * dominant default in the wild. Older \"ACGT\" defaults caused channel\n * mis-mapping on files where FWO_ is missing or malformed.\n */\nexport function getFwo(file: AbifFile): string {\n const e = findEntry(file, 'FWO_', 1);\n if (!e) return 'GATC';\n // Read only the declared elements — payload may carry trailing padding beyond elementCount.\n return asciiString(e.payload.subarray(0, e.elementCount));\n}\n\n/**\n * Whether an FWO_ string is a genuine dye order: a permutation of A/C/G/T with all\n * four bases distinct. `\"GATC\"` passes; `\"AAAA\"` (regex-valid but degenerate) does\n * not — mapping four channels through it would collapse them onto one base.\n */\nexport function isFwoPermutation(fwo: string): boolean {\n return /^[ACGT]{4}$/.test(fwo) && new Set(fwo).size === 4;\n}\n\n/**\n * Fact: the file carries a second dye-trace block, DATA9..12 (all four tags), in\n * addition to DATA1..4. Reports presence only — it does NOT say which block is\n * raw and which is analyzed/processed; that convention isn't stored in the file.\n */\nexport function hasData9To12Block(file: AbifFile): boolean {\n return !!(\n findEntry(file, 'DATA', 9) &&\n findEntry(file, 'DATA', 10) &&\n findEntry(file, 'DATA', 11) &&\n findEntry(file, 'DATA', 12)\n );\n}\n\n/**\n * Spec-defined role of a DATA<n> tag, limited to the numbers the ABIF spec names:\n *\n * - `'trace'` — dye-signal channels: DATA1..4 (raw dyes 1-4), DATA9..12\n * (analyzed dyes 1-4), and the two optional 5th-dye blocks\n * DATA105 (raw dye 5) and DATA205 (analyzed dye 5).\n * - `'telemetry'` — DATA5..8: instrument run telemetry (voltage, current,\n * power, temperature), one value per scan — NOT dye signal.\n * - `'other'` — any other DATA number. The spec does not enumerate higher\n * extra-dye tags (106/206/…), so we don't claim a role for them.\n *\n * A fact from the ABIF specification, not an inference about content.\n */\nexport function dataChannelRole(n: number): AbifDataChannelRole {\n if (n >= 5 && n <= 8) return 'telemetry';\n if ((n >= 1 && n <= 4) || (n >= 9 && n <= 12) || n === 105 || n === 205) return 'trace';\n return 'other';\n}\n\n/**\n * Whether the file declares its sequence already reverse-complemented, from the\n * RevC1 flag (int16, non-zero = true). undefined when RevC1 is absent. Reported\n * as-is; the consumer decides how to act on it.\n */\nexport function getReverseComplemented(file: AbifFile): boolean | undefined {\n const e = findEntry(file, 'RevC', 1);\n if (!e) return undefined;\n const view = asDataView(e.payload);\n return e.payload.byteLength >= 2 ? view.getInt16(0, false) !== 0 : e.payload.some(b => b !== 0);\n}\n\n/**\n * Map from base letter (\"A\"|\"C\"|\"G\"|\"T\") to the DATA1..4 tag number that holds\n * its channel, using the dye order declared by FWO_. If FWO_=\"GATC\" then\n * G→1, A→2, T→3, C→4.\n *\n * This follows the file's own FWO_ declaration for the DATA1..4 block; it makes\n * no claim about whether that block is raw or processed.\n */\nexport function getChannelMap(file: AbifFile): Record<'A' | 'C' | 'G' | 'T', number> {\n const fwo = getFwo(file);\n if (!isFwoPermutation(fwo)) {\n throw new Error(`FWO_ is not a permutation of A/C/G/T: \"${fwo}\"`);\n }\n return {\n [fwo[0]]: 1,\n [fwo[1]]: 2,\n [fwo[2]]: 3,\n [fwo[3]]: 4,\n } as Record<'A' | 'C' | 'G' | 'T', number>;\n}\n\n/** Get PBAS sequence (prefer PBAS2 over PBAS1). undefined if neither present. */\nexport function getSequence(file: AbifFile): string | undefined {\n // Bound by elementCount (payload may be padded) and drop trailing NULs, matching parseAbif.\n const read = (e: AbifEntry): string => asciiString(e.payload.subarray(0, e.elementCount)).replace(/\\0+$/g, '');\n const e2 = findEntry(file, 'PBAS', 2);\n if (e2) return read(e2);\n const e1 = findEntry(file, 'PBAS', 1);\n if (e1) return read(e1);\n return undefined;\n}\n\n/**\n * Get per-base Phred-like quality scores (0..255 byte values, typically 0..60\n * for Sanger). Prefers PCON2 over PCON1.\n *\n * PCON is declared in the ABIF spec as elementType=2 (char) but the byte\n * values ARE the Q-scores — we read raw bytes regardless of declared type.\n */\nexport function getConfidences(file: AbifFile): number[] | undefined {\n const e = findEntry(file, 'PCON', 2) ?? findEntry(file, 'PCON', 1);\n if (!e) return undefined;\n const out: number[] = new Array(e.elementCount);\n for (let i = 0; i < e.elementCount; i++) out[i] = e.payload[i];\n return out;\n}\n\n/**\n * Get peak scan positions (one per base). Prefers PLOC2 over PLOC1.\n *\n * Read as UNSIGNED int16: PLOC indexes into the sample trace and is always\n * non-negative, but values > 32767 (long traces) would wrap to negative\n * if interpreted as signed.\n */\nexport function getPositions(file: AbifFile): number[] | undefined {\n const e = findEntry(file, 'PLOC', 2) ?? findEntry(file, 'PLOC', 1);\n if (!e) return undefined;\n if (e.elementSize !== 2) {\n throw new Error(`PLOC: expected elementSize=2, got ${e.elementSize}`);\n }\n const view = asDataView(e.payload);\n const out: number[] = new Array(e.elementCount);\n for (let i = 0; i < e.elementCount; i++) out[i] = view.getUint16(i * 2, false);\n return out;\n}\n\n/**\n * Get average peak spacing (samples per base), from SPAC/1.\n *\n * ABIF spec defines SPAC as float32 (elementType=7); some legacy files\n * mislabel it as long (type=5). Both are 4 bytes and on disk the payload\n * is always a 32-bit float, so we read as float regardless of declared type.\n *\n * Returns undefined if SPAC is absent or non-positive.\n */\nexport function getSamplingRate(file: AbifFile): number | undefined {\n const e = findEntry(file, 'SPAC', 1);\n if (!e || e.elementSize !== 4 || e.payload.byteLength < 4) return undefined;\n const v = asDataView(e.payload).getFloat32(0, false);\n return Number.isFinite(v) && v > 0 ? v : undefined;\n}\n","/**\n * Mutation helpers for AbifFile: write PBAS/PCON/PLOC/SPAC and ensure DATA9..12\n * are present. Used by basecallers to author ABIF output.\n */\n\nimport { asciiBytes, asDataView } from './bytes';\nimport { findEntry, upsertEntry } from './raw';\nimport { hasData9To12Block } from './view';\nimport { AbifFile } from './types';\n\n/** Set PBAS2 (replaces if present). */\nexport function setSequence(file: AbifFile, sequence: string): void {\n upsertEntry(file, 'PBAS', 2, asciiBytes(sequence), {\n elementType: 2, // char\n elementSize: 1,\n elementCount: sequence.length,\n });\n}\n\n/** Set PCON2 (replaces if present). Values clamped to [0, 255]. */\nexport function setConfidences(file: AbifFile, q: ArrayLike<number>): void {\n const buf = new Uint8Array(q.length);\n for (let i = 0; i < q.length; i++) {\n buf[i] = Math.max(0, Math.min(255, Math.round(q[i])));\n }\n upsertEntry(file, 'PCON', 2, buf, {\n elementType: 2,\n elementSize: 1,\n elementCount: q.length,\n });\n}\n\n/**\n * Set PLOC2 (replaces if present).\n *\n * Written as UNSIGNED int16 so positions up to 65535 are preserved on disk\n * (signed int16 would wrap on traces with > 32k scans).\n */\nexport function setPositions(file: AbifFile, positions: ArrayLike<number>): void {\n const buf = new Uint8Array(positions.length * 2);\n const view = asDataView(buf);\n for (let i = 0; i < positions.length; i++) {\n view.setUint16(i * 2, Math.max(0, Math.min(0xffff, positions[i])), false);\n }\n upsertEntry(file, 'PLOC', 2, buf, {\n elementType: 4,\n elementSize: 2,\n elementCount: positions.length,\n });\n}\n\n/**\n * Set SPAC/1, SPAC/2, SPAC/3 — the standard ABIF \"average peak spacing\" trio\n * that KB-basecaller writes and downstream tools (BioPython, Sequencher,\n * KB-aware viewers) expect:\n *\n * - SPAC/1 (float32) — average peak spacing used in last analysis.\n * - SPAC/2 (pString) — basecaller name / identifier.\n * - SPAC/3 (float32) — average peak spacing computed by the basecaller.\n *\n * Both float fields are written with the same value.\n */\nexport function setAveragePeakSpacing(file: AbifFile, spacing: number, basecallerName: string): void {\n const f1 = new Uint8Array(4);\n asDataView(f1).setFloat32(0, spacing, false);\n upsertEntry(file, 'SPAC', 1, f1, { elementType: 7, elementSize: 4, elementCount: 1 });\n\n const nameBytes = asciiBytes(basecallerName);\n const len = Math.min(255, nameBytes.length);\n const p = new Uint8Array(1 + len);\n p[0] = len;\n p.set(nameBytes.subarray(0, len), 1);\n upsertEntry(file, 'SPAC', 2, p, { elementType: 18, elementSize: 1, elementCount: 1 + len });\n\n const f3 = new Uint8Array(4);\n asDataView(f3).setFloat32(0, spacing, false);\n upsertEntry(file, 'SPAC', 3, f3, { elementType: 7, elementSize: 4, elementCount: 1 });\n}\n\n/**\n * Mean consecutive peak-to-peak distance in scans, from a positions array.\n * Returns 0 when fewer than 2 positions are present.\n */\nexport function averagePeakSpacing(positions: ArrayLike<number>): number {\n if (positions.length < 2) return 0;\n return (positions[positions.length - 1] - positions[0]) / (positions.length - 1);\n}\n\n/**\n * Ensure DATA9..12 are present in the file. Many downstream consumers\n * (BioPython-style readers, viewers) read the chromatogram signal from\n * DATA9..12 by convention — these tags are the raw fluorescence on newer\n * instruments. Older files that only carry DATA1..8 break those consumers\n * with a \"no signal\" error after re-basecalling.\n *\n * We populate DATA9..12 by copying DATA1..4 (which on DATA1..8-only files IS\n * the raw signal). The DATA1..4 tags are left untouched so any tool that\n * reads them keeps working.\n *\n * No-op when DATA9..12 already exist.\n */\nexport function ensureRawDataChannels(file: AbifFile): void {\n if (hasData9To12Block(file)) return;\n for (let i = 1; i <= 4; i++) {\n const src = findEntry(file, 'DATA', i);\n if (!src) continue;\n const target = 8 + i;\n if (findEntry(file, 'DATA', target)) continue;\n file.entries.push({\n tagName: 'DATA',\n tagNumber: target,\n elementType: src.elementType,\n elementSize: src.elementSize,\n elementCount: src.elementCount,\n payload: new Uint8Array(src.payload),\n dataHandle: 0,\n });\n }\n}\n","/**\n * High-level \"parse everything\" wrapper around the raw + view layers.\n *\n * Returns a single ParsedAbif object with metadata, the FWO_-aware\n * DATA1..4 / DATA9..12 channel split, basecalls, and decoded directory entries\n * for diagnostics. Mirrors what typical viewers (chromatogram UIs, sample\n * inspectors) need from a single file.\n *\n * For round-trip authoring (basecallers), prefer {@link readAbif} +\n * setters from ./setters which operate directly on the raw AbifFile.\n */\n\nimport { asciiString, asDataView, subview } from './bytes';\nimport { readAbif } from './raw';\nimport { getFwo, isFwoPermutation } from './view';\nimport {\n AbifBaseCallVariant,\n AbifBaseCalls,\n AbifChromatogramBundle,\n AbifDecodedValue,\n AbifDirEntry,\n AbifEntry,\n AbifMetadata,\n ChannelSignals,\n ParsedAbif,\n} from './types';\n\nconst TYPE_NAMES: Record<number, string> = {\n 1: 'byte',\n 2: 'char',\n 3: 'word',\n 4: 'short',\n 5: 'long',\n 7: 'float',\n 8: 'double',\n 10: 'date',\n 11: 'time',\n 12: 'thumb',\n 13: 'bool',\n 18: 'pString',\n 19: 'cString',\n 1023: 'tdir',\n};\n\nfunction typeName(t: number): string {\n return TYPE_NAMES[t] ?? (t >= 1024 ? `user${t}` : `type${t}`);\n}\n\nfunction previewNumbers(arr: number[], max = 10): string {\n if (arr.length <= max) return `[${arr.join(', ')}]`;\n return `[${arr.slice(0, max).join(', ')}, … +${arr.length - max}] (n=${arr.length})`;\n}\n\nfunction truncate(s: string, n = 80): string {\n return s.length > n ? s.slice(0, n) + '…' : s;\n}\n\nfunction previewBytes(bytes: Uint8Array): string {\n const slice = bytes.subarray(0, 16);\n const hex = Array.from(slice, b => b.toString(16).padStart(2, '0')).join(' ');\n return `${bytes.byteLength}B [${hex}${bytes.byteLength > 16 ? ' …' : ''}]`;\n}\n\n/** Coerce a decoded value to a number array, treating a single scalar as a one-element array. */\nfunction asNumbers(d: AbifDecodedValue): number[] | undefined {\n if (d.kind === 'numbers') return d.value;\n if (d.kind === 'number') return [d.value];\n return undefined;\n}\n\n/**\n * Decode a run of fixed-width numbers, bounded by BOTH the element count and the\n * actual payload length — so a malformed entry whose declared elementSize/dataSize\n * disagrees with the type's real width can never drive a read past the buffer.\n */\nfunction decodeNumeric(\n byteLength: number,\n elementCount: number,\n size: number,\n read: (offset: number) => number,\n): AbifDecodedValue {\n const n = Math.max(0, Math.min(elementCount, Math.floor(byteLength / size)));\n const arr: number[] = [];\n for (let i = 0; i < n; i++) arr.push(read(i * size));\n return arr.length === 1 ? { kind: 'number', value: arr[0] } : { kind: 'numbers', value: arr };\n}\n\n/**\n * Decode a payload best-effort by ABIF element type.\n *\n * Strings have trailing NULs stripped (cString/pString convention).\n * pString (type 18) is decoded as `length-prefix + chars`.\n */\nfunction decodePayload(elementType: number, elementCount: number, payload: Uint8Array): AbifDecodedValue {\n const view = asDataView(payload);\n switch (elementType) {\n case 1: {\n const arr = Array.from(payload.subarray(0, elementCount));\n return { kind: 'numbers', value: arr };\n }\n case 2:\n case 19: {\n const s = asciiString(payload.subarray(0, elementCount)).replace(/\\0+$/g, '');\n return { kind: 'string', value: s };\n }\n case 3:\n return decodeNumeric(payload.byteLength, elementCount, 2, o => view.getUint16(o, false));\n case 4:\n return decodeNumeric(payload.byteLength, elementCount, 2, o => view.getInt16(o, false));\n case 5:\n return decodeNumeric(payload.byteLength, elementCount, 4, o => view.getInt32(o, false));\n case 7:\n return decodeNumeric(payload.byteLength, elementCount, 4, o => view.getFloat32(o, false));\n case 8:\n return decodeNumeric(payload.byteLength, elementCount, 8, o => view.getFloat64(o, false));\n case 10: {\n // A date needs 4 bytes; a short/truncated payload falls back to raw bytes rather than throwing.\n if (payload.byteLength < 4) return { kind: 'unknown', value: payload };\n const year = view.getInt16(0, false);\n const month = view.getUint8(2);\n const day = view.getUint8(3);\n return { kind: 'date', value: { year, month, day } };\n }\n case 11: {\n // A time needs 4 bytes; short payload → raw bytes, not a RangeError.\n if (payload.byteLength < 4) return { kind: 'unknown', value: payload };\n return {\n kind: 'time',\n value: {\n hour: view.getUint8(0),\n minute: view.getUint8(1),\n second: view.getUint8(2),\n hsec: view.getUint8(3),\n },\n };\n }\n case 13: {\n const arr: boolean[] = [];\n for (let i = 0; i < Math.min(elementCount, payload.byteLength); i++) arr.push(view.getUint8(i) !== 0);\n return { kind: 'bools', value: arr };\n }\n case 18: {\n // pString = length prefix + chars; an empty payload is just the empty string.\n if (payload.byteLength < 1) return { kind: 'string', value: '' };\n const len = view.getUint8(0);\n const s = asciiString(subview(payload, 1, Math.min(len, Math.max(0, elementCount - 1))));\n return { kind: 'string', value: s };\n }\n default:\n return { kind: 'unknown', value: payload };\n }\n}\n\nfunction previewDecoded(d: AbifDecodedValue, elementType: number): string {\n switch (d.kind) {\n case 'number':\n return String(d.value);\n case 'numbers':\n return previewNumbers(d.value);\n case 'string':\n return truncate(JSON.stringify(d.value));\n case 'bools':\n return d.value.length === 1 ? String(d.value[0]) : `[${d.value.join(', ')}]`;\n case 'date': {\n const { year, month, day } = d.value;\n return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n }\n case 'time': {\n const { hour, minute, second } = d.value;\n return `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`;\n }\n case 'bytes':\n return `${typeName(elementType)} ${previewBytes(d.value)}`;\n case 'unknown':\n return `${typeName(elementType)} ${previewBytes(d.value)}`;\n }\n}\n\n/**\n * Parse an ABIF file into a high-level view: metadata, channels, basecalls,\n * and decoded directory entries.\n *\n * This is the INTERPRETING layer — it makes convenience choices (FWO_ → \"GATC\"\n * fallback, derived samplingRate, preferred/upper-cased PBAS2 baseCalls). It is\n * not the raw structural truth: for that use {@link readAbif}, which reads the\n * directory verbatim (raw dataSize/offset/counts, tdir, inline bytes) and makes\n * no interpretation. `parseAbif` builds on top of it.\n *\n * Accepts ArrayBuffer or Uint8Array (Buffer in Node works too — it extends\n * Uint8Array). The `fileName` argument is informational only; it's preserved\n * in the result.\n */\nexport function parseAbif(input: ArrayBuffer | Uint8Array, fileName = ''): ParsedAbif {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n const file = readAbif(bytes);\n\n const entries: AbifDirEntry[] = file.entries.map(e => {\n // PCON is declared char (type 2) but its bytes ARE Q-scores; decode it as numbers so the\n // diagnostic view keeps zeros the char decoder would strip (matches baseCalls.confidences).\n const decoded =\n e.tagName === 'PCON' && e.elementSize === 1\n ? decodePayload(1, e.elementCount, e.payload) // type 1 = byte → { kind: 'numbers' }\n : decodePayload(e.elementType, e.elementCount, e.payload);\n // Prefer the real on-disk directory fields (present when read from a file) over\n // reconciled/computed values, so the diagnostic view reflects the actual record.\n return {\n tag: e.tagName,\n tagNumber: e.tagNumber,\n elementType: e.elementType,\n elementTypeName: typeName(e.elementType),\n elementSize: e.elementSize,\n elementCount: e.elementCount,\n rawElementCount: e.raw?.elementCount ?? e.elementCount,\n dataSize: e.raw?.dataSize ?? e.elementCount * e.elementSize,\n dataOffset: e.raw?.dataOffset ?? -1,\n inline: e.raw?.inline ?? e.elementCount * e.elementSize <= 4,\n decoded,\n preview: previewDecoded(decoded, e.elementType),\n };\n });\n\n // FWO_ → base order. Fall back to GATC unless FWO_ is a real permutation of A/C/G/T\n // (a degenerate value like \"AAAA\" is regex-valid but would collapse channels).\n let baseOrder = getFwo(file);\n if (!isFwoPermutation(baseOrder)) baseOrder = 'GATC';\n\n const dataChannels: Record<number, number[]> = {};\n const data1To4: ChannelSignals = { A: [], C: [], G: [], T: [] };\n const data9To12: ChannelSignals = { A: [], C: [], G: [], T: [] };\n const metadata: AbifMetadata = { comments: [] };\n const pbas: Record<number, string> = {};\n const pcon: Record<number, number[]> = {};\n const ploc: Record<number, number[]> = {};\n\n const channelKey = (i: number): keyof ChannelSignals => baseOrder[i] as keyof ChannelSignals;\n\n for (let idx = 0; idx < file.entries.length; idx++) {\n const e = file.entries[idx];\n const decoded = entries[idx].decoded;\n\n if (e.tagName === 'DATA') {\n // Accept single-element channels too (decodePayload collapses length-1 to a scalar).\n const nums = asNumbers(decoded);\n if (nums) {\n dataChannels[e.tagNumber] = nums;\n if (e.tagNumber >= 1 && e.tagNumber <= 4) data1To4[channelKey(e.tagNumber - 1)] = nums;\n else if (e.tagNumber >= 9 && e.tagNumber <= 12) data9To12[channelKey(e.tagNumber - 9)] = nums;\n }\n } else if (e.tagName === 'PBAS' && decoded.kind === 'string') {\n pbas[e.tagNumber] = decoded.value;\n } else if (e.tagName === 'PCON') {\n // PCON Q-scores are 1 byte each (elementType=2/char). Read them straight from the payload —\n // a trailing zero is a valid score, but the char decoder strips trailing NULs and would drop it.\n const nums = e.elementSize === 1 ? Array.from(e.payload.subarray(0, e.elementCount)) : asNumbers(decoded);\n if (nums) pcon[e.tagNumber] = nums;\n } else if (e.tagName === 'PLOC') {\n // PLOC sample indices are always non-negative — reinterpret int16 as uint16.\n const nums = asNumbers(decoded);\n if (nums) ploc[e.tagNumber] = nums.map(v => (v < 0 ? v + 0x10000 : v));\n } else if (e.tagName === 'SPAC') {\n // ABIF spec defines SPAC as float (elementType=7). Some legacy files mislabel\n // it as long (type=5); both are 4 bytes and the payload is always a float.\n if (e.elementSize === 4 && e.payload.byteLength >= 4) {\n const v = asDataView(e.payload).getFloat32(0, false);\n if (Number.isFinite(v) && v > 0) metadata.samplingRate = v;\n } else if (decoded.kind === 'number') {\n metadata.samplingRate = decoded.value;\n }\n } else if (e.tagName === 'SMPL' && decoded.kind === 'string') {\n metadata.sampleName = decoded.value;\n } else if (e.tagName === 'LANE' && decoded.kind === 'number') {\n metadata.laneNumber = decoded.value;\n } else if (e.tagName === 'TUBE' && decoded.kind === 'string') {\n metadata.tube = decoded.value;\n } else if (e.tagName === 'MCHN' && decoded.kind === 'string') {\n metadata.machineName = decoded.value;\n } else if (e.tagName === 'MODL' && decoded.kind === 'string') {\n metadata.machineModel = decoded.value;\n } else if (e.tagName === 'RUND' && decoded.kind === 'date') {\n const d = decoded.value;\n metadata.runDate = `${d.year}-${String(d.month).padStart(2, '0')}-${String(d.day).padStart(2, '0')}`;\n } else if (e.tagName === 'RUNT' && decoded.kind === 'time') {\n const t = decoded.value;\n metadata.runTime = `${String(t.hour).padStart(2, '0')}:${String(t.minute).padStart(2, '0')}:${String(t.second).padStart(2, '0')}`;\n } else if (e.tagName === 'CMNT' && decoded.kind === 'string') {\n metadata.comments.push(decoded.value);\n } else if (e.tagName === 'RevC' && e.tagNumber === 1) {\n // RevC1 (int16): file's own flag for whether the sequence is already\n // reverse-complemented. Only tagNumber 1 is defined by the spec. Reported\n // as-is; we draw no conclusion from it.\n if (decoded.kind === 'number') metadata.reverseComplemented = decoded.value !== 0;\n else if (decoded.kind === 'numbers') metadata.reverseComplemented = decoded.value.some(v => v !== 0);\n }\n }\n\n // Every basecall version the file carries, exactly as stored — the source of\n // truth. Per-version PCON/PLOC are kept strictly (no cross-version borrowing):\n // a variant reports only what its own tag number holds.\n const baseCallVariants: AbifBaseCallVariant[] = Object.keys(pbas)\n .map(Number)\n .sort((a, b) => a - b)\n .map((v): AbifBaseCallVariant => ({\n version: v,\n role: v === 1 ? 'edited' : v === 2 ? 'called' : 'unknown',\n // As stored: case is preserved (lower-case can encode masking/edits). The\n // uppercased convenience view lives on `baseCalls`, not here.\n sequence: pbas[v],\n confidences: pcon[v] ?? [],\n positions: ploc[v] ?? [],\n }));\n\n // Basecalls: prefer PBAS2 (called) over PBAS1 (edited) — a spec-role choice. Test key\n // presence, not string truthiness, so an existing-but-empty PBAS2 is still honored.\n let baseCalls: AbifBaseCalls | undefined;\n const pbasVersion = 2 in pbas ? 2 : 1 in pbas ? 1 : Object.keys(pbas).map(Number)[0];\n if (pbasVersion !== undefined && pbas[pbasVersion] !== undefined) {\n // Don't .trim(): keep length aligned with PCON/PLOC (trailing nulls already stripped).\n const seq = pbas[pbasVersion].toUpperCase();\n // Fall back to whichever PCON has a length matching the chosen PBAS — some\n // files ship PCON only under one tagNumber even when PBAS exists under both.\n // Fall back to whichever version's PCON/PLOC matches the chosen PBAS length — triggered when the\n // preferred version's array is missing OR present-but-length-mismatched. Expose none rather than a\n // broken array when nothing matches, so baseCalls stays self-consistent (baseCallVariants stays strict).\n let confidences = pcon[pbasVersion] ?? [];\n if (confidences.length !== seq.length) {\n confidences = Object.keys(pcon).map(Number).map(v => pcon[v]).find(c => c.length === seq.length) ?? [];\n }\n let positions = ploc[pbasVersion] ?? [];\n if (positions.length !== seq.length) {\n positions = Object.keys(ploc).map(Number).map(v => ploc[v]).find(pp => pp.length === seq.length) ?? [];\n }\n baseCalls = { sequence: seq, confidences, positions, pbasVersion };\n }\n\n // SPAC fallback: derive from PLOC positions or DATA9 length when missing.\n if (!Number.isFinite(metadata.samplingRate) || (metadata.samplingRate ?? 0) <= 0) {\n const pos = baseCalls?.positions;\n const data9Len = Math.max(\n data9To12.A.length,\n data9To12.C.length,\n data9To12.G.length,\n data9To12.T.length,\n );\n if (pos && pos.length > 1) {\n metadata.samplingRate = (pos[pos.length - 1] - pos[0]) / (pos.length - 1);\n } else if (baseCalls && baseCalls.sequence.length > 0 && data9Len > 0) {\n metadata.samplingRate = data9Len / baseCalls.sequence.length;\n }\n }\n\n const chromatogram: AbifChromatogramBundle = { baseOrder, dataChannels, data1To4, data9To12 };\n\n return {\n fileName,\n fileSize: bytes.byteLength,\n abifVersion: file.version,\n macBinaryOffset: file.macBinaryOffset,\n dirEntryCount: file.entries.length,\n metadata,\n chromatogram,\n baseCalls,\n baseCallVariants,\n entries,\n };\n}\n\n/** True when any channel has at least one signal value. */\nexport function hasSignals(s: ChannelSignals): boolean {\n return s.A.length > 0 || s.C.length > 0 || s.G.length > 0 || s.T.length > 0;\n}\n\n/** Length of the longest channel in a ChannelSignals bundle. */\nexport function channelMaxLength(s: ChannelSignals): number {\n return Math.max(s.A.length, s.C.length, s.G.length, s.T.length);\n}\n\n// Quiet unused-import for the AbifEntry type if it isn't reachable elsewhere.\nexport type { AbifEntry };\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/abif/bytes.ts","../../src/abif/abif-format.ts","../../src/abif/view.ts","../../src/abif/abif-op-crop.ts","../../src/abif/parser.ts","../../src/abif/setters.ts"],"names":["asciiString","bytes","s","i","asciiBytes","out","asDataView","subview","start","length","tagNameFromInt32","n","HEADER_SIZE","ENTRY_SIZE","readAbif","macBinaryOffset","base","view","version","dirEntry","decodeEntry","rawDirCount","numEntries","dirOffset","entries","dirDataSize","entriesEnd","padLen","tdir","headerReserved","macBinaryHeader","unreferencedRanges","computeUnreferencedRanges","total","covered","dirCovered","e","norm","en","a","b","merged","last","gaps","cursor","off","tagName","tagNumber","elementType","elementSize","rawElementCount","declaredDataSize","dataHandle","computedDataSize","payloadSize","inline","elementCount","payload","dataOffset","at","dataOffsetBytes","writeAbif","file","originalCount","verbatimRaw","anchor","raw","r","dirGrew","freshOffsets","size","outView","writeDirRecord","dataSize","rec","staleTail","findEntry","name","number","findEntries","upsertEntry","defaults","existing","getDataChannel","arr","getFwo","isFwoPermutation","fwo","hasData9To12Block","dataChannelRole","getReverseComplemented","getChannelMap","getSequence","getSequenceForVersion","getConfidences","getConfidencesForVersion","getPositions","getPositionsForVersion","getSamplingRate","v","cropAbif","range","options","end","processedLength","entryElementCount","rawTrace","cropDataEntry","basecallVersionsIn","cropBasecallVersion","versions","sequence","positions","confidences","kept","croppedSequence","croppedPositions","encodeUnsignedShorts","croppedConfidences","values","buf","TYPE_NAMES","typeName","t","previewNumbers","max","truncate","previewBytes","slice","hex","asNumbers","d","decodeNumeric","byteLength","read","decodePayload","o","year","month","day","len","previewDecoded","hour","minute","second","parseAbif","input","fileName","decoded","baseOrder","dataChannels","data1To4","data9To12","metadata","pbas","pcon","ploc","channelKey","idx","nums","baseCallVariants","baseCalls","pbasVersion","seq","c","pp","pos","data9Len","chromatogram","hasSignals","channelMaxLength","setSequence","setConfidences","q","setPositions","setAveragePeakSpacing","spacing","basecallerName","f1","nameBytes","p","f3","averagePeakSpacing","ensureRawDataChannels","src","target"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Tiny binary helpers used across the ABIF reader/writer.\n *\n * Everything here operates on Uint8Array + DataView so the same code runs in\n * Node (where Buffer extends Uint8Array) and the browser.\n */\n\nexport function asciiString(bytes: Uint8Array): string {\n let s = '';\n for (let i = 0; i < bytes.length; i++) s += String.fromCharCode(bytes[i]);\n return s;\n}\n\nexport function asciiBytes(s: string): Uint8Array {\n const out = new Uint8Array(s.length);\n for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 0xff;\n return out;\n}\n\n/** Returns a DataView over the given bytes, regardless of input shape. */\nexport function asDataView(bytes: Uint8Array): DataView {\n return new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n}\n\n/** Returns a Uint8Array view over a slice; never copies. */\nexport function subview(bytes: Uint8Array, start: number, length: number): Uint8Array {\n return bytes.subarray(start, start + length);\n}\n\n/** Tag name encoded as a big-endian uint32 (e.g. \"DATA\" → 0x44415441). */\nexport function tagNameToInt32(tag: string): number {\n return (\n ((tag.charCodeAt(0) & 0xff) << 24) |\n ((tag.charCodeAt(1) & 0xff) << 16) |\n ((tag.charCodeAt(2) & 0xff) << 8) |\n (tag.charCodeAt(3) & 0xff)\n );\n}\n\nexport function tagNameFromInt32(n: number): string {\n return String.fromCharCode((n >>> 24) & 0xff, (n >>> 16) & 0xff, (n >>> 8) & 0xff, n & 0xff);\n}\n","/**\n * Raw layer: the ABIF byte<->struct codec. Every directory entry (including unknown\n * vendor tags) is preserved as a raw payload (Uint8Array), and writeAbif() reproduces\n * the original bytes exactly for an unmodified round-trip (see its own doc comment).\n * The domain layer (view.ts, setters.ts, parser.ts, abif-op-*.ts) provides typed,\n * format-aware access on top of this — this file knows nothing about what any tag\n * means.\n *\n * ABIF file layout:\n * [0..3] \"ABIF\" magic\n * [4..5] version (int16 BE; 101 = v1.01)\n * [6..33] TdirEntry describing the directory itself\n * [34..127] reserved (94 bytes, zero-filled)\n * [...] directory block (N * 28-byte entries) and payload blocks\n *\n * TdirEntry (28 bytes, big-endian):\n * off size field\n * 0 4 tagName (ASCII)\n * 4 4 tagNumber (int32)\n * 8 2 elementType (int16)\n * 10 2 elementSize (int16)\n * 12 4 elementCount (int32)\n * 16 4 dataSize (int32; total payload bytes — authoritative; for\n * well-formed entries equals count*size, but user/\n * opaque types may differ, so we read by dataSize)\n * 20 4 dataOffset (int32) OR inline data if dataSize <= 4\n * 24 4 dataHandle (int32; usually 0)\n *\n * Inline rule (per ABIF spec): when the declared dataSize <= 4 the payload bytes\n * are stored directly in the dataOffset field (left-aligned, padded to 4 bytes).\n *\n * MacBinary preamble: some ABIF files (older Mac-origin) start with a 128-byte\n * MacBinary header before the actual ABIF magic. We detect and skip it.\n */\n\nimport { asciiBytes, asciiString, asDataView, subview, tagNameFromInt32 } from './bytes';\nimport { AbifByteRange, AbifDirectory, AbifEntry, AbifEntryRaw, AbifFile } from './types';\n\nexport const HEADER_SIZE = 128;\nexport const ENTRY_SIZE = 28;\n\n/**\n * Parse an ABIF file from raw bytes into its verbatim directory structure.\n *\n * This is the RAW source of truth: it reads the tdir header and every entry as\n * stored — real dataSize, dataOffset, numElements (see `entry.raw`), the 4 inline\n * bytes, and the tdir/directory metadata — and interprets nothing. For a\n * high-level, opinionated view (typed channels, basecalls, metadata) layer\n * {@link parseAbif} on top.\n *\n * Accepts Uint8Array (works in Node and the browser). Node's Buffer extends\n * Uint8Array, so `readAbif(buffer)` and `readAbif(new Uint8Array(arrayBuffer))`\n * both work.\n *\n * Throws if the magic header is missing. Does NOT require any specific tags\n * (PBAS, DATA, ...) to be present — raw pre-basecalled files are supported.\n */\nexport function readAbif(bytes: Uint8Array): AbifFile {\n if (bytes.byteLength < HEADER_SIZE) {\n throw new Error(`ABIF too small: ${bytes.byteLength} bytes`);\n }\n\n // MacBinary wrap support: skip 128 bytes if magic is at offset 128.\n let macBinaryOffset = 0;\n if (asciiString(subview(bytes, 0, 4)) !== 'ABIF') {\n if (bytes.byteLength >= 128 + 4 && asciiString(subview(bytes, 128, 4)) === 'ABIF') {\n macBinaryOffset = 128;\n } else {\n throw new Error('Not an ABIF file: missing \"ABIF\" magic.');\n }\n }\n const base = macBinaryOffset;\n // After skipping any MacBinary wrap, the ABIF part itself must still hold a full 128-byte header;\n // otherwise reading version/tdir below would run past the DataView (a raw RangeError, not ours).\n if (bytes.byteLength - base < HEADER_SIZE) {\n throw new Error(`ABIF too small: ${bytes.byteLength - base} bytes after offset ${base}`);\n }\n const view = asDataView(bytes);\n\n const version = view.getInt16(base + 4, false);\n\n // Header bytes [base+6 .. base+34) are a TdirEntry describing the directory itself.\n const dirEntry = decodeEntry(bytes, view, base + 6, base);\n if (dirEntry.tagName !== 'tdir') {\n throw new Error(`Expected \"tdir\" header entry, got \"${dirEntry.tagName}\"`);\n }\n if (dirEntry.elementSize !== ENTRY_SIZE) {\n throw new Error(`Expected dir element size ${ENTRY_SIZE}, got ${dirEntry.elementSize}`);\n }\n\n // The directory's numElements (raw) is the authoritative entry count — like BioPython, we trust\n // it rather than clamp against tdir.dataSize, which is a redundant byte-count that some writers\n // desync. Physical bounds are enforced below; a negative/garbage count just yields 0 entries.\n const rawDirCount = dirEntry.raw?.elementCount ?? dirEntry.elementCount;\n const numEntries = Math.max(0, rawDirCount);\n // tdir.dataSize is always > 4 (28*N), so the dataOffset field is an external offset.\n const dirOffset = view.getInt32(base + 6 + 20, false);\n if (dirOffset < 0 || dirOffset + numEntries * ENTRY_SIZE > bytes.byteLength - base) {\n throw new Error(\n `Directory out of bounds: offset=${dirOffset}, entries=${numEntries}, file=${bytes.byteLength - base}`,\n );\n }\n\n const entries: AbifEntry[] = [];\n for (let i = 0; i < numEntries; i++) {\n entries.push(decodeEntry(bytes, view, base + dirOffset + i * ENTRY_SIZE, base));\n }\n\n // Root directory (tdir) header, as read — its dataSize may exceed numEntries*28 (directory padding).\n const dirDataSize = dirEntry.raw?.dataSize ?? numEntries * ENTRY_SIZE;\n const entriesEnd = base + dirOffset + numEntries * ENTRY_SIZE;\n const padLen = Math.min(\n Math.max(0, dirDataSize - numEntries * ENTRY_SIZE),\n Math.max(0, bytes.byteLength - entriesEnd),\n );\n const tdir: AbifDirectory = {\n entryCount: numEntries, // effective count actually read (== entries.length)\n rawEntryCount: rawDirCount, // tdir numElements verbatim, before any reconciliation\n elementType: dirEntry.elementType, // 1023 (tdir)\n tagNumber: dirEntry.tagNumber, // usually 1\n entrySize: dirEntry.elementSize,\n dataSize: dirDataSize,\n dataOffset: dirOffset,\n dataOffsetBytes: dirEntry.raw?.dataOffsetBytes ?? new Uint8Array(4),\n dataHandle: dirEntry.dataHandle,\n paddingBytes: new Uint8Array(subview(bytes, entriesEnd, padLen)),\n };\n\n // Reserved header bytes [base+34 .. base+128) — verbatim, so a raw reader keeps the whole header.\n const headerReserved = new Uint8Array(subview(bytes, base + 6 + ENTRY_SIZE, HEADER_SIZE - 6 - ENTRY_SIZE));\n\n // The MacBinary preamble bytes themselves, when present — verbatim, so the wrapper is reproducible.\n const macBinaryHeader = macBinaryOffset === 128 ? new Uint8Array(subview(bytes, 0, 128)) : undefined;\n\n const unreferencedRanges = computeUnreferencedRanges(bytes, base, dirOffset, dirDataSize, entries, macBinaryOffset);\n\n return { version, tdir, entries, macBinaryOffset, macBinaryHeader, headerReserved, unreferencedRanges };\n}\n\n/**\n * Find the file's physical byte ranges that no header/directory/entry payload covers — orphaned\n * blocks, trailing padding, etc. Computes the complement of every referenced interval so a raw\n * reader can account for all bytes without the writer having to be byte-exact.\n */\nfunction computeUnreferencedRanges(\n bytes: Uint8Array,\n base: number,\n dirOffset: number,\n dirDataSize: number,\n entries: AbifEntry[],\n macBinaryOffset: number,\n): AbifByteRange[] {\n const total = bytes.byteLength;\n const covered: Array<[number, number]> = [];\n if (macBinaryOffset === 128) covered.push([0, 128]); // preamble\n covered.push([base, base + HEADER_SIZE]); // 128-byte header (magic/version/tdir/reserved)\n // Directory spans the bytes actually read (numElements entries) OR the declared dataSize when it is\n // larger (padding) — whichever is bigger, so a desynced dataSize < numElements*28 doesn't mislabel\n // already-read entries as orphan bytes. A negative dataSize collapses to the physical entry span.\n const dirCovered = Math.max(entries.length * ENTRY_SIZE, Math.max(0, dirDataSize));\n covered.push([base + dirOffset, base + dirOffset + dirCovered]);\n for (const e of entries) {\n if (e.raw && !e.raw.inline) {\n const start = base + e.raw.dataOffset;\n covered.push([start, start + e.payload.byteLength]); // external payload\n }\n }\n\n const norm = covered\n .map(([s, en]): [number, number] => [Math.max(0, Math.min(s, total)), Math.max(0, Math.min(en, total))])\n .filter(([s, en]) => en > s)\n .sort((a, b) => a[0] - b[0]);\n\n const merged: Array<[number, number]> = [];\n for (const [s, en] of norm) {\n const last = merged[merged.length - 1];\n if (last && s <= last[1]) last[1] = Math.max(last[1], en);\n else merged.push([s, en]);\n }\n\n const gaps: AbifByteRange[] = [];\n let cursor = 0;\n for (const [s, en] of merged) {\n if (s > cursor) gaps.push({ offset: cursor, bytes: new Uint8Array(subview(bytes, cursor, s - cursor)) });\n cursor = Math.max(cursor, en);\n }\n if (cursor < total) gaps.push({ offset: cursor, bytes: new Uint8Array(subview(bytes, cursor, total - cursor)) });\n return gaps;\n}\n\n/**\n * Decode a 28-byte TdirEntry at the given absolute byte offset.\n *\n * Two robustness measures applied here that BioPython also uses and that real\n * ABIF files in the wild require:\n *\n * 1. The payload is exactly `dataSize` bytes — the authoritative directory field.\n * ABIF allows `numElements * elementSize != dataSize` for user/opaque types,\n * so we never derive the payload length from count*size (that both truncates\n * a larger declared payload and over-reads a smaller one).\n *\n * 2. Inline vs external follows the spec: inline iff `dataSize <= 4` (the payload\n * fits in the 4-byte dataOffset field). Data > 4 bytes is always external,\n * even when count*size <= 4. We fall back to count*size only when the declared\n * field is negative/garbage.\n *\n * 3. `elementCount` is reconciled down to what the payload can hold, so a desynced\n * (over-large) count can't drive readers past the real bytes.\n *\n * 4. External payload offsets are relative to the ABIF start, so we add `base`\n * (the MacBinary preamble length) when reading them.\n */\nfunction decodeEntry(bytes: Uint8Array, view: DataView, off: number, base: number): AbifEntry {\n const tagName = asciiString(subview(bytes, off, 4));\n const tagNumber = view.getInt32(off + 4, false);\n const elementType = view.getInt16(off + 8, false);\n const elementSize = view.getInt16(off + 10, false);\n const rawElementCount = view.getInt32(off + 12, false);\n const declaredDataSize = view.getInt32(off + 16, false);\n const dataHandle = view.getInt32(off + 24, false);\n\n const computedDataSize = Math.max(0, rawElementCount * Math.max(0, elementSize));\n // Payload length is the declared dataSize; a negative/garbage declared field falls back to the\n // computed count*size (consistent with the inline decision below).\n const payloadSize = declaredDataSize >= 0 ? declaredDataSize : computedDataSize;\n // Inline iff dataSize <= 4; fall back to computed size only for an invalid declared field.\n const inline = declaredDataSize >= 0 ? declaredDataSize <= 4 : computedDataSize <= 4;\n // Reconcile the element count down to what the payload holds, and never expose a negative count\n // (a malformed numElements would otherwise crash Array/TypedArray helpers downstream). When\n // elementSize <= 0 the per-element stride is unknown, so cap by payloadSize (≤ 1 byte/element)\n // rather than trusting the raw count — otherwise a typed getter reads past a 0-byte payload.\n const elementCount = Math.max(\n 0,\n elementSize > 0\n ? Math.min(rawElementCount, Math.floor(payloadSize / elementSize))\n : Math.min(rawElementCount, payloadSize),\n );\n\n let payload: Uint8Array;\n let dataOffset: number;\n if (inline) {\n dataOffset = -1;\n payload = new Uint8Array(subview(bytes, off + 20, Math.min(4, payloadSize)));\n } else {\n dataOffset = view.getInt32(off + 20, false);\n const at = base + dataOffset;\n if (dataOffset < 0 || at + payloadSize > bytes.byteLength) {\n throw new Error(\n `Entry ${tagName}${tagNumber}: payload out of bounds (offset=${dataOffset}, size=${payloadSize})`,\n );\n }\n payload = new Uint8Array(subview(bytes, at, payloadSize));\n }\n\n // The raw 4 bytes of the data/offset slot, verbatim (payload+padding when inline, offset when external).\n const dataOffsetBytes = new Uint8Array(subview(bytes, off + 20, 4));\n\n return {\n tagName,\n tagNumber,\n elementType,\n elementSize,\n elementCount,\n payload,\n dataHandle,\n raw: { elementCount: rawElementCount, dataSize: declaredDataSize, dataOffset, inline, dataOffsetBytes },\n };\n}\n\n/**\n * Serialize an AbifFile back to a Uint8Array.\n *\n * Byte-exact on an unmodified round-trip for well-formed records and the tolerated\n * count/dataSize desyncs readAbif() accepts: readAbif() followed right back by\n * writeAbif(), with nothing touched in between, reproduces the original bytes\n * exactly (a MacBinary-wrapped input round-trips its ABIF payload byte-exact, but\n * the preamble itself is never re-added — see the AGENTS.md note on why). The one\n * exception is a genuinely invalid negative `dataSize`/`numElements` field (readAbif\n * tolerates these defensively, falling back to a computed size, but never treats them\n * as verbatim-eligible on write — see the byteLength check below) — such an entry\n * round-trips meaning-lossless (correct payload/content) but its declared dataSize\n * field gets normalized to the real payload length rather than reproducing the\n * original garbage value.\n *\n * This works by keeping every entry whose payload size hasn't changed since it was\n * read (`entry.raw` present — upsertEntry() clears it on any mutation — and\n * `payload.byteLength === raw.dataSize`) at its exact original directory slot and\n * file offset, writing the *original* on-disk numElements/dataSize/offset-or-inline-\n * padding instead of the reconciled/current ones. A new or resized entry is appended\n * past the highest byte offset still known to hold preserved content (every verbatim\n * entry's span, the directory, and any unreferenced range); only its own directory\n * record changes, so every other entry's bytes stay untouched. A resized/removed\n * entry's *old* span is not itself reserved — nothing points at it anymore, so it is\n * free to be reused by whatever gets appended next; the output is not padded out to\n * the original file's true end.\n *\n * The directory is kept at its original file offset as long as the entry count\n * didn't grow (removing entries just shortens it in place; the original directory\n * padding is only reused when the count is exactly unchanged, since a shorter\n * directory can't reuse padding sized for more entries). Only a growing entry count\n * relocates the whole directory to freshly appended space.\n */\nexport function writeAbif(file: AbifFile): Uint8Array {\n const base = file.macBinaryOffset;\n const numEntries = file.entries.length;\n const originalCount = file.tdir.entryCount;\n\n // An entry is verbatim-eligible when its payload is exactly the size it was read\n // at — the only case where its original directory record/offset can be reused.\n const verbatimRaw: Array<AbifEntryRaw | undefined> = file.entries.map(e =>\n e.raw && e.payload.byteLength === e.raw.dataSize ? e.raw : undefined,\n );\n\n // Anchor: the highest byte offset known to belong to the original (unwrapped)\n // file — header, directory span, every verbatim entry's external payload, and any\n // orphan byte range. Fresh content is appended after this, so an unmodified\n // round-trip never appends anything and the output ends exactly here.\n let anchor = HEADER_SIZE;\n // A malformed original can declare tdir.dataSize smaller than the entries actually occupy\n // (readAbif trusts numElements over dataSize — see the \"desynced tdir.dataSize\" test); the\n // *physical* directory span must still be protected even though the reused dataSize field\n // below intentionally reproduces the original (desynced) declared value byte-for-byte.\n anchor = Math.max(anchor, file.tdir.dataOffset + Math.max(file.tdir.dataSize, originalCount * ENTRY_SIZE));\n for (const raw of verbatimRaw) {\n if (raw && !raw.inline) anchor = Math.max(anchor, raw.dataOffset + raw.dataSize);\n }\n for (const r of file.unreferencedRanges) {\n anchor = Math.max(anchor, r.offset - base + r.bytes.length);\n }\n\n // Directory placement: reuse the original slot unless the entry count grew past it.\n const dirGrew = numEntries > originalCount;\n let cursor = anchor;\n const dirOffset = dirGrew ? cursor : file.tdir.dataOffset;\n const dirDataSize = numEntries === originalCount ? file.tdir.dataSize : numEntries * ENTRY_SIZE;\n if (dirGrew) cursor += dirDataSize;\n\n // Fresh (non-verbatim) external payloads are appended past the anchor, in entry order.\n const freshOffsets: number[] = new Array(numEntries);\n for (let i = 0; i < numEntries; i++) {\n const size = file.entries[i].payload.byteLength;\n if (verbatimRaw[i] || size <= 4) {\n freshOffsets[i] = -1; // reused verbatim placement, or inline — no fresh external slot\n continue;\n }\n freshOffsets[i] = cursor;\n cursor += size;\n }\n\n const out = new Uint8Array(cursor);\n const outView = asDataView(out);\n\n // Header: \"ABIF\" + version (int16 BE) + tdir entry (below) + reserved bytes verbatim.\n out.set(asciiBytes('ABIF'), 0);\n outView.setInt16(4, file.version, false);\n out.set(file.headerReserved, 6 + ENTRY_SIZE);\n writeDirRecord(out, outView, 6, {\n tagName: 'tdir',\n tagNumber: file.tdir.tagNumber,\n elementType: file.tdir.elementType,\n elementSize: file.tdir.entrySize,\n elementCount: numEntries,\n dataSize: dirDataSize,\n dataHandle: file.tdir.dataHandle,\n offsetSlot: { kind: 'external', value: dirOffset },\n });\n\n // Directory padding only carries over when the entry count is exactly unchanged.\n if (numEntries === originalCount && file.tdir.paddingBytes.length > 0) {\n out.set(file.tdir.paddingBytes, dirOffset + numEntries * ENTRY_SIZE);\n }\n\n for (let i = 0; i < numEntries; i++) {\n const e = file.entries[i];\n const raw = verbatimRaw[i];\n const off = dirOffset + i * ENTRY_SIZE;\n const dataSize = e.payload.byteLength;\n writeDirRecord(out, outView, off, {\n tagName: e.tagName,\n tagNumber: e.tagNumber,\n elementType: e.elementType,\n elementSize: e.elementSize,\n elementCount: raw ? raw.elementCount : e.elementCount,\n dataSize: raw ? raw.dataSize : dataSize,\n dataHandle: e.dataHandle,\n offsetSlot:\n dataSize <= 4\n ? { kind: 'inline', payload: e.payload, dataSize, staleTail: raw?.dataOffsetBytes }\n : { kind: 'external', value: raw ? raw.dataOffset : freshOffsets[i] },\n });\n if (dataSize > 4) {\n out.set(e.payload, raw ? raw.dataOffset : freshOffsets[i]);\n }\n }\n\n for (const r of file.unreferencedRanges) {\n out.set(r.bytes, r.offset - base);\n }\n\n return out;\n}\n\ntype OffsetSlot =\n | { kind: 'external'; value: number }\n | { kind: 'inline'; payload: Uint8Array; dataSize: number; staleTail?: Uint8Array };\n\nfunction writeDirRecord(\n out: Uint8Array,\n outView: DataView,\n off: number,\n rec: {\n tagName: string;\n tagNumber: number;\n elementType: number;\n elementSize: number;\n elementCount: number;\n dataSize: number;\n dataHandle: number;\n offsetSlot: OffsetSlot;\n },\n): void {\n if (rec.tagName.length !== 4) {\n throw new Error(`tagName must be 4 chars: \"${rec.tagName}\"`);\n }\n out.set(asciiBytes(rec.tagName), off);\n outView.setInt32(off + 4, rec.tagNumber, false);\n outView.setInt16(off + 8, rec.elementType, false);\n outView.setInt16(off + 10, rec.elementSize, false);\n outView.setInt32(off + 12, rec.elementCount, false);\n outView.setInt32(off + 16, rec.dataSize, false);\n if (rec.offsetSlot.kind === 'external') {\n outView.setInt32(off + 20, rec.offsetSlot.value, false);\n } else {\n // Inline: clear 4 bytes, place the payload, then restore any stale tail byte(s)\n // beyond dataSize from the original slot — a byte-exact round-trip needs them,\n // since they're not derivable from any semantic field.\n const { payload, dataSize, staleTail } = rec.offsetSlot;\n out.fill(0, off + 20, off + 24);\n out.set(payload.subarray(0, dataSize), off + 20);\n if (staleTail && dataSize < 4) {\n out.set(staleTail.subarray(dataSize, 4), off + 20 + dataSize);\n }\n }\n outView.setInt32(off + 24, rec.dataHandle, false);\n}\n\n// =====================================================================\n// Lookup / mutation helpers\n// =====================================================================\n\n/** Find an entry by name+number, or undefined. */\nexport function findEntry(file: AbifFile, name: string, number: number): AbifEntry | undefined {\n return file.entries.find(e => e.tagName === name && e.tagNumber === number);\n}\n\n/** Find all entries with the given tag name. */\nexport function findEntries(file: AbifFile, name: string): AbifEntry[] {\n return file.entries.filter(e => e.tagName === name);\n}\n\n/**\n * Replace the payload of an existing entry, or append a new one.\n * elementType/elementSize/elementCount must be supplied for new entries.\n *\n * This is the required way to mutate an entry read from a file — it clears `.raw`\n * on replacement so writeAbif() never reuses a now-stale on-disk shape. Setting\n * `entry.payload`/`elementType`/`elementSize`/`elementCount` directly instead\n * leaves `.raw` behind and can corrupt the written directory record.\n */\nexport function upsertEntry(\n file: AbifFile,\n name: string,\n number: number,\n payload: Uint8Array,\n defaults: { elementType: number; elementSize: number; elementCount: number },\n): void {\n if (payload.byteLength !== defaults.elementCount * defaults.elementSize) {\n throw new Error(`upsertEntry ${name}${number}: payload length ${payload.byteLength} != count*size`);\n }\n const existing = findEntry(file, name, number);\n if (existing) {\n existing.elementType = defaults.elementType;\n existing.elementSize = defaults.elementSize;\n existing.elementCount = defaults.elementCount;\n existing.payload = payload;\n // `raw` describes the entry's shape as read from disk; once mutated it no longer applies —\n // clearing it forces writeAbif() to place this entry fresh rather than reuse a stale record\n // (e.g. a same-length content edit would otherwise silently keep the old elementCount/dataSize).\n existing.raw = undefined;\n } else {\n file.entries.push({\n tagName: name,\n tagNumber: number,\n elementType: defaults.elementType,\n elementSize: defaults.elementSize,\n elementCount: defaults.elementCount,\n payload,\n dataHandle: 0,\n });\n }\n}\n\n/** Re-export for users who want to interpret raw tag bytes themselves. */\nexport { tagNameFromInt32 };\n","/**\n * High-level typed view over an AbifFile.\n *\n * Reading helpers that interpret the raw payloads of well-known tags. For\n * mutation helpers (setSequence, setConfidences, ...) see ./setters.\n */\n\nimport { findEntry } from './abif-format';\nimport { asciiString, asDataView } from './bytes';\nimport { AbifDataChannelRole, AbifFile } from './types';\n\n/** Get DATA<n> as a signed-int16 array, or undefined. */\nexport function getDataChannel(file: AbifFile, n: number): Int16Array | undefined {\n const e = findEntry(file, 'DATA', n);\n if (!e) return undefined;\n if (e.elementSize !== 2) {\n throw new Error(`DATA${n}: expected elementSize=2, got ${e.elementSize}`);\n }\n const arr = new Int16Array(e.elementCount);\n const view = asDataView(e.payload);\n for (let i = 0; i < e.elementCount; i++) {\n arr[i] = view.getInt16(i * 2, false);\n }\n return arr;\n}\n\n/**\n * Dye order, 4 ASCII chars (e.g. \"GATC\"). Defaults to \"GATC\" if FWO_ absent.\n *\n * GATC is the dye order produced by modern ABI 3730/3500 instruments and the\n * dominant default in the wild. Older \"ACGT\" defaults caused channel\n * mis-mapping on files where FWO_ is missing or malformed.\n */\nexport function getFwo(file: AbifFile): string {\n const e = findEntry(file, 'FWO_', 1);\n if (!e) return 'GATC';\n // Read only the declared elements — payload may carry trailing padding beyond elementCount.\n return asciiString(e.payload.subarray(0, e.elementCount));\n}\n\n/**\n * Whether an FWO_ string is a genuine dye order: a permutation of A/C/G/T with all\n * four bases distinct. `\"GATC\"` passes; `\"AAAA\"` (regex-valid but degenerate) does\n * not — mapping four channels through it would collapse them onto one base.\n */\nexport function isFwoPermutation(fwo: string): boolean {\n return /^[ACGT]{4}$/.test(fwo) && new Set(fwo).size === 4;\n}\n\n/**\n * Fact: the file carries a second dye-trace block, DATA9..12 (all four tags), in\n * addition to DATA1..4. Reports presence only — it does NOT say which block is\n * raw and which is analyzed/processed; that convention isn't stored in the file.\n */\nexport function hasData9To12Block(file: AbifFile): boolean {\n return !!(\n findEntry(file, 'DATA', 9) &&\n findEntry(file, 'DATA', 10) &&\n findEntry(file, 'DATA', 11) &&\n findEntry(file, 'DATA', 12)\n );\n}\n\n/**\n * Spec-defined role of a DATA<n> tag, limited to the numbers the ABIF spec names:\n *\n * - `'trace'` — dye-signal channels: DATA1..4 (raw dyes 1-4), DATA9..12\n * (analyzed dyes 1-4), and the two optional 5th-dye blocks\n * DATA105 (raw dye 5) and DATA205 (analyzed dye 5).\n * - `'telemetry'` — DATA5..8: instrument run telemetry (voltage, current,\n * power, temperature), one value per scan — NOT dye signal.\n * - `'other'` — any other DATA number. The spec does not enumerate higher\n * extra-dye tags (106/206/…), so we don't claim a role for them.\n *\n * A fact from the ABIF specification, not an inference about content.\n */\nexport function dataChannelRole(n: number): AbifDataChannelRole {\n if (n >= 5 && n <= 8) return 'telemetry';\n if ((n >= 1 && n <= 4) || (n >= 9 && n <= 12) || n === 105 || n === 205) return 'trace';\n return 'other';\n}\n\n/**\n * Whether the file declares its sequence already reverse-complemented, from the\n * RevC1 flag (int16, non-zero = true). undefined when RevC1 is absent. Reported\n * as-is; the consumer decides how to act on it.\n */\nexport function getReverseComplemented(file: AbifFile): boolean | undefined {\n const e = findEntry(file, 'RevC', 1);\n if (!e) return undefined;\n const view = asDataView(e.payload);\n return e.payload.byteLength >= 2 ? view.getInt16(0, false) !== 0 : e.payload.some(b => b !== 0);\n}\n\n/**\n * Map from base letter (\"A\"|\"C\"|\"G\"|\"T\") to the DATA1..4 tag number that holds\n * its channel, using the dye order declared by FWO_. If FWO_=\"GATC\" then\n * G→1, A→2, T→3, C→4.\n *\n * This follows the file's own FWO_ declaration for the DATA1..4 block; it makes\n * no claim about whether that block is raw or processed.\n */\nexport function getChannelMap(file: AbifFile): Record<'A' | 'C' | 'G' | 'T', number> {\n const fwo = getFwo(file);\n if (!isFwoPermutation(fwo)) {\n throw new Error(`FWO_ is not a permutation of A/C/G/T: \"${fwo}\"`);\n }\n return {\n [fwo[0]]: 1,\n [fwo[1]]: 2,\n [fwo[2]]: 3,\n [fwo[3]]: 4,\n } as Record<'A' | 'C' | 'G' | 'T', number>;\n}\n\n/** Get PBAS sequence (prefer PBAS2 over PBAS1). undefined if neither present. */\nexport function getSequence(file: AbifFile): string | undefined {\n return getSequenceForVersion(file, 2) ?? getSequenceForVersion(file, 1);\n}\n\n/**\n * Get PBAS<version> exactly as stored — no called/edited preference, unlike\n * {@link getSequence}. Used where each basecall version must be handled on its\n * own (e.g. cropping every version a file carries, not just the preferred one).\n */\nexport function getSequenceForVersion(file: AbifFile, version: number): string | undefined {\n const e = findEntry(file, 'PBAS', version);\n if (!e) return undefined;\n // Bound by elementCount (payload may be padded) and drop trailing NULs, matching parseAbif.\n return asciiString(e.payload.subarray(0, e.elementCount)).replace(/\\0+$/g, '');\n}\n\n/**\n * Get per-base Phred-like quality scores (0..255 byte values, typically 0..60\n * for Sanger). Prefers PCON2 over PCON1.\n *\n * PCON is declared in the ABIF spec as elementType=2 (char) but the byte\n * values ARE the Q-scores — we read raw bytes regardless of declared type.\n */\nexport function getConfidences(file: AbifFile): number[] | undefined {\n return getConfidencesForVersion(file, 2) ?? getConfidencesForVersion(file, 1);\n}\n\n/**\n * Get PCON<version> exactly as stored — no called/edited preference, unlike\n * {@link getConfidences}. See {@link getSequenceForVersion} for why this exists.\n */\nexport function getConfidencesForVersion(file: AbifFile, version: number): number[] | undefined {\n const e = findEntry(file, 'PCON', version);\n if (!e) return undefined;\n const out: number[] = new Array(e.elementCount);\n for (let i = 0; i < e.elementCount; i++) out[i] = e.payload[i];\n return out;\n}\n\n/**\n * Get peak scan positions (one per base). Prefers PLOC2 over PLOC1.\n *\n * Read as UNSIGNED int16: PLOC indexes into the sample trace and is always\n * non-negative, but values > 32767 (long traces) would wrap to negative\n * if interpreted as signed.\n */\nexport function getPositions(file: AbifFile): number[] | undefined {\n return getPositionsForVersion(file, 2) ?? getPositionsForVersion(file, 1);\n}\n\n/**\n * Get PLOC<version> exactly as stored — no called/edited preference, unlike\n * {@link getPositions}. See {@link getSequenceForVersion} for why this exists.\n */\nexport function getPositionsForVersion(file: AbifFile, version: number): number[] | undefined {\n const e = findEntry(file, 'PLOC', version);\n if (!e) return undefined;\n if (e.elementSize !== 2) {\n throw new Error(`PLOC${version}: expected elementSize=2, got ${e.elementSize}`);\n }\n const view = asDataView(e.payload);\n const out: number[] = new Array(e.elementCount);\n for (let i = 0; i < e.elementCount; i++) out[i] = view.getUint16(i * 2, false);\n return out;\n}\n\n/**\n * Get average peak spacing (samples per base), from SPAC/1.\n *\n * ABIF spec defines SPAC as float32 (elementType=7); some legacy files\n * mislabel it as long (type=5). Both are 4 bytes and on disk the payload\n * is always a 32-bit float, so we read as float regardless of declared type.\n *\n * Returns undefined if SPAC is absent or non-positive.\n */\nexport function getSamplingRate(file: AbifFile): number | undefined {\n const e = findEntry(file, 'SPAC', 1);\n if (!e || e.elementSize !== 4 || e.payload.byteLength < 4) return undefined;\n const v = asDataView(e.payload).getFloat32(0, false);\n return Number.isFinite(v) && v > 0 ? v : undefined;\n}\n","/**\n * Domain-layer operation: crop an ABIF file to a sample range.\n *\n * `{ start, end }` is a half-open sample range in the DATA9..12 (processed/analyzed)\n * domain — the only domain PLOC maps into (see AGENTS.md's \"raw vs processed\" note).\n * DATA9..12 are sliced exactly by that range. DATA1..4/5..8 (raw dye trace and\n * instrument telemetry) have no honest sample-for-sample correspondence to the\n * processed domain (the mapping is non-linear mobility correction, not stored in the\n * file), so they are never approximated: `rawTrace` keeps them whole and untouched,\n * or omits them, never a proportional slice.\n *\n * Every basecall version the file carries (PBAS1/PCON1/PLOC1 \"edited\",\n * PBAS2/PCON2/PLOC2 \"called\", or any vendor version) is cropped independently by its\n * OWN PLOC — two versions are not guaranteed to share base positions or even length\n * (edits insert/delete bases), so there is no shared coordinate to crop them together\n * by. A version with no PLOC of its own cannot be cropped and is rejected rather than\n * silently dropped or left un-cropped.\n *\n * Everything else (metadata, FWO_, SPAC, ...) is carried over untouched — this is a\n * structural crop, not a re-derivation of run metadata for the new region.\n *\n * Reverse-complement is out of scope here; this function has no RC option.\n *\n * Returns a new, independently mutable AbifFile — the input is not mutated, and\n * neither is the output if the input is later touched. Untouched entries are\n * shallow-copied (a new AbifEntry object; the underlying payload bytes are shared,\n * which is safe since nothing ever mutates payload bytes in place — only replaces\n * them wholesale), so a later upsertEntry() on either file's copy of a shared tag\n * can't reach into the other file's entries.\n */\n\nimport { findEntry } from './abif-format';\nimport { asciiBytes, asDataView } from './bytes';\nimport { AbifEntry, AbifFile } from './types';\nimport { getConfidencesForVersion, getPositionsForVersion, getSequenceForVersion, hasData9To12Block } from './view';\n\nexport interface CropAbifRange {\n /** Inclusive start sample index into DATA9..12. */\n start: number;\n /** Exclusive end sample index into DATA9..12. */\n end: number;\n}\n\nexport interface CropAbifOptions {\n /**\n * DATA1..4 (raw dye trace) and DATA5..8 (telemetry): 'full' keeps them whole and\n * untouched (the exported file's raw trace no longer lines up sample-for-sample\n * with the cropped DATA9..12/PLOC, by design — see the module doc comment);\n * 'omit' drops them from the output entirely. Default 'omit'.\n */\n rawTrace?: 'full' | 'omit';\n}\n\n/** Crop an AbifFile to a DATA9..12 sample range. See the module doc comment for the model. */\nexport function cropAbif(file: AbifFile, range: CropAbifRange, options: CropAbifOptions = {}): AbifFile {\n const { start, end } = range;\n if (!Number.isInteger(start) || !Number.isInteger(end) || start < 0 || end <= start) {\n throw new Error(`cropAbif: invalid range [${start}, ${end})`);\n }\n if (!hasData9To12Block(file)) {\n throw new Error('cropAbif: no DATA9..12 block to crop — the range has nothing to apply to');\n }\n // The range's meaning is bounded by the processed trace itself: clamping a too-large `end`\n // instead of rejecting it would let a kept base's PLOC point past the (now shorter) cropped\n // DATA9..12 — a structurally inconsistent result. Bound by the shortest of the four channels,\n // in case a malformed file's DATA9..12 lengths ever disagree.\n const processedLength = Math.min(\n entryElementCount(file, 9),\n entryElementCount(file, 10),\n entryElementCount(file, 11),\n entryElementCount(file, 12),\n );\n if (end > processedLength) {\n throw new Error(`cropAbif: range end ${end} exceeds the processed trace length ${processedLength}`);\n }\n const rawTrace = options.rawTrace ?? 'omit';\n\n const entries: AbifEntry[] = [];\n for (const e of file.entries) {\n if (e.tagName === 'DATA' && e.tagNumber >= 9 && e.tagNumber <= 12) {\n entries.push(cropDataEntry(e, start, end));\n } else if (e.tagName === 'DATA' && e.tagNumber >= 1 && e.tagNumber <= 8) {\n // Shallow-copy so a later upsertEntry() on the cropped file's copy (mutates in place)\n // can never reach back and corrupt the input file's own entry object.\n if (rawTrace === 'full') entries.push({ ...e });\n } else if (e.tagName === 'PBAS' || e.tagName === 'PCON' || e.tagName === 'PLOC') {\n // Handled per-version below, once per version rather than once per tag.\n } else {\n entries.push({ ...e });\n }\n }\n\n for (const version of basecallVersionsIn(file)) {\n entries.push(...cropBasecallVersion(file, version, start, end));\n }\n\n return {\n version: file.version,\n tdir: file.tdir,\n entries,\n macBinaryOffset: 0,\n macBinaryHeader: undefined,\n headerReserved: file.headerReserved,\n // Orphan byte ranges belong to the pre-crop file's specific byte layout; carrying\n // them into a structurally different (smaller) file would preserve meaningless bytes.\n unreferencedRanges: [],\n };\n}\n\n/** DATA<n>'s elementCount, or 0 if absent — used to bound the requested range up front. */\nfunction entryElementCount(file: AbifFile, n: number): number {\n return findEntry(file, 'DATA', n)?.elementCount ?? 0;\n}\n\nfunction cropDataEntry(e: AbifEntry, start: number, end: number): AbifEntry {\n if (e.elementSize !== 2) {\n throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);\n }\n // Callers only reach here once cropAbif has already validated end <= the processed trace length.\n const payload = new Uint8Array(e.payload.subarray(start * 2, end * 2));\n return {\n tagName: 'DATA',\n tagNumber: e.tagNumber,\n elementType: e.elementType,\n elementSize: 2,\n elementCount: end - start,\n payload,\n dataHandle: e.dataHandle,\n };\n}\n\n/** Every PBAS tag number present, ascending (1 = edited, 2 = called, other = vendor). */\nfunction basecallVersionsIn(file: AbifFile): number[] {\n const versions = new Set<number>();\n for (const e of file.entries) {\n if (e.tagName === 'PBAS') versions.add(e.tagNumber);\n }\n return Array.from(versions).sort((a, b) => a - b);\n}\n\n/** Crop one basecall version's PBAS/PCON/PLOC by its own PLOC, independent of any other version. */\nfunction cropBasecallVersion(file: AbifFile, version: number, start: number, end: number): AbifEntry[] {\n const sequence = getSequenceForVersion(file, version);\n if (sequence === undefined) return [];\n const positions = getPositionsForVersion(file, version);\n if (positions === undefined) {\n throw new Error(`cropAbif: PBAS${version} has no PLOC${version} to crop by`);\n }\n if (positions.length !== sequence.length) {\n throw new Error(\n `cropAbif: PBAS${version}/PLOC${version} length mismatch (${sequence.length} vs ${positions.length})`,\n );\n }\n const confidences = getConfidencesForVersion(file, version);\n if (confidences !== undefined && confidences.length !== sequence.length) {\n throw new Error(`cropAbif: PBAS${version}/PCON${version} length mismatch`);\n }\n\n const kept: number[] = [];\n for (let i = 0; i < positions.length; i++) {\n if (positions[i] >= start && positions[i] < end) kept.push(i);\n }\n\n const croppedSequence = kept.map(i => sequence[i]).join('');\n const croppedPositions = kept.map(i => positions[i] - start);\n\n const out: AbifEntry[] = [\n {\n tagName: 'PBAS',\n tagNumber: version,\n elementType: 2, // char\n elementSize: 1,\n elementCount: croppedSequence.length,\n payload: asciiBytes(croppedSequence),\n dataHandle: 0,\n },\n {\n tagName: 'PLOC',\n tagNumber: version,\n elementType: 4, // short, but PLOC values are unsigned (see setPositions)\n elementSize: 2,\n elementCount: croppedPositions.length,\n payload: encodeUnsignedShorts(croppedPositions),\n dataHandle: 0,\n },\n ];\n if (confidences !== undefined) {\n const croppedConfidences = kept.map(i => confidences[i]);\n out.push({\n tagName: 'PCON',\n tagNumber: version,\n elementType: 2, // declared char; bytes ARE Q-scores, see getConfidencesForVersion\n elementSize: 1,\n elementCount: croppedConfidences.length,\n payload: Uint8Array.from(croppedConfidences),\n dataHandle: 0,\n });\n }\n return out;\n}\n\nfunction encodeUnsignedShorts(values: readonly number[]): Uint8Array {\n const buf = new Uint8Array(values.length * 2);\n const view = asDataView(buf);\n for (let i = 0; i < values.length; i++) {\n view.setUint16(i * 2, Math.max(0, Math.min(0xffff, values[i])), false);\n }\n return buf;\n}\n","/**\n * High-level \"parse everything\" wrapper around the raw + view layers.\n *\n * Returns a single ParsedAbif object with metadata, the FWO_-aware\n * DATA1..4 / DATA9..12 channel split, basecalls, and decoded directory entries\n * for diagnostics. Mirrors what typical viewers (chromatogram UIs, sample\n * inspectors) need from a single file.\n *\n * For round-trip authoring (basecallers), prefer {@link readAbif} +\n * setters from ./setters which operate directly on the raw AbifFile.\n */\n\nimport { readAbif } from './abif-format';\nimport { asciiString, asDataView, subview } from './bytes';\nimport {\n AbifBaseCalls,\n AbifBaseCallVariant,\n AbifChromatogramBundle,\n AbifDecodedValue,\n AbifDirEntry,\n AbifEntry,\n AbifMetadata,\n ChannelSignals,\n ParsedAbif,\n} from './types';\nimport { getFwo, isFwoPermutation } from './view';\n\nconst TYPE_NAMES: Record<number, string> = {\n 1: 'byte',\n 2: 'char',\n 3: 'word',\n 4: 'short',\n 5: 'long',\n 7: 'float',\n 8: 'double',\n 10: 'date',\n 11: 'time',\n 12: 'thumb',\n 13: 'bool',\n 18: 'pString',\n 19: 'cString',\n 1023: 'tdir',\n};\n\nfunction typeName(t: number): string {\n return TYPE_NAMES[t] ?? (t >= 1024 ? `user${t}` : `type${t}`);\n}\n\nfunction previewNumbers(arr: number[], max = 10): string {\n if (arr.length <= max) return `[${arr.join(', ')}]`;\n return `[${arr.slice(0, max).join(', ')}, … +${arr.length - max}] (n=${arr.length})`;\n}\n\nfunction truncate(s: string, n = 80): string {\n return s.length > n ? s.slice(0, n) + '…' : s;\n}\n\nfunction previewBytes(bytes: Uint8Array): string {\n const slice = bytes.subarray(0, 16);\n const hex = Array.from(slice, b => b.toString(16).padStart(2, '0')).join(' ');\n return `${bytes.byteLength}B [${hex}${bytes.byteLength > 16 ? ' …' : ''}]`;\n}\n\n/** Coerce a decoded value to a number array, treating a single scalar as a one-element array. */\nfunction asNumbers(d: AbifDecodedValue): number[] | undefined {\n if (d.kind === 'numbers') return d.value;\n if (d.kind === 'number') return [d.value];\n return undefined;\n}\n\n/**\n * Decode a run of fixed-width numbers, bounded by BOTH the element count and the\n * actual payload length — so a malformed entry whose declared elementSize/dataSize\n * disagrees with the type's real width can never drive a read past the buffer.\n */\nfunction decodeNumeric(\n byteLength: number,\n elementCount: number,\n size: number,\n read: (offset: number) => number,\n): AbifDecodedValue {\n const n = Math.max(0, Math.min(elementCount, Math.floor(byteLength / size)));\n const arr: number[] = [];\n for (let i = 0; i < n; i++) arr.push(read(i * size));\n return arr.length === 1 ? { kind: 'number', value: arr[0] } : { kind: 'numbers', value: arr };\n}\n\n/**\n * Decode a payload best-effort by ABIF element type.\n *\n * Strings have trailing NULs stripped (cString/pString convention).\n * pString (type 18) is decoded as `length-prefix + chars`.\n */\nfunction decodePayload(elementType: number, elementCount: number, payload: Uint8Array): AbifDecodedValue {\n const view = asDataView(payload);\n switch (elementType) {\n case 1: {\n const arr = Array.from(payload.subarray(0, elementCount));\n return { kind: 'numbers', value: arr };\n }\n case 2:\n case 19: {\n const s = asciiString(payload.subarray(0, elementCount)).replace(/\\0+$/g, '');\n return { kind: 'string', value: s };\n }\n case 3:\n return decodeNumeric(payload.byteLength, elementCount, 2, o => view.getUint16(o, false));\n case 4:\n return decodeNumeric(payload.byteLength, elementCount, 2, o => view.getInt16(o, false));\n case 5:\n return decodeNumeric(payload.byteLength, elementCount, 4, o => view.getInt32(o, false));\n case 7:\n return decodeNumeric(payload.byteLength, elementCount, 4, o => view.getFloat32(o, false));\n case 8:\n return decodeNumeric(payload.byteLength, elementCount, 8, o => view.getFloat64(o, false));\n case 10: {\n // A date needs 4 bytes; a short/truncated payload falls back to raw bytes rather than throwing.\n if (payload.byteLength < 4) return { kind: 'unknown', value: payload };\n const year = view.getInt16(0, false);\n const month = view.getUint8(2);\n const day = view.getUint8(3);\n return { kind: 'date', value: { year, month, day } };\n }\n case 11: {\n // A time needs 4 bytes; short payload → raw bytes, not a RangeError.\n if (payload.byteLength < 4) return { kind: 'unknown', value: payload };\n return {\n kind: 'time',\n value: {\n hour: view.getUint8(0),\n minute: view.getUint8(1),\n second: view.getUint8(2),\n hsec: view.getUint8(3),\n },\n };\n }\n case 13: {\n const arr: boolean[] = [];\n for (let i = 0; i < Math.min(elementCount, payload.byteLength); i++) arr.push(view.getUint8(i) !== 0);\n return { kind: 'bools', value: arr };\n }\n case 18: {\n // pString = length prefix + chars; an empty payload is just the empty string.\n if (payload.byteLength < 1) return { kind: 'string', value: '' };\n const len = view.getUint8(0);\n const s = asciiString(subview(payload, 1, Math.min(len, Math.max(0, elementCount - 1))));\n return { kind: 'string', value: s };\n }\n default:\n return { kind: 'unknown', value: payload };\n }\n}\n\nfunction previewDecoded(d: AbifDecodedValue, elementType: number): string {\n switch (d.kind) {\n case 'number':\n return String(d.value);\n case 'numbers':\n return previewNumbers(d.value);\n case 'string':\n return truncate(JSON.stringify(d.value));\n case 'bools':\n return d.value.length === 1 ? String(d.value[0]) : `[${d.value.join(', ')}]`;\n case 'date': {\n const { year, month, day } = d.value;\n return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;\n }\n case 'time': {\n const { hour, minute, second } = d.value;\n return `${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`;\n }\n case 'bytes':\n return `${typeName(elementType)} ${previewBytes(d.value)}`;\n case 'unknown':\n return `${typeName(elementType)} ${previewBytes(d.value)}`;\n }\n}\n\n/**\n * Parse an ABIF file into a high-level view: metadata, channels, basecalls,\n * and decoded directory entries.\n *\n * This is the INTERPRETING layer — it makes convenience choices (FWO_ → \"GATC\"\n * fallback, derived samplingRate, preferred/upper-cased PBAS2 baseCalls). It is\n * not the raw structural truth: for that use {@link readAbif}, which reads the\n * directory verbatim (raw dataSize/offset/counts, tdir, inline bytes) and makes\n * no interpretation. `parseAbif` builds on top of it.\n *\n * Accepts ArrayBuffer or Uint8Array (Buffer in Node works too — it extends\n * Uint8Array). The `fileName` argument is informational only; it's preserved\n * in the result.\n */\nexport function parseAbif(input: ArrayBuffer | Uint8Array, fileName = ''): ParsedAbif {\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);\n const file = readAbif(bytes);\n\n const entries: AbifDirEntry[] = file.entries.map(e => {\n // PCON is declared char (type 2) but its bytes ARE Q-scores; decode it as numbers so the\n // diagnostic view keeps zeros the char decoder would strip (matches baseCalls.confidences).\n const decoded =\n e.tagName === 'PCON' && e.elementSize === 1\n ? decodePayload(1, e.elementCount, e.payload) // type 1 = byte → { kind: 'numbers' }\n : decodePayload(e.elementType, e.elementCount, e.payload);\n // Prefer the real on-disk directory fields (present when read from a file) over\n // reconciled/computed values, so the diagnostic view reflects the actual record.\n return {\n tag: e.tagName,\n tagNumber: e.tagNumber,\n elementType: e.elementType,\n elementTypeName: typeName(e.elementType),\n elementSize: e.elementSize,\n elementCount: e.elementCount,\n rawElementCount: e.raw?.elementCount ?? e.elementCount,\n dataSize: e.raw?.dataSize ?? e.elementCount * e.elementSize,\n dataOffset: e.raw?.dataOffset ?? -1,\n inline: e.raw?.inline ?? e.elementCount * e.elementSize <= 4,\n decoded,\n preview: previewDecoded(decoded, e.elementType),\n };\n });\n\n // FWO_ → base order. Fall back to GATC unless FWO_ is a real permutation of A/C/G/T\n // (a degenerate value like \"AAAA\" is regex-valid but would collapse channels).\n let baseOrder = getFwo(file);\n if (!isFwoPermutation(baseOrder)) baseOrder = 'GATC';\n\n const dataChannels: Record<number, number[]> = {};\n const data1To4: ChannelSignals = { A: [], C: [], G: [], T: [] };\n const data9To12: ChannelSignals = { A: [], C: [], G: [], T: [] };\n const metadata: AbifMetadata = { comments: [] };\n const pbas: Record<number, string> = {};\n const pcon: Record<number, number[]> = {};\n const ploc: Record<number, number[]> = {};\n\n const channelKey = (i: number): keyof ChannelSignals => baseOrder[i] as keyof ChannelSignals;\n\n for (let idx = 0; idx < file.entries.length; idx++) {\n const e = file.entries[idx];\n const decoded = entries[idx].decoded;\n\n if (e.tagName === 'DATA') {\n // Accept single-element channels too (decodePayload collapses length-1 to a scalar).\n const nums = asNumbers(decoded);\n if (nums) {\n dataChannels[e.tagNumber] = nums;\n if (e.tagNumber >= 1 && e.tagNumber <= 4) data1To4[channelKey(e.tagNumber - 1)] = nums;\n else if (e.tagNumber >= 9 && e.tagNumber <= 12) data9To12[channelKey(e.tagNumber - 9)] = nums;\n }\n } else if (e.tagName === 'PBAS' && decoded.kind === 'string') {\n pbas[e.tagNumber] = decoded.value;\n } else if (e.tagName === 'PCON') {\n // PCON Q-scores are 1 byte each (elementType=2/char). Read them straight from the payload —\n // a trailing zero is a valid score, but the char decoder strips trailing NULs and would drop it.\n const nums = e.elementSize === 1 ? Array.from(e.payload.subarray(0, e.elementCount)) : asNumbers(decoded);\n if (nums) pcon[e.tagNumber] = nums;\n } else if (e.tagName === 'PLOC') {\n // PLOC sample indices are always non-negative — reinterpret int16 as uint16.\n const nums = asNumbers(decoded);\n if (nums) ploc[e.tagNumber] = nums.map(v => (v < 0 ? v + 0x10000 : v));\n } else if (e.tagName === 'SPAC') {\n // ABIF spec defines SPAC as float (elementType=7). Some legacy files mislabel\n // it as long (type=5); both are 4 bytes and the payload is always a float.\n if (e.elementSize === 4 && e.payload.byteLength >= 4) {\n const v = asDataView(e.payload).getFloat32(0, false);\n if (Number.isFinite(v) && v > 0) metadata.samplingRate = v;\n } else if (decoded.kind === 'number') {\n metadata.samplingRate = decoded.value;\n }\n } else if (e.tagName === 'SMPL' && decoded.kind === 'string') {\n metadata.sampleName = decoded.value;\n } else if (e.tagName === 'LANE' && decoded.kind === 'number') {\n metadata.laneNumber = decoded.value;\n } else if (e.tagName === 'TUBE' && decoded.kind === 'string') {\n metadata.tube = decoded.value;\n } else if (e.tagName === 'MCHN' && decoded.kind === 'string') {\n metadata.machineName = decoded.value;\n } else if (e.tagName === 'MODL' && decoded.kind === 'string') {\n metadata.machineModel = decoded.value;\n } else if (e.tagName === 'RUND' && decoded.kind === 'date') {\n const d = decoded.value;\n metadata.runDate = `${d.year}-${String(d.month).padStart(2, '0')}-${String(d.day).padStart(2, '0')}`;\n } else if (e.tagName === 'RUNT' && decoded.kind === 'time') {\n const t = decoded.value;\n metadata.runTime = `${String(t.hour).padStart(2, '0')}:${String(t.minute).padStart(2, '0')}:${String(t.second).padStart(2, '0')}`;\n } else if (e.tagName === 'CMNT' && decoded.kind === 'string') {\n metadata.comments.push(decoded.value);\n } else if (e.tagName === 'RevC' && e.tagNumber === 1) {\n // RevC1 (int16): file's own flag for whether the sequence is already\n // reverse-complemented. Only tagNumber 1 is defined by the spec. Reported\n // as-is; we draw no conclusion from it.\n if (decoded.kind === 'number') metadata.reverseComplemented = decoded.value !== 0;\n else if (decoded.kind === 'numbers') metadata.reverseComplemented = decoded.value.some(v => v !== 0);\n }\n }\n\n // Every basecall version the file carries, exactly as stored — the source of\n // truth. Per-version PCON/PLOC are kept strictly (no cross-version borrowing):\n // a variant reports only what its own tag number holds.\n const baseCallVariants: AbifBaseCallVariant[] = Object.keys(pbas)\n .map(Number)\n .sort((a, b) => a - b)\n .map(\n (v): AbifBaseCallVariant => ({\n version: v,\n role: v === 1 ? 'edited' : v === 2 ? 'called' : 'unknown',\n // As stored: case is preserved (lower-case can encode masking/edits). The\n // uppercased convenience view lives on `baseCalls`, not here.\n sequence: pbas[v],\n confidences: pcon[v] ?? [],\n positions: ploc[v] ?? [],\n }),\n );\n\n // Basecalls: prefer PBAS2 (called) over PBAS1 (edited) — a spec-role choice. Test key\n // presence, not string truthiness, so an existing-but-empty PBAS2 is still honored.\n let baseCalls: AbifBaseCalls | undefined;\n const pbasVersion = 2 in pbas ? 2 : 1 in pbas ? 1 : Object.keys(pbas).map(Number)[0];\n if (pbasVersion !== undefined && pbas[pbasVersion] !== undefined) {\n // Don't .trim(): keep length aligned with PCON/PLOC (trailing nulls already stripped).\n const seq = pbas[pbasVersion].toUpperCase();\n // Fall back to whichever PCON has a length matching the chosen PBAS — some\n // files ship PCON only under one tagNumber even when PBAS exists under both.\n // Fall back to whichever version's PCON/PLOC matches the chosen PBAS length — triggered when the\n // preferred version's array is missing OR present-but-length-mismatched. Expose none rather than a\n // broken array when nothing matches, so baseCalls stays self-consistent (baseCallVariants stays strict).\n let confidences = pcon[pbasVersion] ?? [];\n if (confidences.length !== seq.length) {\n confidences =\n Object.keys(pcon)\n .map(Number)\n .map(v => pcon[v])\n .find(c => c.length === seq.length) ?? [];\n }\n let positions = ploc[pbasVersion] ?? [];\n if (positions.length !== seq.length) {\n positions =\n Object.keys(ploc)\n .map(Number)\n .map(v => ploc[v])\n .find(pp => pp.length === seq.length) ?? [];\n }\n baseCalls = { sequence: seq, confidences, positions, pbasVersion };\n }\n\n // SPAC fallback: derive from PLOC positions or DATA9 length when missing.\n if (!Number.isFinite(metadata.samplingRate) || (metadata.samplingRate ?? 0) <= 0) {\n const pos = baseCalls?.positions;\n const data9Len = Math.max(data9To12.A.length, data9To12.C.length, data9To12.G.length, data9To12.T.length);\n if (pos && pos.length > 1) {\n metadata.samplingRate = (pos[pos.length - 1] - pos[0]) / (pos.length - 1);\n } else if (baseCalls && baseCalls.sequence.length > 0 && data9Len > 0) {\n metadata.samplingRate = data9Len / baseCalls.sequence.length;\n }\n }\n\n const chromatogram: AbifChromatogramBundle = { baseOrder, dataChannels, data1To4, data9To12 };\n\n return {\n fileName,\n fileSize: bytes.byteLength,\n abifVersion: file.version,\n macBinaryOffset: file.macBinaryOffset,\n dirEntryCount: file.entries.length,\n metadata,\n chromatogram,\n baseCalls,\n baseCallVariants,\n entries,\n };\n}\n\n/** True when any channel has at least one signal value. */\nexport function hasSignals(s: ChannelSignals): boolean {\n return s.A.length > 0 || s.C.length > 0 || s.G.length > 0 || s.T.length > 0;\n}\n\n/** Length of the longest channel in a ChannelSignals bundle. */\nexport function channelMaxLength(s: ChannelSignals): number {\n return Math.max(s.A.length, s.C.length, s.G.length, s.T.length);\n}\n\n// Quiet unused-import for the AbifEntry type if it isn't reachable elsewhere.\nexport type { AbifEntry };\n","/**\n * Mutation helpers for AbifFile: write PBAS/PCON/PLOC/SPAC and ensure DATA9..12\n * are present. Used by basecallers to author ABIF output.\n */\n\nimport { findEntry, upsertEntry } from './abif-format';\nimport { asciiBytes, asDataView } from './bytes';\nimport { AbifFile } from './types';\nimport { hasData9To12Block } from './view';\n\n/** Set PBAS2 (replaces if present). */\nexport function setSequence(file: AbifFile, sequence: string): void {\n upsertEntry(file, 'PBAS', 2, asciiBytes(sequence), {\n elementType: 2, // char\n elementSize: 1,\n elementCount: sequence.length,\n });\n}\n\n/** Set PCON2 (replaces if present). Values clamped to [0, 255]. */\nexport function setConfidences(file: AbifFile, q: ArrayLike<number>): void {\n const buf = new Uint8Array(q.length);\n for (let i = 0; i < q.length; i++) {\n buf[i] = Math.max(0, Math.min(255, Math.round(q[i])));\n }\n upsertEntry(file, 'PCON', 2, buf, {\n elementType: 2,\n elementSize: 1,\n elementCount: q.length,\n });\n}\n\n/**\n * Set PLOC2 (replaces if present).\n *\n * Written as UNSIGNED int16 so positions up to 65535 are preserved on disk\n * (signed int16 would wrap on traces with > 32k scans).\n */\nexport function setPositions(file: AbifFile, positions: ArrayLike<number>): void {\n const buf = new Uint8Array(positions.length * 2);\n const view = asDataView(buf);\n for (let i = 0; i < positions.length; i++) {\n view.setUint16(i * 2, Math.max(0, Math.min(0xffff, positions[i])), false);\n }\n upsertEntry(file, 'PLOC', 2, buf, {\n elementType: 4,\n elementSize: 2,\n elementCount: positions.length,\n });\n}\n\n/**\n * Set SPAC/1, SPAC/2, SPAC/3 — the standard ABIF \"average peak spacing\" trio\n * that KB-basecaller writes and downstream tools (BioPython, Sequencher,\n * KB-aware viewers) expect:\n *\n * - SPAC/1 (float32) — average peak spacing used in last analysis.\n * - SPAC/2 (pString) — basecaller name / identifier.\n * - SPAC/3 (float32) — average peak spacing computed by the basecaller.\n *\n * Both float fields are written with the same value.\n */\nexport function setAveragePeakSpacing(file: AbifFile, spacing: number, basecallerName: string): void {\n const f1 = new Uint8Array(4);\n asDataView(f1).setFloat32(0, spacing, false);\n upsertEntry(file, 'SPAC', 1, f1, { elementType: 7, elementSize: 4, elementCount: 1 });\n\n const nameBytes = asciiBytes(basecallerName);\n const len = Math.min(255, nameBytes.length);\n const p = new Uint8Array(1 + len);\n p[0] = len;\n p.set(nameBytes.subarray(0, len), 1);\n upsertEntry(file, 'SPAC', 2, p, { elementType: 18, elementSize: 1, elementCount: 1 + len });\n\n const f3 = new Uint8Array(4);\n asDataView(f3).setFloat32(0, spacing, false);\n upsertEntry(file, 'SPAC', 3, f3, { elementType: 7, elementSize: 4, elementCount: 1 });\n}\n\n/**\n * Mean consecutive peak-to-peak distance in scans, from a positions array.\n * Returns 0 when fewer than 2 positions are present.\n */\nexport function averagePeakSpacing(positions: ArrayLike<number>): number {\n if (positions.length < 2) return 0;\n return (positions[positions.length - 1] - positions[0]) / (positions.length - 1);\n}\n\n/**\n * Ensure DATA9..12 are present in the file. Many downstream consumers\n * (BioPython-style readers, viewers) read the chromatogram signal from\n * DATA9..12 by convention — these tags are the raw fluorescence on newer\n * instruments. Older files that only carry DATA1..8 break those consumers\n * with a \"no signal\" error after re-basecalling.\n *\n * We populate DATA9..12 by copying DATA1..4 (which on DATA1..8-only files IS\n * the raw signal). The DATA1..4 tags are left untouched so any tool that\n * reads them keeps working.\n *\n * No-op when DATA9..12 already exist.\n */\nexport function ensureRawDataChannels(file: AbifFile): void {\n if (hasData9To12Block(file)) return;\n for (let i = 1; i <= 4; i++) {\n const src = findEntry(file, 'DATA', i);\n if (!src) continue;\n const target = 8 + i;\n if (findEntry(file, 'DATA', target)) continue;\n file.entries.push({\n tagName: 'DATA',\n tagNumber: target,\n elementType: src.elementType,\n elementSize: src.elementSize,\n elementCount: src.elementCount,\n payload: new Uint8Array(src.payload),\n dataHandle: 0,\n });\n }\n}\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, AbifChromatogramBundle, AbifDataChannelRole, AbifDecodedValue, AbifDirEntry, AbifDirectory, AbifEntry, AbifEntryRaw, AbifFile, AbifMetadata, ChannelSignals, Chromatogram, ENTRY_SIZE, HEADER_SIZE, ParsedAbif, averagePeakSpacing, channelMaxLength, dataChannelRole, ensureRawDataChannels, findEntries, findEntry, getChannelMap, getConfidences, getDataChannel, getFwo, getPositions, getReverseComplemented, getSamplingRate, getSequence, hasData9To12Block, hasSignals, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.mjs';
|
|
1
|
+
export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, AbifChromatogramBundle, AbifDataChannelRole, AbifDecodedValue, AbifDirEntry, AbifDirectory, AbifEntry, AbifEntryRaw, AbifFile, AbifMetadata, ChannelSignals, Chromatogram, CropAbifOptions, CropAbifRange, ENTRY_SIZE, HEADER_SIZE, ParsedAbif, averagePeakSpacing, channelMaxLength, cropAbif, dataChannelRole, ensureRawDataChannels, findEntries, findEntry, getChannelMap, getConfidences, getConfidencesForVersion, getDataChannel, getFwo, getPositions, getPositionsForVersion, getReverseComplemented, getSamplingRate, getSequence, getSequenceForVersion, hasData9To12Block, hasSignals, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* FASTA / FASTQ / .qual text serialization.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, AbifChromatogramBundle, AbifDataChannelRole, AbifDecodedValue, AbifDirEntry, AbifDirectory, AbifEntry, AbifEntryRaw, AbifFile, AbifMetadata, ChannelSignals, Chromatogram, ENTRY_SIZE, HEADER_SIZE, ParsedAbif, averagePeakSpacing, channelMaxLength, dataChannelRole, ensureRawDataChannels, findEntries, findEntry, getChannelMap, getConfidences, getDataChannel, getFwo, getPositions, getReverseComplemented, getSamplingRate, getSequence, hasData9To12Block, hasSignals, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.js';
|
|
1
|
+
export { AbifBaseCallRole, AbifBaseCallVariant, AbifBaseCalls, AbifByteRange, AbifChromatogramBundle, AbifDataChannelRole, AbifDecodedValue, AbifDirEntry, AbifDirectory, AbifEntry, AbifEntryRaw, AbifFile, AbifMetadata, ChannelSignals, Chromatogram, CropAbifOptions, CropAbifRange, ENTRY_SIZE, HEADER_SIZE, ParsedAbif, averagePeakSpacing, channelMaxLength, cropAbif, dataChannelRole, ensureRawDataChannels, findEntries, findEntry, getChannelMap, getConfidences, getConfidencesForVersion, getDataChannel, getFwo, getPositions, getPositionsForVersion, getReverseComplemented, getSamplingRate, getSequence, getSequenceForVersion, hasData9To12Block, hasSignals, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* FASTA / FASTQ / .qual text serialization.
|
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
'use strict';function T(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function F(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function N(e,t,n){return e.subarray(t,t+n)}function q(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var v=128,x=28;function P(e){if(e.byteLength<v)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(T(N(e,0,4))!=="ABIF")if(e.byteLength>=132&&T(N(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<v)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),a=r.getInt16(n+4,false),i=B(e,r,n+6,n);if(i.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${i.tagName}"`);if(i.elementSize!==x)throw new Error(`Expected dir element size ${x}, got ${i.elementSize}`);let c=i.raw?.elementCount??i.elementCount,u=Math.max(0,c),d=r.getInt32(n+6+20,false);if(d<0||d+u*x>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${d}, entries=${u}, file=${e.byteLength-n}`);let s=[];for(let E=0;E<u;E++)s.push(B(e,r,n+d+E*x,n));let g=i.raw?.dataSize??u*x,S=n+d+u*x,b=Math.min(Math.max(0,g-u*x),Math.max(0,e.byteLength-S)),h={entryCount:u,rawEntryCount:c,elementType:i.elementType,tagNumber:i.tagNumber,entrySize:i.elementSize,dataSize:g,dataOffset:d,dataOffsetBytes:i.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:i.dataHandle,paddingBytes:new Uint8Array(N(e,S,b))},y=new Uint8Array(N(e,n+6+x,v-6-x)),A=t===128?new Uint8Array(N(e,0,128)):void 0,C=G(e,n,d,g,s,t);return {version:a,tdir:h,entries:s,macBinaryOffset:t,macBinaryHeader:A,headerReserved:y,unreferencedRanges:C}}function G(e,t,n,r,a,i){let c=e.byteLength,u=[];i===128&&u.push([0,128]),u.push([t,t+v]);let d=Math.max(a.length*x,Math.max(0,r));u.push([t+n,t+n+d]);for(let h of a)if(h.raw&&!h.raw.inline){let y=t+h.raw.dataOffset;u.push([y,y+h.payload.byteLength]);}let s=u.map(([h,y])=>[Math.max(0,Math.min(h,c)),Math.max(0,Math.min(y,c))]).filter(([h,y])=>y>h).sort((h,y)=>h[0]-y[0]),g=[];for(let[h,y]of s){let A=g[g.length-1];A&&h<=A[1]?A[1]=Math.max(A[1],y):g.push([h,y]);}let S=[],b=0;for(let[h,y]of g)h>b&&S.push({offset:b,bytes:new Uint8Array(N(e,b,h-b))}),b=Math.max(b,y);return b<c&&S.push({offset:b,bytes:new Uint8Array(N(e,b,c-b))}),S}function B(e,t,n,r){let a=T(N(e,n,4)),i=t.getInt32(n+4,false),c=t.getInt16(n+8,false),u=t.getInt16(n+10,false),d=t.getInt32(n+12,false),s=t.getInt32(n+16,false),g=t.getInt32(n+24,false),S=Math.max(0,d*Math.max(0,u)),b=s>=0?s:S,h=s>=0?s<=4:S<=4,y=Math.max(0,u>0?Math.min(d,Math.floor(b/u)):Math.min(d,b)),A,C;if(h)C=-1,A=new Uint8Array(N(e,n+20,Math.min(4,b)));else {C=t.getInt32(n+20,false);let o=r+C;if(C<0||o+b>e.byteLength)throw new Error(`Entry ${a}${i}: payload out of bounds (offset=${C}, size=${b})`);A=new Uint8Array(N(e,o,b));}let E=new Uint8Array(N(e,n+20,4));return {tagName:a,tagNumber:i,elementType:c,elementSize:u,elementCount:y,payload:A,dataHandle:g,raw:{elementCount:d,dataSize:s,dataOffset:C,inline:h,dataOffsetBytes:E}}}function re(e){let t=e.entries.length,n=v,r=t*x,a=n+r,i=new Array(t);for(let s=0;s<t;s++){let g=e.entries[s].payload.byteLength;g>4?(i[s]=a,a+=g):i[s]=-1;}let c=a,u=new Uint8Array(c),d=w(u);u.set(F("ABIF"),0),d.setInt16(4,e.version,false),O({tagName:"tdir",tagNumber:1,elementType:1023,elementSize:x,elementCount:t,payload:new Uint8Array(0),dataHandle:0},u,d,6,-1,r,n);for(let s=0;s<t;s++){let g=e.entries[s];O(g,u,d,n+s*x,i[s]);}for(let s=0;s<t;s++){let g=i[s];g>=0&&u.set(e.entries[s].payload,g);}return u}function O(e,t,n,r,a,i,c){if(e.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${e.tagName}"`);t.set(F(e.tagName),r),n.setInt32(r+4,e.tagNumber,false),n.setInt16(r+8,e.elementType,false),n.setInt16(r+10,e.elementSize,false),n.setInt32(r+12,e.elementCount,false);let u=i??e.payload.byteLength;if(n.setInt32(r+16,u,false),c!==void 0)n.setInt32(r+20,c,false);else if(u<=4)t.fill(0,r+20,r+24),t.set(e.payload.subarray(0,u),r+20);else {if(a<0)throw new Error(`External payload requires offset for ${e.tagName}${e.tagNumber}`);n.setInt32(r+20,a,false);}n.setInt32(r+24,e.dataHandle,false);}function p(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function ae(e,t){return e.entries.filter(n=>n.tagName===t)}function $(e,t,n,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let i=p(e,t,n);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r):e.entries.push({tagName:t,tagNumber:n,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function le(e,t){let n=p(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),a=w(n.payload);for(let i=0;i<n.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function D(e){let t=p(e,"FWO_",1);return t?T(t.payload.subarray(0,t.elementCount)):"GATC"}function z(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function H(e){return !!(p(e,"DATA",9)&&p(e,"DATA",10)&&p(e,"DATA",11)&&p(e,"DATA",12))}function ue(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function me(e){let t=p(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function fe(e){let t=D(e);if(!z(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function ce(e){let t=a=>T(a.payload.subarray(0,a.elementCount)).replace(/\0+$/g,""),n=p(e,"PBAS",2);if(n)return t(n);let r=p(e,"PBAS",1);if(r)return t(r)}function ge(e){let t=p(e,"PCON",2)??p(e,"PCON",1);if(!t)return;let n=new Array(t.elementCount);for(let r=0;r<t.elementCount;r++)n[r]=t.payload[r];return n}function de(e){let t=p(e,"PLOC",2)??p(e,"PLOC",1);if(!t)return;if(t.elementSize!==2)throw new Error(`PLOC: expected elementSize=2, got ${t.elementSize}`);let n=w(t.payload),r=new Array(t.elementCount);for(let a=0;a<t.elementCount;a++)r[a]=n.getUint16(a*2,false);return r}function be(e){let t=p(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function Se(e,t){$(e,"PBAS",2,F(t),{elementType:2,elementSize:1,elementCount:t.length});}function Ce(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));$(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function we(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let a=0;a<t.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,t[a])),false);$(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function Ne(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),$(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=F(n),i=Math.min(255,a.length),c=new Uint8Array(1+i);c[0]=i,c.set(a.subarray(0,i),1),$(e,"SPAC",2,c,{elementType:18,elementSize:1,elementCount:1+i});let u=new Uint8Array(4);w(u).setFloat32(0,t,false),$(e,"SPAC",3,u,{elementType:7,elementSize:4,elementCount:1});}function xe(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function Te(e){if(!H(e))for(let t=1;t<=4;t++){let n=p(e,"DATA",t);if(!n)continue;let r=8+t;p(e,"DATA",r)||e.entries.push({tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}var W={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function M(e){return W[e]??(e>=1024?`user${e}`:`type${e}`)}function Q(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function X(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function _(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function R(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function U(e,t,n,r){let a=Math.max(0,Math.min(t,Math.floor(e/n))),i=[];for(let c=0;c<a;c++)i.push(r(c*n));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function V(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:T(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return U(n.byteLength,t,2,a=>r.getUint16(a,false));case 4:return U(n.byteLength,t,2,a=>r.getInt16(a,false));case 5:return U(n.byteLength,t,4,a=>r.getInt32(a,false));case 7:return U(n.byteLength,t,4,a=>r.getFloat32(a,false));case 8:return U(n.byteLength,t,8,a=>r.getFloat64(a,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let a=r.getInt16(0,false),i=r.getUint8(2),c=r.getUint8(3);return {kind:"date",value:{year:a,month:i,day:c}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let a=[];for(let i=0;i<Math.min(t,n.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:T(N(n,1,Math.min(a,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Y(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Q(e.value);case "string":return X(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:a}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:a}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${M(t)} ${_(e.value)}`;case "unknown":return `${M(t)} ${_(e.value)}`}}function Ue(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=P(n),a=r.entries.map(o=>{let l=o.tagName==="PCON"&&o.elementSize===1?V(1,o.elementCount,o.payload):V(o.elementType,o.elementCount,o.payload);return {tag:o.tagName,tagNumber:o.tagNumber,elementType:o.elementType,elementTypeName:M(o.elementType),elementSize:o.elementSize,elementCount:o.elementCount,rawElementCount:o.raw?.elementCount??o.elementCount,dataSize:o.raw?.dataSize??o.elementCount*o.elementSize,dataOffset:o.raw?.dataOffset??-1,inline:o.raw?.inline??o.elementCount*o.elementSize<=4,decoded:l,preview:Y(l,o.elementType)}}),i=D(r);z(i)||(i="GATC");let c={},u={A:[],C:[],G:[],T:[]},d={A:[],C:[],G:[],T:[]},s={comments:[]},g={},S={},b={},h=o=>i[o];for(let o=0;o<r.entries.length;o++){let l=r.entries[o],f=a[o].decoded;if(l.tagName==="DATA"){let m=R(f);m&&(c[l.tagNumber]=m,l.tagNumber>=1&&l.tagNumber<=4?u[h(l.tagNumber-1)]=m:l.tagNumber>=9&&l.tagNumber<=12&&(d[h(l.tagNumber-9)]=m));}else if(l.tagName==="PBAS"&&f.kind==="string")g[l.tagNumber]=f.value;else if(l.tagName==="PCON"){let m=l.elementSize===1?Array.from(l.payload.subarray(0,l.elementCount)):R(f);m&&(S[l.tagNumber]=m);}else if(l.tagName==="PLOC"){let m=R(f);m&&(b[l.tagNumber]=m.map(L=>L<0?L+65536:L));}else if(l.tagName==="SPAC")if(l.elementSize===4&&l.payload.byteLength>=4){let m=w(l.payload).getFloat32(0,false);Number.isFinite(m)&&m>0&&(s.samplingRate=m);}else f.kind==="number"&&(s.samplingRate=f.value);else if(l.tagName==="SMPL"&&f.kind==="string")s.sampleName=f.value;else if(l.tagName==="LANE"&&f.kind==="number")s.laneNumber=f.value;else if(l.tagName==="TUBE"&&f.kind==="string")s.tube=f.value;else if(l.tagName==="MCHN"&&f.kind==="string")s.machineName=f.value;else if(l.tagName==="MODL"&&f.kind==="string")s.machineModel=f.value;else if(l.tagName==="RUND"&&f.kind==="date"){let m=f.value;s.runDate=`${m.year}-${String(m.month).padStart(2,"0")}-${String(m.day).padStart(2,"0")}`;}else if(l.tagName==="RUNT"&&f.kind==="time"){let m=f.value;s.runTime=`${String(m.hour).padStart(2,"0")}:${String(m.minute).padStart(2,"0")}:${String(m.second).padStart(2,"0")}`;}else l.tagName==="CMNT"&&f.kind==="string"?s.comments.push(f.value):l.tagName==="RevC"&&l.tagNumber===1&&(f.kind==="number"?s.reverseComplemented=f.value!==0:f.kind==="numbers"&&(s.reverseComplemented=f.value.some(m=>m!==0)));}let y=Object.keys(g).map(Number).sort((o,l)=>o-l).map(o=>({version:o,role:o===1?"edited":o===2?"called":"unknown",sequence:g[o],confidences:S[o]??[],positions:b[o]??[]})),A,C=2 in g?2:1 in g?1:Object.keys(g).map(Number)[0];if(C!==void 0&&g[C]!==void 0){let o=g[C].toUpperCase(),l=S[C]??[];l.length!==o.length&&(l=Object.keys(S).map(Number).map(m=>S[m]).find(m=>m.length===o.length)??[]);let f=b[C]??[];f.length!==o.length&&(f=Object.keys(b).map(Number).map(m=>b[m]).find(m=>m.length===o.length)??[]),A={sequence:o,confidences:l,positions:f,pbasVersion:C};}if(!Number.isFinite(s.samplingRate)||(s.samplingRate??0)<=0){let o=A?.positions,l=Math.max(d.A.length,d.C.length,d.G.length,d.T.length);o&&o.length>1?s.samplingRate=(o[o.length-1]-o[0])/(o.length-1):A&&A.sequence.length>0&&l>0&&(s.samplingRate=l/A.sequence.length);}let E={baseOrder:i,dataChannels:c,data1To4:u,data9To12:d};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:s,chromatogram:E,baseCalls:A,baseCallVariants:y,entries:a}}function Le(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function De(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}var Re=93;function Me(e,t){let n=t?.lineWidth??60;return I(e).map(r=>`${k(">",r.id,r.description)}
|
|
2
|
-
${
|
|
3
|
-
${
|
|
1
|
+
'use strict';function E(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function F(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function w(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function x(e,t,n){return e.subarray(t,t+n)}function X(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var z=128,N=28;function j(e){if(e.byteLength<z)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(E(x(e,0,4))!=="ABIF")if(e.byteLength>=132&&E(x(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<z)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),a=r.getInt16(n+4,false),i=_(e,r,n+6,n);if(i.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${i.tagName}"`);if(i.elementSize!==N)throw new Error(`Expected dir element size ${N}, got ${i.elementSize}`);let c=i.raw?.elementCount??i.elementCount,m=Math.max(0,c),u=r.getInt32(n+6+20,false);if(u<0||u+m*N>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${u}, entries=${m}, file=${e.byteLength-n}`);let d=[];for(let T=0;T<m;T++)d.push(_(e,r,n+u+T*N,n));let y=i.raw?.dataSize??m*N,f=n+u+m*N,h=Math.min(Math.max(0,y-m*N),Math.max(0,e.byteLength-f)),o={entryCount:m,rawEntryCount:c,elementType:i.elementType,tagNumber:i.tagNumber,entrySize:i.elementSize,dataSize:y,dataOffset:u,dataOffsetBytes:i.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:i.dataHandle,paddingBytes:new Uint8Array(x(e,f,h))},g=new Uint8Array(x(e,n+6+N,z-6-N)),A=t===128?new Uint8Array(x(e,0,128)):void 0,C=Y(e,n,u,y,d,t);return {version:a,tdir:o,entries:d,macBinaryOffset:t,macBinaryHeader:A,headerReserved:g,unreferencedRanges:C}}function Y(e,t,n,r,a,i){let c=e.byteLength,m=[];i===128&&m.push([0,128]),m.push([t,t+z]);let u=Math.max(a.length*N,Math.max(0,r));m.push([t+n,t+n+u]);for(let o of a)if(o.raw&&!o.raw.inline){let g=t+o.raw.dataOffset;m.push([g,g+o.payload.byteLength]);}let d=m.map(([o,g])=>[Math.max(0,Math.min(o,c)),Math.max(0,Math.min(g,c))]).filter(([o,g])=>g>o).sort((o,g)=>o[0]-g[0]),y=[];for(let[o,g]of d){let A=y[y.length-1];A&&o<=A[1]?A[1]=Math.max(A[1],g):y.push([o,g]);}let f=[],h=0;for(let[o,g]of y)o>h&&f.push({offset:h,bytes:new Uint8Array(x(e,h,o-h))}),h=Math.max(h,g);return h<c&&f.push({offset:h,bytes:new Uint8Array(x(e,h,c-h))}),f}function _(e,t,n,r){let a=E(x(e,n,4)),i=t.getInt32(n+4,false),c=t.getInt16(n+8,false),m=t.getInt16(n+10,false),u=t.getInt32(n+12,false),d=t.getInt32(n+16,false),y=t.getInt32(n+24,false),f=Math.max(0,u*Math.max(0,m)),h=d>=0?d:f,o=d>=0?d<=4:f<=4,g=Math.max(0,m>0?Math.min(u,Math.floor(h/m)):Math.min(u,h)),A,C;if(o)C=-1,A=new Uint8Array(x(e,n+20,Math.min(4,h)));else {C=t.getInt32(n+20,false);let s=r+C;if(C<0||s+h>e.byteLength)throw new Error(`Entry ${a}${i}: payload out of bounds (offset=${C}, size=${h})`);A=new Uint8Array(x(e,s,h));}let T=new Uint8Array(x(e,n+20,4));return {tagName:a,tagNumber:i,elementType:c,elementSize:m,elementCount:g,payload:A,dataHandle:y,raw:{elementCount:u,dataSize:d,dataOffset:C,inline:o,dataOffsetBytes:T}}}function fe(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,a=e.entries.map(o=>o.raw&&o.payload.byteLength===o.raw.dataSize?o.raw:void 0),i=z;i=Math.max(i,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*N));for(let o of a)o&&!o.inline&&(i=Math.max(i,o.dataOffset+o.dataSize));for(let o of e.unreferencedRanges)i=Math.max(i,o.offset-t+o.bytes.length);let c=n>r,m=i,u=c?m:e.tdir.dataOffset,d=n===r?e.tdir.dataSize:n*N;c&&(m+=d);let y=new Array(n);for(let o=0;o<n;o++){let g=e.entries[o].payload.byteLength;if(a[o]||g<=4){y[o]=-1;continue}y[o]=m,m+=g;}let f=new Uint8Array(m),h=w(f);f.set(F("ABIF"),0),h.setInt16(4,e.version,false),f.set(e.headerReserved,6+N),q(f,h,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:d,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:u}}),n===r&&e.tdir.paddingBytes.length>0&&f.set(e.tdir.paddingBytes,u+n*N);for(let o=0;o<n;o++){let g=e.entries[o],A=a[o],C=u+o*N,T=g.payload.byteLength;q(f,h,C,{tagName:g.tagName,tagNumber:g.tagNumber,elementType:g.elementType,elementSize:g.elementSize,elementCount:A?A.elementCount:g.elementCount,dataSize:A?A.dataSize:T,dataHandle:g.dataHandle,offsetSlot:T<=4?{kind:"inline",payload:g.payload,dataSize:T,staleTail:A?.dataOffsetBytes}:{kind:"external",value:A?A.dataOffset:y[o]}}),T>4&&f.set(g.payload,A?A.dataOffset:y[o]);}for(let o of e.unreferencedRanges)f.set(o.bytes,o.offset-t);return f}function q(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(F(r.tagName),n),t.setInt32(n+4,r.tagNumber,false),t.setInt16(n+8,r.elementType,false),t.setInt16(n+10,r.elementSize,false),t.setInt32(n+12,r.elementCount,false),t.setInt32(n+16,r.dataSize,false),r.offsetSlot.kind==="external")t.setInt32(n+20,r.offsetSlot.value,false);else {let{payload:a,dataSize:i,staleTail:c}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(a.subarray(0,i),n+20),c&&i<4&&e.set(c.subarray(i,4),n+20+i);}t.setInt32(n+24,r.dataHandle,false);}function S(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function ce(e,t){return e.entries.filter(n=>n.tagName===t)}function $(e,t,n,r,a){if(r.byteLength!==a.elementCount*a.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let i=S(e,t,n);i?(i.elementType=a.elementType,i.elementSize=a.elementSize,i.elementCount=a.elementCount,i.payload=r,i.raw=void 0):e.entries.push({tagName:t,tagNumber:n,elementType:a.elementType,elementSize:a.elementSize,elementCount:a.elementCount,payload:r,dataHandle:0});}function he(e,t){let n=S(e,"DATA",t);if(!n)return;if(n.elementSize!==2)throw new Error(`DATA${t}: expected elementSize=2, got ${n.elementSize}`);let r=new Int16Array(n.elementCount),a=w(n.payload);for(let i=0;i<n.elementCount;i++)r[i]=a.getInt16(i*2,false);return r}function M(e){let t=S(e,"FWO_",1);return t?E(t.payload.subarray(0,t.elementCount)):"GATC"}function B(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function L(e){return !!(S(e,"DATA",9)&&S(e,"DATA",10)&&S(e,"DATA",11)&&S(e,"DATA",12))}function pe(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function ye(e){let t=S(e,"RevC",1);if(!t)return;let n=w(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function Ae(e){let t=M(e);if(!B(t))throw new Error(`FWO_ is not a permutation of A/C/G/T: "${t}"`);return {[t[0]]:1,[t[1]]:2,[t[2]]:3,[t[3]]:4}}function Se(e){return U(e,2)??U(e,1)}function U(e,t){let n=S(e,"PBAS",t);if(n)return E(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function Ce(e){return R(e,2)??R(e,1)}function R(e,t){let n=S(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let a=0;a<n.elementCount;a++)r[a]=n.payload[a];return r}function we(e){return v(e,2)??v(e,1)}function v(e,t){let n=S(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=w(n.payload),a=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)a[i]=r.getUint16(i*2,false);return a}function Ne(e){let t=S(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=w(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function $e(e,t,n={}){let{start:r,end:a}=t;if(!Number.isInteger(r)||!Number.isInteger(a)||r<0||a<=r)throw new Error(`cropAbif: invalid range [${r}, ${a})`);if(!L(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let i=Math.min(O(e,9),O(e,10),O(e,11),O(e,12));if(a>i)throw new Error(`cropAbif: range end ${a} exceeds the processed trace length ${i}`);let c=n.rawTrace??"omit",m=[];for(let u of e.entries)u.tagName==="DATA"&&u.tagNumber>=9&&u.tagNumber<=12?m.push(Z(u,r,a)):u.tagName==="DATA"&&u.tagNumber>=1&&u.tagNumber<=8?c==="full"&&m.push({...u}):u.tagName==="PBAS"||u.tagName==="PCON"||u.tagName==="PLOC"||m.push({...u});for(let u of J(e))m.push(...K(e,u,r,a));return {version:e.version,tdir:e.tdir,entries:m,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function O(e,t){return S(e,"DATA",t)?.elementCount??0}function Z(e,t,n){if(e.elementSize!==2)throw new Error(`cropAbif: DATA${e.tagNumber} expected elementSize=2, got ${e.elementSize}`);let r=new Uint8Array(e.payload.subarray(t*2,n*2));return {tagName:"DATA",tagNumber:e.tagNumber,elementType:e.elementType,elementSize:2,elementCount:n-t,payload:r,dataHandle:e.dataHandle}}function J(e){let t=new Set;for(let n of e.entries)n.tagName==="PBAS"&&t.add(n.tagNumber);return Array.from(t).sort((n,r)=>n-r)}function K(e,t,n,r){let a=U(e,t);if(a===void 0)return [];let i=v(e,t);if(i===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(i.length!==a.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${a.length} vs ${i.length})`);let c=R(e,t);if(c!==void 0&&c.length!==a.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let m=[];for(let f=0;f<i.length;f++)i[f]>=n&&i[f]<r&&m.push(f);let u=m.map(f=>a[f]).join(""),d=m.map(f=>i[f]-n),y=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:u.length,payload:F(u),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:d.length,payload:ee(d),dataHandle:0}];if(c!==void 0){let f=m.map(h=>c[h]);y.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:f.length,payload:Uint8Array.from(f),dataHandle:0});}return y}function ee(e){let t=new Uint8Array(e.length*2),n=w(t);for(let r=0;r<e.length;r++)n.setUint16(r*2,Math.max(0,Math.min(65535,e[r])),false);return t}var te={1:"byte",2:"char",3:"word",4:"short",5:"long",7:"float",8:"double",10:"date",11:"time",12:"thumb",13:"bool",18:"pString",19:"cString",1023:"tdir"};function I(e){return te[e]??(e>=1024?`user${e}`:`type${e}`)}function ne(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function re(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function G(e){let t=e.subarray(0,16),n=Array.from(t,r=>r.toString(16).padStart(2,"0")).join(" ");return `${e.byteLength}B [${n}${e.byteLength>16?" \u2026":""}]`}function P(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function D(e,t,n,r){let a=Math.max(0,Math.min(t,Math.floor(e/n))),i=[];for(let c=0;c<a;c++)i.push(r(c*n));return i.length===1?{kind:"number",value:i[0]}:{kind:"numbers",value:i}}function W(e,t,n){let r=w(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:E(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return D(n.byteLength,t,2,a=>r.getUint16(a,false));case 4:return D(n.byteLength,t,2,a=>r.getInt16(a,false));case 5:return D(n.byteLength,t,4,a=>r.getInt32(a,false));case 7:return D(n.byteLength,t,4,a=>r.getFloat32(a,false));case 8:return D(n.byteLength,t,8,a=>r.getFloat64(a,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let a=r.getInt16(0,false),i=r.getUint8(2),c=r.getUint8(3);return {kind:"date",value:{year:a,month:i,day:c}}}case 11:return n.byteLength<4?{kind:"unknown",value:n}:{kind:"time",value:{hour:r.getUint8(0),minute:r.getUint8(1),second:r.getUint8(2),hsec:r.getUint8(3)}};case 13:{let a=[];for(let i=0;i<Math.min(t,n.byteLength);i++)a.push(r.getUint8(i)!==0);return {kind:"bools",value:a}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let a=r.getUint8(0);return {kind:"string",value:E(x(n,1,Math.min(a,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function ae(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return ne(e.value);case "string":return re(JSON.stringify(e.value));case "bools":return e.value.length===1?String(e.value[0]):`[${e.value.join(", ")}]`;case "date":{let{year:n,month:r,day:a}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(a).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:a}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(a).padStart(2,"0")}`}case "bytes":return `${I(t)} ${G(e.value)}`;case "unknown":return `${I(t)} ${G(e.value)}`}}function ve(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=j(n),a=r.entries.map(s=>{let l=s.tagName==="PCON"&&s.elementSize===1?W(1,s.elementCount,s.payload):W(s.elementType,s.elementCount,s.payload);return {tag:s.tagName,tagNumber:s.tagNumber,elementType:s.elementType,elementTypeName:I(s.elementType),elementSize:s.elementSize,elementCount:s.elementCount,rawElementCount:s.raw?.elementCount??s.elementCount,dataSize:s.raw?.dataSize??s.elementCount*s.elementSize,dataOffset:s.raw?.dataOffset??-1,inline:s.raw?.inline??s.elementCount*s.elementSize<=4,decoded:l,preview:ae(l,s.elementType)}}),i=M(r);B(i)||(i="GATC");let c={},m={A:[],C:[],G:[],T:[]},u={A:[],C:[],G:[],T:[]},d={comments:[]},y={},f={},h={},o=s=>i[s];for(let s=0;s<r.entries.length;s++){let l=r.entries[s],p=a[s].decoded;if(l.tagName==="DATA"){let b=P(p);b&&(c[l.tagNumber]=b,l.tagNumber>=1&&l.tagNumber<=4?m[o(l.tagNumber-1)]=b:l.tagNumber>=9&&l.tagNumber<=12&&(u[o(l.tagNumber-9)]=b));}else if(l.tagName==="PBAS"&&p.kind==="string")y[l.tagNumber]=p.value;else if(l.tagName==="PCON"){let b=l.elementSize===1?Array.from(l.payload.subarray(0,l.elementCount)):P(p);b&&(f[l.tagNumber]=b);}else if(l.tagName==="PLOC"){let b=P(p);b&&(h[l.tagNumber]=b.map(k=>k<0?k+65536:k));}else if(l.tagName==="SPAC")if(l.elementSize===4&&l.payload.byteLength>=4){let b=w(l.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(d.samplingRate=b);}else p.kind==="number"&&(d.samplingRate=p.value);else if(l.tagName==="SMPL"&&p.kind==="string")d.sampleName=p.value;else if(l.tagName==="LANE"&&p.kind==="number")d.laneNumber=p.value;else if(l.tagName==="TUBE"&&p.kind==="string")d.tube=p.value;else if(l.tagName==="MCHN"&&p.kind==="string")d.machineName=p.value;else if(l.tagName==="MODL"&&p.kind==="string")d.machineModel=p.value;else if(l.tagName==="RUND"&&p.kind==="date"){let b=p.value;d.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(l.tagName==="RUNT"&&p.kind==="time"){let b=p.value;d.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else l.tagName==="CMNT"&&p.kind==="string"?d.comments.push(p.value):l.tagName==="RevC"&&l.tagNumber===1&&(p.kind==="number"?d.reverseComplemented=p.value!==0:p.kind==="numbers"&&(d.reverseComplemented=p.value.some(b=>b!==0)));}let g=Object.keys(y).map(Number).sort((s,l)=>s-l).map(s=>({version:s,role:s===1?"edited":s===2?"called":"unknown",sequence:y[s],confidences:f[s]??[],positions:h[s]??[]})),A,C=2 in y?2:1 in y?1:Object.keys(y).map(Number)[0];if(C!==void 0&&y[C]!==void 0){let s=y[C].toUpperCase(),l=f[C]??[];l.length!==s.length&&(l=Object.keys(f).map(Number).map(b=>f[b]).find(b=>b.length===s.length)??[]);let p=h[C]??[];p.length!==s.length&&(p=Object.keys(h).map(Number).map(b=>h[b]).find(b=>b.length===s.length)??[]),A={sequence:s,confidences:l,positions:p,pbasVersion:C};}if(!Number.isFinite(d.samplingRate)||(d.samplingRate??0)<=0){let s=A?.positions,l=Math.max(u.A.length,u.C.length,u.G.length,u.T.length);s&&s.length>1?d.samplingRate=(s[s.length-1]-s[0])/(s.length-1):A&&A.sequence.length>0&&l>0&&(d.samplingRate=l/A.sequence.length);}let T={baseOrder:i,dataChannels:c,data1To4:m,data9To12:u};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:d,chromatogram:T,baseCalls:A,baseCallVariants:g,entries:a}}function Le(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function Oe(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function Ie(e,t){$(e,"PBAS",2,F(t),{elementType:2,elementSize:1,elementCount:t.length});}function He(e,t){let n=new Uint8Array(t.length);for(let r=0;r<t.length;r++)n[r]=Math.max(0,Math.min(255,Math.round(t[r])));$(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function Ve(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let a=0;a<t.length;a++)r.setUint16(a*2,Math.max(0,Math.min(65535,t[a])),false);$(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function _e(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),$(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let a=F(n),i=Math.min(255,a.length),c=new Uint8Array(1+i);c[0]=i,c.set(a.subarray(0,i),1),$(e,"SPAC",2,c,{elementType:18,elementSize:1,elementCount:1+i});let m=new Uint8Array(4);w(m).setFloat32(0,t,false),$(e,"SPAC",3,m,{elementType:7,elementSize:4,elementCount:1});}function qe(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function je(e){if(!L(e))for(let t=1;t<=4;t++){let n=S(e,"DATA",t);if(!n)continue;let r=8+t;S(e,"DATA",r)||e.entries.push({tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}var We=93;function Qe(e,t){let n=t?.lineWidth??60;return V(e).map(r=>`${H(">",r.id,r.description)}
|
|
2
|
+
${oe(r.sequence,n)}`).join("")}function Xe(e){return V(e).map(ie).join("")}function Ye(e,t){let n=t?.lineWidth??60;return V(e).map(r=>`${H(">",r.id,r.description)}
|
|
3
|
+
${se(r.qualities,n)}`).join("")}function Ze(e){return !!e&&e.length>0&&!e.every(t=>t===255)}function ie(e){let{id:t,description:n,sequence:r,qualities:a}=e;if(a.length!==r.length)throw new Error(`FASTQ ${t}: ${a.length} quality scores for ${r.length} bases`);let i=a.map(ue).join("");return `${H("@",t,n)}
|
|
4
4
|
${r}
|
|
5
5
|
+
|
|
6
6
|
${i}
|
|
7
|
-
`}function
|
|
8
|
-
`))throw new Error("FASTX header must not contain a newline");return e+r}function
|
|
7
|
+
`}function H(e,t,n){let r=n?`${t} ${n}`:t;if(r.includes(`
|
|
8
|
+
`))throw new Error("FASTX header must not contain a newline");return e+r}function oe(e,t){if(e.length===0)return "";if(t<=0||e.length<=t)return `${e}
|
|
9
9
|
`;let n="";for(let r=0;r<e.length;r+=t)n+=`${e.slice(r,r+t)}
|
|
10
|
-
`;return n}function
|
|
11
|
-
`;return a}function
|
|
10
|
+
`;return n}function se(e,t){if(e.length===0)return "";let n=e.map(Q),r=t<=0?n.length:t,a="";for(let i=0;i<n.length;i+=r)a+=`${n.slice(i,i+r).join(" ")}
|
|
11
|
+
`;return a}function Q(e){let t=Math.round(e);return t<0?0:t>93?93:t}function ue(e){return String.fromCharCode(Q(e)+33)}function V(e){return Array.isArray(e)?e:[e]}exports.ENTRY_SIZE=N;exports.HEADER_SIZE=z;exports.MAX_PHRED=We;exports.averagePeakSpacing=qe;exports.channelMaxLength=Oe;exports.cropAbif=$e;exports.dataChannelRole=pe;exports.ensureRawDataChannels=je;exports.findEntries=ce;exports.findEntry=S;exports.formatFasta=Qe;exports.formatFastq=Xe;exports.formatQual=Ye;exports.getChannelMap=Ae;exports.getConfidences=Ce;exports.getConfidencesForVersion=R;exports.getDataChannel=he;exports.getFwo=M;exports.getPositions=we;exports.getPositionsForVersion=v;exports.getReverseComplemented=ye;exports.getSamplingRate=Ne;exports.getSequence=Se;exports.getSequenceForVersion=U;exports.hasData9To12Block=L;exports.hasSignals=Le;exports.hasUsableQuality=Ze;exports.isFwoPermutation=B;exports.parseAbif=ve;exports.readAbif=j;exports.setAveragePeakSpacing=_e;exports.setConfidences=He;exports.setPositions=Ve;exports.setSequence=Ie;exports.tagNameFromInt32=X;exports.upsertEntry=$;exports.writeAbif=fe;//# sourceMappingURL=index.js.map
|
|
12
12
|
//# sourceMappingURL=index.js.map
|