jbrowse-plugin-mafviewer 1.3.2 → 1.4.1
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/README.md +0 -47
- package/dist/LinearMafRenderer/LinearMafRenderer.d.ts +9 -3
- package/dist/LinearMafRenderer/components/LinearMafRendering.d.ts +13 -0
- package/dist/LinearMafRenderer/components/LinearMafRendering.js +47 -0
- package/dist/LinearMafRenderer/components/LinearMafRendering.js.map +1 -0
- package/dist/LinearMafRenderer/index.js +1 -1
- package/dist/LinearMafRenderer/index.js.map +1 -1
- package/dist/LinearMafRenderer/makeImageData.d.ts +3 -1
- package/dist/LinearMafRenderer/makeImageData.js +11 -4
- package/dist/LinearMafRenderer/makeImageData.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/features.d.ts +0 -17
- package/dist/LinearMafRenderer/rendering/features.js +5 -24
- package/dist/LinearMafRenderer/rendering/features.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/gaps.d.ts +1 -11
- package/dist/LinearMafRenderer/rendering/gaps.js +1 -17
- package/dist/LinearMafRenderer/rendering/gaps.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/insertions.d.ts +1 -13
- package/dist/LinearMafRenderer/rendering/insertions.js +9 -15
- package/dist/LinearMafRenderer/rendering/insertions.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/matches.d.ts +1 -12
- package/dist/LinearMafRenderer/rendering/matches.js +8 -15
- package/dist/LinearMafRenderer/rendering/matches.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/mismatches.d.ts +1 -1
- package/dist/LinearMafRenderer/rendering/mismatches.js +14 -4
- package/dist/LinearMafRenderer/rendering/mismatches.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/spatialIndex.d.ts +7 -58
- package/dist/LinearMafRenderer/rendering/spatialIndex.js +5 -85
- package/dist/LinearMafRenderer/rendering/spatialIndex.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/text.d.ts +1 -1
- package/dist/LinearMafRenderer/rendering/text.js +1 -1
- package/dist/LinearMafRenderer/rendering/text.js.map +1 -1
- package/dist/LinearMafRenderer/rendering/types.d.ts +4 -16
- package/dist/LinearMafRenderer/rendering/types.js.map +1 -1
- package/dist/MafAddTrackWorkflow/AddTrackWorkflow.js +37 -35
- package/dist/MafAddTrackWorkflow/AddTrackWorkflow.js.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/jbrowse-plugin-mafviewer.umd.production.min.js +5 -28
- package/dist/jbrowse-plugin-mafviewer.umd.production.min.js.map +4 -4
- package/dist/out.js +13356 -15572
- package/dist/out.js.map +4 -4
- package/package.json +3 -4
- package/src/LinearMafRenderer/components/{ReactComponent.tsx → LinearMafRendering.tsx} +17 -21
- package/src/LinearMafRenderer/index.ts +1 -1
- package/src/LinearMafRenderer/makeImageData.ts +20 -5
- package/src/LinearMafRenderer/rendering/features.ts +4 -41
- package/src/LinearMafRenderer/rendering/gaps.ts +0 -38
- package/src/LinearMafRenderer/rendering/insertions.ts +11 -28
- package/src/LinearMafRenderer/rendering/matches.ts +12 -30
- package/src/LinearMafRenderer/rendering/mismatches.ts +18 -31
- package/src/LinearMafRenderer/rendering/spatialIndex.ts +9 -105
- package/src/LinearMafRenderer/rendering/text.ts +0 -2
- package/src/LinearMafRenderer/rendering/types.ts +4 -20
- package/src/MafAddTrackWorkflow/AddTrackWorkflow.tsx +5 -6
- package/src/index.ts +0 -2
- package/src/BgzipTaffyAdapter/BgzipTaffyAdapter.ts +0 -307
- package/src/BgzipTaffyAdapter/configSchema.ts +0 -59
- package/src/BgzipTaffyAdapter/index.ts +0 -16
- package/src/BgzipTaffyAdapter/rowInstructions.ts +0 -91
- package/src/BgzipTaffyAdapter/types.ts +0 -16
- package/src/BgzipTaffyAdapter/util.ts +0 -25
- package/src/BgzipTaffyAdapter/virtualOffset.ts +0 -29
package/README.md
CHANGED
|
@@ -92,36 +92,6 @@ can use nhLocation or samples array on adapter
|
|
|
92
92
|
}
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
### Example BgzipTaffyAdapter config
|
|
96
|
-
|
|
97
|
-
Note: TAF files are actually significantly slower and has known bugs...will
|
|
98
|
-
update once fixed
|
|
99
|
-
|
|
100
|
-
This notice will be removed it it is improved
|
|
101
|
-
|
|
102
|
-
As with other adapters, you can use nhLocation or samples array on adapter
|
|
103
|
-
|
|
104
|
-
```json
|
|
105
|
-
{
|
|
106
|
-
"type": "MafTrack",
|
|
107
|
-
"trackId": "bigMaf",
|
|
108
|
-
"name": "taffy",
|
|
109
|
-
"adapter": {
|
|
110
|
-
"type": "BgzipTaffyAdapter",
|
|
111
|
-
"nhLocation": {
|
|
112
|
-
"uri": "hg38.30way.nh"
|
|
113
|
-
},
|
|
114
|
-
"tafGzLocation": {
|
|
115
|
-
"uri": "30way.taf.gz"
|
|
116
|
-
},
|
|
117
|
-
"taiGzLocation": {
|
|
118
|
-
"uri": "30way.taf.gz.tai"
|
|
119
|
-
}
|
|
120
|
-
},
|
|
121
|
-
"assemblyNames": ["hg38"]
|
|
122
|
-
}
|
|
123
|
-
```
|
|
124
|
-
|
|
125
95
|
### Example with customized sample names and colors
|
|
126
96
|
|
|
127
97
|
```json
|
|
@@ -191,9 +161,6 @@ the case
|
|
|
191
161
|
2. MAF tabix based format, based on a custom BED created via conversion tools in
|
|
192
162
|
this repo (see maf2bed)
|
|
193
163
|
|
|
194
|
-
3. TAF format (new!). Currently only supports bgzip'd TAF. This is pioneered by
|
|
195
|
-
https://github.com/ComparativeGenomicsToolkit/taffy
|
|
196
|
-
|
|
197
164
|
_Note: All these formats generally start with a MAF as input. Note that your MAF
|
|
198
165
|
file should contain the species name and chromosome name e.g. hg38.chr1 in the
|
|
199
166
|
sequence identifiers._
|
|
@@ -229,17 +196,3 @@ separated by `:`.
|
|
|
229
196
|
|
|
230
197
|
Note: If you can't use the `cargo install maf2bed` binary, there is a
|
|
231
198
|
`bin/maf2bed.pl` perl version of it in this repo
|
|
232
|
-
|
|
233
|
-
### Option 3. Preparing TAF
|
|
234
|
-
|
|
235
|
-
Follow steps from https://github.com/ComparativeGenomicsToolkit/taffy
|
|
236
|
-
|
|
237
|
-
```
|
|
238
|
-
taffy view -i chr22.maf -o chr22.taf
|
|
239
|
-
bgzip chr22.taf
|
|
240
|
-
taffy index -i chr22.taf.gz
|
|
241
|
-
```
|
|
242
|
-
|
|
243
|
-
The above workflow requires that taffy is built with "htslib support"
|
|
244
|
-
|
|
245
|
-
Note that the TAF support is beta, let me know if you run into any issues
|
|
@@ -27,7 +27,9 @@ export default class LinearMafRenderer extends FeatureRendererType {
|
|
|
27
27
|
width: number;
|
|
28
28
|
height: number;
|
|
29
29
|
containsNoTransferables: boolean;
|
|
30
|
-
|
|
30
|
+
samples: import("./rendering").Sample[];
|
|
31
|
+
flatbush: ArrayBufferLike;
|
|
32
|
+
items: import("./rendering").RenderedBase[];
|
|
31
33
|
canvasRecordedData: Record<string, unknown>;
|
|
32
34
|
reactElement?: React.ReactElement;
|
|
33
35
|
html?: string;
|
|
@@ -36,7 +38,9 @@ export default class LinearMafRenderer extends FeatureRendererType {
|
|
|
36
38
|
width: number;
|
|
37
39
|
height: number;
|
|
38
40
|
containsNoTransferables: boolean;
|
|
39
|
-
|
|
41
|
+
samples: import("./rendering").Sample[];
|
|
42
|
+
flatbush: ArrayBufferLike;
|
|
43
|
+
items: import("./rendering").RenderedBase[];
|
|
40
44
|
imageData: any;
|
|
41
45
|
reactElement?: React.ReactElement;
|
|
42
46
|
html?: string;
|
|
@@ -45,7 +49,9 @@ export default class LinearMafRenderer extends FeatureRendererType {
|
|
|
45
49
|
width: number;
|
|
46
50
|
height: number;
|
|
47
51
|
containsNoTransferables: boolean;
|
|
48
|
-
|
|
52
|
+
samples: import("./rendering").Sample[];
|
|
53
|
+
flatbush: ArrayBufferLike;
|
|
54
|
+
items: import("./rendering").RenderedBase[];
|
|
49
55
|
reactElement: React.ReactElement;
|
|
50
56
|
html?: string;
|
|
51
57
|
}>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { RenderedBase } from '../rendering';
|
|
3
|
+
import { Sample } from '../../LinearMafDisplay/types';
|
|
4
|
+
type SerializedRBush = any;
|
|
5
|
+
declare const LinearMafRendering: (props: {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
displayModel: any;
|
|
9
|
+
flatbush: SerializedRBush;
|
|
10
|
+
items: RenderedBase[];
|
|
11
|
+
samples: Sample[];
|
|
12
|
+
}) => React.JSX.Element;
|
|
13
|
+
export default LinearMafRendering;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import React, { useMemo, useRef } from 'react';
|
|
2
|
+
import { PrerenderedCanvas } from '@jbrowse/core/ui';
|
|
3
|
+
import Flatbush from 'flatbush';
|
|
4
|
+
import { observer } from 'mobx-react';
|
|
5
|
+
const LinearMafRendering = observer(function (props) {
|
|
6
|
+
const { items, displayModel, height, samples, flatbush } = props;
|
|
7
|
+
const ref = useRef(null);
|
|
8
|
+
const rbush2 = useMemo(() => Flatbush.from(flatbush), [flatbush]);
|
|
9
|
+
function getFeatureUnderMouse(eventClientX, eventClientY) {
|
|
10
|
+
let offsetX = 0;
|
|
11
|
+
let offsetY = 0;
|
|
12
|
+
if (ref.current) {
|
|
13
|
+
const r = ref.current.getBoundingClientRect();
|
|
14
|
+
offsetX = eventClientX - r.left;
|
|
15
|
+
offsetY = eventClientY - r.top;
|
|
16
|
+
}
|
|
17
|
+
const x = rbush2.search(offsetX, offsetY, offsetX + 1, offsetY + 1);
|
|
18
|
+
if (x.length) {
|
|
19
|
+
const elt = x.find(idx => items[idx]?.isInsertion);
|
|
20
|
+
const r = elt !== undefined ? items[elt] : items[x[0]];
|
|
21
|
+
console.log({ x, r });
|
|
22
|
+
const s = samples[r.sampleId];
|
|
23
|
+
return {
|
|
24
|
+
...r,
|
|
25
|
+
sampleId: s?.label || s?.id || 'unknown',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return (React.createElement("div", { ref: ref, onMouseMove: e => displayModel.setHoveredInfo?.(getFeatureUnderMouse(e.clientX, e.clientY)), onMouseLeave: () => {
|
|
33
|
+
displayModel.setHoveredInfo?.(undefined);
|
|
34
|
+
}, onMouseOut: () => {
|
|
35
|
+
displayModel.setHoveredInfo?.(undefined);
|
|
36
|
+
}, style: {
|
|
37
|
+
overflow: 'visible',
|
|
38
|
+
position: 'relative',
|
|
39
|
+
height,
|
|
40
|
+
} },
|
|
41
|
+
React.createElement(PrerenderedCanvas, { ...props, style: {
|
|
42
|
+
position: 'absolute',
|
|
43
|
+
left: 0,
|
|
44
|
+
} })));
|
|
45
|
+
});
|
|
46
|
+
export default LinearMafRendering;
|
|
47
|
+
//# sourceMappingURL=LinearMafRendering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LinearMafRendering.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/components/LinearMafRendering.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAE9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,QAAQ,MAAM,UAAU,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAMrC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,UAAU,KAO7C;IACC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAA;IAChE,MAAM,GAAG,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEjE,SAAS,oBAAoB,CAAC,YAAoB,EAAE,YAAoB;QACtE,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAA;YAC7C,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC,IAAI,CAAA;YAC/B,OAAO,GAAG,YAAY,GAAG,CAAC,CAAC,GAAG,CAAA;QAChC,CAAC;QAED,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAA;QACnE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC,CAAA;YAClD,MAAM,CAAC,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAE,CAAA;YACzD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACrB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;YAC7B,OAAO;gBACL,GAAG,CAAC;gBACJ,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,IAAI,SAAS;aACzC,CAAA;QACH,CAAC;aAAM,CAAC;YACN,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,EACR,WAAW,EAAE,CAAC,CAAC,EAAE,CACf,YAAY,CAAC,cAAc,EAAE,CAC3B,oBAAoB,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAC3C,EAEH,YAAY,EAAE,GAAG,EAAE;YACjB,YAAY,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAA;QAC1C,CAAC,EACD,UAAU,EAAE,GAAG,EAAE;YACf,YAAY,CAAC,cAAc,EAAE,CAAC,SAAS,CAAC,CAAA;QAC1C,CAAC,EACD,KAAK,EAAE;YACL,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,UAAU;YACpB,MAAM;SACP;QAED,oBAAC,iBAAiB,OACZ,KAAK,EACT,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,IAAI,EAAE,CAAC;aACR,GACD,CACE,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,kBAAkB,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import LinearMafRenderer from './LinearMafRenderer';
|
|
2
|
-
import ReactComponent from './components/
|
|
2
|
+
import ReactComponent from './components/LinearMafRendering';
|
|
3
3
|
import configSchema from './configSchema';
|
|
4
4
|
export default function LinearMafRendererF(pluginManager) {
|
|
5
5
|
pluginManager.addRendererType(() => new LinearMafRenderer({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/LinearMafRenderer/index.ts"],"names":[],"mappings":"AAEA,OAAO,iBAAiB,MAAM,qBAAqB,CAAA;AACnD,OAAO,cAAc,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/LinearMafRenderer/index.ts"],"names":[],"mappings":"AAEA,OAAO,iBAAiB,MAAM,qBAAqB,CAAA;AACnD,OAAO,cAAc,MAAM,iCAAiC,CAAA;AAC5D,OAAO,YAAY,MAAM,gBAAgB,CAAA;AAEzC,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,aAA4B;IACrE,aAAa,CAAC,eAAe,CAC3B,GAAG,EAAE,CACH,IAAI,iBAAiB,CAAC;QACpB,IAAI,EAAE,mBAAmB;QACzB,cAAc;QACd,YAAY;QACZ,aAAa;KACd,CAAC,CACL,CAAA;AACH,CAAC"}
|
|
@@ -15,6 +15,8 @@ export declare function makeImageData({ ctx, renderArgs, }: {
|
|
|
15
15
|
ctx: CanvasRenderingContext2D;
|
|
16
16
|
renderArgs: RenderArgs;
|
|
17
17
|
}): {
|
|
18
|
-
|
|
18
|
+
flatbush: ArrayBufferLike;
|
|
19
|
+
items: import("./rendering").RenderedBase[];
|
|
20
|
+
samples: Sample[];
|
|
19
21
|
};
|
|
20
22
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createJBrowseTheme } from '@jbrowse/core/ui';
|
|
2
|
-
import
|
|
2
|
+
import Flatbush from 'flatbush';
|
|
3
3
|
import { FONT_CONFIG, processFeatureAlignment, processFeatureInsertions, } from './rendering';
|
|
4
4
|
import { getColorBaseMap, getContrastBaseMap } from './util';
|
|
5
5
|
export function makeImageData({ ctx, renderArgs, }) {
|
|
@@ -28,7 +28,8 @@ export function makeImageData({ ctx, renderArgs, }) {
|
|
|
28
28
|
showAllLetters,
|
|
29
29
|
mismatchRendering,
|
|
30
30
|
showAsUpperCase,
|
|
31
|
-
spatialIndex:
|
|
31
|
+
spatialIndex: [],
|
|
32
|
+
spatialIndexCoords: [],
|
|
32
33
|
lastInsertedX: -Infinity, // Start with -Infinity so first item is always inserted
|
|
33
34
|
};
|
|
34
35
|
// First pass: render alignments (gaps, matches, mismatches, text)
|
|
@@ -39,9 +40,15 @@ export function makeImageData({ ctx, renderArgs, }) {
|
|
|
39
40
|
for (const feature of features.values()) {
|
|
40
41
|
processFeatureInsertions(feature, region, bpPerPx, sampleToRowMap, renderingContext);
|
|
41
42
|
}
|
|
42
|
-
|
|
43
|
+
const flatbush = new Flatbush(renderingContext.spatialIndex.length);
|
|
44
|
+
for (let i = 0, l = renderingContext.spatialIndexCoords.length; i < l; i += 4) {
|
|
45
|
+
flatbush.add(renderingContext.spatialIndexCoords[i], renderingContext.spatialIndexCoords[i + 1], renderingContext.spatialIndexCoords[i + 2], renderingContext.spatialIndexCoords[i + 3]);
|
|
46
|
+
}
|
|
47
|
+
flatbush.finish();
|
|
43
48
|
return {
|
|
44
|
-
|
|
49
|
+
flatbush: flatbush.data,
|
|
50
|
+
items: renderingContext.spatialIndex,
|
|
51
|
+
samples,
|
|
45
52
|
};
|
|
46
53
|
}
|
|
47
54
|
//# sourceMappingURL=makeImageData.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"makeImageData.js","sourceRoot":"","sources":["../../src/LinearMafRenderer/makeImageData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAErD,OAAO,
|
|
1
|
+
{"version":3,"file":"makeImageData.js","sourceRoot":"","sources":["../../src/LinearMafRenderer/makeImageData.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +1,4 @@
|
|
|
1
1
|
import { Feature } from '@jbrowse/core/util';
|
|
2
2
|
import type { GenomicRegion, RenderingContext } from './types';
|
|
3
|
-
/**
|
|
4
|
-
* Processes alignment data for a single feature, rendering gaps, matches, mismatches, and text
|
|
5
|
-
* @param feature - JBrowse feature containing alignment data
|
|
6
|
-
* @param region - Genomic region being rendered
|
|
7
|
-
* @param bpPerPx - Base pairs per pixel (zoom level)
|
|
8
|
-
* @param sampleToRowMap - Maps sample IDs to row indices
|
|
9
|
-
* @param renderingContext - Shared rendering parameters
|
|
10
|
-
*/
|
|
11
3
|
export declare function processFeatureAlignment(feature: Feature, region: GenomicRegion, bpPerPx: number, sampleToRowMap: Map<string, number>, renderingContext: RenderingContext): void;
|
|
12
|
-
/**
|
|
13
|
-
* Processes insertion data for a single feature in a separate pass
|
|
14
|
-
* Insertions are rendered on top to ensure visibility
|
|
15
|
-
* @param feature - JBrowse feature containing alignment data
|
|
16
|
-
* @param region - Genomic region being rendered
|
|
17
|
-
* @param bpPerPx - Base pairs per pixel (zoom level)
|
|
18
|
-
* @param sampleToRowMap - Maps sample IDs to row indices
|
|
19
|
-
* @param renderingContext - Shared rendering parameters
|
|
20
|
-
*/
|
|
21
4
|
export declare function processFeatureInsertions(feature: Feature, region: GenomicRegion, bpPerPx: number, sampleToRowMap: Map<string, number>, renderingContext: RenderingContext): void;
|
|
@@ -4,19 +4,10 @@ import { renderInsertions } from './insertions';
|
|
|
4
4
|
import { renderMatches } from './matches';
|
|
5
5
|
import { renderMismatches } from './mismatches';
|
|
6
6
|
import { renderText } from './text';
|
|
7
|
-
/**
|
|
8
|
-
* Processes alignment data for a single feature, rendering gaps, matches, mismatches, and text
|
|
9
|
-
* @param feature - JBrowse feature containing alignment data
|
|
10
|
-
* @param region - Genomic region being rendered
|
|
11
|
-
* @param bpPerPx - Base pairs per pixel (zoom level)
|
|
12
|
-
* @param sampleToRowMap - Maps sample IDs to row indices
|
|
13
|
-
* @param renderingContext - Shared rendering parameters
|
|
14
|
-
*/
|
|
15
7
|
export function processFeatureAlignment(feature, region, bpPerPx, sampleToRowMap, renderingContext) {
|
|
16
8
|
const [leftPx] = featureSpanPx(feature, region, bpPerPx);
|
|
17
9
|
const alignments = feature.get('alignments');
|
|
18
10
|
const referenceSeq = feature.get('seq').toLowerCase();
|
|
19
|
-
const featureId = feature.id() || `feature_${feature.get('start')}_${feature.get('end')}`;
|
|
20
11
|
for (const [sampleId, alignmentData] of Object.entries(alignments)) {
|
|
21
12
|
const row = sampleToRowMap.get(sampleId);
|
|
22
13
|
if (row === undefined) {
|
|
@@ -25,26 +16,16 @@ export function processFeatureAlignment(feature, region, bpPerPx, sampleToRowMap
|
|
|
25
16
|
const originalAlignment = alignmentData.seq;
|
|
26
17
|
const alignment = originalAlignment.toLowerCase();
|
|
27
18
|
const rowTop = renderingContext.offset + renderingContext.rowHeight * row;
|
|
28
|
-
renderGaps(renderingContext, alignment, referenceSeq, leftPx, rowTop
|
|
29
|
-
renderMatches(renderingContext, alignment, referenceSeq, leftPx, rowTop,
|
|
30
|
-
renderMismatches(renderingContext, alignment, referenceSeq, leftPx, rowTop,
|
|
31
|
-
renderText(renderingContext, alignment, originalAlignment, referenceSeq, leftPx, rowTop
|
|
19
|
+
renderGaps(renderingContext, alignment, referenceSeq, leftPx, rowTop);
|
|
20
|
+
renderMatches(renderingContext, alignment, referenceSeq, leftPx, rowTop, row, alignmentData.start, alignmentData.chr);
|
|
21
|
+
renderMismatches(renderingContext, alignment, referenceSeq, leftPx, rowTop, row, alignmentData.start, alignmentData.chr);
|
|
22
|
+
renderText(renderingContext, alignment, originalAlignment, referenceSeq, leftPx, rowTop);
|
|
32
23
|
}
|
|
33
24
|
}
|
|
34
|
-
/**
|
|
35
|
-
* Processes insertion data for a single feature in a separate pass
|
|
36
|
-
* Insertions are rendered on top to ensure visibility
|
|
37
|
-
* @param feature - JBrowse feature containing alignment data
|
|
38
|
-
* @param region - Genomic region being rendered
|
|
39
|
-
* @param bpPerPx - Base pairs per pixel (zoom level)
|
|
40
|
-
* @param sampleToRowMap - Maps sample IDs to row indices
|
|
41
|
-
* @param renderingContext - Shared rendering parameters
|
|
42
|
-
*/
|
|
43
25
|
export function processFeatureInsertions(feature, region, bpPerPx, sampleToRowMap, renderingContext) {
|
|
44
26
|
const [leftPx] = featureSpanPx(feature, region, bpPerPx);
|
|
45
27
|
const alignments = feature.get('alignments');
|
|
46
28
|
const referenceSeq = feature.get('seq').toLowerCase();
|
|
47
|
-
const featureId = feature.id() || `feature_${feature.get('start')}_${feature.get('end')}`;
|
|
48
29
|
for (const [sampleId, alignmentData] of Object.entries(alignments)) {
|
|
49
30
|
const row = sampleToRowMap.get(sampleId);
|
|
50
31
|
if (row === undefined) {
|
|
@@ -52,7 +33,7 @@ export function processFeatureInsertions(feature, region, bpPerPx, sampleToRowMa
|
|
|
52
33
|
}
|
|
53
34
|
const alignment = alignmentData.seq.toLowerCase();
|
|
54
35
|
const rowTop = renderingContext.offset + renderingContext.rowHeight * row;
|
|
55
|
-
renderInsertions(renderingContext, alignment, referenceSeq, leftPx, rowTop, bpPerPx,
|
|
36
|
+
renderInsertions(renderingContext, alignment, referenceSeq, leftPx, rowTop, bpPerPx, row, alignmentData.start, alignmentData.chr);
|
|
56
37
|
}
|
|
57
38
|
}
|
|
58
39
|
//# sourceMappingURL=features.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/features.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAE3D,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAInC
|
|
1
|
+
{"version":3,"file":"features.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/features.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,2 @@
|
|
|
1
1
|
import type { RenderingContext } from './types';
|
|
2
|
-
|
|
3
|
-
* Renders gap indicators (horizontal lines) where the alignment has deletions relative to reference
|
|
4
|
-
* @param context - Rendering context with canvas and styling info
|
|
5
|
-
* @param alignment - The aligned sequence for this sample
|
|
6
|
-
* @param seq - The reference sequence
|
|
7
|
-
* @param leftPx - Left pixel position of the feature
|
|
8
|
-
* @param rowTop - Top pixel position of the row
|
|
9
|
-
* @param alignmentStart - Start position of the alignment
|
|
10
|
-
* @param chr - Chromosome/sequence name
|
|
11
|
-
*/
|
|
12
|
-
export declare function renderGaps(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number, sampleId: string, featureId: string, alignmentStart: number, chr: string): void;
|
|
2
|
+
export declare function renderGaps(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number): void;
|
|
@@ -1,16 +1,5 @@
|
|
|
1
|
-
import { addToSpatialIndex, createRenderedBase, shouldAddToSpatialIndex, } from './spatialIndex';
|
|
2
1
|
import { GAP_STROKE_OFFSET } from './types';
|
|
3
|
-
|
|
4
|
-
* Renders gap indicators (horizontal lines) where the alignment has deletions relative to reference
|
|
5
|
-
* @param context - Rendering context with canvas and styling info
|
|
6
|
-
* @param alignment - The aligned sequence for this sample
|
|
7
|
-
* @param seq - The reference sequence
|
|
8
|
-
* @param leftPx - Left pixel position of the feature
|
|
9
|
-
* @param rowTop - Top pixel position of the row
|
|
10
|
-
* @param alignmentStart - Start position of the alignment
|
|
11
|
-
* @param chr - Chromosome/sequence name
|
|
12
|
-
*/
|
|
13
|
-
export function renderGaps(context, alignment, seq, leftPx, rowTop, sampleId, featureId, alignmentStart, chr) {
|
|
2
|
+
export function renderGaps(context, alignment, seq, leftPx, rowTop) {
|
|
14
3
|
const { ctx, scale } = context;
|
|
15
4
|
const h2 = context.rowHeight / 2;
|
|
16
5
|
ctx.beginPath();
|
|
@@ -21,11 +10,6 @@ export function renderGaps(context, alignment, seq, leftPx, rowTop, sampleId, fe
|
|
|
21
10
|
const xPos = leftPx + scale * genomicOffset;
|
|
22
11
|
ctx.moveTo(xPos, rowTop + h2);
|
|
23
12
|
ctx.lineTo(xPos + scale + GAP_STROKE_OFFSET, rowTop + h2);
|
|
24
|
-
// Add to spatial index if distance filter allows
|
|
25
|
-
if (shouldAddToSpatialIndex(xPos, context)) {
|
|
26
|
-
const renderedBase = createRenderedBase(xPos, rowTop, context, genomicOffset + alignmentStart, chr, sampleId, '-', false, false, true, false, featureId);
|
|
27
|
-
addToSpatialIndex(context, renderedBase);
|
|
28
|
-
}
|
|
29
13
|
}
|
|
30
14
|
genomicOffset++;
|
|
31
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gaps.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/gaps.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"gaps.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/gaps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAI3C,MAAM,UAAU,UAAU,CACxB,OAAyB,EACzB,SAAiB,EACjB,GAAW,EACX,MAAc,EACd,MAAc;IAEd,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,OAAO,CAAA;IAC9B,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,CAAC,CAAA;IAEhC,GAAG,CAAC,SAAS,EAAE,CAAA;IACf,GAAG,CAAC,SAAS,GAAG,OAAO,CAAA;IAEvB,KACE,IAAI,CAAC,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,EAC1D,CAAC,GAAG,SAAS,EACb,CAAC,EAAE,EACH,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,CAAA;gBAC3C,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,CAAA;gBAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,KAAK,GAAG,iBAAiB,EAAE,MAAM,GAAG,EAAE,CAAC,CAAA;YAC3D,CAAC;YACD,aAAa,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;IACD,GAAG,CAAC,MAAM,EAAE,CAAA;AACd,CAAC"}
|
|
@@ -1,14 +1,2 @@
|
|
|
1
1
|
import type { RenderingContext } from './types';
|
|
2
|
-
|
|
3
|
-
* Renders insertion markers where the alignment has bases not present in reference
|
|
4
|
-
* Large insertions show count, small ones show as colored bars with optional borders
|
|
5
|
-
* @param context - Rendering context with canvas and styling info
|
|
6
|
-
* @param alignment - The aligned sequence for this sample
|
|
7
|
-
* @param seq - The reference sequence
|
|
8
|
-
* @param leftPx - Left pixel position of the feature
|
|
9
|
-
* @param rowTop - Top pixel position of the row
|
|
10
|
-
* @param bpPerPx - Base pairs per pixel (zoom level)
|
|
11
|
-
* @param alignmentStart - Start position of the alignment
|
|
12
|
-
* @param chr - Chromosome/sequence name
|
|
13
|
-
*/
|
|
14
|
-
export declare function renderInsertions(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number, bpPerPx: number, sampleId: string, featureId: string, alignmentStart: number, chr: string): void;
|
|
2
|
+
export declare function renderInsertions(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number, bpPerPx: number, sampleId: number, alignmentStart: number, chr: string): void;
|
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
import { measureText } from '@jbrowse/core/util';
|
|
2
2
|
import { fillRect, getCharWidthHeight } from '../util';
|
|
3
|
-
import { addToSpatialIndex,
|
|
3
|
+
import { addToSpatialIndex, shouldAddToSpatialIndex } from './spatialIndex';
|
|
4
4
|
import { CHAR_SIZE_WIDTH, HIGH_BP_PER_PX_THRESHOLD, HIGH_ZOOM_THRESHOLD, INSERTION_BORDER_HEIGHT, INSERTION_BORDER_WIDTH, INSERTION_LINE_WIDTH, INSERTION_PADDING, LARGE_INSERTION_THRESHOLD, MIN_ROW_HEIGHT_FOR_BORDERS, } from './types';
|
|
5
|
-
|
|
6
|
-
* Renders insertion markers where the alignment has bases not present in reference
|
|
7
|
-
* Large insertions show count, small ones show as colored bars with optional borders
|
|
8
|
-
* @param context - Rendering context with canvas and styling info
|
|
9
|
-
* @param alignment - The aligned sequence for this sample
|
|
10
|
-
* @param seq - The reference sequence
|
|
11
|
-
* @param leftPx - Left pixel position of the feature
|
|
12
|
-
* @param rowTop - Top pixel position of the row
|
|
13
|
-
* @param bpPerPx - Base pairs per pixel (zoom level)
|
|
14
|
-
* @param alignmentStart - Start position of the alignment
|
|
15
|
-
* @param chr - Chromosome/sequence name
|
|
16
|
-
*/
|
|
17
|
-
export function renderInsertions(context, alignment, seq, leftPx, rowTop, bpPerPx, sampleId, featureId, alignmentStart, chr) {
|
|
5
|
+
export function renderInsertions(context, alignment, seq, leftPx, rowTop, bpPerPx, sampleId, alignmentStart, chr) {
|
|
18
6
|
const { ctx, scale, h, canvasWidth, rowHeight } = context;
|
|
19
7
|
const { charHeight } = getCharWidthHeight();
|
|
20
8
|
for (let i = 0, genomicOffset = 0, seqLength = alignment.length; i < seqLength; i++) {
|
|
@@ -75,7 +63,13 @@ export function renderInsertions(context, alignment, seq, leftPx, rowTop, bpPerP
|
|
|
75
63
|
// Add insertion to spatial index with actual rendered dimensions
|
|
76
64
|
// Insertions always bypass distance filter
|
|
77
65
|
if (shouldAddToSpatialIndex(actualXPos, context, true)) {
|
|
78
|
-
addToSpatialIndex(context,
|
|
66
|
+
addToSpatialIndex(context, actualXPos, rowTop, actualXPos + actualWidth, rowTop + context.h, {
|
|
67
|
+
pos: genomicOffset + alignmentStart,
|
|
68
|
+
chr,
|
|
69
|
+
base: insertionSequence,
|
|
70
|
+
sampleId,
|
|
71
|
+
isInsertion: true,
|
|
72
|
+
});
|
|
79
73
|
}
|
|
80
74
|
}
|
|
81
75
|
genomicOffset++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insertions.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/insertions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEhD,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"insertions.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/insertions.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,13 +1,2 @@
|
|
|
1
1
|
import type { RenderingContext } from './types';
|
|
2
|
-
|
|
3
|
-
* Renders background rectangles for positions where alignment matches reference
|
|
4
|
-
* Only renders when showAllLetters is false
|
|
5
|
-
* @param context - Rendering context with canvas and styling info
|
|
6
|
-
* @param alignment - The aligned sequence for this sample
|
|
7
|
-
* @param seq - The reference sequence
|
|
8
|
-
* @param leftPx - Left pixel position of the feature
|
|
9
|
-
* @param rowTop - Top pixel position of the row
|
|
10
|
-
* @param alignmentStart - Start position of the alignment
|
|
11
|
-
* @param chr - Chromosome/sequence name
|
|
12
|
-
*/
|
|
13
|
-
export declare function renderMatches(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number, sampleId: string, featureId: string, alignmentStart: number, chr: string): void;
|
|
2
|
+
export declare function renderMatches(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number, sampleId: number, alignmentStart: number, chr: string): void;
|
|
@@ -1,18 +1,7 @@
|
|
|
1
1
|
import { fillRect } from '../util';
|
|
2
|
-
import { addToSpatialIndex,
|
|
2
|
+
import { addToSpatialIndex, shouldAddToSpatialIndex } from './spatialIndex';
|
|
3
3
|
import { GAP_STROKE_OFFSET } from './types';
|
|
4
|
-
|
|
5
|
-
* Renders background rectangles for positions where alignment matches reference
|
|
6
|
-
* Only renders when showAllLetters is false
|
|
7
|
-
* @param context - Rendering context with canvas and styling info
|
|
8
|
-
* @param alignment - The aligned sequence for this sample
|
|
9
|
-
* @param seq - The reference sequence
|
|
10
|
-
* @param leftPx - Left pixel position of the feature
|
|
11
|
-
* @param rowTop - Top pixel position of the row
|
|
12
|
-
* @param alignmentStart - Start position of the alignment
|
|
13
|
-
* @param chr - Chromosome/sequence name
|
|
14
|
-
*/
|
|
15
|
-
export function renderMatches(context, alignment, seq, leftPx, rowTop, sampleId, featureId, alignmentStart, chr) {
|
|
4
|
+
export function renderMatches(context, alignment, seq, leftPx, rowTop, sampleId, alignmentStart, chr) {
|
|
16
5
|
if (context.showAllLetters) {
|
|
17
6
|
return;
|
|
18
7
|
}
|
|
@@ -30,8 +19,12 @@ export function renderMatches(context, alignment, seq, leftPx, rowTop, sampleId,
|
|
|
30
19
|
fillRect(ctx, xPos, rowTop, scale + GAP_STROKE_OFFSET, h, canvasWidth);
|
|
31
20
|
// Add to spatial index if distance filter allows
|
|
32
21
|
if (shouldAddToSpatialIndex(xPos, context)) {
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
addToSpatialIndex(context, xPos, rowTop, xPos + context.scale + GAP_STROKE_OFFSET, rowTop + context.h, {
|
|
23
|
+
pos: genomicOffset + alignmentStart,
|
|
24
|
+
chr,
|
|
25
|
+
base: currentChar || '',
|
|
26
|
+
sampleId,
|
|
27
|
+
});
|
|
35
28
|
}
|
|
36
29
|
}
|
|
37
30
|
genomicOffset++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matches.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/matches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"matches.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/matches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAI3C,MAAM,UAAU,aAAa,CAC3B,OAAyB,EACzB,SAAiB,EACjB,GAAW,EACX,MAAc,EACd,MAAc,EACd,QAAgB,EAChB,cAAsB,EACtB,GAAW;IAEX,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,OAAM;IACR,CAAC;IAED,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,CAAA;IAC9C,GAAG,CAAC,SAAS,GAAG,WAAW,CAAA;IAE3B,sDAAsD;IACtD,KACE,IAAI,CAAC,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,EAC1D,CAAC,GAAG,SAAS,EACb,CAAC,EAAE,EACH,CAAC;QACD,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,8CAA8C;YAC9C,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,CAAA;YAC3C,IACE,GAAG,CAAC,CAAC,CAAC,KAAK,WAAW;gBACtB,WAAW,KAAK,GAAG;gBACnB,WAAW,KAAK,GAAG,EACnB,CAAC;gBACD,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,iBAAiB,EAAE,CAAC,EAAE,WAAW,CAAC,CAAA;gBAEtE,iDAAiD;gBACjD,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;oBAC3C,iBAAiB,CACf,OAAO,EACP,IAAI,EACJ,MAAM,EACN,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,iBAAiB,EACxC,MAAM,GAAG,OAAO,CAAC,CAAC,EAClB;wBACE,GAAG,EAAE,aAAa,GAAG,cAAc;wBACnC,GAAG;wBACH,IAAI,EAAE,WAAW,IAAI,EAAE;wBACvB,QAAQ;qBACT,CACF,CAAA;gBACH,CAAC;YACH,CAAC;YACD,aAAa,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -10,4 +10,4 @@ import type { RenderingContext } from './types';
|
|
|
10
10
|
* @param alignmentStart - Start position of the alignment
|
|
11
11
|
* @param chr - Chromosome/sequence name
|
|
12
12
|
*/
|
|
13
|
-
export declare function renderMismatches(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number, sampleId:
|
|
13
|
+
export declare function renderMismatches(context: RenderingContext, alignment: string, seq: string, leftPx: number, rowTop: number, sampleId: number, alignmentStart: number, chr: string): void;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fillRect } from '../util';
|
|
2
|
-
import { addToSpatialIndex,
|
|
2
|
+
import { addToSpatialIndex, shouldAddToSpatialIndex } from './spatialIndex';
|
|
3
3
|
import { GAP_STROKE_OFFSET } from './types';
|
|
4
4
|
/**
|
|
5
5
|
* Renders colored rectangles for mismatches and matches (when showAllLetters is true)
|
|
@@ -12,7 +12,7 @@ import { GAP_STROKE_OFFSET } from './types';
|
|
|
12
12
|
* @param alignmentStart - Start position of the alignment
|
|
13
13
|
* @param chr - Chromosome/sequence name
|
|
14
14
|
*/
|
|
15
|
-
export function renderMismatches(context, alignment, seq, leftPx, rowTop, sampleId,
|
|
15
|
+
export function renderMismatches(context, alignment, seq, leftPx, rowTop, sampleId, alignmentStart, chr) {
|
|
16
16
|
const { ctx, scale, h, canvasWidth, showAllLetters, mismatchRendering, colorForBase, } = context;
|
|
17
17
|
for (let i = 0, genomicOffset = 0, seqLength = alignment.length; i < seqLength; i++) {
|
|
18
18
|
const currentChar = alignment[i];
|
|
@@ -26,7 +26,12 @@ export function renderMismatches(context, alignment, seq, leftPx, rowTop, sample
|
|
|
26
26
|
: 'orange');
|
|
27
27
|
// Add to spatial index if distance filter allows
|
|
28
28
|
if (shouldAddToSpatialIndex(xPos, context)) {
|
|
29
|
-
addToSpatialIndex(context,
|
|
29
|
+
addToSpatialIndex(context, xPos, rowTop, xPos + context.scale + GAP_STROKE_OFFSET, rowTop + context.h, {
|
|
30
|
+
pos: genomicOffset + alignmentStart,
|
|
31
|
+
chr,
|
|
32
|
+
base: currentChar,
|
|
33
|
+
sampleId,
|
|
34
|
+
});
|
|
30
35
|
}
|
|
31
36
|
}
|
|
32
37
|
else if (showAllLetters) {
|
|
@@ -36,7 +41,12 @@ export function renderMismatches(context, alignment, seq, leftPx, rowTop, sample
|
|
|
36
41
|
: 'lightblue');
|
|
37
42
|
// Add to spatial index if distance filter allows
|
|
38
43
|
if (shouldAddToSpatialIndex(xPos, context)) {
|
|
39
|
-
addToSpatialIndex(context,
|
|
44
|
+
addToSpatialIndex(context, xPos, rowTop, xPos + context.scale + GAP_STROKE_OFFSET, rowTop + context.h, {
|
|
45
|
+
pos: genomicOffset + alignmentStart,
|
|
46
|
+
chr,
|
|
47
|
+
base: currentChar,
|
|
48
|
+
sampleId,
|
|
49
|
+
});
|
|
40
50
|
}
|
|
41
51
|
}
|
|
42
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mismatches.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/mismatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"mismatches.js","sourceRoot":"","sources":["../../../src/LinearMafRenderer/rendering/mismatches.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAI3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAyB,EACzB,SAAiB,EACjB,GAAW,EACX,MAAc,EACd,MAAc,EACd,QAAgB,EAChB,cAAsB,EACtB,GAAW;IAEX,MAAM,EACJ,GAAG,EACH,KAAK,EACL,CAAC,EACD,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,YAAY,GACb,GAAG,OAAO,CAAA;IAEX,KACE,IAAI,CAAC,GAAG,CAAC,EAAE,aAAa,GAAG,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,EAC1D,CAAC,GAAG,SAAS,EACb,CAAC,EAAE,EACH,CAAC;QACD,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;QAChC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;gBACxB,MAAM,IAAI,GAAG,MAAM,GAAG,KAAK,GAAG,aAAa,CAAA;gBAC3C,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;oBAClD,8CAA8C;oBAC9C,QAAQ,CACN,GAAG,EACH,IAAI,EACJ,MAAM,EACN,KAAK,GAAG,iBAAiB,EACzB,CAAC,EACD,WAAW,EACX,iBAAiB;wBACf,CAAC,CAAC,CAAC,YAAY,CAAC,WAAY,CAAC,IAAI,OAAO,CAAC;wBACzC,CAAC,CAAC,QAAQ,CACb,CAAA;oBAED,iDAAiD;oBACjD,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;wBAC3C,iBAAiB,CACf,OAAO,EACP,IAAI,EACJ,MAAM,EACN,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,iBAAiB,EACxC,MAAM,GAAG,OAAO,CAAC,CAAC,EAClB;4BACE,GAAG,EAAE,aAAa,GAAG,cAAc;4BACnC,GAAG;4BACH,IAAI,EAAE,WAAY;4BAClB,QAAQ;yBACT,CACF,CAAA;oBACH,CAAC;gBACH,CAAC;qBAAM,IAAI,cAAc,EAAE,CAAC;oBAC1B,0EAA0E;oBAC1E,QAAQ,CACN,GAAG,EACH,IAAI,EACJ,MAAM,EACN,KAAK,GAAG,iBAAiB,EACzB,CAAC,EACD,WAAW,EACX,iBAAiB;wBACf,CAAC,CAAC,CAAC,YAAY,CAAC,WAAY,CAAC,IAAI,OAAO,CAAC;wBACzC,CAAC,CAAC,WAAW,CAChB,CAAA;oBAED,iDAAiD;oBACjD,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;wBAC3C,iBAAiB,CACf,OAAO,EACP,IAAI,EACJ,MAAM,EACN,IAAI,GAAG,OAAO,CAAC,KAAK,GAAG,iBAAiB,EACxC,MAAM,GAAG,OAAO,CAAC,CAAC,EAClB;4BACE,GAAG,EAAE,aAAa,GAAG,cAAc;4BACnC,GAAG;4BACH,IAAI,EAAE,WAAY;4BAClB,QAAQ;yBACT,CACF,CAAA;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,aAAa,EAAE,CAAA;QACjB,CAAC;IACH,CAAC;AACH,CAAC"}
|