clustal-js 2.0.10 → 2.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +4 -8
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/pairwise.d.ts +0 -1
- package/dist/pairwise.js +16 -6
- package/dist/pairwise.js.map +1 -1
- package/dist/util.d.ts +2 -2
- package/dist/util.js +6 -2
- package/dist/util.js.map +1 -1
- package/esm/index.d.ts +4 -8
- package/esm/index.js +17 -15
- package/esm/index.js.map +1 -1
- package/esm/pairwise.d.ts +0 -1
- package/esm/pairwise.js +17 -6
- package/esm/pairwise.js.map +1 -1
- package/esm/util.d.ts +2 -2
- package/esm/util.js +6 -2
- package/esm/util.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +24 -21
- package/src/pairwise.ts +27 -13
- package/src/util.ts +13 -9
package/dist/index.d.ts
CHANGED
|
@@ -1,31 +1,27 @@
|
|
|
1
1
|
export declare function parseClustalIter(arr: Iterator<string>): {
|
|
2
2
|
consensus: string;
|
|
3
3
|
alns: {
|
|
4
|
-
id: string;
|
|
4
|
+
id: string | undefined;
|
|
5
5
|
seq: string;
|
|
6
6
|
}[];
|
|
7
7
|
header: {
|
|
8
8
|
info: string;
|
|
9
|
-
version: string;
|
|
9
|
+
version: string | undefined;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
12
|
export interface Row {
|
|
13
13
|
id: string;
|
|
14
14
|
seq: string;
|
|
15
15
|
}
|
|
16
|
-
export declare function parsePairwiseIter(arr: string): {
|
|
17
|
-
consensus: string;
|
|
18
|
-
alns: [Row, Row];
|
|
19
|
-
};
|
|
20
16
|
export declare function parse(contents: string): {
|
|
21
17
|
consensus: string;
|
|
22
18
|
alns: {
|
|
23
|
-
id: string;
|
|
19
|
+
id: string | undefined;
|
|
24
20
|
seq: string;
|
|
25
21
|
}[];
|
|
26
22
|
header: {
|
|
27
23
|
info: string;
|
|
28
|
-
version: string;
|
|
24
|
+
version: string | undefined;
|
|
29
25
|
};
|
|
30
26
|
};
|
|
31
27
|
export declare function parsePairwise(contents: string): {
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.parseClustalIter = parseClustalIter;
|
|
4
|
-
exports.parsePairwiseIter = parsePairwiseIter;
|
|
5
4
|
exports.parse = parse;
|
|
6
5
|
exports.parsePairwise = parsePairwise;
|
|
7
6
|
const pairwise_ts_1 = require("./pairwise.js");
|
|
@@ -23,32 +22,34 @@ function parseClustalIter(arr) {
|
|
|
23
22
|
}
|
|
24
23
|
return { consensus, alns, header };
|
|
25
24
|
}
|
|
26
|
-
function
|
|
27
|
-
const
|
|
25
|
+
function parse(contents) {
|
|
26
|
+
const iter = contents.split('\n')[Symbol.iterator]();
|
|
27
|
+
return parseClustalIter(iter);
|
|
28
|
+
}
|
|
29
|
+
function parsePairwise(contents) {
|
|
30
|
+
const filtered = contents
|
|
31
|
+
.split('\n')
|
|
32
|
+
.filter(f => !f.startsWith('#'))
|
|
33
|
+
.join('\n');
|
|
34
|
+
const res = (0, pairwise_ts_1.parsePairwiseBlocks)(filtered.split('\n')[Symbol.iterator]());
|
|
28
35
|
if (res === undefined) {
|
|
29
36
|
throw new Error('No blocks parsed');
|
|
30
37
|
}
|
|
31
38
|
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }));
|
|
32
39
|
const { consensus } = res;
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
const firstAln = alns[0];
|
|
41
|
+
if (!firstAln) {
|
|
42
|
+
throw new Error('No alignments found');
|
|
43
|
+
}
|
|
44
|
+
if (consensus.length !== firstAln.seq.length) {
|
|
45
|
+
throw new Error(`Consensus length !== sequence length. Con ${consensus.length} seq ${firstAln.seq.length}`);
|
|
35
46
|
}
|
|
36
47
|
if (alns.length !== 2) {
|
|
37
|
-
throw new Error(
|
|
48
|
+
throw new Error(`Expected exactly 2 sequences in pairwise alignment, got ${alns.length}`);
|
|
38
49
|
}
|
|
39
50
|
return {
|
|
40
51
|
consensus,
|
|
41
52
|
alns: alns,
|
|
42
53
|
};
|
|
43
54
|
}
|
|
44
|
-
function parse(contents) {
|
|
45
|
-
const iter = contents.split('\n')[Symbol.iterator]();
|
|
46
|
-
return parseClustalIter(iter);
|
|
47
|
-
}
|
|
48
|
-
function parsePairwise(contents) {
|
|
49
|
-
return parsePairwiseIter(contents
|
|
50
|
-
.split('\n')
|
|
51
|
-
.filter(f => !f.startsWith('#'))
|
|
52
|
-
.join('\n'));
|
|
53
|
-
}
|
|
54
55
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAGA,4CAqBC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/pairwise.d.ts
CHANGED
package/dist/pairwise.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSeqBounds = getSeqBounds;
|
|
4
3
|
exports.parsePairwiseBlock = parsePairwiseBlock;
|
|
5
4
|
exports.parsePairwiseBlocks = parsePairwiseBlocks;
|
|
6
5
|
const util_ts_1 = require("./util.js");
|
|
@@ -50,17 +49,28 @@ function parsePairwiseBlock(arr) {
|
|
|
50
49
|
return undefined;
|
|
51
50
|
}
|
|
52
51
|
const fields = block.map(s => s.trim().split(/\s+/));
|
|
53
|
-
const
|
|
52
|
+
const firstField = fields[0];
|
|
53
|
+
if (!firstField) {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
const seqIndex = hasPositionNumbers(firstField) ? 2 : 1;
|
|
54
57
|
const [start, end] = getSeqBounds(block[0], seqIndex);
|
|
55
58
|
const ids = fields.map(s => s[0]);
|
|
56
59
|
const seqs = fields.map(s => s[seqIndex]);
|
|
57
60
|
let consensus = consensusLine.slice(start, end);
|
|
58
61
|
// handle if the consensus trailing whitespace got trimmed
|
|
59
|
-
const
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
+
const firstSeq = seqs[0];
|
|
63
|
+
if (firstSeq) {
|
|
64
|
+
const remainder = firstSeq.length - consensus.length;
|
|
65
|
+
if (remainder > 0) {
|
|
66
|
+
consensus += ' '.repeat(remainder);
|
|
67
|
+
}
|
|
62
68
|
}
|
|
63
|
-
return {
|
|
69
|
+
return {
|
|
70
|
+
ids,
|
|
71
|
+
seqs,
|
|
72
|
+
consensus,
|
|
73
|
+
};
|
|
64
74
|
}
|
|
65
75
|
function parsePairwiseBlocks(arr) {
|
|
66
76
|
let block;
|
package/dist/pairwise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export declare function parseVersion(line: string): string;
|
|
1
|
+
export declare function parseVersion(line: string): string | undefined;
|
|
2
2
|
export declare function parseHeader(info: string): {
|
|
3
3
|
info: string;
|
|
4
|
-
version: string;
|
|
4
|
+
version: string | undefined;
|
|
5
5
|
};
|
|
6
6
|
export declare function getFirstNonEmptyLine(arr: Iterator<string>): string;
|
|
7
7
|
export declare function getSeqBounds(line: string): readonly [number, number];
|
package/dist/util.js
CHANGED
|
@@ -42,7 +42,7 @@ function parseBlock(arr) {
|
|
|
42
42
|
return undefined;
|
|
43
43
|
}
|
|
44
44
|
while (line) {
|
|
45
|
-
if (line
|
|
45
|
+
if (line.startsWith(' ')) {
|
|
46
46
|
consensusLine = line;
|
|
47
47
|
}
|
|
48
48
|
else {
|
|
@@ -60,7 +60,11 @@ function parseBlock(arr) {
|
|
|
60
60
|
if (remainder) {
|
|
61
61
|
consensus += ' '.repeat(remainder);
|
|
62
62
|
}
|
|
63
|
-
return {
|
|
63
|
+
return {
|
|
64
|
+
ids,
|
|
65
|
+
seqs,
|
|
66
|
+
consensus,
|
|
67
|
+
};
|
|
64
68
|
}
|
|
65
69
|
function parseBlocks(arr) {
|
|
66
70
|
let block;
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":";;AAAA,oCAGC;AACD,kCAYC;AAED,oDAOC;AAED,oCAMC;AAGD,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/esm/index.d.ts
CHANGED
|
@@ -1,31 +1,27 @@
|
|
|
1
1
|
export declare function parseClustalIter(arr: Iterator<string>): {
|
|
2
2
|
consensus: string;
|
|
3
3
|
alns: {
|
|
4
|
-
id: string;
|
|
4
|
+
id: string | undefined;
|
|
5
5
|
seq: string;
|
|
6
6
|
}[];
|
|
7
7
|
header: {
|
|
8
8
|
info: string;
|
|
9
|
-
version: string;
|
|
9
|
+
version: string | undefined;
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
12
|
export interface Row {
|
|
13
13
|
id: string;
|
|
14
14
|
seq: string;
|
|
15
15
|
}
|
|
16
|
-
export declare function parsePairwiseIter(arr: string): {
|
|
17
|
-
consensus: string;
|
|
18
|
-
alns: [Row, Row];
|
|
19
|
-
};
|
|
20
16
|
export declare function parse(contents: string): {
|
|
21
17
|
consensus: string;
|
|
22
18
|
alns: {
|
|
23
|
-
id: string;
|
|
19
|
+
id: string | undefined;
|
|
24
20
|
seq: string;
|
|
25
21
|
}[];
|
|
26
22
|
header: {
|
|
27
23
|
info: string;
|
|
28
|
-
version: string;
|
|
24
|
+
version: string | undefined;
|
|
29
25
|
};
|
|
30
26
|
};
|
|
31
27
|
export declare function parsePairwise(contents: string): {
|
package/esm/index.js
CHANGED
|
@@ -17,32 +17,34 @@ export function parseClustalIter(arr) {
|
|
|
17
17
|
}
|
|
18
18
|
return { consensus, alns, header };
|
|
19
19
|
}
|
|
20
|
-
export function
|
|
21
|
-
const
|
|
20
|
+
export function parse(contents) {
|
|
21
|
+
const iter = contents.split('\n')[Symbol.iterator]();
|
|
22
|
+
return parseClustalIter(iter);
|
|
23
|
+
}
|
|
24
|
+
export function parsePairwise(contents) {
|
|
25
|
+
const filtered = contents
|
|
26
|
+
.split('\n')
|
|
27
|
+
.filter(f => !f.startsWith('#'))
|
|
28
|
+
.join('\n');
|
|
29
|
+
const res = parsePairwiseBlocks(filtered.split('\n')[Symbol.iterator]());
|
|
22
30
|
if (res === undefined) {
|
|
23
31
|
throw new Error('No blocks parsed');
|
|
24
32
|
}
|
|
25
33
|
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }));
|
|
26
34
|
const { consensus } = res;
|
|
27
|
-
|
|
28
|
-
|
|
35
|
+
const firstAln = alns[0];
|
|
36
|
+
if (!firstAln) {
|
|
37
|
+
throw new Error('No alignments found');
|
|
38
|
+
}
|
|
39
|
+
if (consensus.length !== firstAln.seq.length) {
|
|
40
|
+
throw new Error(`Consensus length !== sequence length. Con ${consensus.length} seq ${firstAln.seq.length}`);
|
|
29
41
|
}
|
|
30
42
|
if (alns.length !== 2) {
|
|
31
|
-
throw new Error(
|
|
43
|
+
throw new Error(`Expected exactly 2 sequences in pairwise alignment, got ${alns.length}`);
|
|
32
44
|
}
|
|
33
45
|
return {
|
|
34
46
|
consensus,
|
|
35
47
|
alns: alns,
|
|
36
48
|
};
|
|
37
49
|
}
|
|
38
|
-
export function parse(contents) {
|
|
39
|
-
const iter = contents.split('\n')[Symbol.iterator]();
|
|
40
|
-
return parseClustalIter(iter);
|
|
41
|
-
}
|
|
42
|
-
export function parsePairwise(contents) {
|
|
43
|
-
return parsePairwiseIter(contents
|
|
44
|
-
.split('\n')
|
|
45
|
-
.filter(f => !f.startsWith('#'))
|
|
46
|
-
.join('\n'));
|
|
47
|
-
}
|
|
48
50
|
//# sourceMappingURL=index.js.map
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAE1E,MAAM,UAAU,gBAAgB,CAAC,GAAqB;IACpD,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAA;IACxC,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;IAEhC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IACzE,MAAM,EAAE,SAAS,EAAE,GAAG,GAAG,CAAA;IACzB,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/esm/pairwise.d.ts
CHANGED
package/esm/pairwise.js
CHANGED
|
@@ -14,7 +14,7 @@ function isSequenceLine(line) {
|
|
|
14
14
|
function hasPositionNumbers(fields) {
|
|
15
15
|
return fields.length >= 3 && /^\d+$/.test(fields[1]);
|
|
16
16
|
}
|
|
17
|
-
|
|
17
|
+
function getSeqBounds(line, seqIndex) {
|
|
18
18
|
const trimmed = line.trim();
|
|
19
19
|
const fields = trimmed.split(/\s+/);
|
|
20
20
|
const seq = fields[seqIndex];
|
|
@@ -45,17 +45,28 @@ export function parsePairwiseBlock(arr) {
|
|
|
45
45
|
return undefined;
|
|
46
46
|
}
|
|
47
47
|
const fields = block.map(s => s.trim().split(/\s+/));
|
|
48
|
-
const
|
|
48
|
+
const firstField = fields[0];
|
|
49
|
+
if (!firstField) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const seqIndex = hasPositionNumbers(firstField) ? 2 : 1;
|
|
49
53
|
const [start, end] = getSeqBounds(block[0], seqIndex);
|
|
50
54
|
const ids = fields.map(s => s[0]);
|
|
51
55
|
const seqs = fields.map(s => s[seqIndex]);
|
|
52
56
|
let consensus = consensusLine.slice(start, end);
|
|
53
57
|
// handle if the consensus trailing whitespace got trimmed
|
|
54
|
-
const
|
|
55
|
-
if (
|
|
56
|
-
|
|
58
|
+
const firstSeq = seqs[0];
|
|
59
|
+
if (firstSeq) {
|
|
60
|
+
const remainder = firstSeq.length - consensus.length;
|
|
61
|
+
if (remainder > 0) {
|
|
62
|
+
consensus += ' '.repeat(remainder);
|
|
63
|
+
}
|
|
57
64
|
}
|
|
58
|
-
return {
|
|
65
|
+
return {
|
|
66
|
+
ids,
|
|
67
|
+
seqs,
|
|
68
|
+
consensus,
|
|
69
|
+
};
|
|
59
70
|
}
|
|
60
71
|
export function parsePairwiseBlocks(arr) {
|
|
61
72
|
let block;
|
package/esm/pairwise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAEhD,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IACnC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,OAAO,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;AACtD,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAgB;IAC1C,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
|
package/esm/util.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export declare function parseVersion(line: string): string;
|
|
1
|
+
export declare function parseVersion(line: string): string | undefined;
|
|
2
2
|
export declare function parseHeader(info: string): {
|
|
3
3
|
info: string;
|
|
4
|
-
version: string;
|
|
4
|
+
version: string | undefined;
|
|
5
5
|
};
|
|
6
6
|
export declare function getFirstNonEmptyLine(arr: Iterator<string>): string;
|
|
7
7
|
export declare function getSeqBounds(line: string): readonly [number, number];
|
package/esm/util.js
CHANGED
|
@@ -34,7 +34,7 @@ export function parseBlock(arr) {
|
|
|
34
34
|
return undefined;
|
|
35
35
|
}
|
|
36
36
|
while (line) {
|
|
37
|
-
if (line
|
|
37
|
+
if (line.startsWith(' ')) {
|
|
38
38
|
consensusLine = line;
|
|
39
39
|
}
|
|
40
40
|
else {
|
|
@@ -52,7 +52,11 @@ export function parseBlock(arr) {
|
|
|
52
52
|
if (remainder) {
|
|
53
53
|
consensus += ' '.repeat(remainder);
|
|
54
54
|
}
|
|
55
|
-
return {
|
|
55
|
+
return {
|
|
56
|
+
ids,
|
|
57
|
+
seqs,
|
|
58
|
+
consensus,
|
|
59
|
+
};
|
|
56
60
|
}
|
|
57
61
|
export function parseBlocks(arr) {
|
|
58
62
|
let block;
|
package/esm/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5C,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAC5C,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,YAAY,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAA;IAE5E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,IAAI,CACV,GAAG,IAAI,mCAAmC,YAAY,CAAC,IAAI,CACzD,GAAG,CACJ,0CAA0C,CAC5C,CAAA;IACH,CAAC;IACD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAqB;IACxD,wDAAwD;IACxD,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACrB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC9C,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAA;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAA;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -15,9 +15,9 @@ export function parseClustalIter(arr: Iterator<string>) {
|
|
|
15
15
|
|
|
16
16
|
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }))
|
|
17
17
|
const { consensus } = res
|
|
18
|
-
if (consensus.length != alns[0]
|
|
18
|
+
if (consensus.length != alns[0]!.seq.length) {
|
|
19
19
|
throw new Error(
|
|
20
|
-
`Consensus length != sequence length. Con ${consensus.length} seq ${alns[0]
|
|
20
|
+
`Consensus length != sequence length. Con ${consensus.length} seq ${alns[0]!.seq.length}`,
|
|
21
21
|
)
|
|
22
22
|
}
|
|
23
23
|
|
|
@@ -28,38 +28,41 @@ export interface Row {
|
|
|
28
28
|
id: string
|
|
29
29
|
seq: string
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
|
|
32
|
+
export function parse(contents: string) {
|
|
33
|
+
const iter = contents.split('\n')[Symbol.iterator]()
|
|
34
|
+
return parseClustalIter(iter)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function parsePairwise(contents: string) {
|
|
38
|
+
const filtered = contents
|
|
39
|
+
.split('\n')
|
|
40
|
+
.filter(f => !f.startsWith('#'))
|
|
41
|
+
.join('\n')
|
|
42
|
+
|
|
43
|
+
const res = parsePairwiseBlocks(filtered.split('\n')[Symbol.iterator]())
|
|
33
44
|
if (res === undefined) {
|
|
34
45
|
throw new Error('No blocks parsed')
|
|
35
46
|
}
|
|
36
47
|
|
|
37
48
|
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }))
|
|
38
49
|
const { consensus } = res
|
|
39
|
-
|
|
50
|
+
const firstAln = alns[0]
|
|
51
|
+
if (!firstAln) {
|
|
52
|
+
throw new Error('No alignments found')
|
|
53
|
+
}
|
|
54
|
+
if (consensus.length !== firstAln.seq.length) {
|
|
40
55
|
throw new Error(
|
|
41
|
-
`Consensus length
|
|
56
|
+
`Consensus length !== sequence length. Con ${consensus.length} seq ${firstAln.seq.length}`,
|
|
42
57
|
)
|
|
43
58
|
}
|
|
44
59
|
if (alns.length !== 2) {
|
|
45
|
-
throw new Error(
|
|
60
|
+
throw new Error(
|
|
61
|
+
`Expected exactly 2 sequences in pairwise alignment, got ${alns.length}`,
|
|
62
|
+
)
|
|
46
63
|
}
|
|
47
64
|
return {
|
|
48
65
|
consensus,
|
|
49
66
|
alns: alns as [Row, Row],
|
|
50
67
|
}
|
|
51
68
|
}
|
|
52
|
-
|
|
53
|
-
export function parse(contents: string) {
|
|
54
|
-
const iter = contents.split('\n')[Symbol.iterator]()
|
|
55
|
-
return parseClustalIter(iter)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
export function parsePairwise(contents: string) {
|
|
59
|
-
return parsePairwiseIter(
|
|
60
|
-
contents
|
|
61
|
-
.split('\n')
|
|
62
|
-
.filter(f => !f.startsWith('#'))
|
|
63
|
-
.join('\n'),
|
|
64
|
-
)
|
|
65
|
-
}
|
package/src/pairwise.ts
CHANGED
|
@@ -15,14 +15,17 @@ function isSequenceLine(line: string) {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
function hasPositionNumbers(fields: string[]) {
|
|
18
|
-
return fields.length >= 3 && /^\d+$/.test(fields[1])
|
|
18
|
+
return fields.length >= 3 && /^\d+$/.test(fields[1]!)
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
function getSeqBounds(line: string, seqIndex: number) {
|
|
22
22
|
const trimmed = line.trim()
|
|
23
23
|
const fields = trimmed.split(/\s+/)
|
|
24
|
-
const seq = fields[seqIndex]
|
|
25
|
-
const seqStart = line.indexOf(
|
|
24
|
+
const seq = fields[seqIndex]!
|
|
25
|
+
const seqStart = line.indexOf(
|
|
26
|
+
seq,
|
|
27
|
+
line.indexOf(fields[0]!) + fields[0]!.length,
|
|
28
|
+
)
|
|
26
29
|
return [seqStart, seqStart + seq.length] as const
|
|
27
30
|
}
|
|
28
31
|
|
|
@@ -51,18 +54,29 @@ export function parsePairwiseBlock(arr: Iterator<string>) {
|
|
|
51
54
|
}
|
|
52
55
|
|
|
53
56
|
const fields = block.map(s => s.trim().split(/\s+/))
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
const firstField = fields[0]
|
|
58
|
+
if (!firstField) {
|
|
59
|
+
return undefined
|
|
60
|
+
}
|
|
61
|
+
const seqIndex = hasPositionNumbers(firstField) ? 2 : 1
|
|
62
|
+
const [start, end] = getSeqBounds(block[0]!, seqIndex)
|
|
63
|
+
const ids = fields.map(s => s[0]!)
|
|
64
|
+
const seqs = fields.map(s => s[seqIndex]!)
|
|
58
65
|
let consensus = consensusLine.slice(start, end)
|
|
59
66
|
|
|
60
67
|
// handle if the consensus trailing whitespace got trimmed
|
|
61
|
-
const
|
|
62
|
-
if (
|
|
63
|
-
|
|
68
|
+
const firstSeq = seqs[0]
|
|
69
|
+
if (firstSeq) {
|
|
70
|
+
const remainder = firstSeq.length - consensus.length
|
|
71
|
+
if (remainder > 0) {
|
|
72
|
+
consensus += ' '.repeat(remainder)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
ids,
|
|
77
|
+
seqs,
|
|
78
|
+
consensus,
|
|
64
79
|
}
|
|
65
|
-
return { ids, seqs, consensus }
|
|
66
80
|
}
|
|
67
81
|
|
|
68
82
|
export function parsePairwiseBlocks(arr: Iterator<string>) {
|
|
@@ -71,7 +85,7 @@ export function parsePairwiseBlocks(arr: Iterator<string>) {
|
|
|
71
85
|
if (res !== undefined) {
|
|
72
86
|
while ((block = parsePairwiseBlock(arr))) {
|
|
73
87
|
for (let i = 0; i < block.seqs.length; i++) {
|
|
74
|
-
res.seqs[i] += block.seqs[i]
|
|
88
|
+
res.seqs[i]! += block.seqs[i]!
|
|
75
89
|
}
|
|
76
90
|
res.consensus += block.consensus
|
|
77
91
|
}
|
package/src/util.ts
CHANGED
|
@@ -27,9 +27,9 @@ export function getFirstNonEmptyLine(arr: Iterator<string>): string {
|
|
|
27
27
|
|
|
28
28
|
export function getSeqBounds(line: string) {
|
|
29
29
|
const fields = line.split(/\s+/)
|
|
30
|
-
const temp = line.slice(fields[0]
|
|
31
|
-
const s = fields[0]
|
|
32
|
-
const e = s + fields[1]
|
|
30
|
+
const temp = line.slice(fields[0]!.length)
|
|
31
|
+
const s = fields[0]!.length + temp.indexOf(fields[1]!)
|
|
32
|
+
const e = s + fields[1]!.length
|
|
33
33
|
return [s, e] as const
|
|
34
34
|
}
|
|
35
35
|
|
|
@@ -43,25 +43,29 @@ export function parseBlock(arr: Iterator<string>) {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
while (line) {
|
|
46
|
-
if (line
|
|
46
|
+
if (line.startsWith(' ')) {
|
|
47
47
|
consensusLine = line
|
|
48
48
|
} else {
|
|
49
49
|
block.push(line)
|
|
50
50
|
}
|
|
51
51
|
line = arr.next().value
|
|
52
52
|
}
|
|
53
|
-
const [start, end] = getSeqBounds(block[0])
|
|
53
|
+
const [start, end] = getSeqBounds(block[0]!)
|
|
54
54
|
const fields = block.map(s => s.split(/\s+/))
|
|
55
|
-
const ids = fields.map(s => s[0])
|
|
55
|
+
const ids = fields.map(s => s[0]!)
|
|
56
56
|
const seqs = block.map(s => s.slice(start, end))
|
|
57
57
|
let consensus = consensusLine.slice(start, end)
|
|
58
58
|
|
|
59
59
|
// handle if the consensus trailing whitespace got trimmed
|
|
60
|
-
const remainder = seqs[0]
|
|
60
|
+
const remainder = seqs[0]!.length - consensus.length
|
|
61
61
|
if (remainder) {
|
|
62
62
|
consensus += ' '.repeat(remainder)
|
|
63
63
|
}
|
|
64
|
-
return {
|
|
64
|
+
return {
|
|
65
|
+
ids,
|
|
66
|
+
seqs,
|
|
67
|
+
consensus,
|
|
68
|
+
}
|
|
65
69
|
}
|
|
66
70
|
|
|
67
71
|
export function parseBlocks(arr: Iterator<string>) {
|
|
@@ -70,7 +74,7 @@ export function parseBlocks(arr: Iterator<string>) {
|
|
|
70
74
|
if (res !== undefined) {
|
|
71
75
|
while ((block = parseBlock(arr))) {
|
|
72
76
|
for (let i = 0; i < block.seqs.length; i++) {
|
|
73
|
-
res.seqs[i] += block.seqs[i]
|
|
77
|
+
res.seqs[i]! += block.seqs[i]!
|
|
74
78
|
}
|
|
75
79
|
res.consensus += block.consensus
|
|
76
80
|
}
|