@gmod/jbrowse
Version:
JBrowse - client-side genome browser
157 lines (135 loc) • 6.43 kB
JavaScript
define([
'dojo/_base/declare',
'JBrowse/Util',
'JBrowse/Model/FileBlob',
'JBrowse/Model/XHRBlob'
],
function( declare, Util, FileBlob, XHRBlob ) {
var uniqCounter = 0;
return declare( null, {
name: 'BGZFASTA',
storeType: 'JBrowse/Store/SeqFeature/BgzipIndexedFasta',
fileExtension: 'fasta.gz',
fileExtensionMap: ['.fasta.gz', '.fa.gz', '.fna.gz', '.mfa.gz'],
fileConfKey: 'bgzfa',
fileUrlConfKey: 'urlTemplate',
indexExtension: 'fasta.gz.fai',
indexExtensionMap: ['.fasta.gz.fai', '.fa.gz.fai', '.fna.gz.fai', '.mfa.gz.fai'],
indexConfKey: 'fai',
indexUrlConfKey: 'faiUrlTemplate',
doubleIndexExtension: 'gzi',
doubleIndexExtensionMap: ['.fasta.gz.gzi', '.fa.gz.gzi', '.fna.gz.gzi', '.mfa.gz.gzi'],
doubleIndexConfKey: 'gzi',
doubleIndexUrlConfKey: 'gziUrlTemplate',
tryResource: function( configs, resource ) {
if( resource.type == this.fileExtension ) {
var basename = Util.basename(
resource.file ? resource.file.name :
resource.url ? resource.url :
'',
this.fileExtensionMap
);
if( !basename )
return false;
// go through the configs and see if there is one for an index that seems to match
for( var n in configs ) {
var c = configs[n];
if( Util.basename( c[this.indexConfKey] ? c[this.indexConfKey ].url || c[this.indexConfKey].blob.name : c[this.indexUrlConfKey], this.indexExtensionMap ) == basename ||
Util.basename( c[this.doubleIndexConfKey] ? c[this.doubleIndexConfKey ].url || c[this.doubleIndexConfKey].blob.name : c[this.doubleIndexUrlConfKey], this.doubleIndexExtensionMap ) == basename ) {
// it's a match, put it in
c[this.fileConfKey] = this._makeBlob( resource );
return true;
}
}
// otherwise make a new store config for it
var newName = this.name+'_'+basename+'_'+uniqCounter++;
configs[newName] = {
type: this.storeType,
name: newName,
fileBasename: basename
};
configs[newName][this.fileConfKey] = this._makeBlob( resource );
return true;
} else if( resource.type == this.indexExtension ) {
var basename = Util.basename(
resource.file ? resource.file.name :
resource.url ? resource.url :
'',
this.indexExtensionMap
);
if( !basename )
return false;
for( var n in configs ) {
var c = configs[n];
if( Util.basename( c[this.fileConfKey] ? c[this.fileConfKey ].url || c[this.fileConfKey].blob.name : c[this.fileConfKey], this.fileExtensionMap ) == basename ||
Util.basename( c[this.doubleIndexConfKey] ? c[this.doubleIndexConfKey ].url || c[this.doubleIndexConfKey].blob.name : c[this.doubleIndexUrlConfKey], this.doubleIndexExtensionMap ) == basename ) {
// it's a match, put it in
c[this.indexConfKey] = this._makeBlob( resource );
return true;
}
}
// otherwise make a new store
var newName = this.name+'_'+Util.basename(basename,'.'+this.fileExtension)+'_'+uniqCounter++;
configs[newName] = {
name: newName,
type: this.storeType
};
configs[newName][this.indexConfKey] = this._makeBlob( resource );
return true;
} else if( resource.type == this.doubleIndexExtension ) {
var basename = Util.basename(
resource.file ? resource.file.name :
resource.url ? resource.url :
'',
this.doubleIndexExtensionMap
);
if( !basename )
return false;
for( var n in configs ) {
var c = configs[n];
if( Util.basename( c[this.fileConfKey] ? c[this.fileConfKey ].url || c[this.fileConfKey].blob.name : c[this.fileConfKey], this.fileExtensionMap ) == basename ||
Util.basename( c[this.indexConfKey] ? c[this.indexConfKey ].url || c[this.indexConfKey].blob.name : c[this.indexUrlConfKey], this.indexExtensionMap ) == basename ) {
// it's a match, put it in
c[this.doubleIndexConfKey] = this._makeBlob( resource );
return true;
}
}
// otherwise make a new store
var newName = this.name+'_'+Util.basename(basename,'.'+this.fileExtension)+'_'+uniqCounter++;
configs[newName] = {
name: newName,
type: this.storeType
};
configs[newName][this.doubleIndexConfKey] = this._makeBlob( resource );
return true;
}
else
return false;
},
// try to merge any singleton file and index stores. currently can only do this if there is one of each
finalizeConfiguration: function( configs ) {
for( var n in configs ) {
var conf = configs[n];
if( conf.type === this.storeType ) {
var v1 = (conf[this.indexConfKey] || conf[this.indexUrlConfKey])
var v2 = (conf[this.fileConfKey] || conf[this.fileUrlConfKey])
var v3 = (conf[this.doubleIndexConfKey] || conf[this.doubleIndexUrlConfKey])
if(!(v1 && v2 && v3)) {
delete configs[n]
}
}
}
},
_makeBlob: function( resource ) {
var r = resource.file ? new FileBlob( resource.file ) :
resource.url ? new XHRBlob( resource.url ) :
null;
if( ! r )
throw 'unknown resource type';
return r;
},
confIsValid: function( conf ) {
return (conf[this.fileConfKey] || conf[this.fileUrlConfKey]) && ( conf[this.indexConfKey] || conf[this.indexUrlConfKey] ) && ( conf[this.doubleIndexConfKey] || conf[this.doubleIndexUrlConfKey] );
}
});
});