@jbrowse/plugin-variants 1.7.9 → 2.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/ChordVariantDisplay/index.d.ts +2 -1
- package/dist/ChordVariantDisplay/index.js +19 -31
- package/dist/ChordVariantDisplay/index.js.map +1 -0
- package/dist/ChordVariantDisplay/models/ChordVariantDisplay.d.ts +94 -2
- package/dist/ChordVariantDisplay/models/ChordVariantDisplay.js +39 -71
- package/dist/ChordVariantDisplay/models/ChordVariantDisplay.js.map +1 -0
- package/dist/LinearVariantDisplay/configSchema.js +9 -16
- package/dist/LinearVariantDisplay/configSchema.js.map +1 -0
- package/dist/LinearVariantDisplay/index.js +10 -22
- package/dist/LinearVariantDisplay/index.js.map +1 -0
- package/dist/LinearVariantDisplay/model.d.ts +18 -13
- package/dist/LinearVariantDisplay/model.js +83 -73
- package/dist/LinearVariantDisplay/model.js.map +1 -0
- package/dist/StructuralVariantChordRenderer/ReactComponent.js +193 -214
- package/dist/StructuralVariantChordRenderer/ReactComponent.js.map +1 -0
- package/dist/StructuralVariantChordRenderer/index.js +36 -46
- package/dist/StructuralVariantChordRenderer/index.js.map +1 -0
- package/dist/VariantFeatureWidget/BreakendOptionDialog.d.ts +1 -1
- package/dist/VariantFeatureWidget/BreakendOptionDialog.js +95 -119
- package/dist/VariantFeatureWidget/BreakendOptionDialog.js.map +1 -0
- package/dist/VariantFeatureWidget/VariantFeatureWidget.js +193 -240
- package/dist/VariantFeatureWidget/VariantFeatureWidget.js.map +1 -0
- package/dist/VariantFeatureWidget/index.d.ts +32 -6
- package/dist/VariantFeatureWidget/index.js +14 -33
- package/dist/VariantFeatureWidget/index.js.map +1 -0
- package/dist/VcfAdapter/VcfAdapter.js +232 -372
- package/dist/VcfAdapter/VcfAdapter.js.map +1 -0
- package/dist/VcfAdapter/configSchema.js +9 -21
- package/dist/VcfAdapter/configSchema.js.map +1 -0
- package/dist/VcfAdapter/index.js +8 -14
- package/dist/VcfAdapter/index.js.map +1 -0
- package/dist/VcfTabixAdapter/VcfFeature.js +203 -246
- package/dist/VcfTabixAdapter/VcfFeature.js.map +1 -0
- package/dist/VcfTabixAdapter/VcfTabixAdapter.js +237 -374
- package/dist/VcfTabixAdapter/VcfTabixAdapter.js.map +1 -0
- package/dist/VcfTabixAdapter/configSchema.js +23 -36
- package/dist/VcfTabixAdapter/configSchema.js.map +1 -0
- package/dist/VcfTabixAdapter/index.js +8 -14
- package/dist/VcfTabixAdapter/index.js.map +1 -0
- package/dist/index.js +160 -203
- package/dist/index.js.map +1 -0
- package/esm/ChordVariantDisplay/index.d.ts +4 -0
- package/esm/ChordVariantDisplay/index.js +16 -0
- package/esm/ChordVariantDisplay/index.js.map +1 -0
- package/esm/ChordVariantDisplay/models/ChordVariantDisplay.d.ts +97 -0
- package/esm/ChordVariantDisplay/models/ChordVariantDisplay.js +40 -0
- package/esm/ChordVariantDisplay/models/ChordVariantDisplay.js.map +1 -0
- package/esm/LinearVariantDisplay/configSchema.d.ts +5 -0
- package/esm/LinearVariantDisplay/configSchema.js +7 -0
- package/esm/LinearVariantDisplay/configSchema.js.map +1 -0
- package/esm/LinearVariantDisplay/index.d.ts +2 -0
- package/esm/LinearVariantDisplay/index.js +3 -0
- package/esm/LinearVariantDisplay/index.js.map +1 -0
- package/esm/LinearVariantDisplay/model.d.ts +212 -0
- package/esm/LinearVariantDisplay/model.js +34 -0
- package/esm/LinearVariantDisplay/model.js.map +1 -0
- package/esm/StructuralVariantChordRenderer/ReactComponent.d.ts +24 -0
- package/esm/StructuralVariantChordRenderer/ReactComponent.js +133 -0
- package/esm/StructuralVariantChordRenderer/ReactComponent.js.map +1 -0
- package/esm/StructuralVariantChordRenderer/index.d.ts +3 -0
- package/esm/StructuralVariantChordRenderer/index.js +33 -0
- package/esm/StructuralVariantChordRenderer/index.js.map +1 -0
- package/esm/VariantFeatureWidget/BreakendOptionDialog.d.ts +10 -0
- package/esm/VariantFeatureWidget/BreakendOptionDialog.js +58 -0
- package/esm/VariantFeatureWidget/BreakendOptionDialog.js.map +1 -0
- package/esm/VariantFeatureWidget/VariantFeatureWidget.d.ts +4 -0
- package/esm/VariantFeatureWidget/VariantFeatureWidget.js +129 -0
- package/esm/VariantFeatureWidget/VariantFeatureWidget.js.map +1 -0
- package/esm/VariantFeatureWidget/index.d.ts +37 -0
- package/esm/VariantFeatureWidget/index.js +12 -0
- package/esm/VariantFeatureWidget/index.js.map +1 -0
- package/esm/VcfAdapter/VcfAdapter.d.ts +24 -0
- package/esm/VcfAdapter/VcfAdapter.js +99 -0
- package/esm/VcfAdapter/VcfAdapter.js.map +1 -0
- package/esm/VcfAdapter/configSchema.d.ts +2 -0
- package/esm/VcfAdapter/configSchema.js +8 -0
- package/esm/VcfAdapter/configSchema.js.map +1 -0
- package/esm/VcfAdapter/index.d.ts +1 -0
- package/esm/VcfAdapter/index.js +2 -0
- package/esm/VcfAdapter/index.js.map +1 -0
- package/esm/VcfTabixAdapter/VcfFeature.d.ts +59 -0
- package/esm/VcfTabixAdapter/VcfFeature.js +184 -0
- package/esm/VcfTabixAdapter/VcfFeature.js.map +1 -0
- package/esm/VcfTabixAdapter/VcfTabixAdapter.d.ts +35 -0
- package/esm/VcfTabixAdapter/VcfTabixAdapter.js +112 -0
- package/esm/VcfTabixAdapter/VcfTabixAdapter.js.map +1 -0
- package/esm/VcfTabixAdapter/configSchema.d.ts +2 -0
- package/esm/VcfTabixAdapter/configSchema.js +23 -0
- package/esm/VcfTabixAdapter/configSchema.js.map +1 -0
- package/esm/VcfTabixAdapter/index.d.ts +1 -0
- package/esm/VcfTabixAdapter/index.js +2 -0
- package/esm/VcfTabixAdapter/index.js.map +1 -0
- package/esm/index.d.ts +7 -0
- package/esm/index.js +110 -0
- package/esm/index.js.map +1 -0
- package/package.json +20 -11
- package/src/ChordVariantDisplay/index.ts +4 -4
- package/src/ChordVariantDisplay/models/ChordVariantDisplay.js +7 -8
- package/src/VariantFeatureWidget/BreakendOptionDialog.tsx +8 -9
- package/src/VariantFeatureWidget/VariantFeatureWidget.tsx +2 -3
- package/src/VariantFeatureWidget/__snapshots__/VariantFeatureWidget.test.js.snap +52 -57
- package/src/VariantFeatureWidget/index.ts +17 -0
- package/dist/LinearVariantDisplay/configSchema.test.js +0 -92
- package/dist/VariantFeatureWidget/VariantFeatureWidget.test.js +0 -56
- package/dist/VcfAdapter/VcfAdapter.test.js +0 -55
- package/dist/VcfTabixAdapter/VcfFeature.test.js +0 -106
- package/dist/VcfTabixAdapter/VcfTabixAdapter.test.js +0 -99
- package/dist/index.test.js +0 -37
- package/src/VariantFeatureWidget/index.js +0 -26
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { Divider, Link, Paper, FormControlLabel, Checkbox, TextField, Typography, } from '@mui/material';
|
|
4
|
+
import SimpleFeature from '@jbrowse/core/util/simpleFeature';
|
|
5
|
+
import { DataGrid } from '@mui/x-data-grid';
|
|
6
|
+
import { observer } from 'mobx-react';
|
|
7
|
+
import { getSession } from '@jbrowse/core/util';
|
|
8
|
+
import { getEnv } from 'mobx-state-tree';
|
|
9
|
+
import { FeatureDetails, BaseCard, } from '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail';
|
|
10
|
+
import BreakendOptionDialog from './BreakendOptionDialog';
|
|
11
|
+
import { parseBreakend } from '@gmod/vcf';
|
|
12
|
+
function VariantSamples(props) {
|
|
13
|
+
const [filter, setFilter] = useState({});
|
|
14
|
+
const [showFilters, setShowFilters] = useState(false);
|
|
15
|
+
const { feature } = props;
|
|
16
|
+
const { samples = {} } = feature;
|
|
17
|
+
const preFilteredRows = Object.entries(samples);
|
|
18
|
+
if (!preFilteredRows.length) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const infoFields = ['sample', ...Object.keys(preFilteredRows[0][1])].map(field => ({
|
|
22
|
+
field,
|
|
23
|
+
}));
|
|
24
|
+
let error;
|
|
25
|
+
let rows = [];
|
|
26
|
+
const filters = Object.keys(filter);
|
|
27
|
+
// catch some error thrown from regex
|
|
28
|
+
// note: maps all values into a string, if this is not done rows are not
|
|
29
|
+
// sortable by the data-grid
|
|
30
|
+
try {
|
|
31
|
+
rows = preFilteredRows
|
|
32
|
+
.map((row) => ({
|
|
33
|
+
...Object.fromEntries(Object.entries(row[1]).map(entry => [entry[0], String(entry[1])])),
|
|
34
|
+
sample: row[0],
|
|
35
|
+
id: row[0],
|
|
36
|
+
}))
|
|
37
|
+
.filter((row) => {
|
|
38
|
+
return filters.length
|
|
39
|
+
? filters.every(key => {
|
|
40
|
+
const val = row[key];
|
|
41
|
+
const currFilter = filter[key];
|
|
42
|
+
return currFilter ? val.match(new RegExp(currFilter, 'i')) : true;
|
|
43
|
+
})
|
|
44
|
+
: true;
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
error = e;
|
|
49
|
+
}
|
|
50
|
+
// disableSelectionOnClick helps avoid
|
|
51
|
+
// https://github.com/mui-org/material-ui-x/issues/1197
|
|
52
|
+
return (React.createElement(BaseCard, { ...props, title: "Samples" },
|
|
53
|
+
error ? React.createElement(Typography, { color: "error" }, `${error}`) : null,
|
|
54
|
+
React.createElement(FormControlLabel, { control: React.createElement(Checkbox, { checked: showFilters, onChange: () => setShowFilters(f => !f) }), label: "Show sample filters" }),
|
|
55
|
+
showFilters ? (React.createElement(React.Fragment, null,
|
|
56
|
+
React.createElement(Typography, null, "These filters can use a plain text search or regex style query, e.g. in the genotype field, entering 1 will query for all genotypes that include the first alternate allele e.g. 0|1 or 1|1, entering [1-9]\\d* will find any non-zero allele e.g. 0|2 or 2/33"),
|
|
57
|
+
infoFields.map(({ field }) => {
|
|
58
|
+
return (React.createElement(TextField, { key: `filter-${field}`, placeholder: `Filter ${field}`, value: filter[field] || '', onChange: event => setFilter({ ...filter, [field]: event.target.value }) }));
|
|
59
|
+
}))) : null,
|
|
60
|
+
React.createElement("div", { style: { height: 600, width: '100%', overflow: 'auto' } },
|
|
61
|
+
React.createElement(DataGrid, { rows: rows, columns: infoFields, disableSelectionOnClick: true, rowHeight: 25, disableColumnMenu: true }))));
|
|
62
|
+
}
|
|
63
|
+
function BreakendPanel(props) {
|
|
64
|
+
const { model, locStrings, feature } = props;
|
|
65
|
+
const session = getSession(model);
|
|
66
|
+
const { pluginManager } = getEnv(session);
|
|
67
|
+
const [breakpointDialog, setBreakpointDialog] = useState(false);
|
|
68
|
+
let viewType;
|
|
69
|
+
try {
|
|
70
|
+
viewType = pluginManager.getViewType('BreakpointSplitView');
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
// ignore
|
|
74
|
+
}
|
|
75
|
+
const simpleFeature = new SimpleFeature(feature);
|
|
76
|
+
return (React.createElement(BaseCard, { ...props, title: "Breakends" },
|
|
77
|
+
React.createElement(Typography, null, "Link to linear view of breakend endpoints"),
|
|
78
|
+
React.createElement("ul", null, locStrings.map(locString => (React.createElement("li", { key: `${JSON.stringify(locString)}` },
|
|
79
|
+
React.createElement(Link, { href: "#", onClick: event => {
|
|
80
|
+
var _a;
|
|
81
|
+
event.preventDefault();
|
|
82
|
+
const { view } = model;
|
|
83
|
+
try {
|
|
84
|
+
if (view) {
|
|
85
|
+
(_a = view.navToLocString) === null || _a === void 0 ? void 0 : _a.call(view, locString);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
throw new Error('No view associated with this feature detail panel anymore');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
console.error(e);
|
|
93
|
+
session.notify(`${e}`);
|
|
94
|
+
}
|
|
95
|
+
} }, `LGV - ${locString}`))))),
|
|
96
|
+
viewType ? (React.createElement("div", null,
|
|
97
|
+
React.createElement(Typography, null, "Launch split views with breakend source and target"),
|
|
98
|
+
React.createElement("ul", null, locStrings.map(locString => (React.createElement("li", { key: `${JSON.stringify(locString)}` },
|
|
99
|
+
React.createElement(Link, { href: "#", onClick: event => {
|
|
100
|
+
event.preventDefault();
|
|
101
|
+
setBreakpointDialog(true);
|
|
102
|
+
} }, `${feature.refName}:${feature.start} // ${locString} (split view)`))))),
|
|
103
|
+
breakpointDialog ? (React.createElement(BreakendOptionDialog, { model: model, feature: simpleFeature, viewType: viewType, handleClose: () => {
|
|
104
|
+
setBreakpointDialog(false);
|
|
105
|
+
} })) : null)) : null));
|
|
106
|
+
}
|
|
107
|
+
function VariantFeatureDetails(props) {
|
|
108
|
+
const { model } = props;
|
|
109
|
+
const { featureData, descriptions } = model;
|
|
110
|
+
const feat = JSON.parse(JSON.stringify(featureData));
|
|
111
|
+
const { samples, ...rest } = feat;
|
|
112
|
+
const basicDescriptions = {
|
|
113
|
+
CHROM: 'chromosome: An identifier from the reference genome',
|
|
114
|
+
POS: 'position: The reference position, with the 1st base having position 1',
|
|
115
|
+
ID: 'identifier: Semi-colon separated list of unique identifiers where available',
|
|
116
|
+
REF: 'reference base(s): Each base must be one of A,C,G,T,N (case insensitive).',
|
|
117
|
+
ALT: 'alternate base(s): Comma-separated list of alternate non-reference alleles',
|
|
118
|
+
QUAL: 'quality: Phred-scaled quality score for the assertion made in ALT',
|
|
119
|
+
FILTER: 'filter status: PASS if this position has passed all filters, otherwise a semicolon-separated list of codes for filters that fail',
|
|
120
|
+
};
|
|
121
|
+
return (React.createElement(Paper, { "data-testid": "variant-side-drawer" },
|
|
122
|
+
React.createElement(FeatureDetails, { feature: rest, descriptions: { ...basicDescriptions, ...descriptions }, ...props }),
|
|
123
|
+
React.createElement(Divider, null),
|
|
124
|
+
feat.type === 'breakend' ? (React.createElement(BreakendPanel, { feature: feat, locStrings: feat.ALT.map((alt) => { var _a; return ((_a = parseBreakend(alt)) === null || _a === void 0 ? void 0 : _a.MatePosition) || ''; }), model: model })) : null,
|
|
125
|
+
feat.type === 'translocation' ? (React.createElement(BreakendPanel, { feature: feat, model: model, locStrings: [`${feat.INFO.CHR2[0]}:${feat.INFO.END}`] })) : null,
|
|
126
|
+
React.createElement(VariantSamples, { feature: feat, ...props })));
|
|
127
|
+
}
|
|
128
|
+
export default observer(VariantFeatureDetails);
|
|
129
|
+
//# sourceMappingURL=VariantFeatureWidget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VariantFeatureWidget.js","sourceRoot":"","sources":["../../src/VariantFeatureWidget/VariantFeatureWidget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import PluginManager from '@jbrowse/core/PluginManager';
|
|
2
|
+
export declare const configSchema: import("@jbrowse/core/configuration").AnyConfigurationSchemaType;
|
|
3
|
+
export declare function stateModelFactory(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
|
|
4
|
+
id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
5
|
+
type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
|
|
6
|
+
featureData: import("mobx-state-tree").IType<any, any, any>;
|
|
7
|
+
formattedFields: import("mobx-state-tree").IType<any, any, any>;
|
|
8
|
+
unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
|
|
9
|
+
view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
10
|
+
track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
11
|
+
} & {
|
|
12
|
+
type: import("mobx-state-tree").ISimpleType<"VariantFeatureWidget">;
|
|
13
|
+
descriptions: import("mobx-state-tree").IType<any, any, any>;
|
|
14
|
+
}, {
|
|
15
|
+
setFeatureData(featureData: Record<string, unknown>): void;
|
|
16
|
+
clearFeatureData(): void;
|
|
17
|
+
setFormattedData(feat: Record<string, unknown>): void;
|
|
18
|
+
} & {
|
|
19
|
+
afterCreate(): void;
|
|
20
|
+
}, {
|
|
21
|
+
type: "BaseFeatureWidget";
|
|
22
|
+
} & Partial<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
|
|
23
|
+
id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
24
|
+
type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
|
|
25
|
+
featureData: import("mobx-state-tree").IType<any, any, any>;
|
|
26
|
+
formattedFields: import("mobx-state-tree").IType<any, any, any>;
|
|
27
|
+
unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
|
|
28
|
+
view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
29
|
+
track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
30
|
+
}>> & import("mobx-state-tree/dist/internal").NonEmptyObject & import("mobx-state-tree")._NotCustomized, {
|
|
31
|
+
id: string;
|
|
32
|
+
type: "BaseFeatureWidget";
|
|
33
|
+
track: import("mobx-state-tree").ReferenceIdentifier | undefined;
|
|
34
|
+
view: import("mobx-state-tree").ReferenceIdentifier | undefined;
|
|
35
|
+
formattedFields: any;
|
|
36
|
+
finalizedFeatureData: any;
|
|
37
|
+
} & import("mobx-state-tree")._NotCustomized>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ConfigurationSchema } from '@jbrowse/core/configuration';
|
|
2
|
+
import { types } from 'mobx-state-tree';
|
|
3
|
+
import { stateModelFactory as baseModelFactory } from '@jbrowse/core/BaseFeatureWidget';
|
|
4
|
+
export const configSchema = ConfigurationSchema('VariantFeatureWidget', {});
|
|
5
|
+
export function stateModelFactory(pluginManager) {
|
|
6
|
+
const baseModel = baseModelFactory(pluginManager);
|
|
7
|
+
return types.compose(baseModel, types.model('VariantFeatureWidget', {
|
|
8
|
+
type: types.literal('VariantFeatureWidget'),
|
|
9
|
+
descriptions: types.frozen(),
|
|
10
|
+
}));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/VariantFeatureWidget/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAE,iBAAiB,IAAI,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAEvF,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAA;AAE3E,MAAM,UAAU,iBAAiB,CAAC,aAA4B;IAC5D,MAAM,SAAS,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAA;IACjD,OAAO,KAAK,CAAC,OAAO,CAClB,SAAS,EACT,KAAK,CAAC,KAAK,CAAC,sBAAsB,EAAE;QAClC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAC3C,YAAY,EAAE,KAAK,CAAC,MAAM,EAAE;KAC7B,CAAC,CACH,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseFeatureDataAdapter, BaseOptions } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
2
|
+
import { Region } from '@jbrowse/core/util/types';
|
|
3
|
+
import { Feature } from '@jbrowse/core/util/simpleFeature';
|
|
4
|
+
import IntervalTree from '@flatten-js/interval-tree';
|
|
5
|
+
export default class VcfAdapter extends BaseFeatureDataAdapter {
|
|
6
|
+
static capabilities: string[];
|
|
7
|
+
protected vcfFeatures?: Promise<{
|
|
8
|
+
header: string;
|
|
9
|
+
intervalTree: Record<string, IntervalTree>;
|
|
10
|
+
}>;
|
|
11
|
+
getHeader(): Promise<string>;
|
|
12
|
+
getMetadata(): Promise<any>;
|
|
13
|
+
setupP(): Promise<{
|
|
14
|
+
header: string;
|
|
15
|
+
intervalTree: Record<string, IntervalTree<any>>;
|
|
16
|
+
}>;
|
|
17
|
+
setup(): Promise<{
|
|
18
|
+
header: string;
|
|
19
|
+
intervalTree: Record<string, IntervalTree<any>>;
|
|
20
|
+
}>;
|
|
21
|
+
getRefNames(_?: BaseOptions): Promise<string[]>;
|
|
22
|
+
getFeatures(region: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
23
|
+
freeResources(): void;
|
|
24
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { BaseFeatureDataAdapter, } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
2
|
+
import { openLocation } from '@jbrowse/core/util/io';
|
|
3
|
+
import { ObservableCreate } from '@jbrowse/core/util/rxjs';
|
|
4
|
+
import { readConfObject } from '@jbrowse/core/configuration';
|
|
5
|
+
import IntervalTree from '@flatten-js/interval-tree';
|
|
6
|
+
import { unzip } from '@gmod/bgzf-filehandle';
|
|
7
|
+
import VCF from '@gmod/vcf';
|
|
8
|
+
import VcfFeature from '../VcfTabixAdapter/VcfFeature';
|
|
9
|
+
const readVcf = (f) => {
|
|
10
|
+
const lines = f.split('\n');
|
|
11
|
+
const header = [];
|
|
12
|
+
const rest = [];
|
|
13
|
+
lines.forEach(line => {
|
|
14
|
+
if (line.startsWith('#')) {
|
|
15
|
+
header.push(line);
|
|
16
|
+
}
|
|
17
|
+
else if (line) {
|
|
18
|
+
rest.push(line);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
return { header: header.join('\n'), lines: rest };
|
|
22
|
+
};
|
|
23
|
+
function isGzip(buf) {
|
|
24
|
+
return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
|
|
25
|
+
}
|
|
26
|
+
export default class VcfAdapter extends BaseFeatureDataAdapter {
|
|
27
|
+
async getHeader() {
|
|
28
|
+
const { header } = await this.setup();
|
|
29
|
+
return header;
|
|
30
|
+
}
|
|
31
|
+
async getMetadata() {
|
|
32
|
+
const { header } = await this.setup();
|
|
33
|
+
const parser = new VCF({ header: header });
|
|
34
|
+
return parser.getMetadata();
|
|
35
|
+
}
|
|
36
|
+
// converts lines into an interval tree
|
|
37
|
+
async setupP() {
|
|
38
|
+
const buffer = await openLocation(readConfObject(this.config, 'vcfLocation'), this.pluginManager).readFile();
|
|
39
|
+
const buf = isGzip(buffer) ? await unzip(buffer) : buffer;
|
|
40
|
+
// 512MB max chrome string length is 512MB
|
|
41
|
+
if (buf.length > 536870888) {
|
|
42
|
+
throw new Error('Data exceeds maximum string length (512MB)');
|
|
43
|
+
}
|
|
44
|
+
const str = new TextDecoder().decode(buf);
|
|
45
|
+
const { header, lines } = readVcf(str);
|
|
46
|
+
const intervalTree = lines
|
|
47
|
+
.map((line, id) => {
|
|
48
|
+
var _a;
|
|
49
|
+
const [refName, startP, , ref, , , , info] = line.split('\t');
|
|
50
|
+
const start = +startP - 1;
|
|
51
|
+
const end = +(((_a = info.match(/END=(\d+)/)) === null || _a === void 0 ? void 0 : _a[1].trim()) || start + ref.length);
|
|
52
|
+
return { line, refName, start, end, id };
|
|
53
|
+
})
|
|
54
|
+
.reduce((acc, obj) => {
|
|
55
|
+
const key = obj.refName;
|
|
56
|
+
if (!acc[key]) {
|
|
57
|
+
acc[key] = new IntervalTree();
|
|
58
|
+
}
|
|
59
|
+
acc[key].insert([obj.start, obj.end], obj);
|
|
60
|
+
return acc;
|
|
61
|
+
}, {});
|
|
62
|
+
return { header, intervalTree };
|
|
63
|
+
}
|
|
64
|
+
async setup() {
|
|
65
|
+
if (!this.vcfFeatures) {
|
|
66
|
+
this.vcfFeatures = this.setupP().catch(e => {
|
|
67
|
+
this.vcfFeatures = undefined;
|
|
68
|
+
throw e;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return this.vcfFeatures;
|
|
72
|
+
}
|
|
73
|
+
async getRefNames(_ = {}) {
|
|
74
|
+
const { intervalTree } = await this.setup();
|
|
75
|
+
return Object.keys(intervalTree);
|
|
76
|
+
}
|
|
77
|
+
getFeatures(region, opts = {}) {
|
|
78
|
+
return ObservableCreate(async (observer) => {
|
|
79
|
+
var _a;
|
|
80
|
+
try {
|
|
81
|
+
const { start, end, refName } = region;
|
|
82
|
+
const { header, intervalTree } = await this.setup();
|
|
83
|
+
const parser = new VCF({ header: header });
|
|
84
|
+
(_a = intervalTree[refName]) === null || _a === void 0 ? void 0 : _a.search([start, end]).forEach(f => observer.next(new VcfFeature({
|
|
85
|
+
variant: parser.parseLine(f.line),
|
|
86
|
+
parser,
|
|
87
|
+
id: `${this.id}-${f.id}`,
|
|
88
|
+
})));
|
|
89
|
+
observer.complete();
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
observer.error(e);
|
|
93
|
+
}
|
|
94
|
+
}, opts.signal);
|
|
95
|
+
}
|
|
96
|
+
freeResources() { }
|
|
97
|
+
}
|
|
98
|
+
VcfAdapter.capabilities = ['getFeatures', 'getRefNames'];
|
|
99
|
+
//# sourceMappingURL=VcfAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VcfAdapter.js","sourceRoot":"","sources":["../../src/VcfAdapter/VcfAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,GAEvB,MAAM,yCAAyC,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,YAAY,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,GAAG,MAAM,WAAW,CAAA;AAC3B,OAAO,UAAU,MAAM,+BAA+B,CAAA;AAEtD,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,EAAE;IAC5B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACnB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YACxB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SAClB;aAAM,IAAI,IAAI,EAAE;YACf,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;SAChB;IACH,CAAC,CAAC,CAAA;IACF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACnD,CAAC,CAAA;AAED,SAAS,MAAM,CAAC,GAAW;IACzB,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;AACxD,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,sBAAsB;IAQrD,KAAK,CAAC,SAAS;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QACrC,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QAC1C,OAAO,MAAM,CAAC,WAAW,EAAE,CAAA;IAC7B,CAAC;IAED,uCAAuC;IAChC,KAAK,CAAC,MAAM;QACjB,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,EAC1C,IAAI,CAAC,aAAa,CACnB,CAAC,QAAQ,EAAE,CAAA;QAEZ,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QAEzD,2CAA2C;QAC3C,IAAI,GAAG,CAAC,MAAM,GAAG,SAAW,EAAE;YAC5B,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;SAC9D;QAED,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACzC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAEtC,MAAM,YAAY,GAAG,KAAK;aACvB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE;;YAChB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,AAAD,EAAG,GAAG,EAAE,AAAD,EAAG,AAAD,EAAG,AAAD,EAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC7D,MAAM,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;YACzB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAA,MAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,0CAAG,CAAC,EAAE,IAAI,EAAE,KAAI,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;YACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAA;QAC1C,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAA;YACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;gBACb,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,YAAY,EAAE,CAAA;aAC9B;YACD,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;YAC1C,OAAO,GAAG,CAAA;QACZ,CAAC,EAAE,EAAkC,CAAC,CAAA;QAExC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IACjC,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;gBACzC,IAAI,CAAC,WAAW,GAAG,SAAS,CAAA;gBAC5B,MAAM,CAAC,CAAA;YACT,CAAC,CAAC,CAAA;SACH;QACD,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,IAAiB,EAAE;QAC1C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;QAC3C,OAAO,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAClC,CAAC;IAEM,WAAW,CAAC,MAAc,EAAE,OAAoB,EAAE;QACvD,OAAO,gBAAgB,CAAU,KAAK,EAAC,QAAQ,EAAC,EAAE;;YAChD,IAAI;gBACF,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,MAAM,CAAA;gBACtC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAA;gBACnD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC1C,MAAA,YAAY,CAAC,OAAO,CAAC,0CAAE,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CACtD,QAAQ,CAAC,IAAI,CACX,IAAI,UAAU,CAAC;oBACb,OAAO,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;oBACjC,MAAM;oBACN,EAAE,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE;iBACzB,CAAC,CACH,CACF,CAAA;gBACD,QAAQ,CAAC,QAAQ,EAAE,CAAA;aACpB;YAAC,OAAO,CAAC,EAAE;gBACV,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;aAClB;QACH,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACjB,CAAC;IAEM,aAAa,KAAU,CAAC;;AA3FjB,uBAAY,GAAG,CAAC,aAAa,EAAE,aAAa,CAAC,CAAA"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ConfigurationSchema } from '@jbrowse/core/configuration';
|
|
2
|
+
export default ConfigurationSchema('VcfAdapter', {
|
|
3
|
+
vcfLocation: {
|
|
4
|
+
type: 'fileLocation',
|
|
5
|
+
defaultValue: { uri: '/path/to/my.vcf', locationType: 'UriLocation' },
|
|
6
|
+
},
|
|
7
|
+
}, { explicitlyTyped: true });
|
|
8
|
+
//# sourceMappingURL=configSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../../src/VcfAdapter/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AAEjE,eAAe,mBAAmB,CAChC,YAAY,EACZ;IACE,WAAW,EAAE;QACX,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE;KACtE;CACF,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,CAC1B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as configSchema } from './configSchema';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/VcfAdapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Feature } from '@jbrowse/core/util/simpleFeature';
|
|
2
|
+
/**
|
|
3
|
+
* VCF Feature creation with lazy genotype evaluation.
|
|
4
|
+
*/
|
|
5
|
+
interface Samples {
|
|
6
|
+
[key: string]: {
|
|
7
|
+
[key: string]: {
|
|
8
|
+
values: string[] | number[] | null;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
interface FeatureData {
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
refName: string;
|
|
15
|
+
start: number;
|
|
16
|
+
end: number;
|
|
17
|
+
description?: string;
|
|
18
|
+
type?: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
aliases?: string[];
|
|
21
|
+
samples?: Samples;
|
|
22
|
+
}
|
|
23
|
+
export default class VCFFeature implements Feature {
|
|
24
|
+
private variant;
|
|
25
|
+
private parser;
|
|
26
|
+
private data;
|
|
27
|
+
private _id;
|
|
28
|
+
constructor(args: {
|
|
29
|
+
variant: any;
|
|
30
|
+
parser: any;
|
|
31
|
+
id: string;
|
|
32
|
+
});
|
|
33
|
+
get(field: string): any;
|
|
34
|
+
set(): void;
|
|
35
|
+
parent(): undefined;
|
|
36
|
+
children(): undefined;
|
|
37
|
+
tags(): string[];
|
|
38
|
+
id(): string;
|
|
39
|
+
dataFromVariant(variant: {
|
|
40
|
+
REF: string;
|
|
41
|
+
POS: number;
|
|
42
|
+
ALT: string[];
|
|
43
|
+
CHROM: string;
|
|
44
|
+
INFO: any;
|
|
45
|
+
ID: string[];
|
|
46
|
+
}): FeatureData;
|
|
47
|
+
/**
|
|
48
|
+
* Get a sequence ontology (SO) term that describes the variant type
|
|
49
|
+
*/
|
|
50
|
+
_getSOTermAndDescription(ref: string, alt: string[]): [string, string] | [undefined, undefined];
|
|
51
|
+
static _altTypeToSO: {
|
|
52
|
+
[key: string]: string | undefined;
|
|
53
|
+
};
|
|
54
|
+
_getSOAndDescFromAltDefs(ref: string, alt: string): [string, string] | [undefined, undefined];
|
|
55
|
+
_getSOAndDescByExamination(ref: string, alt: string): [string, string];
|
|
56
|
+
_makeDescriptionString(soTerm: string, ref: string, alt: string): string;
|
|
57
|
+
toJSON(): any;
|
|
58
|
+
}
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { parseBreakend } from '@gmod/vcf';
|
|
2
|
+
export default class VCFFeature {
|
|
3
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
4
|
+
constructor(args) {
|
|
5
|
+
this.variant = args.variant;
|
|
6
|
+
this.parser = args.parser;
|
|
7
|
+
this.data = this.dataFromVariant(this.variant);
|
|
8
|
+
this._id = args.id;
|
|
9
|
+
}
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
11
|
+
get(field) {
|
|
12
|
+
return field === 'samples'
|
|
13
|
+
? this.variant.SAMPLES
|
|
14
|
+
: this.data[field] || this.variant[field];
|
|
15
|
+
}
|
|
16
|
+
set() { }
|
|
17
|
+
parent() {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
children() {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
tags() {
|
|
24
|
+
const t = [
|
|
25
|
+
...Object.keys(this.data),
|
|
26
|
+
...Object.keys(this.variant),
|
|
27
|
+
'samples',
|
|
28
|
+
];
|
|
29
|
+
return t;
|
|
30
|
+
}
|
|
31
|
+
id() {
|
|
32
|
+
return this._id;
|
|
33
|
+
}
|
|
34
|
+
dataFromVariant(variant) {
|
|
35
|
+
const { REF, ALT, POS, CHROM, INFO, ID } = variant;
|
|
36
|
+
const start = POS - 1;
|
|
37
|
+
const [SO_term, description] = this._getSOTermAndDescription(REF, ALT);
|
|
38
|
+
const isTRA = ALT === null || ALT === void 0 ? void 0 : ALT.some(f => f === '<TRA>');
|
|
39
|
+
const isSymbolic = ALT === null || ALT === void 0 ? void 0 : ALT.some(f => f.indexOf('<') !== -1);
|
|
40
|
+
return {
|
|
41
|
+
refName: CHROM,
|
|
42
|
+
start,
|
|
43
|
+
end: isSymbolic && INFO.END && !isTRA ? +INFO.END[0] : start + REF.length,
|
|
44
|
+
description,
|
|
45
|
+
type: SO_term,
|
|
46
|
+
name: ID === null || ID === void 0 ? void 0 : ID.join(','),
|
|
47
|
+
aliases: ID && ID.length > 1 ? variant.ID.slice(1) : undefined,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Get a sequence ontology (SO) term that describes the variant type
|
|
52
|
+
*/
|
|
53
|
+
_getSOTermAndDescription(ref, alt) {
|
|
54
|
+
// it's just a remark if there are no alternate alleles
|
|
55
|
+
if (!alt || alt === []) {
|
|
56
|
+
return ['remark', 'no alternative alleles'];
|
|
57
|
+
}
|
|
58
|
+
const soTerms = new Set();
|
|
59
|
+
let descriptions = new Set();
|
|
60
|
+
alt.forEach(a => {
|
|
61
|
+
let [soTerm, description] = this._getSOAndDescFromAltDefs(ref, a);
|
|
62
|
+
if (!soTerm) {
|
|
63
|
+
;
|
|
64
|
+
[soTerm, description] = this._getSOAndDescByExamination(ref, a);
|
|
65
|
+
}
|
|
66
|
+
if (soTerm && description) {
|
|
67
|
+
soTerms.add(soTerm);
|
|
68
|
+
descriptions.add(description);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
// Combine descriptions like ["SNV G -> A", "SNV G -> T"] to ["SNV G -> A,T"]
|
|
72
|
+
if (descriptions.size > 1) {
|
|
73
|
+
const prefixes = new Set([...descriptions].map(desc => {
|
|
74
|
+
const prefix = desc.split('->');
|
|
75
|
+
return prefix[1] ? prefix[0] : desc;
|
|
76
|
+
}));
|
|
77
|
+
const new_descs = [...prefixes].map(prefix => {
|
|
78
|
+
const suffixes = [...descriptions]
|
|
79
|
+
.map(desc => {
|
|
80
|
+
const pref = desc.split('-> ');
|
|
81
|
+
return pref[1] && pref[0] === prefix ? pref[1] : '';
|
|
82
|
+
})
|
|
83
|
+
.filter(f => !!f);
|
|
84
|
+
return suffixes.length
|
|
85
|
+
? prefix + '-> ' + suffixes.join(',')
|
|
86
|
+
: [...descriptions].join(',');
|
|
87
|
+
});
|
|
88
|
+
descriptions = new Set(new_descs);
|
|
89
|
+
}
|
|
90
|
+
if (soTerms.size) {
|
|
91
|
+
return [[...soTerms].join(','), [...descriptions].join(',')];
|
|
92
|
+
}
|
|
93
|
+
return [undefined, undefined];
|
|
94
|
+
}
|
|
95
|
+
_getSOAndDescFromAltDefs(ref, alt) {
|
|
96
|
+
if (typeof alt === 'string' && !alt.startsWith('<')) {
|
|
97
|
+
return [undefined, undefined];
|
|
98
|
+
}
|
|
99
|
+
// look for a definition with an SO type for this
|
|
100
|
+
let soTerm = VCFFeature._altTypeToSO[alt];
|
|
101
|
+
// if no SO term but ALT is in metadata, assume sequence_variant
|
|
102
|
+
if (!soTerm && this.parser.getMetadata('ALT', alt)) {
|
|
103
|
+
soTerm = 'sequence_variant';
|
|
104
|
+
}
|
|
105
|
+
if (soTerm) {
|
|
106
|
+
return [soTerm, alt];
|
|
107
|
+
}
|
|
108
|
+
// try to look for a definition for a parent term if we can
|
|
109
|
+
const modAlt = alt.split(':');
|
|
110
|
+
if (modAlt.length > 1) {
|
|
111
|
+
return this._getSOAndDescFromAltDefs(ref, `<${modAlt.slice(0, modAlt.length - 1).join(':')}>`);
|
|
112
|
+
}
|
|
113
|
+
// no parent
|
|
114
|
+
return [undefined, undefined];
|
|
115
|
+
}
|
|
116
|
+
// note: term SNV is used instead of SNP because SO definition of SNP says
|
|
117
|
+
// abundance must be at least 1% in population, and can't be sure we meet
|
|
118
|
+
// that
|
|
119
|
+
_getSOAndDescByExamination(ref, alt) {
|
|
120
|
+
const bnd = parseBreakend(alt);
|
|
121
|
+
if (bnd) {
|
|
122
|
+
return ['breakend', alt];
|
|
123
|
+
}
|
|
124
|
+
else if (ref.length === 1 && alt.length === 1) {
|
|
125
|
+
return ['SNV', this._makeDescriptionString('SNV', ref, alt)];
|
|
126
|
+
}
|
|
127
|
+
else if (alt === '<INS>') {
|
|
128
|
+
return ['insertion', alt];
|
|
129
|
+
}
|
|
130
|
+
else if (alt === '<DEL>') {
|
|
131
|
+
return ['deletion', alt];
|
|
132
|
+
}
|
|
133
|
+
else if (alt === '<INV>') {
|
|
134
|
+
return ['deletion', alt];
|
|
135
|
+
}
|
|
136
|
+
else if (alt === '<TRA>') {
|
|
137
|
+
return ['translocation', alt];
|
|
138
|
+
}
|
|
139
|
+
else if (alt.includes('<')) {
|
|
140
|
+
return ['sv', alt];
|
|
141
|
+
}
|
|
142
|
+
else if (ref.length === alt.length) {
|
|
143
|
+
if (ref.split('').reverse().join('') === alt) {
|
|
144
|
+
return ['inversion', this._makeDescriptionString('inversion', ref, alt)];
|
|
145
|
+
}
|
|
146
|
+
return [
|
|
147
|
+
'substitution',
|
|
148
|
+
this._makeDescriptionString('substitution', ref, alt),
|
|
149
|
+
];
|
|
150
|
+
}
|
|
151
|
+
else if (ref.length <= alt.length) {
|
|
152
|
+
return ['insertion', this._makeDescriptionString('insertion', ref, alt)];
|
|
153
|
+
}
|
|
154
|
+
else if (ref.length > alt.length) {
|
|
155
|
+
return ['deletion', this._makeDescriptionString('deletion', ref, alt)];
|
|
156
|
+
}
|
|
157
|
+
return ['indel', this._makeDescriptionString('indel', ref, alt)];
|
|
158
|
+
}
|
|
159
|
+
_makeDescriptionString(soTerm, ref, alt) {
|
|
160
|
+
return `${soTerm} ${ref} -> ${alt}`;
|
|
161
|
+
}
|
|
162
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
163
|
+
toJSON() {
|
|
164
|
+
return {
|
|
165
|
+
uniqueId: this._id,
|
|
166
|
+
...this.variant,
|
|
167
|
+
...this.data,
|
|
168
|
+
samples: this.variant.SAMPLES,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
VCFFeature._altTypeToSO = {
|
|
173
|
+
DEL: 'deletion',
|
|
174
|
+
INS: 'insertion',
|
|
175
|
+
DUP: 'duplication',
|
|
176
|
+
INV: 'inversion',
|
|
177
|
+
INVDUP: 'inverted duplication',
|
|
178
|
+
CNV: 'copy_number_variation',
|
|
179
|
+
TRA: 'translocation',
|
|
180
|
+
'DUP:TANDEM': 'tandem_duplication',
|
|
181
|
+
NON_REF: 'sequence_variant',
|
|
182
|
+
'*': 'sequence_variant',
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=VcfFeature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VcfFeature.js","sourceRoot":"","sources":["../../src/VcfTabixAdapter/VcfFeature.ts"],"names":[],"mappings":"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"}
|