@gmod/jbrowse
Version:
JBrowse - client-side genome browser
108 lines (94 loc) • 3.76 kB
JavaScript
define( [
'dojo/_base/declare',
'dojo/_base/lang',
'dojo/_base/array',
'JBrowse/Store/LRUCache',
'./RequestWorker'
],
function( declare, lang, array, LRUCache, RequestWorker ) {
var dlog = function(){ console.log.apply(console, arguments); };
return declare( null,
/**
* @lends JBrowse.Store.BigWig.Window.prototype
*/
{
/**
* View into a subset of the data in a BigWig file.
*
* Adapted by Robert Buels from bigwig.js in the Dalliance Genome
* Explorer by Thomas Down.
* @constructs
*/
constructor: function(bwg, cirTreeOffset, cirTreeLength, isSummary, autoSql) {
this.bwg = bwg;
this.autoSql = autoSql;
if( !( cirTreeOffset >= 0 ) )
throw "invalid cirTreeOffset!";
if( !( cirTreeLength > 0 ) )
throw "invalid cirTreeLength!";
this.cirTreeOffset = cirTreeOffset;
this.cirTreeLength = cirTreeLength;
this.isSummary = isSummary;
function countFeatures(features) {
if (!features) return 0
let total = features.length
features.forEach( feature => {
total += countFeatures(feature.children())
})
return total
}
this.featureCache = new LRUCache({
name: 'feature cache',
fillCallback: (query, callback) => {
this.readWigDataById(...query, callback, err => {console.error(err)})
},
sizeFunction: countFeatures,
maxSize: 500000 // cache up to 50000 features and subfeatures
});
},
BED_COLOR_REGEXP: /^[0-9]+,[0-9]+,[0-9]+/,
readWigData: function(chrName, min, max, callback, errorCallback ) {
// console.log( 'reading wig data from '+chrName+':'+min+'..'+max);
var chr = this.bwg.refsByName[chrName];
if ( ! chr ) {
// Not an error because some .bwgs won't have data for all chromosomes.
// dlog("Couldn't find chr " + chrName);
// dlog('Chroms=' + miniJSONify(this.bwg.refsByName));
callback([]);
} else {
this.readWigDataByIdWithCache( chr.id, min, max, callback, errorCallback );
}
},
readWigDataByIdWithCache(chr, min, max, callback, errorCallback) {
this.featureCache.get([chr, min, max], (result,error) => {
if (error)
errorCallback(error)
else
callback(result)
})
},
readWigDataById: function(chr, min, max, callback, errorCallback ) {
if( !this.cirHeader ) {
var readCallback = lang.hitch( this, 'readWigDataById', chr, min, max, callback, errorCallback );
if( this.cirHeaderLoading ) {
this.cirHeaderLoading.push( readCallback );
}
else {
this.cirHeaderLoading = [ readCallback ];
// dlog('No CIR yet, fetching');
this.bwg.data
.read( this.cirTreeOffset, 48, lang.hitch( this, function(result) {
this.cirHeader = result;
this.cirBlockSize = this.bwg.newDataView( result, 4, 4 ).getUint32();
array.forEach( this.cirHeaderLoading, function(c) { c(); });
delete this.cirHeaderLoading;
}), errorCallback );
}
return;
}
//dlog('_readWigDataById', chr, min, max, callback);
var worker = new RequestWorker( this, chr, min, max, callback, errorCallback );
worker.cirFobRecur([this.cirTreeOffset + 48], 1);
}
});
});