@jbrowse/plugin-gff3 1.6.9 → 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.
- package/dist/Gff3Adapter/Gff3Adapter.js +402 -0
- package/dist/Gff3Adapter/Gff3Adapter.test.js +71 -0
- package/dist/Gff3Adapter/configSchema.js +22 -0
- package/dist/Gff3Adapter/index.js +15 -0
- package/dist/Gff3TabixAdapter/Gff3TabixAdapter.js +395 -0
- package/dist/Gff3TabixAdapter/Gff3TabixAdapter.test.js +74 -0
- package/dist/Gff3TabixAdapter/configSchema.js +42 -0
- package/dist/Gff3TabixAdapter/index.js +15 -0
- package/dist/index.js +136 -6
- package/package.json +3 -6
|
@@ -0,0 +1,402 @@
|
|
|
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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
|
|
14
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
|
+
|
|
16
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
17
|
+
|
|
18
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
19
|
+
|
|
20
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
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 _configuration = require("@jbrowse/core/configuration");
|
|
33
|
+
|
|
34
|
+
var _io = require("@jbrowse/core/util/io");
|
|
35
|
+
|
|
36
|
+
var _rxjs = require("@jbrowse/core/util/rxjs");
|
|
37
|
+
|
|
38
|
+
var _intervalTree = _interopRequireDefault(require("@flatten-js/interval-tree"));
|
|
39
|
+
|
|
40
|
+
var _simpleFeature = _interopRequireDefault(require("@jbrowse/core/util/simpleFeature"));
|
|
41
|
+
|
|
42
|
+
var _bgzfFilehandle = require("@gmod/bgzf-filehandle");
|
|
43
|
+
|
|
44
|
+
var _gff = _interopRequireDefault(require("@gmod/gff"));
|
|
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
|
+
function isGzip(buf) {
|
|
55
|
+
return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
var _default = /*#__PURE__*/function (_BaseFeatureDataAdapt) {
|
|
59
|
+
(0, _inherits2["default"])(_default, _BaseFeatureDataAdapt);
|
|
60
|
+
|
|
61
|
+
var _super = _createSuper(_default);
|
|
62
|
+
|
|
63
|
+
function _default() {
|
|
64
|
+
var _this;
|
|
65
|
+
|
|
66
|
+
(0, _classCallCheck2["default"])(this, _default);
|
|
67
|
+
|
|
68
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
69
|
+
args[_key] = arguments[_key];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
|
73
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "gffFeatures", void 0);
|
|
74
|
+
return _this;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
(0, _createClass2["default"])(_default, [{
|
|
78
|
+
key: "loadDataP",
|
|
79
|
+
value: function () {
|
|
80
|
+
var _loadDataP = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
81
|
+
var _this2 = this;
|
|
82
|
+
|
|
83
|
+
var buffer, buf, data, lines, headerLines, i, header, feats, intervalTree;
|
|
84
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
85
|
+
while (1) {
|
|
86
|
+
switch (_context.prev = _context.next) {
|
|
87
|
+
case 0:
|
|
88
|
+
_context.next = 2;
|
|
89
|
+
return (0, _io.openLocation)((0, _configuration.readConfObject)(this.config, 'gffLocation'), this.pluginManager).readFile();
|
|
90
|
+
|
|
91
|
+
case 2:
|
|
92
|
+
buffer = _context.sent;
|
|
93
|
+
|
|
94
|
+
if (!isGzip(buffer)) {
|
|
95
|
+
_context.next = 9;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
_context.next = 6;
|
|
100
|
+
return (0, _bgzfFilehandle.unzip)(buffer);
|
|
101
|
+
|
|
102
|
+
case 6:
|
|
103
|
+
_context.t0 = _context.sent;
|
|
104
|
+
_context.next = 10;
|
|
105
|
+
break;
|
|
106
|
+
|
|
107
|
+
case 9:
|
|
108
|
+
_context.t0 = buffer;
|
|
109
|
+
|
|
110
|
+
case 10:
|
|
111
|
+
buf = _context.t0;
|
|
112
|
+
|
|
113
|
+
if (!(buf.length > 536870888)) {
|
|
114
|
+
_context.next = 13;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
throw new Error('Data exceeds maximum string length (512MB)');
|
|
119
|
+
|
|
120
|
+
case 13:
|
|
121
|
+
data = new TextDecoder('utf8', {
|
|
122
|
+
fatal: true
|
|
123
|
+
}).decode(buf);
|
|
124
|
+
lines = data.split('\n');
|
|
125
|
+
headerLines = [];
|
|
126
|
+
|
|
127
|
+
for (i = 0; i < lines.length && lines[i].startsWith('#'); i++) {
|
|
128
|
+
headerLines.push(lines[i]);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
header = headerLines.join('\n');
|
|
132
|
+
feats = _gff["default"].parseStringSync(data, {
|
|
133
|
+
parseFeatures: true,
|
|
134
|
+
parseComments: false,
|
|
135
|
+
parseDirectives: false,
|
|
136
|
+
parseSequences: false
|
|
137
|
+
});
|
|
138
|
+
intervalTree = feats.flat().map(function (f, i) {
|
|
139
|
+
return new _simpleFeature["default"]({
|
|
140
|
+
data: _this2.featureData(f),
|
|
141
|
+
id: "".concat(_this2.id, "-offset-").concat(i)
|
|
142
|
+
});
|
|
143
|
+
}).reduce(function (acc, obj) {
|
|
144
|
+
var key = obj.get('refName');
|
|
145
|
+
|
|
146
|
+
if (!acc[key]) {
|
|
147
|
+
acc[key] = new _intervalTree["default"]();
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
acc[key].insert([obj.get('start'), obj.get('end')], obj);
|
|
151
|
+
return acc;
|
|
152
|
+
}, {});
|
|
153
|
+
return _context.abrupt("return", {
|
|
154
|
+
header: header,
|
|
155
|
+
intervalTree: intervalTree
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
case 21:
|
|
159
|
+
case "end":
|
|
160
|
+
return _context.stop();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}, _callee, this);
|
|
164
|
+
}));
|
|
165
|
+
|
|
166
|
+
function loadDataP() {
|
|
167
|
+
return _loadDataP.apply(this, arguments);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return loadDataP;
|
|
171
|
+
}()
|
|
172
|
+
}, {
|
|
173
|
+
key: "loadData",
|
|
174
|
+
value: function () {
|
|
175
|
+
var _loadData = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
176
|
+
var _this3 = this;
|
|
177
|
+
|
|
178
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
179
|
+
while (1) {
|
|
180
|
+
switch (_context2.prev = _context2.next) {
|
|
181
|
+
case 0:
|
|
182
|
+
if (!this.gffFeatures) {
|
|
183
|
+
this.gffFeatures = this.loadDataP()["catch"](function (e) {
|
|
184
|
+
_this3.gffFeatures = undefined;
|
|
185
|
+
throw e;
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
return _context2.abrupt("return", this.gffFeatures);
|
|
190
|
+
|
|
191
|
+
case 2:
|
|
192
|
+
case "end":
|
|
193
|
+
return _context2.stop();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}, _callee2, this);
|
|
197
|
+
}));
|
|
198
|
+
|
|
199
|
+
function loadData() {
|
|
200
|
+
return _loadData.apply(this, arguments);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return loadData;
|
|
204
|
+
}()
|
|
205
|
+
}, {
|
|
206
|
+
key: "getRefNames",
|
|
207
|
+
value: function () {
|
|
208
|
+
var _getRefNames = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
|
|
209
|
+
var opts,
|
|
210
|
+
_yield$this$loadData,
|
|
211
|
+
intervalTree,
|
|
212
|
+
_args3 = arguments;
|
|
213
|
+
|
|
214
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
215
|
+
while (1) {
|
|
216
|
+
switch (_context3.prev = _context3.next) {
|
|
217
|
+
case 0:
|
|
218
|
+
opts = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : {};
|
|
219
|
+
_context3.next = 3;
|
|
220
|
+
return this.loadData();
|
|
221
|
+
|
|
222
|
+
case 3:
|
|
223
|
+
_yield$this$loadData = _context3.sent;
|
|
224
|
+
intervalTree = _yield$this$loadData.intervalTree;
|
|
225
|
+
return _context3.abrupt("return", Object.keys(intervalTree));
|
|
226
|
+
|
|
227
|
+
case 6:
|
|
228
|
+
case "end":
|
|
229
|
+
return _context3.stop();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}, _callee3, this);
|
|
233
|
+
}));
|
|
234
|
+
|
|
235
|
+
function getRefNames() {
|
|
236
|
+
return _getRefNames.apply(this, arguments);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
return getRefNames;
|
|
240
|
+
}()
|
|
241
|
+
}, {
|
|
242
|
+
key: "getHeader",
|
|
243
|
+
value: function () {
|
|
244
|
+
var _getHeader = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4() {
|
|
245
|
+
var _yield$this$loadData2, header;
|
|
246
|
+
|
|
247
|
+
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
248
|
+
while (1) {
|
|
249
|
+
switch (_context4.prev = _context4.next) {
|
|
250
|
+
case 0:
|
|
251
|
+
_context4.next = 2;
|
|
252
|
+
return this.loadData();
|
|
253
|
+
|
|
254
|
+
case 2:
|
|
255
|
+
_yield$this$loadData2 = _context4.sent;
|
|
256
|
+
header = _yield$this$loadData2.header;
|
|
257
|
+
return _context4.abrupt("return", header);
|
|
258
|
+
|
|
259
|
+
case 5:
|
|
260
|
+
case "end":
|
|
261
|
+
return _context4.stop();
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}, _callee4, this);
|
|
265
|
+
}));
|
|
266
|
+
|
|
267
|
+
function getHeader() {
|
|
268
|
+
return _getHeader.apply(this, arguments);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return getHeader;
|
|
272
|
+
}()
|
|
273
|
+
}, {
|
|
274
|
+
key: "getFeatures",
|
|
275
|
+
value: function getFeatures(query) {
|
|
276
|
+
var _this4 = this;
|
|
277
|
+
|
|
278
|
+
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
279
|
+
return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
|
|
280
|
+
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee5(observer) {
|
|
281
|
+
var _intervalTree$refName, start, end, refName, _yield$_this4$loadDat, intervalTree;
|
|
282
|
+
|
|
283
|
+
return _regenerator["default"].wrap(function _callee5$(_context5) {
|
|
284
|
+
while (1) {
|
|
285
|
+
switch (_context5.prev = _context5.next) {
|
|
286
|
+
case 0:
|
|
287
|
+
_context5.prev = 0;
|
|
288
|
+
start = query.start, end = query.end, refName = query.refName;
|
|
289
|
+
_context5.next = 4;
|
|
290
|
+
return _this4.loadData();
|
|
291
|
+
|
|
292
|
+
case 4:
|
|
293
|
+
_yield$_this4$loadDat = _context5.sent;
|
|
294
|
+
intervalTree = _yield$_this4$loadDat.intervalTree;
|
|
295
|
+
(_intervalTree$refName = intervalTree[refName]) === null || _intervalTree$refName === void 0 ? void 0 : _intervalTree$refName.search([start, end]).forEach(function (f) {
|
|
296
|
+
return observer.next(f);
|
|
297
|
+
});
|
|
298
|
+
observer.complete();
|
|
299
|
+
_context5.next = 13;
|
|
300
|
+
break;
|
|
301
|
+
|
|
302
|
+
case 10:
|
|
303
|
+
_context5.prev = 10;
|
|
304
|
+
_context5.t0 = _context5["catch"](0);
|
|
305
|
+
observer.error(_context5.t0);
|
|
306
|
+
|
|
307
|
+
case 13:
|
|
308
|
+
case "end":
|
|
309
|
+
return _context5.stop();
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
}, _callee5, null, [[0, 10]]);
|
|
313
|
+
}));
|
|
314
|
+
|
|
315
|
+
return function (_x) {
|
|
316
|
+
return _ref.apply(this, arguments);
|
|
317
|
+
};
|
|
318
|
+
}(), opts.signal);
|
|
319
|
+
}
|
|
320
|
+
}, {
|
|
321
|
+
key: "featureData",
|
|
322
|
+
value: function featureData(data) {
|
|
323
|
+
var _this5 = this;
|
|
324
|
+
|
|
325
|
+
var f = _objectSpread({}, data);
|
|
326
|
+
|
|
327
|
+
f.start -= 1; // convert to interbase
|
|
328
|
+
|
|
329
|
+
if (data.strand === '+') {
|
|
330
|
+
f.strand = 1;
|
|
331
|
+
} else if (data.strand === '-') {
|
|
332
|
+
f.strand = -1;
|
|
333
|
+
} else if (data.strand === '.') {
|
|
334
|
+
f.strand = 0;
|
|
335
|
+
} else {
|
|
336
|
+
f.strand = undefined;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
f.phase = Number(data.phase);
|
|
340
|
+
f.refName = data.seq_id;
|
|
341
|
+
|
|
342
|
+
if (data.score === null) {
|
|
343
|
+
delete f.score;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (data.phase === null) {
|
|
347
|
+
delete f.score;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
var defaultFields = ['start', 'end', 'seq_id', 'score', 'type', 'source', 'phase', 'strand'];
|
|
351
|
+
var dataAttributes = data.attributes || {};
|
|
352
|
+
Object.keys(dataAttributes).forEach(function (a) {
|
|
353
|
+
var b = a.toLowerCase();
|
|
354
|
+
|
|
355
|
+
if (defaultFields.includes(b)) {
|
|
356
|
+
// add "suffix" to tag name if it already exists
|
|
357
|
+
// reproduces behavior of NCList
|
|
358
|
+
b += '2';
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
if (dataAttributes[a] !== null) {
|
|
362
|
+
var attr = dataAttributes[a];
|
|
363
|
+
|
|
364
|
+
if (Array.isArray(attr) && attr.length === 1) {
|
|
365
|
+
;
|
|
366
|
+
var _attr = attr;
|
|
367
|
+
|
|
368
|
+
var _attr2 = (0, _slicedToArray2["default"])(_attr, 1);
|
|
369
|
+
|
|
370
|
+
attr = _attr2[0];
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
f[b] = attr;
|
|
374
|
+
}
|
|
375
|
+
});
|
|
376
|
+
f.refName = f.seq_id; // the SimpleFeature constructor takes care of recursively inflating subfeatures
|
|
377
|
+
|
|
378
|
+
if (data.child_features && data.child_features.length) {
|
|
379
|
+
f.subfeatures = data.child_features.map(function (childLocs) {
|
|
380
|
+
return childLocs.map(function (childLoc) {
|
|
381
|
+
return _this5.featureData(childLoc);
|
|
382
|
+
});
|
|
383
|
+
}).flat();
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
delete f.child_features;
|
|
387
|
+
delete f.data;
|
|
388
|
+
delete f.derived_features;
|
|
389
|
+
delete f.attributes;
|
|
390
|
+
delete f.seq_id;
|
|
391
|
+
return f;
|
|
392
|
+
}
|
|
393
|
+
}, {
|
|
394
|
+
key: "freeResources",
|
|
395
|
+
value: function
|
|
396
|
+
/* { region } */
|
|
397
|
+
freeResources() {}
|
|
398
|
+
}]);
|
|
399
|
+
return _default;
|
|
400
|
+
}(_BaseAdapter.BaseFeatureDataAdapter);
|
|
401
|
+
|
|
402
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,71 @@
|
|
|
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 _configSchema = _interopRequireDefault(require("./configSchema"));
|
|
12
|
+
|
|
13
|
+
var _Gff3Adapter = _interopRequireDefault(require("./Gff3Adapter"));
|
|
14
|
+
|
|
15
|
+
var _webEncoding = require("web-encoding");
|
|
16
|
+
|
|
17
|
+
window.TextDecoder = _webEncoding.TextDecoder;
|
|
18
|
+
describe('adapter can fetch features from volvox.gff3', function () {
|
|
19
|
+
var adapter;
|
|
20
|
+
beforeEach(function () {
|
|
21
|
+
adapter = new _Gff3Adapter["default"](_configSchema["default"].create({
|
|
22
|
+
gffLocation: {
|
|
23
|
+
localPath: require.resolve('../test_data/volvox.sort.gff3')
|
|
24
|
+
}
|
|
25
|
+
}));
|
|
26
|
+
});
|
|
27
|
+
it('test getfeatures on gff plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
28
|
+
var features, featuresArray, featuresJsonArray;
|
|
29
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
30
|
+
while (1) {
|
|
31
|
+
switch (_context.prev = _context.next) {
|
|
32
|
+
case 0:
|
|
33
|
+
features = adapter.getFeatures({
|
|
34
|
+
refName: 'ctgB',
|
|
35
|
+
start: 0,
|
|
36
|
+
end: 200000
|
|
37
|
+
});
|
|
38
|
+
_context.t0 = expect;
|
|
39
|
+
_context.next = 4;
|
|
40
|
+
return adapter.hasDataForRefName('ctgA');
|
|
41
|
+
|
|
42
|
+
case 4:
|
|
43
|
+
_context.t1 = _context.sent;
|
|
44
|
+
(0, _context.t0)(_context.t1).toBe(true);
|
|
45
|
+
_context.t2 = expect;
|
|
46
|
+
_context.next = 9;
|
|
47
|
+
return adapter.hasDataForRefName('ctgB');
|
|
48
|
+
|
|
49
|
+
case 9:
|
|
50
|
+
_context.t3 = _context.sent;
|
|
51
|
+
(0, _context.t2)(_context.t3).toBe(true);
|
|
52
|
+
_context.next = 13;
|
|
53
|
+
return features.pipe((0, _operators.toArray)()).toPromise();
|
|
54
|
+
|
|
55
|
+
case 13:
|
|
56
|
+
featuresArray = _context.sent;
|
|
57
|
+
// There are only 4 features in ctgB
|
|
58
|
+
expect(featuresArray.length).toBe(4);
|
|
59
|
+
featuresJsonArray = featuresArray.map(function (f) {
|
|
60
|
+
return f.toJSON();
|
|
61
|
+
});
|
|
62
|
+
expect(featuresJsonArray).toMatchSnapshot();
|
|
63
|
+
|
|
64
|
+
case 17:
|
|
65
|
+
case "end":
|
|
66
|
+
return _context.stop();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}, _callee);
|
|
70
|
+
})));
|
|
71
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports["default"] = void 0;
|
|
7
|
+
|
|
8
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
9
|
+
|
|
10
|
+
var _default = (0, _configuration.ConfigurationSchema)('Gff3Adapter', {
|
|
11
|
+
gffLocation: {
|
|
12
|
+
type: 'fileLocation',
|
|
13
|
+
defaultValue: {
|
|
14
|
+
uri: '/path/to/my.gff',
|
|
15
|
+
locationType: 'UriLocation'
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}, {
|
|
19
|
+
explicitlyTyped: true
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
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"));
|
|
@@ -0,0 +1,395 @@
|
|
|
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 _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
13
|
+
|
|
14
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
15
|
+
|
|
16
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
17
|
+
|
|
18
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
19
|
+
|
|
20
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
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 _range = require("@jbrowse/core/util/range");
|
|
33
|
+
|
|
34
|
+
var _io = require("@jbrowse/core/util/io");
|
|
35
|
+
|
|
36
|
+
var _rxjs = require("@jbrowse/core/util/rxjs");
|
|
37
|
+
|
|
38
|
+
var _simpleFeature = _interopRequireDefault(require("@jbrowse/core/util/simpleFeature"));
|
|
39
|
+
|
|
40
|
+
var _tabix = require("@gmod/tabix");
|
|
41
|
+
|
|
42
|
+
var _gff = _interopRequireDefault(require("@gmod/gff"));
|
|
43
|
+
|
|
44
|
+
var _configuration = require("@jbrowse/core/configuration");
|
|
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(config, getSubAdapter, pluginManager) {
|
|
60
|
+
var _this;
|
|
61
|
+
|
|
62
|
+
(0, _classCallCheck2["default"])(this, _default);
|
|
63
|
+
_this = _super.call(this, config, getSubAdapter, pluginManager);
|
|
64
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "gff", void 0);
|
|
65
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "dontRedispatch", void 0);
|
|
66
|
+
var gffGzLocation = (0, _configuration.readConfObject)(config, 'gffGzLocation');
|
|
67
|
+
var indexType = (0, _configuration.readConfObject)(config, ['index', 'indexType']);
|
|
68
|
+
var location = (0, _configuration.readConfObject)(config, ['index', 'location']);
|
|
69
|
+
var dontRedispatch = (0, _configuration.readConfObject)(config, 'dontRedispatch');
|
|
70
|
+
_this.dontRedispatch = dontRedispatch || ['chromosome', 'contig', 'region'];
|
|
71
|
+
_this.gff = new _tabix.TabixIndexedFile({
|
|
72
|
+
filehandle: (0, _io.openLocation)(gffGzLocation, _this.pluginManager),
|
|
73
|
+
csiFilehandle: indexType === 'CSI' ? (0, _io.openLocation)(location, _this.pluginManager) : undefined,
|
|
74
|
+
tbiFilehandle: indexType !== 'CSI' ? (0, _io.openLocation)(location, _this.pluginManager) : undefined,
|
|
75
|
+
chunkCacheSize: 50 * Math.pow(2, 20),
|
|
76
|
+
renameRefSeqs: function renameRefSeqs(n) {
|
|
77
|
+
return n;
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
return _this;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
(0, _createClass2["default"])(_default, [{
|
|
84
|
+
key: "getRefNames",
|
|
85
|
+
value: function () {
|
|
86
|
+
var _getRefNames = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
87
|
+
var opts,
|
|
88
|
+
_args = arguments;
|
|
89
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
90
|
+
while (1) {
|
|
91
|
+
switch (_context.prev = _context.next) {
|
|
92
|
+
case 0:
|
|
93
|
+
opts = _args.length > 0 && _args[0] !== undefined ? _args[0] : {};
|
|
94
|
+
return _context.abrupt("return", this.gff.getReferenceSequenceNames(opts));
|
|
95
|
+
|
|
96
|
+
case 2:
|
|
97
|
+
case "end":
|
|
98
|
+
return _context.stop();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}, _callee, this);
|
|
102
|
+
}));
|
|
103
|
+
|
|
104
|
+
function getRefNames() {
|
|
105
|
+
return _getRefNames.apply(this, arguments);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return getRefNames;
|
|
109
|
+
}()
|
|
110
|
+
}, {
|
|
111
|
+
key: "getHeader",
|
|
112
|
+
value: function () {
|
|
113
|
+
var _getHeader = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
|
|
114
|
+
return _regenerator["default"].wrap(function _callee2$(_context2) {
|
|
115
|
+
while (1) {
|
|
116
|
+
switch (_context2.prev = _context2.next) {
|
|
117
|
+
case 0:
|
|
118
|
+
return _context2.abrupt("return", this.gff.getHeader());
|
|
119
|
+
|
|
120
|
+
case 1:
|
|
121
|
+
case "end":
|
|
122
|
+
return _context2.stop();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}, _callee2, this);
|
|
126
|
+
}));
|
|
127
|
+
|
|
128
|
+
function getHeader() {
|
|
129
|
+
return _getHeader.apply(this, arguments);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
return getHeader;
|
|
133
|
+
}()
|
|
134
|
+
}, {
|
|
135
|
+
key: "getFeatures",
|
|
136
|
+
value: function getFeatures(query) {
|
|
137
|
+
var _this2 = this;
|
|
138
|
+
|
|
139
|
+
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
140
|
+
return (0, _rxjs.ObservableCreate)( /*#__PURE__*/function () {
|
|
141
|
+
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(observer) {
|
|
142
|
+
var metadata;
|
|
143
|
+
return _regenerator["default"].wrap(function _callee3$(_context3) {
|
|
144
|
+
while (1) {
|
|
145
|
+
switch (_context3.prev = _context3.next) {
|
|
146
|
+
case 0:
|
|
147
|
+
_context3.next = 2;
|
|
148
|
+
return _this2.gff.getMetadata();
|
|
149
|
+
|
|
150
|
+
case 2:
|
|
151
|
+
metadata = _context3.sent;
|
|
152
|
+
|
|
153
|
+
_this2.getFeaturesHelper(query, opts, metadata, observer, true);
|
|
154
|
+
|
|
155
|
+
case 4:
|
|
156
|
+
case "end":
|
|
157
|
+
return _context3.stop();
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}, _callee3);
|
|
161
|
+
}));
|
|
162
|
+
|
|
163
|
+
return function (_x) {
|
|
164
|
+
return _ref.apply(this, arguments);
|
|
165
|
+
};
|
|
166
|
+
}(), opts.signal);
|
|
167
|
+
}
|
|
168
|
+
}, {
|
|
169
|
+
key: "getFeaturesHelper",
|
|
170
|
+
value: function () {
|
|
171
|
+
var _getFeaturesHelper = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee4(query) {
|
|
172
|
+
var _this3 = this;
|
|
173
|
+
|
|
174
|
+
var opts,
|
|
175
|
+
metadata,
|
|
176
|
+
observer,
|
|
177
|
+
allowRedispatch,
|
|
178
|
+
originalQuery,
|
|
179
|
+
lines,
|
|
180
|
+
minStart,
|
|
181
|
+
maxEnd,
|
|
182
|
+
gff3,
|
|
183
|
+
features,
|
|
184
|
+
_args4 = arguments;
|
|
185
|
+
return _regenerator["default"].wrap(function _callee4$(_context4) {
|
|
186
|
+
while (1) {
|
|
187
|
+
switch (_context4.prev = _context4.next) {
|
|
188
|
+
case 0:
|
|
189
|
+
opts = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : {};
|
|
190
|
+
metadata = _args4.length > 2 ? _args4[2] : undefined;
|
|
191
|
+
observer = _args4.length > 3 ? _args4[3] : undefined;
|
|
192
|
+
allowRedispatch = _args4.length > 4 ? _args4[4] : undefined;
|
|
193
|
+
originalQuery = _args4.length > 5 && _args4[5] !== undefined ? _args4[5] : query;
|
|
194
|
+
_context4.prev = 5;
|
|
195
|
+
lines = [];
|
|
196
|
+
_context4.next = 9;
|
|
197
|
+
return this.gff.getLines(query.refName, query.start, query.end, function (line, fileOffset) {
|
|
198
|
+
lines.push(_this3.parseLine(metadata.columnNumbers, line, fileOffset));
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
case 9:
|
|
202
|
+
if (!(allowRedispatch && lines.length)) {
|
|
203
|
+
_context4.next = 16;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
minStart = Infinity;
|
|
208
|
+
maxEnd = -Infinity;
|
|
209
|
+
lines.forEach(function (line) {
|
|
210
|
+
var featureType = line.fields[2]; // only expand redispatch range if feature is not a "dontRedispatch" type
|
|
211
|
+
// skips large regions like chromosome,region
|
|
212
|
+
|
|
213
|
+
if (!_this3.dontRedispatch.includes(featureType)) {
|
|
214
|
+
var start = line.start - 1; // gff is 1-based
|
|
215
|
+
|
|
216
|
+
if (start < minStart) {
|
|
217
|
+
minStart = start;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (line.end > maxEnd) {
|
|
221
|
+
maxEnd = line.end;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
if (!(maxEnd > query.end || minStart < query.start)) {
|
|
227
|
+
_context4.next = 16;
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// make a new feature callback to only return top-level features
|
|
232
|
+
// in the original query range
|
|
233
|
+
this.getFeaturesHelper(_objectSpread(_objectSpread({}, query), {}, {
|
|
234
|
+
start: minStart,
|
|
235
|
+
end: maxEnd
|
|
236
|
+
}), opts, metadata, observer, false, query);
|
|
237
|
+
return _context4.abrupt("return");
|
|
238
|
+
|
|
239
|
+
case 16:
|
|
240
|
+
gff3 = lines.map(function (lineRecord) {
|
|
241
|
+
if (lineRecord.fields[8] && lineRecord.fields[8] !== '.') {
|
|
242
|
+
if (!lineRecord.fields[8].includes('_lineHash')) {
|
|
243
|
+
lineRecord.fields[8] += ";_lineHash=".concat(lineRecord.lineHash);
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
lineRecord.fields[8] = "_lineHash=".concat(lineRecord.lineHash);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return lineRecord.fields.join('\t');
|
|
250
|
+
}).join('\n');
|
|
251
|
+
features = _gff["default"].parseStringSync(gff3, {
|
|
252
|
+
parseFeatures: true,
|
|
253
|
+
parseComments: false,
|
|
254
|
+
parseDirectives: false,
|
|
255
|
+
parseSequences: false
|
|
256
|
+
});
|
|
257
|
+
features.forEach(function (featureLocs) {
|
|
258
|
+
return _this3.formatFeatures(featureLocs).forEach(function (f) {
|
|
259
|
+
if ((0, _range.doesIntersect2)(f.get('start'), f.get('end'), originalQuery.start, originalQuery.end)) {
|
|
260
|
+
observer.next(f);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
observer.complete();
|
|
265
|
+
_context4.next = 25;
|
|
266
|
+
break;
|
|
267
|
+
|
|
268
|
+
case 22:
|
|
269
|
+
_context4.prev = 22;
|
|
270
|
+
_context4.t0 = _context4["catch"](5);
|
|
271
|
+
observer.error(_context4.t0);
|
|
272
|
+
|
|
273
|
+
case 25:
|
|
274
|
+
case "end":
|
|
275
|
+
return _context4.stop();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}, _callee4, this, [[5, 22]]);
|
|
279
|
+
}));
|
|
280
|
+
|
|
281
|
+
function getFeaturesHelper(_x2) {
|
|
282
|
+
return _getFeaturesHelper.apply(this, arguments);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return getFeaturesHelper;
|
|
286
|
+
}()
|
|
287
|
+
}, {
|
|
288
|
+
key: "parseLine",
|
|
289
|
+
value: function parseLine(columnNumbers, line, fileOffset) {
|
|
290
|
+
var fields = line.split('\t'); // note: index column numbers are 1-based
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
start: +fields[columnNumbers.start - 1],
|
|
294
|
+
end: +fields[columnNumbers.end - 1],
|
|
295
|
+
lineHash: fileOffset,
|
|
296
|
+
fields: fields
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
}, {
|
|
300
|
+
key: "formatFeatures",
|
|
301
|
+
value: function formatFeatures(featureLocs) {
|
|
302
|
+
var _this4 = this;
|
|
303
|
+
|
|
304
|
+
return featureLocs.map(function (featureLoc) {
|
|
305
|
+
return new _simpleFeature["default"]({
|
|
306
|
+
data: _this4.featureData(featureLoc),
|
|
307
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
308
|
+
id: "".concat(_this4.id, "-offset-").concat(featureLoc.attributes._lineHash[0])
|
|
309
|
+
});
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
}, {
|
|
313
|
+
key: "featureData",
|
|
314
|
+
value: function featureData(data) {
|
|
315
|
+
var _this5 = this;
|
|
316
|
+
|
|
317
|
+
var f = _objectSpread({}, data);
|
|
318
|
+
|
|
319
|
+
f.start -= 1; // convert to interbase
|
|
320
|
+
|
|
321
|
+
if (data.strand === '+') {
|
|
322
|
+
f.strand = 1;
|
|
323
|
+
} else if (data.strand === '-') {
|
|
324
|
+
f.strand = -1;
|
|
325
|
+
} else if (data.strand === '.') {
|
|
326
|
+
f.strand = 0;
|
|
327
|
+
} else {
|
|
328
|
+
f.strand = undefined;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
f.phase = Number(data.phase);
|
|
332
|
+
f.refName = data.seq_id;
|
|
333
|
+
|
|
334
|
+
if (data.score === null) {
|
|
335
|
+
delete f.score;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (data.phase === null) {
|
|
339
|
+
delete f.score;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
var defaultFields = ['start', 'end', 'seq_id', 'score', 'type', 'source', 'phase', 'strand'];
|
|
343
|
+
var dataAttributes = data.attributes || {};
|
|
344
|
+
Object.keys(dataAttributes).forEach(function (a) {
|
|
345
|
+
var b = a.toLowerCase();
|
|
346
|
+
|
|
347
|
+
if (defaultFields.includes(b)) {
|
|
348
|
+
// add "suffix" to tag name if it already exists
|
|
349
|
+
// reproduces behavior of NCList
|
|
350
|
+
b += '2';
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
if (dataAttributes[a] !== null) {
|
|
354
|
+
var attr = dataAttributes[a];
|
|
355
|
+
|
|
356
|
+
if (Array.isArray(attr) && attr.length === 1) {
|
|
357
|
+
;
|
|
358
|
+
var _attr = attr;
|
|
359
|
+
|
|
360
|
+
var _attr2 = (0, _slicedToArray2["default"])(_attr, 1);
|
|
361
|
+
|
|
362
|
+
attr = _attr2[0];
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
f[b] = attr;
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
f.refName = f.seq_id; // the SimpleFeature constructor takes care of recursively inflating subfeatures
|
|
369
|
+
|
|
370
|
+
if (data.child_features && data.child_features.length) {
|
|
371
|
+
f.subfeatures = data.child_features.map(function (childLocs) {
|
|
372
|
+
return childLocs.map(function (childLoc) {
|
|
373
|
+
return _this5.featureData(childLoc);
|
|
374
|
+
});
|
|
375
|
+
}).flat();
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
delete f.child_features;
|
|
379
|
+
delete f.data;
|
|
380
|
+
delete f.derived_features;
|
|
381
|
+
delete f._linehash;
|
|
382
|
+
delete f.attributes;
|
|
383
|
+
delete f.seq_id;
|
|
384
|
+
return f;
|
|
385
|
+
}
|
|
386
|
+
}, {
|
|
387
|
+
key: "freeResources",
|
|
388
|
+
value: function
|
|
389
|
+
/* { region } */
|
|
390
|
+
freeResources() {}
|
|
391
|
+
}]);
|
|
392
|
+
return _default;
|
|
393
|
+
}(_BaseAdapter.BaseFeatureDataAdapter);
|
|
394
|
+
|
|
395
|
+
exports["default"] = _default;
|
|
@@ -0,0 +1,74 @@
|
|
|
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 _configSchema = _interopRequireDefault(require("./configSchema"));
|
|
12
|
+
|
|
13
|
+
var _Gff3TabixAdapter = _interopRequireDefault(require("./Gff3TabixAdapter"));
|
|
14
|
+
|
|
15
|
+
describe('adapter can fetch features from volvox.gff3', function () {
|
|
16
|
+
var adapter;
|
|
17
|
+
beforeEach(function () {
|
|
18
|
+
adapter = new _Gff3TabixAdapter["default"](_configSchema["default"].create({
|
|
19
|
+
gffGzLocation: {
|
|
20
|
+
localPath: require.resolve('../test_data/volvox.sort.gff3.gz')
|
|
21
|
+
},
|
|
22
|
+
index: {
|
|
23
|
+
location: {
|
|
24
|
+
localPath: require.resolve('../test_data/volvox.sort.gff3.gz.tbi')
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}));
|
|
28
|
+
});
|
|
29
|
+
it('test getfeatures on gff plain text adapter', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
|
|
30
|
+
var features, featuresArray, featuresJsonArray;
|
|
31
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
32
|
+
while (1) {
|
|
33
|
+
switch (_context.prev = _context.next) {
|
|
34
|
+
case 0:
|
|
35
|
+
features = adapter.getFeatures({
|
|
36
|
+
refName: 'ctgB',
|
|
37
|
+
start: 0,
|
|
38
|
+
end: 200000,
|
|
39
|
+
assemblyName: 'volvox'
|
|
40
|
+
});
|
|
41
|
+
_context.t0 = expect;
|
|
42
|
+
_context.next = 4;
|
|
43
|
+
return adapter.hasDataForRefName('ctgA');
|
|
44
|
+
|
|
45
|
+
case 4:
|
|
46
|
+
_context.t1 = _context.sent;
|
|
47
|
+
(0, _context.t0)(_context.t1).toBe(true);
|
|
48
|
+
_context.t2 = expect;
|
|
49
|
+
_context.next = 9;
|
|
50
|
+
return adapter.hasDataForRefName('ctgB');
|
|
51
|
+
|
|
52
|
+
case 9:
|
|
53
|
+
_context.t3 = _context.sent;
|
|
54
|
+
(0, _context.t2)(_context.t3).toBe(true);
|
|
55
|
+
_context.next = 13;
|
|
56
|
+
return features.pipe((0, _operators.toArray)()).toPromise();
|
|
57
|
+
|
|
58
|
+
case 13:
|
|
59
|
+
featuresArray = _context.sent;
|
|
60
|
+
// There are only 4 features in ctgB
|
|
61
|
+
expect(featuresArray.length).toBe(4);
|
|
62
|
+
featuresJsonArray = featuresArray.map(function (f) {
|
|
63
|
+
return f.toJSON();
|
|
64
|
+
});
|
|
65
|
+
expect(featuresJsonArray).toMatchSnapshot();
|
|
66
|
+
|
|
67
|
+
case 17:
|
|
68
|
+
case "end":
|
|
69
|
+
return _context.stop();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}, _callee);
|
|
73
|
+
})));
|
|
74
|
+
});
|
|
@@ -0,0 +1,42 @@
|
|
|
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)('Gff3TabixAdapter', {
|
|
13
|
+
gffGzLocation: {
|
|
14
|
+
type: 'fileLocation',
|
|
15
|
+
defaultValue: {
|
|
16
|
+
uri: '/path/to/my.gff.gz',
|
|
17
|
+
locationType: 'UriLocation'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
index: (0, _configuration.ConfigurationSchema)('Gff3TabixIndex', {
|
|
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.gff.gz.tbi',
|
|
30
|
+
locationType: 'UriLocation'
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}),
|
|
34
|
+
dontRedispatch: {
|
|
35
|
+
type: 'stringArray',
|
|
36
|
+
defaultValue: ['chromosome', 'region']
|
|
37
|
+
}
|
|
38
|
+
}, {
|
|
39
|
+
explicitlyTyped: true
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
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"));
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
1
2
|
|
|
2
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
}
|
|
5
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
+
|
|
7
|
+
Object.defineProperty(exports, "__esModule", {
|
|
8
|
+
value: true
|
|
9
|
+
});
|
|
10
|
+
exports["default"] = void 0;
|
|
11
|
+
|
|
12
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
13
|
+
|
|
14
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
15
|
+
|
|
16
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
|
|
17
|
+
|
|
18
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
|
|
19
|
+
|
|
20
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
|
|
21
|
+
|
|
22
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
23
|
+
|
|
24
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
25
|
+
|
|
26
|
+
var _AdapterType = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/AdapterType"));
|
|
27
|
+
|
|
28
|
+
var _Plugin2 = _interopRequireDefault(require("@jbrowse/core/Plugin"));
|
|
29
|
+
|
|
30
|
+
var _Gff3TabixAdapter = require("./Gff3TabixAdapter");
|
|
31
|
+
|
|
32
|
+
var _tracks = require("@jbrowse/core/util/tracks");
|
|
33
|
+
|
|
34
|
+
var _Gff3Adapter = require("./Gff3Adapter");
|
|
35
|
+
|
|
36
|
+
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); }
|
|
37
|
+
|
|
38
|
+
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; }
|
|
39
|
+
|
|
40
|
+
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); }; }
|
|
41
|
+
|
|
42
|
+
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; } }
|
|
43
|
+
|
|
44
|
+
var _default = /*#__PURE__*/function (_Plugin) {
|
|
45
|
+
(0, _inherits2["default"])(_default, _Plugin);
|
|
46
|
+
|
|
47
|
+
var _super = _createSuper(_default);
|
|
48
|
+
|
|
49
|
+
function _default() {
|
|
50
|
+
var _this;
|
|
51
|
+
|
|
52
|
+
(0, _classCallCheck2["default"])(this, _default);
|
|
53
|
+
|
|
54
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
55
|
+
args[_key] = arguments[_key];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
|
59
|
+
(0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "name", 'GFF3Plugin');
|
|
60
|
+
return _this;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
(0, _createClass2["default"])(_default, [{
|
|
64
|
+
key: "install",
|
|
65
|
+
value: function install(pluginManager) {
|
|
66
|
+
pluginManager.addAdapterType(function () {
|
|
67
|
+
return new _AdapterType["default"]({
|
|
68
|
+
name: 'Gff3TabixAdapter',
|
|
69
|
+
configSchema: _Gff3TabixAdapter.configSchema,
|
|
70
|
+
getAdapterClass: function getAdapterClass() {
|
|
71
|
+
return Promise.resolve().then(function () {
|
|
72
|
+
return _interopRequireWildcard(require('./Gff3TabixAdapter/Gff3TabixAdapter'));
|
|
73
|
+
}).then(function (r) {
|
|
74
|
+
return r["default"];
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', function (adapterGuesser) {
|
|
80
|
+
return function (file, index, adapterHint) {
|
|
81
|
+
var regexGuess = /\.gff3?\.b?gz$/i;
|
|
82
|
+
var adapterName = 'Gff3TabixAdapter';
|
|
83
|
+
var fileName = (0, _tracks.getFileName)(file);
|
|
84
|
+
var indexName = index && (0, _tracks.getFileName)(index);
|
|
85
|
+
|
|
86
|
+
if (regexGuess.test(fileName) || adapterHint === adapterName) {
|
|
87
|
+
return {
|
|
88
|
+
type: adapterName,
|
|
89
|
+
bamLocation: file,
|
|
90
|
+
gffGzLocation: file,
|
|
91
|
+
index: {
|
|
92
|
+
location: index || (0, _tracks.makeIndex)(file, '.tbi'),
|
|
93
|
+
indexType: (0, _tracks.makeIndexType)(indexName, 'CSI', 'TBI')
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return adapterGuesser(file, index, adapterHint);
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
pluginManager.addAdapterType(function () {
|
|
102
|
+
return new _AdapterType["default"]({
|
|
103
|
+
name: 'Gff3Adapter',
|
|
104
|
+
configSchema: _Gff3Adapter.configSchema,
|
|
105
|
+
getAdapterClass: function getAdapterClass() {
|
|
106
|
+
return Promise.resolve().then(function () {
|
|
107
|
+
return _interopRequireWildcard(require('./Gff3Adapter/Gff3Adapter'));
|
|
108
|
+
}).then(function (r) {
|
|
109
|
+
return r["default"];
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', function (adapterGuesser) {
|
|
115
|
+
return function (file, index, adapterHint) {
|
|
116
|
+
var regexGuess = /\.gff3?$/i;
|
|
117
|
+
var adapterName = 'Gff3Adapter';
|
|
118
|
+
var fileName = (0, _tracks.getFileName)(file);
|
|
119
|
+
var obj = {
|
|
120
|
+
type: adapterName,
|
|
121
|
+
gffLocation: file
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
if (regexGuess.test(fileName) && !adapterHint) {
|
|
125
|
+
return obj;
|
|
126
|
+
} else if (adapterHint === adapterName) {
|
|
127
|
+
return obj;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return adapterGuesser(file, index, adapterHint);
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
}]);
|
|
135
|
+
return _default;
|
|
136
|
+
}(_Plugin2["default"]);
|
|
137
|
+
|
|
138
|
+
exports["default"] = _default;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-gff3",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.7.0",
|
|
4
4
|
"description": "JBrowse 2 gff3.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -18,15 +18,12 @@
|
|
|
18
18
|
"distMain": "dist/index.js",
|
|
19
19
|
"srcMain": "src/index.ts",
|
|
20
20
|
"main": "dist/index.js",
|
|
21
|
-
"distModule": "dist/plugin-gff3.esm.js",
|
|
22
|
-
"module": "dist/plugin-gff3.esm.js",
|
|
23
21
|
"files": [
|
|
24
22
|
"dist",
|
|
25
23
|
"src"
|
|
26
24
|
],
|
|
27
25
|
"scripts": {
|
|
28
|
-
"
|
|
29
|
-
"build": "tsdx build",
|
|
26
|
+
"build": "babel src --root-mode upward --out-dir dist --extensions .ts,.js,.tsx,.jsx",
|
|
30
27
|
"test": "cd ../..; jest plugins/gff3 --passWithNoTests",
|
|
31
28
|
"prepublishOnly": "yarn test",
|
|
32
29
|
"prepack": "yarn build; yarn useDist",
|
|
@@ -54,5 +51,5 @@
|
|
|
54
51
|
"publishConfig": {
|
|
55
52
|
"access": "public"
|
|
56
53
|
},
|
|
57
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "cc13844074d11881d211342a6a7eea113561b70b"
|
|
58
55
|
}
|