@gmod/bbi 6.0.1 → 6.0.3
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/dist/bbi.d.ts +3 -64
- package/dist/bbi.js +13 -2
- package/dist/bbi.js.map +1 -1
- package/dist/bigbed.d.ts +2 -1
- package/dist/bigbed.js +7 -6
- package/dist/bigbed.js.map +1 -1
- package/dist/bigint-polyfill/polyfill.js +3 -0
- package/dist/bigint-polyfill/polyfill.js.map +1 -1
- package/dist/bigint-polyfill/pure.js +3 -0
- package/dist/bigint-polyfill/pure.js.map +1 -1
- package/dist/bigwig.d.ts +2 -1
- package/dist/bigwig.js +1 -1
- package/dist/bigwig.js.map +1 -1
- package/dist/block-view.d.ts +3 -4
- package/dist/block-view.js +4 -11
- package/dist/block-view.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +61 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/esm/bbi.d.ts +3 -64
- package/esm/bbi.js +14 -3
- package/esm/bbi.js.map +1 -1
- package/esm/bigbed.d.ts +2 -1
- package/esm/bigbed.js +7 -6
- package/esm/bigbed.js.map +1 -1
- package/esm/bigint-polyfill/polyfill.js +3 -0
- package/esm/bigint-polyfill/polyfill.js.map +1 -1
- package/esm/bigint-polyfill/pure.js +3 -0
- package/esm/bigint-polyfill/pure.js.map +1 -1
- package/esm/bigwig.d.ts +2 -1
- package/esm/bigwig.js +1 -1
- package/esm/bigwig.js.map +1 -1
- package/esm/block-view.d.ts +3 -4
- package/esm/block-view.js +5 -12
- package/esm/block-view.js.map +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.js +0 -3
- package/esm/index.js.map +1 -1
- package/esm/types.d.ts +61 -0
- package/esm/types.js +2 -0
- package/esm/types.js.map +1 -0
- package/package.json +6 -5
- package/src/bbi.ts +32 -75
- package/src/bigbed.ts +11 -8
- package/src/bigint-polyfill/polyfill.ts +3 -0
- package/src/bigint-polyfill/pure.ts +4 -0
- package/src/bigwig.ts +3 -1
- package/src/block-view.ts +10 -15
- package/src/index.ts +1 -4
- package/src/types.ts +66 -0
package/src/bbi.ts
CHANGED
|
@@ -1,83 +1,28 @@
|
|
|
1
|
-
import { LocalFile, RemoteFile
|
|
2
|
-
import {
|
|
1
|
+
import { LocalFile, RemoteFile } from 'generic-filehandle2'
|
|
2
|
+
import { Observable, firstValueFrom } from 'rxjs'
|
|
3
3
|
import { toArray } from 'rxjs/operators'
|
|
4
|
+
|
|
4
5
|
import { BlockView } from './block-view'
|
|
5
6
|
|
|
7
|
+
import type {
|
|
8
|
+
BigWigHeader,
|
|
9
|
+
BigWigHeaderWithRefNames,
|
|
10
|
+
Feature,
|
|
11
|
+
RefInfo,
|
|
12
|
+
RequestOptions2,
|
|
13
|
+
RequestOptions,
|
|
14
|
+
Statistics,
|
|
15
|
+
ZoomLevel,
|
|
16
|
+
} from './types'
|
|
17
|
+
import type { GenericFilehandle } from 'generic-filehandle2'
|
|
18
|
+
|
|
6
19
|
const BIG_WIG_MAGIC = -2003829722
|
|
7
20
|
const BIG_BED_MAGIC = -2021002517
|
|
8
21
|
|
|
9
|
-
export interface ZoomLevel {
|
|
10
|
-
reductionLevel: number
|
|
11
|
-
reserved: number
|
|
12
|
-
dataOffset: number
|
|
13
|
-
indexOffset: number
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface Feature {
|
|
17
|
-
offset?: number
|
|
18
|
-
chromId: number
|
|
19
|
-
start: number
|
|
20
|
-
end: number
|
|
21
|
-
score?: number
|
|
22
|
-
rest?: string // for bigbed line
|
|
23
|
-
minScore?: number // for summary line
|
|
24
|
-
maxScore?: number // for summary line
|
|
25
|
-
summary?: boolean // is summary line
|
|
26
|
-
uniqueId?: string // for bigbed contains uniqueId calculated from file offset
|
|
27
|
-
field?: number // used in bigbed searching
|
|
28
|
-
}
|
|
29
|
-
export interface Statistics {
|
|
30
|
-
scoreSum: number
|
|
31
|
-
basesCovered: number
|
|
32
|
-
scoreSumSquares: number
|
|
33
|
-
scoreMin: number
|
|
34
|
-
scoreMax: number
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export interface RefInfo {
|
|
38
|
-
name: string
|
|
39
|
-
id: number
|
|
40
|
-
length: number
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface MainHeader {
|
|
44
|
-
magic: number
|
|
45
|
-
version: number
|
|
46
|
-
autoSql: string
|
|
47
|
-
totalSummary: Statistics
|
|
48
|
-
asOffset: number
|
|
49
|
-
zoomLevels: ZoomLevel[]
|
|
50
|
-
fieldCount: number
|
|
51
|
-
numZoomLevels: number
|
|
52
|
-
unzoomedIndexOffset: number
|
|
53
|
-
totalSummaryOffset: number
|
|
54
|
-
unzoomedDataOffset: number
|
|
55
|
-
definedFieldCount: number
|
|
56
|
-
uncompressBufSize: number
|
|
57
|
-
chromTreeOffset: number
|
|
58
|
-
extHeaderOffset: number
|
|
59
|
-
fileType: string
|
|
60
|
-
}
|
|
61
|
-
export interface Header extends MainHeader {
|
|
62
|
-
refsByName: Record<string, number>
|
|
63
|
-
refsByNumber: Record<number, RefInfo>
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export interface RequestOptions {
|
|
67
|
-
signal?: AbortSignal
|
|
68
|
-
headers?: Record<string, string>
|
|
69
|
-
[key: string]: unknown
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
export interface RequestOptions2 extends RequestOptions {
|
|
73
|
-
scale?: number
|
|
74
|
-
basesPerSpan?: number
|
|
75
|
-
}
|
|
76
|
-
|
|
77
22
|
export abstract class BBI {
|
|
78
23
|
protected bbi: GenericFilehandle
|
|
79
24
|
|
|
80
|
-
private headerP?: Promise<
|
|
25
|
+
private headerP?: Promise<BigWigHeaderWithRefNames>
|
|
81
26
|
|
|
82
27
|
protected renameRefSeqs: (a: string) => string
|
|
83
28
|
|
|
@@ -132,7 +77,7 @@ export abstract class BBI {
|
|
|
132
77
|
private async _getMainHeader(
|
|
133
78
|
opts?: RequestOptions,
|
|
134
79
|
requestSize = 2000,
|
|
135
|
-
): Promise<
|
|
80
|
+
): Promise<BigWigHeader> {
|
|
136
81
|
const b = await this.bbi.read(requestSize, 0, opts)
|
|
137
82
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length)
|
|
138
83
|
|
|
@@ -175,7 +120,12 @@ export abstract class BBI {
|
|
|
175
120
|
offset += 8
|
|
176
121
|
const indexOffset = Number(dataView.getBigUint64(offset, true))
|
|
177
122
|
offset += 8
|
|
178
|
-
zoomLevels.push({
|
|
123
|
+
zoomLevels.push({
|
|
124
|
+
reductionLevel,
|
|
125
|
+
reserved,
|
|
126
|
+
dataOffset,
|
|
127
|
+
indexOffset,
|
|
128
|
+
})
|
|
179
129
|
}
|
|
180
130
|
|
|
181
131
|
const fileType = magic === BIG_BED_MAGIC ? 'bigbed' : 'bigwig'
|
|
@@ -237,7 +187,7 @@ export abstract class BBI {
|
|
|
237
187
|
}
|
|
238
188
|
|
|
239
189
|
private async _readChromTree(
|
|
240
|
-
header:
|
|
190
|
+
header: BigWigHeader,
|
|
241
191
|
opts?: { signal?: AbortSignal },
|
|
242
192
|
) {
|
|
243
193
|
const refsByNumber: Record<number, RefInfo> = []
|
|
@@ -253,14 +203,18 @@ export abstract class BBI {
|
|
|
253
203
|
|
|
254
204
|
const dataView = new DataView(b.buffer, b.byteOffset, b.length)
|
|
255
205
|
let offset = 0
|
|
206
|
+
// unused:
|
|
256
207
|
// const magic = dataView.getUint32(offset, true)
|
|
257
208
|
offset += 4
|
|
209
|
+
// unused:
|
|
258
210
|
// const blockSize = dataView.getUint32(offset, true)
|
|
259
211
|
offset += 4
|
|
260
212
|
const keySize = dataView.getUint32(offset, true)
|
|
261
213
|
offset += 4
|
|
214
|
+
// unused:
|
|
262
215
|
// const valSize = dataView.getUint32(offset, true)
|
|
263
216
|
offset += 4
|
|
217
|
+
// unused:
|
|
264
218
|
// const itemCount = dataView.getBigUint64(offset, true)
|
|
265
219
|
offset += 8
|
|
266
220
|
|
|
@@ -273,6 +227,10 @@ export abstract class BBI {
|
|
|
273
227
|
}
|
|
274
228
|
const isLeafNode = dataView.getUint8(offset)
|
|
275
229
|
offset += 2 //skip 1
|
|
230
|
+
|
|
231
|
+
if (offset >= b.length) {
|
|
232
|
+
return
|
|
233
|
+
}
|
|
276
234
|
const cnt = dataView.getUint16(offset, true)
|
|
277
235
|
offset += 2
|
|
278
236
|
if (isLeafNode) {
|
|
@@ -294,7 +252,6 @@ export abstract class BBI {
|
|
|
294
252
|
}
|
|
295
253
|
}
|
|
296
254
|
} else {
|
|
297
|
-
// parse index node
|
|
298
255
|
const nextNodes = []
|
|
299
256
|
for (let n = 0; n < cnt; n++) {
|
|
300
257
|
offset += keySize
|
package/src/bigbed.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { Observable, merge, firstValueFrom } from 'rxjs'
|
|
2
|
-
import { map, reduce } from 'rxjs/operators'
|
|
3
1
|
import AbortablePromiseCache from '@gmod/abortable-promise-cache'
|
|
4
2
|
import QuickLRU from 'quick-lru'
|
|
3
|
+
import { Observable, firstValueFrom, merge } from 'rxjs'
|
|
4
|
+
import { map, reduce } from 'rxjs/operators'
|
|
5
|
+
|
|
6
|
+
import { BBI } from './bbi'
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
import { BBI, Feature, RequestOptions } from './bbi'
|
|
8
|
+
import type { Feature, RequestOptions } from './types'
|
|
8
9
|
|
|
9
10
|
interface Loc {
|
|
10
11
|
key: string
|
|
@@ -109,7 +110,7 @@ export class BigBed extends BBI {
|
|
|
109
110
|
return []
|
|
110
111
|
}
|
|
111
112
|
const decoder = new TextDecoder('utf8')
|
|
112
|
-
const locs = indices.map(async
|
|
113
|
+
const locs = indices.map(async index => {
|
|
113
114
|
const { offset: offset2, field } = index
|
|
114
115
|
const b = await this.bbi.read(32, offset2, opts)
|
|
115
116
|
|
|
@@ -183,15 +184,17 @@ export class BigBed extends BBI {
|
|
|
183
184
|
|
|
184
185
|
for (const n of keys) {
|
|
185
186
|
if (n.key === name) {
|
|
186
|
-
return {
|
|
187
|
+
return {
|
|
188
|
+
...n,
|
|
189
|
+
field,
|
|
190
|
+
}
|
|
187
191
|
}
|
|
188
192
|
}
|
|
189
193
|
|
|
190
194
|
return undefined
|
|
191
195
|
}
|
|
192
196
|
}
|
|
193
|
-
|
|
194
|
-
return bptReadNode(offset2 + rootNodeOffset)
|
|
197
|
+
return bptReadNode(offset2 + 32)
|
|
195
198
|
})
|
|
196
199
|
return filterUndef(await Promise.all(locs))
|
|
197
200
|
}
|
package/src/bigwig.ts
CHANGED
package/src/block-view.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { Observer } from 'rxjs'
|
|
2
1
|
import AbortablePromiseCache from '@gmod/abortable-promise-cache'
|
|
3
|
-
import { GenericFilehandle } from 'generic-filehandle2'
|
|
4
2
|
import QuickLRU from 'quick-lru'
|
|
5
3
|
|
|
6
|
-
// locals
|
|
7
4
|
import Range from './range'
|
|
8
5
|
import { unzip } from './unzip'
|
|
9
|
-
import {
|
|
10
|
-
|
|
6
|
+
import { checkAbortSignal, groupBlocks } from './util'
|
|
7
|
+
|
|
8
|
+
import type { Feature } from './types'
|
|
9
|
+
import type { GenericFilehandle } from 'generic-filehandle2'
|
|
10
|
+
import type { Observer } from 'rxjs'
|
|
11
11
|
|
|
12
12
|
const decoder =
|
|
13
13
|
typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined
|
|
@@ -37,7 +37,6 @@ function coordFilter(s1: number, e1: number, s2: number, e2: number): boolean {
|
|
|
37
37
|
*
|
|
38
38
|
* Adapted by Robert Buels and Colin Diesh from bigwig.js in the Dalliance
|
|
39
39
|
* Genome Explorer by Thomas Down.
|
|
40
|
-
* @constructs
|
|
41
40
|
*/
|
|
42
41
|
|
|
43
42
|
export class BlockView {
|
|
@@ -46,11 +45,8 @@ export class BlockView {
|
|
|
46
45
|
private featureCache = new AbortablePromiseCache<ReadData, Uint8Array>({
|
|
47
46
|
cache: new QuickLRU({ maxSize: 1000 }),
|
|
48
47
|
|
|
49
|
-
fill: async (
|
|
50
|
-
|
|
51
|
-
signal,
|
|
52
|
-
})
|
|
53
|
-
},
|
|
48
|
+
fill: async ({ length, offset }, signal) =>
|
|
49
|
+
this.bbi.read(length, offset, { signal }),
|
|
54
50
|
})
|
|
55
51
|
|
|
56
52
|
public constructor(
|
|
@@ -73,14 +69,13 @@ export class BlockView {
|
|
|
73
69
|
opts?: Options,
|
|
74
70
|
) {
|
|
75
71
|
try {
|
|
76
|
-
const
|
|
77
|
-
const chrId = refsByName[chrName]
|
|
72
|
+
const chrId = this.refsByName[chrName]
|
|
78
73
|
if (chrId === undefined) {
|
|
79
74
|
observer.complete()
|
|
80
75
|
}
|
|
81
76
|
const request = { chrId, start, end }
|
|
82
77
|
if (!this.cirTreePromise) {
|
|
83
|
-
this.cirTreePromise = bbi.read(48, cirTreeOffset, opts)
|
|
78
|
+
this.cirTreePromise = this.bbi.read(48, this.cirTreeOffset, opts)
|
|
84
79
|
}
|
|
85
80
|
const buffer = await this.cirTreePromise
|
|
86
81
|
const dataView = new DataView(buffer.buffer)
|
|
@@ -243,7 +238,7 @@ export class BlockView {
|
|
|
243
238
|
}
|
|
244
239
|
}
|
|
245
240
|
|
|
246
|
-
cirFobRecur([Number(cirTreeOffset) + 48], 1)
|
|
241
|
+
cirFobRecur([Number(this.cirTreeOffset) + 48], 1)
|
|
247
242
|
return
|
|
248
243
|
} catch (e) {
|
|
249
244
|
observer.error(e)
|
package/src/index.ts
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
// from https://github.com/yume-chan/ya-webadb/blob/main/libraries/dataview-bigint-polyfill
|
|
2
|
-
// license:MIT
|
|
3
|
-
// needed for browsers including safari 14
|
|
4
1
|
import './bigint-polyfill/polyfill'
|
|
5
2
|
export { BigWig } from './bigwig'
|
|
6
3
|
export { BigBed } from './bigbed'
|
|
7
|
-
export {
|
|
4
|
+
export type { BigWigHeader, Feature, RequestOptions } from './types'
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export interface ZoomLevel {
|
|
2
|
+
reductionLevel: number
|
|
3
|
+
reserved: number
|
|
4
|
+
dataOffset: number
|
|
5
|
+
indexOffset: number
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface Feature {
|
|
9
|
+
offset?: number
|
|
10
|
+
chromId: number
|
|
11
|
+
start: number
|
|
12
|
+
end: number
|
|
13
|
+
score?: number
|
|
14
|
+
rest?: string // for bigbed line
|
|
15
|
+
minScore?: number // for summary line
|
|
16
|
+
maxScore?: number // for summary line
|
|
17
|
+
summary?: boolean // is summary line
|
|
18
|
+
uniqueId?: string // for bigbed contains uniqueId calculated from file offset
|
|
19
|
+
field?: number // used in bigbed searching
|
|
20
|
+
}
|
|
21
|
+
export interface Statistics {
|
|
22
|
+
scoreSum: number
|
|
23
|
+
basesCovered: number
|
|
24
|
+
scoreSumSquares: number
|
|
25
|
+
scoreMin: number
|
|
26
|
+
scoreMax: number
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface RefInfo {
|
|
30
|
+
name: string
|
|
31
|
+
id: number
|
|
32
|
+
length: number
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface BigWigHeader {
|
|
36
|
+
magic: number
|
|
37
|
+
version: number
|
|
38
|
+
autoSql: string
|
|
39
|
+
totalSummary: Statistics
|
|
40
|
+
asOffset: number
|
|
41
|
+
zoomLevels: ZoomLevel[]
|
|
42
|
+
fieldCount: number
|
|
43
|
+
numZoomLevels: number
|
|
44
|
+
unzoomedIndexOffset: number
|
|
45
|
+
totalSummaryOffset: number
|
|
46
|
+
unzoomedDataOffset: number
|
|
47
|
+
definedFieldCount: number
|
|
48
|
+
uncompressBufSize: number
|
|
49
|
+
chromTreeOffset: number
|
|
50
|
+
extHeaderOffset: number
|
|
51
|
+
fileType: string
|
|
52
|
+
}
|
|
53
|
+
export interface BigWigHeaderWithRefNames extends BigWigHeader {
|
|
54
|
+
refsByName: Record<string, number>
|
|
55
|
+
refsByNumber: Record<number, RefInfo>
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface RequestOptions {
|
|
59
|
+
signal?: AbortSignal
|
|
60
|
+
headers?: Record<string, string>
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface RequestOptions2 extends RequestOptions {
|
|
64
|
+
scale?: number
|
|
65
|
+
basesPerSpan?: number
|
|
66
|
+
}
|