Skip to content

Commit

Permalink
Add ChromSizes parser
Browse files Browse the repository at this point in the history
  • Loading branch information
cmdcolin committed Nov 7, 2018
1 parent 26b41ad commit 24059c3
Show file tree
Hide file tree
Showing 7 changed files with 194 additions and 26 deletions.
18 changes: 17 additions & 1 deletion src/JBrowse/Browser.js
Expand Up @@ -50,6 +50,7 @@ define( [
'JBrowse/View/Dialog/SetTrackHeight',
'JBrowse/View/Dialog/QuickHelp',
'JBrowse/View/StandaloneDatasetList',
'JBrowse/Store/SeqFeature/ChromSizes',
'JBrowse/Store/SeqFeature/UnindexedFasta',
'JBrowse/Store/SeqFeature/IndexedFasta',
'JBrowse/Store/SeqFeature/BgzipIndexedFasta',
Expand Down Expand Up @@ -113,6 +114,7 @@ define( [
SetTrackHeightDialog,
HelpDialog,
StandaloneDatasetList,
ChromSizes,
UnindexedFasta,
IndexedFasta,
BgzipIndexedFasta,
Expand Down Expand Up @@ -585,6 +587,12 @@ loadRefSeqs: function() {
thisB.addRefseqs(refSeqs);
deferred.resolve({success:true});
});
} else if( this.config.refSeqs.url && this.config.refSeqs.url.match(/.sizes/) ) {
new ChromSizes({browser: this, urlTemplate: this.config.refSeqs.url})
.getRefSeqs(function(refSeqs) {
thisB.addRefseqs(refSeqs);
deferred.resolve({success:true});
});
} else if( 'data' in this.config.refSeqs ) {
this.addRefseqs( this.config.refSeqs.data );
deferred.resolve({success:true});
Expand Down Expand Up @@ -1317,6 +1325,12 @@ openFastaElectron: function() {
trackList.tracks[0].urlTemplate = f2bit;
trackList.refSeqs = f2bit;
}
else if( confs[0].store.type == 'JBrowse/Store/SeqFeature/ChromSizes' ) {
var sizes = Util.replacePath( confs[0].store.blob.url );
trackList.tracks[0].storeClass = 'JBrowse/Store/SeqFeature/ChromSizes';
trackList.tracks[0].urlTemplate = sizes;
trackList.refSeqs = sizes;
}
else {
var fasta = Util.replacePath( confs[0].store.fasta.url );
try {
Expand Down Expand Up @@ -1386,7 +1400,9 @@ openFasta: function() {
storeConf.name = 'refseqs' // important to make it the refseq store
newBrowser.addStoreConfig( storeConf.name, storeConf )
conf.store = 'refseqs'
newBrowser.publish( '/jbrowse/v1/v/tracks/new', [conf] )
if(storeConf.type !== 'JBrowse/Store/SeqFeature/ChromSizes') {
newBrowser.publish( '/jbrowse/v1/v/tracks/new', [conf] )
}
})
resolve()
},
Expand Down
116 changes: 116 additions & 0 deletions src/JBrowse/Store/SeqFeature/ChromSizes.js
@@ -0,0 +1,116 @@
const BlobFilehandleWrapper = cjsRequire('../../Model/BlobFilehandleWrapper')

define( [ 'dojo/_base/declare',
'dojo/_base/lang',
'dojo/Deferred',
'JBrowse/Store/SeqFeature',
'JBrowse/Model/XHRBlob',
'JBrowse/Store/DeferredFeaturesMixin'
],
function(
declare,
lang,
Deferred,
SeqFeatureStore,
XHRBlob,
DeferredFeaturesMixin
) {

return declare( [ SeqFeatureStore, DeferredFeaturesMixin ],
{

/**
* Storage backend for sequences in indexed fasta files
* served as static text files.
* @constructs
*/
constructor: function(args) {
let dataBlob
if (args.blob)
dataBlob = new BlobFilehandleWrapper(args.blob)
else if (args.urlTemplate)
dataBlob = new BlobFilehandleWrapper(new XHRBlob(this.resolveUrl(args.urlTemplate), { expectRanges: true }))

this.source = dataBlob.toString()
this.data = dataBlob
this.refSeqs = {}

this.init({
success: () => this._deferred.features.resolve({success:true}),
error: () => this._failAllDeferred()
})
},

hasRefSeq: function( seqName, callback, errorCallback ) {
this.getSequenceSize(seqName)
.then(
size => {
callback(size !== undefined)
},
errorCallback,
)
},
getRefSeqs: function( callback, errorCallback ) {
this.getSequenceSizes()
.then(sizes => Object.entries(this.refSeqs).map(([name,length]) => {
return {
name,
length,
end: length,
start: 0,
}
}))
.then(callback, errorCallback)
},
getSequenceSize: function(refSeq) {
return this._deferred.features.then(() => {
return this.refSeqs[refSeq]
})
},
getSequenceSizes: function() {
return this._deferred.features.then(() => {
return this.refSeqs
})
},
init: function( args ) {
var fasta = this.data;
var successCallback = args.success || function() {};
var failCallback = args.failure || function(e) { console.error(e, e.stack); };
this.parseFile(fasta, data => {
data.split('\n').forEach(line => {
if(line.length) {
const [name, length] = line.split('\t')
this.refSeqs[name] = length
}
})
successCallback();
}, failCallback );
},


parseFile: function(fastaFile, successCallback, failCallback ) {
fastaFile.readFile().then(text => {
var chromSizes = "";
var bytes = new Uint8Array(text);
var length = bytes.length;
for (var i = 0; i < length; i++) {
chromSizes += String.fromCharCode(bytes[i]);
}

if (!(chromSizes && chromSizes.length))
failCallback ("Could not read file: " + fastaFile.name);
else {
successCallback(chromSizes);
}

}, failCallback );
},

saveStore: function() {
return {
urlTemplate: (this.config.file||this.config.blob).url,
};
}

});
});
12 changes: 0 additions & 12 deletions src/JBrowse/Store/SeqFeature/IndexedFasta.js
Expand Up @@ -7,26 +7,14 @@ const fastaIndexedFilesCache = LRU(5)
const BlobFilehandleWrapper = cjsRequire('../../Model/BlobFilehandleWrapper')

define( [ 'dojo/_base/declare',
'dojo/_base/lang',
'dojo/request',
'dojo/promise/all',
'dojo/Deferred',
'JBrowse/Store/SeqFeature',
'JBrowse/Util',
'JBrowse/Digest/Crc32',
'JBrowse/Model/XHRBlob',
'JBrowse/Model/SimpleFeature',
'JBrowse/Store/DeferredFeaturesMixin'
],
function(
declare,
lang,
request,
all,
Deferred,
SeqFeatureStore,
Util,
Crc32,
XHRBlob,
SimpleFeature,
DeferredFeaturesMixin
Expand Down
10 changes: 0 additions & 10 deletions src/JBrowse/Store/SeqFeature/UnindexedFasta.js
@@ -1,24 +1,14 @@
define( [ 'dojo/_base/declare',
'dojo/_base/lang',
'dojo/request',
'dojo/promise/all',
'dojo/Deferred',
'JBrowse/Store/SeqFeature',
'JBrowse/Util',
'JBrowse/Digest/Crc32',
'JBrowse/Model/XHRBlob',
'JBrowse/Store/DeferredFeaturesMixin',
'./UnindexedFasta/File'
],
function(
declare,
lang,
request,
all,
Deferred,
SeqFeatureStore,
Util,
Crc32,
XHRBlob,
DeferredFeaturesMixin,
FASTAFile
Expand Down
8 changes: 5 additions & 3 deletions src/JBrowse/View/FastaFileDialog.js
Expand Up @@ -6,7 +6,8 @@ define( [
'JBrowse/View/FileDialog',
'./FileDialog/TrackList/BgzipIndexedFASTADriver',
'./FileDialog/TrackList/IndexedFASTADriver',
'./FileDialog/TrackList/TwoBitDriver'
'./FileDialog/TrackList/TwoBitDriver',
'./FileDialog/TrackList/ChromSizesDriver'
],
function(
declare,
Expand All @@ -16,14 +17,15 @@ define( [
FileDialog,
BgzipIndexedFASTADriver,
IndexedFASTADriver,
TwoBitDriver
TwoBitDriver,
ChromSizesDriver
) {

return declare( FileDialog, {

constructor: function( args ) {
this.inherited(arguments);
this._fileTypeDrivers = [ new BgzipIndexedFASTADriver(), new IndexedFASTADriver(), new TwoBitDriver() ];
this._fileTypeDrivers = [ new BgzipIndexedFASTADriver(), new IndexedFASTADriver(), new TwoBitDriver(), new ChromSizesDriver() ];
return this;
},

Expand Down
2 changes: 2 additions & 0 deletions src/JBrowse/View/FileDialog/ResourceList.js
Expand Up @@ -116,6 +116,7 @@ return declare( null, {
{ label: "BAM+CSI index", value: "bam.csi" },
{ label: "CRAM", value: "cram" },
{ label: "CRAM index", value: "cram.crai"},
{ label: "Chrom sizes", value: "chrom.sizes"},
],
value: this.guessType( name ),
onChange: function() {
Expand Down Expand Up @@ -190,6 +191,7 @@ return declare( null, {
/\.bam.csi$/i.test( name ) ? 'bam.csi' :
/\.cram$/i.test( name ) ? 'cram' :
/\.crai$/i.test( name ) ? 'cram.crai' :
/\.sizes$/i.test( name ) ? 'chrom.sizes' :
null
);
}
Expand Down
54 changes: 54 additions & 0 deletions src/JBrowse/View/FileDialog/TrackList/ChromSizesDriver.js
@@ -0,0 +1,54 @@
define([
'dojo/_base/declare',
'JBrowse/Util',
'JBrowse/Model/FileBlob',
'JBrowse/Model/XHRBlob'
],
function( declare, Util, FileBlob, XHRBlob ) {
var uniqCounter = 0;
return declare( null, {

storeType: 'JBrowse/Store/SeqFeature/ChromSizes',

tryResource: function( configs, resource ) {
if( resource.type == 'chrom.sizes' ) {
var basename = Util.basename(
resource.file ? resource.file.name :
resource.url ? resource.url :
'',
['.sizes']
);
if( !basename )
return false;

var newName = 'REF_'+basename+'_'+uniqCounter++;
configs[newName] = {
type: this.storeType,
fileBasename: basename,
blob: this._makeBlob( resource ),
name: newName
};
return true;
}
else
return false;
},

finalizeConfiguration: function( configs ) {
},

_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.blob || conf.urlTemplate;
}
});
});

0 comments on commit 24059c3

Please sign in to comment.