@jbrowse/plugin-variants 3.3.0 → 3.4.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 (55) hide show
  1. package/dist/LinearVariantDisplay/model.d.ts +1 -1
  2. package/dist/MultiLinearVariantDisplay/model.d.ts +1 -1
  3. package/dist/MultiLinearVariantMatrixDisplay/model.d.ts +1 -1
  4. package/dist/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.d.ts +7 -8
  5. package/dist/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.js +3 -3
  6. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +1 -1
  7. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.js +61 -6
  8. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +4 -4
  9. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.js +3 -3
  10. package/dist/MultiLinearVariantRenderer/makeImageData.js +79 -48
  11. package/dist/MultiLinearVariantRenderer/types.d.ts +1 -0
  12. package/dist/MultiVariantBaseRenderer.d.ts +4 -4
  13. package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
  14. package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
  15. package/dist/VariantFeatureWidget/VariantFeatureWidget.js +9 -4
  16. package/dist/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
  17. package/dist/VariantRPC/getGenotypeMatrix.js +10 -2
  18. package/dist/VcfAdapter/VcfAdapter.d.ts +0 -1
  19. package/dist/VcfAdapter/VcfAdapter.js +0 -1
  20. package/dist/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
  21. package/dist/VcfTabixAdapter/VcfTabixAdapter.js +0 -1
  22. package/dist/shared/MultiVariantBaseModel.d.ts +1 -1
  23. package/dist/shared/SharedVariantMixin.d.ts +1 -1
  24. package/dist/shared/drawAlleleCount.d.ts +2 -1
  25. package/dist/shared/drawAlleleCount.js +22 -44
  26. package/dist/shared/minorAlleleFrequencyUtils.d.ts +3 -3
  27. package/dist/shared/minorAlleleFrequencyUtils.js +15 -9
  28. package/esm/LinearVariantDisplay/model.d.ts +1 -1
  29. package/esm/MultiLinearVariantDisplay/model.d.ts +1 -1
  30. package/esm/MultiLinearVariantMatrixDisplay/model.d.ts +1 -1
  31. package/esm/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.d.ts +7 -8
  32. package/esm/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.js +3 -3
  33. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +1 -1
  34. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.js +62 -7
  35. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +4 -4
  36. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.js +3 -3
  37. package/esm/MultiLinearVariantRenderer/makeImageData.js +81 -50
  38. package/esm/MultiLinearVariantRenderer/types.d.ts +1 -0
  39. package/esm/MultiVariantBaseRenderer.d.ts +4 -4
  40. package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
  41. package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
  42. package/esm/VariantFeatureWidget/VariantFeatureWidget.js +9 -4
  43. package/esm/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
  44. package/esm/VariantRPC/getGenotypeMatrix.js +10 -2
  45. package/esm/VcfAdapter/VcfAdapter.d.ts +0 -1
  46. package/esm/VcfAdapter/VcfAdapter.js +0 -1
  47. package/esm/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
  48. package/esm/VcfTabixAdapter/VcfTabixAdapter.js +0 -1
  49. package/esm/shared/MultiVariantBaseModel.d.ts +1 -1
  50. package/esm/shared/SharedVariantMixin.d.ts +1 -1
  51. package/esm/shared/drawAlleleCount.d.ts +2 -1
  52. package/esm/shared/drawAlleleCount.js +21 -44
  53. package/esm/shared/minorAlleleFrequencyUtils.d.ts +3 -3
  54. package/esm/shared/minorAlleleFrequencyUtils.js +15 -9
  55. package/package.json +8 -8
