@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.
- package/README.md +10 -2
- package/constants/AiHisto.ts +27 -0
- package/constants/README.md +11 -0
- package/devTs.ts +3 -0
- package/dist/constants/AiHisto.d.ts +23 -0
- package/dist/constants/AiHisto.js +31 -0
- package/dist/constants/AiHisto.js.map +7 -0
- package/dist/src/aiHisto.d.ts +5 -0
- package/dist/src/aiHisto.js +15 -0
- package/dist/src/aiHisto.js.map +7 -0
- package/dist/src/bulk.cnv.js +83 -0
- package/dist/src/bulk.cnv.js.map +7 -0
- package/dist/src/bulk.del.js +119 -0
- package/dist/src/bulk.del.js.map +7 -0
- package/dist/src/bulk.itd.js +119 -0
- package/dist/src/bulk.itd.js.map +7 -0
- package/dist/src/bulk.js +183 -0
- package/dist/src/bulk.js.map +7 -0
- package/dist/src/bulk.snv.js +175 -0
- package/dist/src/bulk.snv.js.map +7 -0
- package/dist/src/bulk.sv.js +266 -0
- package/dist/src/bulk.sv.js.map +7 -0
- package/dist/src/bulk.svjson.js +151 -0
- package/dist/src/bulk.svjson.js.map +7 -0
- package/dist/src/bulk.trunc.js +122 -0
- package/dist/src/bulk.trunc.js.map +7 -0
- package/dist/src/clustering.js +71 -0
- package/dist/src/clustering.js.map +7 -0
- package/dist/src/common.js +1302 -0
- package/dist/src/common.js.map +7 -0
- package/dist/src/compute.percentile.js +10 -0
- package/dist/src/compute.percentile.js.map +7 -0
- package/dist/src/doc.d.ts +7 -0
- package/dist/src/doc.js +10 -0
- package/dist/src/doc.js.map +7 -0
- package/dist/src/fetch-helpers.js +177 -0
- package/dist/src/fetch-helpers.js.map +7 -0
- package/dist/src/fileSize.js +10 -0
- package/dist/src/fileSize.js.map +7 -0
- package/dist/src/filter.d.ts +62 -0
- package/dist/src/filter.js +194 -0
- package/dist/src/filter.js.map +7 -0
- package/dist/src/hash.js +20 -0
- package/dist/src/hash.js.map +7 -0
- package/dist/src/helpers.js +66 -0
- package/dist/src/helpers.js.map +7 -0
- package/dist/src/index.d.ts +26 -0
- package/dist/src/index.js +27 -0
- package/dist/src/index.js.map +7 -0
- package/dist/src/joinUrl.d.ts +1 -0
- package/dist/src/joinUrl.js +17 -0
- package/dist/src/joinUrl.js.map +7 -0
- package/dist/src/mds3tk.js +64 -0
- package/dist/src/mds3tk.js.map +7 -0
- package/dist/src/roundValue.js +57 -0
- package/dist/src/roundValue.js.map +7 -0
- package/dist/src/termdb.bins.js +272 -0
- package/dist/src/termdb.bins.js.map +7 -0
- package/dist/src/termdb.initbinconfig.js +79 -0
- package/dist/src/termdb.initbinconfig.js.map +7 -0
- package/dist/src/termdb.usecase.js +239 -0
- package/dist/src/termdb.usecase.js.map +7 -0
- package/dist/src/terms.d.ts +83 -0
- package/dist/src/terms.js +327 -0
- package/dist/src/terms.js.map +7 -0
- package/dist/src/time.d.ts +9 -0
- package/dist/src/time.js +23 -0
- package/dist/src/time.js.map +7 -0
- package/dist/src/tree.js +82 -0
- package/dist/src/tree.js.map +7 -0
- package/dist/src/urljson.d.ts +8 -0
- package/dist/src/urljson.js +31 -0
- package/dist/src/urljson.js.map +7 -0
- package/dist/src/vcf.ann.js +56 -0
- package/dist/src/vcf.ann.js.map +7 -0
- package/dist/src/vcf.csq.js +82 -0
- package/dist/src/vcf.csq.js.map +7 -0
- package/dist/src/vcf.info.js +40 -0
- package/dist/src/vcf.info.js.map +7 -0
- package/dist/src/vcf.js +439 -0
- package/dist/src/vcf.js.map +7 -0
- package/dist/src/vcf.type.js +17 -0
- package/dist/src/vcf.type.js.map +7 -0
- package/package.json +20 -11
- package/src/bulk.cnv.js +0 -86
- package/src/bulk.del.js +0 -124
- package/src/bulk.itd.js +0 -123
- package/src/bulk.js +0 -197
- package/src/bulk.snv.js +0 -271
- package/src/bulk.sv.js +0 -276
- package/src/bulk.svjson.js +0 -164
- package/src/bulk.trunc.js +0 -132
- package/src/clustering.js +0 -66
- package/src/common.js +0 -1608
- package/src/compute.percentile.js +0 -11
- package/src/doc.js +0 -6
- package/src/fetch-helpers.js +0 -323
- package/src/fileSize.js +0 -6
- package/src/filter.js +0 -221
- package/src/hash.js +0 -21
- package/src/helpers.js +0 -88
- package/src/index.js +0 -26
- package/src/joinUrl.js +0 -14
- package/src/mds3tk.js +0 -100
- package/src/roundValue.js +0 -94
- package/src/termdb.bins.js +0 -456
- package/src/termdb.initbinconfig.js +0 -130
- package/src/termdb.usecase.js +0 -344
- package/src/terms.js +0 -341
- package/src/time.js +0 -22
- package/src/tree.js +0 -138
- package/src/urljson.js +0 -41
- package/src/vcf.ann.js +0 -62
- package/src/vcf.csq.js +0 -153
- package/src/vcf.info.js +0 -50
- package/src/vcf.js +0 -654
- 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
|
-
}
|