react-msaview 3.1.7 → 3.1.8
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 +32 -32
- package/dist/components/Checkbox2.d.ts +7 -0
- package/dist/components/Checkbox2.js +10 -0
- package/dist/components/Checkbox2.js.map +1 -0
- package/dist/components/Loading.js +12 -4
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAView.js +5 -8
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/SequenceTextArea.d.ts +4 -0
- package/dist/components/SequenceTextArea.js +38 -0
- package/dist/components/SequenceTextArea.js.map +1 -0
- package/dist/components/Track.js +9 -8
- package/dist/components/Track.js.map +1 -1
- package/dist/components/dialogs/AddTrackDialog.js +0 -1
- package/dist/components/dialogs/AddTrackDialog.js.map +1 -1
- package/dist/components/{ExportSVGDialog.d.ts → dialogs/ExportSVGDialog.d.ts} +1 -1
- package/dist/components/{ExportSVGDialog.js → dialogs/ExportSVGDialog.js} +3 -4
- package/dist/components/dialogs/ExportSVGDialog.js.map +1 -0
- package/dist/components/dialogs/FeatureDialog.d.ts +7 -0
- package/dist/components/dialogs/FeatureDialog.js +52 -0
- package/dist/components/dialogs/FeatureDialog.js.map +1 -0
- package/dist/components/dialogs/InterProScanDialog.d.ts +7 -0
- package/dist/components/dialogs/InterProScanDialog.js +163 -0
- package/dist/components/dialogs/InterProScanDialog.js.map +1 -0
- package/dist/components/dialogs/MetadataDialog.js +6 -3
- package/dist/components/dialogs/MetadataDialog.js.map +1 -1
- package/dist/components/dialogs/SettingsDialog.js +6 -11
- package/dist/components/dialogs/SettingsDialog.js.map +1 -1
- package/dist/components/{Header.d.ts → header/Header.d.ts} +1 -1
- package/dist/components/header/Header.js +30 -0
- package/dist/components/header/Header.js.map +1 -0
- package/dist/components/{HeaderInfoArea.d.ts → header/HeaderInfoArea.d.ts} +2 -2
- package/dist/components/header/HeaderInfoArea.js +20 -0
- package/dist/components/header/HeaderInfoArea.js.map +1 -0
- package/dist/components/header/HeaderMenu.d.ts +6 -0
- package/dist/components/header/HeaderMenu.js +40 -0
- package/dist/components/header/HeaderMenu.js.map +1 -0
- package/dist/components/header/HeaderMenuExtra.d.ts +6 -0
- package/dist/components/header/HeaderMenuExtra.js +92 -0
- package/dist/components/header/HeaderMenuExtra.js.map +1 -0
- package/dist/components/header/HeaderStatusArea.d.ts +6 -0
- package/dist/components/header/HeaderStatusArea.js +20 -0
- package/dist/components/header/HeaderStatusArea.js.map +1 -0
- package/dist/components/{MultiAlignmentSelector.d.ts → header/MultiAlignmentSelector.d.ts} +1 -1
- package/dist/components/header/MultiAlignmentSelector.js.map +1 -0
- package/dist/components/{ZoomControls.d.ts → header/ZoomControls.d.ts} +1 -1
- package/dist/components/header/ZoomControls.js +15 -0
- package/dist/components/header/ZoomControls.js.map +1 -0
- package/dist/components/{ImportForm/index.js → import/ImportForm.js} +1 -1
- package/dist/components/import/ImportForm.js.map +1 -0
- package/dist/components/{ImportForm → import}/ImportFormExamples.js +6 -2
- package/dist/components/import/ImportFormExamples.js.map +1 -0
- package/dist/components/import/data/seq2.js.map +1 -0
- package/dist/components/import/util.js +10 -0
- package/dist/components/import/util.js.map +1 -0
- package/dist/components/{Minimap.d.ts → minimap/Minimap.d.ts} +1 -1
- package/dist/components/minimap/Minimap.js.map +1 -0
- package/dist/components/{MinimapSVG.d.ts → minimap/MinimapSVG.d.ts} +1 -1
- package/dist/components/minimap/MinimapSVG.js.map +1 -0
- package/dist/components/msa/Loading.js.map +1 -0
- package/dist/components/{MSAPanel → msa}/MSACanvas.js +3 -2
- package/dist/components/msa/MSACanvas.js.map +1 -0
- package/dist/components/{MSAPanel/MSABlock.js → msa/MSACanvasBlock.js} +21 -9
- package/dist/components/msa/MSACanvasBlock.js.map +1 -0
- package/dist/components/msa/MSAMouseoverCanvas.js.map +1 -0
- package/dist/components/msa/MSAPanel.d.ts +6 -0
- package/dist/components/{MSAPanel/index.js → msa/MSAPanel.js} +6 -3
- package/dist/components/msa/MSAPanel.js.map +1 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +9 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +44 -0
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -0
- package/dist/components/{MSAPanel → msa}/renderMSABlock.js +24 -20
- package/dist/components/msa/renderMSABlock.js.map +1 -0
- package/dist/components/msa/renderMSAMouseover.js.map +1 -0
- package/dist/components/tree/TreeBranchMenu.js.map +1 -0
- package/dist/components/{TreePanel → tree}/TreeCanvas.js +1 -1
- package/dist/components/tree/TreeCanvas.js.map +1 -0
- package/dist/components/{TreePanel → tree}/TreeCanvasBlock.js +1 -1
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -0
- package/dist/components/{TreePanel → tree}/TreeNodeMenu.js +2 -33
- package/dist/components/tree/TreeNodeMenu.js.map +1 -0
- package/dist/components/{TreePanel/index.js → tree/TreePanel.js} +2 -2
- package/dist/components/tree/TreePanel.js.map +1 -0
- package/dist/components/tree/TreeRuler.js.map +1 -0
- package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.js +6 -2
- package/dist/components/tree/dialogs/TreeNodeInfoDialog.js.map +1 -0
- package/dist/components/{TreePanel → tree}/renderTreeCanvas.js +23 -37
- package/dist/components/tree/renderTreeCanvas.js.map +1 -0
- package/dist/fetchUtils.d.ts +5 -0
- package/dist/fetchUtils.js +23 -0
- package/dist/fetchUtils.js.map +1 -0
- package/dist/ggplotPalettes.d.ts +3 -0
- package/dist/ggplotPalettes.js +24 -0
- package/dist/ggplotPalettes.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/launchInterProScan.d.ts +32 -0
- package/dist/launchInterProScan.js +47 -0
- package/dist/launchInterProScan.js.map +1 -0
- package/dist/model/DataModel.js.map +1 -0
- package/dist/model/DialogQueue.js.map +1 -0
- package/dist/model/msaModel.d.ts +14 -0
- package/dist/model/msaModel.js +36 -0
- package/dist/model/msaModel.js.map +1 -0
- package/dist/model/treeModel.d.ts +46 -0
- package/dist/model/treeModel.js +105 -0
- package/dist/model/treeModel.js.map +1 -0
- package/dist/model.d.ts +261 -273
- package/dist/model.js +1043 -1029
- package/dist/model.js.map +1 -1
- package/dist/parseGFF.d.ts +10 -0
- package/dist/parseGFF.js +29 -0
- package/dist/parseGFF.js.map +1 -0
- package/dist/renderToSvg.js +23 -9
- package/dist/renderToSvg.js.map +1 -1
- package/dist/reparseTree.d.ts +2 -0
- package/dist/reparseTree.js +13 -0
- package/dist/reparseTree.js.map +1 -0
- package/dist/util.d.ts +4 -10
- package/dist/util.js +3 -28
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +12 -2
- package/src/components/Checkbox2.tsx +34 -0
- package/src/components/Loading.tsx +27 -11
- package/src/components/MSAView.tsx +6 -10
- package/src/components/SequenceTextArea.tsx +63 -0
- package/src/components/Track.tsx +8 -13
- package/src/components/dialogs/AddTrackDialog.tsx +0 -1
- package/src/components/{ExportSVGDialog.tsx → dialogs/ExportSVGDialog.tsx} +9 -16
- package/src/components/dialogs/FeatureDialog.tsx +109 -0
- package/src/components/dialogs/InterProScanDialog.tsx +230 -0
- package/src/components/dialogs/MetadataDialog.tsx +9 -2
- package/src/components/dialogs/SettingsDialog.tsx +10 -30
- package/src/components/header/Header.tsx +44 -0
- package/src/components/header/HeaderInfoArea.tsx +27 -0
- package/src/components/header/HeaderMenu.tsx +54 -0
- package/src/components/header/HeaderMenuExtra.tsx +108 -0
- package/src/components/header/HeaderStatusArea.tsx +31 -0
- package/src/components/{MultiAlignmentSelector.tsx → header/MultiAlignmentSelector.tsx} +1 -1
- package/src/components/header/ZoomControls.tsx +28 -0
- package/src/components/{ImportForm → import}/ImportFormExamples.tsx +12 -1
- package/src/components/{ImportForm → import}/util.ts +5 -10
- package/src/components/{Minimap.tsx → minimap/Minimap.tsx} +1 -1
- package/src/components/{MinimapSVG.tsx → minimap/MinimapSVG.tsx} +1 -1
- package/src/components/{MSAPanel → msa}/MSACanvas.tsx +3 -2
- package/src/components/{MSAPanel/MSABlock.tsx → msa/MSACanvasBlock.tsx} +25 -12
- package/src/components/{MSAPanel/index.tsx → msa/MSAPanel.tsx} +8 -2
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +88 -0
- package/src/components/{MSAPanel → msa}/renderMSABlock.ts +26 -20
- package/src/components/{TreePanel → tree}/TreeCanvas.tsx +1 -1
- package/src/components/{TreePanel → tree}/TreeCanvasBlock.tsx +1 -1
- package/src/components/{TreePanel → tree}/TreeNodeMenu.tsx +1 -53
- package/src/components/{TreePanel/index.tsx → tree/TreePanel.tsx} +1 -1
- package/src/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.tsx +9 -2
- package/src/components/{TreePanel → tree}/renderTreeCanvas.ts +25 -41
- package/src/fetchUtils.ts +30 -0
- package/src/ggplotPalettes.ts +25 -0
- package/src/index.ts +1 -1
- package/src/launchInterProScan.ts +98 -0
- package/src/model/msaModel.ts +39 -0
- package/src/model/treeModel.ts +116 -0
- package/src/model.ts +1124 -1126
- package/src/parseGFF.ts +32 -0
- package/src/renderToSvg.tsx +27 -8
- package/src/reparseTree.ts +16 -0
- package/src/util.ts +4 -33
- package/src/version.ts +1 -1
- package/dist/DataModel.js.map +0 -1
- package/dist/DialogQueue.js.map +0 -1
- package/dist/SelectedStructuresMixin.d.ts +0 -46
- package/dist/SelectedStructuresMixin.js +0 -52
- package/dist/SelectedStructuresMixin.js.map +0 -1
- package/dist/StructureModel.d.ts +0 -9
- package/dist/StructureModel.js +0 -11
- package/dist/StructureModel.js.map +0 -1
- package/dist/UniprotTrack.d.ts +0 -27
- package/dist/UniprotTrack.js +0 -53
- package/dist/UniprotTrack.js.map +0 -1
- package/dist/components/BoxTrack.d.ts +0 -7
- package/dist/components/BoxTrack.js +0 -15
- package/dist/components/BoxTrack.js.map +0 -1
- package/dist/components/BoxTrackBlock.d.ts +0 -8
- package/dist/components/BoxTrackBlock.js +0 -136
- package/dist/components/BoxTrackBlock.js.map +0 -1
- package/dist/components/ExportSVGDialog.js.map +0 -1
- package/dist/components/Header.js +0 -62
- package/dist/components/Header.js.map +0 -1
- package/dist/components/HeaderInfoArea.js +0 -12
- package/dist/components/HeaderInfoArea.js.map +0 -1
- package/dist/components/ImportForm/ImportFormExamples.js.map +0 -1
- package/dist/components/ImportForm/data/seq2.js.map +0 -1
- package/dist/components/ImportForm/index.js.map +0 -1
- package/dist/components/ImportForm/util.js +0 -16
- package/dist/components/ImportForm/util.js.map +0 -1
- package/dist/components/MSAPanel/Loading.js.map +0 -1
- package/dist/components/MSAPanel/MSABlock.js.map +0 -1
- package/dist/components/MSAPanel/MSACanvas.js.map +0 -1
- package/dist/components/MSAPanel/MSAMouseoverCanvas.js.map +0 -1
- package/dist/components/MSAPanel/index.d.ts +0 -5
- package/dist/components/MSAPanel/index.js.map +0 -1
- package/dist/components/MSAPanel/renderMSABlock.js.map +0 -1
- package/dist/components/MSAPanel/renderMSAMouseover.js.map +0 -1
- package/dist/components/Minimap.js.map +0 -1
- package/dist/components/MinimapSVG.js.map +0 -1
- package/dist/components/MultiAlignmentSelector.js.map +0 -1
- package/dist/components/TreePanel/TreeBranchMenu.js.map +0 -1
- package/dist/components/TreePanel/TreeCanvas.js.map +0 -1
- package/dist/components/TreePanel/TreeCanvasBlock.js.map +0 -1
- package/dist/components/TreePanel/TreeNodeMenu.js.map +0 -1
- package/dist/components/TreePanel/TreeRuler.js.map +0 -1
- package/dist/components/TreePanel/dialogs/TreeNodeInfoDialog.js.map +0 -1
- package/dist/components/TreePanel/index.js.map +0 -1
- package/dist/components/TreePanel/renderTreeCanvas.js.map +0 -1
- package/dist/components/VerticalGuide.d.ts +0 -7
- package/dist/components/VerticalGuide.js +0 -30
- package/dist/components/VerticalGuide.js.map +0 -1
- package/dist/components/ZoomControls.js +0 -59
- package/dist/components/ZoomControls.js.map +0 -1
- package/src/SelectedStructuresMixin.ts +0 -59
- package/src/StructureModel.ts +0 -11
- package/src/UniprotTrack.ts +0 -59
- package/src/components/BoxTrack.tsx +0 -33
- package/src/components/BoxTrackBlock.tsx +0 -200
- package/src/components/Header.tsx +0 -99
- package/src/components/HeaderInfoArea.tsx +0 -21
- package/src/components/VerticalGuide.tsx +0 -50
- package/src/components/ZoomControls.tsx +0 -86
- package/dist/components/{MultiAlignmentSelector.js → header/MultiAlignmentSelector.js} +0 -0
- package/dist/components/{ImportForm/index.d.ts → import/ImportForm.d.ts} +0 -0
- package/dist/components/{ImportForm → import}/ImportFormExamples.d.ts +0 -0
- package/dist/components/{ImportForm → import}/data/seq2.d.ts +0 -0
- package/dist/components/{ImportForm → import}/data/seq2.js +0 -0
- package/dist/components/{ImportForm → import}/util.d.ts +0 -0
- package/dist/components/{Minimap.js → minimap/Minimap.js} +0 -0
- package/dist/components/{MinimapSVG.js → minimap/MinimapSVG.js} +0 -0
- package/dist/components/{MSAPanel → msa}/Loading.d.ts +0 -0
- package/dist/components/{MSAPanel → msa}/Loading.js +0 -0
- package/dist/components/{MSAPanel → msa}/MSACanvas.d.ts +0 -0
- package/dist/components/{MSAPanel/MSABlock.d.ts → msa/MSACanvasBlock.d.ts} +0 -0
- package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.d.ts +0 -0
- package/dist/components/{MSAPanel → msa}/MSAMouseoverCanvas.js +0 -0
- package/dist/components/{MSAPanel → msa}/renderMSABlock.d.ts +1 -1
- /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.d.ts +0 -0
- /package/dist/components/{MSAPanel → msa}/renderMSAMouseover.js +0 -0
- /package/dist/components/{TreePanel → tree}/TreeBranchMenu.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeBranchMenu.js +0 -0
- /package/dist/components/{TreePanel → tree}/TreeCanvas.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeCanvasBlock.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeNodeMenu.d.ts +0 -0
- /package/dist/components/{TreePanel/index.d.ts → tree/TreePanel.d.ts} +0 -0
- /package/dist/components/{TreePanel → tree}/TreeRuler.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/TreeRuler.js +0 -0
- /package/dist/components/{TreePanel → tree}/dialogs/TreeNodeInfoDialog.d.ts +0 -0
- /package/dist/components/{TreePanel → tree}/renderTreeCanvas.d.ts +0 -0
- /package/dist/{DataModel.d.ts → model/DataModel.d.ts} +0 -0
- /package/dist/{DataModel.js → model/DataModel.js} +0 -0
- /package/dist/{DialogQueue.d.ts → model/DialogQueue.d.ts} +0 -0
- /package/dist/{DialogQueue.js → model/DialogQueue.js} +0 -0
- /package/src/components/{ImportForm/index.tsx → import/ImportForm.tsx} +0 -0
- /package/src/components/{ImportForm → import}/data/seq2.ts +0 -0
- /package/src/components/{MSAPanel → msa}/Loading.tsx +0 -0
- /package/src/components/{MSAPanel → msa}/MSAMouseoverCanvas.tsx +0 -0
- /package/src/components/{MSAPanel → msa}/renderMSAMouseover.ts +0 -0
- /package/src/components/{TreePanel → tree}/TreeBranchMenu.tsx +0 -0
- /package/src/components/{TreePanel → tree}/TreeRuler.tsx +0 -0
- /package/src/{DataModel.ts → model/DataModel.ts} +0 -0
- /package/src/{DialogQueue.ts → model/DialogQueue.ts} +0 -0
|
@@ -5,6 +5,7 @@ import { Theme } from '@mui/material'
|
|
|
5
5
|
import { MsaViewModel } from '../../model'
|
|
6
6
|
|
|
7
7
|
export const padding = 600
|
|
8
|
+
|
|
8
9
|
const extendBounds = 5
|
|
9
10
|
const radius = 2.5
|
|
10
11
|
const d = radius * 2
|
|
@@ -35,18 +36,20 @@ export function renderTree({
|
|
|
35
36
|
const { hierarchy, showBranchLen, blockSize } = model
|
|
36
37
|
const by = blockSizeYOverride || blockSize
|
|
37
38
|
ctx.strokeStyle = theme.palette.text.primary
|
|
38
|
-
for (const
|
|
39
|
-
const
|
|
39
|
+
for (const link of hierarchy.links()) {
|
|
40
|
+
const { source, target } = link
|
|
41
|
+
const sy = source.x!
|
|
42
|
+
const ty = target.x!
|
|
40
43
|
// @ts-expect-error
|
|
41
|
-
const
|
|
44
|
+
const tx = showBranchLen ? target.len : target.y
|
|
42
45
|
// @ts-expect-error
|
|
43
|
-
const
|
|
46
|
+
const sx = showBranchLen ? source.len : source.y
|
|
44
47
|
|
|
45
48
|
const y1 = Math.min(sy, ty)
|
|
46
49
|
const y2 = Math.max(sy, ty)
|
|
47
|
-
// 1d line intersection to check if line crosses block at all, this is
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
+
// 1d line intersection to check if line crosses block at all, this is an
|
|
51
|
+
// optimization that allows us to skip drawing most tree links outside the
|
|
52
|
+
// block
|
|
50
53
|
if (offsetY + by >= y1 && y2 >= offsetY) {
|
|
51
54
|
ctx.beginPath()
|
|
52
55
|
ctx.moveTo(sx, sy)
|
|
@@ -81,13 +84,9 @@ export function renderNodeBubbles({
|
|
|
81
84
|
const by = blockSizeYOverride || blockSize
|
|
82
85
|
for (const node of hierarchy.descendants()) {
|
|
83
86
|
const val = showBranchLen ? 'len' : 'y'
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
// @ts-expect-error
|
|
88
|
-
[val]: x,
|
|
89
|
-
data,
|
|
90
|
-
} = node
|
|
87
|
+
// @ts-expect-error
|
|
88
|
+
const { [val]: x, data } = node
|
|
89
|
+
const y = node.x!
|
|
91
90
|
const { branchset, id = '', name = '' } = data
|
|
92
91
|
if (
|
|
93
92
|
!id.endsWith('-leafnode') &&
|
|
@@ -131,17 +130,16 @@ export function renderTreeLabels({
|
|
|
131
130
|
blockSizeYOverride?: number
|
|
132
131
|
}) {
|
|
133
132
|
const {
|
|
134
|
-
|
|
133
|
+
fontSize,
|
|
135
134
|
showBranchLen,
|
|
136
135
|
treeMetadata,
|
|
137
136
|
hierarchy,
|
|
138
137
|
blockSize,
|
|
139
138
|
labelsAlignRight,
|
|
140
139
|
drawTree,
|
|
141
|
-
structures,
|
|
142
140
|
treeAreaWidth,
|
|
143
141
|
treeAreaWidthMinusMargin,
|
|
144
|
-
marginLeft
|
|
142
|
+
marginLeft,
|
|
145
143
|
noTree,
|
|
146
144
|
} = model
|
|
147
145
|
const by = blockSizeYOverride || blockSize
|
|
@@ -153,39 +151,24 @@ export function renderTreeLabels({
|
|
|
153
151
|
}
|
|
154
152
|
for (const node of hierarchy.leaves()) {
|
|
155
153
|
const {
|
|
156
|
-
// @ts-expect-error
|
|
157
|
-
x: y,
|
|
158
|
-
// @ts-expect-error
|
|
159
|
-
y: x,
|
|
160
154
|
data: { name, id },
|
|
161
155
|
// @ts-expect-error
|
|
162
156
|
len,
|
|
163
157
|
} = node
|
|
158
|
+
const y = node.x!
|
|
159
|
+
const x = node.y!
|
|
164
160
|
|
|
165
161
|
const displayName = treeMetadata[name]?.genome || name
|
|
166
|
-
|
|
167
162
|
if (y > offsetY - extendBounds && y < offsetY + by + extendBounds) {
|
|
168
163
|
// note: +rowHeight/4 matches with -rowHeight/4 in msa
|
|
169
|
-
const yp = y +
|
|
170
|
-
const xp = showBranchLen ? len : x
|
|
164
|
+
const yp = y + fontSize / 4
|
|
165
|
+
const xp = (showBranchLen ? len : x) || 0
|
|
171
166
|
|
|
172
167
|
const { width } = ctx.measureText(displayName)
|
|
173
168
|
const height = ctx.measureText('M').width // use an 'em' for height
|
|
174
169
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
if (!drawTree && !labelsAlignRight) {
|
|
179
|
-
ctx.fillText(displayName, 0, yp)
|
|
180
|
-
clickMap?.insert({
|
|
181
|
-
minX: 0 + ml,
|
|
182
|
-
maxX: width + ml,
|
|
183
|
-
minY: yp - height,
|
|
184
|
-
maxY: yp,
|
|
185
|
-
name,
|
|
186
|
-
id,
|
|
187
|
-
})
|
|
188
|
-
} else if (labelsAlignRight) {
|
|
170
|
+
ctx.fillStyle = theme.palette.text.primary
|
|
171
|
+
if (labelsAlignRight) {
|
|
189
172
|
const smallPadding = 2
|
|
190
173
|
const offset = treeAreaWidthMinusMargin - smallPadding
|
|
191
174
|
if (drawTree && !noTree) {
|
|
@@ -206,8 +189,8 @@ export function renderTreeLabels({
|
|
|
206
189
|
} else {
|
|
207
190
|
ctx.fillText(displayName, xp + d, yp)
|
|
208
191
|
clickMap?.insert({
|
|
209
|
-
minX: xp + d +
|
|
210
|
-
maxX: xp + d + width +
|
|
192
|
+
minX: xp + d + marginLeft,
|
|
193
|
+
maxX: xp + d + width + marginLeft,
|
|
211
194
|
minY: yp - height,
|
|
212
195
|
maxY: yp,
|
|
213
196
|
name,
|
|
@@ -240,6 +223,7 @@ export function renderTreeCanvas({
|
|
|
240
223
|
const {
|
|
241
224
|
noTree,
|
|
242
225
|
drawTree,
|
|
226
|
+
drawLabels,
|
|
243
227
|
drawNodeBubbles,
|
|
244
228
|
treeWidth,
|
|
245
229
|
highResScaleFactor,
|
|
@@ -288,7 +272,7 @@ export function renderTreeCanvas({
|
|
|
288
272
|
}
|
|
289
273
|
}
|
|
290
274
|
|
|
291
|
-
if (rowHeight >= 5) {
|
|
275
|
+
if (rowHeight >= 5 && drawLabels) {
|
|
292
276
|
renderTreeLabels({
|
|
293
277
|
ctx,
|
|
294
278
|
offsetY,
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export async function myfetch(url: string, args?: RequestInit) {
|
|
2
|
+
const response = await fetch(url, args)
|
|
3
|
+
|
|
4
|
+
if (!response.ok) {
|
|
5
|
+
throw new Error(
|
|
6
|
+
`HTTP ${response.status} fetching ${url} ${await response.text()}`,
|
|
7
|
+
)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return response
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export async function textfetch(url: string, args?: RequestInit) {
|
|
14
|
+
const response = await myfetch(url, args)
|
|
15
|
+
return response.text()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function jsonfetch(url: string, args?: RequestInit) {
|
|
19
|
+
const response = await myfetch(url, args)
|
|
20
|
+
return response.json()
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function arraybufferfetch(url: string) {
|
|
24
|
+
const res = await myfetch(url)
|
|
25
|
+
return res.arrayBuffer()
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function timeout(time: number) {
|
|
29
|
+
return new Promise(res => setTimeout(res, time))
|
|
30
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
const palettes = [
|
|
2
|
+
['#F8766D'],
|
|
3
|
+
['#F8766D', '#00BFC4'],
|
|
4
|
+
['#F8766D', '#00BA38', '#619CFF'],
|
|
5
|
+
['#F8766D', '#7CAE00', '#00BFC4', '#C77CFF'],
|
|
6
|
+
['#F8766D', '#A3A500', '#00BF7D', '#00B0F6', '#E76BF3'],
|
|
7
|
+
['#F8766D', '#B79F00', '#00BA38', '#00BFC4', '#619CFF', '#F564E3'],
|
|
8
|
+
['#F8766D', '#C49A00', '#53B400', '#00C094', '#00B6EB', '#A58AFF', '#FB61D7'],
|
|
9
|
+
[
|
|
10
|
+
'#F8766D',
|
|
11
|
+
'#CD9600',
|
|
12
|
+
'#7CAE00',
|
|
13
|
+
'#00BE67',
|
|
14
|
+
'#00BFC4',
|
|
15
|
+
'#00A9FF',
|
|
16
|
+
'#C77CFF',
|
|
17
|
+
'#FF61CC',
|
|
18
|
+
],
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
export function getPalette(l: number) {
|
|
22
|
+
return palettes[Math.min(l, palettes.length - 1)]
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default palettes
|
package/src/index.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { default as MSAView } from './components/Loading'
|
|
2
|
-
export { default as
|
|
2
|
+
export { default as MSAModelF, type MsaViewModel } from './model'
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { jsonfetch, textfetch, timeout } from './fetchUtils'
|
|
2
|
+
|
|
3
|
+
const base = `https://www.ebi.ac.uk/Tools/services/rest`
|
|
4
|
+
|
|
5
|
+
export interface InterProScanResults {
|
|
6
|
+
matches: {
|
|
7
|
+
signature: {
|
|
8
|
+
entry?: {
|
|
9
|
+
name: string
|
|
10
|
+
description: string
|
|
11
|
+
accession: string
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
locations: { start: number; end: number }[]
|
|
15
|
+
}[]
|
|
16
|
+
xref: { id: string }[]
|
|
17
|
+
}
|
|
18
|
+
export interface InterProScanResponse {
|
|
19
|
+
results: InterProScanResults[]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function runInterProScan({
|
|
23
|
+
seq,
|
|
24
|
+
onProgress,
|
|
25
|
+
onJobId,
|
|
26
|
+
programs,
|
|
27
|
+
}: {
|
|
28
|
+
seq: string
|
|
29
|
+
programs: string[]
|
|
30
|
+
onProgress: (arg?: { msg: string; url?: string }) => void
|
|
31
|
+
onJobId: (arg: string) => void
|
|
32
|
+
}) {
|
|
33
|
+
const jobId = await textfetch(`${base}/iprscan5/run`, {
|
|
34
|
+
method: 'POST',
|
|
35
|
+
body: new URLSearchParams({
|
|
36
|
+
email: 'colin.diesh@gmail.com',
|
|
37
|
+
sequence: `${seq}`,
|
|
38
|
+
programs: programs.join(','),
|
|
39
|
+
}),
|
|
40
|
+
})
|
|
41
|
+
onJobId(jobId)
|
|
42
|
+
await wait({
|
|
43
|
+
jobId,
|
|
44
|
+
onProgress,
|
|
45
|
+
})
|
|
46
|
+
return loadInterProScanResults(jobId)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export async function loadInterProScanResults(jobId: string) {
|
|
50
|
+
return (await jsonfetch(
|
|
51
|
+
`${base}/iprscan5/result/${jobId}/json`,
|
|
52
|
+
)) as InterProScanResponse
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function wait({
|
|
56
|
+
onProgress,
|
|
57
|
+
jobId,
|
|
58
|
+
}: {
|
|
59
|
+
jobId: string
|
|
60
|
+
onProgress: (arg?: { msg: string; url?: string }) => void
|
|
61
|
+
}) {
|
|
62
|
+
const url = `${base}/iprscan5/status/${jobId}`
|
|
63
|
+
// eslint-disable-next-line no-constant-condition
|
|
64
|
+
while (true) {
|
|
65
|
+
for (let i = 0; i < 10; i++) {
|
|
66
|
+
await timeout(1000)
|
|
67
|
+
onProgress({ msg: `Checking status... ${10 - i}`, url })
|
|
68
|
+
}
|
|
69
|
+
const result = await textfetch(url)
|
|
70
|
+
|
|
71
|
+
if (result === 'FINISHED') {
|
|
72
|
+
break
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function launchInterProScan({
|
|
78
|
+
algorithm,
|
|
79
|
+
seq,
|
|
80
|
+
programs,
|
|
81
|
+
onJobId,
|
|
82
|
+
onProgress,
|
|
83
|
+
}: {
|
|
84
|
+
algorithm: string
|
|
85
|
+
seq: string
|
|
86
|
+
programs: string[]
|
|
87
|
+
onProgress: (arg?: { msg: string; url?: string }) => void
|
|
88
|
+
onJobId: (arg: string) => void
|
|
89
|
+
}) {
|
|
90
|
+
onProgress({ msg: `Launching ${algorithm} MSA...` })
|
|
91
|
+
if (algorithm === 'interproscan') {
|
|
92
|
+
const result = await runInterProScan({ seq, onJobId, onProgress, programs })
|
|
93
|
+
onProgress()
|
|
94
|
+
return result
|
|
95
|
+
} else {
|
|
96
|
+
throw new Error('unknown algorithm')
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { types } from 'mobx-state-tree'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* #stateModel MSAModel
|
|
5
|
+
*/
|
|
6
|
+
function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
7
|
+
|
|
8
|
+
export function MSAModelF() {
|
|
9
|
+
return types
|
|
10
|
+
.model({
|
|
11
|
+
/**
|
|
12
|
+
* #property
|
|
13
|
+
* draw MSA tiles with a background color
|
|
14
|
+
*/
|
|
15
|
+
bgColor: true,
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* #property
|
|
19
|
+
* default color scheme name
|
|
20
|
+
*/
|
|
21
|
+
colorSchemeName: 'maeditor',
|
|
22
|
+
})
|
|
23
|
+
.actions(self => ({
|
|
24
|
+
/**
|
|
25
|
+
* #action
|
|
26
|
+
* set color scheme name
|
|
27
|
+
*/
|
|
28
|
+
setColorSchemeName(name: string) {
|
|
29
|
+
self.colorSchemeName = name
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* #action
|
|
34
|
+
*/
|
|
35
|
+
setBgColor(arg: boolean) {
|
|
36
|
+
self.bgColor = arg
|
|
37
|
+
},
|
|
38
|
+
}))
|
|
39
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { types } from 'mobx-state-tree'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* #stateModel Tree
|
|
5
|
+
*/
|
|
6
|
+
function x() {} // eslint-disable-line @typescript-eslint/no-unused-vars
|
|
7
|
+
|
|
8
|
+
export function TreeF() {
|
|
9
|
+
return types
|
|
10
|
+
.model({
|
|
11
|
+
/**
|
|
12
|
+
* #property
|
|
13
|
+
*/
|
|
14
|
+
drawLabels: true,
|
|
15
|
+
/**
|
|
16
|
+
* #property
|
|
17
|
+
* right-align the labels
|
|
18
|
+
*/
|
|
19
|
+
labelsAlignRight: false,
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* #property
|
|
23
|
+
* width of the area the tree is drawn in, px
|
|
24
|
+
*/
|
|
25
|
+
treeAreaWidth: types.optional(types.number, 400),
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* #property
|
|
29
|
+
* width of the tree within the treeArea, px
|
|
30
|
+
*/
|
|
31
|
+
treeWidth: types.optional(types.number, 300),
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* #getter
|
|
35
|
+
* synchronization that matches treeWidth to treeAreaWidth
|
|
36
|
+
*/
|
|
37
|
+
treeWidthMatchesArea: true,
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* #property
|
|
41
|
+
* use "branch length" e.g. evolutionary distance to draw tree branch
|
|
42
|
+
* lengths. if false, the layout is a "cladogram" that does not take into
|
|
43
|
+
* account evolutionary distances
|
|
44
|
+
*/
|
|
45
|
+
showBranchLen: true,
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* #property
|
|
49
|
+
* draw tree, boolean
|
|
50
|
+
*/
|
|
51
|
+
drawTree: true,
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* #property
|
|
55
|
+
* draw clickable node bubbles on the tree
|
|
56
|
+
*/
|
|
57
|
+
drawNodeBubbles: true,
|
|
58
|
+
})
|
|
59
|
+
.actions(self => ({
|
|
60
|
+
/**
|
|
61
|
+
* #action
|
|
62
|
+
* synchronize the treewidth and treeareawidth
|
|
63
|
+
*/
|
|
64
|
+
setTreeWidthMatchesArea(arg: boolean) {
|
|
65
|
+
self.treeWidthMatchesArea = arg
|
|
66
|
+
},
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* #action
|
|
70
|
+
* set tree area width (px)
|
|
71
|
+
*/
|
|
72
|
+
setTreeAreaWidth(n: number) {
|
|
73
|
+
self.treeAreaWidth = n
|
|
74
|
+
},
|
|
75
|
+
/**
|
|
76
|
+
* #action
|
|
77
|
+
* set tree width (px)
|
|
78
|
+
*/
|
|
79
|
+
setTreeWidth(n: number) {
|
|
80
|
+
self.treeWidth = n
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* #action
|
|
85
|
+
*/
|
|
86
|
+
setLabelsAlignRight(arg: boolean) {
|
|
87
|
+
self.labelsAlignRight = arg
|
|
88
|
+
},
|
|
89
|
+
/**
|
|
90
|
+
* #action
|
|
91
|
+
*/
|
|
92
|
+
setDrawTree(arg: boolean) {
|
|
93
|
+
self.drawTree = arg
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* #action
|
|
98
|
+
*/
|
|
99
|
+
setShowBranchLen(arg: boolean) {
|
|
100
|
+
self.showBranchLen = arg
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* #action
|
|
105
|
+
*/
|
|
106
|
+
setDrawNodeBubbles(arg: boolean) {
|
|
107
|
+
self.drawNodeBubbles = arg
|
|
108
|
+
},
|
|
109
|
+
/**
|
|
110
|
+
* #action
|
|
111
|
+
*/
|
|
112
|
+
setDrawLabels(arg: boolean) {
|
|
113
|
+
self.drawLabels = arg
|
|
114
|
+
},
|
|
115
|
+
}))
|
|
116
|
+
}
|