@gmod/jbrowse
Version:
JBrowse - client-side genome browser
168 lines (148 loc) • 5.97 kB
JavaScript
define([
'dojo/_base/declare',
'dojo/Deferred',
'JBrowse/Store/SeqFeature/NCList',
'JBrowse/Store/NCList_v0',
'JBrowse/Store/LazyArray'
], function( declare, Deferred, SFNCList, GenericNCList, LazyArray ) {
return declare( SFNCList,
/**
* @lends JBrowse.Store.SeqFeature.NCList_v0
*/
{
/**
* Feature storage backend for backward-compatibility with JBrowse 1.2.1 stores.
* @extends SeqFeatureStore.NCList
* @constructs
*/
constructor: function(args) {
this.fields = {};
this.track = new Deferred();
if( args.track )
this.track.resolve( args.track );
},
setTrack: function(t) {
if( ! this.track.isFulfilled() )
this.track.resolve( t );
},
/**
* Delete an object member and return the deleted value.
* @private
*/
_del: function( obj, old ) {
var x = obj[old];
delete obj[old];
return x;
},
_handleTrackInfo: function( refData, trackInfo, url ) {
if( trackInfo ) {
// munge the trackInfo to make the histogram stuff work with v1 code
dojo.forEach( trackInfo.histogramMeta, function(m) {
m.arrayParams.urlTemplate = m.arrayParams.urlTemplate.replace(/\{chunk\}/,'{Chunk}');
});
trackInfo.histograms = {
meta: this._del( trackInfo, 'histogramMeta' ),
stats: this._del( trackInfo, 'histStats' )
};
// rename stats.bases to stats.basesPerBin
dojo.forEach( trackInfo.histograms.stats, function(s) {
s.basesPerBin = this._del( s, 'bases' );
},this);
// since the old format had style information inside the
// trackdata file, yuckily push it up to the track's config.style
var renameVar = {
urlTemplate: "linkTemplate"
};
this.track.then( function( track ) {
dojo.forEach(
['className','arrowheadClass','subfeatureClasses','urlTemplate','clientConfig'],
function(varname) {
if( !track.config.style ) track.config.style = {};
var dest_varname = renameVar[varname] || varname;
if( varname in trackInfo )
track.config.style[dest_varname] = trackInfo[varname];
},this);
// also need to merge Ye Olde clientConfig values into the style object
if( track.config.style.clientConfig ) {
track.config.style = dojo.mixin( track.config.style, track.config.style.clientConfig );
delete track.config.style.clientConfig;
}
});
// remember the field offsets from the old-style trackinfo headers
refData.fields = {};
refData.fieldOrder = [];
var i;
for (i = 0; i < trackInfo.headers.length; i++) {
refData.fieldOrder.push( trackInfo.headers[i] );
refData.fields[trackInfo.headers[i]] = i;
}
refData.subFields = {};
refData.subFieldOrder = [];
if (trackInfo.subfeatureHeaders) {
for (i = 0; i < trackInfo.subfeatureHeaders.length; i++) {
refData.subFieldOrder.push( trackInfo.subfeatureHeaders[i] );
refData.subFields[trackInfo.subfeatureHeaders[i]] = i;
}
}
refData.stats = {
featureCount: trackInfo.featureCount,
featureDensity: trackInfo.featureCount / this.refSeq.length
};
this.loadNCList( refData, trackInfo, url );
var histograms = trackInfo.histograms;
if( histograms && histograms.meta ) {
for (var i = 0; i < histograms.meta.length; i++) {
histograms.meta[i].lazyArray =
new LazyArray( histograms.meta[i].arrayParams, url );
}
refData._histograms = histograms;
}
this._deferred.root.resolve( refData );
}
},
makeNCList: function() {
return new GenericNCList();
},
loadNCList: function( refData, trackInfo, url ) {
refData.nclist.importExisting(trackInfo.featureNCList,
trackInfo.sublistIndex,
trackInfo.lazyIndex,
url,
trackInfo.lazyfeatureUrlTemplate);
},
_getFeatures: function( data, query, origFeatCallback, finishCallback, errorCallback ) {
var that = this,
startBase = query.start,
endBase = query.end,
fields = data.fields,
fieldOrder = data.fieldOrder,
subFields = data.subFields,
subfieldOrder = data.subfieldOrder,
get = function(fieldname) {
var f = fields[fieldname];
if( f >= 0 )
return this[f];
else
return undefined;
},
subget = function(fieldname) {
var f = subFields[fieldname];
if( f >= 0 )
return this[f];
else
return undefined;
},
tags = function() {
return fieldOrder;
},
subTags = function() {
return subfieldOrder;
},
featCallBack = function( feature, path ) {
that._decorate_feature( { get: get, tags: tags }, feature, path.join(',') );
return origFeatCallback( feature, path );
};
return data.nclist.iterate.call( data.nclist, startBase, endBase, featCallBack, finishCallback );
}
});
});