@sjcrh/proteinpaint-shared 2.187.0 → 2.188.1

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/bulk.del.js DELETED
@@ -1,124 +0,0 @@
1
- ////////////////////////////////////
2
- //
3
- // shared between client and server
4
- //
5
- ////////////////////////////////////
6
-
7
- import * as common from "./common.js"
8
- import * as bulk from "./bulk.js"
9
-
10
- export function parseheader(line, flag) {
11
- const header = line.toLowerCase().split("\t")
12
- if (header.length <= 1) return "invalid header line for intragenic deletion"
13
- const htry = (...lst) => {
14
- for (const i of lst) {
15
- const j = header.indexOf(i)
16
- if (j != -1) return j
17
- }
18
- return -1
19
- }
20
- let i = htry("gene")
21
- if (i == -1) return "gene missing from header"
22
- header[i] = "gene"
23
- i = htry(
24
- "annovar_isoform",
25
- "mrna_accession",
26
- "mrna accession",
27
- "refseq_mrna_id",
28
- "annovar_sj_filter_isoform",
29
- "refseq",
30
- "isoform"
31
- )
32
- if (i == -1) return "isoform missing from header"
33
- header[i] = "isoform"
34
- i = htry("rnaposition")
35
- if (i != -1) {
36
- header[i] = "rnaposition"
37
- i = htry("rnadellength")
38
- if (i == -1) return "rnadellength is required when rnaPosition is used"
39
- header[i] = "rnadellength"
40
- }
41
- i = htry("chromosome", "chr")
42
- if (i != -1) {
43
- header[i] = "chr"
44
- i = htry("chr_start")
45
- if (i == -1) return "chr_start is required when chr is used"
46
- header[i] = "chrpos1"
47
- i = htry("chr_stop")
48
- if (i == -1) return "chr_stop is required when chr is used"
49
- header[i] = "chrpos2"
50
- }
51
-
52
- i = htry("sample", "sample_name", "tumor_sample_barcode")
53
- if (i != -1) header[i] = "sample"
54
- i = htry("patient", "donor", "target_case_id")
55
- if (i != -1) header[i] = "patient"
56
- i = htry("disease")
57
- if (i != -1) header[i] = "disease"
58
- i = htry("origin")
59
- if (i != -1) header[i] = "origin"
60
- i = htry("sampletype", "sample type", "sample_type")
61
- if (i != -1) header[i] = "sampletype"
62
- flag.del.header = header
63
- flag.del.loaded = true
64
- return false
65
- }
66
-
67
- export function parseline(i, line, flag) {
68
- if (line == "" || line[0] == "#") return
69
- const lst = line.split("\t")
70
- const m = {}
71
- for (let j = 0; j < flag.del.header.length; j++) {
72
- if (lst[j] == undefined) break
73
- m[flag.del.header[j]] = lst[j]
74
- }
75
- if (!m.gene) {
76
- flag.del.badlines.push([i, "missing gene", lst])
77
- return
78
- }
79
- if (m.rnaposition) {
80
- let v = Number.parseInt(m.rnaposition)
81
- if (Number.isNaN(v) || v < 0) {
82
- flag.del.badlines.push([i, "invalid rnaPosition value", lst])
83
- return
84
- }
85
- m.rnaposition = v
86
- if (!m.rnadellength) {
87
- flag.del.badlines.push([i, "missing rnaDellength value", lst])
88
- return
89
- }
90
- v = Number.parseInt(m.rnadellength)
91
- if (Number.isNaN(v) || v < 0) {
92
- flag.del.badlines.push([i, "invalid rnaDellength value", lst])
93
- return
94
- }
95
- m.rnadellength = v
96
- }
97
- if (m.chr) {
98
- let v = Number.parseInt(m.chrpos1)
99
- if (Number.isNaN(v) || v < 0) {
100
- flag.del.badlines.push([i, "invalid chr_start value", lst])
101
- return
102
- }
103
- m.chrpos1 = v
104
- v = Number.parseInt(m.chrpos2)
105
- if (Number.isNaN(v) || v < 0) {
106
- flag.del.badlines.push([i, "invalid chr_stop value", lst])
107
- return
108
- }
109
- m.chrpos2 = v
110
- }
111
-
112
- if (bulk.parsesample(m, flag, i, lst, flag.del.badlines)) {
113
- return
114
- }
115
- m.dt = common.dtdel
116
- m.class = common.mclassdel
117
- m.mname = "DEL"
118
- flag.good++
119
- var n = flag.geneToUpper ? m.gene.toUpperCase() : m.gene
120
- if (!(n in flag.data)) {
121
- flag.data[n] = []
122
- }
123
- flag.data[n].push(m)
124
- }
package/src/bulk.itd.js DELETED
@@ -1,123 +0,0 @@
1
- ////////////////////////////////////
2
- //
3
- // shared between client and server
4
- //
5
- ////////////////////////////////////
6
-
7
- import * as common from "./common.js"
8
- import * as bulk from "./bulk.js"
9
-
10
- export function parseheader(line, flag) {
11
- const header = line.toLowerCase().split("\t")
12
- if (header.length <= 1) return "invalid header line for ITD"
13
- const htry = (...lst) => {
14
- for (const i of lst) {
15
- const j = header.indexOf(i)
16
- if (j != -1) return j
17
- }
18
- return -1
19
- }
20
- let i = htry("gene")
21
- if (i == -1) return "gene missing from header"
22
- header[i] = "gene"
23
- i = htry(
24
- "annovar_isoform",
25
- "mrna_accession",
26
- "mrna accession",
27
- "refseq_mrna_id",
28
- "annovar_sj_filter_isoform",
29
- "refseq",
30
- "isoform"
31
- )
32
- if (i == -1) return "isoform missing from header"
33
- header[i] = "isoform"
34
- i = htry("rnaposition")
35
- if (i != -1) {
36
- header[i] = "rnaposition"
37
- i = htry("rnaduplength")
38
- if (i == -1) return "rnaduplength is required when rnaposition is present"
39
- header[i] = "rnaduplength"
40
- }
41
- i = htry("chromosome", "chr")
42
- if (i != -1) {
43
- header[i] = "chr"
44
- i = htry("chr_start")
45
- if (i == -1) return "chr_start is required when chr is present"
46
- header[i] = "chrpos1"
47
- i = htry("chr_stop")
48
- if (i == -1) return "chr_stop is required when chr is present"
49
- header[i] = "chrpos2"
50
- }
51
-
52
- i = htry("sample", "sample_name", "tumor_sample_barcode")
53
- if (i != -1) header[i] = "sample"
54
- i = htry("patient", "donor", "target_case_id")
55
- if (i != -1) header[i] = "patient"
56
- i = htry("disease")
57
- if (i != -1) header[i] = "disease"
58
- i = htry("origin")
59
- if (i != -1) header[i] = "origin"
60
- i = htry("sampletype", "sample type", "sample_type")
61
- if (i != -1) header[i] = "sampletype"
62
- flag.itd.header = header
63
- flag.itd.loaded = true
64
- return false
65
- }
66
-
67
- export function parseline(i, line, flag) {
68
- if (line == "" || line[0] == "#") return
69
- const lst = line.split("\t")
70
- const m = {}
71
- for (let j = 0; j < flag.itd.header.length; j++) {
72
- if (lst[j] == undefined) break
73
- m[flag.itd.header[j]] = lst[j]
74
- }
75
- if (!m.gene) {
76
- flag.itd.badlines.push([i, "missing gene", lst])
77
- return
78
- }
79
- if (m.rnaposition) {
80
- let v = Number.parseInt(m.rnaposition)
81
- if (Number.isNaN(v) || v < 0) {
82
- flag.itd.badlines.push([i, "invalid rnaPosition value", lst])
83
- return
84
- }
85
- m.rnaposition = v
86
- if (!m.rnaduplength) {
87
- flag.itd.badlines.push([i, "missing rnaDuplength value", lst])
88
- return
89
- }
90
- v = Number.parseInt(m.rnaduplength)
91
- if (Number.isNaN(v) || v < 0) {
92
- flag.itd.badlines.push([i, "invalid rnaDuplength value", lst])
93
- return
94
- }
95
- m.rnaduplength = v
96
- }
97
- if (m.chr) {
98
- let v = Number.parseInt(m.chrpos1)
99
- if (Number.isNaN(v) || v < 0) {
100
- flag.itd.badlines.push([i, "invalid chr_start value", lst])
101
- return
102
- }
103
- m.chrpos1 = v
104
- v = Number.parseInt(m.chrpos2)
105
- if (Number.isNaN(v) || v < 0) {
106
- flag.itd.badlines.push([i, "invalid chr_stop value", lst])
107
- return
108
- }
109
- m.chrpos2 = v
110
- }
111
- if (bulk.parsesample(m, flag, i, lst, flag.itd.badlines)) {
112
- return
113
- }
114
- m.dt = common.dtitd
115
- m.class = common.mclassitd
116
- m.mname = "ITD"
117
- flag.good++
118
- var n = flag.geneToUpper ? m.gene.toUpperCase() : m.gene
119
- if (!(n in flag.data)) {
120
- flag.data[n] = []
121
- }
122
- flag.data[n].push(m)
123
- }
package/src/bulk.js DELETED
@@ -1,197 +0,0 @@
1
- ////////////////////////////////////
2
- //
3
- // shared between client and server
4
- //
5
- ////////////////////////////////////
6
-
7
- import * as common from "./common.js"
8
-
9
- export default {}
10
-
11
- export function init_bulk_flag(genome) {
12
- if (!genome) {
13
- return null
14
- }
15
- const mclasslabel2key = {}
16
- for (const n in common.mclass) {
17
- mclasslabel2key[common.mclass[n].label.toUpperCase()] = n
18
- }
19
- return {
20
- genome: genome,
21
- mclasslabel2key: mclasslabel2key,
22
- data: {},
23
- sample2disease: {}, // (proof) k: sample, v: disease
24
- // will only record this when origin is used
25
- patient2st: {},
26
- // k: patient, v: { k: sampletype, v: sample }
27
- // new sample names always override old
28
- good: 0,
29
- geneToUpper: true, // option to not force uppercase on gene names
30
- snv: {
31
- loaded: false,
32
- header: null,
33
- badlines: [],
34
- // jinghui: based on missense/silent ratio of entire dataset to decide whether to include silent when importing...
35
- // hard-coded class codes
36
- missense: 0,
37
- silent: 0,
38
- },
39
- svjson: {
40
- loaded: false,
41
- header: null,
42
- badlines: [],
43
- },
44
- fusion: {
45
- loaded: false,
46
- header: null,
47
- badlines: [],
48
- original: [],
49
- },
50
- sv: {
51
- loaded: false,
52
- header: null,
53
- badlines: [],
54
- original: [],
55
- },
56
- cnv: {
57
- loaded: false,
58
- header: null,
59
- badlines: [],
60
- },
61
- itd: {
62
- loaded: false,
63
- header: null,
64
- badlines: [],
65
- },
66
- del: {
67
- loaded: false,
68
- header: null,
69
- badlines: [],
70
- },
71
- truncation: {
72
- loaded: false,
73
- header: null,
74
- badlines: [],
75
- },
76
- }
77
- }
78
-
79
- export function parsesample(m, flag, i, lst, badline) {
80
- let variantorigin = common.moriginsomatic
81
- if (m.sampletype) {
82
- const s = m.sampletype.toLowerCase()
83
- switch (s) {
84
- case "relapse":
85
- variantorigin = common.moriginrelapse
86
- break
87
- case "germline":
88
- variantorigin = common.morigingermline
89
- break
90
- case "somatic":
91
- case "diagnosis":
92
- break
93
- }
94
- if (m.sample) {
95
- if (m.patient) {
96
- // good
97
- } else {
98
- m.patient = m.sample + " " + m.sampletype
99
- }
100
- } else {
101
- if (m.patient) {
102
- m.sample = m.patient + " " + m.sampletype
103
- } else {
104
- // neither sample or patient, will quit later
105
- }
106
- }
107
- } else {
108
- if (m.patient) {
109
- if (m.sample) {
110
- m.sampletype = m.sample
111
- } else {
112
- m.sample = m.sampletype = m.patient
113
- }
114
- } else {
115
- if (m.sample) {
116
- m.sampletype = m.sample
117
- } else {
118
- // no patient/sample, will quit later
119
- }
120
- }
121
- }
122
- if (m.origin) {
123
- // override existing variantorigin
124
- const s = m.origin.toLowerCase()
125
- switch (s) {
126
- case "r":
127
- case "relapse":
128
- variantorigin = common.moriginrelapse
129
- m.isrim2 = true
130
- break
131
- case "g":
132
- case "germline":
133
- variantorigin = common.morigingermline
134
- m.isrim1 = true
135
- break
136
- case "gp":
137
- case "germline pathogenic":
138
- variantorigin = common.morigingermlinepathogenic
139
- m.isrim1 = true
140
- break
141
- case "gnp":
142
- case "germline nonpathogenic":
143
- case "germline non-pathogenic":
144
- variantorigin = common.morigingermlinenonpathogenic
145
- m.isrim1 = true
146
- break
147
- case "s":
148
- case "somatic":
149
- case "diagnosis":
150
- variantorigin = common.moriginsomatic
151
- break
152
- }
153
- }
154
- m.origin = variantorigin
155
-
156
- if (!m.sample && !m.patient) {
157
- // will not go into sample table
158
- return
159
- }
160
-
161
- const nopatientname = "no patient/individual name"
162
- let p
163
- if (m.patient) {
164
- if (!flag.patient2st[m.patient]) {
165
- flag.patient2st[m.patient] = {}
166
- }
167
- flag.patient2st[m.patient][m.sampletype] = m.sample
168
- } else {
169
- if (!flag.patient2st[nopatientname]) {
170
- flag.patient2st[nopatientname] = {}
171
- }
172
- flag.patient2st[nopatientname][m.sampletype] = m.sample
173
- }
174
-
175
- if (m.sample) {
176
- if (m.disease) {
177
- if (m.sample in flag.sample2disease) {
178
- if (m.disease != flag.sample2disease[m.sample]) {
179
- flag.snv.badlines.push([
180
- i,
181
- 'conflict of disease types for sample "' +
182
- m.sample +
183
- '": ' +
184
- m.disease +
185
- ", " +
186
- flag.sample2disease[m.sample],
187
- lst,
188
- ])
189
- return true
190
- }
191
- } else {
192
- flag.sample2disease[m.sample] = m.disease
193
- }
194
- }
195
- }
196
- return false
197
- }
package/src/bulk.snv.js DELETED
@@ -1,271 +0,0 @@
1
- ///////////////////////////////
2
- //
3
- // shared between client and server
4
- //
5
- ///////////////////////////////
6
-
7
- import * as common from "./common.js"
8
- import * as bulk from "./bulk.js"
9
-
10
- export function parseheader(line, flag) {
11
- const header = line.toLowerCase().split("\t")
12
- if (header.length <= 1) return "invalid file header for snv/indel"
13
- const htry = (...args) => {
14
- for (const s of args) {
15
- const i = header.indexOf(s)
16
- if (i != -1) return i
17
- }
18
- return -1
19
- }
20
- let i = htry(
21
- "annovar_gene",
22
- "annovar_sj_gene",
23
- "gene",
24
- "genename",
25
- "gene_symbol",
26
- "hugo_symbol"
27
- )
28
- if (i == -1) return "gene missing from header"
29
- header[i] = "gene"
30
- i = htry(
31
- "annovar_aachange",
32
- "amino_acid_change",
33
- "annovar_sj_aachange",
34
- "aachange",
35
- "protein_change",
36
- "variant"
37
- )
38
- if (i == -1) return "amino_acid_change missing from header"
39
- header[i] = "mname"
40
- i = htry(
41
- "annovar_class",
42
- "class",
43
- "mclass",
44
- "variant_class",
45
- "variant_classification",
46
- "annovar_sj_class"
47
- )
48
- if (i == -1) return "variant_class missing from header"
49
- header[i] = "class"
50
- i = htry("chromosome", "chr")
51
- if (i == -1) return "chromosome missing from header"
52
- header[i] = "chr"
53
- i = htry("wu_hg19_pos", "start", "start_position", "chr_position", "position")
54
- if (i == -1) return "start missing from header"
55
- header[i] = "pos"
56
- i = htry(
57
- "annovar_isoform",
58
- "mrna_accession",
59
- "mrna accession",
60
- "refseq_mrna_id",
61
- "annovar_sj_filter_isoform",
62
- "refseq",
63
- "isoform"
64
- )
65
- if (i == -1) return "isoform missing from header"
66
- header[i] = "isoform"
67
-
68
- // optional
69
- i = htry("sample", "sample_name", "tumor_sample_barcode")
70
- if (i != -1) header[i] = "sample"
71
- i = htry("patient", "donor", "target_case_id")
72
- if (i != -1) header[i] = "patient"
73
- i = htry("quantitative_measurements")
74
- if (i != -1) header[i] = "qmset"
75
- // dna maf tumor
76
- i = htry("mutant_reads_in_case", "mutant_in_tumor", "tumor_readcount_alt")
77
- if (i != -1) header[i] = "maf_tumor_v1"
78
- i = htry("total_reads_in_case", "total_in_tumor", "tumor_readcount_total")
79
- if (i != -1) header[i] = "maf_tumor_v2"
80
- // dna maf normal
81
- i = htry(
82
- "mutant_reads_in_control",
83
- "mutant_in_normal",
84
- "normal_readcount_alt"
85
- )
86
- if (i != -1) header[i] = "maf_normal_v1"
87
- i = htry(
88
- "total_reads_in_control",
89
- "total_in_normal",
90
- "normal_readcount_total"
91
- )
92
- if (i != -1) header[i] = "maf_normal_v2"
93
- // rna maf
94
- // cdna
95
- i = htry("cdna_change")
96
- if (i != -1) header[i] = "cdna_change"
97
- i = htry("sampletype", "sample type", "sample_type")
98
- if (i != -1) header[i] = "sampletype"
99
- i = htry("origin")
100
- if (i != -1) header[i] = "origin"
101
- i = htry("cancer", "disease", "diagnosis")
102
- if (i != -1) header[i] = "disease"
103
- flag.snv.header = header
104
- flag.snv.loaded = true
105
- return false
106
- }
107
-
108
- export function parseline(linei, line, flag) {
109
- if (line == "" || line[0] == "#") return
110
- const lst = line.split("\t")
111
- const m = {}
112
- for (let j = 0; j < flag.snv.header.length; j++) {
113
- if (lst[j] == undefined) break
114
- m[flag.snv.header[j]] = lst[j]
115
- }
116
- if (!m.gene) {
117
- flag.snv.badlines.push([linei, "missing gene", lst])
118
- return
119
- }
120
- if (m.gene.toUpperCase() == "UNKNOWN") {
121
- flag.snv.badlines.push([linei, "gene name is UNKNOWN", lst])
122
- return
123
- }
124
- if (!m.isoform) {
125
- flag.snv.badlines.push([linei, "missing isoform", lst])
126
- return
127
- }
128
- if (!m.mname) {
129
- m.mname = m.cdna_change
130
- if (!m.mname) {
131
- flag.snv.badlines.push([linei, "missing amino acid change", lst])
132
- return
133
- }
134
- } else {
135
- if (m.mname.indexOf("p.") == 0) {
136
- m.mname = m.mname.replace(/^p\./, "")
137
- }
138
- }
139
- if (!m.class) {
140
- flag.snv.badlines.push([linei, "missing mutation class", lst])
141
- return
142
- }
143
- let _c = flag.mclasslabel2key[m.class.toUpperCase()]
144
- if (_c) {
145
- m.class = _c
146
- } else {
147
- _c = common.mclasstester(m.class)
148
- if (_c) {
149
- m.class = _c
150
- } else {
151
- flag.snv.badlines.push([linei, "wrong mutation class: " + m.class, lst])
152
- return
153
- }
154
- }
155
- if (bulk.parsesample(m, flag, linei, lst, flag.snv.badlines)) {
156
- return
157
- }
158
- if (!m.chr) {
159
- flag.snv.badlines.push([linei, "missing chromosome", lst])
160
- return
161
- }
162
- if (m.chr.toLowerCase().indexOf("chr") != 0) {
163
- m.chr = "chr" + m.chr
164
- }
165
- if (!m.pos) {
166
- flag.snv.badlines.push([linei, "missing chromosome position", lst])
167
- return
168
- }
169
- const v = Number.parseInt(m.pos)
170
- if (Number.isNaN(v)) {
171
- flag.snv.badlines.push([linei, "invalid chromosome position", lst])
172
- return
173
- }
174
- m.pos = v - 1
175
-
176
- if (m.maf_tumor_v2 != undefined && m.maf_tumor_v1 != undefined) {
177
- if (m.maf_tumor_v2 == "") {
178
- // no value, do not parse
179
- } else {
180
- let v1 = Number.parseInt(m.maf_tumor_v1),
181
- v2 = Number.parseInt(m.maf_tumor_v2)
182
- if (Number.isNaN(v1) || Number.isNaN(v2)) {
183
- flag.snv.badlines.push([
184
- linei,
185
- "invalid maf_tumor mutant and/or total read count",
186
- lst,
187
- ])
188
- return
189
- }
190
- m.maf_tumor = { f: v1 / v2, v1: v1, v2: v2 }
191
- }
192
- delete m.maf_tumor_v1
193
- delete m.maf_tumor_v2
194
- }
195
-
196
- if (m.maf_normal_v1 != undefined && m.maf_normal_v2 != undefined) {
197
- if (m.maf_normal_v2 == "") {
198
- // no value
199
- } else {
200
- let v1 = Number.parseInt(m.maf_normal_v1),
201
- v2 = Number.parseInt(m.maf_normal_v2)
202
- if (Number.isNaN(v1) || Number.isNaN(v2)) {
203
- flag.snv.badlines.push([
204
- linei,
205
- "invalid maf_normal mutant and/or total read count",
206
- lst,
207
- ])
208
- return
209
- }
210
- m.maf_normal = { f: v1 / v2, v1: v1, v2: v2 }
211
- }
212
- delete m.maf_normal_v1
213
- delete m.maf_normal_v2
214
- }
215
-
216
- /*
217
- if(m.qmset) {
218
- try{
219
- var v=JSON.parse(m.qmset)
220
- } catch(e){
221
- flag.snv.badlines.push([linei,'invalid JSON for quantitative_measurements',lst])
222
- v=null
223
- } finally {
224
- if(v) {
225
- if(typeof(v)!='object') {
226
- flag.snv.badlines.push([linei,'value of quantitative_measurements must be an object',lst])
227
- delete m.qmset
228
- } else {
229
- for(var n in v) {
230
- if(!Array.isArray(v[n])) {
231
- flag.snv.badlines.push([linei,'quantitative_measurements: "'+n+'" value must be an array',lst])
232
- delete v[n]
233
- } else {
234
- var tmp=[]
235
- v[n].forEach(function(v2){
236
- if(typeof(v2)=='number') {
237
- tmp.push({v:v2})
238
- } else if(v2.v && typeof(v2.v)=='number') {
239
- tmp.push(v2)
240
- }
241
- })
242
- if(tmp.length) {
243
- v[n]=tmp
244
- } else {
245
- flag.snv.badlines.push([linei,'quantitative_measurements: no valid value for "'+n+'"',lst])
246
- delete v[n]
247
- }
248
- }
249
- }
250
- m.qmset=v
251
- }
252
- } else {
253
- delete m.qmset
254
- }
255
- }
256
- }
257
- */
258
- flag.good++
259
- // FIXME hard-coded M and S
260
- if (m.class == "M") {
261
- flag.snv.missense++
262
- } else if (m.class == "S") {
263
- flag.snv.silent++
264
- }
265
- const n = flag.geneToUpper ? m.gene.toUpperCase() : m.gene
266
- if (!flag.data[n]) {
267
- flag.data[n] = []
268
- }
269
- m.dt = common.dtsnvindel
270
- flag.data[n].push(m)
271
- }