@sjcrh/proteinpaint-shared 2.187.0 → 2.188.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.
Files changed (117) hide show
  1. package/README.md +10 -2
  2. package/constants/AiHisto.ts +27 -0
  3. package/constants/README.md +11 -0
  4. package/devTs.ts +3 -0
  5. package/dist/constants/AiHisto.d.ts +23 -0
  6. package/dist/constants/AiHisto.js +31 -0
  7. package/dist/constants/AiHisto.js.map +7 -0
  8. package/dist/src/aiHisto.d.ts +5 -0
  9. package/dist/src/aiHisto.js +15 -0
  10. package/dist/src/aiHisto.js.map +7 -0
  11. package/dist/src/bulk.cnv.js +83 -0
  12. package/dist/src/bulk.cnv.js.map +7 -0
  13. package/dist/src/bulk.del.js +119 -0
  14. package/dist/src/bulk.del.js.map +7 -0
  15. package/dist/src/bulk.itd.js +119 -0
  16. package/dist/src/bulk.itd.js.map +7 -0
  17. package/dist/src/bulk.js +183 -0
  18. package/dist/src/bulk.js.map +7 -0
  19. package/dist/src/bulk.snv.js +175 -0
  20. package/dist/src/bulk.snv.js.map +7 -0
  21. package/dist/src/bulk.sv.js +266 -0
  22. package/dist/src/bulk.sv.js.map +7 -0
  23. package/dist/src/bulk.svjson.js +151 -0
  24. package/dist/src/bulk.svjson.js.map +7 -0
  25. package/dist/src/bulk.trunc.js +122 -0
  26. package/dist/src/bulk.trunc.js.map +7 -0
  27. package/dist/src/clustering.js +71 -0
  28. package/dist/src/clustering.js.map +7 -0
  29. package/dist/src/common.js +1302 -0
  30. package/dist/src/common.js.map +7 -0
  31. package/dist/src/compute.percentile.js +10 -0
  32. package/dist/src/compute.percentile.js.map +7 -0
  33. package/dist/src/doc.d.ts +7 -0
  34. package/dist/src/doc.js +10 -0
  35. package/dist/src/doc.js.map +7 -0
  36. package/dist/src/fetch-helpers.js +177 -0
  37. package/dist/src/fetch-helpers.js.map +7 -0
  38. package/dist/src/fileSize.js +10 -0
  39. package/dist/src/fileSize.js.map +7 -0
  40. package/dist/src/filter.d.ts +62 -0
  41. package/dist/src/filter.js +194 -0
  42. package/dist/src/filter.js.map +7 -0
  43. package/dist/src/hash.js +20 -0
  44. package/dist/src/hash.js.map +7 -0
  45. package/dist/src/helpers.js +66 -0
  46. package/dist/src/helpers.js.map +7 -0
  47. package/dist/src/index.d.ts +26 -0
  48. package/dist/src/index.js +27 -0
  49. package/dist/src/index.js.map +7 -0
  50. package/dist/src/joinUrl.d.ts +1 -0
  51. package/dist/src/joinUrl.js +17 -0
  52. package/dist/src/joinUrl.js.map +7 -0
  53. package/dist/src/mds3tk.js +64 -0
  54. package/dist/src/mds3tk.js.map +7 -0
  55. package/dist/src/roundValue.js +57 -0
  56. package/dist/src/roundValue.js.map +7 -0
  57. package/dist/src/termdb.bins.js +272 -0
  58. package/dist/src/termdb.bins.js.map +7 -0
  59. package/dist/src/termdb.initbinconfig.js +79 -0
  60. package/dist/src/termdb.initbinconfig.js.map +7 -0
  61. package/dist/src/termdb.usecase.js +239 -0
  62. package/dist/src/termdb.usecase.js.map +7 -0
  63. package/dist/src/terms.d.ts +83 -0
  64. package/dist/src/terms.js +327 -0
  65. package/dist/src/terms.js.map +7 -0
  66. package/dist/src/time.d.ts +9 -0
  67. package/dist/src/time.js +23 -0
  68. package/dist/src/time.js.map +7 -0
  69. package/dist/src/tree.js +82 -0
  70. package/dist/src/tree.js.map +7 -0
  71. package/dist/src/urljson.d.ts +8 -0
  72. package/dist/src/urljson.js +31 -0
  73. package/dist/src/urljson.js.map +7 -0
  74. package/dist/src/vcf.ann.js +56 -0
  75. package/dist/src/vcf.ann.js.map +7 -0
  76. package/dist/src/vcf.csq.js +82 -0
  77. package/dist/src/vcf.csq.js.map +7 -0
  78. package/dist/src/vcf.info.js +40 -0
  79. package/dist/src/vcf.info.js.map +7 -0
  80. package/dist/src/vcf.js +439 -0
  81. package/dist/src/vcf.js.map +7 -0
  82. package/dist/src/vcf.type.js +17 -0
  83. package/dist/src/vcf.type.js.map +7 -0
  84. package/package.json +20 -11
  85. package/src/bulk.cnv.js +0 -86
  86. package/src/bulk.del.js +0 -124
  87. package/src/bulk.itd.js +0 -123
  88. package/src/bulk.js +0 -197
  89. package/src/bulk.snv.js +0 -271
  90. package/src/bulk.sv.js +0 -276
  91. package/src/bulk.svjson.js +0 -164
  92. package/src/bulk.trunc.js +0 -132
  93. package/src/clustering.js +0 -66
  94. package/src/common.js +0 -1608
  95. package/src/compute.percentile.js +0 -11
  96. package/src/doc.js +0 -6
  97. package/src/fetch-helpers.js +0 -323
  98. package/src/fileSize.js +0 -6
  99. package/src/filter.js +0 -221
  100. package/src/hash.js +0 -21
  101. package/src/helpers.js +0 -88
  102. package/src/index.js +0 -26
  103. package/src/joinUrl.js +0 -14
  104. package/src/mds3tk.js +0 -100
  105. package/src/roundValue.js +0 -94
  106. package/src/termdb.bins.js +0 -456
  107. package/src/termdb.initbinconfig.js +0 -130
  108. package/src/termdb.usecase.js +0 -344
  109. package/src/terms.js +0 -341
  110. package/src/time.js +0 -22
  111. package/src/tree.js +0 -138
  112. package/src/urljson.js +0 -41
  113. package/src/vcf.ann.js +0 -62
  114. package/src/vcf.csq.js +0 -153
  115. package/src/vcf.info.js +0 -50
  116. package/src/vcf.js +0 -654
  117. package/src/vcf.type.js +0 -24
