@jbrowse/plugin-alignments 1.7.7 → 1.7.8

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 (31) hide show
  1. package/dist/BamAdapter/BamAdapter.d.ts +1 -1
  2. package/dist/BamAdapter/BamAdapter.js +3 -3
  3. package/dist/BamAdapter/MismatchParser.d.ts +2 -5
  4. package/dist/BamAdapter/MismatchParser.js +104 -44
  5. package/dist/BamAdapter/MismatchParser.test.js +6 -14
  6. package/dist/CramAdapter/CramAdapter.d.ts +10 -9
  7. package/dist/CramAdapter/CramAdapter.js +6 -6
  8. package/dist/CramAdapter/CramSlightlyLazyFeature.js +35 -30
  9. package/dist/LinearPileupDisplay/model.js +1 -1
  10. package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +2 -3
  11. package/dist/LinearSNPCoverageDisplay/models/model.js +1 -1
  12. package/dist/PileupRenderer/PileupLayoutSession.d.ts +3 -0
  13. package/dist/PileupRenderer/PileupLayoutSession.js +3 -1
  14. package/dist/PileupRenderer/PileupRenderer.d.ts +1 -1
  15. package/dist/PileupRenderer/PileupRenderer.js +125 -162
  16. package/dist/PileupRenderer/configSchema.js +2 -2
  17. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +4 -6
  18. package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +92 -96
  19. package/package.json +3 -3
  20. package/src/BamAdapter/BamAdapter.ts +3 -3
  21. package/src/BamAdapter/MismatchParser.test.ts +5 -7
  22. package/src/BamAdapter/MismatchParser.ts +69 -58
  23. package/src/CramAdapter/CramAdapter.ts +14 -10
  24. package/src/CramAdapter/CramSlightlyLazyFeature.ts +84 -91
  25. package/src/LinearPileupDisplay/model.ts +1 -1
  26. package/src/LinearSNPCoverageDisplay/components/Tooltip.tsx +32 -25
  27. package/src/LinearSNPCoverageDisplay/models/model.ts +1 -1
  28. package/src/PileupRenderer/PileupLayoutSession.ts +6 -1
  29. package/src/PileupRenderer/PileupRenderer.tsx +70 -68
  30. package/src/PileupRenderer/configSchema.ts +2 -2
  31. package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +84 -76
@@ -28,7 +28,7 @@ export default class BamAdapter extends BaseFeatureDataAdapter {
28
28
  tag: string;
29
29
  value: unknown;
30
30
  };
31
- name: string;
31
+ readName: string;
32
32
  };
33
33
  }): import("rxjs").Observable<Feature>;
