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.
- package/README.md +6 -5
- package/bundle/index.js +100 -101
- package/bundle/index.js.map +4 -4
- package/dist/components/Loading.js +2 -2
- package/dist/components/Loading.js.map +1 -1
- package/dist/components/MSAViewer.d.ts +10 -2
- package/dist/components/MSAViewer.js +90 -2
- package/dist/components/MSAViewer.js.map +1 -1
- package/dist/components/ResizeHandles.d.ts +3 -3
- package/dist/components/ResizeHandles.js +28 -21
- package/dist/components/ResizeHandles.js.map +1 -1
- package/dist/components/dialogs/{InterProScanDialog.d.ts → AnnotationFileDialog.d.ts} +2 -2
- package/dist/components/dialogs/AnnotationFileDialog.js +92 -0
- package/dist/components/dialogs/AnnotationFileDialog.js.map +1 -0
- package/dist/components/dialogs/FeatureDialog.js +13 -9
- package/dist/components/dialogs/FeatureDialog.js.map +1 -1
- package/dist/components/header/Header.js +4 -0
- package/dist/components/header/Header.js.map +1 -1
- package/dist/components/header/HeaderStatusArea.js +0 -2
- package/dist/components/header/HeaderStatusArea.js.map +1 -1
- package/dist/components/header/LoadWarnings.d.ts +6 -0
- package/dist/components/header/LoadWarnings.js +36 -0
- package/dist/components/header/LoadWarnings.js.map +1 -0
- package/dist/components/header/MultiAlignmentSelector.js +0 -0
- package/dist/components/header/MultiAlignmentSelector.js.map +1 -1
- package/dist/components/header/TreeSettingsMenu.js +9 -1
- package/dist/components/header/TreeSettingsMenu.js.map +1 -1
- package/dist/components/header/UnshareableDataWarning.d.ts +6 -0
- package/dist/components/header/UnshareableDataWarning.js +42 -0
- package/dist/components/header/UnshareableDataWarning.js.map +1 -0
- package/dist/components/header/getAnnotationsMenu.js +14 -14
- package/dist/components/header/getAnnotationsMenu.js.map +1 -1
- package/dist/components/import/ImportForm.js +1 -1
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/import/ImportFormExamples.js +2 -6
- package/dist/components/import/ImportFormExamples.js.map +1 -1
- package/dist/components/import/util.js +3 -0
- package/dist/components/import/util.js.map +1 -1
- package/dist/components/msa/MSACanvasBlock.js +4 -5
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/msaRaster.d.ts +13 -3
- package/dist/components/msa/msaRaster.js +173 -61
- package/dist/components/msa/msaRaster.js.map +1 -1
- package/dist/components/msa/renderHighlights.d.ts +39 -1
- package/dist/components/msa/renderHighlights.js +71 -6
- package/dist/components/msa/renderHighlights.js.map +1 -1
- package/dist/components/msa/renderMSABlock.d.ts +1 -2
- package/dist/components/msa/renderMSABlock.js +24 -28
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +9 -30
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/renderCtx.d.ts +1 -1
- package/dist/components/tracks/TrackBlocks.js +10 -11
- package/dist/components/tracks/TrackBlocks.js.map +1 -1
- package/dist/components/tracks/drawTracks.d.ts +26 -8
- package/dist/components/tracks/drawTracks.js +123 -13
- package/dist/components/tracks/drawTracks.js.map +1 -1
- package/dist/components/tree/TreeCanvas.js +2 -3
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +4 -2
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/TreeRuler.js +13 -3
- package/dist/components/tree/TreeRuler.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +0 -1
- package/dist/components/tree/renderTreeCanvas.js +70 -30
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/components/tree/scaleBar.d.ts +10 -0
- package/dist/components/tree/scaleBar.js +24 -0
- package/dist/components/tree/scaleBar.js.map +1 -0
- package/dist/constants.d.ts +3 -1
- package/dist/constants.js +18 -1
- package/dist/constants.js.map +1 -1
- package/dist/fetchUtils.d.ts +7 -7
- package/dist/fetchUtils.js +4 -32
- package/dist/fetchUtils.js.map +1 -1
- package/dist/hierarchy.d.ts +2 -1
- package/dist/hierarchy.js +16 -10
- package/dist/hierarchy.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +8 -2
- package/dist/index.js.map +1 -1
- package/dist/model/DataModel.js +5 -2
- package/dist/model/DataModel.js.map +1 -1
- package/dist/model.d.ts +454 -177
- package/dist/model.js +1180 -511
- package/dist/model.js.map +1 -1
- package/dist/renderToStaticMarkup.d.ts +11 -0
- package/dist/renderToStaticMarkup.js +30 -7
- package/dist/renderToStaticMarkup.js.map +1 -1
- package/dist/renderToSvg.js +25 -19
- package/dist/renderToSvg.js.map +1 -1
- package/dist/rowCoordinateCalculations.d.ts +25 -25
- package/dist/rowCoordinateCalculations.js +12 -36
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/seqPosToGlobalCol.js +3 -1
- package/dist/seqPosToGlobalCol.js.map +1 -1
- package/dist/svgTestUtil.d.ts +144 -82
- package/dist/types.d.ts +97 -3
- package/dist/util.d.ts +11 -4
- package/dist/util.js +30 -10
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/wuss.d.ts +14 -0
- package/dist/wuss.js +55 -0
- package/dist/wuss.js.map +1 -0
- package/package.json +10 -8
- package/src/components/Loading.tsx +12 -2
- package/src/components/MSAViewer.tsx +106 -2
- package/src/components/ResizeHandles.tsx +31 -31
- package/src/components/dialogs/AnnotationFileDialog.tsx +162 -0
- package/src/components/dialogs/FeatureDialog.tsx +13 -9
- package/src/components/header/Header.tsx +4 -0
- package/src/components/header/HeaderStatusArea.tsx +0 -5
- package/src/components/header/LoadWarnings.tsx +49 -0
- package/src/components/header/MultiAlignmentSelector.tsx +0 -0
- package/src/components/header/TreeSettingsMenu.tsx +9 -1
- package/src/components/header/UnshareableDataWarning.tsx +58 -0
- package/src/components/header/getAnnotationsMenu.ts +16 -17
- package/src/components/import/ImportForm.tsx +2 -2
- package/src/components/import/ImportFormExamples.tsx +2 -6
- package/src/components/import/util.ts +3 -0
- package/src/components/msa/MSACanvasBlock.tsx +4 -5
- package/src/components/msa/msaRaster.ts +216 -59
- package/src/components/msa/renderHighlights.ts +103 -5
- package/src/components/msa/renderMSABlock.ts +25 -36
- package/src/components/msa/renderMSAMouseover.ts +9 -39
- package/src/components/renderCtx.ts +1 -0
- package/src/components/tracks/TrackBlocks.tsx +10 -13
- package/src/components/tracks/drawTracks.ts +165 -17
- package/src/components/tree/TreeCanvas.tsx +2 -3
- package/src/components/tree/TreeCanvasBlock.tsx +4 -2
- package/src/components/tree/TreeRuler.tsx +38 -3
- package/src/components/tree/renderTreeCanvas.ts +79 -35
- package/src/components/tree/scaleBar.ts +23 -0
- package/src/constants.ts +20 -1
- package/src/fetchUtils.ts +7 -40
- package/src/hierarchy.ts +20 -11
- package/src/index.ts +18 -2
- package/src/model/DataModel.ts +6 -2
- package/src/model.ts +1352 -616
- package/src/rawImports.d.ts +9 -0
- package/src/renderToStaticMarkup.ts +34 -7
- package/src/renderToSvg.tsx +33 -27
- package/src/rowCoordinateCalculations.ts +15 -59
- package/src/seqPosToGlobalCol.ts +3 -1
- package/src/types.ts +131 -4
- package/src/util.ts +31 -14
- package/src/version.ts +1 -1
- package/src/wuss.ts +62 -0
- package/dist/components/dialogs/InterProScanDialog.js +0 -137
- package/dist/components/dialogs/InterProScanDialog.js.map +0 -1
- package/dist/components/dialogs/InterProScanFileDialog.d.ts +0 -7
- package/dist/components/dialogs/InterProScanFileDialog.js +0 -64
- package/dist/components/dialogs/InterProScanFileDialog.js.map +0 -1
- package/dist/launchInterProScan.d.ts +0 -13
- package/dist/launchInterProScan.js +0 -110
- package/dist/launchInterProScan.js.map +0 -1
- package/dist/useColorContrast.d.ts +0 -10
- package/dist/useColorContrast.js +0 -13
- package/dist/useColorContrast.js.map +0 -1
- package/src/clustalX.test.ts +0 -74
- package/src/colSpace.test.ts +0 -67
- package/src/collapseLogic.test.ts +0 -115
- package/src/colorSchemes.docs.test.ts +0 -57
- package/src/columnCounts.test.ts +0 -73
- package/src/columnStats.test.ts +0 -94
- package/src/columnTracks.test.ts +0 -97
- package/src/components/dialogs/InterProScanDialog.tsx +0 -214
- package/src/components/dialogs/InterProScanFileDialog.tsx +0 -138
- package/src/components/minimap/minimapLayout.test.ts +0 -71
- package/src/components/msa/msaRaster.test.ts +0 -145
- package/src/components/msa/renderBoxFeatureCanvasBlock.test.ts +0 -51
- package/src/components/tree/renderTreeCanvas.test.ts +0 -296
- package/src/dataInitialized.test.ts +0 -42
- package/src/domainBands.test.ts +0 -122
- package/src/domainLetterColor.test.ts +0 -80
- package/src/exportFileName.test.ts +0 -40
- package/src/fetchUtils.test.ts +0 -83
- package/src/flatToTree.test.ts +0 -51
- package/src/hierarchy.test.ts +0 -228
- package/src/highlights.test.ts +0 -70
- package/src/impgRender.test.tsx +0 -68
- package/src/largeTree.test.ts +0 -67
- package/src/launchInterProScan.ts +0 -167
- package/src/loadErrorDisplay.test.tsx +0 -102
- package/src/modelFilehandleLoaders.test.ts +0 -137
- package/src/modelReset.test.ts +0 -120
- package/src/neighborJoining.test.ts +0 -164
- package/src/parseAsn1.test.ts +0 -36
- package/src/propertyConservation.test.ts +0 -36
- package/src/renderColumnTracksSvg.test.tsx +0 -108
- package/src/renderDomainsSvg.test.tsx +0 -118
- package/src/renderHighlightsSvg.test.tsx +0 -85
- package/src/renderMinimapSvg.test.tsx +0 -62
- package/src/renderRasterSvg.test.tsx +0 -144
- package/src/renderSequenceLogoSvg.test.tsx +0 -165
- package/src/renderToSvg.test.tsx +0 -65
- package/src/reset.test.ts +0 -61
- package/src/rowCoordinateCalculations.test.ts +0 -211
- package/src/rowSpace.test.ts +0 -46
- package/src/segmentOverlay.test.ts +0 -70
- package/src/seqPosToGlobalCol.test.ts +0 -59
- package/src/sequenceLogo.test.ts +0 -88
- package/src/setFontSize.test.ts +0 -33
- package/src/stripDefault.test.ts +0 -48
- package/src/stripDefaultSnapshot.test.ts +0 -87
- package/src/treeMetadata.test.ts +0 -39
- package/src/useCanvasAutorun.test.tsx +0 -98
- package/src/useColorContrast.ts +0 -18
- package/src/viewChrome.test.tsx +0 -134
- 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":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAEjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAA;AAIhE,MAAM,QAAQ,GAAG,oCAAoC,CAAA;AACrD,MAAM,QAAQ,GAAG,yBAAyB,CAAA;AAC1C,MAAM,UAAU,GAAG,oBAAoB,CAAA;AACvC,MAAM,KAAK,GAAG,gBAAgB,CAAA;AAE9B,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,oBAAoB,GAAG;IAC3B;QACE,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,qCAAqC;KACnD;IACD;QACE,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,qCAAqC;KACnD;IACD;QACE,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,QAAQ;QAClB,WAAW,EACT,gEAAgE;KACnE;IACD,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACvC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE;IACxC,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE;IAClD,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,KAAK,EAAE;IAClD,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC7C,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACvC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrC,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC/C,EAAE,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC/C,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrC;QACE,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,4BAA4B;KAC1C;IACD,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACtC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrC,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE;IAC1C,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;IAClC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE;IACpC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;IACnC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;CACtC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;AAEjD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,EAC5C,WAAW,EACX,KAAK,GAIN;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,oBAAoB,CAAC,CAAA;IAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAC7D,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEvC,OAAO,CACL,oBAAC,MAAM,IACL,QAAQ,EAAC,IAAI,EACb,KAAK,EAAC,oCAAoC,EAC1C,OAAO,EAAE,GAAG,EAAE;YACZ,WAAW,EAAE,CAAA;QACf,CAAC,EACD,IAAI;QAEJ,oBAAC,aAAa;YACZ,oBAAC,UAAU,6FAGE;YACb,oBAAC,MAAM,IACL,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,CAAC,CAAC,IAAI,CAAC,CAAA;gBAChB,CAAC;gBAEA,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;oCAChB;YACR,IAAI,CAAC,CAAC,CAAC,CACN;gBACE,oBAAC,UAAU,oDAAuD;gBAClE;oBACE,oBAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,WAAW,EACjB,OAAO,EAAE,GAAG,EAAE;4BACZ,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;wBACpD,CAAC,kBAGM;oBACT,oBAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,SAAS,EACf,OAAO,EAAE,GAAG,EAAE;4BACZ,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;wBACnD,CAAC,iBAGM,CACL;gBACN;oBACE,mCACG,IAAI;yBACF,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;yBACxD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,CACjD,4BAAI,GAAG,EAAE,IAAI;wBACX;4BACE,+BACE,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,GAAG,EAAE;oCACb,OAAO,CACL,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CACX,CAAC,CAAC,IAAI,KAAK,IAAI;wCACb,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE;wCAC/B,CAAC,CAAC,CAAC,CACN,CACF,CAAA;gCACH,CAAC,GACD,CACC;wBACL,4BAAI,KAAK,EAAE,WAAW,IAAG,IAAI,CAAM;wBACnC,gCAAK,QAAQ,CAAM,CAChB,CACN,CAAC,CACE,CACF,CACJ,CACP,CAAC,CAAC,CAAC,IAAI,CACM;QAChB,oBAAC,aAAa;YACZ,oBAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,WAAW,EACjB,OAAO,EAAE,GAAG,EAAE;oBACZ,WAAW,EAAE,CAAA;gBACf,CAAC,aAGM;YACT,oBAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,SAAS,EACf,OAAO,EAAE,GAAG,EAAE;oBACZ,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAEvC;oBAAA,CAAC,KAAK,IAAI,EAAE;wBACX,IAAI,CAAC;4BACH,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;4BACtB,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gCACtB,MAAM,IAAI,KAAK,CACb,qDAAqD,CACtD,CAAA;4BACH,CAAC;4BACD,MAAM,kBAAkB,CAAC;gCACvB,SAAS,EAAE,cAAc;gCACzB,QAAQ,EAAE,QAAQ;gCAClB,GAAG,EAAE,IAAI;qCACN,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qCACjD,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;qCACnB,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;qCACnC,IAAI,CAAC,IAAI,CAAC;gCACb,UAAU,EAAE,GAAG,CAAC,EAAE;oCAChB,KAAK,CAAC,SAAS,CACb,GAAG;wCACD,CAAC,CAAC;4CACE,GAAG,GAAG;4CACN,QAAQ,EAAE,GAAG,EAAE;gDACb,UAAU,CAAC,KAAK,EAAE,CAAA;4CACpB,CAAC;yCACF;wCACH,CAAC,CAAC,SAAS,CACd,CAAA;gCACH,CAAC;gCACD,KAAK;gCACL,MAAM,EAAE,UAAU,CAAC,MAAM;6BAC1B,CAAC,CAAA;wBACJ,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;4BAChB,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;wBAC1C,CAAC;gCAAS,CAAC;4BACT,KAAK,CAAC,SAAS,EAAE,CAAA;wBACnB,CAAC;oBACH,CAAC,CAAC,EAAE,CAAA;oBACJ,WAAW,EAAE,CAAA;gBACf,CAAC,qCAGM,CACK,CACT,CACV,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,kBAAkB,CAAA"}
|
|
@@ -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":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EACL,MAAM,EACN,aAAa,EACb,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,KAAK,EACL,UAAU,EACV,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAA;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAK/C,MAAM,sBAAsB,GAAG,QAAQ,CAAC,UAAU,EAChD,WAAW,EACX,KAAK,GAIN;IACC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAQ,CAAA;IACxC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IAElD,OAAO,CACL,oBAAC,MAAM,IACL,QAAQ,EAAC,IAAI,EACb,KAAK,EAAC,2BAA2B,EACjC,OAAO,EAAE,GAAG,EAAE;YACZ,WAAW,EAAE,CAAA;QACf,CAAC,EACD,IAAI;QAEJ,oBAAC,aAAa;YACZ;gBACE,oBAAC,UAAU,mGAGE;gBAEb,6BAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;oBACzC,oBAAC,WAAW,IAAC,SAAS,EAAC,UAAU;wBAC/B,oBAAC,UAAU,IACT,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,KAAK,CAAC,EAAE;gCAChB,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;4BAC/B,CAAC;4BAED,oBAAC,gBAAgB,IAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAE,oBAAC,KAAK,OAAG,EAAE,KAAK,EAAC,KAAK,GAAG;4BAChE,oBAAC,gBAAgB,IACf,KAAK,EAAC,MAAM,EACZ,OAAO,EAAE,oBAAC,KAAK,OAAG,EAClB,KAAK,EAAC,MAAM,GACZ,CACS,CACD;oBACb,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAClB;wBACE,oBAAC,UAAU,mDAEE;wBACb,oBAAC,SAAS,IACR,KAAK,EAAC,KAAK,EACX,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,KAAK,CAAC,EAAE;gCAChB,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;4BACpC,CAAC,GACD,CACE,CACP,CAAC,CAAC,CAAC,IAAI;oBACP,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CACnB,6BAAK,KAAK,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;wBAC5B,oBAAC,UAAU,mEAEE;wBACb,oBAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,SAAS,EAAC,OAAO;;4BAE1C,+BACE,IAAI,EAAC,MAAM,EACX,MAAM,QACN,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;oCACvB,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAA;oCAC9B,IAAI,IAAI,EAAE,CAAC;wCACT,OAAO,CAAC,IAAI,CAAC,CAAA;oCACf,CAAC;gCACH,CAAC,GACD,CACK,CACL,CACP,CAAC,CAAC,CAAC,IAAI,CACJ,CACF,CACQ;QAChB,oBAAC,aAAa;YACZ,oBAAC,MAAM,IACL,OAAO,EAAC,WAAW,EACnB,KAAK,EAAC,SAAS,EACf,OAAO,EAAE,GAAG,EAAE;oBACZ,mEAAmE;oBACnE,CAAC;oBAAA,CAAC,KAAK,IAAI,EAAE;wBACX,IAAI,CAAC;4BACH,MAAM,GAAG,GAAyB,IAAI;gCACpC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;gCAC/B,CAAC,CAAC,MAAM,SAAS,CAAC,WAAW,CAAC,CAAA;4BAEhC,KAAK,CAAC,cAAc,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC,CAAA;4BAC5D,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CACtB,6BAA6B,EAC7B,SAAS,CACV,CAAA;wBACH,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;4BAChB,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;wBAC1C,CAAC;gCAAS,CAAC;4BACT,KAAK,CAAC,SAAS,EAAE,CAAA;wBACnB,CAAC;oBACH,CAAC,CAAC,EAAE,CAAA;oBACJ,WAAW,EAAE,CAAA;gBACf,CAAC,mBAGM,CACK,CACT,CACV,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,sBAAsB,CAAA"}
|
|
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,iCAAiC,EAAE,MAAM,aAAa,CAAA;AAE/D,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAK7E,MAAM,IAAI,GAAG,2CAA2C,CAAA;AAExD,KAAK,UAAU,eAAe,CAAC,EAC7B,GAAG,EACH,UAAU,EACV,OAAO,EACP,QAAQ,EACR,KAAK,EACL,MAAM,GAQP;IACC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,eAAe,EAAE;QACpD,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,KAAK,EAAE,uBAAuB;YAC9B,QAAQ,EAAE,GAAG;YACb,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;SAC7B,CAAC;QACF,MAAM;KACP,CAAC,CAAA;IACF,OAAO,EAAE,CAAC,KAAK,CAAC,CAAA;IAChB,MAAM,IAAI,CAAC;QACT,KAAK;QACL,UAAU;QACV,MAAM;KACP,CAAC,CAAA;IACF,MAAM,iCAAiC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;AAC/E,CAAC;AAED,SAAS,uBAAuB,CAAC,KAAa,EAAE,MAAoB;IAClE,OAAO,SAAS,CACd,GAAG,IAAI,oBAAoB,KAAK,OAAO,EACvC,EAAE,MAAM,EAAE,CACX,CAAA;AACH,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,EAClB,UAAU,EACV,KAAK,EACL,MAAM,GAKP;IACC,MAAM,GAAG,GAAG,GAAG,IAAI,oBAAoB,KAAK,EAAE,CAAA;IAC9C,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,SAAS,GAAG,GAAG,CAAA;IACrB,IAAI,CAAC;QACH,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;YAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5B,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;gBAC3B,UAAU,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YACvD,CAAC;YACD,yEAAyE;YACzE,wEAAwE;YACxE,MAAM,MAAM,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACxD,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;gBAC1B,QAAQ,GAAG,IAAI,CAAA;YACjB,CAAC;iBAAM,IACL,MAAM,KAAK,SAAS;gBACpB,MAAM,KAAK,OAAO;gBAClB,MAAM,KAAK,WAAW,EACtB,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,oBAAoB,KAAK,uBAAuB,MAAM,EAAE,CACzD,CAAA;YACH,CAAC;QACH,CAAC;QACD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,oBAAoB,KAAK,yBAAyB,SAAS,gBAAgB,CAC5E,CAAA;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,UAAU,EAAE,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,EACvC,SAAS,EACT,GAAG,EACH,QAAQ,EACR,OAAO,EACP,UAAU,EACV,KAAK,EACL,MAAM,GASP;IACC,IAAI,CAAC;QACH,UAAU,CAAC,EAAE,GAAG,EAAE,aAAa,SAAS,MAAM,EAAE,CAAC,CAAA;QACjD,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACjC,MAAM,eAAe,CAAC;gBACpB,GAAG;gBACH,OAAO;gBACP,UAAU;gBACV,QAAQ;gBACR,KAAK;gBACL,MAAM;aACP,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;QACtC,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAA;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,CAAA;QACT,CAAC;IACH,CAAC;YAAS,CAAC;QACT,UAAU,EAAE,CAAA;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iCAAiC,CAAC,EAC/C,KAAK,EACL,KAAK,EACL,UAAU,EACV,MAAM,GAMP;IACC,IAAI,CAAC;QACH,UAAU,CAAC;YACT,GAAG,EAAE,0BAA0B,KAAK,iGAAiG;YACrI,GAAG,EAAE,6DAA6D,KAAK,OAAO;SAC/E,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACxD,KAAK,CAAC,cAAc,CAAC,iCAAiC,CAAC,GAAG,CAAC,CAAC,CAAA;QAC5D,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,uBAAuB,KAAK,UAAU,EAAE,SAAS,CAAC,CAAA;IAC7E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,8BAA8B,EAAE,MAAM,CAAC,CAAA;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YAChB,UAAU,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAC1C,CAAC;IACH,CAAC;YAAS,CAAC;QACT,UAAU,EAAE,CAAA;IACd,CAAC;AACH,CAAC"}
|
|
@@ -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
|
-
};
|
package/dist/useColorContrast.js
DELETED
|
@@ -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"}
|
package/src/clustalX.test.ts
DELETED
|
@@ -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
|
-
})
|
package/src/colSpace.test.ts
DELETED
|
@@ -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
|
-
})
|