@jbrowse/plugin-wiggle 3.1.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/dist/BigWigAdapter/BigWigAdapter.js +1 -1
  2. package/dist/LinearWiggleDisplay/model.d.ts +10 -10
  3. package/dist/MultiDensityRenderer/MultiDensityRenderer.js +2 -2
  4. package/dist/MultiLineRenderer/MultiLineRenderer.js +2 -2
  5. package/dist/MultiLinearWiggleDisplay/components/SourcesGrid.js +4 -4
  6. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialog.d.ts +6 -0
  7. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialog.js +29 -0
  8. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogAuto.d.ts +7 -0
  9. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogAuto.js +79 -0
  10. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogManual.d.ts +7 -0
  11. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogManual.js +145 -0
  12. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/types.d.ts +7 -0
  13. package/dist/MultiLinearWiggleDisplay/components/WiggleClusterDialog/types.js +2 -0
  14. package/dist/MultiLinearWiggleDisplay/components/util.d.ts +3 -2
  15. package/dist/MultiLinearWiggleDisplay/model.d.ts +15 -9
  16. package/dist/MultiLinearWiggleDisplay/model.js +29 -15
  17. package/dist/MultiRowLineRenderer/MultiRowLineRenderer.js +2 -2
  18. package/dist/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +2 -2
  19. package/dist/MultiXYPlotRenderer/MultiXYPlotRenderer.js +3 -3
  20. package/dist/WiggleBaseRenderer.d.ts +1 -0
  21. package/dist/WiggleBaseRenderer.js +4 -4
  22. package/dist/WiggleRPC/MultiWiggleClusterScoreMatrix.d.ts +14 -0
  23. package/dist/WiggleRPC/MultiWiggleClusterScoreMatrix.js +31 -0
  24. package/dist/WiggleRPC/MultiWiggleGetScoreMatrix.d.ts +2 -13
  25. package/dist/WiggleRPC/MultiWiggleGetScoreMatrix.js +5 -37
  26. package/dist/WiggleRPC/getScoreMatrix.d.ts +6 -0
  27. package/dist/WiggleRPC/getScoreMatrix.js +35 -0
  28. package/dist/WiggleRPC/rpcMethods.d.ts +1 -0
  29. package/dist/WiggleRPC/rpcMethods.js +1 -0
  30. package/dist/WiggleRPC/type.d.ts +0 -0
  31. package/dist/WiggleRPC/type.js +1 -0
  32. package/dist/WiggleRPC/types.d.ts +13 -0
  33. package/dist/WiggleRPC/types.js +2 -0
  34. package/dist/drawDensity.d.ts +1 -0
  35. package/dist/drawDensity.js +12 -2
  36. package/dist/drawLine.d.ts +1 -0
  37. package/dist/drawLine.js +9 -3
  38. package/dist/drawXY.js +8 -8
  39. package/dist/index.js +1 -0
  40. package/dist/shared/SharedWiggleMixin.d.ts +8 -8
  41. package/dist/shared/SharedWiggleMixin.js +11 -8
  42. package/esm/BigWigAdapter/BigWigAdapter.js +1 -1
  43. package/esm/LinearWiggleDisplay/model.d.ts +10 -10
  44. package/esm/MultiDensityRenderer/MultiDensityRenderer.js +3 -3
  45. package/esm/MultiLineRenderer/MultiLineRenderer.js +3 -3
  46. package/esm/MultiLinearWiggleDisplay/components/SourcesGrid.js +4 -4
  47. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialog.d.ts +6 -0
  48. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialog.js +24 -0
  49. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogAuto.d.ts +7 -0
  50. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogAuto.js +77 -0
  51. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogManual.d.ts +7 -0
  52. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/WiggleClusterDialogManual.js +140 -0
  53. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/types.d.ts +7 -0
  54. package/esm/MultiLinearWiggleDisplay/components/WiggleClusterDialog/types.js +1 -0
  55. package/esm/MultiLinearWiggleDisplay/components/util.d.ts +3 -2
  56. package/esm/MultiLinearWiggleDisplay/model.d.ts +15 -9
  57. package/esm/MultiLinearWiggleDisplay/model.js +29 -15
  58. package/esm/MultiRowLineRenderer/MultiRowLineRenderer.js +3 -3
  59. package/esm/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.js +3 -3
  60. package/esm/MultiXYPlotRenderer/MultiXYPlotRenderer.js +4 -4
  61. package/esm/WiggleBaseRenderer.d.ts +1 -0
  62. package/esm/WiggleBaseRenderer.js +5 -5
  63. package/esm/WiggleRPC/MultiWiggleClusterScoreMatrix.d.ts +14 -0
  64. package/esm/WiggleRPC/MultiWiggleClusterScoreMatrix.js +24 -0
  65. package/esm/WiggleRPC/MultiWiggleGetScoreMatrix.d.ts +2 -13
  66. package/esm/WiggleRPC/MultiWiggleGetScoreMatrix.js +5 -37
  67. package/esm/WiggleRPC/getScoreMatrix.d.ts +6 -0
  68. package/esm/WiggleRPC/getScoreMatrix.js +32 -0
  69. package/esm/WiggleRPC/rpcMethods.d.ts +1 -0
  70. package/esm/WiggleRPC/rpcMethods.js +1 -0
  71. package/esm/WiggleRPC/type.d.ts +0 -0
  72. package/esm/WiggleRPC/type.js +1 -0
  73. package/esm/WiggleRPC/types.d.ts +13 -0
  74. package/esm/WiggleRPC/types.js +1 -0
  75. package/esm/drawDensity.d.ts +1 -0
  76. package/esm/drawDensity.js +12 -2
  77. package/esm/drawLine.d.ts +1 -0
  78. package/esm/drawLine.js +9 -3
  79. package/esm/drawXY.js +8 -8
  80. package/esm/index.js +2 -1
  81. package/esm/shared/SharedWiggleMixin.d.ts +8 -8
  82. package/esm/shared/SharedWiggleMixin.js +11 -8
  83. package/package.json +9 -9
  84. package/dist/MultiLinearWiggleDisplay/components/ClusterDialog.d.ts +0 -11
  85. package/dist/MultiLinearWiggleDisplay/components/ClusterDialog.js +0 -115
  86. package/esm/MultiLinearWiggleDisplay/components/ClusterDialog.d.ts +0 -11
  87. package/esm/MultiLinearWiggleDisplay/components/ClusterDialog.js +0 -109
