@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.
Files changed (90) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +59 -0
  3. package/dist/bbi.d.ts +13 -3
  4. package/dist/bbi.js +80 -17
  5. package/dist/bbi.js.map +1 -1
  6. package/dist/bigbed.d.ts +14 -2
  7. package/dist/bigbed.js +116 -76
  8. package/dist/bigbed.js.map +1 -1
  9. package/dist/bigwig.js +1 -2
  10. package/dist/bigwig.js.map +1 -1
  11. package/dist/block-view.d.ts +13 -4
  12. package/dist/block-view.js +324 -148
  13. package/dist/block-view.js.map +1 -1
  14. package/dist/index.d.ts +2 -1
  15. package/dist/index.js +3 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/parse-bigwig.d.ts +3 -0
  18. package/dist/parse-bigwig.js +15 -0
  19. package/dist/parse-bigwig.js.map +1 -0
  20. package/dist/range.js +11 -24
  21. package/dist/range.js.map +1 -1
  22. package/dist/types.d.ts +14 -2
  23. package/dist/unzip.d.ts +18 -1
  24. package/dist/unzip.js +33 -4
  25. package/dist/unzip.js.map +1 -1
  26. package/dist/util.d.ts +2 -4
  27. package/dist/util.js +6 -5
  28. package/dist/util.js.map +1 -1
  29. package/dist/wasm/inflate-wasm-inlined.d.ts +18 -0
  30. package/dist/wasm/inflate-wasm-inlined.js +455 -0
  31. package/dist/wasm/inflate-wasm-inlined.js.map +1 -0
  32. package/dist/wasm/inflate_wasm.d.ts +1 -0
  33. package/dist/wasm/inflate_wasm.js +43 -0
  34. package/dist/wasm/inflate_wasm.js.map +1 -0
  35. package/dist/wasm/inflate_wasm_bg.d.ts +68 -0
  36. package/dist/wasm/inflate_wasm_bg.js +307 -0
  37. package/dist/wasm/inflate_wasm_bg.js.map +1 -0
  38. package/esm/bbi.d.ts +13 -3
  39. package/esm/bbi.js +80 -17
  40. package/esm/bbi.js.map +1 -1
  41. package/esm/bigbed.d.ts +14 -2
  42. package/esm/bigbed.js +116 -76
  43. package/esm/bigbed.js.map +1 -1
  44. package/esm/bigwig.js +1 -2
  45. package/esm/bigwig.js.map +1 -1
  46. package/esm/block-view.d.ts +13 -4
  47. package/esm/block-view.js +326 -150
  48. package/esm/block-view.js.map +1 -1
  49. package/esm/index.d.ts +2 -1
  50. package/esm/index.js +1 -0
  51. package/esm/index.js.map +1 -1
  52. package/esm/parse-bigwig.d.ts +3 -0
  53. package/esm/parse-bigwig.js +12 -0
  54. package/esm/parse-bigwig.js.map +1 -0
  55. package/esm/range.js +11 -24
  56. package/esm/range.js.map +1 -1
  57. package/esm/types.d.ts +14 -2
  58. package/esm/unzip.d.ts +18 -1
  59. package/esm/unzip.js +30 -3
  60. package/esm/unzip.js.map +1 -1
  61. package/esm/util.d.ts +2 -4
  62. package/esm/util.js +6 -5
  63. package/esm/util.js.map +1 -1
  64. package/esm/wasm/inflate-wasm-inlined.d.ts +18 -0
  65. package/esm/wasm/inflate-wasm-inlined.js +449 -0
  66. package/esm/wasm/inflate-wasm-inlined.js.map +1 -0
  67. package/esm/wasm/inflate_wasm.d.ts +1 -0
  68. package/esm/wasm/inflate_wasm.js +5 -0
  69. package/esm/wasm/inflate_wasm.js.map +1 -0
  70. package/esm/wasm/inflate_wasm_bg.d.ts +68 -0
  71. package/esm/wasm/inflate_wasm_bg.js +296 -0
  72. package/esm/wasm/inflate_wasm_bg.js.map +1 -0
  73. package/package.json +17 -12
  74. package/src/bbi.ts +102 -20
  75. package/src/bigbed.ts +157 -80
  76. package/src/bigwig.ts +1 -2
  77. package/src/block-view.ts +418 -156
  78. package/src/index.ts +8 -1
  79. package/src/parse-bigwig.ts +19 -0
  80. package/src/range.ts +13 -21
  81. package/src/types.ts +19 -2
  82. package/src/unzip.ts +86 -3
  83. package/src/util.ts +9 -10
  84. package/src/wasm/inflate-wasm-inlined.d.ts +49 -0
  85. package/src/wasm/inflate-wasm-inlined.js +547 -0
  86. package/src/wasm/inflate_wasm.d.ts +35 -0
  87. package/src/wasm/inflate_wasm.js +4 -0
  88. package/src/wasm/inflate_wasm_bg.js +309 -0
  89. package/src/wasm/inflate_wasm_bg.wasm +0 -0
  90. 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 type { BigWigHeader, Feature, RequestOptions } from './types.ts'
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].min
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([{ min: r.min, max: r.max }]))
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 ranges = [...this.getRanges(), ...s1.getRanges()].sort((a, b) => {
48
- if (a.min < b.min) {
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
- for (const nxt of ranges) {
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
- oranges.push(current)
57
+ merged.push(current)
66
58
  current = nxt
67
59
  } else if (nxt.max > current.max) {
68
- current = new Range([{ min: current.min, max: nxt.max }])
60
+ current = { min: current.min, max: nxt.max }
69
61
  }
70
62
  }
71
- oranges.push(current)
63
+ merged.push(current)
72
64
 
73
- return oranges.length === 1 ? oranges[0] : new Range(oranges)
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: number
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
- chromTreeOffset: number
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 { inflateRaw } from 'pako-esm2'
1
+ import {
2
+ decompressAndParseBigWig,
3
+ decompressAndParseSummary,
4
+ inflateRawBatch,
5
+ } from './wasm/inflate-wasm-inlined.js'
2
6
 
3
- export function unzip(input: Uint8Array) {
4
- return inflateRaw(input.subarray(2), undefined)
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
- blockGroups.push(
29
- (lastBlock = {
30
- blocks: [block],
31
- length: block.length,
32
- offset: block.offset,
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>