34
34
  estimateRegionsStats(regions: Region[], opts?: BaseOptions): Promise<import("@jbrowse/core/data_adapters/BaseAdapter").Stats | {
@@ -406,7 +406,7 @@ var BamAdapter = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
406
406
 
407
407
  return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
408
408
  var _ref5 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee8(observer) {
409
- var _yield$_this3$configu, bam, records, _ref6, _ref6$flagInclude, flagInclude, _ref6$flagExclude, flagExclude, tagFilter, name, _iterator, _step, record, ref, flags, val;
409
+ var _yield$_this3$configu, bam, records, _ref6, _ref6$flagInclude, flagInclude, _ref6$flagExclude, flagExclude, tagFilter, readName, _iterator, _step, record, ref, flags, val;
410
410
 
411
411
  return _regenerator.default.wrap(function _callee8$(_context8) {
412
412
  while (1) {
@@ -428,7 +428,7 @@ var BamAdapter = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
428
428
 
429
429
  case 9:
430
430
  records = _context8.sent;
431
- _ref6 = filterBy || {}, _ref6$flagInclude = _ref6.flagInclude, flagInclude = _ref6$flagInclude === void 0 ? 0 : _ref6$flagInclude, _ref6$flagExclude = _ref6.flagExclude, flagExclude = _ref6$flagExclude === void 0 ? 0 : _ref6$flagExclude, tagFilter = _ref6.tagFilter, name = _ref6.name;
431
+ _ref6 = filterBy || {}, _ref6$flagInclude = _ref6.flagInclude, flagInclude = _ref6$flagInclude === void 0 ? 0 : _ref6$flagInclude, _ref6$flagExclude = _ref6.flagExclude, flagExclude = _ref6$flagExclude === void 0 ? 0 : _ref6$flagExclude, tagFilter = _ref6.tagFilter, readName = _ref6.readName;
432
432
  _iterator = _createForOfIteratorHelper(records);
433
433
  _context8.prev = 12;
434
434
 
@@ -480,7 +480,7 @@ var BamAdapter = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
480
480
  return _context8.abrupt("continue", 31);
481
481
 
482
482
  case 28:
483
- if (!(name && record.get('name') !== name)) {
483
+ if (!(readName && record.get('name') !== readName)) {
484
484
  _context8.next = 30;
485
485
  break;
486
486
  }
@@ -18,11 +18,8 @@ export declare function cigarToMismatches(ops: string[], seq: string, ref?: stri
18
18
  export declare function mdToMismatches(mdstring: string, ops: string[], cigarMismatches: Mismatch[], seq: string, qual?: Buffer): Mismatch[];
19
19
  export declare function getMismatches(cigar: string, md: string, seq: string, ref?: string, qual?: Buffer): Mismatch[];
20
20
  export declare function getNextRefPos(cigarOps: string[], positions: number[]): Generator<number, void, unknown>;
21
- export declare function getModificationPositions(mm: string, fseq: string, fstrand: number): ({
21
+ export declare function getModificationPositions(mm: string, fseq: string, fstrand: number): {
22
22
  type: string;
23
23
  positions: number[];
24
- } | {
25
- type: string;
26
- positions: never[];
27
- })[];
24
+ }[];
28
25
  export declare function getModificationTypes(mm: string): string[];
@@ -243,47 +243,91 @@ function getMismatches(cigar, md, seq, ref, qual) {
243
243
 
244
244
 
245
245
  function getNextRefPos(cigarOps, positions) {
246
- var cigarIdx, readPos, refPos, i, pos, len, op;
246
+ var readPos, refPos, currPos, i, len, op, _i, _i2;
247
+
247
248
  return _regenerator.default.wrap(function getNextRefPos$(_context) {
248
249
  while (1) {
249
250
  switch (_context.prev = _context.next) {
250
251
  case 0:
251
- cigarIdx = 0;
252
252
  readPos = 0;
253
253
  refPos = 0;
254
+ currPos = 0;
254
255
  i = 0;
255
256
 
256
257
  case 4:
257
- if (!(i < positions.length)) {
258
- _context.next = 12;
258
+ if (!(i < cigarOps.length && currPos < positions.length)) {
259
+ _context.next = 31;
259
260
  break;
260
261
  }
261
262
 
262
- pos = positions[i];
263
+ len = +cigarOps[i];
264
+ op = cigarOps[i + 1];
263
265
 
264
- for (; cigarIdx < cigarOps.length && readPos < pos; cigarIdx += 2) {
265
- len = +cigarOps[cigarIdx];
266
- op = cigarOps[cigarIdx + 1];
266
+ if (!(op === 'S' || op === 'I')) {
267
+ _context.next = 12;
268
+ break;
269
+ }
267
270
 
268
- if (op === 'S' || op === 'I') {
269
- readPos += len;
270
- } else if (op === 'D' || op === 'N') {
271
- refPos += len;
272
- } else if (op === 'M' || op === 'X' || op === '=') {
273
- readPos += len;
274
- refPos += len;
271
+ for (_i = 0; _i < len && currPos < positions.length; _i++) {
272
+ if (positions[currPos] === readPos + _i) {
273
+ currPos++;
275
274
  }
276
275
  }
277
276
 
278
- _context.next = 9;
279
- return positions[i] - readPos + refPos;
277
+ readPos += len;
278
+ _context.next = 28;
279
+ break;
280
+
281
+ case 12:
282
+ if (!(op === 'D' || op === 'N')) {
283
+ _context.next = 16;
284
+ break;
285
+ }
286
+
287
+ refPos += len;
288
+ _context.next = 28;
289
+ break;
290
+
291
+ case 16:
292
+ if (!(op === 'M' || op === 'X' || op === '=')) {
293
+ _context.next = 28;
294
+ break;
295
+ }
296
+
297
+ _i2 = 0;
298
+
299
+ case 18:
300
+ if (!(_i2 < len && currPos < positions.length)) {
301
+ _context.next = 26;
302
+ break;
303
+ }
304
+
305
+ if (!(positions[currPos] === readPos + _i2)) {
306
+ _context.next = 23;
307
+ break;
308
+ }
309
+
310
+ _context.next = 22;
311
+ return refPos + _i2;
312
+
313
+ case 22:
314
+ currPos++;
315
+
316
+ case 23:
317
+ _i2++;
318
+ _context.next = 18;
319
+ break;
320
+
321
+ case 26:
322
+ readPos += len;
323
+ refPos += len;
280
324
 
281
- case 9:
282
- i++;
325
+ case 28:
326
+ i += 2;
283
327
  _context.next = 4;
284
328
  break;
285
329
 
286
- case 12:
330
+ case 31:
287
331
  case "end":
288
332
  return _context.stop();
289
333
  }
@@ -293,9 +337,14 @@ function getNextRefPos(cigarOps, positions) {
293
337
 
294
338
  function getModificationPositions(mm, fseq, fstrand) {
295
339
  var seq = fstrand === -1 ? (0, _util.revcom)(fseq) : fseq;
296
- return mm.split(';').filter(function (mod) {
340
+ var mods = mm.split(';').filter(function (mod) {
297
341
  return !!mod;
298
- }).map(function (mod) {
342
+ });
343
+ var result = [];
344
+
345
+ for (var i = 0; i < mods.length; i++) {
346
+ var mod = mods[i];
347
+
299
348
  var _mod$split = mod.split(','),
300
349
  _mod$split2 = (0, _toArray2.default)(_mod$split),
301
350
  basemod = _mod$split2[0],
@@ -322,39 +371,50 @@ function getModificationPositions(mm, fseq, fstrand) {
322
371
  if (strand === '-') {
323
372
  console.warn('unsupported negative strand modifications'); // make sure to return a somewhat matching type even in this case
324
373
 
325
- return {
374
+ result.push({
326
375
  type: 'unsupported',
327
376
  positions: []
328
- };
377
+ });
329
378
  } // this logic also based on parse_mm.pl from hts-specs is that in the
330
379
  // sequence of the read, if we have a modification type e.g. C+m;2 and a
331
380
  // sequence ACGTACGTAC we skip the two instances of C and go to the last
332
381
  // C
333
382
 
334
383
 
335
- return types.map(function (type) {
336
- var i = 0;
337
- return {
338
- type: type,
339
- positions: skips.map(function (score) {
340
- return +score;
341
- }).map(function (delta) {
342
- do {
343
- if (base === 'N' || base === seq[i]) {
344
- delta--;
345
- }
384
+ for (var j = 0; j < types.length; j++) {
385
+ var type = types[j];
386
+ var _i3 = 0;
387
+ var positions = [];
388
+
389
+ for (var k = 0; k < skips.length; k++) {
390
+ var delta = +skips[k];
391
+
392
+ do {
393
+ if (base === 'N' || base === seq[_i3]) {
394
+ delta--;
395
+ }
346
396
 
347
- i++;
348
- } while (delta >= 0 && i < seq.length);
397
+ _i3++;
398
+ } while (delta >= 0 && _i3 < seq.length);
349
399
 
350
- var temp = i - 1;
351
- return fstrand === -1 ? seq.length - 1 - temp : temp;
352
- }).sort(function (a, b) {
400
+ var temp = _i3 - 1;
401
+ positions.push(fstrand === -1 ? seq.length - 1 - temp : temp);
402
+ }
403
+
404
+ if (fstrand === -1) {
405
+ positions.sort(function (a, b) {
353
406
  return a - b;
354
- })
355
- };
356
- });
357
- }).flat();
407
+ });
408
+ }
409
+
410
+ result.push({
411
+ type: type,
412
+ positions: positions
413
+ });
414
+ }
415
+ }
416
+
417
+ return result;
358
418
  }
359
419
 
360
420
  function getModificationTypes(mm) {
@@ -2,7 +2,7 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
- var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
5
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
6
6
 
7
7
  var _MismatchParser = require("./MismatchParser");
8
8
 
@@ -216,23 +216,15 @@ test('clipping', function () {
216
216
  type: 'mismatch'
217
217
  }]);
218
218
  });
219
- test('getNextRefPos basic', function () {
219
+ test('getNextRefPos test 1', function () {
220
220
  var cigar = (0, _MismatchParser.parseCigar)('10S10M1I4M1D15M');
221
221
  var iter = (0, _MismatchParser.getNextRefPos)(cigar, [5, 10, 15, 20, 25, 30, 35]);
222
-
223
- var _iter = (0, _toArray2.default)(iter),
224
- vals = _iter.slice(0);
225
-
226
- expect(vals).toEqual([-5, 0, 5, 10, 14, 20, 25]);
222
+ expect((0, _toConsumableArray2.default)(iter)).toEqual([0, 5, 15, 20, 25]);
227
223
  });
228
- test('getNextRefPos with many indels', function () {
229
- var cigar = (0, _MismatchParser.parseCigar)('10S4M1D1IM10');
224
+ test('getNextRefPos test 2', function () {
225
+ var cigar = (0, _MismatchParser.parseCigar)('10S15M');
230
226
  var iter = (0, _MismatchParser.getNextRefPos)(cigar, [5, 10, 15]);
231
-
232
- var _iter2 = (0, _toArray2.default)(iter),
233
- vals = _iter2.slice(0);
234
-
235
- expect(vals).toEqual([-5, 0, 5]);
227
+ expect((0, _toConsumableArray2.default)(iter)).toEqual([0, 5]);
236
228
  });
237
229
  test('getModificationPositions', function () {
238
230
  var positions = (0, _MismatchParser.getModificationPositions)('C+m,2,2,1,4,1', 'AGCTCTCCAGAGTCGNACGCCATYCGCGCGCCACCA', 1);
@@ -6,6 +6,15 @@ interface Header {
6
6
  nameToId?: Record<string, number>;
7
7
  readGroups?: number[];
8
8
  }
9
+ interface FilterBy {
10
+ flagInclude: number;
11
+ flagExclude: number;
12
+ tagFilter: {
13
+ tag: string;
14
+ value: unknown;
15
+ };
16
+ readName: string;
17
+ }
9
18
  export default class CramAdapter extends BaseFeatureDataAdapter {
10
19
  samHeader: Header;
11
20
  private setupP?;
@@ -26,15 +35,7 @@ export default class CramAdapter extends BaseFeatureDataAdapter {
26
35
  getFeatures(region: Region & {
27
36
  originalRefName?: string;
28
37
  }, opts?: BaseOptions & {
29
- filterBy: {
30
- flagInclude: number;
31
- flagExclude: number;
32
- tagFilter: {
33
- tag: string;
34
- value: unknown;
35
- };
36
- name: string;
37
- };
38
+ filterBy: FilterBy;
38
39
  }): import("rxjs").Observable<Feature>;
39
40
  freeResources(): void;
40
41
  cramRecordToFeature(record: unknown): CramSlightlyLazyFeature;
@@ -460,7 +460,7 @@ var CramAdapter = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
460
460
  originalRefName = region.originalRefName;
461
461
  return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
462
462
  var _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee7(observer) {
463
- var _yield$_this3$setup, cram, sequenceAdapter, refId, records, _ref4, _ref4$flagInclude, flagInclude, _ref4$flagExclude, flagExclude, tagFilter, name, filtered;
463
+ var _yield$_this3$setup, cram, sequenceAdapter, refId, records, _ref4, _ref4$flagInclude, flagInclude, _ref4$flagExclude, flagExclude, tagFilter, readName, filtered;
464
464
 
465
465
  return _regenerator.default.wrap(function _callee7$(_context7) {
466
466
  while (1) {
@@ -504,7 +504,7 @@ var CramAdapter = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
504
504
  case 15:
505
505
  records = _context7.sent;
506
506
  (0, _util.checkAbortSignal)(signal);
507
- _ref4 = filterBy || {}, _ref4$flagInclude = _ref4.flagInclude, flagInclude = _ref4$flagInclude === void 0 ? 0 : _ref4$flagInclude, _ref4$flagExclude = _ref4.flagExclude, flagExclude = _ref4$flagExclude === void 0 ? 0 : _ref4$flagExclude, tagFilter = _ref4.tagFilter, name = _ref4.name; // eslint-disable-next-line @typescript-eslint/no-explicit-any
507
+ _ref4 = filterBy || {}, _ref4$flagInclude = _ref4.flagInclude, flagInclude = _ref4$flagInclude === void 0 ? 0 : _ref4$flagInclude, _ref4$flagExclude = _ref4.flagExclude, flagExclude = _ref4$flagExclude === void 0 ? 0 : _ref4$flagExclude, tagFilter = _ref4.tagFilter, readName = _ref4.readName; // eslint-disable-next-line @typescript-eslint/no-explicit-any
508
508
 
509
509
  filtered = records.filter(function (record) {
510
510
  var flags = record.flags;
@@ -519,10 +519,10 @@ var CramAdapter = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
519
519
  });
520
520
  }
521
521
 
522
- if (name) {
523
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
524
- filtered = filtered.filter(function (record) {
525
- return record.name === name;
522
+ if (readName) {
523
+ filtered = filtered.filter( // eslint-disable-next-line @typescript-eslint/no-explicit-any
524
+ function (record) {
525
+ return record.readName === readName;
526
526
  });
527
527
  } // eslint-disable-next-line @typescript-eslint/no-explicit-any
528
528
 
@@ -158,11 +158,12 @@ var CramSlightlyLazyFeature = /*#__PURE__*/function () {
158
158
 
159
159
  if (typeof this.record.readFeatures !== 'undefined') {
160
160
  // @ts-ignore
161
- this.record.readFeatures.forEach(function (_ref) {
162
- var code = _ref.code,
163
- refPos = _ref.refPos,
164
- sub = _ref.sub,
165
- data = _ref.data;
161
+ for (var i = 0; i < this.record.readFeatures.length; i++) {
162
+ var _this$record$readFeat = this.record.readFeatures[i],
163
+ code = _this$record$readFeat.code,
164
+ refPos = _this$record$readFeat.refPos,
165
+ sub = _this$record$readFeat.sub,
166
+ data = _this$record$readFeat.data;
166
167
  sublen = refPos - last_pos;
167
168
  seq += ref.substring(last_pos - refStart, refPos - refStart);
168
169
  last_pos = refPos;
@@ -241,7 +242,7 @@ var CramSlightlyLazyFeature = /*#__PURE__*/function () {
241
242
  oplen = 0;
242
243
  } // else q or Q
243
244
 
244
- });
245
+ }
245
246
  } else {
246
247
  sublen = this.record.readLength - seq.length;
247
248
  }
@@ -359,86 +360,90 @@ var CramSlightlyLazyFeature = /*#__PURE__*/function () {
359
360
  }
360
361
 
361
362
  var start = this.get('start');
362
- var mismatches = [];
363
- readFeatures.forEach(function (args) {
364
- var code = args.code,
365
- pos = args.pos,
366
- data = args.data,
367
- sub = args.sub,
368
- ref = args.ref;
369
- var refPos = args.refPos - 1 - start;
363
+ var mismatches = new Array(readFeatures.length);
364
+ var j = 0;
365
+
366
+ for (var i = 0; i < readFeatures.length; i++) {
367
+ var f = readFeatures[i];
368
+ var code = f.code,
369
+ pos = f.pos,
370
+ data = f.data,
371
+ sub = f.sub,
372
+ ref = f.ref;
373
+ var refPos = f.refPos - 1 - start;
370
374
 
371
375
  if (code === 'X') {
372
376
  // substitution
373
- mismatches.push({
377
+ mismatches[j++] = {
374
378
  start: refPos,
375
379
  length: 1,
376
380
  base: sub,
377
381
  qual: qual === null || qual === void 0 ? void 0 : qual[pos],
378
382
  altbase: ref,
379
383
  type: 'mismatch'
380
- });
384
+ };
381
385
  } else if (code === 'I') {
382
386
  // insertion
383
- mismatches.push({
387
+ mismatches[j++] = {
384
388
  start: refPos,
385
389
  type: 'insertion',
386
390
  base: "".concat(data.length),
387
391
  length: 0
388
- });
392
+ };
389
393
  } else if (code === 'N') {
390
394
  // reference skip
391
- mismatches.push({
395
+ mismatches[j++] = {
392
396
  type: 'skip',
393
397
  length: data,
394
398
  start: refPos,
395
399
  base: 'N'
396
- });
400
+ };
397
401
  } else if (code === 'S') {
398
402
  // soft clip
399
403
  var len = data.length;
400
- mismatches.push({
404
+ mismatches[j++] = {
401
405
  start: refPos,
402
406
  type: 'softclip',
403
407
  base: "S".concat(len),
404
408
  cliplen: len,
405
409
  length: 1
406
- });
410
+ };
407
411
  } else if (code === 'P') {// padding
408
412
  } else if (code === 'H') {
409
413
  // hard clip
410
414
  var _len = data;
411
- mismatches.push({
415
+ mismatches[j++] = {
412
416
  start: refPos,
413
417
  type: 'hardclip',
414
418
  base: "H".concat(_len),
415
419
  cliplen: _len,
416
420
  length: 1
417
- });
421
+ };
418
422
  } else if (code === 'D') {
419
423
  // deletion
420
- mismatches.push({
424
+ mismatches[j++] = {
421
425
  type: 'deletion',
422
426
  length: data,
423
427
  start: refPos,
424
428
  base: '*'
425
- });
429
+ };
426
430
  } else if (code === 'b') {// stretch of bases
427
431
  } else if (code === 'q') {// stretch of qual scores
428
432
  } else if (code === 'B') {// a pair of [base, qual]
429
433
  } else if (code === 'i') {
430
434
  // single-base insertion
431
435
  // insertion
432
- mismatches.push({
436
+ mismatches[j++] = {
433
437
  start: refPos,
434
438
  type: 'insertion',
435
439
  base: data,
436
440
  length: 1
437
- });
441
+ };
438
442
  } else if (code === 'Q') {// single quality value
439
443
  }
440
- });
441
- return mismatches;
444
+ }
445
+
446
+ return mismatches.slice(0, j);
442
447
  }
443
448
  }]);
444
449
  return CramSlightlyLazyFeature;
@@ -430,7 +430,7 @@ var stateModelFactory = function stateModelFactory(configSchema) {
430
430
  displayModel: self,
431
431
  sortedBy: sortedBy,
432
432
  colorBy: colorBy,
433
- filterBy: filterBy,
433
+ filterBy: JSON.parse(JSON.stringify(filterBy)),
434
434
  colorTagMap: JSON.parse(JSON.stringify(colorTagMap)),
435
435
  modificationTagMap: JSON.parse(JSON.stringify(modificationTagMap)),
436
436
  showSoftClip: self.showSoftClipping,
@@ -34,7 +34,7 @@ var TooltipContents = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
34
34
  var total = info === null || info === void 0 ? void 0 : info.total;
35
35
  return /*#__PURE__*/_react.default.createElement("div", {
36
36
  ref: ref
37
- }, /*#__PURE__*/_react.default.createElement("table", null, /*#__PURE__*/_react.default.createElement("caption", null, loc), /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, "Base"), /*#__PURE__*/_react.default.createElement("th", null, "Count"), /*#__PURE__*/_react.default.createElement("th", null, "% of Total"), /*#__PURE__*/_react.default.createElement("th", null, "Strands"), /*#__PURE__*/_react.default.createElement("th", null, "Source"))), /*#__PURE__*/_react.default.createElement("tbody", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("td", null, "Total"), /*#__PURE__*/_react.default.createElement("td", null, total), /*#__PURE__*/_react.default.createElement("td", null)), Object.entries(info).map(function (_ref2) {
37
+ }, /*#__PURE__*/_react.default.createElement("table", null, /*#__PURE__*/_react.default.createElement("caption", null, loc), /*#__PURE__*/_react.default.createElement("thead", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("th", null, "Base"), /*#__PURE__*/_react.default.createElement("th", null, "Count"), /*#__PURE__*/_react.default.createElement("th", null, "% of Total"), /*#__PURE__*/_react.default.createElement("th", null, "Strands"), /*#__PURE__*/_react.default.createElement("th", null, "Source"))), /*#__PURE__*/_react.default.createElement("tbody", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("td", null, "Total"), /*#__PURE__*/_react.default.createElement("td", null, info.total)), /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("td", null, "REF"), /*#__PURE__*/_react.default.createElement("td", null, info.ref), /*#__PURE__*/_react.default.createElement("td", null, info['-1'] ? "".concat(info['-1'], "(-)") : '', info['1'] ? "".concat(info['1'], "(+)") : ''), /*#__PURE__*/_react.default.createElement("td", null)), Object.entries(info).map(function (_ref2) {
38
38
  var _ref3 = (0, _slicedToArray2.default)(_ref2, 2),
39
39
  key = _ref3[0],
40
40
  entry = _ref3[1];
@@ -44,10 +44,9 @@ var TooltipContents = /*#__PURE__*/_react.default.forwardRef(function (_ref, ref
44
44
  base = _ref5[0],
45
45
  score = _ref5[1];
46
46
 
47
- var strands = score.strands;
48
47
  return /*#__PURE__*/_react.default.createElement("tr", {
49
48
  key: base
50
- }, /*#__PURE__*/_react.default.createElement("td", null, base.toUpperCase()), /*#__PURE__*/_react.default.createElement("td", null, score.total), /*#__PURE__*/_react.default.createElement("td", null, base === 'total' || base === 'skip' ? '---' : "".concat(Math.floor(score.total / (total || score.total || 1) * 100), "%")), /*#__PURE__*/_react.default.createElement("td", null, strands['-1'] ? "".concat(strands['-1'], "(-)") : '', strands['1'] ? "".concat(strands['1'], "(+)") : ''), /*#__PURE__*/_react.default.createElement("td", null, key));
49
+ }, /*#__PURE__*/_react.default.createElement("td", null, base.toUpperCase()), /*#__PURE__*/_react.default.createElement("td", null, score.total), /*#__PURE__*/_react.default.createElement("td", null, base === 'total' || base === 'skip' ? '---' : "".concat(Math.floor(score.total / (total || score.total || 1) * 100), "%")), /*#__PURE__*/_react.default.createElement("td", null, score['-1'] ? "".concat(score['-1'], "(-)") : '', score['1'] ? "".concat(score['1'], "(+)") : ''), /*#__PURE__*/_react.default.createElement("td", null, key));
51
50
  });
52
51
  }))));
53
52
  });
@@ -119,7 +119,7 @@ var stateModelFactory = function stateModelFactory(pluginManager, configSchema)
119
119
  // must use getSnapshot because otherwise changes to e.g. just the
120
120
  // colorBy.type are not read
121
121
  colorBy: self.colorBy ? (0, _mobxStateTree.getSnapshot)(self.colorBy) : undefined,
122
- filterBy: self.filterBy
122
+ filterBy: self.filterBy ? (0, _mobxStateTree.getSnapshot)(self.filterBy) : undefined
123
123
  });
124
124
  }
125
125
  };
@@ -7,6 +7,7 @@ export interface PileupLayoutSessionProps {
7
7
  config: AnyConfigurationModel;
8
8
  bpPerPx: number;
9
9
  filters: SerializableFilterChain;
10
+ filterBy: unknown;
10
11
  sortedBy: unknown;
11
12
  showSoftClip: unknown;
12
13
  }
@@ -15,11 +16,13 @@ interface CachedPileupLayout {
15
16
  layout: MyMultiLayout;
16
17
  config: AnyConfigurationModel;
17
18
  filters: SerializableFilterChain;
19
+ filterBy: unknown;
18
20
  sortedBy: unknown;
19
21
  showSoftClip: boolean;
20
22
  }
21
23
  export declare class PileupLayoutSession extends LayoutSession {
22
24
  sortedBy: unknown;
25
+ filterBy: unknown;
23
26
  showSoftClip: boolean;
24
27
  constructor(args: PileupLayoutSessionProps);
25
28
  cachedLayoutIsValid(cachedLayout: CachedPileupLayout): boolean;
@@ -46,6 +46,7 @@ var PileupLayoutSession = /*#__PURE__*/function (_LayoutSession) {
46
46
  (0, _classCallCheck2.default)(this, PileupLayoutSession);
47
47
  _this = _super.call(this, args);
48
48
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sortedBy", void 0);
49
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "filterBy", void 0);
49
50
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "showSoftClip", false);
50
51
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "cachedLayout", void 0);
51
52
  _this.config = args.config;
@@ -55,7 +56,7 @@ var PileupLayoutSession = /*#__PURE__*/function (_LayoutSession) {
55
56
  (0, _createClass2.default)(PileupLayoutSession, [{
56
57
  key: "cachedLayoutIsValid",
57
58
  value: function cachedLayoutIsValid(cachedLayout) {
58
- return (0, _get2.default)((0, _getPrototypeOf2.default)(PileupLayoutSession.prototype), "cachedLayoutIsValid", this).call(this, cachedLayout) && this.showSoftClip === cachedLayout.showSoftClip && (0, _fastDeepEqual.default)(this.sortedBy, cachedLayout.sortedBy);
59
+ return (0, _get2.default)((0, _getPrototypeOf2.default)(PileupLayoutSession.prototype), "cachedLayoutIsValid", this).call(this, cachedLayout) && this.showSoftClip === cachedLayout.showSoftClip && (0, _fastDeepEqual.default)(this.sortedBy, cachedLayout.sortedBy) && (0, _fastDeepEqual.default)(this.filterBy, cachedLayout.filterBy);
59
60
  }
60
61
  }, {
61
62
  key: "layout",
@@ -65,6 +66,7 @@ var PileupLayoutSession = /*#__PURE__*/function (_LayoutSession) {
65
66
  layout: this.makeLayout(),
66
67
  config: (0, _configuration.readConfObject)(this.config),
67
68
  filters: this.filters,
69
+ filterBy: this.filterBy,
68
70
  sortedBy: this.sortedBy,
69
71
  showSoftClip: this.showSoftClip
70
72
  };
@@ -98,7 +98,7 @@ export default class PileupRenderer extends BoxRendererType {
98
98
  charHeight: number;
99
99
  }): void;
100
100
  drawSoftClipping(ctx: CanvasRenderingContext2D, feat: LayoutFeature, props: RenderArgsDeserializedWithFeaturesAndLayout, config: AnyConfigurationModel, theme: Theme): void;
101
- makeImageData(ctx: CanvasRenderingContext2D, layoutRecords: (LayoutFeature | null)[], props: RenderArgsDeserializedWithFeaturesAndLayout): Promise<void>;
101
+ makeImageData(ctx: CanvasRenderingContext2D, layoutRecords: (LayoutFeature | null)[], props: RenderArgsDeserializedWithFeaturesAndLayout): void;
102
102
  layoutFeats(props: RenderArgsDeserializedWithFeaturesAndLayout): (LayoutRecord | null)[];
103
103
  fetchSequence(renderProps: RenderArgsDeserialized): Promise<any>;
104
104
  render(renderProps: RenderArgsDeserialized): Promise<{