@gmod/bbi 8.1.1 → 9.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 +4 -0
- package/README.md +49 -53
- package/dist/array-feature-view.d.ts +4 -1
- package/dist/array-feature-view.js.map +1 -1
- package/dist/bbi.d.ts +5 -25
- package/dist/bbi.js +31 -133
- package/dist/bbi.js.map +1 -1
- package/dist/bigbed.d.ts +0 -1
- package/dist/bigbed.js +19 -51
- package/dist/bigbed.js.map +1 -1
- package/dist/bigwig.d.ts +1 -2
- package/dist/bigwig.js +1 -2
- package/dist/bigwig.js.map +1 -1
- package/dist/block-view.d.ts +7 -16
- package/dist/block-view.js +370 -440
- package/dist/block-view.js.map +1 -1
- package/dist/parse-bigwig.d.ts +2 -2
- package/dist/parse-bigwig.js +5 -5
- package/dist/parse-bigwig.js.map +1 -1
- package/dist/range.d.ts +1 -15
- package/dist/range.js +16 -49
- package/dist/range.js.map +1 -1
- package/dist/util.d.ts +0 -22
- package/dist/util.js +0 -46
- package/dist/util.js.map +1 -1
- package/dist/wasm/inflate-wasm-inlined.js +85 -86
- package/dist/wasm/inflate-wasm-inlined.js.map +1 -1
- package/dist/wasm/inflate_wasm.d.ts +1 -1
- package/dist/wasm/inflate_wasm.js +10 -4
- package/dist/wasm/inflate_wasm.js.map +1 -1
- package/dist/wasm/inflate_wasm_bg.d.ts +2 -2
- package/dist/wasm/inflate_wasm_bg.js +85 -86
- package/dist/wasm/inflate_wasm_bg.js.map +1 -1
- package/esm/array-feature-view.d.ts +4 -1
- package/esm/array-feature-view.js.map +1 -1
- package/esm/bbi.d.ts +5 -25
- package/esm/bbi.js +31 -133
- package/esm/bbi.js.map +1 -1
- package/esm/bigbed.d.ts +0 -1
- package/esm/bigbed.js +19 -50
- package/esm/bigbed.js.map +1 -1
- package/esm/bigwig.d.ts +1 -2
- package/esm/bigwig.js +1 -2
- package/esm/bigwig.js.map +1 -1
- package/esm/block-view.d.ts +7 -16
- package/esm/block-view.js +370 -440
- package/esm/block-view.js.map +1 -1
- package/esm/parse-bigwig.d.ts +2 -2
- package/esm/parse-bigwig.js +5 -5
- package/esm/parse-bigwig.js.map +1 -1
- package/esm/range.d.ts +1 -15
- package/esm/range.js +15 -48
- package/esm/range.js.map +1 -1
- package/esm/util.d.ts +0 -22
- package/esm/util.js +0 -42
- package/esm/util.js.map +1 -1
- package/esm/wasm/inflate-wasm-inlined.js +85 -86
- package/esm/wasm/inflate-wasm-inlined.js.map +1 -1
- package/esm/wasm/inflate_wasm.d.ts +1 -1
- package/esm/wasm/inflate_wasm.js +2 -1
- package/esm/wasm/inflate_wasm.js.map +1 -1
- package/esm/wasm/inflate_wasm_bg.d.ts +2 -2
- package/esm/wasm/inflate_wasm_bg.js +83 -84
- package/esm/wasm/inflate_wasm_bg.js.map +1 -1
- package/package.json +14 -16
- package/src/array-feature-view.ts +8 -0
- package/src/bbi.ts +50 -153
- package/src/bigbed.ts +22 -55
- package/src/bigwig.ts +1 -3
- package/src/block-view.ts +526 -634
- package/src/parse-bigwig.ts +7 -9
- package/src/range.ts +19 -58
- package/src/util.ts +0 -46
- package/src/wasm/inflate-wasm-inlined.js +101 -102
- package/src/wasm/inflate_wasm.js +7 -2
- package/src/wasm/inflate_wasm_bg.js +99 -100
- package/src/wasm/inflate_wasm_bg.wasm +0 -0
package/src/bigbed.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import AbortablePromiseCache from '@gmod/abortable-promise-cache'
|
|
2
2
|
import QuickLRU from '@jbrowse/quick-lru'
|
|
3
|
-
import { Observable, firstValueFrom, merge } from 'rxjs'
|
|
4
|
-
import { map, reduce } from 'rxjs/operators'
|
|
5
3
|
|
|
6
4
|
import { BBI } from './bbi.ts'
|
|
7
5
|
|
|
8
|
-
import type {
|
|
6
|
+
import type { RequestOptions } from './types.ts'
|
|
9
7
|
import type { GenericFilehandle } from 'generic-filehandle2'
|
|
10
8
|
|
|
11
9
|
const decoder = new TextDecoder('utf8')
|
|
@@ -24,10 +22,6 @@ interface Index {
|
|
|
24
22
|
field: number
|
|
25
23
|
}
|
|
26
24
|
|
|
27
|
-
export function filterUndef<T>(ts: (T | undefined)[]): T[] {
|
|
28
|
-
return ts.filter((t: T | undefined): t is T => !!t)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
25
|
function getTabField(str: string, fieldIndex: number) {
|
|
32
26
|
if (fieldIndex < 0) {
|
|
33
27
|
return undefined
|
|
@@ -67,11 +61,9 @@ async function readBPlusTreeNode(
|
|
|
67
61
|
const len = 4 + blockSize * (keySize + valSize)
|
|
68
62
|
const buffer = await bbi.read(len, nodeOffset, opts)
|
|
69
63
|
const dataView = new DataView(buffer.buffer, buffer.byteOffset, buffer.length)
|
|
70
|
-
|
|
71
|
-
const
|
|
72
|
-
offset
|
|
73
|
-
const cnt = dataView.getInt16(offset, true)
|
|
74
|
-
offset += 2
|
|
64
|
+
const nodeType = dataView.getInt8(0)
|
|
65
|
+
const cnt = dataView.getInt16(2, true)
|
|
66
|
+
let offset = 4
|
|
75
67
|
|
|
76
68
|
// Non-leaf node (nodeType === 0): contains keys and child node pointers for navigation
|
|
77
69
|
if (nodeType === 0) {
|
|
@@ -186,13 +178,8 @@ export class BigBed extends BBI {
|
|
|
186
178
|
const b = await this.bbi.read(64, extHeaderOffset)
|
|
187
179
|
|
|
188
180
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length)
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
offset += 2
|
|
192
|
-
const count = dataView.getUint16(offset, true)
|
|
193
|
-
offset += 2
|
|
194
|
-
const dataOffset = Number(dataView.getBigUint64(offset, true))
|
|
195
|
-
offset += 8
|
|
181
|
+
const count = dataView.getUint16(2, true)
|
|
182
|
+
const dataOffset = Number(dataView.getBigUint64(4, true))
|
|
196
183
|
|
|
197
184
|
// no extra index is defined if count==0
|
|
198
185
|
if (count === 0) {
|
|
@@ -208,14 +195,10 @@ export class BigBed extends BBI {
|
|
|
208
195
|
for (let i = 0; i < count; i += 1) {
|
|
209
196
|
const b = buffer.subarray(i * blocklen)
|
|
210
197
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length)
|
|
211
|
-
|
|
212
|
-
const
|
|
213
|
-
|
|
214
|
-
const
|
|
215
|
-
offset += 2
|
|
216
|
-
const dataOffset = Number(dataView.getBigUint64(offset, true))
|
|
217
|
-
offset += 8 + 4 // skip 8-byte offset + 4 reserved bytes
|
|
218
|
-
const field = dataView.getInt16(offset, true)
|
|
198
|
+
const type = dataView.getInt16(0, true)
|
|
199
|
+
const fieldcount = dataView.getInt16(2, true)
|
|
200
|
+
const dataOffset = Number(dataView.getBigUint64(4, true))
|
|
201
|
+
const field = dataView.getInt16(16, true)
|
|
219
202
|
indices.push({
|
|
220
203
|
type,
|
|
221
204
|
fieldcount,
|
|
@@ -249,17 +232,9 @@ export class BigBed extends BBI {
|
|
|
249
232
|
const b = await this.bbi.read(32, offset2, opts)
|
|
250
233
|
|
|
251
234
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length)
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
const blockSize = dataView.getInt32(offset, true)
|
|
256
|
-
offset += 4
|
|
257
|
-
const keySize = dataView.getInt32(offset, true)
|
|
258
|
-
offset += 4
|
|
259
|
-
const valSize = dataView.getInt32(offset, true)
|
|
260
|
-
offset += 4
|
|
261
|
-
// const _itemCount = Number(dataView.getBigUint64(offset, true))
|
|
262
|
-
offset += 8
|
|
235
|
+
const blockSize = dataView.getInt32(4, true)
|
|
236
|
+
const keySize = dataView.getInt32(8, true)
|
|
237
|
+
const valSize = dataView.getInt32(12, true)
|
|
263
238
|
|
|
264
239
|
return readBPlusTreeNode(
|
|
265
240
|
this.bbi,
|
|
@@ -272,7 +247,8 @@ export class BigBed extends BBI {
|
|
|
272
247
|
opts,
|
|
273
248
|
)
|
|
274
249
|
})
|
|
275
|
-
|
|
250
|
+
const results = await Promise.all(locs)
|
|
251
|
+
return results.filter((l): l is Loc => l !== undefined)
|
|
276
252
|
}
|
|
277
253
|
|
|
278
254
|
/*
|
|
@@ -292,23 +268,14 @@ export class BigBed extends BBI {
|
|
|
292
268
|
return []
|
|
293
269
|
}
|
|
294
270
|
const view = await this.getUnzoomedView(opts)
|
|
295
|
-
const
|
|
296
|
-
|
|
297
|
-
view.readFeatures(
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
reduce((acc, curr) => {
|
|
302
|
-
acc.push(...curr)
|
|
303
|
-
return acc
|
|
304
|
-
}, [] as Feature[]),
|
|
305
|
-
map(features => features.map(f => ({ ...f, field: block.field }))),
|
|
306
|
-
)
|
|
307
|
-
})
|
|
308
|
-
const ret = await firstValueFrom(merge(...res))
|
|
309
|
-
// Filter to features where the indexed field matches the search name
|
|
271
|
+
const results = await Promise.all(
|
|
272
|
+
blocks.map(async block => {
|
|
273
|
+
const features = await view.readFeatures([block], opts)
|
|
274
|
+
return features.map(f => ({ ...f, field: block.field }))
|
|
275
|
+
}),
|
|
276
|
+
)
|
|
310
277
|
// field offset is adjusted by -3 to account for chrom, chromStart, chromEnd columns
|
|
311
|
-
return
|
|
278
|
+
return results.flat().filter(f => {
|
|
312
279
|
if (!f.rest) {
|
|
313
280
|
return false
|
|
314
281
|
}
|
package/src/bigwig.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { BBI } from './bbi.ts'
|
|
2
|
-
import { BlockView } from './block-view.ts'
|
|
3
2
|
|
|
4
3
|
import type { RequestOptions } from './types.ts'
|
|
5
4
|
|
|
@@ -21,8 +20,7 @@ export class BigWig extends BBI {
|
|
|
21
20
|
for (let i = maxLevel; i >= 0; i -= 1) {
|
|
22
21
|
const zh = zoomLevels[i]
|
|
23
22
|
if (zh && zh.reductionLevel <= 2 * basesPerPx) {
|
|
24
|
-
return
|
|
25
|
-
this.bbi,
|
|
23
|
+
return this.getOrCreateBlockView(
|
|
26
24
|
refsByName,
|
|
27
25
|
zh.indexOffset,
|
|
28
26
|
uncompressBufSize,
|