@fishka/seqio 0.8.1 → 0.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +104 -20
- package/dist/index.d.ts +104 -20
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -8
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -1,23 +1,5 @@
|
|
|
1
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, insertEntrySorted, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.mjs';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Content-based file-format detection.
|
|
5
|
-
*
|
|
6
|
-
* Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
|
|
7
|
-
* 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
|
|
8
|
-
* the text formats. Text signatures are matched on the leading line's content (a keyword
|
|
9
|
-
* like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
|
|
10
|
-
* file still resolves.
|
|
11
|
-
*/
|
|
12
|
-
/** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
|
|
13
|
-
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'unknown';
|
|
14
|
-
/**
|
|
15
|
-
* Detect the sequencing file format from its content. Returns 'unknown' when no signature
|
|
16
|
-
* matches (empty input, or a leading line that is neither a known magic nor a recognized
|
|
17
|
-
* text marker).
|
|
18
|
-
*/
|
|
19
|
-
declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
|
|
20
|
-
|
|
21
3
|
/**
|
|
22
4
|
* The common "a sequence with a name" record produced by every reader that extracts
|
|
23
5
|
* sequences for downstream picking/export (GenBank, EMBL, Swiss-Prot, the alignment
|
|
@@ -38,6 +20,47 @@ interface SeqRecord {
|
|
|
38
20
|
/** Build a {@link SeqRecord}, dropping an empty description so records compare cleanly. */
|
|
39
21
|
declare function makeSeqRecord(id: string, description: string, sequence: string): SeqRecord;
|
|
40
22
|
|
|
23
|
+
/**
|
|
24
|
+
* ACE (`.ace`) reader — assembly sequence extraction (Phrap/consed).
|
|
25
|
+
*
|
|
26
|
+
* An ACE file describes one or more contigs. Each contig is a `CO <name> <nBases> <nReads> …` line
|
|
27
|
+
* followed by the consensus sequence (wrapped over several lines), then per-read records
|
|
28
|
+
* `RD <readName> <nPaddedBases> …` each followed by that read's padded sequence. Other records
|
|
29
|
+
* (`AS`, `BQ`, `QA`, `AF`, `BS`, `DS`, `WA`, `CT`, `RT`, …) carry qualities/metadata and are skipped.
|
|
30
|
+
*
|
|
31
|
+
* This reader returns every sequence it finds, in file order:
|
|
32
|
+
* - each contig consensus → id `Contig<name>`, description `consensus`
|
|
33
|
+
* - each read → id `<readName>`, description `read`
|
|
34
|
+
* The pad character `*` (an alignment gap in ACE) is kept verbatim — de-gapping is the caller's
|
|
35
|
+
* choice.
|
|
36
|
+
*
|
|
37
|
+
* A `CO`/`RD` header declares the block's exact base count, so the sequence is accumulated until that
|
|
38
|
+
* many residues are read (or a blank line ends it). This length-driven boundary — rather than
|
|
39
|
+
* "stop at the next two-letter tag" — avoids swallowing a following record and avoids truncating at a
|
|
40
|
+
* short residue line that merely looks like a tag (e.g. a line that is literally `BQ`/`CT`, both
|
|
41
|
+
* valid residues). Deliberately lenient (see AGENTS.md): never throws; a truncated final block is kept.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
declare function parseAce(input: string | Uint8Array): SeqRecord[];
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Content-based file-format detection.
|
|
48
|
+
*
|
|
49
|
+
* Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
|
|
50
|
+
* 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
|
|
51
|
+
* the text formats. Text signatures are matched on the leading line's content (a keyword
|
|
52
|
+
* like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
|
|
53
|
+
* file still resolves.
|
|
54
|
+
*/
|
|
55
|
+
/** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
|
|
56
|
+
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'mega' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'pdb' | 'ace' | 'unknown';
|
|
57
|
+
/**
|
|
58
|
+
* Detect the sequencing file format from its content. Returns 'unknown' when no signature
|
|
59
|
+
* matches (empty input, or a leading line that is neither a known magic nor a recognized
|
|
60
|
+
* text marker).
|
|
61
|
+
*/
|
|
62
|
+
declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
|
|
63
|
+
|
|
41
64
|
/**
|
|
42
65
|
* EMBL / Swiss-Prot (UniProtKB) flat-file reader — sequence extraction only.
|
|
43
66
|
*
|
|
@@ -213,7 +236,7 @@ declare function parseGff(input: string | Uint8Array): SeqRecord[];
|
|
|
213
236
|
* Multiple-sequence-alignment readers — one aligned row = one record.
|
|
214
237
|
*
|
|
215
238
|
* Covers the common alignment formats: Clustal (`.aln`), Stockholm (`.sto`/`.stk`),
|
|
216
|
-
* PHYLIP (`.phy`), NEXUS (`.nex`)
|
|
239
|
+
* PHYLIP (`.phy`), NEXUS (`.nex`), GCG/MSF (`.msf`) and MEGA (`.meg`). Each returns the alignment's rows
|
|
217
240
|
* as {@link SeqRecord}s: `id` = the taxon/sequence name, `sequence` = that row **with its
|
|
218
241
|
* gap characters preserved** (an aligned row is data; de-gapping is a caller's choice).
|
|
219
242
|
* Only line spacing and wrap are removed. No description field — these formats don't carry
|
|
@@ -250,6 +273,37 @@ declare function parsePhylip(input: string | Uint8Array): SeqRecord[];
|
|
|
250
273
|
declare function parseNexus(input: string | Uint8Array): SeqRecord[];
|
|
251
274
|
/** Read a GCG/MSF (`.msf`) alignment (the sequence blocks after the header's `//`). */
|
|
252
275
|
declare function parseMsf(input: string | Uint8Array): SeqRecord[];
|
|
276
|
+
/**
|
|
277
|
+
* Read a MEGA (`.meg`) alignment / sequence set.
|
|
278
|
+
*
|
|
279
|
+
* MEGA files open with `#mega` (or `#MEGA`), carry `!Command …;` directives (Title/Format/…), then
|
|
280
|
+
* the sequences as `#Name residues` rows — interleaved (each name repeats per block) or with the
|
|
281
|
+
* residues wrapped onto following lines. Rows are accumulated by name. Gap `-` and the identity
|
|
282
|
+
* match-char `.` are kept verbatim (de-gapping is the caller's choice; note `.` means "same as the
|
|
283
|
+
* first sequence" in MEGA, like NEXUS). Deliberately lenient: never throws.
|
|
284
|
+
*/
|
|
285
|
+
declare function parseMega(input: string | Uint8Array): SeqRecord[];
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* PDB (`.pdb`) reader — sequence extraction from `SEQRES` records.
|
|
289
|
+
*
|
|
290
|
+
* A PDB file lists each macromolecular chain's primary sequence in `SEQRES` records:
|
|
291
|
+
* `SEQRES <serNum> <chainID> <numRes> <res1> <res2> … <res13>`
|
|
292
|
+
* with the residues as three-letter codes (13 per line, continued across records). This reader
|
|
293
|
+
* collects the SEQRES residues per chain, in file order, and maps the three-letter codes to the
|
|
294
|
+
* one-letter sequence: the 20 standard amino acids (+ SEC→U, PYL→O, the ambiguity codes B/Z/X),
|
|
295
|
+
* and nucleotides (DA/DC/DG/DT/DU and A/C/G/U/T/I/N). Anything unrecognized becomes `X`.
|
|
296
|
+
* - id: the chain identifier (e.g. `A`).
|
|
297
|
+
* - sequence: the chain's residues, one letter each (no gaps — SEQRES is the primary sequence).
|
|
298
|
+
*
|
|
299
|
+
* SEQRES is the declared sequence and is preferred. For a chain with no SEQRES record (common in
|
|
300
|
+
* coordinate-only files — predicted models, fragments), the sequence is reconstructed from the
|
|
301
|
+
* first model's `ATOM` records instead (one residue per chain + residue number), plus any `HETATM`
|
|
302
|
+
* whose residue is a recognized polymer/modified code (e.g. MSE selenomethionine) — solvent, ions
|
|
303
|
+
* and ligands are left out. Deliberately lenient (see AGENTS.md): never throws.
|
|
304
|
+
*/
|
|
305
|
+
|
|
306
|
+
declare function parsePdb(input: string | Uint8Array): SeqRecord[];
|
|
253
307
|
|
|
254
308
|
/**
|
|
255
309
|
* PIR / NBRF (`.pir`) reader — sequence extraction.
|
|
@@ -309,4 +363,34 @@ declare function parseBam(bytes: Uint8Array): SeqRecord[];
|
|
|
309
363
|
|
|
310
364
|
declare function parseSam(input: string | Uint8Array): SeqRecord[];
|
|
311
365
|
|
|
312
|
-
|
|
366
|
+
/**
|
|
367
|
+
* SCF (`.scf`) reader — the called base sequence from a Staden chromatogram trace.
|
|
368
|
+
*
|
|
369
|
+
* SCF (Standard Chromatogram Format) is a binary trace file. Only the **called bases** are
|
|
370
|
+
* extracted here (the trace samples/qualities are ignored — this library reads sequences):
|
|
371
|
+
*
|
|
372
|
+
* Header (128 bytes, big-endian). The fields this reader uses:
|
|
373
|
+
* off field
|
|
374
|
+
* 0 magic ".scf"
|
|
375
|
+
* 12 bases (uint32 — number of called bases)
|
|
376
|
+
* 24 bases_offset (uint32 — start of the bases section)
|
|
377
|
+
* 36 version[4] (ASCII, e.g. "2.00" / "3.00")
|
|
378
|
+
* 28 comments_size (uint32)
|
|
379
|
+
* 32 comments_offset(uint32)
|
|
380
|
+
*
|
|
381
|
+
* Bases section — two layouts by version:
|
|
382
|
+
* • v3.x (column/SoA): peak indices (bases×uint32), then prob_A/C/G/T (bases bytes each),
|
|
383
|
+
* then the **base characters** (bases bytes), then spare (bases×3). So the characters begin
|
|
384
|
+
* at `bases_offset + bases*8`.
|
|
385
|
+
* • v2.x (interleaved/AoS): `bases` records of 12 bytes each — peak_index(uint32),
|
|
386
|
+
* prob_A/C/G/T(4), **base char(1)**, spare(3). The character of record i is at
|
|
387
|
+
* `bases_offset + i*12 + 8`.
|
|
388
|
+
*
|
|
389
|
+
* The record id comes from a `NAME=` field in the comments section when present, else `"scf"`.
|
|
390
|
+
* Deliberately lenient (see AGENTS.md): never throws; returns `[]` for a truncated/unreadable
|
|
391
|
+
* file, and best-effort (whatever bases fit) for one truncated mid-section.
|
|
392
|
+
*/
|
|
393
|
+
|
|
394
|
+
declare function parseScf(input: string | Uint8Array): SeqRecord[];
|
|
395
|
+
|
|
396
|
+
export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseAce, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMega, parseMsf, parseNexus, parsePdb, parsePhylip, parsePir, parseSam, parseScf, parseStockholm, parseSwissprot };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,23 +1,5 @@
|
|
|
1
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, insertEntrySorted, isFwoPermutation, parseAbif, readAbif, setAveragePeakSpacing, setConfidences, setPositions, setSequence, tagNameFromInt32, upsertEntry, writeAbif } from './abif/index.js';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Content-based file-format detection.
|
|
5
|
-
*
|
|
6
|
-
* Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
|
|
7
|
-
* 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
|
|
8
|
-
* the text formats. Text signatures are matched on the leading line's content (a keyword
|
|
9
|
-
* like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
|
|
10
|
-
* file still resolves.
|
|
11
|
-
*/
|
|
12
|
-
/** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
|
|
13
|
-
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'unknown';
|
|
14
|
-
/**
|
|
15
|
-
* Detect the sequencing file format from its content. Returns 'unknown' when no signature
|
|
16
|
-
* matches (empty input, or a leading line that is neither a known magic nor a recognized
|
|
17
|
-
* text marker).
|
|
18
|
-
*/
|
|
19
|
-
declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
|
|
20
|
-
|
|
21
3
|
/**
|
|
22
4
|
* The common "a sequence with a name" record produced by every reader that extracts
|
|
23
5
|
* sequences for downstream picking/export (GenBank, EMBL, Swiss-Prot, the alignment
|
|
@@ -38,6 +20,47 @@ interface SeqRecord {
|
|
|
38
20
|
/** Build a {@link SeqRecord}, dropping an empty description so records compare cleanly. */
|
|
39
21
|
declare function makeSeqRecord(id: string, description: string, sequence: string): SeqRecord;
|
|
40
22
|
|
|
23
|
+
/**
|
|
24
|
+
* ACE (`.ace`) reader — assembly sequence extraction (Phrap/consed).
|
|
25
|
+
*
|
|
26
|
+
* An ACE file describes one or more contigs. Each contig is a `CO <name> <nBases> <nReads> …` line
|
|
27
|
+
* followed by the consensus sequence (wrapped over several lines), then per-read records
|
|
28
|
+
* `RD <readName> <nPaddedBases> …` each followed by that read's padded sequence. Other records
|
|
29
|
+
* (`AS`, `BQ`, `QA`, `AF`, `BS`, `DS`, `WA`, `CT`, `RT`, …) carry qualities/metadata and are skipped.
|
|
30
|
+
*
|
|
31
|
+
* This reader returns every sequence it finds, in file order:
|
|
32
|
+
* - each contig consensus → id `Contig<name>`, description `consensus`
|
|
33
|
+
* - each read → id `<readName>`, description `read`
|
|
34
|
+
* The pad character `*` (an alignment gap in ACE) is kept verbatim — de-gapping is the caller's
|
|
35
|
+
* choice.
|
|
36
|
+
*
|
|
37
|
+
* A `CO`/`RD` header declares the block's exact base count, so the sequence is accumulated until that
|
|
38
|
+
* many residues are read (or a blank line ends it). This length-driven boundary — rather than
|
|
39
|
+
* "stop at the next two-letter tag" — avoids swallowing a following record and avoids truncating at a
|
|
40
|
+
* short residue line that merely looks like a tag (e.g. a line that is literally `BQ`/`CT`, both
|
|
41
|
+
* valid residues). Deliberately lenient (see AGENTS.md): never throws; a truncated final block is kept.
|
|
42
|
+
*/
|
|
43
|
+
|
|
44
|
+
declare function parseAce(input: string | Uint8Array): SeqRecord[];
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Content-based file-format detection.
|
|
48
|
+
*
|
|
49
|
+
* Sniffs the bytes, never the file extension: binary magic first (ABIF at offset 0, or at
|
|
50
|
+
* 128 behind a MacBinary preamble; SCF's ".scf" magic), then the first non-blank line for
|
|
51
|
+
* the text formats. Text signatures are matched on the leading line's content (a keyword
|
|
52
|
+
* like `LOCUS`, or the first character `>` / `;` / `@`), so a mislabeled or extension-less
|
|
53
|
+
* file still resolves.
|
|
54
|
+
*/
|
|
55
|
+
/** A format {@link detectFormat} can recognize. Some are detected before their reader ships. */
|
|
56
|
+
type SeqFileFormat = 'abif' | 'scf' | 'fasta' | 'fastq' | 'genbank' | 'embl' | 'swissprot' | 'clustal' | 'stockholm' | 'phylip' | 'nexus' | 'msf' | 'mega' | 'pir' | 'gff' | 'sam' | 'bam' | 'gfa' | 'pdb' | 'ace' | 'unknown';
|
|
57
|
+
/**
|
|
58
|
+
* Detect the sequencing file format from its content. Returns 'unknown' when no signature
|
|
59
|
+
* matches (empty input, or a leading line that is neither a known magic nor a recognized
|
|
60
|
+
* text marker).
|
|
61
|
+
*/
|
|
62
|
+
declare function detectFormat(bytes: Uint8Array): SeqFileFormat;
|
|
63
|
+
|
|
41
64
|
/**
|
|
42
65
|
* EMBL / Swiss-Prot (UniProtKB) flat-file reader — sequence extraction only.
|
|
43
66
|
*
|
|
@@ -213,7 +236,7 @@ declare function parseGff(input: string | Uint8Array): SeqRecord[];
|
|
|
213
236
|
* Multiple-sequence-alignment readers — one aligned row = one record.
|
|
214
237
|
*
|
|
215
238
|
* Covers the common alignment formats: Clustal (`.aln`), Stockholm (`.sto`/`.stk`),
|
|
216
|
-
* PHYLIP (`.phy`), NEXUS (`.nex`)
|
|
239
|
+
* PHYLIP (`.phy`), NEXUS (`.nex`), GCG/MSF (`.msf`) and MEGA (`.meg`). Each returns the alignment's rows
|
|
217
240
|
* as {@link SeqRecord}s: `id` = the taxon/sequence name, `sequence` = that row **with its
|
|
218
241
|
* gap characters preserved** (an aligned row is data; de-gapping is a caller's choice).
|
|
219
242
|
* Only line spacing and wrap are removed. No description field — these formats don't carry
|
|
@@ -250,6 +273,37 @@ declare function parsePhylip(input: string | Uint8Array): SeqRecord[];
|
|
|
250
273
|
declare function parseNexus(input: string | Uint8Array): SeqRecord[];
|
|
251
274
|
/** Read a GCG/MSF (`.msf`) alignment (the sequence blocks after the header's `//`). */
|
|
252
275
|
declare function parseMsf(input: string | Uint8Array): SeqRecord[];
|
|
276
|
+
/**
|
|
277
|
+
* Read a MEGA (`.meg`) alignment / sequence set.
|
|
278
|
+
*
|
|
279
|
+
* MEGA files open with `#mega` (or `#MEGA`), carry `!Command …;` directives (Title/Format/…), then
|
|
280
|
+
* the sequences as `#Name residues` rows — interleaved (each name repeats per block) or with the
|
|
281
|
+
* residues wrapped onto following lines. Rows are accumulated by name. Gap `-` and the identity
|
|
282
|
+
* match-char `.` are kept verbatim (de-gapping is the caller's choice; note `.` means "same as the
|
|
283
|
+
* first sequence" in MEGA, like NEXUS). Deliberately lenient: never throws.
|
|
284
|
+
*/
|
|
285
|
+
declare function parseMega(input: string | Uint8Array): SeqRecord[];
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* PDB (`.pdb`) reader — sequence extraction from `SEQRES` records.
|
|
289
|
+
*
|
|
290
|
+
* A PDB file lists each macromolecular chain's primary sequence in `SEQRES` records:
|
|
291
|
+
* `SEQRES <serNum> <chainID> <numRes> <res1> <res2> … <res13>`
|
|
292
|
+
* with the residues as three-letter codes (13 per line, continued across records). This reader
|
|
293
|
+
* collects the SEQRES residues per chain, in file order, and maps the three-letter codes to the
|
|
294
|
+
* one-letter sequence: the 20 standard amino acids (+ SEC→U, PYL→O, the ambiguity codes B/Z/X),
|
|
295
|
+
* and nucleotides (DA/DC/DG/DT/DU and A/C/G/U/T/I/N). Anything unrecognized becomes `X`.
|
|
296
|
+
* - id: the chain identifier (e.g. `A`).
|
|
297
|
+
* - sequence: the chain's residues, one letter each (no gaps — SEQRES is the primary sequence).
|
|
298
|
+
*
|
|
299
|
+
* SEQRES is the declared sequence and is preferred. For a chain with no SEQRES record (common in
|
|
300
|
+
* coordinate-only files — predicted models, fragments), the sequence is reconstructed from the
|
|
301
|
+
* first model's `ATOM` records instead (one residue per chain + residue number), plus any `HETATM`
|
|
302
|
+
* whose residue is a recognized polymer/modified code (e.g. MSE selenomethionine) — solvent, ions
|
|
303
|
+
* and ligands are left out. Deliberately lenient (see AGENTS.md): never throws.
|
|
304
|
+
*/
|
|
305
|
+
|
|
306
|
+
declare function parsePdb(input: string | Uint8Array): SeqRecord[];
|
|
253
307
|
|
|
254
308
|
/**
|
|
255
309
|
* PIR / NBRF (`.pir`) reader — sequence extraction.
|
|
@@ -309,4 +363,34 @@ declare function parseBam(bytes: Uint8Array): SeqRecord[];
|
|
|
309
363
|
|
|
310
364
|
declare function parseSam(input: string | Uint8Array): SeqRecord[];
|
|
311
365
|
|
|
312
|
-
|
|
366
|
+
/**
|
|
367
|
+
* SCF (`.scf`) reader — the called base sequence from a Staden chromatogram trace.
|
|
368
|
+
*
|
|
369
|
+
* SCF (Standard Chromatogram Format) is a binary trace file. Only the **called bases** are
|
|
370
|
+
* extracted here (the trace samples/qualities are ignored — this library reads sequences):
|
|
371
|
+
*
|
|
372
|
+
* Header (128 bytes, big-endian). The fields this reader uses:
|
|
373
|
+
* off field
|
|
374
|
+
* 0 magic ".scf"
|
|
375
|
+
* 12 bases (uint32 — number of called bases)
|
|
376
|
+
* 24 bases_offset (uint32 — start of the bases section)
|
|
377
|
+
* 36 version[4] (ASCII, e.g. "2.00" / "3.00")
|
|
378
|
+
* 28 comments_size (uint32)
|
|
379
|
+
* 32 comments_offset(uint32)
|
|
380
|
+
*
|
|
381
|
+
* Bases section — two layouts by version:
|
|
382
|
+
* • v3.x (column/SoA): peak indices (bases×uint32), then prob_A/C/G/T (bases bytes each),
|
|
383
|
+
* then the **base characters** (bases bytes), then spare (bases×3). So the characters begin
|
|
384
|
+
* at `bases_offset + bases*8`.
|
|
385
|
+
* • v2.x (interleaved/AoS): `bases` records of 12 bytes each — peak_index(uint32),
|
|
386
|
+
* prob_A/C/G/T(4), **base char(1)**, spare(3). The character of record i is at
|
|
387
|
+
* `bases_offset + i*12 + 8`.
|
|
388
|
+
*
|
|
389
|
+
* The record id comes from a `NAME=` field in the comments section when present, else `"scf"`.
|
|
390
|
+
* Deliberately lenient (see AGENTS.md): never throws; returns `[]` for a truncated/unreadable
|
|
391
|
+
* file, and best-effort (whatever bases fit) for one truncated mid-section.
|
|
392
|
+
*/
|
|
393
|
+
|
|
394
|
+
declare function parseScf(input: string | Uint8Array): SeqRecord[];
|
|
395
|
+
|
|
396
|
+
export { type FastaRecord, type FastqRecord, MAX_PHRED, type QualRecord, type SeqFileFormat, type SeqRecord, type WrapOptions, detectFormat, formatFasta, formatFastq, formatQual, hasUsableQuality, makeSeqRecord, parseAce, parseBam, parseClustal, parseEmbl, parseFasta, parseFastq, parseGenbank, parseGfa, parseGff, parseMega, parseMsf, parseNexus, parsePdb, parsePhylip, parsePir, parseSam, parseScf, parseStockholm, parseSwissprot };
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
'use strict';function U(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function $(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;return t}function C(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function T(e,t,n){return e.subarray(t,t+n)}function Ae(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var M=128,R=28;function ae(e){if(e.byteLength<M)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(U(T(e,0,4))!=="ABIF")if(e.byteLength>=132&&U(T(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<M)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=C(e),i=r.getInt16(n+4,false),o=ie(e,r,n+6,n);if(o.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${o.tagName}"`);if(o.elementSize!==R)throw new Error(`Expected dir element size ${R}, got ${o.elementSize}`);let a=o.raw?.elementCount??o.elementCount,s=Math.max(0,a),c=r.getInt32(n+6+20,false);if(c<0||c+s*R>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${c}, entries=${s}, file=${e.byteLength-n}`);let m=[];for(let w=0;w<s;w++)m.push(ie(e,r,n+c+w*R,n));let d=o.raw?.dataSize??s*R,u=n+c+s*R,p=Math.min(Math.max(0,d-s*R),Math.max(0,e.byteLength-u)),l={entryCount:s,rawEntryCount:a,elementType:o.elementType,tagNumber:o.tagNumber,entrySize:o.elementSize,dataSize:d,dataOffset:c,dataOffsetBytes:o.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:o.dataHandle,paddingBytes:new Uint8Array(T(e,u,p))},h=new Uint8Array(T(e,n+6+R,M-6-R)),y=t===128?new Uint8Array(T(e,0,128)):void 0,S=ye(e,n,c,d,m,t);return {version:i,tdir:l,entries:m,macBinaryOffset:t,macBinaryHeader:y,headerReserved:h,unreferencedRanges:S}}function ye(e,t,n,r,i,o){let a=e.byteLength,s=[];o===128&&s.push([0,128]),s.push([t,t+M]);let c=Math.max(i.length*R,Math.max(0,r));s.push([t+n,t+n+c]);for(let l of i)if(l.raw&&!l.raw.inline){let h=t+l.raw.dataOffset;s.push([h,h+l.payload.byteLength]);}let m=s.map(([l,h])=>[Math.max(0,Math.min(l,a)),Math.max(0,Math.min(h,a))]).filter(([l,h])=>h>l).sort((l,h)=>l[0]-h[0]),d=[];for(let[l,h]of m){let y=d[d.length-1];y&&l<=y[1]?y[1]=Math.max(y[1],h):d.push([l,h]);}let u=[],p=0;for(let[l,h]of d)l>p&&u.push({offset:p,bytes:new Uint8Array(T(e,p,l-p))}),p=Math.max(p,h);return p<a&&u.push({offset:p,bytes:new Uint8Array(T(e,p,a-p))}),u}function ie(e,t,n,r){let i=U(T(e,n,4)),o=t.getInt32(n+4,false),a=t.getInt16(n+8,false),s=t.getInt16(n+10,false),c=t.getInt32(n+12,false),m=t.getInt32(n+16,false),d=t.getInt32(n+24,false),u=Math.max(0,c*Math.max(0,s)),p=m>=0?m:u,l=m>=0?m<=4:u<=4,h=Math.max(0,s>0?Math.min(c,Math.floor(p/s)):Math.min(c,p)),y,S;if(l)S=-1,y=new Uint8Array(T(e,n+20,Math.min(4,p)));else {S=t.getInt32(n+20,false);let f=r+S;if(S<0||f+p>e.byteLength)throw new Error(`Entry ${i}${o}: payload out of bounds (offset=${S}, size=${p})`);y=new Uint8Array(T(e,f,p));}let w=new Uint8Array(T(e,n+20,4));return {tagName:i,tagNumber:o,elementType:a,elementSize:s,elementCount:h,payload:y,dataHandle:d,raw:{elementCount:c,dataSize:m,dataOffset:S,inline:l,dataOffsetBytes:w}}}function Xe(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,i=e.entries.map(l=>l.raw&&l.payload.byteLength===l.raw.dataSize?l.raw:void 0),o=M;o=Math.max(o,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*R));for(let l of i)l&&!l.inline&&(o=Math.max(o,l.dataOffset+l.dataSize));for(let l of e.unreferencedRanges)o=Math.max(o,l.offset-t+l.bytes.length);let a=n>r,s=o,c=a?s:e.tdir.dataOffset,m=n===r?e.tdir.dataSize:n*R;a&&(s+=m);let d=new Array(n);for(let l=0;l<n;l++){let h=e.entries[l].payload.byteLength;if(i[l]||h<=4){d[l]=-1;continue}d[l]=s,s+=h;}let u=new Uint8Array(s),p=C(u);u.set($("ABIF"),0),p.setInt16(4,e.version,false),u.set(e.headerReserved,6+R),oe(u,p,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:m,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:c}}),n===r&&e.tdir.paddingBytes.length>0&&u.set(e.tdir.paddingBytes,c+n*R);for(let l=0;l<n;l++){let h=e.entries[l],y=i[l],S=c+l*R,w=h.payload.byteLength;oe(u,p,S,{tagName:h.tagName,tagNumber:h.tagNumber,elementType:h.elementType,elementSize:h.elementSize,elementCount:y?y.elementCount:h.elementCount,dataSize:y?y.dataSize:w,dataHandle:h.dataHandle,offsetSlot:w<=4?{kind:"inline",payload:h.payload,dataSize:w,staleTail:y?.dataOffsetBytes}:{kind:"external",value:y?y.dataOffset:d[l]}}),w>4&&u.set(h.payload,y?y.dataOffset:d[l]);}for(let l of e.unreferencedRanges)u.set(l.bytes,l.offset-t);return u}function oe(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set($(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:i,dataSize:o,staleTail:a}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(i.subarray(0,o),n+20),a&&o<4&&e.set(a.subarray(o,4),n+20+o);}t.setInt32(n+24,r.dataHandle,false);}function N(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function Ze(e,t){return e.entries.filter(n=>n.tagName===t)}function Se(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function Q(e,t){let n=e.findIndex(r=>Se(r,t)>0);e.splice(n<0?e.length:n,0,t);}function I(e,t,n,r,i){if(r.byteLength!==i.elementCount*i.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let o=N(e,t,n);o?(o.elementType=i.elementType,o.elementSize=i.elementSize,o.elementCount=i.elementCount,o.payload=r,o.raw=void 0):Q(e.entries,{tagName:t,tagNumber:n,elementType:i.elementType,elementSize:i.elementSize,elementCount:i.elementCount,payload:r,dataHandle:0});}function nt(e,t){let n=N(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),i=C(n.payload);for(let o=0;o<n.elementCount;o++)r[o]=i.getInt16(o*2,false);return r}function K(e){let t=N(e,"FWO_",1);return t?U(t.payload.subarray(0,t.elementCount)):"GATC"}function X(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function B(e){return !!(N(e,"DATA",9)&&N(e,"DATA",10)&&N(e,"DATA",11)&&N(e,"DATA",12))}function rt(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function it(e){let t=N(e,"RevC",1);if(!t)return;let n=C(t.payload);return t.payload.byteLength>=2?n.getInt16(0,false)!==0:t.payload.some(r=>r!==0)}function ot(e){let t=K(e);if(!X(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 at(e){return z(e,2)??z(e,1)}function z(e,t){let n=N(e,"PBAS",t);if(n)return U(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function st(e){return v(e,2)??v(e,1)}function v(e,t){let n=N(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)r[i]=n.payload[i];return r}function ut(e){return P(e,2)??P(e,1)}function P(e,t){let n=N(e,"PLOC",t);if(!n)return;if(n.elementSize!==2)throw new Error(`PLOC${t}: expected elementSize=2, got ${n.elementSize}`);let r=C(n.payload),i=new Array(n.elementCount);for(let o=0;o<n.elementCount;o++)i[o]=r.getUint16(o*2,false);return i}function ct(e){let t=N(e,"SPAC",1);if(!t||t.elementSize!==4||t.payload.byteLength<4)return;let n=C(t.payload).getFloat32(0,false);return Number.isFinite(n)&&n>0?n:void 0}function gt(e,t,n={}){let{start:r,end:i}=t;if(!Number.isInteger(r)||!Number.isInteger(i)||r<0||i<=r)throw new Error(`cropAbif: invalid range [${r}, ${i})`);if(!B(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let o=Math.min(G(e,9),G(e,10),G(e,11),G(e,12));if(i>o)throw new Error(`cropAbif: range end ${i} exceeds the processed trace length ${o}`);let a=n.rawTrace??"omit",s=[];for(let c of e.entries)c.tagName==="DATA"&&c.tagNumber>=9&&c.tagNumber<=12?s.push(xe(c,r,i)):c.tagName==="DATA"&&c.tagNumber>=1&&c.tagNumber<=8?a==="full"&&s.push({...c}):c.tagName==="PBAS"||c.tagName==="PCON"||c.tagName==="PLOC"||s.push({...c});for(let c of Ne(e))s.push(...Ce(e,c,r,i));return {version:e.version,tdir:e.tdir,entries:s,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function G(e,t){return N(e,"DATA",t)?.elementCount??0}function xe(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 Ne(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 Ce(e,t,n,r){let i=z(e,t);if(i===void 0)return [];let o=P(e,t);if(o===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(o.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${i.length} vs ${o.length})`);let a=v(e,t);if(a!==void 0&&a.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let s=[];for(let u=0;u<o.length;u++)o[u]>=n&&o[u]<r&&s.push(u);let c=s.map(u=>i[u]).join(""),m=s.map(u=>o[u]-n),d=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:c.length,payload:$(c),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:m.length,payload:we(m),dataHandle:0}];if(a!==void 0){let u=s.map(p=>a[p]);d.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:u.length,payload:Uint8Array.from(u),dataHandle:0});}return d}function we(e){let t=new Uint8Array(e.length*2),n=C(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 Re={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 J(e){return Re[e]??(e>=1024?`user${e}`:`type${e}`)}function Fe(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function Te(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function se(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 Z(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function q(e,t,n,r){let i=Math.max(0,Math.min(t,Math.floor(e/n))),o=[];for(let a=0;a<i;a++)o.push(r(a*n));return o.length===1?{kind:"number",value:o[0]}:{kind:"numbers",value:o}}function ue(e,t,n){let r=C(n);switch(e){case 1:return {kind:"numbers",value:Array.from(n.subarray(0,t))};case 2:case 19:return {kind:"string",value:U(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return q(n.byteLength,t,2,i=>r.getUint16(i,false));case 4:return q(n.byteLength,t,2,i=>r.getInt16(i,false));case 5:return q(n.byteLength,t,4,i=>r.getInt32(i,false));case 7:return q(n.byteLength,t,4,i=>r.getFloat32(i,false));case 8:return q(n.byteLength,t,8,i=>r.getFloat64(i,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let i=r.getInt16(0,false),o=r.getUint8(2),a=r.getUint8(3);return {kind:"date",value:{year:i,month:o,day:a}}}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 i=[];for(let o=0;o<Math.min(t,n.byteLength);o++)i.push(r.getUint8(o)!==0);return {kind:"bools",value:i}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let i=r.getUint8(0);return {kind:"string",value:U(T(n,1,Math.min(i,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Ee(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Fe(e.value);case "string":return Te(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:i}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(i).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:i}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(i).padStart(2,"0")}`}case "bytes":return `${J(t)} ${se(e.value)}`;case "unknown":return `${J(t)} ${se(e.value)}`}}function yt(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=ae(n),i=r.entries.map(f=>{let g=f.tagName==="PCON"&&f.elementSize===1?ue(1,f.elementCount,f.payload):ue(f.elementType,f.elementCount,f.payload);return {tag:f.tagName,tagNumber:f.tagNumber,elementType:f.elementType,elementTypeName:J(f.elementType),elementSize:f.elementSize,elementCount:f.elementCount,rawElementCount:f.raw?.elementCount??f.elementCount,dataSize:f.raw?.dataSize??f.elementCount*f.elementSize,dataOffset:f.raw?.dataOffset??-1,inline:f.raw?.inline??f.elementCount*f.elementSize<=4,decoded:g,preview:Ee(g,f.elementType)}}),o=K(r);X(o)||(o="GATC");let a={},s={A:[],C:[],G:[],T:[]},c={A:[],C:[],G:[],T:[]},m={comments:[]},d={},u={},p={},l=f=>o[f];for(let f=0;f<r.entries.length;f++){let g=r.entries[f],A=i[f].decoded;if(g.tagName==="DATA"){let b=Z(A);b&&(a[g.tagNumber]=b,g.tagNumber>=1&&g.tagNumber<=4?s[l(g.tagNumber-1)]=b:g.tagNumber>=9&&g.tagNumber<=12&&(c[l(g.tagNumber-9)]=b));}else if(g.tagName==="PBAS"&&A.kind==="string")d[g.tagNumber]=A.value;else if(g.tagName==="PCON"){let b=g.elementSize===1?Array.from(g.payload.subarray(0,g.elementCount)):Z(A);b&&(u[g.tagNumber]=b);}else if(g.tagName==="PLOC"){let b=Z(A);b&&(p[g.tagNumber]=b.map(Y=>Y<0?Y+65536:Y));}else if(g.tagName==="SPAC")if(g.elementSize===4&&g.payload.byteLength>=4){let b=C(g.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(m.samplingRate=b);}else A.kind==="number"&&(m.samplingRate=A.value);else if(g.tagName==="SMPL"&&A.kind==="string")m.sampleName=A.value;else if(g.tagName==="LANE"&&A.kind==="number")m.laneNumber=A.value;else if(g.tagName==="TUBE"&&A.kind==="string")m.tube=A.value;else if(g.tagName==="MCHN"&&A.kind==="string")m.machineName=A.value;else if(g.tagName==="MODL"&&A.kind==="string")m.machineModel=A.value;else if(g.tagName==="RUND"&&A.kind==="date"){let b=A.value;m.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(g.tagName==="RUNT"&&A.kind==="time"){let b=A.value;m.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else g.tagName==="CMNT"&&A.kind==="string"?m.comments.push(A.value):g.tagName==="RevC"&&g.tagNumber===1&&(A.kind==="number"?m.reverseComplemented=A.value!==0:A.kind==="numbers"&&(m.reverseComplemented=A.value.some(b=>b!==0)));}let h=Object.keys(d).map(Number).sort((f,g)=>f-g).map(f=>({version:f,role:f===1?"edited":f===2?"called":"unknown",sequence:d[f],confidences:u[f]??[],positions:p[f]??[]})),y,S=2 in d?2:1 in d?1:Object.keys(d).map(Number)[0];if(S!==void 0&&d[S]!==void 0){let f=d[S].toUpperCase(),g=u[S]??[];g.length!==f.length&&(g=Object.keys(u).map(Number).map(b=>u[b]).find(b=>b.length===f.length)??[]);let A=p[S]??[];A.length!==f.length&&(A=Object.keys(p).map(Number).map(b=>p[b]).find(b=>b.length===f.length)??[]),y={sequence:f,confidences:g,positions:A,pbasVersion:S};}if(!Number.isFinite(m.samplingRate)||(m.samplingRate??0)<=0){let f=y?.positions,g=Math.max(c.A.length,c.C.length,c.G.length,c.T.length);f&&f.length>1?m.samplingRate=(f[f.length-1]-f[0])/(f.length-1):y&&y.sequence.length>0&&g>0&&(m.samplingRate=g/y.sequence.length);}let w={baseOrder:o,dataChannels:a,data1To4:s,data9To12:c};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:m,chromatogram:w,baseCalls:y,baseCallVariants:h,entries:i}}function St(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function xt(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function Ft(e,t){I(e,"PBAS",2,$(t),{elementType:2,elementSize:1,elementCount:t.length});}function Tt(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])));I(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function Et(e,t){let n=new Uint8Array(t.length*2),r=C(n);for(let i=0;i<t.length;i++)r.setUint16(i*2,Math.max(0,Math.min(65535,t[i])),false);I(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function Lt(e,t,n){let r=new Uint8Array(4);C(r).setFloat32(0,t,false),I(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let i=$(n),o=Math.min(255,i.length),a=new Uint8Array(1+o);a[0]=o,a.set(i.subarray(0,o),1),I(e,"SPAC",2,a,{elementType:18,elementSize:1,elementCount:1+o});let s=new Uint8Array(4);C(s).setFloat32(0,t,false),I(e,"SPAC",3,s,{elementType:7,elementSize:4,elementCount:1});}function Ut(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function $t(e){if(!B(e))for(let t=1;t<=4;t++){let n=N(e,"DATA",t);if(!n)continue;let r=8+t;N(e,"DATA",r)||Q(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}function D(e){let t=typeof e=="string"?e:new TextDecoder().decode(e);return t.charCodeAt(0)===65279&&(t=t.slice(1)),t}function x(e){return D(e).split(/\r\n|\r|\n/)}function E(e){return e.replace(/\s+/g,"")}function L(e){return e.trim().length===0}function k(e){let t=e.trim(),n=t.search(/\s/);return n<0?t:t.slice(0,n)}var Le=128,_=8192;function Dt(e){if(V(e,0,"ABIF")||V(e,Le,"ABIF"))return "abif";if(V(e,0,".scf"))return "scf";if(V(e,0,"BAM"))return "bam";let t=ke(e);if(t===void 0)return "unknown";let n=$e(t),r=n==="clustal"&&!ce.test(t.trimStart());return (n==="unknown"||r)&&Ue(e)?"msf":n}function Ue(e){let t=e.length>_?e.subarray(0,_):e,n=D(t),r=/\bMSF:\s*\d+\b[^\n]*\bCheck:\s*\d/.test(n)&&/^\s*Name:\s+.*\bLen:\s*\d/im.test(n),i=/^\s*Name:\s+\S+\s+Len:\s*\d+\s+Check:\s*\d+\s+Weight:/im.test(n);return r||i}var ce=/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)\b/i;function $e(e){let t=e.trimStart();if(/^LOCUS\s/.test(t))return "genbank";if(/^ID\s/.test(t))return /(Reviewed|Unreviewed);| AA\.\s*$/.test(t)?"swissprot":"embl";if(/^#\s*STOCKHOLM/i.test(t))return "stockholm";if(/^#NEXUS/i.test(t))return "nexus";if(ce.test(t)||/multiple (sequence )?alignment/i.test(t)&&!/^[>@#]/.test(t)&&!/genedoc/i.test(t))return "clustal";if(/^!!(NA|AA)_MULTIPLE_ALIGNMENT/i.test(t)||/\bMSF:\s*\d/.test(t))return "msf";if(/^\d+\s+\d+\s*$/.test(t))return "phylip";if(/^##gff-version/i.test(t))return "gff";if(/^H\t(?:[^\t]*\t)*VN:Z:[12]\./.test(t))return "gfa";if(/^@(HD|SQ|RG|PG|CO)\t/.test(t))return "sam";if(/^>(P1|F1|DL|DC|RL|RC|N1|N3|XX);/i.test(t))return "pir";switch(t.charCodeAt(0)){case 62:case 59:return "fasta";case 64:return "fastq"}return Ie(t)?"sam":/^S\t[!-~]+\t/.test(t)?"gfa":"unknown"}function Ie(e){let t=e.split(" ");if(t.length<11)return false;let[,n,,r,i,o]=t;return /^\d+$/.test(n)&&/^\d+$/.test(r)&&/^\d+$/.test(i)&&/^(\*|(\d+[MIDNSHPX=])+)$/.test(o)}function ke(e){let t=e.length>_?e.subarray(0,_):e;for(let n of D(t).split(/\r\n|\r|\n/))if(n.trim().length>0)return n}function V(e,t,n){if(e.length<t+n.length)return false;for(let r=0;r<n.length;r++)if(e[t+r]!==n.charCodeAt(r))return false;return true}function F(e,t,n){return t?{id:e,description:t,sequence:n}:{id:e,sequence:n}}function Bt(e){return le(e,"embl")}function Gt(e){return le(e,"swissprot")}function le(e,t){let n=x(e),r=[],i=false,o="",a="",s=[],c=[],m="header",d=()=>{i&&(r.push(F(Oe(t,o,a),s.join(" ").trim(),E(c.join("")))),i=false,o="",a="",s=[],c=[],m="header");};for(let u of n){if(u.startsWith("//")){d();continue}if(m==="sequence"){if(u.length===0||/^\s/.test(u)){c.push(u.replace(/[\s\d]/g,""));continue}m="header";}let p=u.slice(0,2);p==="ID"?(i&&d(),i=true,o=u.slice(2).trim()):p==="AC"?(a||(a=u.slice(2).split(";")[0].trim()),i=true):p==="DE"?(s.push(u.slice(2).trim()),i=true):p==="SQ"&&(m="sequence",i=true);}return d(),r}function Oe(e,t,n){if(e==="swissprot")return n||k(t);let r=t.split(";"),i=k(r[0]),o="";for(let a of r){let s=/^\s*SV\s+(\d+)/.exec(a);s&&(o=s[1]);}return (o?`${i}.${o}`:i)||n}var fe=93,ee=33,de=60,De=255;function ge(e){let t=x(e),n=[],r,i=[],o=()=>{r!==void 0&&n.push(Me(r,i.join("")));};for(let a of t)if(a[0]===">")o(),r=a.slice(1),i=[];else {if(L(a)||a[0]===";")continue;if(r===void 0)continue;i.push(a);}return o(),n}function Ht(e){let t=x(e),n=[],r=0;for(;r<t.length;){if(L(t[r])||t[r][0]!=="@"){r++;continue}let i=t[r].slice(1);r++;let o=[];for(;r<t.length&&t[r][0]!=="+"&&t[r][0]!=="@";)o.push(t[r]),r++;let a=E(o.join(""));if(r>=t.length||t[r][0]==="@"){n.push(me(i,a,""));continue}r++;let s="";for(;r<t.length&&s.length<a.length&&!(t[r][0]==="@"&&qe(t,r));)s+=E(t[r]),r++;n.push(me(i,a,s));}return n}function Wt(e,t){let n=t?.lineWidth??de;return re(e).map(r=>`${te(">",r.id,r.description)}
|
|
2
|
-
${
|
|
3
|
-
${
|
|
1
|
+
'use strict';function U(e){let t="";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}function I(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 F(e,t,n){return e.subarray(t,t+n)}function ye(e){return String.fromCharCode(e>>>24&255,e>>>16&255,e>>>8&255,e&255)}var q=128,T=28;function se(e){if(e.byteLength<q)throw new Error(`ABIF too small: ${e.byteLength} bytes`);let t=0;if(U(F(e,0,4))!=="ABIF")if(e.byteLength>=132&&U(F(e,128,4))==="ABIF")t=128;else throw new Error('Not an ABIF file: missing "ABIF" magic.');let n=t;if(e.byteLength-n<q)throw new Error(`ABIF too small: ${e.byteLength-n} bytes after offset ${n}`);let r=w(e),i=r.getInt16(n+4,false),o=ie(e,r,n+6,n);if(o.tagName!=="tdir")throw new Error(`Expected "tdir" header entry, got "${o.tagName}"`);if(o.elementSize!==T)throw new Error(`Expected dir element size ${T}, got ${o.elementSize}`);let s=o.raw?.elementCount??o.elementCount,a=Math.max(0,s),c=r.getInt32(n+6+20,false);if(c<0||c+a*T>e.byteLength-n)throw new Error(`Directory out of bounds: offset=${c}, entries=${a}, file=${e.byteLength-n}`);let u=[];for(let R=0;R<a;R++)u.push(ie(e,r,n+c+R*T,n));let d=o.raw?.dataSize??a*T,f=n+c+a*T,g=Math.min(Math.max(0,d-a*T),Math.max(0,e.byteLength-f)),l={entryCount:a,rawEntryCount:s,elementType:o.elementType,tagNumber:o.tagNumber,entrySize:o.elementSize,dataSize:d,dataOffset:c,dataOffsetBytes:o.raw?.dataOffsetBytes??new Uint8Array(4),dataHandle:o.dataHandle,paddingBytes:new Uint8Array(F(e,f,g))},h=new Uint8Array(F(e,n+6+T,q-6-T)),S=t===128?new Uint8Array(F(e,0,128)):void 0,x=xe(e,n,c,d,u,t);return {version:i,tdir:l,entries:u,macBinaryOffset:t,macBinaryHeader:S,headerReserved:h,unreferencedRanges:x}}function xe(e,t,n,r,i,o){let s=e.byteLength,a=[];o===128&&a.push([0,128]),a.push([t,t+q]);let c=Math.max(i.length*T,Math.max(0,r));a.push([t+n,t+n+c]);for(let l of i)if(l.raw&&!l.raw.inline){let h=t+l.raw.dataOffset;a.push([h,h+l.payload.byteLength]);}let u=a.map(([l,h])=>[Math.max(0,Math.min(l,s)),Math.max(0,Math.min(h,s))]).filter(([l,h])=>h>l).sort((l,h)=>l[0]-h[0]),d=[];for(let[l,h]of u){let S=d[d.length-1];S&&l<=S[1]?S[1]=Math.max(S[1],h):d.push([l,h]);}let f=[],g=0;for(let[l,h]of d)l>g&&f.push({offset:g,bytes:new Uint8Array(F(e,g,l-g))}),g=Math.max(g,h);return g<s&&f.push({offset:g,bytes:new Uint8Array(F(e,g,s-g))}),f}function ie(e,t,n,r){let i=U(F(e,n,4)),o=t.getInt32(n+4,false),s=t.getInt16(n+8,false),a=t.getInt16(n+10,false),c=t.getInt32(n+12,false),u=t.getInt32(n+16,false),d=t.getInt32(n+24,false),f=Math.max(0,c*Math.max(0,a)),g=u>=0?u:f,l=u>=0?u<=4:f<=4,h=Math.max(0,a>0?Math.min(c,Math.floor(g/a)):Math.min(c,g)),S,x;if(l)x=-1,S=new Uint8Array(F(e,n+20,Math.min(4,g)));else {x=t.getInt32(n+20,false);let m=r+x;if(x<0||m+g>e.byteLength)throw new Error(`Entry ${i}${o}: payload out of bounds (offset=${x}, size=${g})`);S=new Uint8Array(F(e,m,g));}let R=new Uint8Array(F(e,n+20,4));return {tagName:i,tagNumber:o,elementType:s,elementSize:a,elementCount:h,payload:S,dataHandle:d,raw:{elementCount:c,dataSize:u,dataOffset:x,inline:l,dataOffsetBytes:R}}}function st(e){let t=e.macBinaryOffset,n=e.entries.length,r=e.tdir.entryCount,i=e.entries.map(l=>l.raw&&l.payload.byteLength===l.raw.dataSize?l.raw:void 0),o=q;o=Math.max(o,e.tdir.dataOffset+Math.max(e.tdir.dataSize,r*T));for(let l of i)l&&!l.inline&&(o=Math.max(o,l.dataOffset+l.dataSize));for(let l of e.unreferencedRanges)o=Math.max(o,l.offset-t+l.bytes.length);let s=n>r,a=o,c=s?a:e.tdir.dataOffset,u=n===r?e.tdir.dataSize:n*T;s&&(a+=u);let d=new Array(n);for(let l=0;l<n;l++){let h=e.entries[l].payload.byteLength;if(i[l]||h<=4){d[l]=-1;continue}d[l]=a,a+=h;}let f=new Uint8Array(a),g=w(f);f.set(I("ABIF"),0),g.setInt16(4,e.version,false),f.set(e.headerReserved,6+T),oe(f,g,6,{tagName:"tdir",tagNumber:e.tdir.tagNumber,elementType:e.tdir.elementType,elementSize:e.tdir.entrySize,elementCount:n,dataSize:u,dataHandle:e.tdir.dataHandle,offsetSlot:{kind:"external",value:c}}),n===r&&e.tdir.paddingBytes.length>0&&f.set(e.tdir.paddingBytes,c+n*T);for(let l=0;l<n;l++){let h=e.entries[l],S=i[l],x=c+l*T,R=h.payload.byteLength;oe(f,g,x,{tagName:h.tagName,tagNumber:h.tagNumber,elementType:h.elementType,elementSize:h.elementSize,elementCount:S?S.elementCount:h.elementCount,dataSize:S?S.dataSize:R,dataHandle:h.dataHandle,offsetSlot:R<=4?{kind:"inline",payload:h.payload,dataSize:R,staleTail:S?.dataOffsetBytes}:{kind:"external",value:S?S.dataOffset:d[l]}}),R>4&&f.set(h.payload,S?S.dataOffset:d[l]);}for(let l of e.unreferencedRanges)f.set(l.bytes,l.offset-t);return f}function oe(e,t,n,r){if(r.tagName.length!==4)throw new Error(`tagName must be 4 chars: "${r.tagName}"`);if(e.set(I(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:i,dataSize:o,staleTail:s}=r.offsetSlot;e.fill(0,n+20,n+24),e.set(i.subarray(0,o),n+20),s&&o<4&&e.set(s.subarray(o,4),n+20+o);}t.setInt32(n+24,r.dataHandle,false);}function N(e,t,n){return e.entries.find(r=>r.tagName===t&&r.tagNumber===n)}function at(e,t){return e.entries.filter(n=>n.tagName===t)}function Ce(e,t){return e.tagName!==t.tagName?e.tagName<t.tagName?-1:1:e.tagNumber-t.tagNumber}function Q(e,t){let n=e.findIndex(r=>Ce(r,t)>0);e.splice(n<0?e.length:n,0,t);}function M(e,t,n,r,i){if(r.byteLength!==i.elementCount*i.elementSize)throw new Error(`upsertEntry ${t}${n}: payload length ${r.byteLength} != count*size`);let o=N(e,t,n);o?(o.elementType=i.elementType,o.elementSize=i.elementSize,o.elementCount=i.elementCount,o.payload=r,o.raw=void 0):Q(e.entries,{tagName:t,tagNumber:n,elementType:i.elementType,elementSize:i.elementSize,elementCount:i.elementCount,payload:r,dataHandle:0});}function lt(e,t){let n=N(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),i=w(n.payload);for(let o=0;o<n.elementCount;o++)r[o]=i.getInt16(o*2,false);return r}function X(e){let t=N(e,"FWO_",1);return t?U(t.payload.subarray(0,t.elementCount)):"GATC"}function K(e){return /^[ACGT]{4}$/.test(e)&&new Set(e).size===4}function G(e){return !!(N(e,"DATA",9)&&N(e,"DATA",10)&&N(e,"DATA",11)&&N(e,"DATA",12))}function mt(e){return e>=5&&e<=8?"telemetry":e>=1&&e<=4||e>=9&&e<=12||e===105||e===205?"trace":"other"}function dt(e){let t=N(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 gt(e){let t=X(e);if(!K(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 pt(e){return v(e,2)??v(e,1)}function v(e,t){let n=N(e,"PBAS",t);if(n)return U(n.payload.subarray(0,n.elementCount)).replace(/\0+$/g,"")}function ht(e){return z(e,2)??z(e,1)}function z(e,t){let n=N(e,"PCON",t);if(!n)return;let r=new Array(n.elementCount);for(let i=0;i<n.elementCount;i++)r[i]=n.payload[i];return r}function bt(e){return B(e,2)??B(e,1)}function B(e,t){let n=N(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),i=new Array(n.elementCount);for(let o=0;o<n.elementCount;o++)i[o]=r.getUint16(o*2,false);return i}function At(e){let t=N(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 Nt(e,t,n={}){let{start:r,end:i}=t;if(!Number.isInteger(r)||!Number.isInteger(i)||r<0||i<=r)throw new Error(`cropAbif: invalid range [${r}, ${i})`);if(!G(e))throw new Error("cropAbif: no DATA9..12 block to crop \u2014 the range has nothing to apply to");let o=Math.min(H(e,9),H(e,10),H(e,11),H(e,12));if(i>o)throw new Error(`cropAbif: range end ${i} exceeds the processed trace length ${o}`);let s=n.rawTrace??"omit",a=[];for(let c of e.entries)c.tagName==="DATA"&&c.tagNumber>=9&&c.tagNumber<=12?a.push(Ne(c,r,i)):c.tagName==="DATA"&&c.tagNumber>=1&&c.tagNumber<=8?s==="full"&&a.push({...c}):c.tagName==="PBAS"||c.tagName==="PCON"||c.tagName==="PLOC"||a.push({...c});for(let c of we(e))a.push(...Re(e,c,r,i));return {version:e.version,tdir:e.tdir,entries:a,macBinaryOffset:0,macBinaryHeader:void 0,headerReserved:e.headerReserved,unreferencedRanges:[]}}function H(e,t){return N(e,"DATA",t)?.elementCount??0}function Ne(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 we(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 Re(e,t,n,r){let i=v(e,t);if(i===void 0)return [];let o=B(e,t);if(o===void 0)throw new Error(`cropAbif: PBAS${t} has no PLOC${t} to crop by`);if(o.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PLOC${t} length mismatch (${i.length} vs ${o.length})`);let s=z(e,t);if(s!==void 0&&s.length!==i.length)throw new Error(`cropAbif: PBAS${t}/PCON${t} length mismatch`);let a=[];for(let f=0;f<o.length;f++)o[f]>=n&&o[f]<r&&a.push(f);let c=a.map(f=>i[f]).join(""),u=a.map(f=>o[f]-n),d=[{tagName:"PBAS",tagNumber:t,elementType:2,elementSize:1,elementCount:c.length,payload:I(c),dataHandle:0},{tagName:"PLOC",tagNumber:t,elementType:4,elementSize:2,elementCount:u.length,payload:Te(u),dataHandle:0}];if(s!==void 0){let f=a.map(g=>s[g]);d.push({tagName:"PCON",tagNumber:t,elementType:2,elementSize:1,elementCount:f.length,payload:Uint8Array.from(f),dataHandle:0});}return d}function Te(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 Ee={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 J(e){return Ee[e]??(e>=1024?`user${e}`:`type${e}`)}function Fe(e,t=10){return e.length<=t?`[${e.join(", ")}]`:`[${e.slice(0,t).join(", ")}, \u2026 +${e.length-t}] (n=${e.length})`}function Le(e,t=80){return e.length>t?e.slice(0,t)+"\u2026":e}function ae(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 Z(e){if(e.kind==="numbers")return e.value;if(e.kind==="number")return [e.value]}function P(e,t,n,r){let i=Math.max(0,Math.min(t,Math.floor(e/n))),o=[];for(let s=0;s<i;s++)o.push(r(s*n));return o.length===1?{kind:"number",value:o[0]}:{kind:"numbers",value:o}}function ce(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:U(n.subarray(0,t)).replace(/\0+$/g,"")};case 3:return P(n.byteLength,t,2,i=>r.getUint16(i,false));case 4:return P(n.byteLength,t,2,i=>r.getInt16(i,false));case 5:return P(n.byteLength,t,4,i=>r.getInt32(i,false));case 7:return P(n.byteLength,t,4,i=>r.getFloat32(i,false));case 8:return P(n.byteLength,t,8,i=>r.getFloat64(i,false));case 10:{if(n.byteLength<4)return {kind:"unknown",value:n};let i=r.getInt16(0,false),o=r.getUint8(2),s=r.getUint8(3);return {kind:"date",value:{year:i,month:o,day:s}}}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 i=[];for(let o=0;o<Math.min(t,n.byteLength);o++)i.push(r.getUint8(o)!==0);return {kind:"bools",value:i}}case 18:{if(n.byteLength<1)return {kind:"string",value:""};let i=r.getUint8(0);return {kind:"string",value:U(F(n,1,Math.min(i,Math.max(0,t-1))))}}default:return {kind:"unknown",value:n}}}function Ue(e,t){switch(e.kind){case "number":return String(e.value);case "numbers":return Fe(e.value);case "string":return Le(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:i}=e.value;return `${n}-${String(r).padStart(2,"0")}-${String(i).padStart(2,"0")}`}case "time":{let{hour:n,minute:r,second:i}=e.value;return `${String(n).padStart(2,"0")}:${String(r).padStart(2,"0")}:${String(i).padStart(2,"0")}`}case "bytes":return `${J(t)} ${ae(e.value)}`;case "unknown":return `${J(t)} ${ae(e.value)}`}}function Ft(e,t=""){let n=e instanceof Uint8Array?e:new Uint8Array(e),r=se(n),i=r.entries.map(m=>{let p=m.tagName==="PCON"&&m.elementSize===1?ce(1,m.elementCount,m.payload):ce(m.elementType,m.elementCount,m.payload);return {tag:m.tagName,tagNumber:m.tagNumber,elementType:m.elementType,elementTypeName:J(m.elementType),elementSize:m.elementSize,elementCount:m.elementCount,rawElementCount:m.raw?.elementCount??m.elementCount,dataSize:m.raw?.dataSize??m.elementCount*m.elementSize,dataOffset:m.raw?.dataOffset??-1,inline:m.raw?.inline??m.elementCount*m.elementSize<=4,decoded:p,preview:Ue(p,m.elementType)}}),o=X(r);K(o)||(o="GATC");let s={},a={A:[],C:[],G:[],T:[]},c={A:[],C:[],G:[],T:[]},u={comments:[]},d={},f={},g={},l=m=>o[m];for(let m=0;m<r.entries.length;m++){let p=r.entries[m],A=i[m].decoded;if(p.tagName==="DATA"){let b=Z(A);b&&(s[p.tagNumber]=b,p.tagNumber>=1&&p.tagNumber<=4?a[l(p.tagNumber-1)]=b:p.tagNumber>=9&&p.tagNumber<=12&&(c[l(p.tagNumber-9)]=b));}else if(p.tagName==="PBAS"&&A.kind==="string")d[p.tagNumber]=A.value;else if(p.tagName==="PCON"){let b=p.elementSize===1?Array.from(p.payload.subarray(0,p.elementCount)):Z(A);b&&(f[p.tagNumber]=b);}else if(p.tagName==="PLOC"){let b=Z(A);b&&(g[p.tagNumber]=b.map(Y=>Y<0?Y+65536:Y));}else if(p.tagName==="SPAC")if(p.elementSize===4&&p.payload.byteLength>=4){let b=w(p.payload).getFloat32(0,false);Number.isFinite(b)&&b>0&&(u.samplingRate=b);}else A.kind==="number"&&(u.samplingRate=A.value);else if(p.tagName==="SMPL"&&A.kind==="string")u.sampleName=A.value;else if(p.tagName==="LANE"&&A.kind==="number")u.laneNumber=A.value;else if(p.tagName==="TUBE"&&A.kind==="string")u.tube=A.value;else if(p.tagName==="MCHN"&&A.kind==="string")u.machineName=A.value;else if(p.tagName==="MODL"&&A.kind==="string")u.machineModel=A.value;else if(p.tagName==="RUND"&&A.kind==="date"){let b=A.value;u.runDate=`${b.year}-${String(b.month).padStart(2,"0")}-${String(b.day).padStart(2,"0")}`;}else if(p.tagName==="RUNT"&&A.kind==="time"){let b=A.value;u.runTime=`${String(b.hour).padStart(2,"0")}:${String(b.minute).padStart(2,"0")}:${String(b.second).padStart(2,"0")}`;}else p.tagName==="CMNT"&&A.kind==="string"?u.comments.push(A.value):p.tagName==="RevC"&&p.tagNumber===1&&(A.kind==="number"?u.reverseComplemented=A.value!==0:A.kind==="numbers"&&(u.reverseComplemented=A.value.some(b=>b!==0)));}let h=Object.keys(d).map(Number).sort((m,p)=>m-p).map(m=>({version:m,role:m===1?"edited":m===2?"called":"unknown",sequence:d[m],confidences:f[m]??[],positions:g[m]??[]})),S,x=2 in d?2:1 in d?1:Object.keys(d).map(Number)[0];if(x!==void 0&&d[x]!==void 0){let m=d[x].toUpperCase(),p=f[x]??[];p.length!==m.length&&(p=Object.keys(f).map(Number).map(b=>f[b]).find(b=>b.length===m.length)??[]);let A=g[x]??[];A.length!==m.length&&(A=Object.keys(g).map(Number).map(b=>g[b]).find(b=>b.length===m.length)??[]),S={sequence:m,confidences:p,positions:A,pbasVersion:x};}if(!Number.isFinite(u.samplingRate)||(u.samplingRate??0)<=0){let m=S?.positions,p=Math.max(c.A.length,c.C.length,c.G.length,c.T.length);m&&m.length>1?u.samplingRate=(m[m.length-1]-m[0])/(m.length-1):S&&S.sequence.length>0&&p>0&&(u.samplingRate=p/S.sequence.length);}let R={baseOrder:o,dataChannels:s,data1To4:a,data9To12:c};return {fileName:t,fileSize:n.byteLength,abifVersion:r.version,macBinaryOffset:r.macBinaryOffset,dirEntryCount:r.entries.length,metadata:u,chromatogram:R,baseCalls:S,baseCallVariants:h,entries:i}}function Lt(e){return e.A.length>0||e.C.length>0||e.G.length>0||e.T.length>0}function Ut(e){return Math.max(e.A.length,e.C.length,e.G.length,e.T.length)}function Mt(e,t){M(e,"PBAS",2,I(t),{elementType:2,elementSize:1,elementCount:t.length});}function Dt(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])));M(e,"PCON",2,n,{elementType:2,elementSize:1,elementCount:t.length});}function qt(e,t){let n=new Uint8Array(t.length*2),r=w(n);for(let i=0;i<t.length;i++)r.setUint16(i*2,Math.max(0,Math.min(65535,t[i])),false);M(e,"PLOC",2,n,{elementType:4,elementSize:2,elementCount:t.length});}function Pt(e,t,n){let r=new Uint8Array(4);w(r).setFloat32(0,t,false),M(e,"SPAC",1,r,{elementType:7,elementSize:4,elementCount:1});let i=I(n),o=Math.min(255,i.length),s=new Uint8Array(1+o);s[0]=o,s.set(i.subarray(0,o),1),M(e,"SPAC",2,s,{elementType:18,elementSize:1,elementCount:1+o});let a=new Uint8Array(4);w(a).setFloat32(0,t,false),M(e,"SPAC",3,a,{elementType:7,elementSize:4,elementCount:1});}function vt(e){return e.length<2?0:(e[e.length-1]-e[0])/(e.length-1)}function zt(e){if(!G(e))for(let t=1;t<=4;t++){let n=N(e,"DATA",t);if(!n)continue;let r=8+t;N(e,"DATA",r)||Q(e.entries,{tagName:"DATA",tagNumber:r,elementType:n.elementType,elementSize:n.elementSize,elementCount:n.elementCount,payload:new Uint8Array(n.payload),dataHandle:0});}}function C(e,t,n){return t?{id:e,description:t,sequence:n}:{id:e,sequence:n}}function $(e){let t=typeof e=="string"?e:new TextDecoder().decode(e);return t.charCodeAt(0)===65279&&(t=t.slice(1)),t}function y(e){return $(e).split(/\r\n|\r|\n/)}function E(e){return e.replace(/\s+/g,"")}function L(e){return e.trim().length===0}function D(e){let t=e.trim(),n=t.search(/\s/);return n<0?t:t.slice(0,n)}function jt(e){let t=[],n=null,r="",i=[],o=0,s=0,a=()=>{n&&r&&i.length>0&&t.push(C(r,n,E(i.join("")))),n=null,r="",i=[],o=0,s=0;},c=(u,d,f)=>{a();let g=u.trim().split(/\s+/);n=d,r=f(g[1]??""),s=/^\d+$/.test(g[2]??"")?Number.parseInt(g[2],10):Number.POSITIVE_INFINITY;};for(let u of y(e)){if(/^CO\s/.test(u)){c(u,"consensus",f=>`Contig${f}`);continue}if(/^RD\s/.test(u)){c(u,"read",f=>f);continue}if(n===null)continue;if(L(u)||o>=s){a();continue}let d=E(u);i.push(d),o+=d.length,o>=s&&a();}return a(),t}var Ie=128,k=8192;function Xt(e){if(V(e,0,"ABIF")||V(e,Ie,"ABIF"))return "abif";if(V(e,0,".scf"))return "scf";if(V(e,0,"BAM"))return "bam";let t=qe(e);if(t===void 0)return "unknown";let n=Me(t),r=n==="clustal"&&!ue.test(t.trimStart());return (n==="unknown"||r)&&Oe(e)?"msf":n==="unknown"&&ke(e)?"pdb":n==="unknown"&&$e(e)?"gff":n}function $e(e){let t=e.length>k?e.subarray(0,k):e;return /^##FASTA[ \t]*$[\s\S]*?^>/m.test($(t))}function ke(e){let t=e.length>k?e.subarray(0,k):e,n=$(t),r=/-?\d+\.\d{3}/.source,i=new RegExp(`^(ATOM|HETATM)[ \\t]+\\d+[ \\t].*[ \\t]${r}[ \\t]+${r}[ \\t]+${r}`,"m"),o=/^SEQRES[ \t]+\d+[ \t]+(?:\S[ \t]+)?\d+[ \t]+[A-Za-z]/m,s=/^CRYST1[ \t]+\d+\.\d+[ \t]+\d+\.\d+[ \t]+\d+\.\d+/m;return i.test(n)||o.test(n)||s.test(n)}function Oe(e){let t=e.length>k?e.subarray(0,k):e,n=$(t),r=/\bMSF:\s*\d+\b[^\n]*\bCheck:\s*\d/.test(n)&&/^\s*Name:\s+.*\bLen:\s*\d/im.test(n),i=/^\s*Name:\s+\S+\s+Len:\s*\d+\s+Check:\s*\d+\s+Weight:/im.test(n);return r||i}var ue=/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)\b/i;function Me(e){let t=e.trimStart();if(/^LOCUS\s/.test(t))return "genbank";if(/^ID\s/.test(t))return /(Reviewed|Unreviewed);| AA\.\s*$/.test(t)?"swissprot":"embl";if(/^#\s*STOCKHOLM/i.test(t))return "stockholm";if(/^#NEXUS/i.test(t))return "nexus";if(/^#mega\b/i.test(t))return "mega";if(/^HEADER\s{2,}/.test(t)||/^(ATOM|HETATM)\s+\d+\s/.test(t)||/^MODEL\s+\d/.test(t)||/^CRYST1\s/.test(t))return "pdb";if(/^AS\s+\d+\s+\d+\s*$/.test(t))return "ace";if(ue.test(t)||/multiple (sequence )?alignment/i.test(t)&&!/^[>@#]/.test(t)&&!/genedoc/i.test(t))return "clustal";if(/^!!(NA|AA)_MULTIPLE_ALIGNMENT/i.test(t)||/\bMSF:\s*\d/.test(t))return "msf";if(/^\d+\s+\d+\s*$/.test(t))return "phylip";if(/^##gff-version/i.test(t))return "gff";if(/^H\t(?:[^\t]*\t)*VN:Z:[12]\./.test(t))return "gfa";if(/^@(HD|SQ|RG|PG|CO)\t/.test(t))return "sam";if(/^>(P1|F1|DL|DC|RL|RC|N1|N3|XX);/i.test(t))return "pir";switch(t.charCodeAt(0)){case 62:case 59:return "fasta";case 64:return "fastq"}return De(t)?"sam":/^S\t[!-~]+\t/.test(t)?"gfa":"unknown"}function De(e){let t=e.split(" ");if(t.length<11)return false;let[,n,,r,i,o]=t;return /^\d+$/.test(n)&&/^\d+$/.test(r)&&/^\d+$/.test(i)&&/^(\*|(\d+[MIDNSHPX=])+)$/.test(o)}function qe(e){let t=e.length>k?e.subarray(0,k):e;for(let n of $(t).split(/\r\n|\r|\n/))if(n.trim().length>0)return n}function V(e,t,n){if(e.length<t+n.length)return false;for(let r=0;r<n.length;r++)if(e[t+r]!==n.charCodeAt(r))return false;return true}function tn(e){return fe(e,"embl")}function nn(e){return fe(e,"swissprot")}function fe(e,t){let n=y(e),r=[],i=false,o="",s="",a=[],c=[],u="header",d=()=>{i&&(r.push(C(Pe(t,o,s),a.join(" ").trim(),E(c.join("")))),i=false,o="",s="",a=[],c=[],u="header");};for(let f of n){if(f.startsWith("//")){d();continue}if(u==="sequence"){if(f.length===0||/^\s/.test(f)){c.push(f.replace(/[\s\d]/g,""));continue}u="header";}let g=f.slice(0,2);g==="ID"?(i&&d(),i=true,o=f.slice(2).trim()):g==="AC"?(s||(s=f.slice(2).split(";")[0].trim()),i=true):g==="DE"?(a.push(f.slice(2).trim()),i=true):g==="SQ"&&(u="sequence",i=true);}return d(),r}function Pe(e,t,n){if(e==="swissprot")return n||D(t);let r=t.split(";"),i=D(r[0]),o="";for(let s of r){let a=/^\s*SV\s+(\d+)/.exec(s);a&&(o=a[1]);}return (o?`${i}.${o}`:i)||n}var le=93,ee=33,de=60,ve=255;function ge(e){let t=y(e),n=[],r,i=[],o=()=>{r!==void 0&&n.push(ze(r,i.join("")));};for(let s of t)if(s[0]===">")o(),r=s.slice(1),i=[];else {if(L(s)||s[0]===";")continue;if(r===void 0)continue;i.push(s);}return o(),n}function sn(e){let t=y(e),n=[],r=0;for(;r<t.length;){if(L(t[r])||t[r][0]!=="@"){r++;continue}let i=t[r].slice(1);r++;let o=[];for(;r<t.length&&t[r][0]!=="+"&&t[r][0]!=="@";)o.push(t[r]),r++;let s=E(o.join(""));if(r>=t.length||t[r][0]==="@"){n.push(me(i,s,""));continue}r++;let a="";for(;r<t.length&&a.length<s.length&&!(t[r][0]==="@"&&Be(t,r));)a+=E(t[r]),r++;n.push(me(i,s,a));}return n}function an(e,t){let n=t?.lineWidth??de;return re(e).map(r=>`${te(">",r.id,r.description)}
|
|
2
|
+
${He(r.sequence,n)}`).join("")}function cn(e){return re(e).map(Ge).join("")}function un(e,t){let n=t?.lineWidth??de;return re(e).map(r=>`${te(">",r.id,r.description)}
|
|
3
|
+
${Ve(r.qualities,n)}`).join("")}function fn(e){return !!e&&e.length>0&&!e.every(t=>t===ve)}function ze(e,t){let{id:n,description:r}=pe(e),i=E(t);return r===void 0?{id:n,sequence:i}:{id:n,description:r,sequence:i}}function me(e,t,n){let{id:r,description:i}=pe(e),o=new Array(t.length);for(let s=0;s<t.length;s++){let a=s<n.length?n.charCodeAt(s):ee;o[s]=ne(a-ee);}return i===void 0?{id:r,sequence:t,qualities:o}:{id:r,description:i,sequence:t,qualities:o}}function pe(e){let t=e.trim(),n=t.search(/\s/);return n<0?{id:t}:{id:t.slice(0,n),description:t.slice(n+1).trim()||void 0}}function Be(e,t){let n=t+1;for(;n<e.length&&e[n][0]!=="+"&&e[n][0]!=="@";)n++;return e[n]?.[0]==="+"}function Ge(e){let{id:t,description:n,sequence:r,qualities:i}=e;if(i.length!==r.length)throw new Error(`FASTQ ${t}: ${i.length} quality scores for ${r.length} bases`);let o=i.map(_e).join("");return `${te("@",t,n)}
|
|
4
4
|
${r}
|
|
5
5
|
+
|
|
6
6
|
${o}
|
|
7
7
|
`}function te(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
|
|
8
|
+
`))throw new Error("FASTX header must not contain a newline");return e+r}function He(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 i}function ne(e){let t=Math.round(e);return t<0?0:t>
|
|
12
|
-
`))}var O=class{constructor(){this.order=[];this.blocks=new Map;}add(t,n){let r=this.blocks.get(t);r?r.push(n):(this.blocks.set(t,[n]),this.order.push(t));}toRecords(){return this.order.map(t=>
|
|
13
|
-
exports.ENTRY_SIZE=
|
|
10
|
+
`;return n}function Ve(e,t){if(e.length===0)return "";let n=e.map(ne),r=t<=0?n.length:t,i="";for(let o=0;o<n.length;o+=r)i+=`${n.slice(o,o+r).join(" ")}
|
|
11
|
+
`;return i}function ne(e){let t=Math.round(e);return t<0?0:t>le?le:t}function _e(e){return String.fromCharCode(ne(e)+ee)}function re(e){return Array.isArray(e)?e:[e]}var We=/^([A-Za-z][A-Za-z0-9_]*)/;function pn(e){let t=y(e),n=[],r=false,i="",o="",s="",a=[],c=[],u="header",d=()=>{if(!r)return;let f=s||o||i;n.push(C(f,a.join(" ").trim(),E(c.join("")))),r=false,i=o=s="",a=[],c=[],u="header";};for(let f of t){if(f.startsWith("//")){d();continue}let g=f.length>0&&!/^\s/.test(f);if(u==="origin")if(g)u="header";else {c.push(f.replace(/[\s\d]/g,""));continue}if(u==="definition"&&!g){a.push(f.trim());continue}if(!g)continue;let l=(We.exec(f)?.[1]??"").toUpperCase(),h=f.slice(l.length).trim();l==="LOCUS"&&r&&d(),r=true,u="header",l==="LOCUS"?i=D(h):l==="ACCESSION"?o=D(h):l==="VERSION"?s=D(h):l==="DEFINITION"?(a=[h],u="definition"):l==="ORIGIN"&&(u="origin");}return d(),n}function je(e){let t=[];for(let n of y(e)){if(n.charCodeAt(0)!==83||n.charCodeAt(1)!==9)continue;let r=n.split(" "),i=r[1];if(!i)continue;let o=/^\d+$/.test(r[2]??"")&&r[3]!==void 0?r[3]:r[2];!o||o==="*"||t.push(C(i,"",o));}return t}function Rn(e){let t=y(e),n=t.findIndex(r=>/^##FASTA\s*$/i.test(r.trim()));return n<0?[]:ge(t.slice(n+1).join(`
|
|
12
|
+
`))}var O=class{constructor(){this.order=[];this.blocks=new Map;}add(t,n){let r=this.blocks.get(t);r?r.push(n):(this.blocks.set(t,[n]),this.order.push(t));}toRecords(){return this.order.map(t=>C(t,"",E((this.blocks.get(t)??[]).join(""))))}},Ye=/^[A-Za-z0-9.*?~-]+$/;function Un(e){let t=new O,n=false;for(let r of y(e)){if(L(r)||/^\s/.test(r)||!n&&(n=true,/multiple (sequence )?alignment/i.test(r)||/^(CLUSTAL|MUSCLE|MAFFT|T-?COFFEE|PROBCONS|KALIGN|MVIEW|PROMALS)/i.test(r)))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&Ye.test(i[2])&&t.add(i[1],i[2]);}return t.toRecords()}function In(e){let t=[],n=new O;for(let r of y(e)){if(r.startsWith("//")){t.push(...n.toRecords()),n=new O;continue}if(L(r)||r.startsWith("#"))continue;let i=/^(\S+)\s+(\S+)/.exec(r);i&&n.add(i[1],i[2]);}return t.push(...n.toRecords()),t}function $n(e){let t=y(e),n=0;for(;n<t.length&&L(t[n]);)n++;let r=(t[n]??"").trim().split(/\s+/),i=Number.parseInt(r[0]??"",10),o=Number.parseInt(r[1]??"",10);if(!Number.isFinite(i)||i<=0)return [];n++;let s=[],a=[];for(;n<t.length&&s.length<i;n++){if(L(t[n]))continue;let d=/^(\S+)\s+(.*)$/.exec(t[n]);d&&(s.push(d[1]),a.push(d[2].replace(/\s+/g,"")));}let c=s.length;if(c===0)return [];let u=Number.isFinite(o)&&o>0?o:Number.POSITIVE_INFINITY;for(let d=0;n<t.length;n++){if(L(t[n]))continue;let f=d%c;a[f].length<u&&(a[f]+=t[n].replace(/\s+/g,"")),d++;}return s.map((d,f)=>C(d,"",u===Number.POSITIVE_INFINITY?a[f]:a[f].slice(0,u)))}function kn(e){let t=$(e).replace(/\[[^\]]*\]/g,""),n=new O,r=false;for(let i of t.split(/\r\n|\r|\n/)){if(!r){/^\s*matrix\b/i.test(i)&&(r=true);continue}let o=i.trim();if(o===";")break;if(L(o))continue;let s=o.endsWith(";"),a=s?o.slice(0,-1).trim():o,c=/^("[^"]+"|'[^']+'|\S+)\s+(.+)$/.exec(a);if(c&&n.add(c[1].replace(/^['"]|['"]$/g,""),c[2].replace(/\s+/g,"")),s)break}return n.toRecords()}function On(e){let t=new O,n=false;for(let r of y(e)){if(!n){r.trimStart().startsWith("//")&&(n=true);continue}if(L(r))continue;let i=/^\s*(\S+)\s+(.+)$/.exec(r);if(!i)continue;let o=i[2].replace(/\s+/g,"");/\d/.test(o)||t.add(i[1],o);}return t.toRecords()}function Mn(e){let t=new O,n,r=false,i=false,o=s=>{let a="";for(let c of s)i?c==='"'&&(i=false):c==='"'?i=true:a+=c;return a.replace(/\s+/g,"")};for(let s of y(e)){if(i){let c=o(s);n!==void 0&&c&&t.add(n,c);continue}let a=s.trim();if(a.length!==0){if(r){a.includes(";")&&(r=false);continue}if(!/^#mega\b/i.test(a)){if(a.startsWith("!")){a.includes(";")||(r=true);continue}if(a.startsWith("#")){let c=/^#(\S+)\s*(.*)$/.exec(a);if(c){n=c[1];let u=o(c[2]);u&&t.add(n,u);}}else if(n!==void 0){let c=o(a);c&&t.add(n,c);}}}}return t.toRecords()}var be={ALA:"A",ARG:"R",ASN:"N",ASP:"D",CYS:"C",GLN:"Q",GLU:"E",GLY:"G",HIS:"H",ILE:"I",LEU:"L",LYS:"K",MET:"M",PHE:"F",PRO:"P",SER:"S",THR:"T",TRP:"W",TYR:"Y",VAL:"V",MSE:"M",SEC:"U",PYL:"O",ASX:"B",GLX:"Z",UNK:"X",DA:"A",DC:"C",DG:"G",DT:"T",DU:"U",DI:"I",A:"A",C:"C",G:"G",U:"U",T:"T",I:"I",N:"N"};function Qe(e){return be[e.toUpperCase()]??"X"}function Xe(e){return e.length>=2&&Object.prototype.hasOwnProperty.call(be,e.toUpperCase())}function Ke(e){if(e.length>=20&&/^\d+$/.test(e.slice(7,10).trim())&&/^\d+$/.test(e.slice(13,17).trim())){let r=e.slice(19).trim().split(/\s+/).filter(Boolean);if(r.length>0)return {chain:e[11],codes:r}}let n=e.trim().split(/\s+/);return n.length>=5?{chain:n[2],codes:n.slice(4)}:null}function he(e,t,n){let r=e.map.get(t);r||(e.map.set(t,r=[]),e.order.push(t)),r.push(n);}function zn(e){let t=y(e),n={order:[],map:new Map},r={order:[],map:new Map},i=new Set,o=false;for(let a of t)if(a.startsWith("SEQRES")){let c=Ke(a);if(c)for(let u of c.codes)he(n,c.chain,u);}else if(a.startsWith("ENDMDL"))o=true;else if(!o&&a.length>=27&&(a.startsWith("ATOM")||a.startsWith("HETATM"))){let c=a.slice(17,20).trim();if(a.startsWith("ATOM")||Xe(c)){let u=a[21],d=`${u}|${a.slice(22,27)}`;i.has(d)||(i.add(d),he(r,u,c));}}return [...n.order,...r.order.filter(a=>!n.map.has(a))].map(a=>{let c=n.map.get(a)??r.map.get(a)??[];return C(a.trim(),"",c.map(Qe).join(""))})}function _n(e){let t=[],n,r="",i=[],o=false,s=()=>{if(n===void 0)return;let a=E(i.join(""));a.endsWith("*")&&(a=a.slice(0,-1)),t.push(C(n,r,a)),n=void 0,r="",i=[],o=false;};for(let a of y(e))if(a.startsWith(">")){s();let c=a.slice(1),u=c.indexOf(";");n=(u>=0?c.slice(u+1):c).trim(),o=true;}else {if(n===void 0)continue;o?(r=a.trim(),o=false):i.push(a);}return s(),t}function _(e){return (e&2304)!==0}function W(e,t){if(t&1){if(t&64)return `${e}/1`;if(t&128)return `${e}/2`}return e}function j(e,t,n){return n&4||!e||e==="*"?"unmapped":`${e}:${t} (${n&16?"-":"+"})`}var Ze="=ACMGRSVTWYHKDBN",Ae=32;function Je(e){let t=[];if(!(e[0]===66&&e[1]===65&&e[2]===77&&e[3]===1))return t;let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=new TextDecoder,i=(o,s)=>r.decode(e.subarray(o,o+Math.max(0,s-1)));try{let o=e.length,s=4;if(s+4>o)return t;let a=n.getInt32(s,!0);if(s+=4,a<0||s+a+4>o)return t;s+=a;let c=n.getInt32(s,!0);if(s+=4,c<0)return t;let u=[];for(let d=0;d<c;d++){if(s+4>o)return t;let f=n.getInt32(s,!0);if(s+=4,f<=0||s+f+4>o)return t;u.push(i(s,f)),s+=f+4;}for(;s+4<=e.length;){let d=n.getInt32(s,!0);if(s+=4,d<Ae||s+d>e.length)break;let f=s+d,g=n.getInt32(s,!0),l=n.getInt32(s+4,!0),h=n.getUint8(s+8),S=n.getUint16(s+12,!0),x=n.getUint16(s+14,!0),R=n.getInt32(s+16,!0),m=s+Ae,p=i(m,h);m+=h+S*4;let A=R+1>>1;if(R>0&&m+A<=f&&!_(x)){let b=g>=0&&g<u.length?u[g]:"*";t.push(C(W(p,x),j(b,l+1,x),et(e,m,R)));}s=f;}}catch{}return t}function et(e,t,n){let r="";for(let i=0;i<n;i++){let o=e[t+(i>>1)];r+=Ze[i&1?o&15:o>>4];}return r}function tt(e){let t=[];for(let n of y(e)){if(n.length===0||n.charCodeAt(0)===64)continue;let r=n.split(" ");if(r.length<11)continue;let i=r[9];if(!i||i==="*")continue;let o=Se(r[1]);_(o)||t.push(C(W(r[0],o),j(r[2],Se(r[3]),o),i));}return t}function Se(e){let t=Number.parseInt(e,10);return Number.isFinite(t)?t:0}var nt=128;function cr(e){let t=typeof e=="string"?new TextEncoder().encode(e):e;if(t.length<nt)return [];let n=new DataView(t.buffer,t.byteOffset,t.byteLength);if(n.getUint32(0,false)!==779314022)return [];let r=n.getUint32(12,false),i=n.getUint32(24,false),o=String.fromCharCode(t[36],t[37],t[38],t[39]);if(r===0||i===0)return [];let s=[];if(Number.parseFloat(o)>=3){let c=i+r*8;for(let u=0;u<r&&c+u<t.length;u++)s.push(t[c+u]);}else for(let c=0;c<r;c++){let u=i+c*12+8;if(u>=t.length)break;s.push(t[u]);}let a=s.filter(c=>c>32&&c<127).map(c=>String.fromCharCode(c)).join("");return a.length===0?[]:[C(rt(t,n),"",a)]}function rt(e,t){let n=t.getUint32(28,false),r=t.getUint32(32,false);if(n===0||r===0||r+n>e.length)return "scf";let i="";for(let s=r;s<r+n;s++)i+=String.fromCharCode(e[s]);let o=/^NAME=(.+)$/im.exec(i);return o&&o[1].trim()||"scf"}
|
|
13
|
+
exports.ENTRY_SIZE=T;exports.HEADER_SIZE=q;exports.MAX_PHRED=le;exports.averagePeakSpacing=vt;exports.channelMaxLength=Ut;exports.cropAbif=Nt;exports.dataChannelRole=mt;exports.detectFormat=Xt;exports.ensureRawDataChannels=zt;exports.findEntries=at;exports.findEntry=N;exports.formatFasta=an;exports.formatFastq=cn;exports.formatQual=un;exports.getChannelMap=gt;exports.getConfidences=ht;exports.getConfidencesForVersion=z;exports.getDataChannel=lt;exports.getFwo=X;exports.getPositions=bt;exports.getPositionsForVersion=B;exports.getReverseComplemented=dt;exports.getSamplingRate=At;exports.getSequence=pt;exports.getSequenceForVersion=v;exports.hasData9To12Block=G;exports.hasSignals=Lt;exports.hasUsableQuality=fn;exports.insertEntrySorted=Q;exports.isFwoPermutation=K;exports.makeSeqRecord=C;exports.parseAbif=Ft;exports.parseAce=jt;exports.parseBam=Je;exports.parseClustal=Un;exports.parseEmbl=tn;exports.parseFasta=ge;exports.parseFastq=sn;exports.parseGenbank=pn;exports.parseGfa=je;exports.parseGff=Rn;exports.parseMega=Mn;exports.parseMsf=On;exports.parseNexus=kn;exports.parsePdb=zn;exports.parsePhylip=$n;exports.parsePir=_n;exports.parseSam=tt;exports.parseScf=cr;exports.parseStockholm=In;exports.parseSwissprot=nn;exports.readAbif=se;exports.setAveragePeakSpacing=Pt;exports.setConfidences=Dt;exports.setPositions=qt;exports.setSequence=Mt;exports.tagNameFromInt32=ye;exports.upsertEntry=M;exports.writeAbif=st;//# sourceMappingURL=index.js.map
|
|
14
14
|
//# sourceMappingURL=index.js.map
|