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