jbrowse-plugin-msaview 2.2.2 → 2.2.4

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 (162) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +229 -0
  3. package/dist/AddHighlightModel/GenomeMouseoverHighlight.js +23 -18
  4. package/dist/AddHighlightModel/GenomeMouseoverHighlight.js.map +1 -1
  5. package/dist/AddHighlightModel/MsaToGenomeHighlight.js +23 -13
  6. package/dist/AddHighlightModel/MsaToGenomeHighlight.js.map +1 -1
  7. package/dist/AddHighlightModel/index.js +8 -1
  8. package/dist/AddHighlightModel/index.js.map +1 -1
  9. package/dist/AddHighlightModel/util.d.ts +2 -2
  10. package/dist/BgzipFastaMsaAdapter/configSchema.d.ts +2 -2
  11. package/dist/LaunchMsaView/components/EnsemblGeneTree/EnsemblGeneTree.js +5 -11
  12. package/dist/LaunchMsaView/components/EnsemblGeneTree/EnsemblGeneTree.js.map +1 -1
  13. package/dist/LaunchMsaView/components/EnsemblGeneTree/useGeneTree.js +5 -1
  14. package/dist/LaunchMsaView/components/EnsemblGeneTree/useGeneTree.js.map +1 -1
  15. package/dist/LaunchMsaView/components/LaunchMsaViewDialog.js +16 -16
  16. package/dist/LaunchMsaView/components/LaunchMsaViewDialog.js.map +1 -1
  17. package/dist/LaunchMsaView/components/ManualMSALoader/ManualMSALoader.js +38 -46
  18. package/dist/LaunchMsaView/components/ManualMSALoader/ManualMSALoader.js.map +1 -1
  19. package/dist/LaunchMsaView/components/ManualMSALoader/launchView.d.ts +4 -3
  20. package/dist/LaunchMsaView/components/ManualMSALoader/launchView.js +4 -3
  21. package/dist/LaunchMsaView/components/ManualMSALoader/launchView.js.map +1 -1
  22. package/dist/LaunchMsaView/components/NCBIBlastQuery/CachedBlastResults.d.ts +9 -0
  23. package/dist/LaunchMsaView/components/NCBIBlastQuery/CachedBlastResults.js +76 -0
  24. package/dist/LaunchMsaView/components/NCBIBlastQuery/CachedBlastResults.js.map +1 -0
  25. package/dist/LaunchMsaView/components/NCBIBlastQuery/NCBIBlastAutomaticPanel.js +35 -13
  26. package/dist/LaunchMsaView/components/NCBIBlastQuery/NCBIBlastAutomaticPanel.js.map +1 -1
  27. package/dist/LaunchMsaView/components/NCBIBlastQuery/NCBIBlastManualPanel.js +6 -12
  28. package/dist/LaunchMsaView/components/NCBIBlastQuery/NCBIBlastManualPanel.js.map +1 -1
  29. package/dist/LaunchMsaView/components/NCBIBlastQuery/blastLaunchView.d.ts +6 -0
  30. package/dist/LaunchMsaView/components/NCBIBlastQuery/blastLaunchView.js +15 -0
  31. package/dist/LaunchMsaView/components/NCBIBlastQuery/blastLaunchView.js.map +1 -1
  32. package/dist/LaunchMsaView/components/PreLoadedMSA/PreLoadedMSADataPanel.js +12 -34
  33. package/dist/LaunchMsaView/components/PreLoadedMSA/PreLoadedMSADataPanel.js.map +1 -1
  34. package/dist/LaunchMsaView/components/PreLoadedMSA/consts.d.ts +1 -0
  35. package/dist/LaunchMsaView/components/PreLoadedMSA/consts.js +1 -0
  36. package/dist/LaunchMsaView/components/PreLoadedMSA/consts.js.map +1 -1
  37. package/dist/LaunchMsaView/components/TabPanel.d.ts +2 -2
  38. package/dist/LaunchMsaView/components/TranscriptSelector.d.ts +2 -2
  39. package/dist/LaunchMsaView/components/TranscriptSelector.js +3 -6
  40. package/dist/LaunchMsaView/components/TranscriptSelector.js.map +1 -1
  41. package/dist/LaunchMsaView/components/useSWRFeatureSequence.js +6 -4
  42. package/dist/LaunchMsaView/components/useSWRFeatureSequence.js.map +1 -1
  43. package/dist/LaunchMsaView/components/useTranscriptSelection.d.ts +16 -0
  44. package/dist/LaunchMsaView/components/useTranscriptSelection.js +31 -0
  45. package/dist/LaunchMsaView/components/useTranscriptSelection.js.map +1 -0
  46. package/dist/LaunchMsaView/components/util.d.ts +3 -1
  47. package/dist/LaunchMsaView/components/util.js +12 -2
  48. package/dist/LaunchMsaView/components/util.js.map +1 -1
  49. package/dist/LaunchMsaView/util.d.ts +2 -0
  50. package/dist/LaunchMsaView/util.js +16 -4
  51. package/dist/LaunchMsaView/util.js.map +1 -1
  52. package/dist/LaunchMsaViewExtensionPoint/index.d.ts +2 -0
  53. package/dist/LaunchMsaViewExtensionPoint/index.js +31 -0
  54. package/dist/LaunchMsaViewExtensionPoint/index.js.map +1 -0
  55. package/dist/MsaViewPanel/components/ConnectStructureDialog.d.ts +7 -0
  56. package/dist/MsaViewPanel/components/ConnectStructureDialog.js +56 -0
  57. package/dist/MsaViewPanel/components/ConnectStructureDialog.js.map +1 -0
  58. package/dist/MsaViewPanel/components/MsaViewPanel.js +4 -2
  59. package/dist/MsaViewPanel/components/MsaViewPanel.js.map +1 -1
  60. package/dist/MsaViewPanel/doLaunchBlast.d.ts +1 -0
  61. package/dist/MsaViewPanel/doLaunchBlast.js +65 -19
  62. package/dist/MsaViewPanel/doLaunchBlast.js.map +1 -1
  63. package/dist/MsaViewPanel/genomeToMSA.d.ts +6 -0
  64. package/dist/MsaViewPanel/genomeToMSA.js +38 -8
  65. package/dist/MsaViewPanel/genomeToMSA.js.map +1 -1
  66. package/dist/MsaViewPanel/genomeToMSA.test.d.ts +1 -0
  67. package/dist/MsaViewPanel/genomeToMSA.test.js +244 -0
  68. package/dist/MsaViewPanel/genomeToMSA.test.js.map +1 -0
  69. package/dist/MsaViewPanel/model.d.ts +727 -226
  70. package/dist/MsaViewPanel/model.js +496 -52
  71. package/dist/MsaViewPanel/model.js.map +1 -1
  72. package/dist/MsaViewPanel/msaCoordToGenomeCoord.d.ts +10 -2
  73. package/dist/MsaViewPanel/msaCoordToGenomeCoord.js +26 -27
  74. package/dist/MsaViewPanel/msaCoordToGenomeCoord.js.map +1 -1
  75. package/dist/MsaViewPanel/msaCoordToGenomeCoord.test.d.ts +1 -0
  76. package/dist/MsaViewPanel/msaCoordToGenomeCoord.test.js +240 -0
  77. package/dist/MsaViewPanel/msaCoordToGenomeCoord.test.js.map +1 -0
  78. package/dist/MsaViewPanel/msaDataStore.d.ts +14 -0
  79. package/dist/MsaViewPanel/msaDataStore.js +197 -0
  80. package/dist/MsaViewPanel/msaDataStore.js.map +1 -0
  81. package/dist/MsaViewPanel/pairwiseAlignment.d.ts +27 -0
  82. package/dist/MsaViewPanel/pairwiseAlignment.js +776 -0
  83. package/dist/MsaViewPanel/pairwiseAlignment.js.map +1 -0
  84. package/dist/MsaViewPanel/pairwiseAlignment.test.d.ts +1 -0
  85. package/dist/MsaViewPanel/pairwiseAlignment.test.js +112 -0
  86. package/dist/MsaViewPanel/pairwiseAlignment.test.js.map +1 -0
  87. package/dist/MsaViewPanel/structureConnection.d.ts +27 -0
  88. package/dist/MsaViewPanel/structureConnection.js +46 -0
  89. package/dist/MsaViewPanel/structureConnection.js.map +1 -0
  90. package/dist/MsaViewPanel/structureConnection.test.d.ts +1 -0
  91. package/dist/MsaViewPanel/structureConnection.test.js +122 -0
  92. package/dist/MsaViewPanel/structureConnection.test.js.map +1 -0
  93. package/dist/MsaViewPanel/types.d.ts +13 -0
  94. package/dist/MsaViewPanel/types.js +2 -0
  95. package/dist/MsaViewPanel/types.js.map +1 -0
  96. package/dist/MsaViewPanel/util.d.ts +7 -0
  97. package/dist/MsaViewPanel/util.js +10 -0
  98. package/dist/MsaViewPanel/util.js.map +1 -1
  99. package/dist/index.d.ts +5 -5
  100. package/dist/index.js +3 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/jbrowse-plugin-msaview.umd.production.min.js +39 -90
  103. package/dist/jbrowse-plugin-msaview.umd.production.min.js.map +4 -4
  104. package/dist/utils/blastCache.d.ts +34 -0
  105. package/dist/utils/blastCache.js +58 -0
  106. package/dist/utils/blastCache.js.map +1 -0
  107. package/dist/utils/fetch.d.ts +1 -1
  108. package/dist/utils/fetch.js +1 -1
  109. package/dist/utils/fetch.js.map +1 -1
  110. package/dist/utils/ncbiBlast.d.ts +1 -5
  111. package/dist/utils/taxonomyNames.d.ts +5 -0
  112. package/dist/utils/taxonomyNames.js +79 -0
  113. package/dist/utils/taxonomyNames.js.map +1 -0
  114. package/dist/utils/types.d.ts +8 -5
  115. package/package.json +50 -54
  116. package/src/AddHighlightModel/GenomeMouseoverHighlight.tsx +37 -21
  117. package/src/AddHighlightModel/MsaToGenomeHighlight.tsx +38 -17
  118. package/src/AddHighlightModel/index.tsx +9 -4
  119. package/src/LaunchMsaView/components/EnsemblGeneTree/EnsemblGeneTree.tsx +13 -13
  120. package/src/LaunchMsaView/components/EnsemblGeneTree/useGeneTree.ts +6 -0
  121. package/src/LaunchMsaView/components/LaunchMsaViewDialog.tsx +30 -23
  122. package/src/LaunchMsaView/components/ManualMSALoader/ManualMSALoader.tsx +64 -51
  123. package/src/LaunchMsaView/components/ManualMSALoader/launchView.ts +9 -6
  124. package/src/LaunchMsaView/components/NCBIBlastQuery/CachedBlastResults.tsx +146 -0
  125. package/src/LaunchMsaView/components/NCBIBlastQuery/NCBIBlastAutomaticPanel.tsx +53 -22
  126. package/src/LaunchMsaView/components/NCBIBlastQuery/NCBIBlastManualPanel.tsx +8 -13
  127. package/src/LaunchMsaView/components/NCBIBlastQuery/blastLaunchView.ts +25 -0
  128. package/src/LaunchMsaView/components/PreLoadedMSA/PreLoadedMSADataPanel.tsx +27 -47
  129. package/src/LaunchMsaView/components/PreLoadedMSA/consts.ts +1 -0
  130. package/src/LaunchMsaView/components/TabPanel.tsx +2 -2
  131. package/src/LaunchMsaView/components/TranscriptSelector.tsx +13 -20
  132. package/src/LaunchMsaView/components/useSWRFeatureSequence.ts +5 -5
  133. package/src/LaunchMsaView/components/useTranscriptSelection.ts +48 -0
  134. package/src/LaunchMsaView/components/util.ts +17 -2
  135. package/src/LaunchMsaView/index.ts +1 -1
  136. package/src/LaunchMsaView/util.ts +25 -6
  137. package/src/LaunchMsaViewExtensionPoint/index.ts +74 -0
  138. package/src/MsaViewPanel/components/ConnectStructureDialog.tsx +156 -0
  139. package/src/MsaViewPanel/components/MsaViewPanel.tsx +6 -1
  140. package/src/MsaViewPanel/doLaunchBlast.ts +83 -23
  141. package/src/MsaViewPanel/genomeToMSA.test.ts +281 -0
  142. package/src/MsaViewPanel/genomeToMSA.ts +43 -10
  143. package/src/MsaViewPanel/model.ts +617 -58
  144. package/src/MsaViewPanel/msaCoordToGenomeCoord.test.ts +256 -0
  145. package/src/MsaViewPanel/msaCoordToGenomeCoord.ts +42 -30
  146. package/src/MsaViewPanel/msaDataStore.ts +236 -0
  147. package/src/MsaViewPanel/pairwiseAlignment.test.ts +140 -0
  148. package/src/MsaViewPanel/pairwiseAlignment.ts +818 -0
  149. package/src/MsaViewPanel/structureConnection.test.ts +143 -0
  150. package/src/MsaViewPanel/structureConnection.ts +72 -0
  151. package/src/MsaViewPanel/types.ts +14 -0
  152. package/src/MsaViewPanel/util.ts +11 -0
  153. package/src/index.ts +3 -1
  154. package/src/utils/blastCache.ts +114 -0
  155. package/src/utils/fetch.ts +1 -1
  156. package/src/utils/taxonomyNames.ts +111 -0
  157. package/src/utils/types.ts +9 -1
  158. package/dist/LaunchMsaView/components/PreLoadedMSA/findValidTranscriptId.d.ts +0 -5
  159. package/dist/LaunchMsaView/components/PreLoadedMSA/findValidTranscriptId.js +0 -16
  160. package/dist/LaunchMsaView/components/PreLoadedMSA/findValidTranscriptId.js.map +0 -1
  161. package/dist/out.js +0 -55367
  162. package/src/LaunchMsaView/components/PreLoadedMSA/findValidTranscriptId.ts +0 -25
