@gmod/bbi 5.0.1 → 6.0.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/CHANGELOG.md +8 -0
- package/README.md +5 -5
- package/dist/bbi.d.ts +15 -16
- package/dist/bbi.js +195 -220
- package/dist/bbi.js.map +1 -1
- package/dist/bigbed.js +138 -159
- package/dist/bigbed.js.map +1 -1
- package/dist/bigwig.js +11 -21
- package/dist/bigwig.js.map +1 -1
- package/dist/block-view.d.ts +2 -3
- package/dist/block-view.js +190 -205
- package/dist/block-view.js.map +1 -1
- package/dist/unzip-pako.d.ts +1 -2
- package/dist/unzip-pako.js.map +1 -1
- package/dist/util.js +3 -14
- package/dist/util.js.map +1 -1
- package/esm/bbi.d.ts +15 -16
- package/esm/bbi.js +66 -70
- package/esm/bbi.js.map +1 -1
- package/esm/bigbed.js +47 -40
- package/esm/bigbed.js.map +1 -1
- package/esm/bigwig.js +3 -2
- package/esm/bigwig.js.map +1 -1
- package/esm/block-view.d.ts +2 -3
- package/esm/block-view.js +36 -41
- package/esm/block-view.js.map +1 -1
- package/esm/unzip-pako.d.ts +1 -2
- package/esm/unzip-pako.js.map +1 -1
- package/package.json +14 -18
- package/src/bbi.ts +78 -99
- package/src/bigbed.ts +47 -62
- package/src/bigwig.ts +2 -2
- package/src/block-view.ts +46 -57
- package/src/unzip-pako.ts +1 -2
package/esm/bbi.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { GenericFilehandle } from 'generic-
|
|
1
|
+
import { GenericFilehandle } from 'generic-filehandle2';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { BlockView } from './block-view';
|
|
4
|
-
interface ZoomLevel {
|
|
4
|
+
export interface ZoomLevel {
|
|
5
5
|
reductionLevel: number;
|
|
6
6
|
reserved: number;
|
|
7
7
|
dataOffset: number;
|
|
@@ -20,14 +20,14 @@ export interface Feature {
|
|
|
20
20
|
uniqueId?: string;
|
|
21
21
|
field?: number;
|
|
22
22
|
}
|
|
23
|
-
interface Statistics {
|
|
23
|
+
export interface Statistics {
|
|
24
24
|
scoreSum: number;
|
|
25
25
|
basesCovered: number;
|
|
26
26
|
scoreSumSquares: number;
|
|
27
27
|
scoreMin: number;
|
|
28
28
|
scoreMax: number;
|
|
29
29
|
}
|
|
30
|
-
interface RefInfo {
|
|
30
|
+
export interface RefInfo {
|
|
31
31
|
name: string;
|
|
32
32
|
id: number;
|
|
33
33
|
length: number;
|
|
@@ -48,7 +48,6 @@ export interface MainHeader {
|
|
|
48
48
|
uncompressBufSize: number;
|
|
49
49
|
chromTreeOffset: number;
|
|
50
50
|
extHeaderOffset: number;
|
|
51
|
-
isBigEndian: boolean;
|
|
52
51
|
fileType: string;
|
|
53
52
|
}
|
|
54
53
|
export interface Header extends MainHeader {
|
|
@@ -60,6 +59,10 @@ export interface RequestOptions {
|
|
|
60
59
|
headers?: Record<string, string>;
|
|
61
60
|
[key: string]: unknown;
|
|
62
61
|
}
|
|
62
|
+
export interface RequestOptions2 extends RequestOptions {
|
|
63
|
+
scale?: number;
|
|
64
|
+
basesPerSpan?: number;
|
|
65
|
+
}
|
|
63
66
|
export declare abstract class BBI {
|
|
64
67
|
protected bbi: GenericFilehandle;
|
|
65
68
|
private headerP?;
|
|
@@ -73,7 +76,6 @@ export declare abstract class BBI {
|
|
|
73
76
|
});
|
|
74
77
|
private _getHeader;
|
|
75
78
|
private _getMainHeader;
|
|
76
|
-
private _isBigEndian;
|
|
77
79
|
private _readChromTree;
|
|
78
80
|
protected getUnzoomedView(opts?: RequestOptions): Promise<BlockView>;
|
|
79
81
|
protected abstract getView(scale: number, opts?: RequestOptions): Promise<BlockView>;
|
|
@@ -81,17 +83,14 @@ export declare abstract class BBI {
|
|
|
81
83
|
* Gets features from a BigWig file
|
|
82
84
|
*
|
|
83
85
|
* @param refName - The chromosome name
|
|
86
|
+
*
|
|
84
87
|
* @param start - The start of a region
|
|
88
|
+
*
|
|
85
89
|
* @param end - The end of a region
|
|
86
|
-
*
|
|
90
|
+
*
|
|
91
|
+
* @param opts - An object containing basesPerSpan (e.g. pixels per basepair)
|
|
92
|
+
* or scale used to infer the zoomLevel to use
|
|
87
93
|
*/
|
|
88
|
-
getFeatureStream(refName: string, start: number, end: number, opts?:
|
|
89
|
-
|
|
90
|
-
basesPerSpan?: number;
|
|
91
|
-
}): Promise<Observable<Feature[]>>;
|
|
92
|
-
getFeatures(refName: string, start: number, end: number, opts?: RequestOptions & {
|
|
93
|
-
scale?: number;
|
|
94
|
-
basesPerSpan?: number;
|
|
95
|
-
}): Promise<Feature[]>;
|
|
94
|
+
getFeatureStream(refName: string, start: number, end: number, opts?: RequestOptions2): Promise<Observable<Feature[]>>;
|
|
95
|
+
getFeatures(refName: string, start: number, end: number, opts?: RequestOptions2): Promise<Feature[]>;
|
|
96
96
|
}
|
|
97
|
-
export {};
|
package/esm/bbi.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { LocalFile, RemoteFile } from 'generic-filehandle';
|
|
1
|
+
import { LocalFile, RemoteFile } from 'generic-filehandle2';
|
|
3
2
|
import { firstValueFrom, Observable } from 'rxjs';
|
|
4
3
|
import { toArray } from 'rxjs/operators';
|
|
5
4
|
import { BlockView } from './block-view';
|
|
@@ -8,7 +7,7 @@ const BIG_BED_MAGIC = -2021002517;
|
|
|
8
7
|
export class BBI {
|
|
9
8
|
getHeader(opts) {
|
|
10
9
|
if (!this.headerP) {
|
|
11
|
-
this.headerP = this._getHeader(opts).catch(e => {
|
|
10
|
+
this.headerP = this._getHeader(opts).catch((e) => {
|
|
12
11
|
this.headerP = undefined;
|
|
13
12
|
throw e;
|
|
14
13
|
});
|
|
@@ -16,8 +15,7 @@ export class BBI {
|
|
|
16
15
|
return this.headerP;
|
|
17
16
|
}
|
|
18
17
|
/*
|
|
19
|
-
* @param filehandle - a filehandle from generic-
|
|
20
|
-
* something similar to the node10 fs.promises API
|
|
18
|
+
* @param filehandle - a filehandle from generic-filehandle2
|
|
21
19
|
*
|
|
22
20
|
* @param path - a Local file path as a string
|
|
23
21
|
*
|
|
@@ -45,48 +43,52 @@ export class BBI {
|
|
|
45
43
|
async _getHeader(opts) {
|
|
46
44
|
const header = await this._getMainHeader(opts);
|
|
47
45
|
const chroms = await this._readChromTree(header, opts);
|
|
48
|
-
return {
|
|
46
|
+
return {
|
|
47
|
+
...header,
|
|
48
|
+
...chroms,
|
|
49
|
+
};
|
|
49
50
|
}
|
|
50
51
|
async _getMainHeader(opts, requestSize = 2000) {
|
|
51
|
-
const
|
|
52
|
-
const { buffer } = await this.bbi.read(Buffer.alloc(requestSize), 0, requestSize, 0, opts);
|
|
53
|
-
const isBigEndian = this._isBigEndian(buffer);
|
|
54
|
-
const b = buffer;
|
|
52
|
+
const b = await this.bbi.read(requestSize, 0, opts);
|
|
55
53
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
54
|
+
const r1 = dataView.getInt32(0, true);
|
|
55
|
+
if (r1 !== BIG_WIG_MAGIC && r1 !== BIG_BED_MAGIC) {
|
|
56
|
+
throw new Error('not a BigWig/BigBed file');
|
|
57
|
+
}
|
|
56
58
|
let offset = 0;
|
|
57
|
-
const magic = dataView.getInt32(offset,
|
|
59
|
+
const magic = dataView.getInt32(offset, true);
|
|
58
60
|
offset += 4;
|
|
59
|
-
const version = dataView.getUint16(offset,
|
|
61
|
+
const version = dataView.getUint16(offset, true);
|
|
60
62
|
offset += 2;
|
|
61
|
-
const numZoomLevels = dataView.getUint16(offset,
|
|
63
|
+
const numZoomLevels = dataView.getUint16(offset, true);
|
|
62
64
|
offset += 2;
|
|
63
|
-
const chromTreeOffset = Number(dataView.getBigUint64(offset,
|
|
65
|
+
const chromTreeOffset = Number(dataView.getBigUint64(offset, true));
|
|
64
66
|
offset += 8;
|
|
65
|
-
const unzoomedDataOffset = Number(dataView.getBigUint64(offset,
|
|
67
|
+
const unzoomedDataOffset = Number(dataView.getBigUint64(offset, true));
|
|
66
68
|
offset += 8;
|
|
67
|
-
const unzoomedIndexOffset = Number(dataView.getBigUint64(offset,
|
|
69
|
+
const unzoomedIndexOffset = Number(dataView.getBigUint64(offset, true));
|
|
68
70
|
offset += 8;
|
|
69
|
-
const fieldCount = dataView.getUint16(offset,
|
|
71
|
+
const fieldCount = dataView.getUint16(offset, true);
|
|
70
72
|
offset += 2;
|
|
71
|
-
const definedFieldCount = dataView.getUint16(offset,
|
|
73
|
+
const definedFieldCount = dataView.getUint16(offset, true);
|
|
72
74
|
offset += 2;
|
|
73
|
-
const asOffset = Number(dataView.getBigUint64(offset,
|
|
75
|
+
const asOffset = Number(dataView.getBigUint64(offset, true));
|
|
74
76
|
offset += 8;
|
|
75
|
-
const totalSummaryOffset = Number(dataView.getBigUint64(offset,
|
|
77
|
+
const totalSummaryOffset = Number(dataView.getBigUint64(offset, true));
|
|
76
78
|
offset += 8;
|
|
77
|
-
const uncompressBufSize = dataView.getUint32(offset,
|
|
79
|
+
const uncompressBufSize = dataView.getUint32(offset, true);
|
|
78
80
|
offset += 4;
|
|
79
|
-
const extHeaderOffset = Number(dataView.getBigUint64(offset,
|
|
81
|
+
const extHeaderOffset = Number(dataView.getBigUint64(offset, true));
|
|
80
82
|
offset += 8;
|
|
81
83
|
const zoomLevels = [];
|
|
82
84
|
for (let i = 0; i < numZoomLevels; i++) {
|
|
83
|
-
const reductionLevel = dataView.getUint32(offset,
|
|
85
|
+
const reductionLevel = dataView.getUint32(offset, true);
|
|
84
86
|
offset += 4;
|
|
85
|
-
const reserved = dataView.getUint32(offset,
|
|
87
|
+
const reserved = dataView.getUint32(offset, true);
|
|
86
88
|
offset += 4;
|
|
87
|
-
const dataOffset = Number(dataView.getBigUint64(offset,
|
|
89
|
+
const dataOffset = Number(dataView.getBigUint64(offset, true));
|
|
88
90
|
offset += 8;
|
|
89
|
-
const indexOffset = Number(dataView.getBigUint64(offset,
|
|
91
|
+
const indexOffset = Number(dataView.getBigUint64(offset, true));
|
|
90
92
|
offset += 8;
|
|
91
93
|
zoomLevels.push({ reductionLevel, reserved, dataOffset, indexOffset });
|
|
92
94
|
}
|
|
@@ -98,18 +100,18 @@ export class BBI {
|
|
|
98
100
|
}
|
|
99
101
|
let totalSummary;
|
|
100
102
|
if (totalSummaryOffset) {
|
|
101
|
-
const
|
|
103
|
+
const b2 = b.subarray(Number(totalSummaryOffset));
|
|
102
104
|
let offset = 0;
|
|
103
|
-
const dataView = new DataView(
|
|
104
|
-
const basesCovered = Number(dataView.getBigUint64(offset,
|
|
105
|
+
const dataView = new DataView(b2.buffer, b2.byteOffset, b2.length);
|
|
106
|
+
const basesCovered = Number(dataView.getBigUint64(offset, true));
|
|
105
107
|
offset += 8;
|
|
106
|
-
const scoreMin = dataView.getFloat64(offset,
|
|
108
|
+
const scoreMin = dataView.getFloat64(offset, true);
|
|
107
109
|
offset += 8;
|
|
108
|
-
const scoreMax = dataView.getFloat64(offset,
|
|
110
|
+
const scoreMax = dataView.getFloat64(offset, true);
|
|
109
111
|
offset += 8;
|
|
110
|
-
const scoreSum = dataView.getFloat64(offset,
|
|
112
|
+
const scoreSum = dataView.getFloat64(offset, true);
|
|
111
113
|
offset += 8;
|
|
112
|
-
const scoreSumSquares = dataView.getFloat64(offset,
|
|
114
|
+
const scoreSumSquares = dataView.getFloat64(offset, true);
|
|
113
115
|
offset += 8;
|
|
114
116
|
totalSummary = {
|
|
115
117
|
scoreMin,
|
|
@@ -122,6 +124,7 @@ export class BBI {
|
|
|
122
124
|
else {
|
|
123
125
|
throw new Error('no stats');
|
|
124
126
|
}
|
|
127
|
+
const decoder = new TextDecoder('utf8');
|
|
125
128
|
return {
|
|
126
129
|
zoomLevels,
|
|
127
130
|
magic,
|
|
@@ -138,27 +141,12 @@ export class BBI {
|
|
|
138
141
|
unzoomedIndexOffset,
|
|
139
142
|
fileType,
|
|
140
143
|
version,
|
|
141
|
-
isBigEndian,
|
|
142
144
|
autoSql: asOffset
|
|
143
|
-
?
|
|
145
|
+
? decoder.decode(b.subarray(asOffset, b.indexOf(0, asOffset)))
|
|
144
146
|
: '',
|
|
145
147
|
};
|
|
146
148
|
}
|
|
147
|
-
_isBigEndian(buffer) {
|
|
148
|
-
let ret = buffer.readInt32LE(0);
|
|
149
|
-
if (ret === BIG_WIG_MAGIC || ret === BIG_BED_MAGIC) {
|
|
150
|
-
return false;
|
|
151
|
-
}
|
|
152
|
-
ret = buffer.readInt32BE(0);
|
|
153
|
-
if (ret === BIG_WIG_MAGIC || ret === BIG_BED_MAGIC) {
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
throw new Error('not a BigWig/BigBed file');
|
|
157
|
-
}
|
|
158
|
-
// todo: add progress if long running
|
|
159
149
|
async _readChromTree(header, opts) {
|
|
160
|
-
const isBE = header.isBigEndian;
|
|
161
|
-
const le = !isBE;
|
|
162
150
|
const refsByNumber = [];
|
|
163
151
|
const refsByName = {};
|
|
164
152
|
let unzoomedDataOffset = header.unzoomedDataOffset;
|
|
@@ -167,44 +155,46 @@ export class BBI {
|
|
|
167
155
|
unzoomedDataOffset += 1;
|
|
168
156
|
}
|
|
169
157
|
const off = unzoomedDataOffset - chromTreeOffset;
|
|
170
|
-
const
|
|
171
|
-
const b = buffer;
|
|
158
|
+
const b = await this.bbi.read(off, Number(chromTreeOffset), opts);
|
|
172
159
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
173
160
|
let offset = 0;
|
|
174
|
-
// const magic = dataView.getUint32(offset,
|
|
161
|
+
// const magic = dataView.getUint32(offset, true)
|
|
175
162
|
offset += 4;
|
|
176
|
-
// const blockSize = dataView.getUint32(offset,
|
|
163
|
+
// const blockSize = dataView.getUint32(offset, true)
|
|
177
164
|
offset += 4;
|
|
178
|
-
const keySize = dataView.getUint32(offset,
|
|
165
|
+
const keySize = dataView.getUint32(offset, true);
|
|
179
166
|
offset += 4;
|
|
180
|
-
// const valSize = dataView.getUint32(offset,
|
|
167
|
+
// const valSize = dataView.getUint32(offset, true)
|
|
181
168
|
offset += 4;
|
|
182
|
-
// const itemCount = dataView.getBigUint64(offset,
|
|
169
|
+
// const itemCount = dataView.getBigUint64(offset, true)
|
|
183
170
|
offset += 8;
|
|
184
171
|
const rootNodeOffset = 32;
|
|
172
|
+
const decoder = new TextDecoder('utf8');
|
|
185
173
|
const bptReadNode = async (currentOffset) => {
|
|
186
174
|
let offset = currentOffset;
|
|
187
|
-
if (offset >=
|
|
175
|
+
if (offset >= b.length) {
|
|
188
176
|
throw new Error('reading beyond end of buffer');
|
|
189
177
|
}
|
|
190
178
|
const isLeafNode = dataView.getUint8(offset);
|
|
191
179
|
offset += 2; //skip 1
|
|
192
|
-
const cnt = dataView.getUint16(offset,
|
|
180
|
+
const cnt = dataView.getUint16(offset, true);
|
|
193
181
|
offset += 2;
|
|
194
182
|
if (isLeafNode) {
|
|
195
183
|
for (let n = 0; n < cnt; n++) {
|
|
196
|
-
const key =
|
|
197
|
-
.subarray(offset, offset + keySize)
|
|
198
|
-
.toString()
|
|
184
|
+
const key = decoder
|
|
185
|
+
.decode(b.subarray(offset, offset + keySize))
|
|
199
186
|
.replaceAll('\0', '');
|
|
200
187
|
offset += keySize;
|
|
201
|
-
const refId = dataView.getUint32(offset,
|
|
188
|
+
const refId = dataView.getUint32(offset, true);
|
|
202
189
|
offset += 4;
|
|
203
|
-
const refSize = dataView.getUint32(offset,
|
|
190
|
+
const refSize = dataView.getUint32(offset, true);
|
|
204
191
|
offset += 4;
|
|
205
|
-
const refRec = { name: key, id: refId, length: refSize };
|
|
206
192
|
refsByName[this.renameRefSeqs(key)] = refId;
|
|
207
|
-
refsByNumber[refId] =
|
|
193
|
+
refsByNumber[refId] = {
|
|
194
|
+
name: key,
|
|
195
|
+
id: refId,
|
|
196
|
+
length: refSize,
|
|
197
|
+
};
|
|
208
198
|
}
|
|
209
199
|
}
|
|
210
200
|
else {
|
|
@@ -212,7 +202,7 @@ export class BBI {
|
|
|
212
202
|
const nextNodes = [];
|
|
213
203
|
for (let n = 0; n < cnt; n++) {
|
|
214
204
|
offset += keySize;
|
|
215
|
-
const childOffset = Number(dataView.getBigUint64(offset,
|
|
205
|
+
const childOffset = Number(dataView.getBigUint64(offset, true));
|
|
216
206
|
offset += 8;
|
|
217
207
|
nextNodes.push(bptReadNode(Number(childOffset) - Number(chromTreeOffset)));
|
|
218
208
|
}
|
|
@@ -230,16 +220,20 @@ export class BBI {
|
|
|
230
220
|
* @param abortSignal - a signal to optionally abort this operation
|
|
231
221
|
*/
|
|
232
222
|
async getUnzoomedView(opts) {
|
|
233
|
-
const { unzoomedIndexOffset, refsByName, uncompressBufSize,
|
|
234
|
-
return new BlockView(this.bbi, refsByName, unzoomedIndexOffset,
|
|
223
|
+
const { unzoomedIndexOffset, refsByName, uncompressBufSize, fileType } = await this.getHeader(opts);
|
|
224
|
+
return new BlockView(this.bbi, refsByName, unzoomedIndexOffset, uncompressBufSize > 0, fileType);
|
|
235
225
|
}
|
|
236
226
|
/**
|
|
237
227
|
* Gets features from a BigWig file
|
|
238
228
|
*
|
|
239
229
|
* @param refName - The chromosome name
|
|
230
|
+
*
|
|
240
231
|
* @param start - The start of a region
|
|
232
|
+
*
|
|
241
233
|
* @param end - The end of a region
|
|
242
|
-
*
|
|
234
|
+
*
|
|
235
|
+
* @param opts - An object containing basesPerSpan (e.g. pixels per basepair)
|
|
236
|
+
* or scale used to infer the zoomLevel to use
|
|
243
237
|
*/
|
|
244
238
|
async getFeatureStream(refName, start, end, opts) {
|
|
245
239
|
await this.getHeader(opts);
|
|
@@ -258,7 +252,9 @@ export class BBI {
|
|
|
258
252
|
return new Observable(observer => {
|
|
259
253
|
view
|
|
260
254
|
.readWigData(chrName, start, end, observer, opts)
|
|
261
|
-
.catch(e =>
|
|
255
|
+
.catch((e) => {
|
|
256
|
+
observer.error(e);
|
|
257
|
+
});
|
|
262
258
|
});
|
|
263
259
|
}
|
|
264
260
|
async getFeatures(refName, start, end, opts) {
|
package/esm/bbi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":"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"}
|
package/esm/bigbed.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Buffer } from 'buffer';
|
|
2
1
|
import { Observable, merge, firstValueFrom } from 'rxjs';
|
|
3
2
|
import { map, reduce } from 'rxjs/operators';
|
|
4
3
|
import AbortablePromiseCache from '@gmod/abortable-promise-cache';
|
|
@@ -34,17 +33,15 @@ export class BigBed extends BBI {
|
|
|
34
33
|
* multiple extraIndexes in a bigbed, see bedToBigBed documentation
|
|
35
34
|
*/
|
|
36
35
|
async _readIndices(opts) {
|
|
37
|
-
const { extHeaderOffset
|
|
38
|
-
const
|
|
39
|
-
const le = !isBigEndian;
|
|
40
|
-
const b = data;
|
|
36
|
+
const { extHeaderOffset } = await this.getHeader(opts);
|
|
37
|
+
const b = await this.bbi.read(64, Number(extHeaderOffset));
|
|
41
38
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
42
39
|
let offset = 0;
|
|
43
|
-
// const _size = dataView.getUint16(offset,
|
|
40
|
+
// const _size = dataView.getUint16(offset, true)
|
|
44
41
|
offset += 2;
|
|
45
|
-
const count = dataView.getUint16(offset,
|
|
42
|
+
const count = dataView.getUint16(offset, true);
|
|
46
43
|
offset += 2;
|
|
47
|
-
const dataOffset = Number(dataView.getBigUint64(offset,
|
|
44
|
+
const dataOffset = Number(dataView.getBigUint64(offset, true));
|
|
48
45
|
offset += 8;
|
|
49
46
|
// no extra index is defined if count==0
|
|
50
47
|
if (count === 0) {
|
|
@@ -52,19 +49,19 @@ export class BigBed extends BBI {
|
|
|
52
49
|
}
|
|
53
50
|
const blocklen = 20;
|
|
54
51
|
const len = blocklen * count;
|
|
55
|
-
const
|
|
52
|
+
const buffer = await this.bbi.read(len, Number(dataOffset));
|
|
56
53
|
const indices = [];
|
|
57
54
|
for (let i = 0; i < count; i += 1) {
|
|
58
55
|
const b = buffer.subarray(i * blocklen);
|
|
59
56
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
60
57
|
let offset = 0;
|
|
61
|
-
const type = dataView.getInt16(offset,
|
|
58
|
+
const type = dataView.getInt16(offset, true);
|
|
62
59
|
offset += 2;
|
|
63
|
-
const fieldcount = dataView.getInt16(offset,
|
|
60
|
+
const fieldcount = dataView.getInt16(offset, true);
|
|
64
61
|
offset += 2;
|
|
65
|
-
const dataOffset = Number(dataView.getBigUint64(offset,
|
|
62
|
+
const dataOffset = Number(dataView.getBigUint64(offset, true));
|
|
66
63
|
offset += 8 + 4; //4 skip
|
|
67
|
-
const field = dataView.getInt16(offset,
|
|
64
|
+
const field = dataView.getInt16(offset, true);
|
|
68
65
|
indices.push({ type, fieldcount, offset: Number(dataOffset), field });
|
|
69
66
|
}
|
|
70
67
|
return indices;
|
|
@@ -74,55 +71,57 @@ export class BigBed extends BBI {
|
|
|
74
71
|
* bigbed data to look for the actual feature data
|
|
75
72
|
*
|
|
76
73
|
* @param name - the name to search for
|
|
74
|
+
*
|
|
77
75
|
* @param opts - a SearchOptions argument with optional signal
|
|
76
|
+
*
|
|
78
77
|
* @return a Promise for an array of bigbed block Loc entries
|
|
79
78
|
*/
|
|
80
79
|
async searchExtraIndexBlocks(name, opts = {}) {
|
|
81
|
-
const { isBigEndian } = await this.getHeader(opts);
|
|
82
80
|
const indices = await this.readIndices(opts);
|
|
83
81
|
if (indices.length === 0) {
|
|
84
82
|
return [];
|
|
85
83
|
}
|
|
84
|
+
const decoder = new TextDecoder('utf8');
|
|
86
85
|
const locs = indices.map(async (index) => {
|
|
87
86
|
const { offset: offset2, field } = index;
|
|
88
|
-
const
|
|
89
|
-
const le = !isBigEndian;
|
|
90
|
-
const b = data;
|
|
87
|
+
const b = await this.bbi.read(32, offset2, opts);
|
|
91
88
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
92
89
|
let offset = 0;
|
|
93
|
-
// const _magic = dataView.getInt32(offset,
|
|
90
|
+
// const _magic = dataView.getInt32(offset, true)
|
|
94
91
|
offset += 4;
|
|
95
|
-
const blockSize = dataView.getInt32(offset,
|
|
92
|
+
const blockSize = dataView.getInt32(offset, true);
|
|
96
93
|
offset += 4;
|
|
97
|
-
const keySize = dataView.getInt32(offset,
|
|
94
|
+
const keySize = dataView.getInt32(offset, true);
|
|
98
95
|
offset += 4;
|
|
99
|
-
const valSize = dataView.getInt32(offset,
|
|
96
|
+
const valSize = dataView.getInt32(offset, true);
|
|
100
97
|
offset += 4;
|
|
101
|
-
// const _itemCount = Number(dataView.getBigUint64(offset,
|
|
98
|
+
// const _itemCount = Number(dataView.getBigUint64(offset, true))
|
|
102
99
|
offset += 8;
|
|
103
100
|
const bptReadNode = async (nodeOffset) => {
|
|
104
101
|
const val = Number(nodeOffset);
|
|
105
102
|
const len = 4 + blockSize * (keySize + valSize);
|
|
106
|
-
const
|
|
103
|
+
const buffer = await this.bbi.read(len, val, opts);
|
|
107
104
|
const b = buffer;
|
|
108
105
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
109
106
|
let offset = 0;
|
|
110
107
|
const nodeType = dataView.getInt8(offset);
|
|
111
108
|
offset += 2; //skip 1
|
|
112
|
-
const cnt = dataView.getInt16(offset,
|
|
109
|
+
const cnt = dataView.getInt16(offset, true);
|
|
113
110
|
offset += 2;
|
|
114
111
|
const keys = [];
|
|
115
112
|
if (nodeType === 0) {
|
|
116
113
|
const leafkeys = [];
|
|
117
114
|
for (let i = 0; i < cnt; i++) {
|
|
118
|
-
const key =
|
|
119
|
-
.subarray(offset, offset + keySize)
|
|
120
|
-
.toString()
|
|
115
|
+
const key = decoder
|
|
116
|
+
.decode(b.subarray(offset, offset + keySize))
|
|
121
117
|
.replaceAll('\0', '');
|
|
122
118
|
offset += keySize;
|
|
123
|
-
const dataOffset = Number(dataView.getBigUint64(offset,
|
|
119
|
+
const dataOffset = Number(dataView.getBigUint64(offset, true));
|
|
124
120
|
offset += 8;
|
|
125
|
-
leafkeys.push({
|
|
121
|
+
leafkeys.push({
|
|
122
|
+
key,
|
|
123
|
+
offset: dataOffset,
|
|
124
|
+
});
|
|
126
125
|
}
|
|
127
126
|
let lastOffset = 0;
|
|
128
127
|
for (const { key, offset } of leafkeys) {
|
|
@@ -135,18 +134,22 @@ export class BigBed extends BBI {
|
|
|
135
134
|
}
|
|
136
135
|
else if (nodeType === 1) {
|
|
137
136
|
for (let i = 0; i < cnt; i++) {
|
|
138
|
-
const key =
|
|
139
|
-
.subarray(offset, offset + keySize)
|
|
140
|
-
.toString()
|
|
137
|
+
const key = decoder
|
|
138
|
+
.decode(b.subarray(offset, offset + keySize))
|
|
141
139
|
.replaceAll('\0', '');
|
|
142
140
|
offset += keySize;
|
|
143
|
-
const dataOffset = Number(dataView.getBigUint64(offset,
|
|
141
|
+
const dataOffset = Number(dataView.getBigUint64(offset, true));
|
|
144
142
|
offset += 8;
|
|
145
|
-
const length = dataView.getUint32(offset,
|
|
143
|
+
const length = dataView.getUint32(offset, true);
|
|
146
144
|
offset += 4;
|
|
147
|
-
const reserved = dataView.getUint32(offset,
|
|
145
|
+
const reserved = dataView.getUint32(offset, true);
|
|
148
146
|
offset += 4;
|
|
149
|
-
keys.push({
|
|
147
|
+
keys.push({
|
|
148
|
+
key,
|
|
149
|
+
offset: dataOffset,
|
|
150
|
+
length,
|
|
151
|
+
reserved,
|
|
152
|
+
});
|
|
150
153
|
}
|
|
151
154
|
for (const n of keys) {
|
|
152
155
|
if (n.key === name) {
|
|
@@ -167,8 +170,10 @@ export class BigBed extends BBI {
|
|
|
167
170
|
* the BigBed specification and the -extraIndex argument to bedToBigBed
|
|
168
171
|
*
|
|
169
172
|
* @param name - the name to search for
|
|
170
|
-
*
|
|
171
|
-
* @
|
|
173
|
+
*
|
|
174
|
+
* @param opts - options object with optional AboutSignal
|
|
175
|
+
*
|
|
176
|
+
* @return array of Feature
|
|
172
177
|
*/
|
|
173
178
|
async searchExtraIndex(name, opts = {}) {
|
|
174
179
|
const blocks = await this.searchExtraIndexBlocks(name, opts);
|
|
@@ -178,7 +183,9 @@ export class BigBed extends BBI {
|
|
|
178
183
|
const view = await this.getUnzoomedView(opts);
|
|
179
184
|
const res = blocks.map(block => {
|
|
180
185
|
return new Observable(observer => {
|
|
181
|
-
view.readFeatures(observer, [block], opts).catch(e =>
|
|
186
|
+
view.readFeatures(observer, [block], opts).catch((e) => {
|
|
187
|
+
observer.error(e);
|
|
188
|
+
});
|
|
182
189
|
}).pipe(reduce((acc, curr) => acc.concat(curr)), map(x => {
|
|
183
190
|
for (const element of x) {
|
|
184
191
|
element.field = block.field;
|
|
@@ -187,7 +194,7 @@ export class BigBed extends BBI {
|
|
|
187
194
|
}));
|
|
188
195
|
});
|
|
189
196
|
const ret = await firstValueFrom(merge(...res));
|
|
190
|
-
return ret.filter(f =>
|
|
197
|
+
return ret.filter(f => f.rest?.split('\t')[(f.field || 0) - 3] === name);
|
|
191
198
|
}
|
|
192
199
|
}
|
|
193
200
|
//# sourceMappingURL=bigbed.js.map
|
package/esm/bigbed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bigbed.js","sourceRoot":"","sources":["../src/bigbed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"bigbed.js","sourceRoot":"","sources":["../src/bigbed.ts"],"names":[],"mappings":"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"}
|
package/esm/bigwig.js
CHANGED
|
@@ -10,13 +10,14 @@ export class BigWig extends BBI {
|
|
|
10
10
|
* or scale used to infer the zoomLevel to use
|
|
11
11
|
*/
|
|
12
12
|
async getView(scale, opts) {
|
|
13
|
-
const { zoomLevels, refsByName,
|
|
13
|
+
const { zoomLevels, refsByName, uncompressBufSize } = await this.getHeader(opts);
|
|
14
14
|
const basesPerPx = 1 / scale;
|
|
15
15
|
const maxLevel = zoomLevels.length - 1;
|
|
16
16
|
for (let i = maxLevel; i >= 0; i -= 1) {
|
|
17
17
|
const zh = zoomLevels[i];
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
18
19
|
if (zh && zh.reductionLevel <= 2 * basesPerPx) {
|
|
19
|
-
return new BlockView(this.bbi, refsByName, zh.indexOffset,
|
|
20
|
+
return new BlockView(this.bbi, refsByName, zh.indexOffset, uncompressBufSize > 0, 'summary');
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
return this.getUnzoomedView(opts);
|