genoverse 3.2.0 → 4.0.1

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 (217) 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 +174 -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 +125 -93
  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 +651 -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/change-width.test.js +71 -0
  144. package/test/create-and-destroy.test.js +2 -2
  145. package/test/track-ordering.test.js +3 -2
  146. package/test/track_config/config-settings.test.js +1 -1
  147. package/test/utils.js +4 -2
  148. package/webpack.config.js +103 -34
  149. package/css/font-awesome.css +0 -3
  150. package/expanded.html +0 -120
  151. package/fontawesome/css/fontawesome.min.css +0 -5
  152. package/fontawesome/css/regular.min.css +0 -5
  153. package/fontawesome/css/solid.min.css +0 -5
  154. package/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  155. package/fontawesome/webfonts/fa-brands-400.woff +0 -0
  156. package/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  157. package/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  158. package/fontawesome/webfonts/fa-regular-400.woff +0 -0
  159. package/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  160. package/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  161. package/fontawesome/webfonts/fa-solid-900.woff +0 -0
  162. package/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  163. package/help.pdf +0 -0
  164. package/index.js +0 -83
  165. package/js/Genoverse.js +0 -1681
  166. package/js/Track/Controller/Stranded.js +0 -73
  167. package/js/Track/Model/File/BAM.js +0 -44
  168. package/js/Track/Model/File/BED.js +0 -116
  169. package/js/Track/Model/File/GFF.js +0 -40
  170. package/js/Track/Model/File/VCF.js +0 -101
  171. package/js/Track/Model/File/WIG.js +0 -67
  172. package/js/Track/Model/File.js +0 -36
  173. package/js/Track/Model/Gene/Ensembl.js +0 -22
  174. package/js/Track/Model/Sequence/Ensembl.js +0 -4
  175. package/js/Track/Model/Transcript/Ensembl.js +0 -67
  176. package/js/Track/View/Gene.js +0 -6
  177. package/js/Track/View/Sequence/Variation.js +0 -115
  178. package/js/Track/View/Transcript/Ensembl.js +0 -12
  179. package/js/Track/View/Transcript.js +0 -28
  180. package/js/Track/library/File/BAM.js +0 -30
  181. package/js/Track/library/File/BED.js +0 -24
  182. package/js/Track/library/File/BIGBED.js +0 -47
  183. package/js/Track/library/File/BIGWIG.js +0 -52
  184. package/js/Track/library/File/GFF.js +0 -9
  185. package/js/Track/library/File/WIG.js +0 -5
  186. package/js/Track/library/Gene.js +0 -37
  187. package/js/Track/library/Graph/Bar.js +0 -235
  188. package/js/Track/library/Graph/Line.js +0 -296
  189. package/js/Track/library/Legend.js +0 -224
  190. package/js/Track/library/Static.js +0 -78
  191. package/js/Track.js +0 -632
  192. package/js/genoverse.min.js +0 -2
  193. package/js/genoverse.min.js.map +0 -1
  194. package/js/lib/BWReader.js +0 -578
  195. package/js/lib/Base.js +0 -145
  196. package/js/lib/VCFReader.js +0 -286
  197. package/js/lib/dalliance/js/bam.js +0 -494
  198. package/js/lib/dalliance/js/bin.js +0 -185
  199. package/js/lib/dalliance/js/das.js +0 -749
  200. package/js/lib/dalliance/js/utils.js +0 -370
  201. package/js/lib/dalliance-lib.js +0 -3594
  202. package/js/lib/dalliance-lib.min.js +0 -68
  203. package/js/lib/jDataView.js +0 -2
  204. package/js/lib/jParser.js +0 -192
  205. package/js/lib/jquery-ui.js +0 -8
  206. package/js/lib/jquery.js +0 -2
  207. package/js/lib/rtree.js +0 -1
  208. package/js/plugins/controlPanel.js +0 -395
  209. package/js/plugins/fileDrop.js +0 -62
  210. package/js/plugins/focusRegion.js +0 -12
  211. package/js/plugins/resizer.js +0 -45
  212. package/js/plugins/trackControls.js +0 -143
  213. package/utils/expandedTemplate.html +0 -46
  214. package/utils/git-hooks/post-commit +0 -9
  215. package/utils/git-hooks/pre-commit +0 -7
  216. package/utils/git-hooks/setup +0 -6
  217. package/utils/makeExpanded.js +0 -19
