@sjcrh/proteinpaint-server 2.58.0 → 2.59.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.
- package/package.json +2 -2
- package/routes/termdb.categories.js +10 -31
- package/routes/termdb.cluster.js +9 -8
- package/routes/termdb.getdescrstats.js +12 -16
- package/src/app.js +579 -524
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sjcrh/proteinpaint-server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.59.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "a genomics visualization tool for exploring a cohort's genotype and phenotype data",
|
|
6
6
|
"main": "src/app.js",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@sjcrh/augen": "2.46.0",
|
|
64
|
-
"@sjcrh/proteinpaint-rust": "2.
|
|
64
|
+
"@sjcrh/proteinpaint-rust": "2.59.0",
|
|
65
65
|
"better-sqlite3": "^9.4.1",
|
|
66
66
|
"body-parser": "^1.15.2",
|
|
67
67
|
"canvas": "~2.11.2",
|
|
@@ -19,14 +19,7 @@ const api = {
|
|
|
19
19
|
dslabel: "TermdbTest",
|
|
20
20
|
embedder: "localhost",
|
|
21
21
|
getcategories: 1,
|
|
22
|
-
|
|
23
|
-
term1_q: {
|
|
24
|
-
isAtomic: true,
|
|
25
|
-
hiddenValues: {},
|
|
26
|
-
type: "values",
|
|
27
|
-
groupsetting: { disabled: true },
|
|
28
|
-
mode: "discrete"
|
|
29
|
-
},
|
|
22
|
+
term: { id: "diaggrp" },
|
|
30
23
|
filter: {
|
|
31
24
|
type: "tvslst",
|
|
32
25
|
in: true,
|
|
@@ -85,22 +78,8 @@ function init({ genomes }) {
|
|
|
85
78
|
};
|
|
86
79
|
}
|
|
87
80
|
async function trigger_getcategories(q, res, tdb, ds, genome) {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
let term;
|
|
91
|
-
if (q.type == "geneVariant") {
|
|
92
|
-
term = { id: q.name, name: q.name, type: "geneVariant", isleaf: true };
|
|
93
|
-
if (q.gene) {
|
|
94
|
-
term.gene = q.gene;
|
|
95
|
-
} else {
|
|
96
|
-
term.chr = q.chr;
|
|
97
|
-
term.start = q.start;
|
|
98
|
-
term.stop = q.stop;
|
|
99
|
-
}
|
|
100
|
-
} else {
|
|
101
|
-
term = tdb.q.termjsonByOneid(q.tid);
|
|
102
|
-
}
|
|
103
|
-
const tw = q.type == "geneVariant" ? { $id: q.gene || q.name || q.tid, term, q: { isAtomic: true } } : { $id: q.tid, id: q.tid, term, q: q.term1_q || getDefaultQ(term, q) };
|
|
81
|
+
const $id = Math.random().toString();
|
|
82
|
+
const tw = { $id, term: q.term, q: q.term1_q || getDefaultQ(q.term, q) };
|
|
104
83
|
const arg = {
|
|
105
84
|
filter: q.filter,
|
|
106
85
|
terms: [tw],
|
|
@@ -113,7 +92,7 @@ async function trigger_getcategories(q, res, tdb, ds, genome) {
|
|
|
113
92
|
if (data.error)
|
|
114
93
|
throw data.error;
|
|
115
94
|
const lst = [];
|
|
116
|
-
if (q.type == "geneVariant") {
|
|
95
|
+
if (q.term.type == "geneVariant") {
|
|
117
96
|
const samples = data.samples;
|
|
118
97
|
const dtClassMap = /* @__PURE__ */ new Map();
|
|
119
98
|
if (ds.assayAvailability?.byDt) {
|
|
@@ -125,7 +104,7 @@ async function trigger_getcategories(q, res, tdb, ds, genome) {
|
|
|
125
104
|
}
|
|
126
105
|
const sampleCountedFor = /* @__PURE__ */ new Set();
|
|
127
106
|
for (const [sampleId, sampleData] of Object.entries(samples)) {
|
|
128
|
-
const key =
|
|
107
|
+
const key = $id;
|
|
129
108
|
const values = sampleData[key].values;
|
|
130
109
|
sampleCountedFor.clear();
|
|
131
110
|
for (const value of values) {
|
|
@@ -163,7 +142,7 @@ async function trigger_getcategories(q, res, tdb, ds, genome) {
|
|
|
163
142
|
} else {
|
|
164
143
|
const key2count = /* @__PURE__ */ new Map();
|
|
165
144
|
for (const sid in data.samples) {
|
|
166
|
-
const v = data.samples[sid][
|
|
145
|
+
const v = data.samples[sid][$id];
|
|
167
146
|
if (!v)
|
|
168
147
|
continue;
|
|
169
148
|
if (!("key" in v))
|
|
@@ -174,14 +153,14 @@ async function trigger_getcategories(q, res, tdb, ds, genome) {
|
|
|
174
153
|
lst.push({
|
|
175
154
|
samplecount: count,
|
|
176
155
|
key,
|
|
177
|
-
label: data.refs?.byTermId?.[
|
|
156
|
+
label: data.refs?.byTermId?.[$id]?.events?.find((e) => e.event === key).label || q.term?.values?.[key]?.label || key
|
|
178
157
|
});
|
|
179
158
|
}
|
|
180
159
|
}
|
|
181
160
|
const orderedLabels = getOrderedLabels(
|
|
182
|
-
term,
|
|
183
|
-
data.refs?.byTermId?.[
|
|
184
|
-
data.refs?.byTermId?.[
|
|
161
|
+
q.term,
|
|
162
|
+
data.refs?.byTermId?.[$id]?.bins || [],
|
|
163
|
+
data.refs?.byTermId?.[$id]?.events,
|
|
185
164
|
q.term1_q
|
|
186
165
|
);
|
|
187
166
|
if (orderedLabels.length) {
|
package/routes/termdb.cluster.js
CHANGED
|
@@ -6,6 +6,7 @@ import { gdc_validate_query_geneExpression } from "#src/mds3.gdc.js";
|
|
|
6
6
|
import { mayLimitSamples } from "#src/mds3.filter.js";
|
|
7
7
|
import { dtgeneexpression } from "#shared/common.js";
|
|
8
8
|
import { clusterMethodLst, distanceMethodLst } from "#shared/clustering.js";
|
|
9
|
+
import { getResult as getResultGene } from "#src/gene.js";
|
|
9
10
|
const api = {
|
|
10
11
|
endpoint: "termdb/cluster",
|
|
11
12
|
methods: {
|
|
@@ -136,7 +137,7 @@ async function validate_query_geneExpression(ds, genome) {
|
|
|
136
137
|
const q = ds.queries.geneExpression;
|
|
137
138
|
if (!q)
|
|
138
139
|
return;
|
|
139
|
-
q.
|
|
140
|
+
q.gene2bins = {};
|
|
140
141
|
if (q.src == "gdcapi") {
|
|
141
142
|
gdc_validate_query_geneExpression(ds, genome);
|
|
142
143
|
return;
|
|
@@ -191,13 +192,13 @@ async function validateNative(q, ds, genome) {
|
|
|
191
192
|
if (!g.gene)
|
|
192
193
|
continue;
|
|
193
194
|
if (!g.chr) {
|
|
194
|
-
const
|
|
195
|
-
if (
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
g.start =
|
|
199
|
-
g.stop =
|
|
200
|
-
g.chr =
|
|
195
|
+
const re = getResultGene(genome, { input: g.gene, deep: 1 });
|
|
196
|
+
if (!re.gmlst || re.gmlst.length == 0)
|
|
197
|
+
throw "unknown gene";
|
|
198
|
+
const i = re.gmlst.find((i2) => i2.isdefault) || re.gmlst[0];
|
|
199
|
+
g.start = i.start;
|
|
200
|
+
g.stop = i.stop;
|
|
201
|
+
g.chr = i.chr;
|
|
201
202
|
}
|
|
202
203
|
const s2v = {};
|
|
203
204
|
await utils.get_lines_bigfile({
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { get_rows_by_one_key } from "../src/termdb.sql.js";
|
|
2
1
|
import Summarystats from "../shared/descriptive.stats.js";
|
|
2
|
+
import { getData } from "#src/termdb.matrix.js";
|
|
3
3
|
const api = {
|
|
4
4
|
endpoint: "termdb/descrstats",
|
|
5
5
|
methods: {
|
|
@@ -64,7 +64,7 @@ function init({ genomes }) {
|
|
|
64
64
|
const tdb = ds.cohort.termdb;
|
|
65
65
|
if (!tdb)
|
|
66
66
|
throw "invalid termdb object";
|
|
67
|
-
await trigger_getdescrstats(q, res, ds);
|
|
67
|
+
await trigger_getdescrstats(q, res, ds, g);
|
|
68
68
|
} catch (e) {
|
|
69
69
|
res.send({ error: e?.message || e });
|
|
70
70
|
if (e instanceof Error && e.stack)
|
|
@@ -72,20 +72,16 @@ function init({ genomes }) {
|
|
|
72
72
|
}
|
|
73
73
|
};
|
|
74
74
|
}
|
|
75
|
-
async function trigger_getdescrstats(q, res, ds) {
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
throw "not numerical term";
|
|
81
|
-
const rows = await get_rows_by_one_key({
|
|
82
|
-
ds,
|
|
83
|
-
key: q.tid,
|
|
84
|
-
filter: q.filter
|
|
85
|
-
});
|
|
75
|
+
async function trigger_getdescrstats(q, res, ds, genome) {
|
|
76
|
+
const terms = [q.tw];
|
|
77
|
+
const data = await getData({ filter: q.filter, terms }, ds, genome);
|
|
78
|
+
if (data.error)
|
|
79
|
+
throw data.error;
|
|
86
80
|
const values = [];
|
|
87
|
-
for (const
|
|
88
|
-
|
|
81
|
+
for (const key in data.samples) {
|
|
82
|
+
const sample = data.samples[key];
|
|
83
|
+
const value = sample[q.tw.$id].value;
|
|
84
|
+
if (q.tw.values?.[value]?.uncomputable) {
|
|
89
85
|
continue;
|
|
90
86
|
}
|
|
91
87
|
if (q.settings?.violin?.unit === "log") {
|
|
@@ -93,7 +89,7 @@ async function trigger_getdescrstats(q, res, ds) {
|
|
|
93
89
|
continue;
|
|
94
90
|
}
|
|
95
91
|
}
|
|
96
|
-
values.push(value);
|
|
92
|
+
values.push(parseFloat(value));
|
|
97
93
|
}
|
|
98
94
|
res.send(Summarystats(values));
|
|
99
95
|
}
|