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.
Files changed (98) hide show
  1. package/bundle/index.js +99 -99
  2. package/bundle/index.js.LICENSE.txt +6 -6
  3. package/bundle/index.js.map +1 -1
  4. package/dist/__snapshots__/parseAsn1.test.js.snap +2400 -0
  5. package/dist/components/header/HeaderInfoArea.js +3 -4
  6. package/dist/components/header/HeaderInfoArea.js.map +1 -1
  7. package/dist/components/import/ImportForm.js +6 -2
  8. package/dist/components/import/ImportForm.js.map +1 -1
  9. package/dist/components/import/util.d.ts +1 -1
  10. package/dist/components/import/util.js +4 -1
  11. package/dist/components/import/util.js.map +1 -1
  12. package/dist/components/msa/renderBoxFeatureCanvasBlock.js +7 -2
  13. package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
  14. package/dist/components/msa/renderMSABlock.js +20 -18
  15. package/dist/components/msa/renderMSABlock.js.map +1 -1
  16. package/dist/components/msa/renderMSAMouseover.js +8 -1
  17. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  18. package/dist/components/tree/renderTreeCanvas.d.ts +0 -1
  19. package/dist/components/tree/renderTreeCanvas.js +32 -31
  20. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  21. package/dist/model.d.ts +168 -16
  22. package/dist/model.js +116 -29
  23. package/dist/model.js.map +1 -1
  24. package/dist/rowCoordinateCalculations.d.ts +69 -9
  25. package/dist/rowCoordinateCalculations.js +118 -46
  26. package/dist/rowCoordinateCalculations.js.map +1 -1
  27. package/dist/rowCoordinateCalculations.test.js +152 -52
  28. package/dist/rowCoordinateCalculations.test.js.map +1 -1
  29. package/dist/seqPosToGlobalCol.d.ts +19 -0
  30. package/dist/seqPosToGlobalCol.js +34 -0
  31. package/dist/seqPosToGlobalCol.js.map +1 -0
  32. package/dist/seqPosToGlobalCol.test.js +60 -0
  33. package/dist/seqPosToGlobalCol.test.js.map +1 -0
  34. package/dist/util.d.ts +1 -2
  35. package/dist/util.js +0 -9
  36. package/dist/util.js.map +1 -1
  37. package/dist/version.d.ts +1 -1
  38. package/dist/version.js +1 -1
  39. package/package.json +7 -9
  40. package/src/components/header/HeaderInfoArea.tsx +2 -5
  41. package/src/components/import/ImportForm.tsx +6 -1
  42. package/src/components/import/util.ts +4 -0
  43. package/src/components/msa/renderBoxFeatureCanvasBlock.ts +7 -2
  44. package/src/components/msa/renderMSABlock.ts +26 -19
  45. package/src/components/msa/renderMSAMouseover.ts +9 -0
  46. package/src/components/tree/renderTreeCanvas.ts +35 -42
  47. package/src/declare.d.ts +0 -1
  48. package/src/model.ts +143 -42
  49. package/src/rowCoordinateCalculations.test.ts +167 -74
  50. package/src/rowCoordinateCalculations.ts +138 -63
  51. package/src/seqPosToGlobalCol.test.ts +71 -0
  52. package/src/seqPosToGlobalCol.ts +40 -0
  53. package/src/util.ts +1 -19
  54. package/src/version.ts +1 -1
  55. package/dist/parseGFF.d.ts +0 -10
  56. package/dist/parseGFF.js +0 -31
  57. package/dist/parseGFF.js.map +0 -1
  58. package/dist/parseNewick.d.ts +0 -60
  59. package/dist/parseNewick.js +0 -95
  60. package/dist/parseNewick.js.map +0 -1
  61. package/dist/parsers/A3mMSA.d.ts +0 -43
  62. package/dist/parsers/A3mMSA.js +0 -277
  63. package/dist/parsers/A3mMSA.js.map +0 -1
  64. package/dist/parsers/A3mMSA.test.js +0 -138
  65. package/dist/parsers/A3mMSA.test.js.map +0 -1
  66. package/dist/parsers/ClustalMSA.d.ts +0 -30
  67. package/dist/parsers/ClustalMSA.js +0 -55
  68. package/dist/parsers/ClustalMSA.js.map +0 -1
  69. package/dist/parsers/EmfMSA.d.ts +0 -27
  70. package/dist/parsers/EmfMSA.js +0 -53
  71. package/dist/parsers/EmfMSA.js.map +0 -1
  72. package/dist/parsers/EmfTree.d.ts +0 -5
  73. package/dist/parsers/EmfTree.js +0 -8
  74. package/dist/parsers/EmfTree.js.map +0 -1
  75. package/dist/parsers/FastaMSA.d.ts +0 -19
  76. package/dist/parsers/FastaMSA.js +0 -69
  77. package/dist/parsers/FastaMSA.js.map +0 -1
  78. package/dist/parsers/StockholmMSA.d.ts +0 -68
  79. package/dist/parsers/StockholmMSA.js +0 -107
  80. package/dist/parsers/StockholmMSA.js.map +0 -1
  81. package/dist/seqCoordToRowSpecificGlobalCoord.d.ts +0 -4
  82. package/dist/seqCoordToRowSpecificGlobalCoord.js +0 -19
  83. package/dist/seqCoordToRowSpecificGlobalCoord.js.map +0 -1
  84. package/dist/seqCoordToRowSpecificGlobalCoord.test.d.ts +0 -1
  85. package/dist/seqCoordToRowSpecificGlobalCoord.test.js +0 -42
  86. package/dist/seqCoordToRowSpecificGlobalCoord.test.js.map +0 -1
  87. package/src/parseGFF.ts +0 -34
  88. package/src/parseNewick.ts +0 -94
  89. package/src/parsers/A3mMSA.test.ts +0 -164
  90. package/src/parsers/A3mMSA.ts +0 -321
  91. package/src/parsers/ClustalMSA.ts +0 -69
  92. package/src/parsers/EmfMSA.ts +0 -67
  93. package/src/parsers/EmfTree.ts +0 -9
  94. package/src/parsers/FastaMSA.ts +0 -82
  95. package/src/parsers/StockholmMSA.ts +0 -140
  96. package/src/seqCoordToRowSpecificGlobalCoord.test.ts +0 -53
  97. package/src/seqCoordToRowSpecificGlobalCoord.ts +0 -25
  98. /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 { Node, NodeWithIds } from './types'
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.4.7'
1
+ export const version = '4.7.0'
@@ -1,10 +0,0 @@
1
- export declare function parseGFF(str?: string): {
2
- seq_id: string;
3
- source: string;
4
- type: string;
5
- start: number;
6
- end: number;
7
- score: number;
8
- strand: string;
9
- phase: string;
10
- }[] | undefined;
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
@@ -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"}
@@ -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>;
@@ -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
@@ -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"}
@@ -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
- }
@@ -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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"}