@jbrowse/plugin-alignments 1.7.6 → 1.7.9
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/AlignmentsFeatureDetail/AlignmentsFeatureDetail.js +2 -1
- 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 +107 -46
- 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 +2 -1
- package/dist/LinearPileupDisplay/model.js +1 -1
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +2 -3
- package/dist/LinearSNPCoverageDisplay/models/model.d.ts +2 -2
- 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 +15 -2
- package/dist/PileupRenderer/PileupRenderer.js +127 -164
- package/dist/PileupRenderer/configSchema.js +2 -2
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +4 -6
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +92 -96
- package/dist/SNPCoverageRenderer/configSchema.d.ts +1 -1
- package/dist/util.d.ts +1 -1
- package/package.json +3 -3
- package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +2 -1
- package/src/BamAdapter/BamAdapter.ts +3 -3
- package/src/BamAdapter/MismatchParser.test.ts +5 -7
- package/src/BamAdapter/MismatchParser.ts +71 -59
- 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 +72 -71
- package/src/PileupRenderer/configSchema.ts +2 -2
- package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +84 -76
|
@@ -142,7 +142,8 @@ function SupplementaryAlignments(props) {
|
|
|
142
142
|
return /*#__PURE__*/_react.default.createElement("li", {
|
|
143
143
|
key: "".concat(locString, "-").concat(index)
|
|
144
144
|
}, /*#__PURE__*/_react.default.createElement(_core.Link, {
|
|
145
|
-
onClick: function onClick() {
|
|
145
|
+
onClick: function onClick(event) {
|
|
146
|
+
event.preventDefault();
|
|
146
147
|
var view = model.view;
|
|
147
148
|
|
|
148
149
|
try {
|
|
@@ -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[];
|
|
@@ -24,6 +24,7 @@ var _util = require("@jbrowse/core/util");
|
|
|
24
24
|
var _marked = /*#__PURE__*/_regenerator.default.mark(getNextRefPos);
|
|
25
25
|
|
|
26
26
|
var mdRegex = new RegExp(/(\d+|\^[a-z]+|[a-z])/gi);
|
|
27
|
+
var modificationRegex = new RegExp(/([A-Z])([-+])([^,.?]+)([.?])?/);
|
|
27
28
|
|
|
28
29
|
function parseCigar(cigar) {
|
|
29
30
|
return (cigar || '').split(/([MIDNSHPX=])/);
|
|
@@ -243,47 +244,91 @@ function getMismatches(cigar, md, seq, ref, qual) {
|
|
|
243
244
|
|
|
244
245
|
|
|
245
246
|
function getNextRefPos(cigarOps, positions) {
|
|
246
|
-
var
|
|
247
|
+
var readPos, refPos, currPos, i, len, op, _i, _i2;
|
|
248
|
+
|
|
247
249
|
return _regenerator.default.wrap(function getNextRefPos$(_context) {
|
|
248
250
|
while (1) {
|
|
249
251
|
switch (_context.prev = _context.next) {
|
|
250
252
|
case 0:
|
|
251
|
-
cigarIdx = 0;
|
|
252
253
|
readPos = 0;
|
|
253
254
|
refPos = 0;
|
|
255
|
+
currPos = 0;
|
|
254
256
|
i = 0;
|
|
255
257
|
|
|
256
258
|
case 4:
|
|
257
|
-
if (!(i < positions.length)) {
|
|
258
|
-
_context.next =
|
|
259
|
+
if (!(i < cigarOps.length && currPos < positions.length)) {
|
|
260
|
+
_context.next = 31;
|
|
259
261
|
break;
|
|
260
262
|
}
|
|
261
263
|
|
|
262
|
-
|
|
264
|
+
len = +cigarOps[i];
|
|
265
|
+
op = cigarOps[i + 1];
|
|
263
266
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
+
if (!(op === 'S' || op === 'I')) {
|
|
268
|
+
_context.next = 12;
|
|
269
|
+
break;
|
|
270
|
+
}
|
|
267
271
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
refPos += len;
|
|
272
|
-
} else if (op === 'M' || op === 'X' || op === '=') {
|
|
273
|
-
readPos += len;
|
|
274
|
-
refPos += len;
|
|
272
|
+
for (_i = 0; _i < len && currPos < positions.length; _i++) {
|
|
273
|
+
if (positions[currPos] === readPos + _i) {
|
|
274
|
+
currPos++;
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
|
|
278
|
-
|
|
279
|
-
|
|
278
|
+
readPos += len;
|
|
279
|
+
_context.next = 28;
|
|
280
|
+
break;
|
|
281
|
+
|
|
282
|
+
case 12:
|
|
283
|
+
if (!(op === 'D' || op === 'N')) {
|
|
284
|
+
_context.next = 16;
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
refPos += len;
|
|
289
|
+
_context.next = 28;
|
|
290
|
+
break;
|
|
291
|
+
|
|
292
|
+
case 16:
|
|
293
|
+
if (!(op === 'M' || op === 'X' || op === '=')) {
|
|
294
|
+
_context.next = 28;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
_i2 = 0;
|
|
299
|
+
|
|
300
|
+
case 18:
|
|
301
|
+
if (!(_i2 < len && currPos < positions.length)) {
|
|
302
|
+
_context.next = 26;
|
|
303
|
+
break;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (!(positions[currPos] === readPos + _i2)) {
|
|
307
|
+
_context.next = 23;
|
|
308
|
+
break;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
_context.next = 22;
|
|
312
|
+
return refPos + _i2;
|
|
313
|
+
|
|
314
|
+
case 22:
|
|
315
|
+
currPos++;
|
|
316
|
+
|
|
317
|
+
case 23:
|
|
318
|
+
_i2++;
|
|
319
|
+
_context.next = 18;
|
|
320
|
+
break;
|
|
321
|
+
|
|
322
|
+
case 26:
|
|
323
|
+
readPos += len;
|
|
324
|
+
refPos += len;
|
|
280
325
|
|
|
281
|
-
case
|
|
282
|
-
i
|
|
326
|
+
case 28:
|
|
327
|
+
i += 2;
|
|
283
328
|
_context.next = 4;
|
|
284
329
|
break;
|
|
285
330
|
|
|
286
|
-
case
|
|
331
|
+
case 31:
|
|
287
332
|
case "end":
|
|
288
333
|
return _context.stop();
|
|
289
334
|
}
|
|
@@ -293,16 +338,21 @@ function getNextRefPos(cigarOps, positions) {
|
|
|
293
338
|
|
|
294
339
|
function getModificationPositions(mm, fseq, fstrand) {
|
|
295
340
|
var seq = fstrand === -1 ? (0, _util.revcom)(fseq) : fseq;
|
|
296
|
-
|
|
341
|
+
var mods = mm.split(';').filter(function (mod) {
|
|
297
342
|
return !!mod;
|
|
298
|
-
})
|
|
343
|
+
});
|
|
344
|
+
var result = [];
|
|
345
|
+
|
|
346
|
+
for (var i = 0; i < mods.length; i++) {
|
|
347
|
+
var mod = mods[i];
|
|
348
|
+
|
|
299
349
|
var _mod$split = mod.split(','),
|
|
300
350
|
_mod$split2 = (0, _toArray2.default)(_mod$split),
|
|
301
351
|
basemod = _mod$split2[0],
|
|
302
352
|
skips = _mod$split2.slice(1); // regexes based on parse_mm.pl from hts-specs
|
|
303
353
|
|
|
304
354
|
|
|
305
|
-
var matches = basemod.match(
|
|
355
|
+
var matches = basemod.match(modificationRegex);
|
|
306
356
|
|
|
307
357
|
if (!matches) {
|
|
308
358
|
throw new Error('bad format for MM tag');
|
|
@@ -322,39 +372,50 @@ function getModificationPositions(mm, fseq, fstrand) {
|
|
|
322
372
|
if (strand === '-') {
|
|
323
373
|
console.warn('unsupported negative strand modifications'); // make sure to return a somewhat matching type even in this case
|
|
324
374
|
|
|
325
|
-
|
|
375
|
+
result.push({
|
|
326
376
|
type: 'unsupported',
|
|
327
377
|
positions: []
|
|
328
|
-
};
|
|
378
|
+
});
|
|
329
379
|
} // this logic also based on parse_mm.pl from hts-specs is that in the
|
|
330
380
|
// sequence of the read, if we have a modification type e.g. C+m;2 and a
|
|
331
381
|
// sequence ACGTACGTAC we skip the two instances of C and go to the last
|
|
332
382
|
// C
|
|
333
383
|
|
|
334
384
|
|
|
335
|
-
|
|
336
|
-
var
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
385
|
+
for (var j = 0; j < types.length; j++) {
|
|
386
|
+
var type = types[j];
|
|
387
|
+
var _i3 = 0;
|
|
388
|
+
var positions = [];
|
|
389
|
+
|
|
390
|
+
for (var k = 0; k < skips.length; k++) {
|
|
391
|
+
var delta = +skips[k];
|
|
392
|
+
|
|
393
|
+
do {
|
|
394
|
+
if (base === 'N' || base === seq[_i3]) {
|
|
395
|
+
delta--;
|
|
396
|
+
}
|
|
346
397
|
|
|
347
|
-
|
|
348
|
-
|
|
398
|
+
_i3++;
|
|
399
|
+
} while (delta >= 0 && _i3 < seq.length);
|
|
349
400
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
401
|
+
var temp = _i3 - 1;
|
|
402
|
+
positions.push(fstrand === -1 ? seq.length - 1 - temp : temp);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
if (fstrand === -1) {
|
|
406
|
+
positions.sort(function (a, b) {
|
|
353
407
|
return a - b;
|
|
354
|
-
})
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
result.push({
|
|
412
|
+
type: type,
|
|
413
|
+
positions: positions
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return result;
|
|
358
419
|
}
|
|
359
420
|
|
|
360
421
|
function getModificationTypes(mm) {
|
|
@@ -366,7 +427,7 @@ function getModificationTypes(mm) {
|
|
|
366
427
|
_mod$split4 = (0, _slicedToArray2.default)(_mod$split3, 1),
|
|
367
428
|
basemod = _mod$split4[0];
|
|
368
429
|
|
|
369
|
-
var matches = basemod.match(
|
|
430
|
+
var matches = basemod.match(modificationRegex);
|
|
370
431
|
|
|
371
432
|
if (!matches) {
|
|
372
433
|
throw new Error('bad format for MM tag');
|
|
@@ -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;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
1
2
|
import { Feature } from '@jbrowse/core/util';
|
|
2
3
|
import { ContentCopy as ContentCopyIcon } from '@jbrowse/core/ui/Icons';
|
|
3
4
|
import { Instance } from 'mobx-state-tree';
|
|
@@ -232,7 +233,7 @@ declare const stateModelFactory: (configSchema: LinearPileupDisplayConfigModel)
|
|
|
232
233
|
toggleSoftClipping(): void;
|
|
233
234
|
toggleMismatchAlpha(): void;
|
|
234
235
|
setConfig(configuration: AnyConfigurationModel): void;
|
|
235
|
-
setSortedBy(type: string, tag?: string
|
|
236
|
+
setSortedBy(type: string, tag?: string): void;
|
|
236
237
|
setFilterBy(filter: {
|
|
237
238
|
flagInclude: number;
|
|
238
239
|
flagExclude: number;
|
|
@@ -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
|
});
|
|
@@ -305,8 +305,8 @@ declare const stateModelFactory: (pluginManager: PluginManager, configSchema: An
|
|
|
305
305
|
}): void;
|
|
306
306
|
setColorBy(colorBy?: {
|
|
307
307
|
type: string;
|
|
308
|
-
tag?: string
|
|
309
|
-
}
|
|
308
|
+
tag?: string;
|
|
309
|
+
}): void;
|
|
310
310
|
updateModificationColorMap(uniqueModifications: string[]): void;
|
|
311
311
|
} & {
|
|
312
312
|
readonly rendererConfig: any;
|
|
@@ -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
|
};
|