genoverse 3.2.0 → 4.0.0-beta1

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 (216) hide show
  1. package/.eslintrc.js +93 -162
  2. package/.github/workflows/test.yml +9 -10
  3. package/.github/workflows/update-gh-pages.yml +33 -0
  4. package/LICENSE.TXT +2 -2
  5. package/README.md +176 -3
  6. package/{i → assets}/sort_handle.png +0 -0
  7. package/babel.config.js +19 -0
  8. package/dist/129.css +334 -0
  9. package/dist/129.css.map +1 -0
  10. package/dist/129.genoverse.js +2 -0
  11. package/dist/129.genoverse.js.map +1 -0
  12. package/dist/15d98c18221c8bcb2334.ttf +0 -0
  13. package/dist/166.css +2 -0
  14. package/dist/166.genoverse.js +1 -0
  15. package/dist/216.css +20 -0
  16. package/dist/216.css.map +1 -0
  17. package/dist/232.css +114 -0
  18. package/dist/232.css.map +1 -0
  19. package/dist/232.genoverse.js +2 -0
  20. package/dist/232.genoverse.js.map +1 -0
  21. package/dist/2e659e443f3e98569e9f.png +0 -0
  22. package/dist/394.css +114 -0
  23. package/dist/394.css.map +1 -0
  24. package/dist/394.genoverse.js +2 -0
  25. package/dist/394.genoverse.js.map +1 -0
  26. package/dist/469.css +24 -0
  27. package/dist/469.css.map +1 -0
  28. package/dist/469.genoverse.js +2 -0
  29. package/dist/469.genoverse.js.map +1 -0
  30. package/dist/4896d4b04430cc3dfb06.woff2 +0 -0
  31. package/dist/530.css +39 -0
  32. package/dist/530.css.map +1 -0
  33. package/dist/530.genoverse.js +2 -0
  34. package/dist/530.genoverse.js.map +1 -0
  35. package/dist/547.css +469 -0
  36. package/dist/547.css.map +1 -0
  37. package/dist/547.genoverse.js +1 -0
  38. package/dist/729.css +315 -0
  39. package/dist/729.css.map +1 -0
  40. package/dist/79da213423ac0def2058.ttf +0 -0
  41. package/dist/804.genoverse.js +2 -0
  42. package/dist/804.genoverse.js.map +1 -0
  43. package/dist/842.genoverse.js +2 -0
  44. package/dist/842.genoverse.js.map +1 -0
  45. package/dist/893.genoverse.js +2 -0
  46. package/dist/893.genoverse.js.map +1 -0
  47. package/dist/949.css +315 -0
  48. package/dist/949.css.map +1 -0
  49. package/dist/949.genoverse.js +2 -0
  50. package/dist/949.genoverse.js.map +1 -0
  51. package/dist/952.css +315 -0
  52. package/dist/952.css.map +1 -0
  53. package/dist/952.genoverse.js +2 -0
  54. package/dist/952.genoverse.js.map +1 -0
  55. package/dist/d79c2ec96ab9ff1161a2.woff2 +0 -0
  56. package/dist/genoverse.js +2 -0
  57. package/dist/genoverse.js.map +1 -0
  58. package/index.html +13 -14
  59. package/jest.config.js +5 -0
  60. package/jest.setup.js +13 -0
  61. package/package.json +29 -12
  62. package/{css → src/css}/controlPanel.css +0 -0
  63. package/{css → src/css}/fileDrop.css +0 -0
  64. package/src/css/fontawesome.css +3 -0
  65. package/{css → src/css}/fullscreen.css +0 -0
  66. package/{css → src/css}/genoverse.css +1 -1
  67. package/{css → src/css}/karyotype.css +2 -0
  68. package/{css → src/css}/resizer.css +0 -0
  69. package/{css → src/css}/tooltips.css +0 -0
  70. package/{css → src/css}/trackControls.css +0 -0
  71. package/src/js/Genoverse.js +1747 -0
  72. package/{js → src/js}/Track/Controller/Sequence.js +6 -4
  73. package/src/js/Track/Controller/Stranded.js +83 -0
  74. package/{js → src/js}/Track/Controller.js +201 -160
  75. package/src/js/Track/Model/File/BAM.js +47 -0
  76. package/src/js/Track/Model/File/BED.js +122 -0
  77. package/src/js/Track/Model/File/GFF.js +42 -0
  78. package/src/js/Track/Model/File/VCF.js +109 -0
  79. package/src/js/Track/Model/File/WIG.js +82 -0
  80. package/src/js/Track/Model/File.js +36 -0
  81. package/src/js/Track/Model/Gene/Ensembl.js +24 -0
  82. package/{js → src/js}/Track/Model/Gene.js +3 -1
  83. package/src/js/Track/Model/Sequence/Ensembl.js +6 -0
  84. package/{js → src/js}/Track/Model/Sequence/Fasta.js +24 -17
  85. package/{js → src/js}/Track/Model/Sequence.js +10 -7
  86. package/{js → src/js}/Track/Model/SequenceVariation.js +17 -11
  87. package/{js → src/js}/Track/Model/Stranded.js +11 -8
  88. package/src/js/Track/Model/Transcript/Ensembl.js +73 -0
  89. package/{js → src/js}/Track/Model/Transcript.js +3 -1
  90. package/{js → src/js}/Track/Model.js +128 -97
  91. package/{js → src/js}/Track/View/Gene/Ensembl.js +6 -4
  92. package/src/js/Track/View/Gene.js +8 -0
  93. package/{js → src/js}/Track/View/Sequence.js +18 -22
  94. package/src/js/Track/View/SequenceVariation.js +117 -0
  95. package/src/js/Track/View/Transcript/Ensembl.js +17 -0
  96. package/src/js/Track/View/Transcript.js +32 -0
  97. package/{js → src/js}/Track/View.js +200 -159
  98. package/{js → src/js}/Track/library/Chromosome.js +18 -13
  99. package/src/js/Track/library/File/BAM.js +34 -0
  100. package/src/js/Track/library/File/BED.js +27 -0
  101. package/src/js/Track/library/File/BIGBED.js +51 -0
  102. package/src/js/Track/library/File/BIGWIG.js +54 -0
  103. package/src/js/Track/library/File/GFF.js +10 -0
  104. package/{js → src/js}/Track/library/File/VCF.js +29 -22
  105. package/src/js/Track/library/File/WIG.js +8 -0
  106. package/{js → src/js}/Track/library/File.js +4 -2
  107. package/src/js/Track/library/Gene.js +44 -0
  108. package/src/js/Track/library/Graph/Bar.js +263 -0
  109. package/src/js/Track/library/Graph/Line.js +335 -0
  110. package/{js → src/js}/Track/library/Graph.js +137 -114
  111. package/{js → src/js}/Track/library/HighlightRegion.js +118 -93
  112. package/src/js/Track/library/Legend.js +258 -0
  113. package/{js → src/js}/Track/library/Scalebar.js +69 -49
  114. package/{js → src/js}/Track/library/Scaleline.js +29 -27
  115. package/src/js/Track/library/Static.js +82 -0
  116. package/{js → src/js}/Track/library/dbSNP.js +47 -50
  117. package/src/js/Track.js +649 -0
  118. package/{js → src/js}/genomes/grch37.js +52 -52
  119. package/{js → src/js}/genomes/grch38.js +52 -52
  120. package/src/js/lib/BWReader.js +562 -0
  121. package/src/js/lib/VCFReader.js +296 -0
  122. package/src/js/lib/dalliance/bam.js +517 -0
  123. package/src/js/lib/dalliance/bin.js +317 -0
  124. package/src/js/lib/dalliance/jszlib-inflate.js +2159 -0
  125. package/src/js/lib/dalliance/lh3utils.js +105 -0
  126. package/src/js/lib/dalliance/sha1.js +334 -0
  127. package/src/js/lib/import-tracks.js +42 -0
  128. package/{js/lib → src/js/lib/jquery-plugins}/jquery.mousehold.js +0 -0
  129. package/{js/lib → src/js/lib/jquery-plugins}/jquery.mousewheel.js +0 -0
  130. package/{js/lib → src/js/lib/jquery-plugins}/jquery.tipsy.js +0 -0
  131. package/src/js/lib/jquery.js +26 -0
  132. package/src/js/lib/polyfills.js +11 -0
  133. package/src/js/lib/wrap-functions.js +88 -0
  134. package/src/js/plugins/controlPanel.js +388 -0
  135. package/src/js/plugins/fileDrop.js +81 -0
  136. package/src/js/plugins/focusRegion.js +13 -0
  137. package/{js → src/js}/plugins/fullscreen.js +18 -14
  138. package/{js → src/js}/plugins/karyotype.js +51 -45
  139. package/src/js/plugins/resizer.js +52 -0
  140. package/{js → src/js}/plugins/tooltips.js +31 -29
  141. package/src/js/plugins/trackControls.js +159 -0
  142. package/test/View/render-legends.test.js +1 -1
  143. package/test/create-and-destroy.test.js +2 -2
  144. package/test/track-ordering.test.js +3 -2
  145. package/test/track_config/config-settings.test.js +1 -1
  146. package/test/utils.js +4 -2
  147. package/webpack.config.js +103 -34
  148. package/css/font-awesome.css +0 -3
  149. package/expanded.html +0 -120
  150. package/fontawesome/css/fontawesome.min.css +0 -5
  151. package/fontawesome/css/regular.min.css +0 -5
  152. package/fontawesome/css/solid.min.css +0 -5
  153. package/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  154. package/fontawesome/webfonts/fa-brands-400.woff +0 -0
  155. package/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  156. package/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  157. package/fontawesome/webfonts/fa-regular-400.woff +0 -0
  158. package/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  159. package/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  160. package/fontawesome/webfonts/fa-solid-900.woff +0 -0
  161. package/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  162. package/help.pdf +0 -0
  163. package/index.js +0 -83
  164. package/js/Genoverse.js +0 -1681
  165. package/js/Track/Controller/Stranded.js +0 -73
  166. package/js/Track/Model/File/BAM.js +0 -44
  167. package/js/Track/Model/File/BED.js +0 -116
  168. package/js/Track/Model/File/GFF.js +0 -40
  169. package/js/Track/Model/File/VCF.js +0 -101
  170. package/js/Track/Model/File/WIG.js +0 -67
  171. package/js/Track/Model/File.js +0 -36
  172. package/js/Track/Model/Gene/Ensembl.js +0 -22
  173. package/js/Track/Model/Sequence/Ensembl.js +0 -4
  174. package/js/Track/Model/Transcript/Ensembl.js +0 -67
  175. package/js/Track/View/Gene.js +0 -6
  176. package/js/Track/View/Sequence/Variation.js +0 -115
  177. package/js/Track/View/Transcript/Ensembl.js +0 -12
  178. package/js/Track/View/Transcript.js +0 -28
  179. package/js/Track/library/File/BAM.js +0 -30
  180. package/js/Track/library/File/BED.js +0 -24
  181. package/js/Track/library/File/BIGBED.js +0 -47
  182. package/js/Track/library/File/BIGWIG.js +0 -52
  183. package/js/Track/library/File/GFF.js +0 -9
  184. package/js/Track/library/File/WIG.js +0 -5
  185. package/js/Track/library/Gene.js +0 -37
  186. package/js/Track/library/Graph/Bar.js +0 -235
  187. package/js/Track/library/Graph/Line.js +0 -296
  188. package/js/Track/library/Legend.js +0 -224
  189. package/js/Track/library/Static.js +0 -78
  190. package/js/Track.js +0 -632
  191. package/js/genoverse.min.js +0 -2
  192. package/js/genoverse.min.js.map +0 -1
  193. package/js/lib/BWReader.js +0 -578
  194. package/js/lib/Base.js +0 -145
  195. package/js/lib/VCFReader.js +0 -286
  196. package/js/lib/dalliance/js/bam.js +0 -494
  197. package/js/lib/dalliance/js/bin.js +0 -185
  198. package/js/lib/dalliance/js/das.js +0 -749
  199. package/js/lib/dalliance/js/utils.js +0 -370
  200. package/js/lib/dalliance-lib.js +0 -3594
  201. package/js/lib/dalliance-lib.min.js +0 -68
  202. package/js/lib/jDataView.js +0 -2
  203. package/js/lib/jParser.js +0 -192
  204. package/js/lib/jquery-ui.js +0 -8
  205. package/js/lib/jquery.js +0 -2
  206. package/js/lib/rtree.js +0 -1
  207. package/js/plugins/controlPanel.js +0 -395
  208. package/js/plugins/fileDrop.js +0 -62
  209. package/js/plugins/focusRegion.js +0 -12
  210. package/js/plugins/resizer.js +0 -45
  211. package/js/plugins/trackControls.js +0 -143
  212. package/utils/expandedTemplate.html +0 -46
  213. package/utils/git-hooks/post-commit +0 -9
  214. package/utils/git-hooks/pre-commit +0 -7
  215. package/utils/git-hooks/setup +0 -6
  216. package/utils/makeExpanded.js +0 -19
