genoverse 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/.eslintrc.js +197 -0
  2. package/.github/workflows/test.yml +24 -0
  3. package/LICENSE.TXT +24 -0
  4. package/README.md +11 -0
  5. package/css/controlPanel.css +200 -0
  6. package/css/fileDrop.css +22 -0
  7. package/css/font-awesome.css +3 -0
  8. package/css/fullscreen.css +19 -0
  9. package/css/genoverse.css +466 -0
  10. package/css/karyotype.css +85 -0
  11. package/css/resizer.css +36 -0
  12. package/css/tooltips.css +26 -0
  13. package/css/trackControls.css +111 -0
  14. package/expanded.html +120 -0
  15. package/fontawesome/css/fontawesome.min.css +5 -0
  16. package/fontawesome/css/regular.min.css +5 -0
  17. package/fontawesome/css/solid.min.css +5 -0
  18. package/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  19. package/fontawesome/webfonts/fa-brands-400.woff +0 -0
  20. package/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  21. package/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  22. package/fontawesome/webfonts/fa-regular-400.woff +0 -0
  23. package/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  24. package/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  25. package/fontawesome/webfonts/fa-solid-900.woff +0 -0
  26. package/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  27. package/help.pdf +0 -0
  28. package/i/sort_handle.png +0 -0
  29. package/index.html +68 -0
  30. package/index.js +83 -0
  31. package/jest.config.js +4 -0
  32. package/js/Genoverse.js +1681 -0
  33. package/js/Track/Controller/Sequence.js +17 -0
  34. package/js/Track/Controller/Stranded.js +73 -0
  35. package/js/Track/Controller.js +620 -0
  36. package/js/Track/Model/File/BAM.js +44 -0
  37. package/js/Track/Model/File/BED.js +116 -0
  38. package/js/Track/Model/File/GFF.js +40 -0
  39. package/js/Track/Model/File/VCF.js +101 -0
  40. package/js/Track/Model/File/WIG.js +67 -0
  41. package/js/Track/Model/File.js +36 -0
  42. package/js/Track/Model/Gene/Ensembl.js +22 -0
  43. package/js/Track/Model/Gene.js +5 -0
  44. package/js/Track/Model/Sequence/Ensembl.js +4 -0
  45. package/js/Track/Model/Sequence/Fasta.js +60 -0
  46. package/js/Track/Model/Sequence.js +50 -0
  47. package/js/Track/Model/SequenceVariation.js +41 -0
  48. package/js/Track/Model/Stranded.js +28 -0
  49. package/js/Track/Model/Transcript/Ensembl.js +67 -0
  50. package/js/Track/Model/Transcript.js +5 -0
  51. package/js/Track/Model.js +303 -0
  52. package/js/Track/View/Gene/Ensembl.js +46 -0
  53. package/js/Track/View/Gene.js +6 -0
  54. package/js/Track/View/Sequence/Variation.js +115 -0
  55. package/js/Track/View/Sequence.js +63 -0
  56. package/js/Track/View/Transcript/Ensembl.js +12 -0
  57. package/js/Track/View/Transcript.js +28 -0
  58. package/js/Track/View.js +566 -0
  59. package/js/Track/library/Chromosome.js +145 -0
  60. package/js/Track/library/File/BAM.js +30 -0
  61. package/js/Track/library/File/BED.js +24 -0
  62. package/js/Track/library/File/BIGBED.js +47 -0
  63. package/js/Track/library/File/BIGWIG.js +52 -0
  64. package/js/Track/library/File/GFF.js +9 -0
  65. package/js/Track/library/File/VCF.js +71 -0
  66. package/js/Track/library/File/WIG.js +5 -0
  67. package/js/Track/library/File.js +10 -0
  68. package/js/Track/library/Gene.js +37 -0
  69. package/js/Track/library/Graph/Bar.js +235 -0
  70. package/js/Track/library/Graph/Line.js +296 -0
  71. package/js/Track/library/Graph.js +355 -0
  72. package/js/Track/library/HighlightRegion.js +292 -0
  73. package/js/Track/library/Legend.js +224 -0
  74. package/js/Track/library/Scalebar.js +227 -0
  75. package/js/Track/library/Scaleline.js +91 -0
  76. package/js/Track/library/Static.js +78 -0
  77. package/js/Track/library/dbSNP.js +142 -0
  78. package/js/Track.js +632 -0
  79. package/js/genomes/grch37.js +990 -0
  80. package/js/genomes/grch38.js +990 -0
  81. package/js/genoverse.min.js +2 -0
  82. package/js/genoverse.min.js.map +1 -0
  83. package/js/lib/BWReader.js +578 -0
  84. package/js/lib/Base.js +145 -0
  85. package/js/lib/VCFReader.js +286 -0
  86. package/js/lib/dalliance/js/bam.js +494 -0
  87. package/js/lib/dalliance/js/bin.js +185 -0
  88. package/js/lib/dalliance/js/das.js +749 -0
  89. package/js/lib/dalliance/js/utils.js +370 -0
  90. package/js/lib/dalliance-lib.js +3594 -0
  91. package/js/lib/dalliance-lib.min.js +68 -0
  92. package/js/lib/jDataView.js +2 -0
  93. package/js/lib/jParser.js +192 -0
  94. package/js/lib/jquery-ui.js +8 -0
  95. package/js/lib/jquery.js +2 -0
  96. package/js/lib/jquery.mousehold.js +53 -0
  97. package/js/lib/jquery.mousewheel.js +84 -0
  98. package/js/lib/jquery.tipsy.js +258 -0
  99. package/js/lib/rtree.js +1 -0
  100. package/js/plugins/controlPanel.js +395 -0
  101. package/js/plugins/fileDrop.js +62 -0
  102. package/js/plugins/focusRegion.js +12 -0
  103. package/js/plugins/fullscreen.js +77 -0
  104. package/js/plugins/karyotype.js +210 -0
  105. package/js/plugins/resizer.js +45 -0
  106. package/js/plugins/tooltips.js +94 -0
  107. package/js/plugins/trackControls.js +143 -0
  108. package/package.json +43 -0
  109. package/test/View/__snapshots__/render-bar-graph.test.js.snap +111 -0
  110. package/test/View/__snapshots__/render-blocks.test.js.snap +105 -0
  111. package/test/View/__snapshots__/render-chromosome.test.js.snap +5 -0
  112. package/test/View/__snapshots__/render-highlights.test.js.snap +73 -0
  113. package/test/View/__snapshots__/render-insert-variants.test.js.snap +9 -0
  114. package/test/View/__snapshots__/render-labels.test.js.snap +241 -0
  115. package/test/View/__snapshots__/render-legends.test.js.snap +13 -0
  116. package/test/View/__snapshots__/render-line-graph.test.js.snap +349 -0
  117. package/test/View/__snapshots__/render-scalebar.test.js.snap +49 -0
  118. package/test/View/__snapshots__/render-scaleline.test.js.snap +31 -0
  119. package/test/View/__snapshots__/render-sequence.test.js.snap +23 -0
  120. package/test/View/__snapshots__/render-stranded.test.js.snap +5 -0
  121. package/test/View/__snapshots__/render-transcripts.test.js.snap +193 -0
  122. package/test/View/render-bar-graph.test.js +87 -0
  123. package/test/View/render-blocks.test.js +171 -0
  124. package/test/View/render-chromosome.test.js +40 -0
  125. package/test/View/render-highlights.test.js +67 -0
  126. package/test/View/render-insert-variants.test.js +11 -0
  127. package/test/View/render-labels.test.js +266 -0
  128. package/test/View/render-legends.test.js +31 -0
  129. package/test/View/render-line-graph.test.js +169 -0
  130. package/test/View/render-scalebar.test.js +36 -0
  131. package/test/View/render-scaleline.test.js +28 -0
  132. package/test/View/render-sequence.test.js +49 -0
  133. package/test/View/render-stranded.test.js +10 -0
  134. package/test/View/render-transcripts.test.js +165 -0
  135. package/test/create-and-destroy.test.js +63 -0
  136. package/test/track-ordering.test.js +514 -0
  137. package/test/track_config/__snapshots__/config-settings.test.js.snap +23 -0
  138. package/test/track_config/config-settings.test.js +321 -0
  139. package/test/track_config/zoom-level-settings.test.js +98 -0
  140. package/test/utils.js +80 -0
  141. package/utils/createGenome.js +52 -0
  142. package/utils/devServer.js +36 -0
  143. package/utils/expandedTemplate.html +46 -0
  144. package/utils/git-hooks/post-commit +9 -0
  145. package/utils/git-hooks/pre-commit +7 -0
  146. package/utils/git-hooks/setup +6 -0
  147. package/utils/makeExpanded.js +19 -0
  148. package/webpack.config.js +39 -0
