@jbrowse/sv-core 2.17.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.
@@ -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 ADDED
@@ -0,0 +1,18 @@
1
+ import type { Track } from './types';
2
+ import type { Assembly } from '@jbrowse/core/assemblyManager/assembly';
3
+ import type { Feature } from '@jbrowse/core/util';
4
+ export declare function getBreakendCoveringRegions({ feature, assembly, }: {
5
+ feature: Feature;
6
+ assembly: Assembly;
7
+ }): {
8
+ pos: number;
9
+ refName: string;
10
+ mateRefName: string;
11
+ matePos: any;
12
+ };
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 ADDED
@@ -0,0 +1,53 @@
1
+ import { parseBreakend } from '@gmod/vcf';
2
+ export function getBreakendCoveringRegions({ feature, assembly, }) {
3
+ var _a;
4
+ const alt = (_a = feature.get('ALT')) === null || _a === void 0 ? void 0 : _a[0];
5
+ const bnd = alt ? parseBreakend(alt) : undefined;
6
+ const startPos = feature.get('start');
7
+ const refName = feature.get('refName');
8
+ const f = (ref) => assembly.getCanonicalRefName(ref) || ref;
9
+ if (alt === '<TRA>') {
10
+ const INFO = feature.get('INFO');
11
+ return {
12
+ pos: startPos,
13
+ refName: f(refName),
14
+ mateRefName: f(INFO.CHR2[0]),
15
+ matePos: INFO.END[0] - 1,
16
+ };
17
+ }
18
+ else if (bnd === null || bnd === void 0 ? void 0 : bnd.MatePosition) {
19
+ const matePosition = bnd.MatePosition.split(':');
20
+ return {
21
+ pos: startPos,
22
+ refName: f(refName),
23
+ mateRefName: f(matePosition[0]),
24
+ matePos: +matePosition[1] - 1,
25
+ };
26
+ }
27
+ else if (feature.get('mate')) {
28
+ const mate = feature.get('mate');
29
+ return {
30
+ pos: startPos,
31
+ refName: f(refName),
32
+ mateRefName: f(mate.refName),
33
+ matePos: mate.start,
34
+ };
35
+ }
36
+ else {
37
+ return {
38
+ pos: startPos,
39
+ refName: f(refName),
40
+ mateRefName: f(refName),
41
+ matePos: feature.get('end'),
42
+ };
43
+ }
44
+ }
45
+ export function stripIds(arr) {
46
+ return arr.map(({ id, displays, ...rest }) => ({
47
+ ...rest,
48
+ displays: displays.map(({ id, ...rest }) => rest),
49
+ }));
50
+ }
51
+ export function makeTitle(f) {
52
+ return `${f.get('name') || f.get('id') || 'breakend'} split detail`;
53
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/sv-core",
3
- "version": "2.17.0",
3
+ "version": "3.0.0",
4
4
  "description": "JBrowse 2 code shared between sv type code",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -41,7 +41,9 @@
41
41
  "useSrc": "node ../../scripts/useSrc.js"
42
42
  },
43
43
  "dependencies": {
44
- "@jbrowse/plugin-linear-genome-view": "^2.17.0",
44
+ "@gmod/vcf": "^6.0.0",
45
+ "@jbrowse/core": "^3.0.0",
46
+ "@jbrowse/plugin-linear-genome-view": "^3.0.0",
45
47
  "@mui/icons-material": "^6.0.0",
46
48
  "@mui/material": "^6.0.0"
47
49
  },
@@ -57,5 +59,5 @@
57
59
  "publishConfig": {
58
60
  "access": "public"
59
61
  },
60
- "gitHead": "eed30b5e671f8f7823652d7cecc51aa89226de46"
62
+ "gitHead": "2c6897f1fa732b1db5b094d1dca197e333e95319"
61
63
  }