msa-parsers 8.1.0 → 8.3.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/annotationTextToGFF.d.ts +5 -0
- package/dist/gff/annotationTextToGFF.js +15 -0
- package/dist/gff/annotationTextToGFF.js.map +1 -0
- package/dist/gff/annotationsToGFF.js +1 -1
- package/dist/gff/annotationsToGFF.js.map +1 -1
- package/dist/gff/gffToAnnotations.js +4 -4
- package/dist/gff/gffToAnnotations.js.map +1 -1
- package/dist/gff/parseGFF.js +14 -20
- package/dist/gff/parseGFF.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/msa/A3mMSA.d.ts +3 -9
- package/dist/msa/A3mMSA.js +31 -32
- package/dist/msa/A3mMSA.js.map +1 -1
- package/dist/msa/BaseMSA.d.ts +9 -3
- package/dist/msa/BaseMSA.js +20 -0
- package/dist/msa/BaseMSA.js.map +1 -1
- package/dist/msa/ClustalMSA.d.ts +0 -14
- package/dist/msa/ClustalMSA.js +3 -23
- package/dist/msa/ClustalMSA.js.map +1 -1
- package/dist/msa/EmfMSA.d.ts +0 -15
- package/dist/msa/EmfMSA.js +1 -24
- package/dist/msa/EmfMSA.js.map +1 -1
- package/dist/msa/FastaMSA.d.ts +3 -8
- package/dist/msa/FastaMSA.js +10 -23
- package/dist/msa/FastaMSA.js.map +1 -1
- package/dist/msa/StockholmMSA.d.ts +0 -2
- package/dist/msa/StockholmMSA.js +2 -10
- package/dist/msa/StockholmMSA.js.map +1 -1
- package/dist/msa/fastaRecords.d.ts +6 -4
- package/dist/msa/fastaRecords.js +12 -6
- package/dist/msa/fastaRecords.js.map +1 -1
- package/dist/msa/index.js +17 -11
- package/dist/msa/index.js.map +1 -1
- package/package.json +1 -1
- package/src/gff/annotationTextToGFF.ts +17 -0
- package/src/gff/annotationsToGFF.ts +1 -1
- package/src/gff/gffToAnnotations.test.ts +2 -0
- package/src/gff/gffToAnnotations.ts +4 -4
- package/src/gff/interProToGFF.test.ts +7 -0
- package/src/gff/parseGFF.test.ts +14 -0
- package/src/gff/parseGFF.ts +18 -26
- package/src/index.ts +1 -0
- package/src/msa/A3mMSA.test.ts +16 -12
- package/src/msa/A3mMSA.ts +32 -42
- package/src/msa/BaseMSA.ts +23 -4
- package/src/msa/ClustalMSA.ts +3 -27
- package/src/msa/EmfMSA.ts +1 -29
- package/src/msa/FastaMSA.ts +12 -31
- package/src/msa/StockholmMSA.ts +2 -12
- package/src/msa/fastaRecords.ts +13 -6
- package/src/msa/index.test.ts +87 -5
- package/src/msa/index.ts +19 -11
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { interProScanResponseToAnnotations } from '../interProScanToAnnotations.js';
|
|
2
|
+
import { annotationsToGFF } from './annotationsToGFF.js';
|
|
3
|
+
/**
|
|
4
|
+
* An annotation file's text as GFF3: GFF passes through, and the JSON an
|
|
5
|
+
* InterProScan run returns converts, taking each result's row from its xref.
|
|
6
|
+
*/
|
|
7
|
+
export function annotationTextToGFF(text) {
|
|
8
|
+
const trimmed = text.trimStart();
|
|
9
|
+
if (!trimmed.startsWith('{')) {
|
|
10
|
+
return text;
|
|
11
|
+
}
|
|
12
|
+
const response = JSON.parse(trimmed);
|
|
13
|
+
return annotationsToGFF(interProScanResponseToAnnotations(response));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=annotationTextToGFF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotationTextToGFF.js","sourceRoot":"","sources":["../../src/gff/annotationTextToGFF.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iCAAiC,EAAE,MAAM,iCAAiC,CAAA;AACnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAIxD;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAA;IAChC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAA;IACb,CAAC;IACD,MAAM,QAAQ,GAAyB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1D,OAAO,gBAAgB,CAAC,iCAAiC,CAAC,QAAQ,CAAC,CAAC,CAAA;AACtE,CAAC"}
|
|
@@ -15,7 +15,7 @@ export function annotationsToGFF(annotations, header = []) {
|
|
|
15
15
|
const { accession, name, description, featureType } = annotation;
|
|
16
16
|
const { id, start, end, strand } = annotation;
|
|
17
17
|
return [
|
|
18
|
-
id,
|
|
18
|
+
id.replaceAll(/[%\t\n\r]/g, encodeURIComponent),
|
|
19
19
|
'InterProScan',
|
|
20
20
|
// GFF-sourced annotations carry their original type; writing every
|
|
21
21
|
// feature back out as protein_match would turn an exon overlay into
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotationsToGFF.js","sourceRoot":"","sources":["../../src/gff/annotationsToGFF.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAyB,EACzB,MAAM,GAAa,EAAE;IAErB,OAAO;QACL,iBAAiB;QACjB,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC9B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAU,CAAA;YAChE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;YAC7C,OAAO;gBACL,EAAE;
|
|
1
|
+
{"version":3,"file":"annotationsToGFF.js","sourceRoot":"","sources":["../../src/gff/annotationsToGFF.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAC9B,WAAyB,EACzB,MAAM,GAAa,EAAE;IAErB,OAAO;QACL,iBAAiB;QACjB,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC9B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,GAAG,UAAU,CAAA;YAChE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAU,CAAA;YAC7C,OAAO;gBACL,EAAE,CAAC,UAAU,CAAC,YAAY,EAAE,kBAAkB,CAAC;gBAC/C,cAAc;gBACd,mEAAmE;gBACnE,oEAAoE;gBACpE,gEAAgE;gBAChE,oCAAoC;gBACpC,WAAW,IAAI,eAAe;gBAC9B,KAAK;gBACL,GAAG;gBACH,GAAG;gBACH,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;gBACnD,GAAG;gBACH;oBACE,QAAQ,kBAAkB,CAAC,SAAS,CAAC,EAAE;oBACvC,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE;oBAC5C,eAAe,kBAAkB,CAAC,WAAW,CAAC,EAAE;iBACjD,CAAC,IAAI,CAAC,GAAG,CAAC;aACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACd,CAAC,CAAC;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
// Feature types
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// single transcript, not independently-oriented genes.
|
|
1
|
+
// Feature types drawn with an arrowhead for their strand. A prokaryotic GFF
|
|
2
|
+
// writes each gene as a CDS row. Exon, UTR and domain features stay blocks,
|
|
3
|
+
// since an exon is a segment of one transcript.
|
|
5
4
|
const GENE_LEVEL_TYPES = new Set([
|
|
6
5
|
'gene',
|
|
6
|
+
'CDS',
|
|
7
7
|
'pseudogene',
|
|
8
8
|
'mRNA',
|
|
9
9
|
'transcript',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gffToAnnotations.js","sourceRoot":"","sources":["../../src/gff/gffToAnnotations.ts"],"names":[],"mappings":"AAEA,
|
|
1
|
+
{"version":3,"file":"gffToAnnotations.js","sourceRoot":"","sources":["../../src/gff/gffToAnnotations.ts"],"names":[],"mappings":"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"}
|
package/dist/gff/parseGFF.js
CHANGED
|
@@ -17,28 +17,22 @@ function parseAttributes(col9) {
|
|
|
17
17
|
if (!col9) {
|
|
18
18
|
return {};
|
|
19
19
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
.
|
|
24
|
-
.
|
|
25
|
-
const eq = f.indexOf('=');
|
|
26
|
-
const key = (eq === -1 ? f : f.slice(0, eq)).trim();
|
|
27
|
-
const val = eq === -1 ? undefined : f.slice(eq + 1);
|
|
20
|
+
const attributes = {};
|
|
21
|
+
for (const field of col9.split(';')) {
|
|
22
|
+
const eq = field.indexOf('=');
|
|
23
|
+
const key = field.slice(0, eq).trim();
|
|
24
|
+
const val = field.slice(eq + 1);
|
|
28
25
|
// split on comma (the GFF3 multi-value separator) BEFORE decoding, so a
|
|
29
26
|
// literal comma encoded as %2C survives the split and isn't mistaken
|
|
30
27
|
// for a separator
|
|
31
|
-
|
|
32
|
-
key
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
];
|
|
40
|
-
})
|
|
41
|
-
.filter(([key]) => key !== ''));
|
|
28
|
+
if (eq !== -1 && key && val) {
|
|
29
|
+
attributes[key] = val
|
|
30
|
+
.split(',')
|
|
31
|
+
.map(v => unquote(safeDecode(v).trim()))
|
|
32
|
+
.join(' ');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return attributes;
|
|
42
36
|
}
|
|
43
37
|
export function parseGFF(str) {
|
|
44
38
|
if (!str) {
|
|
@@ -66,7 +60,7 @@ export function parseGFF(str) {
|
|
|
66
60
|
// "start=") can't turn a number field into a string
|
|
67
61
|
return {
|
|
68
62
|
...parseAttributes(col9),
|
|
69
|
-
seq_id: seq_id ?? '',
|
|
63
|
+
seq_id: safeDecode(seq_id ?? ''),
|
|
70
64
|
source: source ?? '',
|
|
71
65
|
type: type ?? '',
|
|
72
66
|
start: Number(start) || 0,
|
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,sEAAsE;AACtE,wEAAwE;AACxE,SAAS,OAAO,CAAC,GAAW;IAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACtC,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,CAAA;IACX,CAAC;IACD,
|
|
1
|
+
{"version":3,"file":"parseGFF.js","sourceRoot":"","sources":["../../src/gff/parseGFF.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,3 +4,4 @@ export { A3mMSA, ClustalMSA, EmfMSA, FastaMSA, StockholmMSA, getUngappedSequence
|
|
|
4
4
|
export type { MSAFormat, MSAParserType } from './msa/index.ts';
|
|
5
5
|
export { indexResultsByXref, interProScanResponseToAnnotations, interProScanToAnnotations, } from './interProScanToAnnotations.ts';
|
|
6
6
|
export { annotationsToGFF, gffToAnnotations, interProResponseToGFF, interProToGFF, parseGFF, } from './gff/index.ts';
|
|
7
|
+
export { annotationTextToGFF } from './gff/annotationTextToGFF.ts';
|
package/dist/index.js
CHANGED
|
@@ -6,4 +6,5 @@ export { A3mMSA, ClustalMSA, EmfMSA, FastaMSA, StockholmMSA, getUngappedSequence
|
|
|
6
6
|
export { indexResultsByXref, interProScanResponseToAnnotations, interProScanToAnnotations, } from './interProScanToAnnotations.js';
|
|
7
7
|
// GFF parsing
|
|
8
8
|
export { annotationsToGFF, gffToAnnotations, interProResponseToGFF, interProToGFF, parseGFF, } from './gff/index.js';
|
|
9
|
+
export { annotationTextToGFF } from './gff/annotationTextToGFF.js';
|
|
9
10
|
//# 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,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,cAAc;AACd,OAAO,EACL,MAAM,EACN,UAAU,EACV,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,gBAAgB,CAAA;AAGvB,qEAAqE;AACrE,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,gCAAgC,CAAA;AAEvC,cAAc;AACd,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,QAAQ,GACT,MAAM,gBAAgB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAE3C,cAAc;AACd,OAAO,EACL,MAAM,EACN,UAAU,EACV,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,gBAAgB,CAAA;AAGvB,qEAAqE;AACrE,OAAO,EACL,kBAAkB,EAClB,iCAAiC,EACjC,yBAAyB,GAC1B,MAAM,gCAAgC,CAAA;AAEvC,cAAc;AACd,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,QAAQ,GACT,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA"}
|
package/dist/msa/A3mMSA.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.ts';
|
|
2
|
+
import type { FastaRecord } from './fastaRecords.ts';
|
|
2
3
|
export default class A3mMSA extends BaseMSA {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
constructor(text: string);
|
|
6
|
-
static sniff(text: string): boolean;
|
|
7
|
-
getMSA(): {
|
|
8
|
-
seqdata: Record<string, string>;
|
|
9
|
-
};
|
|
10
|
-
getNames(): string[];
|
|
11
|
-
getRow(name: string): string;
|
|
4
|
+
constructor(input: string | FastaRecord[]);
|
|
5
|
+
static sniff(input: string | FastaRecord[]): boolean;
|
|
12
6
|
}
|
package/dist/msa/A3mMSA.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.js';
|
|
2
|
-
import { fastaSniff,
|
|
2
|
+
import { fastaSniff, toRecords } from './fastaRecords.js';
|
|
3
3
|
/**
|
|
4
4
|
* A3M Format Parser
|
|
5
5
|
*
|
|
@@ -50,21 +50,16 @@ function parseRow(seq) {
|
|
|
50
50
|
return { matches, inserts };
|
|
51
51
|
}
|
|
52
52
|
export default class A3mMSA extends BaseMSA {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
super();
|
|
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
|
-
};
|
|
53
|
+
constructor(input) {
|
|
54
|
+
const records = toRecords(input);
|
|
55
|
+
const expanded = expandA3M(records.map(r => r.seq));
|
|
56
|
+
super(records.map((r, i) => [r.id, expanded[i]]));
|
|
62
57
|
}
|
|
63
|
-
static sniff(
|
|
64
|
-
if (!fastaSniff(
|
|
58
|
+
static sniff(input) {
|
|
59
|
+
if (typeof input === 'string' && !fastaSniff(input)) {
|
|
65
60
|
return false;
|
|
66
61
|
}
|
|
67
|
-
const seqs =
|
|
62
|
+
const seqs = toRecords(input)
|
|
68
63
|
.map(r => r.seq)
|
|
69
64
|
.filter(s => !!s);
|
|
70
65
|
if (seqs.length < 2) {
|
|
@@ -78,19 +73,25 @@ export default class A3mMSA extends BaseMSA {
|
|
|
78
73
|
if (new Set(seqs.map(s => s.length)).size === 1) {
|
|
79
74
|
return false;
|
|
80
75
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
76
|
+
let hasLowercase = false;
|
|
77
|
+
let matchCount;
|
|
78
|
+
for (const seq of seqs) {
|
|
79
|
+
let matches = 0;
|
|
80
|
+
for (let i = 0; i < seq.length; i++) {
|
|
81
|
+
const code = seq.charCodeAt(i);
|
|
82
|
+
if (isMatch(code)) {
|
|
83
|
+
matches++;
|
|
84
|
+
}
|
|
85
|
+
else if (isLower(code)) {
|
|
86
|
+
hasLowercase = true;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (matchCount !== undefined && matches !== matchCount) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
matchCount = matches;
|
|
93
|
+
}
|
|
94
|
+
return hasLowercase;
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
/**
|
|
@@ -98,7 +99,7 @@ export default class A3mMSA extends BaseMSA {
|
|
|
98
99
|
* the longest insert any row places there, and rows without one are padded with
|
|
99
100
|
* '.' so all rows stay in register.
|
|
100
101
|
*/
|
|
101
|
-
function expandA3M(rawSeqs
|
|
102
|
+
function expandA3M(rawSeqs) {
|
|
102
103
|
const rows = rawSeqs.map(parseRow);
|
|
103
104
|
// a loop, not Math.max(...): an a3m from an hhblits search routinely carries
|
|
104
105
|
// six figures of hits, and spreading one argument per row throws
|
|
@@ -114,8 +115,7 @@ function expandA3M(rawSeqs, names) {
|
|
|
114
115
|
maxInserts[pos] = Math.max(maxInserts[pos], ins.length);
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
|
-
|
|
118
|
-
for (const [seqIdx, { matches, inserts }] of rows.entries()) {
|
|
118
|
+
return rows.map(({ matches, inserts }) => {
|
|
119
119
|
const result = [];
|
|
120
120
|
for (let pos = 0; pos <= numPositions; pos++) {
|
|
121
121
|
const ins = inserts[pos] ?? '';
|
|
@@ -125,8 +125,7 @@ function expandA3M(rawSeqs, names) {
|
|
|
125
125
|
result.push(matches[pos] ?? '-');
|
|
126
126
|
}
|
|
127
127
|
}
|
|
128
|
-
|
|
129
|
-
}
|
|
130
|
-
return expanded;
|
|
128
|
+
return result.join('');
|
|
129
|
+
});
|
|
131
130
|
}
|
|
132
131
|
//# 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;AAClC,OAAO,EAAE,UAAU,EAAE,
|
|
1
|
+
{"version":3,"file":"A3mMSA.js","sourceRoot":"","sources":["../../src/msa/A3mMSA.ts"],"names":[],"mappings":"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"}
|
package/dist/msa/BaseMSA.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { MSATrack, NodeWithIds } from '../types.ts';
|
|
2
2
|
export default abstract class BaseMSA {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
abstract getNames(): string[];
|
|
3
|
+
protected rows: Map<string, string>;
|
|
4
|
+
private names;
|
|
6
5
|
private width?;
|
|
6
|
+
/**
|
|
7
|
+
* A repeated name keeps its first row: names index the rows, so listing the
|
|
8
|
+
* name twice would render a phantom duplicate row.
|
|
9
|
+
*/
|
|
10
|
+
constructor(rows: Iterable<readonly [string, string]>);
|
|
11
|
+
getRow(name: string): string;
|
|
12
|
+
getNames(): string[];
|
|
7
13
|
/**
|
|
8
14
|
* Column count of the alignment: the length of its widest row, since a
|
|
9
15
|
* hand-edited fasta or some aligners leave rows short. The viewer's gap
|
package/dist/msa/BaseMSA.js
CHANGED
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
export default class BaseMSA {
|
|
2
|
+
rows = new Map();
|
|
3
|
+
names;
|
|
2
4
|
width;
|
|
5
|
+
/**
|
|
6
|
+
* A repeated name keeps its first row: names index the rows, so listing the
|
|
7
|
+
* name twice would render a phantom duplicate row.
|
|
8
|
+
*/
|
|
9
|
+
constructor(rows) {
|
|
10
|
+
for (const [name, seq] of rows) {
|
|
11
|
+
if (!this.rows.has(name)) {
|
|
12
|
+
this.rows.set(name, seq);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
this.names = [...this.rows.keys()];
|
|
16
|
+
}
|
|
17
|
+
getRow(name) {
|
|
18
|
+
return this.rows.get(name) ?? '';
|
|
19
|
+
}
|
|
20
|
+
getNames() {
|
|
21
|
+
return this.names;
|
|
22
|
+
}
|
|
3
23
|
/**
|
|
4
24
|
* Column count of the alignment: the length of its widest row, since a
|
|
5
25
|
* hand-edited fasta or some aligners leave rows short. The viewer's gap
|
package/dist/msa/BaseMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseMSA.js","sourceRoot":"","sources":["../../src/msa/BaseMSA.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,OAAO;
|
|
1
|
+
{"version":3,"file":"BaseMSA.js","sourceRoot":"","sources":["../../src/msa/BaseMSA.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAgB,OAAO;IACzB,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAA;IAClC,KAAK,CAAU;IACf,KAAK,CAAS;IAEtB;;;OAGG;IACH,YAAY,IAAyC;QACnD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YAC1B,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;IACpC,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IAClC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CACnC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EACtD,CAAC,CACF,CAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,OAAO;QACL,OAAO;YACL,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrC,EAAE,EAAE,IAAI;gBACR,QAAQ,EAAE,EAAE;gBACZ,IAAI;aACL,CAAC,CAAC;SACJ,CAAA;IACH,CAAC;IAED,UAAU,CACR,KAAa;QAEb,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,aAAa;QACX,OAAO,EAAE,CAAA;IACX,CAAC;IAED,SAAS;QACP,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,EAAE,CAAA;IACX,CAAC;IAED,IAAI,YAAY;QACd,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,2BAA2B;QAC7B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,EAAE,CAAA;IACX,CAAC;CACF"}
|
package/dist/msa/ClustalMSA.d.ts
CHANGED
|
@@ -1,24 +1,10 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.ts';
|
|
2
2
|
export default class ClustalMSA extends BaseMSA {
|
|
3
3
|
private MSA;
|
|
4
|
-
private byName;
|
|
5
4
|
constructor(text: string);
|
|
6
|
-
getMSA(): {
|
|
7
|
-
consensus: string;
|
|
8
|
-
alns: {
|
|
9
|
-
id: string;
|
|
10
|
-
seq: string;
|
|
11
|
-
}[];
|
|
12
|
-
header: {
|
|
13
|
-
info: string;
|
|
14
|
-
version: string | undefined;
|
|
15
|
-
};
|
|
16
|
-
};
|
|
17
|
-
getRow(name: string): string;
|
|
18
5
|
getHeader(): {
|
|
19
6
|
info: string;
|
|
20
7
|
version: string | undefined;
|
|
21
8
|
};
|
|
22
|
-
getNames(): string[];
|
|
23
9
|
get seqConsensus(): string;
|
|
24
10
|
}
|
package/dist/msa/ClustalMSA.js
CHANGED
|
@@ -2,34 +2,14 @@ import { parse } from 'clustal-js';
|
|
|
2
2
|
import BaseMSA from './BaseMSA.js';
|
|
3
3
|
export default class ClustalMSA extends BaseMSA {
|
|
4
4
|
MSA;
|
|
5
|
-
// getRow is called once per leaf on every render pass, so a linear scan of
|
|
6
|
-
// alns makes a full pass quadratic in the row count
|
|
7
|
-
byName;
|
|
8
5
|
constructor(text) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
this.
|
|
12
|
-
for (const aln of this.MSA.alns) {
|
|
13
|
-
// first wins, as the find() this replaced did
|
|
14
|
-
if (!this.byName.has(aln.id)) {
|
|
15
|
-
this.byName.set(aln.id, aln.seq);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
getMSA() {
|
|
20
|
-
return this.MSA;
|
|
21
|
-
}
|
|
22
|
-
getRow(name) {
|
|
23
|
-
return this.byName.get(name) ?? '';
|
|
6
|
+
const msa = parse(text);
|
|
7
|
+
super(msa.alns.map(aln => [aln.id, aln.seq]));
|
|
8
|
+
this.MSA = msa;
|
|
24
9
|
}
|
|
25
10
|
getHeader() {
|
|
26
11
|
return this.MSA.header;
|
|
27
12
|
}
|
|
28
|
-
// deduped, matching the first-wins byName map: emitting a repeated id twice
|
|
29
|
-
// renders a phantom duplicate row showing the first record's residues
|
|
30
|
-
getNames() {
|
|
31
|
-
return [...this.byName.keys()];
|
|
32
|
-
}
|
|
33
13
|
get seqConsensus() {
|
|
34
14
|
return this.MSA.consensus;
|
|
35
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ClustalMSA.js","sourceRoot":"","sources":["../../src/msa/ClustalMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IACrC,GAAG,CAA0B;IAErC,
|
|
1
|
+
{"version":3,"file":"ClustalMSA.js","sourceRoot":"","sources":["../../src/msa/ClustalMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAElC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,OAAO;IACrC,GAAG,CAA0B;IAErC,YAAY,IAAY;QACtB,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;QACvB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;IAChB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAA;IACxB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,CAAA;IAC3B,CAAC;CACF"}
|
package/dist/msa/EmfMSA.d.ts
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.ts';
|
|
2
2
|
export default class EmfMSA extends BaseMSA {
|
|
3
|
-
private MSA;
|
|
4
|
-
private byName;
|
|
5
3
|
constructor(text: string);
|
|
6
|
-
getMSA(): {
|
|
7
|
-
species: string;
|
|
8
|
-
protein: string;
|
|
9
|
-
chr: string;
|
|
10
|
-
start: number;
|
|
11
|
-
end: number;
|
|
12
|
-
strand: number;
|
|
13
|
-
geneId: string;
|
|
14
|
-
unknown: string;
|
|
15
|
-
seq: string;
|
|
16
|
-
}[];
|
|
17
|
-
getRow(name: string): string;
|
|
18
|
-
getNames(): string[];
|
|
19
4
|
}
|
package/dist/msa/EmfMSA.js
CHANGED
|
@@ -1,31 +1,8 @@
|
|
|
1
1
|
import { parseEmfAln } from 'emf-js';
|
|
2
2
|
import BaseMSA from './BaseMSA.js';
|
|
3
3
|
export default class EmfMSA extends BaseMSA {
|
|
4
|
-
MSA;
|
|
5
|
-
// getRow is called once per leaf on every render pass, so a linear scan of
|
|
6
|
-
// the alignment makes a full pass quadratic in the row count
|
|
7
|
-
byName;
|
|
8
4
|
constructor(text) {
|
|
9
|
-
super();
|
|
10
|
-
this.MSA = parseEmfAln(text);
|
|
11
|
-
this.byName = new Map();
|
|
12
|
-
for (const aln of this.MSA) {
|
|
13
|
-
// first wins, as the find() this replaced did
|
|
14
|
-
if (!this.byName.has(aln.protein)) {
|
|
15
|
-
this.byName.set(aln.protein, aln.seq);
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
getMSA() {
|
|
20
|
-
return this.MSA;
|
|
21
|
-
}
|
|
22
|
-
getRow(name) {
|
|
23
|
-
return this.byName.get(name) ?? '';
|
|
24
|
-
}
|
|
25
|
-
// deduped, matching the first-wins byName map: emitting a repeated id twice
|
|
26
|
-
// renders a phantom duplicate row showing the first record's residues
|
|
27
|
-
getNames() {
|
|
28
|
-
return [...this.byName.keys()];
|
|
5
|
+
super(parseEmfAln(text).map(aln => [aln.protein, aln.seq]));
|
|
29
6
|
}
|
|
30
7
|
}
|
|
31
8
|
//# sourceMappingURL=EmfMSA.js.map
|
package/dist/msa/EmfMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmfMSA.js","sourceRoot":"","sources":["../../src/msa/EmfMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;
|
|
1
|
+
{"version":3,"file":"EmfMSA.js","sourceRoot":"","sources":["../../src/msa/EmfMSA.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AAEpC,OAAO,OAAO,MAAM,cAAc,CAAA;AAElC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,OAAO;IACzC,YAAY,IAAY;QACtB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC7D,CAAC;CACF"}
|
package/dist/msa/FastaMSA.d.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.ts';
|
|
2
|
+
import type { FastaRecord } from './fastaRecords.ts';
|
|
2
3
|
export default class FastaMSA extends BaseMSA {
|
|
3
|
-
private
|
|
4
|
-
|
|
5
|
-
constructor(text: string);
|
|
6
|
-
getMSA(): {
|
|
7
|
-
seqdata: Record<string, string>;
|
|
8
|
-
colonNormalized: Record<string, string>;
|
|
9
|
-
};
|
|
10
|
-
getNames(): string[];
|
|
4
|
+
private colonNormalized;
|
|
5
|
+
constructor(input: string | FastaRecord[]);
|
|
11
6
|
getRow(name: string): string;
|
|
12
7
|
}
|
package/dist/msa/FastaMSA.js
CHANGED
|
@@ -1,33 +1,20 @@
|
|
|
1
1
|
import BaseMSA from './BaseMSA.js';
|
|
2
|
-
import {
|
|
2
|
+
import { toRecords } from './fastaRecords.js';
|
|
3
3
|
export default class FastaMSA extends BaseMSA {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const records = splitFastaRecords(text);
|
|
11
|
-
const seqdata = Object.create(null);
|
|
12
|
-
const colonNormalized = Object.create(null);
|
|
13
|
-
for (const { id, seq } of records) {
|
|
14
|
-
seqdata[id] = seq;
|
|
4
|
+
// Newick tools write a colon in a name as an underscore
|
|
5
|
+
colonNormalized = new Map();
|
|
6
|
+
constructor(input) {
|
|
7
|
+
const records = toRecords(input);
|
|
8
|
+
super(records.map(r => [r.id, r.seq]));
|
|
9
|
+
for (const { id } of records) {
|
|
15
10
|
if (id.includes(':')) {
|
|
16
|
-
colonNormalized
|
|
11
|
+
this.colonNormalized.set(id.replaceAll(':', '_'), id);
|
|
17
12
|
}
|
|
18
13
|
}
|
|
19
|
-
this.orderedNames = records.map(r => r.id);
|
|
20
|
-
this.MSA = { seqdata, colonNormalized };
|
|
21
|
-
}
|
|
22
|
-
getMSA() {
|
|
23
|
-
return this.MSA;
|
|
24
|
-
}
|
|
25
|
-
getNames() {
|
|
26
|
-
return this.orderedNames;
|
|
27
14
|
}
|
|
28
15
|
getRow(name) {
|
|
29
|
-
return (this.
|
|
30
|
-
this.
|
|
16
|
+
return (this.rows.get(name) ??
|
|
17
|
+
this.rows.get(this.colonNormalized.get(name) ?? '') ??
|
|
31
18
|
'');
|
|
32
19
|
}
|
|
33
20
|
}
|
package/dist/msa/FastaMSA.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FastaMSA.js","sourceRoot":"","sources":["../../src/msa/FastaMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"FastaMSA.js","sourceRoot":"","sources":["../../src/msa/FastaMSA.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAI7C,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,OAAO;IAC3C,wDAAwD;IAChD,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEnD,YAAY,KAA6B;QACvC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAA;QAChC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACtC,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAA;YACvD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAY;QACjB,OAAO,CACL,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACnD,EAAE,CACH,CAAA;IACH,CAAC;CACF"}
|
|
@@ -6,7 +6,6 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
6
6
|
private MSA;
|
|
7
7
|
constructor(text: string, currentAlignment: number);
|
|
8
8
|
getMSA(): StockholmData;
|
|
9
|
-
getRow(name: string): string;
|
|
10
9
|
get alignmentNames(): string[];
|
|
11
10
|
getHeader(): {
|
|
12
11
|
General: Record<string, string[]>;
|
|
@@ -22,7 +21,6 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
22
21
|
accession: string | undefined;
|
|
23
22
|
dbxref: string | undefined;
|
|
24
23
|
};
|
|
25
|
-
getNames(): string[];
|
|
26
24
|
getStructures(): Record<string, {
|
|
27
25
|
pdb: string;
|
|
28
26
|
chain: string;
|
package/dist/msa/StockholmMSA.js
CHANGED
|
@@ -6,21 +6,18 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
6
6
|
data;
|
|
7
7
|
MSA;
|
|
8
8
|
constructor(text, currentAlignment) {
|
|
9
|
-
super();
|
|
10
9
|
const res = parseAll(text);
|
|
11
|
-
this.data = res;
|
|
12
10
|
const aln = res[currentAlignment] ?? res[0];
|
|
13
11
|
if (!aln) {
|
|
14
12
|
throw new Error('No alignments found in Stockholm file');
|
|
15
13
|
}
|
|
14
|
+
super(aln.seqname.map(name => [name, aln.seqdata[name] ?? '']));
|
|
15
|
+
this.data = res;
|
|
16
16
|
this.MSA = aln;
|
|
17
17
|
}
|
|
18
18
|
getMSA() {
|
|
19
19
|
return this.MSA;
|
|
20
20
|
}
|
|
21
|
-
getRow(name) {
|
|
22
|
-
return this.MSA.seqdata[name] ?? '';
|
|
23
|
-
}
|
|
24
21
|
get alignmentNames() {
|
|
25
22
|
return this.data.map((aln, idx) => aln.gf.DE?.[0] ?? `Alignment ${idx + 1}`);
|
|
26
23
|
}
|
|
@@ -40,11 +37,6 @@ export default class StockholmMSA extends BaseMSA {
|
|
|
40
37
|
dbxref: this.MSA.gs.DR?.[rowName]?.join('; '),
|
|
41
38
|
};
|
|
42
39
|
}
|
|
43
|
-
getNames() {
|
|
44
|
-
// seqname, not Object.keys(seqdata): object key order hoists integer-like
|
|
45
|
-
// keys (a numeric sequence name) to the front, scrambling row order
|
|
46
|
-
return this.MSA.seqname;
|
|
47
|
-
}
|
|
48
40
|
getStructures() {
|
|
49
41
|
const pdbRegex = /PDB; +(\S+) +([^;\s]+); *(-?[0-9]+)-(-?[0-9]+)/;
|
|
50
42
|
const drEntries = this.MSA.gs.DR ?? {};
|