@@ -200,7 +200,7 @@ export default function stateModelFactory(configSchema: AnyConfigurationSchemaTy
200
200
  } & {
201
201
  addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
202
202
  deleteBlock(key: string): void;
203
- selectFeature(feature: Feature): void;
203
+ selectFeature(feature: Feature): Promise<void>;
204
204
  navToFeature(feature: Feature): void;
205
205
  clearFeatureSelection(): void;
206
206
  setFeatureIdUnderMouse(feature?: string): void;
@@ -208,7 +208,7 @@ export declare function stateModelFactory(configSchema: AnyConfigurationSchemaTy
208
208
  } & {
209
209
  addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
210
210
  deleteBlock(key: string): void;
211
- selectFeature(feature: import("@jbrowse/core/util").Feature): void;
211
+ selectFeature(feature: import("@jbrowse/core/util").Feature): Promise<void>;
212
212
  navToFeature(feature: import("@jbrowse/core/util").Feature): void;
213
213
  clearFeatureSelection(): void;
214
214
  setFeatureIdUnderMouse(feature?: string): void;
@@ -208,7 +208,7 @@ export default function stateModelFactory(configSchema: AnyConfigurationSchemaTy
208
208
  } & {
209
209
  addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
210
210
  deleteBlock(key: string): void;
211
- selectFeature(feature: import("@jbrowse/core/util").Feature): void;
211
+ selectFeature(feature: import("@jbrowse/core/util").Feature): Promise<void>;
212
212
  navToFeature(feature: import("@jbrowse/core/util").Feature): void;
213
213
  clearFeatureSelection(): void;
214
214
  setFeatureIdUnderMouse(feature?: string): void;
@@ -1,7 +1,6 @@
1
1
  import BoxRendererType from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType';
2
2
  import { SimpleFeature } from '@jbrowse/core/util';
3
3
  import type { RenderArgsDeserialized } from './types';
4
- import type { Feature } from '@jbrowse/core/util';
5
4
  export default class LinearVariantMatrixRenderer extends BoxRendererType {
6
5
  supportsSVG: boolean;
7
6
  render(renderProps: RenderArgsDeserialized): Promise<{
@@ -10,8 +9,8 @@ export default class LinearVariantMatrixRenderer extends BoxRendererType {
10
9
  height: number;
11
10
  width: number;
12
11
  arr: string[][];
13
- canvasRecordedData: any;
14
- layout: import("@jbrowse/core/util/layouts").BaseLayout<Feature>;
12
+ canvasRecordedData: Record<string, unknown>;
13
+ layout: import("@jbrowse/core/util/layouts/BaseLayout").BaseLayout<import("@jbrowse/core/util").Feature>;
15
14
  reactElement?: React.ReactElement;
16
15
  html?: string;
17
16
  } | {
@@ -20,8 +19,9 @@ export default class LinearVariantMatrixRenderer extends BoxRendererType {
20
19
  height: number;
21
20
  width: number;
22
21
  arr: string[][];
23
- reactElement: import("react/jsx-runtime").JSX.Element;
24
- layout: import("@jbrowse/core/util/layouts").BaseLayout<Feature>;
22
+ imageData: any;
23
+ layout: import("@jbrowse/core/util/layouts/BaseLayout").BaseLayout<import("@jbrowse/core/util").Feature>;
24
+ reactElement?: React.ReactElement;
25
25
  html?: string;
26
26
  } | {
27
27
  features: Map<any, any>;
@@ -29,9 +29,8 @@ export default class LinearVariantMatrixRenderer extends BoxRendererType {
29
29
  height: number;
30
30
  width: number;
31
31
  arr: string[][];
32
- imageData: any;
33
- layout: import("@jbrowse/core/util/layouts").BaseLayout<Feature>;
34
- reactElement?: React.ReactElement;
32
+ reactElement: React.ReactElement;
33
+ layout: import("@jbrowse/core/util/layouts/BaseLayout").BaseLayout<import("@jbrowse/core/util").Feature>;
35
34
  html?: string;
36
35
  }>;
37
36
  }
@@ -50,7 +50,7 @@ class LinearVariantMatrixRenderer extends BoxRendererType_1.default {
50
50
  const { end, start } = region;
51
51
  const width = (end - start) / bpPerPx;
52
52
  const { makeImageData } = await Promise.resolve().then(() => __importStar(require('./makeImageData')));
53
- const { mafs, ...res } = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => makeImageData({
53
+ const { mafs, ...rest } = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => makeImageData({
54
54
  ctx,
55
55
  canvasWidth: width,
56
56
  canvasHeight: height,
@@ -62,14 +62,14 @@ class LinearVariantMatrixRenderer extends BoxRendererType_1.default {
62
62
  }));
63
63
  const results = await super.render({
64
64
  ...renderProps,
65
- ...res,
65
+ ...rest,
66
66
  features,
67
67
  height,
68
68
  width,
69
69
  });
70
70
  return {
71
71
  ...results,
72
- ...res,
72
+ ...rest,
73
73
  features: new Map(),
74
74
  simplifiedFeatures: mafs.map(({ feature }) => new util_1.SimpleFeature({
75
75
  id: feature.id(),
@@ -8,7 +8,7 @@ export declare function makeImageData({ ctx, canvasWidth, canvasHeight, renderAr
8
8
  mafs: {
9
9
  feature: import("@jbrowse/core/util").Feature;
10
10
  mostFrequentAlt: string;
11
- alleleCounts: Map<string, number>;
11
+ alleleCounts: Record<string, number>;
12
12
  }[];
13
13
  arr: string[][];
14
14
  }>;
@@ -12,17 +12,18 @@ async function makeImageData({ ctx, canvasWidth, canvasHeight, renderArgs, }) {
12
12
  const { statusCallback = () => { } } = renderArgs;
13
13
  const h = canvasHeight / sources.length;
14
14
  (0, stopToken_1.checkStopToken)(stopToken);
15
- const mafs = (0, minorAlleleFrequencyUtils_1.getFeaturesThatPassMinorAlleleFrequencyFilter)({
15
+ const mafs = await (0, util_1.updateStatus)('Calculating stats', statusCallback, () => (0, minorAlleleFrequencyUtils_1.getFeaturesThatPassMinorAlleleFrequencyFilter)({
16
16
  stopToken,
17
17
  features: features.values(),
18
18
  minorAlleleFrequencyFilter,
19
19
  lengthCutoffFilter,
20
- });
20
+ }));
21
21
  (0, stopToken_1.checkStopToken)(stopToken);
22
22
  const arr = [];
23
23
  const m = mafs.length;
24
24
  const w = canvasWidth / m;
25
25
  await (0, util_1.updateStatus)('Drawing variant matrix', statusCallback, () => {
26
+ const colorCache = {};
26
27
  (0, util_1.forEachWithStopTokenCheck)(mafs, stopToken, ({ feature, mostFrequentAlt }, idx) => {
27
28
  var _a, _b, _c;
28
29
  const arr2 = [];
@@ -52,8 +53,35 @@ async function makeImageData({ ctx, canvasWidth, canvasHeight, renderArgs, }) {
52
53
  }
53
54
  }
54
55
  else {
55
- const alleles = genotype.split(/[/|]/);
56
- (0, drawAlleleCount_1.drawColorAlleleCount)(alleles, ctx, x, y, w, h, mostFrequentAlt);
56
+ let c = colorCache[genotype];
57
+ if (c === undefined) {
58
+ let alt = 0;
59
+ let uncalled = 0;
60
+ let alt2 = 0;
61
+ let ref = 0;
62
+ const alleles = genotype.split(/[/|]/);
63
+ const total = alleles.length;
64
+ for (let i = 0; i < total; i++) {
65
+ const allele = alleles[i];
66
+ if (allele === mostFrequentAlt) {
67
+ alt++;
68
+ }
69
+ else if (allele === '0') {
70
+ ref++;
71
+ }
72
+ else if (allele === '.') {
73
+ uncalled++;
74
+ }
75
+ else {
76
+ alt2++;
77
+ }
78
+ }
79
+ c = (0, drawAlleleCount_1.getColorAlleleCount)(ref, alt, alt2, uncalled, total, true);
80
+ colorCache[genotype] = c;
81
+ }
82
+ if (c) {
83
+ (0, drawAlleleCount_1.drawColorAlleleCount)(c, ctx, x, y, w, h);
84
+ }
57
85
  }
58
86
  }
59
87
  }
@@ -81,8 +109,35 @@ async function makeImageData({ ctx, canvasWidth, canvasHeight, renderArgs, }) {
81
109
  }
82
110
  }
83
111
  else {
84
- const alleles = genotype.split(/[/|]/);
85
- (0, drawAlleleCount_1.drawColorAlleleCount)(alleles, ctx, x, y, w, h, mostFrequentAlt);
112
+ let c = colorCache[genotype];
113
+ if (c === undefined) {
114
+ let alt = 0;
115
+ let uncalled = 0;
116
+ let alt2 = 0;
117
+ let ref = 0;
118
+ const alleles = genotype.split(/[/|]/);
119
+ const total = alleles.length;
120
+ for (let i = 0; i < total; i++) {
121
+ const allele = alleles[i];
122
+ if (allele === mostFrequentAlt) {
123
+ alt++;
124
+ }
125
+ else if (allele === '0') {
126
+ ref++;
127
+ }
128
+ else if (allele === '.') {
129
+ uncalled++;
130
+ }
131
+ else {
132
+ alt2++;
133
+ }
134
+ }
135
+ c = (0, drawAlleleCount_1.getColorAlleleCount)(ref, alt, alt2, uncalled, total, true);
136
+ colorCache[genotype] = c;
137
+ }
138
+ if (c) {
139
+ (0, drawAlleleCount_1.drawColorAlleleCount)(c, ctx, x, y, w, h);
140
+ }
86
141
  }
87
142
  }
88
143
  }
@@ -18,7 +18,7 @@ export default class MultiVariantBaseRenderer extends FeatureRendererType {
18
18
  length: number;
19
19
  };
20
20
  };
21
- canvasRecordedData: any;
21
+ canvasRecordedData: Record<string, unknown>;
22
22
  reactElement?: React.ReactElement;
23
23
  html?: string;
24
24
  } | {
@@ -36,7 +36,8 @@ export default class MultiVariantBaseRenderer extends FeatureRendererType {
36
36
  length: number;
37
37
  };
38
38
  };
39
- reactElement: import("react/jsx-runtime").JSX.Element;
39
+ imageData: any;
40
+ reactElement?: React.ReactElement;
40
41
  html?: string;
41
42
  } | {
42
43
  features: Map<string, Feature>;
@@ -53,8 +54,7 @@ export default class MultiVariantBaseRenderer extends FeatureRendererType {
53
54
  length: number;
54
55
  };
55
56
  };
56
- imageData: any;
57
- reactElement?: React.ReactElement;
57
+ reactElement: React.ReactElement;
58
58
  html?: string;
59
59
  }>;
60
60
  }
@@ -49,7 +49,7 @@ class MultiVariantBaseRenderer extends FeatureRendererType_1.default {
49
49
  const region = regions[0];
50
50
  const width = (region.end - region.start) / bpPerPx;
51
51
  const { makeImageData } = await Promise.resolve().then(() => __importStar(require('./makeImageData')));
52
- const rest = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => {
52
+ const ret = await (0, util_1.renderToAbstractCanvas)(width, height, renderProps, ctx => {
53
53
  if (referenceDrawingMode === 'skip') {
54
54
  ctx.fillStyle = '#ccc';
55
55
  ctx.fillRect(0, 0, width, height);
@@ -61,14 +61,14 @@ class MultiVariantBaseRenderer extends FeatureRendererType_1.default {
61
61
  });
62
62
  const results = await super.render({
63
63
  ...renderProps,
64
- ...rest,
64
+ ...ret,
65
65
  features,
66
66
  height,
67
67
  width,
68
68
  });
69
69
  return {
70
70
  ...results,
71
- ...rest,
71
+ ...ret,
72
72
  features: new Map(),
73
73
  height,
74
74
  width,
@@ -14,32 +14,90 @@ const minorAlleleFrequencyUtils_1 = require("../shared/minorAlleleFrequencyUtils
14
14
  async function makeImageData(ctx, props) {
15
15
  const { scrollTop, minorAlleleFrequencyFilter, sources, rowHeight, features, regions, bpPerPx, renderingMode, stopToken, lengthCutoffFilter, referenceDrawingMode, } = props;
16
16
  const region = regions[0];
17
+ const { statusCallback = () => { } } = props;
17
18
  (0, stopToken_1.checkStopToken)(stopToken);
18
- const mafs = (0, minorAlleleFrequencyUtils_1.getFeaturesThatPassMinorAlleleFrequencyFilter)({
19
+ const mafs = await (0, util_1.updateStatus)('Calculating stats', statusCallback, () => (0, minorAlleleFrequencyUtils_1.getFeaturesThatPassMinorAlleleFrequencyFilter)({
19
20
  stopToken,
20
21
  features: features.values(),
21
22
  minorAlleleFrequencyFilter,
22
23
  lengthCutoffFilter,
23
- });
24
+ }));
24
25
  (0, stopToken_1.checkStopToken)(stopToken);
25
26
  const rbush = new rbush_1.default();
26
- (0, util_1.forEachWithStopTokenCheck)(mafs, stopToken, ({ mostFrequentAlt, feature }) => {
27
- const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
28
- const w = Math.max(Math.round(rightPx - leftPx), 2);
29
- const samp = feature.get('genotypes');
30
- let y = -scrollTop;
31
- const s = sources.length;
32
- if (renderingMode === 'phased') {
33
- for (let j = 0; j < s; j++) {
34
- const { name, HP } = sources[j];
35
- const genotype = samp[name];
36
- const x = Math.floor(leftPx);
37
- const h = Math.max(rowHeight, 1);
38
- if (genotype) {
39
- const isPhased = genotype.includes('|');
40
- if (isPhased) {
41
- const alleles = genotype.split('|');
42
- if ((0, drawPhased_1.drawPhased)(alleles, ctx, x, y, w, h, HP, undefined, referenceDrawingMode === 'draw')) {
27
+ await (0, util_1.updateStatus)('Drawing variants', statusCallback, () => {
28
+ (0, util_1.forEachWithStopTokenCheck)(mafs, stopToken, ({ mostFrequentAlt, feature }) => {
29
+ const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
30
+ const flen = feature.get('end') - feature.get('start');
31
+ const w = Math.max(Math.round(rightPx - leftPx), 2);
32
+ const samp = feature.get('genotypes');
33
+ let y = -scrollTop;
34
+ const s = sources.length;
35
+ if (renderingMode === 'phased') {
36
+ for (let j = 0; j < s; j++) {
37
+ const { name, HP } = sources[j];
38
+ const genotype = samp[name];
39
+ const x = Math.floor(leftPx);
40
+ const h = Math.max(rowHeight, 1);
41
+ if (genotype) {
42
+ const isPhased = genotype.includes('|');
43
+ if (isPhased) {
44
+ const alleles = genotype.split('|');
45
+ if ((0, drawPhased_1.drawPhased)(alleles, ctx, x, y, w, h, HP, undefined, referenceDrawingMode === 'draw')) {
46
+ rbush.insert({
47
+ minX: x,
48
+ maxX: x + w,
49
+ minY: y,
50
+ maxY: y + h,
51
+ genotype,
52
+ name,
53
+ featureId: feature.id(),
54
+ });
55
+ }
56
+ }
57
+ else {
58
+ ctx.fillStyle = 'black';
59
+ ctx.fillRect(x - constants_1.f2, y - constants_1.f2, w + constants_1.f2, h + constants_1.f2);
60
+ }
61
+ }
62
+ y += rowHeight;
63
+ }
64
+ }
65
+ else {
66
+ const colorCache = {};
67
+ for (let j = 0; j < s; j++) {
68
+ const { name } = sources[j];
69
+ const genotype = samp[name];
70
+ const x = Math.floor(leftPx);
71
+ const h = Math.max(rowHeight, 1);
72
+ if (genotype) {
73
+ let c = colorCache[genotype];
74
+ if (c === undefined) {
75
+ let alt = 0;
76
+ let uncalled = 0;
77
+ let alt2 = 0;
78
+ let ref = 0;
79
+ const alleles = genotype.split(/[/|]/);
80
+ const total = alleles.length;
81
+ for (let i = 0; i < total; i++) {
82
+ const allele = alleles[i];
83
+ if (allele === mostFrequentAlt) {
84
+ alt++;
85
+ }
86
+ else if (allele === '0') {
87
+ ref++;
88
+ }
89
+ else if (allele === '.') {
90
+ uncalled++;
91
+ }
92
+ else {
93
+ alt2++;
94
+ }
95
+ }
96
+ c = (0, drawAlleleCount_1.getColorAlleleCount)(ref, alt, alt2, uncalled, total, referenceDrawingMode === 'draw');
97
+ colorCache[genotype] = c;
98
+ }
99
+ if (c) {
100
+ (0, drawAlleleCount_1.drawColorAlleleCount)(c, ctx, x, y, w, h, feature.get('type'), feature.get('strand'), flen > 5 ? 0.75 : 1);
43
101
  rbush.insert({
44
102
  minX: x,
45
103
  maxX: x + w,
@@ -51,37 +109,10 @@ async function makeImageData(ctx, props) {
51
109
  });
52
110
  }
53
111
  }
54
- else {
55
- ctx.fillStyle = 'black';
56
- ctx.fillRect(x - constants_1.f2, y - constants_1.f2, w + constants_1.f2, h + constants_1.f2);
57
- }
58
- }
59
- y += rowHeight;
60
- }
61
- }
62
- else {
63
- for (let j = 0; j < s; j++) {
64
- const { name } = sources[j];
65
- const genotype = samp[name];
66
- const x = Math.floor(leftPx);
67
- const h = Math.max(rowHeight, 1);
68
- if (genotype) {
69
- const alleles = genotype.split(/[/|]/);
70
- if ((0, drawAlleleCount_1.drawColorAlleleCount)(alleles, ctx, x, y, w, h, mostFrequentAlt, referenceDrawingMode === 'draw', feature.get('type'), feature.get('strand'), 0.75)) {
71
- rbush.insert({
72
- minX: x,
73
- maxX: x + w,
74
- minY: y,
75
- maxY: y + h,
76
- genotype,
77
- name,
78
- featureId: feature.id(),
79
- });
80
- }
112
+ y += rowHeight;
81
113
  }
82
- y += rowHeight;
83
114
  }
84
- }
115
+ });
85
116
  });
86
117
  return {
87
118
  rbush: rbush.toJSON(),
@@ -17,4 +17,5 @@ export interface MultiRenderArgsDeserialized extends RenderArgsDeserializedWithF
17
17
  scrollTop: number;
18
18
  minorAlleleFrequencyFilter: number;
19
19
  lengthCutoffFilter: number;
20
+ statusCallback?: (arg: string) => void;
20
21
  }
@@ -22,7 +22,7 @@ export default abstract class MultiVariantBaseRenderer extends FeatureRendererTy
22
22
  height: number;
23
23
  width: number;
24
24
  containsNoTransferables: boolean;
25
- canvasRecordedData: any;
25
+ canvasRecordedData: Record<string, unknown>;
26
26
  reactElement?: React.ReactElement;
27
27
  html?: string;
28
28
  } | {
@@ -30,15 +30,15 @@ export default abstract class MultiVariantBaseRenderer extends FeatureRendererTy
30
30
  height: number;
31
31
  width: number;
32
32
  containsNoTransferables: boolean;
33
- reactElement: import("react/jsx-runtime").JSX.Element;
33
+ imageData: any;
34
+ reactElement?: React.ReactElement;
34
35
  html?: string;
35
36
  } | {
36
37
  features: Map<string, Feature>;
37
38
  height: number;
38
39
  width: number;
39
40
  containsNoTransferables: boolean;
40
- imageData: any;
41
- reactElement?: React.ReactElement;
41
+ reactElement: React.ReactElement;
42
42
  html?: string;
43
43
  }>;
44
44
  abstract draw<T extends RenderArgsDeserializedWithFeatures>(ctx: CanvasRenderingContext2D, props: T): Promise<Record<string, unknown> | undefined>;
@@ -15,5 +15,4 @@ export default class SplitVcfTabixAdapter extends BaseFeatureDataAdapter {
15
15
  getSources(): Promise<{
16
16
  name: string;
17
17
  }[]>;
18
- freeResources(): void;
19
18
  }
@@ -88,6 +88,5 @@ class SplitVcfTabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
88
88
  .filter(f => s.has(f.name));
89
89
  }
90
90
  }
91
- freeResources() { }
92
91
  }
93
92
  exports.default = SplitVcfTabixAdapter;
@@ -82,10 +82,9 @@ function LaunchBreakendWidgetArea({ model, }) {
82
82
  },
83
83
  }, model: model, locStrings: [`${feat.refName}:${feat.end}`] })) : null;
84
84
  }
85
- const VariantFeatureWidget = (0, mobx_react_1.observer)(function (props) {
86
- const { model } = props;
87
- const { featureData, descriptions } = model;
88
- const feat = JSON.parse(JSON.stringify(featureData));
85
+ const FeatDefined = (0, mobx_react_1.observer)(function (props) {
86
+ const { feat, model } = props;
87
+ const { descriptions } = model;
89
88
  const { samples, ...rest } = feat;
90
89
  const { REF } = rest;
91
90
  return ((0, jsx_runtime_1.jsxs)(material_1.Paper, { "data-testid": "variant-side-drawer", children: [(0, jsx_runtime_1.jsx)(FeatureDetails_1.default, { feature: rest, descriptions: {
@@ -95,4 +94,10 @@ const VariantFeatureWidget = (0, mobx_react_1.observer)(function (props) {
95
94
  return key === 'ALT' ? ((0, jsx_runtime_1.jsx)(AltFormatter_1.default, { value: `${value}`, ref: REF })) : ((0, jsx_runtime_1.jsx)(Formatter_1.default, { value: value }));
96
95
  }, ...props }), (0, jsx_runtime_1.jsxs)(react_1.Suspense, { fallback: null, children: [(0, jsx_runtime_1.jsx)(CsqPanel, { feature: rest, descriptions: descriptions }), (0, jsx_runtime_1.jsx)(AnnPanel, { feature: rest, descriptions: descriptions }), (0, jsx_runtime_1.jsx)(LaunchBreakendWidgetArea, { model: model })] }), (0, jsx_runtime_1.jsx)(VariantSampleGrid_1.default, { feature: feat, ...props, descriptions: descriptions })] }));
97
96
  });
97
+ const VariantFeatureWidget = (0, mobx_react_1.observer)(function (props) {
98
+ const { model } = props;
99
+ const { featureData } = model;
100
+ const feat = structuredClone(featureData);
101
+ return feat ? ((0, jsx_runtime_1.jsx)(FeatDefined, { feat: feat, ...props })) : ((0, jsx_runtime_1.jsx)("div", { children: "No feature loaded, may not be available after page refresh because it was too large for localStorage" }));
102
+ });
98
103
  exports.default = VariantFeatureWidget;
@@ -3,9 +3,9 @@ import type { Instance } from 'mobx-state-tree';
3
3
  export declare function stateModelFactory(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
4
4
  id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
5
5
  type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
6
- featureData: import("mobx-state-tree").IType<any, any, any>;
6
+ featureData: import("mobx-state-tree").IType<import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat>;
7
7
  formattedFields: import("mobx-state-tree").IType<any, any, any>;
8
- unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
8
+ unformattedFeatureData: import("mobx-state-tree").IType<import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat>;
9
9
  view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
10
10
  track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
11
11
  trackId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
@@ -35,15 +35,16 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
35
35
  } & {
36
36
  afterAttach(): void;
37
37
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>, [undefined]>;
38
+ descriptions: import("mobx-state-tree").IType<Record<string, unknown> | undefined, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
38
39
  } & {
39
40
  type: import("mobx-state-tree").ISimpleType<"VariantFeatureWidget">;
40
41
  descriptions: import("mobx-state-tree").IType<any, any, any>;
41
42
  }, {
42
43
  error: unknown;
43
44
  } & {
44
- setFeatureData(featureData: Record<string, unknown>): void;
45
+ setFeatureData(featureData: import("@jbrowse/core/util").SimpleFeatureSerialized): void;
45
46
  clearFeatureData(): void;
46
- setFormattedData(feat: Record<string, unknown>): void;
47
+ setFormattedData(feat: import("@jbrowse/core/util").SimpleFeatureSerialized): void;
47
48
  setExtra(type?: string, trackId?: string, maxDepth?: number): void;
48
49
  setError(e: unknown): void;
49
50
  } & {
@@ -53,9 +54,9 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
53
54
  } & Partial<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
54
55
  id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
55
56
  type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
56
- featureData: import("mobx-state-tree").IType<any, any, any>;
57
+ featureData: import("mobx-state-tree").IType<import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat>;
57
58
  formattedFields: import("mobx-state-tree").IType<any, any, any>;
58
- unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
59
+ unformattedFeatureData: import("mobx-state-tree").IType<import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat, import("@jbrowse/core/BaseFeatureWidget/types").MaybeSerializedFeat>;
59
60
  view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
60
61
  track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
61
62
  trackId: import("mobx-state-tree").IMaybe<import("mobx-state-tree").ISimpleType<string>>;
@@ -85,6 +86,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
85
86
  } & {
86
87
  afterAttach(): void;
87
88
  }, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>, [undefined]>;
89
+ descriptions: import("mobx-state-tree").IType<Record<string, unknown> | undefined, Record<string, unknown> | undefined, Record<string, unknown> | undefined>;
88
90
  }>> & import("mobx-state-tree/dist/internal").NonEmptyObject & import("mobx-state-tree")._NotCustomized, {
89
91
  type: "BaseFeatureWidget";
90
92
  id: string;
@@ -95,6 +97,7 @@ export declare function stateModelFactory(pluginManager: PluginManager): import(
95
97
  maxDepth: number | undefined;
96
98
  sequenceFeatureDetails: import("mobx-state-tree").ModelSnapshotType<{}>;
97
99
  formattedFields: any;
100
+ descriptions: Record<string, unknown> | undefined;
98
101
  finalizedFeatureData: any;
99
102
  } & import("mobx-state-tree")._NotCustomized>;
100
103
  export type VariantFeatureWidgetStateModel = ReturnType<typeof stateModelFactory>;
@@ -17,11 +17,12 @@ async function getGenotypeMatrix({ pluginManager, args, }) {
17
17
  features: await (0, rxjs_1.firstValueFrom)(dataAdapter.getFeaturesInMultipleRegions(regions, args).pipe((0, rxjs_1.toArray)())),
18
18
  });
19
19
  for (const { alleleCounts } of mafs) {
20
- for (const alt of alleleCounts.keys()) {
20
+ for (const alt of Object.keys(alleleCounts)) {
21
21
  genotypeFactor.add(alt);
22
22
  }
23
23
  }
24
24
  const rows = {};
25
+ const cacheSplit = {};
25
26
  (0, util_1.forEachWithStopTokenCheck)(mafs, stopToken, ({ feature }) => {
26
27
  const genotypes = feature.get('genotypes');
27
28
  for (const { name } of sources) {
@@ -29,7 +30,14 @@ async function getGenotypeMatrix({ pluginManager, args, }) {
29
30
  rows[name] = [];
30
31
  }
31
32
  const val = genotypes[name];
32
- const alleles = val.split(/[/|]/);
33
+ let alleles;
34
+ if (cacheSplit[val]) {
35
+ alleles = cacheSplit[val];
36
+ }
37
+ else {
38
+ alleles = val.split(/[/|]/);
39
+ cacheSplit[val] = alleles;
40
+ }
33
41
  let genotypeStatus = 0;
34
42
  let nonRefCount = 0;
35
43
  let uncalledCount = 0;
@@ -31,6 +31,5 @@ export default class VcfAdapter extends BaseFeatureDataAdapter {
31
31
  getSources(): Promise<{
32
32
  name: string;
33
33
  }[]>;
34
- freeResources(): void;
35
34
  }
36
35
  export {};
@@ -140,7 +140,6 @@ class VcfAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
140
140
  .filter(f => s.has(f.name));
141
141
  }
142
142
  }
143
- freeResources() { }
144
143
  }
145
144
  VcfAdapter.capabilities = ['getFeatures', 'getRefNames'];
146
145
  exports.default = VcfAdapter;
@@ -22,5 +22,4 @@ export default class VcfTabixAdapter extends BaseFeatureDataAdapter {
22
22
  getSources(): Promise<{
23
23
  name: string;
24
24
  }[]>;
25
- freeResources(): void;
26
25
  }
@@ -113,6 +113,5 @@ class VcfTabixAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
113
113
  return metadataLines.filter(f => vcfSampleSet.has(f.name));
114
114
  }
115
115
  }
116
- freeResources() { }
117
116
  }
118
117
  exports.default = VcfTabixAdapter;
@@ -205,7 +205,7 @@ export default function MultiVariantBaseModelF(configSchema: AnyConfigurationSch
205
205
  } & {
206
206
  addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
207
207
  deleteBlock(key: string): void;
208
- selectFeature(feature: Feature): void;
208
+ selectFeature(feature: Feature): Promise<void>;
209
209
  navToFeature(feature: Feature): void;
210
210
  clearFeatureSelection(): void;
211
211
  setFeatureIdUnderMouse(feature?: string): void;
@@ -193,7 +193,7 @@ export default function SharedVariantMixin(configSchema: AnyConfigurationSchemaT
193
193
  } & {
194
194
  addBlock(key: string, block: import("@jbrowse/core/util/blockTypes").BaseBlock): void;
195
195
  deleteBlock(key: string): void;
196
- selectFeature(feature: Feature): void;
196
+ selectFeature(feature: Feature): Promise<void>;
197
197
  navToFeature(feature: Feature): void;
198
198
  clearFeatureSelection(): void;
199
199
  setFeatureIdUnderMouse(feature?: string): void;
@@ -1 +1,2 @@
1
- export declare function drawColorAlleleCount(alleles: string[], ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, mostFrequentAlt: string, drawReference?: boolean, featureType?: string, featureStrand?: number, alpha?: number): any;
1
+ export declare function getColorAlleleCount(ref: number, alt: number, alt2: number, uncalled: number, total: number, drawReference?: boolean): any;
2
+ export declare function drawColorAlleleCount(c: string, ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, featureType?: string, featureStrand?: number, alpha?: number): void;