@jbrowse/plugin-variants 2.3.1 → 2.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/VcfAdapter/VcfAdapter.d.ts +1 -2
  2. package/dist/VcfAdapter/VcfAdapter.js +2 -2
  3. package/dist/VcfAdapter/VcfAdapter.js.map +1 -1
  4. package/dist/{VcfTabixAdapter/VcfFeature.d.ts → VcfFeature/index.d.ts} +3 -15
  5. package/dist/VcfFeature/index.js +59 -0
  6. package/dist/VcfFeature/index.js.map +1 -0
  7. package/dist/VcfFeature/util.d.ts +7 -0
  8. package/dist/VcfFeature/util.js +129 -0
  9. package/dist/VcfFeature/util.js.map +1 -0
  10. package/dist/VcfTabixAdapter/VcfTabixAdapter.js +1 -1
  11. package/dist/VcfTabixAdapter/VcfTabixAdapter.js.map +1 -1
  12. package/dist/index.d.ts +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/esm/VcfAdapter/VcfAdapter.d.ts +1 -2
  16. package/esm/VcfAdapter/VcfAdapter.js +2 -2
  17. package/esm/VcfAdapter/VcfAdapter.js.map +1 -1
  18. package/esm/{VcfTabixAdapter/VcfFeature.d.ts → VcfFeature/index.d.ts} +3 -15
  19. package/esm/VcfFeature/index.js +56 -0
  20. package/esm/VcfFeature/index.js.map +1 -0
  21. package/esm/VcfFeature/util.d.ts +7 -0
  22. package/esm/VcfFeature/util.js +123 -0
  23. package/esm/VcfFeature/util.js.map +1 -0
  24. package/esm/VcfTabixAdapter/VcfTabixAdapter.js +1 -1
  25. package/esm/VcfTabixAdapter/VcfTabixAdapter.js.map +1 -1
  26. package/esm/index.d.ts +1 -1
  27. package/esm/index.js +1 -1
  28. package/esm/index.js.map +1 -1
  29. package/package.json +2 -2
  30. package/src/VcfAdapter/VcfAdapter.test.ts +0 -2
  31. package/src/VcfAdapter/VcfAdapter.ts +3 -4
  32. package/src/VcfFeature/index.test.ts +132 -0
  33. package/src/VcfFeature/index.ts +104 -0
  34. package/src/VcfFeature/util.ts +140 -0
  35. package/src/VcfTabixAdapter/VcfTabixAdapter.ts +1 -1
  36. package/src/index.ts +1 -1
  37. package/dist/VcfTabixAdapter/VcfFeature.js +0 -187
  38. package/dist/VcfTabixAdapter/VcfFeature.js.map +0 -1
  39. package/esm/VcfTabixAdapter/VcfFeature.js +0 -184
  40. package/esm/VcfTabixAdapter/VcfFeature.js.map +0 -1
  41. package/src/VcfTabixAdapter/VcfFeature.test.ts +0 -118
  42. package/src/VcfTabixAdapter/VcfFeature.ts +0 -250
