@jbrowse/sv-core 2.18.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BreakendMultiLevelOptionDialog.d.ts +1 -2
- package/dist/BreakendMultiLevelOptionDialog.js +30 -132
- package/dist/BreakendSingleLevelOptionDialog.d.ts +1 -2
- package/dist/BreakendSingleLevelOptionDialog.js +38 -62
- package/dist/Checkbox2.d.ts +1 -2
- package/dist/Checkbox2.js +2 -5
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/navToMultiLevelBreak.d.ts +11 -0
- package/dist/navToMultiLevelBreak.js +77 -0
- package/dist/navToSingleLevelBreak.d.ts +61 -0
- package/dist/navToSingleLevelBreak.js +136 -0
- package/dist/types.d.ts +13 -0
- package/dist/types.js +2 -0
- package/dist/util.d.ts +8 -51
- package/dist/util.js +9 -158
- package/esm/BreakendMultiLevelOptionDialog.d.ts +1 -2
- package/esm/BreakendMultiLevelOptionDialog.js +30 -109
- package/esm/BreakendSingleLevelOptionDialog.d.ts +1 -2
- package/esm/BreakendSingleLevelOptionDialog.js +38 -39
- package/esm/Checkbox2.d.ts +1 -2
- package/esm/Checkbox2.js +2 -2
- package/esm/index.d.ts +2 -0
- package/esm/index.js +2 -0
- package/esm/navToMultiLevelBreak.d.ts +11 -0
- package/esm/navToMultiLevelBreak.js +74 -0
- package/esm/navToSingleLevelBreak.d.ts +61 -0
- package/esm/navToSingleLevelBreak.js +131 -0
- package/esm/types.d.ts +13 -0
- package/esm/types.js +1 -0
- package/esm/util.d.ts +8 -51
- package/esm/util.js +7 -155
- package/package.json +4 -4
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { when } from '@jbrowse/core/util';
|
|
2
|
+
import { getBreakendCoveringRegions, makeTitle, stripIds } from './util';
|
|
3
|
+
export async function navToMultiLevelBreak({ stableViewId, feature, assemblyName, session, mirror, tracks: viewTracks = [], }) {
|
|
4
|
+
const { assemblyManager } = session;
|
|
5
|
+
const assembly = await assemblyManager.waitForAssembly(assemblyName);
|
|
6
|
+
if (!assembly) {
|
|
7
|
+
throw new Error(`assembly ${assemblyName} not found`);
|
|
8
|
+
}
|
|
9
|
+
const { refName, pos, mateRefName, matePos } = getBreakendCoveringRegions({
|
|
10
|
+
feature,
|
|
11
|
+
assembly: assembly,
|
|
12
|
+
});
|
|
13
|
+
let view = session.views.find(f => f.id === stableViewId);
|
|
14
|
+
if (!view) {
|
|
15
|
+
view = session.addView('BreakpointSplitView', {
|
|
16
|
+
id: stableViewId,
|
|
17
|
+
type: 'BreakpointSplitView',
|
|
18
|
+
displayName: makeTitle(feature),
|
|
19
|
+
views: [
|
|
20
|
+
{
|
|
21
|
+
type: 'LinearGenomeView',
|
|
22
|
+
hideHeader: true,
|
|
23
|
+
tracks: stripIds(viewTracks),
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
type: 'LinearGenomeView',
|
|
27
|
+
hideHeader: true,
|
|
28
|
+
tracks: stripIds(mirror ? [...viewTracks].reverse() : viewTracks),
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
view.setDisplayName(makeTitle(feature));
|
|
34
|
+
const r1 = assembly.regions.find(r => r.refName === refName);
|
|
35
|
+
const r2 = assembly.regions.find(r => r.refName === mateRefName);
|
|
36
|
+
if (!r1 || !r2) {
|
|
37
|
+
throw new Error("can't find regions");
|
|
38
|
+
}
|
|
39
|
+
await Promise.all([
|
|
40
|
+
view.views[0].navToLocations([
|
|
41
|
+
{
|
|
42
|
+
refName,
|
|
43
|
+
start: r1.start,
|
|
44
|
+
end: pos,
|
|
45
|
+
assemblyName,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
refName,
|
|
49
|
+
start: pos + 1,
|
|
50
|
+
end: r1.end,
|
|
51
|
+
assemblyName,
|
|
52
|
+
},
|
|
53
|
+
]),
|
|
54
|
+
view.views[1].navToLocations([
|
|
55
|
+
{
|
|
56
|
+
refName: mateRefName,
|
|
57
|
+
start: r2.start,
|
|
58
|
+
end: matePos,
|
|
59
|
+
assemblyName,
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
refName: mateRefName,
|
|
63
|
+
start: matePos + 1,
|
|
64
|
+
end: r2.end,
|
|
65
|
+
assemblyName,
|
|
66
|
+
},
|
|
67
|
+
]),
|
|
68
|
+
]);
|
|
69
|
+
await when(() => view.views[1].initialized && view.views[0].initialized);
|
|
70
|
+
view.views[1].zoomTo(10);
|
|
71
|
+
view.views[0].zoomTo(10);
|
|
72
|
+
view.views[1].centerAt(matePos, mateRefName);
|
|
73
|
+
view.views[0].centerAt(pos, refName);
|
|
74
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { AbstractSessionModel, Feature } from '@jbrowse/core/util';
|
|
2
|
+
export declare function singleLevelFocusedSnapshotFromBreakendFeature({ feature, session, assemblyName, windowSize, }: {
|
|
3
|
+
feature: Feature;
|
|
4
|
+
session: AbstractSessionModel;
|
|
5
|
+
assemblyName: string;
|
|
6
|
+
windowSize?: number;
|
|
7
|
+
}): {
|
|
8
|
+
coverage: {
|
|
9
|
+
pos: number;
|
|
10
|
+
refName: string;
|
|
11
|
+
mateRefName: string;
|
|
12
|
+
matePos: any;
|
|
13
|
+
};
|
|
14
|
+
snap: {
|
|
15
|
+
type: string;
|
|
16
|
+
views: {
|
|
17
|
+
type: string;
|
|
18
|
+
displayedRegions: {
|
|
19
|
+
end: number;
|
|
20
|
+
assemblyName: string;
|
|
21
|
+
start: number;
|
|
22
|
+
refName: string;
|
|
23
|
+
}[];
|
|
24
|
+
}[];
|
|
25
|
+
displayName: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
export declare function singleLevelEncompassingSnapshotFromBreakendFeature({ feature, session, assemblyName, }: {
|
|
29
|
+
feature: Feature;
|
|
30
|
+
session: AbstractSessionModel;
|
|
31
|
+
assemblyName: string;
|
|
32
|
+
}): {
|
|
33
|
+
coverage: {
|
|
34
|
+
pos: number;
|
|
35
|
+
refName: string;
|
|
36
|
+
mateRefName: string;
|
|
37
|
+
matePos: any;
|
|
38
|
+
};
|
|
39
|
+
snap: {
|
|
40
|
+
type: string;
|
|
41
|
+
views: {
|
|
42
|
+
type: string;
|
|
43
|
+
displayedRegions: {
|
|
44
|
+
assemblyName: string;
|
|
45
|
+
start: number;
|
|
46
|
+
end: number;
|
|
47
|
+
refName: string;
|
|
48
|
+
}[];
|
|
49
|
+
}[];
|
|
50
|
+
displayName: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export declare function navToSingleLevelBreak({ stableViewId, feature, assemblyName, session, tracks, windowSize, focusOnBreakends, }: {
|
|
54
|
+
stableViewId?: string;
|
|
55
|
+
feature: Feature;
|
|
56
|
+
assemblyName: string;
|
|
57
|
+
windowSize?: number;
|
|
58
|
+
session: AbstractSessionModel;
|
|
59
|
+
tracks?: any;
|
|
60
|
+
focusOnBreakends?: boolean;
|
|
61
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { gatherOverlaps, getSession, when } from '@jbrowse/core/util';
|
|
2
|
+
import { getSnapshot } from 'mobx-state-tree';
|
|
3
|
+
import { getBreakendCoveringRegions, makeTitle, stripIds } from './util';
|
|
4
|
+
export function singleLevelFocusedSnapshotFromBreakendFeature({ feature, session, assemblyName, windowSize = 0, }) {
|
|
5
|
+
const { assemblyManager } = session;
|
|
6
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
7
|
+
if (!assembly) {
|
|
8
|
+
throw new Error(`assembly ${assemblyName} not found`);
|
|
9
|
+
}
|
|
10
|
+
if (!assembly.regions) {
|
|
11
|
+
throw new Error(`assembly ${assemblyName} regions not loaded`);
|
|
12
|
+
}
|
|
13
|
+
const coverage = getBreakendCoveringRegions({
|
|
14
|
+
feature,
|
|
15
|
+
assembly,
|
|
16
|
+
});
|
|
17
|
+
const { refName, mateRefName } = coverage;
|
|
18
|
+
const topRegion = assembly.regions.find(f => f.refName === refName);
|
|
19
|
+
const bottomRegion = assembly.regions.find(f => f.refName === mateRefName);
|
|
20
|
+
return {
|
|
21
|
+
coverage,
|
|
22
|
+
snap: {
|
|
23
|
+
type: 'BreakpointSplitView',
|
|
24
|
+
views: [
|
|
25
|
+
{
|
|
26
|
+
type: 'LinearGenomeView',
|
|
27
|
+
displayedRegions: gatherOverlaps([
|
|
28
|
+
{
|
|
29
|
+
...topRegion,
|
|
30
|
+
end: coverage.pos + windowSize,
|
|
31
|
+
assemblyName,
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
...bottomRegion,
|
|
35
|
+
start: coverage.matePos - windowSize,
|
|
36
|
+
assemblyName,
|
|
37
|
+
},
|
|
38
|
+
]),
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
displayName: makeTitle(feature),
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function singleLevelEncompassingSnapshotFromBreakendFeature({ feature, session, assemblyName, }) {
|
|
46
|
+
const { assemblyManager } = session;
|
|
47
|
+
const assembly = assemblyManager.get(assemblyName);
|
|
48
|
+
if (!assembly) {
|
|
49
|
+
throw new Error(`assembly ${assemblyName} not found`);
|
|
50
|
+
}
|
|
51
|
+
if (!assembly.regions) {
|
|
52
|
+
throw new Error(`assembly ${assemblyName} regions not loaded`);
|
|
53
|
+
}
|
|
54
|
+
const coverage = getBreakendCoveringRegions({
|
|
55
|
+
feature,
|
|
56
|
+
assembly,
|
|
57
|
+
});
|
|
58
|
+
const { refName, mateRefName } = coverage;
|
|
59
|
+
const topRegion = assembly.regions.find(f => f.refName === refName);
|
|
60
|
+
const bottomRegion = assembly.regions.find(f => f.refName === mateRefName);
|
|
61
|
+
return {
|
|
62
|
+
coverage,
|
|
63
|
+
snap: {
|
|
64
|
+
type: 'BreakpointSplitView',
|
|
65
|
+
views: [
|
|
66
|
+
{
|
|
67
|
+
type: 'LinearGenomeView',
|
|
68
|
+
displayedRegions: gatherOverlaps([
|
|
69
|
+
{ ...topRegion, assemblyName },
|
|
70
|
+
{ ...bottomRegion, assemblyName },
|
|
71
|
+
]),
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
displayName: makeTitle(feature),
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export async function navToSingleLevelBreak({ stableViewId, feature, assemblyName, session, tracks, windowSize = 0, focusOnBreakends, }) {
|
|
79
|
+
var _a;
|
|
80
|
+
const { snap, coverage } = focusOnBreakends
|
|
81
|
+
? singleLevelFocusedSnapshotFromBreakendFeature({
|
|
82
|
+
feature,
|
|
83
|
+
assemblyName,
|
|
84
|
+
session,
|
|
85
|
+
windowSize,
|
|
86
|
+
})
|
|
87
|
+
: singleLevelEncompassingSnapshotFromBreakendFeature({
|
|
88
|
+
feature,
|
|
89
|
+
assemblyName,
|
|
90
|
+
session,
|
|
91
|
+
});
|
|
92
|
+
const { refName, pos: startPos, mateRefName, matePos: endPos } = coverage;
|
|
93
|
+
let view = session.views.find(f => f.id === stableViewId);
|
|
94
|
+
if (!view) {
|
|
95
|
+
view = session.addView('BreakpointSplitView', {
|
|
96
|
+
...snap,
|
|
97
|
+
views: [
|
|
98
|
+
{
|
|
99
|
+
...snap.views[0],
|
|
100
|
+
tracks: tracks ? stripIds(getSnapshot(tracks)) : [],
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
(_a = view.views[0]) === null || _a === void 0 ? void 0 : _a.setDisplayedRegions(snap.views[0].displayedRegions);
|
|
107
|
+
view.setDisplayName(snap.displayName);
|
|
108
|
+
}
|
|
109
|
+
const lgv = view.views[0];
|
|
110
|
+
await when(() => lgv.initialized);
|
|
111
|
+
const l0 = lgv.bpToPx({
|
|
112
|
+
coord: Math.max(0, startPos - windowSize),
|
|
113
|
+
refName,
|
|
114
|
+
});
|
|
115
|
+
const r0 = lgv.bpToPx({
|
|
116
|
+
coord: endPos + windowSize,
|
|
117
|
+
refName: mateRefName,
|
|
118
|
+
});
|
|
119
|
+
if (l0 && r0) {
|
|
120
|
+
lgv.moveTo({
|
|
121
|
+
...l0,
|
|
122
|
+
offset: l0.offsetPx,
|
|
123
|
+
}, {
|
|
124
|
+
...r0,
|
|
125
|
+
offset: r0.offsetPx,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
getSession(lgv).notify('Unable to navigate to breakpoint');
|
|
130
|
+
}
|
|
131
|
+
}
|
package/esm/types.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view';
|
|
2
|
+
export interface Display {
|
|
3
|
+
id: string;
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
}
|
|
6
|
+
export interface Track {
|
|
7
|
+
id: string;
|
|
8
|
+
displays: Display[];
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface BreakpointSplitView {
|
|
12
|
+
views: LinearGenomeViewModel[];
|
|
13
|
+
}
|
package/esm/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/esm/util.d.ts
CHANGED
|
@@ -1,14 +1,6 @@
|
|
|
1
|
+
import type { Track } from './types';
|
|
1
2
|
import type { Assembly } from '@jbrowse/core/assemblyManager/assembly';
|
|
2
|
-
import type {
|
|
3
|
-
export interface Display {
|
|
4
|
-
id: string;
|
|
5
|
-
[key: string]: unknown;
|
|
6
|
-
}
|
|
7
|
-
export interface Track {
|
|
8
|
-
id: string;
|
|
9
|
-
displays: Display[];
|
|
10
|
-
[key: string]: unknown;
|
|
11
|
-
}
|
|
3
|
+
import type { Feature } from '@jbrowse/core/util';
|
|
12
4
|
export declare function getBreakendCoveringRegions({ feature, assembly, }: {
|
|
13
5
|
feature: Feature;
|
|
14
6
|
assembly: Assembly;
|
|
@@ -18,44 +10,9 @@ export declare function getBreakendCoveringRegions({ feature, assembly, }: {
|
|
|
18
10
|
mateRefName: string;
|
|
19
11
|
matePos: any;
|
|
20
12
|
};
|
|
21
|
-
export declare function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
pos: number;
|
|
28
|
-
refName: string;
|
|
29
|
-
mateRefName: string;
|
|
30
|
-
matePos: any;
|
|
31
|
-
};
|
|
32
|
-
snap: {
|
|
33
|
-
type: string;
|
|
34
|
-
views: {
|
|
35
|
-
type: string;
|
|
36
|
-
displayedRegions: {
|
|
37
|
-
assemblyName: string;
|
|
38
|
-
start: number;
|
|
39
|
-
end: number;
|
|
40
|
-
refName: string;
|
|
41
|
-
}[];
|
|
42
|
-
}[];
|
|
43
|
-
displayName: string;
|
|
44
|
-
};
|
|
45
|
-
};
|
|
46
|
-
export declare function navToSingleLevelBreak({ stableViewId, feature, assemblyName, session, tracks, windowSize, }: {
|
|
47
|
-
stableViewId?: string;
|
|
48
|
-
feature: Feature;
|
|
49
|
-
assemblyName: string;
|
|
50
|
-
windowSize?: number;
|
|
51
|
-
session: AbstractSessionModel;
|
|
52
|
-
tracks?: any;
|
|
53
|
-
}): Promise<void>;
|
|
54
|
-
export declare function navToMultiLevelBreak({ stableViewId, feature, assemblyName, session, tracks, }: {
|
|
55
|
-
stableViewId?: string;
|
|
56
|
-
feature: Feature;
|
|
57
|
-
assemblyName: string;
|
|
58
|
-
windowSize?: number;
|
|
59
|
-
session: AbstractSessionModel;
|
|
60
|
-
tracks?: any;
|
|
61
|
-
}): Promise<void>;
|
|
13
|
+
export declare function stripIds(arr: Track[]): {
|
|
14
|
+
displays: {
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}[];
|
|
17
|
+
}[];
|
|
18
|
+
export declare function makeTitle(f: Feature): string;
|
package/esm/util.js
CHANGED
|
@@ -1,13 +1,4 @@
|
|
|
1
1
|
import { parseBreakend } from '@gmod/vcf';
|
|
2
|
-
import { gatherOverlaps, getSession, when } from '@jbrowse/core/util';
|
|
3
|
-
import { transaction } from 'mobx';
|
|
4
|
-
import { getSnapshot } from 'mobx-state-tree';
|
|
5
|
-
function stripIds(arr) {
|
|
6
|
-
return arr.map(({ id, displays, ...rest }) => ({
|
|
7
|
-
...rest,
|
|
8
|
-
displays: displays.map(({ id, ...rest }) => rest),
|
|
9
|
-
}));
|
|
10
|
-
}
|
|
11
2
|
export function getBreakendCoveringRegions({ feature, assembly, }) {
|
|
12
3
|
var _a;
|
|
13
4
|
const alt = (_a = feature.get('ALT')) === null || _a === void 0 ? void 0 : _a[0];
|
|
@@ -51,151 +42,12 @@ export function getBreakendCoveringRegions({ feature, assembly, }) {
|
|
|
51
42
|
};
|
|
52
43
|
}
|
|
53
44
|
}
|
|
54
|
-
export function
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
if (!assembly.regions) {
|
|
61
|
-
throw new Error(`assembly ${assemblyName} regions not loaded`);
|
|
62
|
-
}
|
|
63
|
-
const coverage = getBreakendCoveringRegions({
|
|
64
|
-
feature,
|
|
65
|
-
assembly,
|
|
66
|
-
});
|
|
67
|
-
const { refName, mateRefName } = coverage;
|
|
68
|
-
const topRegion = assembly.regions.find(f => f.refName === refName);
|
|
69
|
-
const bottomRegion = assembly.regions.find(f => f.refName === mateRefName);
|
|
70
|
-
return {
|
|
71
|
-
coverage,
|
|
72
|
-
snap: {
|
|
73
|
-
type: 'BreakpointSplitView',
|
|
74
|
-
views: [
|
|
75
|
-
{
|
|
76
|
-
type: 'LinearGenomeView',
|
|
77
|
-
displayedRegions: gatherOverlaps([
|
|
78
|
-
{ ...topRegion, assemblyName },
|
|
79
|
-
{ ...bottomRegion, assemblyName },
|
|
80
|
-
]),
|
|
81
|
-
},
|
|
82
|
-
],
|
|
83
|
-
displayName: `${feature.get('name') || feature.get('id') || 'breakend'} split detail`,
|
|
84
|
-
},
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
export async function navToSingleLevelBreak({ stableViewId, feature, assemblyName, session, tracks, windowSize = 0, }) {
|
|
88
|
-
var _a;
|
|
89
|
-
const { snap, coverage } = singleLevelSnapshotFromBreakendFeature({
|
|
90
|
-
feature,
|
|
91
|
-
assemblyName,
|
|
92
|
-
session,
|
|
93
|
-
});
|
|
94
|
-
const { refName, pos: startPos, mateRefName, matePos: endPos } = coverage;
|
|
95
|
-
let viewInStack = session.views.find(f => f.id === stableViewId);
|
|
96
|
-
if (!viewInStack) {
|
|
97
|
-
viewInStack = session.addView('BreakpointSplitView', {
|
|
98
|
-
...snap,
|
|
99
|
-
views: [
|
|
100
|
-
{
|
|
101
|
-
...snap.views[0],
|
|
102
|
-
tracks: tracks ? stripIds(getSnapshot(tracks)) : [],
|
|
103
|
-
},
|
|
104
|
-
],
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
(_a = viewInStack.views[0]) === null || _a === void 0 ? void 0 : _a.setDisplayedRegions(snap.views[0].displayedRegions);
|
|
109
|
-
viewInStack.setDisplayName(snap.displayName);
|
|
110
|
-
}
|
|
111
|
-
const lgv = viewInStack.views[0];
|
|
112
|
-
await when(() => lgv.initialized);
|
|
113
|
-
const l0 = lgv.bpToPx({
|
|
114
|
-
coord: Math.max(0, startPos - windowSize),
|
|
115
|
-
refName,
|
|
116
|
-
});
|
|
117
|
-
const r0 = lgv.bpToPx({
|
|
118
|
-
coord: endPos + windowSize,
|
|
119
|
-
refName: mateRefName,
|
|
120
|
-
});
|
|
121
|
-
if (l0 && r0) {
|
|
122
|
-
lgv.moveTo({ ...l0, offset: l0.offsetPx }, { ...r0, offset: r0.offsetPx });
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
getSession(lgv).notify('Unable to navigate to breakpoint');
|
|
126
|
-
}
|
|
45
|
+
export function stripIds(arr) {
|
|
46
|
+
return arr.map(({ id, displays, ...rest }) => ({
|
|
47
|
+
...rest,
|
|
48
|
+
displays: displays.map(({ id, ...rest }) => rest),
|
|
49
|
+
}));
|
|
127
50
|
}
|
|
128
|
-
export
|
|
129
|
-
|
|
130
|
-
const { assemblyManager } = session;
|
|
131
|
-
const assembly = assemblyManager.get(assemblyName);
|
|
132
|
-
if (!assembly) {
|
|
133
|
-
throw new Error(`assembly ${assemblyName} not found`);
|
|
134
|
-
}
|
|
135
|
-
if (!assembly.regions) {
|
|
136
|
-
throw new Error(`assembly ${assemblyName} regions not loaded`);
|
|
137
|
-
}
|
|
138
|
-
const { refName, pos: startPos, mateRefName, matePos: endPos, } = getBreakendCoveringRegions({
|
|
139
|
-
feature,
|
|
140
|
-
assembly,
|
|
141
|
-
});
|
|
142
|
-
const topRegion = assembly.regions.find(f => f.refName === refName);
|
|
143
|
-
const bottomRegion = assembly.regions.find(f => f.refName === mateRefName);
|
|
144
|
-
const topMarkedRegion = [{ ...topRegion }, { ...topRegion }];
|
|
145
|
-
const bottomMarkedRegion = [{ ...bottomRegion }, { ...bottomRegion }];
|
|
146
|
-
topMarkedRegion[0].end = startPos;
|
|
147
|
-
topMarkedRegion[1].start = startPos;
|
|
148
|
-
bottomMarkedRegion[0].end = endPos;
|
|
149
|
-
bottomMarkedRegion[1].start = endPos;
|
|
150
|
-
const snap = {
|
|
151
|
-
type: 'BreakpointSplitView',
|
|
152
|
-
views: [
|
|
153
|
-
{
|
|
154
|
-
type: 'LinearGenomeView',
|
|
155
|
-
displayedRegions: topMarkedRegion,
|
|
156
|
-
hideHeader: true,
|
|
157
|
-
bpPerPx,
|
|
158
|
-
offsetPx: (topRegion.start + feature.get('start')) / bpPerPx,
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
type: 'LinearGenomeView',
|
|
162
|
-
displayedRegions: bottomMarkedRegion,
|
|
163
|
-
hideHeader: true,
|
|
164
|
-
bpPerPx,
|
|
165
|
-
tracks,
|
|
166
|
-
offsetPx: (bottomRegion.start + endPos) / bpPerPx,
|
|
167
|
-
},
|
|
168
|
-
],
|
|
169
|
-
displayName: `${feature.get('name') || feature.get('id') || 'breakend'} split detail`,
|
|
170
|
-
};
|
|
171
|
-
let viewInStack = session.views.find(f => f.id === stableViewId);
|
|
172
|
-
if (!viewInStack) {
|
|
173
|
-
viewInStack = session.addView('BreakpointSplitView', {
|
|
174
|
-
...snap,
|
|
175
|
-
id: stableViewId,
|
|
176
|
-
views: [
|
|
177
|
-
{
|
|
178
|
-
...snap.views[0],
|
|
179
|
-
tracks: tracks ? stripIds(getSnapshot(tracks)) : [],
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
...snap.views[1],
|
|
183
|
-
tracks: (tracks ? stripIds(getSnapshot(tracks)) : []).reverse(),
|
|
184
|
-
},
|
|
185
|
-
],
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
transaction(() => {
|
|
190
|
-
for (let i = 0; i < viewInStack.views.length; i++) {
|
|
191
|
-
const s = snap.views[i];
|
|
192
|
-
if (s) {
|
|
193
|
-
viewInStack.views[i].setDisplayedRegions(s.displayedRegions);
|
|
194
|
-
viewInStack.views[i].scrollTo(s.offsetPx - 800);
|
|
195
|
-
viewInStack.views[i].zoomTo(s.bpPerPx);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
viewInStack.setDisplayName(snap.displayName);
|
|
199
|
-
});
|
|
200
|
-
}
|
|
51
|
+
export function makeTitle(f) {
|
|
52
|
+
return `${f.get('name') || f.get('id') || 'breakend'} split detail`;
|
|
201
53
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/sv-core",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "JBrowse 2 code shared between sv type code",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -42,8 +42,8 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@gmod/vcf": "^6.0.0",
|
|
45
|
-
"@jbrowse/core": "^
|
|
46
|
-
"@jbrowse/plugin-linear-genome-view": "^
|
|
45
|
+
"@jbrowse/core": "^3.0.0",
|
|
46
|
+
"@jbrowse/plugin-linear-genome-view": "^3.0.0",
|
|
47
47
|
"@mui/icons-material": "^6.0.0",
|
|
48
48
|
"@mui/material": "^6.0.0"
|
|
49
49
|
},
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|
|
61
61
|
},
|
|
62
|
-
"gitHead": "
|
|
62
|
+
"gitHead": "2c6897f1fa732b1db5b094d1dca197e333e95319"
|
|
63
63
|
}
|