@jbrowse/plugin-bed 3.3.0 → 3.4.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/BedAdapter/BedAdapter.d.ts +0 -1
- package/dist/BedAdapter/BedAdapter.js +30 -21
- package/dist/BedGraphAdapter/BedGraphAdapter.d.ts +0 -1
- package/dist/BedGraphAdapter/BedGraphAdapter.js +0 -1
- package/dist/BedGraphTabixAdapter/BedGraphTabixAdapter.d.ts +0 -1
- package/dist/BedGraphTabixAdapter/BedGraphTabixAdapter.js +0 -1
- package/dist/BedpeAdapter/BedpeAdapter.d.ts +0 -1
- package/dist/BedpeAdapter/BedpeAdapter.js +0 -1
- package/dist/BigBedAdapter/BigBedAdapter.d.ts +3 -1
- package/dist/BigBedAdapter/BigBedAdapter.js +9 -4
- package/esm/BedAdapter/BedAdapter.d.ts +0 -1
- package/esm/BedAdapter/BedAdapter.js +31 -22
- package/esm/BedGraphAdapter/BedGraphAdapter.d.ts +0 -1
- package/esm/BedGraphAdapter/BedGraphAdapter.js +0 -1
- package/esm/BedGraphTabixAdapter/BedGraphTabixAdapter.d.ts +0 -1
- package/esm/BedGraphTabixAdapter/BedGraphTabixAdapter.js +0 -1
- package/esm/BedpeAdapter/BedpeAdapter.d.ts +0 -1
- package/esm/BedpeAdapter/BedpeAdapter.js +0 -1
- package/esm/BigBedAdapter/BigBedAdapter.d.ts +3 -1
- package/esm/BigBedAdapter/BigBedAdapter.js +9 -4
- package/package.json +6 -6
|
@@ -33,5 +33,4 @@ export default class BedAdapter extends BaseFeatureDataAdapter {
|
|
|
33
33
|
private loadFeatureIntervalTreeHelper;
|
|
34
34
|
loadFeatureIntervalTree(refName: string): Promise<IntervalTree<any> | undefined>;
|
|
35
35
|
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
36
|
-
freeResources(): void;
|
|
37
36
|
}
|
|
@@ -15,31 +15,41 @@ class BedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
15
15
|
super(...arguments);
|
|
16
16
|
this.intervalTrees = {};
|
|
17
17
|
}
|
|
18
|
-
async loadDataP(opts
|
|
19
|
-
const
|
|
18
|
+
async loadDataP(opts) {
|
|
19
|
+
const { statusCallback = () => { } } = opts || {};
|
|
20
20
|
const bedLoc = this.getConf('bedLocation');
|
|
21
|
-
const buffer = await (0, util_1.fetchAndMaybeUnzip)((0, io_1.openLocation)(bedLoc,
|
|
22
|
-
if (buffer.length > 536870888) {
|
|
23
|
-
throw new Error('Data exceeds maximum string length (512MB)');
|
|
24
|
-
}
|
|
25
|
-
const data = new TextDecoder('utf8', { fatal: true }).decode(buffer);
|
|
26
|
-
const lines = data.split(/\n|\r\n|\r/).filter(f => !!f);
|
|
21
|
+
const buffer = await (0, util_1.fetchAndMaybeUnzip)((0, io_1.openLocation)(bedLoc, this.pluginManager), opts);
|
|
27
22
|
const headerLines = [];
|
|
28
|
-
let i = 0;
|
|
29
|
-
for (; i < lines.length && lines[i].startsWith('#'); i++) {
|
|
30
|
-
headerLines.push(lines[i]);
|
|
31
|
-
}
|
|
32
|
-
const header = headerLines.join('\n');
|
|
33
23
|
const features = {};
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
24
|
+
let blockStart = 0;
|
|
25
|
+
let i = 0;
|
|
26
|
+
const decoder = new TextDecoder('utf8');
|
|
27
|
+
while (blockStart < buffer.length) {
|
|
28
|
+
const n = buffer.indexOf(10, blockStart);
|
|
29
|
+
const b = n === -1 ? buffer.subarray(blockStart) : buffer.subarray(blockStart, n);
|
|
30
|
+
const line = decoder.decode(b).trim();
|
|
31
|
+
if (line) {
|
|
32
|
+
if (line.startsWith('#')) {
|
|
33
|
+
headerLines.push(line);
|
|
34
|
+
}
|
|
35
|
+
else if (line.startsWith('>')) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const tab = line.indexOf('\t');
|
|
40
|
+
const refName = line.slice(0, tab);
|
|
41
|
+
if (!features[refName]) {
|
|
42
|
+
features[refName] = [];
|
|
43
|
+
}
|
|
44
|
+
features[refName].push(line);
|
|
45
|
+
}
|
|
40
46
|
}
|
|
41
|
-
|
|
47
|
+
if (i++ % 10000 === 0) {
|
|
48
|
+
statusCallback(`Loading ${(0, util_1.getProgressDisplayStr)(blockStart, buffer.length)}`);
|
|
49
|
+
}
|
|
50
|
+
blockStart = n + 1;
|
|
42
51
|
}
|
|
52
|
+
const header = headerLines.join('\n');
|
|
43
53
|
const autoSql = this.getConf('autoSql');
|
|
44
54
|
const parser = new bed_1.default({ autoSql });
|
|
45
55
|
const columnNames = this.getConf('columnNames');
|
|
@@ -136,7 +146,6 @@ class BedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
136
146
|
observer.complete();
|
|
137
147
|
}, opts.stopToken);
|
|
138
148
|
}
|
|
139
|
-
freeResources() { }
|
|
140
149
|
}
|
|
141
150
|
BedAdapter.capabilities = ['getFeatures', 'getRefNames'];
|
|
142
151
|
exports.default = BedAdapter;
|
|
@@ -14,5 +14,4 @@ export default class BedGraphAdapter extends BaseFeatureDataAdapter {
|
|
|
14
14
|
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
15
15
|
getHeader(): Promise<string>;
|
|
16
16
|
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
17
|
-
freeResources(): void;
|
|
18
17
|
}
|
|
@@ -32,6 +32,9 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
32
32
|
[k: string]: string;
|
|
33
33
|
};
|
|
34
34
|
}>;
|
|
35
|
+
getMetadata(opts?: BaseOptions): Promise<{
|
|
36
|
+
[k: string]: string;
|
|
37
|
+
}>;
|
|
35
38
|
getFeaturesHelper({ query, opts, observer, allowRedispatch, originalQuery, }: {
|
|
36
39
|
query: Region;
|
|
37
40
|
opts: BaseOptions;
|
|
@@ -40,5 +43,4 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
40
43
|
originalQuery?: Region;
|
|
41
44
|
}): Promise<void>;
|
|
42
45
|
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
43
|
-
freeResources(): void;
|
|
44
46
|
}
|
|
@@ -78,9 +78,14 @@ class BigBedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
78
78
|
version,
|
|
79
79
|
fileType,
|
|
80
80
|
autoSql: { ...rest },
|
|
81
|
-
fields:
|
|
81
|
+
fields: await this.getMetadata(opts),
|
|
82
82
|
};
|
|
83
83
|
}
|
|
84
|
+
async getMetadata(opts) {
|
|
85
|
+
const { parser } = await this.configure(opts);
|
|
86
|
+
const { fields } = parser.autoSql;
|
|
87
|
+
return Object.fromEntries(fields.map(({ name, comment }) => [name, comment]));
|
|
88
|
+
}
|
|
84
89
|
async getFeaturesHelper({ query, opts, observer, allowRedispatch, originalQuery = query, }) {
|
|
85
90
|
var _a;
|
|
86
91
|
const { statusCallback = () => { } } = opts;
|
|
@@ -106,7 +111,8 @@ class BigBedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
106
111
|
uniqueId: feat.uniqueId,
|
|
107
112
|
});
|
|
108
113
|
const aggr = data[aggregateField];
|
|
109
|
-
|
|
114
|
+
const aggrIsNotNone = aggr && aggr !== 'none';
|
|
115
|
+
if (aggrIsNotNone && !parentAggregation[aggr]) {
|
|
110
116
|
parentAggregation[aggr] = [];
|
|
111
117
|
}
|
|
112
118
|
const { uniqueId, type, chrom, chromStart, chromEnd, description, chromStarts: chromStarts2, blockStarts: blockStarts2, blockSizes: blockSizes2, score: score2, blockCount, thickStart, thickEnd, strand, ...rest } = data;
|
|
@@ -120,7 +126,7 @@ class BigBedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
120
126
|
end: feat.end,
|
|
121
127
|
refName: query.refName,
|
|
122
128
|
});
|
|
123
|
-
if (
|
|
129
|
+
if (aggrIsNotNone) {
|
|
124
130
|
parentAggregation[aggr].push(f);
|
|
125
131
|
parentAggregationFlat.push(f);
|
|
126
132
|
}
|
|
@@ -200,6 +206,5 @@ class BigBedAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
|
|
|
200
206
|
}
|
|
201
207
|
}, opts.stopToken);
|
|
202
208
|
}
|
|
203
|
-
freeResources() { }
|
|
204
209
|
}
|
|
205
210
|
exports.default = BigBedAdapter;
|
|
@@ -33,5 +33,4 @@ export default class BedAdapter extends BaseFeatureDataAdapter {
|
|
|
33
33
|
private loadFeatureIntervalTreeHelper;
|
|
34
34
|
loadFeatureIntervalTree(refName: string): Promise<IntervalTree<any> | undefined>;
|
|
35
35
|
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
36
|
-
freeResources(): void;
|
|
37
36
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import IntervalTree from '@flatten-js/interval-tree';
|
|
2
2
|
import BED from '@gmod/bed';
|
|
3
3
|
import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter';
|
|
4
|
-
import { SimpleFeature, fetchAndMaybeUnzip } from '@jbrowse/core/util';
|
|
4
|
+
import { SimpleFeature, fetchAndMaybeUnzip, getProgressDisplayStr, } from '@jbrowse/core/util';
|
|
5
5
|
import { openLocation } from '@jbrowse/core/util/io';
|
|
6
6
|
import { ObservableCreate } from '@jbrowse/core/util/rxjs';
|
|
7
7
|
import { featureData } from '../util';
|
|
@@ -10,31 +10,41 @@ class BedAdapter extends BaseFeatureDataAdapter {
|
|
|
10
10
|
super(...arguments);
|
|
11
11
|
this.intervalTrees = {};
|
|
12
12
|
}
|
|
13
|
-
async loadDataP(opts
|
|
14
|
-
const
|
|
13
|
+
async loadDataP(opts) {
|
|
14
|
+
const { statusCallback = () => { } } = opts || {};
|
|
15
15
|
const bedLoc = this.getConf('bedLocation');
|
|
16
|
-
const buffer = await fetchAndMaybeUnzip(openLocation(bedLoc,
|
|
17
|
-
if (buffer.length > 536870888) {
|
|
18
|
-
throw new Error('Data exceeds maximum string length (512MB)');
|
|
19
|
-
}
|
|
20
|
-
const data = new TextDecoder('utf8', { fatal: true }).decode(buffer);
|
|
21
|
-
const lines = data.split(/\n|\r\n|\r/).filter(f => !!f);
|
|
16
|
+
const buffer = await fetchAndMaybeUnzip(openLocation(bedLoc, this.pluginManager), opts);
|
|
22
17
|
const headerLines = [];
|
|
23
|
-
let i = 0;
|
|
24
|
-
for (; i < lines.length && lines[i].startsWith('#'); i++) {
|
|
25
|
-
headerLines.push(lines[i]);
|
|
26
|
-
}
|
|
27
|
-
const header = headerLines.join('\n');
|
|
28
18
|
const features = {};
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
19
|
+
let blockStart = 0;
|
|
20
|
+
let i = 0;
|
|
21
|
+
const decoder = new TextDecoder('utf8');
|
|
22
|
+
while (blockStart < buffer.length) {
|
|
23
|
+
const n = buffer.indexOf(10, blockStart);
|
|
24
|
+
const b = n === -1 ? buffer.subarray(blockStart) : buffer.subarray(blockStart, n);
|
|
25
|
+
const line = decoder.decode(b).trim();
|
|
26
|
+
if (line) {
|
|
27
|
+
if (line.startsWith('#')) {
|
|
28
|
+
headerLines.push(line);
|
|
29
|
+
}
|
|
30
|
+
else if (line.startsWith('>')) {
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const tab = line.indexOf('\t');
|
|
35
|
+
const refName = line.slice(0, tab);
|
|
36
|
+
if (!features[refName]) {
|
|
37
|
+
features[refName] = [];
|
|
38
|
+
}
|
|
39
|
+
features[refName].push(line);
|
|
40
|
+
}
|
|
35
41
|
}
|
|
36
|
-
|
|
42
|
+
if (i++ % 10000 === 0) {
|
|
43
|
+
statusCallback(`Loading ${getProgressDisplayStr(blockStart, buffer.length)}`);
|
|
44
|
+
}
|
|
45
|
+
blockStart = n + 1;
|
|
37
46
|
}
|
|
47
|
+
const header = headerLines.join('\n');
|
|
38
48
|
const autoSql = this.getConf('autoSql');
|
|
39
49
|
const parser = new BED({ autoSql });
|
|
40
50
|
const columnNames = this.getConf('columnNames');
|
|
@@ -131,7 +141,6 @@ class BedAdapter extends BaseFeatureDataAdapter {
|
|
|
131
141
|
observer.complete();
|
|
132
142
|
}, opts.stopToken);
|
|
133
143
|
}
|
|
134
|
-
freeResources() { }
|
|
135
144
|
}
|
|
136
145
|
BedAdapter.capabilities = ['getFeatures', 'getRefNames'];
|
|
137
146
|
export default BedAdapter;
|
|
@@ -14,5 +14,4 @@ export default class BedGraphAdapter extends BaseFeatureDataAdapter {
|
|
|
14
14
|
getRefNames(opts?: BaseOptions): Promise<string[]>;
|
|
15
15
|
getHeader(): Promise<string>;
|
|
16
16
|
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
17
|
-
freeResources(): void;
|
|
18
17
|
}
|
|
@@ -32,6 +32,9 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
32
32
|
[k: string]: string;
|
|
33
33
|
};
|
|
34
34
|
}>;
|
|
35
|
+
getMetadata(opts?: BaseOptions): Promise<{
|
|
36
|
+
[k: string]: string;
|
|
37
|
+
}>;
|
|
35
38
|
getFeaturesHelper({ query, opts, observer, allowRedispatch, originalQuery, }: {
|
|
36
39
|
query: Region;
|
|
37
40
|
opts: BaseOptions;
|
|
@@ -40,5 +43,4 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
40
43
|
originalQuery?: Region;
|
|
41
44
|
}): Promise<void>;
|
|
42
45
|
getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
|
|
43
|
-
freeResources(): void;
|
|
44
46
|
}
|
|
@@ -73,9 +73,14 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
73
73
|
version,
|
|
74
74
|
fileType,
|
|
75
75
|
autoSql: { ...rest },
|
|
76
|
-
fields:
|
|
76
|
+
fields: await this.getMetadata(opts),
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
|
+
async getMetadata(opts) {
|
|
80
|
+
const { parser } = await this.configure(opts);
|
|
81
|
+
const { fields } = parser.autoSql;
|
|
82
|
+
return Object.fromEntries(fields.map(({ name, comment }) => [name, comment]));
|
|
83
|
+
}
|
|
79
84
|
async getFeaturesHelper({ query, opts, observer, allowRedispatch, originalQuery = query, }) {
|
|
80
85
|
var _a;
|
|
81
86
|
const { statusCallback = () => { } } = opts;
|
|
@@ -101,7 +106,8 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
101
106
|
uniqueId: feat.uniqueId,
|
|
102
107
|
});
|
|
103
108
|
const aggr = data[aggregateField];
|
|
104
|
-
|
|
109
|
+
const aggrIsNotNone = aggr && aggr !== 'none';
|
|
110
|
+
if (aggrIsNotNone && !parentAggregation[aggr]) {
|
|
105
111
|
parentAggregation[aggr] = [];
|
|
106
112
|
}
|
|
107
113
|
const { uniqueId, type, chrom, chromStart, chromEnd, description, chromStarts: chromStarts2, blockStarts: blockStarts2, blockSizes: blockSizes2, score: score2, blockCount, thickStart, thickEnd, strand, ...rest } = data;
|
|
@@ -115,7 +121,7 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
115
121
|
end: feat.end,
|
|
116
122
|
refName: query.refName,
|
|
117
123
|
});
|
|
118
|
-
if (
|
|
124
|
+
if (aggrIsNotNone) {
|
|
119
125
|
parentAggregation[aggr].push(f);
|
|
120
126
|
parentAggregationFlat.push(f);
|
|
121
127
|
}
|
|
@@ -195,5 +201,4 @@ export default class BigBedAdapter extends BaseFeatureDataAdapter {
|
|
|
195
201
|
}
|
|
196
202
|
}, opts.stopToken);
|
|
197
203
|
}
|
|
198
|
-
freeResources() { }
|
|
199
204
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jbrowse/plugin-bed",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "JBrowse 2 bed adapters, tracks, etc.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"jbrowse",
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@flatten-js/interval-tree": "^1.0.15",
|
|
40
|
-
"@gmod/bbi": "^
|
|
40
|
+
"@gmod/bbi": "^7.0.0",
|
|
41
41
|
"@gmod/bed": "^2.1.2",
|
|
42
|
-
"@gmod/bgzf-filehandle": "^
|
|
43
|
-
"@gmod/tabix": "^
|
|
44
|
-
"@jbrowse/core": "^3.
|
|
42
|
+
"@gmod/bgzf-filehandle": "^3.0.2",
|
|
43
|
+
"@gmod/tabix": "^3.0.1",
|
|
44
|
+
"@jbrowse/core": "^3.4.0",
|
|
45
45
|
"mobx": "^6.0.0",
|
|
46
46
|
"mobx-react": "^9.0.0",
|
|
47
47
|
"mobx-state-tree": "^5.0.0",
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"distModule": "esm/index.js",
|
|
54
54
|
"srcModule": "src/index.ts",
|
|
55
55
|
"module": "esm/index.js",
|
|
56
|
-
"gitHead": "
|
|
56
|
+
"gitHead": "a9f1ac35fc2dd810bae92cdaf1fc19995bee4413"
|
|
57
57
|
}
|