@jbrowse/plugin-wiggle 3.0.5 → 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/BigWigAdapter/configSchema.js +14 -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 +44 -14
- package/dist/MultiLinearWiggleDisplay/types.d.ts +14 -0
- package/dist/MultiLinearWiggleDisplay/types.js +2 -0
- 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 +6 -0
- package/dist/WiggleRPC/MultiWiggleGetScoreMatrix.js +22 -0
- 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 +2 -0
- package/dist/WiggleRPC/rpcMethods.js +2 -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 +16 -10
- package/dist/index.js +2 -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/BigWigAdapter/configSchema.js +14 -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 +44 -14
- package/esm/MultiLinearWiggleDisplay/types.d.ts +14 -0
- package/esm/MultiLinearWiggleDisplay/types.js +1 -0
- 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 +6 -0
- package/esm/WiggleRPC/MultiWiggleGetScoreMatrix.js +15 -0
- 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 +2 -0
- package/esm/WiggleRPC/rpcMethods.js +2 -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 +16 -10
- package/esm/index.js +3 -1
- package/esm/shared/SharedWiggleMixin.d.ts +8 -8
- package/esm/shared/SharedWiggleMixin.js +11 -8
- package/package.json +5 -5
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { groupBy } from '@jbrowse/core/util';
|
|
1
|
+
import { forEachWithStopTokenCheck, groupBy } from '@jbrowse/core/util';
|
|
2
2
|
import WiggleBaseRenderer from '../WiggleBaseRenderer';
|
|
3
3
|
import { YSCALEBAR_LABEL_OFFSET } from '../util';
|
|
4
4
|
export default class MultiXYPlotRenderer extends WiggleBaseRenderer {
|
|
5
5
|
async draw(ctx, props) {
|
|
6
|
-
const { sources, features } = props;
|
|
6
|
+
const { stopToken, sources, features } = props;
|
|
7
7
|
const groups = groupBy(features.values(), f => f.get('source'));
|
|
8
8
|
const { drawXY } = await import('../drawXY');
|
|
9
9
|
let feats = [];
|
|
10
|
-
|
|
10
|
+
forEachWithStopTokenCheck(sources, stopToken, source => {
|
|
11
11
|
const features = groups[source.name] || [];
|
|
12
12
|
const { reducedFeatures } = drawXY(ctx, {
|
|
13
13
|
...props,
|
|
@@ -16,7 +16,7 @@ export default class MultiXYPlotRenderer extends WiggleBaseRenderer {
|
|
|
16
16
|
colorCallback: () => source.color || 'blue',
|
|
17
17
|
});
|
|
18
18
|
feats = feats.concat(reducedFeatures);
|
|
19
|
-
}
|
|
19
|
+
});
|
|
20
20
|
return { reducedFeatures: feats };
|
|
21
21
|
}
|
|
22
22
|
}
|
|
@@ -17,6 +17,7 @@ export interface RenderArgsDeserialized extends FeatureRenderArgsDeserialized {
|
|
|
17
17
|
};
|
|
18
18
|
inverted: boolean;
|
|
19
19
|
themeOptions: ThemeOptions;
|
|
20
|
+
statusCallback?: (arg: string) => void;
|
|
20
21
|
}
|
|
21
22
|
export interface RenderArgsDeserializedWithFeatures extends RenderArgsDeserialized {
|
|
22
23
|
features: Map<string, Feature>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import FeatureRendererType from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType';
|
|
2
|
-
import { renderToAbstractCanvas } from '@jbrowse/core/util';
|
|
2
|
+
import { renderToAbstractCanvas, updateStatus } from '@jbrowse/core/util';
|
|
3
3
|
export default class WiggleBaseRenderer extends FeatureRendererType {
|
|
4
4
|
constructor() {
|
|
5
5
|
super(...arguments);
|
|
@@ -7,14 +7,14 @@ export default class WiggleBaseRenderer extends FeatureRendererType {
|
|
|
7
7
|
}
|
|
8
8
|
async render(renderProps) {
|
|
9
9
|
const features = await this.getFeatures(renderProps);
|
|
10
|
-
const { inverted, height, regions, bpPerPx } = renderProps;
|
|
10
|
+
const { inverted, height, regions, bpPerPx, statusCallback = () => { }, } = renderProps;
|
|
11
11
|
const region = regions[0];
|
|
12
12
|
const width = (region.end - region.start) / bpPerPx;
|
|
13
|
-
const { reducedFeatures, ...rest } = await renderToAbstractCanvas(width, height, renderProps, ctx => this.draw(ctx, {
|
|
13
|
+
const { reducedFeatures, ...rest } = await updateStatus('Rendering plot', statusCallback, () => renderToAbstractCanvas(width, height, renderProps, ctx => this.draw(ctx, {
|
|
14
14
|
...renderProps,
|
|
15
15
|
features,
|
|
16
16
|
inverted,
|
|
17
|
-
}));
|
|
17
|
+
})));
|
|
18
18
|
const results = await super.render({
|
|
19
19
|
...renderProps,
|
|
20
20
|
...rest,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
|
|
2
|
+
import type { GetScoreMatrixArgs } from './types';
|
|
3
|
+
export declare class MultiWiggleClusterScoreMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
|
|
4
|
+
name: string;
|
|
5
|
+
execute(args: GetScoreMatrixArgs, rpcDriverClassName: string): Promise<{
|
|
6
|
+
clusters: {
|
|
7
|
+
height: number;
|
|
8
|
+
indexes: number[];
|
|
9
|
+
} | undefined;
|
|
10
|
+
distances: number[][];
|
|
11
|
+
order: number[];
|
|
12
|
+
clustersGivenK: number[][][];
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
|
|
2
|
+
import { clusterData } from './cluster';
|
|
3
|
+
import { getScoreMatrix } from './getScoreMatrix';
|
|
4
|
+
export class MultiWiggleClusterScoreMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.name = 'MultiWiggleClusterScoreMatrix';
|
|
8
|
+
}
|
|
9
|
+
async execute(args, rpcDriverClassName) {
|
|
10
|
+
const deserializedArgs = await this.deserializeArguments(args, rpcDriverClassName);
|
|
11
|
+
const matrix = await getScoreMatrix({
|
|
12
|
+
pluginManager: this.pluginManager,
|
|
13
|
+
args: deserializedArgs,
|
|
14
|
+
});
|
|
15
|
+
return clusterData({
|
|
16
|
+
data: Object.values(matrix),
|
|
17
|
+
stopToken: deserializedArgs.stopToken,
|
|
18
|
+
onProgress: a => {
|
|
19
|
+
var _a;
|
|
20
|
+
(_a = deserializedArgs.statusCallback) === null || _a === void 0 ? void 0 : _a.call(deserializedArgs, `${toP(a * 100)}%`);
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function toP(n) {
|
|
26
|
+
return Number.parseFloat(n.toPrecision(3));
|
|
27
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
|
|
2
|
+
import type { GetScoreMatrixArgs } from './types';
|
|
3
|
+
export declare class MultiWiggleGetScoreMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
|
|
4
|
+
name: string;
|
|
5
|
+
execute(args: GetScoreMatrixArgs, rpcDriverClassName: string): Promise<Record<string, number[]>>;
|
|
6
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
|
|
2
|
+
import { getScoreMatrix } from './getScoreMatrix';
|
|
3
|
+
export class MultiWiggleGetScoreMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
|
|
4
|
+
constructor() {
|
|
5
|
+
super(...arguments);
|
|
6
|
+
this.name = 'MultiWiggleGetScoreMatrix';
|
|
7
|
+
}
|
|
8
|
+
async execute(args, rpcDriverClassName) {
|
|
9
|
+
const deserializedArgs = await this.deserializeArguments(args, rpcDriverClassName);
|
|
10
|
+
return getScoreMatrix({
|
|
11
|
+
args: deserializedArgs,
|
|
12
|
+
pluginManager: this.pluginManager,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare function euclideanDistance(a: number[], b: number[]): number;
|
|
2
|
+
export declare function averageDistance(setA: number[], setB: number[], distances: number[][]): number;
|
|
3
|
+
export declare function clusterData({ data, distance, linkage, onProgress, stopToken, }: {
|
|
4
|
+
data: number[][];
|
|
5
|
+
distance?: (a: number[], b: number[]) => number;
|
|
6
|
+
linkage?: (a: number[], b: number[], distances: number[][]) => number;
|
|
7
|
+
onProgress?: (a: number) => void;
|
|
8
|
+
stopToken?: string;
|
|
9
|
+
}): {
|
|
10
|
+
clusters: {
|
|
11
|
+
height: number;
|
|
12
|
+
indexes: number[];
|
|
13
|
+
} | undefined;
|
|
14
|
+
distances: number[][];
|
|
15
|
+
order: number[];
|
|
16
|
+
clustersGivenK: number[][][];
|
|
17
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { checkStopToken } from '@jbrowse/core/util/stopToken';
|
|
2
|
+
export function euclideanDistance(a, b) {
|
|
3
|
+
const size = Math.min(a.length, b.length);
|
|
4
|
+
let sum = 0;
|
|
5
|
+
for (let index = 0; index < size; index++) {
|
|
6
|
+
sum += (a[index] - b[index]) * (a[index] - b[index]);
|
|
7
|
+
}
|
|
8
|
+
return Math.sqrt(sum);
|
|
9
|
+
}
|
|
10
|
+
export function averageDistance(setA, setB, distances) {
|
|
11
|
+
let distance = 0;
|
|
12
|
+
for (const a of setA) {
|
|
13
|
+
for (const b of setB) {
|
|
14
|
+
distance += distances[a][b];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return distance / setA.length / setB.length;
|
|
18
|
+
}
|
|
19
|
+
function updateProgress(stepNumber, stepProgress, onProgress) {
|
|
20
|
+
onProgress(stepNumber / 2 + stepProgress / 2);
|
|
21
|
+
}
|
|
22
|
+
export function clusterData({ data, distance = euclideanDistance, linkage = averageDistance, onProgress, stopToken, }) {
|
|
23
|
+
const distances = data.map((datum, index) => {
|
|
24
|
+
if (onProgress) {
|
|
25
|
+
updateProgress(0, index / (data.length - 1), onProgress);
|
|
26
|
+
}
|
|
27
|
+
return data.map(otherDatum => distance(datum, otherDatum));
|
|
28
|
+
});
|
|
29
|
+
const clusters = data.map((_datum, index) => ({
|
|
30
|
+
height: 0,
|
|
31
|
+
indexes: [Number(index)],
|
|
32
|
+
}));
|
|
33
|
+
let clustersGivenK = [];
|
|
34
|
+
let start = performance.now();
|
|
35
|
+
for (let iteration = 0; iteration < data.length; iteration++) {
|
|
36
|
+
if (performance.now() - start > 2000) {
|
|
37
|
+
checkStopToken(stopToken);
|
|
38
|
+
start = performance.now();
|
|
39
|
+
}
|
|
40
|
+
if (onProgress) {
|
|
41
|
+
updateProgress(1, (iteration + 1) / data.length, onProgress);
|
|
42
|
+
}
|
|
43
|
+
clustersGivenK.push(clusters.map(cluster => cluster.indexes));
|
|
44
|
+
if (iteration >= data.length - 1) {
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
let nearestDistance = Infinity;
|
|
48
|
+
let nearestRow = 0;
|
|
49
|
+
let nearestCol = 0;
|
|
50
|
+
for (let row = 0; row < clusters.length; row++) {
|
|
51
|
+
for (let col = row + 1; col < clusters.length; col++) {
|
|
52
|
+
const distance = linkage(clusters[row].indexes, clusters[col].indexes, distances);
|
|
53
|
+
if (distance < nearestDistance) {
|
|
54
|
+
nearestDistance = distance;
|
|
55
|
+
nearestRow = row;
|
|
56
|
+
nearestCol = col;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const newCluster = {
|
|
61
|
+
indexes: [
|
|
62
|
+
...clusters[nearestRow].indexes,
|
|
63
|
+
...clusters[nearestCol].indexes,
|
|
64
|
+
],
|
|
65
|
+
height: nearestDistance,
|
|
66
|
+
children: [clusters[nearestRow], clusters[nearestCol]],
|
|
67
|
+
};
|
|
68
|
+
clusters.splice(Math.max(nearestRow, nearestCol), 1);
|
|
69
|
+
clusters.splice(Math.min(nearestRow, nearestCol), 1);
|
|
70
|
+
clusters.push(newCluster);
|
|
71
|
+
}
|
|
72
|
+
clustersGivenK = [[], ...clustersGivenK.reverse()];
|
|
73
|
+
return {
|
|
74
|
+
clusters: clusters[0],
|
|
75
|
+
distances: distances,
|
|
76
|
+
order: clusters[0].indexes,
|
|
77
|
+
clustersGivenK: clustersGivenK,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GetScoreMatrixArgs } from './types';
|
|
2
|
+
import type PluginManager from '@jbrowse/core/PluginManager';
|
|
3
|
+
export declare function getScoreMatrix({ pluginManager, args, }: {
|
|
4
|
+
args: GetScoreMatrixArgs;
|
|
5
|
+
pluginManager: PluginManager;
|
|
6
|
+
}): Promise<Record<string, number[]>>;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache';
|
|
2
|
+
import { groupBy } from '@jbrowse/core/util';
|
|
3
|
+
import { firstValueFrom, toArray } from 'rxjs';
|
|
4
|
+
export async function getScoreMatrix({ pluginManager, args, }) {
|
|
5
|
+
const { sources, regions, adapterConfig, sessionId, bpPerPx } = args;
|
|
6
|
+
const adapter = await getAdapter(pluginManager, sessionId, adapterConfig);
|
|
7
|
+
const dataAdapter = adapter.dataAdapter;
|
|
8
|
+
const r0 = regions[0];
|
|
9
|
+
const r0len = r0.end - r0.start;
|
|
10
|
+
const w = Math.floor(r0len / bpPerPx);
|
|
11
|
+
const feats = await firstValueFrom(dataAdapter.getFeatures(r0, args).pipe(toArray()));
|
|
12
|
+
const groups = groupBy(feats, f => f.get('source'));
|
|
13
|
+
const rows = {};
|
|
14
|
+
for (const source of sources) {
|
|
15
|
+
const { name } = source;
|
|
16
|
+
const features = groups[name] || [];
|
|
17
|
+
const arr = new Array(w).fill(0);
|
|
18
|
+
for (const feat of features) {
|
|
19
|
+
const fstart = feat.get('start');
|
|
20
|
+
const fend = feat.get('end');
|
|
21
|
+
const score = feat.get('score');
|
|
22
|
+
for (let i = fstart; i < fend; i += bpPerPx) {
|
|
23
|
+
const x = Math.floor((i - r0.start) / bpPerPx);
|
|
24
|
+
if (x >= 0 && x < w) {
|
|
25
|
+
arr[x] || (arr[x] = score);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
rows[name] = arr;
|
|
30
|
+
}
|
|
31
|
+
return rows;
|
|
32
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Source } from '../util';
|
|
2
|
+
import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
|
|
3
|
+
import type { Region } from '@jbrowse/core/util';
|
|
4
|
+
export interface GetScoreMatrixArgs {
|
|
5
|
+
adapterConfig: AnyConfigurationModel;
|
|
6
|
+
stopToken?: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
headers?: Record<string, string>;
|
|
9
|
+
regions: Region[];
|
|
10
|
+
bpPerPx: number;
|
|
11
|
+
sources: Source[];
|
|
12
|
+
statusCallback?: (arg: string) => void;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/drawDensity.d.ts
CHANGED
package/esm/drawDensity.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { readConfObject } from '@jbrowse/core/configuration';
|
|
2
2
|
import { featureSpanPx } from '@jbrowse/core/util';
|
|
3
|
+
import { checkStopToken } from '@jbrowse/core/util/stopToken';
|
|
3
4
|
import { fillRectCtx, getScale } from './util';
|
|
4
5
|
const fudgeFactor = 0.3;
|
|
5
6
|
const clipHeight = 2;
|
|
6
7
|
export function drawDensity(ctx, props) {
|
|
7
|
-
const { features, regions, bpPerPx, scaleOpts, height, config } = props;
|
|
8
|
+
const { stopToken, features, regions, bpPerPx, scaleOpts, height, config } = props;
|
|
8
9
|
const region = regions[0];
|
|
9
10
|
const pivot = readConfObject(config, 'bicolorPivot');
|
|
10
11
|
const pivotValue = readConfObject(config, 'bicolorPivotValue');
|
|
@@ -16,7 +17,7 @@ export function drawDensity(ctx, props) {
|
|
|
16
17
|
const scale = getScale({
|
|
17
18
|
...scaleOpts,
|
|
18
19
|
pivotValue: crossing ? pivotValue : undefined,
|
|
19
|
-
range: crossing ? [negColor, '
|
|
20
|
+
range: crossing ? [negColor, '#eee', posColor] : ['#eee', posColor],
|
|
20
21
|
});
|
|
21
22
|
const scale2 = getScale({ ...scaleOpts, range: [0, height] });
|
|
22
23
|
const cb = color === '#f0f'
|
|
@@ -28,7 +29,12 @@ export function drawDensity(ctx, props) {
|
|
|
28
29
|
let prevLeftPx = Number.NEGATIVE_INFINITY;
|
|
29
30
|
let hasClipping = false;
|
|
30
31
|
const reducedFeatures = [];
|
|
32
|
+
let start = performance.now();
|
|
31
33
|
for (const feature of features.values()) {
|
|
34
|
+
if (performance.now() - start > 400) {
|
|
35
|
+
checkStopToken(stopToken);
|
|
36
|
+
start = performance.now();
|
|
37
|
+
}
|
|
32
38
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
33
39
|
if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {
|
|
34
40
|
reducedFeatures.push(feature);
|
|
@@ -44,6 +50,10 @@ export function drawDensity(ctx, props) {
|
|
|
44
50
|
if (hasClipping) {
|
|
45
51
|
ctx.fillStyle = clipColor;
|
|
46
52
|
for (const feature of features.values()) {
|
|
53
|
+
if (performance.now() - start > 400) {
|
|
54
|
+
checkStopToken(stopToken);
|
|
55
|
+
start = performance.now();
|
|
56
|
+
}
|
|
47
57
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
48
58
|
const w = rightPx - leftPx + fudgeFactor;
|
|
49
59
|
const score = feature.get('score');
|
package/esm/drawLine.d.ts
CHANGED
package/esm/drawLine.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { readConfObject } from '@jbrowse/core/configuration';
|
|
2
2
|
import { clamp, featureSpanPx } from '@jbrowse/core/util';
|
|
3
|
+
import { checkStopToken } from '@jbrowse/core/util/stopToken';
|
|
3
4
|
import { getScale } from './util';
|
|
4
5
|
const fudgeFactor = 0.3;
|
|
5
6
|
const clipHeight = 2;
|
|
6
7
|
export function drawLine(ctx, props) {
|
|
7
|
-
const { features, regions, bpPerPx, scaleOpts, height: unadjustedHeight, ticks: { values }, displayCrossHatches, colorCallback, config, offset = 0, } = props;
|
|
8
|
+
const { features, regions, bpPerPx, scaleOpts, height: unadjustedHeight, ticks: { values }, displayCrossHatches, colorCallback, config, offset = 0, stopToken, } = props;
|
|
8
9
|
const region = regions[0];
|
|
9
10
|
const width = (region.end - region.start) / bpPerPx;
|
|
10
11
|
const height = unadjustedHeight - offset * 2;
|
|
@@ -17,7 +18,12 @@ export function drawLine(ctx, props) {
|
|
|
17
18
|
let lastVal;
|
|
18
19
|
let prevLeftPx = Number.NEGATIVE_INFINITY;
|
|
19
20
|
const reducedFeatures = [];
|
|
21
|
+
let start = performance.now();
|
|
20
22
|
for (const feature of features.values()) {
|
|
23
|
+
if (performance.now() - start > 400) {
|
|
24
|
+
checkStopToken(stopToken);
|
|
25
|
+
start = performance.now();
|
|
26
|
+
}
|
|
21
27
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
22
28
|
if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {
|
|
23
29
|
reducedFeatures.push(feature);
|
|
@@ -55,12 +61,12 @@ export function drawLine(ctx, props) {
|
|
|
55
61
|
if (displayCrossHatches) {
|
|
56
62
|
ctx.lineWidth = 1;
|
|
57
63
|
ctx.strokeStyle = 'rgba(200,200,200,0.5)';
|
|
58
|
-
|
|
64
|
+
for (const tick of values) {
|
|
59
65
|
ctx.beginPath();
|
|
60
66
|
ctx.moveTo(0, Math.round(toY(tick)));
|
|
61
67
|
ctx.lineTo(width, Math.round(toY(tick)));
|
|
62
68
|
ctx.stroke();
|
|
63
|
-
}
|
|
69
|
+
}
|
|
64
70
|
}
|
|
65
71
|
return { reducedFeatures };
|
|
66
72
|
}
|
package/esm/drawXY.js
CHANGED
|
@@ -6,17 +6,23 @@ import { fillRectCtx, getOrigin, getScale } from './util';
|
|
|
6
6
|
function lighten(color, amount) {
|
|
7
7
|
const hslColor = color.toHsl();
|
|
8
8
|
const l = hslColor.l * (1 + amount);
|
|
9
|
-
return colord({
|
|
9
|
+
return colord({
|
|
10
|
+
...hslColor,
|
|
11
|
+
l: clamp(l, 0, 100),
|
|
12
|
+
});
|
|
10
13
|
}
|
|
11
14
|
function darken(color, amount) {
|
|
12
15
|
const hslColor = color.toHsl();
|
|
13
16
|
const l = hslColor.l * (1 - amount);
|
|
14
|
-
return colord({
|
|
17
|
+
return colord({
|
|
18
|
+
...hslColor,
|
|
19
|
+
l: clamp(l, 0, 100),
|
|
20
|
+
});
|
|
15
21
|
}
|
|
16
22
|
const fudgeFactor = 0.3;
|
|
17
23
|
const clipHeight = 2;
|
|
18
24
|
export function drawXY(ctx, props) {
|
|
19
|
-
const { features, bpPerPx, regions, scaleOpts, height: unadjustedHeight, config, ticks, displayCrossHatches, offset = 0, colorCallback, inverted, } = props;
|
|
25
|
+
const { features, bpPerPx, regions, scaleOpts, height: unadjustedHeight, config, ticks, displayCrossHatches, offset = 0, colorCallback, inverted, stopToken, } = props;
|
|
20
26
|
const region = regions[0];
|
|
21
27
|
const width = (region.end - region.start) / bpPerPx;
|
|
22
28
|
const height = unadjustedHeight - offset * 2;
|
|
@@ -44,7 +50,7 @@ export function drawXY(ctx, props) {
|
|
|
44
50
|
start = performance.now();
|
|
45
51
|
for (const feature of features.values()) {
|
|
46
52
|
if (performance.now() - start > 400) {
|
|
47
|
-
checkStopToken();
|
|
53
|
+
checkStopToken(stopToken);
|
|
48
54
|
start = performance.now();
|
|
49
55
|
}
|
|
50
56
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
@@ -66,7 +72,7 @@ export function drawXY(ctx, props) {
|
|
|
66
72
|
start = performance.now();
|
|
67
73
|
for (const feature of features.values()) {
|
|
68
74
|
if (performance.now() - start > 400) {
|
|
69
|
-
checkStopToken();
|
|
75
|
+
checkStopToken(stopToken);
|
|
70
76
|
start = performance.now();
|
|
71
77
|
}
|
|
72
78
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
@@ -96,7 +102,7 @@ export function drawXY(ctx, props) {
|
|
|
96
102
|
start = performance.now();
|
|
97
103
|
for (const feature of features.values()) {
|
|
98
104
|
if (performance.now() - start > 400) {
|
|
99
|
-
checkStopToken();
|
|
105
|
+
checkStopToken(stopToken);
|
|
100
106
|
start = performance.now();
|
|
101
107
|
}
|
|
102
108
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
@@ -118,7 +124,7 @@ export function drawXY(ctx, props) {
|
|
|
118
124
|
start = performance.now();
|
|
119
125
|
for (const feature of features.values()) {
|
|
120
126
|
if (performance.now() - start > 400) {
|
|
121
|
-
checkStopToken();
|
|
127
|
+
checkStopToken(stopToken);
|
|
122
128
|
start = performance.now();
|
|
123
129
|
}
|
|
124
130
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
@@ -149,7 +155,7 @@ export function drawXY(ctx, props) {
|
|
|
149
155
|
start = performance.now();
|
|
150
156
|
for (const feature of features.values()) {
|
|
151
157
|
if (performance.now() - start > 400) {
|
|
152
|
-
checkStopToken();
|
|
158
|
+
checkStopToken(stopToken);
|
|
153
159
|
start = performance.now();
|
|
154
160
|
}
|
|
155
161
|
const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx);
|
|
@@ -167,12 +173,12 @@ export function drawXY(ctx, props) {
|
|
|
167
173
|
if (displayCrossHatches) {
|
|
168
174
|
ctx.lineWidth = 1;
|
|
169
175
|
ctx.strokeStyle = 'rgba(200,200,200,0.5)';
|
|
170
|
-
ticks.values
|
|
176
|
+
for (const tick of ticks.values) {
|
|
171
177
|
ctx.beginPath();
|
|
172
178
|
ctx.moveTo(0, Math.round(toY(tick)));
|
|
173
179
|
ctx.lineTo(width, Math.round(toY(tick)));
|
|
174
180
|
ctx.stroke();
|
|
175
|
-
}
|
|
181
|
+
}
|
|
176
182
|
}
|
|
177
183
|
return { reducedFeatures };
|
|
178
184
|
}
|
package/esm/index.js
CHANGED
|
@@ -16,7 +16,7 @@ import MultiWiggleAddTrackWorkflowF from './MultiWiggleAddTrackWorkflow';
|
|
|
16
16
|
import MultiXYPlotRendererF from './MultiXYPlotRenderer';
|
|
17
17
|
import QuantitativeTrackF from './QuantitativeTrack';
|
|
18
18
|
import WiggleBaseRenderer from './WiggleBaseRenderer';
|
|
19
|
-
import { MultiWiggleGetSources, WiggleGetGlobalQuantitativeStats, WiggleGetMultiRegionQuantitativeStats, } from './WiggleRPC/rpcMethods';
|
|
19
|
+
import { MultiWiggleClusterScoreMatrix, MultiWiggleGetScoreMatrix, MultiWiggleGetSources, WiggleGetGlobalQuantitativeStats, WiggleGetMultiRegionQuantitativeStats, } from './WiggleRPC/rpcMethods';
|
|
20
20
|
import XYPlotRendererF, { ReactComponent as XYPlotRendererReactComponent, XYPlotRenderer, configSchema as xyPlotRendererConfigSchema, } from './XYPlotRenderer';
|
|
21
21
|
import * as utils from './util';
|
|
22
22
|
export default class WigglePlugin extends Plugin {
|
|
@@ -54,6 +54,8 @@ export default class WigglePlugin extends Plugin {
|
|
|
54
54
|
pm.addRpcMethod(() => new WiggleGetGlobalQuantitativeStats(pm));
|
|
55
55
|
pm.addRpcMethod(() => new WiggleGetMultiRegionQuantitativeStats(pm));
|
|
56
56
|
pm.addRpcMethod(() => new MultiWiggleGetSources(pm));
|
|
57
|
+
pm.addRpcMethod(() => new MultiWiggleGetScoreMatrix(pm));
|
|
58
|
+
pm.addRpcMethod(() => new MultiWiggleClusterScoreMatrix(pm));
|
|
57
59
|
}
|
|
58
60
|
}
|
|
59
61
|
export * from './util';
|
|
@@ -252,11 +252,11 @@ export default function SharedWiggleMixin(configSchema: AnyConfigurationSchemaTy
|
|
|
252
252
|
setCrossHatches(cross: boolean): void;
|
|
253
253
|
} & {
|
|
254
254
|
readonly adapterTypeName: any;
|
|
255
|
-
readonly rendererTypeNameSimple:
|
|
255
|
+
readonly rendererTypeNameSimple: string;
|
|
256
256
|
readonly filters: undefined;
|
|
257
|
-
readonly scaleType:
|
|
258
|
-
readonly maxScore:
|
|
259
|
-
readonly minScore:
|
|
257
|
+
readonly scaleType: string;
|
|
258
|
+
readonly maxScore: number;
|
|
259
|
+
readonly minScore: number;
|
|
260
260
|
} & {
|
|
261
261
|
readonly adapterCapabilities: string[];
|
|
262
262
|
readonly rendererConfig: {
|
|
@@ -270,7 +270,7 @@ export default function SharedWiggleMixin(configSchema: AnyConfigurationSchemaTy
|
|
|
270
270
|
} & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
|
|
271
271
|
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
|
|
272
272
|
} & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
|
|
273
|
-
readonly autoscaleType:
|
|
273
|
+
readonly autoscaleType: string;
|
|
274
274
|
} & {
|
|
275
275
|
readonly domain: number[] | undefined;
|
|
276
276
|
} & {
|
|
@@ -283,9 +283,9 @@ export default function SharedWiggleMixin(configSchema: AnyConfigurationSchemaTy
|
|
|
283
283
|
scoreMin: number;
|
|
284
284
|
scoreMax: number;
|
|
285
285
|
} | undefined;
|
|
286
|
-
autoscaleType:
|
|
287
|
-
scaleType:
|
|
288
|
-
inverted:
|
|
286
|
+
autoscaleType: string;
|
|
287
|
+
scaleType: string;
|
|
288
|
+
inverted: boolean;
|
|
289
289
|
};
|
|
290
290
|
readonly canHaveFill: boolean;
|
|
291
291
|
readonly displayCrossHatchesSetting: boolean;
|
|
@@ -118,7 +118,7 @@ export default function SharedWiggleMixin(configSchema) {
|
|
|
118
118
|
},
|
|
119
119
|
get rendererTypeNameSimple() {
|
|
120
120
|
var _a;
|
|
121
|
-
return (_a = self.rendererTypeNameState) !== null && _a !== void 0 ? _a : getConf(self, 'defaultRendering');
|
|
121
|
+
return ((_a = self.rendererTypeNameState) !== null && _a !== void 0 ? _a : getConf(self, 'defaultRendering'));
|
|
122
122
|
},
|
|
123
123
|
get filters() {
|
|
124
124
|
return undefined;
|
|
@@ -189,12 +189,12 @@ export default function SharedWiggleMixin(configSchema) {
|
|
|
189
189
|
})
|
|
190
190
|
.views(self => ({
|
|
191
191
|
get filled() {
|
|
192
|
-
|
|
193
|
-
return fill !== null &&
|
|
192
|
+
var _a;
|
|
193
|
+
return ((_a = self.fill) !== null && _a !== void 0 ? _a : readConfObject(self.rendererConfig, 'filled'));
|
|
194
194
|
},
|
|
195
195
|
get summaryScoreModeSetting() {
|
|
196
|
-
|
|
197
|
-
return
|
|
196
|
+
var _a;
|
|
197
|
+
return ((_a = self.summaryScoreMode) !== null && _a !== void 0 ? _a : readConfObject(self.rendererConfig, 'summaryScoreMode'));
|
|
198
198
|
},
|
|
199
199
|
get scaleOpts() {
|
|
200
200
|
return {
|
|
@@ -209,8 +209,8 @@ export default function SharedWiggleMixin(configSchema) {
|
|
|
209
209
|
return self.rendererTypeName === 'XYPlotRenderer';
|
|
210
210
|
},
|
|
211
211
|
get displayCrossHatchesSetting() {
|
|
212
|
-
|
|
213
|
-
return
|
|
212
|
+
var _a;
|
|
213
|
+
return ((_a = self.displayCrossHatches) !== null && _a !== void 0 ? _a : readConfObject(self.rendererConfig, 'displayCrossHatches'));
|
|
214
214
|
},
|
|
215
215
|
get hasResolution() {
|
|
216
216
|
return self.adapterCapabilities.includes('hasResolution');
|
|
@@ -285,7 +285,10 @@ export default function SharedWiggleMixin(configSchema) {
|
|
|
285
285
|
onClick: () => {
|
|
286
286
|
getSession(self).queueDialog(handleClose => [
|
|
287
287
|
SetMinMaxDialog,
|
|
288
|
-
{
|
|
288
|
+
{
|
|
289
|
+
model: self,
|
|
290
|
+
handleClose,
|
|
291
|
+
},
|
|
289
292
|
]);
|
|
290
293
|
},
|
|
291
294
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-wiggle",
|
|
3
|
-
"version": "3.0
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "JBrowse 2 wiggle adapters, tracks, etc.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@gmod/bbi": "^6.0.0",
|
|
40
|
-
"@jbrowse/core": "^3.0
|
|
41
|
-
"@jbrowse/plugin-data-management": "^3.0
|
|
42
|
-
"@jbrowse/plugin-linear-genome-view": "^3.0
|
|
40
|
+
"@jbrowse/core": "^3.2.0",
|
|
41
|
+
"@jbrowse/plugin-data-management": "^3.2.0",
|
|
42
|
+
"@jbrowse/plugin-linear-genome-view": "^3.2.0",
|
|
43
43
|
"@mui/icons-material": "^6.0.0",
|
|
44
44
|
"@mui/material": "^6.0.0",
|
|
45
45
|
"@mui/x-charts-vendor": "^7.12.0",
|
|
@@ -62,5 +62,5 @@
|
|
|
62
62
|
"distModule": "esm/index.js",
|
|
63
63
|
"srcModule": "src/index.ts",
|
|
64
64
|
"module": "esm/index.js",
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "c750e3f56706a490c19ba75abd807fec5e38aebf"
|
|
66
66
|
}
|