@sjcrh/proteinpaint-server 2.44.0 → 2.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dataset/clinvar.hg19.js +53 -52
  2. package/dataset/clinvar.hg38.js +74 -73
  3. package/dataset/clinvar.js +164 -47
  4. package/dataset/termdb.test.js +257 -0
  5. package/genome/CriGri.js +1859 -27
  6. package/genome/cgc.js +743 -7
  7. package/genome/danRer10.js +1108 -46
  8. package/genome/dm3.js +71 -44
  9. package/genome/dm6.js +1926 -45
  10. package/genome/galGal5.js +23522 -46
  11. package/genome/galGal6.js +512 -46
  12. package/genome/hg19.js +293 -198
  13. package/genome/hg38.js +472 -105
  14. package/genome/hg38.test.js +406 -40
  15. package/genome/hgvirus.js +45 -20
  16. package/genome/mm10.js +135 -67
  17. package/genome/mm9.js +116 -79
  18. package/genome/rn6.js +1002 -47
  19. package/package.json +31 -35
  20. package/routes/_template_.js +30 -0
  21. package/routes/burden.js +149 -0
  22. package/routes/dataset.js +266 -0
  23. package/routes/dsdata.js +127 -0
  24. package/routes/gdc.maf.js +120 -0
  25. package/routes/gdc.mafBuild.js +106 -0
  26. package/routes/gdc.topMutatedGenes.js +465 -0
  27. package/routes/gene2canonicalisoform.js +41 -0
  28. package/routes/genelookup.js +52 -0
  29. package/routes/genomes.js +144 -0
  30. package/routes/healthcheck.js +30 -0
  31. package/routes/hicdata.js +98 -0
  32. package/routes/hicstat.js +55 -0
  33. package/routes/isoformlst.js +57 -0
  34. package/routes/ntseq.js +43 -0
  35. package/routes/pdomain.js +61 -0
  36. package/routes/snp.js +107 -0
  37. package/routes/termdb.categories.js +209 -0
  38. package/routes/termdb.cluster.js +228 -0
  39. package/routes/termdb.cohort.summary.js +38 -0
  40. package/routes/termdb.cohorts.js +49 -0
  41. package/routes/termdb.config.js +201 -0
  42. package/routes/termdb.getdescrstats.js +102 -0
  43. package/routes/termdb.getnumericcategories.js +92 -0
  44. package/routes/termdb.getpercentile.js +108 -0
  45. package/routes/termdb.getrootterm.js +65 -0
  46. package/routes/termdb.gettermchildren.js +67 -0
  47. package/routes/termdb.singleSampleMutation.js +80 -0
  48. package/routes/termdb.singlecellData.js +46 -0
  49. package/routes/termdb.singlecellSamples.js +160 -0
  50. package/routes/termdb.termsbyids.js +59 -0
  51. package/routes/termdb.topVariablyExpressedGenes.js +171 -0
  52. package/routes/termdb.violin.js +77 -0
  53. package/src/app.js +41498 -0
  54. package/src/serverconfig.js +14 -8
  55. package/start.js +3 -3
  56. package/routes/README.md +0 -84
  57. package/routes/burden.ts +0 -143
  58. package/routes/gdc.maf.ts +0 -195
  59. package/routes/gdc.mafBuild.ts +0 -114
  60. package/routes/gdc.topMutatedGenes.ts +0 -586
  61. package/routes/genelookup.ts +0 -50
  62. package/routes/healthcheck.ts +0 -29
  63. package/routes/hicdata.ts +0 -111
  64. package/routes/hicstat.ts +0 -55
  65. package/routes/termdb.categories.ts +0 -245
  66. package/routes/termdb.cluster.ts +0 -248
  67. package/routes/termdb.getdescrstats.ts +0 -102
  68. package/routes/termdb.getnumericcategories.ts +0 -99
  69. package/routes/termdb.getpercentile.ts +0 -118
  70. package/routes/termdb.getrootterm.ts +0 -73
  71. package/routes/termdb.gettermchildren.ts +0 -82
  72. package/routes/termdb.singleSampleMutation.ts +0 -87
  73. package/routes/termdb.singlecellData.ts +0 -49
  74. package/routes/termdb.singlecellSamples.ts +0 -175
  75. package/routes/termdb.termsbyids.ts +0 -63
  76. package/routes/termdb.topVariablyExpressedGenes.ts +0 -214
  77. package/routes/termdb.violin.ts +0 -77
  78. package/server.js +0 -2
  79. package/server.js.map +0 -1
  80. package/shared/common.js +0 -1080
  81. package/shared/termdb.initbinconfig.js +0 -96
  82. package/shared/vcf.js +0 -629
