@gmod/bbi 4.0.6 → 5.0.1
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 +10 -1
- package/dist/bbi.d.ts +20 -4
- package/dist/bbi.js +123 -106
- package/dist/bbi.js.map +1 -1
- package/dist/bigbed.js +88 -69
- package/dist/bigbed.js.map +1 -1
- package/dist/bigint-polyfill/polyfill.js +0 -10
- package/dist/bigint-polyfill/polyfill.js.map +1 -1
- package/dist/bigint-polyfill/pure.d.ts +0 -2
- package/dist/bigint-polyfill/pure.js +0 -26
- package/dist/bigint-polyfill/pure.js.map +1 -1
- package/dist/bigwig.js +3 -8
- package/dist/bigwig.js.map +1 -1
- package/dist/block-view.d.ts +4 -6
- package/dist/block-view.js +122 -131
- package/dist/block-view.js.map +1 -1
- package/dist/range.js +1 -1
- package/dist/range.js.map +1 -1
- package/dist/util.d.ts +12 -14
- package/dist/util.js +8 -14
- package/dist/util.js.map +1 -1
- package/esm/bbi.d.ts +20 -4
- package/esm/bbi.js +123 -106
- package/esm/bbi.js.map +1 -1
- package/esm/bigbed.js +88 -69
- package/esm/bigbed.js.map +1 -1
- package/esm/bigint-polyfill/polyfill.js +1 -11
- package/esm/bigint-polyfill/polyfill.js.map +1 -1
- package/esm/bigint-polyfill/pure.d.ts +0 -2
- package/esm/bigint-polyfill/pure.js +0 -24
- package/esm/bigint-polyfill/pure.js.map +1 -1
- package/esm/bigwig.js +3 -8
- package/esm/bigwig.js.map +1 -1
- package/esm/block-view.d.ts +4 -6
- package/esm/block-view.js +122 -131
- package/esm/block-view.js.map +1 -1
- package/esm/range.js +1 -1
- package/esm/range.js.map +1 -1
- package/esm/util.d.ts +12 -14
- package/esm/util.js +8 -14
- package/esm/util.js.map +1 -1
- package/package.json +4 -5
- package/src/bbi.ts +149 -116
- package/src/bigbed.ts +99 -80
- package/src/bigint-polyfill/polyfill.ts +1 -13
- package/src/bigint-polyfill/pure.ts +0 -36
- package/src/bigwig.ts +3 -9
- package/src/block-view.ts +133 -168
- package/src/range.ts +1 -1
- package/src/util.ts +16 -21
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,18 @@
|
|
|
1
|
-
## [
|
|
1
|
+
## [5.0.1](https://github.com/GMOD/bbi-js/compare/v5.0.0...v5.0.1) (2024-08-09)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
# [5.0.0](https://github.com/GMOD/bbi-js/compare/v4.0.6...v5.0.0) (2024-08-09)
|
|
2
6
|
|
|
3
7
|
|
|
4
8
|
|
|
9
|
+
## [4.0.6](https://github.com/GMOD/bbi-js/compare/v4.0.5...v4.0.6) (2024-07-23)
|
|
10
|
+
|
|
11
|
+
- Use renamed abortable-promise-cache -> @gmod/abortable-promise-cache
|
|
12
|
+
|
|
5
13
|
## [4.0.5](https://github.com/GMOD/bbi-js/compare/v4.0.4...v4.0.5) (2024-06-19)
|
|
6
14
|
|
|
15
|
+
- Improved linting
|
|
7
16
|
|
|
8
17
|
|
|
9
18
|
## [4.0.4](https://github.com/GMOD/bbi-js/compare/v4.0.3...v4.0.4) (2024-3-5)
|
package/dist/bbi.d.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import { GenericFilehandle } from 'generic-filehandle';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { BlockView } from './block-view';
|
|
4
|
+
interface ZoomLevel {
|
|
5
|
+
reductionLevel: number;
|
|
6
|
+
reserved: number;
|
|
7
|
+
dataOffset: number;
|
|
8
|
+
indexOffset: number;
|
|
9
|
+
}
|
|
4
10
|
export interface Feature {
|
|
11
|
+
offset?: number;
|
|
12
|
+
chromId: number;
|
|
5
13
|
start: number;
|
|
6
14
|
end: number;
|
|
7
|
-
score
|
|
15
|
+
score?: number;
|
|
8
16
|
rest?: string;
|
|
9
17
|
minScore?: number;
|
|
10
18
|
maxScore?: number;
|
|
@@ -16,26 +24,34 @@ interface Statistics {
|
|
|
16
24
|
scoreSum: number;
|
|
17
25
|
basesCovered: number;
|
|
18
26
|
scoreSumSquares: number;
|
|
27
|
+
scoreMin: number;
|
|
28
|
+
scoreMax: number;
|
|
19
29
|
}
|
|
20
30
|
interface RefInfo {
|
|
21
31
|
name: string;
|
|
22
32
|
id: number;
|
|
23
33
|
length: number;
|
|
24
34
|
}
|
|
25
|
-
export interface
|
|
35
|
+
export interface MainHeader {
|
|
36
|
+
magic: number;
|
|
26
37
|
version: number;
|
|
27
38
|
autoSql: string;
|
|
28
39
|
totalSummary: Statistics;
|
|
29
|
-
|
|
40
|
+
asOffset: number;
|
|
41
|
+
zoomLevels: ZoomLevel[];
|
|
42
|
+
fieldCount: number;
|
|
43
|
+
numZoomLevels: number;
|
|
30
44
|
unzoomedIndexOffset: number;
|
|
45
|
+
totalSummaryOffset: number;
|
|
31
46
|
unzoomedDataOffset: number;
|
|
32
47
|
definedFieldCount: number;
|
|
33
48
|
uncompressBufSize: number;
|
|
34
49
|
chromTreeOffset: number;
|
|
35
|
-
fileSize: number;
|
|
36
50
|
extHeaderOffset: number;
|
|
37
51
|
isBigEndian: boolean;
|
|
38
52
|
fileType: string;
|
|
53
|
+
}
|
|
54
|
+
export interface Header extends MainHeader {
|
|
39
55
|
refsByName: Record<string, number>;
|
|
40
56
|
refsByNumber: Record<number, RefInfo>;
|
|
41
57
|
}
|
package/dist/bbi.js
CHANGED
|
@@ -11,74 +11,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.BBI = void 0;
|
|
13
13
|
const buffer_1 = require("buffer");
|
|
14
|
-
const binary_parser_1 = require("binary-parser");
|
|
15
14
|
const generic_filehandle_1 = require("generic-filehandle");
|
|
16
15
|
const rxjs_1 = require("rxjs");
|
|
17
16
|
const operators_1 = require("rxjs/operators");
|
|
18
17
|
const block_view_1 = require("./block-view");
|
|
19
18
|
const BIG_WIG_MAGIC = -2003829722;
|
|
20
19
|
const BIG_BED_MAGIC = -2021002517;
|
|
21
|
-
function toString(arr) {
|
|
22
|
-
return new TextDecoder().decode(arr);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* get the compiled parsers for different sections of the bigwig file
|
|
26
|
-
*
|
|
27
|
-
* @param isBE - is big endian, typically false
|
|
28
|
-
* @return an object with compiled parsers
|
|
29
|
-
*/
|
|
30
|
-
function getParsers(isBE) {
|
|
31
|
-
const le = isBE ? 'big' : 'little';
|
|
32
|
-
const headerParser = new binary_parser_1.Parser()
|
|
33
|
-
.endianess(le)
|
|
34
|
-
.int32('magic')
|
|
35
|
-
.uint16('version')
|
|
36
|
-
.uint16('numZoomLevels')
|
|
37
|
-
.uint64('chromTreeOffset')
|
|
38
|
-
.uint64('unzoomedDataOffset')
|
|
39
|
-
.uint64('unzoomedIndexOffset')
|
|
40
|
-
.uint16('fieldCount')
|
|
41
|
-
.uint16('definedFieldCount')
|
|
42
|
-
.uint64('asOffset') // autoSql offset, used in bigbed
|
|
43
|
-
.uint64('totalSummaryOffset')
|
|
44
|
-
.uint32('uncompressBufSize')
|
|
45
|
-
.uint64('extHeaderOffset') // name index offset, used in bigbed
|
|
46
|
-
.array('zoomLevels', {
|
|
47
|
-
length: 'numZoomLevels',
|
|
48
|
-
type: new binary_parser_1.Parser()
|
|
49
|
-
.endianess(le)
|
|
50
|
-
.uint32('reductionLevel')
|
|
51
|
-
.uint32('reserved')
|
|
52
|
-
.uint64('dataOffset')
|
|
53
|
-
.uint64('indexOffset'),
|
|
54
|
-
});
|
|
55
|
-
const totalSummaryParser = new binary_parser_1.Parser()
|
|
56
|
-
.endianess(le)
|
|
57
|
-
.uint64('basesCovered')
|
|
58
|
-
.doublele('scoreMin')
|
|
59
|
-
.doublele('scoreMax')
|
|
60
|
-
.doublele('scoreSum')
|
|
61
|
-
.doublele('scoreSumSquares');
|
|
62
|
-
const chromTreeParser = new binary_parser_1.Parser()
|
|
63
|
-
.endianess(le)
|
|
64
|
-
.uint32('magic')
|
|
65
|
-
.uint32('blockSize')
|
|
66
|
-
.uint32('keySize')
|
|
67
|
-
.uint32('valSize')
|
|
68
|
-
.uint64('itemCount');
|
|
69
|
-
const isLeafNode = new binary_parser_1.Parser()
|
|
70
|
-
.endianess(le)
|
|
71
|
-
.uint8('isLeafNode')
|
|
72
|
-
.skip(1)
|
|
73
|
-
.uint16('cnt')
|
|
74
|
-
.saveOffset('offset');
|
|
75
|
-
return {
|
|
76
|
-
chromTreeParser,
|
|
77
|
-
totalSummaryParser,
|
|
78
|
-
headerParser,
|
|
79
|
-
isLeafNode,
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
20
|
class BBI {
|
|
83
21
|
getHeader(opts) {
|
|
84
22
|
if (!this.headerP) {
|
|
@@ -90,7 +28,8 @@ class BBI {
|
|
|
90
28
|
return this.headerP;
|
|
91
29
|
}
|
|
92
30
|
/*
|
|
93
|
-
* @param filehandle - a filehandle from generic-filehandle or implementing
|
|
31
|
+
* @param filehandle - a filehandle from generic-filehandle or implementing
|
|
32
|
+
* something similar to the node10 fs.promises API
|
|
94
33
|
*
|
|
95
34
|
* @param path - a Local file path as a string
|
|
96
35
|
*
|
|
@@ -124,30 +63,101 @@ class BBI {
|
|
|
124
63
|
}
|
|
125
64
|
_getMainHeader(opts_1) {
|
|
126
65
|
return __awaiter(this, arguments, void 0, function* (opts, requestSize = 2000) {
|
|
66
|
+
const le = true;
|
|
127
67
|
const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(requestSize), 0, requestSize, 0, opts);
|
|
128
68
|
const isBigEndian = this._isBigEndian(buffer);
|
|
129
|
-
const
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
69
|
+
const b = buffer;
|
|
70
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
71
|
+
let offset = 0;
|
|
72
|
+
const magic = dataView.getInt32(offset, le);
|
|
73
|
+
offset += 4;
|
|
74
|
+
const version = dataView.getUint16(offset, le);
|
|
75
|
+
offset += 2;
|
|
76
|
+
const numZoomLevels = dataView.getUint16(offset, le);
|
|
77
|
+
offset += 2;
|
|
78
|
+
const chromTreeOffset = Number(dataView.getBigUint64(offset, le));
|
|
79
|
+
offset += 8;
|
|
80
|
+
const unzoomedDataOffset = Number(dataView.getBigUint64(offset, le));
|
|
81
|
+
offset += 8;
|
|
82
|
+
const unzoomedIndexOffset = Number(dataView.getBigUint64(offset, le));
|
|
83
|
+
offset += 8;
|
|
84
|
+
const fieldCount = dataView.getUint16(offset, le);
|
|
85
|
+
offset += 2;
|
|
86
|
+
const definedFieldCount = dataView.getUint16(offset, le);
|
|
87
|
+
offset += 2;
|
|
88
|
+
const asOffset = Number(dataView.getBigUint64(offset, le));
|
|
89
|
+
offset += 8;
|
|
90
|
+
const totalSummaryOffset = Number(dataView.getBigUint64(offset, le));
|
|
91
|
+
offset += 8;
|
|
92
|
+
const uncompressBufSize = dataView.getUint32(offset, le);
|
|
93
|
+
offset += 4;
|
|
94
|
+
const extHeaderOffset = Number(dataView.getBigUint64(offset, le));
|
|
95
|
+
offset += 8;
|
|
96
|
+
const zoomLevels = [];
|
|
97
|
+
for (let i = 0; i < numZoomLevels; i++) {
|
|
98
|
+
const reductionLevel = dataView.getUint32(offset, le);
|
|
99
|
+
offset += 4;
|
|
100
|
+
const reserved = dataView.getUint32(offset, le);
|
|
101
|
+
offset += 4;
|
|
102
|
+
const dataOffset = Number(dataView.getBigUint64(offset, le));
|
|
103
|
+
offset += 8;
|
|
104
|
+
const indexOffset = Number(dataView.getBigUint64(offset, le));
|
|
105
|
+
offset += 8;
|
|
106
|
+
zoomLevels.push({ reductionLevel, reserved, dataOffset, indexOffset });
|
|
139
107
|
}
|
|
108
|
+
const fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig';
|
|
140
109
|
// refetch header if it is too large on first pass,
|
|
141
110
|
// 8*5 is the sizeof the totalSummary struct
|
|
142
|
-
if (
|
|
111
|
+
if (asOffset > requestSize || totalSummaryOffset > requestSize - 8 * 5) {
|
|
143
112
|
return this._getMainHeader(opts, requestSize * 2);
|
|
144
113
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
const
|
|
148
|
-
|
|
114
|
+
let totalSummary;
|
|
115
|
+
if (totalSummaryOffset) {
|
|
116
|
+
const b = buffer.subarray(Number(totalSummaryOffset));
|
|
117
|
+
let offset = 0;
|
|
118
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
119
|
+
const basesCovered = Number(dataView.getBigUint64(offset, le));
|
|
120
|
+
offset += 8;
|
|
121
|
+
const scoreMin = dataView.getFloat64(offset, le);
|
|
122
|
+
offset += 8;
|
|
123
|
+
const scoreMax = dataView.getFloat64(offset, le);
|
|
124
|
+
offset += 8;
|
|
125
|
+
const scoreSum = dataView.getFloat64(offset, le);
|
|
126
|
+
offset += 8;
|
|
127
|
+
const scoreSumSquares = dataView.getFloat64(offset, le);
|
|
128
|
+
offset += 8;
|
|
129
|
+
totalSummary = {
|
|
130
|
+
scoreMin,
|
|
131
|
+
scoreMax,
|
|
132
|
+
scoreSum,
|
|
133
|
+
scoreSumSquares,
|
|
134
|
+
basesCovered,
|
|
135
|
+
};
|
|
149
136
|
}
|
|
150
|
-
|
|
137
|
+
else {
|
|
138
|
+
throw new Error('no stats');
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
zoomLevels,
|
|
142
|
+
magic,
|
|
143
|
+
extHeaderOffset,
|
|
144
|
+
numZoomLevels,
|
|
145
|
+
fieldCount,
|
|
146
|
+
totalSummary,
|
|
147
|
+
definedFieldCount,
|
|
148
|
+
uncompressBufSize,
|
|
149
|
+
asOffset,
|
|
150
|
+
chromTreeOffset,
|
|
151
|
+
totalSummaryOffset,
|
|
152
|
+
unzoomedDataOffset,
|
|
153
|
+
unzoomedIndexOffset,
|
|
154
|
+
fileType,
|
|
155
|
+
version,
|
|
156
|
+
isBigEndian,
|
|
157
|
+
autoSql: asOffset
|
|
158
|
+
? buffer.subarray(asOffset, buffer.indexOf(0, asOffset)).toString()
|
|
159
|
+
: '',
|
|
160
|
+
};
|
|
151
161
|
});
|
|
152
162
|
}
|
|
153
163
|
_isBigEndian(buffer) {
|
|
@@ -165,43 +175,50 @@ class BBI {
|
|
|
165
175
|
_readChromTree(header, opts) {
|
|
166
176
|
return __awaiter(this, void 0, void 0, function* () {
|
|
167
177
|
const isBE = header.isBigEndian;
|
|
168
|
-
const le = isBE
|
|
178
|
+
const le = !isBE;
|
|
169
179
|
const refsByNumber = [];
|
|
170
180
|
const refsByName = {};
|
|
171
|
-
let unzoomedDataOffset =
|
|
172
|
-
const chromTreeOffset =
|
|
181
|
+
let unzoomedDataOffset = header.unzoomedDataOffset;
|
|
182
|
+
const chromTreeOffset = header.chromTreeOffset;
|
|
173
183
|
while (unzoomedDataOffset % 4 !== 0) {
|
|
174
184
|
unzoomedDataOffset += 1;
|
|
175
185
|
}
|
|
176
186
|
const off = unzoomedDataOffset - chromTreeOffset;
|
|
177
187
|
const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(off), 0, off, Number(chromTreeOffset), opts);
|
|
178
|
-
const
|
|
179
|
-
const
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
188
|
+
const b = buffer;
|
|
189
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
190
|
+
let offset = 0;
|
|
191
|
+
// const magic = dataView.getUint32(offset, le)
|
|
192
|
+
offset += 4;
|
|
193
|
+
// const blockSize = dataView.getUint32(offset, le)
|
|
194
|
+
offset += 4;
|
|
195
|
+
const keySize = dataView.getUint32(offset, le);
|
|
196
|
+
offset += 4;
|
|
197
|
+
// const valSize = dataView.getUint32(offset, le)
|
|
198
|
+
offset += 4;
|
|
199
|
+
// const itemCount = dataView.getBigUint64(offset, le)
|
|
200
|
+
offset += 8;
|
|
191
201
|
const rootNodeOffset = 32;
|
|
192
202
|
const bptReadNode = (currentOffset) => __awaiter(this, void 0, void 0, function* () {
|
|
193
203
|
let offset = currentOffset;
|
|
194
204
|
if (offset >= buffer.length) {
|
|
195
205
|
throw new Error('reading beyond end of buffer');
|
|
196
206
|
}
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
207
|
+
const isLeafNode = dataView.getUint8(offset);
|
|
208
|
+
offset += 2; //skip 1
|
|
209
|
+
const cnt = dataView.getUint16(offset, le);
|
|
210
|
+
offset += 2;
|
|
200
211
|
if (isLeafNode) {
|
|
201
|
-
for (let n = 0; n < cnt; n
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
212
|
+
for (let n = 0; n < cnt; n++) {
|
|
213
|
+
const key = buffer
|
|
214
|
+
.subarray(offset, offset + keySize)
|
|
215
|
+
.toString()
|
|
216
|
+
.replaceAll('\0', '');
|
|
217
|
+
offset += keySize;
|
|
218
|
+
const refId = dataView.getUint32(offset, le);
|
|
219
|
+
offset += 4;
|
|
220
|
+
const refSize = dataView.getUint32(offset, le);
|
|
221
|
+
offset += 4;
|
|
205
222
|
const refRec = { name: key, id: refId, length: refSize };
|
|
206
223
|
refsByName[this.renameRefSeqs(key)] = refId;
|
|
207
224
|
refsByNumber[refId] = refRec;
|
|
@@ -210,10 +227,10 @@ class BBI {
|
|
|
210
227
|
else {
|
|
211
228
|
// parse index node
|
|
212
229
|
const nextNodes = [];
|
|
213
|
-
for (let n = 0; n < cnt; n
|
|
214
|
-
|
|
215
|
-
const
|
|
216
|
-
offset +=
|
|
230
|
+
for (let n = 0; n < cnt; n++) {
|
|
231
|
+
offset += keySize;
|
|
232
|
+
const childOffset = Number(dataView.getBigUint64(offset, le));
|
|
233
|
+
offset += 8;
|
|
217
234
|
nextNodes.push(bptReadNode(Number(childOffset) - Number(chromTreeOffset)));
|
|
218
235
|
}
|
|
219
236
|
yield Promise.all(nextNodes);
|
package/dist/bbi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAA+B;AAC/B,
|
|
1
|
+
{"version":3,"file":"bbi.js","sourceRoot":"","sources":["../src/bbi.ts"],"names":[],"mappings":"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"}
|
package/dist/bigbed.js
CHANGED
|
@@ -26,11 +26,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
26
26
|
exports.BigBed = void 0;
|
|
27
27
|
exports.filterUndef = filterUndef;
|
|
28
28
|
const buffer_1 = require("buffer");
|
|
29
|
-
const binary_parser_1 = require("binary-parser");
|
|
30
29
|
const rxjs_1 = require("rxjs");
|
|
31
30
|
const operators_1 = require("rxjs/operators");
|
|
32
31
|
const abortable_promise_cache_1 = __importDefault(require("@gmod/abortable-promise-cache"));
|
|
33
32
|
const quick_lru_1 = __importDefault(require("quick-lru"));
|
|
33
|
+
// locals
|
|
34
34
|
const bbi_1 = require("./bbi");
|
|
35
35
|
function filterUndef(ts) {
|
|
36
36
|
return ts.filter((t) => !!t);
|
|
@@ -57,45 +57,52 @@ class BigBed extends bbi_1.BBI {
|
|
|
57
57
|
}
|
|
58
58
|
/*
|
|
59
59
|
* parse the bigbed extraIndex fields
|
|
60
|
-
*
|
|
61
|
-
*
|
|
60
|
+
*
|
|
61
|
+
*
|
|
62
|
+
* @return a Promise for an array of Index data structure since there can be
|
|
63
|
+
* multiple extraIndexes in a bigbed, see bedToBigBed documentation
|
|
62
64
|
*/
|
|
63
65
|
_readIndices(opts) {
|
|
64
66
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
67
|
const { extHeaderOffset, isBigEndian } = yield this.getHeader(opts);
|
|
66
68
|
const { buffer: data } = yield this.bbi.read(buffer_1.Buffer.alloc(64), 0, 64, Number(extHeaderOffset));
|
|
67
|
-
const le = isBigEndian
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
const le = !isBigEndian;
|
|
70
|
+
const b = data;
|
|
71
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
72
|
+
let offset = 0;
|
|
73
|
+
// const _size = dataView.getUint16(offset, le)
|
|
74
|
+
offset += 2;
|
|
75
|
+
const count = dataView.getUint16(offset, le);
|
|
76
|
+
offset += 2;
|
|
77
|
+
const dataOffset = Number(dataView.getBigUint64(offset, le));
|
|
78
|
+
offset += 8;
|
|
75
79
|
// no extra index is defined if count==0
|
|
76
80
|
if (count === 0) {
|
|
77
81
|
return [];
|
|
78
82
|
}
|
|
79
83
|
const blocklen = 20;
|
|
80
84
|
const len = blocklen * count;
|
|
81
|
-
const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(len), 0, len, Number(
|
|
82
|
-
const extParser = new binary_parser_1.Parser()
|
|
83
|
-
.endianess(le)
|
|
84
|
-
.int16('type')
|
|
85
|
-
.int16('fieldcount')
|
|
86
|
-
.uint64('offset')
|
|
87
|
-
.skip(4)
|
|
88
|
-
.int16('field');
|
|
85
|
+
const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(len), 0, len, Number(dataOffset));
|
|
89
86
|
const indices = [];
|
|
90
87
|
for (let i = 0; i < count; i += 1) {
|
|
91
|
-
|
|
88
|
+
const b = buffer.subarray(i * blocklen);
|
|
89
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
90
|
+
let offset = 0;
|
|
91
|
+
const type = dataView.getInt16(offset, le);
|
|
92
|
+
offset += 2;
|
|
93
|
+
const fieldcount = dataView.getInt16(offset, le);
|
|
94
|
+
offset += 2;
|
|
95
|
+
const dataOffset = Number(dataView.getBigUint64(offset, le));
|
|
96
|
+
offset += 8 + 4; //4 skip
|
|
97
|
+
const field = dataView.getInt16(offset, le);
|
|
98
|
+
indices.push({ type, fieldcount, offset: Number(dataOffset), field });
|
|
92
99
|
}
|
|
93
100
|
return indices;
|
|
94
101
|
});
|
|
95
102
|
}
|
|
96
103
|
/*
|
|
97
|
-
* perform a search in the bigbed extraIndex to find which blocks in the
|
|
98
|
-
* actual feature data
|
|
104
|
+
* perform a search in the bigbed extraIndex to find which blocks in the
|
|
105
|
+
* bigbed data to look for the actual feature data
|
|
99
106
|
*
|
|
100
107
|
* @param name - the name to search for
|
|
101
108
|
* @param opts - a SearchOptions argument with optional signal
|
|
@@ -109,52 +116,48 @@ class BigBed extends bbi_1.BBI {
|
|
|
109
116
|
return [];
|
|
110
117
|
}
|
|
111
118
|
const locs = indices.map((index) => __awaiter(this, void 0, void 0, function* () {
|
|
112
|
-
const { offset, field } = index;
|
|
113
|
-
const { buffer: data } = yield this.bbi.read(buffer_1.Buffer.alloc(32), 0, 32,
|
|
114
|
-
const le = isBigEndian
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
const
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
.int16('cnt')
|
|
129
|
-
.choice({
|
|
130
|
-
tag: 'nodeType',
|
|
131
|
-
choices: {
|
|
132
|
-
0: new binary_parser_1.Parser().array('leafkeys', {
|
|
133
|
-
length: 'cnt',
|
|
134
|
-
type: new binary_parser_1.Parser()
|
|
135
|
-
.endianess(le)
|
|
136
|
-
.string('key', { length: keySize, stripNull: true })
|
|
137
|
-
.uint64('offset'),
|
|
138
|
-
}),
|
|
139
|
-
1: new binary_parser_1.Parser().array('keys', {
|
|
140
|
-
length: 'cnt',
|
|
141
|
-
type: new binary_parser_1.Parser()
|
|
142
|
-
.endianess(le)
|
|
143
|
-
.string('key', { length: keySize, stripNull: true })
|
|
144
|
-
.uint64('offset')
|
|
145
|
-
.uint32('length')
|
|
146
|
-
.uint32('reserved'),
|
|
147
|
-
}),
|
|
148
|
-
},
|
|
149
|
-
});
|
|
119
|
+
const { offset: offset2, field } = index;
|
|
120
|
+
const { buffer: data } = yield this.bbi.read(buffer_1.Buffer.alloc(32), 0, 32, offset2, opts);
|
|
121
|
+
const le = !isBigEndian;
|
|
122
|
+
const b = data;
|
|
123
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
124
|
+
let offset = 0;
|
|
125
|
+
// const _magic = dataView.getInt32(offset, le)
|
|
126
|
+
offset += 4;
|
|
127
|
+
const blockSize = dataView.getInt32(offset, le);
|
|
128
|
+
offset += 4;
|
|
129
|
+
const keySize = dataView.getInt32(offset, le);
|
|
130
|
+
offset += 4;
|
|
131
|
+
const valSize = dataView.getInt32(offset, le);
|
|
132
|
+
offset += 4;
|
|
133
|
+
// const _itemCount = Number(dataView.getBigUint64(offset, le))
|
|
134
|
+
offset += 8;
|
|
150
135
|
const bptReadNode = (nodeOffset) => __awaiter(this, void 0, void 0, function* () {
|
|
151
136
|
const val = Number(nodeOffset);
|
|
152
137
|
const len = 4 + blockSize * (keySize + valSize);
|
|
153
138
|
const { buffer } = yield this.bbi.read(buffer_1.Buffer.alloc(len), 0, len, val, opts);
|
|
154
|
-
const
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
139
|
+
const b = buffer;
|
|
140
|
+
const dataView = new DataView(b.buffer, b.byteOffset, b.length);
|
|
141
|
+
let offset = 0;
|
|
142
|
+
const nodeType = dataView.getInt8(offset);
|
|
143
|
+
offset += 2; //skip 1
|
|
144
|
+
const cnt = dataView.getInt16(offset, le);
|
|
145
|
+
offset += 2;
|
|
146
|
+
const keys = [];
|
|
147
|
+
if (nodeType === 0) {
|
|
148
|
+
const leafkeys = [];
|
|
149
|
+
for (let i = 0; i < cnt; i++) {
|
|
150
|
+
const key = b
|
|
151
|
+
.subarray(offset, offset + keySize)
|
|
152
|
+
.toString()
|
|
153
|
+
.replaceAll('\0', '');
|
|
154
|
+
offset += keySize;
|
|
155
|
+
const dataOffset = Number(dataView.getBigUint64(offset, le));
|
|
156
|
+
offset += 8;
|
|
157
|
+
leafkeys.push({ key, offset: dataOffset });
|
|
158
|
+
}
|
|
159
|
+
let lastOffset = 0;
|
|
160
|
+
for (const { key, offset } of leafkeys) {
|
|
158
161
|
if (name.localeCompare(key) < 0 && lastOffset) {
|
|
159
162
|
return bptReadNode(lastOffset);
|
|
160
163
|
}
|
|
@@ -162,15 +165,31 @@ class BigBed extends bbi_1.BBI {
|
|
|
162
165
|
}
|
|
163
166
|
return bptReadNode(lastOffset);
|
|
164
167
|
}
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
+
else if (nodeType === 1) {
|
|
169
|
+
for (let i = 0; i < cnt; i++) {
|
|
170
|
+
const key = b
|
|
171
|
+
.subarray(offset, offset + keySize)
|
|
172
|
+
.toString()
|
|
173
|
+
.replaceAll('\0', '');
|
|
174
|
+
offset += keySize;
|
|
175
|
+
const dataOffset = Number(dataView.getBigUint64(offset, le));
|
|
176
|
+
offset += 8;
|
|
177
|
+
const length = dataView.getUint32(offset, le);
|
|
178
|
+
offset += 4;
|
|
179
|
+
const reserved = dataView.getUint32(offset, le);
|
|
180
|
+
offset += 4;
|
|
181
|
+
keys.push({ key, offset: dataOffset, length, reserved });
|
|
182
|
+
}
|
|
183
|
+
for (const n of keys) {
|
|
184
|
+
if (n.key === name) {
|
|
185
|
+
return Object.assign(Object.assign({}, n), { field });
|
|
186
|
+
}
|
|
168
187
|
}
|
|
188
|
+
return undefined;
|
|
169
189
|
}
|
|
170
|
-
return undefined;
|
|
171
190
|
});
|
|
172
191
|
const rootNodeOffset = 32;
|
|
173
|
-
return bptReadNode(
|
|
192
|
+
return bptReadNode(offset2 + rootNodeOffset);
|
|
174
193
|
}));
|
|
175
194
|
return filterUndef(yield Promise.all(locs));
|
|
176
195
|
});
|