msa-parsers 5.7.2 → 5.8.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/gffToInterPro.js +11 -29
- package/dist/gff/gffToInterPro.js.map +1 -1
- 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/gff/parseGFF.js +3 -1
- package/dist/gff/parseGFF.js.map +1 -1
- package/dist/msa/A3mMSA.d.ts +0 -2
- package/dist/msa/A3mMSA.js +62 -162
- 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/A3mMSA.test.js +44 -0
- package/dist/msa/A3mMSA.test.js.map +1 -1
- 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 +8 -22
- package/dist/msa/FastaMSA.js.map +1 -1
- package/dist/msa/StockholmMSA.d.ts +0 -1
- package/dist/msa/StockholmMSA.js +3 -5
- package/dist/msa/StockholmMSA.js.map +1 -1
- package/dist/msa/fastaRecords.d.ts +11 -0
- package/dist/msa/fastaRecords.js +29 -0
- package/dist/msa/fastaRecords.js.map +1 -0
- package/dist/msa/index.test.js +97 -3
- package/dist/msa/index.test.js.map +1 -1
- package/dist/msa/parseNewick.d.ts +12 -58
- package/dist/msa/parseNewick.js +12 -98
- package/dist/msa/parseNewick.js.map +1 -1
- package/dist/msa/stockholmParser.d.ts +0 -2
- package/dist/msa/stockholmParser.js +10 -31
- package/dist/msa/stockholmParser.js.map +1 -1
- package/dist/msa/stockholmParser.test.js +11 -0
- package/dist/msa/stockholmParser.test.js.map +1 -1
- package/package.json +2 -1
- package/src/gff/gffToInterPro.ts +11 -30
- package/src/gff/interProToGFF.test.ts +20 -0
- package/src/gff/interProToGFF.ts +6 -2
- package/src/gff/parseGFF.ts +3 -1
- package/src/msa/A3mMSA.property.test.ts +135 -0
- package/src/msa/A3mMSA.test.ts +52 -0
- package/src/msa/A3mMSA.ts +81 -179
- package/src/msa/BaseMSA.ts +23 -5
- package/src/msa/ClustalMSA.ts +12 -7
- package/src/msa/EmfMSA.ts +12 -6
- package/src/msa/FastaMSA.ts +10 -23
- package/src/msa/StockholmMSA.ts +3 -6
- package/src/msa/fastaRecords.ts +35 -0
- package/src/msa/index.test.ts +111 -3
- package/src/msa/parseNewick.ts +16 -103
- package/src/msa/stockholmParser.test.ts +12 -0
- package/src/msa/stockholmParser.ts +12 -33
|
@@ -33,16 +33,7 @@ function geneStrand({ type, strand }) {
|
|
|
33
33
|
return GENE_LEVEL_TYPES.has(type) ? directional : undefined;
|
|
34
34
|
}
|
|
35
35
|
export function gffToInterProResults(gffRecords) {
|
|
36
|
-
const bySequence =
|
|
37
|
-
for (const record of gffRecords) {
|
|
38
|
-
const existing = bySequence.get(record.seq_id);
|
|
39
|
-
if (existing) {
|
|
40
|
-
existing.push(record);
|
|
41
|
-
}
|
|
42
|
-
else {
|
|
43
|
-
bySequence.set(record.seq_id, [record]);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
36
|
+
const bySequence = Map.groupBy(gffRecords, record => record.seq_id);
|
|
46
37
|
const results = {};
|
|
47
38
|
for (const [seqId, records] of bySequence) {
|
|
48
39
|
const matchesByAccession = new Map();
|
|
@@ -66,31 +57,22 @@ export function gffToInterProResults(gffRecords) {
|
|
|
66
57
|
featureType: record.type,
|
|
67
58
|
});
|
|
68
59
|
}
|
|
69
|
-
|
|
60
|
+
let locations = matchesByAccession.get(accession);
|
|
61
|
+
if (!locations) {
|
|
62
|
+
locations = [];
|
|
63
|
+
matchesByAccession.set(accession, locations);
|
|
64
|
+
}
|
|
65
|
+
locations.push({
|
|
70
66
|
start: record.start,
|
|
71
67
|
end: record.end,
|
|
72
68
|
strand: geneStrand(record),
|
|
73
|
-
};
|
|
74
|
-
const locations = matchesByAccession.get(accession);
|
|
75
|
-
if (locations) {
|
|
76
|
-
locations.push(location);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
matchesByAccession.set(accession, [location]);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
const matches = [];
|
|
83
|
-
for (const [accession, locations] of matchesByAccession) {
|
|
84
|
-
const info = matchInfo.get(accession);
|
|
85
|
-
matches.push({
|
|
86
|
-
signature: {
|
|
87
|
-
entry: info,
|
|
88
|
-
},
|
|
89
|
-
locations,
|
|
90
69
|
});
|
|
91
70
|
}
|
|
92
71
|
results[seqId] = {
|
|
93
|
-
matches,
|
|
72
|
+
matches: [...matchesByAccession].map(([accession, locations]) => ({
|
|
73
|
+
signature: { entry: matchInfo.get(accession) },
|
|
74
|
+
locations,
|
|
75
|
+
})),
|
|
94
76
|
xref: [{ id: seqId }],
|
|
95
77
|
};
|
|
96
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gffToInterPro.js","sourceRoot":"","sources":["../../src/gff/gffToInterPro.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,8EAA8E;AAC9E,+EAA+E;AAC/E,gFAAgF;AAChF,uDAAuD;AACvD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,MAAM;IACN,YAAY;IACZ,MAAM;IACN,YAAY;IACZ,oBAAoB;IACpB,OAAO;IACP,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,SAAS;CACV,CAAC,CAAA;AAEF,0EAA0E;AAC1E,oCAAoC;AACpC,SAAS,UAAU,CAAC,EAAE,IAAI,EAAE,MAAM,EAAa;IAC7C,MAAM,WAAW,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAA;AAC7D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,UAAuB;IAEvB,MAAM,UAAU,GAAG,
|
|
1
|
+
{"version":3,"file":"gffToInterPro.js","sourceRoot":"","sources":["../../src/gff/gffToInterPro.ts"],"names":[],"mappings":"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"}
|
|
@@ -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/gff/parseGFF.js
CHANGED
|
@@ -47,7 +47,10 @@ export function parseGFF(str) {
|
|
|
47
47
|
const parts = f.split('\t');
|
|
48
48
|
const [seq_id, source, type, start, end, score, strand, phase] = parts;
|
|
49
49
|
const col9 = parts[8];
|
|
50
|
+
// attributes first, so a column-9 key colliding with a core column (e.g.
|
|
51
|
+
// "start=") can't turn a number field into a string
|
|
50
52
|
return {
|
|
53
|
+
...parseAttributes(col9),
|
|
51
54
|
seq_id: seq_id ?? '',
|
|
52
55
|
source: source ?? '',
|
|
53
56
|
type: type ?? '',
|
|
@@ -56,7 +59,6 @@ export function parseGFF(str) {
|
|
|
56
59
|
score: Number(score) || 0,
|
|
57
60
|
strand: strand ?? '.',
|
|
58
61
|
phase: phase ?? '.',
|
|
59
|
-
...parseAttributes(col9),
|
|
60
62
|
};
|
|
61
63
|
});
|
|
62
64
|
}
|
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,wEAAwE;QACxE,qEAAqE;QACrE,kBAAkB;QAClB,OAAO;YACL,GAAG;YACH,GAAG;gBACD,CAAC,CAAC,GAAG;qBACA,KAAK,CAAC,GAAG,CAAC;qBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBAC9B,IAAI,CAAC,GAAG,CAAC;gBACd,CAAC,CAAC,SAAS;SACd,CAAA;IACH,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,CAAA;IACX,CAAC;IACD,OAAO,GAAG;SACP,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,KAAK,CAAA;QACtE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;QAErB,OAAO;YACL,MAAM,EAAE,MAAM,IAAI,EAAE;YACpB,MAAM,EAAE,MAAM,IAAI,EAAE;YACpB,IAAI,EAAE,IAAI,IAAI,EAAE;YAChB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACrB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACzB,MAAM,EAAE,MAAM,IAAI,GAAG;YACrB,KAAK,EAAE,KAAK,IAAI,GAAG;
|
|
1
|
+
{"version":3,"file":"parseGFF.js","sourceRoot":"","sources":["../../src/gff/parseGFF.ts"],"names":[],"mappings":"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"}
|
package/dist/msa/A3mMSA.d.ts
CHANGED
|
@@ -4,11 +4,9 @@ export default class A3mMSA extends BaseMSA {
|
|
|
4
4
|
private orderedNames;
|
|
5
5
|
constructor(text: string);
|
|
6
6
|
static sniff(text: string): boolean;
|
|
7
|
-
private expandA3M;
|
|
8
7
|
getMSA(): {
|
|
9
8
|
seqdata: Record<string, string>;
|
|
10
9
|
};
|
|
11
10
|
getNames(): string[];
|
|
12
11
|
getRow(name: string): string;
|
|
13
|
-
getWidth(): number;
|
|
14
12
|
}
|
package/dist/msa/A3mMSA.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.js';
|
|
2
|
+
import { splitFastaRecords } from './fastaRecords.js';
|
|
2
3
|
/**
|
|
3
4
|
* A3M Format Parser
|
|
4
5
|
*
|
|
@@ -25,54 +26,47 @@ const CODE_Z = 90; // 'Z'
|
|
|
25
26
|
const CODE_a = 97; // 'a'
|
|
26
27
|
const CODE_z = 122; // 'z'
|
|
27
28
|
const CODE_DASH = 45; // '-'
|
|
28
|
-
const CODE_DOT = 46; // '.'
|
|
29
29
|
function isLower(code) {
|
|
30
30
|
return code >= CODE_a && code <= CODE_z;
|
|
31
31
|
}
|
|
32
|
+
function isMatch(code) {
|
|
33
|
+
return (code >= CODE_A && code <= CODE_Z) || code === CODE_DASH;
|
|
34
|
+
}
|
|
35
|
+
function parseRow(seq) {
|
|
36
|
+
const matches = [];
|
|
37
|
+
const inserts = [''];
|
|
38
|
+
for (const ch of seq) {
|
|
39
|
+
const code = ch.charCodeAt(0);
|
|
40
|
+
if (isMatch(code)) {
|
|
41
|
+
matches.push(ch);
|
|
42
|
+
inserts.push('');
|
|
43
|
+
}
|
|
44
|
+
else if (isLower(code)) {
|
|
45
|
+
inserts[inserts.length - 1] += ch.toUpperCase();
|
|
46
|
+
}
|
|
47
|
+
// '.' is padding aligned to some other row's insert, and anything else is
|
|
48
|
+
// unrecognized -- neither carries alignment information
|
|
49
|
+
}
|
|
50
|
+
return { matches, inserts };
|
|
51
|
+
}
|
|
32
52
|
export default class A3mMSA extends BaseMSA {
|
|
33
53
|
MSA;
|
|
34
54
|
orderedNames;
|
|
35
55
|
constructor(text) {
|
|
36
56
|
super();
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
const newlineIdx = entry.indexOf('\n');
|
|
44
|
-
if (newlineIdx === -1) {
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
const defLine = entry.slice(0, newlineIdx).replace(/\r$/, '');
|
|
48
|
-
const spaceIdx = defLine.indexOf(' ');
|
|
49
|
-
const id = spaceIdx === -1 ? defLine : defLine.slice(0, spaceIdx);
|
|
50
|
-
if (id) {
|
|
51
|
-
rawSeqs.push(entry.slice(newlineIdx + 1).replaceAll(/\s/g, ''));
|
|
52
|
-
names.push(id);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
this.orderedNames = names;
|
|
56
|
-
this.MSA = { seqdata: this.expandA3M(rawSeqs, names) };
|
|
57
|
+
const records = splitFastaRecords(text);
|
|
58
|
+
this.orderedNames = records.map(r => r.id);
|
|
59
|
+
this.MSA = {
|
|
60
|
+
seqdata: expandA3M(records.map(r => r.seq), this.orderedNames),
|
|
61
|
+
};
|
|
57
62
|
}
|
|
58
63
|
static sniff(text) {
|
|
59
64
|
if (!text.startsWith('>')) {
|
|
60
65
|
return false;
|
|
61
66
|
}
|
|
62
|
-
const seqs =
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
continue;
|
|
66
|
-
}
|
|
67
|
-
const newlineIdx = entry.indexOf('\n');
|
|
68
|
-
if (newlineIdx === -1) {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
const seq = entry.slice(newlineIdx + 1).replaceAll(/\s/g, '');
|
|
72
|
-
if (seq) {
|
|
73
|
-
seqs.push(seq);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
67
|
+
const seqs = splitFastaRecords(text)
|
|
68
|
+
.map(r => r.seq)
|
|
69
|
+
.filter(s => !!s);
|
|
76
70
|
if (seqs.length < 2) {
|
|
77
71
|
return false;
|
|
78
72
|
}
|
|
@@ -84,131 +78,11 @@ export default class A3mMSA extends BaseMSA {
|
|
|
84
78
|
if (new Set(seqs.map(s => s.length)).size === 1) {
|
|
85
79
|
return false;
|
|
86
80
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
for (const seq of seqs) {
|
|
91
|
-
let matchLen = 0;
|
|
92
|
-
for (let i = 0; i < seq.length; i++) {
|
|
93
|
-
const code = seq.charCodeAt(i);
|
|
94
|
-
if (isLower(code)) {
|
|
95
|
-
hasLowercase = true;
|
|
96
|
-
}
|
|
97
|
-
else if ((code >= CODE_A && code <= CODE_Z) || code === CODE_DASH) {
|
|
98
|
-
matchLen++;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
if (firstMatchLen === -1) {
|
|
102
|
-
firstMatchLen = matchLen;
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
if (matchLen !== firstMatchLen) {
|
|
106
|
-
sameMatchLength = false;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
81
|
+
const rows = seqs.map(parseRow);
|
|
82
|
+
const hasLowercase = rows.some(r => r.inserts.some(i => !!i));
|
|
83
|
+
const sameMatchLength = new Set(rows.map(r => r.matches.length)).size === 1;
|
|
110
84
|
return hasLowercase && sameMatchLength;
|
|
111
85
|
}
|
|
112
|
-
expandA3M(rawSeqs, names) {
|
|
113
|
-
const numSeqs = names.length;
|
|
114
|
-
if (numSeqs === 0) {
|
|
115
|
-
return {};
|
|
116
|
-
}
|
|
117
|
-
const matchChars = [];
|
|
118
|
-
const insertContent = [];
|
|
119
|
-
for (let seqIdx = 0; seqIdx < numSeqs; seqIdx++) {
|
|
120
|
-
const seq = rawSeqs[seqIdx];
|
|
121
|
-
const matches = [];
|
|
122
|
-
const inserts = [];
|
|
123
|
-
let i = 0;
|
|
124
|
-
while (i < seq.length) {
|
|
125
|
-
const code = seq.charCodeAt(i);
|
|
126
|
-
if ((code >= CODE_A && code <= CODE_Z) || code === CODE_DASH) {
|
|
127
|
-
matches.push(seq[i]);
|
|
128
|
-
let ins = '';
|
|
129
|
-
let j = i + 1;
|
|
130
|
-
while (j < seq.length) {
|
|
131
|
-
const c = seq.charCodeAt(j);
|
|
132
|
-
if (isLower(c) || c === CODE_DOT) {
|
|
133
|
-
ins += seq[j];
|
|
134
|
-
j++;
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
inserts.push(ins);
|
|
141
|
-
i = j;
|
|
142
|
-
}
|
|
143
|
-
else if (code === CODE_DOT) {
|
|
144
|
-
i++;
|
|
145
|
-
}
|
|
146
|
-
else if (isLower(code)) {
|
|
147
|
-
let ins = '';
|
|
148
|
-
while (i < seq.length && isLower(seq.charCodeAt(i))) {
|
|
149
|
-
ins += seq[i];
|
|
150
|
-
i++;
|
|
151
|
-
}
|
|
152
|
-
matches.push('');
|
|
153
|
-
inserts.push(ins);
|
|
154
|
-
}
|
|
155
|
-
else {
|
|
156
|
-
i++;
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
matchChars.push(matches);
|
|
160
|
-
insertContent.push(inserts);
|
|
161
|
-
}
|
|
162
|
-
const numPositions = Math.max(...matchChars.map(m => m.length), 0);
|
|
163
|
-
const maxInserts = new Array(numPositions).fill(0);
|
|
164
|
-
for (let seqIdx = 0; seqIdx < numSeqs; seqIdx++) {
|
|
165
|
-
const inserts = insertContent[seqIdx];
|
|
166
|
-
for (let pos = 0; pos < inserts.length; pos++) {
|
|
167
|
-
let lcCount = 0;
|
|
168
|
-
for (const c of inserts[pos]) {
|
|
169
|
-
if (isLower(c.charCodeAt(0))) {
|
|
170
|
-
lcCount++;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (lcCount > maxInserts[pos]) {
|
|
174
|
-
maxInserts[pos] = lcCount;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
const expanded = {};
|
|
179
|
-
for (let seqIdx = 0; seqIdx < numSeqs; seqIdx++) {
|
|
180
|
-
const matches = matchChars[seqIdx];
|
|
181
|
-
const inserts = insertContent[seqIdx];
|
|
182
|
-
const result = [];
|
|
183
|
-
for (let pos = 0; pos < numPositions; pos++) {
|
|
184
|
-
const maxIns = maxInserts[pos];
|
|
185
|
-
if (pos < matches.length) {
|
|
186
|
-
const matchChar = matches[pos];
|
|
187
|
-
const insContent = inserts[pos] || '';
|
|
188
|
-
result.push(matchChar || '-');
|
|
189
|
-
let lcContent = '';
|
|
190
|
-
for (const c of insContent) {
|
|
191
|
-
if (isLower(c.charCodeAt(0))) {
|
|
192
|
-
lcContent += c.toUpperCase();
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
result.push(lcContent);
|
|
196
|
-
const padding = maxIns - lcContent.length;
|
|
197
|
-
if (padding > 0) {
|
|
198
|
-
result.push('.'.repeat(padding));
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
result.push('-');
|
|
203
|
-
if (maxIns > 0) {
|
|
204
|
-
result.push('.'.repeat(maxIns));
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
expanded[names[seqIdx]] = result.join('');
|
|
209
|
-
}
|
|
210
|
-
return expanded;
|
|
211
|
-
}
|
|
212
86
|
getMSA() {
|
|
213
87
|
return this.MSA;
|
|
214
88
|
}
|
|
@@ -216,11 +90,37 @@ export default class A3mMSA extends BaseMSA {
|
|
|
216
90
|
return this.orderedNames;
|
|
217
91
|
}
|
|
218
92
|
getRow(name) {
|
|
219
|
-
return this.MSA.seqdata[name]
|
|
93
|
+
return this.MSA.seqdata[name] ?? '';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Expand A3M rows into a rectangular alignment: every insert slot is widened to
|
|
98
|
+
* the longest insert any row places there, and rows without one are padded with
|
|
99
|
+
* '.' so all rows stay in register.
|
|
100
|
+
*/
|
|
101
|
+
function expandA3M(rawSeqs, names) {
|
|
102
|
+
const rows = rawSeqs.map(parseRow);
|
|
103
|
+
const numPositions = Math.max(...rows.map(r => r.matches.length), 0);
|
|
104
|
+
// one insert slot before each match column, plus one trailing slot
|
|
105
|
+
const maxInserts = new Array(numPositions + 1).fill(0);
|
|
106
|
+
for (const { inserts } of rows) {
|
|
107
|
+
for (const [pos, ins] of inserts.entries()) {
|
|
108
|
+
maxInserts[pos] = Math.max(maxInserts[pos], ins.length);
|
|
109
|
+
}
|
|
220
110
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
111
|
+
const expanded = {};
|
|
112
|
+
for (const [seqIdx, { matches, inserts }] of rows.entries()) {
|
|
113
|
+
const result = [];
|
|
114
|
+
for (let pos = 0; pos <= numPositions; pos++) {
|
|
115
|
+
const ins = inserts[pos] ?? '';
|
|
116
|
+
result.push(ins, '.'.repeat(maxInserts[pos] - ins.length));
|
|
117
|
+
if (pos < numPositions) {
|
|
118
|
+
// a row with fewer match columns than the widest is padded out
|
|
119
|
+
result.push(matches[pos] ?? '-');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
expanded[names[seqIdx]] = result.join('');
|
|
224
123
|
}
|
|
124
|
+
return expanded;
|
|
225
125
|
}
|
|
226
126
|
//# sourceMappingURL=A3mMSA.js.map
|
package/dist/msa/A3mMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A3mMSA.js","sourceRoot":"","sources":["../../src/msa/A3mMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;
|
|
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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"}
|