@@ -0,0 +1,120 @@
1
+ import path from "path";
2
+ import got from "got";
3
+ import serverconfig from "#src/serverconfig.js";
4
+ const maxFileNumber = 1e3;
5
+ const allowedWorkflowType = "Aliquot Ensemble Somatic Variant Merging and Masking";
6
+ const maxTotalSizeCompressed = serverconfig.features.gdcMafMaxFileSize || 4e8;
7
+ const api = {
8
+ endpoint: "gdc/maf",
9
+ methods: {
10
+ all: {
11
+ init,
12
+ request: {
13
+ typeId: "GdcMafRequest"
14
+ },
15
+ response: {
16
+ typeId: "GdcMafResponse"
17
+ // will combine this with type checker
18
+ //valid: (t) => {}
19
+ },
20
+ examples: [
21
+ {
22
+ request: {
23
+ body: {
24
+ experimentalStrategy: "WXS",
25
+ embedder: "localhost"
26
+ }
27
+ },
28
+ response: {
29
+ header: { status: 200 }
30
+ }
31
+ }
32
+ ]
33
+ }
34
+ }
35
+ };
36
+ function init({ genomes }) {
37
+ return async (req, res) => {
38
+ try {
39
+ const g = genomes.hg38;
40
+ if (!g)
41
+ throw "hg38 missing";
42
+ const ds = g.datasets.GDC;
43
+ if (!ds)
44
+ throw "hg38 GDC missing";
45
+ const payload = await listMafFiles(req.query, ds);
46
+ res.send(payload);
47
+ } catch (e) {
48
+ res.send({ status: "error", error: e.message || e });
49
+ }
50
+ };
51
+ }
52
+ async function listMafFiles(q, ds) {
53
+ const filters = {
54
+ op: "and",
55
+ content: [
56
+ { op: "=", content: { field: "data_format", value: "MAF" } },
57
+ { op: "=", content: { field: "experimental_strategy", value: q.experimentalStrategy } },
58
+ { op: "=", content: { field: "analysis.workflow_type", value: allowedWorkflowType } },
59
+ { op: "=", content: { field: "access", value: "open" } }
60
+ // delete if later to support controlled files
61
+ ]
62
+ };
63
+ const case_filters = { op: "and", content: [] };
64
+ if (q.filter0) {
65
+ case_filters.content.push(q.filter0);
66
+ }
67
+ const { host, headers } = ds.getHostHeaders(q);
68
+ const data = {
69
+ filters,
70
+ case_filters,
71
+ size: maxFileNumber,
72
+ fields: [
73
+ "id",
74
+ "file_size",
75
+ "cases.project.project_id",
76
+ // for display only
77
+ "cases.submitter_id",
78
+ // used when listing all cases & files
79
+ "cases.samples.sample_type"
80
+ // may add diagnosis and primary site
81
+ ].join(",")
82
+ };
83
+ const response = await got.post(path.join(host.rest, "files"), { headers, body: JSON.stringify(data) });
84
+ let re;
85
+ try {
86
+ re = JSON.parse(response.body);
87
+ } catch (e) {
88
+ throw "invalid JSON from " + api.endpoint;
89
+ }
90
+ if (!Number.isInteger(re.data?.pagination?.total))
91
+ throw "re.data.pagination.total is not int";
92
+ if (!Array.isArray(re.data?.hits))
93
+ throw "re.data.hits[] not array";
94
+ const files = [];
95
+ for (const h of re.data.hits) {
96
+ const c = h.cases?.[0];
97
+ if (!c)
98
+ throw "h.cases[0] missing";
99
+ const file = {
100
+ id: h.id,
101
+ project_id: c.project.project_id,
102
+ file_size: h.file_size
103
+ };
104
+ file.case_submitter_id = c.submitter_id;
105
+ if (c.samples) {
106
+ file.sample_types = c.samples.map((i) => i.sample_type).sort();
107
+ }
108
+ files.push(file);
109
+ }
110
+ const result = {
111
+ files,
112
+ filesTotal: re.data.pagination.total,
113
+ maxTotalSizeCompressed
114
+ };
115
+ return result;
116
+ }
117
+ export {
118
+ api,
119
+ maxTotalSizeCompressed
120
+ };
@@ -0,0 +1,106 @@
1
+ import got from "got";
2
+ import path from "path";
3
+ import { run_rust_stream } from "@sjcrh/proteinpaint-rust";
4
+ import serverconfig from "#src/serverconfig.js";
5
+ import { maxTotalSizeCompressed } from "./gdc.maf.ts";
6
+ const api = {
7
+ endpoint: "gdc/mafBuild",
8
+ methods: {
9
+ all: {
10
+ init,
11
+ request: {
12
+ typeId: "GdcMafBuildRequest"
13
+ },
14
+ response: {
15
+ typeId: null
16
+ // 'GdcMafBuildResponse'
17
+ }
18
+ }
19
+ }
20
+ };
21
+ function init({ genomes }) {
22
+ return async (req, res) => {
23
+ try {
24
+ const g = genomes.hg38;
25
+ if (!g)
26
+ throw "hg38 missing";
27
+ const ds = g.datasets.GDC;
28
+ if (!ds)
29
+ throw "hg38 GDC missing";
30
+ await buildMaf(req.query, res, ds);
31
+ } catch (e) {
32
+ if (e.stack)
33
+ console.log(e.stack);
34
+ res.send({ status: "error", error: e.message || e });
35
+ }
36
+ };
37
+ }
38
+ async function buildMaf(q, res, ds) {
39
+ const t0 = Date.now();
40
+ const { host, headers } = ds.getHostHeaders(q);
41
+ const fileLst2 = await getFileLstUnderSizeLimit(q.fileIdLst, host, headers);
42
+ if (serverconfig.debugmode)
43
+ console.log(
44
+ `${fileLst2.length} out of ${q.fileIdLst.length} input MAF files accepted by size limit`,
45
+ Date.now() - t0
46
+ );
47
+ const arg = {
48
+ fileIdLst: fileLst2,
49
+ columns: q.columns,
50
+ host: path.join(host.rest, "data")
51
+ // must use the /data/ endpoint from current host
52
+ };
53
+ const rustStream = run_rust_stream("gdcmaf", JSON.stringify(arg));
54
+ res.setHeader("Content-Type", "application/octet-stream");
55
+ res.setHeader("Content-Disposition", "attachment; filename=cohort.maf.gz");
56
+ rustStream.pipe(res);
57
+ rustStream.on("end", () => {
58
+ if (serverconfig.debugmode)
59
+ console.log("rust gdcmaf", Date.now() - t0);
60
+ res.end();
61
+ });
62
+ rustStream.on("error", (err) => {
63
+ console.error(err);
64
+ res.statusCode = 500;
65
+ res.end("Internal Server Error");
66
+ });
67
+ }
68
+ async function getFileLstUnderSizeLimit(lst, host, headers) {
69
+ if (lst.length == 0)
70
+ throw "fileIdLst[] not array or blank";
71
+ const data = {
72
+ filters: {
73
+ op: "in",
74
+ content: { field: "file_id", value: lst }
75
+ },
76
+ size: 1e4,
77
+ fields: "file_size"
78
+ };
79
+ const response = await got.post(path.join(host.rest, "files"), { headers, body: JSON.stringify(data) });
80
+ let re;
81
+ try {
82
+ re = JSON.parse(response.body);
83
+ } catch (e) {
84
+ throw "invalid json from getFileLstUnderSizeLimit";
85
+ }
86
+ if (!Array.isArray(re.data?.hits))
87
+ throw "re.data.hits[] not array";
88
+ const out = [];
89
+ let cumsize = 0;
90
+ for (const h of re.data.hits) {
91
+ if (cumsize >= maxTotalSizeCompressed)
92
+ break;
93
+ if (!h.id)
94
+ throw ".id missing";
95
+ if (!Number.isInteger(h.file_size))
96
+ throw ".file_size not integer";
97
+ cumsize += h.file_size;
98
+ out.push(h.id);
99
+ }
100
+ if (out.length == 0)
101
+ throw "no file available";
102
+ return out;
103
+ }
104
+ export {
105
+ api
106
+ };
@@ -0,0 +1,465 @@
1
+ import { mclasscnvgain, mclasscnvloss, dtsnvindel } from "#shared/common.js";
2
+ import got from "got";
3
+ import serverconfig from "#src/serverconfig.js";
4
+ const api = {
5
+ endpoint: "gdc/topMutatedGenes",
6
+ methods: {
7
+ all: {
8
+ init,
9
+ request: {
10
+ typeId: "GdcTopMutatedGeneRequest"
11
+ },
12
+ response: {
13
+ typeId: "GdcTopMutatedGeneResponse"
14
+ }
15
+ }
16
+ }
17
+ };
18
+ function init({ genomes }) {
19
+ return async (req, res) => {
20
+ const q = req.query;
21
+ const g = genomes.hg38;
22
+ if (!g)
23
+ throw "hg38 missing";
24
+ const ds = g.datasets.GDC;
25
+ if (!ds)
26
+ throw "hg38 GDC missing";
27
+ try {
28
+ const genes = await getGenesGraphql(q, ds);
29
+ const payload = { genes };
30
+ res.send(payload);
31
+ } catch (e) {
32
+ res.send({ status: "error", error: e.message || e });
33
+ }
34
+ };
35
+ }
36
+ const queryV1 = {
37
+ query: `
38
+ query GenesTable_relayQuery(
39
+ $genesTable_filters: FiltersArgument
40
+ $genesTable_size: Int
41
+ $genesTable_offset: Int
42
+ $score: String
43
+ $ssmCase: FiltersArgument
44
+ $geneCaseFilter: FiltersArgument
45
+ $ssmTested: FiltersArgument
46
+ $cnvTested: FiltersArgument
47
+ $cnvGainFilters: FiltersArgument
48
+ $cnvLossFilters: FiltersArgument
49
+ ) {
50
+ genesTableViewer: viewer {
51
+ explore {
52
+ cases {
53
+ hits(first: 0, filters: $ssmTested) {
54
+ total
55
+ }
56
+ }
57
+ filteredCases: cases {
58
+ hits(first: 0, filters: $geneCaseFilter) {
59
+ total
60
+ }
61
+ }
62
+ cnvCases: cases {
63
+ hits(first: 0, filters: $cnvTested) {
64
+ total
65
+ }
66
+ }
67
+ genes {
68
+ hits(first: $genesTable_size, offset: $genesTable_offset, filters: $genesTable_filters, score: $score) {
69
+ total
70
+ edges {
71
+ node {
72
+ id
73
+ numCases: score
74
+ symbol
75
+ name
76
+ cytoband
77
+ biotype
78
+ gene_id
79
+ is_cancer_gene_census
80
+ ssm_case: case {
81
+ hits(first: 0, filters: $ssmCase) {
82
+ total
83
+ }
84
+ }
85
+ cnv_case: case {
86
+ hits(first: 0, filters: $cnvTested) {
87
+ total
88
+ }
89
+ }
90
+ case_cnv_gain: case {
91
+ hits(first: 0, filters: $cnvGainFilters) {
92
+ total
93
+ }
94
+ }
95
+ case_cnv_loss: case {
96
+ hits(first: 0, filters: $cnvLossFilters) {
97
+ total
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+ `,
108
+ getVariables: (q) => {
109
+ const variables = {
110
+ genesTable_filters: { op: "and", content: [] },
111
+ genesTable_size: q.maxGenes || 50,
112
+ genesTable_offset: 0,
113
+ score: "case.project.project_id",
114
+ ssmCase: {
115
+ op: "and",
116
+ content: [
117
+ {
118
+ op: "in",
119
+ content: {
120
+ field: "cases.available_variation_data",
121
+ value: ["ssm"]
122
+ }
123
+ },
124
+ {
125
+ op: "NOT",
126
+ content: {
127
+ field: "genes.case.ssm.observation.observation_id",
128
+ value: "MISSING"
129
+ }
130
+ }
131
+ ]
132
+ },
133
+ geneCaseFilter: {
134
+ content: [
135
+ {
136
+ content: {
137
+ field: "cases.available_variation_data",
138
+ value: ["ssm"]
139
+ },
140
+ op: "in"
141
+ }
142
+ ],
143
+ op: "and"
144
+ },
145
+ ssmTested: {
146
+ content: [
147
+ {
148
+ content: {
149
+ field: "cases.available_variation_data",
150
+ value: ["ssm"]
151
+ },
152
+ op: "in"
153
+ }
154
+ ],
155
+ op: "and"
156
+ },
157
+ cnvTested: {
158
+ op: "and",
159
+ content: [
160
+ {
161
+ content: {
162
+ field: "cases.available_variation_data",
163
+ value: ["cnv"]
164
+ },
165
+ op: "in"
166
+ }
167
+ ]
168
+ },
169
+ cnvGainFilters: {
170
+ op: "and",
171
+ content: [
172
+ {
173
+ content: {
174
+ field: "cases.available_variation_data",
175
+ value: ["cnv"]
176
+ },
177
+ op: "in"
178
+ },
179
+ {
180
+ content: {
181
+ field: "cnvs.cnv_change",
182
+ value: ["Gain"]
183
+ },
184
+ op: "in"
185
+ }
186
+ ]
187
+ },
188
+ cnvLossFilters: {
189
+ op: "and",
190
+ content: [
191
+ {
192
+ content: {
193
+ field: "cases.available_variation_data",
194
+ value: ["cnv"]
195
+ },
196
+ op: "in"
197
+ },
198
+ {
199
+ content: {
200
+ field: "cnvs.cnv_change",
201
+ value: ["Loss"]
202
+ },
203
+ op: "in"
204
+ }
205
+ ]
206
+ }
207
+ };
208
+ if (q.filter0) {
209
+ variables.genesTable_filters.content.push(JSON.parse(JSON.stringify(q.filter0)));
210
+ variables.geneCaseFilter.content.push(JSON.parse(JSON.stringify(q.filter0)));
211
+ variables.cnvTested.content.push(JSON.parse(JSON.stringify(q.filter0)));
212
+ variables.cnvGainFilters.content.push(JSON.parse(JSON.stringify(q.filter0)));
213
+ variables.cnvLossFilters.content.push(JSON.parse(JSON.stringify(q.filter0)));
214
+ }
215
+ if (q.geneFilter == "CGC") {
216
+ variables.genesTable_filters.content.push(geneCGC());
217
+ variables.geneCaseFilter.content.push(geneCGC());
218
+ variables.cnvTested.content.push(geneCGC());
219
+ variables.cnvGainFilters.content.push(geneCGC());
220
+ variables.cnvLossFilters.content.push(geneCGC());
221
+ }
222
+ return variables;
223
+ }
224
+ };
225
+ const queryV2 = {
226
+ query: `
227
+ query GenesTable(
228
+ $caseFilters: FiltersArgument
229
+ $genesTable_filters: FiltersArgument
230
+ $genesTable_size: Int
231
+ $genesTable_offset: Int
232
+ $score: String
233
+ $ssmCase: FiltersArgument
234
+ $geneCaseFilter: FiltersArgument
235
+ $ssmTested: FiltersArgument
236
+ $cnvTested: FiltersArgument
237
+ $cnvGainFilters: FiltersArgument
238
+ $cnvLossFilters: FiltersArgument
239
+ $sort: [Sort]
240
+ ) {
241
+ genesTableViewer: viewer {
242
+ explore {
243
+ cases {
244
+ hits(first: 0, case_filters: $ssmTested) {
245
+ total
246
+ }
247
+ }
248
+ filteredCases: cases {
249
+ hits(first: 0, case_filters: $geneCaseFilter) {
250
+ total
251
+ }
252
+ }
253
+ cnvCases: cases {
254
+ hits(first: 0, case_filters: $cnvTested) {
255
+ total
256
+ }
257
+ }
258
+ genes {
259
+ hits(
260
+ first: $genesTable_size
261
+ offset: $genesTable_offset
262
+ filters: $genesTable_filters
263
+ case_filters: $caseFilters
264
+ score: $score
265
+ sort: $sort
266
+ ) {
267
+ total
268
+ edges {
269
+ node {
270
+ id
271
+ numCases: score
272
+ symbol
273
+ name
274
+ cytoband
275
+ biotype
276
+ gene_id
277
+ is_cancer_gene_census
278
+ ssm_case: case {
279
+ hits(first: 0, filters: $ssmCase) {
280
+ total
281
+ }
282
+ }
283
+ cnv_case: case {
284
+ hits(first: 0, filters: $cnvTested) {
285
+ total
286
+ }
287
+ }
288
+ case_cnv_gain: case {
289
+ hits(first: 0, filters: $cnvGainFilters) {
290
+ total
291
+ }
292
+ }
293
+ case_cnv_loss: case {
294
+ hits(first: 0, filters: $cnvLossFilters) {
295
+ total
296
+ }
297
+ }
298
+ }
299
+ }
300
+ }
301
+ }
302
+ }
303
+ }
304
+ }`,
305
+ getVariables: (q) => {
306
+ const variables = {
307
+ caseFilters: { op: "and", content: [] },
308
+ genesTable_filters: { op: "and", content: [] },
309
+ genesTable_size: q.maxGenes || 50,
310
+ genesTable_offset: 0,
311
+ score: "case.project.project_id",
312
+ ssmCase: {
313
+ op: "and",
314
+ content: [
315
+ {
316
+ op: "in",
317
+ content: {
318
+ field: "cases.available_variation_data",
319
+ value: ["ssm"]
320
+ }
321
+ },
322
+ {
323
+ op: "NOT",
324
+ content: {
325
+ field: "genes.case.ssm.observation.observation_id",
326
+ value: "MISSING"
327
+ }
328
+ }
329
+ ]
330
+ },
331
+ geneCaseFilter: {
332
+ content: [
333
+ {
334
+ content: {
335
+ field: "cases.available_variation_data",
336
+ value: ["ssm"]
337
+ },
338
+ op: "in"
339
+ }
340
+ ],
341
+ op: "and"
342
+ },
343
+ ssmTested: {
344
+ content: [
345
+ {
346
+ content: {
347
+ field: "cases.available_variation_data",
348
+ value: ["ssm"]
349
+ },
350
+ op: "in"
351
+ }
352
+ ],
353
+ op: "and"
354
+ },
355
+ cnvTested: {
356
+ op: "and",
357
+ content: [
358
+ {
359
+ content: {
360
+ field: "cases.available_variation_data",
361
+ value: ["cnv"]
362
+ },
363
+ op: "in"
364
+ }
365
+ ]
366
+ },
367
+ cnvGainFilters: {
368
+ op: "and",
369
+ content: [
370
+ {
371
+ content: {
372
+ field: "cases.available_variation_data",
373
+ value: ["cnv"]
374
+ },
375
+ op: "in"
376
+ },
377
+ {
378
+ content: {
379
+ field: "cnvs.cnv_change",
380
+ value: ["Gain"]
381
+ },
382
+ op: "in"
383
+ }
384
+ ]
385
+ },
386
+ cnvLossFilters: {
387
+ op: "and",
388
+ content: [
389
+ {
390
+ content: {
391
+ field: "cases.available_variation_data",
392
+ value: ["cnv"]
393
+ },
394
+ op: "in"
395
+ },
396
+ {
397
+ content: {
398
+ field: "cnvs.cnv_change",
399
+ value: ["Loss"]
400
+ },
401
+ op: "in"
402
+ }
403
+ ]
404
+ }
405
+ };
406
+ if (q.filter0) {
407
+ variables.caseFilters.content.push(JSON.parse(JSON.stringify(q.filter0)));
408
+ variables.geneCaseFilter.content.push(JSON.parse(JSON.stringify(q.filter0)));
409
+ variables.cnvLossFilters.content.push(JSON.parse(JSON.stringify(q.filter0)));
410
+ variables.cnvGainFilters.content.push(JSON.parse(JSON.stringify(q.filter0)));
411
+ variables.cnvTested.content.push(JSON.parse(JSON.stringify(q.filter0)));
412
+ }
413
+ if (q.geneFilter == "CGC") {
414
+ variables.genesTable_filters.content.push(geneCGC());
415
+ variables.cnvLossFilters.content.push(geneCGC());
416
+ variables.cnvGainFilters.content.push(geneCGC());
417
+ }
418
+ return variables;
419
+ }
420
+ };
421
+ async function getGenesGraphql(q, ds) {
422
+ let query, variables;
423
+ const { host, headers } = ds.getHostHeaders(q);
424
+ if (serverconfig.features?.geneExpHost) {
425
+ query = queryV1.query;
426
+ variables = queryV1.getVariables(q);
427
+ } else {
428
+ query = queryV2.query;
429
+ variables = queryV2.getVariables(q);
430
+ }
431
+ const response = await got.post(host.graphql, {
432
+ headers,
433
+ body: JSON.stringify({ query, variables })
434
+ });
435
+ const re = JSON.parse(response.body);
436
+ const genes = [];
437
+ for (const g of re.data.genesTableViewer.explore.genes.hits.edges) {
438
+ if (typeof g.node != "object")
439
+ throw "node missing from re.data.genesTableViewer.explore.genes.hits.edges[]";
440
+ const mutationStat = [];
441
+ if (Number.isInteger(g.node.case_cnv_gain?.hits?.total) && g.node.case_cnv_gain.hits.total > 0)
442
+ mutationStat.push({ class: mclasscnvgain, count: g.node.case_cnv_gain.hits.total });
443
+ if (Number.isInteger(g.node.case_cnv_loss?.hits?.total) && g.node.case_cnv_loss.hits.total > 0)
444
+ mutationStat.push({ class: mclasscnvloss, count: g.node.case_cnv_loss.hits.total });
445
+ if (Number.isInteger(g.node.ssm_case?.hits?.total) && g.node.ssm_case.hits.total > 0)
446
+ mutationStat.push({ dt: dtsnvindel, count: g.node.ssm_case.hits.total });
447
+ genes.push({
448
+ gene: g.node.symbol,
449
+ mutationStat
450
+ });
451
+ }
452
+ return genes;
453
+ }
454
+ function geneCGC() {
455
+ return {
456
+ content: {
457
+ field: "genes.is_cancer_gene_census",
458
+ value: ["true"]
459
+ },
460
+ op: "in"
461
+ };
462
+ }
463
+ export {
464
+ api
465
+ };