@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.
@@ -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 pm = this.pluginManager;
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, pm), opts);
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
- for (; i < lines.length; i++) {
35
- const line = lines[i];
36
- const tab = line.indexOf('\t');
37
- const refName = line.slice(0, tab);
38
- if (!features[refName]) {
39
- features[refName] = [];
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
- features[refName].push(line);
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;
@@ -20,5 +20,4 @@ export default class BedGraphAdapter extends BaseFeatureDataAdapter {
20
20
  columnNames: string[];
21
21
  }>;
22
22
  getFeatures(query: Region, _opts?: BaseOptions): import("rxjs").Observable<Feature>;
23
- freeResources(): void;
24
23
  }
@@ -125,6 +125,5 @@ class BedGraphAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
125
125
  observer.complete();
126
126
  });
127
127
  }
128
- freeResources() { }
129
128
  }
130
129
  exports.default = BedGraphAdapter;
@@ -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
  }
@@ -103,6 +103,5 @@ class BedGraphAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
103
103
  observer.complete();
104
104
  });
105
105
  }
106
- freeResources() { }
107
106
  }
108
107
  exports.default = BedGraphAdapter;
@@ -19,5 +19,4 @@ export default class BedpeAdapter extends BaseFeatureDataAdapter {
19
19
  private loadFeatureTreeP;
20
20
  private loadFeatureTree;
21
21
  getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
22
- freeResources(): void;
23
22
  }
@@ -109,7 +109,6 @@ class BedpeAdapter extends BaseAdapter_1.BaseFeatureDataAdapter {
109
109
  observer.complete();
110
110
  }, opts.stopToken);
111
111
  }
112
- freeResources() { }
113
112
  }
114
113
  BedpeAdapter.capabilities = ['getFeatures', 'getRefNames'];
115
114
  exports.default = BedpeAdapter;
@@ -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: Object.fromEntries(fields.map(({ name, comment }) => [name, comment])),
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
- if (!parentAggregation[aggr]) {
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 (aggr) {
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 pm = this.pluginManager;
13
+ async loadDataP(opts) {
14
+ const { statusCallback = () => { } } = opts || {};
15
15
  const bedLoc = this.getConf('bedLocation');
16
- const buffer = await fetchAndMaybeUnzip(openLocation(bedLoc, pm), opts);
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
- for (; i < lines.length; i++) {
30
- const line = lines[i];
31
- const tab = line.indexOf('\t');
32
- const refName = line.slice(0, tab);
33
- if (!features[refName]) {
34
- features[refName] = [];
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
- features[refName].push(line);
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;
@@ -20,5 +20,4 @@ export default class BedGraphAdapter extends BaseFeatureDataAdapter {
20
20
  columnNames: string[];
21
21
  }>;
22
22
  getFeatures(query: Region, _opts?: BaseOptions): import("rxjs").Observable<Feature>;
23
- freeResources(): void;
24
23
  }
@@ -120,5 +120,4 @@ export default class BedGraphAdapter extends BaseFeatureDataAdapter {
120
120
  observer.complete();
121
121
  });
122
122
  }
123
- freeResources() { }
124
123
  }
@@ -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
  }
@@ -101,5 +101,4 @@ export default class BedGraphAdapter extends BaseFeatureDataAdapter {
101
101
  observer.complete();
102
102
  });
103
103
  }
104
- freeResources() { }
105
104
  }
@@ -19,5 +19,4 @@ export default class BedpeAdapter extends BaseFeatureDataAdapter {
19
19
  private loadFeatureTreeP;
20
20
  private loadFeatureTree;
21
21
  getFeatures(query: Region, opts?: BaseOptions): import("rxjs").Observable<Feature>;
22
- freeResources(): void;
23
22
  }
@@ -104,7 +104,6 @@ class BedpeAdapter extends BaseFeatureDataAdapter {
104
104
  observer.complete();
105
105
  }, opts.stopToken);
106
106
  }
107
- freeResources() { }
108
107
  }
109
108
  BedpeAdapter.capabilities = ['getFeatures', 'getRefNames'];
110
109
  export default BedpeAdapter;
@@ -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: Object.fromEntries(fields.map(({ name, comment }) => [name, comment])),
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
- if (!parentAggregation[aggr]) {
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 (aggr) {
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.0",
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": "^6.0.0",
40
+ "@gmod/bbi": "^7.0.0",
41
41
  "@gmod/bed": "^2.1.2",
42
- "@gmod/bgzf-filehandle": "^2.0.1",
43
- "@gmod/tabix": "^2.0.0",
44
- "@jbrowse/core": "^3.3.0",
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": "0bb64d8cc7ecdd167515308b31eec3d9acbc59e4"
56
+ "gitHead": "a9f1ac35fc2dd810bae92cdaf1fc19995bee4413"
57
57
  }