react-msaview 5.6.1 → 5.6.2
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/bundle/index.js +95 -95
- package/bundle/index.js.map +4 -4
- package/dist/clustalX.d.ts +4 -3
- package/dist/clustalX.js +25 -4
- package/dist/clustalX.js.map +1 -1
- package/dist/columnCounts.d.ts +37 -0
- package/dist/columnCounts.js +148 -0
- package/dist/columnCounts.js.map +1 -0
- package/dist/components/MSAView.js +1 -8
- package/dist/components/MSAView.js.map +1 -1
- package/dist/components/getVisibleLeaves.d.ts +6 -0
- package/dist/components/getVisibleLeaves.js.map +1 -0
- package/dist/components/msa/MSACanvasBlock.js +17 -54
- package/dist/components/msa/MSACanvasBlock.js.map +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.d.ts +2 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +21 -19
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js +97 -96
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/msa/renderMSAMouseover.js +9 -32
- package/dist/components/msa/renderMSAMouseover.js.map +1 -1
- package/dist/components/msa/useMsaBlockMouse.d.ts +23 -0
- package/dist/components/msa/useMsaBlockMouse.js +45 -0
- package/dist/components/msa/useMsaBlockMouse.js.map +1 -0
- package/dist/components/tree/TreeCanvas.js +14 -19
- package/dist/components/tree/TreeCanvas.js.map +1 -1
- package/dist/components/tree/TreeCanvasBlock.js +40 -111
- package/dist/components/tree/TreeCanvasBlock.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.d.ts +2 -0
- package/dist/components/tree/renderTreeCanvas.js +15 -3
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/components/tree/useTreeHover.d.ts +24 -0
- package/dist/components/tree/useTreeHover.js +44 -0
- package/dist/components/tree/useTreeHover.js.map +1 -0
- package/dist/hierarchy.js +15 -9
- package/dist/hierarchy.js.map +1 -1
- package/dist/model/msaModel.js +4 -3
- package/dist/model/msaModel.js.map +1 -1
- package/dist/model/treeModel.js +9 -8
- package/dist/model/treeModel.js.map +1 -1
- package/dist/model.d.ts +52 -10
- package/dist/model.js +208 -93
- package/dist/model.js.map +1 -1
- package/dist/propertyConservation.d.ts +2 -1
- package/dist/propertyConservation.js +36 -25
- package/dist/propertyConservation.js.map +1 -1
- package/dist/seqPosToGlobalCol.d.ts +7 -0
- package/dist/seqPosToGlobalCol.js +17 -0
- package/dist/seqPosToGlobalCol.js.map +1 -1
- package/dist/stripDefault.d.ts +21 -0
- package/dist/stripDefault.js +26 -0
- package/dist/stripDefault.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +3 -3
- package/src/clustalX.test.ts +9 -11
- package/src/clustalX.ts +27 -28
- package/src/columnCounts.test.ts +58 -0
- package/src/columnCounts.ts +170 -0
- package/src/components/MSAView.tsx +1 -9
- package/src/components/{msa/getVisibleLeaves.ts → getVisibleLeaves.ts} +1 -1
- package/src/components/msa/MSACanvasBlock.tsx +42 -110
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +25 -18
- package/src/components/msa/renderMSABlock.ts +113 -125
- package/src/components/msa/renderMSAMouseover.ts +11 -34
- package/src/components/msa/useMsaBlockMouse.ts +81 -0
- package/src/components/tree/TreeCanvas.tsx +16 -23
- package/src/components/tree/TreeCanvasBlock.tsx +62 -143
- package/src/components/tree/renderTreeCanvas.test.ts +100 -190
- package/src/components/tree/renderTreeCanvas.ts +14 -3
- package/src/components/tree/useTreeHover.ts +69 -0
- package/src/domainBands.test.ts +98 -0
- package/src/hierarchy.ts +15 -9
- package/src/model/msaModel.ts +4 -6
- package/src/model/treeModel.ts +9 -14
- package/src/model.ts +241 -112
- package/src/propertyConservation.test.ts +2 -13
- package/src/propertyConservation.ts +40 -31
- package/src/rowSpace.test.ts +46 -0
- package/src/seqPosToGlobalCol.ts +18 -0
- package/src/stripDefault.test.ts +48 -0
- package/src/stripDefault.ts +35 -0
- package/src/types.ts +23 -0
- package/src/version.ts +1 -1
- package/dist/components/msa/getVisibleLeaves.d.ts +0 -6
- package/dist/components/msa/getVisibleLeaves.js.map +0 -1
- package/dist/useDevicePixelRatio.d.ts +0 -1
- package/dist/useDevicePixelRatio.js +0 -27
- package/dist/useDevicePixelRatio.js.map +0 -1
- package/src/useDevicePixelRatio.ts +0 -29
- /package/dist/components/{msa/getVisibleLeaves.js → getVisibleLeaves.js} +0 -0
package/dist/clustalX.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { ColumnCounts } from './columnCounts.ts';
|
|
1
2
|
/**
|
|
2
|
-
* Computes the ClustalX letter->color map for a single alignment column
|
|
3
|
-
*
|
|
3
|
+
* Computes the ClustalX letter->color map for a single alignment column, read
|
|
4
|
+
* out of the alignment-wide `ColumnCounts` tally.
|
|
4
5
|
*/
|
|
5
|
-
export declare function clustalXColumnColors(
|
|
6
|
+
export declare function clustalXColumnColors(counts: ColumnCounts, col: number): Record<string, string>;
|
package/dist/clustalX.js
CHANGED
|
@@ -11,11 +11,32 @@ const ORANGE = 'rgb(240, 144, 72)';
|
|
|
11
11
|
const YELLOW = 'rgb(204, 204, 0)';
|
|
12
12
|
const CYAN = 'rgb(26, 179, 179)';
|
|
13
13
|
/**
|
|
14
|
-
* Computes the ClustalX letter->color map for a single alignment column
|
|
15
|
-
*
|
|
14
|
+
* Computes the ClustalX letter->color map for a single alignment column, read
|
|
15
|
+
* out of the alignment-wide `ColumnCounts` tally.
|
|
16
16
|
*/
|
|
17
|
-
export function clustalXColumnColors(
|
|
18
|
-
const
|
|
17
|
+
export function clustalXColumnColors(counts, col) {
|
|
18
|
+
const total = counts.total(col);
|
|
19
|
+
const n = (letter) => counts.count(col, letter);
|
|
20
|
+
const W = n('W');
|
|
21
|
+
const L = n('L');
|
|
22
|
+
const V = n('V');
|
|
23
|
+
const I = n('I');
|
|
24
|
+
const M = n('M');
|
|
25
|
+
const A = n('A');
|
|
26
|
+
const F = n('F');
|
|
27
|
+
const C = n('C');
|
|
28
|
+
const H = n('H');
|
|
29
|
+
const P = n('P');
|
|
30
|
+
const R = n('R');
|
|
31
|
+
const K = n('K');
|
|
32
|
+
const Q = n('Q');
|
|
33
|
+
const E = n('E');
|
|
34
|
+
const D = n('D');
|
|
35
|
+
const T = n('T');
|
|
36
|
+
const S = n('S');
|
|
37
|
+
const G = n('G');
|
|
38
|
+
const Y = n('Y');
|
|
39
|
+
const N = n('N');
|
|
19
40
|
const hydrophobic = W + L + V + I + M + A + F + C + H + P + Y;
|
|
20
41
|
const KR = K + R;
|
|
21
42
|
const QE = Q + E;
|
package/dist/clustalX.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clustalX.js","sourceRoot":"","sources":["../src/clustalX.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;
|
|
1
|
+
{"version":3,"file":"clustalX.js","sourceRoot":"","sources":["../src/clustalX.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export declare function isGapSlot(slot: number): slot is 27 | 28;
|
|
2
|
+
export declare class ColumnCounts {
|
|
3
|
+
readonly numColumns: number;
|
|
4
|
+
private readonly counts;
|
|
5
|
+
readonly totals: Uint32Array;
|
|
6
|
+
private readonly slotTotals;
|
|
7
|
+
constructor(numColumns: number);
|
|
8
|
+
addRow(row: string): void;
|
|
9
|
+
add(col: number, letter: string): void;
|
|
10
|
+
total(col: number): number;
|
|
11
|
+
count(col: number, letter: string): number;
|
|
12
|
+
gapCount(col: number): number;
|
|
13
|
+
/**
|
|
14
|
+
* Visits every non-gap residue present in a column. Slots with a zero count
|
|
15
|
+
* are skipped, so this is ~the number of distinct residues, not 32.
|
|
16
|
+
*/
|
|
17
|
+
forEachResidue(col: number, cb: (slot: number, count: number) => void): void;
|
|
18
|
+
/** non-gap [letter, count] pairs for one column, for display */
|
|
19
|
+
residueEntries(col: number): [string, number][];
|
|
20
|
+
/** the distinct non-gap letters appearing anywhere in the alignment */
|
|
21
|
+
get lettersPresent(): Set<string>;
|
|
22
|
+
}
|
|
23
|
+
export declare function letterOfResidueSlot(slot: number): string;
|
|
24
|
+
export declare function residueSlotOfLetter(letter: string): number;
|
|
25
|
+
export declare const numResidueSlots = 32;
|
|
26
|
+
/**
|
|
27
|
+
* Tally counts from alignment rows (gapped sequence strings, one per row). The
|
|
28
|
+
* column count follows the longest row, matching what a per-column tally of
|
|
29
|
+
* ragged input produces.
|
|
30
|
+
*/
|
|
31
|
+
export declare function columnCountsFromRows(rows: string[]): ColumnCounts;
|
|
32
|
+
/**
|
|
33
|
+
* Tally counts from column strings (one string per column, listing that
|
|
34
|
+
* column's residues top to bottom). Convenient for tests and for callers that
|
|
35
|
+
* already think column-wise.
|
|
36
|
+
*/
|
|
37
|
+
export declare function columnCountsFromColumns(columns: string[]): ColumnCounts;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
// Per-column residue counts for an alignment, stored as a flat typed array
|
|
2
|
+
// instead of one `Record<string, number>` per column. Column statistics are the
|
|
3
|
+
// hottest computation in the viewer (they feed conservation, ClustalX coloring,
|
|
4
|
+
// consensus and the hover tooltip), and the object-per-column form spent all of
|
|
5
|
+
// its time on megamorphic string-keyed property increments: 1000x5000 residues
|
|
6
|
+
// took ~1.6s to tally that way versus ~35ms here.
|
|
7
|
+
//
|
|
8
|
+
// Each column owns a fixed stride of counter slots. Slots 1-26 are A-Z (case
|
|
9
|
+
// folded), plus a slot each for the two gap characters, '*', and anything else.
|
|
10
|
+
const SLOTS = 32;
|
|
11
|
+
const DASH = 27;
|
|
12
|
+
const DOT = 28;
|
|
13
|
+
const STAR = 29;
|
|
14
|
+
const OTHER = 30;
|
|
15
|
+
const A = 'A'.charCodeAt(0);
|
|
16
|
+
const Z = 'Z'.charCodeAt(0);
|
|
17
|
+
const a = 'a'.charCodeAt(0);
|
|
18
|
+
const z = 'z'.charCodeAt(0);
|
|
19
|
+
// charCode -> slot. A plain `code & 31` would fold digits and punctuation onto
|
|
20
|
+
// letter slots ('0' onto 'P'), so the mapping is an explicit table.
|
|
21
|
+
const slotOfCode = new Uint8Array(128).fill(OTHER);
|
|
22
|
+
for (let c = A; c <= Z; c++) {
|
|
23
|
+
slotOfCode[c] = c - A + 1;
|
|
24
|
+
}
|
|
25
|
+
for (let c = a; c <= z; c++) {
|
|
26
|
+
slotOfCode[c] = c - a + 1;
|
|
27
|
+
}
|
|
28
|
+
slotOfCode['-'.charCodeAt(0)] = DASH;
|
|
29
|
+
slotOfCode['.'.charCodeAt(0)] = DOT;
|
|
30
|
+
slotOfCode['*'.charCodeAt(0)] = STAR;
|
|
31
|
+
const letterOfSlot = Array.from({ length: SLOTS }, (_, slot) => slot >= 1 && slot <= 26 ? String.fromCharCode(A + slot - 1) : '');
|
|
32
|
+
letterOfSlot[DASH] = '-';
|
|
33
|
+
letterOfSlot[DOT] = '.';
|
|
34
|
+
letterOfSlot[STAR] = '*';
|
|
35
|
+
letterOfSlot[OTHER] = '?';
|
|
36
|
+
function slotOf(code) {
|
|
37
|
+
return code < 128 ? slotOfCode[code] : OTHER;
|
|
38
|
+
}
|
|
39
|
+
export function isGapSlot(slot) {
|
|
40
|
+
return slot === DASH || slot === DOT;
|
|
41
|
+
}
|
|
42
|
+
export class ColumnCounts {
|
|
43
|
+
numColumns;
|
|
44
|
+
counts;
|
|
45
|
+
// per-column residue+gap totals
|
|
46
|
+
totals;
|
|
47
|
+
// whole-alignment totals per slot, so "which letters appear anywhere" is a
|
|
48
|
+
// 32-slot scan rather than a walk over every column
|
|
49
|
+
slotTotals = new Uint32Array(SLOTS);
|
|
50
|
+
constructor(numColumns) {
|
|
51
|
+
this.numColumns = numColumns;
|
|
52
|
+
this.counts = new Uint32Array(numColumns * SLOTS);
|
|
53
|
+
this.totals = new Uint32Array(numColumns);
|
|
54
|
+
}
|
|
55
|
+
addRow(row) {
|
|
56
|
+
const { counts, totals, slotTotals } = this;
|
|
57
|
+
const n = Math.min(row.length, this.numColumns);
|
|
58
|
+
for (let col = 0; col < n; col++) {
|
|
59
|
+
const slot = slotOf(row.charCodeAt(col));
|
|
60
|
+
counts[col * SLOTS + slot]++;
|
|
61
|
+
totals[col]++;
|
|
62
|
+
slotTotals[slot]++;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
add(col, letter) {
|
|
66
|
+
const slot = slotOf(letter.charCodeAt(0));
|
|
67
|
+
this.counts[col * SLOTS + slot]++;
|
|
68
|
+
this.totals[col]++;
|
|
69
|
+
this.slotTotals[slot]++;
|
|
70
|
+
}
|
|
71
|
+
total(col) {
|
|
72
|
+
return this.totals[col] ?? 0;
|
|
73
|
+
}
|
|
74
|
+
count(col, letter) {
|
|
75
|
+
return this.counts[col * SLOTS + slotOf(letter.charCodeAt(0))] ?? 0;
|
|
76
|
+
}
|
|
77
|
+
gapCount(col) {
|
|
78
|
+
const base = col * SLOTS;
|
|
79
|
+
return (this.counts[base + DASH] ?? 0) + (this.counts[base + DOT] ?? 0);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Visits every non-gap residue present in a column. Slots with a zero count
|
|
83
|
+
* are skipped, so this is ~the number of distinct residues, not 32.
|
|
84
|
+
*/
|
|
85
|
+
forEachResidue(col, cb) {
|
|
86
|
+
const { counts } = this;
|
|
87
|
+
const base = col * SLOTS;
|
|
88
|
+
for (let slot = 1; slot < SLOTS; slot++) {
|
|
89
|
+
const count = counts[base + slot];
|
|
90
|
+
if (count > 0 && !isGapSlot(slot)) {
|
|
91
|
+
cb(slot, count);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** non-gap [letter, count] pairs for one column, for display */
|
|
96
|
+
residueEntries(col) {
|
|
97
|
+
const entries = [];
|
|
98
|
+
this.forEachResidue(col, (slot, count) => {
|
|
99
|
+
entries.push([letterOfSlot[slot], count]);
|
|
100
|
+
});
|
|
101
|
+
return entries;
|
|
102
|
+
}
|
|
103
|
+
/** the distinct non-gap letters appearing anywhere in the alignment */
|
|
104
|
+
get lettersPresent() {
|
|
105
|
+
const letters = new Set();
|
|
106
|
+
for (let slot = 1; slot < SLOTS; slot++) {
|
|
107
|
+
if (this.slotTotals[slot] > 0 && !isGapSlot(slot)) {
|
|
108
|
+
letters.add(letterOfSlot[slot]);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return letters;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
export function letterOfResidueSlot(slot) {
|
|
115
|
+
return letterOfSlot[slot];
|
|
116
|
+
}
|
|
117
|
+
export function residueSlotOfLetter(letter) {
|
|
118
|
+
return slotOf(letter.charCodeAt(0));
|
|
119
|
+
}
|
|
120
|
+
export const numResidueSlots = SLOTS;
|
|
121
|
+
/**
|
|
122
|
+
* Tally counts from alignment rows (gapped sequence strings, one per row). The
|
|
123
|
+
* column count follows the longest row, matching what a per-column tally of
|
|
124
|
+
* ragged input produces.
|
|
125
|
+
*/
|
|
126
|
+
export function columnCountsFromRows(rows) {
|
|
127
|
+
const numColumns = rows.reduce((max, row) => Math.max(max, row.length), 0);
|
|
128
|
+
const counts = new ColumnCounts(numColumns);
|
|
129
|
+
for (const row of rows) {
|
|
130
|
+
counts.addRow(row);
|
|
131
|
+
}
|
|
132
|
+
return counts;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Tally counts from column strings (one string per column, listing that
|
|
136
|
+
* column's residues top to bottom). Convenient for tests and for callers that
|
|
137
|
+
* already think column-wise.
|
|
138
|
+
*/
|
|
139
|
+
export function columnCountsFromColumns(columns) {
|
|
140
|
+
const counts = new ColumnCounts(columns.length);
|
|
141
|
+
for (const [col, column] of columns.entries()) {
|
|
142
|
+
for (const letter of column) {
|
|
143
|
+
counts.add(col, letter);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return counts;
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=columnCounts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"columnCounts.js","sourceRoot":"","sources":["../src/columnCounts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import React, { Suspense
|
|
1
|
+
import React, { Suspense } from 'react';
|
|
2
2
|
import { observer } from 'mobx-react';
|
|
3
|
-
import { useDevicePixelRatio } from "../useDevicePixelRatio.js";
|
|
4
3
|
import { HorizontalResizeHandle, VerticalResizeHandle, } from "./ResizeHandles.js";
|
|
5
4
|
import Track from "./Track.js";
|
|
6
5
|
import VerticalScrollbar from "./VerticalScrollbar.js";
|
|
@@ -72,12 +71,6 @@ const View = observer(function ({ model }) {
|
|
|
72
71
|
});
|
|
73
72
|
const MSAView = observer(function ({ model }) {
|
|
74
73
|
const { height, viewInitialized, DialogComponent, DialogProps } = model;
|
|
75
|
-
// mirror the live device pixel ratio into the model so canvas backing stores
|
|
76
|
-
// re-scale when the window moves between monitors or the browser zooms
|
|
77
|
-
const devicePixelRatio = useDevicePixelRatio();
|
|
78
|
-
useEffect(() => {
|
|
79
|
-
model.setHighResScaleFactor(devicePixelRatio);
|
|
80
|
-
}, [model, devicePixelRatio]);
|
|
81
74
|
return (React.createElement("div", null, viewInitialized ? (React.createElement(React.Fragment, null,
|
|
82
75
|
React.createElement("div", { style: { height, overflow: 'hidden' } },
|
|
83
76
|
React.createElement(Header, { model: model }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSAView.js","sourceRoot":"","sources":["../../src/components/MSAView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"MSAView.js","sourceRoot":"","sources":["../../src/components/MSAView.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MsaViewModel } from '../model.ts';
|
|
2
|
+
export declare function getVisibleLeaves({ model, offsetY, blockSizeY, }: {
|
|
3
|
+
model: MsaViewModel;
|
|
4
|
+
offsetY: number;
|
|
5
|
+
blockSizeY: number;
|
|
6
|
+
}): import("../hierarchy.ts").HierarchyNode<import("../types.ts").NodeWithIdsAndLength>[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getVisibleLeaves.js","sourceRoot":"","sources":["../../src/components/getVisibleLeaves.ts"],"names":[],"mappings":"AAEA,2EAA2E;AAC3E,2DAA2D;AAC3D,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,OAAO,EACP,UAAU,GAKX;IACC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IACnC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAAC,CAAA;IACzE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CACnB,CAAC,EACD,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC,CAC1D,CAAA;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
import React
|
|
1
|
+
import React from 'react';
|
|
2
2
|
import { BaseTooltip } from '@jbrowse/core/ui';
|
|
3
3
|
import { observer } from 'mobx-react';
|
|
4
4
|
import ColumnStats from "./ColumnStats.js";
|
|
5
5
|
import { renderBoxFeatureCanvasBlock } from "./renderBoxFeatureCanvasBlock.js";
|
|
6
6
|
import { renderMSABlock } from "./renderMSABlock.js";
|
|
7
|
+
import { useMsaBlockMouse } from "./useMsaBlockMouse.js";
|
|
7
8
|
import { useCanvasAutorun } from "../../useCanvasAutorun.js";
|
|
8
9
|
import { useColorContrast } from "../../useColorContrast.js";
|
|
9
|
-
function eventToColRow(event, el, offsetX, offsetY, colWidth, rowHeight) {
|
|
10
|
-
const { left, top } = el.getBoundingClientRect();
|
|
11
|
-
return {
|
|
12
|
-
col: Math.floor((event.clientX - left + offsetX) / colWidth),
|
|
13
|
-
row: Math.floor((event.clientY - top + offsetY) / rowHeight),
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
10
|
const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
17
|
-
const {
|
|
11
|
+
const { scrollY, scrollX, colorScheme, blockSize, highResScaleFactor } = model;
|
|
18
12
|
const { theme, contrastScheme } = useColorContrast(colorScheme);
|
|
13
|
+
const { tooltipPoint, onMouseMove, onClick, onMouseLeave } = useMsaBlockMouse({
|
|
14
|
+
model,
|
|
15
|
+
offsetX,
|
|
16
|
+
offsetY,
|
|
17
|
+
});
|
|
19
18
|
const ref = useCanvasAutorun(ctx => {
|
|
19
|
+
const { blockSize, highResScaleFactor, actuallyShowDomains } = model;
|
|
20
20
|
ctx.resetTransform();
|
|
21
21
|
ctx.clearRect(0, 0, blockSize * highResScaleFactor, blockSize * highResScaleFactor);
|
|
22
|
-
if (
|
|
22
|
+
if (actuallyShowDomains) {
|
|
23
23
|
renderBoxFeatureCanvasBlock({
|
|
24
24
|
ctx,
|
|
25
25
|
offsetX,
|
|
@@ -35,53 +35,19 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
|
35
35
|
contrastScheme,
|
|
36
36
|
model,
|
|
37
37
|
});
|
|
38
|
-
}, [
|
|
39
|
-
model,
|
|
40
|
-
offsetX,
|
|
41
|
-
offsetY,
|
|
42
|
-
theme,
|
|
43
|
-
blockSize,
|
|
44
|
-
highResScaleFactor,
|
|
45
|
-
contrastScheme,
|
|
46
|
-
]);
|
|
47
|
-
const [mousePosition, setMousePosition] = useState();
|
|
38
|
+
}, [model, offsetX, offsetY, theme, contrastScheme]);
|
|
48
39
|
const { hoveredInsertion, mouseOverDomains, showColumnStats } = model;
|
|
49
40
|
return (React.createElement(React.Fragment, null,
|
|
50
41
|
React.createElement("canvas", { ref: ref, onMouseMove: event => {
|
|
51
42
|
if (ref.current) {
|
|
52
|
-
|
|
53
|
-
// Only set mouse position if within valid MSA bounds
|
|
54
|
-
if (col >= 0 &&
|
|
55
|
-
col < model.numColumns &&
|
|
56
|
-
row >= 0 &&
|
|
57
|
-
row < model.numRows) {
|
|
58
|
-
model.setMousePos(col, row);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
model.setMousePos(undefined, undefined);
|
|
62
|
-
}
|
|
63
|
-
// only track client coords when there's something to show in the
|
|
64
|
-
// tooltip: an insertion, a domain under the cursor, or column stats
|
|
65
|
-
// (when that option is enabled). avoids a re-render on every move
|
|
66
|
-
// when nothing would be shown
|
|
67
|
-
const hasTooltip = model.hoveredInsertion ||
|
|
68
|
-
model.mouseOverDomains.length > 0 ||
|
|
69
|
-
(model.showColumnStats && !!model.mouseOverColumnStats);
|
|
70
|
-
setMousePosition(hasTooltip ? { x: event.clientX, y: event.clientY } : undefined);
|
|
43
|
+
onMouseMove(event, ref.current);
|
|
71
44
|
}
|
|
72
45
|
}, onClick: event => {
|
|
73
46
|
if (ref.current) {
|
|
74
|
-
|
|
75
|
-
if (col === mouseClickCol && row === mouseClickRow) {
|
|
76
|
-
model.setMouseClickPos(undefined, undefined);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
model.setMouseClickPos(col, row);
|
|
80
|
-
}
|
|
47
|
+
onClick(event, ref.current);
|
|
81
48
|
}
|
|
82
49
|
}, onMouseLeave: () => {
|
|
83
|
-
|
|
84
|
-
setMousePosition(undefined);
|
|
50
|
+
onMouseLeave();
|
|
85
51
|
}, width: blockSize * highResScaleFactor, height: blockSize * highResScaleFactor, style: {
|
|
86
52
|
position: 'absolute',
|
|
87
53
|
top: scrollY + offsetY,
|
|
@@ -89,7 +55,7 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
|
89
55
|
width: blockSize,
|
|
90
56
|
height: blockSize,
|
|
91
57
|
} }),
|
|
92
|
-
|
|
58
|
+
tooltipPoint ? (React.createElement(BaseTooltip, { clientPoint: { x: tooltipPoint.x, y: tooltipPoint.y + 15 } }, hoveredInsertion ? (React.createElement(React.Fragment, null,
|
|
93
59
|
"Insertion (",
|
|
94
60
|
hoveredInsertion.letters.length,
|
|
95
61
|
model.sequenceType === 'amino' ? 'aa' : 'bp',
|
|
@@ -97,10 +63,7 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
|
97
63
|
' ',
|
|
98
64
|
hoveredInsertion.letters.length > 20
|
|
99
65
|
? `${hoveredInsertion.letters.slice(0, 20)}...`
|
|
100
|
-
: hoveredInsertion.letters)) : null,
|
|
101
|
-
!hoveredInsertion &&
|
|
102
|
-
mousePosition &&
|
|
103
|
-
(mouseOverDomains.length > 0 || showColumnStats) ? (React.createElement(BaseTooltip, { clientPoint: { x: mousePosition.x, y: mousePosition.y + 15 } },
|
|
66
|
+
: hoveredInsertion.letters)) : (React.createElement(React.Fragment, null,
|
|
104
67
|
mouseOverDomains.map(d => (React.createElement("div", { key: `${d.accession}-${d.start}-${d.end}` },
|
|
105
68
|
React.createElement("b", null, d.name),
|
|
106
69
|
" (",
|
|
@@ -112,7 +75,7 @@ const MSACanvasBlock = observer(function ({ model, offsetX, offsetY, }) {
|
|
|
112
75
|
d.description ? (React.createElement(React.Fragment, null,
|
|
113
76
|
React.createElement("br", null),
|
|
114
77
|
d.description)) : null))),
|
|
115
|
-
showColumnStats ? React.createElement(ColumnStats, { model: model }) : null)) : null));
|
|
78
|
+
showColumnStats ? React.createElement(ColumnStats, { model: model }) : null)))) : null));
|
|
116
79
|
});
|
|
117
80
|
export default MSACanvasBlock;
|
|
118
81
|
//# sourceMappingURL=MSACanvasBlock.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"MSACanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/MSACanvasBlock.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import type { MsaViewModel } from '../../model.ts';
|
|
2
2
|
import type { RenderCtx } from '../renderCtx.ts';
|
|
3
|
-
export declare function renderBoxFeatureCanvasBlock({ model, offsetX, offsetY, ctx, highResScaleFactorOverride, blockSizeYOverride, }: {
|
|
3
|
+
export declare function renderBoxFeatureCanvasBlock({ model, offsetX, offsetY, ctx, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, }: {
|
|
4
4
|
offsetX: number;
|
|
5
5
|
offsetY: number;
|
|
6
6
|
model: MsaViewModel;
|
|
7
7
|
ctx: RenderCtx;
|
|
8
8
|
highResScaleFactorOverride?: number;
|
|
9
|
+
blockSizeXOverride?: number;
|
|
9
10
|
blockSizeYOverride?: number;
|
|
10
11
|
}): void;
|
|
@@ -1,44 +1,46 @@
|
|
|
1
|
-
import { getVisibleLeaves } from "./getVisibleLeaves.js";
|
|
2
1
|
import { subFeatureRowHeight } from "../../constants.js";
|
|
3
|
-
|
|
2
|
+
import { getVisibleLeaves } from "../getVisibleLeaves.js";
|
|
3
|
+
export function renderBoxFeatureCanvasBlock({ model, offsetX, offsetY, ctx, highResScaleFactorOverride, blockSizeXOverride, blockSizeYOverride, }) {
|
|
4
4
|
const { blockSize, rowHeight, highResScaleFactor, showDomains } = model;
|
|
5
5
|
if (showDomains) {
|
|
6
6
|
const k = highResScaleFactorOverride ?? highResScaleFactor;
|
|
7
|
+
const bx = blockSizeXOverride ?? blockSize;
|
|
7
8
|
const by = blockSizeYOverride ?? blockSize;
|
|
8
9
|
ctx.resetTransform();
|
|
9
10
|
ctx.scale(k, k);
|
|
10
11
|
ctx.translate(-offsetX, rowHeight / 2 - offsetY);
|
|
11
|
-
const visibleLeaves = getVisibleLeaves({ model, offsetY, blockSizeY: by });
|
|
12
12
|
drawTiles({
|
|
13
13
|
model,
|
|
14
14
|
ctx,
|
|
15
|
-
visibleLeaves,
|
|
15
|
+
visibleLeaves: getVisibleLeaves({ model, offsetY, blockSizeY: by }),
|
|
16
|
+
offsetX,
|
|
17
|
+
blockWidth: bx,
|
|
16
18
|
});
|
|
17
19
|
}
|
|
18
20
|
}
|
|
19
|
-
function drawTiles({ model, ctx, visibleLeaves, }) {
|
|
20
|
-
const { subFeatureRows, colWidth, rowHeight, fillPalette, strokePalette, segmentLabels, showMsaLetters,
|
|
21
|
+
function drawTiles({ model, ctx, visibleLeaves, offsetX, blockWidth, }) {
|
|
22
|
+
const { subFeatureRows, colWidth, rowHeight, fillPalette, strokePalette, segmentLabels, showMsaLetters, domainBands, } = model;
|
|
21
23
|
const h = subFeatureRows ? subFeatureRowHeight : rowHeight;
|
|
22
24
|
// exon numbers label the bands only when residue letters aren't drawn (zoomed
|
|
23
25
|
// out); when letters show, the alternating shades alone mark the boundaries
|
|
24
26
|
// and a number would collide with the sequence
|
|
25
27
|
const drawSegmentLabels = !showMsaLetters && !subFeatureRows && h >= 9;
|
|
28
|
+
// gene arrow heads stick out one row-height past the band, so pad the cull
|
|
29
|
+
// window enough that a band just outside the block still draws its head
|
|
30
|
+
const cull = h + colWidth;
|
|
31
|
+
const xMin = offsetX - cull;
|
|
32
|
+
const xMax = offsetX + blockWidth + cull;
|
|
26
33
|
for (let i = 0, l1 = visibleLeaves.length; i < l1; i++) {
|
|
27
34
|
const node = visibleLeaves[i];
|
|
28
|
-
const { name } = node.data;
|
|
29
35
|
const y = node.x;
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
for (
|
|
33
|
-
const {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
if (m1 !== undefined && m2 !== undefined) {
|
|
39
|
-
const x = m1 * colWidth;
|
|
40
|
-
const t = y - rowHeight + (subFeatureRows ? j * h : 0);
|
|
41
|
-
const lw = colWidth * (m2 - m1);
|
|
36
|
+
const bands = domainBands.get(node.data.name);
|
|
37
|
+
if (bands) {
|
|
38
|
+
for (const { annotation, startCol, endCol, stackIndex } of bands) {
|
|
39
|
+
const { accession, strand } = annotation;
|
|
40
|
+
const x = startCol * colWidth;
|
|
41
|
+
const lw = colWidth * (endCol - startCol);
|
|
42
|
+
if (x + lw >= xMin && x <= xMax) {
|
|
43
|
+
const t = y - rowHeight + (subFeatureRows ? stackIndex * h : 0);
|
|
42
44
|
ctx.fillStyle = fillPalette[accession];
|
|
43
45
|
ctx.strokeStyle = strokePalette[accession];
|
|
44
46
|
if (strand === undefined) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderBoxFeatureCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderBoxFeatureCanvasBlock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"renderBoxFeatureCanvasBlock.js","sourceRoot":"","sources":["../../../src/components/msa/renderBoxFeatureCanvasBlock.ts"],"names":[],"mappings":"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"}
|