@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/dist/src/vcf.js
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
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
|
+
const getallelename = new RegExp(/<(.+)>/);
|
|
7
|
+
const mclasslabel2key = {};
|
|
8
|
+
for (const k in mclass) {
|
|
9
|
+
mclasslabel2key[mclass[k].label.toUpperCase()] = k;
|
|
10
|
+
}
|
|
11
|
+
function vcfparsemeta(lines) {
|
|
12
|
+
let sample = [], errlst = [], info = {}, hasinfo = false, format = {}, hasformat = false;
|
|
13
|
+
for (const line of lines) {
|
|
14
|
+
if (!line.startsWith("#")) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (line.startsWith("#C")) {
|
|
18
|
+
sample = line.split(" ").slice(9);
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (line.startsWith("##INFO")) {
|
|
22
|
+
const e = tohash(line.substring(8, line.length - 1), info);
|
|
23
|
+
if (e) {
|
|
24
|
+
errlst.push("INFO error: " + e);
|
|
25
|
+
} else {
|
|
26
|
+
hasinfo = true;
|
|
27
|
+
}
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
if (line.startsWith("##FORMAT")) {
|
|
31
|
+
const e = tohash(line.substring(10, line.length - 1), format);
|
|
32
|
+
if (e) {
|
|
33
|
+
errlst.push("FORMAT error: " + e);
|
|
34
|
+
} else {
|
|
35
|
+
hasformat = true;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const sampleobjlst = [];
|
|
40
|
+
for (const samplename of sample) {
|
|
41
|
+
const a = { name: samplename };
|
|
42
|
+
sampleobjlst.push(a);
|
|
43
|
+
}
|
|
44
|
+
if (info.CSQ) {
|
|
45
|
+
const lst = info.CSQ.Description.split(" Format: ");
|
|
46
|
+
if (lst[1]) {
|
|
47
|
+
const lst2 = lst[1].split("|");
|
|
48
|
+
if (lst2.length > 1) {
|
|
49
|
+
info.CSQ.csqheader = [];
|
|
50
|
+
for (const str of lst2) {
|
|
51
|
+
const attr = { name: str };
|
|
52
|
+
info.CSQ.csqheader.push(attr);
|
|
53
|
+
}
|
|
54
|
+
} else {
|
|
55
|
+
errlst.push("unknown format for CSQ header: " + info.CSQ.Description);
|
|
56
|
+
}
|
|
57
|
+
} else {
|
|
58
|
+
errlst.push("unknown format for CSQ header: " + info.CSQ.Description);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (info.ANN) {
|
|
62
|
+
const lst = info.ANN.Description.split("'");
|
|
63
|
+
if (lst[1]) {
|
|
64
|
+
const lst2 = lst[1].split(" | ");
|
|
65
|
+
if (lst2.length) {
|
|
66
|
+
info.ANN.annheader = [];
|
|
67
|
+
for (const s of lst2) {
|
|
68
|
+
const attr = { name: s };
|
|
69
|
+
info.ANN.annheader.push(attr);
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
errlst.push('no " | " joined annotation fields for ANN (snpEff annotation): ' + info.ANN.Description);
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
errlst.push("no single-quote enclosed annotation fields for ANN (snpEff annotation): " + info.ANN.Description);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return [hasinfo ? info : null, hasformat ? format : null, sampleobjlst, errlst.length ? errlst : null];
|
|
79
|
+
}
|
|
80
|
+
function vcfparseline(line, vcf) {
|
|
81
|
+
const lst = line.split(" ");
|
|
82
|
+
if (lst.length < 8) {
|
|
83
|
+
return ["line has less than 8 fields", null, null];
|
|
84
|
+
}
|
|
85
|
+
const rawpos = Number.parseInt(lst[2 - 1]);
|
|
86
|
+
if (!Number.isInteger(rawpos)) {
|
|
87
|
+
return ["invalid value for genomic position", null, null];
|
|
88
|
+
}
|
|
89
|
+
const refallele = lst[4 - 1];
|
|
90
|
+
const m = {
|
|
91
|
+
vcf_ID: lst[3 - 1],
|
|
92
|
+
chr: (vcf.nochr ? "chr" : "") + lst[1 - 1],
|
|
93
|
+
pos: rawpos - 1,
|
|
94
|
+
ref: refallele,
|
|
95
|
+
//refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, "refstr" is required for matching in FORMAT
|
|
96
|
+
altstr: lst[5 - 1],
|
|
97
|
+
alleles: [
|
|
98
|
+
{
|
|
99
|
+
/*
|
|
100
|
+
ref allele only a placeholder, to be removed, this array only contains alt alleles
|
|
101
|
+
this is a must
|
|
102
|
+
also allows GT allele index to work
|
|
103
|
+
*/
|
|
104
|
+
allele: refallele,
|
|
105
|
+
sampledata: []
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
info: {},
|
|
109
|
+
// locus info, do not contain allele info
|
|
110
|
+
name: lst[3 - 1] == "." ? null : lst[3 - 1]
|
|
111
|
+
};
|
|
112
|
+
const altinvalid = [];
|
|
113
|
+
for (const alt of lst[5 - 1].split(",")) {
|
|
114
|
+
const a = {
|
|
115
|
+
ref: m.ref,
|
|
116
|
+
// may be corrected just below!
|
|
117
|
+
allele: alt,
|
|
118
|
+
// 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele
|
|
119
|
+
allele_original: alt,
|
|
120
|
+
sampledata: [],
|
|
121
|
+
_m: m,
|
|
122
|
+
info: {}
|
|
123
|
+
// allele info, do not contain locus info
|
|
124
|
+
};
|
|
125
|
+
m.alleles.push(a);
|
|
126
|
+
if (alt[0] == "<") {
|
|
127
|
+
const tmp2 = alt.match(getallelename);
|
|
128
|
+
if (!tmp2) {
|
|
129
|
+
altinvalid.push(alt);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
a.type = tmp2[1];
|
|
133
|
+
a.allele = tmp2[1];
|
|
134
|
+
a.issymbolicallele = true;
|
|
135
|
+
} else {
|
|
136
|
+
const [p, ref, alt2] = correctRefAlt(m.pos, m.ref, a.allele);
|
|
137
|
+
a.pos = p;
|
|
138
|
+
a.ref = ref;
|
|
139
|
+
a.allele = alt2;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (lst[9 - 1] && lst[10 - 1]) {
|
|
143
|
+
parse_FORMAT2(lst, m, vcf);
|
|
144
|
+
}
|
|
145
|
+
m.alleles.shift();
|
|
146
|
+
const tmp = lst[8 - 1] == "." ? [] : dissect_INFO(lst[8 - 1]);
|
|
147
|
+
let badinfokeys = [];
|
|
148
|
+
if (vcf.info) {
|
|
149
|
+
badinfokeys = parse_INFO(tmp, m, vcf);
|
|
150
|
+
} else {
|
|
151
|
+
m.info = tmp;
|
|
152
|
+
}
|
|
153
|
+
const mlst = [];
|
|
154
|
+
for (const a of m.alleles) {
|
|
155
|
+
const m2 = {};
|
|
156
|
+
for (const k in m) {
|
|
157
|
+
if (k != "alleles") {
|
|
158
|
+
m2[k] = m[k];
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
for (const k in a) {
|
|
162
|
+
if (k == "allele") {
|
|
163
|
+
m2.alt = a[k];
|
|
164
|
+
} else if (k == "info") {
|
|
165
|
+
m2.altinfo = a[k];
|
|
166
|
+
} else {
|
|
167
|
+
m2[k] = a[k];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (!m2.issymbolicallele && m2.alt != "NON_REF") {
|
|
171
|
+
m2.type = getVariantType(m2.ref, m2.alt);
|
|
172
|
+
}
|
|
173
|
+
mlst.push(m2);
|
|
174
|
+
}
|
|
175
|
+
return [
|
|
176
|
+
badinfokeys.length ? "unknown info keys: " + badinfokeys.join(",") : null,
|
|
177
|
+
mlst,
|
|
178
|
+
altinvalid.length > 0 ? altinvalid : null
|
|
179
|
+
];
|
|
180
|
+
}
|
|
181
|
+
function correctRefAlt(p, ref, alt) {
|
|
182
|
+
while (ref.length > 1 && alt.length > 1 && ref[ref.length - 1] == alt[alt.length - 1]) {
|
|
183
|
+
ref = ref.substr(0, ref.length - 1);
|
|
184
|
+
alt = alt.substr(0, alt.length - 1);
|
|
185
|
+
}
|
|
186
|
+
while (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {
|
|
187
|
+
ref = ref.substr(1);
|
|
188
|
+
alt = alt.substr(1);
|
|
189
|
+
p++;
|
|
190
|
+
}
|
|
191
|
+
return [p, ref, alt];
|
|
192
|
+
}
|
|
193
|
+
function parse_FORMAT2(lst, m, vcf) {
|
|
194
|
+
const formatfields = lst[9 - 1].split(":");
|
|
195
|
+
for (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {
|
|
196
|
+
const valuelst = lst[_sampleidx].split(":");
|
|
197
|
+
{
|
|
198
|
+
let none = true;
|
|
199
|
+
for (const v of valuelst) {
|
|
200
|
+
if (v != ".") {
|
|
201
|
+
none = false;
|
|
202
|
+
break;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (none) {
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const sampleidx = _sampleidx - 9;
|
|
210
|
+
for (let i2 = 1; i2 < m.alleles.length; i2++) {
|
|
211
|
+
const sobj = {};
|
|
212
|
+
if (vcf.samples && vcf.samples[sampleidx]) {
|
|
213
|
+
for (const k in vcf.samples[sampleidx]) {
|
|
214
|
+
sobj[k] = vcf.samples[sampleidx][k];
|
|
215
|
+
}
|
|
216
|
+
} else {
|
|
217
|
+
sobj.name = "missing_samplename_from_vcf_header";
|
|
218
|
+
}
|
|
219
|
+
m.alleles[i2].sampledata.push({
|
|
220
|
+
sampleobj: sobj
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
for (let fi = 0; fi < formatfields.length; fi++) {
|
|
224
|
+
const field = formatfields[fi];
|
|
225
|
+
const value = valuelst[fi];
|
|
226
|
+
if (value == ".") {
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (field == "GT") {
|
|
230
|
+
const splitter = value.indexOf("/") != -1 ? "/" : "|";
|
|
231
|
+
let gtsum = 0;
|
|
232
|
+
let unknowngt = false;
|
|
233
|
+
const gtalleles = [];
|
|
234
|
+
for (const i2 of value.split(splitter)) {
|
|
235
|
+
if (i2 == ".") {
|
|
236
|
+
unknowngt = true;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
const j = Number.parseInt(i2);
|
|
240
|
+
if (Number.isNaN(j)) {
|
|
241
|
+
unknowngt = true;
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
gtsum += j;
|
|
245
|
+
const ale = m.alleles[j];
|
|
246
|
+
if (ale) {
|
|
247
|
+
gtalleles.push(ale.allele);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
let gtallref = false;
|
|
251
|
+
if (!unknowngt) {
|
|
252
|
+
gtallref = gtsum == 0;
|
|
253
|
+
}
|
|
254
|
+
const genotype = gtalleles.join(splitter);
|
|
255
|
+
for (let i2 = 1; i2 < m.alleles.length; i2++) {
|
|
256
|
+
const ms = m.alleles[i2].sampledata[m.alleles[i2].sampledata.length - 1];
|
|
257
|
+
ms.GT = value;
|
|
258
|
+
ms.genotype = genotype;
|
|
259
|
+
if (gtallref) {
|
|
260
|
+
ms.gtallref = true;
|
|
261
|
+
}
|
|
262
|
+
ms.__gtalleles = gtalleles;
|
|
263
|
+
}
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
const formatdesc = vcf.format ? vcf.format[field] : null;
|
|
267
|
+
if (!formatdesc) {
|
|
268
|
+
for (let i2 = 1; i2 < m.alleles.length; i2++) {
|
|
269
|
+
m.alleles[i2].sampledata[m.alleles[i2].sampledata.length - 1][field] = value;
|
|
270
|
+
}
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
const isinteger = formatdesc.Type == "Integer";
|
|
274
|
+
const isfloat = formatdesc.Type == "Float";
|
|
275
|
+
if (formatdesc.Number && formatdesc.Number == "R" || field == "AD") {
|
|
276
|
+
const fvlst = value.split(",").map((i2) => {
|
|
277
|
+
if (isinteger) return Number.parseInt(i2);
|
|
278
|
+
if (isfloat) return Number.parseFloat(i2);
|
|
279
|
+
return i2;
|
|
280
|
+
});
|
|
281
|
+
for (let i2 = 1; i2 < m.alleles.length; i2++) {
|
|
282
|
+
if (fvlst[i2] != void 0) {
|
|
283
|
+
const m2 = m.alleles[i2];
|
|
284
|
+
const m2s = m2.sampledata[m2.sampledata.length - 1];
|
|
285
|
+
m2s[field] = {};
|
|
286
|
+
m2s[field][m2.ref] = fvlst[0];
|
|
287
|
+
m2s[field][m2.allele] = fvlst[i2];
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (formatdesc.Number && formatdesc.Number == "A") {
|
|
293
|
+
const fvlst = value.split(",").map((i2) => {
|
|
294
|
+
if (isinteger) return Number.parseInt(i2);
|
|
295
|
+
if (isfloat) return Number.parseFloat(i2);
|
|
296
|
+
return i2;
|
|
297
|
+
});
|
|
298
|
+
for (let i2 = 1; i2 < m.alleles.length; i2++) {
|
|
299
|
+
if (fvlst[i2 - 1] != void 0) {
|
|
300
|
+
const m2 = m.alleles[i2];
|
|
301
|
+
const m2s = m2.sampledata[m2.sampledata.length - 1];
|
|
302
|
+
m2s[field] = {};
|
|
303
|
+
m2s[field][m2.allele] = fvlst[i2 - 1];
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
continue;
|
|
307
|
+
}
|
|
308
|
+
for (let i2 = 1; i2 < m.alleles.length; i2++) {
|
|
309
|
+
m.alleles[i2].sampledata[m.alleles[i2].sampledata.length - 1][field] = value;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
for (const a of m.alleles) {
|
|
314
|
+
for (const s of a.sampledata) {
|
|
315
|
+
if (s.AD) {
|
|
316
|
+
s.allele2readcount = {};
|
|
317
|
+
for (const k in s.AD) {
|
|
318
|
+
s.allele2readcount[k] = s.AD[k];
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
function tohash(s, hash) {
|
|
325
|
+
const h = {}, err = [];
|
|
326
|
+
let prev = 0, prevdoublequote = false, k = null;
|
|
327
|
+
for (let i2 = 0; i2 < s.length; i2++) {
|
|
328
|
+
if (s[i2] == '"') {
|
|
329
|
+
i2++;
|
|
330
|
+
const thisstart = i2;
|
|
331
|
+
while (s[i2] != '"') {
|
|
332
|
+
i2++;
|
|
333
|
+
}
|
|
334
|
+
if (k) {
|
|
335
|
+
h[k] = s.substring(thisstart, i2);
|
|
336
|
+
k = null;
|
|
337
|
+
} else {
|
|
338
|
+
err.push("k undefined before double quotes");
|
|
339
|
+
}
|
|
340
|
+
prevdoublequote = true;
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (s[i2] == "=") {
|
|
344
|
+
k = s.substring(prev, i2);
|
|
345
|
+
prev = i2 + 1;
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
if (s[i2] == ",") {
|
|
349
|
+
if (prevdoublequote) {
|
|
350
|
+
prevdoublequote = false;
|
|
351
|
+
} else {
|
|
352
|
+
if (k) {
|
|
353
|
+
h[k] = s.substring(prev, i2);
|
|
354
|
+
k = null;
|
|
355
|
+
} else {
|
|
356
|
+
err.push("k undefined");
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
prev = i2 + 1;
|
|
360
|
+
continue;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (k) {
|
|
364
|
+
h[k] = s.substring(prev, i);
|
|
365
|
+
}
|
|
366
|
+
if (h.ID) {
|
|
367
|
+
hash[h.ID] = h;
|
|
368
|
+
} else {
|
|
369
|
+
return "no ID";
|
|
370
|
+
}
|
|
371
|
+
if (err.length) return err.join("\n");
|
|
372
|
+
}
|
|
373
|
+
function parse_INFO(tmp, m, vcf) {
|
|
374
|
+
const badinfokeys = [];
|
|
375
|
+
for (const key in tmp) {
|
|
376
|
+
if (vcf.info[key] == void 0) {
|
|
377
|
+
badinfokeys.push(key);
|
|
378
|
+
continue;
|
|
379
|
+
}
|
|
380
|
+
const value = tmp[key];
|
|
381
|
+
if (key == "CSQ") {
|
|
382
|
+
const okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m);
|
|
383
|
+
if (!okay) {
|
|
384
|
+
m.info[key] = value;
|
|
385
|
+
}
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
if (key == "ANN") {
|
|
389
|
+
const okay = parse_ANN(value, vcf.info.ANN.annheader, m);
|
|
390
|
+
if (!okay) {
|
|
391
|
+
m.info[key] = value;
|
|
392
|
+
}
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
if (vcf.info[key].Type == "Flag") {
|
|
396
|
+
m.info[key] = key;
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
const __number = vcf.info[key].Number;
|
|
400
|
+
const isinteger = vcf.info[key].Type == "Integer";
|
|
401
|
+
const isfloat = vcf.info[key].Type == "Float";
|
|
402
|
+
if (__number == "0") {
|
|
403
|
+
m.info[key] = key;
|
|
404
|
+
continue;
|
|
405
|
+
}
|
|
406
|
+
if (__number == "A") {
|
|
407
|
+
const tt = value.split(",");
|
|
408
|
+
for (let j = 0; j < tt.length; j++) {
|
|
409
|
+
if (m.alleles[j]) {
|
|
410
|
+
m.alleles[j].info[key] = isinteger ? Number.parseInt(tt[j]) : isfloat ? Number.parseFloat(tt[j]) : tt[j];
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
if (__number == "R") {
|
|
416
|
+
}
|
|
417
|
+
if (__number == "1") {
|
|
418
|
+
m.info[key] = isinteger ? Number.parseInt(value) : isfloat ? Number.parseFloat(value) : value;
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
if (!value.split) {
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
const lst = value.split(",");
|
|
425
|
+
if (isinteger) {
|
|
426
|
+
m.info[key] = lst.map(Number.parseInt);
|
|
427
|
+
} else if (isfloat) {
|
|
428
|
+
m.info[key] = lst.map(Number.parseFloat);
|
|
429
|
+
} else {
|
|
430
|
+
m.info[key] = lst;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return badinfokeys;
|
|
434
|
+
}
|
|
435
|
+
export {
|
|
436
|
+
vcfparseline,
|
|
437
|
+
vcfparsemeta
|
|
438
|
+
};
|
|
439
|
+
//# sourceMappingURL=vcf.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/vcf.js"],
|
|
4
|
+
"sourcesContent": ["import { mclass } from './common.js'\nimport { dissect_INFO } from './vcf.info.js'\nimport { parse_CSQ } from './vcf.csq.js'\nimport { parse_ANN } from './vcf.ann.js'\nimport { getVariantType } from './vcf.type.js'\n\n/*\nOnly for parsing vcf files\nis not involved in creating vcf tracks\n\nshared between client-server\n*/\n\n// for telling symbolic alleles e.g. <*:DEL>\nconst getallelename = new RegExp(/<(.+)>/)\n\nconst mclasslabel2key = {}\nfor (const k in mclass) {\n\tmclasslabel2key[mclass[k].label.toUpperCase()] = k\n}\n\nexport function vcfparsemeta(lines) {\n\t/*\n\tinput: array of string, as lines separated by linebreak\n\n\t##INFO for meta lines\n\t#CHROM for header, to get samples\n\n\t*/\n\n\tlet sample = [],\n\t\terrlst = [],\n\t\tinfo = {},\n\t\thasinfo = false,\n\t\tformat = {},\n\t\thasformat = false\n\n\tfor (const line of lines) {\n\t\tif (!line.startsWith('#')) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('#C')) {\n\t\t\t// header, get samples\n\t\t\tsample = line.split('\\t').slice(9)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##INFO')) {\n\t\t\tconst e = tohash(line.substring(8, line.length - 1), info)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('INFO error: ' + e)\n\t\t\t} else {\n\t\t\t\thasinfo = true\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##FORMAT')) {\n\t\t\tconst e = tohash(line.substring(10, line.length - 1), format)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('FORMAT error: ' + e)\n\t\t\t} else {\n\t\t\t\thasformat = true\n\t\t\t}\n\t\t}\n\t}\n\n\tconst sampleobjlst = []\n\tfor (const samplename of sample) {\n\t\tconst a = { name: samplename }\n\n\t\t// this enables adding key4annotation to match with .ds.cohort.annotation\n\n\t\tsampleobjlst.push(a)\n\t}\n\n\t// reserved INFO fields\n\tif (info.CSQ) {\n\t\tconst lst = info.CSQ.Description.split(' Format: ')\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split('|')\n\t\t\tif (lst2.length > 1) {\n\t\t\t\t// fix csq headers so to allow configuring show/hide of csq fields\n\t\t\t\tinfo.CSQ.csqheader = []\n\t\t\t\tfor (const str of lst2) {\n\t\t\t\t\tconst attr = { name: str }\n\t\t\t\t\tinfo.CSQ.csqheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t}\n\t}\n\n\tif (info.ANN) {\n\t\tconst lst = info.ANN.Description.split(\"'\")\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split(' | ')\n\t\t\tif (lst2.length) {\n\t\t\t\tinfo.ANN.annheader = []\n\t\t\t\tfor (const s of lst2) {\n\t\t\t\t\tconst attr = { name: s }\n\t\t\t\t\tinfo.ANN.annheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('no \" | \" joined annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('no single-quote enclosed annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t}\n\t}\n\n\treturn [hasinfo ? info : null, hasformat ? format : null, sampleobjlst, errlst.length ? errlst : null]\n}\n\nexport function vcfparseline(line, vcf) {\n\t/*\n\tvcf, samples/info is generated by vcfparsemeta()\n\t\t.nochr BOOL\n\t\t.samples [ {} ]\n\t\t\t.name\n\t\t.info {}\n\t\t.format {}\n\n\treturn:\n\t\terror message STR\n\t\taltinvalid []\n\t\tmlst [ m ] one m per alt allele\n\t\t\tchr\n\t\t\tpos\n\t\t\tname\n\t\t\ttype\n\t\t\tref\n\t\t\talt\n\t\t\taltstr\n\t\t\tsampledata []\n\t\t\taltinfo\n\t*/\n\n\tconst lst = line.split('\\t')\n\tif (lst.length < 8) {\n\t\t// no good\n\t\treturn ['line has less than 8 fields', null, null]\n\t}\n\n\tconst rawpos = Number.parseInt(lst[2 - 1])\n\tif (!Number.isInteger(rawpos)) {\n\t\treturn ['invalid value for genomic position', null, null]\n\t}\n\n\tconst refallele = lst[4 - 1]\n\n\tconst m = {\n\t\tvcf_ID: lst[3 - 1],\n\t\tchr: (vcf.nochr ? 'chr' : '') + lst[1 - 1],\n\t\tpos: rawpos - 1,\n\t\tref: refallele,\n\t\t//refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, \"refstr\" is required for matching in FORMAT\n\t\taltstr: lst[5 - 1],\n\t\talleles: [\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\tref allele only a placeholder, to be removed, this array only contains alt alleles\n\t\t\t\tthis is a must\n\t\t\t\talso allows GT allele index to work\n\t\t\t\t*/\n\t\t\t\tallele: refallele,\n\t\t\t\tsampledata: []\n\t\t\t}\n\t\t],\n\n\t\tinfo: {}, // locus info, do not contain allele info\n\n\t\tname: lst[3 - 1] == '.' ? null : lst[3 - 1]\n\t}\n\n\t// parse alt\n\tconst altinvalid = []\n\tfor (const alt of lst[5 - 1].split(',')) {\n\t\tconst a = {\n\t\t\tref: m.ref, // may be corrected just below!\n\t\t\tallele: alt,\n\t\t\t// 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele\n\t\t\tallele_original: alt,\n\t\t\tsampledata: [],\n\t\t\t_m: m,\n\t\t\tinfo: {} // allele info, do not contain locus info\n\t\t}\n\t\tm.alleles.push(a)\n\t\tif (alt[0] == '<') {\n\t\t\t/*\n\t\t\tsymbolic allele, show text within <> as name\n\t\t\tFIXME match INFO\n\t\t\t*/\n\t\t\tconst tmp = alt.match(getallelename)\n\t\t\tif (!tmp) {\n\t\t\t\taltinvalid.push(alt)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ta.type = tmp[1]\n\n\t\t\ta.allele = tmp[1]\n\t\t\ta.issymbolicallele = true\n\t\t} else {\n\t\t\t// normal nucleotide\n\n\t\t\tconst [p, ref, alt] = correctRefAlt(m.pos, m.ref, a.allele)\n\t\t\ta.pos = p\n\t\t\ta.ref = ref\n\t\t\ta.allele = alt\n\t\t}\n\t}\n\n\tif (lst[9 - 1] && lst[10 - 1]) {\n\t\tparse_FORMAT2(lst, m, vcf)\n\t}\n\n\t/*\n\tremove ref allele so it only contain alternative alleles\n\tso that parse_INFO can safely apply Number=A fields to m.alleles\n\t*/\n\tm.alleles.shift()\n\n\t// info\n\tconst tmp = lst[8 - 1] == '.' ? [] : dissect_INFO(lst[8 - 1])\n\tlet badinfokeys = []\n\n\tif (vcf.info) {\n\t\tbadinfokeys = parse_INFO(tmp, m, vcf)\n\t} else {\n\t\t// vcf meta lines told nothing about INFO, do not parse\n\t\tm.info = tmp\n\t}\n\n\tconst mlst = []\n\tfor (const a of m.alleles) {\n\t\tconst m2 = {}\n\t\tfor (const k in m) {\n\t\t\tif (k != 'alleles') {\n\t\t\t\tm2[k] = m[k]\n\t\t\t}\n\t\t}\n\t\tfor (const k in a) {\n\t\t\tif (k == 'allele') {\n\t\t\t\tm2.alt = a[k]\n\t\t\t} else if (k == 'info') {\n\t\t\t\tm2.altinfo = a[k]\n\t\t\t} else {\n\t\t\t\tm2[k] = a[k]\n\t\t\t}\n\t\t}\n\t\tif (!m2.issymbolicallele && m2.alt != 'NON_REF') {\n\t\t\tm2.type = getVariantType(m2.ref, m2.alt)\n\t\t\t/*\n\t\t\t// valid alt allele, apply Dr. J's cool method\n\t\t\tconst [p,ref,alt]=correctRefAlt(m2.pos, m2.ref, m2.alt)\n\t\t\tm2.pos=p\n\t\t\tm2.ref=ref\n\t\t\tm2.alt=alt\n\t\t\t*/\n\t\t}\n\t\tmlst.push(m2)\n\t}\n\treturn [\n\t\tbadinfokeys.length ? 'unknown info keys: ' + badinfokeys.join(',') : null,\n\t\tmlst,\n\t\taltinvalid.length > 0 ? altinvalid : null\n\t]\n}\n\nfunction correctRefAlt(p, ref, alt) {\n\t// for oligos, always trim the last identical base\n\twhile (ref.length > 1 && alt.length > 1 && ref[ref.length - 1] == alt[alt.length - 1]) {\n\t\tref = ref.substr(0, ref.length - 1)\n\t\talt = alt.substr(0, alt.length - 1)\n\t}\n\t// move position up as long as first positions are equal\n\twhile (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {\n\t\tref = ref.substr(1)\n\t\talt = alt.substr(1)\n\t\tp++\n\t}\n\treturn [p, ref, alt]\n}\n\nfunction parse_FORMAT2(lst, m, vcf) {\n\t/*\n\tm.alleles[0] is ref allele\n\n\teach allele:\n\t\t.ref\n\t\t.allele\n\t\t.allele_original\n\t\t.sampledata[] blank array\n\t*/\n\tconst formatfields = lst[9 - 1].split(':')\n\n\tfor (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {\n\t\t// for each sample\n\n\t\tconst valuelst = lst[_sampleidx].split(':')\n\t\t{\n\t\t\t// tell if this sample have any data in this line (variant), if .:., then skip\n\t\t\tlet none = true\n\t\t\tfor (const v of valuelst) {\n\t\t\t\tif (v != '.') {\n\t\t\t\t\tnone = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (none) {\n\t\t\t\t// this sample has no format value\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t/* should create an object of {format:value} of this sample\n\t\twith this object, for each alt allele this sample has,\n\t\tput a copy in m.allele[x].sampledata[]\n\t\t*/\n\n\t\tconst sampleidx = _sampleidx - 9\n\n\t\t/*\n\t\tfor each alt allele, initialize obj of this sample and store in this allele\n\t\tlater, to iterate over format fields and put in appropriate values\n\t\tnote that this sample may not actually have this allele\n\t\t*/\n\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\tconst sobj = {}\n\t\t\tif (vcf.samples && vcf.samples[sampleidx]) {\n\t\t\t\tfor (const k in vcf.samples[sampleidx]) {\n\t\t\t\t\tsobj[k] = vcf.samples[sampleidx][k]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsobj.name = 'missing_samplename_from_vcf_header'\n\t\t\t}\n\t\t\tm.alleles[i].sampledata.push({\n\t\t\t\tsampleobj: sobj\n\t\t\t})\n\t\t}\n\n\t\tfor (let fi = 0; fi < formatfields.length; fi++) {\n\t\t\t// for each field of this sample\n\n\t\t\tconst field = formatfields[fi]\n\t\t\tconst value = valuelst[fi]\n\t\t\tif (value == '.') {\n\t\t\t\t// no value for this field\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field == 'GT') {\n\t\t\t\tconst splitter = value.indexOf('/') != -1 ? '/' : '|'\n\t\t\t\tlet gtsum = 0 // for calculating gtallref=true, old\n\t\t\t\tlet unknowngt = false // if any is '.', then won't calculate gtallref\n\t\t\t\tconst gtalleles = []\n\t\t\t\tfor (const i of value.split(splitter)) {\n\t\t\t\t\tif (i == '.') {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tconst j = Number.parseInt(i)\n\t\t\t\t\tif (Number.isNaN(j)) {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tgtsum += j\n\t\t\t\t\tconst ale = m.alleles[j]\n\t\t\t\t\tif (ale) {\n\t\t\t\t\t\tgtalleles.push(ale.allele)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlet gtallref = false\n\t\t\t\tif (!unknowngt) {\n\t\t\t\t\tgtallref = gtsum == 0\n\t\t\t\t}\n\n\t\t\t\tconst genotype = gtalleles.join(splitter)\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tconst ms = m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1]\n\t\t\t\t\tms.GT = value\n\t\t\t\t\tms.genotype = genotype\n\t\t\t\t\tif (gtallref) {\n\t\t\t\t\t\tms.gtallref = true\n\t\t\t\t\t}\n\n\t\t\t\t\t// for mds vcf to drop out samples that do not have this alt allele\n\t\t\t\t\tms.__gtalleles = gtalleles\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// other data fields\n\t\t\tconst formatdesc = vcf.format ? vcf.format[field] : null\n\t\t\tif (!formatdesc) {\n\t\t\t\t// unspecified field, put to all alt alleles\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst isinteger = formatdesc.Type == 'Integer'\n\t\t\tconst isfloat = formatdesc.Type == 'Float'\n\n\t\t\tif ((formatdesc.Number && formatdesc.Number == 'R') || field == 'AD') {\n\t\t\t\t/*\n\t\t\t\tper-allele value, including ref\n\t\t\t\tv4.1 has AD not with \"R\", must process as R\n\t\t\t\t*/\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.ref] = fvlst[0]\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (formatdesc.Number && formatdesc.Number == 'A') {\n\t\t\t\t// per alt-allele value\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i - 1] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i - 1]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// otherwise, append this field to all alt\n\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t}\n\t\t}\n\t}\n\n\t// compatible with old ds: make allele2readcount from AD\n\tfor (const a of m.alleles) {\n\t\tfor (const s of a.sampledata) {\n\t\t\tif (s.AD) {\n\t\t\t\ts.allele2readcount = {}\n\t\t\t\tfor (const k in s.AD) {\n\t\t\t\t\ts.allele2readcount[k] = s.AD[k]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction tohash(s, hash) {\n\t/*\n\tparse INFO\n\t*/\n\tconst h = {},\n\t\terr = []\n\tlet prev = 0,\n\t\tprevdoublequote = false,\n\t\tk = null\n\tfor (let i = 0; i < s.length; i++) {\n\t\tif (s[i] == '\"') {\n\t\t\ti++\n\t\t\tconst thisstart = i\n\t\t\twhile (s[i] != '\"') {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif (k) {\n\t\t\t\th[k] = s.substring(thisstart, i)\n\t\t\t\tk = null\n\t\t\t} else {\n\t\t\t\terr.push('k undefined before double quotes')\n\t\t\t}\n\t\t\tprevdoublequote = true\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == '=') {\n\t\t\tk = s.substring(prev, i)\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == ',') {\n\t\t\tif (prevdoublequote) {\n\t\t\t\tprevdoublequote = false\n\t\t\t} else {\n\t\t\t\tif (k) {\n\t\t\t\t\th[k] = s.substring(prev, i)\n\t\t\t\t\tk = null\n\t\t\t\t} else {\n\t\t\t\t\terr.push('k undefined')\n\t\t\t\t}\n\t\t\t}\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t}\n\tif (k) {\n\t\th[k] = s.substring(prev, i)\n\t}\n\tif (h.ID) {\n\t\thash[h.ID] = h\n\t} else {\n\t\treturn 'no ID'\n\t}\n\tif (err.length) return err.join('\\n')\n}\n\nfunction parse_INFO(tmp, m, vcf) {\n\t/*\n\tthis function fills in both m.info{} and m.alleles[].info{}\n\n\tthe m.alleles[] will later be converted to [m], each carrying one alt allele\n\teach m will have .info{} for locus info, and .altinfo{} for alt allele info\n\n\t*/\n\n\tconst badinfokeys = []\n\n\tfor (const key in tmp) {\n\t\tif (vcf.info[key] == undefined) {\n\t\t\tbadinfokeys.push(key)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst value = tmp[key]\n\n\t\t////////////////// hard-coded fields\n\n\t\tif (key == 'CSQ') {\n\t\t\tconst okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif (key == 'ANN') {\n\t\t\tconst okay = parse_ANN(value, vcf.info.ANN.annheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t////////////////// end of hardcoded fields\n\n\t\tif (vcf.info[key].Type == 'Flag') {\n\t\t\t// flag has no value\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tconst __number = vcf.info[key].Number\n\t\tconst isinteger = vcf.info[key].Type == 'Integer'\n\t\tconst isfloat = vcf.info[key].Type == 'Float'\n\n\t\tif (__number == '0') {\n\t\t\t/*\n\t\t\tno value, should be a Flag\n\t\t\t*/\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'A') {\n\t\t\t/*\n\t\t\tper alt allele\n\t\t\t*/\n\t\t\tconst tt = value.split(',')\n\t\t\tfor (let j = 0; j < tt.length; j++) {\n\t\t\t\tif (m.alleles[j]) {\n\t\t\t\t\tm.alleles[j].info[key] = isinteger ? Number.parseInt(tt[j]) : isfloat ? Number.parseFloat(tt[j]) : tt[j]\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'R') {\n\t\t\t/*\n\t\t\tFIXME \"R\" is not considered, m.alleles only contain alt, which .info{} for each\n\t\t\tthe current datastructure does not support info for ref allele!\n\t\t\t*/\n\t\t}\n\n\t\tif (__number == '1') {\n\t\t\t/*\n\t\t\tsingle value\n\t\t\t*/\n\t\t\tm.info[key] = isinteger ? Number.parseInt(value) : isfloat ? Number.parseFloat(value) : value\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!value.split) {\n\t\t\t// unknown error\n\t\t\tcontinue\n\t\t}\n\n\t\t// number of values unknown, \"commas are permitted only as delimiters for lists of values\"\n\n\t\tconst lst = value.split(',') // value is always array!!\n\t\tif (isinteger) {\n\t\t\tm.info[key] = lst.map(Number.parseInt)\n\t\t} else if (isfloat) {\n\t\t\tm.info[key] = lst.map(Number.parseFloat)\n\t\t} else {\n\t\t\tm.info[key] = lst\n\t\t}\n\t}\n\treturn badinfokeys\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["tmp", "alt", "i"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { mclassdeletion, mclasssnv, mclassmnv, mclassinsertion, mclassnonstandard } from "./common.js";
|
|
2
|
+
function getVariantType(ref, alt) {
|
|
3
|
+
if (ref.length == 1 && alt.length == 1) {
|
|
4
|
+
if (alt == ".") {
|
|
5
|
+
return mclassdeletion;
|
|
6
|
+
}
|
|
7
|
+
return mclasssnv;
|
|
8
|
+
}
|
|
9
|
+
if (ref.length == alt.length) return mclassmnv;
|
|
10
|
+
if (ref.length < alt.length) return mclassinsertion;
|
|
11
|
+
if (ref.length > alt.length) return mclassdeletion;
|
|
12
|
+
return mclassnonstandard;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
getVariantType
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=vcf.type.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/vcf.type.js"],
|
|
4
|
+
"sourcesContent": ["import { mclassdeletion, mclasssnv, mclassmnv, mclassinsertion, mclassnonstandard } from './common.js'\n\nexport function getVariantType(ref, alt) {\n\tif (ref.length == 1 && alt.length == 1) {\n\t\t// both alleles length of 1\n\t\tif (alt == '.') {\n\t\t\t// alt is missing\n\t\t\treturn mclassdeletion\n\t\t}\n\t\t// snv\n\t\treturn mclasssnv\n\t}\n\tif (ref.length == alt.length) return mclassmnv\n\t// FIXME only when empty length of one allele\n\tif (ref.length < alt.length) return mclassinsertion\n\tif (ref.length > alt.length) return mclassdeletion\n\treturn mclassnonstandard\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,gBAAgB,WAAW,WAAW,iBAAiB,yBAAyB;AAElF,SAAS,eAAe,KAAK,KAAK;AACxC,MAAI,IAAI,UAAU,KAAK,IAAI,UAAU,GAAG;AAEvC,QAAI,OAAO,KAAK;AAEf,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AACA,MAAI,IAAI,UAAU,IAAI,OAAQ,QAAO;AAErC,MAAI,IAAI,SAAS,IAAI,OAAQ,QAAO;AACpC,MAAI,IAAI,SAAS,IAAI,OAAQ,QAAO;AACpC,SAAO;AACR;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,30 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sjcrh/proteinpaint-shared",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.188.1",
|
|
4
4
|
"description": "ProteinPaint code that is shared between server and client-side workspaces",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "src/index.js",
|
|
6
|
+
"main": "dist/src/index.js",
|
|
7
7
|
"imports": {
|
|
8
8
|
"#types": "@sjcrh/proteinpaint-types",
|
|
9
|
-
"#types/*": "@sjcrh/proteinpaint-types/*"
|
|
9
|
+
"#types/*": "@sjcrh/proteinpaint-types/*",
|
|
10
|
+
"#types/checkers": "@sjcrh/proteinpaint-types/checkers"
|
|
10
11
|
},
|
|
12
|
+
"//": "all export aliases below are meant for runtime code, except for devTs-aliased subpaths",
|
|
11
13
|
"exports": {
|
|
12
|
-
".": "./src/index.js",
|
|
13
|
-
"./*.ts": "
|
|
14
|
-
"
|
|
14
|
+
".": "./dist/src/index.js",
|
|
15
|
+
"./*.ts": "./*.ts_SHOULD_BE_js",
|
|
16
|
+
"./constants/*.ts": "./dist/constants/*.ts_SHOULD_BE_js",
|
|
17
|
+
"./*": "./dist/src/*",
|
|
18
|
+
"./constants/*": "./dist/constants/*",
|
|
19
|
+
"./devTs": "./devTs.ts",
|
|
20
|
+
"./devTs/*": "./constants/*"
|
|
15
21
|
},
|
|
16
22
|
"scripts": {
|
|
17
|
-
"build": "esbuild src/*.ts --platform=node --outdir=
|
|
18
|
-
"prepack": "npm run build",
|
|
23
|
+
"build": "esbuild src/*.* constants/*.ts --platform=node --outdir=dist --format=esm --sourcemap",
|
|
24
|
+
"prepack": "rm -rf dist && npm run build && tsc --sourcemap --skipLibCheck --preserveWatchOutput",
|
|
25
|
+
"dev": "rm -rf dist && concurrently 'npm run build -- --watch' 'npx tsc --watch --skipLibCheck --preserveWatchOutput'",
|
|
19
26
|
"pretest": "mkdir -p test && node emitImports > test/internals-test.ts",
|
|
20
|
-
"spec:coverage": "node test/relevant.js",
|
|
21
27
|
"test": "tsx test/internals-test.ts",
|
|
22
|
-
"test-x": "ls src/test/*.spec* | xargs -I % bash -c '{ tsx %; sleep 0.001; }'"
|
|
28
|
+
"test-x": "ls src/test/*.spec* | xargs -I % bash -c '{ tsx %; sleep 0.001; }'",
|
|
29
|
+
"spec:coverage": "node test/relevant.js"
|
|
23
30
|
},
|
|
24
31
|
"author": "",
|
|
25
32
|
"license": "ISC",
|
|
26
33
|
"files": [
|
|
27
|
-
"
|
|
34
|
+
"constants",
|
|
35
|
+
"devTs.ts",
|
|
36
|
+
"dist"
|
|
28
37
|
],
|
|
29
38
|
"devDependencies": {
|
|
30
39
|
"esbuild": "^0.25.9"
|
package/src/bulk.cnv.js
DELETED
|
@@ -1,86 +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 CNV"
|
|
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("cnv")
|
|
24
|
-
if (i == -1) return "CNV missing from header"
|
|
25
|
-
header[i] = "cnv"
|
|
26
|
-
i = htry("sample", "sample_name", "tumor_sample_barcode")
|
|
27
|
-
if (i != -1) header[i] = "sample"
|
|
28
|
-
i = htry("patient", "donor", "target_case_id")
|
|
29
|
-
if (i != -1) header[i] = "patient"
|
|
30
|
-
i = htry("disease")
|
|
31
|
-
if (i != -1) header[i] = "disease"
|
|
32
|
-
i = htry("origin")
|
|
33
|
-
if (i != -1) header[i] = "origin"
|
|
34
|
-
i = htry("sampletype", "sample type", "sample_type")
|
|
35
|
-
if (i != -1) header[i] = "sampletype"
|
|
36
|
-
flag.cnv.header = header
|
|
37
|
-
flag.cnv.loaded = true
|
|
38
|
-
return false
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
export function parseline(i, line, flag) {
|
|
42
|
-
if (line == "" || line[0] == "#") return
|
|
43
|
-
const lst = line.split("\t")
|
|
44
|
-
const m = {}
|
|
45
|
-
for (let j = 0; j < flag.cnv.header.length; j++) {
|
|
46
|
-
m[flag.cnv.header[j]] = lst[j]
|
|
47
|
-
}
|
|
48
|
-
if (!m.gene) {
|
|
49
|
-
flag.cnv.badlines.push([i, "missing gene", lst])
|
|
50
|
-
return
|
|
51
|
-
}
|
|
52
|
-
if (!m.cnv) {
|
|
53
|
-
flag.cnv.badlines.push([i, "missing cnv value", lst])
|
|
54
|
-
return
|
|
55
|
-
}
|
|
56
|
-
const value = m.cnv.toLowerCase()
|
|
57
|
-
switch (value) {
|
|
58
|
-
case "amplification":
|
|
59
|
-
case "gain":
|
|
60
|
-
m.class = common.mclasscnvgain
|
|
61
|
-
break
|
|
62
|
-
case "deletion":
|
|
63
|
-
case "loss":
|
|
64
|
-
m.class = common.mclasscnvloss
|
|
65
|
-
break
|
|
66
|
-
case "loh":
|
|
67
|
-
m.class = common.mclasscnvloh
|
|
68
|
-
break
|
|
69
|
-
default:
|
|
70
|
-
flag.cnv.badlines.push([i, "invalid cnv value: " + m.cnv, lst])
|
|
71
|
-
m.class = null
|
|
72
|
-
}
|
|
73
|
-
if (!m.class) {
|
|
74
|
-
return
|
|
75
|
-
}
|
|
76
|
-
if (bulk.parsesample(m, flag, i, lst, flag.cnv.badlines)) {
|
|
77
|
-
return
|
|
78
|
-
}
|
|
79
|
-
m.dt = common.dtcnv
|
|
80
|
-
flag.good++
|
|
81
|
-
const n = flag.geneToUpper ? m.gene.toUpperCase() : m.gene
|
|
82
|
-
if (!(n in flag.data)) {
|
|
83
|
-
flag.data[n] = []
|
|
84
|
-
}
|
|
85
|
-
flag.data[n].push(m)
|
|
86
|
-
}
|