@jbrowse/plugin-gtf 1.7.3 → 1.7.6
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/GtfAdapter/GtfAdapter.d.ts +8 -1
- package/dist/GtfAdapter/GtfAdapter.js +150 -65
- package/dist/GtfAdapter/GtfAdapter.test.js +6 -6
- package/dist/GtfAdapter/configSchema.js +2 -2
- package/dist/GtfAdapter/index.js +1 -1
- package/dist/index.js +11 -11
- package/dist/util.js +1 -1
- package/package.json +3 -2
- package/src/GtfAdapter/GtfAdapter.ts +62 -34
|
@@ -4,11 +4,18 @@ import IntervalTree from '@flatten-js/interval-tree';
|
|
|
4
4
|
import { Feature } from '@jbrowse/core/util/simpleFeature';
|
|
5
5
|
export default class extends BaseFeatureDataAdapter {
|
|
6
6
|
protected gtfFeatures?: Promise<{
|
|
7
|
-
|
|
7
|
+
feats: {
|
|
8
|
+
[key: string]: string[];
|
|
9
|
+
};
|
|
8
10
|
}>;
|
|
11
|
+
protected intervalTrees: {
|
|
12
|
+
[key: string]: Promise<IntervalTree | undefined> | undefined;
|
|
13
|
+
};
|
|
9
14
|
private loadDataP;
|
|
10
15
|
private loadData;
|
|
11
16
|
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
17
|
+
private loadFeatureIntervalTreeHelper;
|
|
18
|
+
private loadFeatureIntervalTree;
|
|
12
19
|
getFeatures(query: NoAssemblyRegion, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
13
20
|
freeResources(): void;
|
|
14
21
|
}
|
|
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", {
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
|
-
exports
|
|
8
|
+
exports.default = void 0;
|
|
9
9
|
|
|
10
10
|
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
11
11
|
|
|
@@ -27,8 +27,6 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
|
|
|
27
27
|
|
|
28
28
|
var _BaseAdapter = require("@jbrowse/core/data_adapters/BaseAdapter");
|
|
29
29
|
|
|
30
|
-
var _configuration = require("@jbrowse/core/configuration");
|
|
31
|
-
|
|
32
30
|
var _io = require("@jbrowse/core/util/io");
|
|
33
31
|
|
|
34
32
|
var _rxjs = require("@jbrowse/core/util/rxjs");
|
|
@@ -43,7 +41,7 @@ var _gtf = _interopRequireDefault(require("@gmod/gtf"));
|
|
|
43
41
|
|
|
44
42
|
var _util = require("../util");
|
|
45
43
|
|
|
46
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2
|
|
44
|
+
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); }; }
|
|
47
45
|
|
|
48
46
|
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; } }
|
|
49
47
|
|
|
@@ -52,37 +50,36 @@ function isGzip(buf) {
|
|
|
52
50
|
}
|
|
53
51
|
|
|
54
52
|
var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
55
|
-
(0, _inherits2
|
|
53
|
+
(0, _inherits2.default)(_default, _BaseFeatureDataAdapt);
|
|
56
54
|
|
|
57
55
|
var _super = _createSuper(_default);
|
|
58
56
|
|
|
59
57
|
function _default() {
|
|
60
58
|
var _this;
|
|
61
59
|
|
|
62
|
-
(0, _classCallCheck2
|
|
60
|
+
(0, _classCallCheck2.default)(this, _default);
|
|
63
61
|
|
|
64
62
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
65
63
|
args[_key] = arguments[_key];
|
|
66
64
|
}
|
|
67
65
|
|
|
68
66
|
_this = _super.call.apply(_super, [this].concat(args));
|
|
69
|
-
(0, _defineProperty2
|
|
67
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "gtfFeatures", void 0);
|
|
68
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "intervalTrees", {});
|
|
70
69
|
return _this;
|
|
71
70
|
}
|
|
72
71
|
|
|
73
|
-
(0, _createClass2
|
|
72
|
+
(0, _createClass2.default)(_default, [{
|
|
74
73
|
key: "loadDataP",
|
|
75
74
|
value: function () {
|
|
76
|
-
var _loadDataP = (0, _asyncToGenerator2
|
|
77
|
-
var
|
|
78
|
-
|
|
79
|
-
var buffer, buf, data, feats, intervalTree;
|
|
80
|
-
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
75
|
+
var _loadDataP = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
76
|
+
var buffer, buf, data, lines, feats, i, refName;
|
|
77
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
81
78
|
while (1) {
|
|
82
79
|
switch (_context.prev = _context.next) {
|
|
83
80
|
case 0:
|
|
84
81
|
_context.next = 2;
|
|
85
|
-
return (0, _io.openLocation)(
|
|
82
|
+
return (0, _io.openLocation)(this.getConf('gtfLocation'), this.pluginManager).readFile();
|
|
86
83
|
|
|
87
84
|
case 2:
|
|
88
85
|
buffer = _context.sent;
|
|
@@ -117,32 +114,26 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
|
117
114
|
data = new TextDecoder('utf8', {
|
|
118
115
|
fatal: true
|
|
119
116
|
}).decode(buf);
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
parseComments: false,
|
|
123
|
-
parseDirectives: false,
|
|
124
|
-
parseSequences: false
|
|
117
|
+
lines = data.split('\n').filter(function (f) {
|
|
118
|
+
return !!f && !f.startsWith('#');
|
|
125
119
|
});
|
|
126
|
-
|
|
127
|
-
return new _simpleFeature["default"]({
|
|
128
|
-
data: (0, _util.featureData)(f),
|
|
129
|
-
id: "".concat(_this2.id, "-offset-").concat(i)
|
|
130
|
-
});
|
|
131
|
-
}).reduce(function (acc, obj) {
|
|
132
|
-
var key = obj.get('refName');
|
|
120
|
+
feats = {};
|
|
133
121
|
|
|
134
|
-
|
|
135
|
-
|
|
122
|
+
for (i = 0; i < lines.length; i++) {
|
|
123
|
+
refName = lines[i].split('\t')[0];
|
|
124
|
+
|
|
125
|
+
if (!feats[refName]) {
|
|
126
|
+
feats[refName] = [];
|
|
136
127
|
}
|
|
137
128
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
129
|
+
feats[refName].push(lines[i]);
|
|
130
|
+
}
|
|
131
|
+
|
|
141
132
|
return _context.abrupt("return", {
|
|
142
|
-
|
|
133
|
+
feats: feats
|
|
143
134
|
});
|
|
144
135
|
|
|
145
|
-
case
|
|
136
|
+
case 18:
|
|
146
137
|
case "end":
|
|
147
138
|
return _context.stop();
|
|
148
139
|
}
|
|
@@ -159,16 +150,16 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
|
159
150
|
}, {
|
|
160
151
|
key: "loadData",
|
|
161
152
|
value: function () {
|
|
162
|
-
var _loadData = (0, _asyncToGenerator2
|
|
163
|
-
var
|
|
153
|
+
var _loadData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
154
|
+
var _this2 = this;
|
|
164
155
|
|
|
165
|
-
return _regenerator
|
|
156
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
166
157
|
while (1) {
|
|
167
158
|
switch (_context2.prev = _context2.next) {
|
|
168
159
|
case 0:
|
|
169
160
|
if (!this.gtfFeatures) {
|
|
170
|
-
this.gtfFeatures = this.loadDataP()
|
|
171
|
-
|
|
161
|
+
this.gtfFeatures = this.loadDataP().catch(function (e) {
|
|
162
|
+
_this2.gtfFeatures = undefined;
|
|
172
163
|
throw e;
|
|
173
164
|
});
|
|
174
165
|
}
|
|
@@ -192,13 +183,13 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
|
192
183
|
}, {
|
|
193
184
|
key: "getRefNames",
|
|
194
185
|
value: function () {
|
|
195
|
-
var _getRefNames = (0, _asyncToGenerator2
|
|
186
|
+
var _getRefNames = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3() {
|
|
196
187
|
var opts,
|
|
197
188
|
_yield$this$loadData,
|
|
198
|
-
|
|
189
|
+
feats,
|
|
199
190
|
_args3 = arguments;
|
|
200
191
|
|
|
201
|
-
return _regenerator
|
|
192
|
+
return _regenerator.default.wrap(function _callee3$(_context3) {
|
|
202
193
|
while (1) {
|
|
203
194
|
switch (_context3.prev = _context3.next) {
|
|
204
195
|
case 0:
|
|
@@ -208,8 +199,8 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
|
208
199
|
|
|
209
200
|
case 3:
|
|
210
201
|
_yield$this$loadData = _context3.sent;
|
|
211
|
-
|
|
212
|
-
return _context3.abrupt("return", Object.keys(
|
|
202
|
+
feats = _yield$this$loadData.feats;
|
|
203
|
+
return _context3.abrupt("return", Object.keys(feats));
|
|
213
204
|
|
|
214
205
|
case 6:
|
|
215
206
|
case "end":
|
|
@@ -225,49 +216,143 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
|
225
216
|
|
|
226
217
|
return getRefNames;
|
|
227
218
|
}()
|
|
219
|
+
}, {
|
|
220
|
+
key: "loadFeatureIntervalTreeHelper",
|
|
221
|
+
value: function () {
|
|
222
|
+
var _loadFeatureIntervalTreeHelper = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee4(refName) {
|
|
223
|
+
var _this3 = this;
|
|
224
|
+
|
|
225
|
+
var _yield$this$loadData2, feats, lines, data, intervalTree, ret, i, obj;
|
|
226
|
+
|
|
227
|
+
return _regenerator.default.wrap(function _callee4$(_context4) {
|
|
228
|
+
while (1) {
|
|
229
|
+
switch (_context4.prev = _context4.next) {
|
|
230
|
+
case 0:
|
|
231
|
+
_context4.next = 2;
|
|
232
|
+
return this.loadData();
|
|
233
|
+
|
|
234
|
+
case 2:
|
|
235
|
+
_yield$this$loadData2 = _context4.sent;
|
|
236
|
+
feats = _yield$this$loadData2.feats;
|
|
237
|
+
lines = feats[refName];
|
|
238
|
+
|
|
239
|
+
if (lines) {
|
|
240
|
+
_context4.next = 7;
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
return _context4.abrupt("return", undefined);
|
|
245
|
+
|
|
246
|
+
case 7:
|
|
247
|
+
data = _gtf.default.parseStringSync(lines.join('\n'), {
|
|
248
|
+
parseFeatures: true,
|
|
249
|
+
parseComments: false,
|
|
250
|
+
parseDirectives: false,
|
|
251
|
+
parseSequences: false
|
|
252
|
+
});
|
|
253
|
+
intervalTree = new _intervalTree.default();
|
|
254
|
+
ret = data.flat().map(function (f, i) {
|
|
255
|
+
return new _simpleFeature.default({
|
|
256
|
+
data: (0, _util.featureData)(f),
|
|
257
|
+
id: "".concat(_this3.id, "-offset-").concat(i)
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
for (i = 0; i < ret.length; i++) {
|
|
262
|
+
obj = ret[i];
|
|
263
|
+
intervalTree.insert([obj.get('start'), obj.get('end')], obj);
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return _context4.abrupt("return", intervalTree);
|
|
267
|
+
|
|
268
|
+
case 12:
|
|
269
|
+
case "end":
|
|
270
|
+
return _context4.stop();
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}, _callee4, this);
|
|
274
|
+
}));
|
|
275
|
+
|
|
276
|
+
function loadFeatureIntervalTreeHelper(_x) {
|
|
277
|
+
return _loadFeatureIntervalTreeHelper.apply(this, arguments);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return loadFeatureIntervalTreeHelper;
|
|
281
|
+
}()
|
|
282
|
+
}, {
|
|
283
|
+
key: "loadFeatureIntervalTree",
|
|
284
|
+
value: function () {
|
|
285
|
+
var _loadFeatureIntervalTree = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee5(refName) {
|
|
286
|
+
var _this4 = this;
|
|
287
|
+
|
|
288
|
+
return _regenerator.default.wrap(function _callee5$(_context5) {
|
|
289
|
+
while (1) {
|
|
290
|
+
switch (_context5.prev = _context5.next) {
|
|
291
|
+
case 0:
|
|
292
|
+
if (!this.intervalTrees[refName]) {
|
|
293
|
+
this.intervalTrees[refName] = this.loadFeatureIntervalTreeHelper(refName).catch(function (e) {
|
|
294
|
+
_this4.intervalTrees[refName] = undefined;
|
|
295
|
+
throw e;
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return _context5.abrupt("return", this.intervalTrees[refName]);
|
|
300
|
+
|
|
301
|
+
case 2:
|
|
302
|
+
case "end":
|
|
303
|
+
return _context5.stop();
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}, _callee5, this);
|
|
307
|
+
}));
|
|
308
|
+
|
|
309
|
+
function loadFeatureIntervalTree(_x2) {
|
|
310
|
+
return _loadFeatureIntervalTree.apply(this, arguments);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
return loadFeatureIntervalTree;
|
|
314
|
+
}()
|
|
228
315
|
}, {
|
|
229
316
|
key: "getFeatures",
|
|
230
317
|
value: function getFeatures(query) {
|
|
231
|
-
var
|
|
318
|
+
var _this5 = this;
|
|
232
319
|
|
|
233
320
|
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
234
321
|
return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
|
|
235
|
-
var _ref = (0, _asyncToGenerator2
|
|
236
|
-
var
|
|
237
|
-
|
|
238
|
-
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
322
|
+
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee6(observer) {
|
|
323
|
+
var start, end, refName, intervalTree;
|
|
324
|
+
return _regenerator.default.wrap(function _callee6$(_context6) {
|
|
239
325
|
while (1) {
|
|
240
|
-
switch (
|
|
326
|
+
switch (_context6.prev = _context6.next) {
|
|
241
327
|
case 0:
|
|
242
|
-
|
|
328
|
+
_context6.prev = 0;
|
|
243
329
|
start = query.start, end = query.end, refName = query.refName;
|
|
244
|
-
|
|
245
|
-
return
|
|
330
|
+
_context6.next = 4;
|
|
331
|
+
return _this5.loadFeatureIntervalTree(refName);
|
|
246
332
|
|
|
247
333
|
case 4:
|
|
248
|
-
|
|
249
|
-
intervalTree
|
|
250
|
-
(_intervalTree$refName = intervalTree[refName]) === null || _intervalTree$refName === void 0 ? void 0 : _intervalTree$refName.search([start, end]).forEach(function (f) {
|
|
334
|
+
intervalTree = _context6.sent;
|
|
335
|
+
intervalTree === null || intervalTree === void 0 ? void 0 : intervalTree.search([start, end]).forEach(function (f) {
|
|
251
336
|
return observer.next(f);
|
|
252
337
|
});
|
|
253
338
|
observer.complete();
|
|
254
|
-
|
|
339
|
+
_context6.next = 12;
|
|
255
340
|
break;
|
|
256
341
|
|
|
257
|
-
case
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
observer.error(
|
|
342
|
+
case 9:
|
|
343
|
+
_context6.prev = 9;
|
|
344
|
+
_context6.t0 = _context6["catch"](0);
|
|
345
|
+
observer.error(_context6.t0);
|
|
261
346
|
|
|
262
|
-
case
|
|
347
|
+
case 12:
|
|
263
348
|
case "end":
|
|
264
|
-
return
|
|
349
|
+
return _context6.stop();
|
|
265
350
|
}
|
|
266
351
|
}
|
|
267
|
-
},
|
|
352
|
+
}, _callee6, null, [[0, 9]]);
|
|
268
353
|
}));
|
|
269
354
|
|
|
270
|
-
return function (
|
|
355
|
+
return function (_x3) {
|
|
271
356
|
return _ref.apply(this, arguments);
|
|
272
357
|
};
|
|
273
358
|
}(), opts.signal);
|
|
@@ -281,4 +366,4 @@ var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
|
281
366
|
return _default;
|
|
282
367
|
}(_BaseAdapter.BaseFeatureDataAdapter);
|
|
283
368
|
|
|
284
|
-
exports
|
|
369
|
+
exports.default = _default;
|
|
@@ -18,15 +18,15 @@ window.TextDecoder = _webEncoding.TextDecoder;
|
|
|
18
18
|
describe('adapter can fetch features from volvox.sorted.gtf', function () {
|
|
19
19
|
var adapter;
|
|
20
20
|
beforeEach(function () {
|
|
21
|
-
adapter = new _GtfAdapter
|
|
21
|
+
adapter = new _GtfAdapter.default(_configSchema.default.create({
|
|
22
22
|
gtfLocation: {
|
|
23
23
|
localPath: require.resolve('../test_data/volvox.sorted.gtf')
|
|
24
24
|
}
|
|
25
25
|
}));
|
|
26
26
|
});
|
|
27
|
-
it('test getfeatures on gtf plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2
|
|
27
|
+
it('test getfeatures on gtf plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
28
28
|
var features, featuresArray, featuresJsonArray;
|
|
29
|
-
return _regenerator
|
|
29
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
30
30
|
while (1) {
|
|
31
31
|
switch (_context.prev = _context.next) {
|
|
32
32
|
case 0:
|
|
@@ -69,13 +69,13 @@ describe('adapter can fetch features from volvox.sorted.gtf', function () {
|
|
|
69
69
|
}, _callee);
|
|
70
70
|
})));
|
|
71
71
|
});
|
|
72
|
-
test('can instantiate new GtfAdapter and check for demo data', /*#__PURE__*/(0, _asyncToGenerator2
|
|
72
|
+
test('can instantiate new GtfAdapter and check for demo data', /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
73
73
|
var demoAdapter, features, featuresArray, featuresJsonArray;
|
|
74
|
-
return _regenerator
|
|
74
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
75
75
|
while (1) {
|
|
76
76
|
switch (_context2.prev = _context2.next) {
|
|
77
77
|
case 0:
|
|
78
|
-
demoAdapter = new _GtfAdapter
|
|
78
|
+
demoAdapter = new _GtfAdapter.default(_configSchema.default.create({
|
|
79
79
|
gtfLocation: {
|
|
80
80
|
localPath: require.resolve('../test_data/demo.gtf')
|
|
81
81
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports
|
|
6
|
+
exports.default = void 0;
|
|
7
7
|
|
|
8
8
|
var _configuration = require("@jbrowse/core/configuration");
|
|
9
9
|
|
|
@@ -19,4 +19,4 @@ var _default = (0, _configuration.ConfigurationSchema)('GtfAdapter', {
|
|
|
19
19
|
explicitlyTyped: true
|
|
20
20
|
});
|
|
21
21
|
|
|
22
|
-
exports
|
|
22
|
+
exports.default = _default;
|
package/dist/GtfAdapter/index.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
|
|
|
7
7
|
Object.defineProperty(exports, "__esModule", {
|
|
8
8
|
value: true
|
|
9
9
|
});
|
|
10
|
-
exports
|
|
10
|
+
exports.default = void 0;
|
|
11
11
|
|
|
12
12
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
13
|
|
|
@@ -33,43 +33,43 @@ var _tracks = require("@jbrowse/core/util/tracks");
|
|
|
33
33
|
|
|
34
34
|
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); }
|
|
35
35
|
|
|
36
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return {
|
|
36
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(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; }
|
|
37
37
|
|
|
38
|
-
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2
|
|
38
|
+
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); }; }
|
|
39
39
|
|
|
40
40
|
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; } }
|
|
41
41
|
|
|
42
42
|
var GtfPlugin = /*#__PURE__*/function (_Plugin) {
|
|
43
|
-
(0, _inherits2
|
|
43
|
+
(0, _inherits2.default)(GtfPlugin, _Plugin);
|
|
44
44
|
|
|
45
45
|
var _super = _createSuper(GtfPlugin);
|
|
46
46
|
|
|
47
47
|
function GtfPlugin() {
|
|
48
48
|
var _this;
|
|
49
49
|
|
|
50
|
-
(0, _classCallCheck2
|
|
50
|
+
(0, _classCallCheck2.default)(this, GtfPlugin);
|
|
51
51
|
|
|
52
52
|
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
53
53
|
args[_key] = arguments[_key];
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
_this = _super.call.apply(_super, [this].concat(args));
|
|
57
|
-
(0, _defineProperty2
|
|
57
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "name", 'GTFPlugin');
|
|
58
58
|
return _this;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
(0, _createClass2
|
|
61
|
+
(0, _createClass2.default)(GtfPlugin, [{
|
|
62
62
|
key: "install",
|
|
63
63
|
value: function install(pluginManager) {
|
|
64
64
|
pluginManager.addAdapterType(function () {
|
|
65
|
-
return new _AdapterType
|
|
65
|
+
return new _AdapterType.default({
|
|
66
66
|
name: 'GtfAdapter',
|
|
67
67
|
configSchema: _GtfAdapter.configSchema,
|
|
68
68
|
getAdapterClass: function getAdapterClass() {
|
|
69
69
|
return Promise.resolve().then(function () {
|
|
70
70
|
return _interopRequireWildcard(require('./GtfAdapter/GtfAdapter'));
|
|
71
71
|
}).then(function (r) {
|
|
72
|
-
return r
|
|
72
|
+
return r.default;
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
75
|
});
|
|
@@ -96,6 +96,6 @@ var GtfPlugin = /*#__PURE__*/function (_Plugin) {
|
|
|
96
96
|
}
|
|
97
97
|
}]);
|
|
98
98
|
return GtfPlugin;
|
|
99
|
-
}(_Plugin2
|
|
99
|
+
}(_Plugin2.default);
|
|
100
100
|
|
|
101
|
-
exports
|
|
101
|
+
exports.default = GtfPlugin;
|
package/dist/util.js
CHANGED
|
@@ -11,7 +11,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
|
|
|
11
11
|
|
|
12
12
|
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; }
|
|
13
13
|
|
|
14
|
-
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
|
|
14
|
+
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; }
|
|
15
15
|
|
|
16
16
|
function featureData(data) {
|
|
17
17
|
var f = _objectSpread({}, data);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-gtf",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.6",
|
|
4
4
|
"description": "JBrowse 2 gtf feature adapter",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
"postbuild": "tsc --build tsconfig.build.json"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
+
"@babel/runtime": "^7.17.9",
|
|
36
37
|
"@flatten-js/interval-tree": "^1.0.15",
|
|
37
38
|
"@gmod/bgzf-filehandle": "^1.4.3",
|
|
38
39
|
"@gmod/gtf": "^0.0.6"
|
|
@@ -50,5 +51,5 @@
|
|
|
50
51
|
"publishConfig": {
|
|
51
52
|
"access": "public"
|
|
52
53
|
},
|
|
53
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "dbd73f99714e395cf20877d5e05d26855857a0e3"
|
|
54
55
|
}
|
|
@@ -3,13 +3,11 @@ import {
|
|
|
3
3
|
BaseOptions,
|
|
4
4
|
} from '@jbrowse/core/data_adapters/BaseAdapter'
|
|
5
5
|
import { NoAssemblyRegion } from '@jbrowse/core/util/types'
|
|
6
|
-
import { readConfObject } from '@jbrowse/core/configuration'
|
|
7
6
|
import { openLocation } from '@jbrowse/core/util/io'
|
|
8
7
|
import { ObservableCreate } from '@jbrowse/core/util/rxjs'
|
|
9
8
|
import IntervalTree from '@flatten-js/interval-tree'
|
|
10
9
|
import SimpleFeature, { Feature } from '@jbrowse/core/util/simpleFeature'
|
|
11
10
|
import { unzip } from '@gmod/bgzf-filehandle'
|
|
12
|
-
|
|
13
11
|
import gtf from '@gmod/gtf'
|
|
14
12
|
import { FeatureLoc, featureData } from '../util'
|
|
15
13
|
function isGzip(buf: Buffer) {
|
|
@@ -18,12 +16,16 @@ function isGzip(buf: Buffer) {
|
|
|
18
16
|
|
|
19
17
|
export default class extends BaseFeatureDataAdapter {
|
|
20
18
|
protected gtfFeatures?: Promise<{
|
|
21
|
-
|
|
19
|
+
feats: { [key: string]: string[] }
|
|
22
20
|
}>
|
|
23
21
|
|
|
22
|
+
protected intervalTrees: {
|
|
23
|
+
[key: string]: Promise<IntervalTree | undefined> | undefined
|
|
24
|
+
} = {}
|
|
25
|
+
|
|
24
26
|
private async loadDataP() {
|
|
25
27
|
const buffer = await openLocation(
|
|
26
|
-
|
|
28
|
+
this.getConf('gtfLocation'),
|
|
27
29
|
this.pluginManager,
|
|
28
30
|
).readFile()
|
|
29
31
|
|
|
@@ -33,31 +35,18 @@ export default class extends BaseFeatureDataAdapter {
|
|
|
33
35
|
throw new Error('Data exceeds maximum string length (512MB)')
|
|
34
36
|
}
|
|
35
37
|
const data = new TextDecoder('utf8', { fatal: true }).decode(buf)
|
|
36
|
-
const feats = gtf.parseStringSync(data, {
|
|
37
|
-
parseFeatures: true,
|
|
38
|
-
parseComments: false,
|
|
39
|
-
parseDirectives: false,
|
|
40
|
-
parseSequences: false,
|
|
41
|
-
}) as FeatureLoc[][]
|
|
42
38
|
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
if (!acc[key]) {
|
|
55
|
-
acc[key] = new IntervalTree()
|
|
56
|
-
}
|
|
57
|
-
acc[key].insert([obj.get('start'), obj.get('end')], obj)
|
|
58
|
-
return acc
|
|
59
|
-
}, {} as Record<string, IntervalTree>)
|
|
60
|
-
return { intervalTree }
|
|
39
|
+
const lines = data.split('\n').filter(f => !!f && !f.startsWith('#'))
|
|
40
|
+
const feats = {} as { [key: string]: string[] }
|
|
41
|
+
for (let i = 0; i < lines.length; i++) {
|
|
42
|
+
const refName = lines[i].split('\t')[0]
|
|
43
|
+
if (!feats[refName]) {
|
|
44
|
+
feats[refName] = []
|
|
45
|
+
}
|
|
46
|
+
feats[refName].push(lines[i])
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return { feats }
|
|
61
50
|
}
|
|
62
51
|
|
|
63
52
|
private async loadData() {
|
|
@@ -72,18 +61,57 @@ export default class extends BaseFeatureDataAdapter {
|
|
|
72
61
|
}
|
|
73
62
|
|
|
74
63
|
public async getRefNames(opts: BaseOptions = {}) {
|
|
75
|
-
const {
|
|
76
|
-
return Object.keys(
|
|
64
|
+
const { feats } = await this.loadData()
|
|
65
|
+
return Object.keys(feats)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private async loadFeatureIntervalTreeHelper(refName: string) {
|
|
69
|
+
const { feats } = await this.loadData()
|
|
70
|
+
const lines = feats[refName]
|
|
71
|
+
if (!lines) {
|
|
72
|
+
return undefined
|
|
73
|
+
}
|
|
74
|
+
const data = gtf.parseStringSync(lines.join('\n'), {
|
|
75
|
+
parseFeatures: true,
|
|
76
|
+
parseComments: false,
|
|
77
|
+
parseDirectives: false,
|
|
78
|
+
parseSequences: false,
|
|
79
|
+
}) as FeatureLoc[][]
|
|
80
|
+
|
|
81
|
+
const intervalTree = new IntervalTree()
|
|
82
|
+
const ret = data.flat().map(
|
|
83
|
+
(f, i) =>
|
|
84
|
+
new SimpleFeature({
|
|
85
|
+
data: featureData(f),
|
|
86
|
+
id: `${this.id}-offset-${i}`,
|
|
87
|
+
}),
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
for (let i = 0; i < ret.length; i++) {
|
|
91
|
+
const obj = ret[i]
|
|
92
|
+
intervalTree.insert([obj.get('start'), obj.get('end')], obj)
|
|
93
|
+
}
|
|
94
|
+
return intervalTree
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
private async loadFeatureIntervalTree(refName: string) {
|
|
98
|
+
if (!this.intervalTrees[refName]) {
|
|
99
|
+
this.intervalTrees[refName] = this.loadFeatureIntervalTreeHelper(
|
|
100
|
+
refName,
|
|
101
|
+
).catch(e => {
|
|
102
|
+
this.intervalTrees[refName] = undefined
|
|
103
|
+
throw e
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
return this.intervalTrees[refName]
|
|
77
107
|
}
|
|
78
108
|
|
|
79
109
|
public getFeatures(query: NoAssemblyRegion, opts: BaseOptions = {}) {
|
|
80
110
|
return ObservableCreate<Feature>(async observer => {
|
|
81
111
|
try {
|
|
82
112
|
const { start, end, refName } = query
|
|
83
|
-
const
|
|
84
|
-
intervalTree[
|
|
85
|
-
?.search([start, end])
|
|
86
|
-
.forEach(f => observer.next(f))
|
|
113
|
+
const intervalTree = await this.loadFeatureIntervalTree(refName)
|
|
114
|
+
intervalTree?.search([start, end]).forEach(f => observer.next(f))
|
|
87
115
|
observer.complete()
|
|
88
116
|
} catch (e) {
|
|
89
117
|
observer.error(e)
|