@sjcrh/proteinpaint-server 2.58.1-0 → 2.60.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 +12 -8
- package/routes/termdb.config.js +10 -1
- package/routes/termdb.getdescrstats.js +3 -1
- package/src/app.js +1076 -629
- package/utils/edge.R +35 -16
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sjcrh/proteinpaint-server",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.60.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.60.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.geneExpression2bins = {};
|
|
140
141
|
if (q.src == "gdcapi") {
|
|
141
142
|
gdc_validate_query_geneExpression(ds, genome);
|
|
142
143
|
return;
|
|
@@ -168,7 +169,6 @@ async function validateNative(q, ds, genome) {
|
|
|
168
169
|
throw "queries.geneExpression: unknown sample from header: " + l[i];
|
|
169
170
|
q.samples.push(id);
|
|
170
171
|
}
|
|
171
|
-
console.log(q.samples.length, "samples from geneExpression of", ds.label);
|
|
172
172
|
}
|
|
173
173
|
q.get = async (param) => {
|
|
174
174
|
const limitSamples = await mayLimitSamples(param, q.samples, ds);
|
|
@@ -191,13 +191,15 @@ async function validateNative(q, ds, genome) {
|
|
|
191
191
|
if (!g.gene)
|
|
192
192
|
continue;
|
|
193
193
|
if (!g.chr) {
|
|
194
|
-
const
|
|
195
|
-
if (
|
|
194
|
+
const re = getResultGene(genome, { input: g.gene, deep: 1 });
|
|
195
|
+
if (!re.gmlst || re.gmlst.length == 0) {
|
|
196
|
+
console.warn("unknown gene:" + g.gene);
|
|
196
197
|
continue;
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
g.
|
|
200
|
-
g.
|
|
198
|
+
}
|
|
199
|
+
const i = re.gmlst.find((i2) => i2.isdefault) || re.gmlst[0];
|
|
200
|
+
g.start = i.start;
|
|
201
|
+
g.stop = i.stop;
|
|
202
|
+
g.chr = i.chr;
|
|
201
203
|
}
|
|
202
204
|
const s2v = {};
|
|
203
205
|
await utils.get_lines_bigfile({
|
|
@@ -224,6 +226,8 @@ async function validateNative(q, ds, genome) {
|
|
|
224
226
|
gene2sample2value.set(g.gene, s2v);
|
|
225
227
|
}
|
|
226
228
|
const byTermId = {};
|
|
229
|
+
if (gene2sample2value.size == 0)
|
|
230
|
+
throw "no data available for the input " + param.genes?.map((g) => g.gene).join(", ");
|
|
227
231
|
return { gene2sample2value, byTermId, bySampleId };
|
|
228
232
|
};
|
|
229
233
|
}
|
package/routes/termdb.config.js
CHANGED
|
@@ -3,6 +3,7 @@ import { authApi } from "#src/auth.js";
|
|
|
3
3
|
import { get_ds_tdb } from "#src/termdb.js";
|
|
4
4
|
import { mayCopyFromCookie } from "#src/utils.js";
|
|
5
5
|
import { mayComputeTermtypeByCohort } from "#src/termdb.server.init.js";
|
|
6
|
+
import { TermTypes } from "#shared/terms.js";
|
|
6
7
|
const api = {
|
|
7
8
|
endpoint: "termdb/config",
|
|
8
9
|
methods: {
|
|
@@ -168,6 +169,12 @@ function addGenomicQueries(c, ds, genome) {
|
|
|
168
169
|
delete q2.singleSampleGenomeQuantification[k].folder;
|
|
169
170
|
}
|
|
170
171
|
}
|
|
172
|
+
if (q.NIdata) {
|
|
173
|
+
q2.NIdata = {};
|
|
174
|
+
for (const k in q.NIdata) {
|
|
175
|
+
q2.NIdata[k] = JSON.parse(JSON.stringify(q.NIdata[k]));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
171
178
|
if (q.singleSampleGbtk) {
|
|
172
179
|
q2.singleSampleGbtk = {};
|
|
173
180
|
for (const k in q.singleSampleGbtk) {
|
|
@@ -207,7 +214,9 @@ function getAllowedTermTypes(ds) {
|
|
|
207
214
|
typeSet.add("geneVariant");
|
|
208
215
|
}
|
|
209
216
|
if (ds?.queries?.geneExpression)
|
|
210
|
-
typeSet.add(
|
|
217
|
+
typeSet.add(TermTypes.GENE_EXPRESSION);
|
|
218
|
+
if (ds?.queries?.metaboliteIntensity)
|
|
219
|
+
typeSet.add(TermTypes.METABOLITE_INTENSITY);
|
|
211
220
|
return [...typeSet];
|
|
212
221
|
}
|
|
213
222
|
export {
|
|
@@ -75,11 +75,13 @@ function init({ genomes }) {
|
|
|
75
75
|
async function trigger_getdescrstats(q, res, ds, genome) {
|
|
76
76
|
const terms = [q.tw];
|
|
77
77
|
const data = await getData({ filter: q.filter, terms }, ds, genome);
|
|
78
|
+
if (data.error)
|
|
79
|
+
throw data.error;
|
|
78
80
|
const values = [];
|
|
79
81
|
for (const key in data.samples) {
|
|
80
82
|
const sample = data.samples[key];
|
|
81
83
|
const value = sample[q.tw.$id].value;
|
|
82
|
-
if (q.tw.
|
|
84
|
+
if (q.tw.q.hiddenValues?.[value]) {
|
|
83
85
|
continue;
|
|
84
86
|
}
|
|
85
87
|
if (q.settings?.violin?.unit === "log") {
|