@@ -0,0 +1,286 @@
1
+ (function () {
2
+ var tabi_fmt = {
3
+ string0: function (size) {
4
+ return this.parse(['string', size]).replace(/\0+$/, '');
5
+ },
6
+ header: {
7
+ magic : ['string', 4],
8
+ n_ref : 'int32',
9
+ format : 'int32',
10
+ col_seq : 'int32',
11
+ col_beg : 'int32',
12
+ col_end : 'int32',
13
+ meta : 'int32',
14
+ skip : 'int32',
15
+ l_nm : 'int32',
16
+ names : ['string0', function () { return this.current.l_nm; }]
17
+ },
18
+ chunk: {
19
+ cnk_beg: 'uint64',
20
+ cnk_end: 'uint64'
21
+ },
22
+ bin: {
23
+ bin : 'uint32',
24
+ n_chunk : 'int32',
25
+ chunkseq : ['array', 'chunk', function () { return this.current.n_chunk; }]
26
+ },
27
+ index: {
28
+ n_bin : 'int32',
29
+ binseq : ['array', 'bin', function () { return this.current.n_bin; }],
30
+ n_intv : 'int32',
31
+ intervseq : ['array', 'uint64', function () { return this.current.n_intv; }]
32
+ },
33
+ tabix: {
34
+ head : 'header',
35
+ indexseq : ['array', 'index', function () { return this.current.head.n_ref; }]
36
+ }
37
+ };
38
+
39
+ var bgzf_hd_fmt = {
40
+ header: {
41
+ id1 : 'uint8',
42
+ id2 : 'uint8',
43
+ cm : 'uint8',
44
+ flg : 'uint8',
45
+ mtime : 'uint32',
46
+ xfl : 'uint8',
47
+ os : 'uint8',
48
+ xlen : 'uint16'
49
+ },
50
+ subheader: {
51
+ si1 : 'uint8',
52
+ si2 : 'uint8',
53
+ slen : 'uint16',
54
+ bsize : 'uint16'
55
+ },
56
+ bgzfHd: { head: 'header', subhead: 'subheader' }
57
+ };
58
+
59
+ var hdSize = 18;
60
+ var inflate = dallianceLib.inflateBuffer;
61
+ var _2p16 = 1 << 16;
62
+
63
+ var VCFReader = function (vcf, tbi) {
64
+ this.vcf_data = vcf;
65
+ this.tbi_data = tbi;
66
+ };
67
+
68
+ VCFReader.prototype.readTabix = function (cb) {
69
+ var bins2hash = function (binseq) {
70
+ var hash = {};
71
+ var i = 0;
72
+ var b;
73
+
74
+ for (var x in binseq) {
75
+ b = binseq[x].bin;
76
+ hash[b] = i;
77
+ i++;
78
+ }
79
+
80
+ return hash;
81
+ };
82
+
83
+ var parse_tabix = function (tabix_buffer) {
84
+ var tabix = new jParser(tabix_buffer, tabi_fmt).parse('tabix');
85
+
86
+ tabix.head.names = tabix.head.names.split('\0');
87
+ tabix.bhash = {};
88
+
89
+ for (var i = 0; i < tabix.head.n_ref; i++){
90
+ tabix.bhash[i] = bins2hash(tabix.indexseq[i].binseq);
91
+ }
92
+
93
+ cb(tabix);
94
+ };
95
+
96
+ this.inflateRegion(this.tbi_data, 0, 100000000, parse_tabix);
97
+ };
98
+
99
+ VCFReader.prototype.getRecords = function (ref, beg, end, callback) {
100
+ var records = [];
101
+ var chunks = this.getChunks(ref, beg, end);
102
+ var vcfThis = this;
103
+
104
+ if (chunks == -1) {
105
+ return callback([]);
106
+ }
107
+
108
+ (function loop(x) {
109
+ if (x < chunks.length) {
110
+ vcfThis.inflateRegion(vcfThis.vcf_data, chunks[x].start, chunks[x].end, function (record, ebsz) {
111
+ var last = record.byteLength - ebsz + chunks[x].inner_end;
112
+ record = vcfThis.buffer2String(record).slice(chunks[x].inner_start, last);
113
+
114
+ if (record.length > 0) {
115
+ record = record.split('\n').filter(function (rec) {
116
+ if (rec.length > 0) {
117
+ var n = parseInt(rec.split('\t')[1]);
118
+ return ((beg <= n) && (n <= end));
119
+ }
120
+ }).join('\n');
121
+
122
+ records.push(record);
123
+ }
124
+
125
+ loop(++x);
126
+ });
127
+ } else {
128
+ callback(records.join('\n'));
129
+ }
130
+ })(0);
131
+ };
132
+
133
+ VCFReader.prototype.getChunks = function (ref, beg, end) {
134
+ var tbi = this.tabix;
135
+ var vcfThis = this;
136
+
137
+ ref = tbi.head.names.indexOf(ref.toString());
138
+
139
+ if (ref == -1) {
140
+ return -1;
141
+ }
142
+
143
+ var bids = this.reg2bins(beg, end + 1).filter(function (x) { return typeof tbi.bhash[ref][x] != 'undefined'; });
144
+ var bcnks = bids.map(function (x) { return vcfThis.bin2Ranges(tbi, ref, x); });
145
+ var cnks = bcnks.reduce(function (V, ranges) {
146
+ ranges.forEach(function (item) { V.push(item); });
147
+ return V;
148
+ }, []);
149
+
150
+ cnks = this.remove_duplicates(cnks);
151
+
152
+ return cnks;
153
+ };
154
+
155
+ VCFReader.prototype.inflateRegion = function (d, beg, end, cbfn) {
156
+ var blocks = [];
157
+ var vcfThis = this;
158
+
159
+ var cb = function (block, nextBlockOffset) {
160
+ blocks.push(block);
161
+
162
+ if (nextBlockOffset == -1) {
163
+ cbfn(vcfThis.appendBuffers(blocks), blocks[blocks.length - 1].byteLength);
164
+ } else if (nextBlockOffset <= end) {
165
+ vcfThis.inflateBlock(d, nextBlockOffset, cb);
166
+ } else {
167
+ cbfn(vcfThis.appendBuffers(blocks), blocks[blocks.length - 1].byteLength);
168
+ }
169
+ };
170
+
171
+ this.inflateBlock(d, beg, cb);
172
+ };
173
+
174
+ VCFReader.prototype.inflateBlock = function (d, blockOffset, cbfn) {
175
+ var cb2 = function (hdobj) {
176
+ d.slice(blockOffset, hdobj.subhead.bsize + 1).fetch(function (block) {
177
+ var inflated_block = inflate(block, hdSize, block.byteLength - hdSize);
178
+ var nextBlockOffset = blockOffset + hdobj.subhead.bsize + 1;
179
+
180
+ if (hdobj.subhead.bsize == 27) {
181
+ nextBlockOffset = -1; // last bgzf block
182
+ }
183
+
184
+ cbfn(inflated_block, nextBlockOffset);
185
+ });
186
+ };
187
+
188
+ this.getBGZFHD(d, blockOffset, cb2);
189
+ };
190
+
191
+ VCFReader.prototype.getBGZFHD = function (d, offset, cbfn) {
192
+ d.slice(offset, hdSize + 1).fetch(function (buf) {
193
+ var parser = new jParser(buf, bgzf_hd_fmt);
194
+ var hdobj = parser.parse('bgzfHd');
195
+ cbfn(hdobj);
196
+ });
197
+ };
198
+
199
+ VCFReader.prototype.appendBuffers = function (bufferVec) {
200
+ var totalSize = 0;
201
+
202
+ for (var i = 0; i < bufferVec.length; i++) {
203
+ totalSize = totalSize + bufferVec[i].byteLength;
204
+ }
205
+
206
+ var tmp = new Uint8Array(totalSize);
207
+ var offset = 0;
208
+
209
+ for (i = 0; i < bufferVec.length; i++) {
210
+ tmp.set(new Uint8Array(bufferVec[i]), offset);
211
+ offset = offset + bufferVec[i].byteLength;
212
+ }
213
+
214
+ return tmp.buffer;
215
+ };
216
+
217
+ VCFReader.prototype.buffer2String = function (resultBuffer) {
218
+ var s = '';
219
+ var resultBB = new Uint8Array(resultBuffer);
220
+
221
+ for (var i = 0; i < resultBB.length; ++i) {
222
+ s += String.fromCharCode(resultBB[i]);
223
+ }
224
+
225
+ return s;
226
+ };
227
+
228
+ VCFReader.prototype.remove_duplicates = function (objectsArray) {
229
+ var usedObjects = {};
230
+
231
+ for (var i = objectsArray.length - 1; i >= 0; i--) {
232
+ var so = JSON.stringify(objectsArray[i]);
233
+
234
+ if (usedObjects[so]) {
235
+ objectsArray.splice(i, 1);
236
+ } else {
237
+ usedObjects[so] = true;
238
+ }
239
+ }
240
+
241
+ return objectsArray;
242
+ };
243
+
244
+ VCFReader.prototype.bin2Ranges = function (tbi, ref, binid) {
245
+ var ranges = [];
246
+ var bs = tbi.indexseq[ref].binseq;
247
+ var cnkseq = bs[tbi.bhash[ref][binid]].chunkseq;
248
+ var cnk;
249
+
250
+ for (var i = 0; i < cnkseq.length; i++) {
251
+ cnk = cnkseq[i];
252
+
253
+ ranges.push({
254
+ start : Math.floor(cnk.cnk_beg / _2p16),
255
+ inner_start : cnk.cnk_beg % _2p16,
256
+ end : Math.floor(cnk.cnk_end / _2p16),
257
+ inner_end : cnk.cnk_end % _2p16
258
+ });
259
+ }
260
+
261
+ return ranges;
262
+ };
263
+
264
+ VCFReader.prototype.reg2bins = function (beg, end) {
265
+ var list = [];
266
+ var i;
267
+
268
+ --end;
269
+
270
+ list.push(0);
271
+
272
+ for (i = 1 + (beg >> 26); i <= 1 + (end >> 26); ++i) { list.push(i); }
273
+ for (i = 9 + (beg >> 23); i <= 9 + (end >> 23); ++i) { list.push(i); }
274
+ for (i = 73 + (beg >> 20); i <= 73 + (end >> 20); ++i) { list.push(i); }
275
+ for (i = 585 + (beg >> 17); i <= 585 + (end >> 17); ++i) { list.push(i); }
276
+ for (i = 4681 + (beg >> 14); i <= 4681 + (end >> 14); ++i) { list.push(i); }
277
+
278
+ return list;
279
+ };
280
+
281
+ window.VCFReader = VCFReader;
282
+
283
+ if (typeof module === 'object' && typeof module.exports === 'object') {
284
+ module.exports = VCFReader;
285
+ }
286
+ })();