@jbrowse/plugin-alignments 2.6.3 → 2.7.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/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +2 -2
- package/dist/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +2 -1
- package/dist/AlignmentsFeatureDetail/util.d.ts +1 -3
- package/dist/BamAdapter/BamAdapter.d.ts +2 -9
- package/dist/CramAdapter/CramAdapter.d.ts +3 -11
- package/dist/CramAdapter/CramAdapter.js +2 -1
- package/dist/CramAdapter/util.js +3 -6
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +3 -4
- package/dist/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +3 -3
- package/dist/LinearAlignmentsDisplay/models/model.d.ts +5 -9
- package/dist/LinearAlignmentsDisplay/models/model.js +1 -0
- package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +49 -27
- package/dist/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +20 -2
- package/dist/LinearPileupDisplay/components/ColorByModifications.d.ts +4 -5
- package/dist/LinearPileupDisplay/components/ColorByModifications.js +3 -4
- package/dist/LinearPileupDisplay/components/ColorByTag.d.ts +7 -5
- package/dist/LinearPileupDisplay/components/ColorByTag.js +4 -7
- package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +3 -4
- package/dist/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +2 -2
- package/dist/LinearPileupDisplay/components/SetFeatureHeight.d.ts +4 -5
- package/dist/LinearPileupDisplay/components/SetFeatureHeight.js +3 -3
- package/dist/LinearPileupDisplay/components/SetMaxHeight.d.ts +3 -4
- package/dist/LinearPileupDisplay/components/SetMaxHeight.js +3 -3
- package/dist/LinearPileupDisplay/components/SortByTag.d.ts +3 -4
- package/dist/LinearPileupDisplay/components/SortByTag.js +3 -3
- package/dist/LinearPileupDisplay/model.d.ts +56 -35
- package/dist/LinearPileupDisplay/model.js +3 -2
- package/dist/LinearReadArcsDisplay/components/ReactComponent.d.ts +2 -2
- package/dist/LinearReadArcsDisplay/components/ReactComponent.js +2 -1
- package/dist/LinearReadArcsDisplay/model.d.ts +9 -14
- package/dist/LinearReadCloudDisplay/components/ReactComponent.d.ts +2 -2
- package/dist/LinearReadCloudDisplay/components/ReactComponent.js +2 -1
- package/dist/LinearReadCloudDisplay/drawPairChains.js +1 -2
- package/dist/LinearReadCloudDisplay/model.d.ts +13 -15
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
- package/dist/LinearSNPCoverageDisplay/models/model.d.ts +18 -423
- package/dist/LinearSNPCoverageDisplay/models/model.js +18 -0
- package/dist/MismatchParser/index.js +6 -8
- package/dist/PileupRenderer/PileupRenderer.js +0 -25
- package/dist/PileupRenderer/colorBy.js +1 -1
- package/dist/PileupRenderer/components/PileupRendering.d.ts +9 -10
- package/dist/PileupRenderer/components/PileupRendering.js +3 -5
- package/dist/PileupRenderer/getAlignmentShapeColor.js +1 -1
- package/dist/PileupRenderer/layoutFeature.js +1 -2
- package/dist/PileupRenderer/makeImageData.d.ts +1 -3
- package/dist/PileupRenderer/renderMethylation.js +5 -10
- package/dist/PileupRenderer/renderMismatches.d.ts +2 -6
- package/dist/PileupRenderer/renderMismatches.js +8 -11
- package/dist/PileupRenderer/renderModifications.js +4 -8
- package/dist/PileupRenderer/renderSoftClipping.js +26 -25
- package/dist/PileupRenderer/sortUtil.js +2 -2
- package/dist/SNPCoverageAdapter/util.d.ts +9 -13
- package/dist/SNPCoverageRenderer/SNPCoverageRenderer.js +6 -12
- package/dist/shared/BaseDisplayComponent.d.ts +2 -2
- package/dist/shared/BaseDisplayComponent.js +2 -1
- package/dist/shared/FilterByTag.d.ts +6 -15
- package/dist/shared/FilterByTag.js +4 -6
- package/dist/shared/fetchChains.js +1 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/util.d.ts +3 -9
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.d.ts +2 -2
- package/esm/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +2 -1
- package/esm/AlignmentsFeatureDetail/util.d.ts +1 -3
- package/esm/BamAdapter/BamAdapter.d.ts +2 -9
- package/esm/CramAdapter/CramAdapter.d.ts +3 -11
- package/esm/CramAdapter/CramAdapter.js +2 -1
- package/esm/CramAdapter/util.js +3 -6
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.d.ts +3 -4
- package/esm/LinearAlignmentsDisplay/components/AlignmentsDisplay.js +3 -3
- package/esm/LinearAlignmentsDisplay/models/model.d.ts +5 -9
- package/esm/LinearAlignmentsDisplay/models/model.js +1 -0
- package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.d.ts +49 -27
- package/esm/LinearPileupDisplay/SharedLinearPileupDisplayMixin.js +20 -2
- package/esm/LinearPileupDisplay/components/ColorByModifications.d.ts +4 -5
- package/esm/LinearPileupDisplay/components/ColorByModifications.js +3 -4
- package/esm/LinearPileupDisplay/components/ColorByTag.d.ts +7 -5
- package/esm/LinearPileupDisplay/components/ColorByTag.js +4 -7
- package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.d.ts +3 -4
- package/esm/LinearPileupDisplay/components/LinearPileupDisplayBlurb.js +2 -2
- package/esm/LinearPileupDisplay/components/SetFeatureHeight.d.ts +4 -5
- package/esm/LinearPileupDisplay/components/SetFeatureHeight.js +3 -3
- package/esm/LinearPileupDisplay/components/SetMaxHeight.d.ts +3 -4
- package/esm/LinearPileupDisplay/components/SetMaxHeight.js +3 -3
- package/esm/LinearPileupDisplay/components/SortByTag.d.ts +3 -4
- package/esm/LinearPileupDisplay/components/SortByTag.js +3 -3
- package/esm/LinearPileupDisplay/model.d.ts +56 -35
- package/esm/LinearPileupDisplay/model.js +3 -2
- package/esm/LinearReadArcsDisplay/components/ReactComponent.d.ts +2 -2
- package/esm/LinearReadArcsDisplay/components/ReactComponent.js +2 -1
- package/esm/LinearReadArcsDisplay/model.d.ts +9 -14
- package/esm/LinearReadCloudDisplay/components/ReactComponent.d.ts +2 -2
- package/esm/LinearReadCloudDisplay/components/ReactComponent.js +2 -1
- package/esm/LinearReadCloudDisplay/drawPairChains.js +1 -2
- package/esm/LinearReadCloudDisplay/model.d.ts +13 -15
- package/esm/LinearSNPCoverageDisplay/components/Tooltip.js +1 -1
- package/esm/LinearSNPCoverageDisplay/models/model.d.ts +18 -423
- package/esm/LinearSNPCoverageDisplay/models/model.js +18 -0
- package/esm/MismatchParser/index.js +6 -8
- package/esm/PileupRenderer/PileupRenderer.js +0 -2
- package/esm/PileupRenderer/colorBy.js +1 -1
- package/esm/PileupRenderer/components/PileupRendering.d.ts +9 -10
- package/esm/PileupRenderer/components/PileupRendering.js +3 -5
- package/esm/PileupRenderer/getAlignmentShapeColor.js +1 -1
- package/esm/PileupRenderer/layoutFeature.js +1 -2
- package/esm/PileupRenderer/makeImageData.d.ts +1 -3
- package/esm/PileupRenderer/renderMethylation.js +5 -10
- package/esm/PileupRenderer/renderMismatches.d.ts +2 -6
- package/esm/PileupRenderer/renderMismatches.js +8 -11
- package/esm/PileupRenderer/renderModifications.js +4 -8
- package/esm/PileupRenderer/renderSoftClipping.js +26 -25
- package/esm/PileupRenderer/sortUtil.js +2 -2
- package/esm/SNPCoverageAdapter/util.d.ts +9 -13
- package/esm/SNPCoverageRenderer/SNPCoverageRenderer.js +6 -12
- package/esm/shared/BaseDisplayComponent.d.ts +2 -2
- package/esm/shared/BaseDisplayComponent.js +3 -2
- package/esm/shared/FilterByTag.d.ts +6 -15
- package/esm/shared/FilterByTag.js +4 -6
- package/esm/shared/fetchChains.js +1 -0
- package/esm/shared/index.d.ts +9 -0
- package/esm/util.d.ts +3 -9
- package/package.json +3 -4
|
@@ -30,7 +30,7 @@ const mobx_react_1 = require("mobx-react");
|
|
|
30
30
|
// used so that user can click-away-from-feature below the laid out features
|
|
31
31
|
// (issue #1248)
|
|
32
32
|
const canvasPadding = 100;
|
|
33
|
-
|
|
33
|
+
const PileupRendering = (0, mobx_react_1.observer)(function (props) {
|
|
34
34
|
var _a;
|
|
35
35
|
const { onMouseMove, blockKey, displayModel, width, height, regions, bpPerPx, sortedBy, colorBy, filterBy, } = props;
|
|
36
36
|
const { selectedFeatureId, featureIdUnderMouse, contextMenuFeature } = displayModel;
|
|
@@ -133,10 +133,8 @@ function PileupRendering(props) {
|
|
|
133
133
|
}
|
|
134
134
|
function callMouseHandler(handlerName, event) {
|
|
135
135
|
// @ts-expect-error
|
|
136
|
-
// eslint-disable-next-line react/destructuring-assignment
|
|
137
136
|
const featureHandler = props[`onFeature${handlerName}`];
|
|
138
137
|
// @ts-expect-error
|
|
139
|
-
// eslint-disable-next-line react/destructuring-assignment
|
|
140
138
|
const canvasHandler = props[`on${handlerName}`];
|
|
141
139
|
if (featureHandler && featureIdUnderMouse) {
|
|
142
140
|
featureHandler(event, featureIdUnderMouse);
|
|
@@ -157,5 +155,5 @@ function PileupRendering(props) {
|
|
|
157
155
|
.join('-')}`, style: { position: 'relative', width: canvasWidth, height } },
|
|
158
156
|
react_1.default.createElement(ui_1.PrerenderedCanvas, { ...props, style: { position: 'absolute', left: 0, top: 0 } }),
|
|
159
157
|
react_1.default.createElement("canvas", { "data-testid": "pileup_overlay_canvas", width: canvasWidth, height: height + canvasPadding, style: { position: 'absolute', left: 0, top: 0 }, className: "highlightOverlayCanvas", ref: highlightOverlayCanvas, onMouseDown: event => onMouseDown(event), onMouseEnter: event => onMouseEnter(event), onMouseOut: event => onMouseOut(event), onMouseOver: event => onMouseOver(event), onMouseUp: event => onMouseUp(event), onMouseLeave: event => onMouseLeave(event), onMouseMove: event => mouseMove(event), onClick: event => onClick(event), onContextMenu: event => onContextMenu(event), onFocus: () => { }, onBlur: () => { } })));
|
|
160
|
-
}
|
|
161
|
-
exports.default =
|
|
158
|
+
});
|
|
159
|
+
exports.default = PileupRendering;
|
|
@@ -39,7 +39,7 @@ function getAlignmentShapeColor({ colorType, tag, feature, config, defaultColor,
|
|
|
39
39
|
}[val] || 'color_nostrand'];
|
|
40
40
|
}
|
|
41
41
|
else {
|
|
42
|
-
return colorTagMap[val] || color_1.fillColor
|
|
42
|
+
return colorTagMap[val] || color_1.fillColor.color_nostrand;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
case 'insertSizeAndPairOrientation':
|
|
@@ -10,8 +10,7 @@ function layoutFeature({ feature, layout, bpPerPx, region, showSoftClip, heightP
|
|
|
10
10
|
const mismatches = feature.get('mismatches');
|
|
11
11
|
const seq = feature.get('seq');
|
|
12
12
|
if (seq) {
|
|
13
|
-
for (
|
|
14
|
-
const { type, start, cliplen = 0 } = mismatches[i];
|
|
13
|
+
for (const { type, start, cliplen = 0 } of mismatches) {
|
|
15
14
|
if (type === 'softclip') {
|
|
16
15
|
start === 0 ? (expansionBefore = cliplen) : (expansionAfter = cliplen);
|
|
17
16
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { Feature } from '@jbrowse/core/util';
|
|
2
2
|
import { RenderArgsDeserializedWithFeaturesAndLayout } from './PileupRenderer';
|
|
3
|
-
export
|
|
4
|
-
Color: Awaited<typeof import('color')>;
|
|
5
|
-
}
|
|
3
|
+
export type RenderArgsWithColor = RenderArgsDeserializedWithFeaturesAndLayout;
|
|
6
4
|
interface LayoutFeature {
|
|
7
5
|
heightPx: number;
|
|
8
6
|
topPx: number;
|
|
@@ -4,11 +4,12 @@ exports.renderMethylation = void 0;
|
|
|
4
4
|
const util_1 = require("@jbrowse/core/util");
|
|
5
5
|
const MismatchParser_1 = require("../MismatchParser");
|
|
6
6
|
const util_2 = require("./util");
|
|
7
|
+
const colord_1 = require("@jbrowse/core/util/colord");
|
|
7
8
|
// Color by methylation is slightly modified version of color by
|
|
8
9
|
// modifications that focuses on CpG sites, with non-methylated CpG colored
|
|
9
10
|
function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }) {
|
|
10
11
|
var _a, _b;
|
|
11
|
-
const { regionSequence
|
|
12
|
+
const { regionSequence } = renderArgs;
|
|
12
13
|
const { feature, topPx, heightPx } = feat;
|
|
13
14
|
if (!regionSequence) {
|
|
14
15
|
throw new Error('region sequence required for methylation');
|
|
@@ -23,15 +24,9 @@ function renderMethylation({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth
|
|
|
23
24
|
function getCol(k) {
|
|
24
25
|
if (methBins[k]) {
|
|
25
26
|
const p = methProbs[k] || 0;
|
|
26
|
-
return p > 0.5
|
|
27
|
-
?
|
|
28
|
-
|
|
29
|
-
.hsl()
|
|
30
|
-
.string()
|
|
31
|
-
: Color('blue')
|
|
32
|
-
.alpha(1 - p * 2)
|
|
33
|
-
.hsl()
|
|
34
|
-
.string();
|
|
27
|
+
return (p > 0.5
|
|
28
|
+
? (0, colord_1.colord)('red').alpha((p - 0.5) * 2)
|
|
29
|
+
: (0, colord_1.colord)('blue').alpha(1 - p * 2)).toHslString();
|
|
35
30
|
}
|
|
36
31
|
return undefined;
|
|
37
32
|
}
|
|
@@ -4,12 +4,8 @@ export declare function renderMismatches({ ctx, feat, renderArgs, minSubfeatureW
|
|
|
4
4
|
ctx: CanvasRenderingContext2D;
|
|
5
5
|
feat: LayoutFeature;
|
|
6
6
|
renderArgs: RenderArgsWithColor;
|
|
7
|
-
colorForBase:
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
contrastForBase: {
|
|
11
|
-
[key: string]: string;
|
|
12
|
-
};
|
|
7
|
+
colorForBase: Record<string, string>;
|
|
8
|
+
contrastForBase: Record<string, string>;
|
|
13
9
|
mismatchAlpha?: boolean;
|
|
14
10
|
drawIndels?: boolean;
|
|
15
11
|
drawSNPsMuted?: boolean;
|
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.renderMismatches = void 0;
|
|
4
4
|
const util_1 = require("@jbrowse/core/util");
|
|
5
5
|
const util_2 = require("./util");
|
|
6
|
+
const colord_1 = require("@jbrowse/core/util/colord");
|
|
6
7
|
function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInsertionIndicatorScale, mismatchAlpha, charWidth, charHeight, colorForBase, contrastForBase, canvasWidth, drawSNPsMuted, drawIndels = true, }) {
|
|
7
|
-
const {
|
|
8
|
+
const { bpPerPx, regions } = renderArgs;
|
|
8
9
|
const { heightPx, topPx, feature } = feat;
|
|
9
10
|
const [region] = regions;
|
|
10
11
|
const start = feature.get('start');
|
|
@@ -19,8 +20,7 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
19
20
|
}
|
|
20
21
|
// two pass rendering: first pass, draw all the mismatches except wide
|
|
21
22
|
// insertion markers
|
|
22
|
-
for (
|
|
23
|
-
const mismatch = mismatches[i];
|
|
23
|
+
for (const mismatch of mismatches) {
|
|
24
24
|
const mstart = start + mismatch.start;
|
|
25
25
|
const mlen = mismatch.length;
|
|
26
26
|
const mbase = mismatch.base;
|
|
@@ -32,10 +32,9 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
32
32
|
const c = mismatchAlpha
|
|
33
33
|
? mismatch.qual === undefined
|
|
34
34
|
? baseColor
|
|
35
|
-
:
|
|
35
|
+
: (0, colord_1.colord)(baseColor)
|
|
36
36
|
.alpha(Math.min(1, mismatch.qual / 50))
|
|
37
|
-
.
|
|
38
|
-
.string()
|
|
37
|
+
.toHslString()
|
|
39
38
|
: baseColor;
|
|
40
39
|
(0, util_2.fillRect)(ctx, Math.round(leftPx), topPx, widthPx, heightPx, canvasWidth, c);
|
|
41
40
|
}
|
|
@@ -47,10 +46,9 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
47
46
|
ctx.fillStyle = mismatchAlpha
|
|
48
47
|
? mismatch.qual === undefined
|
|
49
48
|
? contrastColor
|
|
50
|
-
:
|
|
49
|
+
: (0, colord_1.colord)(contrastColor)
|
|
51
50
|
.alpha(Math.min(1, mismatch.qual / 50))
|
|
52
|
-
.
|
|
53
|
-
.string()
|
|
51
|
+
.toHslString()
|
|
54
52
|
: contrastColor;
|
|
55
53
|
ctx.fillText(mbase, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
|
|
56
54
|
}
|
|
@@ -105,8 +103,7 @@ function renderMismatches({ ctx, feat, renderArgs, minSubfeatureWidth, largeInse
|
|
|
105
103
|
}
|
|
106
104
|
// second pass, draw wide insertion markers on top
|
|
107
105
|
if (drawIndels) {
|
|
108
|
-
for (
|
|
109
|
-
const mismatch = mismatches[i];
|
|
106
|
+
for (const mismatch of mismatches) {
|
|
110
107
|
const mstart = start + mismatch.start;
|
|
111
108
|
const mlen = mismatch.length;
|
|
112
109
|
const [leftPx] = (0, util_1.bpSpanPx)(mstart, mstart + mlen, region, bpPerPx);
|
|
@@ -5,6 +5,7 @@ const util_1 = require("@jbrowse/core/util");
|
|
|
5
5
|
const MismatchParser_1 = require("../MismatchParser");
|
|
6
6
|
const util_2 = require("../util");
|
|
7
7
|
const util_3 = require("./util");
|
|
8
|
+
const colord_1 = require("@jbrowse/core/util/colord");
|
|
8
9
|
// render modifications stored in MM tag in BAM
|
|
9
10
|
//
|
|
10
11
|
// ML stores probabilities as array of numerics and MP is scaled phred scores
|
|
@@ -17,7 +18,7 @@ const util_3 = require("./util");
|
|
|
17
18
|
// about low qual calls <20 approx
|
|
18
19
|
function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWidth, }) {
|
|
19
20
|
const { feature, topPx, heightPx } = feat;
|
|
20
|
-
const {
|
|
21
|
+
const { modificationTagMap = {} } = renderArgs;
|
|
21
22
|
const seq = feature.get('seq');
|
|
22
23
|
if (!seq) {
|
|
23
24
|
return;
|
|
@@ -33,17 +34,12 @@ function renderModifications({ ctx, feat, region, bpPerPx, renderArgs, canvasWid
|
|
|
33
34
|
let probIndex = 0;
|
|
34
35
|
for (const { type, positions } of modifications) {
|
|
35
36
|
const col = modificationTagMap[type] || 'black';
|
|
36
|
-
const base =
|
|
37
|
+
const base = (0, colord_1.colord)(col);
|
|
37
38
|
for (const readPos of (0, MismatchParser_1.getNextRefPos)(cigarOps, positions)) {
|
|
38
39
|
const r = start + readPos;
|
|
39
40
|
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(r, r + 1, region, bpPerPx);
|
|
40
41
|
const prob = (probabilities === null || probabilities === void 0 ? void 0 : probabilities[probIndex]) || 0;
|
|
41
|
-
const c = prob !== 1
|
|
42
|
-
? base
|
|
43
|
-
.alpha(prob + 0.1)
|
|
44
|
-
.hsl()
|
|
45
|
-
.string()
|
|
46
|
-
: col;
|
|
42
|
+
const c = prob !== 1 ? base.alpha(prob + 0.1).toHslString() : col;
|
|
47
43
|
const w = rightPx - leftPx + 0.5;
|
|
48
44
|
(0, util_3.fillRect)(ctx, leftPx, topPx, w, heightPx, canvasWidth, c);
|
|
49
45
|
probIndex++;
|
|
@@ -16,32 +16,33 @@ function renderSoftClipping({ ctx, feat, renderArgs, config, theme, colorForBase
|
|
|
16
16
|
if (!(seq && mismatches)) {
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
19
|
+
const heightLim = charHeight - 2;
|
|
20
|
+
for (const mismatch of mismatches) {
|
|
21
|
+
if (mismatch.type === 'softclip') {
|
|
22
|
+
const len = mismatch.cliplen || 0;
|
|
23
|
+
const s = feature.get('start');
|
|
24
|
+
const start = mismatch.start === 0 ? s - len : s + mismatch.start;
|
|
25
|
+
for (let k = 0; k < len; k += 1) {
|
|
26
|
+
const base = seq.charAt(k + mismatch.start);
|
|
27
|
+
// If softclip length+start is longer than sequence, no need to
|
|
28
|
+
// continue showing base
|
|
29
|
+
if (!base) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const s0 = start + k;
|
|
33
|
+
const [leftPx, rightPx] = (0, util_1.bpSpanPx)(s0, s0 + 1, region, bpPerPx);
|
|
34
|
+
const widthPx = Math.max(minFeatWidth, rightPx - leftPx);
|
|
35
|
+
// Black accounts for IUPAC ambiguity code bases such as N that
|
|
36
|
+
// show in soft clipping
|
|
37
|
+
const baseColor = colorForBase[base] || '#000000';
|
|
38
|
+
ctx.fillStyle = baseColor;
|
|
39
|
+
(0, util_2.fillRect)(ctx, leftPx, topPx, widthPx, heightPx, canvasWidth);
|
|
40
|
+
if (widthPx >= charWidth && heightPx >= heightLim) {
|
|
41
|
+
ctx.fillStyle = theme.palette.getContrastText(baseColor);
|
|
42
|
+
ctx.fillText(base, leftPx + (widthPx - charWidth) / 2 + 1, topPx + heightPx);
|
|
43
|
+
}
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
|
-
}
|
|
46
|
+
}
|
|
46
47
|
}
|
|
47
48
|
exports.renderSoftClipping = renderSoftClipping;
|
|
@@ -59,8 +59,8 @@ const sortFeature = (features, sortedBy) => {
|
|
|
59
59
|
featuresInCenterLine.sort((a, b) => {
|
|
60
60
|
const aMismatch = baseMap.get(a.id());
|
|
61
61
|
const bMismatch = baseMap.get(b.id());
|
|
62
|
-
const acode = bMismatch
|
|
63
|
-
const bcode = aMismatch
|
|
62
|
+
const acode = bMismatch === null || bMismatch === void 0 ? void 0 : bMismatch.base.toUpperCase();
|
|
63
|
+
const bcode = aMismatch === null || aMismatch === void 0 ? void 0 : aMismatch.base.toUpperCase();
|
|
64
64
|
if (acode === bcode && acode === '*') {
|
|
65
65
|
// @ts-expect-error
|
|
66
66
|
return aMismatch.length - bMismatch.length;
|
|
@@ -1,18 +1,14 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
};
|
|
10
|
-
}
|
|
1
|
+
export type SkipMap = Record<string, {
|
|
2
|
+
score: number;
|
|
3
|
+
feature: unknown;
|
|
4
|
+
start: number;
|
|
5
|
+
end: number;
|
|
6
|
+
strand: number;
|
|
7
|
+
xs: string;
|
|
8
|
+
}>;
|
|
11
9
|
export interface BinType {
|
|
12
10
|
total?: number;
|
|
13
|
-
strands?:
|
|
14
|
-
[key: string]: number;
|
|
15
|
-
};
|
|
11
|
+
strands?: Record<string, number>;
|
|
16
12
|
}
|
|
17
13
|
export interface Bin {
|
|
18
14
|
refbase?: string;
|
|
@@ -61,8 +61,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
|
|
|
61
61
|
// Use two pass rendering, which helps in visualizing the SNPs at higher
|
|
62
62
|
// bpPerPx First pass: draw the gray background
|
|
63
63
|
ctx.fillStyle = colorForBase.total;
|
|
64
|
-
for (
|
|
65
|
-
const feature = coverage[i];
|
|
64
|
+
for (const feature of coverage) {
|
|
66
65
|
const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
|
|
67
66
|
const w = rightPx - leftPx + fudgeFactor;
|
|
68
67
|
const score = feature.get('score');
|
|
@@ -80,8 +79,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
|
|
|
80
79
|
// Second pass: draw the SNP data, and add a minimum feature width of 1px
|
|
81
80
|
// which can be wider than the actual bpPerPx This reduces overdrawing of
|
|
82
81
|
// the grey background over the SNPs
|
|
83
|
-
for (
|
|
84
|
-
const feature = coverage[i];
|
|
82
|
+
for (const feature of coverage) {
|
|
85
83
|
const [leftPx, rightPx] = (0, util_1.featureSpanPx)(feature, region, bpPerPx);
|
|
86
84
|
const score = feature.get('score');
|
|
87
85
|
const snpinfo = feature.get('snpinfo');
|
|
@@ -89,8 +87,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
|
|
|
89
87
|
const totalScore = snpinfo.total;
|
|
90
88
|
const keys = Object.keys(snpinfo.cov).sort();
|
|
91
89
|
let curr = 0;
|
|
92
|
-
for (
|
|
93
|
-
const base = keys[i];
|
|
90
|
+
for (const base of keys) {
|
|
94
91
|
const { total } = snpinfo.cov[base];
|
|
95
92
|
ctx.fillStyle =
|
|
96
93
|
colorForBase[base] ||
|
|
@@ -105,8 +102,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
|
|
|
105
102
|
const indicatorHeight = 4.5;
|
|
106
103
|
if (drawInterbaseCounts) {
|
|
107
104
|
let curr = 0;
|
|
108
|
-
for (
|
|
109
|
-
const base = interbaseEvents[i];
|
|
105
|
+
for (const base of interbaseEvents) {
|
|
110
106
|
const { total } = snpinfo.noncov[base];
|
|
111
107
|
const r = 0.6;
|
|
112
108
|
ctx.fillStyle = colorForBase[base];
|
|
@@ -118,8 +114,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
|
|
|
118
114
|
let accum = 0;
|
|
119
115
|
let max = 0;
|
|
120
116
|
let maxBase = '';
|
|
121
|
-
for (
|
|
122
|
-
const base = interbaseEvents[i];
|
|
117
|
+
for (const base of interbaseEvents) {
|
|
123
118
|
const { total } = snpinfo.noncov[base];
|
|
124
119
|
accum += total;
|
|
125
120
|
if (total > max) {
|
|
@@ -144,8 +139,7 @@ class SNPCoverageRenderer extends plugin_wiggle_1.WiggleBaseRenderer {
|
|
|
144
139
|
prevTotal = totalScore;
|
|
145
140
|
}
|
|
146
141
|
if (drawArcs) {
|
|
147
|
-
for (
|
|
148
|
-
const f = skips[i];
|
|
142
|
+
for (const f of skips) {
|
|
149
143
|
const [left, right] = (0, util_1.bpSpanPx)(f.get('start'), f.get('end'), region, bpPerPx);
|
|
150
144
|
ctx.beginPath();
|
|
151
145
|
const str = f.get('strand');
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { LinearReadCloudDisplayModel } from '../LinearReadCloudDisplay/model';
|
|
3
3
|
import { LinearReadArcsDisplayModel } from '../LinearReadArcsDisplay/model';
|
|
4
|
-
declare const
|
|
4
|
+
declare const BaseDisplayComponent: ({ model, children, }: {
|
|
5
5
|
model: LinearReadArcsDisplayModel | LinearReadCloudDisplayModel;
|
|
6
6
|
children?: React.ReactNode;
|
|
7
7
|
}) => React.JSX.Element | null;
|
|
8
|
-
export default
|
|
8
|
+
export default BaseDisplayComponent;
|
|
@@ -25,7 +25,7 @@ const useStyles = (0, mui_1.makeStyles)()(theme => {
|
|
|
25
25
|
},
|
|
26
26
|
};
|
|
27
27
|
});
|
|
28
|
-
|
|
28
|
+
const BaseDisplayComponent = (0, mobx_react_1.observer)(function ({ model, children, }) {
|
|
29
29
|
const { error, regionTooLarge } = model;
|
|
30
30
|
return error ? (react_1.default.createElement(plugin_linear_genome_view_1.BlockMsg, { message: `${error}`, severity: "error", buttonText: "Reload", action: model.reload })) : regionTooLarge ? (model.regionCannotBeRendered()) : (react_1.default.createElement(DataDisplay, { model: model }, children));
|
|
31
31
|
});
|
|
@@ -46,3 +46,4 @@ const LoadingBar = (0, mobx_react_1.observer)(function ({ model, }) {
|
|
|
46
46
|
return (react_1.default.createElement("div", { className: classes.loading },
|
|
47
47
|
react_1.default.createElement(ui_1.LoadingEllipses, { message: message })));
|
|
48
48
|
});
|
|
49
|
+
exports.default = BaseDisplayComponent;
|
|
@@ -1,19 +1,10 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
flagInclude: number;
|
|
5
|
-
readName?: string;
|
|
6
|
-
tagFilter?: {
|
|
7
|
-
tag: string;
|
|
8
|
-
value: string;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
declare function FilterByTagDlg(props: {
|
|
2
|
+
import { IFilter } from '.';
|
|
3
|
+
declare const FilterByTagDialog: (props: {
|
|
12
4
|
model: {
|
|
13
|
-
filterBy:
|
|
14
|
-
setFilterBy: (arg:
|
|
5
|
+
filterBy: IFilter;
|
|
6
|
+
setFilterBy: (arg: IFilter) => void;
|
|
15
7
|
};
|
|
16
8
|
handleClose: () => void;
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
export default _default;
|
|
9
|
+
}) => React.JSX.Element;
|
|
10
|
+
export default FilterByTagDialog;
|
|
@@ -70,7 +70,7 @@ function Bitmask(props) {
|
|
|
70
70
|
react_1.default.createElement("label", { htmlFor: key }, name)));
|
|
71
71
|
})));
|
|
72
72
|
}
|
|
73
|
-
function
|
|
73
|
+
const FilterByTagDialog = (0, mobx_react_1.observer)(function (props) {
|
|
74
74
|
var _a, _b;
|
|
75
75
|
const { model, handleClose } = props;
|
|
76
76
|
const { classes } = useStyles();
|
|
@@ -99,9 +99,7 @@ function FilterByTagDlg(props) {
|
|
|
99
99
|
react_1.default.createElement(Bitmask, { flag: flagExclude, setFlag: setFlagExclude })))),
|
|
100
100
|
react_1.default.createElement(material_1.Paper, { className: classes.paper, variant: "outlined" },
|
|
101
101
|
react_1.default.createElement(material_1.Typography, null, "Filter by tag name and value. Use * in the value field to get all reads containing any value for that tag. Example: filter tag name SA with value * to get all split/supplementary reads. Other examples include HP for haplotype, or RG for read group"),
|
|
102
|
-
react_1.default.createElement(material_1.TextField, { className: classes.field, value: tag, onChange: event => setTag(event.target.value), placeholder: "Enter tag name", inputProps: {
|
|
103
|
-
maxLength: 2,
|
|
104
|
-
}, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '' }),
|
|
102
|
+
react_1.default.createElement(material_1.TextField, { className: classes.field, value: tag, onChange: event => setTag(event.target.value), placeholder: "Enter tag name", inputProps: { maxLength: 2 }, error: tag.length === 2 && !validTag, helperText: tag.length === 2 && !validTag ? 'Not a valid tag' : '' }),
|
|
105
103
|
react_1.default.createElement(material_1.TextField, { className: classes.field, value: tagValue, onChange: event => setTagValue(event.target.value), placeholder: "Enter tag value" })),
|
|
106
104
|
react_1.default.createElement(material_1.Paper, { className: classes.paper, variant: "outlined" },
|
|
107
105
|
react_1.default.createElement(material_1.Typography, null, "Filter by read name"),
|
|
@@ -122,5 +120,5 @@ function FilterByTagDlg(props) {
|
|
|
122
120
|
handleClose();
|
|
123
121
|
} }, "Submit"),
|
|
124
122
|
react_1.default.createElement(material_1.Button, { variant: "contained", color: "secondary", onClick: () => handleClose() }, "Cancel")))));
|
|
125
|
-
}
|
|
126
|
-
exports.default =
|
|
123
|
+
});
|
|
124
|
+
exports.default = FilterByTagDialog;
|
|
@@ -4,6 +4,7 @@ exports.fetchChains = void 0;
|
|
|
4
4
|
const util_1 = require("@jbrowse/core/util");
|
|
5
5
|
const mobx_state_tree_1 = require("mobx-state-tree");
|
|
6
6
|
async function fetchChains(self) {
|
|
7
|
+
// @ts-expect-error
|
|
7
8
|
const { rpcSessionId: sessionId } = (0, util_1.getContainingTrack)(self);
|
|
8
9
|
const { rpcManager } = (0, util_1.getSession)(self);
|
|
9
10
|
const view = (0, util_1.getContainingView)(self);
|
package/dist/shared/index.d.ts
CHANGED
|
@@ -33,4 +33,13 @@ export declare const FilterModel: import("mobx-state-tree").IModelType<{
|
|
|
33
33
|
value: import("mobx-state-tree").ISimpleType<string>;
|
|
34
34
|
}, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>>;
|
|
35
35
|
}, {}, import("mobx-state-tree")._NotCustomized, import("mobx-state-tree")._NotCustomized>;
|
|
36
|
+
export interface IFilter {
|
|
37
|
+
flagExclude: number;
|
|
38
|
+
flagInclude: number;
|
|
39
|
+
readName?: string;
|
|
40
|
+
tagFilter?: {
|
|
41
|
+
tag: string;
|
|
42
|
+
value: string;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
36
45
|
export {};
|
package/dist/util.d.ts
CHANGED
|
@@ -5,15 +5,9 @@ import { IAutorunOptions } from 'mobx';
|
|
|
5
5
|
export declare function getTag(feature: Feature, tag: string): any;
|
|
6
6
|
export declare function getTagAlt(feature: Feature, tag: string, alt: string): any;
|
|
7
7
|
export declare const orientationTypes: {
|
|
8
|
-
fr:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
rf: {
|
|
12
|
-
[key: string]: string;
|
|
13
|
-
};
|
|
14
|
-
ff: {
|
|
15
|
-
[key: string]: string;
|
|
16
|
-
};
|
|
8
|
+
fr: Record<string, string>;
|
|
9
|
+
rf: Record<string, string>;
|
|
10
|
+
ff: Record<string, string>;
|
|
17
11
|
};
|
|
18
12
|
export declare const pairMap: {
|
|
19
13
|
readonly LR: "color_pair_lr";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { IAnyStateTreeNode } from 'mobx-state-tree';
|
|
3
|
-
declare const
|
|
3
|
+
declare const AlignmentsFeatureDetails: (props: {
|
|
4
4
|
model: IAnyStateTreeNode;
|
|
5
5
|
}) => React.JSX.Element;
|
|
6
|
-
export default
|
|
6
|
+
export default AlignmentsFeatureDetails;
|
|
@@ -92,7 +92,7 @@ function PairLink({ locString, model, }) {
|
|
|
92
92
|
navToLoc(locString, model);
|
|
93
93
|
}, href: "#" }, locString));
|
|
94
94
|
}
|
|
95
|
-
|
|
95
|
+
const AlignmentsFeatureDetails = observer(function (props) {
|
|
96
96
|
const { model } = props;
|
|
97
97
|
const feat = clone(model.featureData);
|
|
98
98
|
const SA = getTag('SA', feat);
|
|
@@ -103,3 +103,4 @@ export default observer(function AlignmentFeatureDetails(props) {
|
|
|
103
103
|
SA ? React.createElement(SupplementaryAlignments, { model: model, tag: SA }) : null,
|
|
104
104
|
feat.flags !== undefined ? (React.createElement(AlignmentFlags, { feature: feat, ...props })) : null));
|
|
105
105
|
});
|
|
106
|
+
export default AlignmentsFeatureDetails;
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { IAnyStateTreeNode } from 'mobx-state-tree';
|
|
2
2
|
export declare function getTag(tag: string, feat: {
|
|
3
|
-
tags?:
|
|
4
|
-
[key: string]: unknown;
|
|
5
|
-
};
|
|
3
|
+
tags?: Record<string, unknown>;
|
|
6
4
|
[key: string]: unknown;
|
|
7
5
|
}): unknown;
|
|
8
6
|
export declare function navToLoc(locString: string, model: IAnyStateTreeNode): Promise<void>;
|
|
@@ -2,6 +2,7 @@ import { BamFile } from '@gmod/bam';
|
|
|
2
2
|
import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
3
3
|
import { Region } from '@jbrowse/core/util/types';
|
|
4
4
|
import { Feature } from '@jbrowse/core/util';
|
|
5
|
+
import { IFilter } from '../shared';
|
|
5
6
|
interface Header {
|
|
6
7
|
idToName: string[];
|
|
7
8
|
nameToId: Record<string, number>;
|
|
@@ -29,15 +30,7 @@ export default class BamAdapter extends BaseFeatureDataAdapter {
|
|
|
29
30
|
getFeatures(region: Region & {
|
|
30
31
|
originalRefName?: string;
|
|
31
32
|
}, opts?: BaseOptions & {
|
|
32
|
-
filterBy:
|
|
33
|
-
flagInclude: number;
|
|
34
|
-
flagExclude: number;
|
|
35
|
-
tagFilter: {
|
|
36
|
-
tag: string;
|
|
37
|
-
value: unknown;
|
|
38
|
-
};
|
|
39
|
-
readName: string;
|
|
40
|
-
};
|
|
33
|
+
filterBy: IFilter;
|
|
41
34
|
}): import("rxjs").Observable<Feature>;
|
|
42
35
|
getMultiRegionFeatureDensityStats(regions: Region[], opts?: BaseOptions): Promise<import("@jbrowse/core/data_adapters/BaseAdapter").FeatureDensityStats | {
|
|
43
36
|
bytes: number;
|
|
@@ -2,20 +2,12 @@ import { IndexedCramFile, CramRecord } from '@gmod/cram';
|
|
|
2
2
|
import { BaseFeatureDataAdapter, BaseOptions, BaseSequenceAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
3
3
|
import { Region, Feature } from '@jbrowse/core/util';
|
|
4
4
|
import CramSlightlyLazyFeature from './CramSlightlyLazyFeature';
|
|
5
|
+
import { IFilter } from '../shared';
|
|
5
6
|
interface Header {
|
|
6
7
|
idToName?: string[];
|
|
7
8
|
nameToId?: Record<string, number>;
|
|
8
9
|
readGroups?: (string | undefined)[];
|
|
9
10
|
}
|
|
10
|
-
interface FilterBy {
|
|
11
|
-
flagInclude: number;
|
|
12
|
-
flagExclude: number;
|
|
13
|
-
tagFilter: {
|
|
14
|
-
tag: string;
|
|
15
|
-
value: unknown;
|
|
16
|
-
};
|
|
17
|
-
readName: string;
|
|
18
|
-
}
|
|
19
11
|
export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
20
12
|
samHeader: Header;
|
|
21
13
|
private setupP?;
|
|
@@ -30,7 +22,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
30
22
|
cram: IndexedCramFile;
|
|
31
23
|
sequenceAdapter: BaseSequenceAdapter;
|
|
32
24
|
}>;
|
|
33
|
-
getHeader(
|
|
25
|
+
getHeader(_opts?: BaseOptions): Promise<string | undefined>;
|
|
34
26
|
private seqFetch;
|
|
35
27
|
private setupPre;
|
|
36
28
|
private setup;
|
|
@@ -41,7 +33,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
41
33
|
getFeatures(region: Region & {
|
|
42
34
|
originalRefName?: string;
|
|
43
35
|
}, opts?: BaseOptions & {
|
|
44
|
-
filterBy:
|
|
36
|
+
filterBy: IFilter;
|
|
45
37
|
}): import("rxjs").Observable<Feature>;
|
|
46
38
|
freeResources(): void;
|
|
47
39
|
cramRecordToFeature(record: CramRecord): CramSlightlyLazyFeature;
|
|
@@ -5,6 +5,7 @@ import { openLocation } from '@jbrowse/core/util/io';
|
|
|
5
5
|
import { ObservableCreate } from '@jbrowse/core/util/rxjs';
|
|
6
6
|
import { toArray } from 'rxjs/operators';
|
|
7
7
|
import { firstValueFrom } from 'rxjs';
|
|
8
|
+
// locals
|
|
8
9
|
import CramSlightlyLazyFeature from './CramSlightlyLazyFeature';
|
|
9
10
|
export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
10
11
|
constructor() {
|
|
@@ -49,7 +50,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
|
|
|
49
50
|
}
|
|
50
51
|
return this.configureP;
|
|
51
52
|
}
|
|
52
|
-
async getHeader(
|
|
53
|
+
async getHeader(_opts) {
|
|
53
54
|
const { cram } = await this.configure();
|
|
54
55
|
return cram.cram.getHeaderText();
|
|
55
56
|
}
|
package/esm/CramAdapter/util.js
CHANGED
|
@@ -8,9 +8,7 @@ export function readFeaturesToMismatches(readFeatures, start, qual) {
|
|
|
8
8
|
let refPos = 0;
|
|
9
9
|
let sublen = 0;
|
|
10
10
|
let lastPos = start;
|
|
11
|
-
for (
|
|
12
|
-
const f = readFeatures[i];
|
|
13
|
-
const { code, pos, data, sub, ref } = f;
|
|
11
|
+
for (const { refPos: p, code, pos, data, sub, ref } of readFeatures) {
|
|
14
12
|
sublen = refPos - lastPos;
|
|
15
13
|
lastPos = refPos;
|
|
16
14
|
if (sublen && insLen > 0) {
|
|
@@ -22,7 +20,7 @@ export function readFeaturesToMismatches(readFeatures, start, qual) {
|
|
|
22
20
|
};
|
|
23
21
|
insLen = 0;
|
|
24
22
|
}
|
|
25
|
-
refPos =
|
|
23
|
+
refPos = p - 1 - start;
|
|
26
24
|
if (code === 'X') {
|
|
27
25
|
// substitution
|
|
28
26
|
mismatches[j++] = {
|
|
@@ -130,8 +128,7 @@ export function readFeaturesToCIGAR(readFeatures, alignmentStart, readLen, refRe
|
|
|
130
128
|
let sublen = 0;
|
|
131
129
|
let insLen = 0;
|
|
132
130
|
if (readFeatures !== undefined) {
|
|
133
|
-
for (
|
|
134
|
-
const { code, refPos, sub, data } = readFeatures[i];
|
|
131
|
+
for (const { code, refPos, sub, data } of readFeatures) {
|
|
135
132
|
sublen = refPos - lastPos;
|
|
136
133
|
seq += ref.slice(lastPos - refStart, refPos - refStart);
|
|
137
134
|
lastPos = refPos;
|