Skip to content

Commit

Permalink
Add cross-block read pairing over region
Browse files Browse the repository at this point in the history
  • Loading branch information
cmdcolin committed Nov 18, 2018
1 parent 246fa85 commit 65ff4cd
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 16 deletions.
48 changes: 35 additions & 13 deletions src/JBrowse/Store/SeqFeature/BAM.js
Expand Up @@ -172,6 +172,7 @@ return declare( [ SeqFeatureStore, DeferredStatsMixin, DeferredFeaturesMixin, In
})

this.storeTimeout = args.storeTimeout || 3000;
this.featureCache = {}
},

// process the parsed SAM header from the bam file
Expand Down Expand Up @@ -246,39 +247,60 @@ return declare( [ SeqFeatureStore, DeferredStatsMixin, DeferredFeaturesMixin, In
for(let i = 0; i < records.length; i++) {
let feat
if (canBePaired(records[i])) {
feat = pairCache[records[i]._get('name')]
if (feat) {
let name = records[i]._get('name')
feat = pairCache[name]
if (feat && records[i].id() != feat.f1.id()) {
feat.f2 = this._bamRecordToFeature(records[i])
delete pairCache[records[i]._get('name')]
delete pairCache[name]
this.featureCache[name] = feat
featCallback(feat)
}
else {
feat = new PairedBamRead()
feat.f1 = this._bamRecordToFeature(records[i])
pairCache[records[i]._get('name')] = feat
pairCache[name] = feat
}
}
else {
featCallback(this._bamRecordToFeature(records[i]))
let feat = this._bamRecordToFeature(records[i])
featCallback(feat)
}
}
Object.keys(this.featureCache).forEach(k => {
featCallback(this.featureCache[k])
})
} else {
for(let i = 0; i < records.length; i++) {
featCallback(this._bamRecordToFeature(records[i]))
}
}
endCallback()
})
.catch(err => {
// // map the BamSizeLimitError to JBrowse Errors.DataOverflow
// if (err instanceof BamSizeLimitError) {
// err = new Errors.DataOverflow(err)
// }
}).catch(errorCallback)
},

errorCallback(err)
})

getPairedRanges( query, featCallback, errorCallback ) {
let seqName = query.ref || this.refSeq.name
seqName = this.browser.regularizeReferenceName( seqName );
this._deferred.features.then(() => {
this.bam.getRecordsForRange(seqName, query.start, query.end, {viewAsPairs: query.viewAsPairs})
.then(records => {
let min = Infinity;
let max = -Infinity;
for(let i = 0; i < records.length; i++) {
if(records[i]._get('start') < min) {
min = records[i]._get('start')
}
if(records[i]._get('end') > max) {
max = records[i]._get('end')
}
}
featCallback({ min, max })
}).catch(errorCallback)
}, errorCallback)
},


_bamRecordToFeature(record) {
return new BamSlightlyLazyFeature(record, this)
},
Expand Down
29 changes: 26 additions & 3 deletions src/JBrowse/View/Track/Alignments2.js
Expand Up @@ -51,9 +51,6 @@ return declare( [ CanvasFeatureTrack, AlignmentsMixin ], {
}
}
);
if(c.viewAsPairs) {
c.glyph = 'JBrowse/View/FeatureGlyph/PairedAlignment'
}
return c;
},

Expand Down Expand Up @@ -144,5 +141,31 @@ return declare( [ CanvasFeatureTrack, AlignmentsMixin ], {
return layout;
},

fillBlock: function( args ) {
if(this.config.viewAsPairs) {
this.initial = new Promise((resolve, reject) => {
var reg = this.browser.view.visibleRegion()
const region = {
ref: this.refSeq.name,
start: Math.max( 0, reg.start ),
end: reg.end,
viewAsPairs: true
}
this.store.getPairedRanges(region, range => {
region.start = range.min
region.end = range.max
this.store.getFeatures(region, function() {}, resolve, reject)
}, reject)
})
let supermethod = this.getInherited(arguments)
this.initial.then(() => {
supermethod.apply(this, [args])
})
} else {
this.inherited(arguments);
}
}


});
});

0 comments on commit 65ff4cd

Please sign in to comment.