react-msaview 4.4.6 → 4.6.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 +9 -9
- package/bundle/index.js.LICENSE.txt +8 -8
- package/bundle/index.js.map +1 -1
- package/dist/colorSchemes.d.ts +0 -6
- package/dist/colorSchemes.js +1 -119
- package/dist/colorSchemes.js.map +1 -1
- package/dist/components/ConservationTrack.d.ts +8 -0
- package/dist/components/ConservationTrack.js +54 -0
- package/dist/components/ConservationTrack.js.map +1 -0
- package/dist/components/Loading.js +14 -2
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.js +36 -0
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/SequenceTextArea.js +3 -2
- package/dist/components/SequenceTextArea.js.map +1 -1
- package/dist/components/TextTrack.d.ts +3 -3
- package/dist/components/TextTrack.js +4 -1
- package/dist/components/TextTrack.js.map +1 -1
- package/dist/components/Track.js +21 -8
- package/dist/components/Track.js.map +1 -1
- package/dist/components/dialogs/ExportSVGDialog.js +19 -3
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -1
- package/dist/components/header/GappynessSlider.d.ts +6 -0
- package/dist/components/header/GappynessSlider.js +19 -0
- package/dist/components/header/GappynessSlider.js.map +1 -0
- package/dist/components/header/Header.js +3 -1
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/HeaderMenu.js +30 -14
- package/dist/components/header/HeaderMenu.js.map +1 -1
- package/dist/components/minimap/MinimapSVG.js +4 -3
- package/dist/components/minimap/MinimapSVG.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +56 -42
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +71 -26
- 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/tracks/renderTracksSvg.d.ts +29 -0
- package/dist/components/tracks/renderTracksSvg.js +83 -0
- package/dist/components/tracks/renderTracksSvg.js.map +1 -0
- package/dist/components/tree/TreeNodeMenu.js +2 -2
- package/dist/components/tree/TreeNodeMenu.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +0 -1
- package/dist/components/tree/renderTreeCanvas.js +23 -24
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/constants.d.ts +22 -0
- package/dist/constants.js +26 -0
- package/dist/constants.js.map +1 -0
- package/dist/layout.js.map +1 -1
- package/dist/model/msaModel.js +3 -2
- package/dist/model/msaModel.js.map +1 -1
- package/dist/model/treeModel.js +9 -8
- package/dist/model/treeModel.js.map +1 -1
- package/dist/model.d.ts +271 -15
- package/dist/model.js +427 -128
- package/dist/model.js.map +1 -1
- package/dist/neighborJoining.d.ts +1 -0
- package/dist/neighborJoining.js +839 -0
- package/dist/neighborJoining.js.map +1 -0
- package/dist/neighborJoining.test.d.ts +1 -0
- package/dist/neighborJoining.test.js +110 -0
- package/dist/neighborJoining.test.js.map +1 -0
- package/dist/parsers/A3mMSA.d.ts +43 -0
- package/dist/parsers/A3mMSA.js +277 -0
- package/dist/parsers/A3mMSA.js.map +1 -0
- package/dist/parsers/A3mMSA.test.d.ts +1 -0
- package/dist/parsers/A3mMSA.test.js +138 -0
- package/dist/parsers/A3mMSA.test.js.map +1 -0
- package/dist/parsers/ClustalMSA.d.ts +4 -4
- package/dist/parsers/ClustalMSA.js +3 -1
- package/dist/parsers/ClustalMSA.js.map +1 -1
- package/dist/parsers/FastaMSA.js +17 -16
- package/dist/parsers/FastaMSA.js.map +1 -1
- package/dist/renderToSvg.d.ts +1 -0
- package/dist/renderToSvg.js +48 -18
- package/dist/renderToSvg.js.map +1 -1
- package/dist/rowCoordinateCalculations.js +2 -0
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/types.d.ts +2 -3
- package/dist/util.js +17 -9
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -6
- package/src/colorSchemes.ts +1 -179
- package/src/components/ConservationTrack.tsx +104 -0
- package/src/components/Loading.tsx +44 -2
- package/src/components/MSAView.tsx +68 -0
- package/src/components/SequenceTextArea.tsx +3 -2
- package/src/components/TextTrack.tsx +7 -4
- package/src/components/Track.tsx +25 -9
- package/src/components/dialogs/ExportSVGDialog.tsx +25 -1
- package/src/components/header/GappynessSlider.tsx +35 -0
- package/src/components/header/Header.tsx +3 -1
- package/src/components/header/HeaderMenu.tsx +36 -15
- package/src/components/minimap/MinimapSVG.tsx +6 -3
- package/src/components/msa/MSACanvasBlock.tsx +66 -48
- package/src/components/msa/renderMSABlock.ts +103 -40
- package/src/components/msa/renderMSAMouseover.ts +9 -0
- package/src/components/tracks/renderTracksSvg.ts +157 -0
- package/src/components/tree/TreeNodeMenu.tsx +2 -2
- package/src/components/tree/renderTreeCanvas.ts +25 -34
- package/src/constants.ts +27 -0
- package/src/layout.ts +1 -6
- package/src/model/msaModel.ts +4 -2
- package/src/model/treeModel.ts +19 -8
- package/src/model.ts +517 -140
- package/src/neighborJoining.test.ts +129 -0
- package/src/neighborJoining.ts +885 -0
- package/src/parsers/A3mMSA.test.ts +164 -0
- package/src/parsers/A3mMSA.ts +321 -0
- package/src/parsers/ClustalMSA.ts +7 -5
- package/src/parsers/FastaMSA.ts +17 -17
- package/src/renderToSvg.tsx +105 -26
- package/src/rowCoordinateCalculations.ts +2 -0
- package/src/types.ts +2 -4
- package/src/util.ts +21 -8
- package/src/version.ts +1 -1
- package/dist/components/dialogs/TracklistDialog.d.ts +0 -7
- package/dist/components/dialogs/TracklistDialog.js +0 -23
- package/dist/components/dialogs/TracklistDialog.js.map +0 -1
- package/src/components/dialogs/TracklistDialog.tsx +0 -73
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { calculateNeighborJoiningTree } from './neighborJoining'
|
|
4
|
+
|
|
5
|
+
describe('calculateNeighborJoiningTree', () => {
|
|
6
|
+
test('generates valid Newick tree for 2 sequences', () => {
|
|
7
|
+
const rows: [string, string][] = [
|
|
8
|
+
['seq1', 'MKAA'],
|
|
9
|
+
['seq2', 'MKAA'],
|
|
10
|
+
]
|
|
11
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
12
|
+
|
|
13
|
+
expect(tree).toMatch(/;$/)
|
|
14
|
+
expect(tree).toContain('seq1')
|
|
15
|
+
expect(tree).toContain('seq2')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
test('generates valid Newick tree for 3 sequences', () => {
|
|
19
|
+
const rows: [string, string][] = [
|
|
20
|
+
['human', 'MKAAYLSMFG'],
|
|
21
|
+
['mouse', 'MKAAYLSMFG'],
|
|
22
|
+
['chicken', 'MKAAFLSMFG'],
|
|
23
|
+
]
|
|
24
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
25
|
+
|
|
26
|
+
expect(tree).toMatch(/;$/)
|
|
27
|
+
expect(tree).toContain('human')
|
|
28
|
+
expect(tree).toContain('mouse')
|
|
29
|
+
expect(tree).toContain('chicken')
|
|
30
|
+
expect(tree).toContain('(')
|
|
31
|
+
expect(tree).toContain(')')
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
test('generates valid Newick tree for 4 sequences', () => {
|
|
35
|
+
const rows: [string, string][] = [
|
|
36
|
+
['A', 'MKAAYLSMFGKED'],
|
|
37
|
+
['B', 'MKAAYLSMFGKED'],
|
|
38
|
+
['C', 'MKAAFLSMFGKEE'],
|
|
39
|
+
['D', 'MKAAFLSMFGKEE'],
|
|
40
|
+
]
|
|
41
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
42
|
+
|
|
43
|
+
expect(tree).toMatch(/;$/)
|
|
44
|
+
expect(tree).toContain('A')
|
|
45
|
+
expect(tree).toContain('B')
|
|
46
|
+
expect(tree).toContain('C')
|
|
47
|
+
expect(tree).toContain('D')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
test('includes branch lengths in tree', () => {
|
|
51
|
+
const rows: [string, string][] = [
|
|
52
|
+
['seq1', 'MKAAYLSMFG'],
|
|
53
|
+
['seq2', 'MKAAFLSMFG'],
|
|
54
|
+
['seq3', 'MKBBFLSMFG'],
|
|
55
|
+
]
|
|
56
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
57
|
+
|
|
58
|
+
// Branch lengths are formatted as :0.123456
|
|
59
|
+
expect(tree).toMatch(/:\d+\.\d+/)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
test('throws error for less than 2 sequences', () => {
|
|
63
|
+
const rows: [string, string][] = [['seq1', 'MKAA']]
|
|
64
|
+
expect(() => calculateNeighborJoiningTree(rows)).toThrow(
|
|
65
|
+
'Need at least 2 sequences',
|
|
66
|
+
)
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test('handles sequences with gaps', () => {
|
|
70
|
+
const rows: [string, string][] = [
|
|
71
|
+
['seq1', 'MK-AYLSMFG'],
|
|
72
|
+
['seq2', 'MKAAYLSMFG'],
|
|
73
|
+
['seq3', 'MKA-YLSMFG'],
|
|
74
|
+
]
|
|
75
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
76
|
+
|
|
77
|
+
expect(tree).toMatch(/;$/)
|
|
78
|
+
expect(tree).toContain('seq1')
|
|
79
|
+
expect(tree).toContain('seq2')
|
|
80
|
+
expect(tree).toContain('seq3')
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
test('handles special characters in sequence names', () => {
|
|
84
|
+
const rows: [string, string][] = [
|
|
85
|
+
['seq:1', 'MKAA'],
|
|
86
|
+
['seq(2)', 'MKAA'],
|
|
87
|
+
]
|
|
88
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
89
|
+
|
|
90
|
+
expect(tree).toMatch(/;$/)
|
|
91
|
+
// Special characters should be escaped
|
|
92
|
+
expect(tree).not.toMatch(/seq:1/)
|
|
93
|
+
expect(tree).not.toMatch(/seq\(2\)/)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
test('identical sequences have zero distance', () => {
|
|
97
|
+
const rows: [string, string][] = [
|
|
98
|
+
['seq1', 'MKAAYLSMFG'],
|
|
99
|
+
['seq2', 'MKAAYLSMFG'],
|
|
100
|
+
]
|
|
101
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
102
|
+
|
|
103
|
+
// Identical sequences should have equal branch lengths
|
|
104
|
+
const match = tree.match(/:(\d+\.\d+)/g)
|
|
105
|
+
expect(match).not.toBeNull()
|
|
106
|
+
if (match) {
|
|
107
|
+
const lengths = match.map(m => parseFloat(m.slice(1)))
|
|
108
|
+
// Branch lengths should be small or zero for identical sequences
|
|
109
|
+
for (const len of lengths) {
|
|
110
|
+
expect(len).toBeGreaterThanOrEqual(0)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
test('more divergent sequences have larger distances', () => {
|
|
116
|
+
const rows: [string, string][] = [
|
|
117
|
+
['similar1', 'MKAAYLSMFGKED'],
|
|
118
|
+
['similar2', 'MKAAYLSMFGKED'],
|
|
119
|
+
['different', 'WWWWWWWWWWWWW'],
|
|
120
|
+
]
|
|
121
|
+
const tree = calculateNeighborJoiningTree(rows)
|
|
122
|
+
|
|
123
|
+
expect(tree).toMatch(/;$/)
|
|
124
|
+
// The tree should be valid even with very different sequences
|
|
125
|
+
expect(tree).toContain('similar1')
|
|
126
|
+
expect(tree).toContain('similar2')
|
|
127
|
+
expect(tree).toContain('different')
|
|
128
|
+
})
|
|
129
|
+
})
|