clustal-js 2.0.7 → 2.0.9
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.js +16 -16
- package/dist/index.js.map +1 -1
- package/dist/pairwise.js +20 -20
- package/dist/pairwise.js.map +1 -1
- package/dist/util.js +24 -24
- package/dist/util.js.map +1 -1
- package/esm/index.js +20 -26
- package/esm/index.js.map +1 -1
- package/esm/pairwise.js +23 -28
- package/esm/pairwise.js.map +1 -1
- package/esm/util.js +30 -38
- package/esm/util.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4,51 +4,51 @@ exports.parseClustalIter = parseClustalIter;
|
|
|
4
4
|
exports.parsePairwiseIter = parsePairwiseIter;
|
|
5
5
|
exports.parse = parse;
|
|
6
6
|
exports.parsePairwise = parsePairwise;
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
const pairwise_ts_1 = require("./pairwise.js");
|
|
8
|
+
const util_ts_1 = require("./util.js");
|
|
9
9
|
function parseClustalIter(arr) {
|
|
10
|
-
|
|
10
|
+
const line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
|
|
11
11
|
if (!line) {
|
|
12
12
|
throw new Error('Empty file received');
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
const header = (0, util_ts_1.parseHeader)(line);
|
|
15
|
+
const res = (0, util_ts_1.parseBlocks)(arr);
|
|
16
16
|
if (res === undefined) {
|
|
17
17
|
throw new Error('No blocks parsed');
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }));
|
|
20
|
+
const { consensus } = res;
|
|
21
21
|
if (consensus.length != alns[0].seq.length) {
|
|
22
|
-
throw new Error(
|
|
22
|
+
throw new Error(`Consensus length != sequence length. Con ${consensus.length} seq ${alns[0].seq.length}`);
|
|
23
23
|
}
|
|
24
|
-
return { consensus
|
|
24
|
+
return { consensus, alns, header };
|
|
25
25
|
}
|
|
26
26
|
function parsePairwiseIter(arr) {
|
|
27
|
-
|
|
27
|
+
const res = (0, pairwise_ts_1.parsePairwiseBlocks)(arr.split('\n')[Symbol.iterator]());
|
|
28
28
|
if (res === undefined) {
|
|
29
29
|
throw new Error('No blocks parsed');
|
|
30
30
|
}
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }));
|
|
32
|
+
const { consensus } = res;
|
|
33
33
|
if (consensus.length != alns[0].seq.length) {
|
|
34
|
-
throw new Error(
|
|
34
|
+
throw new Error(`Consensus length != sequence length. Con ${consensus.length} seq ${alns[0].seq.length}`);
|
|
35
35
|
}
|
|
36
36
|
if (alns.length !== 2) {
|
|
37
37
|
throw new Error('More than two sequences in pairwise alignment');
|
|
38
38
|
}
|
|
39
39
|
return {
|
|
40
|
-
consensus
|
|
40
|
+
consensus,
|
|
41
41
|
alns: alns,
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
function parse(contents) {
|
|
45
|
-
|
|
45
|
+
const iter = contents.split('\n')[Symbol.iterator]();
|
|
46
46
|
return parseClustalIter(iter);
|
|
47
47
|
}
|
|
48
48
|
function parsePairwise(contents) {
|
|
49
49
|
return parsePairwiseIter(contents
|
|
50
50
|
.split('\n')
|
|
51
|
-
.filter(
|
|
51
|
+
.filter(f => !f.startsWith('#'))
|
|
52
52
|
.join('\n'));
|
|
53
53
|
}
|
|
54
54
|
//# 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;AAMD,8CAoBC;AAED,sBAGC;AAED,sCAOC;AAhED
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/pairwise.js
CHANGED
|
@@ -3,26 +3,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getSeqBounds = getSeqBounds;
|
|
4
4
|
exports.parsePairwiseBlock = parsePairwiseBlock;
|
|
5
5
|
exports.parsePairwiseBlocks = parsePairwiseBlocks;
|
|
6
|
-
|
|
6
|
+
const util_ts_1 = require("./util.js");
|
|
7
7
|
function isSequenceLine(line) {
|
|
8
|
-
|
|
8
|
+
const trimmed = line.trim();
|
|
9
9
|
return /^\w+\s+/.test(trimmed);
|
|
10
10
|
}
|
|
11
11
|
function hasPositionNumbers(fields) {
|
|
12
12
|
return fields.length >= 3 && /^\d+$/.test(fields[1]);
|
|
13
13
|
}
|
|
14
14
|
function getSeqBounds(line, seqIndex) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
const trimmed = line.trim();
|
|
16
|
+
const fields = trimmed.split(/\s+/);
|
|
17
|
+
const seq = fields[seqIndex];
|
|
18
|
+
const seqStart = line.indexOf(seq, line.indexOf(fields[0]) + fields[0].length);
|
|
19
19
|
return [seqStart, seqStart + seq.length];
|
|
20
20
|
}
|
|
21
21
|
// Use the first block to get the sequence identifiers
|
|
22
22
|
function parsePairwiseBlock(arr) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
let line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
|
|
24
|
+
const block = [];
|
|
25
|
+
let consensusLine = '';
|
|
26
26
|
if (!line) {
|
|
27
27
|
return undefined;
|
|
28
28
|
}
|
|
@@ -38,25 +38,25 @@ function parsePairwiseBlock(arr) {
|
|
|
38
38
|
if (block.length === 0) {
|
|
39
39
|
return undefined;
|
|
40
40
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
41
|
+
const fields = block.map(s => s.trim().split(/\s+/));
|
|
42
|
+
const seqIndex = hasPositionNumbers(fields[0]) ? 2 : 1;
|
|
43
|
+
const [start, end] = getSeqBounds(block[0], seqIndex);
|
|
44
|
+
const ids = fields.map(s => s[0]);
|
|
45
|
+
const seqs = fields.map(s => s[seqIndex]);
|
|
46
|
+
let consensus = consensusLine.slice(start, end);
|
|
47
47
|
// handle if the consensus trailing whitespace got trimmed
|
|
48
|
-
|
|
48
|
+
const remainder = seqs[0].length - consensus.length;
|
|
49
49
|
if (remainder > 0) {
|
|
50
50
|
consensus += ' '.repeat(remainder);
|
|
51
51
|
}
|
|
52
|
-
return { ids
|
|
52
|
+
return { ids, seqs, consensus };
|
|
53
53
|
}
|
|
54
54
|
function parsePairwiseBlocks(arr) {
|
|
55
|
-
|
|
56
|
-
|
|
55
|
+
let block;
|
|
56
|
+
const res = parsePairwiseBlock(arr);
|
|
57
57
|
if (res !== undefined) {
|
|
58
58
|
while ((block = parsePairwiseBlock(arr))) {
|
|
59
|
-
for (
|
|
59
|
+
for (let i = 0; i < block.seqs.length; i++) {
|
|
60
60
|
res.seqs[i] += block.seqs[i];
|
|
61
61
|
}
|
|
62
62
|
res.consensus += block.consensus;
|
package/dist/pairwise.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":";;AAWA,oCAMC;AAGD,gDAkCC;AAED,kDAYC;AApED,
|
|
1
|
+
{"version":3,"file":"pairwise.js","sourceRoot":"","sources":["../src/pairwise.ts"],"names":[],"mappings":"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"}
|
package/dist/util.js
CHANGED
|
@@ -7,37 +7,37 @@ exports.getSeqBounds = getSeqBounds;
|
|
|
7
7
|
exports.parseBlock = parseBlock;
|
|
8
8
|
exports.parseBlocks = parseBlocks;
|
|
9
9
|
function parseVersion(line) {
|
|
10
|
-
|
|
10
|
+
const res = /\(?(\d+(\.\d+)+)\)?/.exec(line);
|
|
11
11
|
return res && res.length > 1 ? res[1] : '';
|
|
12
12
|
}
|
|
13
13
|
function parseHeader(info) {
|
|
14
|
-
|
|
15
|
-
if (!knownHeaders.some(
|
|
16
|
-
console.warn(
|
|
14
|
+
const knownHeaders = ['CLUSTAL', 'PROBCONS', 'MUSCLE', 'MSAPROBS', 'Kalign'];
|
|
15
|
+
if (!knownHeaders.some(l => info.startsWith(l))) {
|
|
16
|
+
console.warn(`${info} is not a known CLUSTAL header: ${knownHeaders.join(',')}, proceeding but could indicate an issue`);
|
|
17
17
|
}
|
|
18
|
-
|
|
19
|
-
return { info
|
|
18
|
+
const version = parseVersion(info);
|
|
19
|
+
return { info, version };
|
|
20
20
|
}
|
|
21
21
|
function getFirstNonEmptyLine(arr) {
|
|
22
22
|
// There should be two blank lines after the header line
|
|
23
|
-
|
|
23
|
+
let line = arr.next();
|
|
24
24
|
while (!line.done && line.value.trim() === '') {
|
|
25
25
|
line = arr.next();
|
|
26
26
|
}
|
|
27
27
|
return line.value;
|
|
28
28
|
}
|
|
29
29
|
function getSeqBounds(line) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
const fields = line.split(/\s+/);
|
|
31
|
+
const temp = line.slice(fields[0].length);
|
|
32
|
+
const s = fields[0].length + temp.indexOf(fields[1]);
|
|
33
|
+
const e = s + fields[1].length;
|
|
34
34
|
return [s, e];
|
|
35
35
|
}
|
|
36
36
|
// Use the first block to get the sequence identifiers
|
|
37
37
|
function parseBlock(arr) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
let line = getFirstNonEmptyLine(arr);
|
|
39
|
+
const block = [];
|
|
40
|
+
let consensusLine = '';
|
|
41
41
|
if (!line) {
|
|
42
42
|
return undefined;
|
|
43
43
|
}
|
|
@@ -50,24 +50,24 @@ function parseBlock(arr) {
|
|
|
50
50
|
}
|
|
51
51
|
line = arr.next().value;
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
const [start, end] = getSeqBounds(block[0]);
|
|
54
|
+
const fields = block.map(s => s.split(/\s+/));
|
|
55
|
+
const ids = fields.map(s => s[0]);
|
|
56
|
+
const seqs = block.map(s => s.slice(start, end));
|
|
57
|
+
let consensus = consensusLine.slice(start, end);
|
|
58
58
|
// handle if the consensus trailing whitespace got trimmed
|
|
59
|
-
|
|
59
|
+
const remainder = seqs[0].length - consensus.length;
|
|
60
60
|
if (remainder) {
|
|
61
61
|
consensus += ' '.repeat(remainder);
|
|
62
62
|
}
|
|
63
|
-
return { ids
|
|
63
|
+
return { ids, seqs, consensus };
|
|
64
64
|
}
|
|
65
65
|
function parseBlocks(arr) {
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
let block;
|
|
67
|
+
const res = parseBlock(arr);
|
|
68
68
|
if (res !== undefined) {
|
|
69
69
|
while ((block = parseBlock(arr))) {
|
|
70
|
-
for (
|
|
70
|
+
for (let i = 0; i < block.seqs.length; i++) {
|
|
71
71
|
res.seqs[i] += block.seqs[i];
|
|
72
72
|
}
|
|
73
73
|
res.consensus += block.consensus;
|
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,gCA4BC;AAED,kCAYC;AA9ED,SAAgB,YAAY,CAAC,IAAY;IACvC,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/esm/index.js
CHANGED
|
@@ -1,54 +1,48 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
exports.parse = parse;
|
|
6
|
-
exports.parsePairwise = parsePairwise;
|
|
7
|
-
var pairwise_ts_1 = require("./pairwise.js");
|
|
8
|
-
var util_ts_1 = require("./util.js");
|
|
9
|
-
function parseClustalIter(arr) {
|
|
10
|
-
var line = (0, util_ts_1.getFirstNonEmptyLine)(arr);
|
|
1
|
+
import { parsePairwiseBlocks } from "./pairwise.js";
|
|
2
|
+
import { parseBlocks, parseHeader, getFirstNonEmptyLine } from "./util.js";
|
|
3
|
+
export function parseClustalIter(arr) {
|
|
4
|
+
const line = getFirstNonEmptyLine(arr);
|
|
11
5
|
if (!line) {
|
|
12
6
|
throw new Error('Empty file received');
|
|
13
7
|
}
|
|
14
|
-
|
|
15
|
-
|
|
8
|
+
const header = parseHeader(line);
|
|
9
|
+
const res = parseBlocks(arr);
|
|
16
10
|
if (res === undefined) {
|
|
17
11
|
throw new Error('No blocks parsed');
|
|
18
12
|
}
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }));
|
|
14
|
+
const { consensus } = res;
|
|
21
15
|
if (consensus.length != alns[0].seq.length) {
|
|
22
|
-
throw new Error(
|
|
16
|
+
throw new Error(`Consensus length != sequence length. Con ${consensus.length} seq ${alns[0].seq.length}`);
|
|
23
17
|
}
|
|
24
|
-
return { consensus
|
|
18
|
+
return { consensus, alns, header };
|
|
25
19
|
}
|
|
26
|
-
function parsePairwiseIter(arr) {
|
|
27
|
-
|
|
20
|
+
export function parsePairwiseIter(arr) {
|
|
21
|
+
const res = parsePairwiseBlocks(arr.split('\n')[Symbol.iterator]());
|
|
28
22
|
if (res === undefined) {
|
|
29
23
|
throw new Error('No blocks parsed');
|
|
30
24
|
}
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
const alns = res.seqs.map((n, index) => ({ id: res.ids[index], seq: n }));
|
|
26
|
+
const { consensus } = res;
|
|
33
27
|
if (consensus.length != alns[0].seq.length) {
|
|
34
|
-
throw new Error(
|
|
28
|
+
throw new Error(`Consensus length != sequence length. Con ${consensus.length} seq ${alns[0].seq.length}`);
|
|
35
29
|
}
|
|
36
30
|
if (alns.length !== 2) {
|
|
37
31
|
throw new Error('More than two sequences in pairwise alignment');
|
|
38
32
|
}
|
|
39
33
|
return {
|
|
40
|
-
consensus
|
|
34
|
+
consensus,
|
|
41
35
|
alns: alns,
|
|
42
36
|
};
|
|
43
37
|
}
|
|
44
|
-
function parse(contents) {
|
|
45
|
-
|
|
38
|
+
export function parse(contents) {
|
|
39
|
+
const iter = contents.split('\n')[Symbol.iterator]();
|
|
46
40
|
return parseClustalIter(iter);
|
|
47
41
|
}
|
|
48
|
-
function parsePairwise(contents) {
|
|
42
|
+
export function parsePairwise(contents) {
|
|
49
43
|
return parsePairwiseIter(contents
|
|
50
44
|
.split('\n')
|
|
51
|
-
.filter(
|
|
45
|
+
.filter(f => !f.startsWith('#'))
|
|
52
46
|
.join('\n'));
|
|
53
47
|
}
|
|
54
48
|
//# 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":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/esm/pairwise.js
CHANGED
|
@@ -1,28 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getSeqBounds = getSeqBounds;
|
|
4
|
-
exports.parsePairwiseBlock = parsePairwiseBlock;
|
|
5
|
-
exports.parsePairwiseBlocks = parsePairwiseBlocks;
|
|
6
|
-
var util_ts_1 = require("./util.js");
|
|
1
|
+
import { getFirstNonEmptyLine } from "./util.js";
|
|
7
2
|
function isSequenceLine(line) {
|
|
8
|
-
|
|
3
|
+
const trimmed = line.trim();
|
|
9
4
|
return /^\w+\s+/.test(trimmed);
|
|
10
5
|
}
|
|
11
6
|
function hasPositionNumbers(fields) {
|
|
12
7
|
return fields.length >= 3 && /^\d+$/.test(fields[1]);
|
|
13
8
|
}
|
|
14
|
-
function getSeqBounds(line, seqIndex) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
export function getSeqBounds(line, seqIndex) {
|
|
10
|
+
const trimmed = line.trim();
|
|
11
|
+
const fields = trimmed.split(/\s+/);
|
|
12
|
+
const seq = fields[seqIndex];
|
|
13
|
+
const seqStart = line.indexOf(seq, line.indexOf(fields[0]) + fields[0].length);
|
|
19
14
|
return [seqStart, seqStart + seq.length];
|
|
20
15
|
}
|
|
21
16
|
// Use the first block to get the sequence identifiers
|
|
22
|
-
function parsePairwiseBlock(arr) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
export function parsePairwiseBlock(arr) {
|
|
18
|
+
let line = getFirstNonEmptyLine(arr);
|
|
19
|
+
const block = [];
|
|
20
|
+
let consensusLine = '';
|
|
26
21
|
if (!line) {
|
|
27
22
|
return undefined;
|
|
28
23
|
}
|
|
@@ -38,25 +33,25 @@ function parsePairwiseBlock(arr) {
|
|
|
38
33
|
if (block.length === 0) {
|
|
39
34
|
return undefined;
|
|
40
35
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
const fields = block.map(s => s.trim().split(/\s+/));
|
|
37
|
+
const seqIndex = hasPositionNumbers(fields[0]) ? 2 : 1;
|
|
38
|
+
const [start, end] = getSeqBounds(block[0], seqIndex);
|
|
39
|
+
const ids = fields.map(s => s[0]);
|
|
40
|
+
const seqs = fields.map(s => s[seqIndex]);
|
|
41
|
+
let consensus = consensusLine.slice(start, end);
|
|
47
42
|
// handle if the consensus trailing whitespace got trimmed
|
|
48
|
-
|
|
43
|
+
const remainder = seqs[0].length - consensus.length;
|
|
49
44
|
if (remainder > 0) {
|
|
50
45
|
consensus += ' '.repeat(remainder);
|
|
51
46
|
}
|
|
52
|
-
return { ids
|
|
47
|
+
return { ids, seqs, consensus };
|
|
53
48
|
}
|
|
54
|
-
function parsePairwiseBlocks(arr) {
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
export function parsePairwiseBlocks(arr) {
|
|
50
|
+
let block;
|
|
51
|
+
const res = parsePairwiseBlock(arr);
|
|
57
52
|
if (res !== undefined) {
|
|
58
53
|
while ((block = parsePairwiseBlock(arr))) {
|
|
59
|
-
for (
|
|
54
|
+
for (let i = 0; i < block.seqs.length; i++) {
|
|
60
55
|
res.seqs[i] += block.seqs[i];
|
|
61
56
|
}
|
|
62
57
|
res.consensus += block.consensus;
|
package/esm/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/esm/util.js
CHANGED
|
@@ -1,43 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.parseVersion = parseVersion;
|
|
4
|
-
exports.parseHeader = parseHeader;
|
|
5
|
-
exports.getFirstNonEmptyLine = getFirstNonEmptyLine;
|
|
6
|
-
exports.getSeqBounds = getSeqBounds;
|
|
7
|
-
exports.parseBlock = parseBlock;
|
|
8
|
-
exports.parseBlocks = parseBlocks;
|
|
9
|
-
function parseVersion(line) {
|
|
10
|
-
var res = /\(?(\d+(\.\d+)+)\)?/.exec(line);
|
|
1
|
+
export function parseVersion(line) {
|
|
2
|
+
const res = /\(?(\d+(\.\d+)+)\)?/.exec(line);
|
|
11
3
|
return res && res.length > 1 ? res[1] : '';
|
|
12
4
|
}
|
|
13
|
-
function parseHeader(info) {
|
|
14
|
-
|
|
15
|
-
if (!knownHeaders.some(
|
|
16
|
-
console.warn(
|
|
5
|
+
export function parseHeader(info) {
|
|
6
|
+
const knownHeaders = ['CLUSTAL', 'PROBCONS', 'MUSCLE', 'MSAPROBS', 'Kalign'];
|
|
7
|
+
if (!knownHeaders.some(l => info.startsWith(l))) {
|
|
8
|
+
console.warn(`${info} is not a known CLUSTAL header: ${knownHeaders.join(',')}, proceeding but could indicate an issue`);
|
|
17
9
|
}
|
|
18
|
-
|
|
19
|
-
return { info
|
|
10
|
+
const version = parseVersion(info);
|
|
11
|
+
return { info, version };
|
|
20
12
|
}
|
|
21
|
-
function getFirstNonEmptyLine(arr) {
|
|
13
|
+
export function getFirstNonEmptyLine(arr) {
|
|
22
14
|
// There should be two blank lines after the header line
|
|
23
|
-
|
|
15
|
+
let line = arr.next();
|
|
24
16
|
while (!line.done && line.value.trim() === '') {
|
|
25
17
|
line = arr.next();
|
|
26
18
|
}
|
|
27
19
|
return line.value;
|
|
28
20
|
}
|
|
29
|
-
function getSeqBounds(line) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
21
|
+
export function getSeqBounds(line) {
|
|
22
|
+
const fields = line.split(/\s+/);
|
|
23
|
+
const temp = line.slice(fields[0].length);
|
|
24
|
+
const s = fields[0].length + temp.indexOf(fields[1]);
|
|
25
|
+
const e = s + fields[1].length;
|
|
34
26
|
return [s, e];
|
|
35
27
|
}
|
|
36
28
|
// Use the first block to get the sequence identifiers
|
|
37
|
-
function parseBlock(arr) {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
export function parseBlock(arr) {
|
|
30
|
+
let line = getFirstNonEmptyLine(arr);
|
|
31
|
+
const block = [];
|
|
32
|
+
let consensusLine = '';
|
|
41
33
|
if (!line) {
|
|
42
34
|
return undefined;
|
|
43
35
|
}
|
|
@@ -50,24 +42,24 @@ function parseBlock(arr) {
|
|
|
50
42
|
}
|
|
51
43
|
line = arr.next().value;
|
|
52
44
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
45
|
+
const [start, end] = getSeqBounds(block[0]);
|
|
46
|
+
const fields = block.map(s => s.split(/\s+/));
|
|
47
|
+
const ids = fields.map(s => s[0]);
|
|
48
|
+
const seqs = block.map(s => s.slice(start, end));
|
|
49
|
+
let consensus = consensusLine.slice(start, end);
|
|
58
50
|
// handle if the consensus trailing whitespace got trimmed
|
|
59
|
-
|
|
51
|
+
const remainder = seqs[0].length - consensus.length;
|
|
60
52
|
if (remainder) {
|
|
61
53
|
consensus += ' '.repeat(remainder);
|
|
62
54
|
}
|
|
63
|
-
return { ids
|
|
55
|
+
return { ids, seqs, consensus };
|
|
64
56
|
}
|
|
65
|
-
function parseBlocks(arr) {
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
export function parseBlocks(arr) {
|
|
58
|
+
let block;
|
|
59
|
+
const res = parseBlock(arr);
|
|
68
60
|
if (res !== undefined) {
|
|
69
61
|
while ((block = parseBlock(arr))) {
|
|
70
|
-
for (
|
|
62
|
+
for (let i = 0; i < block.seqs.length; i++) {
|
|
71
63
|
res.seqs[i] += block.seqs[i];
|
|
72
64
|
}
|
|
73
65
|
res.consensus += block.consensus;
|
package/esm/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"
|
|
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,CAAC,CAAC,MAAM,CAAC,CAAA;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;IACpD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAC9B,OAAO,CAAC,CAAC,EAAE,CAAC,CAAU,CAAA;AACxB,CAAC;AAED,sDAAsD;AACtD,MAAM,UAAU,UAAU,CAAC,GAAqB;IAC9C,IAAI,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;IACpC,MAAM,KAAK,GAAG,EAAE,CAAA;IAChB,IAAI,aAAa,GAAG,EAAE,CAAA;IACtB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,aAAa,GAAG,IAAI,CAAA;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClB,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;IACzB,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAChD,IAAI,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IAE/C,0DAA0D;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;IACnD,IAAI,SAAS,EAAE,CAAC;QACd,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACpC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAqB;IAC/C,IAAI,KAAK,CAAA;IACT,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC9B,CAAC;YACD,GAAG,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,CAAA;QAClC,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC"}
|