@jbrowse/plugin-alignments 1.7.7 → 1.7.10
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 +13 -3
- package/dist/AlignmentsFeatureDetail/index.d.ts +28 -3
- package/dist/AlignmentsFeatureDetail/index.js +6 -17
- 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 +108 -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 +6 -3
- package/dist/LinearPileupDisplay/model.js +132 -51
- package/dist/LinearSNPCoverageDisplay/components/Tooltip.js +37 -17
- 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 +66 -9
- package/dist/PileupRenderer/PileupRenderer.js +296 -258
- package/dist/PileupRenderer/configSchema.js +2 -2
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.d.ts +6 -6
- package/dist/SNPCoverageAdapter/SNPCoverageAdapter.js +95 -96
- package/dist/SNPCoverageRenderer/configSchema.d.ts +1 -1
- package/package.json +3 -3
- package/src/AlignmentsFeatureDetail/AlignmentsFeatureDetail.tsx +14 -3
- package/src/AlignmentsFeatureDetail/index.ts +7 -17
- package/src/BamAdapter/BamAdapter.ts +3 -3
- package/src/BamAdapter/MismatchParser.test.ts +5 -7
- package/src/BamAdapter/MismatchParser.ts +72 -59
- package/src/CramAdapter/CramAdapter.ts +14 -10
- package/src/CramAdapter/CramSlightlyLazyFeature.ts +84 -91
- package/src/LinearPileupDisplay/model.ts +76 -24
- package/src/LinearSNPCoverageDisplay/components/Tooltip.tsx +41 -20
- package/src/LinearSNPCoverageDisplay/models/model.ts +1 -1
- package/src/PileupRenderer/PileupLayoutSession.ts +6 -1
- package/src/PileupRenderer/PileupRenderer.tsx +413 -225
- package/src/PileupRenderer/configSchema.ts +2 -2
- package/src/SNPCoverageAdapter/SNPCoverageAdapter.ts +89 -76
|
@@ -76,15 +76,24 @@ function Formatter(_ref) {
|
|
|
76
76
|
show = _useState2[0],
|
|
77
77
|
setShow = _useState2[1];
|
|
78
78
|
|
|
79
|
+
var _useState3 = (0, _react.useState)(false),
|
|
80
|
+
_useState4 = (0, _slicedToArray2.default)(_useState3, 2),
|
|
81
|
+
copied = _useState4[0],
|
|
82
|
+
setCopied = _useState4[1];
|
|
83
|
+
|
|
79
84
|
var display = String(value);
|
|
80
85
|
|
|
81
86
|
if (display.length > 100) {
|
|
82
87
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("button", {
|
|
83
88
|
type: "button",
|
|
84
89
|
onClick: function onClick() {
|
|
85
|
-
|
|
90
|
+
(0, _copyToClipboard.default)(display);
|
|
91
|
+
setCopied(true);
|
|
92
|
+
setTimeout(function () {
|
|
93
|
+
setCopied(false);
|
|
94
|
+
}, 700);
|
|
86
95
|
}
|
|
87
|
-
},
|
|
96
|
+
}, copied ? 'Copied to clipboard' : 'Copy'), /*#__PURE__*/_react.default.createElement("button", {
|
|
88
97
|
type: "button",
|
|
89
98
|
onClick: function onClick() {
|
|
90
99
|
return setShow(function (val) {
|
|
@@ -142,7 +151,8 @@ function SupplementaryAlignments(props) {
|
|
|
142
151
|
return /*#__PURE__*/_react.default.createElement("li", {
|
|
143
152
|
key: "".concat(locString, "-").concat(index)
|
|
144
153
|
}, /*#__PURE__*/_react.default.createElement(_core.Link, {
|
|
145
|
-
onClick: function onClick() {
|
|
154
|
+
onClick: function onClick(event) {
|
|
155
|
+
event.preventDefault();
|
|
146
156
|
var view = model.view;
|
|
147
157
|
|
|
148
158
|
try {
|
|
@@ -2,12 +2,37 @@ import PluginManager from '@jbrowse/core/PluginManager';
|
|
|
2
2
|
declare const configSchema: import("@jbrowse/core/configuration").AnyConfigurationSchemaType;
|
|
3
3
|
export declare function stateModelFactory(pluginManager: PluginManager): import("mobx-state-tree").IModelType<{
|
|
4
4
|
id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
5
|
-
type: import("mobx-state-tree").ISimpleType<"
|
|
5
|
+
type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
|
|
6
6
|
featureData: import("mobx-state-tree").IType<any, any, any>;
|
|
7
|
+
formattedFields: import("mobx-state-tree").IType<any, any, any>;
|
|
8
|
+
unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
|
|
7
9
|
view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
10
|
+
track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
11
|
+
} & {
|
|
12
|
+
type: import("mobx-state-tree").ISimpleType<"AlignmentsFeatureWidget">;
|
|
8
13
|
}, {
|
|
9
|
-
setFeatureData(
|
|
14
|
+
setFeatureData(featureData: Record<string, unknown>): void;
|
|
10
15
|
clearFeatureData(): void;
|
|
11
|
-
|
|
16
|
+
setFormattedData(feat: Record<string, unknown>): void;
|
|
17
|
+
} & {
|
|
18
|
+
afterCreate(): void;
|
|
19
|
+
}, {
|
|
20
|
+
type: "BaseFeatureWidget";
|
|
21
|
+
} & Partial<import("mobx-state-tree/dist/internal").ExtractCFromProps<{
|
|
22
|
+
id: import("mobx-state-tree").IOptionalIType<import("mobx-state-tree").ISimpleType<string>, [undefined]>;
|
|
23
|
+
type: import("mobx-state-tree").ISimpleType<"BaseFeatureWidget">;
|
|
24
|
+
featureData: import("mobx-state-tree").IType<any, any, any>;
|
|
25
|
+
formattedFields: import("mobx-state-tree").IType<any, any, any>;
|
|
26
|
+
unformattedFeatureData: import("mobx-state-tree").IType<any, any, any>;
|
|
27
|
+
view: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
28
|
+
track: import("mobx-state-tree").IMaybe<import("mobx-state-tree").IReferenceType<import("mobx-state-tree").IAnyType>>;
|
|
29
|
+
}>> & import("mobx-state-tree")._NotCustomized, {
|
|
30
|
+
id: string;
|
|
31
|
+
type: "BaseFeatureWidget";
|
|
32
|
+
formattedFields: any;
|
|
33
|
+
view: import("mobx-state-tree").ReferenceIdentifier | undefined;
|
|
34
|
+
track: import("mobx-state-tree").ReferenceIdentifier | undefined;
|
|
35
|
+
finalizedFeatureData: any;
|
|
36
|
+
} & import("mobx-state-tree")._NotCustomized>;
|
|
12
37
|
export default function register(pluginManager: PluginManager): void;
|
|
13
38
|
export { configSchema };
|
|
@@ -15,12 +15,12 @@ var _react = require("react");
|
|
|
15
15
|
|
|
16
16
|
var _configuration = require("@jbrowse/core/configuration");
|
|
17
17
|
|
|
18
|
-
var _mst = require("@jbrowse/core/util/types/mst");
|
|
19
|
-
|
|
20
18
|
var _mobxStateTree = require("mobx-state-tree");
|
|
21
19
|
|
|
22
20
|
var _WidgetType = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/WidgetType"));
|
|
23
21
|
|
|
22
|
+
var _BaseFeatureWidget = require("@jbrowse/core/BaseFeatureWidget");
|
|
23
|
+
|
|
24
24
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
25
|
|
|
26
26
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || (0, _typeof2.default)(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -29,21 +29,10 @@ var configSchema = (0, _configuration.ConfigurationSchema)('AlignmentsFeatureWid
|
|
|
29
29
|
exports.configSchema = configSchema;
|
|
30
30
|
|
|
31
31
|
function stateModelFactory(pluginManager) {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
type: _mobxStateTree.types.literal('AlignmentsFeatureWidget')
|
|
35
|
-
|
|
36
|
-
view: _mobxStateTree.types.safeReference(pluginManager.pluggableMstType('view', 'stateModel'))
|
|
37
|
-
}).actions(function (self) {
|
|
38
|
-
return {
|
|
39
|
-
setFeatureData: function setFeatureData(data) {
|
|
40
|
-
self.featureData = data;
|
|
41
|
-
},
|
|
42
|
-
clearFeatureData: function clearFeatureData() {
|
|
43
|
-
self.featureData = undefined;
|
|
44
|
-
}
|
|
45
|
-
};
|
|
46
|
-
});
|
|
32
|
+
var baseModel = (0, _BaseFeatureWidget.stateModelFactory)(pluginManager);
|
|
33
|
+
return _mobxStateTree.types.compose(baseModel, _mobxStateTree.types.model('AlignmentsFeatureWidget', {
|
|
34
|
+
type: _mobxStateTree.types.literal('AlignmentsFeatureWidget')
|
|
35
|
+
}));
|
|
47
36
|
}
|
|
48
37
|
|
|
49
38
|
function register(pluginManager) {
|
|
@@ -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=])/);
|
|
@@ -50,6 +51,7 @@ function cigarToMismatches(ops, seq, ref, qual) {
|
|
|
50
51
|
start: roffset + j,
|
|
51
52
|
type: 'mismatch',
|
|
52
53
|
base: seq[soffset + j],
|
|
54
|
+
altbase: ref[roffset + j],
|
|
53
55
|
length: 1
|
|
54
56
|
});
|
|
55
57
|
}
|
|
@@ -243,47 +245,91 @@ function getMismatches(cigar, md, seq, ref, qual) {
|
|
|
243
245
|
|
|
244
246
|
|
|
245
247
|
function getNextRefPos(cigarOps, positions) {
|
|
246
|
-
var
|
|
248
|
+
var readPos, refPos, currPos, i, len, op, _i, _i2;
|
|
249
|
+
|
|
247
250
|
return _regenerator.default.wrap(function getNextRefPos$(_context) {
|
|
248
251
|
while (1) {
|
|
249
252
|
switch (_context.prev = _context.next) {
|
|
250
253
|
case 0:
|
|
251
|
-
cigarIdx = 0;
|
|
252
254
|
readPos = 0;
|
|
253
255
|
refPos = 0;
|
|
256
|
+
currPos = 0;
|
|
254
257
|
i = 0;
|
|
255
258
|
|
|
256
259
|
case 4:
|
|
257
|
-
if (!(i < positions.length)) {
|
|
258
|
-
_context.next =
|
|
260
|
+
if (!(i < cigarOps.length && currPos < positions.length)) {
|
|
261
|
+
_context.next = 31;
|
|
259
262
|
break;
|
|
260
263
|
}
|
|
261
264
|
|
|
262
|
-
|
|
265
|
+
len = +cigarOps[i];
|
|
266
|
+
op = cigarOps[i + 1];
|
|
263
267
|
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
268
|
+
if (!(op === 'S' || op === 'I')) {
|
|
269
|
+
_context.next = 12;
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
267
272
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
refPos += len;
|
|
272
|
-
} else if (op === 'M' || op === 'X' || op === '=') {
|
|
273
|
-
readPos += len;
|
|
274
|
-
refPos += len;
|
|
273
|
+
for (_i = 0; _i < len && currPos < positions.length; _i++) {
|
|
274
|
+
if (positions[currPos] === readPos + _i) {
|
|
275
|
+
currPos++;
|
|
275
276
|
}
|
|
276
277
|
}
|
|
277
278
|
|
|
278
|
-
|
|
279
|
-
|
|
279
|
+
readPos += len;
|
|
280
|
+
_context.next = 28;
|
|
281
|
+
break;
|
|
282
|
+
|
|
283
|
+
case 12:
|
|
284
|
+
if (!(op === 'D' || op === 'N')) {
|
|
285
|
+
_context.next = 16;
|
|
286
|
+
break;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
refPos += len;
|
|
290
|
+
_context.next = 28;
|
|
291
|
+
break;
|
|
292
|
+
|
|
293
|
+
case 16:
|
|
294
|
+
if (!(op === 'M' || op === 'X' || op === '=')) {
|
|
295
|
+
_context.next = 28;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
_i2 = 0;
|
|
300
|
+
|
|
301
|
+
case 18:
|
|
302
|
+
if (!(_i2 < len && currPos < positions.length)) {
|
|
303
|
+
_context.next = 26;
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
if (!(positions[currPos] === readPos + _i2)) {
|
|
308
|
+
_context.next = 23;
|
|
309
|
+
break;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
_context.next = 22;
|
|
313
|
+
return refPos + _i2;
|
|
314
|
+
|
|
315
|
+
case 22:
|
|
316
|
+
currPos++;
|
|
317
|
+
|
|
318
|
+
case 23:
|
|
319
|
+
_i2++;
|
|
320
|
+
_context.next = 18;
|
|
321
|
+
break;
|
|
322
|
+
|
|
323
|
+
case 26:
|
|
324
|
+
readPos += len;
|
|
325
|
+
refPos += len;
|
|
280
326
|
|
|
281
|
-
case
|
|
282
|
-
i
|
|
327
|
+
case 28:
|
|
328
|
+
i += 2;
|
|
283
329
|
_context.next = 4;
|
|
284
330
|
break;
|
|
285
331
|
|
|
286
|
-
case
|
|
332
|
+
case 31:
|
|
287
333
|
case "end":
|
|
288
334
|
return _context.stop();
|
|
289
335
|
}
|
|
@@ -293,16 +339,21 @@ function getNextRefPos(cigarOps, positions) {
|
|
|
293
339
|
|
|
294
340
|
function getModificationPositions(mm, fseq, fstrand) {
|
|
295
341
|
var seq = fstrand === -1 ? (0, _util.revcom)(fseq) : fseq;
|
|
296
|
-
|
|
342
|
+
var mods = mm.split(';').filter(function (mod) {
|
|
297
343
|
return !!mod;
|
|
298
|
-
})
|
|
344
|
+
});
|
|
345
|
+
var result = [];
|
|
346
|
+
|
|
347
|
+
for (var i = 0; i < mods.length; i++) {
|
|
348
|
+
var mod = mods[i];
|
|
349
|
+
|
|
299
350
|
var _mod$split = mod.split(','),
|
|
300
351
|
_mod$split2 = (0, _toArray2.default)(_mod$split),
|
|
301
352
|
basemod = _mod$split2[0],
|
|
302
353
|
skips = _mod$split2.slice(1); // regexes based on parse_mm.pl from hts-specs
|
|
303
354
|
|
|
304
355
|
|
|
305
|
-
var matches = basemod.match(
|
|
356
|
+
var matches = basemod.match(modificationRegex);
|
|
306
357
|
|
|
307
358
|
if (!matches) {
|
|
308
359
|
throw new Error('bad format for MM tag');
|
|
@@ -322,39 +373,50 @@ function getModificationPositions(mm, fseq, fstrand) {
|
|
|
322
373
|
if (strand === '-') {
|
|
323
374
|
console.warn('unsupported negative strand modifications'); // make sure to return a somewhat matching type even in this case
|
|
324
375
|
|
|
325
|
-
|
|
376
|
+
result.push({
|
|
326
377
|
type: 'unsupported',
|
|
327
378
|
positions: []
|
|
328
|
-
};
|
|
379
|
+
});
|
|
329
380
|
} // this logic also based on parse_mm.pl from hts-specs is that in the
|
|
330
381
|
// sequence of the read, if we have a modification type e.g. C+m;2 and a
|
|
331
382
|
// sequence ACGTACGTAC we skip the two instances of C and go to the last
|
|
332
383
|
// C
|
|
333
384
|
|
|
334
385
|
|
|
335
|
-
|
|
336
|
-
var
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
386
|
+
for (var j = 0; j < types.length; j++) {
|
|
387
|
+
var type = types[j];
|
|
388
|
+
var _i3 = 0;
|
|
389
|
+
var positions = [];
|
|
390
|
+
|
|
391
|
+
for (var k = 0; k < skips.length; k++) {
|
|
392
|
+
var delta = +skips[k];
|
|
393
|
+
|
|
394
|
+
do {
|
|
395
|
+
if (base === 'N' || base === seq[_i3]) {
|
|
396
|
+
delta--;
|
|
397
|
+
}
|
|
346
398
|
|
|
347
|
-
|
|
348
|
-
|
|
399
|
+
_i3++;
|
|
400
|
+
} while (delta >= 0 && _i3 < seq.length);
|
|
349
401
|
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
402
|
+
var temp = _i3 - 1;
|
|
403
|
+
positions.push(fstrand === -1 ? seq.length - 1 - temp : temp);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
if (fstrand === -1) {
|
|
407
|
+
positions.sort(function (a, b) {
|
|
353
408
|
return a - b;
|
|
354
|
-
})
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
result.push({
|
|
413
|
+
type: type,
|
|
414
|
+
positions: positions
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
return result;
|
|
358
420
|
}
|
|
359
421
|
|
|
360
422
|
function getModificationTypes(mm) {
|
|
@@ -366,7 +428,7 @@ function getModificationTypes(mm) {
|
|
|
366
428
|
_mod$split4 = (0, _slicedToArray2.default)(_mod$split3, 1),
|
|
367
429
|
basemod = _mod$split4[0];
|
|
368
430
|
|
|
369
|
-
var matches = basemod.match(
|
|
431
|
+
var matches = basemod.match(modificationRegex);
|
|
370
432
|
|
|
371
433
|
if (!matches) {
|
|
372
434
|
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;
|