@gmod/bbi 7.1.0 → 8.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 +8 -0
- package/README.md +59 -0
- package/dist/bbi.d.ts +13 -3
- package/dist/bbi.js +80 -17
- package/dist/bbi.js.map +1 -1
- package/dist/bigbed.d.ts +14 -2
- package/dist/bigbed.js +116 -76
- package/dist/bigbed.js.map +1 -1
- package/dist/bigwig.js +1 -2
- package/dist/bigwig.js.map +1 -1
- package/dist/block-view.d.ts +13 -4
- package/dist/block-view.js +324 -148
- package/dist/block-view.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/parse-bigwig.d.ts +3 -0
- package/dist/parse-bigwig.js +15 -0
- package/dist/parse-bigwig.js.map +1 -0
- package/dist/range.js +11 -24
- package/dist/range.js.map +1 -1
- package/dist/types.d.ts +14 -2
- package/dist/unzip.d.ts +18 -1
- package/dist/unzip.js +33 -4
- package/dist/unzip.js.map +1 -1
- package/dist/util.d.ts +2 -4
- package/dist/util.js +6 -5
- package/dist/util.js.map +1 -1
- package/dist/wasm/inflate-wasm-inlined.d.ts +18 -0
- package/dist/wasm/inflate-wasm-inlined.js +455 -0
- package/dist/wasm/inflate-wasm-inlined.js.map +1 -0
- package/dist/wasm/inflate_wasm.d.ts +1 -0
- package/dist/wasm/inflate_wasm.js +43 -0
- package/dist/wasm/inflate_wasm.js.map +1 -0
- package/dist/wasm/inflate_wasm_bg.d.ts +68 -0
- package/dist/wasm/inflate_wasm_bg.js +307 -0
- package/dist/wasm/inflate_wasm_bg.js.map +1 -0
- package/esm/bbi.d.ts +13 -3
- package/esm/bbi.js +80 -17
- package/esm/bbi.js.map +1 -1
- package/esm/bigbed.d.ts +14 -2
- package/esm/bigbed.js +116 -76
- package/esm/bigbed.js.map +1 -1
- package/esm/bigwig.js +1 -2
- package/esm/bigwig.js.map +1 -1
- package/esm/block-view.d.ts +13 -4
- package/esm/block-view.js +326 -150
- package/esm/block-view.js.map +1 -1
- package/esm/index.d.ts +2 -1
- package/esm/index.js +1 -0
- package/esm/index.js.map +1 -1
- package/esm/parse-bigwig.d.ts +3 -0
- package/esm/parse-bigwig.js +12 -0
- package/esm/parse-bigwig.js.map +1 -0
- package/esm/range.js +11 -24
- package/esm/range.js.map +1 -1
- package/esm/types.d.ts +14 -2
- package/esm/unzip.d.ts +18 -1
- package/esm/unzip.js +30 -3
- package/esm/unzip.js.map +1 -1
- package/esm/util.d.ts +2 -4
- package/esm/util.js +6 -5
- package/esm/util.js.map +1 -1
- package/esm/wasm/inflate-wasm-inlined.d.ts +18 -0
- package/esm/wasm/inflate-wasm-inlined.js +449 -0
- package/esm/wasm/inflate-wasm-inlined.js.map +1 -0
- package/esm/wasm/inflate_wasm.d.ts +1 -0
- package/esm/wasm/inflate_wasm.js +5 -0
- package/esm/wasm/inflate_wasm.js.map +1 -0
- package/esm/wasm/inflate_wasm_bg.d.ts +68 -0
- package/esm/wasm/inflate_wasm_bg.js +296 -0
- package/esm/wasm/inflate_wasm_bg.js.map +1 -0
- package/package.json +17 -12
- package/src/bbi.ts +102 -20
- package/src/bigbed.ts +157 -80
- package/src/bigwig.ts +1 -2
- package/src/block-view.ts +418 -156
- package/src/index.ts +8 -1
- package/src/parse-bigwig.ts +19 -0
- package/src/range.ts +13 -21
- package/src/types.ts +19 -2
- package/src/unzip.ts +86 -3
- package/src/util.ts +9 -10
- package/src/wasm/inflate-wasm-inlined.d.ts +49 -0
- package/src/wasm/inflate-wasm-inlined.js +547 -0
- package/src/wasm/inflate_wasm.d.ts +35 -0
- package/src/wasm/inflate_wasm.js +4 -0
- package/src/wasm/inflate_wasm_bg.js +309 -0
- package/src/wasm/inflate_wasm_bg.wasm +0 -0
- package/src/wasm/inflate_wasm_bg.wasm.d.ts +13 -0
package/src/index.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
import './bigint-polyfill/polyfill.ts'
|
|
2
2
|
export { BigWig } from './bigwig.ts'
|
|
3
3
|
export { BigBed } from './bigbed.ts'
|
|
4
|
-
export
|
|
4
|
+
export { parseBigWig } from './parse-bigwig.ts'
|
|
5
|
+
export type {
|
|
6
|
+
BigWigFeatureArrays,
|
|
7
|
+
BigWigHeader,
|
|
8
|
+
Feature,
|
|
9
|
+
RequestOptions,
|
|
10
|
+
SummaryFeatureArrays,
|
|
11
|
+
} from './types.ts'
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BigWig } from './bigwig.ts'
|
|
2
|
+
import type { Feature, RequestOptions2 } from './types.ts'
|
|
3
|
+
|
|
4
|
+
export async function parseBigWig(
|
|
5
|
+
bigwig: BigWig,
|
|
6
|
+
opts?: RequestOptions2,
|
|
7
|
+
): Promise<Feature[]> {
|
|
8
|
+
const header = await bigwig.getHeader(opts)
|
|
9
|
+
const allFeatures: Feature[] = []
|
|
10
|
+
|
|
11
|
+
for (const ref of Object.values(header.refsByNumber)) {
|
|
12
|
+
const features = await bigwig.getFeatures(ref.name, 0, ref.length, opts)
|
|
13
|
+
for (const feature of features) {
|
|
14
|
+
allFeatures.push(feature)
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
return allFeatures
|
|
19
|
+
}
|
package/src/range.ts
CHANGED
|
@@ -15,7 +15,7 @@ export default class Range {
|
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
get min() {
|
|
18
|
-
return this.ranges[0]
|
|
18
|
+
return this.ranges[0]!.min
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
get max() {
|
|
@@ -36,7 +36,7 @@ export default class Range {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
public getRanges() {
|
|
39
|
-
return this.ranges.map(r => new Range([
|
|
39
|
+
return this.ranges.map(r => new Range([r]))
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
public toString(): string {
|
|
@@ -44,32 +44,24 @@ export default class Range {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
public union(s1: Range) {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
return -1
|
|
50
|
-
} else if (a.min > b.min) {
|
|
51
|
-
return 1
|
|
52
|
-
} else if (a.max < b.max) {
|
|
53
|
-
return -1
|
|
54
|
-
} else if (b.max > a.max) {
|
|
55
|
-
return 1
|
|
56
|
-
} else {
|
|
57
|
-
return 0
|
|
58
|
-
}
|
|
47
|
+
const allRanges = [...this.ranges, ...s1.ranges].sort((a, b) => {
|
|
48
|
+
return a.min !== b.min ? a.min - b.min : a.max - b.max
|
|
59
49
|
})
|
|
60
|
-
const oranges = [] as Range[]
|
|
61
|
-
let current = ranges[0]
|
|
62
50
|
|
|
63
|
-
|
|
51
|
+
const merged: IRange[] = []
|
|
52
|
+
let current = allRanges[0]!
|
|
53
|
+
|
|
54
|
+
for (let i = 1; i < allRanges.length; i++) {
|
|
55
|
+
const nxt = allRanges[i]!
|
|
64
56
|
if (nxt.min > current.max + 1) {
|
|
65
|
-
|
|
57
|
+
merged.push(current)
|
|
66
58
|
current = nxt
|
|
67
59
|
} else if (nxt.max > current.max) {
|
|
68
|
-
current =
|
|
60
|
+
current = { min: current.min, max: nxt.max }
|
|
69
61
|
}
|
|
70
62
|
}
|
|
71
|
-
|
|
63
|
+
merged.push(current)
|
|
72
64
|
|
|
73
|
-
return
|
|
65
|
+
return new Range(merged)
|
|
74
66
|
}
|
|
75
67
|
}
|
package/src/types.ts
CHANGED
|
@@ -7,7 +7,7 @@ export interface ZoomLevel {
|
|
|
7
7
|
|
|
8
8
|
export interface Feature {
|
|
9
9
|
offset?: number
|
|
10
|
-
chromId
|
|
10
|
+
chromId?: number
|
|
11
11
|
start: number
|
|
12
12
|
end: number
|
|
13
13
|
score?: number
|
|
@@ -46,7 +46,10 @@ export interface BigWigHeader {
|
|
|
46
46
|
unzoomedDataOffset: number
|
|
47
47
|
definedFieldCount: number
|
|
48
48
|
uncompressBufSize: number
|
|
49
|
-
|
|
49
|
+
// Offset to the B+ tree that maps chromosome names to integer IDs.
|
|
50
|
+
// This is part of the "cirTree" (combined ID R-tree) - a structure that
|
|
51
|
+
// combines a B+ tree for chromosome names with an R-tree for spatial queries
|
|
52
|
+
chromosomeTreeOffset: number
|
|
50
53
|
extHeaderOffset: number
|
|
51
54
|
fileType: string
|
|
52
55
|
}
|
|
@@ -64,3 +67,17 @@ export interface RequestOptions2 extends RequestOptions {
|
|
|
64
67
|
scale?: number
|
|
65
68
|
basesPerSpan?: number
|
|
66
69
|
}
|
|
70
|
+
|
|
71
|
+
export interface BigWigFeatureArrays {
|
|
72
|
+
starts: Int32Array
|
|
73
|
+
ends: Int32Array
|
|
74
|
+
scores: Float32Array
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface SummaryFeatureArrays {
|
|
78
|
+
starts: Int32Array
|
|
79
|
+
ends: Int32Array
|
|
80
|
+
scores: Float32Array
|
|
81
|
+
minScores: Float32Array
|
|
82
|
+
maxScores: Float32Array
|
|
83
|
+
}
|
package/src/unzip.ts
CHANGED
|
@@ -1,5 +1,88 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
decompressAndParseBigWig,
|
|
3
|
+
decompressAndParseSummary,
|
|
4
|
+
inflateRawBatch,
|
|
5
|
+
} from './wasm/inflate-wasm-inlined.js'
|
|
2
6
|
|
|
3
|
-
|
|
4
|
-
|
|
7
|
+
import type {
|
|
8
|
+
BigWigFeatureArrays,
|
|
9
|
+
SummaryFeatureArrays,
|
|
10
|
+
} from './wasm/inflate-wasm-inlined.js'
|
|
11
|
+
|
|
12
|
+
export interface UnzipBatchResult {
|
|
13
|
+
data: Uint8Array
|
|
14
|
+
offsets: number[]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export async function unzipBatch(
|
|
18
|
+
data: Uint8Array,
|
|
19
|
+
blocks: { offset: number; length: number }[],
|
|
20
|
+
maxOutputSize: number,
|
|
21
|
+
): Promise<UnzipBatchResult> {
|
|
22
|
+
const inputOffsets = new Uint32Array(blocks.length)
|
|
23
|
+
const inputLengths = new Uint32Array(blocks.length)
|
|
24
|
+
|
|
25
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
26
|
+
const block = blocks[i]!
|
|
27
|
+
inputOffsets[i] = block.offset
|
|
28
|
+
inputLengths[i] = block.length
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return inflateRawBatch(data, inputOffsets, inputLengths, maxOutputSize)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export async function decompressAndParseBigWigBlocks(
|
|
35
|
+
data: Uint8Array,
|
|
36
|
+
blocks: { offset: number; length: number }[],
|
|
37
|
+
maxOutputSize: number,
|
|
38
|
+
reqStart: number,
|
|
39
|
+
reqEnd: number,
|
|
40
|
+
): Promise<BigWigFeatureArrays> {
|
|
41
|
+
const inputOffsets = new Uint32Array(blocks.length)
|
|
42
|
+
const inputLengths = new Uint32Array(blocks.length)
|
|
43
|
+
|
|
44
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
45
|
+
const block = blocks[i]!
|
|
46
|
+
inputOffsets[i] = block.offset
|
|
47
|
+
inputLengths[i] = block.length
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return decompressAndParseBigWig(
|
|
51
|
+
data,
|
|
52
|
+
inputOffsets,
|
|
53
|
+
inputLengths,
|
|
54
|
+
maxOutputSize,
|
|
55
|
+
reqStart,
|
|
56
|
+
reqEnd,
|
|
57
|
+
)
|
|
5
58
|
}
|
|
59
|
+
|
|
60
|
+
export async function decompressAndParseSummaryBlocks(
|
|
61
|
+
data: Uint8Array,
|
|
62
|
+
blocks: { offset: number; length: number }[],
|
|
63
|
+
maxOutputSize: number,
|
|
64
|
+
reqChrId: number,
|
|
65
|
+
reqStart: number,
|
|
66
|
+
reqEnd: number,
|
|
67
|
+
): Promise<SummaryFeatureArrays> {
|
|
68
|
+
const inputOffsets = new Uint32Array(blocks.length)
|
|
69
|
+
const inputLengths = new Uint32Array(blocks.length)
|
|
70
|
+
|
|
71
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
72
|
+
const block = blocks[i]!
|
|
73
|
+
inputOffsets[i] = block.offset
|
|
74
|
+
inputLengths[i] = block.length
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return decompressAndParseSummary(
|
|
78
|
+
data,
|
|
79
|
+
inputOffsets,
|
|
80
|
+
inputLengths,
|
|
81
|
+
maxOutputSize,
|
|
82
|
+
reqChrId,
|
|
83
|
+
reqStart,
|
|
84
|
+
reqEnd,
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export type { BigWigFeatureArrays, SummaryFeatureArrays } from './types.ts'
|
package/src/util.ts
CHANGED
|
@@ -21,19 +21,18 @@ export function groupBlocks(blocks: Block[]) {
|
|
|
21
21
|
let lastBlockEnd: number | undefined
|
|
22
22
|
for (const block of blocks) {
|
|
23
23
|
if (lastBlock && lastBlockEnd && block.offset - lastBlockEnd <= 2000) {
|
|
24
|
-
lastBlock.length =
|
|
25
|
-
lastBlock.length + block.length - lastBlockEnd + block.offset
|
|
24
|
+
lastBlock.length = block.offset + block.length - lastBlock.offset
|
|
26
25
|
lastBlock.blocks.push(block)
|
|
26
|
+
lastBlockEnd = block.offset + block.length
|
|
27
27
|
} else {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
lastBlock = {
|
|
29
|
+
blocks: [block],
|
|
30
|
+
length: block.length,
|
|
31
|
+
offset: block.offset,
|
|
32
|
+
}
|
|
33
|
+
blockGroups.push(lastBlock)
|
|
34
|
+
lastBlockEnd = block.offset + block.length
|
|
35
35
|
}
|
|
36
|
-
lastBlockEnd = lastBlock.offset + lastBlock.length
|
|
37
36
|
}
|
|
38
37
|
|
|
39
38
|
return blockGroups
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export function inflateRaw(
|
|
2
|
+
input: Uint8Array,
|
|
3
|
+
outputSize: number,
|
|
4
|
+
): Promise<Uint8Array>
|
|
5
|
+
export function inflateRawUnknownSize(input: Uint8Array): Promise<Uint8Array>
|
|
6
|
+
|
|
7
|
+
export interface BatchResult {
|
|
8
|
+
data: Uint8Array
|
|
9
|
+
offsets: number[]
|
|
10
|
+
}
|
|
11
|
+
export function inflateRawBatch(
|
|
12
|
+
inputs: Uint8Array,
|
|
13
|
+
inputOffsets: Uint32Array,
|
|
14
|
+
inputLengths: Uint32Array,
|
|
15
|
+
maxOutputSize: number,
|
|
16
|
+
): Promise<BatchResult>
|
|
17
|
+
|
|
18
|
+
export interface BigWigFeatureArrays {
|
|
19
|
+
starts: Int32Array
|
|
20
|
+
ends: Int32Array
|
|
21
|
+
scores: Float32Array
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export interface SummaryFeatureArrays {
|
|
25
|
+
starts: Int32Array
|
|
26
|
+
ends: Int32Array
|
|
27
|
+
scores: Float32Array
|
|
28
|
+
minScores: Float32Array
|
|
29
|
+
maxScores: Float32Array
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function decompressAndParseBigWig(
|
|
33
|
+
inputs: Uint8Array,
|
|
34
|
+
inputOffsets: Uint32Array,
|
|
35
|
+
inputLengths: Uint32Array,
|
|
36
|
+
maxBlockSize: number,
|
|
37
|
+
reqStart: number,
|
|
38
|
+
reqEnd: number,
|
|
39
|
+
): Promise<BigWigFeatureArrays>
|
|
40
|
+
|
|
41
|
+
export function decompressAndParseSummary(
|
|
42
|
+
inputs: Uint8Array,
|
|
43
|
+
inputOffsets: Uint32Array,
|
|
44
|
+
inputLengths: Uint32Array,
|
|
45
|
+
maxBlockSize: number,
|
|
46
|
+
reqChrId: number,
|
|
47
|
+
reqStart: number,
|
|
48
|
+
reqEnd: number,
|
|
49
|
+
): Promise<SummaryFeatureArrays>
|