react-msaview 4.4.5 → 4.5.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 +53 -10
- package/dist/components/msa/renderMSABlock.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/TreeCanvasBlock.js +1 -1
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeNodeMenu.js +2 -2
- package/dist/components/tree/TreeNodeMenu.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.js +1 -1
- 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 +256 -15
- package/dist/model.js +408 -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 +3 -5
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/rowCoordinateCalculations.test.js +14 -2
- package/dist/rowCoordinateCalculations.test.js.map +1 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.js +9 -5
- package/dist/seqCoordToRowSpecificGlobalCoord.js.map +1 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.test.js +6 -6
- 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 +82 -22
- package/src/components/tracks/renderTracksSvg.ts +157 -0
- package/src/components/tree/TreeCanvasBlock.tsx +1 -1
- package/src/components/tree/TreeNodeMenu.tsx +2 -2
- package/src/components/tree/renderTreeCanvas.ts +1 -1
- 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 +496 -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.test.ts +15 -2
- package/src/rowCoordinateCalculations.ts +3 -5
- package/src/seqCoordToRowSpecificGlobalCoord.test.ts +6 -6
- package/src/seqCoordToRowSpecificGlobalCoord.ts +9 -4
- 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
|
+
})
|