react-msaview 6.4.2 → 7.0.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 (212) hide show
  1. package/README.md +6 -5
  2. package/bundle/index.js +100 -101
  3. package/bundle/index.js.map +4 -4
  4. package/dist/components/Loading.js +2 -2
  5. package/dist/components/Loading.js.map +1 -1
  6. package/dist/components/MSAViewer.d.ts +10 -2
  7. package/dist/components/MSAViewer.js +90 -2
  8. package/dist/components/MSAViewer.js.map +1 -1
  9. package/dist/components/ResizeHandles.d.ts +3 -3
  10. package/dist/components/ResizeHandles.js +28 -21
  11. package/dist/components/ResizeHandles.js.map +1 -1
  12. package/dist/components/dialogs/{InterProScanDialog.d.ts → AnnotationFileDialog.d.ts} +2 -2
  13. package/dist/components/dialogs/AnnotationFileDialog.js +92 -0
  14. package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -0
  15. package/dist/components/dialogs/FeatureDialog.js +13 -9
  16. package/dist/components/dialogs/FeatureDialog.js.map +1 -1
  17. package/dist/components/header/Header.js +4 -0
  18. package/dist/components/header/Header.js.map +1 -1
  19. package/dist/components/header/HeaderStatusArea.js +0 -2
  20. package/dist/components/header/HeaderStatusArea.js.map +1 -1
  21. package/dist/components/header/LoadWarnings.d.ts +6 -0
  22. package/dist/components/header/LoadWarnings.js +36 -0
  23. package/dist/components/header/LoadWarnings.js.map +1 -0
  24. package/dist/components/header/MultiAlignmentSelector.js +0 -0
  25. package/dist/components/header/MultiAlignmentSelector.js.map +1 -1
  26. package/dist/components/header/TreeSettingsMenu.js +9 -1
  27. package/dist/components/header/TreeSettingsMenu.js.map +1 -1
  28. package/dist/components/header/UnshareableDataWarning.d.ts +6 -0
  29. package/dist/components/header/UnshareableDataWarning.js +42 -0
  30. package/dist/components/header/UnshareableDataWarning.js.map +1 -0
  31. package/dist/components/header/getAnnotationsMenu.js +14 -14
  32. package/dist/components/header/getAnnotationsMenu.js.map +1 -1
  33. package/dist/components/import/ImportForm.js +1 -1
  34. package/dist/components/import/ImportForm.js.map +1 -1
  35. package/dist/components/import/ImportFormExamples.js +2 -6
  36. package/dist/components/import/ImportFormExamples.js.map +1 -1
  37. package/dist/components/import/util.js +3 -0
  38. package/dist/components/import/util.js.map +1 -1
  39. package/dist/components/msa/MSACanvasBlock.js +4 -5
  40. package/dist/components/msa/MSACanvasBlock.js.map +1 -1
  41. package/dist/components/msa/msaRaster.d.ts +13 -3
  42. package/dist/components/msa/msaRaster.js +173 -61
  43. package/dist/components/msa/msaRaster.js.map +1 -1
  44. package/dist/components/msa/renderHighlights.d.ts +39 -1
  45. package/dist/components/msa/renderHighlights.js +71 -6
  46. package/dist/components/msa/renderHighlights.js.map +1 -1
  47. package/dist/components/msa/renderMSABlock.d.ts +1 -2
  48. package/dist/components/msa/renderMSABlock.js +24 -28
  49. package/dist/components/msa/renderMSABlock.js.map +1 -1
  50. package/dist/components/msa/renderMSAMouseover.js +9 -30
  51. package/dist/components/msa/renderMSAMouseover.js.map +1 -1
  52. package/dist/components/renderCtx.d.ts +1 -1
  53. package/dist/components/tracks/TrackBlocks.js +10 -11
  54. package/dist/components/tracks/TrackBlocks.js.map +1 -1
  55. package/dist/components/tracks/drawTracks.d.ts +26 -8
  56. package/dist/components/tracks/drawTracks.js +123 -13
  57. package/dist/components/tracks/drawTracks.js.map +1 -1
  58. package/dist/components/tree/TreeCanvas.js +2 -3
  59. package/dist/components/tree/TreeCanvas.js.map +1 -1
  60. package/dist/components/tree/TreeCanvasBlock.js +4 -2
  61. package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
  62. package/dist/components/tree/TreeRuler.js +13 -3
  63. package/dist/components/tree/TreeRuler.js.map +1 -1
  64. package/dist/components/tree/renderTreeCanvas.d.ts +0 -1
  65. package/dist/components/tree/renderTreeCanvas.js +70 -30
  66. package/dist/components/tree/renderTreeCanvas.js.map +1 -1
  67. package/dist/components/tree/scaleBar.d.ts +10 -0
  68. package/dist/components/tree/scaleBar.js +24 -0
  69. package/dist/components/tree/scaleBar.js.map +1 -0
  70. package/dist/constants.d.ts +3 -1
  71. package/dist/constants.js +18 -1
  72. package/dist/constants.js.map +1 -1
  73. package/dist/fetchUtils.d.ts +7 -7
  74. package/dist/fetchUtils.js +4 -32
  75. package/dist/fetchUtils.js.map +1 -1
  76. package/dist/hierarchy.d.ts +2 -1
  77. package/dist/hierarchy.js +16 -10
  78. package/dist/hierarchy.js.map +1 -1
  79. package/dist/index.d.ts +2 -1
  80. package/dist/index.js +8 -2
  81. package/dist/index.js.map +1 -1
  82. package/dist/model/DataModel.js +5 -2
  83. package/dist/model/DataModel.js.map +1 -1
  84. package/dist/model.d.ts +454 -177
  85. package/dist/model.js +1180 -511
  86. package/dist/model.js.map +1 -1
  87. package/dist/renderToStaticMarkup.d.ts +11 -0
  88. package/dist/renderToStaticMarkup.js +30 -7
  89. package/dist/renderToStaticMarkup.js.map +1 -1
  90. package/dist/renderToSvg.js +25 -19
  91. package/dist/renderToSvg.js.map +1 -1
  92. package/dist/rowCoordinateCalculations.d.ts +25 -25
  93. package/dist/rowCoordinateCalculations.js +12 -36
  94. package/dist/rowCoordinateCalculations.js.map +1 -1
  95. package/dist/seqPosToGlobalCol.js +3 -1
  96. package/dist/seqPosToGlobalCol.js.map +1 -1
  97. package/dist/svgTestUtil.d.ts +144 -82
  98. package/dist/types.d.ts +97 -3
  99. package/dist/util.d.ts +11 -4
  100. package/dist/util.js +30 -10
  101. package/dist/util.js.map +1 -1
  102. package/dist/version.d.ts +1 -1
  103. package/dist/version.js +1 -1
  104. package/dist/wuss.d.ts +14 -0
  105. package/dist/wuss.js +55 -0
  106. package/dist/wuss.js.map +1 -0
  107. package/package.json +10 -8
  108. package/src/components/Loading.tsx +12 -2
  109. package/src/components/MSAViewer.tsx +106 -2
  110. package/src/components/ResizeHandles.tsx +31 -31
  111. package/src/components/dialogs/AnnotationFileDialog.tsx +162 -0
  112. package/src/components/dialogs/FeatureDialog.tsx +13 -9
  113. package/src/components/header/Header.tsx +4 -0
  114. package/src/components/header/HeaderStatusArea.tsx +0 -5
  115. package/src/components/header/LoadWarnings.tsx +49 -0
  116. package/src/components/header/MultiAlignmentSelector.tsx +0 -0
  117. package/src/components/header/TreeSettingsMenu.tsx +9 -1
  118. package/src/components/header/UnshareableDataWarning.tsx +58 -0
  119. package/src/components/header/getAnnotationsMenu.ts +16 -17
  120. package/src/components/import/ImportForm.tsx +2 -2
  121. package/src/components/import/ImportFormExamples.tsx +2 -6
  122. package/src/components/import/util.ts +3 -0
  123. package/src/components/msa/MSACanvasBlock.tsx +4 -5
  124. package/src/components/msa/msaRaster.ts +216 -59
  125. package/src/components/msa/renderHighlights.ts +103 -5
  126. package/src/components/msa/renderMSABlock.ts +25 -36
  127. package/src/components/msa/renderMSAMouseover.ts +9 -39
  128. package/src/components/renderCtx.ts +1 -0
  129. package/src/components/tracks/TrackBlocks.tsx +10 -13
  130. package/src/components/tracks/drawTracks.ts +165 -17
  131. package/src/components/tree/TreeCanvas.tsx +2 -3
  132. package/src/components/tree/TreeCanvasBlock.tsx +4 -2
  133. package/src/components/tree/TreeRuler.tsx +38 -3
  134. package/src/components/tree/renderTreeCanvas.ts +79 -35
  135. package/src/components/tree/scaleBar.ts +23 -0
  136. package/src/constants.ts +20 -1
  137. package/src/fetchUtils.ts +7 -40
  138. package/src/hierarchy.ts +20 -11
  139. package/src/index.ts +18 -2
  140. package/src/model/DataModel.ts +6 -2
  141. package/src/model.ts +1352 -616
  142. package/src/rawImports.d.ts +9 -0
  143. package/src/renderToStaticMarkup.ts +34 -7
  144. package/src/renderToSvg.tsx +33 -27
  145. package/src/rowCoordinateCalculations.ts +15 -59
  146. package/src/seqPosToGlobalCol.ts +3 -1
  147. package/src/types.ts +131 -4
  148. package/src/util.ts +31 -14
  149. package/src/version.ts +1 -1
  150. package/src/wuss.ts +62 -0
  151. package/dist/components/dialogs/InterProScanDialog.js +0 -137
  152. package/dist/components/dialogs/InterProScanDialog.js.map +0 -1
  153. package/dist/components/dialogs/InterProScanFileDialog.d.ts +0 -7
  154. package/dist/components/dialogs/InterProScanFileDialog.js +0 -64
  155. package/dist/components/dialogs/InterProScanFileDialog.js.map +0 -1
  156. package/dist/launchInterProScan.d.ts +0 -13
  157. package/dist/launchInterProScan.js +0 -110
  158. package/dist/launchInterProScan.js.map +0 -1
  159. package/dist/useColorContrast.d.ts +0 -10
  160. package/dist/useColorContrast.js +0 -13
  161. package/dist/useColorContrast.js.map +0 -1
  162. package/src/clustalX.test.ts +0 -74
  163. package/src/colSpace.test.ts +0 -67
  164. package/src/collapseLogic.test.ts +0 -115
  165. package/src/colorSchemes.docs.test.ts +0 -57
  166. package/src/columnCounts.test.ts +0 -73
  167. package/src/columnStats.test.ts +0 -94
  168. package/src/columnTracks.test.ts +0 -97
  169. package/src/components/dialogs/InterProScanDialog.tsx +0 -214
  170. package/src/components/dialogs/InterProScanFileDialog.tsx +0 -138
  171. package/src/components/minimap/minimapLayout.test.ts +0 -71
  172. package/src/components/msa/msaRaster.test.ts +0 -145
  173. package/src/components/msa/renderBoxFeatureCanvasBlock.test.ts +0 -51
  174. package/src/components/tree/renderTreeCanvas.test.ts +0 -296
  175. package/src/dataInitialized.test.ts +0 -42
  176. package/src/domainBands.test.ts +0 -122
  177. package/src/domainLetterColor.test.ts +0 -80
  178. package/src/exportFileName.test.ts +0 -40
  179. package/src/fetchUtils.test.ts +0 -83
  180. package/src/flatToTree.test.ts +0 -51
  181. package/src/hierarchy.test.ts +0 -228
  182. package/src/highlights.test.ts +0 -70
  183. package/src/impgRender.test.tsx +0 -68
  184. package/src/largeTree.test.ts +0 -67
  185. package/src/launchInterProScan.ts +0 -167
  186. package/src/loadErrorDisplay.test.tsx +0 -102
  187. package/src/modelFilehandleLoaders.test.ts +0 -137
  188. package/src/modelReset.test.ts +0 -120
  189. package/src/neighborJoining.test.ts +0 -164
  190. package/src/parseAsn1.test.ts +0 -36
  191. package/src/propertyConservation.test.ts +0 -36
  192. package/src/renderColumnTracksSvg.test.tsx +0 -108
  193. package/src/renderDomainsSvg.test.tsx +0 -118
  194. package/src/renderHighlightsSvg.test.tsx +0 -85
  195. package/src/renderMinimapSvg.test.tsx +0 -62
  196. package/src/renderRasterSvg.test.tsx +0 -144
  197. package/src/renderSequenceLogoSvg.test.tsx +0 -165
  198. package/src/renderToSvg.test.tsx +0 -65
  199. package/src/reset.test.ts +0 -61
  200. package/src/rowCoordinateCalculations.test.ts +0 -211
  201. package/src/rowSpace.test.ts +0 -46
  202. package/src/segmentOverlay.test.ts +0 -70
  203. package/src/seqPosToGlobalCol.test.ts +0 -59
  204. package/src/sequenceLogo.test.ts +0 -88
  205. package/src/setFontSize.test.ts +0 -33
  206. package/src/stripDefault.test.ts +0 -48
  207. package/src/stripDefaultSnapshot.test.ts +0 -87
  208. package/src/treeMetadata.test.ts +0 -39
  209. package/src/useCanvasAutorun.test.tsx +0 -98
  210. package/src/useColorContrast.ts +0 -18
  211. package/src/viewChrome.test.tsx +0 -134
  212. package/src/wheelZoom.test.ts +0 -46
