msa-parsers 5.7.3 → 5.9.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/dist/gff/interProToGFF.js +6 -2
- package/dist/gff/interProToGFF.js.map +1 -1
- package/dist/gff/interProToGFF.test.js +18 -0
- package/dist/gff/interProToGFF.test.js.map +1 -1
- package/dist/msa/A3mMSA.d.ts +0 -1
- package/dist/msa/A3mMSA.js +0 -4
- package/dist/msa/A3mMSA.js.map +1 -1
- package/dist/msa/A3mMSA.property.test.d.ts +1 -0
- package/dist/msa/A3mMSA.property.test.js +112 -0
- package/dist/msa/A3mMSA.property.test.js.map +1 -0
- package/dist/msa/BaseMSA.d.ts +11 -1
- package/dist/msa/BaseMSA.js +14 -0
- package/dist/msa/BaseMSA.js.map +1 -1
- package/dist/msa/ClustalMSA.d.ts +1 -1
- package/dist/msa/ClustalMSA.js +11 -6
- package/dist/msa/ClustalMSA.js.map +1 -1
- package/dist/msa/EmfMSA.d.ts +1 -1
- package/dist/msa/EmfMSA.js +11 -5
- package/dist/msa/EmfMSA.js.map +1 -1
- package/dist/msa/FastaMSA.d.ts +0 -1
- package/dist/msa/FastaMSA.js +0 -4
- package/dist/msa/FastaMSA.js.map +1 -1
- package/dist/msa/StockholmMSA.d.ts +0 -1
- package/dist/msa/StockholmMSA.js +0 -4
- package/dist/msa/StockholmMSA.js.map +1 -1
- package/dist/msa/index.test.js +63 -8
- package/dist/msa/index.test.js.map +1 -1
- package/dist/msa/parseNewick.d.ts +12 -58
- package/dist/msa/parseNewick.js +12 -104
- package/dist/msa/parseNewick.js.map +1 -1
- package/package.json +2 -1
- package/src/gff/interProToGFF.test.ts +20 -0
- package/src/gff/interProToGFF.ts +6 -2
- package/src/msa/A3mMSA.property.test.ts +135 -0
- package/src/msa/A3mMSA.ts +0 -5
- package/src/msa/BaseMSA.ts +19 -1
- package/src/msa/ClustalMSA.ts +12 -7
- package/src/msa/EmfMSA.ts +12 -6
- package/src/msa/FastaMSA.ts +0 -5
- package/src/msa/StockholmMSA.ts +0 -5
- package/src/msa/index.test.ts +76 -11
- package/src/msa/parseNewick.ts +16 -109
|
@@ -18,11 +18,15 @@ export function interProToGFF(results) {
|
|
|
18
18
|
const line = [
|
|
19
19
|
seqId,
|
|
20
20
|
'InterProScan',
|
|
21
|
-
|
|
21
|
+
// GFF-sourced annotations carry their original type; writing every
|
|
22
|
+
// feature back out as protein_match would turn an exon overlay into
|
|
23
|
+
// generic domains on the next read, losing the numbered-segment
|
|
24
|
+
// rendering and the gene arrowheads
|
|
25
|
+
entry.featureType ?? 'protein_match',
|
|
22
26
|
location.start,
|
|
23
27
|
location.end,
|
|
24
28
|
'.',
|
|
25
|
-
'.',
|
|
29
|
+
location.strand === undefined ? '.' : location.strand > 0 ? '+' : '-',
|
|
26
30
|
'.',
|
|
27
31
|
attributes,
|
|
28
32
|
].join('\t');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interProToGFF.js","sourceRoot":"","sources":["../../src/gff/interProToGFF.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA4C;IAE5C,MAAM,KAAK,GAAa,CAAC,iBAAiB,CAAC,CAAA;IAE3C,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAA;YACnC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAQ;YACV,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG;oBACjB,QAAQ,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;oBAC7C,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;oBAClD,eAAe,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;iBACvD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAEX,MAAM,IAAI,GAAG;oBACX,KAAK;oBACL,cAAc;oBACd,eAAe;
|
|
1
|
+
{"version":3,"file":"interProToGFF.js","sourceRoot":"","sources":["../../src/gff/interProToGFF.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,OAA4C;IAE5C,MAAM,KAAK,GAAa,CAAC,iBAAiB,CAAC,CAAA;IAE3C,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAA;YACnC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAQ;YACV,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG;oBACjB,QAAQ,kBAAkB,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;oBAC7C,kBAAkB,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;oBAClD,eAAe,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;iBACvD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAEX,MAAM,IAAI,GAAG;oBACX,KAAK;oBACL,cAAc;oBACd,mEAAmE;oBACnE,oEAAoE;oBACpE,gEAAgE;oBAChE,oCAAoC;oBACpC,KAAK,CAAC,WAAW,IAAI,eAAe;oBACpC,QAAQ,CAAC,KAAK;oBACd,QAAQ,CAAC,GAAG;oBACZ,GAAG;oBACH,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;oBACrE,GAAG;oBACH,UAAU;iBACX,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAEZ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA8B;IAClE,MAAM,UAAU,GAAwC,EAAE,CAAA;IAE1D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAChC,IAAI,KAAK,EAAE,CAAC;YACV,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,aAAa,CAAC,UAAU,CAAC,CAAA;AAClC,CAAC"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import { gffToInterProResults } from './gffToInterPro.js';
|
|
2
3
|
import { interProResponseToGFF, interProToGFF } from './interProToGFF.js';
|
|
4
|
+
import { parseGFF } from './parseGFF.js';
|
|
3
5
|
describe('interProToGFF', () => {
|
|
4
6
|
test('converts empty results', () => {
|
|
5
7
|
const gff = interProToGFF({});
|
|
@@ -118,6 +120,22 @@ describe('interProToGFF', () => {
|
|
|
118
120
|
expect(lines).toHaveLength(1);
|
|
119
121
|
expect(lines[0]).toBe('##gff-version 3');
|
|
120
122
|
});
|
|
123
|
+
test('round-trips the feature type and strand of a gene-structure overlay', () => {
|
|
124
|
+
const gff = [
|
|
125
|
+
'seq1\tRefSeq\tmRNA\t1\t99\t.\t+\t.\tName=NM_1',
|
|
126
|
+
'seq1\tRefSeq\texon\t1\t30\t.\t+\t.\tName=exon-1',
|
|
127
|
+
].join('\n');
|
|
128
|
+
const rows = interProToGFF(gffToInterProResults(parseGFF(gff)))
|
|
129
|
+
.split('\n')
|
|
130
|
+
.slice(1)
|
|
131
|
+
.map(l => l.split('\t'));
|
|
132
|
+
// the gene keeps its type and direction (it draws as an arrow); the exon
|
|
133
|
+
// keeps its type (it draws as a numbered segment, not a categorical domain)
|
|
134
|
+
expect(rows.map(r => [r[2], r[6]])).toEqual([
|
|
135
|
+
['mRNA', '+'],
|
|
136
|
+
['exon', '.'],
|
|
137
|
+
]);
|
|
138
|
+
});
|
|
121
139
|
test('URL-encodes special characters in attributes', () => {
|
|
122
140
|
const results = {
|
|
123
141
|
seq1: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interProToGFF.test.js","sourceRoot":"","sources":["../../src/gff/interProToGFF.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"interProToGFF.test.js","sourceRoot":"","sources":["../../src/gff/interProToGFF.test.ts"],"names":[],"mappings":"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"}
|
package/dist/msa/A3mMSA.d.ts
CHANGED
package/dist/msa/A3mMSA.js
CHANGED
|
@@ -92,10 +92,6 @@ export default class A3mMSA extends BaseMSA {
|
|
|
92
92
|
getRow(name) {
|
|
93
93
|
return this.MSA.seqdata[name] ?? '';
|
|
94
94
|
}
|
|
95
|
-
getWidth() {
|
|
96
|
-
const name = this.orderedNames[0];
|
|
97
|
-
return name === undefined ? 0 : this.getRow(name).length;
|
|
98
|
-
}
|
|
99
95
|
}
|
|
100
96
|
/**
|
|
101
97
|
* Expand A3M rows into a rectangular alignment: every insert slot is widened to
|
package/dist/msa/A3mMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A3mMSA.js","sourceRoot":"","sources":["../../src/msa/A3mMSA.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"A3mMSA.js","sourceRoot":"","sources":["../../src/msa/A3mMSA.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import A3mMSA from './A3mMSA.js';
|
|
3
|
+
/**
|
|
4
|
+
* Generative check on the one invariant that defines A3M expansion: match
|
|
5
|
+
* column k of every row must land at the same output column.
|
|
6
|
+
*
|
|
7
|
+
* Worth stating why the obvious invariants are not enough. The leading-insert
|
|
8
|
+
* bug this file was written for expanded query "ABC" / seq2 "aABC" to "A.BC-" /
|
|
9
|
+
* "-AABC" -- equal length, and each still ungaps back to its own input. Both of
|
|
10
|
+
* the cheap checks pass on output where every seq2 residue is a column away
|
|
11
|
+
* from its true partner. Only column correspondence catches it.
|
|
12
|
+
*
|
|
13
|
+
* Match residues and insert residues are drawn from disjoint alphabets so an
|
|
14
|
+
* insert stays identifiable once expansion has uppercased it: any W/X/Y/Z in an
|
|
15
|
+
* expanded row came from an insert, anything else is a match column or padding.
|
|
16
|
+
*/
|
|
17
|
+
const MATCH_ALPHABET = 'ACDEFGHIKL';
|
|
18
|
+
const INSERT_ALPHABET = 'wxyz';
|
|
19
|
+
const INSERT_UPPER = new Set(INSERT_ALPHABET.toUpperCase());
|
|
20
|
+
// small LCG so a failure reproduces from the seed printed in the test name
|
|
21
|
+
function makeRng(seed) {
|
|
22
|
+
let state = seed;
|
|
23
|
+
return () => {
|
|
24
|
+
state = (state * 1103515245 + 12345) % 2147483648;
|
|
25
|
+
return state / 2147483648;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function generateRow(rng, numMatchCols) {
|
|
29
|
+
const matches = [];
|
|
30
|
+
let raw = '';
|
|
31
|
+
for (let col = 0; col <= numMatchCols; col++) {
|
|
32
|
+
// an insert run BEFORE this match column (col === numMatchCols is the
|
|
33
|
+
// trailing slot); col 0 is the leading case the bug lived in
|
|
34
|
+
if (rng() < 0.3) {
|
|
35
|
+
const len = 1 + Math.floor(rng() * 3);
|
|
36
|
+
for (let i = 0; i < len; i++) {
|
|
37
|
+
raw += INSERT_ALPHABET[Math.floor(rng() * INSERT_ALPHABET.length)];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (col < numMatchCols) {
|
|
41
|
+
// '-' is a deletion, which still occupies a match column
|
|
42
|
+
const ch = rng() < 0.2
|
|
43
|
+
? '-'
|
|
44
|
+
: MATCH_ALPHABET[Math.floor(rng() * MATCH_ALPHABET.length)];
|
|
45
|
+
matches.push(ch);
|
|
46
|
+
raw += ch;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { raw, matches };
|
|
50
|
+
}
|
|
51
|
+
// Output indices of the match grid. A match column holds a residue or '-';
|
|
52
|
+
// insert slots hold uppercased insert residues or the '.' padding that widens
|
|
53
|
+
// them, so both of those are excluded.
|
|
54
|
+
function matchColumnIndices(expanded) {
|
|
55
|
+
const indices = [];
|
|
56
|
+
for (let i = 0; i < expanded.length; i++) {
|
|
57
|
+
const ch = expanded[i];
|
|
58
|
+
if (!INSERT_UPPER.has(ch) && ch !== '.') {
|
|
59
|
+
indices.push(i);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return indices;
|
|
63
|
+
}
|
|
64
|
+
describe('A3mMSA expansion invariants', () => {
|
|
65
|
+
// A desync needs some rows to carry a leading insert and others not to, so no
|
|
66
|
+
// single seed is guaranteed to produce one -- on the pre-fix parser this set
|
|
67
|
+
// fails 8 of 12. Keep enough seeds that the class cannot slip through.
|
|
68
|
+
for (const seed of [
|
|
69
|
+
1, 7, 42, 99, 256, 1337, 4096, 8675, 31337, 65536, 90210, 123456,
|
|
70
|
+
]) {
|
|
71
|
+
test(`match columns stay in register (seed ${seed})`, () => {
|
|
72
|
+
const rng = makeRng(seed);
|
|
73
|
+
const numMatchCols = 3 + Math.floor(rng() * 12);
|
|
74
|
+
const numRows = 2 + Math.floor(rng() * 5);
|
|
75
|
+
const rows = Array.from({ length: numRows }, () => generateRow(rng, numMatchCols));
|
|
76
|
+
const names = rows.map((_, i) => `seq${i}`);
|
|
77
|
+
const a3m = rows.map((r, i) => `>${names[i]}\n${r.raw}`).join('\n');
|
|
78
|
+
const msa = new A3mMSA(a3m);
|
|
79
|
+
const expanded = names.map(n => msa.getRow(n));
|
|
80
|
+
// every row expands to the same width
|
|
81
|
+
expect(new Set(expanded.map(e => e.length)).size).toBe(1);
|
|
82
|
+
// the match grid sits at identical output columns in every row
|
|
83
|
+
const grids = expanded.map(e => matchColumnIndices(e));
|
|
84
|
+
for (const grid of grids) {
|
|
85
|
+
expect(grid).toEqual(grids[0]);
|
|
86
|
+
}
|
|
87
|
+
// and each row's match characters survive, in order, at those columns
|
|
88
|
+
for (const [i, grid] of grids.entries()) {
|
|
89
|
+
expect(grid).toHaveLength(numMatchCols);
|
|
90
|
+
expect(grid.map(col => expanded[i][col])).toEqual(rows[i].matches);
|
|
91
|
+
}
|
|
92
|
+
// inserts are never lost: each row keeps its own insert residues in order
|
|
93
|
+
for (const [i, e] of expanded.entries()) {
|
|
94
|
+
let keptInserts = '';
|
|
95
|
+
for (let c = 0; c < e.length; c++) {
|
|
96
|
+
if (INSERT_UPPER.has(e[c])) {
|
|
97
|
+
keptInserts += e[c];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const raw = rows[i].raw;
|
|
101
|
+
let sourceInserts = '';
|
|
102
|
+
for (let c = 0; c < raw.length; c++) {
|
|
103
|
+
if (INSERT_ALPHABET.includes(raw[c])) {
|
|
104
|
+
sourceInserts += raw[c].toUpperCase();
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
expect(keptInserts).toBe(sourceInserts);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
//# sourceMappingURL=A3mMSA.property.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"A3mMSA.property.test.js","sourceRoot":"","sources":["../../src/msa/A3mMSA.property.test.ts"],"names":[],"mappings":"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"}
|
package/dist/msa/BaseMSA.d.ts
CHANGED
|
@@ -2,8 +2,18 @@ import type { NodeWithIds } from '../types.ts';
|
|
|
2
2
|
export default abstract class BaseMSA {
|
|
3
3
|
abstract getMSA(): unknown;
|
|
4
4
|
abstract getRow(name: string): string;
|
|
5
|
-
abstract getWidth(): number;
|
|
6
5
|
abstract getNames(): string[];
|
|
6
|
+
private width?;
|
|
7
|
+
/**
|
|
8
|
+
* Column count of the alignment: the length of its widest row.
|
|
9
|
+
*
|
|
10
|
+
* Not the first row's length. Ragged input is real -- a hand-edited fasta, or
|
|
11
|
+
* an aligner that stops a row at its last residue -- and taking row 0 makes
|
|
12
|
+
* every column past it unreachable when row 0 is the short one. The viewer's
|
|
13
|
+
* gap analysis already defines the column count this way, so anything else
|
|
14
|
+
* disagrees with it.
|
|
15
|
+
*/
|
|
16
|
+
getWidth(): number;
|
|
7
17
|
getTree(): NodeWithIds;
|
|
8
18
|
getRowData(_name: string): {
|
|
9
19
|
name?: string;
|
package/dist/msa/BaseMSA.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
export default class BaseMSA {
|
|
2
|
+
width;
|
|
3
|
+
/**
|
|
4
|
+
* Column count of the alignment: the length of its widest row.
|
|
5
|
+
*
|
|
6
|
+
* Not the first row's length. Ragged input is real -- a hand-edited fasta, or
|
|
7
|
+
* an aligner that stops a row at its last residue -- and taking row 0 makes
|
|
8
|
+
* every column past it unreachable when row 0 is the short one. The viewer's
|
|
9
|
+
* gap analysis already defines the column count this way, so anything else
|
|
10
|
+
* disagrees with it.
|
|
11
|
+
*/
|
|
12
|
+
getWidth() {
|
|
13
|
+
this.width ??= this.getNames().reduce((max, name) => Math.max(max, this.getRow(name).length), 0);
|
|
14
|
+
return this.width;
|
|
15
|
+
}
|
|
2
16
|
getTree() {
|
|
3
17
|
return {
|
|
4
18
|
id: 'root',
|
package/dist/msa/BaseMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseMSA.js","sourceRoot":"","sources":["../../src/msa/BaseMSA.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,OAAO;
|
|
1
|
+
{"version":3,"file":"BaseMSA.js","sourceRoot":"","sources":["../../src/msa/BaseMSA.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,OAAO;IAK3B,KAAK,CAAS;IAEtB;;;;;;;;OAQG;IACH,QAAQ;QACN,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EACtD,CAAC,CACF,CAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,OAAO;QACL,OAAO;YACL,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,IAAI;gBACR,QAAQ,EAAE,EAAE;gBACZ,IAAI;aACL,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,UAAU,CACR,KAAa;QAEb,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,aAAa;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IAED,SAAS;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,YAAY;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,2BAA2B;QAC7B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,MAAM;QAMR,OAAO,EAAE,CAAA;IACX,CAAC;CACF"}
|
package/dist/msa/ClustalMSA.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.ts';
|
|
2
2
|
export default class ClustalMSA extends BaseMSA {
|
|
3
3
|
private MSA;
|
|
4
|
+
private byName;
|
|
4
5
|
constructor(text: string);
|
|
5
6
|
getMSA(): {
|
|
6
7
|
consensus: string;
|
|
@@ -14,7 +15,6 @@ export default class ClustalMSA extends BaseMSA {
|
|
|
14
15
|
};
|
|
15
16
|
};
|
|
16
17
|
getRow(name: string): string;
|
|
17
|
-
getWidth(): number;
|
|
18
18
|
getHeader(): {
|
|
19
19
|
info: string;
|
|
20
20
|
version: string | undefined;
|
package/dist/msa/ClustalMSA.js
CHANGED
|
@@ -2,20 +2,25 @@ import { parse } from 'clustal-js';
|
|
|
2
2
|
import BaseMSA from './BaseMSA.js';
|
|
3
3
|
export default class ClustalMSA extends BaseMSA {
|
|
4
4
|
MSA;
|
|
5
|
+
// getRow is called once per leaf on every render pass, so a linear scan of
|
|
6
|
+
// alns makes a full pass quadratic in the row count
|
|
7
|
+
byName;
|
|
5
8
|
constructor(text) {
|
|
6
9
|
super();
|
|
7
10
|
this.MSA = parse(text);
|
|
11
|
+
this.byName = new Map();
|
|
12
|
+
for (const aln of this.MSA.alns) {
|
|
13
|
+
// first wins, as the find() this replaced did
|
|
14
|
+
if (!this.byName.has(aln.id)) {
|
|
15
|
+
this.byName.set(aln.id, aln.seq);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
8
18
|
}
|
|
9
19
|
getMSA() {
|
|
10
20
|
return this.MSA;
|
|
11
21
|
}
|
|
12
22
|
getRow(name) {
|
|
13
|
-
return this.
|
|
14
|
-
}
|
|
15
|
-
getWidth() {
|
|
16
|
-
// 0 for an empty alignment (e.g. unrecognized text routed here as fallback)
|
|
17
|
-
// rather than crashing on alns[0]
|
|
18
|
-
return this.MSA.alns[0]?.seq.length ?? 0;
|
|
23
|
+
return this.byName.get(name) ?? '';
|
|
19
24
|
}
|
|
20
25
|
getHeader() {
|
|
21
26
|
return this.MSA.header;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClustalMSA.js","sourceRoot":"","sources":["../../src/msa/ClustalMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IACrC,GAAG,CAA0B;IAErC,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"ClustalMSA.js","sourceRoot":"","sources":["../../src/msa/ClustalMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IACrC,GAAG,CAA0B;IAErC,2EAA2E;IAC3E,oDAAoD;IAC5C,MAAM,CAAqB;IAEnC,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAChC,8CAA8C;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAA;IACxB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACzC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAA;IAC3B,CAAC;CACF"}
|
package/dist/msa/EmfMSA.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.ts';
|
|
2
2
|
export default class EmfMSA extends BaseMSA {
|
|
3
3
|
private MSA;
|
|
4
|
+
private byName;
|
|
4
5
|
constructor(text: string);
|
|
5
6
|
getMSA(): {
|
|
6
7
|
species: string;
|
|
@@ -14,6 +15,5 @@ export default class EmfMSA extends BaseMSA {
|
|
|
14
15
|
seq: string;
|
|
15
16
|
}[];
|
|
16
17
|
getRow(name: string): string;
|
|
17
|
-
getWidth(): number;
|
|
18
18
|
getNames(): string[];
|
|
19
19
|
}
|
package/dist/msa/EmfMSA.js
CHANGED
|
@@ -2,19 +2,25 @@ import { parseEmfAln } from 'emf-js';
|
|
|
2
2
|
import BaseMSA from './BaseMSA.js';
|
|
3
3
|
export default class EmfMSA extends BaseMSA {
|
|
4
4
|
MSA;
|
|
5
|
+
// getRow is called once per leaf on every render pass, so a linear scan of
|
|
6
|
+
// the alignment makes a full pass quadratic in the row count
|
|
7
|
+
byName;
|
|
5
8
|
constructor(text) {
|
|
6
9
|
super();
|
|
7
10
|
this.MSA = parseEmfAln(text);
|
|
11
|
+
this.byName = new Map();
|
|
12
|
+
for (const aln of this.MSA) {
|
|
13
|
+
// first wins, as the find() this replaced did
|
|
14
|
+
if (!this.byName.has(aln.protein)) {
|
|
15
|
+
this.byName.set(aln.protein, aln.seq);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
8
18
|
}
|
|
9
19
|
getMSA() {
|
|
10
20
|
return this.MSA;
|
|
11
21
|
}
|
|
12
22
|
getRow(name) {
|
|
13
|
-
return this.
|
|
14
|
-
}
|
|
15
|
-
getWidth() {
|
|
16
|
-
// 0 for an empty alignment rather than crashing on MSA[0]
|
|
17
|
-
return this.MSA[0]?.seq.length ?? 0;
|
|
23
|
+
return this.byName.get(name) ?? '';
|
|
18
24
|
}
|
|
19
25
|
getNames() {
|
|
20
26
|
return this.MSA.map(aln => aln.protein);
|
package/dist/msa/EmfMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmfMSA.js","sourceRoot":"","sources":["../../src/msa/EmfMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACjC,GAAG,CAAgC;IAE3C,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"EmfMSA.js","sourceRoot":"","sources":["../../src/msa/EmfMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACjC,GAAG,CAAgC;IAE3C,2EAA2E;IAC3E,6DAA6D;IACrD,MAAM,CAAqB;IAEnC,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;QAC5B,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAE,CAAA;QACvB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,8CAA8C;YAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACpC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACzC,CAAC;CACF"}
|
package/dist/msa/FastaMSA.d.ts
CHANGED
package/dist/msa/FastaMSA.js
CHANGED
|
@@ -30,9 +30,5 @@ export default class FastaMSA extends BaseMSA {
|
|
|
30
30
|
this.MSA.seqdata[this.MSA.colonNormalized[name] ?? ''] ??
|
|
31
31
|
'');
|
|
32
32
|
}
|
|
33
|
-
getWidth() {
|
|
34
|
-
const name = this.orderedNames[0];
|
|
35
|
-
return name === undefined ? 0 : this.getRow(name).length;
|
|
36
|
-
}
|
|
37
33
|
}
|
|
38
34
|
//# sourceMappingURL=FastaMSA.js.map
|
package/dist/msa/FastaMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FastaMSA.js","sourceRoot":"","sources":["../../src/msa/FastaMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IACnC,GAAG,CAGV;IAED,yEAAyE;IACzE,0EAA0E;IAClE,YAAY,CAAU;IAE9B,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,OAAO,GAA2B,EAAE,CAAA;QAC1C,MAAM,eAAe,GAA2B,EAAE,CAAA;QAElD,KAAK,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;YACjB,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtD,EAAE,CACH,CAAA;IACH,CAAC;
|
|
1
|
+
{"version":3,"file":"FastaMSA.js","sourceRoot":"","sources":["../../src/msa/FastaMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IACnC,GAAG,CAGV;IAED,yEAAyE;IACzE,0EAA0E;IAClE,YAAY,CAAU;IAE9B,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACvC,MAAM,OAAO,GAA2B,EAAE,CAAA;QAC1C,MAAM,eAAe,GAA2B,EAAE,CAAA;QAElD,KAAK,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;YAClC,OAAO,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;YACjB,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;YAC/C,CAAC;QACH,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1C,IAAI,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,CAAA;IACzC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtD,EAAE,CACH,CAAA;IACH,CAAC;CACF"}
|
|
@@ -7,7 +7,6 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
7
7
|
constructor(text: string, currentAlignment: number);
|
|
8
8
|
getMSA(): StockholmData;
|
|
9
9
|
getRow(name: string): string;
|
|
10
|
-
getWidth(): number;
|
|
11
10
|
get alignmentNames(): string[];
|
|
12
11
|
getHeader(): {
|
|
13
12
|
General: Record<string, string[]>;
|
package/dist/msa/StockholmMSA.js
CHANGED
|
@@ -21,10 +21,6 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
21
21
|
getRow(name) {
|
|
22
22
|
return this.MSA.seqdata[name] ?? '';
|
|
23
23
|
}
|
|
24
|
-
getWidth() {
|
|
25
|
-
const name = this.MSA.seqname[0];
|
|
26
|
-
return name === undefined ? 0 : this.getRow(name).length;
|
|
27
|
-
}
|
|
28
24
|
get alignmentNames() {
|
|
29
25
|
return this.data.map((aln, idx) => aln.gf.DE?.[0] ?? `Alignment ${idx + 1}`);
|
|
30
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StockholmMSA.js","sourceRoot":"","sources":["../../src/msa/StockholmMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAK/C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IACvC,IAAI,CAAiB;IACrB,GAAG,CAAe;IAE1B,YAAY,IAAY,EAAE,gBAAwB;QAChD,KAAK,EAAE,CAAA;QACP,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,MAAM,GAAG,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;QAC3C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAA;QAC1D,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,GAAG,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IACrC,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"StockholmMSA.js","sourceRoot":"","sources":["../../src/msa/StockholmMSA.ts"],"names":[],"mappings":"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"}
|
package/dist/msa/index.test.js
CHANGED
|
@@ -100,6 +100,31 @@ describe('FastaMSA duplicate deflines', () => {
|
|
|
100
100
|
expect(msa.getRow('a')).toBe('AAAAA');
|
|
101
101
|
});
|
|
102
102
|
});
|
|
103
|
+
describe('ClustalMSA row lookup', () => {
|
|
104
|
+
const clustal = `CLUSTAL W (1.83) multiple sequence alignment
|
|
105
|
+
|
|
106
|
+
seq1 ACDEFGHIKL
|
|
107
|
+
seq2 MNPQRSTVWY
|
|
108
|
+
`;
|
|
109
|
+
test('getRow returns the right row', () => {
|
|
110
|
+
const msa = new ClustalMSA(clustal);
|
|
111
|
+
expect(msa.getRow('seq1')).toBe('ACDEFGHIKL');
|
|
112
|
+
expect(msa.getRow('seq2')).toBe('MNPQRSTVWY');
|
|
113
|
+
expect(msa.getRow('nope')).toBe('');
|
|
114
|
+
});
|
|
115
|
+
test('a repeated name resolves to the first row', () => {
|
|
116
|
+
// The name->row map replaced a find(), which returned the first match;
|
|
117
|
+
// building the map naively would silently flip this to the last. Only
|
|
118
|
+
// malformed input reaches here -- clustal-js already merges the repeated
|
|
119
|
+
// names of a normal interleaved file into one aln per id.
|
|
120
|
+
const dup = `CLUSTAL W (1.83) multiple sequence alignment
|
|
121
|
+
|
|
122
|
+
seq1 AAAAAAAAAA
|
|
123
|
+
seq1 CCCCCCCCCC
|
|
124
|
+
`;
|
|
125
|
+
expect(new ClustalMSA(dup).getRow('seq1')).toBe('AAAAAAAAAA');
|
|
126
|
+
});
|
|
127
|
+
});
|
|
103
128
|
describe('StockholmMSA row order', () => {
|
|
104
129
|
test('preserves file order for numeric sequence names', () => {
|
|
105
130
|
// object key order hoists integer-like keys, so Object.keys(seqdata) would
|
|
@@ -114,28 +139,48 @@ describe('StockholmMSA row order', () => {
|
|
|
114
139
|
expect(msa.getRow('10')).toBe('ACDEF');
|
|
115
140
|
});
|
|
116
141
|
});
|
|
142
|
+
const leafNames = (tree) => (tree.children ?? []).map(c => c.name);
|
|
117
143
|
describe('parseNewick single-quoted names', () => {
|
|
118
144
|
test('parses quoted name containing a colon', () => {
|
|
119
145
|
const tree = parseNewick("('EU105457.1|chr09:67680268..67675529_LTR/Copia':0.5,seq2:0.3);");
|
|
120
|
-
const names = tree
|
|
146
|
+
const names = leafNames(tree);
|
|
121
147
|
expect(names).toContain('EU105457.1|chr09:67680268..67675529_LTR/Copia');
|
|
122
148
|
});
|
|
123
149
|
test('parses quoted name containing a single quote', () => {
|
|
124
150
|
const tree = parseNewick("('it''s a name':0.1,seq2:0.2);");
|
|
125
|
-
const names = tree
|
|
151
|
+
const names = leafNames(tree);
|
|
126
152
|
expect(names).toContain("it's a name");
|
|
127
153
|
});
|
|
128
154
|
test('unquoted names still parse correctly', () => {
|
|
129
155
|
const tree = parseNewick('(seq1:0.1,seq2:0.2);');
|
|
130
|
-
const names = tree
|
|
156
|
+
const names = leafNames(tree);
|
|
131
157
|
expect(names).toEqual(['seq1', 'seq2']);
|
|
132
158
|
});
|
|
133
|
-
test('
|
|
134
|
-
//
|
|
135
|
-
//
|
|
159
|
+
test('a quote covering only part of a name yields the quoted run', () => {
|
|
160
|
+
// malformed -- a label is quoted or it isn't -- so the only requirement is
|
|
161
|
+
// that it degrades to something. This used to read 'fooa b': the parser
|
|
162
|
+
// substituted a __Q0__ placeholder for the quoted run and spliced it back,
|
|
163
|
+
// and the test existed to pin that the raw marker didn't survive into the
|
|
164
|
+
// name. Nothing substitutes anything now, so the hazard is gone and the
|
|
165
|
+
// scanner just lets the quoted run own the token.
|
|
136
166
|
const tree = parseNewick("(foo'a b':0.1,seq2:0.2);");
|
|
137
|
-
const names = tree
|
|
138
|
-
expect(names).toEqual(['
|
|
167
|
+
const names = leafNames(tree);
|
|
168
|
+
expect(names).toEqual(['a b', 'seq2']);
|
|
169
|
+
});
|
|
170
|
+
test('an unquoted colon is a branch length, which is why names get quoted', () => {
|
|
171
|
+
// not a regression and not fixable: ':' is the grammar's length delimiter,
|
|
172
|
+
// so a region-style name has to be quoted to survive. Pinned because it is
|
|
173
|
+
// the reason the quoting above is load-bearing rather than cosmetic.
|
|
174
|
+
const tree = parseNewick('(chr1:1-100,seq2:0.2);');
|
|
175
|
+
const names = leafNames(tree);
|
|
176
|
+
expect(names).toEqual(['chr1', 'seq2']);
|
|
177
|
+
expect(tree.children[0].length).toBe(1);
|
|
178
|
+
});
|
|
179
|
+
test('names a tree that is a single bare node', () => {
|
|
180
|
+
// the old parser looked at the preceding token to decide whether a label was
|
|
181
|
+
// a name, and with nothing preceding it dropped the name entirely -- so a
|
|
182
|
+
// one-row tree produced a root leaf matching no row
|
|
183
|
+
expect(parseNewick('A;').name).toBe('A');
|
|
139
184
|
});
|
|
140
185
|
});
|
|
141
186
|
describe('parseNewick unnamed nodes', () => {
|
|
@@ -167,4 +212,14 @@ describe('getUngappedSequence', () => {
|
|
|
167
212
|
expect(getUngappedSequence('ACDEF')).toBe('ACDEF');
|
|
168
213
|
});
|
|
169
214
|
});
|
|
215
|
+
describe('getWidth', () => {
|
|
216
|
+
test('is the widest row, not the first', () => {
|
|
217
|
+
// a ragged fasta whose first row is the short one: taking row 0 would make
|
|
218
|
+
// every column past it unreachable in the viewer
|
|
219
|
+
expect(parseMSA('>a\nACGT\n>b\nACGTACGTAC').getWidth()).toBe(10);
|
|
220
|
+
});
|
|
221
|
+
test('is 0 when there are no rows', () => {
|
|
222
|
+
expect(parseMSA('>').getWidth()).toBe(0);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
170
225
|
//# sourceMappingURL=index.test.js.map
|