@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.
- package/dist/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.d.ts +7 -8
- package/dist/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.js +3 -3
- package/dist/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +1 -1
- package/dist/MultiLinearVariantMatrixRenderer/makeImageData.js +61 -6
- package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +4 -4
- package/dist/MultiLinearVariantRenderer/MultiVariantRenderer.js +3 -3
- package/dist/MultiLinearVariantRenderer/makeImageData.js +79 -48
- package/dist/MultiLinearVariantRenderer/types.d.ts +1 -0
- package/dist/MultiVariantBaseRenderer.d.ts +4 -4
- package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
- package/dist/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
- package/dist/VariantFeatureWidget/VariantFeatureWidget.js +9 -4
- package/dist/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
- package/dist/VariantRPC/getGenotypeMatrix.js +10 -2
- package/dist/VcfAdapter/VcfAdapter.d.ts +0 -1
- package/dist/VcfAdapter/VcfAdapter.js +0 -1
- package/dist/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
- package/dist/VcfTabixAdapter/VcfTabixAdapter.js +0 -1
- package/dist/shared/drawAlleleCount.d.ts +2 -1
- package/dist/shared/drawAlleleCount.js +22 -44
- package/dist/shared/minorAlleleFrequencyUtils.d.ts +3 -3
- package/dist/shared/minorAlleleFrequencyUtils.js +15 -9
- package/esm/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.d.ts +7 -8
- package/esm/MultiLinearVariantMatrixRenderer/MultiLinearVariantMatrixRenderer.js +3 -3
- package/esm/MultiLinearVariantMatrixRenderer/makeImageData.d.ts +1 -1
- package/esm/MultiLinearVariantMatrixRenderer/makeImageData.js +62 -7
- package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.d.ts +4 -4
- package/esm/MultiLinearVariantRenderer/MultiVariantRenderer.js +3 -3
- package/esm/MultiLinearVariantRenderer/makeImageData.js +81 -50
- package/esm/MultiLinearVariantRenderer/types.d.ts +1 -0
- package/esm/MultiVariantBaseRenderer.d.ts +4 -4
- package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.d.ts +0 -1
- package/esm/SplitVcfTabixAdapter/SplitVcfTabixAdapter.js +0 -1
- package/esm/VariantFeatureWidget/VariantFeatureWidget.js +9 -4
- package/esm/VariantFeatureWidget/stateModelFactory.d.ts +9 -6
- package/esm/VariantRPC/getGenotypeMatrix.js +10 -2
- package/esm/VcfAdapter/VcfAdapter.d.ts +0 -1
- package/esm/VcfAdapter/VcfAdapter.js +0 -1
- package/esm/VcfTabixAdapter/VcfTabixAdapter.d.ts +0 -1
- package/esm/VcfTabixAdapter/VcfTabixAdapter.js +0 -1
- package/esm/shared/drawAlleleCount.d.ts +2 -1
- package/esm/shared/drawAlleleCount.js +21 -44
- package/esm/shared/minorAlleleFrequencyUtils.d.ts +3 -3
- package/esm/shared/minorAlleleFrequencyUtils.js +15 -9
- 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:
|
|
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
|
-
|
|
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
|
-
|
|
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, ...
|
|
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
|
-
...
|
|
65
|
+
...rest,
|
|
66
66
|
features,
|
|
67
67
|
height,
|
|
68
68
|
width,
|
|
69
69
|
});
|
|
70
70
|
return {
|
|
71
71
|
...results,
|
|
72
|
-
...
|
|
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:
|
|
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
|
-
|
|
56
|
-
|
|
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
|
-
|
|
85
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
...
|
|
64
|
+
...ret,
|
|
65
65
|
features,
|
|
66
66
|
height,
|
|
67
67
|
width,
|
|
68
68
|
});
|
|
69
69
|
return {
|
|
70
70
|
...results,
|
|
71
|
-
...
|
|
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.
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
if (
|
|
41
|
-
const
|
|
42
|
-
if (
|
|
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
|
-
|
|
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(),
|
|
@@ -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:
|
|
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
|
-
|
|
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
|
-
|
|
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>;
|
|
@@ -82,10 +82,9 @@ function LaunchBreakendWidgetArea({ model, }) {
|
|
|
82
82
|
},
|
|
83
83
|
}, model: model, locStrings: [`${feat.refName}:${feat.end}`] })) : null;
|
|
84
84
|
}
|
|
85
|
-
const
|
|
86
|
-
const { model } = props;
|
|
87
|
-
const {
|
|
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<
|
|
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<
|
|
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:
|
|
45
|
+
setFeatureData(featureData: import("@jbrowse/core/util").SimpleFeatureSerialized): void;
|
|
45
46
|
clearFeatureData(): void;
|
|
46
|
-
setFormattedData(feat:
|
|
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<
|
|
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<
|
|
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
|
|
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
|
-
|
|
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;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export declare function
|
|
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;
|