@jbrowse/plugin-wiggle 3.1.0 → 3.2.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/dist/BigWigAdapter/BigWigAdapter.js +1 -1
- package/dist/LinearWiggleDisplay/model.d.ts +10 -10
- package/dist/MultiDensityRenderer/MultiDensityRenderer.js +2 -2
- package/dist/MultiLineRenderer/MultiLineRenderer.js +2 -2
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialog.d.ts +6 -0
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialog.js +29 -0
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogAuto.d.ts +7 -0
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogAuto.js +76 -0
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogManual.d.ts +7 -0
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogManual.js +155 -0
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/types.d.ts +7 -0
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog/types.js +2 -0
- package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.js +2 -2
- package/dist/MultiLinearWiggleDisplay/model.d.ts +15 -9
- package/dist/MultiLinearWiggleDisplay/model.js +28 -14
- package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +2 -2
- package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +2 -2
- package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +3 -3
- package/dist/WiggleBaseRenderer.d.ts +1 -0
- package/dist/WiggleBaseRenderer.js +3 -3
- package/dist/WiggleRPC/MultiWiggleClusterScoreMatrix.d.ts +14 -0
- package/dist/WiggleRPC/MultiWiggleClusterScoreMatrix.js +34 -0
- package/dist/WiggleRPC/MultiWiggleGetScoreMatrix.d.ts +2 -13
- package/dist/WiggleRPC/MultiWiggleGetScoreMatrix.js +5 -37
- package/dist/WiggleRPC/cluster.d.ts +17 -0
- package/dist/WiggleRPC/cluster.js +84 -0
- package/dist/WiggleRPC/getScoreMatrix.d.ts +6 -0
- package/dist/WiggleRPC/getScoreMatrix.js +35 -0
- package/dist/WiggleRPC/rpcMethods.d.ts +1 -0
- package/dist/WiggleRPC/rpcMethods.js +1 -0
- package/dist/WiggleRPC/type.d.ts +0 -0
- package/dist/WiggleRPC/type.js +1 -0
- package/dist/WiggleRPC/types.d.ts +13 -0
- package/dist/WiggleRPC/types.js +2 -0
- package/dist/drawDensity.d.ts +1 -0
- package/dist/drawDensity.js +12 -2
- package/dist/drawLine.d.ts +1 -0
- package/dist/drawLine.js +9 -3
- package/dist/drawXY.js +8 -8
- package/dist/index.js +1 -0
- package/dist/shared/SharedWiggleMixin.d.ts +8 -8
- package/dist/shared/SharedWiggleMixin.js +11 -8
- package/esm/BigWigAdapter/BigWigAdapter.js +1 -1
- package/esm/LinearWiggleDisplay/model.d.ts +10 -10
- package/esm/MultiDensityRenderer/MultiDensityRenderer.js +3 -3
- package/esm/MultiLineRenderer/MultiLineRenderer.js +3 -3
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialog.d.ts +6 -0
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialog.js +24 -0
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogAuto.d.ts +7 -0
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogAuto.js +74 -0
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogManual.d.ts +7 -0
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/ClusterDialogManual.js +150 -0
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/types.d.ts +7 -0
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog/types.js +1 -0
- package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.js +2 -2
- package/esm/MultiLinearWiggleDisplay/model.d.ts +15 -9
- package/esm/MultiLinearWiggleDisplay/model.js +28 -14
- package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +3 -3
- package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +3 -3
- package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +4 -4
- package/esm/WiggleBaseRenderer.d.ts +1 -0
- package/esm/WiggleBaseRenderer.js +4 -4
- package/esm/WiggleRPC/MultiWiggleClusterScoreMatrix.d.ts +14 -0
- package/esm/WiggleRPC/MultiWiggleClusterScoreMatrix.js +27 -0
- package/esm/WiggleRPC/MultiWiggleGetScoreMatrix.d.ts +2 -13
- package/esm/WiggleRPC/MultiWiggleGetScoreMatrix.js +5 -37
- package/esm/WiggleRPC/cluster.d.ts +17 -0
- package/esm/WiggleRPC/cluster.js +79 -0
- package/esm/WiggleRPC/getScoreMatrix.d.ts +6 -0
- package/esm/WiggleRPC/getScoreMatrix.js +32 -0
- package/esm/WiggleRPC/rpcMethods.d.ts +1 -0
- package/esm/WiggleRPC/rpcMethods.js +1 -0
- package/esm/WiggleRPC/type.d.ts +0 -0
- package/esm/WiggleRPC/type.js +1 -0
- package/esm/WiggleRPC/types.d.ts +13 -0
- package/esm/WiggleRPC/types.js +1 -0
- package/esm/drawDensity.d.ts +1 -0
- package/esm/drawDensity.js +12 -2
- package/esm/drawLine.d.ts +1 -0
- package/esm/drawLine.js +9 -3
- package/esm/drawXY.js +8 -8
- package/esm/index.js +2 -1
- package/esm/shared/SharedWiggleMixin.d.ts +8 -8
- package/esm/shared/SharedWiggleMixin.js +11 -8
- package/package.json +5 -5
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog.d.ts +0 -11
- package/dist/MultiLinearWiggleDisplay/components/ClusterDialog.js +0 -115
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog.d.ts +0 -11
- package/esm/MultiLinearWiggleDisplay/components/ClusterDialog.js +0 -109
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.default = ClusterDialog;
|
|
7
|
-
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
-
const react_1 = require("react");
|
|
9
|
-
const ui_1 = require("@jbrowse/core/ui");
|
|
10
|
-
const util_1 = require("@jbrowse/core/util");
|
|
11
|
-
const tracks_1 = require("@jbrowse/core/util/tracks");
|
|
12
|
-
const material_1 = require("@mui/material");
|
|
13
|
-
const copy_to_clipboard_1 = __importDefault(require("copy-to-clipboard"));
|
|
14
|
-
const file_saver_1 = require("file-saver");
|
|
15
|
-
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
16
|
-
const mui_1 = require("tss-react/mui");
|
|
17
|
-
const useStyles = (0, mui_1.makeStyles)()(theme => ({
|
|
18
|
-
textAreaFont: {
|
|
19
|
-
fontFamily: 'Courier New',
|
|
20
|
-
},
|
|
21
|
-
mgap: {
|
|
22
|
-
display: 'flex',
|
|
23
|
-
flexDirection: 'column',
|
|
24
|
-
gap: theme.spacing(4),
|
|
25
|
-
},
|
|
26
|
-
}));
|
|
27
|
-
function ClusterDialog({ model, handleClose, }) {
|
|
28
|
-
const { classes } = useStyles();
|
|
29
|
-
const [results, setResults] = (0, react_1.useState)();
|
|
30
|
-
const [error, setError] = (0, react_1.useState)();
|
|
31
|
-
const [paste, setPaste] = (0, react_1.useState)('');
|
|
32
|
-
const [useCompleteMethod, setUseCompleteMethod] = (0, react_1.useState)(false);
|
|
33
|
-
(0, react_1.useEffect)(() => {
|
|
34
|
-
;
|
|
35
|
-
(async () => {
|
|
36
|
-
try {
|
|
37
|
-
setError(undefined);
|
|
38
|
-
const view = (0, util_1.getContainingView)(model);
|
|
39
|
-
if (!view.initialized) {
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
const { rpcManager } = (0, util_1.getSession)(model);
|
|
43
|
-
const { sources, minorAlleleFrequencyFilter, adapterConfig } = model;
|
|
44
|
-
const sessionId = (0, tracks_1.getRpcSessionId)(model);
|
|
45
|
-
const { bpPerPx } = view;
|
|
46
|
-
const ret = (await rpcManager.call(sessionId, 'MultiWiggleGetScoreMatrix', {
|
|
47
|
-
regions: view.dynamicBlocks.contentBlocks,
|
|
48
|
-
sources,
|
|
49
|
-
minorAlleleFrequencyFilter,
|
|
50
|
-
sessionId,
|
|
51
|
-
adapterConfig,
|
|
52
|
-
bpPerPx,
|
|
53
|
-
}));
|
|
54
|
-
const entries = Object.values(ret);
|
|
55
|
-
const keys = Object.keys(ret);
|
|
56
|
-
const clusterMethod = useCompleteMethod ? 'complete' : 'single';
|
|
57
|
-
const text = `try(library(fastcluster), silent=TRUE)
|
|
58
|
-
inputMatrix<-matrix(c(${entries.map(val => val.scores.join(',')).join(',\n')}
|
|
59
|
-
),nrow=${entries.length},byrow=TRUE)
|
|
60
|
-
rownames(inputMatrix)<-c(${keys.map(key => `'${key}'`).join(',')})
|
|
61
|
-
resultClusters<-hclust(dist(inputMatrix), method='${clusterMethod}')
|
|
62
|
-
cat(resultClusters$order,sep='\\n')`;
|
|
63
|
-
setResults(text);
|
|
64
|
-
}
|
|
65
|
-
catch (e) {
|
|
66
|
-
if (!(0, util_1.isAbortException)(e) && (0, mobx_state_tree_1.isAlive)(model)) {
|
|
67
|
-
console.error(e);
|
|
68
|
-
setError(e);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
})();
|
|
72
|
-
}, [model, useCompleteMethod]);
|
|
73
|
-
return ((0, jsx_runtime_1.jsxs)(ui_1.Dialog, { open: true, title: "Cluster by score", onClose: handleClose, children: [(0, jsx_runtime_1.jsx)(material_1.DialogContent, { children: (0, jsx_runtime_1.jsxs)("div", { className: classes.mgap, children: [(0, jsx_runtime_1.jsx)(material_1.Typography, { children: "This page will produce an R script that will perform hierarchical clustering on the visible score data using `hclust`." }), (0, jsx_runtime_1.jsx)(material_1.Typography, { children: "You can then paste the results in this form to specify the row ordering." }), results ? ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)("div", { children: ["Step 1:", ' ', (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
|
|
74
|
-
(0, file_saver_1.saveAs)(new Blob([results || ''], {
|
|
75
|
-
type: 'text/plain;charset=utf-8',
|
|
76
|
-
}), 'cluster.R');
|
|
77
|
-
}, children: "Download Rscript" }), ' ', "or", ' ', (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", onClick: () => {
|
|
78
|
-
(0, copy_to_clipboard_1.default)(results || '');
|
|
79
|
-
}, children: "Copy Rscript to clipboard" }), (0, jsx_runtime_1.jsx)(material_1.FormControlLabel, { control: (0, jsx_runtime_1.jsx)(material_1.Checkbox, { checked: useCompleteMethod, onChange: e => {
|
|
80
|
-
setUseCompleteMethod(e.target.checked);
|
|
81
|
-
} }), label: "Use 'complete' linkage method instead of 'single'" }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsx)(material_1.TextField, { multiline: true, fullWidth: true, variant: "outlined", placeholder: "Step 2. Paste results from Rscript here (sequence of numbers, one per line, specifying the new ordering)", rows: 10, value: paste, onChange: event => {
|
|
82
|
-
setPaste(event.target.value);
|
|
83
|
-
}, slotProps: {
|
|
84
|
-
input: {
|
|
85
|
-
classes: {
|
|
86
|
-
input: classes.textAreaFont,
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
} }) })] }) })) : ((0, jsx_runtime_1.jsx)(ui_1.LoadingEllipses, { variant: "h6", title: "Generating score matrix" })), error ? (0, jsx_runtime_1.jsx)(ui_1.ErrorMessage, { error: error }) : null] }) }), (0, jsx_runtime_1.jsxs)(material_1.DialogActions, { children: [(0, jsx_runtime_1.jsx)(material_1.Button, { disabled: !results, variant: "contained", onClick: () => {
|
|
90
|
-
const { sources } = model;
|
|
91
|
-
if (sources) {
|
|
92
|
-
try {
|
|
93
|
-
model.setLayout(paste
|
|
94
|
-
.split('\n')
|
|
95
|
-
.map(t => t.trim())
|
|
96
|
-
.filter(f => !!f)
|
|
97
|
-
.map(r => +r)
|
|
98
|
-
.map(idx => {
|
|
99
|
-
const ret = sources[idx - 1];
|
|
100
|
-
if (!ret) {
|
|
101
|
-
throw new Error(`out of bounds at ${idx}`);
|
|
102
|
-
}
|
|
103
|
-
return ret;
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
|
-
catch (e) {
|
|
107
|
-
console.error(e);
|
|
108
|
-
setError(e);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
handleClose();
|
|
112
|
-
}, children: "Apply clustering" }), (0, jsx_runtime_1.jsx)(material_1.Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
113
|
-
handleClose();
|
|
114
|
-
}, children: "Cancel" })] })] }));
|
|
115
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Source } from '../types';
|
|
2
|
-
import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
3
|
-
export default function ClusterDialog({ model, handleClose, }: {
|
|
4
|
-
model: {
|
|
5
|
-
sources?: Source[];
|
|
6
|
-
minorAlleleFrequencyFilter?: number;
|
|
7
|
-
adapterConfig: AnyConfigurationModel;
|
|
8
|
-
setLayout: (arg: Source[]) => void;
|
|
9
|
-
};
|
|
10
|
-
handleClose: () => void;
|
|
11
|
-
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useEffect, useState } from 'react';
|
|
3
|
-
import { Dialog, ErrorMessage, LoadingEllipses } from '@jbrowse/core/ui';
|
|
4
|
-
import { getContainingView, getSession, isAbortException, } from '@jbrowse/core/util';
|
|
5
|
-
import { getRpcSessionId } from '@jbrowse/core/util/tracks';
|
|
6
|
-
import { Button, Checkbox, DialogActions, DialogContent, FormControlLabel, TextField, Typography, } from '@mui/material';
|
|
7
|
-
import copy from 'copy-to-clipboard';
|
|
8
|
-
import { saveAs } from 'file-saver';
|
|
9
|
-
import { isAlive } from 'mobx-state-tree';
|
|
10
|
-
import { makeStyles } from 'tss-react/mui';
|
|
11
|
-
const useStyles = makeStyles()(theme => ({
|
|
12
|
-
textAreaFont: {
|
|
13
|
-
fontFamily: 'Courier New',
|
|
14
|
-
},
|
|
15
|
-
mgap: {
|
|
16
|
-
display: 'flex',
|
|
17
|
-
flexDirection: 'column',
|
|
18
|
-
gap: theme.spacing(4),
|
|
19
|
-
},
|
|
20
|
-
}));
|
|
21
|
-
export default function ClusterDialog({ model, handleClose, }) {
|
|
22
|
-
const { classes } = useStyles();
|
|
23
|
-
const [results, setResults] = useState();
|
|
24
|
-
const [error, setError] = useState();
|
|
25
|
-
const [paste, setPaste] = useState('');
|
|
26
|
-
const [useCompleteMethod, setUseCompleteMethod] = useState(false);
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
;
|
|
29
|
-
(async () => {
|
|
30
|
-
try {
|
|
31
|
-
setError(undefined);
|
|
32
|
-
const view = getContainingView(model);
|
|
33
|
-
if (!view.initialized) {
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const { rpcManager } = getSession(model);
|
|
37
|
-
const { sources, minorAlleleFrequencyFilter, adapterConfig } = model;
|
|
38
|
-
const sessionId = getRpcSessionId(model);
|
|
39
|
-
const { bpPerPx } = view;
|
|
40
|
-
const ret = (await rpcManager.call(sessionId, 'MultiWiggleGetScoreMatrix', {
|
|
41
|
-
regions: view.dynamicBlocks.contentBlocks,
|
|
42
|
-
sources,
|
|
43
|
-
minorAlleleFrequencyFilter,
|
|
44
|
-
sessionId,
|
|
45
|
-
adapterConfig,
|
|
46
|
-
bpPerPx,
|
|
47
|
-
}));
|
|
48
|
-
const entries = Object.values(ret);
|
|
49
|
-
const keys = Object.keys(ret);
|
|
50
|
-
const clusterMethod = useCompleteMethod ? 'complete' : 'single';
|
|
51
|
-
const text = `try(library(fastcluster), silent=TRUE)
|
|
52
|
-
inputMatrix<-matrix(c(${entries.map(val => val.scores.join(',')).join(',\n')}
|
|
53
|
-
),nrow=${entries.length},byrow=TRUE)
|
|
54
|
-
rownames(inputMatrix)<-c(${keys.map(key => `'${key}'`).join(',')})
|
|
55
|
-
resultClusters<-hclust(dist(inputMatrix), method='${clusterMethod}')
|
|
56
|
-
cat(resultClusters$order,sep='\\n')`;
|
|
57
|
-
setResults(text);
|
|
58
|
-
}
|
|
59
|
-
catch (e) {
|
|
60
|
-
if (!isAbortException(e) && isAlive(model)) {
|
|
61
|
-
console.error(e);
|
|
62
|
-
setError(e);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
})();
|
|
66
|
-
}, [model, useCompleteMethod]);
|
|
67
|
-
return (_jsxs(Dialog, { open: true, title: "Cluster by score", onClose: handleClose, children: [_jsx(DialogContent, { children: _jsxs("div", { className: classes.mgap, children: [_jsx(Typography, { children: "This page will produce an R script that will perform hierarchical clustering on the visible score data using `hclust`." }), _jsx(Typography, { children: "You can then paste the results in this form to specify the row ordering." }), results ? (_jsx("div", { children: _jsxs("div", { children: ["Step 1:", ' ', _jsx(Button, { variant: "contained", onClick: () => {
|
|
68
|
-
saveAs(new Blob([results || ''], {
|
|
69
|
-
type: 'text/plain;charset=utf-8',
|
|
70
|
-
}), 'cluster.R');
|
|
71
|
-
}, children: "Download Rscript" }), ' ', "or", ' ', _jsx(Button, { variant: "contained", onClick: () => {
|
|
72
|
-
copy(results || '');
|
|
73
|
-
}, children: "Copy Rscript to clipboard" }), _jsx(FormControlLabel, { control: _jsx(Checkbox, { checked: useCompleteMethod, onChange: e => {
|
|
74
|
-
setUseCompleteMethod(e.target.checked);
|
|
75
|
-
} }), label: "Use 'complete' linkage method instead of 'single'" }), _jsx("div", { children: _jsx(TextField, { multiline: true, fullWidth: true, variant: "outlined", placeholder: "Step 2. Paste results from Rscript here (sequence of numbers, one per line, specifying the new ordering)", rows: 10, value: paste, onChange: event => {
|
|
76
|
-
setPaste(event.target.value);
|
|
77
|
-
}, slotProps: {
|
|
78
|
-
input: {
|
|
79
|
-
classes: {
|
|
80
|
-
input: classes.textAreaFont,
|
|
81
|
-
},
|
|
82
|
-
},
|
|
83
|
-
} }) })] }) })) : (_jsx(LoadingEllipses, { variant: "h6", title: "Generating score matrix" })), error ? _jsx(ErrorMessage, { error: error }) : null] }) }), _jsxs(DialogActions, { children: [_jsx(Button, { disabled: !results, variant: "contained", onClick: () => {
|
|
84
|
-
const { sources } = model;
|
|
85
|
-
if (sources) {
|
|
86
|
-
try {
|
|
87
|
-
model.setLayout(paste
|
|
88
|
-
.split('\n')
|
|
89
|
-
.map(t => t.trim())
|
|
90
|
-
.filter(f => !!f)
|
|
91
|
-
.map(r => +r)
|
|
92
|
-
.map(idx => {
|
|
93
|
-
const ret = sources[idx - 1];
|
|
94
|
-
if (!ret) {
|
|
95
|
-
throw new Error(`out of bounds at ${idx}`);
|
|
96
|
-
}
|
|
97
|
-
return ret;
|
|
98
|
-
}));
|
|
99
|
-
}
|
|
100
|
-
catch (e) {
|
|
101
|
-
console.error(e);
|
|
102
|
-
setError(e);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
handleClose();
|
|
106
|
-
}, children: "Apply clustering" }), _jsx(Button, { variant: "contained", color: "secondary", onClick: () => {
|
|
107
|
-
handleClose();
|
|
108
|
-
}, children: "Cancel" })] })] }));
|
|
109
|
-
}
|