react-msaview 4.5.0 → 4.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/bundle/index.js +99 -99
- package/bundle/index.js.LICENSE.txt +6 -6
- package/bundle/index.js.map +1 -1
- package/dist/__snapshots__/parseAsn1.test.js.snap +2400 -0
- package/dist/components/header/HeaderInfoArea.js +3 -4
- package/dist/components/header/HeaderInfoArea.js.map +1 -1
- package/dist/components/import/ImportForm.js +6 -2
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/import/util.d.ts +1 -1
- package/dist/components/import/util.js +4 -1
- package/dist/components/import/util.js.map +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +7 -2
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +20 -18
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +8 -1
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +0 -1
- package/dist/components/tree/renderTreeCanvas.js +32 -31
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/model.d.ts +168 -16
- package/dist/model.js +116 -29
- package/dist/model.js.map +1 -1
- package/dist/rowCoordinateCalculations.d.ts +69 -9
- package/dist/rowCoordinateCalculations.js +118 -46
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/rowCoordinateCalculations.test.js +152 -52
- package/dist/rowCoordinateCalculations.test.js.map +1 -1
- package/dist/seqPosToGlobalCol.d.ts +19 -0
- package/dist/seqPosToGlobalCol.js +34 -0
- package/dist/seqPosToGlobalCol.js.map +1 -0
- package/dist/seqPosToGlobalCol.test.js +60 -0
- package/dist/seqPosToGlobalCol.test.js.map +1 -0
- package/dist/util.d.ts +1 -2
- package/dist/util.js +0 -9
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -9
- package/src/components/header/HeaderInfoArea.tsx +2 -5
- package/src/components/import/ImportForm.tsx +6 -1
- package/src/components/import/util.ts +4 -0
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +7 -2
- package/src/components/msa/renderMSABlock.ts +26 -19
- package/src/components/msa/renderMSAMouseover.ts +9 -0
- package/src/components/tree/renderTreeCanvas.ts +35 -42
- package/src/declare.d.ts +0 -1
- package/src/model.ts +143 -42
- package/src/rowCoordinateCalculations.test.ts +167 -74
- package/src/rowCoordinateCalculations.ts +138 -63
- package/src/seqPosToGlobalCol.test.ts +71 -0
- package/src/seqPosToGlobalCol.ts +40 -0
- package/src/util.ts +1 -19
- package/src/version.ts +1 -1
- package/dist/parseGFF.d.ts +0 -10
- package/dist/parseGFF.js +0 -31
- package/dist/parseGFF.js.map +0 -1
- package/dist/parseNewick.d.ts +0 -60
- package/dist/parseNewick.js +0 -95
- package/dist/parseNewick.js.map +0 -1
- package/dist/parsers/A3mMSA.d.ts +0 -43
- package/dist/parsers/A3mMSA.js +0 -277
- package/dist/parsers/A3mMSA.js.map +0 -1
- package/dist/parsers/A3mMSA.test.js +0 -138
- package/dist/parsers/A3mMSA.test.js.map +0 -1
- package/dist/parsers/ClustalMSA.d.ts +0 -30
- package/dist/parsers/ClustalMSA.js +0 -55
- package/dist/parsers/ClustalMSA.js.map +0 -1
- package/dist/parsers/EmfMSA.d.ts +0 -27
- package/dist/parsers/EmfMSA.js +0 -53
- package/dist/parsers/EmfMSA.js.map +0 -1
- package/dist/parsers/EmfTree.d.ts +0 -5
- package/dist/parsers/EmfTree.js +0 -8
- package/dist/parsers/EmfTree.js.map +0 -1
- package/dist/parsers/FastaMSA.d.ts +0 -19
- package/dist/parsers/FastaMSA.js +0 -69
- package/dist/parsers/FastaMSA.js.map +0 -1
- package/dist/parsers/StockholmMSA.d.ts +0 -68
- package/dist/parsers/StockholmMSA.js +0 -107
- package/dist/parsers/StockholmMSA.js.map +0 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.d.ts +0 -4
- package/dist/seqCoordToRowSpecificGlobalCoord.js +0 -19
- package/dist/seqCoordToRowSpecificGlobalCoord.js.map +0 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.test.d.ts +0 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.test.js +0 -42
- package/dist/seqCoordToRowSpecificGlobalCoord.test.js.map +0 -1
- package/src/parseGFF.ts +0 -34
- package/src/parseNewick.ts +0 -94
- package/src/parsers/A3mMSA.test.ts +0 -164
- package/src/parsers/A3mMSA.ts +0 -321
- package/src/parsers/ClustalMSA.ts +0 -69
- package/src/parsers/EmfMSA.ts +0 -67
- package/src/parsers/EmfTree.ts +0 -9
- package/src/parsers/FastaMSA.ts +0 -82
- package/src/parsers/StockholmMSA.ts +0 -140
- package/src/seqCoordToRowSpecificGlobalCoord.test.ts +0 -53
- package/src/seqCoordToRowSpecificGlobalCoord.ts +0 -25
- /package/dist/{parsers/A3mMSA.test.d.ts → seqPosToGlobalCol.test.d.ts} +0 -0
package/src/util.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { colord, extend } from 'colord'
|
|
|
2
2
|
import namesPlugin from 'colord/plugins/names'
|
|
3
3
|
import { max } from 'd3-array'
|
|
4
4
|
|
|
5
|
-
import type {
|
|
5
|
+
import type { NodeWithIds } from './types'
|
|
6
6
|
import type { Theme } from '@mui/material'
|
|
7
7
|
import type { HierarchyNode } from 'd3-hierarchy'
|
|
8
8
|
|
|
@@ -15,24 +15,6 @@ export function transform<T>(
|
|
|
15
15
|
return Object.fromEntries(Object.entries(obj).map(cb))
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export function generateNodeIds(
|
|
19
|
-
tree: Node,
|
|
20
|
-
parent = 'node',
|
|
21
|
-
depth = 0,
|
|
22
|
-
): NodeWithIds {
|
|
23
|
-
const id = `${parent}-${depth}`
|
|
24
|
-
|
|
25
|
-
return {
|
|
26
|
-
...tree,
|
|
27
|
-
id,
|
|
28
|
-
name: tree.name || id,
|
|
29
|
-
children:
|
|
30
|
-
tree.children?.map((b, i) =>
|
|
31
|
-
generateNodeIds(b, `${id}-${i}`, depth + 1),
|
|
32
|
-
) || [],
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
18
|
export function colorContrast(
|
|
37
19
|
colorScheme: Record<string, string>,
|
|
38
20
|
theme: Theme,
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '4.
|
|
1
|
+
export const version = '4.7.0'
|
package/dist/parseGFF.d.ts
DELETED
package/dist/parseGFF.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export function parseGFF(str) {
|
|
2
|
-
return str
|
|
3
|
-
?.split('\n')
|
|
4
|
-
.map(f => f.trim())
|
|
5
|
-
.filter(f => !!f && !f.startsWith('#'))
|
|
6
|
-
.map(f => {
|
|
7
|
-
const [seq_id, source, type, start, end, score, strand, phase, col9] = f.split('\t');
|
|
8
|
-
return {
|
|
9
|
-
seq_id: seq_id,
|
|
10
|
-
source: source,
|
|
11
|
-
type: type,
|
|
12
|
-
start: +start,
|
|
13
|
-
end: +end,
|
|
14
|
-
score: +score,
|
|
15
|
-
strand: strand,
|
|
16
|
-
phase: phase,
|
|
17
|
-
...Object.fromEntries(col9
|
|
18
|
-
.split(';')
|
|
19
|
-
.map(f => f.trim())
|
|
20
|
-
.filter(f => !!f)
|
|
21
|
-
.map(f => f.split('='))
|
|
22
|
-
.map(([key, val]) => [
|
|
23
|
-
key.trim(),
|
|
24
|
-
val
|
|
25
|
-
? decodeURIComponent(val).trim().split(',').join(' ')
|
|
26
|
-
: undefined,
|
|
27
|
-
])),
|
|
28
|
-
};
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=parseGFF.js.map
|
package/dist/parseGFF.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseGFF.js","sourceRoot":"","sources":["../src/parseGFF.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,QAAQ,CAAC,GAAY;IACnC,OAAO,GAAG;QACR,EAAE,KAAK,CAAC,IAAI,CAAC;SACZ,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,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,GAClE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAEf,OAAO;YACL,MAAM,EAAE,MAAO;YACf,MAAM,EAAE,MAAO;YACf,IAAI,EAAE,IAAK;YACX,KAAK,EAAE,CAAC,KAAM;YACd,GAAG,EAAE,CAAC,GAAI;YACV,KAAK,EAAE,CAAC,KAAM;YACd,MAAM,EAAE,MAAO;YACf,KAAK,EAAE,KAAM;YACb,GAAG,MAAM,CAAC,WAAW,CACnB,IAAK;iBACF,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;iBAChB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;iBACtB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC;gBACnB,GAAI,CAAC,IAAI,EAAE;gBACX,GAAG;oBACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;oBACrD,CAAC,CAAC,SAAS;aACd,CAAC,CACL;SACF,CAAA;IACH,CAAC,CAAC,CAAA;AACN,CAAC"}
|
package/dist/parseNewick.d.ts
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Newick format parser in JavaScript.
|
|
3
|
-
*
|
|
4
|
-
* Copyright (c) Jason Davies 2010.
|
|
5
|
-
*
|
|
6
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
-
* in the Software without restriction, including without limitation the rights
|
|
9
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
-
* furnished to do so, subject to the following conditions:
|
|
12
|
-
*
|
|
13
|
-
* The above copyright notice and this permission notice shall be included in
|
|
14
|
-
* all copies or substantial portions of the Software.
|
|
15
|
-
*
|
|
16
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
-
* THE SOFTWARE.
|
|
23
|
-
*
|
|
24
|
-
* Example tree (from http://en.wikipedia.org/wiki/Newick_format):
|
|
25
|
-
*
|
|
26
|
-
* +--0.1--A
|
|
27
|
-
* F-----0.2-----B +-------0.3----C
|
|
28
|
-
* +------------------0.5-----E
|
|
29
|
-
* +---------0.4------D
|
|
30
|
-
*
|
|
31
|
-
* Newick format:
|
|
32
|
-
* (A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5)F;
|
|
33
|
-
*
|
|
34
|
-
* Converted to JSON:
|
|
35
|
-
* {
|
|
36
|
-
* name: "F",
|
|
37
|
-
* children: [
|
|
38
|
-
* {name: "A", length: 0.1},
|
|
39
|
-
* {name: "B", length: 0.2},
|
|
40
|
-
* {
|
|
41
|
-
* name: "E",
|
|
42
|
-
* length: 0.5,
|
|
43
|
-
* children: [
|
|
44
|
-
* {name: "C", length: 0.3},
|
|
45
|
-
* {name: "D", length: 0.4}
|
|
46
|
-
* ]
|
|
47
|
-
* }
|
|
48
|
-
* ]
|
|
49
|
-
* }
|
|
50
|
-
*
|
|
51
|
-
* Converted to JSON, but with no names or lengths:
|
|
52
|
-
* {
|
|
53
|
-
* children: [
|
|
54
|
-
* {}, {}, {
|
|
55
|
-
* children: [{}, {}]
|
|
56
|
-
* }
|
|
57
|
-
* ]
|
|
58
|
-
* }
|
|
59
|
-
*/
|
|
60
|
-
export default function parse(s: string): Record<string, any>;
|
package/dist/parseNewick.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Newick format parser in JavaScript.
|
|
3
|
-
*
|
|
4
|
-
* Copyright (c) Jason Davies 2010.
|
|
5
|
-
*
|
|
6
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
8
|
-
* in the Software without restriction, including without limitation the rights
|
|
9
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
11
|
-
* furnished to do so, subject to the following conditions:
|
|
12
|
-
*
|
|
13
|
-
* The above copyright notice and this permission notice shall be included in
|
|
14
|
-
* all copies or substantial portions of the Software.
|
|
15
|
-
*
|
|
16
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
22
|
-
* THE SOFTWARE.
|
|
23
|
-
*
|
|
24
|
-
* Example tree (from http://en.wikipedia.org/wiki/Newick_format):
|
|
25
|
-
*
|
|
26
|
-
* +--0.1--A
|
|
27
|
-
* F-----0.2-----B +-------0.3----C
|
|
28
|
-
* +------------------0.5-----E
|
|
29
|
-
* +---------0.4------D
|
|
30
|
-
*
|
|
31
|
-
* Newick format:
|
|
32
|
-
* (A:0.1,B:0.2,(C:0.3,D:0.4)E:0.5)F;
|
|
33
|
-
*
|
|
34
|
-
* Converted to JSON:
|
|
35
|
-
* {
|
|
36
|
-
* name: "F",
|
|
37
|
-
* children: [
|
|
38
|
-
* {name: "A", length: 0.1},
|
|
39
|
-
* {name: "B", length: 0.2},
|
|
40
|
-
* {
|
|
41
|
-
* name: "E",
|
|
42
|
-
* length: 0.5,
|
|
43
|
-
* children: [
|
|
44
|
-
* {name: "C", length: 0.3},
|
|
45
|
-
* {name: "D", length: 0.4}
|
|
46
|
-
* ]
|
|
47
|
-
* }
|
|
48
|
-
* ]
|
|
49
|
-
* }
|
|
50
|
-
*
|
|
51
|
-
* Converted to JSON, but with no names or lengths:
|
|
52
|
-
* {
|
|
53
|
-
* children: [
|
|
54
|
-
* {}, {}, {
|
|
55
|
-
* children: [{}, {}]
|
|
56
|
-
* }
|
|
57
|
-
* ]
|
|
58
|
-
* }
|
|
59
|
-
*/
|
|
60
|
-
export default function parse(s) {
|
|
61
|
-
const ancestors = [];
|
|
62
|
-
let tree = {};
|
|
63
|
-
const tokens = s.split(/\s*(;|\(|\)|,|:)\s*/);
|
|
64
|
-
for (let i = 0; i < tokens.length; i++) {
|
|
65
|
-
const token = tokens[i];
|
|
66
|
-
const subtree = {};
|
|
67
|
-
switch (token) {
|
|
68
|
-
case '(': // new children
|
|
69
|
-
tree.children = [subtree];
|
|
70
|
-
ancestors.push(tree);
|
|
71
|
-
tree = subtree;
|
|
72
|
-
break;
|
|
73
|
-
case ',': // another branch
|
|
74
|
-
ancestors.at(-1)?.children.push(subtree);
|
|
75
|
-
tree = subtree;
|
|
76
|
-
break;
|
|
77
|
-
case ')': // optional name next
|
|
78
|
-
tree = ancestors.pop();
|
|
79
|
-
break;
|
|
80
|
-
case ':': // optional length next
|
|
81
|
-
break;
|
|
82
|
-
default: {
|
|
83
|
-
const x = tokens[i - 1];
|
|
84
|
-
if (x === ')' || x === '(' || x === ',') {
|
|
85
|
-
tree.name = token;
|
|
86
|
-
}
|
|
87
|
-
else if (x === ':') {
|
|
88
|
-
tree.length = Number.parseFloat(token);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return tree;
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=parseNewick.js.map
|
package/dist/parseNewick.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parseNewick.js","sourceRoot":"","sources":["../src/parseNewick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0DG;AACH,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,CAAS;IACrC,MAAM,SAAS,GAAG,EAAE,CAAA;IAEpB,IAAI,IAAI,GAAG,EAAyB,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAA;IAC7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAA;QACxB,MAAM,OAAO,GAAG,EAAE,CAAA;QAClB,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,GAAG,EAAE,eAAe;gBACvB,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC,CAAA;gBACzB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpB,IAAI,GAAG,OAAO,CAAA;gBACd,MAAK;YACP,KAAK,GAAG,EAAE,iBAAiB;gBACzB,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACxC,IAAI,GAAG,OAAO,CAAA;gBACd,MAAK;YACP,KAAK,GAAG,EAAE,qBAAqB;gBAC7B,IAAI,GAAG,SAAS,CAAC,GAAG,EAAG,CAAA;gBACvB,MAAK;YACP,KAAK,GAAG,EAAE,uBAAuB;gBAC/B,MAAK;YACP,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAA;gBACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;oBACxC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;gBACnB,CAAC;qBAAM,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;oBACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/parsers/A3mMSA.d.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import type { NodeWithIds } from '../types';
|
|
2
|
-
/**
|
|
3
|
-
* A3M format parser
|
|
4
|
-
*
|
|
5
|
-
* The A3M format consists of aligned fasta, in which:
|
|
6
|
-
* - Insertions are shown as lowercase characters
|
|
7
|
-
* - Matches are shown as uppercase characters
|
|
8
|
-
* - Deletions are shown as '-'
|
|
9
|
-
* - Gaps aligned to inserts are shown as '.'
|
|
10
|
-
*
|
|
11
|
-
* The key property is that lowercase letters (inserts) implicitly introduce
|
|
12
|
-
* gaps in all other sequences that don't have an insert at that position.
|
|
13
|
-
*/
|
|
14
|
-
export default class A3mMSA {
|
|
15
|
-
private MSA;
|
|
16
|
-
private orderedNames;
|
|
17
|
-
constructor(text: string);
|
|
18
|
-
/**
|
|
19
|
-
* Detect if text is likely A3M format
|
|
20
|
-
*/
|
|
21
|
-
static sniff(text: string): boolean;
|
|
22
|
-
/**
|
|
23
|
-
* Expand A3M format to standard aligned format.
|
|
24
|
-
*
|
|
25
|
-
* In A3M, lowercase characters are insertions that implicitly introduce
|
|
26
|
-
* gaps in sequences that don't have an insert at that position.
|
|
27
|
-
*/
|
|
28
|
-
private expandA3M;
|
|
29
|
-
getMSA(): {
|
|
30
|
-
seqdata: Record<string, string>;
|
|
31
|
-
};
|
|
32
|
-
getRowData(): undefined;
|
|
33
|
-
getNames(): string[];
|
|
34
|
-
getRow(name: string): string;
|
|
35
|
-
getWidth(): number;
|
|
36
|
-
getStructures(): {};
|
|
37
|
-
get alignmentNames(): never[];
|
|
38
|
-
getHeader(): {};
|
|
39
|
-
getTree(): NodeWithIds;
|
|
40
|
-
get seqConsensus(): undefined;
|
|
41
|
-
get secondaryStructureConsensus(): undefined;
|
|
42
|
-
get tracks(): never[];
|
|
43
|
-
}
|
package/dist/parsers/A3mMSA.js
DELETED
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
// Char code helpers for fast character classification
|
|
2
|
-
const CODE_A = 65; // 'A'
|
|
3
|
-
const CODE_Z = 90; // 'Z'
|
|
4
|
-
const CODE_a = 97; // 'a'
|
|
5
|
-
const CODE_z = 122; // 'z'
|
|
6
|
-
const CODE_DASH = 45; // '-'
|
|
7
|
-
const CODE_DOT = 46; // '.'
|
|
8
|
-
function isUpperOrGap(code) {
|
|
9
|
-
return ((code >= CODE_A && code <= CODE_Z) ||
|
|
10
|
-
code === CODE_DASH ||
|
|
11
|
-
code === CODE_DOT);
|
|
12
|
-
}
|
|
13
|
-
function isLower(code) {
|
|
14
|
-
return code >= CODE_a && code <= CODE_z;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* A3M format parser
|
|
18
|
-
*
|
|
19
|
-
* The A3M format consists of aligned fasta, in which:
|
|
20
|
-
* - Insertions are shown as lowercase characters
|
|
21
|
-
* - Matches are shown as uppercase characters
|
|
22
|
-
* - Deletions are shown as '-'
|
|
23
|
-
* - Gaps aligned to inserts are shown as '.'
|
|
24
|
-
*
|
|
25
|
-
* The key property is that lowercase letters (inserts) implicitly introduce
|
|
26
|
-
* gaps in all other sequences that don't have an insert at that position.
|
|
27
|
-
*/
|
|
28
|
-
export default class A3mMSA {
|
|
29
|
-
MSA;
|
|
30
|
-
orderedNames;
|
|
31
|
-
constructor(text) {
|
|
32
|
-
const rawSeqs = [];
|
|
33
|
-
const names = [];
|
|
34
|
-
// First pass: parse sequences (like FASTA), preserving order
|
|
35
|
-
for (const entry of text.split('>')) {
|
|
36
|
-
if (!/\S/.test(entry)) {
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
const newlineIdx = entry.indexOf('\n');
|
|
40
|
-
if (newlineIdx === -1) {
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
const defLine = entry.slice(0, newlineIdx);
|
|
44
|
-
const spaceIdx = defLine.indexOf(' ');
|
|
45
|
-
const id = spaceIdx === -1 ? defLine : defLine.slice(0, spaceIdx);
|
|
46
|
-
if (id) {
|
|
47
|
-
rawSeqs.push(entry.slice(newlineIdx + 1).replaceAll(/\s/g, ''));
|
|
48
|
-
names.push(id);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
this.orderedNames = names;
|
|
52
|
-
this.MSA = { seqdata: this.expandA3M(rawSeqs, names) };
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Detect if text is likely A3M format
|
|
56
|
-
*/
|
|
57
|
-
static sniff(text) {
|
|
58
|
-
if (!text.startsWith('>')) {
|
|
59
|
-
return false;
|
|
60
|
-
}
|
|
61
|
-
const seqs = [];
|
|
62
|
-
for (const entry of text.split('>')) {
|
|
63
|
-
if (!/\S/.test(entry)) {
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
const newlineIdx = entry.indexOf('\n');
|
|
67
|
-
if (newlineIdx === -1) {
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const seq = entry.slice(newlineIdx + 1).replaceAll(/\s/g, '');
|
|
71
|
-
if (seq) {
|
|
72
|
-
seqs.push(seq);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (seqs.length < 2) {
|
|
76
|
-
return false;
|
|
77
|
-
}
|
|
78
|
-
// Check for lowercase and compute lengths in single pass per sequence
|
|
79
|
-
let hasLowercase = false;
|
|
80
|
-
let firstMatchLen = -1;
|
|
81
|
-
let firstRawLen = -1;
|
|
82
|
-
let sameMatchLength = true;
|
|
83
|
-
let differentRawLengths = false;
|
|
84
|
-
for (const seq of seqs) {
|
|
85
|
-
let matchLen = 0;
|
|
86
|
-
for (let i = 0; i < seq.length; i++) {
|
|
87
|
-
const code = seq.charCodeAt(i);
|
|
88
|
-
if (isLower(code)) {
|
|
89
|
-
hasLowercase = true;
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
matchLen++;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
if (firstMatchLen === -1) {
|
|
96
|
-
firstMatchLen = matchLen;
|
|
97
|
-
firstRawLen = seq.length;
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
if (matchLen !== firstMatchLen) {
|
|
101
|
-
sameMatchLength = false;
|
|
102
|
-
}
|
|
103
|
-
if (seq.length !== firstRawLen) {
|
|
104
|
-
differentRawLengths = true;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
return hasLowercase && sameMatchLength && differentRawLengths;
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Expand A3M format to standard aligned format.
|
|
112
|
-
*
|
|
113
|
-
* In A3M, lowercase characters are insertions that implicitly introduce
|
|
114
|
-
* gaps in sequences that don't have an insert at that position.
|
|
115
|
-
*/
|
|
116
|
-
expandA3M(rawSeqs, names) {
|
|
117
|
-
const numSeqs = names.length;
|
|
118
|
-
if (numSeqs === 0) {
|
|
119
|
-
return {};
|
|
120
|
-
}
|
|
121
|
-
// Parse sequences into parallel arrays: matchChars and insertLengths
|
|
122
|
-
// matchChars[seqIdx] = string of match characters for that sequence
|
|
123
|
-
// insertLengths[seqIdx] = array of insert lengths after each match position
|
|
124
|
-
const matchChars = [];
|
|
125
|
-
const insertLengths = [];
|
|
126
|
-
for (let seqIdx = 0; seqIdx < numSeqs; seqIdx++) {
|
|
127
|
-
const seq = rawSeqs[seqIdx];
|
|
128
|
-
const matches = [];
|
|
129
|
-
const insLens = [];
|
|
130
|
-
let i = 0;
|
|
131
|
-
while (i < seq.length) {
|
|
132
|
-
const code = seq.charCodeAt(i);
|
|
133
|
-
if (isUpperOrGap(code)) {
|
|
134
|
-
matches.push(seq[i]);
|
|
135
|
-
// Count following lowercase inserts
|
|
136
|
-
let insLen = 0;
|
|
137
|
-
let j = i + 1;
|
|
138
|
-
while (j < seq.length && isLower(seq.charCodeAt(j))) {
|
|
139
|
-
insLen++;
|
|
140
|
-
j++;
|
|
141
|
-
}
|
|
142
|
-
insLens.push(insLen);
|
|
143
|
-
i = j;
|
|
144
|
-
}
|
|
145
|
-
else if (isLower(code)) {
|
|
146
|
-
// Leading insert before first match
|
|
147
|
-
matches.push('');
|
|
148
|
-
let insLen = 0;
|
|
149
|
-
let j = i;
|
|
150
|
-
while (j < seq.length && isLower(seq.charCodeAt(j))) {
|
|
151
|
-
insLen++;
|
|
152
|
-
j++;
|
|
153
|
-
}
|
|
154
|
-
insLens.push(insLen);
|
|
155
|
-
i = j;
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
i++;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
matchChars.push(matches.join(''));
|
|
162
|
-
insertLengths.push(insLens);
|
|
163
|
-
}
|
|
164
|
-
// Find number of match positions and max inserts at each position
|
|
165
|
-
let numPositions = 0;
|
|
166
|
-
for (let seqIdx = 0; seqIdx < numSeqs; seqIdx++) {
|
|
167
|
-
const len = insertLengths[seqIdx].length;
|
|
168
|
-
if (len > numPositions) {
|
|
169
|
-
numPositions = len;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
const maxInserts = new Array(numPositions).fill(0);
|
|
173
|
-
for (let seqIdx = 0; seqIdx < numSeqs; seqIdx++) {
|
|
174
|
-
const insLens = insertLengths[seqIdx];
|
|
175
|
-
for (let pos = 0; pos < insLens.length; pos++) {
|
|
176
|
-
const len = insLens[pos];
|
|
177
|
-
if (len > maxInserts[pos]) {
|
|
178
|
-
maxInserts[pos] = len;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
// Pre-compute gap strings for common lengths (avoid repeated .repeat())
|
|
183
|
-
const gapCache = [''];
|
|
184
|
-
const maxGap = Math.max(...maxInserts, 0);
|
|
185
|
-
for (let i = 1; i <= maxGap; i++) {
|
|
186
|
-
gapCache.push('.'.repeat(i));
|
|
187
|
-
}
|
|
188
|
-
// Build expanded sequences
|
|
189
|
-
const expanded = {};
|
|
190
|
-
for (let seqIdx = 0; seqIdx < numSeqs; seqIdx++) {
|
|
191
|
-
const seq = rawSeqs[seqIdx];
|
|
192
|
-
const matches = matchChars[seqIdx];
|
|
193
|
-
const insLens = insertLengths[seqIdx];
|
|
194
|
-
const result = [];
|
|
195
|
-
// Track position in original sequence for extracting inserts
|
|
196
|
-
let seqPos = 0;
|
|
197
|
-
for (let pos = 0; pos < numPositions; pos++) {
|
|
198
|
-
const maxIns = maxInserts[pos];
|
|
199
|
-
if (pos < insLens.length) {
|
|
200
|
-
const matchChar = matches[pos];
|
|
201
|
-
const insLen = insLens[pos];
|
|
202
|
-
// Add match character
|
|
203
|
-
if (matchChar) {
|
|
204
|
-
result.push(matchChar);
|
|
205
|
-
seqPos++;
|
|
206
|
-
}
|
|
207
|
-
else {
|
|
208
|
-
result.push('.');
|
|
209
|
-
}
|
|
210
|
-
// Extract and uppercase inserts from original sequence
|
|
211
|
-
if (insLen > 0) {
|
|
212
|
-
result.push(seq.slice(seqPos, seqPos + insLen).toUpperCase());
|
|
213
|
-
seqPos += insLen;
|
|
214
|
-
}
|
|
215
|
-
// Pad with gaps
|
|
216
|
-
const padding = maxIns - insLen;
|
|
217
|
-
if (padding > 0) {
|
|
218
|
-
result.push(gapCache[padding]);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
// This sequence is shorter - add gaps
|
|
223
|
-
result.push(gapCache[1 + maxIns]);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
expanded[names[seqIdx]] = result.join('');
|
|
227
|
-
}
|
|
228
|
-
return expanded;
|
|
229
|
-
}
|
|
230
|
-
getMSA() {
|
|
231
|
-
return this.MSA;
|
|
232
|
-
}
|
|
233
|
-
getRowData() {
|
|
234
|
-
return undefined;
|
|
235
|
-
}
|
|
236
|
-
getNames() {
|
|
237
|
-
return this.orderedNames;
|
|
238
|
-
}
|
|
239
|
-
getRow(name) {
|
|
240
|
-
return this.MSA.seqdata[name] || '';
|
|
241
|
-
}
|
|
242
|
-
getWidth() {
|
|
243
|
-
const name = Object.keys(this.MSA.seqdata)[0];
|
|
244
|
-
return name ? this.getRow(name).length : 0;
|
|
245
|
-
}
|
|
246
|
-
getStructures() {
|
|
247
|
-
return {};
|
|
248
|
-
}
|
|
249
|
-
get alignmentNames() {
|
|
250
|
-
return [];
|
|
251
|
-
}
|
|
252
|
-
getHeader() {
|
|
253
|
-
return {};
|
|
254
|
-
}
|
|
255
|
-
getTree() {
|
|
256
|
-
return {
|
|
257
|
-
id: 'root',
|
|
258
|
-
name: 'root',
|
|
259
|
-
noTree: true,
|
|
260
|
-
children: this.getNames().map(name => ({
|
|
261
|
-
id: name,
|
|
262
|
-
children: [],
|
|
263
|
-
name,
|
|
264
|
-
})),
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
get seqConsensus() {
|
|
268
|
-
return undefined;
|
|
269
|
-
}
|
|
270
|
-
get secondaryStructureConsensus() {
|
|
271
|
-
return undefined;
|
|
272
|
-
}
|
|
273
|
-
get tracks() {
|
|
274
|
-
return [];
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
//# sourceMappingURL=A3mMSA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"A3mMSA.js","sourceRoot":"","sources":["../../src/parsers/A3mMSA.ts"],"names":[],"mappings":"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"}
|