@@ -1,296 +0,0 @@
1
- Genoverse.Track.Controller.Graph.Line = {
2
- click: function () {
3
- if (this.prop('showPopups')) {
4
- this.prop('menus').hide(); // Hide first, because closeMenus causes fadeOut to happen, which doens't look great in this scenario
5
- this.browser.closeMenus(this);
6
- return Genoverse.Track.Controller.prototype.click.apply(this, arguments);
7
- }
8
- },
9
-
10
- getClickedFeatures: function (x) {
11
- var bounds = { x: x, y: 0, w: 1, h: 9e99 };
12
- var tolerance = this.scale > 1 ? 0 : 1 / this.scale;
13
- var xMid = bounds.x / this.scale;
14
- var xRange = tolerance ? [ Math.floor(xMid - tolerance), Math.ceil(xMid + tolerance) ] : [ Math.floor(xMid), Math.floor(xMid) ];
15
- var features = {};
16
-
17
- this.featurePositions.search(bounds).forEach(function (f) {
18
- if (!features[f.dataset]) {
19
- features[f.dataset] = f;
20
- }
21
- });
22
-
23
- return [
24
- this.model.sortFeatures(Object.keys(features).map(function (k) {
25
- return $.extend(true, {}, features[k], { clickedCoords: features[k].coords.filter(function (c) { return c[0] >= xRange[0] && c[0] <= xRange[1]; }) });
26
- }))
27
- ];
28
- },
29
-
30
- populateMenu: function (features) {
31
- if (!features.length || !features[0].clickedCoords.length) {
32
- return [];
33
- }
34
-
35
- var start = features[0].clickedCoords[0][0];
36
- var end = features[0].clickedCoords[features[0].clickedCoords.length - 1][0];
37
- var avg = start !== end;
38
- var menu = { title: features[0].chr + ':' + (start === end ? start : start + '-' + end) };
39
- var m, values, i;
40
-
41
- function getValues(coords) {
42
- var vals = coords.map(function (c) { return c[1]; }).sort(function (a, b) { return a - b; });
43
-
44
- return {
45
- avg : vals.reduce(function (n, v) { return n + v; }, 0) / vals.length,
46
- min : vals[0],
47
- max : vals[vals.length - 1]
48
- };
49
- }
50
-
51
- if (avg) {
52
- if (features.length === 1) {
53
- values = getValues(features[0].clickedCoords);
54
-
55
- menu['Average value'] = values.avg;
56
- menu['Min value'] = values.min;
57
- menu['Max value'] = values.max;
58
- } else {
59
- menu = [ menu ];
60
-
61
- for (i = 0; i < features.length; i++) {
62
- values = getValues(features[i].clickedCoords);
63
- m = { title: features[i].dataset };
64
- m.Average = values.avg;
65
- m.Min = values.min;
66
- m.Max = values.max;
67
-
68
- menu.push(m);
69
- }
70
- }
71
- } else if (features.length === 1) {
72
- menu.Value = features[0].clickedCoords[0][1];
73
- } else {
74
- for (i = 0; i < features.length; i++) {
75
- menu[features[i].dataset] = features[i].clickedCoords[0][1];
76
- }
77
- }
78
-
79
- return menu;
80
- }
81
- };
82
-
83
- Genoverse.Track.Model.Graph.Line = Genoverse.Track.Model.Graph.extend({
84
- parseData: function (data, chr, start, end) {
85
- var features = [];
86
- var feature, x;
87
-
88
- function getX(f) {
89
- return typeof f.x !== 'undefined' ? f.x : f.start + (f.start === f.end ? 0 : (f.end - f.start + 1) / 2);
90
- }
91
-
92
- data.sort(function (a, b) { return (a.start - b.start) || (a.x - b.x); });
93
-
94
- for (var i = 0; i < data.length; i++) {
95
- if (typeof data[i].y !== 'undefined' && !data[i].coords) {
96
- x = getX(data[i]);
97
-
98
- if (feature && feature.coords[feature.coords.length - 1][0] === x - 1) {
99
- feature.coords.push([ x, data[i].y ]);
100
- feature.end = x;
101
- } else {
102
- if (feature) {
103
- features.push(feature);
104
- }
105
-
106
- feature = $.extend({ coords: [[ x, data[i].y ]], start: x, end: x }, data[i]);
107
- }
108
- } else {
109
- if (feature) {
110
- features.push(feature);
111
- feature = undefined;
112
- }
113
-
114
- features.push(data[i]);
115
- }
116
- }
117
-
118
- if (feature) {
119
- features.push(feature);
120
- }
121
-
122
- return this.base(features, chr, start, end);
123
- },
124
-
125
- insertFeature: function (feature) {
126
- var datasets = this.prop('datasets');
127
-
128
- if (feature.coords) {
129
- feature.coords = feature.coords.map(function (c, i) { return c.length > 1 ? c : [ feature.start + i, c ]; }).filter(function (c) { return c[0] >= feature.start && c[0] <= feature.end; });
130
- } else if (feature.y) {
131
- feature.coords = [[ feature.start + (feature.start === feature.end ? 0 : (feature.end - feature.start + 1) / 2), feature.y ]];
132
- } else {
133
- feature.coords = [];
134
- }
135
-
136
- if (datasets.length) {
137
- feature.legend = feature.dataset;
138
- feature.color = (datasets.filter(function (s) { return s.name === feature.dataset; })[0] || { color: this.color }).color;
139
- }
140
-
141
- feature.id = feature.id || [ feature.chr, feature.start, feature.end, feature.dataset || '' ].join(':');
142
-
143
- return this.base.apply(this, arguments);
144
- }
145
- });
146
-
147
- Genoverse.Track.View.Graph.Line = Genoverse.Track.View.Graph.extend({
148
- featureHeight: 1,
149
-
150
- positionFeatures: function (features, params) {
151
- var scale = params.scale;
152
- var yScale = this.track.getYScale();
153
- var margin = this.prop('marginTop');
154
- var zeroY = margin - this.prop('range')[0] * yScale;
155
- var add = (scale > 1 ? scale / 2 : 0) - params.scaledStart;
156
-
157
- function setCoords(c) {
158
- return [ c[0] * scale + add, c[1] * yScale + zeroY ];
159
- }
160
-
161
- for (var i = 0; i < features.length; i++) {
162
- features[i].coordPositions = features[i].coords.map(setCoords);
163
- }
164
-
165
- params.featureHeight = this.prop('height');
166
-
167
- return this.base(features, params);
168
- },
169
-
170
- draw: function (features, featureContext, labelContext, scale) {
171
- if (!features.length) {
172
- return;
173
- }
174
-
175
- var datasets = this.featureDataSets(features);
176
- var height = this.prop('height');
177
- var marginTop = this.prop('marginTop');
178
- var marginBottom = this.prop('margin');
179
- var baseline = Math.min(Math.max(marginTop, marginTop - this.prop('range')[0] * this.track.getYScale()), height - marginTop);
180
- var binSize = scale < 1 ? Math.floor(1 / scale) : 0;
181
- var set, conf, feature, coords, binnedFeatures, lastBinSize, j, k, binStart, bin, l, prevFeature, prevCoords;
182
-
183
- var defaults = {
184
- color : this.color,
185
- fill : this.prop('fill'),
186
- lineWidth : this.prop('lineWidth'),
187
- globalAlpha : this.prop('globalAlpha')
188
- };
189
-
190
- for (var i = 0; i < datasets.list.length; i++) {
191
- set = datasets.list[i].name;
192
- conf = $.extend({}, defaults, datasets.list[i]);
193
-
194
- for (j = 0; j < (datasets.features[set] || []).length; j++) {
195
- feature = datasets.features[set][j];
196
- coords = feature.coordPositions;
197
-
198
- if (coords.length) {
199
- if (binSize) {
200
- binnedFeatures = [];
201
- k = 0;
202
-
203
- while (k < coords.length) {
204
- binStart = feature.coords[k][0];
205
- bin = [];
206
-
207
- while (coords[k] && feature.coords[k][0] - binStart < binSize) {
208
- bin.push(coords[k++]);
209
- }
210
-
211
- l = bin.length;
212
- bin = bin.reduce(function (arr, b) { arr[0] += b[0]; arr[1] += b[1]; return arr; }, [ 0, 0 ]);
213
- bin[0] = Math.round(bin[0] / l);
214
-
215
- if (binnedFeatures.length && bin[0] === binnedFeatures[binnedFeatures.length - 1][0]) {
216
- binnedFeatures[binnedFeatures.length - 1][1] = (binnedFeatures[binnedFeatures.length - 1][1] * lastBinSize + bin[1]) / (lastBinSize + l);
217
- } else {
218
- binnedFeatures.push([ bin[0], bin[1] / l ]);
219
- }
220
-
221
- lastBinSize = l;
222
- }
223
-
224
- coords = binnedFeatures;
225
- feature.binnedCoords = coords;
226
- }
227
-
228
- featureContext.fillStyle = featureContext.strokeStyle = conf.color;
229
- featureContext.lineWidth = conf.lineWidth;
230
-
231
- if (conf.fill) {
232
- featureContext.globalAlpha = conf.globalAlpha;
233
- }
234
-
235
- featureContext.beginPath();
236
-
237
- if (conf.fill) {
238
- featureContext.moveTo(coords[0][0], baseline);
239
- featureContext.lineTo.apply(featureContext, coords[0]);
240
- } else {
241
- featureContext.moveTo.apply(featureContext, coords[0]);
242
- }
243
-
244
- for (k = 1; k < coords.length; k++) {
245
- featureContext.lineTo.apply(featureContext, coords[k]);
246
- }
247
-
248
- featureContext.stroke();
249
-
250
- if (conf.fill) {
251
- featureContext.lineTo(coords[coords.length - 1][0], baseline);
252
- featureContext.closePath();
253
- featureContext.fill();
254
- }
255
-
256
- prevFeature = j ? datasets.features[set][j - i] : undefined;
257
-
258
- if (prevFeature && prevFeature.end === feature.start - 1) {
259
- featureContext.beginPath();
260
-
261
- prevCoords = (binSize ? prevFeature.binnedCoords : prevFeature.coordPositions).slice(-1);
262
-
263
- featureContext.moveTo.apply(featureContext, prevCoords[0]);
264
- featureContext.lineTo.apply(featureContext, coords[0]);
265
- featureContext.stroke();
266
-
267
- if (conf.fill) {
268
- featureContext.lineTo(coords[0][0], baseline);
269
- featureContext.lineTo(prevCoords[0][0], baseline);
270
-
271
- featureContext.closePath();
272
- featureContext.fill();
273
- }
274
- }
275
-
276
- if (conf.fill) {
277
- featureContext.globalAlpha = 1;
278
- }
279
- }
280
- }
281
- }
282
-
283
- // Don't allow features to be drawn in the margins
284
- featureContext.clearRect(0, 0, this.width, marginTop - 1);
285
- featureContext.clearRect(0, height - marginBottom, this.width, marginBottom);
286
- }
287
- });
288
-
289
- Genoverse.Track.Graph.Line = Genoverse.Track.Graph.extend({
290
- type : 'Line',
291
- showPopups : true, // If true, clicking on the track will show popups. If false, popups will not appear.
292
- fill : false,
293
- lineWidth : 1,
294
- model : Genoverse.Track.Model.Graph.Line,
295
- view : Genoverse.Track.View.Graph.Line
296
- });
@@ -1,224 +0,0 @@
1
- Genoverse.Track.Controller.Legend = Genoverse.Track.Controller.Static.extend({
2
- init: function () {
3
- this.base();
4
-
5
- this.container.addClass('gv-track-container-legend');
6
-
7
- this.browser.legends[this.track.id] = this.track;
8
-
9
- this.track.setTracks();
10
- },
11
-
12
- destroy: function () {
13
- delete this.browser.legends[this.prop('id')];
14
- this.base();
15
- }
16
- });
17
-
18
- Genoverse.Track.Model.Legend = Genoverse.Track.Model.Static.extend({
19
- findFeatures: function () {
20
- var bounds = { x: this.browser.scaledStart, y: 0, w: this.width };
21
- var features = {};
22
-
23
- $.each($.map(this.track.tracks, function (track) {
24
- var featurePositions = track.prop('featurePositions');
25
- bounds.h = track.prop('height');
26
- return featurePositions ? featurePositions.search(bounds).concat(track.prop('labelPositions').search(bounds)) : [];
27
- }), function () {
28
- if (Array.isArray(this.legend)) {
29
- this.legend.forEach(function (legend) { features[legend.label] = legend.color; });
30
- } else if (this.legend) {
31
- features[this.legend] = this.legendColor || this.color;
32
- }
33
- });
34
-
35
- return this.sortFeatures($.map(features, function (color, text) { return [[ text, color ]]; }));
36
- },
37
-
38
- sortFeatures: function (features) {
39
- // sort legend alphabetically
40
- return features.sort(function (a, b) { return a[0].localeCompare(b[0]); });
41
- }
42
- });
43
-
44
- Genoverse.Track.View.Legend = Genoverse.Track.View.Static.extend({
45
- textColor : '#000000',
46
- labels : 'overlay',
47
- featureHeight : 12,
48
-
49
- positionFeatures: function (f, params) {
50
- if (params.positioned) {
51
- return f;
52
- }
53
-
54
- var cols = 2;
55
- var pad = 5;
56
- var w = 20;
57
- var x = 0;
58
- var y = 0;
59
- var xScale = this.width / cols;
60
- var yScale = this.fontHeight + pad;
61
- var features = [];
62
- var xOffest = params.xOffset || 0;
63
- var xPos, yPos, labelWidth;
64
-
65
- for (var i = 0; i < f.length; i++) {
66
- xPos = (x * xScale) + pad;
67
- yPos = (y * yScale) + pad;
68
- labelWidth = this.context.measureText(f[i][0]).width;
69
-
70
- features.push(
71
- { x: xPos + xOffest, y: yPos, width: w, height: this.featureHeight, color: f[i][1] },
72
- { x: xPos + xOffest + pad + w, y: yPos, width: labelWidth + 1, height: this.featureHeight, color: false, labelColor: this.textColor, labelWidth: labelWidth, label: f[i][0] }
73
- );
74
-
75
- if (++x === cols) {
76
- x = 0;
77
- y++;
78
- }
79
- }
80
-
81
- params.height = this.prop('height', f.length ? ((y + (x ? 1 : 0)) * yScale) + pad : 0);
82
- params.width = this.width;
83
- params.positioned = true;
84
-
85
- return this.base(features, params);
86
- }
87
- });
88
-
89
- Genoverse.Track.Legend = Genoverse.Track.Static.extend({
90
- unsortable : true,
91
- lockToTrack : true, // Always put the legend just below the last track that the legend is for
92
- removable : false,
93
-
94
- controller : Genoverse.Track.Controller.Legend,
95
- model : Genoverse.Track.Model.Legend,
96
- view : Genoverse.Track.View.Legend,
97
-
98
- setDefaults: function () {
99
- this.order = typeof this.order !== 'undefined' ? this.order : 9e99;
100
- this.id = this.id || 'legend';
101
- this.type = this.type || 'legend';
102
- this.base();
103
- },
104
-
105
- setEvents: function () {
106
- this.browser.on({
107
- 'afterAddTracks afterRemoveTracks': function () {
108
- for (var i in this.legends) {
109
- this.legends[i].setTracks();
110
- }
111
-
112
- this.sortTracks();
113
- },
114
- afterRemoveTracks: function (tracks) {
115
- var i;
116
-
117
- for (i in tracks) {
118
- if (tracks[i].legendTrack && tracks[i].legendTrack.tracks.length === 0) {
119
- tracks[i].legendTrack.remove();
120
- }
121
- }
122
-
123
- for (i in this.legends) {
124
- this.legends[i].controller.makeImage({});
125
- }
126
- },
127
- afterUpdateTrackOrder: function (e, ui) {
128
- var track = ui.item.data('track');
129
- var legendTrack = this.legends[track.id] || track.legendTrack;
130
-
131
- // If a legend track, or a track with a sortable legend has been reordered, its lockToTrack status is ignored from now on.
132
- // This allows a legend to initially be locked to a track, but then to be reordered once the browser has been initialized
133
- if (legendTrack && legendTrack.lockToTrack && legendTrack.unsortable === false) {
134
- legendTrack.lockToTrack = false;
135
- }
136
-
137
- for (var i in this.legends) {
138
- this.legends[i].updateOrder();
139
- }
140
-
141
- this.sortTracks();
142
- }
143
- });
144
-
145
- this.browser.on({
146
- afterPositionFeatures: function (features, params) {
147
- var legend = this.prop('legendTrack');
148
-
149
- if (legend) {
150
- setTimeout(function () { legend.controller.makeImage(params); }, 1);
151
- }
152
- },
153
- afterResize: function (height, userResize) {
154
- var legend = this.prop('legendTrack');
155
-
156
- if (legend && userResize === true) {
157
- legend.controller.makeImage({});
158
- }
159
- },
160
- afterCheckHeight: function () {
161
- var legend = this.prop('legendTrack');
162
-
163
- if (legend) {
164
- legend.controller.makeImage({});
165
- }
166
- },
167
- afterSetMVC: function () {
168
- var legend = this.prop('legendTrack');
169
-
170
- if (legend && legend.tracks.length) {
171
- legend.disable();
172
-
173
- if (this.legend !== false) {
174
- legend.enable();
175
- }
176
- }
177
- }
178
- }, this);
179
- },
180
-
181
- setTracks: function () {
182
- var legend = this;
183
- var type = this.type;
184
-
185
- this.tracks = $.map(this.browser.tracks.filter(function (t) {
186
- if (t.legendType === type) {
187
- t.legendTrack = t.legendTrack || legend;
188
- return true;
189
- }
190
-
191
- return false;
192
- }), function (track) {
193
- return [ track ].concat(track.prop('childTracks'), track.prop('parentTrack')).filter(function (t) { return t && t !== legend && !t.prop('disabled'); });
194
- });
195
-
196
- this.updateOrder();
197
-
198
- if (typeof this.controller === 'object') {
199
- this[this.tracks.length ? 'enable' : 'disable']();
200
- } else {
201
- this.disabled = !this.tracks.length;
202
- }
203
- },
204
-
205
- updateOrder: function () {
206
- if (this.lockToTrack) {
207
- var tracks = this.tracks.filter(function (t) { return !t.prop('parentTrack'); });
208
-
209
- if (tracks.length) {
210
- this.order = tracks[tracks.length - 1].order + 0.1;
211
- }
212
- }
213
- },
214
-
215
- enable: function () {
216
- this.base();
217
- this.controller.makeImage({});
218
- },
219
-
220
- disable: function () {
221
- delete this.controller.stringified;
222
- this.base();
223
- }
224
- });
@@ -1,78 +0,0 @@
1
- Genoverse.Track.Controller.Static = Genoverse.Track.Controller.extend({
2
- addDomElements: function () {
3
- this.base();
4
-
5
- this.image = $('<img>').appendTo(this.imgContainer);
6
-
7
- this.container.toggleClass('gv-track-container gv-track-container-static').prepend(this.imgContainer);
8
- this.scrollContainer.add(this.messageContainer).remove();
9
- },
10
-
11
- reset: function () {
12
- delete this.stringified;
13
- this.base.apply(this, arguments);
14
- },
15
-
16
- setWidth: function (width) {
17
- this.base(width);
18
- this.image.width = this.width;
19
- },
20
-
21
- makeFirstImage: function () {
22
- this.base.apply(this, arguments);
23
- this.container.css('left', 0);
24
- this.imgContainer.show();
25
- },
26
-
27
- makeImage: function (params) {
28
- if (this.prop('disabled')) {
29
- return $.Deferred().resolve();
30
- }
31
-
32
- var features = this.view.positionFeatures(this.model.findFeatures(params.chr, params.start, params.end), params);
33
-
34
- if (features) {
35
- var string = JSON.stringify(features);
36
-
37
- if (this.stringified !== string) {
38
- var height = this.prop('height');
39
-
40
- params.width = this.width;
41
- params.featureHeight = height;
42
-
43
- this.render(features, this.image.data(params));
44
- this.imgContainer.children(':last').show();
45
- this.resize(height, undefined, false);
46
-
47
- this.stringified = string;
48
- }
49
- }
50
-
51
- return $.Deferred().resolve();
52
- }
53
- });
54
-
55
- Genoverse.Track.Model.Static = Genoverse.Track.Model.extend({
56
- url : false,
57
- checkDataRange : function () { return true; }
58
- });
59
-
60
- Genoverse.Track.View.Static = Genoverse.Track.View.extend({
61
- featureMargin : { top: 0, right: 1, bottom: 0, left: 1 },
62
- positionFeature : $.noop,
63
- scaleFeatures : function (features) { return features; },
64
-
65
- draw: function (features, featureContext, labelContext, scale) {
66
- for (var i = 0; i < features.length; i++) {
67
- this.drawFeature(features[i], featureContext, labelContext, scale);
68
- }
69
- }
70
- });
71
-
72
- Genoverse.Track.Static = Genoverse.Track.extend({
73
- controls : 'off',
74
- resizable : false,
75
- controller : Genoverse.Track.Controller.Static,
76
- model : Genoverse.Track.Model.Static,
77
- view : Genoverse.Track.View.Static
78
- });