@@ -1 +0,0 @@
1
- {"version":3,"file":"VcfFeature.js","sourceRoot":"","sources":["../../src/VcfTabixAdapter/VcfFeature.ts"],"names":[],"mappings":"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"}
@@ -1,184 +0,0 @@
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.length === 0) {
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"VcfFeature.js","sourceRoot":"","sources":["../../src/VcfTabixAdapter/VcfFeature.ts"],"names":[],"mappings":"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"}
@@ -1,118 +0,0 @@
1
- import VcfParser from '@gmod/vcf'
2
- import VcfFeature from './VcfFeature'
3
-
4
- test('test usage of the VcfFeature', () => {
5
- const parser = new VcfParser({
6
- header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`,
7
- })
8
- const line = `lcl|Scaffald_1\t80465\trs118266897\tR\tA\t29\tPASS\tNS=3;0,14;AF=0.5;DB;112;PG2.1`
9
-
10
- const variant = parser.parseLine(line)
11
-
12
- const f = new VcfFeature({
13
- parser,
14
- variant,
15
- id: 'myuniqueid',
16
- })
17
- expect(f.id()).toEqual('myuniqueid')
18
- expect(f.get('name')).toEqual('rs118266897')
19
- })
20
-
21
- test('try INS feature with END less than start', () => {
22
- const parser = new VcfParser({
23
- header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`,
24
- })
25
- const line = `chr1\t100\trs123\tR\tA\t29\tPASS\tEND=1;SVTYPE=INS`
26
-
27
- const variant = parser.parseLine(line)
28
-
29
- const f = new VcfFeature({
30
- parser,
31
- variant,
32
- id: 'myuniqueid',
33
- })
34
- expect(f.id()).toEqual('myuniqueid')
35
- expect(f.get('start')).toEqual(99)
36
- expect(f.get('end')).toEqual(100)
37
- })
38
-
39
- test('try DEL feature with END info field valid', () => {
40
- const parser = new VcfParser({
41
- header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`,
42
- })
43
- const line = `chr1\t100\trs123\tR\t<DEL>\t29\tPASS\tEND=1000;SVTYPE=DEL`
44
-
45
- const variant = parser.parseLine(line)
46
-
47
- const f = new VcfFeature({
48
- parser,
49
- variant,
50
- id: 'myuniqueid',
51
- })
52
- expect(f.id()).toEqual('myuniqueid')
53
- expect(f.get('start')).toEqual(99)
54
- expect(f.get('end')).toEqual(1000)
55
- })
56
-
57
- describe('test SV description', () => {
58
- it('multiple SVs', () => {
59
- const parser = new VcfParser({
60
- header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`,
61
- })
62
- const line = `chr1\t100\trs123\tR\t<INVDUP>,<INV>\t29\tPASS\tEND=1000;SVTYPE=DEL`
63
-
64
- const variant = parser.parseLine(line)
65
-
66
- const f = new VcfFeature({
67
- parser,
68
- variant,
69
- id: 'myuniqueid',
70
- })
71
- expect(f.get('description')).toEqual('<INVDUP>,<INV>')
72
- })
73
- it('BND', () => {
74
- const parser = new VcfParser({
75
- header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`,
76
- })
77
- const line = `chr1\t100\trs123\tR\tG[ctgA:34200[\t29\tPASS\tEND=1000;SVTYPE=BND`
78
-
79
- const variant = parser.parseLine(line)
80
-
81
- const f = new VcfFeature({
82
- parser,
83
- variant,
84
- id: 'myuniqueid',
85
- })
86
- expect(f.get('description')).toEqual('G[ctgA:34200[')
87
- })
88
- it('multiple BND', () => {
89
- const parser = new VcfParser({
90
- header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`,
91
- })
92
- const line = `chr1\t100\trs123\tR\tG[ctgA:34200[,G[ctgA:44200[\t29\tPASS\tEND=1000;SVTYPE=BND`
93
-
94
- const variant = parser.parseLine(line)
95
-
96
- const f = new VcfFeature({
97
- parser,
98
- variant,
99
- id: 'myuniqueid',
100
- })
101
- expect(f.get('description')).toEqual('G[ctgA:34200[,G[ctgA:44200[')
102
- })
103
- it('multiple SNV', () => {
104
- const parser = new VcfParser({
105
- header: `#CHROM\tPOS\tID\tREF\tALT\tQUAL\tFILTER\tINFO\tFORMAT\tBAMs/caudaus.sorted.sam`,
106
- })
107
- const line = `chr1\t100\trs123\tG\tA,C\t29\tPASS\tHELLO=world`
108
-
109
- const variant = parser.parseLine(line)
110
-
111
- const f = new VcfFeature({
112
- parser,
113
- variant,
114
- id: 'myuniqueid',
115
- })
116
- expect(f.get('description')).toEqual('SNV G -> A,C')
117
- })
118
- })
@@ -1,250 +0,0 @@
1
- import { Feature } from '@jbrowse/core/util/simpleFeature'
2
- import { parseBreakend } from '@gmod/vcf'
3
-
4
- /* eslint-disable no-underscore-dangle */
5
-
6
- /**
7
- * VCF Feature creation with lazy genotype evaluation.
8
- */
9
- interface Samples {
10
- [key: string]: {
11
- [key: string]: { values: string[] | number[] | null }
12
- }
13
- }
14
-
15
- interface FeatureData {
16
- [key: string]: unknown
17
- refName: string
18
- start: number
19
- end: number
20
- description?: string
21
- type?: string
22
- name?: string
23
- aliases?: string[]
24
- samples?: Samples
25
- }
26
-
27
- export default class VCFFeature implements Feature {
28
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
- private variant: any
30
-
31
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
- private parser: any
33
-
34
- private data: FeatureData
35
-
36
- private _id: string
37
-
38
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
39
- constructor(args: { variant: any; parser: any; id: string }) {
40
- this.variant = args.variant
41
- this.parser = args.parser
42
- this.data = this.dataFromVariant(this.variant)
43
- this._id = args.id
44
- }
45
-
46
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
47
- get(field: string): any {
48
- return field === 'samples'
49
- ? this.variant.SAMPLES
50
- : this.data[field] || this.variant[field]
51
- }
52
-
53
- set(): void {}
54
-
55
- parent(): undefined {
56
- return undefined
57
- }
58
-
59
- children(): undefined {
60
- return undefined
61
- }
62
-
63
- tags(): string[] {
64
- const t = [
65
- ...Object.keys(this.data),
66
- ...Object.keys(this.variant),
67
- 'samples',
68
- ]
69
- return t
70
- }
71
-
72
- id(): string {
73
- return this._id
74
- }
75
-
76
- dataFromVariant(variant: {
77
- REF: string
78
- POS: number
79
- ALT: string[]
80
- CHROM: string
81
- INFO: any // eslint-disable-line @typescript-eslint/no-explicit-any
82
- ID: string[]
83
- }): FeatureData {
84
- const { REF, ALT, POS, CHROM, INFO, ID } = variant
85
- const start = POS - 1
86
- const [SO_term, description] = this._getSOTermAndDescription(REF, ALT)
87
- const isTRA = ALT?.some(f => f === '<TRA>')
88
- const isSymbolic = ALT?.some(f => f.indexOf('<') !== -1)
89
-
90
- return {
91
- refName: CHROM,
92
- start,
93
- end: isSymbolic && INFO.END && !isTRA ? +INFO.END[0] : start + REF.length,
94
- description,
95
- type: SO_term,
96
- name: ID?.join(','),
97
- aliases: ID && ID.length > 1 ? variant.ID.slice(1) : undefined,
98
- }
99
- }
100
-
101
- /**
102
- * Get a sequence ontology (SO) term that describes the variant type
103
- */
104
- _getSOTermAndDescription(
105
- ref: string,
106
- alt: string[],
107
- ): [string, string] | [undefined, undefined] {
108
- // it's just a remark if there are no alternate alleles
109
- if (!alt || alt.length === 0) {
110
- return ['remark', 'no alternative alleles']
111
- }
112
-
113
- const soTerms = new Set<string>()
114
- let descriptions = new Set<string>()
115
- alt.forEach(a => {
116
- let [soTerm, description] = this._getSOAndDescFromAltDefs(ref, a)
117
-
118
- if (!soTerm) {
119
- ;[soTerm, description] = this._getSOAndDescByExamination(ref, a)
120
- }
121
- if (soTerm && description) {
122
- soTerms.add(soTerm)
123
- descriptions.add(description)
124
- }
125
- })
126
-
127
- // Combine descriptions like ["SNV G -> A", "SNV G -> T"] to ["SNV G -> A,T"]
128
- if (descriptions.size > 1) {
129
- const prefixes = new Set(
130
- [...descriptions].map(desc => {
131
- const prefix = desc.split('->')
132
- return prefix[1] ? prefix[0] : desc
133
- }),
134
- )
135
-
136
- const new_descs = [...prefixes].map(prefix => {
137
- const suffixes = [...descriptions]
138
- .map(desc => {
139
- const pref = desc.split('-> ')
140
- return pref[1] && pref[0] === prefix ? pref[1] : ''
141
- })
142
- .filter(f => !!f)
143
-
144
- return suffixes.length
145
- ? prefix + '-> ' + suffixes.join(',')
146
- : [...descriptions].join(',')
147
- })
148
-
149
- descriptions = new Set(new_descs)
150
- }
151
- if (soTerms.size) {
152
- return [[...soTerms].join(','), [...descriptions].join(',')]
153
- }
154
- return [undefined, undefined]
155
- }
156
-
157
- static _altTypeToSO: { [key: string]: string | undefined } = {
158
- DEL: 'deletion',
159
- INS: 'insertion',
160
- DUP: 'duplication',
161
- INV: 'inversion',
162
- INVDUP: 'inverted duplication',
163
- CNV: 'copy_number_variation',
164
- TRA: 'translocation',
165
- 'DUP:TANDEM': 'tandem_duplication',
166
- NON_REF: 'sequence_variant',
167
- '*': 'sequence_variant',
168
- }
169
-
170
- _getSOAndDescFromAltDefs(
171
- ref: string,
172
- alt: string,
173
- ): [string, string] | [undefined, undefined] {
174
- if (typeof alt === 'string' && !alt.startsWith('<')) {
175
- return [undefined, undefined]
176
- }
177
-
178
- // look for a definition with an SO type for this
179
- let soTerm = VCFFeature._altTypeToSO[alt]
180
- // if no SO term but ALT is in metadata, assume sequence_variant
181
- if (!soTerm && this.parser.getMetadata('ALT', alt)) {
182
- soTerm = 'sequence_variant'
183
- }
184
- if (soTerm) {
185
- return [soTerm, alt]
186
- }
187
-
188
- // try to look for a definition for a parent term if we can
189
- const modAlt = alt.split(':')
190
- if (modAlt.length > 1) {
191
- return this._getSOAndDescFromAltDefs(
192
- ref,
193
- `<${modAlt.slice(0, modAlt.length - 1).join(':')}>`,
194
- )
195
- }
196
-
197
- // no parent
198
- return [undefined, undefined]
199
- }
200
-
201
- // note: term SNV is used instead of SNP because SO definition of SNP says
202
- // abundance must be at least 1% in population, and can't be sure we meet
203
- // that
204
- _getSOAndDescByExamination(ref: string, alt: string): [string, string] {
205
- const bnd = parseBreakend(alt)
206
- if (bnd) {
207
- return ['breakend', alt]
208
- } else if (ref.length === 1 && alt.length === 1) {
209
- return ['SNV', this._makeDescriptionString('SNV', ref, alt)]
210
- } else if (alt === '<INS>') {
211
- return ['insertion', alt]
212
- } else if (alt === '<DEL>') {
213
- return ['deletion', alt]
214
- } else if (alt === '<INV>') {
215
- return ['deletion', alt]
216
- } else if (alt === '<TRA>') {
217
- return ['translocation', alt]
218
- } else if (alt.includes('<')) {
219
- return ['sv', alt]
220
- } else if (ref.length === alt.length) {
221
- if (ref.split('').reverse().join('') === alt) {
222
- return ['inversion', this._makeDescriptionString('inversion', ref, alt)]
223
- }
224
- return [
225
- 'substitution',
226
- this._makeDescriptionString('substitution', ref, alt),
227
- ]
228
- } else if (ref.length <= alt.length) {
229
- return ['insertion', this._makeDescriptionString('insertion', ref, alt)]
230
- } else if (ref.length > alt.length) {
231
- return ['deletion', this._makeDescriptionString('deletion', ref, alt)]
232
- }
233
-
234
- return ['indel', this._makeDescriptionString('indel', ref, alt)]
235
- }
236
-
237
- _makeDescriptionString(soTerm: string, ref: string, alt: string): string {
238
- return `${soTerm} ${ref} -> ${alt}`
239
- }
240
-
241
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
242
- toJSON(): any {
243
- return {
244
- uniqueId: this._id,
245
- ...this.variant,
246
- ...this.data,
247
- samples: this.variant.SAMPLES,
248
- }
249
- }
250
- }