react-msaview 4.6.0 → 4.8.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/bundle/index.js +99 -99
- package/bundle/index.js.LICENSE.txt +6 -6
- package/bundle/index.js.map +1 -1
- package/dist/__snapshots__/parseAsn1.test.js.snap +2400 -0
- package/dist/components/header/HeaderInfoArea.js +3 -4
- package/dist/components/header/HeaderInfoArea.js.map +1 -1
- package/dist/components/import/ImportForm.js +6 -2
- package/dist/components/import/ImportForm.js.map +1 -1
- package/dist/components/import/util.d.ts +1 -1
- package/dist/components/import/util.js +4 -1
- package/dist/components/import/util.js.map +1 -1
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js +7 -2
- package/dist/components/msa/renderBoxFeatureCanvasBlock.js.map +1 -1
- package/dist/components/msa/renderMSABlock.js.map +1 -1
- package/dist/components/tree/renderTreeCanvas.js +10 -8
- package/dist/components/tree/renderTreeCanvas.js.map +1 -1
- package/dist/model.d.ts +153 -16
- package/dist/model.js +97 -29
- package/dist/model.js.map +1 -1
- package/dist/rowCoordinateCalculations.d.ts +69 -9
- package/dist/rowCoordinateCalculations.js +118 -46
- package/dist/rowCoordinateCalculations.js.map +1 -1
- package/dist/rowCoordinateCalculations.test.js +152 -52
- package/dist/rowCoordinateCalculations.test.js.map +1 -1
- package/dist/seqPosToGlobalCol.d.ts +19 -0
- package/dist/seqPosToGlobalCol.js +34 -0
- package/dist/seqPosToGlobalCol.js.map +1 -0
- package/dist/seqPosToGlobalCol.test.js +60 -0
- package/dist/seqPosToGlobalCol.test.js.map +1 -0
- package/dist/util.d.ts +1 -2
- package/dist/util.js +0 -9
- package/dist/util.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -9
- package/src/components/header/HeaderInfoArea.tsx +2 -5
- package/src/components/import/ImportForm.tsx +6 -1
- package/src/components/import/util.ts +4 -0
- package/src/components/msa/renderBoxFeatureCanvasBlock.ts +7 -2
- package/src/components/msa/renderMSABlock.ts +5 -1
- package/src/components/tree/renderTreeCanvas.ts +11 -9
- package/src/declare.d.ts +0 -1
- package/src/model.ts +122 -42
- package/src/rowCoordinateCalculations.test.ts +167 -74
- package/src/rowCoordinateCalculations.ts +138 -63
- package/src/seqPosToGlobalCol.test.ts +71 -0
- package/src/seqPosToGlobalCol.ts +40 -0
- package/src/util.ts +1 -19
- package/src/version.ts +1 -1
- package/dist/parseGFF.d.ts +0 -10
- package/dist/parseGFF.js +0 -31
- package/dist/parseGFF.js.map +0 -1
- package/dist/parseNewick.d.ts +0 -60
- package/dist/parseNewick.js +0 -95
- package/dist/parseNewick.js.map +0 -1
- package/dist/parsers/A3mMSA.d.ts +0 -43
- package/dist/parsers/A3mMSA.js +0 -277
- package/dist/parsers/A3mMSA.js.map +0 -1
- package/dist/parsers/A3mMSA.test.js +0 -138
- package/dist/parsers/A3mMSA.test.js.map +0 -1
- package/dist/parsers/ClustalMSA.d.ts +0 -30
- package/dist/parsers/ClustalMSA.js +0 -55
- package/dist/parsers/ClustalMSA.js.map +0 -1
- package/dist/parsers/EmfMSA.d.ts +0 -27
- package/dist/parsers/EmfMSA.js +0 -53
- package/dist/parsers/EmfMSA.js.map +0 -1
- package/dist/parsers/EmfTree.d.ts +0 -5
- package/dist/parsers/EmfTree.js +0 -8
- package/dist/parsers/EmfTree.js.map +0 -1
- package/dist/parsers/FastaMSA.d.ts +0 -19
- package/dist/parsers/FastaMSA.js +0 -69
- package/dist/parsers/FastaMSA.js.map +0 -1
- package/dist/parsers/StockholmMSA.d.ts +0 -68
- package/dist/parsers/StockholmMSA.js +0 -107
- package/dist/parsers/StockholmMSA.js.map +0 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.d.ts +0 -4
- package/dist/seqCoordToRowSpecificGlobalCoord.js +0 -19
- package/dist/seqCoordToRowSpecificGlobalCoord.js.map +0 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.test.d.ts +0 -1
- package/dist/seqCoordToRowSpecificGlobalCoord.test.js +0 -42
- package/dist/seqCoordToRowSpecificGlobalCoord.test.js.map +0 -1
- package/src/parseGFF.ts +0 -34
- package/src/parseNewick.ts +0 -94
- package/src/parsers/A3mMSA.test.ts +0 -164
- package/src/parsers/A3mMSA.ts +0 -321
- package/src/parsers/ClustalMSA.ts +0 -69
- package/src/parsers/EmfMSA.ts +0 -67
- package/src/parsers/EmfTree.ts +0 -9
- package/src/parsers/FastaMSA.ts +0 -82
- package/src/parsers/StockholmMSA.ts +0 -140
- package/src/seqCoordToRowSpecificGlobalCoord.test.ts +0 -53
- package/src/seqCoordToRowSpecificGlobalCoord.ts +0 -25
- /package/dist/{parsers/A3mMSA.test.d.ts → seqPosToGlobalCol.test.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seqPosToGlobalCol.test.js","sourceRoot":"","sources":["../src/seqPosToGlobalCol.test.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { NodeWithIds } from './types';
|
|
2
2
|
import type { Theme } from '@mui/material';
|
|
3
3
|
import type { HierarchyNode } from 'd3-hierarchy';
|
|
4
4
|
export declare function transform<T>(obj: Record<string, T>, cb: (arg0: [string, T]) => [string, T]): {
|
|
5
5
|
[k: string]: T;
|
|
6
6
|
};
|
|
7
|
-
export declare function generateNodeIds(tree: Node, parent?: string, depth?: number): NodeWithIds;
|
|
8
7
|
export declare function colorContrast(colorScheme: Record<string, string>, theme: Theme): {
|
|
9
8
|
[k: string]: string;
|
|
10
9
|
};
|
package/dist/util.js
CHANGED
|
@@ -5,15 +5,6 @@ extend([namesPlugin]);
|
|
|
5
5
|
export function transform(obj, cb) {
|
|
6
6
|
return Object.fromEntries(Object.entries(obj).map(cb));
|
|
7
7
|
}
|
|
8
|
-
export function generateNodeIds(tree, parent = 'node', depth = 0) {
|
|
9
|
-
const id = `${parent}-${depth}`;
|
|
10
|
-
return {
|
|
11
|
-
...tree,
|
|
12
|
-
id,
|
|
13
|
-
name: tree.name || id,
|
|
14
|
-
children: tree.children?.map((b, i) => generateNodeIds(b, `${id}-${i}`, depth + 1)) || [],
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
8
|
export function colorContrast(colorScheme, theme) {
|
|
18
9
|
return transform(colorScheme, ([letter, color]) => [
|
|
19
10
|
letter,
|
package/dist/util.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AACvC,OAAO,WAAW,MAAM,sBAAsB,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAM9B,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,CAAA;AAErB,MAAM,UAAU,SAAS,CACvB,GAAsB,EACtB,EAAsC;IAEtC,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "4.
|
|
1
|
+
export declare const version = "4.7.0";
|
package/dist/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '4.
|
|
1
|
+
export const version = '4.7.0';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-msaview",
|
|
3
3
|
"author": "Colin",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.8.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
},
|
|
21
21
|
"scripts": {
|
|
22
22
|
"clean": "rimraf dist",
|
|
23
|
-
"watch": "
|
|
23
|
+
"watch": "pnpm build:esm --watch",
|
|
24
24
|
"format": "prettier --write .",
|
|
25
|
-
"prebuild": "
|
|
25
|
+
"prebuild": "pnpm clean",
|
|
26
26
|
"preversion": "node output-version.js > src/version.ts && git add -A src && git commit -m '[skip ci] Bump version.ts'",
|
|
27
27
|
"build:esm": "tsc",
|
|
28
28
|
"build:bundle": "webpack",
|
|
29
|
-
"build": "
|
|
30
|
-
"prepack": "
|
|
29
|
+
"build": "pnpm build:esm && pnpm build:bundle",
|
|
30
|
+
"prepack": "pnpm build",
|
|
31
31
|
"postversion": "git push --follow-tags",
|
|
32
32
|
"statedocs": "rm -rf apidocs && mkdir apidocs && node --experimental-strip-types docgen/generateStateModelDocs.ts",
|
|
33
|
-
"poststatedocs": "
|
|
33
|
+
"poststatedocs": "pnpm format",
|
|
34
34
|
"test": "vitest"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
@@ -46,16 +46,14 @@
|
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@mui/icons-material": "^7.0.1",
|
|
48
48
|
"@mui/material": "^7.0.1",
|
|
49
|
-
"
|
|
49
|
+
"@react-msaview/parsers": "workspace:*",
|
|
50
50
|
"colord": "^2.9.3",
|
|
51
51
|
"copy-to-clipboard": "^3.3.1",
|
|
52
52
|
"d3-array": "^3.2.3",
|
|
53
53
|
"d3-hierarchy": "^3.1.2",
|
|
54
|
-
"emf-js": "^2.0.0",
|
|
55
54
|
"file-saver": "^2.0.5",
|
|
56
55
|
"flatbush": "^4.4.0",
|
|
57
56
|
"pako": "^2.1.0",
|
|
58
|
-
"stockholm-js": "^1.0.10",
|
|
59
57
|
"svgcanvas": "^2.5.0"
|
|
60
58
|
}
|
|
61
59
|
}
|
|
@@ -19,11 +19,8 @@ const HeaderInfoArea = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
19
19
|
return mouseOverRowName && mouseCol !== undefined ? (
|
|
20
20
|
<Typography className={classes.margin}>
|
|
21
21
|
{mouseOverRowName}:
|
|
22
|
-
{model.
|
|
23
|
-
|
|
24
|
-
mouseCol,
|
|
25
|
-
)}{' '}
|
|
26
|
-
({model.mouseOverCoordToRowLetter(mouseOverRowName, mouseCol)})
|
|
22
|
+
{model.visibleColToSeqPosOneBased(mouseOverRowName, mouseCol)} (
|
|
23
|
+
{model.visibleColToRowLetter(mouseOverRowName, mouseCol)})
|
|
27
24
|
</Typography>
|
|
28
25
|
) : null
|
|
29
26
|
})
|
|
@@ -13,6 +13,7 @@ import type { FileLocation } from '@jbrowse/core/util/types'
|
|
|
13
13
|
const ImportForm = observer(function ({ model }: { model: MsaViewModel }) {
|
|
14
14
|
const [msaFile, setMsaFile] = useState<FileLocation>()
|
|
15
15
|
const [treeFile, setTreeFile] = useState<FileLocation>()
|
|
16
|
+
const [gffFile, setGffFile] = useState<FileLocation>()
|
|
16
17
|
const { error } = model
|
|
17
18
|
|
|
18
19
|
return (
|
|
@@ -48,6 +49,10 @@ const ImportForm = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
48
49
|
<Typography>Tree file or URL</Typography>
|
|
49
50
|
<FileSelector location={treeFile} setLocation={setTreeFile} />
|
|
50
51
|
</div>
|
|
52
|
+
<div>
|
|
53
|
+
<Typography>InterProScan GFF file or URL (optional)</Typography>
|
|
54
|
+
<FileSelector location={gffFile} setLocation={setGffFile} />
|
|
55
|
+
</div>
|
|
51
56
|
</div>
|
|
52
57
|
<div>
|
|
53
58
|
<Button
|
|
@@ -55,7 +60,7 @@ const ImportForm = observer(function ({ model }: { model: MsaViewModel }) {
|
|
|
55
60
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
56
61
|
;(async () => {
|
|
57
62
|
try {
|
|
58
|
-
await load(model, msaFile, treeFile)
|
|
63
|
+
await load(model, msaFile, treeFile, gffFile)
|
|
59
64
|
} catch (e) {
|
|
60
65
|
console.error(e)
|
|
61
66
|
model.setError(e)
|
|
@@ -5,6 +5,7 @@ export async function load(
|
|
|
5
5
|
model: MsaViewModel,
|
|
6
6
|
msaFile?: FileLocation,
|
|
7
7
|
treeFile?: FileLocation,
|
|
8
|
+
gffFile?: FileLocation,
|
|
8
9
|
) {
|
|
9
10
|
model.setError(undefined)
|
|
10
11
|
if (msaFile) {
|
|
@@ -13,4 +14,7 @@ export async function load(
|
|
|
13
14
|
if (treeFile) {
|
|
14
15
|
model.setTreeFilehandle(treeFile)
|
|
15
16
|
}
|
|
17
|
+
if (gffFile) {
|
|
18
|
+
model.setGFFFilehandle(gffFile)
|
|
19
|
+
}
|
|
16
20
|
}
|
|
@@ -69,8 +69,13 @@ function drawTiles({
|
|
|
69
69
|
if (entry) {
|
|
70
70
|
for (let j = 0, l2 = entry.length; j < l2; j++) {
|
|
71
71
|
const { start, end, accession } = entry[j]!
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
// Convert sequence positions to visible column positions
|
|
73
|
+
// seqPos is 1-based from InterPro, so subtract 1 for 0-based
|
|
74
|
+
const m1 = model.seqPosToVisibleCol(name, start - 1)
|
|
75
|
+
const m2 = model.seqPosToVisibleCol(name, end)
|
|
76
|
+
if (m1 === undefined || m2 === undefined) {
|
|
77
|
+
continue // Skip if either position is hidden
|
|
78
|
+
}
|
|
74
79
|
const x = m1 * colWidth
|
|
75
80
|
ctx.fillStyle = fillPalette[accession]!
|
|
76
81
|
ctx.strokeStyle = strokePalette[accession]!
|
|
@@ -224,7 +224,11 @@ function drawText({
|
|
|
224
224
|
: bgColor
|
|
225
225
|
? contrast
|
|
226
226
|
: color || 'black'
|
|
227
|
-
ctx.fillText(
|
|
227
|
+
ctx.fillText(
|
|
228
|
+
displayLetter,
|
|
229
|
+
j * colWidth + offsetXAligned + halfColWidth,
|
|
230
|
+
y,
|
|
231
|
+
)
|
|
228
232
|
}
|
|
229
233
|
}
|
|
230
234
|
}
|
|
@@ -52,10 +52,11 @@ export function renderTree({
|
|
|
52
52
|
}
|
|
53
53
|
const sy = source.x!
|
|
54
54
|
const ty = target.x!
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
const tx = showBranchLen ? (target as { len?: number }).len : target.y
|
|
56
|
+
const sx = showBranchLen ? (source as { len?: number }).len : source.y
|
|
57
|
+
if (tx === undefined || sx === undefined) {
|
|
58
|
+
continue
|
|
59
|
+
}
|
|
59
60
|
|
|
60
61
|
const y1 = Math.min(sy, ty)
|
|
61
62
|
const y2 = Math.max(sy, ty)
|
|
@@ -94,9 +95,11 @@ export function renderNodeBubbles({
|
|
|
94
95
|
} = model
|
|
95
96
|
const by = blockSizeYOverride || blockSize
|
|
96
97
|
for (const node of hierarchy.descendants()) {
|
|
97
|
-
const
|
|
98
|
-
|
|
99
|
-
|
|
98
|
+
const x = showBranchLen ? (node as { len?: number }).len : node.y
|
|
99
|
+
if (x === undefined) {
|
|
100
|
+
continue
|
|
101
|
+
}
|
|
102
|
+
const { data } = node
|
|
100
103
|
const y = node.x!
|
|
101
104
|
const { id, name } = data
|
|
102
105
|
if (
|
|
@@ -167,9 +170,8 @@ export function renderTreeLabels({
|
|
|
167
170
|
for (const node of leaves) {
|
|
168
171
|
const {
|
|
169
172
|
data: { name, id },
|
|
170
|
-
// @ts-expect-error
|
|
171
|
-
len,
|
|
172
173
|
} = node
|
|
174
|
+
const len = (node as { len?: number }).len
|
|
173
175
|
const y = node.x!
|
|
174
176
|
const x = node.y!
|
|
175
177
|
|
package/src/declare.d.ts
CHANGED
package/src/model.ts
CHANGED
|
@@ -9,14 +9,25 @@ import {
|
|
|
9
9
|
} from '@jbrowse/core/util'
|
|
10
10
|
import { openLocation } from '@jbrowse/core/util/io'
|
|
11
11
|
import { ElementId, FileLocation } from '@jbrowse/core/util/types/mst'
|
|
12
|
+
import {
|
|
13
|
+
A3mMSA,
|
|
14
|
+
ClustalMSA,
|
|
15
|
+
EmfMSA,
|
|
16
|
+
FastaMSA,
|
|
17
|
+
StockholmMSA,
|
|
18
|
+
generateNodeIds,
|
|
19
|
+
gffToInterProResults,
|
|
20
|
+
parseEmfTree,
|
|
21
|
+
parseGFF,
|
|
22
|
+
parseNewick,
|
|
23
|
+
stockholmSniff,
|
|
24
|
+
} from '@react-msaview/parsers'
|
|
12
25
|
import { colord } from 'colord'
|
|
13
26
|
import { ascending } from 'd3-array'
|
|
14
27
|
import { cluster, hierarchy } from 'd3-hierarchy'
|
|
15
|
-
import { parseEmfTree } from 'emf-js'
|
|
16
28
|
import { saveAs } from 'file-saver'
|
|
17
29
|
import { autorun, transaction } from 'mobx'
|
|
18
30
|
import { addDisposer, cast, types } from 'mobx-state-tree'
|
|
19
|
-
import Stockholm from 'stockholm-js'
|
|
20
31
|
|
|
21
32
|
import { blocksX, blocksY } from './calculateBlocks'
|
|
22
33
|
import colorSchemes from './colorSchemes'
|
|
@@ -55,26 +66,14 @@ import { MSAModelF } from './model/msaModel'
|
|
|
55
66
|
import { TreeModelF } from './model/treeModel'
|
|
56
67
|
import { calculateNeighborJoiningTree } from './neighborJoining'
|
|
57
68
|
import { parseAsn1 } from './parseAsn1'
|
|
58
|
-
import parseNewick from './parseNewick'
|
|
59
|
-
import A3mMSA from './parsers/A3mMSA'
|
|
60
|
-
import ClustalMSA from './parsers/ClustalMSA'
|
|
61
|
-
import EmfMSA from './parsers/EmfMSA'
|
|
62
|
-
import FastaMSA from './parsers/FastaMSA'
|
|
63
|
-
import StockholmMSA from './parsers/StockholmMSA'
|
|
64
69
|
import { reparseTree } from './reparseTree'
|
|
65
70
|
import {
|
|
66
|
-
|
|
67
|
-
|
|
71
|
+
globalColToVisibleCol,
|
|
72
|
+
visibleColToGlobalCol,
|
|
73
|
+
visibleColToSeqPosForRow,
|
|
68
74
|
} from './rowCoordinateCalculations'
|
|
69
|
-
import {
|
|
70
|
-
import {
|
|
71
|
-
collapse,
|
|
72
|
-
generateNodeIds,
|
|
73
|
-
len,
|
|
74
|
-
maxLength,
|
|
75
|
-
setBrLength,
|
|
76
|
-
skipBlanks,
|
|
77
|
-
} from './util'
|
|
75
|
+
import { seqPosToGlobalCol } from './seqPosToGlobalCol'
|
|
76
|
+
import { collapse, len, maxLength, setBrLength, skipBlanks } from './util'
|
|
78
77
|
|
|
79
78
|
import type { InterProScanResults } from './launchInterProScan'
|
|
80
79
|
import type {
|
|
@@ -193,6 +192,12 @@ function stateModelFactory() {
|
|
|
193
192
|
*/
|
|
194
193
|
treeMetadataFilehandle: types.maybe(FileLocation),
|
|
195
194
|
|
|
195
|
+
/**
|
|
196
|
+
* #property
|
|
197
|
+
* filehandle object for InterProScan GFF file
|
|
198
|
+
*/
|
|
199
|
+
gffFilehandle: types.maybe(FileLocation),
|
|
200
|
+
|
|
196
201
|
/**
|
|
197
202
|
* #property
|
|
198
203
|
*
|
|
@@ -569,6 +574,13 @@ function stateModelFactory() {
|
|
|
569
574
|
self.treeFilehandle = treeFilehandle
|
|
570
575
|
},
|
|
571
576
|
|
|
577
|
+
/**
|
|
578
|
+
* #action
|
|
579
|
+
*/
|
|
580
|
+
setGFFFilehandle(gffFilehandle?: FileLocationType) {
|
|
581
|
+
self.gffFilehandle = gffFilehandle
|
|
582
|
+
},
|
|
583
|
+
|
|
572
584
|
/**
|
|
573
585
|
* #action
|
|
574
586
|
*/
|
|
@@ -690,7 +702,7 @@ function stateModelFactory() {
|
|
|
690
702
|
get MSA() {
|
|
691
703
|
const text = self.data.msa
|
|
692
704
|
if (text) {
|
|
693
|
-
if (
|
|
705
|
+
if (stockholmSniff(text)) {
|
|
694
706
|
return new StockholmMSA(text, self.currentAlignment)
|
|
695
707
|
} else if (A3mMSA.sniff(text)) {
|
|
696
708
|
return new A3mMSA(text)
|
|
@@ -1485,7 +1497,7 @@ function stateModelFactory() {
|
|
|
1485
1497
|
.map(t => ({
|
|
1486
1498
|
model: {
|
|
1487
1499
|
...t,
|
|
1488
|
-
data: hideGapsEffective ? skipBlanks(blanks, t.data!) : t.data
|
|
1500
|
+
data: hideGapsEffective ? skipBlanks(blanks, t.data!) : t.data!,
|
|
1489
1501
|
height: rowHeight,
|
|
1490
1502
|
} as TextTrackModel,
|
|
1491
1503
|
ReactComponent: TextTrack,
|
|
@@ -1531,22 +1543,30 @@ function stateModelFactory() {
|
|
|
1531
1543
|
|
|
1532
1544
|
/**
|
|
1533
1545
|
* #method
|
|
1534
|
-
*
|
|
1546
|
+
* Return a row-specific letter at a visible column, or undefined if gap.
|
|
1547
|
+
*
|
|
1548
|
+
* @param rowName - The name of the row
|
|
1549
|
+
* @param visibleCol - The visible column index (what the user sees on screen)
|
|
1550
|
+
* @returns The letter at that position, or undefined if it's a gap
|
|
1535
1551
|
*/
|
|
1536
|
-
|
|
1552
|
+
visibleColToRowLetter(rowName: string, visibleCol: number) {
|
|
1537
1553
|
const { rowMap, blanks } = self
|
|
1538
|
-
return rowMap.get(rowName)?.[
|
|
1554
|
+
return rowMap.get(rowName)?.[visibleColToGlobalCol(blanks, visibleCol)]
|
|
1539
1555
|
},
|
|
1540
1556
|
|
|
1541
1557
|
/**
|
|
1542
1558
|
* #method
|
|
1543
|
-
*
|
|
1544
|
-
*
|
|
1559
|
+
* Convert a visible column to a row-specific sequence position (0-based).
|
|
1560
|
+
* Returns undefined if the position is a gap in the sequence.
|
|
1561
|
+
*
|
|
1562
|
+
* @param rowName - The name of the row
|
|
1563
|
+
* @param visibleCol - The visible column index
|
|
1564
|
+
* @returns The sequence position (0-based), or undefined if it's a gap
|
|
1545
1565
|
*/
|
|
1546
|
-
|
|
1547
|
-
return
|
|
1566
|
+
visibleColToSeqPos(rowName: string, visibleCol: number) {
|
|
1567
|
+
return visibleColToSeqPosForRow({
|
|
1548
1568
|
rowName,
|
|
1549
|
-
|
|
1569
|
+
visibleCol,
|
|
1550
1570
|
rowMap: self.rowMap,
|
|
1551
1571
|
blanks: self.blanks,
|
|
1552
1572
|
})
|
|
@@ -1554,32 +1574,67 @@ function stateModelFactory() {
|
|
|
1554
1574
|
|
|
1555
1575
|
/**
|
|
1556
1576
|
* #method
|
|
1557
|
-
*
|
|
1558
|
-
*
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1577
|
+
* Convert a visible column to a row-specific sequence position (1-based).
|
|
1578
|
+
* Returns undefined if the position is a gap in the sequence.
|
|
1579
|
+
*
|
|
1580
|
+
* @param rowName - The name of the row
|
|
1581
|
+
* @param visibleCol - The visible column index
|
|
1582
|
+
* @returns The sequence position (1-based), or undefined if it's a gap
|
|
1583
|
+
*/
|
|
1584
|
+
visibleColToSeqPosOneBased(rowName: string, visibleCol: number) {
|
|
1585
|
+
const val = this.visibleColToSeqPos(rowName, visibleCol)
|
|
1565
1586
|
return val !== undefined ? val + 1 : undefined
|
|
1566
1587
|
},
|
|
1567
1588
|
|
|
1568
1589
|
/**
|
|
1569
1590
|
* #method
|
|
1570
|
-
*
|
|
1571
|
-
*
|
|
1591
|
+
* Convert a global column index to a visible column index.
|
|
1592
|
+
* Returns undefined if the column is hidden (in blanks).
|
|
1593
|
+
* This is the inverse of visibleColToGlobalCol.
|
|
1594
|
+
*
|
|
1595
|
+
* @param globalCol - The global column index in the full MSA
|
|
1596
|
+
* @returns The visible column index, or undefined if the column is hidden
|
|
1597
|
+
*/
|
|
1598
|
+
globalColToVisibleCol(globalCol: number) {
|
|
1599
|
+
const { blanks, hideGapsEffective } = self
|
|
1600
|
+
if (!hideGapsEffective) {
|
|
1601
|
+
return globalCol
|
|
1602
|
+
}
|
|
1603
|
+
return globalColToVisibleCol(blanks, globalCol)
|
|
1604
|
+
},
|
|
1605
|
+
|
|
1606
|
+
/**
|
|
1607
|
+
* #method
|
|
1608
|
+
* Convert a sequence position (ungapped) to a global column index.
|
|
1609
|
+
*
|
|
1610
|
+
* @param rowName - The name of the row
|
|
1611
|
+
* @param seqPos - The sequence position (0-based, ungapped)
|
|
1612
|
+
* @returns The global column index in the full MSA
|
|
1572
1613
|
*/
|
|
1573
|
-
|
|
1614
|
+
seqPosToGlobalCol(rowName: string, seqPos: number) {
|
|
1574
1615
|
const { rowNames, rows } = self
|
|
1575
1616
|
const index = rowNames.indexOf(rowName)
|
|
1576
1617
|
return index !== -1 && rows[index]
|
|
1577
|
-
?
|
|
1618
|
+
? seqPosToGlobalCol({
|
|
1578
1619
|
row: rows[index][1],
|
|
1579
|
-
|
|
1620
|
+
seqPos,
|
|
1580
1621
|
})
|
|
1581
1622
|
: 0
|
|
1582
1623
|
},
|
|
1624
|
+
|
|
1625
|
+
/**
|
|
1626
|
+
* #method
|
|
1627
|
+
* Convert a sequence position (ungapped) directly to a visible column index.
|
|
1628
|
+
* This combines seqPosToGlobalCol and globalColToVisibleCol.
|
|
1629
|
+
*
|
|
1630
|
+
* @param rowName - The name of the row
|
|
1631
|
+
* @param seqPos - The sequence position (0-based, ungapped)
|
|
1632
|
+
* @returns The visible column index, or undefined if the column is hidden
|
|
1633
|
+
*/
|
|
1634
|
+
seqPosToVisibleCol(rowName: string, seqPos: number) {
|
|
1635
|
+
const globalCol = this.seqPosToGlobalCol(rowName, seqPos)
|
|
1636
|
+
return this.globalColToVisibleCol(globalCol)
|
|
1637
|
+
},
|
|
1583
1638
|
}))
|
|
1584
1639
|
|
|
1585
1640
|
.views(self => ({
|
|
@@ -1851,6 +1906,31 @@ function stateModelFactory() {
|
|
|
1851
1906
|
}),
|
|
1852
1907
|
)
|
|
1853
1908
|
|
|
1909
|
+
// autorun opens gffFilehandle for InterProScan domains
|
|
1910
|
+
addDisposer(
|
|
1911
|
+
self,
|
|
1912
|
+
autorun(async () => {
|
|
1913
|
+
const { gffFilehandle } = self
|
|
1914
|
+
if (gffFilehandle) {
|
|
1915
|
+
try {
|
|
1916
|
+
const gffText = await fetchAndMaybeUnzipText(
|
|
1917
|
+
openLocation(gffFilehandle),
|
|
1918
|
+
)
|
|
1919
|
+
const gffRecords = parseGFF(gffText)
|
|
1920
|
+
const interProResults = gffToInterProResults(gffRecords)
|
|
1921
|
+
self.setInterProAnnotations(interProResults)
|
|
1922
|
+
self.setShowDomains(true)
|
|
1923
|
+
if (gffFilehandle.locationType === 'BlobLocation') {
|
|
1924
|
+
self.setGFFFilehandle(undefined)
|
|
1925
|
+
}
|
|
1926
|
+
} catch (e) {
|
|
1927
|
+
console.error(e)
|
|
1928
|
+
self.setError(e)
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
}),
|
|
1932
|
+
)
|
|
1933
|
+
|
|
1854
1934
|
// autorun opens msaFilehandle
|
|
1855
1935
|
addDisposer(
|
|
1856
1936
|
self,
|