@@ -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>;
@@ -12,14 +12,14 @@ class WiggleBaseRenderer extends FeatureRendererType_1.default {
12
12
  }
13
13
  async render(renderProps) {
14
14
  const features = await this.getFeatures(renderProps);
15
- const { inverted, height, regions, bpPerPx } = renderProps;
15
+ const { inverted, height, regions, bpPerPx, statusCallback = () => { }, } = renderProps;
16
16
  const region = regions[0];
17
17
  const width = (region.end - region.start) / bpPerPx;
18
- const { reducedFeatures, ...rest } = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => this.draw(ctx, {
18
+ const { reducedFeatures, ...rest } = await (0, util_1.updateStatus)('Rendering plot', statusCallback, () => (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => this.draw(ctx, {
19
19
  ...renderProps,
20
20
  features,
21
21
  inverted,
22
- }));
22
+ })));
23
23
  const results = await super.render({
24
24
  ...renderProps,
25
25
  ...rest,
@@ -31,7 +31,7 @@ class WiggleBaseRenderer extends FeatureRendererType_1.default {
31
31
  ...results,
32
32
  ...rest,
33
33
  features: reducedFeatures
34
- ? new Map(reducedFeatures.map((r) => [r.id(), r]))
34
+ ? new Map(reducedFeatures.map(r => [r.id(), r]))
35
35
  : results.features,
36
36
  height,
37
37
  width,
@@ -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,31 @@
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.MultiWiggleClusterScoreMatrix = void 0;
7
+ const RpcMethodTypeWithFiltersAndRenameRegions_1 = __importDefault(require("@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions"));
8
+ const cluster_1 = require("@jbrowse/core/util/cluster");
9
+ const getScoreMatrix_1 = require("./getScoreMatrix");
10
+ class MultiWiggleClusterScoreMatrix extends RpcMethodTypeWithFiltersAndRenameRegions_1.default {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.name = 'MultiWiggleClusterScoreMatrix';
14
+ }
15
+ async execute(args, rpcDriverClassName) {
16
+ const deserializedArgs = await this.deserializeArguments(args, rpcDriverClassName);
17
+ const matrix = await (0, getScoreMatrix_1.getScoreMatrix)({
18
+ pluginManager: this.pluginManager,
19
+ args: deserializedArgs,
20
+ });
21
+ return (0, cluster_1.clusterData)({
22
+ data: Object.values(matrix),
23
+ stopToken: deserializedArgs.stopToken,
24
+ onProgress: a => {
25
+ var _a;
26
+ (_a = deserializedArgs.statusCallback) === null || _a === void 0 ? void 0 : _a.call(deserializedArgs, a);
27
+ },
28
+ });
29
+ }
30
+ }
31
+ exports.MultiWiggleClusterScoreMatrix = MultiWiggleClusterScoreMatrix;
@@ -1,17 +1,6 @@
1
1
  import RpcMethodTypeWithFiltersAndRenameRegions from '@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions';
2
- import { type Region } from '@jbrowse/core/util';
3
- import type { AnyConfigurationModel } from '@jbrowse/core/configuration';
2
+ import type { GetScoreMatrixArgs } from './types';
4
3
  export declare class MultiWiggleGetScoreMatrix extends RpcMethodTypeWithFiltersAndRenameRegions {
5
4
  name: string;
6
- execute(args: {
7
- adapterConfig: AnyConfigurationModel;
8
- stopToken?: string;
9
- sessionId: string;
10
- headers?: Record<string, string>;
11
- regions: Region[];
12
- bpPerPx: number;
13
- }, rpcDriverClassName: string): Promise<Record<string, {
14
- name: string;
15
- scores: string[];
16
- }>>;
5
+ execute(args: GetScoreMatrixArgs, rpcDriverClassName: string): Promise<Record<string, number[]>>;
17
6
  }
@@ -4,51 +4,19 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.MultiWiggleGetScoreMatrix = void 0;
7
- const dataAdapterCache_1 = require("@jbrowse/core/data_adapters/dataAdapterCache");
8
7
  const RpcMethodTypeWithFiltersAndRenameRegions_1 = __importDefault(require("@jbrowse/core/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions"));
9
- const util_1 = require("@jbrowse/core/util");
10
- const rxjs_1 = require("rxjs");
8
+ const getScoreMatrix_1 = require("./getScoreMatrix");
11
9
  class MultiWiggleGetScoreMatrix extends RpcMethodTypeWithFiltersAndRenameRegions_1.default {
12
10
  constructor() {
13
11
  super(...arguments);
14
12
  this.name = 'MultiWiggleGetScoreMatrix';
15
13
  }
16
14
  async execute(args, rpcDriverClassName) {
17
- var _a, _b;
18
- const pm = this.pluginManager;
19
15
  const deserializedArgs = await this.deserializeArguments(args, rpcDriverClassName);
20
- const { sources, regions, adapterConfig, sessionId, bpPerPx } = deserializedArgs;
21
- const adapter = await (0, dataAdapterCache_1.getAdapter)(pm, sessionId, adapterConfig);
22
- const dataAdapter = adapter.dataAdapter;
23
- const resolution = 2;
24
- const bpScale = bpPerPx / resolution;
25
- const r0 = regions[0];
26
- const r0len = r0.end - r0.start;
27
- const w = Math.floor(r0len / bpScale);
28
- const feats = await (0, rxjs_1.firstValueFrom)(dataAdapter.getFeatures(r0, deserializedArgs).pipe((0, rxjs_1.toArray)()));
29
- const groups = (0, util_1.groupBy)(feats, f => f.get('source'));
30
- const rows = {};
31
- for (const source of sources) {
32
- const { name } = source;
33
- const features = groups[name] || [];
34
- for (const feat of features) {
35
- if (!rows[name]) {
36
- rows[name] = {
37
- name,
38
- scores: new Array(w),
39
- };
40
- }
41
- const fstart = feat.get('start');
42
- const fend = feat.get('end');
43
- const score = feat.get('score');
44
- for (let i = fstart; i < fend; i += bpScale) {
45
- if (i > r0.start && i < r0.end) {
46
- (_a = rows[name].scores)[_b = Math.floor((i - r0.start) / bpScale)] || (_a[_b] = score);
47
- }
48
- }
49
- }
50
- }
51
- return rows;
16
+ return (0, getScoreMatrix_1.getScoreMatrix)({
17
+ args: deserializedArgs,
18
+ pluginManager: this.pluginManager,
19
+ });
52
20
  }
53
21
  }
54
22
  exports.MultiWiggleGetScoreMatrix = MultiWiggleGetScoreMatrix;
@@ -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,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getScoreMatrix = getScoreMatrix;
4
+ const dataAdapterCache_1 = require("@jbrowse/core/data_adapters/dataAdapterCache");
5
+ const util_1 = require("@jbrowse/core/util");
6
+ const rxjs_1 = require("rxjs");
7
+ async function getScoreMatrix({ pluginManager, args, }) {
8
+ const { sources, regions, adapterConfig, sessionId, bpPerPx } = args;
9
+ const adapter = await (0, dataAdapterCache_1.getAdapter)(pluginManager, sessionId, adapterConfig);
10
+ const dataAdapter = adapter.dataAdapter;
11
+ const r0 = regions[0];
12
+ const r0len = r0.end - r0.start;
13
+ const w = Math.floor(r0len / bpPerPx);
14
+ const feats = await (0, rxjs_1.firstValueFrom)(dataAdapter.getFeatures(r0, args).pipe((0, rxjs_1.toArray)()));
15
+ const groups = (0, util_1.groupBy)(feats, f => f.get('source'));
16
+ const rows = {};
17
+ for (const source of sources) {
18
+ const { name } = source;
19
+ const features = groups[name] || [];
20
+ const arr = new Array(w).fill(0);
21
+ for (const feat of features) {
22
+ const fstart = feat.get('start');
23
+ const fend = feat.get('end');
24
+ const score = feat.get('score');
25
+ for (let i = fstart; i < fend; i += bpPerPx) {
26
+ const x = Math.floor((i - r0.start) / bpPerPx);
27
+ if (x >= 0 && x < w) {
28
+ arr[x] || (arr[x] = score);
29
+ }
30
+ }
31
+ }
32
+ rows[name] = arr;
33
+ }
34
+ return rows;
35
+ }
@@ -2,3 +2,4 @@ export * from './MultiWiggleGetSources';
2
2
  export * from './WiggleGetMultiRegionQuantitativeStats';
3
3
  export * from './WiggleGetGlobalQuantitativeStats';
4
4
  export * from './MultiWiggleGetScoreMatrix';
5
+ export * from './MultiWiggleClusterScoreMatrix';
@@ -18,3 +18,4 @@ __exportStar(require("./MultiWiggleGetSources"), exports);
18
18
  __exportStar(require("./WiggleGetMultiRegionQuantitativeStats"), exports);
19
19
  __exportStar(require("./WiggleGetGlobalQuantitativeStats"), exports);
20
20
  __exportStar(require("./MultiWiggleGetScoreMatrix"), exports);
21
+ __exportStar(require("./MultiWiggleClusterScoreMatrix"), exports);
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,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -12,6 +12,7 @@ export declare function drawDensity(ctx: CanvasRenderingContext2D, props: {
12
12
  };
13
13
  displayCrossHatches: boolean;
14
14
  config: AnyConfigurationModel;
15
+ stopToken?: string;
15
16
  }): {
16
17
  reducedFeatures: Feature[];
17
18
  };
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.drawDensity = drawDensity;
4
4
  const configuration_1 = require("@jbrowse/core/configuration");
5
5
  const util_1 = require("@jbrowse/core/util");
6
+ const stopToken_1 = require("@jbrowse/core/util/stopToken");
6
7
  const util_2 = require("./util");
7
8
  const fudgeFactor = 0.3;
8
9
  const clipHeight = 2;
9
10
  function drawDensity(ctx, props) {
10
- const { features, regions, bpPerPx, scaleOpts, height, config } = props;
11
+ const { stopToken, features, regions, bpPerPx, scaleOpts, height, config } = props;
11
12
  const region = regions[0];
12
13
  const pivot = (0, configuration_1.readConfObject)(config, 'bicolorPivot');
13
14
  const pivotValue = (0, configuration_1.readConfObject)(config, 'bicolorPivotValue');
@@ -19,7 +20,7 @@ function drawDensity(ctx, props) {
19
20
  const scale = (0, util_2.getScale)({
20
21
  ...scaleOpts,
21
22
  pivotValue: crossing ? pivotValue : undefined,
22
- range: crossing ? [negColor, 'white', posColor] : ['white', posColor],
23
+ range: crossing ? [negColor, '#eee', posColor] : ['#eee', posColor],
23
24
  });
24
25
  const scale2 = (0, util_2.getScale)({ ...scaleOpts, range: [0, height] });
25
26
  const cb = color === '#f0f'
@@ -31,7 +32,12 @@ function drawDensity(ctx, props) {
31
32
  let prevLeftPx = Number.NEGATIVE_INFINITY;
32
33
  let hasClipping = false;
33
34
  const reducedFeatures = [];
35
+ let start = performance.now();
34
36
  for (const feature of features.values()) {
37
+ if (performance.now() - start > 400) {
38
+ (0, stopToken_1.checkStopToken)(stopToken);
39
+ start = performance.now();
40
+ }
35
41
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
36
42
  if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {
37
43
  reducedFeatures.push(feature);
@@ -47,6 +53,10 @@ function drawDensity(ctx, props) {
47
53
  if (hasClipping) {
48
54
  ctx.fillStyle = clipColor;
49
55
  for (const feature of features.values()) {
56
+ if (performance.now() - start > 400) {
57
+ (0, stopToken_1.checkStopToken)(stopToken);
58
+ start = performance.now();
59
+ }
50
60
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
51
61
  const w = rightPx - leftPx + fudgeFactor;
52
62
  const score = feature.get('score');
@@ -14,6 +14,7 @@ export declare function drawLine(ctx: CanvasRenderingContext2D, props: {
14
14
  colorCallback: (f: Feature, score: number) => string;
15
15
  config: AnyConfigurationModel;
16
16
  offset?: number;
17
+ stopToken?: string;
17
18
  }): {
18
19
  reducedFeatures: Feature[];
19
20
  };
package/dist/drawLine.js CHANGED
@@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.drawLine = drawLine;
4
4
  const configuration_1 = require("@jbrowse/core/configuration");
5
5
  const util_1 = require("@jbrowse/core/util");
6
+ const stopToken_1 = require("@jbrowse/core/util/stopToken");
6
7
  const util_2 = require("./util");
7
8
  const fudgeFactor = 0.3;
8
9
  const clipHeight = 2;
9
10
  function drawLine(ctx, props) {
10
- const { features, regions, bpPerPx, scaleOpts, height: unadjustedHeight, ticks: { values }, displayCrossHatches, colorCallback, config, offset = 0, } = props;
11
+ const { features, regions, bpPerPx, scaleOpts, height: unadjustedHeight, ticks: { values }, displayCrossHatches, colorCallback, config, offset = 0, stopToken, } = props;
11
12
  const region = regions[0];
12
13
  const width = (region.end - region.start) / bpPerPx;
13
14
  const height = unadjustedHeight - offset * 2;
@@ -20,7 +21,12 @@ function drawLine(ctx, props) {
20
21
  let lastVal;
21
22
  let prevLeftPx = Number.NEGATIVE_INFINITY;
22
23
  const reducedFeatures = [];
24
+ let start = performance.now();
23
25
  for (const feature of features.values()) {
26
+ if (performance.now() - start > 400) {
27
+ (0, stopToken_1.checkStopToken)(stopToken);
28
+ start = performance.now();
29
+ }
24
30
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
25
31
  if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {
26
32
  reducedFeatures.push(feature);
@@ -58,12 +64,12 @@ function drawLine(ctx, props) {
58
64
  if (displayCrossHatches) {
59
65
  ctx.lineWidth = 1;
60
66
  ctx.strokeStyle = 'rgba(200,200,200,0.5)';
61
- values.forEach(tick => {
67
+ for (const tick of values) {
62
68
  ctx.beginPath();
63
69
  ctx.moveTo(0, Math.round(toY(tick)));
64
70
  ctx.lineTo(width, Math.round(toY(tick)));
65
71
  ctx.stroke();
66
- });
72
+ }
67
73
  }
68
74
  return { reducedFeatures };
69
75
  }
package/dist/drawXY.js CHANGED
@@ -25,7 +25,7 @@ function darken(color, amount) {
25
25
  const fudgeFactor = 0.3;
26
26
  const clipHeight = 2;
27
27
  function drawXY(ctx, props) {
28
- const { features, bpPerPx, regions, scaleOpts, height: unadjustedHeight, config, ticks, displayCrossHatches, offset = 0, colorCallback, inverted, } = props;
28
+ const { features, bpPerPx, regions, scaleOpts, height: unadjustedHeight, config, ticks, displayCrossHatches, offset = 0, colorCallback, inverted, stopToken, } = props;
29
29
  const region = regions[0];
30
30
  const width = (region.end - region.start) / bpPerPx;
31
31
  const height = unadjustedHeight - offset * 2;
@@ -53,7 +53,7 @@ function drawXY(ctx, props) {
53
53
  start = performance.now();
54
54
  for (const feature of features.values()) {
55
55
  if (performance.now() - start > 400) {
56
- (0, stopToken_1.checkStopToken)();
56
+ (0, stopToken_1.checkStopToken)(stopToken);
57
57
  start = performance.now();
58
58
  }
59
59
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
@@ -75,7 +75,7 @@ function drawXY(ctx, props) {
75
75
  start = performance.now();
76
76
  for (const feature of features.values()) {
77
77
  if (performance.now() - start > 400) {
78
- (0, stopToken_1.checkStopToken)();
78
+ (0, stopToken_1.checkStopToken)(stopToken);
79
79
  start = performance.now();
80
80
  }
81
81
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
@@ -105,7 +105,7 @@ function drawXY(ctx, props) {
105
105
  start = performance.now();
106
106
  for (const feature of features.values()) {
107
107
  if (performance.now() - start > 400) {
108
- (0, stopToken_1.checkStopToken)();
108
+ (0, stopToken_1.checkStopToken)(stopToken);
109
109
  start = performance.now();
110
110
  }
111
111
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
@@ -127,7 +127,7 @@ function drawXY(ctx, props) {
127
127
  start = performance.now();
128
128
  for (const feature of features.values()) {
129
129
  if (performance.now() - start > 400) {
130
- (0, stopToken_1.checkStopToken)();
130
+ (0, stopToken_1.checkStopToken)(stopToken);
131
131
  start = performance.now();
132
132
  }
133
133
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
@@ -158,7 +158,7 @@ function drawXY(ctx, props) {
158
158
  start = performance.now();
159
159
  for (const feature of features.values()) {
160
160
  if (performance.now() - start > 400) {
161
- (0, stopToken_1.checkStopToken)();
161
+ (0, stopToken_1.checkStopToken)(stopToken);
162
162
  start = performance.now();
163
163
  }
164
164
  const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
@@ -176,12 +176,12 @@ function drawXY(ctx, props) {
176
176
  if (displayCrossHatches) {
177
177
  ctx.lineWidth = 1;
178
178
  ctx.strokeStyle = 'rgba(200,200,200,0.5)';
179
- ticks.values.forEach(tick => {
179
+ for (const tick of ticks.values) {
180
180
  ctx.beginPath();
181
181
  ctx.moveTo(0, Math.round(toY(tick)));
182
182
  ctx.lineTo(width, Math.round(toY(tick)));
183
183
  ctx.stroke();
184
- });
184
+ }
185
185
  }
186
186
  return { reducedFeatures };
187
187
  }
package/dist/index.js CHANGED
@@ -97,6 +97,7 @@ class WigglePlugin extends Plugin_1.default {
97
97
  pm.addRpcMethod(() => new rpcMethods_1.WiggleGetMultiRegionQuantitativeStats(pm));
98
98
  pm.addRpcMethod(() => new rpcMethods_1.MultiWiggleGetSources(pm));
99
99
  pm.addRpcMethod(() => new rpcMethods_1.MultiWiggleGetScoreMatrix(pm));
100
+ pm.addRpcMethod(() => new rpcMethods_1.MultiWiggleClusterScoreMatrix(pm));
100
101
  }
101
102
  }
102
103
  exports.default = WigglePlugin;
@@ -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: any;
255
+ readonly rendererTypeNameSimple: string;
256
256
  readonly filters: undefined;
257
- readonly scaleType: any;
258
- readonly maxScore: any;
259
- readonly minScore: any;
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: any;
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: any;
287
- scaleType: any;
288
- inverted: any;
286
+ autoscaleType: string;
287
+ scaleType: string;
288
+ inverted: boolean;
289
289
  };
290
290
  readonly canHaveFill: boolean;
291
291
  readonly displayCrossHatchesSetting: boolean;
@@ -154,7 +154,7 @@ function SharedWiggleMixin(configSchema) {
154
154
  },
155
155
  get rendererTypeNameSimple() {
156
156
  var _a;
157
- return (_a = self.rendererTypeNameState) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)(self, 'defaultRendering');
157
+ return ((_a = self.rendererTypeNameState) !== null && _a !== void 0 ? _a : (0, configuration_1.getConf)(self, 'defaultRendering'));
158
158
  },
159
159
  get filters() {
160
160
  return undefined;
@@ -225,12 +225,12 @@ function SharedWiggleMixin(configSchema) {
225
225
  })
226
226
  .views(self => ({
227
227
  get filled() {
228
- const { fill, rendererConfig } = self;
229
- return fill !== null && fill !== void 0 ? fill : (0, configuration_1.readConfObject)(rendererConfig, 'filled');
228
+ var _a;
229
+ return ((_a = self.fill) !== null && _a !== void 0 ? _a : (0, configuration_1.readConfObject)(self.rendererConfig, 'filled'));
230
230
  },
231
231
  get summaryScoreModeSetting() {
232
- const { summaryScoreMode: mode, rendererConfig } = self;
233
- return mode !== null && mode !== void 0 ? mode : (0, configuration_1.readConfObject)(rendererConfig, 'summaryScoreMode');
232
+ var _a;
233
+ return ((_a = self.summaryScoreMode) !== null && _a !== void 0 ? _a : (0, configuration_1.readConfObject)(self.rendererConfig, 'summaryScoreMode'));
234
234
  },
235
235
  get scaleOpts() {
236
236
  return {
@@ -245,8 +245,8 @@ function SharedWiggleMixin(configSchema) {
245
245
  return self.rendererTypeName === 'XYPlotRenderer';
246
246
  },
247
247
  get displayCrossHatchesSetting() {
248
- const { displayCrossHatches: hatches, rendererConfig } = self;
249
- return hatches !== null && hatches !== void 0 ? hatches : (0, configuration_1.readConfObject)(rendererConfig, 'displayCrossHatches');
248
+ var _a;
249
+ return ((_a = self.displayCrossHatches) !== null && _a !== void 0 ? _a : (0, configuration_1.readConfObject)(self.rendererConfig, 'displayCrossHatches'));
250
250
  },
251
251
  get hasResolution() {
252
252
  return self.adapterCapabilities.includes('hasResolution');
@@ -321,7 +321,10 @@ function SharedWiggleMixin(configSchema) {
321
321
  onClick: () => {
322
322
  (0, util_1.getSession)(self).queueDialog(handleClose => [
323
323
  SetMinMaxDialog,
324
- { model: self, handleClose },
324
+ {
325
+ model: self,
326
+ handleClose,
327
+ },
325
328
  ]);
326
329
  },
327
330
  },
@@ -40,7 +40,7 @@ class BigWigAdapter extends BaseFeatureDataAdapter {
40
40
  }
41
41
  getFeatures(region, opts = {}) {
42
42
  const { refName, start, end } = region;
43
- const { bpPerPx = 0, stopToken, resolution = 1, statusCallback = () => { }, } = opts;
43
+ const { bpPerPx = 0, resolution = 1, stopToken, statusCallback = () => { }, } = opts;
44
44
  return ObservableCreate(async (observer) => {
45
45
  const source = this.getConf('source');
46
46
  const resolutionMultiplier = this.getConf('resolutionMultiplier');
@@ -258,11 +258,11 @@ declare function stateModelFactory(pluginManager: PluginManager, configSchema: A
258
258
  setCrossHatches(cross: boolean): void;
259
259
  } & {
260
260
  readonly adapterTypeName: any;
261
- readonly rendererTypeNameSimple: any;
261
+ readonly rendererTypeNameSimple: string;
262
262
  readonly filters: undefined;
263
- readonly scaleType: any;
264
- readonly maxScore: any;
265
- readonly minScore: any;
263
+ readonly scaleType: string;
264
+ readonly maxScore: number;
265
+ readonly minScore: number;
266
266
  } & {
267
267
  readonly adapterCapabilities: string[];
268
268
  readonly rendererConfig: {
@@ -276,7 +276,7 @@ declare function stateModelFactory(pluginManager: PluginManager, configSchema: A
276
276
  } & import("mobx-state-tree/dist/internal").NonEmptyObject & any & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
277
277
  } & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>);
278
278
  } & import("mobx-state-tree").IStateTreeNode<AnyConfigurationSchemaType>;
279
- readonly autoscaleType: any;
279
+ readonly autoscaleType: string;
280
280
  } & {
281
281
  readonly domain: number[] | undefined;
282
282
  } & {
@@ -289,9 +289,9 @@ declare function stateModelFactory(pluginManager: PluginManager, configSchema: A
289
289
  scoreMin: number;
290
290
  scoreMax: number;
291
291
  } | undefined;
292
- autoscaleType: any;
293
- scaleType: any;
294
- inverted: any;
292
+ autoscaleType: string;
293
+ scaleType: string;
294
+ inverted: boolean;
295
295
  };
296
296
  readonly canHaveFill: boolean;
297
297
  readonly displayCrossHatchesSetting: boolean;
@@ -328,7 +328,7 @@ declare function stateModelFactory(pluginManager: PluginManager, configSchema: A
328
328
  readonly rendererTypeName: string;
329
329
  readonly quantitativeStatsRelevantToCurrentZoom: boolean;
330
330
  readonly graphType: boolean;
331
- readonly inverted: any;
331
+ readonly inverted: boolean;
332
332
  } & {
333
333
  adapterProps(): any;
334
334
  readonly ticks: {
@@ -374,7 +374,7 @@ declare function stateModelFactory(pluginManager: PluginManager, configSchema: A
374
374
  } | {
375
375
  label: string;
376
376
  type: string;
377
- checked: any;
377
+ checked: boolean;
378
378
  onClick: () => void;
379
379
  icon?: undefined;
380
380
  subMenu?: undefined;
@@ -1,14 +1,14 @@
1
- import { groupBy } from '@jbrowse/core/util';
1
+ import { forEachWithStopTokenCheck, groupBy } from '@jbrowse/core/util';
2
2
  import WiggleBaseRenderer from '../WiggleBaseRenderer';
3
3
  export default class MultiDensityPlotRenderer extends WiggleBaseRenderer {
4
4
  async draw(ctx, props) {
5
- const { sources, features } = props;
5
+ const { stopToken, sources, features } = props;
6
6
  const groups = groupBy(features.values(), f => f.get('source'));
7
7
  const height = props.height / sources.length;
8
8
  let feats = [];
9
9
  const { drawDensity } = await import('../drawDensity');
10
10
  ctx.save();
11
- sources.forEach(source => {
11
+ forEachWithStopTokenCheck(sources, stopToken, source => {
12
12
  const features = groups[source.name] || [];
13
13
  const { reducedFeatures } = drawDensity(ctx, {
14
14
  ...props,
@@ -1,12 +1,12 @@
1
- import { groupBy } from '@jbrowse/core/util';
1
+ import { forEachWithStopTokenCheck, groupBy } from '@jbrowse/core/util';
2
2
  import WiggleBaseRenderer from '../WiggleBaseRenderer';
3
3
  export default class MultiLineRenderer extends WiggleBaseRenderer {
4
4
  async draw(ctx, props) {
5
- const { sources, features } = props;
5
+ const { stopToken, sources, features } = props;
6
6
  const groups = groupBy(features.values(), f => f.get('source'));
7
7
  const { drawLine } = await import('../drawLine');
8
8
  let feats = [];
9
- sources.forEach(source => {
9
+ forEachWithStopTokenCheck(sources, stopToken, source => {
10
10
  const { reducedFeatures } = drawLine(ctx, {
11
11
  ...props,
12
12
  features: groups[source.name] || [],
@@ -40,17 +40,17 @@ function SourcesGrid({ rows, onChange, showTips, }) {
40
40
  onChange(moveDown([...rows], selected, rows.length));
41
41
  }, disabled: !selected.length, children: [_jsx(KeyboardDoubleArrowDownIcon, {}), showTips ? 'Move selected items to bottom' : null] }), _jsx(ColorPopover, { anchorEl: anchorEl, color: widgetColor, onChange: c => {
42
42
  setWidgetColor(c);
43
- selected.forEach(id => {
43
+ for (const id of selected) {
44
44
  const elt = rows.find(f => f.name === id);
45
45
  if (elt) {
46
46
  elt.color = c;
47
47
  }
48
- });
48
+ }
49
49
  onChange([...rows]);
50
50
  }, onClose: () => {
51
51
  setAnchorEl(null);
52
- } }), _jsx("div", { style: { height: 400, width: '100%' }, children: _jsx(DataGrid, { getRowId: row => row.name, checkboxSelection: true, disableRowSelectionOnClick: true, onRowSelectionModelChange: arg => {
53
- setSelected(arg);
52
+ } }), _jsx("div", { style: { height: 400, width: '100%' }, children: _jsx(DataGrid, { getRowId: row => row.name, checkboxSelection: true, onRowSelectionModelChange: arg => {
53
+ setSelected([...arg.ids]);
54
54
  }, rows: rows, rowHeight: 25, columnHeaderHeight: 33, columns: [
55
55
  {
56
56
  field: 'color',