@@ -1,137 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { Dialog } from '@jbrowse/core/ui';
3
- import { getSession } from '@jbrowse/core/util';
4
- import { Button, DialogActions, DialogContent, Typography } from '@mui/material';
5
- import { observer } from 'mobx-react';
6
- import { getUngappedSequence } from 'msa-parsers';
7
- import { launchInterProScan } from '../../launchInterProScan.js';
8
- const FAMILIES = 'Families, domains, sites & repeats';
9
- const FEATURES = 'Other sequence features';
10
- const STRUCTURAL = 'Structural domains';
11
- const OTHER = 'Other category';
12
- // The analyses the EBI iprscan5 endpoint accepts, all on by default. Static, so
13
- // it lives out here rather than being rebuilt on every render of the dialog.
14
- const interProScanPrograms = [
15
- {
16
- name: 'NCBIfam',
17
- category: FAMILIES,
18
- description: 'NCBI RefSeq FAMs including TIGRFAMs',
19
- },
20
- {
21
- name: 'SFLD',
22
- category: FAMILIES,
23
- description: 'Structure function linkage database',
24
- },
25
- {
26
- name: 'Phobius',
27
- category: FEATURES,
28
- description: 'A combined transmembrane topology and signal peptide predictor',
29
- },
30
- { name: 'SignalP', category: FEATURES },
31
- { name: 'SignalP_EUK', category: OTHER },
32
- { name: 'SignalP_GRAM_POSITIVE', category: OTHER },
33
- { name: 'SignalP_GRAM_NEGATIVE', category: OTHER },
34
- { name: 'SuperFamily', category: STRUCTURAL },
35
- { name: 'Panther', category: FAMILIES },
36
- { name: 'Gene3d', category: STRUCTURAL },
37
- { name: 'HAMAP', category: FAMILIES },
38
- { name: 'PrositeProfiles', category: FAMILIES },
39
- { name: 'PrositePatterns', category: FAMILIES },
40
- { name: 'Coils', category: FEATURES },
41
- { name: 'SMART', category: FAMILIES },
42
- {
43
- name: 'CDD',
44
- category: FAMILIES,
45
- description: 'Conserved Domains Database',
46
- },
47
- { name: 'PRINTS', category: FAMILIES },
48
- { name: 'PfamA', category: FAMILIES },
49
- { name: 'MobiDBLite', category: FEATURES },
50
- { name: 'PIRSF', category: OTHER },
51
- { name: 'TMHMM', category: FEATURES },
52
- { name: 'AntiFam', category: OTHER },
53
- { name: 'FunFam', category: OTHER },
54
- { name: 'PIRSR', category: FAMILIES },
55
- ].map(program => ({ ...program, checked: true }));
56
- const InterProScanDialog = observer(function ({ handleClose, model, }) {
57
- const [vals, setVals] = useState(interProScanPrograms);
58
- const programs = vals.filter(e => e.checked).map(e => e.name);
59
- const [show, setShow] = useState(false);
60
- return (React.createElement(Dialog, { maxWidth: "xl", title: "Query InterProScan API for domains", onClose: () => {
61
- handleClose();
62
- }, open: true },
63
- React.createElement(DialogContent, null,
64
- React.createElement(Typography, null, "This will run InterProScan via the InterProScan API on all rows of the current MSA"),
65
- React.createElement(Button, { onClick: () => {
66
- setShow(!show);
67
- } },
68
- show ? 'Hide' : 'Show',
69
- " advanced options"),
70
- show ? (React.createElement("div", null,
71
- React.createElement(Typography, null, "Select algorithms for InterProScan to run"),
72
- React.createElement("div", null,
73
- React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
74
- setVals(vals.map(v => ({ ...v, checked: false })));
75
- } }, "Select none"),
76
- React.createElement(Button, { variant: "contained", color: "primary", onClick: () => {
77
- setVals(vals.map(v => ({ ...v, checked: true })));
78
- } }, "Select all")),
79
- React.createElement("table", null,
80
- React.createElement("tbody", null, vals
81
- .toSorted((a, b) => a.category.localeCompare(b.category))
82
- .map(({ name, checked, category, description }) => (React.createElement("tr", { key: name },
83
- React.createElement("td", null,
84
- React.createElement("input", { type: "checkbox", checked: checked, onChange: () => {
85
- setVals(vals.map(e => e.name === name
86
- ? { ...e, checked: !e.checked }
87
- : e));
88
- } })),
89
- React.createElement("td", { title: description }, name),
90
- React.createElement("td", null, category)))))))) : null),
91
- React.createElement(DialogActions, null,
92
- React.createElement(Button, { variant: "contained", color: "secondary", onClick: () => {
93
- handleClose();
94
- } }, "Cancel"),
95
- React.createElement(Button, { variant: "contained", color: "primary", onClick: () => {
96
- const controller = new AbortController();
97
- (async () => {
98
- try {
99
- const { rows } = model;
100
- if (rows.length > 140) {
101
- throw new Error('Too many sequences, please run InterProScan offline');
102
- }
103
- await launchInterProScan({
104
- algorithm: 'interproscan',
105
- programs: programs,
106
- seq: rows
107
- .map(row => [row[0], getUngappedSequence(row[1])])
108
- .filter(f => !!f[1])
109
- .map(row => `>${row[0]}\n${row[1]}`)
110
- .join('\n'),
111
- onProgress: arg => {
112
- model.setStatus(arg
113
- ? {
114
- ...arg,
115
- onCancel: () => {
116
- controller.abort();
117
- },
118
- }
119
- : undefined);
120
- },
121
- model,
122
- signal: controller.signal,
123
- });
124
- }
125
- catch (e) {
126
- console.error(e);
127
- getSession(model).notifyError(`${e}`, e);
128
- }
129
- finally {
130
- model.setStatus();
131
- }
132
- })();
133
- handleClose();
134
- } }, "Send sequences to InterProScan"))));
135
- });
136
- export default InterProScanDialog;
137
- //# sourceMappingURL=InterProScanDialog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InterProScanDialog.js","sourceRoot":"","sources":["../../../src/components/dialogs/InterProScanDialog.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import React from 'react';
2
- import type { MsaViewModel } from '../../model.ts';
3
- declare const InterProScanFileDialog: ({ handleClose, model, }: {
4
- handleClose: () => void;
5
- model: MsaViewModel;
6
- }) => React.JSX.Element;
7
- export default InterProScanFileDialog;
@@ -1,64 +0,0 @@
1
- import React, { useState } from 'react';
2
- import { Dialog } from '@jbrowse/core/ui';
3
- import { getSession } from '@jbrowse/core/util';
4
- import { Button, DialogActions, DialogContent, FormControl, FormControlLabel, Radio, RadioGroup, TextField, Typography, } from '@mui/material';
5
- import { observer } from 'mobx-react';
6
- import { interProScanResponseToAnnotations } from 'msa-parsers';
7
- import { jsonfetch } from '../../fetchUtils.js';
8
- const InterProScanFileDialog = observer(function ({ handleClose, model, }) {
9
- const [file, setFile] = useState();
10
- const [choice, setChoice] = useState('file');
11
- const [interProURL, setInterProURL] = useState('');
12
- return (React.createElement(Dialog, { maxWidth: "xl", title: "Open InterProScan results", onClose: () => {
13
- handleClose();
14
- }, open: true },
15
- React.createElement(DialogContent, null,
16
- React.createElement("div", null,
17
- React.createElement(Typography, null, "Open a JSON file of InterProScan results that you run remotely on EBI servers or locally"),
18
- React.createElement("div", { style: { display: 'flex', margin: 30 } },
19
- React.createElement(FormControl, { component: "fieldset" },
20
- React.createElement(RadioGroup, { value: choice, onChange: event => {
21
- setChoice(event.target.value);
22
- } },
23
- React.createElement(FormControlLabel, { value: "url", control: React.createElement(Radio, null), label: "URL" }),
24
- React.createElement(FormControlLabel, { value: "file", control: React.createElement(Radio, null), label: "File" }))),
25
- choice === 'url' ? (React.createElement("div", null,
26
- React.createElement(Typography, null, "Open a InterProScan JSON file remote URL"),
27
- React.createElement(TextField, { label: "URL", value: interProURL, onChange: event => {
28
- setInterProURL(event.target.value);
29
- } }))) : null,
30
- choice === 'file' ? (React.createElement("div", { style: { paddingTop: 20 } },
31
- React.createElement(Typography, null, "Open a InterProScan JSON file file from your local drive"),
32
- React.createElement(Button, { variant: "outlined", component: "label" },
33
- "Choose File",
34
- React.createElement("input", { type: "file", hidden: true, onChange: ({ target }) => {
35
- const file = target.files?.[0];
36
- if (file) {
37
- setFile(file);
38
- }
39
- } })))) : null))),
40
- React.createElement(DialogActions, null,
41
- React.createElement(Button, { variant: "contained", color: "primary", onClick: () => {
42
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
43
- ;
44
- (async () => {
45
- try {
46
- const ret = file
47
- ? JSON.parse(await file.text())
48
- : await jsonfetch(interProURL);
49
- model.setAnnotations(interProScanResponseToAnnotations(ret));
50
- getSession(model).notify('Loaded interproscan results', 'success');
51
- }
52
- catch (e) {
53
- console.error(e);
54
- getSession(model).notifyError(`${e}`, e);
55
- }
56
- finally {
57
- model.setStatus();
58
- }
59
- })();
60
- handleClose();
61
- } }, "Open results"))));
62
- });
63
- export default InterProScanFileDialog;
64
- //# sourceMappingURL=InterProScanFileDialog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"InterProScanFileDialog.js","sourceRoot":"","sources":["../../../src/components/dialogs/InterProScanFileDialog.tsx"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- import type { MsaViewModel } from './model.ts';
2
- export declare function launchInterProScan({ algorithm, seq, programs, onJobId, onProgress, model, signal, }: {
3
- algorithm: string;
4
- seq: string;
5
- programs: string[];
6
- onProgress: (arg?: {
7
- msg: string;
8
- url?: string;
9
- }) => void;
10
- onJobId?: (arg: string) => void;
11
- model: MsaViewModel;
12
- signal?: AbortSignal;
13
- }): Promise<void>;
@@ -1,110 +0,0 @@
1
- import { getSession } from '@jbrowse/core/util';
2
- import { interProScanResponseToAnnotations } from 'msa-parsers';
3
- import { isAbortError, jsonfetch, textfetch, timeout } from './fetchUtils.js';
4
- const base = 'https://www.ebi.ac.uk/Tools/services/rest';
5
- async function runInterProScan({ seq, onProgress, onJobId, programs, model, signal, }) {
6
- const jobId = await textfetch(`${base}/iprscan5/run`, {
7
- method: 'POST',
8
- body: new URLSearchParams({
9
- email: 'colin.diesh@gmail.com',
10
- sequence: seq,
11
- programs: programs.join(','),
12
- }),
13
- signal,
14
- });
15
- onJobId?.(jobId);
16
- await wait({
17
- jobId,
18
- onProgress,
19
- signal,
20
- });
21
- await loadInterProScanResultsWithStatus({ jobId, model, onProgress, signal });
22
- }
23
- function loadInterProScanResults(jobId, signal) {
24
- return jsonfetch(`${base}/iprscan5/result/${jobId}/json`, { signal });
25
- }
26
- async function wait({ onProgress, jobId, signal, }) {
27
- const url = `${base}/iprscan5/status/${jobId}`;
28
- // EBI jobs run for minutes; cap polling so an unexpected/stuck status can't
29
- // spin forever (the abort signal is the normal early exit). ~10s per check.
30
- const maxChecks = 360;
31
- try {
32
- let finished = false;
33
- for (let check = 0; check < maxChecks && !finished; check++) {
34
- for (let i = 0; i < 10; i++) {
35
- await timeout(1000, signal);
36
- onProgress({ msg: `Checking status ${10 - i}`, url });
37
- }
38
- // status endpoint returns a bare status token; match exactly rather than
39
- // substring so an error page mentioning "FINISHED" can't be a false hit
40
- const status = (await textfetch(url, { signal })).trim();
41
- if (status === 'FINISHED') {
42
- finished = true;
43
- }
44
- else if (status === 'FAILURE' ||
45
- status === 'ERROR' ||
46
- status === 'NOT_FOUND') {
47
- throw new Error(`InterProScan job ${jobId} ended with status: ${status}`);
48
- }
49
- }
50
- if (!finished) {
51
- throw new Error(`InterProScan job ${jobId} did not finish after ${maxChecks} status checks`);
52
- }
53
- }
54
- finally {
55
- onProgress();
56
- }
57
- }
58
- export async function launchInterProScan({ algorithm, seq, programs, onJobId, onProgress, model, signal, }) {
59
- try {
60
- onProgress({ msg: `Launching ${algorithm} MSA` });
61
- if (algorithm === 'interproscan') {
62
- await runInterProScan({
63
- seq,
64
- onJobId,
65
- onProgress,
66
- programs,
67
- model,
68
- signal,
69
- });
70
- }
71
- else {
72
- throw new Error('unknown algorithm');
73
- }
74
- }
75
- catch (e) {
76
- if (isAbortError(e)) {
77
- getSession(model).notify('Cancelled InterProScan query', 'info');
78
- }
79
- else {
80
- throw e;
81
- }
82
- }
83
- finally {
84
- onProgress();
85
- }
86
- }
87
- async function loadInterProScanResultsWithStatus({ jobId, model, onProgress, signal, }) {
88
- try {
89
- onProgress({
90
- msg: `Downloading results of ${jobId} (for larger sequences this can be slow, click status to download and upload in the manual tab)`,
91
- url: `https://www.ebi.ac.uk/Tools/services/rest/iprscan5/result/${jobId}/json`,
92
- });
93
- const ret = await loadInterProScanResults(jobId, signal);
94
- model.setAnnotations(interProScanResponseToAnnotations(ret));
95
- getSession(model).notify(`Loaded interproscan ${jobId} results`, 'success');
96
- }
97
- catch (e) {
98
- if (isAbortError(e)) {
99
- getSession(model).notify('Cancelled InterProScan query', 'info');
100
- }
101
- else {
102
- console.error(e);
103
- getSession(model).notifyError(`${e}`, e);
104
- }
105
- }
106
- finally {
107
- onProgress();
108
- }
109
- }
110
- //# sourceMappingURL=launchInterProScan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"launchInterProScan.js","sourceRoot":"","sources":["../src/launchInterProScan.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Resolves the current theme and a memoized contrast-color scheme for a given
3
- * color scheme. Shared by the MSA and text-track canvas blocks.
4
- */
5
- export declare function useColorContrast(colorScheme: Record<string, string>): {
6
- theme: import("@mui/material").Theme;
7
- contrastScheme: {
8
- [k: string]: string;
9
- };
10
- };
@@ -1,13 +0,0 @@
1
- import { useMemo } from 'react';
2
- import { useTheme } from '@mui/material';
3
- import { colorContrast } from './util.js';
4
- /**
5
- * Resolves the current theme and a memoized contrast-color scheme for a given
6
- * color scheme. Shared by the MSA and text-track canvas blocks.
7
- */
8
- export function useColorContrast(colorScheme) {
9
- const theme = useTheme();
10
- const contrastScheme = useMemo(() => colorContrast(colorScheme, theme), [colorScheme, theme]);
11
- return { theme, contrastScheme };
12
- }
13
- //# sourceMappingURL=useColorContrast.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useColorContrast.js","sourceRoot":"","sources":["../src/useColorContrast.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAEzC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmC;IAClE,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,cAAc,GAAG,OAAO,CAC5B,GAAG,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,EACvC,CAAC,WAAW,EAAE,KAAK,CAAC,CACrB,CAAA;IACD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,CAAA;AAClC,CAAC"}
@@ -1,74 +0,0 @@
1
- import { describe, expect, test } from 'vitest'
2
-
3
- import { clustalXColumnColors } from './clustalX.ts'
4
- import { columnCountsFromColumns } from './columnCounts.ts'
5
-
6
- // one alignment column, given top-to-bottom
7
- function column(letters: string) {
8
- return clustalXColumnColors(columnCountsFromColumns([letters]), 0)
9
- }
10
-
11
- const BLUE = 'rgb(128,179,230)'
12
- const RED = '#d88'
13
- const GREEN = '#8f8'
14
- const GREEN_ST = 'rgb(26,204,26)'
15
- const ORANGE = 'rgb(240, 144, 72)'
16
- const YELLOW = 'rgb(204, 204, 0)'
17
- const CYAN = 'rgb(26, 179, 179)'
18
-
19
- describe('clustalXColumnColors', () => {
20
- test('hydrophobic column (all L) colors the hydrophobic group', () => {
21
- expect(column('LLLLLLLLLL')).toEqual({
22
- W: BLUE,
23
- L: BLUE,
24
- V: BLUE,
25
- A: BLUE,
26
- I: BLUE,
27
- M: BLUE,
28
- F: BLUE,
29
- C: BLUE,
30
- S: GREEN_ST,
31
- T: GREEN_ST,
32
- H: CYAN,
33
- Y: CYAN,
34
- })
35
- })
36
-
37
- test('glycine is always colored when present', () => {
38
- expect(column('GGGGGGGGGG')).toEqual({
39
- G: ORANGE,
40
- })
41
- })
42
-
43
- test('proline is always colored, and counts as hydrophobic', () => {
44
- expect(column('PPPPPPPPPP')).toEqual({
45
- W: BLUE,
46
- L: BLUE,
47
- V: BLUE,
48
- A: BLUE,
49
- I: BLUE,
50
- M: BLUE,
51
- F: BLUE,
52
- C: BLUE,
53
- S: GREEN_ST,
54
- T: GREEN_ST,
55
- P: YELLOW,
56
- H: CYAN,
57
- Y: CYAN,
58
- })
59
- })
60
-
61
- test('positively charged column (all K)', () => {
62
- expect(column('KKKKKKKKKK')).toEqual({
63
- K: RED,
64
- R: RED,
65
- E: 'rgb(192, 72, 192)',
66
- D: 'rgb(204, 77, 204)',
67
- Q: GREEN,
68
- })
69
- })
70
-
71
- test('unconserved column produces no colors', () => {
72
- expect(column('XXXXXXXXXX')).toEqual({})
73
- })
74
- })
@@ -1,67 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { expect, test } from 'vitest'
3
-
4
- import MSAModelF from './model.ts'
5
-
6
- // a ragged alignment: row `a` stops early, so the alignment is as wide as `b`.
7
- // Column space has to follow the widest row -- the gap analysis already does --
8
- // or every column past the first row's end becomes unreachable: unscrollable,
9
- // unhoverable, and missing from the minimap.
10
- const msa = `>a
11
- ACGT
12
- >b
13
- ACGTACGTAC`
14
-
15
- function makeModel() {
16
- const model = MSAModelF().create({
17
- id: 'col-space-test',
18
- type: 'MsaView',
19
- msaFormat: 'fasta',
20
- data: { msa },
21
- })
22
- model.setWidth(800)
23
- return model
24
- }
25
-
26
- test('column space spans the widest row', () => {
27
- const model = makeModel()
28
- expect(model.numColumns).toBe(10)
29
- expect(model.totalWidth).toBe(10 * model.colWidth)
30
- })
31
-
32
- test('the last column agrees with the column statistics', () => {
33
- const model = makeModel()
34
- expect(model.colStats.numColumns).toBe(model.numColumns)
35
- expect(model.conservation).toHaveLength(model.numColumns)
36
-
37
- model.setMousePos(model.numColumns - 1, 1)
38
- expect(model.mouseOverColumnStats?.col).toBe(9)
39
- expect(model.visibleColToRowLetter('b', 9)).toBe('C')
40
- })
41
-
42
- // enough rows to force the vertical scrollbar, which eats into the width the
43
- // alignment canvas actually gets
44
- function makeTallModel() {
45
- const names = Array.from({ length: 60 }, (_, i) => `seq${i}`)
46
- const model = MSAModelF().create({
47
- id: 'col-fit-test',
48
- type: 'MsaView',
49
- msaFormat: 'fasta',
50
- height: 300,
51
- data: { msa: names.map(n => `>${n}\n${'ACGT'.repeat(50)}`).join('\n') },
52
- })
53
- model.setWidth(800)
54
- return model
55
- }
56
-
57
- test('fit horizontally leaves every column on screen', () => {
58
- const model = makeTallModel()
59
- expect(model.showVerticalScrollbar).toBe(true)
60
-
61
- model.fitHorizontally()
62
- // the canvas is the msa area minus the scrollbar; fitting to the msa area
63
- // alone pushed the last columns past the right edge, with no minimap to
64
- // show that anything was cut off
65
- expect(model.totalWidth).toBeLessThanOrEqual(model.msaCanvasWidth)
66
- expect(model.showHorizontalScrollbar).toBe(false)
67
- })
@@ -1,115 +0,0 @@
1
- import { describe, expect, test } from 'vitest'
2
-
3
- import { collapse, find, hierarchy, leaves, sort, sum } from './hierarchy.ts'
4
-
5
- import type { NodeWithIds } from './types.ts'
6
-
7
- function buildRoot(tree: NodeWithIds, collapsed: string[], showOnly?: string) {
8
- let hier = hierarchy(tree, d => d.children)
9
- sum(hier, d => (d.children.length > 0 ? 0 : 1))
10
- sort(hier, (a, b) => (a.data.length ?? 1) - (b.data.length ?? 1))
11
-
12
- if (showOnly) {
13
- const res = find(hier, n => n.data.id === showOnly)
14
- if (res) {
15
- hier = res
16
- }
17
- }
18
-
19
- for (const collapsedId of collapsed) {
20
- const node = find(hier, n => n.data.id === collapsedId)
21
- if (!node) {
22
- continue
23
- }
24
- if (node.children) {
25
- collapse(node)
26
- } else if (node.parent?.children) {
27
- node.parent.children = node.parent.children.filter(
28
- c => c.data.id !== collapsedId,
29
- )
30
- }
31
- }
32
-
33
- return hier
34
- }
35
-
36
- function simpleTree(): NodeWithIds {
37
- return {
38
- id: 'root',
39
- name: 'root',
40
- children: [
41
- {
42
- id: 'clade1',
43
- name: 'clade1',
44
- children: [
45
- { id: 'seq1', name: 'seq1', children: [] },
46
- { id: 'seq2', name: 'seq2', children: [] },
47
- ],
48
- },
49
- {
50
- id: 'clade2',
51
- name: 'clade2',
52
- children: [
53
- { id: 'seq3', name: 'seq3', children: [] },
54
- { id: 'seq4', name: 'seq4', children: [] },
55
- ],
56
- },
57
- ],
58
- }
59
- }
60
-
61
- describe('collapse logic (mirrors model.root getter)', () => {
62
- test('no collapsed nodes returns all leaves', () => {
63
- const root = buildRoot(simpleTree(), [])
64
- expect(leaves(root).map(n => n.data.name)).toEqual([
65
- 'seq1',
66
- 'seq2',
67
- 'seq3',
68
- 'seq4',
69
- ])
70
- })
71
-
72
- test('collapsing a branch hides its children', () => {
73
- const root = buildRoot(simpleTree(), ['clade1'])
74
- const l = leaves(root).map(n => n.data.name)
75
- expect(l).toEqual(['clade1', 'seq3', 'seq4'])
76
- })
77
-
78
- test('collapsing a leaf node removes it', () => {
79
- const root = buildRoot(simpleTree(), ['seq2'])
80
- const l = leaves(root).map(n => n.data.name)
81
- expect(l).toEqual(['seq1', 'seq3', 'seq4'])
82
- })
83
-
84
- test('collapsing multiple leaves', () => {
85
- const root = buildRoot(simpleTree(), ['seq1', 'seq4'])
86
- const l = leaves(root).map(n => n.data.name)
87
- expect(l).toEqual(['seq2', 'seq3'])
88
- })
89
-
90
- test('collapsing a branch and a leaf in another branch', () => {
91
- const root = buildRoot(simpleTree(), ['clade1', 'seq3'])
92
- const l = leaves(root).map(n => n.data.name)
93
- expect(l).toEqual(['clade1', 'seq4'])
94
- })
95
-
96
- test('collapsing nonexistent id is a no-op', () => {
97
- const root = buildRoot(simpleTree(), ['doesnotexist'])
98
- expect(leaves(root).map(n => n.data.name)).toEqual([
99
- 'seq1',
100
- 'seq2',
101
- 'seq3',
102
- 'seq4',
103
- ])
104
- })
105
-
106
- test('showOnly focuses on a subtree', () => {
107
- const root = buildRoot(simpleTree(), [], 'clade2')
108
- expect(leaves(root).map(n => n.data.name)).toEqual(['seq3', 'seq4'])
109
- })
110
-
111
- test('showOnly + collapse within subtree', () => {
112
- const root = buildRoot(simpleTree(), ['seq3'], 'clade2')
113
- expect(leaves(root).map(n => n.data.name)).toEqual(['seq4'])
114
- })
115
- })