msa-parsers 5.3.0 → 5.4.1
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/parseGFF.js +9 -1
- package/dist/gff/parseGFF.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/msa/A3mMSA.js +8 -0
- package/dist/msa/A3mMSA.js.map +1 -1
- package/dist/msa/FastaMSA.d.ts +1 -0
- package/dist/msa/FastaMSA.js +7 -3
- package/dist/msa/FastaMSA.js.map +1 -1
- package/dist/msa/StockholmMSA.js +17 -3
- package/dist/msa/StockholmMSA.js.map +1 -1
- package/dist/msa/impgIntegration.test.d.ts +1 -0
- package/dist/msa/impgIntegration.test.js +49 -0
- package/dist/msa/impgIntegration.test.js.map +1 -0
- package/dist/msa/index.d.ts +2 -1
- package/dist/msa/index.js +20 -1
- package/dist/msa/index.js.map +1 -1
- package/dist/msa/index.test.js +28 -0
- package/dist/msa/index.test.js.map +1 -1
- package/dist/msa/stockholmParser.js +16 -30
- package/dist/msa/stockholmParser.js.map +1 -1
- package/package.json +2 -2
- package/src/gff/parseGFF.ts +9 -1
- package/src/index.ts +1 -1
- package/src/msa/A3mMSA.ts +9 -0
- package/src/msa/FastaMSA.ts +8 -3
- package/src/msa/StockholmMSA.ts +18 -4
- package/src/msa/impgIntegration.test.ts +57 -0
- package/src/msa/index.test.ts +32 -0
- package/src/msa/index.ts +26 -1
- package/src/msa/stockholmParser.ts +20 -30
package/dist/gff/parseGFF.js
CHANGED
|
@@ -20,9 +20,17 @@ function parseAttributes(col9) {
|
|
|
20
20
|
const eq = f.indexOf('=');
|
|
21
21
|
const key = (eq === -1 ? f : f.slice(0, eq)).trim();
|
|
22
22
|
const val = eq === -1 ? undefined : f.slice(eq + 1);
|
|
23
|
+
// split on comma (the GFF3 multi-value separator) BEFORE decoding, so a
|
|
24
|
+
// literal comma encoded as %2C survives the split and isn't mistaken
|
|
25
|
+
// for a separator
|
|
23
26
|
return [
|
|
24
27
|
key,
|
|
25
|
-
val
|
|
28
|
+
val
|
|
29
|
+
? val
|
|
30
|
+
.split(',')
|
|
31
|
+
.map(v => safeDecode(v).trim())
|
|
32
|
+
.join(' ')
|
|
33
|
+
: undefined,
|
|
26
34
|
];
|
|
27
35
|
})
|
|
28
36
|
.filter(([key]) => key !== ''));
|
package/dist/gff/parseGFF.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parseGFF.js","sourceRoot":"","sources":["../../src/gff/parseGFF.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,kEAAkE;AAClE,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,GAAG,CAAC,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,MAAM,CAAC,WAAW,CACvB,IAAI;SACD,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACzB,MAAM,GAAG,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACnD,MAAM,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACnD,OAAO;YACL,GAAG;YACH,GAAG,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"parseGFF.js","sourceRoot":"","sources":["../../src/gff/parseGFF.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from './types.ts';
|
|
2
2
|
export { generateNodeIds } from './util.ts';
|
|
3
3
|
export { A3mMSA, ClustalMSA, EmfMSA, FastaMSA, StockholmMSA, getUngappedSequence, parseEmfTree, parseMSA, parseNewick, stockholmSniff, } from './msa/index.ts';
|
|
4
|
-
export type { MSAParserType } from './msa/index.ts';
|
|
4
|
+
export type { MSAFormat, MSAParserType } from './msa/index.ts';
|
|
5
5
|
export { gffToInterProResponse, gffToInterProResults, interProResponseToGFF, interProToGFF, parseGFF, } from './gff/index.ts';
|
package/dist/msa/A3mMSA.js
CHANGED
|
@@ -76,6 +76,14 @@ export default class A3mMSA extends BaseMSA {
|
|
|
76
76
|
if (seqs.length < 2) {
|
|
77
77
|
return false;
|
|
78
78
|
}
|
|
79
|
+
// A true aligned FASTA (e.g. impg's fasta-aln output from soft-masked
|
|
80
|
+
// references) has all rows the same total length. A3M's defining feature is
|
|
81
|
+
// variable-length rows, since lowercase inserts live outside the fixed match
|
|
82
|
+
// grid. So equal-length rows are an alignment, not A3M, even when lowercase
|
|
83
|
+
// soft-masking is present.
|
|
84
|
+
if (new Set(seqs.map(s => s.length)).size === 1) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
79
87
|
let hasLowercase = false;
|
|
80
88
|
let firstMatchLen = -1;
|
|
81
89
|
let sameMatchLength = true;
|
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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"}
|
package/dist/msa/FastaMSA.d.ts
CHANGED
package/dist/msa/FastaMSA.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import BaseMSA from "./BaseMSA.js";
|
|
2
2
|
export default class FastaMSA extends BaseMSA {
|
|
3
3
|
MSA;
|
|
4
|
+
// explicit insertion-ordered ids: object key order reorders integer-like
|
|
5
|
+
// keys (e.g. a numeric ">123" defline) to the front, scrambling row order
|
|
6
|
+
orderedNames = [];
|
|
4
7
|
constructor(text) {
|
|
5
8
|
super();
|
|
6
9
|
const seqdata = {};
|
|
@@ -18,6 +21,7 @@ export default class FastaMSA extends BaseMSA {
|
|
|
18
21
|
const id = spaceIdx === -1 ? defLine : defLine.slice(0, spaceIdx);
|
|
19
22
|
if (id) {
|
|
20
23
|
seqdata[id] = entry.slice(newlineIdx + 1).replaceAll(/\s/g, '');
|
|
24
|
+
this.orderedNames.push(id);
|
|
21
25
|
if (id.includes(':')) {
|
|
22
26
|
colonNormalized[id.replaceAll(':', '_')] = id;
|
|
23
27
|
}
|
|
@@ -29,7 +33,7 @@ export default class FastaMSA extends BaseMSA {
|
|
|
29
33
|
return this.MSA;
|
|
30
34
|
}
|
|
31
35
|
getNames() {
|
|
32
|
-
return
|
|
36
|
+
return this.orderedNames;
|
|
33
37
|
}
|
|
34
38
|
getRow(name) {
|
|
35
39
|
return (this.MSA.seqdata[name] ??
|
|
@@ -37,8 +41,8 @@ export default class FastaMSA extends BaseMSA {
|
|
|
37
41
|
'');
|
|
38
42
|
}
|
|
39
43
|
getWidth() {
|
|
40
|
-
const name =
|
|
41
|
-
return this.getRow(name).length;
|
|
44
|
+
const name = this.orderedNames[0];
|
|
45
|
+
return name === undefined ? 0 : this.getRow(name).length;
|
|
42
46
|
}
|
|
43
47
|
}
|
|
44
48
|
//# 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;AAElC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IACnC,GAAG,CAGV;IAED,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAA2B,EAAE,CAAA;QAC1C,MAAM,eAAe,GAA2B,EAAE,CAAA;QAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,SAAQ;YACV,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACtC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtB,SAAQ;YACV,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACjE,IAAI,EAAE,EAAE,CAAC;gBACP,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBAC/D,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QACD,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,
|
|
1
|
+
{"version":3,"file":"FastaMSA.js","sourceRoot":"","sources":["../../src/msa/FastaMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IACnC,GAAG,CAGV;IAED,yEAAyE;IACzE,0EAA0E;IAClE,YAAY,GAAa,EAAE,CAAA;IAEnC,YAAY,IAAY;QACtB,KAAK,EAAE,CAAA;QACP,MAAM,OAAO,GAA2B,EAAE,CAAA;QAC1C,MAAM,eAAe,GAA2B,EAAE,CAAA;QAClD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,SAAQ;YACV,CAAC;YACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YACtC,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;gBACtB,SAAQ;YACV,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;YAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YACrC,MAAM,EAAE,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAA;YACjE,IAAI,EAAE,EAAE,CAAC;gBACP,OAAO,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;gBAC/D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAC1B,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrB,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;QACD,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;IAED,QAAQ;QACN,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAA;IAC1D,CAAC;CACF"}
|
package/dist/msa/StockholmMSA.js
CHANGED
|
@@ -9,7 +9,11 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
9
9
|
super();
|
|
10
10
|
const res = parseAll(text);
|
|
11
11
|
this.data = res;
|
|
12
|
-
|
|
12
|
+
const aln = res[currentAlignment] ?? res[0];
|
|
13
|
+
if (!aln) {
|
|
14
|
+
throw new Error('No alignments found in Stockholm file');
|
|
15
|
+
}
|
|
16
|
+
this.MSA = aln;
|
|
13
17
|
}
|
|
14
18
|
getMSA() {
|
|
15
19
|
return this.MSA;
|
|
@@ -19,7 +23,7 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
19
23
|
}
|
|
20
24
|
getWidth() {
|
|
21
25
|
const name = Object.keys(this.MSA.seqdata)[0];
|
|
22
|
-
return this.getRow(name).length;
|
|
26
|
+
return name === undefined ? 0 : this.getRow(name).length;
|
|
23
27
|
}
|
|
24
28
|
get alignmentNames() {
|
|
25
29
|
return this.data.map((aln, idx) => aln.gf.DE?.[0] ?? `Alignment ${idx + 1}`);
|
|
@@ -85,9 +89,19 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
85
89
|
id: 'secondaryStruct',
|
|
86
90
|
name: 'Secondary-structure',
|
|
87
91
|
data: this.secondaryStructureConsensus,
|
|
92
|
+
// WUSS notation pairs base-paired columns as open/close brackets of
|
|
93
|
+
// several nesting types (<>, (), [], {}); color all opens one way and
|
|
94
|
+
// closes the other so every helix (e.g. the tRNA acceptor stem, which
|
|
95
|
+
// is written with parens) is highlighted, not just the <> arms.
|
|
88
96
|
customColorScheme: {
|
|
89
|
-
'>': 'pink',
|
|
90
97
|
'<': 'lightblue',
|
|
98
|
+
'(': 'lightblue',
|
|
99
|
+
'[': 'lightblue',
|
|
100
|
+
'{': 'lightblue',
|
|
101
|
+
'>': 'pink',
|
|
102
|
+
')': 'pink',
|
|
103
|
+
']': 'pink',
|
|
104
|
+
'}': 'pink',
|
|
91
105
|
},
|
|
92
106
|
},
|
|
93
107
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StockholmMSA.js","sourceRoot":"","sources":["../../src/msa/StockholmMSA.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,OAAO,MAAM,cAAc,CAAA;AAKlC,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,
|
|
1
|
+
{"version":3,"file":"StockholmMSA.js","sourceRoot":"","sources":["../../src/msa/StockholmMSA.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest';
|
|
2
|
+
import A3mMSA from "./A3mMSA.js";
|
|
3
|
+
import FastaMSA from "./FastaMSA.js";
|
|
4
|
+
import { parseMSA } from "./index.js";
|
|
5
|
+
// impg (https://github.com/pangenome/impg) pipes `impg query -o fasta-aln` into
|
|
6
|
+
// scripts/faln2html.py, which feeds the FASTA string to
|
|
7
|
+
// MSAModelF().create({ data: { msa } }). These tests pin the behavior that
|
|
8
|
+
// integration relies on.
|
|
9
|
+
describe('impg fasta-aln integration', () => {
|
|
10
|
+
// PanSN-style names + region coordinates with colons, dash gaps, uppercase
|
|
11
|
+
const block = `>HG002#1#chr1:1000-1040
|
|
12
|
+
ACGTACGT--ACGTNNNNACGTACGTACGTACGTACGT
|
|
13
|
+
>HG003#1#chr1:1000-1040
|
|
14
|
+
ACGTAC-TGGACGTNNNNACGTAC--ACGTACGTACGT
|
|
15
|
+
>CHM13#0#chr1:1000-1040
|
|
16
|
+
ACGTACGTGGACGTNNNNACGT----ACGTACGTACGT`;
|
|
17
|
+
test('uppercase block is parsed as FASTA, not A3M/Clustal', () => {
|
|
18
|
+
const msa = parseMSA(block);
|
|
19
|
+
expect(msa).toBeInstanceOf(FastaMSA);
|
|
20
|
+
expect(msa.getNames()).toEqual([
|
|
21
|
+
'HG002#1#chr1:1000-1040',
|
|
22
|
+
'HG003#1#chr1:1000-1040',
|
|
23
|
+
'CHM13#0#chr1:1000-1040',
|
|
24
|
+
]);
|
|
25
|
+
expect(msa.getWidth()).toBe(38);
|
|
26
|
+
});
|
|
27
|
+
test('rows are retrievable by their colon-containing region name', () => {
|
|
28
|
+
const msa = parseMSA(block);
|
|
29
|
+
expect(msa.getRow('HG002#1#chr1:1000-1040')).toBe('ACGTACGT--ACGTNNNNACGTACGTACGTACGTACGT');
|
|
30
|
+
});
|
|
31
|
+
// If impg extracts from a soft-masked reference FASTA, aligned rows carry
|
|
32
|
+
// lowercase bases. A3M sniff runs before FASTA and triggers on
|
|
33
|
+
// hasLowercase && equal upper+dash match-length across rows -- which these
|
|
34
|
+
// rows satisfy by coincidence. The rows are all the same total length though,
|
|
35
|
+
// so they are a real alignment and must parse as FASTA, not A3M (A3M would
|
|
36
|
+
// strip the lowercase into separate insert columns and break alignment).
|
|
37
|
+
const softMasked = `>HG002#1#chr1:1000-1030
|
|
38
|
+
acgtACGTAC--GTACGTACGTACGTacgt
|
|
39
|
+
>HG003#1#chr1:1000-1030
|
|
40
|
+
ACGTacgtAC--GTACGTacgtACGTACGT`;
|
|
41
|
+
test('soft-masked equal-length block parses as FASTA, not A3M', () => {
|
|
42
|
+
const msa = parseMSA(softMasked);
|
|
43
|
+
expect(msa).toBeInstanceOf(FastaMSA);
|
|
44
|
+
expect(msa).not.toBeInstanceOf(A3mMSA);
|
|
45
|
+
const rows = msa.getNames().map(n => msa.getRow(n));
|
|
46
|
+
expect(new Set(rows.map(r => r.length)).size).toBe(1);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=impgIntegration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impgIntegration.test.js","sourceRoot":"","sources":["../../src/msa/impgIntegration.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE/C,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAErC,gFAAgF;AAChF,wDAAwD;AACxD,2EAA2E;AAC3E,yBAAyB;AAEzB,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,2EAA2E;IAC3E,MAAM,KAAK,GAAG;;;;;uCAKuB,CAAA;IAErC,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC;YAC7B,wBAAwB;YACxB,wBAAwB;YACxB,wBAAwB;SACzB,CAAC,CAAA;QACF,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACtE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC3B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAC/C,wCAAwC,CACzC,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,0EAA0E;IAC1E,+DAA+D;IAC/D,2EAA2E;IAC3E,8EAA8E;IAC9E,2EAA2E;IAC3E,yEAAyE;IACzE,MAAM,UAAU,GAAG;;;+BAGU,CAAA;IAE7B,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAA;QAChC,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QACnD,MAAM,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/msa/index.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ import StockholmMSA from './StockholmMSA.ts';
|
|
|
6
6
|
export { parseEmfTree } from 'emf-js';
|
|
7
7
|
export { default as parseNewick } from './parseNewick.ts';
|
|
8
8
|
export type MSAParserType = StockholmMSA | A3mMSA | FastaMSA | EmfMSA | ClustalMSA;
|
|
9
|
-
export
|
|
9
|
+
export type MSAFormat = 'stockholm' | 'a3m' | 'fasta' | 'emf' | 'clustal';
|
|
10
|
+
export declare function parseMSA(text: string, currentAlignment?: number, format?: MSAFormat): MSAParserType;
|
|
10
11
|
/**
|
|
11
12
|
* Get ungapped sequence from an aligned row
|
|
12
13
|
*/
|
package/dist/msa/index.js
CHANGED
|
@@ -5,7 +5,26 @@ import FastaMSA from "./FastaMSA.js";
|
|
|
5
5
|
import StockholmMSA, { stockholmSniff } from "./StockholmMSA.js";
|
|
6
6
|
export { parseEmfTree } from 'emf-js';
|
|
7
7
|
export { default as parseNewick } from "./parseNewick.js";
|
|
8
|
-
|
|
8
|
+
// when `format` is given the heuristic sniffing is bypassed -- callers that
|
|
9
|
+
// already know the format (e.g. impg emitting fasta-aln) can force it rather
|
|
10
|
+
// than rely on auto-detection, which is necessarily ambiguous between formats
|
|
11
|
+
// that share a leading '>' (fasta vs a3m)
|
|
12
|
+
export function parseMSA(text, currentAlignment = 0, format) {
|
|
13
|
+
if (format === 'stockholm') {
|
|
14
|
+
return new StockholmMSA(text, currentAlignment);
|
|
15
|
+
}
|
|
16
|
+
if (format === 'a3m') {
|
|
17
|
+
return new A3mMSA(text);
|
|
18
|
+
}
|
|
19
|
+
if (format === 'fasta') {
|
|
20
|
+
return new FastaMSA(text);
|
|
21
|
+
}
|
|
22
|
+
if (format === 'emf') {
|
|
23
|
+
return new EmfMSA(text);
|
|
24
|
+
}
|
|
25
|
+
if (format === 'clustal') {
|
|
26
|
+
return new ClustalMSA(text);
|
|
27
|
+
}
|
|
9
28
|
if (stockholmSniff(text)) {
|
|
10
29
|
return new StockholmMSA(text, currentAlignment);
|
|
11
30
|
}
|
package/dist/msa/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/msa/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,UAAU,MAAM,iBAAiB,CAAA;AACxC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/msa/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,UAAU,MAAM,iBAAiB,CAAA;AACxC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,QAAQ,MAAM,eAAe,CAAA;AACpC,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAWzD,4EAA4E;AAC5E,6EAA6E;AAC7E,8EAA8E;AAC9E,0CAA0C;AAC1C,MAAM,UAAU,QAAQ,CACtB,IAAY,EACZ,gBAAgB,GAAG,CAAC,EACpB,MAAkB;IAElB,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;QAC3B,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACjD,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;IAC7B,CAAC;IACD,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,YAAY,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC3B,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;IACD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,OAAO,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,aAAa,CAAA;AAC/C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/msa/index.test.js
CHANGED
|
@@ -14,6 +14,18 @@ GHIKL`;
|
|
|
14
14
|
expect(msa).toBeInstanceOf(FastaMSA);
|
|
15
15
|
expect(msa.getNames()).toEqual(['seq1', 'seq2']);
|
|
16
16
|
});
|
|
17
|
+
test('preserves row order for numeric FASTA ids', () => {
|
|
18
|
+
// object key order would hoist integer-like keys ('10' before '2'),
|
|
19
|
+
// scrambling the alignment; getNames must keep file order
|
|
20
|
+
const fasta = `>3
|
|
21
|
+
ACDEF
|
|
22
|
+
>1
|
|
23
|
+
GHIKL
|
|
24
|
+
>2
|
|
25
|
+
MNPQR`;
|
|
26
|
+
const msa = parseMSA(fasta);
|
|
27
|
+
expect(msa.getNames()).toEqual(['3', '1', '2']);
|
|
28
|
+
});
|
|
17
29
|
test('parses A3M format', () => {
|
|
18
30
|
const a3m = `>seq1
|
|
19
31
|
ACDEFghiKLMNPQ
|
|
@@ -37,6 +49,22 @@ that doesn't match anything`;
|
|
|
37
49
|
const msa = parseMSA(unknown);
|
|
38
50
|
expect(msa).toBeInstanceOf(ClustalMSA);
|
|
39
51
|
});
|
|
52
|
+
test('explicit format bypasses auto-detection', () => {
|
|
53
|
+
// a3m-looking input (lowercase inserts, differing row lengths) forced to
|
|
54
|
+
// FASTA, and FASTA-looking input forced to A3M
|
|
55
|
+
const a3mLooking = `>seq1
|
|
56
|
+
ACDEFghiKLMNPQ
|
|
57
|
+
>seq2
|
|
58
|
+
ACDEFKLMNPQ`;
|
|
59
|
+
expect(parseMSA(a3mLooking)).toBeInstanceOf(A3mMSA);
|
|
60
|
+
expect(parseMSA(a3mLooking, 0, 'fasta')).toBeInstanceOf(FastaMSA);
|
|
61
|
+
const fastaLooking = `>seq1
|
|
62
|
+
ACDEF
|
|
63
|
+
>seq2
|
|
64
|
+
GHIKL`;
|
|
65
|
+
expect(parseMSA(fastaLooking)).toBeInstanceOf(FastaMSA);
|
|
66
|
+
expect(parseMSA(fastaLooking, 0, 'a3m')).toBeInstanceOf(A3mMSA);
|
|
67
|
+
});
|
|
40
68
|
});
|
|
41
69
|
describe('FastaMSA colon-in-name lookup', () => {
|
|
42
70
|
const fasta = `>EU105457.1|chr09:67680268..67675529_LTR/Copia
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/msa/index.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/msa/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,17 @@ function createStockholm() {
|
|
|
13
13
|
seqdata: {},
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
+
// records before a "# STOCKHOLM 1.0" header are an error in strict mode,
|
|
17
|
+
// otherwise they implicitly start a new alignment
|
|
18
|
+
function ensureStock(stock, strict) {
|
|
19
|
+
if (stock) {
|
|
20
|
+
return stock;
|
|
21
|
+
}
|
|
22
|
+
if (strict) {
|
|
23
|
+
throw new Error('No format header: # STOCKHOLM 1.0');
|
|
24
|
+
}
|
|
25
|
+
return createStockholm();
|
|
26
|
+
}
|
|
16
27
|
const formatStartRegex = /^# STOCKHOLM 1.0/;
|
|
17
28
|
const formatEndRegex = /^\/\/\s*$/;
|
|
18
29
|
const gfRegex = /^#=GF\s+(\S+)\s+(.*?)\s*$/;
|
|
@@ -41,12 +52,7 @@ export function parseAll(text, opts) {
|
|
|
41
52
|
stock = null;
|
|
42
53
|
}
|
|
43
54
|
else if ((match = gfRegex.exec(line))) {
|
|
44
|
-
|
|
45
|
-
if (options.strict) {
|
|
46
|
-
throw new Error('No format header: # STOCKHOLM 1.0');
|
|
47
|
-
}
|
|
48
|
-
stock = createStockholm();
|
|
49
|
-
}
|
|
55
|
+
stock = ensureStock(stock, !!options.strict);
|
|
50
56
|
const tag = match[1];
|
|
51
57
|
if (!stock.gf[tag]) {
|
|
52
58
|
stock.gf[tag] = [];
|
|
@@ -54,12 +60,7 @@ export function parseAll(text, opts) {
|
|
|
54
60
|
stock.gf[tag].push(match[2]);
|
|
55
61
|
}
|
|
56
62
|
else if ((match = gcRegex.exec(line))) {
|
|
57
|
-
|
|
58
|
-
if (options.strict) {
|
|
59
|
-
throw new Error('No format header: # STOCKHOLM 1.0');
|
|
60
|
-
}
|
|
61
|
-
stock = createStockholm();
|
|
62
|
-
}
|
|
63
|
+
stock = ensureStock(stock, !!options.strict);
|
|
63
64
|
const tag = match[1];
|
|
64
65
|
if (!stock.gc[tag]) {
|
|
65
66
|
stock.gc[tag] = '';
|
|
@@ -67,12 +68,7 @@ export function parseAll(text, opts) {
|
|
|
67
68
|
stock.gc[tag] += match[2];
|
|
68
69
|
}
|
|
69
70
|
else if ((match = gsRegex.exec(line))) {
|
|
70
|
-
|
|
71
|
-
if (options.strict) {
|
|
72
|
-
throw new Error('No format header: # STOCKHOLM 1.0');
|
|
73
|
-
}
|
|
74
|
-
stock = createStockholm();
|
|
75
|
-
}
|
|
71
|
+
stock = ensureStock(stock, !!options.strict);
|
|
76
72
|
const seqname = match[1];
|
|
77
73
|
const tag = match[2];
|
|
78
74
|
const value = match[3];
|
|
@@ -85,12 +81,7 @@ export function parseAll(text, opts) {
|
|
|
85
81
|
stock.gs[tag][seqname].push(value);
|
|
86
82
|
}
|
|
87
83
|
else if ((match = grRegex.exec(line))) {
|
|
88
|
-
|
|
89
|
-
if (options.strict) {
|
|
90
|
-
throw new Error('No format header: # STOCKHOLM 1.0');
|
|
91
|
-
}
|
|
92
|
-
stock = createStockholm();
|
|
93
|
-
}
|
|
84
|
+
stock = ensureStock(stock, !!options.strict);
|
|
94
85
|
const seqname = match[1];
|
|
95
86
|
const tag = match[2];
|
|
96
87
|
const value = match[3];
|
|
@@ -103,12 +94,7 @@ export function parseAll(text, opts) {
|
|
|
103
94
|
stock.gr[tag][seqname] += value;
|
|
104
95
|
}
|
|
105
96
|
else if ((match = lineRegex.exec(line))) {
|
|
106
|
-
|
|
107
|
-
if (options.strict) {
|
|
108
|
-
throw new Error('No format header: # STOCKHOLM 1.0');
|
|
109
|
-
}
|
|
110
|
-
stock = createStockholm();
|
|
111
|
-
}
|
|
97
|
+
stock = ensureStock(stock, !!options.strict);
|
|
112
98
|
const seqname = match[1];
|
|
113
99
|
const seqdata = match[2];
|
|
114
100
|
if (!stock.seqdata[seqname]) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stockholmParser.js","sourceRoot":"","sources":["../../src/msa/stockholmParser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,SAAS,eAAe;IACtB,OAAO;QACL,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,EAAE,EAAE,EAAE;QACN,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACZ,CAAA;AACH,CAAC;AAED,MAAM,gBAAgB,GAAG,kBAAkB,CAAA;AAC3C,MAAM,cAAc,GAAG,WAAW,CAAA;AAClC,MAAM,OAAO,GAAG,2BAA2B,CAAA;AAC3C,MAAM,OAAO,GAAG,2BAA2B,CAAA;AAC3C,MAAM,OAAO,GAAG,mCAAmC,CAAA;AACnD,MAAM,OAAO,GAAG,mCAAmC,CAAA;AACnD,MAAM,SAAS,GAAG,uBAAuB,CAAA;AACzC,MAAM,aAAa,GAAG,IAAI,CAAA;AAE1B,MAAM,UAAU,KAAK,CAAC,IAAY;IAChC,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpC,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,IAAY,EACZ,IAA4C;IAE5C,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAA;IAC1B,MAAM,EAAE,GAAoB,EAAE,CAAA;IAC9B,IAAI,KAAK,GAAyB,IAAI,CAAA;IAEtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,KAA6B,CAAA;QAEjC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,GAAG,eAAe,EAAE,CAAA;QAC3B,CAAC;aAAM,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAChB,CAAC;YACD,KAAK,GAAG,IAAI,CAAA;QACd,CAAC;aAAM,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACxC,
|
|
1
|
+
{"version":3,"file":"stockholmParser.js","sourceRoot":"","sources":["../../src/msa/stockholmParser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "msa-parsers",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.4.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
30
|
"typescript": "^6.0.3",
|
|
31
|
-
"vitest": "^4.1.
|
|
31
|
+
"vitest": "^4.1.9"
|
|
32
32
|
},
|
|
33
33
|
"scripts": {
|
|
34
34
|
"clean": "rimraf dist",
|
package/src/gff/parseGFF.ts
CHANGED
|
@@ -23,9 +23,17 @@ function parseAttributes(col9?: string): Record<string, string | undefined> {
|
|
|
23
23
|
const eq = f.indexOf('=')
|
|
24
24
|
const key = (eq === -1 ? f : f.slice(0, eq)).trim()
|
|
25
25
|
const val = eq === -1 ? undefined : f.slice(eq + 1)
|
|
26
|
+
// split on comma (the GFF3 multi-value separator) BEFORE decoding, so a
|
|
27
|
+
// literal comma encoded as %2C survives the split and isn't mistaken
|
|
28
|
+
// for a separator
|
|
26
29
|
return [
|
|
27
30
|
key,
|
|
28
|
-
val
|
|
31
|
+
val
|
|
32
|
+
? val
|
|
33
|
+
.split(',')
|
|
34
|
+
.map(v => safeDecode(v).trim())
|
|
35
|
+
.join(' ')
|
|
36
|
+
: undefined,
|
|
29
37
|
]
|
|
30
38
|
})
|
|
31
39
|
.filter(([key]) => key !== ''),
|
package/src/index.ts
CHANGED
package/src/msa/A3mMSA.ts
CHANGED
|
@@ -87,6 +87,15 @@ export default class A3mMSA extends BaseMSA {
|
|
|
87
87
|
return false
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
+
// A true aligned FASTA (e.g. impg's fasta-aln output from soft-masked
|
|
91
|
+
// references) has all rows the same total length. A3M's defining feature is
|
|
92
|
+
// variable-length rows, since lowercase inserts live outside the fixed match
|
|
93
|
+
// grid. So equal-length rows are an alignment, not A3M, even when lowercase
|
|
94
|
+
// soft-masking is present.
|
|
95
|
+
if (new Set(seqs.map(s => s.length)).size === 1) {
|
|
96
|
+
return false
|
|
97
|
+
}
|
|
98
|
+
|
|
90
99
|
let hasLowercase = false
|
|
91
100
|
let firstMatchLen = -1
|
|
92
101
|
let sameMatchLength = true
|
package/src/msa/FastaMSA.ts
CHANGED
|
@@ -6,6 +6,10 @@ export default class FastaMSA extends BaseMSA {
|
|
|
6
6
|
colonNormalized: Record<string, string>
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
+
// explicit insertion-ordered ids: object key order reorders integer-like
|
|
10
|
+
// keys (e.g. a numeric ">123" defline) to the front, scrambling row order
|
|
11
|
+
private orderedNames: string[] = []
|
|
12
|
+
|
|
9
13
|
constructor(text: string) {
|
|
10
14
|
super()
|
|
11
15
|
const seqdata: Record<string, string> = {}
|
|
@@ -23,6 +27,7 @@ export default class FastaMSA extends BaseMSA {
|
|
|
23
27
|
const id = spaceIdx === -1 ? defLine : defLine.slice(0, spaceIdx)
|
|
24
28
|
if (id) {
|
|
25
29
|
seqdata[id] = entry.slice(newlineIdx + 1).replaceAll(/\s/g, '')
|
|
30
|
+
this.orderedNames.push(id)
|
|
26
31
|
if (id.includes(':')) {
|
|
27
32
|
colonNormalized[id.replaceAll(':', '_')] = id
|
|
28
33
|
}
|
|
@@ -36,7 +41,7 @@ export default class FastaMSA extends BaseMSA {
|
|
|
36
41
|
}
|
|
37
42
|
|
|
38
43
|
getNames() {
|
|
39
|
-
return
|
|
44
|
+
return this.orderedNames
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
getRow(name: string) {
|
|
@@ -48,7 +53,7 @@ export default class FastaMSA extends BaseMSA {
|
|
|
48
53
|
}
|
|
49
54
|
|
|
50
55
|
getWidth() {
|
|
51
|
-
const name =
|
|
52
|
-
return this.getRow(name).length
|
|
56
|
+
const name = this.orderedNames[0]
|
|
57
|
+
return name === undefined ? 0 : this.getRow(name).length
|
|
53
58
|
}
|
|
54
59
|
}
|
package/src/msa/StockholmMSA.ts
CHANGED
|
@@ -14,7 +14,11 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
14
14
|
super()
|
|
15
15
|
const res = parseAll(text)
|
|
16
16
|
this.data = res
|
|
17
|
-
|
|
17
|
+
const aln = res[currentAlignment] ?? res[0]
|
|
18
|
+
if (!aln) {
|
|
19
|
+
throw new Error('No alignments found in Stockholm file')
|
|
20
|
+
}
|
|
21
|
+
this.MSA = aln
|
|
18
22
|
}
|
|
19
23
|
|
|
20
24
|
getMSA() {
|
|
@@ -26,8 +30,8 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
26
30
|
}
|
|
27
31
|
|
|
28
32
|
getWidth() {
|
|
29
|
-
const name = Object.keys(this.MSA.seqdata)[0]
|
|
30
|
-
return this.getRow(name).length
|
|
33
|
+
const name = Object.keys(this.MSA.seqdata)[0]
|
|
34
|
+
return name === undefined ? 0 : this.getRow(name).length
|
|
31
35
|
}
|
|
32
36
|
|
|
33
37
|
get alignmentNames() {
|
|
@@ -113,9 +117,19 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
113
117
|
id: 'secondaryStruct',
|
|
114
118
|
name: 'Secondary-structure',
|
|
115
119
|
data: this.secondaryStructureConsensus,
|
|
120
|
+
// WUSS notation pairs base-paired columns as open/close brackets of
|
|
121
|
+
// several nesting types (<>, (), [], {}); color all opens one way and
|
|
122
|
+
// closes the other so every helix (e.g. the tRNA acceptor stem, which
|
|
123
|
+
// is written with parens) is highlighted, not just the <> arms.
|
|
116
124
|
customColorScheme: {
|
|
117
|
-
'>': 'pink',
|
|
118
125
|
'<': 'lightblue',
|
|
126
|
+
'(': 'lightblue',
|
|
127
|
+
'[': 'lightblue',
|
|
128
|
+
'{': 'lightblue',
|
|
129
|
+
'>': 'pink',
|
|
130
|
+
')': 'pink',
|
|
131
|
+
']': 'pink',
|
|
132
|
+
'}': 'pink',
|
|
119
133
|
},
|
|
120
134
|
},
|
|
121
135
|
]
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import A3mMSA from './A3mMSA.ts'
|
|
4
|
+
import FastaMSA from './FastaMSA.ts'
|
|
5
|
+
import { parseMSA } from './index.ts'
|
|
6
|
+
|
|
7
|
+
// impg (https://github.com/pangenome/impg) pipes `impg query -o fasta-aln` into
|
|
8
|
+
// scripts/faln2html.py, which feeds the FASTA string to
|
|
9
|
+
// MSAModelF().create({ data: { msa } }). These tests pin the behavior that
|
|
10
|
+
// integration relies on.
|
|
11
|
+
|
|
12
|
+
describe('impg fasta-aln integration', () => {
|
|
13
|
+
// PanSN-style names + region coordinates with colons, dash gaps, uppercase
|
|
14
|
+
const block = `>HG002#1#chr1:1000-1040
|
|
15
|
+
ACGTACGT--ACGTNNNNACGTACGTACGTACGTACGT
|
|
16
|
+
>HG003#1#chr1:1000-1040
|
|
17
|
+
ACGTAC-TGGACGTNNNNACGTAC--ACGTACGTACGT
|
|
18
|
+
>CHM13#0#chr1:1000-1040
|
|
19
|
+
ACGTACGTGGACGTNNNNACGT----ACGTACGTACGT`
|
|
20
|
+
|
|
21
|
+
test('uppercase block is parsed as FASTA, not A3M/Clustal', () => {
|
|
22
|
+
const msa = parseMSA(block)
|
|
23
|
+
expect(msa).toBeInstanceOf(FastaMSA)
|
|
24
|
+
expect(msa.getNames()).toEqual([
|
|
25
|
+
'HG002#1#chr1:1000-1040',
|
|
26
|
+
'HG003#1#chr1:1000-1040',
|
|
27
|
+
'CHM13#0#chr1:1000-1040',
|
|
28
|
+
])
|
|
29
|
+
expect(msa.getWidth()).toBe(38)
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test('rows are retrievable by their colon-containing region name', () => {
|
|
33
|
+
const msa = parseMSA(block)
|
|
34
|
+
expect(msa.getRow('HG002#1#chr1:1000-1040')).toBe(
|
|
35
|
+
'ACGTACGT--ACGTNNNNACGTACGTACGTACGTACGT',
|
|
36
|
+
)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
// If impg extracts from a soft-masked reference FASTA, aligned rows carry
|
|
40
|
+
// lowercase bases. A3M sniff runs before FASTA and triggers on
|
|
41
|
+
// hasLowercase && equal upper+dash match-length across rows -- which these
|
|
42
|
+
// rows satisfy by coincidence. The rows are all the same total length though,
|
|
43
|
+
// so they are a real alignment and must parse as FASTA, not A3M (A3M would
|
|
44
|
+
// strip the lowercase into separate insert columns and break alignment).
|
|
45
|
+
const softMasked = `>HG002#1#chr1:1000-1030
|
|
46
|
+
acgtACGTAC--GTACGTACGTACGTacgt
|
|
47
|
+
>HG003#1#chr1:1000-1030
|
|
48
|
+
ACGTacgtAC--GTACGTacgtACGTACGT`
|
|
49
|
+
|
|
50
|
+
test('soft-masked equal-length block parses as FASTA, not A3M', () => {
|
|
51
|
+
const msa = parseMSA(softMasked)
|
|
52
|
+
expect(msa).toBeInstanceOf(FastaMSA)
|
|
53
|
+
expect(msa).not.toBeInstanceOf(A3mMSA)
|
|
54
|
+
const rows = msa.getNames().map(n => msa.getRow(n))
|
|
55
|
+
expect(new Set(rows.map(r => r.length)).size).toBe(1)
|
|
56
|
+
})
|
|
57
|
+
})
|
package/src/msa/index.test.ts
CHANGED
|
@@ -18,6 +18,20 @@ GHIKL`
|
|
|
18
18
|
expect(msa.getNames()).toEqual(['seq1', 'seq2'])
|
|
19
19
|
})
|
|
20
20
|
|
|
21
|
+
test('preserves row order for numeric FASTA ids', () => {
|
|
22
|
+
// object key order would hoist integer-like keys ('10' before '2'),
|
|
23
|
+
// scrambling the alignment; getNames must keep file order
|
|
24
|
+
const fasta = `>3
|
|
25
|
+
ACDEF
|
|
26
|
+
>1
|
|
27
|
+
GHIKL
|
|
28
|
+
>2
|
|
29
|
+
MNPQR`
|
|
30
|
+
const msa = parseMSA(fasta)
|
|
31
|
+
|
|
32
|
+
expect(msa.getNames()).toEqual(['3', '1', '2'])
|
|
33
|
+
})
|
|
34
|
+
|
|
21
35
|
test('parses A3M format', () => {
|
|
22
36
|
const a3m = `>seq1
|
|
23
37
|
ACDEFghiKLMNPQ
|
|
@@ -46,6 +60,24 @@ that doesn't match anything`
|
|
|
46
60
|
|
|
47
61
|
expect(msa).toBeInstanceOf(ClustalMSA)
|
|
48
62
|
})
|
|
63
|
+
|
|
64
|
+
test('explicit format bypasses auto-detection', () => {
|
|
65
|
+
// a3m-looking input (lowercase inserts, differing row lengths) forced to
|
|
66
|
+
// FASTA, and FASTA-looking input forced to A3M
|
|
67
|
+
const a3mLooking = `>seq1
|
|
68
|
+
ACDEFghiKLMNPQ
|
|
69
|
+
>seq2
|
|
70
|
+
ACDEFKLMNPQ`
|
|
71
|
+
expect(parseMSA(a3mLooking)).toBeInstanceOf(A3mMSA)
|
|
72
|
+
expect(parseMSA(a3mLooking, 0, 'fasta')).toBeInstanceOf(FastaMSA)
|
|
73
|
+
|
|
74
|
+
const fastaLooking = `>seq1
|
|
75
|
+
ACDEF
|
|
76
|
+
>seq2
|
|
77
|
+
GHIKL`
|
|
78
|
+
expect(parseMSA(fastaLooking)).toBeInstanceOf(FastaMSA)
|
|
79
|
+
expect(parseMSA(fastaLooking, 0, 'a3m')).toBeInstanceOf(A3mMSA)
|
|
80
|
+
})
|
|
49
81
|
})
|
|
50
82
|
|
|
51
83
|
describe('FastaMSA colon-in-name lookup', () => {
|
package/src/msa/index.ts
CHANGED
|
@@ -14,7 +14,32 @@ export type MSAParserType =
|
|
|
14
14
|
| EmfMSA
|
|
15
15
|
| ClustalMSA
|
|
16
16
|
|
|
17
|
-
export
|
|
17
|
+
export type MSAFormat = 'stockholm' | 'a3m' | 'fasta' | 'emf' | 'clustal'
|
|
18
|
+
|
|
19
|
+
// when `format` is given the heuristic sniffing is bypassed -- callers that
|
|
20
|
+
// already know the format (e.g. impg emitting fasta-aln) can force it rather
|
|
21
|
+
// than rely on auto-detection, which is necessarily ambiguous between formats
|
|
22
|
+
// that share a leading '>' (fasta vs a3m)
|
|
23
|
+
export function parseMSA(
|
|
24
|
+
text: string,
|
|
25
|
+
currentAlignment = 0,
|
|
26
|
+
format?: MSAFormat,
|
|
27
|
+
): MSAParserType {
|
|
28
|
+
if (format === 'stockholm') {
|
|
29
|
+
return new StockholmMSA(text, currentAlignment)
|
|
30
|
+
}
|
|
31
|
+
if (format === 'a3m') {
|
|
32
|
+
return new A3mMSA(text)
|
|
33
|
+
}
|
|
34
|
+
if (format === 'fasta') {
|
|
35
|
+
return new FastaMSA(text)
|
|
36
|
+
}
|
|
37
|
+
if (format === 'emf') {
|
|
38
|
+
return new EmfMSA(text)
|
|
39
|
+
}
|
|
40
|
+
if (format === 'clustal') {
|
|
41
|
+
return new ClustalMSA(text)
|
|
42
|
+
}
|
|
18
43
|
if (stockholmSniff(text)) {
|
|
19
44
|
return new StockholmMSA(text, currentAlignment)
|
|
20
45
|
}
|
|
@@ -24,6 +24,21 @@ function createStockholm(): StockholmData {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
+
// records before a "# STOCKHOLM 1.0" header are an error in strict mode,
|
|
28
|
+
// otherwise they implicitly start a new alignment
|
|
29
|
+
function ensureStock(
|
|
30
|
+
stock: StockholmData | null,
|
|
31
|
+
strict: boolean,
|
|
32
|
+
): StockholmData {
|
|
33
|
+
if (stock) {
|
|
34
|
+
return stock
|
|
35
|
+
}
|
|
36
|
+
if (strict) {
|
|
37
|
+
throw new Error('No format header: # STOCKHOLM 1.0')
|
|
38
|
+
}
|
|
39
|
+
return createStockholm()
|
|
40
|
+
}
|
|
41
|
+
|
|
27
42
|
const formatStartRegex = /^# STOCKHOLM 1.0/
|
|
28
43
|
const formatEndRegex = /^\/\/\s*$/
|
|
29
44
|
const gfRegex = /^#=GF\s+(\S+)\s+(.*?)\s*$/
|
|
@@ -57,36 +72,21 @@ export function parseAll(
|
|
|
57
72
|
}
|
|
58
73
|
stock = null
|
|
59
74
|
} else if ((match = gfRegex.exec(line))) {
|
|
60
|
-
|
|
61
|
-
if (options.strict) {
|
|
62
|
-
throw new Error('No format header: # STOCKHOLM 1.0')
|
|
63
|
-
}
|
|
64
|
-
stock = createStockholm()
|
|
65
|
-
}
|
|
75
|
+
stock = ensureStock(stock, !!options.strict)
|
|
66
76
|
const tag = match[1]!
|
|
67
77
|
if (!stock.gf[tag]) {
|
|
68
78
|
stock.gf[tag] = []
|
|
69
79
|
}
|
|
70
80
|
stock.gf[tag].push(match[2]!)
|
|
71
81
|
} else if ((match = gcRegex.exec(line))) {
|
|
72
|
-
|
|
73
|
-
if (options.strict) {
|
|
74
|
-
throw new Error('No format header: # STOCKHOLM 1.0')
|
|
75
|
-
}
|
|
76
|
-
stock = createStockholm()
|
|
77
|
-
}
|
|
82
|
+
stock = ensureStock(stock, !!options.strict)
|
|
78
83
|
const tag = match[1]!
|
|
79
84
|
if (!stock.gc[tag]) {
|
|
80
85
|
stock.gc[tag] = ''
|
|
81
86
|
}
|
|
82
87
|
stock.gc[tag] += match[2]!
|
|
83
88
|
} else if ((match = gsRegex.exec(line))) {
|
|
84
|
-
|
|
85
|
-
if (options.strict) {
|
|
86
|
-
throw new Error('No format header: # STOCKHOLM 1.0')
|
|
87
|
-
}
|
|
88
|
-
stock = createStockholm()
|
|
89
|
-
}
|
|
89
|
+
stock = ensureStock(stock, !!options.strict)
|
|
90
90
|
const seqname = match[1]!
|
|
91
91
|
const tag = match[2]!
|
|
92
92
|
const value = match[3]!
|
|
@@ -98,12 +98,7 @@ export function parseAll(
|
|
|
98
98
|
}
|
|
99
99
|
stock.gs[tag][seqname].push(value)
|
|
100
100
|
} else if ((match = grRegex.exec(line))) {
|
|
101
|
-
|
|
102
|
-
if (options.strict) {
|
|
103
|
-
throw new Error('No format header: # STOCKHOLM 1.0')
|
|
104
|
-
}
|
|
105
|
-
stock = createStockholm()
|
|
106
|
-
}
|
|
101
|
+
stock = ensureStock(stock, !!options.strict)
|
|
107
102
|
const seqname = match[1]!
|
|
108
103
|
const tag = match[2]!
|
|
109
104
|
const value = match[3]!
|
|
@@ -115,12 +110,7 @@ export function parseAll(
|
|
|
115
110
|
}
|
|
116
111
|
stock.gr[tag][seqname] += value
|
|
117
112
|
} else if ((match = lineRegex.exec(line))) {
|
|
118
|
-
|
|
119
|
-
if (options.strict) {
|
|
120
|
-
throw new Error('No format header: # STOCKHOLM 1.0')
|
|
121
|
-
}
|
|
122
|
-
stock = createStockholm()
|
|
123
|
-
}
|
|
113
|
+
stock = ensureStock(stock, !!options.strict)
|
|
124
114
|
const seqname = match[1]!
|
|
125
115
|
const seqdata = match[2]!
|
|
126
116
|
if (!stock.seqdata[seqname]) {
|