-
Notifications
You must be signed in to change notification settings - Fork 0
/
NucDensStore.js
73 lines (67 loc) · 2.49 KB
/
NucDensStore.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
define( 'NucleotideDensityPlugin/Store/SeqFeature/NucDensStore', [
'dojo/_base/declare',
'dojo/_base/array',
'JBrowse/Store/SeqFeature',
'JBrowse/Util',
'JBrowse/Model/CoverageFeature'
],
function(
declare,
array,
SeqFeatureStore,
Util,
CoverageFeature
){
/**
This class is almost identitical to GCContent class published by Colin
for the GCContent Plugin ()
This store class is for a single nucleotide context
*/
return declare(SeqFeatureStore,{
constuctor: function(args){
this.store = args.store;
this.windowSize = args.windowSize;
this.windowDelta = args.windowDelta;
this.nucLength = args.nLength;
this.nuc = args.nuc; // array of nucleotide sequence contexts to look for
// note: all possibilities in nuc must be the same length - nucLength
},
getGlobalStats: function(callback, errorCallback){
callback({});
},
getFeatures: function(query, featureCallback, finishCallback, errorCallback){
// generate features
var hw = this.windowSize / 2; // Half the window size
query.start = Math.max(0, query.start - hw);
query.end = Math.min(query.end + hw, this.browser.refSeq.length);
var thisB = this;
if (query.end < 0 || query.start > query.end) {
finishCallback();
return;
}
this.store.getReferenceSequence(query, function(residues) {
for (var i = hw; i < residues.length - hw; i += thisB.windowDelta) {
var r = residues.slice(i - hw, i + hw);
var rn = r.length - thisB.nucLength;
var count = 0
for (var j = 0; j <= rn; j++) {
var rs = r.slice(j, j+thisB.nucLength);
if( array.indexOf(thisB.nuc, rs.toUpperCase()) !== -1 )
count ++;
}
var pos = query.start;
var score = count / rn;
var feat = new CoverageFeature({
start: pos + i,
end: pos + i + thisB.windowDelta,
score: score
});
featureCallback(feat);
}
finishCallback();
},
finishCallback,
errorCallback);
}
});
});