Skip to content

Commit 80dab8b

Browse files
committed
Set default visibility window for bigbed tracks usin informatin in the header and chrom tree
1 parent 8a7bd46 commit 80dab8b

File tree

4 files changed

+28
-36
lines changed

4 files changed

+28
-36
lines changed

js/bigwig/bwReader.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ class BWReader {
338338
const startOffset = BBFILE_HEADER_SIZE
339339
let range = {
340340
start: startOffset,
341-
size: (header.fullDataOffset - startOffset + 5)
341+
size: (header.fullDataOffset - startOffset + 4)
342342
}
343343
data = await this.loader.loadArrayBuffer(this.path, buildOptions(this.config, {range: range}))
344344

@@ -381,8 +381,10 @@ class BWReader {
381381
}
382382

383383
//Finally total data count
384-
// binaryParser.position = header.fullDataOffset - startOffset
385-
// header.dataCount = binaryParser.getInt()
384+
binaryParser.position = header.fullDataOffset - startOffset
385+
header.dataCount = binaryParser.getInt()
386+
387+
this.featureDensity = header.dataCount / this.chromTree.sumLengths
386388

387389
this.header = header
388390

js/bigwig/bwSource.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class BWSource {
6565
}
6666

6767
async defaultVisibilityWindow() {
68-
return this.reader.defaultVisibilityWindow
68+
return Math.floor(10000 / this.reader.featureDensity)
6969
}
7070

7171
async getWGValues(windowFunction) {

js/bigwig/chromTree.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@
1111
*/
1212
export default class ChromTree {
1313

14-
constructor(header, nameToID, valueToKey) {
14+
constructor(header, nameToID, valueToKey, sumLengths) {
1515
this.header = header
1616
this.nameToId = nameToID
1717
this.idToName = valueToKey
18+
this.sumLengths = sumLengths
1819
}
1920

2021
static parseTree(binaryParser, startOffset, genome = false) {
@@ -29,6 +30,7 @@ export default class ChromTree {
2930
const header = {magic, blockSize, keySize, valSize, itemCount, reserved}
3031
const nameToId = new Map()
3132
const idToName = []
33+
let sumLengths = 0
3234
const readTreeNode = (offset) => {
3335

3436
if (offset >= 0) binaryParser.position = offset
@@ -44,6 +46,7 @@ export default class ChromTree {
4446
if (valSize === 8) {
4547
value = binaryParser.getInt()
4648
const chromSize = binaryParser.getInt()
49+
sumLengths += chromSize
4750
if (genome) key = genome.getChromosomeName(key) // Translate to canonical chr name
4851
nameToId.set(key, value)
4952
idToName[value] = key
@@ -69,7 +72,7 @@ export default class ChromTree {
6972
// Recursively walk tree to populate dictionary
7073
readTreeNode(binaryParser, -1)
7174

72-
return new ChromTree(header, nameToId, idToName)
75+
return new ChromTree(header, nameToId, idToName, sumLengths)
7376
}
7477
}
7578

js/bigwig/rpTree.js

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,12 @@ export default class RPTree {
2121
async init() {
2222
const binaryParser = await this.#getParserFor(this.startOffset, RPTREE_HEADER_SIZE)
2323
let magic = binaryParser.getInt()
24-
console.log(magic)
25-
if(magic !== RPTree.magic) {
24+
if (magic !== RPTree.magic) {
2625
binaryParser.setPosition(0)
2726
this.littleEndian = !this.littleEndian
2827
binaryParser.littleEndian = this.littleEndian
2928
magic = binaryParser.getInt()
30-
if(magic !== RPTree.magic) {
29+
if (magic !== RPTree.magic) {
3130
throw Error(`Bad magic number ${magic}`)
3231
}
3332
}
@@ -74,7 +73,7 @@ export default class RPTree {
7473
if (node.type === 1) { // Leaf node
7574
leafItems.push(item)
7675
} else { // Non leaf node
77-
await walkTreeNode(item.childOffset)
76+
await walkTreeNode(item.childOffset)
7877
}
7978
}
8079
}
@@ -89,7 +88,7 @@ export default class RPTree {
8988

9089
const nodeKey = offset
9190
if (this.nodeCache.has(nodeKey)) {
92-
return this.nodeCache
91+
return this.nodeCache.get(nodeKey)
9392
}
9493

9594
let binaryParser = await this.#getParserFor(offset, 4)
@@ -101,34 +100,22 @@ export default class RPTree {
101100
binaryParser = await this.#getParserFor(offset + 4, bytesRequired)
102101

103102
const items = []
104-
105-
if (isLeaf) {
106-
for (let i = 0; i < count; i++) {
107-
let item = {
108-
isLeaf: true,
109-
startChrom: binaryParser.getInt(),
110-
startBase: binaryParser.getInt(),
111-
endChrom: binaryParser.getInt(),
112-
endBase: binaryParser.getInt(),
113-
dataOffset: binaryParser.getLong(),
114-
dataSize: binaryParser.getLong()
115-
}
116-
items.push(item)
103+
for (let i = 0; i < count; i++) {
104+
let item = {
105+
isLeaf: isLeaf,
106+
startChrom: binaryParser.getInt(),
107+
startBase: binaryParser.getInt(),
108+
endChrom: binaryParser.getInt(),
109+
endBase: binaryParser.getInt(),
110+
childOffset: binaryParser.getLong()
117111
}
118-
} else { // non-leaf
119-
for (let i = 0; i < count; i++) {
120-
121-
let item = {
122-
isLeaf: false,
123-
startChrom: binaryParser.getInt(),
124-
startBase: binaryParser.getInt(),
125-
endChrom: binaryParser.getInt(),
126-
endBase: binaryParser.getInt(),
127-
childOffset: binaryParser.getLong()
128-
}
129-
items[i] = item
112+
if (isLeaf) {
113+
item.dataSize = binaryParser.getLong()
114+
item.dataOffset = item.childOffset
130115
}
116+
items.push(item)
131117
}
118+
132119
const node = {type, items}
133120
this.nodeCache.set(nodeKey, node)
134121
return node

0 commit comments

Comments
 (0)