@jbrowse/plugin-alignments 1.7.5 → 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.
- package/dist/BamAdapter/BamAdapter.d.ts +1 -1
- package/dist/BamAdapter/BamAdapter.js +3 -3
- package/dist/BamAdapter/MismatchParser.d.ts +2 -5
- package/dist/BamAdapter/MismatchParser.js +104 -44
- package/dist/BamAdapter/MismatchParser.test.js +6 -14
- package/dist/CramAdapter/CramAdapter.d.ts +10 -9
- package/dist/CramAdapter/CramAdapter.js +6 -6
- package/dist/CramAdapter/CramSlightlyLazyFeature.js +35 -30
- package/dist/LinearPileupDisplay/model.d.ts +1 -0
- package/dist/LinearPileupDisplay/model.js +1 -1
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +2 -3
- package/dist/LinearSNPCoverageDisplay/models/model.js +1 -1
- package/dist/PileupRenderer/PileupLayoutSession.d.ts +3 -0
- package/dist/PileupRenderer/PileupLayoutSession.js +3 -1
- package/dist/PileupRenderer/PileupRenderer.d.ts +2 -1
- package/dist/PileupRenderer/PileupRenderer.js +125 -162
- package/dist/PileupRenderer/configSchema.js +2 -2
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +4 -6
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +92 -96
- package/dist/util.d.ts +1 -1
- package/package.json +3 -3
- package/src/BamAdapter/BamAdapter.ts +3 -3
- package/src/BamAdapter/MismatchParser.test.ts +5 -7
- package/src/BamAdapter/MismatchParser.ts +69 -58
- package/src/CramAdapter/CramAdapter.ts +14 -10
- package/src/CramAdapter/CramSlightlyLazyFeature.ts +84 -91
- package/src/LinearPileupDisplay/model.ts +1 -1
- package/src/LinearSNPCoverageDisplay/components/Tooltip.tsx +32 -25
- package/src/LinearSNPCoverageDisplay/models/model.ts +1 -1
- package/src/PileupRenderer/PileupLayoutSession.ts +6 -1
- package/src/PileupRenderer/PileupRenderer.tsx +70 -68
- package/src/PileupRenderer/configSchema.ts +2 -2
- 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
|
-
|
|
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,
|
|
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,
|
|
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 (!(
|
|
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
|
|
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 =
|
|
258
|
+
if (!(i < cigarOps.length && currPos < positions.length)) {
|
|
259
|
+
_context.next = 31;
|
|
259
260
|
break;
|
|
260
261
|
}
|
|
261
262
|
|
|
262
|
-
|
|
263
|
+
len = +cigarOps[i];
|
|
264
|
+
op = cigarOps[i + 1];
|
|
263
265
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
266
|
+
if (!(op === 'S' || op === 'I')) {
|
|
267
|
+
_context.next = 12;
|
|
268
|
+
break;
|
|
269
|
+
}
|
|
267
270
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
279
|
-
|
|
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
|
|
282
|
-
i
|
|
325
|
+
case 28:
|
|
326
|
+
i += 2;
|
|
283
327
|
_context.next = 4;
|
|
284
328
|
break;
|
|
285
329
|
|
|
286
|
-
case
|
|
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
|
-
|
|
340
|
+
var mods = mm.split(';').filter(function (mod) {
|
|
297
341
|
return !!mod;
|
|
298
|
-
})
|
|
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
|
-
|
|
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
|
-
|
|
336
|
-
var
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
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
|
-
|
|
348
|
-
|
|
397
|
+
_i3++;
|
|
398
|
+
} while (delta >= 0 && _i3 < seq.length);
|
|
349
399
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
229
|
-
var cigar = (0, _MismatchParser.parseCigar)('
|
|
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,
|
|
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,
|
|
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 (
|
|
523
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
524
|
-
|
|
525
|
-
return record.
|
|
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.
|
|
162
|
-
var
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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,
|
|
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
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
1
2
|
import BoxRendererType, { RenderArgs, RenderArgsSerialized, RenderArgsDeserialized as BoxRenderArgsDeserialized, RenderResults, ResultsSerialized, ResultsDeserialized } from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType';
|
|
2
3
|
import { Theme } from '@material-ui/core';
|
|
3
4
|
import { Region, Feature } from '@jbrowse/core/util';
|
|
@@ -97,7 +98,7 @@ export default class PileupRenderer extends BoxRendererType {
|
|
|
97
98
|
charHeight: number;
|
|
98
99
|
}): void;
|
|
99
100
|
drawSoftClipping(ctx: CanvasRenderingContext2D, feat: LayoutFeature, props: RenderArgsDeserializedWithFeaturesAndLayout, config: AnyConfigurationModel, theme: Theme): void;
|
|
100
|
-
makeImageData(ctx: CanvasRenderingContext2D, layoutRecords: (LayoutFeature | null)[], props: RenderArgsDeserializedWithFeaturesAndLayout):
|
|
101
|
+
makeImageData(ctx: CanvasRenderingContext2D, layoutRecords: (LayoutFeature | null)[], props: RenderArgsDeserializedWithFeaturesAndLayout): void;
|
|
101
102
|
layoutFeats(props: RenderArgsDeserializedWithFeaturesAndLayout): (LayoutRecord | null)[];
|
|
102
103
|
fetchSequence(renderProps: RenderArgsDeserialized): Promise<any>;
|
|
103
104
|
render(renderProps: RenderArgsDeserialized): Promise<{
|