@@ -1,4 +1,7 @@
1
- Genoverse.Track.Scalebar = Genoverse.Track.extend({
1
+ import RTree from 'rtree';
2
+ import Track from '../../Track';
3
+
4
+ export default Track.extend({
2
5
  unsortable : true,
3
6
  fixedOrder : true,
4
7
  order : 0,
@@ -15,18 +18,18 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
15
18
  labels : true,
16
19
  bump : false,
17
20
  resizable : false,
18
- click : $.noop,
21
+ click : () => {},
19
22
  colors : {
20
23
  majorGuideLine : '#CCCCCC',
21
- minorGuideLine : '#E5E5E5'
24
+ minorGuideLine : '#E5E5E5',
22
25
  },
23
26
 
24
27
  setEvents: function () {
25
- var browser = this.browser;
28
+ const browser = this.browser;
26
29
 
27
30
  function resize() {
28
- $('.gv-bg.gv-full-height', browser.container).height(function () {
29
- return browser.wrapper.outerHeight(true) - $(this).parents('.gv-track-container').position().top;
31
+ browser.jQuery('.gv-bg.gv-full-height', browser.container).height(function () {
32
+ return browser.wrapper.outerHeight(true) - browser.jQuery(this).parents('.gv-track-container').position().top;
30
33
  });
31
34
  }
32
35
 
@@ -35,34 +38,38 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
35
38
  },
36
39
 
37
40
  setScale: function () {
38
- var max = this.prop('width') / this.prop('minPixPerMajor');
39
- var divisor = 5;
40
- var majorUnit = -1;
41
- var fromDigit = ('' + this.browser.start).split(''); // Split into array of digits
42
- var toDigit = ('' + this.browser.end).split('');
43
- var features = {};
44
- var divisions, i;
45
-
46
- for (i = fromDigit.length; i < toDigit.length; i++) {
41
+ const max = this.prop('width') / this.prop('minPixPerMajor');
42
+
43
+ let divisor = 5;
44
+ let majorUnit = -1;
45
+
46
+ const fromDigit = `${this.browser.start}`.split(''); // Split into array of digits
47
+ const toDigit = `${this.browser.end}`.split('');
48
+ const features = {};
49
+
50
+ let divisions;
51
+
52
+ for (let i = fromDigit.length; i < toDigit.length; i++) {
47
53
  fromDigit.unshift('0');
48
54
  }
49
55
 
50
- for (i = toDigit.length; i < fromDigit.length; i++) {
56
+ for (let i = toDigit.length; i < fromDigit.length; i++) {
51
57
  toDigit.unshift('0');
52
58
  }
53
59
 
54
60
  // How many divisions would there be if we only kept i digits?
55
- for (i = 0; i < fromDigit.length; i++) {
56
- divisions = parseInt(toDigit.slice(0, fromDigit.length - i).join(''), 10) - parseInt(fromDigit.slice(0, fromDigit.length - i).join(''), 10);
61
+ for (let i = 0; i < fromDigit.length; i++) {
62
+ divisions = Number(toDigit.slice(0, fromDigit.length - i).join('')) - Number(fromDigit.slice(0, fromDigit.length - i).join(''));
57
63
 
58
64
  if (divisions && divisions <= max) {
59
- majorUnit = parseInt('1' + $.map(new Array(i), function () { return '0'; }).join(''), 10);
65
+ majorUnit = Number(`1${Array(i).fill('0').join('')}`);
66
+
60
67
  break;
61
68
  }
62
69
  }
63
70
 
64
71
  if (majorUnit === -1) {
65
- majorUnit = this.browser.length === 1 ? 1 : parseInt('1' + $.map(new Array(fromDigit.length), function () { return '0'; }).join(''), 10);
72
+ majorUnit = this.browser.length === 1 ? 1 : Number(`1${Array(fromDigit.length).fill('0').join('')}`);
66
73
  divisor = 1;
67
74
  } else if (divisions * 5 <= max) { // Improve things by trying simple multiples of 1<n zeroes>. (eg if 100 will fit will 200, 400, 500).
68
75
  majorUnit /= 5;
@@ -88,16 +95,18 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
88
95
  },
89
96
 
90
97
  setFeatures: function (chr, start, end) {
91
- var minorUnit = this.prop('minorUnit');
92
- var majorUnit = this.prop('majorUnit');
93
- var seen = this.prop('seen');
98
+ const minorUnit = this.prop('minorUnit');
99
+ const majorUnit = this.prop('majorUnit');
100
+ const seen = this.prop('seen');
94
101
 
95
102
  start = Math.max(start - (start % minorUnit) - majorUnit, 0);
96
103
 
97
- var flip = (start / minorUnit) % 2 ? 1 : -1;
98
- var feature, major, label;
104
+ let flip = (start / minorUnit) % 2 ? 1 : -1;
105
+ let feature;
106
+ let major;
107
+ let label;
99
108
 
100
- for (var x = start; x < end + minorUnit; x += minorUnit) {
109
+ for (let x = start; x < end + minorUnit; x += minorUnit) {
101
110
  flip *= -1;
102
111
 
103
112
  if (seen[x]) {
@@ -106,7 +115,7 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
106
115
 
107
116
  seen[x] = 1;
108
117
 
109
- feature = { id: chr + ':' + x, chr: chr, strand: 1, sort: x };
118
+ feature = { id: `${chr}:${x}`, chr: chr, strand: 1, sort: x };
110
119
  major = x && x % majorUnit === 0;
111
120
 
112
121
  if (flip === 1) {
@@ -136,11 +145,11 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
136
145
  },
137
146
 
138
147
  makeFirstImage: function (moveTo) {
139
- if (this.prop('strand') === -1) {
140
- moveTo = this.track.forwardTrack.prop('scrollStart');
141
- }
142
-
143
- return this.base(moveTo);
148
+ return this.base(
149
+ this.prop('strand') === -1
150
+ ? this.track.forwardTrack.prop('scrollStart')
151
+ : moveTo
152
+ );
144
153
  },
145
154
 
146
155
  makeImage: function (params) {
@@ -149,7 +158,7 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
149
158
 
150
159
  this.track.setFeatures(params.chr, params.start, params.end);
151
160
 
152
- var rtn = this.base(params);
161
+ const rtn = this.base(params);
153
162
 
154
163
  params.container.addClass('gv-full-height');
155
164
 
@@ -167,10 +176,13 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
167
176
  },
168
177
 
169
178
  draw: function (features, featureContext, labelContext, scale) {
170
- var i = features.length;
171
- var minorUnit = this.prop('minorUnit');
172
- var width = Math.ceil(minorUnit * scale);
173
- var feature, start, end;
179
+ const minorUnit = this.prop('minorUnit');
180
+ const width = Math.ceil(minorUnit * scale);
181
+
182
+ let i = features.length;
183
+ let feature;
184
+ let start;
185
+ let end;
174
186
 
175
187
  featureContext.textBaseline = 'top';
176
188
  featureContext.fillStyle = this.color;
@@ -182,12 +194,18 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
182
194
  start = Math.round(feature.position[scale].X);
183
195
  end = start + width - 1;
184
196
 
185
- this.drawFeature($.extend({}, feature, {
186
- x : start,
187
- y : 0,
188
- width : Math.ceil(feature.position[scale].width),
189
- height : this.featureHeight
190
- }), featureContext, labelContext, scale);
197
+ this.drawFeature(
198
+ {
199
+ ...feature,
200
+ x : start,
201
+ y : 0,
202
+ width : Math.ceil(feature.position[scale].width),
203
+ height : this.featureHeight,
204
+ },
205
+ featureContext,
206
+ labelContext,
207
+ scale
208
+ );
191
209
 
192
210
  if (feature.label) {
193
211
  if (start > -1) {
@@ -213,15 +231,17 @@ Genoverse.Track.Scalebar = Genoverse.Track.extend({
213
231
 
214
232
  // Draw guidelines
215
233
  drawBackground: function (f, context) {
216
- for (var i in this.guideLines) {
217
- if (this.guideLines[i] >= 0 && this.guideLines[i] <= this.width) {
218
- context.fillStyle = this.track.colors[this.guideLines.major[i] ? 'majorGuideLine' : 'minorGuideLine'];
219
- context.fillRect(this.guideLines[i], 0, 1, context.canvas.height);
234
+ Object.entries(this.guideLines).forEach(
235
+ ([ key, value ]) => {
236
+ if (value >= 0 && value <= this.width) {
237
+ context.fillStyle = this.track.colors[this.guideLines.major[key] ? 'majorGuideLine' : 'minorGuideLine'];
238
+ context.fillRect(value, 0, 1, context.canvas.height);
239
+ }
220
240
  }
221
- }
241
+ );
222
242
  },
223
243
 
224
244
  formatLabel: function (label) {
225
245
  return this.prop('minorUnit') < 1000 ? label.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') : this.base(label);
226
- }
246
+ },
227
247
  });
@@ -1,4 +1,6 @@
1
- Genoverse.Track.Scaleline = Genoverse.Track.Static.extend({
1
+ import Track from './Static';
2
+
3
+ export default Track.extend({
2
4
  strand : 1,
3
5
  color : '#000000',
4
6
  height : 12,
@@ -7,11 +9,11 @@ Genoverse.Track.Scaleline = Genoverse.Track.Static.extend({
7
9
  fixedOrder : true,
8
10
  arrowWidth : 7,
9
11
 
10
- resize: $.noop,
12
+ resize: () => {},
11
13
 
12
- makeFirstImage: function () {
14
+ makeFirstImage: function (...args) {
13
15
  this.prop('scaleline', false);
14
- this.base.apply(this, arguments);
16
+ this.base(...args);
15
17
  },
16
18
 
17
19
  render: function (f, img) {
@@ -20,7 +22,7 @@ Genoverse.Track.Scaleline = Genoverse.Track.Static.extend({
20
22
  },
21
23
 
22
24
  positionFeatures: function (features, params) {
23
- var scaleline = this.prop('scaleline');
25
+ let scaleline = this.prop('scaleline');
24
26
 
25
27
  if (params.scale === this.drawnScale) {
26
28
  return false;
@@ -30,19 +32,19 @@ Genoverse.Track.Scaleline = Genoverse.Track.Static.extend({
30
32
  return scaleline;
31
33
  }
32
34
 
33
- var strand = this.prop('strand');
34
- var height = this.prop('height');
35
- var text = this.formatLabel(this.browser.length);
36
- var width = this.context.measureText(text).width;
37
- var textMargin = 10; // 5px each side
38
- var y = height / 2;
39
- var x1 = 0;
40
- var x2 = (this.width - width - textMargin) / 2;
35
+ const strand = this.prop('strand');
36
+ const height = this.prop('height');
37
+ const text = this.formatLabel(this.browser.length);
38
+ const width = this.context.measureText(text).width;
39
+ const textMargin = 10; // 5px each side
40
+ const y = height / 2;
41
+ const x1 = 0;
42
+ const x2 = (this.width - width - textMargin) / 2;
41
43
 
42
44
  if (strand) {
43
- var strandText = strand === 1 ? 'Forward strand' : 'Reverse strand';
44
- var strandWidth = this.context.measureText(strandText).width;
45
- var x3 = (
45
+ const strandText = strand === 1 ? 'Forward strand' : 'Reverse strand';
46
+ const strandWidth = this.context.measureText(strandText).width;
47
+ const x3 = (
46
48
  strand === 1
47
49
  ? this.width - this.prop('arrowWidth') - strandWidth - (1.5 * textMargin)
48
50
  : this.prop('arrowWidth') + (0.5 * textMargin)
@@ -51,12 +53,12 @@ Genoverse.Track.Scaleline = Genoverse.Track.Static.extend({
51
53
  scaleline = [
52
54
  { x: x1, y: y, width: this.width, height: 1, decorations: true },
53
55
  { x: x2, y: 0, width: width + textMargin, height: height, clear: true, color: false, labelColor: this.color, labelWidth: width, label: text },
54
- { x: x3, y: 0, width: strandWidth + textMargin, height: height, clear: true, color: false, labelColor: this.color, labelWidth: strandWidth, label: strandText }
56
+ { x: x3, y: 0, width: strandWidth + textMargin, height: height, clear: true, color: false, labelColor: this.color, labelWidth: strandWidth, label: strandText },
55
57
  ];
56
58
  } else {
57
59
  scaleline = [
58
60
  { x: x1, y: y, width: this.width, height: 1, decorations: true },
59
- { x: x2, y: 0, width: width + textMargin, height: height, clear: true, color: false, labelColor: this.color, labelWidth: width, label: text }
61
+ { x: x2, y: 0, width: width + textMargin, height: height, clear: true, color: false, labelColor: this.color, labelWidth: width, label: text },
60
62
  ];
61
63
  }
62
64
 
@@ -64,19 +66,19 @@ Genoverse.Track.Scaleline = Genoverse.Track.Static.extend({
64
66
  },
65
67
 
66
68
  decorateFeature: function (feature, context) {
67
- var strand = this.prop('strand');
68
- var height = this.prop('height');
69
- var arrowWidth = this.prop('arrowWidth');
70
- var width = this.width;
69
+ const strand = this.prop('strand');
70
+ const height = this.prop('height');
71
+ const arrowWidth = this.prop('arrowWidth');
72
+ const width = this.width;
71
73
 
72
74
  context.strokeStyle = this.color;
73
75
 
74
76
  [ -1, 1 ].filter(
75
- function (dir) { return strand ? dir === strand : true; }
77
+ dir => (strand ? dir === strand : true)
76
78
  ).forEach(
77
- function (dir) {
78
- var x1 = dir === 1 ? width - arrowWidth : arrowWidth;
79
- var x2 = x1 + (dir * arrowWidth);
79
+ (dir) => {
80
+ const x1 = dir === 1 ? width - arrowWidth : arrowWidth;
81
+ const x2 = x1 + (dir * arrowWidth);
80
82
 
81
83
  context.beginPath();
82
84
  context.moveTo(x1, height * 0.25);
@@ -87,5 +89,5 @@ Genoverse.Track.Scaleline = Genoverse.Track.Static.extend({
87
89
  context.fill();
88
90
  }
89
91
  );
90
- }
92
+ },
91
93
  });
@@ -0,0 +1,82 @@
1
+ import Track, { Controller as TrackController, Model as TrackModel, View as TrackView } from '../../Track';
2
+
3
+ const Controller = TrackController.extend({
4
+ addDomElements: function () {
5
+ this.base();
6
+
7
+ this.image = this.browser.jQuery('<img>').appendTo(this.imgContainer);
8
+
9
+ this.container.toggleClass('gv-track-container gv-track-container-static').prepend(this.imgContainer);
10
+ this.scrollContainer.add(this.messageContainer).remove();
11
+ },
12
+
13
+ reset: function (...args) {
14
+ delete this.stringified;
15
+ this.base(...args);
16
+ },
17
+
18
+ setWidth: function (width) {
19
+ this.base(width);
20
+ this.image.width = this.width;
21
+ },
22
+
23
+ makeFirstImage: function (...args) {
24
+ this.base(...args);
25
+ this.container.css('left', 0);
26
+ this.imgContainer.show();
27
+ },
28
+
29
+ makeImage: function (params) {
30
+ if (this.prop('disabled')) {
31
+ return this.browser.jQuery.Deferred().resolve();
32
+ }
33
+
34
+ const features = this.view.positionFeatures(this.model.findFeatures(params.chr, params.start, params.end), params);
35
+
36
+ if (features) {
37
+ const string = JSON.stringify(features);
38
+
39
+ if (this.stringified !== string) {
40
+ const height = this.prop('height');
41
+
42
+ params.width = this.width;
43
+ params.featureHeight = height;
44
+
45
+ this.render(features, this.image.data(params));
46
+ this.imgContainer.children(':last').show();
47
+ this.resize(height, undefined, false);
48
+
49
+ this.stringified = string;
50
+ }
51
+ }
52
+
53
+ return this.browser.jQuery.Deferred().resolve();
54
+ },
55
+ });
56
+
57
+ const Model = TrackModel.extend({
58
+ url : false,
59
+ checkDataRange : () => true,
60
+ });
61
+
62
+ const View = TrackView.extend({
63
+ featureMargin : { top: 0, right: 1, bottom: 0, left: 1 },
64
+ positionFeature : () => {},
65
+ scaleFeatures : features => features,
66
+
67
+ draw: function (features, featureContext, labelContext, scale) {
68
+ features.forEach(
69
+ feature => this.drawFeature(feature, featureContext, labelContext, scale)
70
+ );
71
+ },
72
+ });
73
+
74
+ export default Track.extend({
75
+ controls : 'off',
76
+ resizable : false,
77
+ controller : Controller,
78
+ model : Model,
79
+ view : View,
80
+ });
81
+
82
+ export { Controller, Model, View };
@@ -1,4 +1,7 @@
1
- Genoverse.Track.dbSNP = Genoverse.Track.extend({
1
+ import Track from '../../Track';
2
+ import Legend from './Legend';
3
+
4
+ export default Track.extend({
2
5
  id : 'dbSNP',
3
6
  name : 'dbSNP',
4
7
  info : 'All sequence variants from the database of Single Nucleotide Polymorphisms (dbSNP)',
@@ -6,7 +9,7 @@ Genoverse.Track.dbSNP = Genoverse.Track.extend({
6
9
  dataRequestLimit : 5000000, // As per e! REST API restrictions
7
10
  threshold : 1e5,
8
11
  labels : false,
9
- legend : true,
12
+ legend : Legend,
10
13
  autoHeight : true,
11
14
  colorMap : {
12
15
  transcript_ablation : '#ff0000',
@@ -43,7 +46,7 @@ Genoverse.Track.dbSNP = Genoverse.Track.extend({
43
46
  feature_elongation : '#7f7f7f',
44
47
  regulatory_region_variant : '#a52a2a',
45
48
  feature_truncation : '#7f7f7f',
46
- intergenic_variant : '#636363'
49
+ intergenic_variant : '#636363',
47
50
  },
48
51
 
49
52
  insertFeature: function (feature) {
@@ -71,61 +74,56 @@ Genoverse.Track.dbSNP = Genoverse.Track.extend({
71
74
  },
72
75
 
73
76
  populateMenu: function (feature) {
74
- var deferred = $.Deferred();
75
- var menu = [{
76
- title : '<a href="https://www.ensembl.org/Homo_sapiens/Variation/Summary?v=' + feature.id + '" target="_blank">' + feature.id + '</a>',
77
- Location : feature.chr + ':' + feature.start + '-' + feature.end,
77
+ const deferred = this.browser.jQuery.Deferred();
78
+ const menu = [{
79
+ title : `<a href="https://www.ensembl.org/Homo_sapiens/Variation/Summary?v=${feature.id}" target="_blank">${feature.id}</a>`,
80
+ Location : `${feature.chr}:${feature.start}-${feature.end}`,
78
81
  Consequence : feature.consequence_type,
79
- Alleles : feature.alleles.join(', ')
82
+ Alleles : feature.alleles.join(', '),
80
83
  }];
81
84
 
82
- $.ajax({
83
- url : '//rest.ensembl.org/variation/human/' + feature.id + '?population_genotypes=1;content-type=application/json',
85
+ this.browser.jQuery.ajax({
86
+ url : `//rest.ensembl.org/variation/human/${feature.id}?population_genotypes=1;content-type=application/json`,
84
87
  dataType : 'json',
85
88
  success : function (data) {
86
- var populationGenotypes = $.grep(data.population_genotypes, function (pop) { return /1000GENOMES.+ALL/.test(pop.population); }); // Only considering 1000 Genomes: ALL population
87
- var frequencies = {};
88
- var pop, i, j;
89
+ const populationGenotypes = data.population_genotypes.filter(pop => /1000GENOMES.+ALL/.test(pop.population)); // Only considering 1000 Genomes: ALL population
90
+ const frequencies = {};
89
91
 
90
92
  if (populationGenotypes.length) {
91
- for (i = 0; i < populationGenotypes.length; i++) {
92
- pop = populationGenotypes[i];
93
- pop.frequency = parseFloat(pop.frequency, 10);
94
- pop.count = parseInt(pop.count, 10);
95
-
96
- frequencies[pop.population] = frequencies[pop.population] || [];
97
- frequencies[pop.population].push(pop);
98
- }
99
-
100
- for (i in frequencies) {
101
- frequencies[i].sort(function (a, b) { return a.count < b.count; });
93
+ populationGenotypes.forEach(
94
+ (pop) => {
95
+ pop.frequency = parseFloat(pop.frequency, 10);
96
+ pop.count = parseInt(pop.count, 10);
102
97
 
103
- pop = {
104
- title : i + ' population genotypes',
105
- Genotype : [ 'Frequency', 'Count' ],
106
- start : false,
107
- end : false
108
- };
109
-
110
- for (j in frequencies[i]) {
111
- pop[frequencies[i][j].genotype] = [ (frequencies[i][j].frequency * 100).toFixed(2) + '%', frequencies[i][j].count ];
98
+ frequencies[pop.population] = frequencies[pop.population] || [];
99
+ frequencies[pop.population].push(pop);
112
100
  }
113
-
114
- menu.push(pop);
115
- }
116
-
117
- pop = {
118
- start : false,
119
- end : false
120
- };
121
-
122
- pop['<a href="https://www.ensembl.org/Homo_sapiens/Variation/Population?v=' + feature.id + '" target="_blank">See all population genotypes</a>'] = '';
123
-
124
- menu.push(pop);
101
+ );
102
+
103
+ menu.push(
104
+ ...Object.entries(frequencies).map(
105
+ ([ key, values ]) => values.sort(
106
+ (a, b) => a.count < b.count
107
+ ).reduce(
108
+ (acc, row) => Object.assign(acc, { [row.genotype]: [ `${(row.frequency * 100).toFixed(2)}%`, row.count ] }),
109
+ {
110
+ title : `${key} population genotypes`,
111
+ Genotype : [ 'Frequency', 'Count' ],
112
+ start : false,
113
+ end : false,
114
+ }
115
+ )
116
+ ),
117
+ {
118
+ start : false,
119
+ end : false,
120
+ [`<a href="https://www.ensembl.org/Homo_sapiens/Variation/Population?v=${feature.id}" target="_blank">See all population genotypes</a>`] : '',
121
+ }
122
+ );
125
123
  }
126
124
 
127
125
  deferred.resolve(menu);
128
- }
126
+ },
129
127
  });
130
128
 
131
129
  return deferred;
@@ -133,10 +131,9 @@ Genoverse.Track.dbSNP = Genoverse.Track.extend({
133
131
 
134
132
  // Different settings for different zoom level
135
133
  5000: { // more than 5k
136
- bump: false
134
+ bump: false,
137
135
  },
138
136
  1: { // > 1 base-pair, but less then 5k
139
- bump: true
140
- }
141
-
137
+ bump: true,
138
+ },
142
139
  });