@jbrowse/plugin-variants 1.6.7 → 1.7.0

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.
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
13
+
14
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
15
+
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+
18
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
19
+
20
+ var _get2 = _interopRequireDefault(require("@babel/runtime/helpers/get"));
21
+
22
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
23
+
24
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
25
+
26
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
27
+
28
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
29
+
30
+ var _BaseAdapter = require("@jbrowse/core/data_adapters/BaseAdapter");
31
+
32
+ var _io = require("@jbrowse/core/util/io");
33
+
34
+ var _util = require("@jbrowse/core/util");
35
+
36
+ var _rxjs = require("@jbrowse/core/util/rxjs");
37
+
38
+ var _tabix = require("@gmod/tabix");
39
+
40
+ var _vcf = _interopRequireDefault(require("@gmod/vcf"));
41
+
42
+ var _configuration = require("@jbrowse/core/configuration");
43
+
44
+ var _VcfFeature = _interopRequireDefault(require("./VcfFeature"));
45
+
46
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
47
+
48
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
49
+
50
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
51
+
52
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
53
+
54
+ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
55
+ (0, _inherits2["default"])(_default, _BaseFeatureDataAdapt);
56
+
57
+ var _super = _createSuper(_default);
58
+
59
+ function _default() {
60
+ var _this;
61
+
62
+ (0, _classCallCheck2["default"])(this, _default);
63
+
64
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
65
+ args[_key] = arguments[_key];
66
+ }
67
+
68
+ _this = _super.call.apply(_super, [this].concat(args));
69
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "configured", void 0);
70
+ return _this;
71
+ }
72
+
73
+ (0, _createClass2["default"])(_default, [{
74
+ key: "configurePre",
75
+ value: function () {
76
+ var _configurePre = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
77
+ var vcfGzLocation, location, indexType, filehandle, isCSI, vcf, header;
78
+ return _regenerator["default"].wrap(function _callee$(_context) {
79
+ while (1) {
80
+ switch (_context.prev = _context.next) {
81
+ case 0:
82
+ vcfGzLocation = (0, _configuration.readConfObject)(this.config, 'vcfGzLocation');
83
+ location = (0, _configuration.readConfObject)(this.config, ['index', 'location']);
84
+ indexType = (0, _configuration.readConfObject)(this.config, ['index', 'indexType']);
85
+ filehandle = (0, _io.openLocation)(vcfGzLocation, this.pluginManager);
86
+ isCSI = indexType === 'CSI';
87
+ vcf = new _tabix.TabixIndexedFile({
88
+ filehandle: filehandle,
89
+ csiFilehandle: isCSI ? (0, _io.openLocation)(location, this.pluginManager) : undefined,
90
+ tbiFilehandle: !isCSI ? (0, _io.openLocation)(location, this.pluginManager) : undefined,
91
+ chunkCacheSize: 50 * Math.pow(2, 20),
92
+ chunkSizeLimit: 1000000000
93
+ });
94
+ _context.next = 8;
95
+ return vcf.getHeader();
96
+
97
+ case 8:
98
+ header = _context.sent;
99
+ return _context.abrupt("return", {
100
+ filehandle: filehandle,
101
+ vcf: vcf,
102
+ parser: new _vcf["default"]({
103
+ header: header
104
+ })
105
+ });
106
+
107
+ case 10:
108
+ case "end":
109
+ return _context.stop();
110
+ }
111
+ }
112
+ }, _callee, this);
113
+ }));
114
+
115
+ function configurePre() {
116
+ return _configurePre.apply(this, arguments);
117
+ }
118
+
119
+ return configurePre;
120
+ }()
121
+ }, {
122
+ key: "configure",
123
+ value: function () {
124
+ var _configure = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
125
+ var _this2 = this;
126
+
127
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
128
+ while (1) {
129
+ switch (_context2.prev = _context2.next) {
130
+ case 0:
131
+ if (!this.configured) {
132
+ this.configured = this.configurePre()["catch"](function (e) {
133
+ _this2.configured = undefined;
134
+ throw e;
135
+ });
136
+ }
137
+
138
+ return _context2.abrupt("return", this.configured);
139
+
140
+ case 2:
141
+ case "end":
142
+ return _context2.stop();
143
+ }
144
+ }
145
+ }, _callee2, this);
146
+ }));
147
+
148
+ function configure() {
149
+ return _configure.apply(this, arguments);
150
+ }
151
+
152
+ return configure;
153
+ }()
154
+ }, {
155
+ key: "getRefNames",
156
+ value: function () {
157
+ var _getRefNames = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
158
+ var opts,
159
+ _yield$this$configure,
160
+ vcf,
161
+ _args3 = arguments;
162
+
163
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
164
+ while (1) {
165
+ switch (_context3.prev = _context3.next) {
166
+ case 0:
167
+ opts = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
168
+ _context3.next = 3;
169
+ return this.configure();
170
+
171
+ case 3:
172
+ _yield$this$configure = _context3.sent;
173
+ vcf = _yield$this$configure.vcf;
174
+ return _context3.abrupt("return", vcf.getReferenceSequenceNames(opts));
175
+
176
+ case 6:
177
+ case "end":
178
+ return _context3.stop();
179
+ }
180
+ }
181
+ }, _callee3, this);
182
+ }));
183
+
184
+ function getRefNames() {
185
+ return _getRefNames.apply(this, arguments);
186
+ }
187
+
188
+ return getRefNames;
189
+ }()
190
+ }, {
191
+ key: "getHeader",
192
+ value: function () {
193
+ var _getHeader = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
194
+ var _yield$this$configure2, vcf;
195
+
196
+ return _regenerator["default"].wrap(function _callee4$(_context4) {
197
+ while (1) {
198
+ switch (_context4.prev = _context4.next) {
199
+ case 0:
200
+ _context4.next = 2;
201
+ return this.configure();
202
+
203
+ case 2:
204
+ _yield$this$configure2 = _context4.sent;
205
+ vcf = _yield$this$configure2.vcf;
206
+ return _context4.abrupt("return", vcf.getHeader());
207
+
208
+ case 5:
209
+ case "end":
210
+ return _context4.stop();
211
+ }
212
+ }
213
+ }, _callee4, this);
214
+ }));
215
+
216
+ function getHeader() {
217
+ return _getHeader.apply(this, arguments);
218
+ }
219
+
220
+ return getHeader;
221
+ }()
222
+ }, {
223
+ key: "getMetadata",
224
+ value: function () {
225
+ var _getMetadata = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
226
+ var _yield$this$configure3, parser;
227
+
228
+ return _regenerator["default"].wrap(function _callee5$(_context5) {
229
+ while (1) {
230
+ switch (_context5.prev = _context5.next) {
231
+ case 0:
232
+ _context5.next = 2;
233
+ return this.configure();
234
+
235
+ case 2:
236
+ _yield$this$configure3 = _context5.sent;
237
+ parser = _yield$this$configure3.parser;
238
+ return _context5.abrupt("return", parser.getMetadata());
239
+
240
+ case 5:
241
+ case "end":
242
+ return _context5.stop();
243
+ }
244
+ }
245
+ }, _callee5, this);
246
+ }));
247
+
248
+ function getMetadata() {
249
+ return _getMetadata.apply(this, arguments);
250
+ }
251
+
252
+ return getMetadata;
253
+ }()
254
+ }, {
255
+ key: "getFeatures",
256
+ value: function getFeatures(query) {
257
+ var _this3 = this;
258
+
259
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
260
+ return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
261
+ var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee6(observer) {
262
+ var refName, start, end, _yield$_this3$configu, vcf, parser;
263
+
264
+ return _regenerator["default"].wrap(function _callee6$(_context6) {
265
+ while (1) {
266
+ switch (_context6.prev = _context6.next) {
267
+ case 0:
268
+ refName = query.refName, start = query.start, end = query.end;
269
+ _context6.next = 3;
270
+ return _this3.configure();
271
+
272
+ case 3:
273
+ _yield$_this3$configu = _context6.sent;
274
+ vcf = _yield$_this3$configu.vcf;
275
+ parser = _yield$_this3$configu.parser;
276
+ _context6.next = 8;
277
+ return vcf.getLines(refName, start, end, _objectSpread({
278
+ lineCallback: function lineCallback(line, fileOffset) {
279
+ observer.next(new _VcfFeature["default"]({
280
+ variant: parser.parseLine(line),
281
+ parser: parser,
282
+ id: "".concat(_this3.id, "-vcf-").concat(fileOffset)
283
+ }));
284
+ }
285
+ }, opts));
286
+
287
+ case 8:
288
+ observer.complete();
289
+
290
+ case 9:
291
+ case "end":
292
+ return _context6.stop();
293
+ }
294
+ }
295
+ }, _callee6);
296
+ }));
297
+
298
+ return function (_x) {
299
+ return _ref.apply(this, arguments);
300
+ };
301
+ }(), opts.signal);
302
+ }
303
+ /**
304
+ * Checks if the data source has data for the given reference sequence,
305
+ * and then gets the features in the region if it does
306
+ *
307
+ * Currently this just calls getFeatureInRegion for each region. Adapters that
308
+ * are frequently called on multiple regions simultaneously may want to
309
+ * implement a more efficient custom version of this method.
310
+ *
311
+ * Also includes a bit of extra logging to warn when fetching a large portion
312
+ * of a VCF
313
+ * @param regions - Regions
314
+ * @param opts - Feature adapter options
315
+ * @returns Observable of Feature objects in the regions
316
+ */
317
+
318
+ }, {
319
+ key: "getFeaturesInMultipleRegions",
320
+ value: function getFeaturesInMultipleRegions(regions) {
321
+ var _this4 = this;
322
+
323
+ var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
324
+ // TODO: restore commented version below once TSDX supports Rollup v2
325
+ // xref: https://github.com/rollup/rollup/blob/master/CHANGELOG.md#bug-fixes-45
326
+ var superGetFeaturesInMultipleRegions = (0, _get2["default"])((0, _getPrototypeOf2["default"])(_default.prototype), "getFeaturesInMultipleRegions", this);
327
+ return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
328
+ var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(observer) {
329
+ var _yield$_this4$configu, vcf, bytes, _yield$_this4$configu2, filehandle, stat, pct;
330
+
331
+ return _regenerator["default"].wrap(function _callee7$(_context7) {
332
+ while (1) {
333
+ switch (_context7.prev = _context7.next) {
334
+ case 0:
335
+ _context7.next = 2;
336
+ return _this4.configure();
337
+
338
+ case 2:
339
+ _yield$_this4$configu = _context7.sent;
340
+ vcf = _yield$_this4$configu.vcf;
341
+ _context7.next = 6;
342
+ return (0, _util.bytesForRegions)(regions, vcf.index);
343
+
344
+ case 6:
345
+ bytes = _context7.sent;
346
+ _context7.next = 9;
347
+ return _this4.configure();
348
+
349
+ case 9:
350
+ _yield$_this4$configu2 = _context7.sent;
351
+ filehandle = _yield$_this4$configu2.filehandle;
352
+ _context7.next = 13;
353
+ return filehandle.stat();
354
+
355
+ case 13:
356
+ stat = _context7.sent;
357
+ pct = Math.round(bytes / stat.size * 100);
358
+
359
+ if (pct > 100) {
360
+ // this is just a bad estimate, make 100% if it goes over
361
+ pct = 100;
362
+ }
363
+
364
+ if (pct > 60) {
365
+ console.warn("getFeaturesInMultipleRegions fetching ".concat(pct, "% of VCF file, but whole-file streaming not yet implemented"));
366
+ }
367
+
368
+ superGetFeaturesInMultipleRegions.call(_this4, regions, opts).subscribe(observer); // super.getFeaturesInMultipleRegions(regions, opts).subscribe(observer)
369
+
370
+ case 18:
371
+ case "end":
372
+ return _context7.stop();
373
+ }
374
+ }
375
+ }, _callee7);
376
+ }));
377
+
378
+ return function (_x2) {
379
+ return _ref2.apply(this, arguments);
380
+ };
381
+ }());
382
+ }
383
+ }, {
384
+ key: "freeResources",
385
+ value: function
386
+ /* { region } */
387
+ freeResources() {}
388
+ }]);
389
+ return _default;
390
+ }(_BaseAdapter.BaseFeatureDataAdapter);
391
+
392
+ exports["default"] = _default;
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _operators = require("rxjs/operators");
10
+
11
+ var _VcfTabixAdapter = _interopRequireDefault(require("./VcfTabixAdapter"));
12
+
13
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
14
+
15
+ test('adapter can fetch variants from volvox.vcf.gz', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
16
+ var adapter, csiAdapter, csiFeatures, names, csiNames, features, featuresArray, csiFeaturesArray, featuresNonExist, featuresArrayNonExist;
17
+ return _regenerator["default"].wrap(function _callee$(_context) {
18
+ while (1) {
19
+ switch (_context.prev = _context.next) {
20
+ case 0:
21
+ adapter = new _VcfTabixAdapter["default"](_configSchema["default"].create({
22
+ vcfGzLocation: {
23
+ localPath: require.resolve('./test_data/volvox.filtered.vcf.gz'),
24
+ locationType: 'LocalPathLocation'
25
+ },
26
+ index: {
27
+ indexType: 'TBI',
28
+ location: {
29
+ localPath: require.resolve('./test_data/volvox.filtered.vcf.gz.tbi'),
30
+ locationType: 'LocalPathLocation'
31
+ }
32
+ }
33
+ }));
34
+ csiAdapter = new _VcfTabixAdapter["default"](_configSchema["default"].create({
35
+ vcfGzLocation: {
36
+ localPath: require.resolve('./test_data/volvox.filtered.vcf.gz'),
37
+ locationType: 'LocalPathLocation'
38
+ },
39
+ index: {
40
+ indexType: 'CSI',
41
+ location: {
42
+ localPath: require.resolve('./test_data/volvox.filtered.vcf.gz.csi'),
43
+ locationType: 'LocalPathLocation'
44
+ }
45
+ }
46
+ }));
47
+ csiFeatures = csiAdapter.getFeatures({
48
+ refName: 'ctgA',
49
+ start: 0,
50
+ end: 20000
51
+ });
52
+ _context.next = 5;
53
+ return adapter.getRefNames();
54
+
55
+ case 5:
56
+ names = _context.sent;
57
+ _context.next = 8;
58
+ return csiAdapter.getRefNames();
59
+
60
+ case 8:
61
+ csiNames = _context.sent;
62
+ expect(names).toEqual(csiNames);
63
+ expect(names).toMatchSnapshot();
64
+ features = adapter.getFeatures({
65
+ refName: 'ctgA',
66
+ start: 0,
67
+ end: 20000
68
+ });
69
+ _context.next = 14;
70
+ return features.pipe((0, _operators.toArray)()).toPromise();
71
+
72
+ case 14:
73
+ featuresArray = _context.sent;
74
+ _context.next = 17;
75
+ return csiFeatures.pipe((0, _operators.toArray)()).toPromise();
76
+
77
+ case 17:
78
+ csiFeaturesArray = _context.sent;
79
+ expect(featuresArray.slice(0, 5)).toMatchSnapshot();
80
+ expect(csiFeaturesArray.slice(0, 5)).toEqual(featuresArray.slice(0, 5));
81
+ featuresNonExist = adapter.getFeatures({
82
+ refName: 'ctgC',
83
+ start: 0,
84
+ end: 20000
85
+ });
86
+ _context.next = 23;
87
+ return featuresNonExist.pipe((0, _operators.toArray)()).toPromise();
88
+
89
+ case 23:
90
+ featuresArrayNonExist = _context.sent;
91
+ expect(featuresArrayNonExist).toEqual([]);
92
+
93
+ case 25:
94
+ case "end":
95
+ return _context.stop();
96
+ }
97
+ }
98
+ }, _callee);
99
+ })));
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _mobxStateTree = require("mobx-state-tree");
9
+
10
+ var _configuration = require("@jbrowse/core/configuration");
11
+
12
+ var _default = (0, _configuration.ConfigurationSchema)('VcfTabixAdapter', {
13
+ vcfGzLocation: {
14
+ type: 'fileLocation',
15
+ defaultValue: {
16
+ uri: '/path/to/my.vcf.gz',
17
+ locationType: 'UriLocation'
18
+ }
19
+ },
20
+ index: (0, _configuration.ConfigurationSchema)('VcfIndex', {
21
+ indexType: {
22
+ model: _mobxStateTree.types.enumeration('IndexType', ['TBI', 'CSI']),
23
+ type: 'stringEnum',
24
+ defaultValue: 'TBI'
25
+ },
26
+ location: {
27
+ type: 'fileLocation',
28
+ defaultValue: {
29
+ uri: '/path/to/my.vcf.gz.tbi',
30
+ locationType: 'UriLocation'
31
+ }
32
+ }
33
+ })
34
+ }, {
35
+ explicitlyTyped: true
36
+ });
37
+
38
+ exports["default"] = _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "configSchema", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _configSchema["default"];
12
+ }
13
+ });
14
+
15
+ var _configSchema = _interopRequireDefault(require("./configSchema"));