@jbrowse/plugin-variants 3.3.0 → 3.5.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 (45) hide show
  1. package/dist/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.d.ts +7 -8
  2. package/dist/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.js +3 -3
  3. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +1 -1
  4. package/dist/MultiLinearVariantMatrixRenderer/makeImageData.js +61 -6
  5. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +4 -4
  6. package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.js +3 -3
  7. package/dist/MultiLinearVariantRenderer/makeImageData.js +79 -48
  8. package/dist/MultiLinearVariantRenderer/types.d.ts +1 -0
  9. package/dist/MultiVariantBaseRenderer.d.ts +4 -4
  10. package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
  11. package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
  12. package/dist/VariantFeatureWidget/VariantFeatureWidget.js +9 -4
  13. package/dist/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
  14. package/dist/VariantRPC/getGenotypeMatrix.js +10 -2
  15. package/dist/VcfAdapter/VcfAdapter.d.ts +0 -1
  16. package/dist/VcfAdapter/VcfAdapter.js +0 -1
  17. package/dist/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
  18. package/dist/VcfTabixAdapter/VcfTabixAdapter.js +0 -1
  19. package/dist/shared/drawAlleleCount.d.ts +2 -1
  20. package/dist/shared/drawAlleleCount.js +22 -44
  21. package/dist/shared/minorAlleleFrequencyUtils.d.ts +3 -3
  22. package/dist/shared/minorAlleleFrequencyUtils.js +15 -9
  23. package/esm/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.d.ts +7 -8
  24. package/esm/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.js +3 -3
  25. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +1 -1
  26. package/esm/MultiLinearVariantMatrixRenderer/makeImageData.js +62 -7
  27. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +4 -4
  28. package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.js +3 -3
  29. package/esm/MultiLinearVariantRenderer/makeImageData.js +81 -50
  30. package/esm/MultiLinearVariantRenderer/types.d.ts +1 -0
  31. package/esm/MultiVariantBaseRenderer.d.ts +4 -4
  32. package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
  33. package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
  34. package/esm/VariantFeatureWidget/VariantFeatureWidget.js +9 -4
  35. package/esm/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
  36. package/esm/VariantRPC/getGenotypeMatrix.js +10 -2
  37. package/esm/VcfAdapter/VcfAdapter.d.ts +0 -1
  38. package/esm/VcfAdapter/VcfAdapter.js +0 -1
  39. package/esm/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
  40. package/esm/VcfTabixAdapter/VcfTabixAdapter.js +0 -1
  41. package/esm/shared/drawAlleleCount.d.ts +2 -1
  42. package/esm/shared/drawAlleleCount.js +21 -44
  43. package/esm/shared/minorAlleleFrequencyUtils.d.ts +3 -3
  44. package/esm/shared/minorAlleleFrequencyUtils.js +15 -9
  45. package/package.json +8 -8
@@ -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;
@@ -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;