@@ -0,0 +1,140 @@
1
+ import { describe, expect, test } from 'vitest'
2
+
3
+ import {
4
+ buildAlignmentMaps,
5
+ needlemanWunsch,
6
+ runPairwiseAlignment,
7
+ } from './pairwiseAlignment'
8
+
9
+ describe('needlemanWunsch', () => {
10
+ test('identical sequences align perfectly', () => {
11
+ const result = needlemanWunsch('MKAA', 'MKAA')
12
+ expect(result.alignedSeq1).toBe('MKAA')
13
+ expect(result.alignedSeq2).toBe('MKAA')
14
+ expect(result.score).toBeGreaterThan(0)
15
+ })
16
+
17
+ test('aligned sequences have same length', () => {
18
+ const result = needlemanWunsch('MKAAYLSMFG', 'MKAYLSMFG')
19
+ expect(result.alignedSeq1.length).toBe(result.alignedSeq2.length)
20
+ })
21
+
22
+ test('aligned sequences preserve original characters', () => {
23
+ const seq1 = 'MKAAYLSMFG'
24
+ const seq2 = 'MKAYLSMFG'
25
+ const result = needlemanWunsch(seq1, seq2)
26
+ expect(result.alignedSeq1.replaceAll('-', '')).toBe(seq1)
27
+ expect(result.alignedSeq2.replaceAll('-', '')).toBe(seq2)
28
+ })
29
+
30
+ test('handles empty sequences', () => {
31
+ const result = needlemanWunsch('', '')
32
+ expect(result.alignedSeq1).toBe('')
33
+ expect(result.alignedSeq2).toBe('')
34
+ })
35
+
36
+ test('handles one empty sequence', () => {
37
+ const result = needlemanWunsch('MKA', '')
38
+ expect(result.alignedSeq1.replaceAll('-', '')).toBe('MKA')
39
+ expect(result.alignedSeq2.replaceAll('-', '')).toBe('')
40
+ expect(result.alignedSeq1.length).toBe(result.alignedSeq2.length)
41
+ })
42
+ })
43
+
44
+ describe('runPairwiseAlignment', () => {
45
+ test('returns PairwiseAlignment format', () => {
46
+ const result = runPairwiseAlignment('MKAA', 'MKAA')
47
+ expect(result.consensus).toBeDefined()
48
+ expect(result.alns).toHaveLength(2)
49
+ expect(result.alns[0].id).toBe('msa')
50
+ expect(result.alns[1].id).toBe('structure')
51
+ })
52
+
53
+ test('consensus marks matches with pipe', () => {
54
+ const result = runPairwiseAlignment('MKAA', 'MKAA')
55
+ expect(result.consensus).toBe('||||')
56
+ })
57
+
58
+ test('consensus marks gaps with space', () => {
59
+ const result = runPairwiseAlignment('MKAA', 'MKA')
60
+ expect(result.consensus).toContain(' ')
61
+ })
62
+
63
+ test('consensus marks mismatches with space', () => {
64
+ const result = runPairwiseAlignment('MKAA', 'MKBA')
65
+ // A vs B should be a space in consensus
66
+ expect(result.consensus).toContain(' ')
67
+ })
68
+ })
69
+
70
+ describe('buildAlignmentMaps', () => {
71
+ test('builds bidirectional maps for identical sequences', () => {
72
+ const alignment = runPairwiseAlignment('MKAA', 'MKAA')
73
+ const { seq1ToSeq2, seq2ToSeq1 } = buildAlignmentMaps(alignment)
74
+
75
+ expect(seq1ToSeq2.get(0)).toBe(0)
76
+ expect(seq1ToSeq2.get(1)).toBe(1)
77
+ expect(seq1ToSeq2.get(2)).toBe(2)
78
+ expect(seq1ToSeq2.get(3)).toBe(3)
79
+
80
+ expect(seq2ToSeq1.get(0)).toBe(0)
81
+ expect(seq2ToSeq1.get(1)).toBe(1)
82
+ expect(seq2ToSeq1.get(2)).toBe(2)
83
+ expect(seq2ToSeq1.get(3)).toBe(3)
84
+ })
85
+
86
+ test('maps are inverses of each other for matched positions', () => {
87
+ const alignment = runPairwiseAlignment('MKAAYLSMFG', 'MKAYLSMFG')
88
+ const { seq1ToSeq2, seq2ToSeq1 } = buildAlignmentMaps(alignment)
89
+
90
+ // For every mapped position, the inverse should return the original
91
+ for (const [pos1, pos2] of seq1ToSeq2) {
92
+ expect(seq2ToSeq1.get(pos2)).toBe(pos1)
93
+ }
94
+ })
95
+
96
+ test('handles gaps correctly - positions without counterpart are not in map', () => {
97
+ // Aligning 'MKAAA' with 'MKA' should result in gaps
98
+ const alignment = runPairwiseAlignment('MKAAA', 'MKA')
99
+ const { seq1ToSeq2 } = buildAlignmentMaps(alignment)
100
+
101
+ // seq1 has 5 positions, seq2 has 3
102
+ // Only matched positions should be in the map
103
+ expect(seq1ToSeq2.size).toBeLessThanOrEqual(3)
104
+ })
105
+
106
+ test('handles real protein sequence alignment', () => {
107
+ const msaSeq = 'MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG'
108
+ const structureSeq = 'MKAAYLSMFGKEDHKPFGDDEVELFRAVPGLKLKIAG'
109
+
110
+ const alignment = runPairwiseAlignment(msaSeq, structureSeq)
111
+ const { seq1ToSeq2, seq2ToSeq1 } = buildAlignmentMaps(alignment)
112
+
113
+ // Identical sequences should have 1:1 mapping
114
+ expect(seq1ToSeq2.size).toBe(msaSeq.length)
115
+ expect(seq2ToSeq1.size).toBe(structureSeq.length)
116
+
117
+ // Check a few positions
118
+ expect(seq1ToSeq2.get(0)).toBe(0)
119
+ expect(seq1ToSeq2.get(10)).toBe(10)
120
+ expect(seq2ToSeq1.get(20)).toBe(20)
121
+ })
122
+
123
+ test('handles sequences with insertions/deletions', () => {
124
+ // MSA sequence has an extra 'X' in the middle
125
+ const msaSeq = 'MKAXYLSMFG'
126
+ const structureSeq = 'MKAYLSMFG'
127
+
128
+ const alignment = runPairwiseAlignment(msaSeq, structureSeq)
129
+ const { seq1ToSeq2 } = buildAlignmentMaps(alignment)
130
+
131
+ // Positions before the insertion should map correctly
132
+ expect(seq1ToSeq2.get(0)).toBe(0) // M
133
+ expect(seq1ToSeq2.get(1)).toBe(1) // K
134
+ expect(seq1ToSeq2.get(2)).toBe(2) // A
135
+
136
+ // The mapping should handle the offset after insertion
137
+ // (exact behavior depends on alignment algorithm)
138
+ expect(seq1ToSeq2.size).toBeLessThanOrEqual(structureSeq.length)
139
+ })
140
+ })