package/src/vcf.js DELETED
@@ -1,654 +0,0 @@
1
- import { mclass } from "./common.js"
2
- import { dissect_INFO } from "./vcf.info.js"
3
- import { parse_CSQ } from "./vcf.csq.js"
4
- import { parse_ANN } from "./vcf.ann.js"
5
- import { getVariantType } from "./vcf.type.js"
6
-
7
- /*
8
- Only for parsing vcf files
9
- is not involved in creating vcf tracks
10
-
11
- shared between client-server
12
- */
13
-
14
- // for telling symbolic alleles e.g. <*:DEL>
15
- const getallelename = new RegExp(/<(.+)>/)
16
-
17
- const mclasslabel2key = {}
18
- for (const k in mclass) {
19
- mclasslabel2key[mclass[k].label.toUpperCase()] = k
20
- }
21
-
22
- export function vcfparsemeta(lines) {
23
- /*
24
- input: array of string, as lines separated by linebreak
25
-
26
- ##INFO for meta lines
27
- #CHROM for header, to get samples
28
-
29
- */
30
-
31
- let sample = [],
32
- errlst = [],
33
- info = {},
34
- hasinfo = false,
35
- format = {},
36
- hasformat = false
37
-
38
- for (const line of lines) {
39
- if (!line.startsWith("#")) {
40
- continue
41
- }
42
-
43
- if (line.startsWith("#C")) {
44
- // header, get samples
45
- sample = line.split("\t").slice(9)
46
- continue
47
- }
48
-
49
- if (line.startsWith("##INFO")) {
50
- const e = tohash(line.substring(8, line.length - 1), info)
51
- if (e) {
52
- errlst.push("INFO error: " + e)
53
- } else {
54
- hasinfo = true
55
- }
56
- continue
57
- }
58
-
59
- if (line.startsWith("##FORMAT")) {
60
- const e = tohash(line.substring(10, line.length - 1), format)
61
- if (e) {
62
- errlst.push("FORMAT error: " + e)
63
- } else {
64
- hasformat = true
65
- }
66
- }
67
- }
68
-
69
- const sampleobjlst = []
70
- for (const samplename of sample) {
71
- const a = { name: samplename }
72
-
73
- // this enables adding key4annotation to match with .ds.cohort.annotation
74
-
75
- sampleobjlst.push(a)
76
- }
77
-
78
- // reserved INFO fields
79
- if (info.CSQ) {
80
- const lst = info.CSQ.Description.split(" Format: ")
81
- if (lst[1]) {
82
- const lst2 = lst[1].split("|")
83
- if (lst2.length > 1) {
84
- // fix csq headers so to allow configuring show/hide of csq fields
85
- info.CSQ.csqheader = []
86
- for (const str of lst2) {
87
- const attr = { name: str }
88
- info.CSQ.csqheader.push(attr)
89
- }
90
- } else {
91
- errlst.push("unknown format for CSQ header: " + info.CSQ.Description)
92
- }
93
- } else {
94
- errlst.push("unknown format for CSQ header: " + info.CSQ.Description)
95
- }
96
- }
97
-
98
- if (info.ANN) {
99
- const lst = info.ANN.Description.split("'")
100
- if (lst[1]) {
101
- const lst2 = lst[1].split(" | ")
102
- if (lst2.length) {
103
- info.ANN.annheader = []
104
- for (const s of lst2) {
105
- const attr = { name: s }
106
- info.ANN.annheader.push(attr)
107
- }
108
- } else {
109
- errlst.push(
110
- 'no " | " joined annotation fields for ANN (snpEff annotation): ' +
111
- info.ANN.Description
112
- )
113
- }
114
- } else {
115
- errlst.push(
116
- "no single-quote enclosed annotation fields for ANN (snpEff annotation): " +
117
- info.ANN.Description
118
- )
119
- }
120
- }
121
-
122
- return [
123
- hasinfo ? info : null,
124
- hasformat ? format : null,
125
- sampleobjlst,
126
- errlst.length ? errlst : null,
127
- ]
128
- }
129
-
130
- export function vcfparseline(line, vcf) {
131
- /*
132
- vcf, samples/info is generated by vcfparsemeta()
133
- .nochr BOOL
134
- .samples [ {} ]
135
- .name
136
- .info {}
137
- .format {}
138
-
139
- return:
140
- error message STR
141
- altinvalid []
142
- mlst [ m ] one m per alt allele
143
- chr
144
- pos
145
- name
146
- type
147
- ref
148
- alt
149
- altstr
150
- sampledata []
151
- altinfo
152
- */
153
-
154
- const lst = line.split("\t")
155
- if (lst.length < 8) {
156
- // no good
157
- return ["line has less than 8 fields", null, null]
158
- }
159
-
160
- const rawpos = Number.parseInt(lst[2 - 1])
161
- if (!Number.isInteger(rawpos)) {
162
- return ["invalid value for genomic position", null, null]
163
- }
164
-
165
- const refallele = lst[4 - 1]
166
-
167
- const m = {
168
- vcf_ID: lst[3 - 1],
169
- chr: (vcf.nochr ? "chr" : "") + lst[1 - 1],
170
- pos: rawpos - 1,
171
- ref: refallele,
172
- //refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, "refstr" is required for matching in FORMAT
173
- altstr: lst[5 - 1],
174
- alleles: [
175
- {
176
- /*
177
- ref allele only a placeholder, to be removed, this array only contains alt alleles
178
- this is a must
179
- also allows GT allele index to work
180
- */
181
- allele: refallele,
182
- sampledata: [],
183
- },
184
- ],
185
-
186
- info: {}, // locus info, do not contain allele info
187
-
188
- name: lst[3 - 1] == "." ? null : lst[3 - 1],
189
- }
190
-
191
- // parse alt
192
- const altinvalid = []
193
- for (const alt of lst[5 - 1].split(",")) {
194
- const a = {
195
- ref: m.ref, // may be corrected just below!
196
- allele: alt,
197
- // 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele
198
- allele_original: alt,
199
- sampledata: [],
200
- _m: m,
201
- info: {}, // allele info, do not contain locus info
202
- }
203
- m.alleles.push(a)
204
- if (alt[0] == "<") {
205
- /*
206
- symbolic allele, show text within <> as name
207
- FIXME match INFO
208
- */
209
- const tmp = alt.match(getallelename)
210
- if (!tmp) {
211
- altinvalid.push(alt)
212
- continue
213
- }
214
- a.type = tmp[1]
215
-
216
- a.allele = tmp[1]
217
- a.issymbolicallele = true
218
- } else {
219
- // normal nucleotide
220
-
221
- const [p, ref, alt] = correctRefAlt(m.pos, m.ref, a.allele)
222
- a.pos = p
223
- a.ref = ref
224
- a.allele = alt
225
- }
226
- }
227
-
228
- if (lst[9 - 1] && lst[10 - 1]) {
229
- parse_FORMAT2(lst, m, vcf)
230
- }
231
-
232
- /*
233
- remove ref allele so it only contain alternative alleles
234
- so that parse_INFO can safely apply Number=A fields to m.alleles
235
- */
236
- m.alleles.shift()
237
-
238
- // info
239
- const tmp = lst[8 - 1] == "." ? [] : dissect_INFO(lst[8 - 1])
240
- let badinfokeys = []
241
-
242
- if (vcf.info) {
243
- badinfokeys = parse_INFO(tmp, m, vcf)
244
- } else {
245
- // vcf meta lines told nothing about INFO, do not parse
246
- m.info = tmp
247
- }
248
-
249
- const mlst = []
250
- for (const a of m.alleles) {
251
- const m2 = {}
252
- for (const k in m) {
253
- if (k != "alleles") {
254
- m2[k] = m[k]
255
- }
256
- }
257
- for (const k in a) {
258
- if (k == "allele") {
259
- m2.alt = a[k]
260
- } else if (k == "info") {
261
- m2.altinfo = a[k]
262
- } else {
263
- m2[k] = a[k]
264
- }
265
- }
266
- if (!m2.issymbolicallele && m2.alt != "NON_REF") {
267
- m2.type = getVariantType(m2.ref, m2.alt)
268
- /*
269
- // valid alt allele, apply Dr. J's cool method
270
- const [p,ref,alt]=correctRefAlt(m2.pos, m2.ref, m2.alt)
271
- m2.pos=p
272
- m2.ref=ref
273
- m2.alt=alt
274
- */
275
- }
276
- mlst.push(m2)
277
- }
278
- return [
279
- badinfokeys.length ? "unknown info keys: " + badinfokeys.join(",") : null,
280
- mlst,
281
- altinvalid.length > 0 ? altinvalid : null,
282
- ]
283
- }
284
-
285
- function correctRefAlt(p, ref, alt) {
286
- // for oligos, always trim the last identical base
287
- while (
288
- ref.length > 1 &&
289
- alt.length > 1 &&
290
- ref[ref.length - 1] == alt[alt.length - 1]
291
- ) {
292
- ref = ref.substr(0, ref.length - 1)
293
- alt = alt.substr(0, alt.length - 1)
294
- }
295
- // move position up as long as first positions are equal
296
- while (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {
297
- ref = ref.substr(1)
298
- alt = alt.substr(1)
299
- p++
300
- }
301
- return [p, ref, alt]
302
- }
303
-
304
- function parse_FORMAT2(lst, m, vcf) {
305
- /*
306
- m.alleles[0] is ref allele
307
-
308
- each allele:
309
- .ref
310
- .allele
311
- .allele_original
312
- .sampledata[] blank array
313
- */
314
- const formatfields = lst[9 - 1].split(":")
315
-
316
- for (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {
317
- // for each sample
318
-
319
- const valuelst = lst[_sampleidx].split(":")
320
- {
321
- // tell if this sample have any data in this line (variant), if .:., then skip
322
- let none = true
323
- for (const v of valuelst) {
324
- if (v != ".") {
325
- none = false
326
- break
327
- }
328
- }
329
- if (none) {
330
- // this sample has no format value
331
- continue
332
- }
333
- }
334
-
335
- /* should create an object of {format:value} of this sample
336
- with this object, for each alt allele this sample has,
337
- put a copy in m.allele[x].sampledata[]
338
- */
339
-
340
- const sampleidx = _sampleidx - 9
341
-
342
- /*
343
- for each alt allele, initialize obj of this sample and store in this allele
344
- later, to iterate over format fields and put in appropriate values
345
- note that this sample may not actually have this allele
346
- */
347
- for (let i = 1; i < m.alleles.length; i++) {
348
- const sobj = {}
349
- if (vcf.samples && vcf.samples[sampleidx]) {
350
- for (const k in vcf.samples[sampleidx]) {
351
- sobj[k] = vcf.samples[sampleidx][k]
352
- }
353
- } else {
354
- sobj.name = "missing_samplename_from_vcf_header"
355
- }
356
- m.alleles[i].sampledata.push({
357
- sampleobj: sobj,
358
- })
359
- }
360
-
361
- for (let fi = 0; fi < formatfields.length; fi++) {
362
- // for each field of this sample
363
-
364
- const field = formatfields[fi]
365
- const value = valuelst[fi]
366
- if (value == ".") {
367
- // no value for this field
368
- continue
369
- }
370
-
371
- if (field == "GT") {
372
- const splitter = value.indexOf("/") != -1 ? "/" : "|"
373
- let gtsum = 0 // for calculating gtallref=true, old
374
- let unknowngt = false // if any is '.', then won't calculate gtallref
375
- const gtalleles = []
376
- for (const i of value.split(splitter)) {
377
- if (i == ".") {
378
- unknowngt = true
379
- continue
380
- }
381
- const j = Number.parseInt(i)
382
- if (Number.isNaN(j)) {
383
- unknowngt = true
384
- continue
385
- }
386
- gtsum += j
387
- const ale = m.alleles[j]
388
- if (ale) {
389
- gtalleles.push(ale.allele)
390
- }
391
- }
392
- let gtallref = false
393
- if (!unknowngt) {
394
- gtallref = gtsum == 0
395
- }
396
-
397
- const genotype = gtalleles.join(splitter)
398
- for (let i = 1; i < m.alleles.length; i++) {
399
- const ms = m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1]
400
- ms.GT = value
401
- ms.genotype = genotype
402
- if (gtallref) {
403
- ms.gtallref = true
404
- }
405
-
406
- // for mds vcf to drop out samples that do not have this alt allele
407
- ms.__gtalleles = gtalleles
408
- }
409
- continue
410
- }
411
-
412
- // other data fields
413
- const formatdesc = vcf.format ? vcf.format[field] : null
414
- if (!formatdesc) {
415
- // unspecified field, put to all alt alleles
416
- for (let i = 1; i < m.alleles.length; i++) {
417
- m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] =
418
- value
419
- }
420
- continue
421
- }
422
-
423
- const isinteger = formatdesc.Type == "Integer"
424
- const isfloat = formatdesc.Type == "Float"
425
-
426
- if ((formatdesc.Number && formatdesc.Number == "R") || field == "AD") {
427
- /*
428
- per-allele value, including ref
429
- v4.1 has AD not with "R", must process as R
430
- */
431
- const fvlst = value.split(",").map((i) => {
432
- if (isinteger) return Number.parseInt(i)
433
- if (isfloat) return Number.parseFloat(i)
434
- return i
435
- })
436
- for (let i = 1; i < m.alleles.length; i++) {
437
- if (fvlst[i] != undefined) {
438
- // this allele has value
439
- const m2 = m.alleles[i]
440
- const m2s = m2.sampledata[m2.sampledata.length - 1]
441
- // use this allele's ref/alt (after nt trimming)
442
- m2s[field] = {}
443
- m2s[field][m2.ref] = fvlst[0]
444
- m2s[field][m2.allele] = fvlst[i]
445
- }
446
- }
447
- continue
448
- }
449
- if (formatdesc.Number && formatdesc.Number == "A") {
450
- // per alt-allele value
451
- const fvlst = value.split(",").map((i) => {
452
- if (isinteger) return Number.parseInt(i)
453
- if (isfloat) return Number.parseFloat(i)
454
- return i
455
- })
456
- for (let i = 1; i < m.alleles.length; i++) {
457
- if (fvlst[i - 1] != undefined) {
458
- // this allele has value
459
- const m2 = m.alleles[i]
460
- const m2s = m2.sampledata[m2.sampledata.length - 1]
461
- // use this allele's ref/alt (after nt trimming)
462
- m2s[field] = {}
463
- m2s[field][m2.allele] = fvlst[i - 1]
464
- }
465
- }
466
- continue
467
- }
468
- // otherwise, append this field to all alt
469
- for (let i = 1; i < m.alleles.length; i++) {
470
- m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] =
471
- value
472
- }
473
- }
474
- }
475
-
476
- // compatible with old ds: make allele2readcount from AD
477
- for (const a of m.alleles) {
478
- for (const s of a.sampledata) {
479
- if (s.AD) {
480
- s.allele2readcount = {}
481
- for (const k in s.AD) {
482
- s.allele2readcount[k] = s.AD[k]
483
- }
484
- }
485
- }
486
- }
487
- }
488
-
489
- function tohash(s, hash) {
490
- /*
491
- parse INFO
492
- */
493
- const h = {},
494
- err = []
495
- let prev = 0,
496
- prevdoublequote = false,
497
- k = null
498
- for (let i = 0; i < s.length; i++) {
499
- if (s[i] == '"') {
500
- i++
501
- const thisstart = i
502
- while (s[i] != '"') {
503
- i++
504
- }
505
- if (k) {
506
- h[k] = s.substring(thisstart, i)
507
- k = null
508
- } else {
509
- err.push("k undefined before double quotes")
510
- }
511
- prevdoublequote = true
512
- continue
513
- }
514
- if (s[i] == "=") {
515
- k = s.substring(prev, i)
516
- prev = i + 1
517
- continue
518
- }
519
- if (s[i] == ",") {
520
- if (prevdoublequote) {
521
- prevdoublequote = false
522
- } else {
523
- if (k) {
524
- h[k] = s.substring(prev, i)
525
- k = null
526
- } else {
527
- err.push("k undefined")
528
- }
529
- }
530
- prev = i + 1
531
- continue
532
- }
533
- }
534
- if (k) {
535
- h[k] = s.substring(prev, i)
536
- }
537
- if (h.ID) {
538
- hash[h.ID] = h
539
- } else {
540
- return "no ID"
541
- }
542
- if (err.length) return err.join("\n")
543
- }
544
-
545
- function parse_INFO(tmp, m, vcf) {
546
- /*
547
- this function fills in both m.info{} and m.alleles[].info{}
548
-
549
- the m.alleles[] will later be converted to [m], each carrying one alt allele
550
- each m will have .info{} for locus info, and .altinfo{} for alt allele info
551
-
552
- */
553
-
554
- const badinfokeys = []
555
-
556
- for (const key in tmp) {
557
- if (vcf.info[key] == undefined) {
558
- badinfokeys.push(key)
559
- continue
560
- }
561
-
562
- const value = tmp[key]
563
-
564
- ////////////////// hard-coded fields
565
-
566
- if (key == "CSQ") {
567
- const okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m)
568
- if (!okay) {
569
- m.info[key] = value
570
- }
571
- continue
572
- }
573
- if (key == "ANN") {
574
- const okay = parse_ANN(value, vcf.info.ANN.annheader, m)
575
- if (!okay) {
576
- m.info[key] = value
577
- }
578
- continue
579
- }
580
-
581
- ////////////////// end of hardcoded fields
582
-
583
- if (vcf.info[key].Type == "Flag") {
584
- // flag has no value
585
- m.info[key] = key
586
- continue
587
- }
588
-
589
- const __number = vcf.info[key].Number
590
- const isinteger = vcf.info[key].Type == "Integer"
591
- const isfloat = vcf.info[key].Type == "Float"
592
-
593
- if (__number == "0") {
594
- /*
595
- no value, should be a Flag
596
- */
597
- m.info[key] = key
598
- continue
599
- }
600
-
601
- if (__number == "A") {
602
- /*
603
- per alt allele
604
- */
605
- const tt = value.split(",")
606
- for (let j = 0; j < tt.length; j++) {
607
- if (m.alleles[j]) {
608
- m.alleles[j].info[key] = isinteger
609
- ? Number.parseInt(tt[j])
610
- : isfloat
611
- ? Number.parseFloat(tt[j])
612
- : tt[j]
613
- }
614
- }
615
- continue
616
- }
617
-
618
- if (__number == "R") {
619
- /*
620
- FIXME "R" is not considered, m.alleles only contain alt, which .info{} for each
621
- the current datastructure does not support info for ref allele!
622
- */
623
- }
624
-
625
- if (__number == "1") {
626
- /*
627
- single value
628
- */
629
- m.info[key] = isinteger
630
- ? Number.parseInt(value)
631
- : isfloat
632
- ? Number.parseFloat(value)
633
- : value
634
- continue
635
- }
636
-
637
- if (!value.split) {
638
- // unknown error
639
- continue
640
- }
641
-
642
- // number of values unknown, "commas are permitted only as delimiters for lists of values"
643
-
644
- const lst = value.split(",") // value is always array!!
645
- if (isinteger) {
646
- m.info[key] = lst.map(Number.parseInt)
647
- } else if (isfloat) {
648
- m.info[key] = lst.map(Number.parseFloat)
649
- } else {
650
- m.info[key] = lst
651
- }
652
- }
653
- return badinfokeys
654
- }
package/src/vcf.type.js DELETED
@@ -1,24 +0,0 @@
1
- import {
2
- mclassdeletion,
3
- mclasssnv,
4
- mclassmnv,
5
- mclassinsertion,
6
- mclassnonstandard,
7
- } from "./common.js"
8
-
9
- export function getVariantType(ref, alt) {
10
- if (ref.length == 1 && alt.length == 1) {
11
- // both alleles length of 1
12
- if (alt == ".") {
13
- // alt is missing
14
- return mclassdeletion
15
- }
16
- // snv
17
- return mclasssnv
18
- }
19
- if (ref.length == alt.length) return mclassmnv
20
- // FIXME only when empty length of one allele
21
- if (ref.length < alt.length) return mclassinsertion
22
- if (ref.length > alt.length) return mclassdeletion
23
- return mclassnonstandard
24
- }