@sjcrh/proteinpaint-server 2.152.1-0 → 2.153.1-3

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 (3) hide show
  1. package/package.json +5 -5
  2. package/routes/grin2.js +60 -23
  3. package/src/app.js +61 -24
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sjcrh/proteinpaint-server",
3
- "version": "2.152.1-0",
3
+ "version": "2.153.1-3",
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,16 +61,16 @@
61
61
  },
62
62
  "dependencies": {
63
63
  "@sjcrh/augen": "2.143.0",
64
- "@sjcrh/proteinpaint-python": "2.151.0",
64
+ "@sjcrh/proteinpaint-python": "2.153.1-3",
65
65
  "@sjcrh/proteinpaint-r": "2.152.1-0",
66
66
  "@sjcrh/proteinpaint-rust": "2.152.1-0",
67
- "@sjcrh/proteinpaint-shared": "2.152.0",
68
- "@sjcrh/proteinpaint-types": "2.152.1-0",
67
+ "@sjcrh/proteinpaint-shared": "2.153.1-2",
68
+ "@sjcrh/proteinpaint-types": "2.153.1-2",
69
69
  "@types/express": "^5.0.0",
70
70
  "@types/express-session": "^1.18.1",
71
71
  "better-sqlite3": "^12.4.1",
72
72
  "body-parser": "^1.15.2",
73
- "canvas": "~3.1.0",
73
+ "canvas": "~3.1.2",
74
74
  "compression": "^1.6.2",
75
75
  "connect-redis": "^6.1.3",
76
76
  "cookie-parser": "^1.4.5",
package/routes/grin2.js CHANGED
@@ -153,6 +153,10 @@ function allTypesCapped(tracker) {
153
153
  }
154
154
  async function processSampleData(samples, ds, request, tracker) {
155
155
  const lesions = [];
156
+ const samplesPerType = /* @__PURE__ */ new Map();
157
+ for (const [type] of tracker.entries()) {
158
+ samplesPerType.set(type, /* @__PURE__ */ new Set());
159
+ }
156
160
  const processingSummary = {
157
161
  totalSamples: samples.length,
158
162
  processedSamples: 0,
@@ -174,8 +178,11 @@ async function processSampleData(samples, ds, request, tracker) {
174
178
  try {
175
179
  await file_is_readable(filepath);
176
180
  const mlst = JSON.parse(await read_file(filepath));
177
- const { sampleLesions } = await processSampleMlst(sample.name, mlst, request, tracker);
181
+ const { sampleLesions, contributedTypes } = await processSampleMlst(sample.name, mlst, request, tracker);
178
182
  lesions.push(...sampleLesions);
183
+ for (const type of contributedTypes) {
184
+ samplesPerType.get(type)?.add(sample.name);
185
+ }
179
186
  processingSummary.processedSamples += 1;
180
187
  processingSummary.totalLesions += sampleLesions.length;
181
188
  if (allTypesCapped(tracker)) {
@@ -195,35 +202,61 @@ async function processSampleData(samples, ds, request, tracker) {
195
202
  }
196
203
  }
197
204
  processingSummary.processedLesions = lesions.length;
205
+ const lesionCounts = {
206
+ total: lesions.length,
207
+ byType: {}
208
+ };
209
+ const lesionTypeCounts = {};
210
+ for (const lesion of lesions) {
211
+ const lesionType = lesion[4];
212
+ lesionTypeCounts[lesionType] = (lesionTypeCounts[lesionType] || 0) + 1;
213
+ }
198
214
  for (const [type, info] of tracker.entries()) {
199
- if (info.count >= MAX_LESIONS_PER_TYPE) {
200
- let label;
201
- switch (type) {
202
- case dtsnvindel:
203
- label = "mutation";
204
- break;
205
- case dtcnv:
206
- label = "CNV (gain/loss)";
207
- break;
208
- case dtfusionrna:
209
- label = "fusion";
210
- break;
211
- case dtsv:
212
- label = "structural variant";
213
- break;
214
- default:
215
- label = `type ${type}`;
216
- break;
215
+ const isCapped = info.count >= MAX_LESIONS_PER_TYPE;
216
+ switch (type) {
217
+ case dtsnvindel:
218
+ lesionCounts.byType["mutation"] = {
219
+ count: lesionTypeCounts["mutation"] || 0,
220
+ capped: isCapped,
221
+ samples: samplesPerType.get(type)?.size || 0
222
+ };
223
+ break;
224
+ case dtcnv: {
225
+ const sampleCount = samplesPerType.get(type)?.size || 0;
226
+ lesionCounts.byType["gain"] = {
227
+ count: lesionTypeCounts["gain"] || 0,
228
+ capped: isCapped,
229
+ samples: sampleCount
230
+ };
231
+ lesionCounts.byType["loss"] = {
232
+ count: lesionTypeCounts["loss"] || 0,
233
+ capped: isCapped,
234
+ samples: sampleCount
235
+ };
236
+ break;
217
237
  }
218
- mayLog(
219
- `[GRIN2] Warning: ${label} lesions reached the per-type cap of ${MAX_LESIONS_PER_TYPE.toLocaleString()}. No further ${label} lesions were processed.`
220
- );
238
+ case dtfusionrna:
239
+ lesionCounts.byType["fusion"] = {
240
+ count: lesionTypeCounts["fusion"] || 0,
241
+ capped: isCapped,
242
+ samples: samplesPerType.get(type)?.size || 0
243
+ };
244
+ break;
245
+ case dtsv:
246
+ lesionCounts.byType["sv"] = {
247
+ count: lesionTypeCounts["sv"] || 0,
248
+ capped: isCapped,
249
+ samples: samplesPerType.get(type)?.size || 0
250
+ };
251
+ break;
221
252
  }
222
253
  }
254
+ processingSummary.lesionCounts = lesionCounts;
223
255
  return { lesions, processingSummary };
224
256
  }
225
257
  async function processSampleMlst(sampleName, mlst, request, tracker) {
226
258
  const sampleLesions = [];
259
+ const contributedTypes = /* @__PURE__ */ new Set();
227
260
  for (const m of mlst) {
228
261
  switch (m.dt) {
229
262
  case dtsnvindel: {
@@ -236,6 +269,7 @@ async function processSampleMlst(sampleName, mlst, request, tracker) {
236
269
  if (les && entry) {
237
270
  entry.count++;
238
271
  sampleLesions.push(les);
272
+ contributedTypes.add(dtsnvindel);
239
273
  }
240
274
  break;
241
275
  }
@@ -249,6 +283,7 @@ async function processSampleMlst(sampleName, mlst, request, tracker) {
249
283
  if (les && cnv) {
250
284
  cnv.count++;
251
285
  sampleLesions.push(les);
286
+ contributedTypes.add(dtcnv);
252
287
  }
253
288
  break;
254
289
  }
@@ -273,6 +308,7 @@ async function processSampleMlst(sampleName, mlst, request, tracker) {
273
308
  sampleLesions.push(les);
274
309
  fusion.count++;
275
310
  }
311
+ contributedTypes.add(dtfusionrna);
276
312
  }
277
313
  break;
278
314
  }
@@ -297,6 +333,7 @@ async function processSampleMlst(sampleName, mlst, request, tracker) {
297
333
  sampleLesions.push(les);
298
334
  sv.count++;
299
335
  }
336
+ contributedTypes.add(dtsv);
300
337
  }
301
338
  break;
302
339
  }
@@ -304,7 +341,7 @@ async function processSampleMlst(sampleName, mlst, request, tracker) {
304
341
  break;
305
342
  }
306
343
  }
307
- return { sampleLesions };
344
+ return { sampleLesions, contributedTypes };
308
345
  }
309
346
  function filterAndConvertSnvIndel(sampleName, entry, options) {
310
347
  if (!options?.consequences) {