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,115 +0,0 @@
1
- Genoverse.Track.View.SequenceVariation = Genoverse.Track.View.Sequence.extend({
2
- featureHeight : 15,
3
- featureMargin : { top: 0, right: 0, bottom: 4, left: 0 },
4
- bump : true,
5
- showLegend : false,
6
-
7
- positionFeature: function (feature, params) {
8
- var position = feature.position[params.scale];
9
-
10
- if (feature.alt_allele) {
11
- if (!position.positioned) {
12
- position.reference = { end: position.start + feature.ref_allele.length * params.scale };
13
- }
14
-
15
- position.reference.x = position.reference.end - params.scaledStart;
16
- }
17
-
18
- this.base(feature, params);
19
- },
20
-
21
- bumpFeature: function (bounds, feature) {
22
- if (feature.alt_allele) {
23
- this.base.apply(this, arguments);
24
- }
25
- },
26
-
27
- draw: function (features, featureContext, labelContext, scale) {
28
- var drawing = { seq: [], snv: [] };
29
-
30
- for (var i = 0; i < features.length; i++) {
31
- drawing[features[i].alt_allele ? 'snv' : 'seq'].push(features[i]);
32
- }
33
-
34
- this.base(drawing.seq, featureContext, labelContext, scale);
35
- this.highlightSNVs(drawing.snv, featureContext, scale);
36
- this.base(drawing.snv, featureContext, labelContext, scale);
37
- this.outlineSNVs(drawing.snv, featureContext, scale); // Redraw the outline for SNVs, since the feature will have been drawn on top of some of the outline created by highlightSNVs
38
- },
39
-
40
- highlightSNVs: function (features, context, scale) {
41
- var position, positionX, positionY;
42
-
43
- for (var i = 0; i < features.length; i++) {
44
- position = features[i].position[scale];
45
- positionX = [ position.X, position.reference.x, position.X + position.width ];
46
-
47
- if (positionX[2] < 0 || positionX[0] > this.width) {
48
- continue;
49
- }
50
-
51
- if (positionX[0] < 0 || positionX[2] > this.width) {
52
- this.truncateForDrawing(positionX);
53
- }
54
-
55
- positionY = [ 0, position.Y - this.featureMargin.bottom / 2, position.Y, position.Y + this.featureHeight ];
56
-
57
- if (!features[i].highlightColor) {
58
- this.setHighlightColor(features[i]);
59
- }
60
-
61
- context.strokeStyle = context.fillStyle = features[i].highlightColor;
62
- context.lineWidth = 2;
63
-
64
- context.beginPath();
65
- context.moveTo(positionX[0], positionY[0]);
66
- context.lineTo(positionX[1], positionY[0]);
67
- context.lineTo(positionX[1], positionY[1]);
68
- context.lineTo(positionX[2], positionY[2]);
69
- context.lineTo(positionX[2], positionY[3]);
70
- context.lineTo(positionX[0], positionY[3]);
71
- context.closePath();
72
- context.stroke();
73
-
74
- context.lineWidth = 1;
75
- context.globalAlpha = 0.5;
76
-
77
- context.fill();
78
-
79
- context.globalAlpha = 1;
80
- }
81
- },
82
-
83
- outlineSNVs: function (features, context, scale) {
84
- var position, positionX, positionY;
85
-
86
- for (var i = 0; i < features.length; i++) {
87
- position = features[i].position[scale];
88
- positionX = [ position.X, position.X + position.width ];
89
- positionY = [ position.Y, position.Y + this.featureHeight ];
90
-
91
- context.strokeStyle = features[i].highlightColor;
92
-
93
- context.lineWidth = 2;
94
-
95
- context.beginPath();
96
- context.moveTo(positionX[1], positionY[0]);
97
- context.lineTo(positionX[1], positionY[1]);
98
- context.lineTo(positionX[0], positionY[1]);
99
- context.lineTo(positionX[0], positionY[0]);
100
- context.stroke();
101
-
102
- context.lineWidth = 1;
103
- }
104
- },
105
-
106
- truncateForDrawing: function (positionX) {
107
- for (var i in positionX) {
108
- positionX[i] = Math.min(Math.max(positionX[i], -1), this.width + 1);
109
- }
110
- },
111
-
112
- setHighlightColor: function (feature) {
113
- feature.highlightColor = feature.alt_allele === '-' || feature.alt_allele.length < feature.ref_allele.length ? '#D31D00' : '#1DD300';
114
- }
115
- });
@@ -1,12 +0,0 @@
1
- Genoverse.Track.View.Transcript.Ensembl = Genoverse.Track.View.Transcript.extend({
2
- setFeatureColor: function (feature) {
3
- Genoverse.Track.View.Gene.Ensembl.prototype.setFeatureColor(feature);
4
-
5
- for (var i = 0; i < (feature.subFeatures || []).length; i++) {
6
- if (feature.subFeatures[i].utr) {
7
- feature.subFeatures[i].color = false;
8
- feature.subFeatures[i].borderColor = feature.color;
9
- }
10
- }
11
- }
12
- });
@@ -1,28 +0,0 @@
1
- Genoverse.Track.View.Transcript = Genoverse.Track.View.extend({
2
- featureHeight : 12,
3
- utrHeight : 7,
4
- labels : true,
5
- repeatLabels : true,
6
- bump : true,
7
- subFeatureJoinStyle : 'curve',
8
-
9
- scaleFeatures: function (features, scale) {
10
- var subFeatures, j;
11
-
12
- for (var i = 0; i < features.length; i++) {
13
- subFeatures = features[i].subFeatures || [];
14
-
15
- if (subFeatures.length) {
16
- for (j = 0; j < subFeatures.length; j++) {
17
- if (subFeatures[j].utr) {
18
- subFeatures[j].height = this.utrHeight;
19
- }
20
- }
21
-
22
- features[i].height = Math.max.apply(Math, subFeatures.map(function (c) { return c.fake ? 0 : c.height || 0; }).concat(this.featureHeight));
23
- }
24
- }
25
-
26
- return this.base(features, scale);
27
- }
28
- });
@@ -1,30 +0,0 @@
1
- Genoverse.Track.File.BAM = Genoverse.Track.File.extend({
2
- name : 'BAM',
3
- indexExt : '.bai',
4
- threshold : 100000,
5
- largeFile : true,
6
- model : Genoverse.Track.Model.File.BAM,
7
- view : Genoverse.Track.View.Sequence.extend({
8
- bump : true,
9
- autoHeight : true
10
- }),
11
-
12
- click: function () {
13
- var menu = this.base.apply(this, arguments);
14
-
15
- if (menu) {
16
- menu.addClass('gv-wrap-values');
17
- }
18
-
19
- return menu;
20
- },
21
-
22
- populateMenu: function (feature) {
23
- var f = $.extend({ title: feature.readName }, feature);
24
-
25
- delete f.sequence;
26
- delete f.id;
27
-
28
- return this.base(f);
29
- }
30
- });
@@ -1,24 +0,0 @@
1
- Genoverse.Track.File.BED = Genoverse.Track.File.extend({
2
- name : 'BED',
3
- model : Genoverse.Track.Model.File.BED,
4
- bump : true,
5
- featureHeight : 10,
6
- thickHeight : 10,
7
- thinHeight : 7,
8
- subFeatureJoinStyle : 'curve',
9
-
10
- populateMenu: function (feature) {
11
- var fields = [ false, false, false, 'name', 'score', 'strand', 'thickStart', 'thickEnd', 'itemRgb', 'blockCount', 'blockSizes', 'blockStarts' ]; // First three fields are chr, start, end which are covered by Location
12
-
13
- return feature.originalFeature.reduce(function (menu, val, i) {
14
- if (fields[i]) {
15
- menu[fields[i]] = val;
16
- }
17
-
18
- return menu;
19
- }, {
20
- title : '<a target="_blank" href="https://genome.ucsc.edu/FAQ/FAQformat.html#format1">BED feature details</a>',
21
- Location : feature.chr + ':' + feature.start + '-' + feature.end
22
- });
23
- }
24
- });
@@ -1,47 +0,0 @@
1
- Genoverse.Track.File.BIGBED = Genoverse.Track.File.BED.extend({
2
- name : 'bigbed',
3
- model : Genoverse.Track.Model.File.BED.extend({
4
- getData: function (chr, start, end) {
5
- var model = this;
6
- var deferred = $.Deferred();
7
-
8
- if (!this.bigbedFile) {
9
- this.bigbedFile = this.bigbedFile || (this.url ? new dallianceLib.URLFetchable(this.url) : new dallianceLib.BlobFetchable(this.track.dataFile));
10
- }
11
-
12
- var d = $.Deferred().done(function () {
13
- model.bwReader.getValues(chr, start, end, function (features, error) {
14
- if (!error) {
15
- features.sort(function (a, b) { return a.start - b.start; });
16
-
17
- if (features.length) {
18
- model.receiveData(features, chr, features[0].start, features[features.length - 1].end);
19
- } else {
20
- model.receiveData(features, chr, start, end);
21
- }
22
- }
23
-
24
- deferred.resolveWith(model);
25
- });
26
- });
27
-
28
- if (this.bwReader) {
29
- d.resolve();
30
- } else {
31
- new BWReader(this.bigbedFile, function (bwReader) {
32
- if (bwReader) {
33
- model.bwReader = bwReader;
34
- d.resolve();
35
- } else {
36
- model.receiveData([], chr, start, end);
37
- return deferred.resolveWith(model);
38
- }
39
- });
40
- }
41
-
42
- return deferred;
43
- }
44
- })
45
- });
46
-
47
- Genoverse.Track.File.BB = Genoverse.Track.File.BIGBED;
@@ -1,52 +0,0 @@
1
- Genoverse.Track.File.BIGWIG = Genoverse.Track.Graph.Bar.extend({
2
- name : 'bigwig',
3
- height : 100,
4
-
5
- setDefaults: function () {
6
- this.bwReader = null; // Not part of model since it needs to be shared between bar and line graphs
7
- this.base.apply(this, arguments);
8
- },
9
-
10
- getData: function (chr, start, end) {
11
- var model = this;
12
- var deferred = $.Deferred();
13
-
14
- if (!this.bigwigFile) {
15
- this.bigwigFile = this.bigwigFile || (this.url ? new dallianceLib.URLFetchable(this.url) : new dallianceLib.BlobFetchable(this.track.dataFile));
16
- }
17
-
18
- var d = $.Deferred().done(function () {
19
- model.prop('bwReader').getValues(chr, start, end, function (features, error) {
20
- if (!error) {
21
- features.sort(function (a, b) { return a.start - b.start; });
22
-
23
- if (features.length) {
24
- model.receiveData(features, chr, features[0].start, features[features.length - 1].end);
25
- } else {
26
- model.receiveData(features, chr, start, end);
27
- }
28
- }
29
-
30
- deferred.resolveWith(model);
31
- });
32
- });
33
-
34
- if (this.prop('bwReader')) {
35
- d.resolve();
36
- } else {
37
- new BWReader(this.bigwigFile, function (bwReader) {
38
- if (bwReader) {
39
- model.prop('bwReader', bwReader);
40
- d.resolve();
41
- } else {
42
- model.receiveData([], chr, start, end);
43
- return deferred.resolveWith(model);
44
- }
45
- });
46
- }
47
-
48
- return deferred;
49
- }
50
- });
51
-
52
- Genoverse.Track.File.BW = Genoverse.Track.File.BIGWIG;
@@ -1,9 +0,0 @@
1
- Genoverse.Track.File.GFF = Genoverse.Track.File.extend({
2
- name : 'GFF',
3
- model : Genoverse.Track.Model.File.GFF,
4
- bump : true,
5
- height : 100,
6
- featureHeight : 5
7
- });
8
-
9
- Genoverse.Track.File.GTF = Genoverse.Track.File.GFF;
@@ -1,5 +0,0 @@
1
- Genoverse.Track.File.WIG = Genoverse.Track.Graph.Bar.extend({
2
- model : Genoverse.Track.Model.File.WIG,
3
- name : 'wig',
4
- height : 100
5
- });
@@ -1,37 +0,0 @@
1
- Genoverse.Track.Gene = Genoverse.Track.extend({
2
- id : 'genes',
3
- name : 'Genes',
4
- height : 200,
5
- legend : true,
6
-
7
- populateMenu: function (feature) {
8
- var url = 'https://www.ensembl.org/Homo_sapiens/' + (feature.feature_type === 'transcript' ? 'Transcript' : 'Gene') + '/Summary?' + (feature.feature_type === 'transcript' ? 't' : 'g') + '=' + feature.id;
9
- var menu = {
10
- title : '<a target="_blank" href="' + url + '">' + (feature.external_name ? feature.external_name + ' (' + feature.id + ')' : feature.id) + '</a>',
11
- Location : feature.chr + ':' + feature.start + '-' + feature.end,
12
- Source : feature.source,
13
- Biotype : feature.biotype
14
- };
15
-
16
- if (feature.feature_type === 'transcript') {
17
- menu.Gene = '<a target="_blank" href="https://www.ensembl.org/Homo_sapiens/Gene/Summary?g=' + feature.Parent + '">' + feature.Parent + '</a>';
18
- }
19
-
20
- return menu;
21
- },
22
-
23
- // Different settings for different zoom level
24
- 2000000: { // This one applies when > 2M base-pairs per screen
25
- labels: false
26
- },
27
- 100000: { // more than 100K but less then 2M
28
- labels : true,
29
- model : Genoverse.Track.Model.Gene.Ensembl,
30
- view : Genoverse.Track.View.Gene.Ensembl
31
- },
32
- 1: { // > 1 base-pair, but less then 100K
33
- labels : true,
34
- model : Genoverse.Track.Model.Transcript.Ensembl,
35
- view : Genoverse.Track.View.Transcript.Ensembl
36
- }
37
- });
@@ -1,235 +0,0 @@
1
- Genoverse.Track.Controller.Graph.Bar = {
2
- getClickedFeatures: function (x, y) {
3
- var yZero = this.prop('marginTop') - (this.prop('range')[0] * this.track.getYScale());
4
- var scale = this.scale;
5
- var tolerance = scale > 1 ? 0 : 1;
6
-
7
- // Bars with negative values are stored in featurePositions with h < 0.
8
- // While this works to a certain degree (fillRect allows negative height, drawing upwards from y), it makes them hard to search for in the RTree - to find such a feature you need to search with y = -h and h = y - h + 1
9
- // It is therefore easier to search featuresByChr (i.e. the genomic positions) for a feature overlapping the x of the click, and then filter those results for y position manually.
10
- var features = this.prop('featuresByChr')[this.browser.chr].search({
11
- x : (x - (tolerance / 2)) / scale,
12
- y : 0,
13
- w : (1 + tolerance) / scale,
14
- h : 1
15
- });
16
-
17
- if (features.length) {
18
- if (
19
- (y < yZero && features.filter(function (f) { return f.position[scale].bounds.y + f.position[scale].bounds.h <= y && f.position[scale].bounds.y >= y; }).length === 0) ||
20
- (y >= yZero && this.featurePositions.search({ x: x, y: y, w: 1, h: 1 }).length === 0)
21
- ) {
22
- features = [];
23
- }
24
- }
25
-
26
- return features.length ? [ this.model.sortFeatures(features) ] : [];
27
- },
28
-
29
- populateMenu: function (features) {
30
- if (!features.length) {
31
- return [];
32
- }
33
-
34
- var start = features[0].start;
35
- var end = features[features.length - 1].end;
36
- var avg = features[0].start !== features[features.length - 1].start;
37
- var menu = { title: features[0].chr + ':' + (start === end ? start : start + '-' + end) };
38
- var values, i;
39
-
40
- function getValues(_features) {
41
- var vals = _features.map(function (f) { return f.height; }).sort(function (a, b) { return a - b; });
42
-
43
- return {
44
- avg : vals.reduce(function (n, v) { return n + v; }, 0) / vals.length,
45
- min : vals[0],
46
- max : vals[vals.length - 1]
47
- };
48
- }
49
-
50
- if (avg) {
51
- if (features.length === 1) {
52
- values = getValues(features);
53
-
54
- menu['Average value'] = values.avg;
55
- menu['Min value'] = values.min;
56
- menu['Max value'] = values.max;
57
- } else {
58
- menu = [ menu ];
59
-
60
- var datasets = this.prop('datasets');
61
- var featuresByDataset;
62
-
63
- if (datasets.length) {
64
- featuresByDataset = datasets.reduce(function (hash, d) { hash[d.name] = []; return hash; }, {});
65
-
66
- for (i = 0; i < features.length; i++) {
67
- featuresByDataset[features[i].dataset].push(features[i]);
68
- }
69
- } else {
70
- datasets = [{ name: '' }];
71
- featuresByDataset = { '': features };
72
- }
73
-
74
- for (i = 0; i < datasets.length; i++) {
75
- values = getValues(featuresByDataset[datasets[i].name]);
76
-
77
- menu.push($.extend({
78
- Average : values.avg,
79
- Min : values.min,
80
- Max : values.max
81
- }, datasets[i].name ? { title: datasets[i].name } : {}));
82
- }
83
- }
84
- } else if (features.length === 1) {
85
- menu.Value = features[0].height;
86
- } else {
87
- for (i = 0; i < features.length; i++) {
88
- menu[features[i].dataset] = features[i].height;
89
- }
90
- }
91
-
92
- return menu;
93
- }
94
- };
95
-
96
- Genoverse.Track.Model.Graph.Bar = Genoverse.Track.Model.Graph.extend({
97
- insertFeature: function (feature) {
98
- var datasets = this.prop('datasets');
99
-
100
- if (datasets.length) {
101
- feature.legend = feature.dataset;
102
- feature.color = (datasets.filter(function (s) { return s.name === feature.dataset; })[0] || { color: this.color }).color;
103
- }
104
-
105
- feature.id = feature.id || [ feature.chr, feature.start, feature.end, feature.dataset || '' ].join(':');
106
-
107
- return this.base.apply(this, arguments);
108
- }
109
- });
110
-
111
- Genoverse.Track.View.Graph.Bar = Genoverse.Track.View.Graph.extend({
112
- scaleFeatures: function (features, scale) {
113
- var yScale = this.track.getYScale();
114
- var zeroY = this.prop('marginTop') - this.prop('range')[0] * yScale;
115
-
116
- features = this.base(features, scale);
117
-
118
- for (var i = 0; i < features.length; i++) {
119
- features[i].position[scale].height = features[i].height * yScale;
120
- features[i].position[scale].y = zeroY;
121
- }
122
-
123
- return features;
124
- },
125
-
126
- draw: function (features, featureContext, labelContext, scale) {
127
- var datasets = this.featureDataSets(features);
128
- var marginBottom = this.prop('margin');
129
- var binSize = scale < 1 ? Math.ceil(1 / scale) : 0;
130
- var conf, set, setFeatures, j, binnedFeatures, binStart, bin, f;
131
-
132
- var defaults = {
133
- color : this.color,
134
- globalAlpha : this.prop('globalAlpha')
135
- };
136
-
137
- for (var i = 0; i < datasets.list.length; i++) {
138
- conf = $.extend({}, defaults, datasets.list[i]);
139
- set = datasets.list[i].name;
140
- setFeatures = $.extend(true, [], datasets.features[set] || []);
141
-
142
- if (!setFeatures.length) {
143
- continue;
144
- }
145
-
146
- if (binSize) {
147
- binnedFeatures = [];
148
- j = 0;
149
-
150
- while (j < setFeatures.length) {
151
- binStart = setFeatures[j].start;
152
- bin = [];
153
-
154
- while (setFeatures[j] && setFeatures[j].start - binStart < binSize) {
155
- bin.push(setFeatures[j++]);
156
- }
157
-
158
- f = $.extend(true, {}, bin[0], {
159
- height : bin.reduce(function (a, b) { return a + b.height; }, 0) / bin.length,
160
- end : bin[bin.length - 1].end
161
- });
162
-
163
- [ 'H', 'W', 'height', 'width' ].forEach(function (attr) { // eslint-disable-line no-loop-func
164
- f.position[scale][attr] = bin.reduce(function (a, b) { return a + b.position[scale][attr]; }, 0) / bin.length;
165
- });
166
-
167
- binnedFeatures.push(f);
168
- }
169
-
170
- setFeatures = binnedFeatures;
171
- }
172
-
173
- for (j = 0; j < setFeatures.length; j++) {
174
- setFeatures[j].color = conf.color;
175
- }
176
-
177
- featureContext.globalAlpha = conf.globalAlpha;
178
-
179
- this.base(setFeatures, featureContext, labelContext, scale);
180
- }
181
-
182
- // Don't allow features to be drawn in the margins
183
- featureContext.clearRect(0, 0, this.width, this.prop('marginTop') - 1);
184
- featureContext.clearRect(0, this.prop('height') - marginBottom, this.width, marginBottom);
185
- }
186
- });
187
-
188
- Genoverse.Track.Graph.Bar = Genoverse.Track.Graph.extend({
189
- type : 'Bar',
190
- model : Genoverse.Track.Model.Graph.Bar,
191
- view : Genoverse.Track.View.Graph.Bar,
192
- threshold : 500000,
193
-
194
- 10000: $.extend( // Switch to line graph at 10000bp region
195
- Object.keys(Genoverse.Track.Graph.Line.prototype).reduce(function (hash, key) {
196
- if (Genoverse.Track.Graph.Line.prototype.hasOwnProperty(key) && !Base.prototype[key]) {
197
- hash[key] = Genoverse.Track.Graph.Line.prototype[key];
198
- }
199
-
200
- return hash;
201
- }, {}), {
202
- fill : true,
203
- model : Genoverse.Track.Model.Graph.Line.extend({
204
- parseData: function (data, chr, start, end) {
205
- var coords = [];
206
- var j;
207
-
208
- for (var i = 0; i < data.length; i++) {
209
- for (j = data[i].start; j < data[i].end; j++) {
210
- coords.push([ j, data[i].height ]);
211
- }
212
- }
213
-
214
- return this.base([{ chr: chr, start: start, end: end, coords: coords }], chr, start, end);
215
- }
216
- })
217
- }
218
- ),
219
- 50000: $.extend( // Switch to sparser line graph at 50000bp region
220
- Object.keys(Genoverse.Track.Graph.Line.prototype).reduce(function (hash, key) {
221
- if (Genoverse.Track.Graph.Line.prototype.hasOwnProperty(key) && !Base.prototype[key]) {
222
- hash[key] = Genoverse.Track.Graph.Line.prototype[key];
223
- }
224
-
225
- return hash;
226
- }, {}), {
227
- fill : true,
228
- model : Genoverse.Track.Model.Graph.Line.extend({
229
- parseData: function (data, chr, start, end) {
230
- return this.base([{ chr: chr, start: start, end: end, coords: data.map(function (d) { return [ d.start, d.height ]; }) }], chr, start, end);
231
- }
232
- })
233
- }
234
- )
235
- });