oncoprintjs 6.0.2 → 6.0.4
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.
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +308 -67
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +306 -64
- package/dist/index.js.map +1 -1
- package/dist/js/oncoprintmodel.d.ts +11 -1
- package/dist/js/oncoprintwebglcellview.d.ts +17 -1
- package/package.json +2 -2
- package/src/index.tsx +1 -0
- package/src/js/oncoprint.ts +8 -0
- package/src/js/oncoprintmodel.ts +110 -3
- package/src/js/oncoprinttrackinfoview.ts +19 -2
- package/src/js/oncoprinttrackoptionsview.ts +13 -11
- package/src/js/oncoprintwebglcellview.ts +157 -1
- package/src/js/oncoprintzoomslider.ts +7 -6
package/dist/index.js
CHANGED
|
@@ -1395,6 +1395,12 @@ var OncoprintModel = /** @class */ (function () {
|
|
|
1395
1395
|
writable: true,
|
|
1396
1396
|
value: void 0
|
|
1397
1397
|
});
|
|
1398
|
+
Object.defineProperty(this, "data_groups", {
|
|
1399
|
+
enumerable: true,
|
|
1400
|
+
configurable: true,
|
|
1401
|
+
writable: true,
|
|
1402
|
+
value: void 0
|
|
1403
|
+
});
|
|
1398
1404
|
Object.defineProperty(this, "column_indexes_after_a_gap", {
|
|
1399
1405
|
enumerable: true,
|
|
1400
1406
|
configurable: true,
|
|
@@ -1616,6 +1622,38 @@ var OncoprintModel = /** @class */ (function () {
|
|
|
1616
1622
|
}
|
|
1617
1623
|
return gapIds;
|
|
1618
1624
|
});
|
|
1625
|
+
this.data_groups = new CachedProperty({}, function (model) {
|
|
1626
|
+
// multiple tracks can have gaps
|
|
1627
|
+
// the groups will be segemented heirarchically
|
|
1628
|
+
var trackIdsWithGaps = model
|
|
1629
|
+
.getTracks()
|
|
1630
|
+
.filter(function (trackId) { return model.getTrackShowGaps(trackId); });
|
|
1631
|
+
var data_groups = ___default["default"].reduce(model.track_label, function (agg, label, trackId) {
|
|
1632
|
+
// key the data by the datum UID
|
|
1633
|
+
var keyedData = ___default["default"].keyBy(model.track_data[trackId], function (m) { return m.uid; });
|
|
1634
|
+
var groups = trackIdsWithGaps.map(function (id) {
|
|
1635
|
+
// we need the datum in sorted order
|
|
1636
|
+
var data = model.id_order.map(function (d) { return keyedData[d]; });
|
|
1637
|
+
var indexesAfterGap = model.column_indexes_after_a_gap.get();
|
|
1638
|
+
// the indexes come AFTER a gap, so we need to include zero up front
|
|
1639
|
+
// in order to get initial slice of data
|
|
1640
|
+
var groupStartIndexes = tslib.__spreadArrays([0], indexesAfterGap);
|
|
1641
|
+
// using the group start indexes, slice the id data into corresponding groups
|
|
1642
|
+
return groupStartIndexes.map(function (n, i) {
|
|
1643
|
+
if (i === groupStartIndexes.length - 1) {
|
|
1644
|
+
// we're at last one, so last group
|
|
1645
|
+
return data.slice(n);
|
|
1646
|
+
}
|
|
1647
|
+
else {
|
|
1648
|
+
return data.slice(n, groupStartIndexes[i + 1]);
|
|
1649
|
+
}
|
|
1650
|
+
});
|
|
1651
|
+
});
|
|
1652
|
+
agg[label.trim()] = groups;
|
|
1653
|
+
return agg;
|
|
1654
|
+
}, {});
|
|
1655
|
+
return data_groups;
|
|
1656
|
+
});
|
|
1619
1657
|
this.visible_id_order.addBoundProperty(this.ids_after_a_gap);
|
|
1620
1658
|
this.precomputed_comparator.addBoundProperty(this.ids_after_a_gap);
|
|
1621
1659
|
this.column_indexes_after_a_gap = new CachedProperty([], function (model) {
|
|
@@ -2195,7 +2233,12 @@ var OncoprintModel = /** @class */ (function () {
|
|
|
2195
2233
|
configurable: true,
|
|
2196
2234
|
writable: true,
|
|
2197
2235
|
value: function () {
|
|
2198
|
-
|
|
2236
|
+
if (this.showGaps()) {
|
|
2237
|
+
return 50; // this creates enough space for 3 digit percentage
|
|
2238
|
+
}
|
|
2239
|
+
else {
|
|
2240
|
+
return this.getCellWidth(true);
|
|
2241
|
+
}
|
|
2199
2242
|
}
|
|
2200
2243
|
});
|
|
2201
2244
|
Object.defineProperty(OncoprintModel.prototype, "getCellWidth", {
|
|
@@ -3021,7 +3064,18 @@ var OncoprintModel = /** @class */ (function () {
|
|
|
3021
3064
|
var lastIdLeft = base
|
|
3022
3065
|
? this.getColumnLeft(lastId)
|
|
3023
3066
|
: this.getZoomedColumnLeft(lastId);
|
|
3024
|
-
|
|
3067
|
+
// when gaps are showing, we need to add space at the end of the
|
|
3068
|
+
// oncoprint to accomodate the label
|
|
3069
|
+
var lastGap = this.showGaps() ? this.getGapSize() : 0;
|
|
3070
|
+
return lastIdLeft + this.getCellWidth(base) + lastGap + 1; // this fixes some edge case issues with scrolling
|
|
3071
|
+
}
|
|
3072
|
+
});
|
|
3073
|
+
Object.defineProperty(OncoprintModel.prototype, "showGaps", {
|
|
3074
|
+
enumerable: false,
|
|
3075
|
+
configurable: true,
|
|
3076
|
+
writable: true,
|
|
3077
|
+
value: function () {
|
|
3078
|
+
return ___default["default"].some(this.track_show_gaps);
|
|
3025
3079
|
}
|
|
3026
3080
|
});
|
|
3027
3081
|
Object.defineProperty(OncoprintModel.prototype, "getOncoprintWidthNoColumnPaddingNoGaps", {
|
|
@@ -3340,6 +3394,29 @@ var OncoprintModel = /** @class */ (function () {
|
|
|
3340
3394
|
this.track_custom_options[track_id] = options;
|
|
3341
3395
|
}
|
|
3342
3396
|
});
|
|
3397
|
+
// get the pixel offset (from the grid origin) for the gaps based
|
|
3398
|
+
Object.defineProperty(OncoprintModel.prototype, "getGapOffsets", {
|
|
3399
|
+
enumerable: false,
|
|
3400
|
+
configurable: true,
|
|
3401
|
+
writable: true,
|
|
3402
|
+
value: function () {
|
|
3403
|
+
var _this = this;
|
|
3404
|
+
var offsets = ___default["default"](this.ids_after_a_gap.get())
|
|
3405
|
+
.keys()
|
|
3406
|
+
.map(function (num) { return _this.getZoomedColumnLeft(num); })
|
|
3407
|
+
.sort(function (a, b) { return a - b; })
|
|
3408
|
+
.value();
|
|
3409
|
+
// we only want to include this if gaps are on
|
|
3410
|
+
if (this.showGaps) {
|
|
3411
|
+
var last = this.getZoomedColumnLeft(this.id_order[this.id_order.length - 1]) +
|
|
3412
|
+
this.getGapSize() +
|
|
3413
|
+
this.cell_width +
|
|
3414
|
+
this.cell_padding;
|
|
3415
|
+
offsets.push(last);
|
|
3416
|
+
}
|
|
3417
|
+
return offsets;
|
|
3418
|
+
}
|
|
3419
|
+
});
|
|
3343
3420
|
Object.defineProperty(OncoprintModel.prototype, "setTrackInfoTooltip", {
|
|
3344
3421
|
enumerable: false,
|
|
3345
3422
|
configurable: true,
|
|
@@ -4438,7 +4515,7 @@ var COLUMN_LABEL_ANGLE = 65;
|
|
|
4438
4515
|
var COLUMN_LABEL_MARGIN = 30;
|
|
4439
4516
|
var CELL_HIGHLIGHT_STROKE = 'rgba(0,0,0,0.5)';
|
|
4440
4517
|
var OncoprintWebGLCellView = /** @class */ (function () {
|
|
4441
|
-
function OncoprintWebGLCellView($container, $canvas, $overlay_canvas, $column_label_canvas, $dummy_scroll_div_contents, model, tooltip, highlight_area_callback, cell_over_callback, cell_click_callback) {
|
|
4518
|
+
function OncoprintWebGLCellView($container, $canvas, $overlay_canvas, $gap_canvas, $column_label_canvas, $dummy_scroll_div_contents, model, tooltip, highlight_area_callback, cell_over_callback, cell_click_callback) {
|
|
4442
4519
|
Object.defineProperty(this, "$container", {
|
|
4443
4520
|
enumerable: true,
|
|
4444
4521
|
configurable: true,
|
|
@@ -4457,6 +4534,12 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
4457
4534
|
writable: true,
|
|
4458
4535
|
value: $overlay_canvas
|
|
4459
4536
|
});
|
|
4537
|
+
Object.defineProperty(this, "$gap_canvas", {
|
|
4538
|
+
enumerable: true,
|
|
4539
|
+
configurable: true,
|
|
4540
|
+
writable: true,
|
|
4541
|
+
value: $gap_canvas
|
|
4542
|
+
});
|
|
4460
4543
|
Object.defineProperty(this, "$column_label_canvas", {
|
|
4461
4544
|
enumerable: true,
|
|
4462
4545
|
configurable: true,
|
|
@@ -4529,6 +4612,12 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
4529
4612
|
writable: true,
|
|
4530
4613
|
value: void 0
|
|
4531
4614
|
});
|
|
4615
|
+
Object.defineProperty(this, "gap_ctx", {
|
|
4616
|
+
enumerable: true,
|
|
4617
|
+
configurable: true,
|
|
4618
|
+
writable: true,
|
|
4619
|
+
value: void 0
|
|
4620
|
+
});
|
|
4532
4621
|
Object.defineProperty(this, "ext", {
|
|
4533
4622
|
enumerable: true,
|
|
4534
4623
|
configurable: true,
|
|
@@ -4661,6 +4750,18 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
4661
4750
|
writable: true,
|
|
4662
4751
|
value: {}
|
|
4663
4752
|
}); // index of first vertex corresponding to given id for given track, e.g. 0, 3, 6, ...
|
|
4753
|
+
Object.defineProperty(this, "gapTooltipTargets", {
|
|
4754
|
+
enumerable: true,
|
|
4755
|
+
configurable: true,
|
|
4756
|
+
writable: true,
|
|
4757
|
+
value: []
|
|
4758
|
+
});
|
|
4759
|
+
Object.defineProperty(this, "hoveredGap", {
|
|
4760
|
+
enumerable: true,
|
|
4761
|
+
configurable: true,
|
|
4762
|
+
writable: true,
|
|
4763
|
+
value: void 0
|
|
4764
|
+
});
|
|
4664
4765
|
this.getWebGLContextAndSetUpMatrices();
|
|
4665
4766
|
this.setUpShaders(model);
|
|
4666
4767
|
this.getOverlayContextAndClear();
|
|
@@ -4767,9 +4868,28 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
4767
4868
|
self.scroll_y, model.getTrackTooltipFn(overlapping_cells.track)(overlapping_data));
|
|
4768
4869
|
}
|
|
4769
4870
|
else {
|
|
4770
|
-
tooltip.hideIfNotAlreadyGoingTo(150);
|
|
4771
4871
|
overlapping_cells = null;
|
|
4772
4872
|
}
|
|
4873
|
+
// find a gap which is in range of mouse position
|
|
4874
|
+
var overlappingGap = self.gapTooltipTargets.find(function (t) {
|
|
4875
|
+
return (___default["default"].inRange(mouseX - t.origin_x, 0, 20) &&
|
|
4876
|
+
___default["default"].inRange(t.origin_y - mouseY, -10, 15));
|
|
4877
|
+
});
|
|
4878
|
+
// if there is no gap, turn
|
|
4879
|
+
if (overlappingGap === undefined) {
|
|
4880
|
+
self.hoveredGap = undefined;
|
|
4881
|
+
}
|
|
4882
|
+
else if (self.hoveredGap === overlappingGap) ;
|
|
4883
|
+
else {
|
|
4884
|
+
// we have a new hovered gap, so show a tooltip
|
|
4885
|
+
var clientRect = self.$overlay_canvas[0].getBoundingClientRect();
|
|
4886
|
+
self.hoveredGap = overlappingGap;
|
|
4887
|
+
tooltip.center = false;
|
|
4888
|
+
tooltip.show(250, clientRect.left + overlappingGap.origin_x, clientRect.top + overlappingGap.origin_y - 20, $__default["default"]("<span>" + overlappingGap.data.tooltipFormatter() + "</span>"), false);
|
|
4889
|
+
}
|
|
4890
|
+
if (!overlapping_data && !overlappingGap) {
|
|
4891
|
+
tooltip.hideIfNotAlreadyGoingTo(150);
|
|
4892
|
+
}
|
|
4773
4893
|
}
|
|
4774
4894
|
else {
|
|
4775
4895
|
overlapping_cells = null;
|
|
@@ -4813,6 +4933,22 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
4813
4933
|
self.highlightHighlightedTracks(model);
|
|
4814
4934
|
});
|
|
4815
4935
|
}
|
|
4936
|
+
Object.defineProperty(OncoprintWebGLCellView.prototype, "drawGapLabel", {
|
|
4937
|
+
enumerable: false,
|
|
4938
|
+
configurable: true,
|
|
4939
|
+
writable: true,
|
|
4940
|
+
value: function (txt, x, y) {
|
|
4941
|
+
this.gap_ctx.font = '15pt Arial';
|
|
4942
|
+
this.gap_ctx.textAlign = 'right';
|
|
4943
|
+
var origin_x = x * this.supersampling_ratio + 52;
|
|
4944
|
+
var origin_y = y * this.supersampling_ratio + 4;
|
|
4945
|
+
this.gap_ctx.fillText(txt, origin_x, origin_y);
|
|
4946
|
+
return {
|
|
4947
|
+
origin_x: x,
|
|
4948
|
+
origin_y: y,
|
|
4949
|
+
};
|
|
4950
|
+
}
|
|
4951
|
+
});
|
|
4816
4952
|
Object.defineProperty(OncoprintWebGLCellView.prototype, "getNewCanvas", {
|
|
4817
4953
|
enumerable: false,
|
|
4818
4954
|
configurable: true,
|
|
@@ -4828,6 +4964,19 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
4828
4964
|
this.ext = null;
|
|
4829
4965
|
}
|
|
4830
4966
|
});
|
|
4967
|
+
Object.defineProperty(OncoprintWebGLCellView.prototype, "getGapContext", {
|
|
4968
|
+
enumerable: false,
|
|
4969
|
+
configurable: true,
|
|
4970
|
+
writable: true,
|
|
4971
|
+
value: function () {
|
|
4972
|
+
try {
|
|
4973
|
+
return this.$gap_canvas[0].getContext('2d');
|
|
4974
|
+
}
|
|
4975
|
+
catch (e) {
|
|
4976
|
+
return null;
|
|
4977
|
+
}
|
|
4978
|
+
}
|
|
4979
|
+
});
|
|
4831
4980
|
Object.defineProperty(OncoprintWebGLCellView.prototype, "getWebGLCanvasContext", {
|
|
4832
4981
|
enumerable: false,
|
|
4833
4982
|
configurable: true,
|
|
@@ -4991,6 +5140,7 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
4991
5140
|
configurable: true,
|
|
4992
5141
|
writable: true,
|
|
4993
5142
|
value: function () {
|
|
5143
|
+
this.gap_ctx = this.getGapContext();
|
|
4994
5144
|
this.ctx = this.getWebGLCanvasContext();
|
|
4995
5145
|
if (this.ctx) {
|
|
4996
5146
|
this.ext = this.ctx.getExtension('ANGLE_instanced_arrays');
|
|
@@ -5069,6 +5219,11 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
5069
5219
|
this.dummy_scroll_div_client_size.update();
|
|
5070
5220
|
this.$canvas[0].height = this.supersampling_ratio * height;
|
|
5071
5221
|
this.$canvas[0].style.height = height + 'px';
|
|
5222
|
+
this.$gap_canvas[0].height = this.supersampling_ratio * height;
|
|
5223
|
+
this.$gap_canvas[0].style.height = height + 'px';
|
|
5224
|
+
this.$gap_canvas[0].width =
|
|
5225
|
+
this.supersampling_ratio * visible_area_width;
|
|
5226
|
+
this.$gap_canvas[0].style.width = visible_area_width + 'px';
|
|
5072
5227
|
this.$overlay_canvas[0].height = this.supersampling_ratio * height;
|
|
5073
5228
|
this.$overlay_canvas[0].style.height = height + 'px';
|
|
5074
5229
|
this.$column_label_canvas[0].height = this.supersampling_ratio * height;
|
|
@@ -5094,6 +5249,7 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
5094
5249
|
configurable: true,
|
|
5095
5250
|
writable: true,
|
|
5096
5251
|
value: function (model, dont_resize) {
|
|
5252
|
+
var _this = this;
|
|
5097
5253
|
if (this.rendering_suppressed) {
|
|
5098
5254
|
return;
|
|
5099
5255
|
}
|
|
@@ -5123,75 +5279,98 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
5123
5279
|
}
|
|
5124
5280
|
this.ctx.clearColor(1.0, 1.0, 1.0, 1.0);
|
|
5125
5281
|
this.ctx.clear(this.ctx.COLOR_BUFFER_BIT | this.ctx.DEPTH_BUFFER_BIT);
|
|
5282
|
+
this.gap_ctx.clearRect(0, 0, this.$gap_canvas[0].width, this.$gap_canvas[0].height);
|
|
5283
|
+
var gapOffsets = model.getGapOffsets();
|
|
5126
5284
|
var tracks = model.getTracks();
|
|
5127
|
-
|
|
5285
|
+
this.gapTooltipTargets = [];
|
|
5286
|
+
var _loop_1 = function (i) {
|
|
5128
5287
|
var track_id = tracks[i];
|
|
5129
5288
|
var cell_top = model.getCellTops(track_id);
|
|
5130
5289
|
var cell_height = model.getCellHeight(track_id);
|
|
5290
|
+
if (model.showGaps()) {
|
|
5291
|
+
var gaps = this_1.getGaps(model, track_id);
|
|
5292
|
+
if (gaps) {
|
|
5293
|
+
gaps.forEach(function (gap, i) {
|
|
5294
|
+
var x = gapOffsets[i] - scroll_x - model.getGapSize();
|
|
5295
|
+
var y = model.getZoomedTrackTops()[track_id] +
|
|
5296
|
+
cell_height -
|
|
5297
|
+
scroll_y;
|
|
5298
|
+
_this.drawGapLabel(gap.labelFormatter(), x, y);
|
|
5299
|
+
_this.gapTooltipTargets.push({
|
|
5300
|
+
origin_x: x,
|
|
5301
|
+
origin_y: y,
|
|
5302
|
+
data: gap,
|
|
5303
|
+
});
|
|
5304
|
+
});
|
|
5305
|
+
}
|
|
5306
|
+
}
|
|
5131
5307
|
if (cell_top / zoom_y >= window_bottom ||
|
|
5132
5308
|
(cell_top + cell_height) / zoom_y < window_top) {
|
|
5133
|
-
|
|
5134
|
-
continue;
|
|
5309
|
+
return "continue";
|
|
5135
5310
|
}
|
|
5136
|
-
var buffers =
|
|
5311
|
+
var buffers = this_1.getTrackBuffers(track_id);
|
|
5137
5312
|
if (buffers.position.numItems === 0) {
|
|
5138
|
-
continue;
|
|
5313
|
+
return "continue";
|
|
5139
5314
|
}
|
|
5140
5315
|
for (var _i = 0, _a = [false, true]; _i < _a.length; _i++) {
|
|
5141
5316
|
var forSpecificShapes = _a[_i];
|
|
5142
|
-
var shader_program =
|
|
5143
|
-
|
|
5317
|
+
var shader_program = this_1.shader_program;
|
|
5318
|
+
this_1.ctx.useProgram(shader_program);
|
|
5144
5319
|
if (forSpecificShapes) {
|
|
5145
|
-
|
|
5146
|
-
|
|
5147
|
-
|
|
5148
|
-
|
|
5149
|
-
|
|
5150
|
-
|
|
5320
|
+
this_1.ctx.bindBuffer(this_1.ctx.ARRAY_BUFFER, buffers.position);
|
|
5321
|
+
this_1.ctx.vertexAttribPointer(shader_program.vertexPositionAttribute, buffers.position.itemSize, this_1.ctx.FLOAT, false, 0, 0);
|
|
5322
|
+
this_1.ctx.bindBuffer(this_1.ctx.ARRAY_BUFFER, buffers.color);
|
|
5323
|
+
this_1.ctx.vertexAttribPointer(shader_program.vertexColorAttribute, buffers.color.itemSize, this_1.ctx.FLOAT, false, 0, 0);
|
|
5324
|
+
this_1.ctx.bindBuffer(this_1.ctx.ARRAY_BUFFER, buffers.column);
|
|
5325
|
+
this_1.ctx.vertexAttribPointer(shader_program.vertexOncoprintColumnAttribute, buffers.column.itemSize, this_1.ctx.FLOAT, false, 0, 0);
|
|
5151
5326
|
// make sure to set divisor 0, otherwise the track will only use the first item in the column buffer
|
|
5152
|
-
|
|
5327
|
+
this_1.ext.vertexAttribDivisorANGLE(shader_program.vertexOncoprintColumnAttribute, 0);
|
|
5153
5328
|
}
|
|
5154
5329
|
else {
|
|
5155
5330
|
// set up for drawArraysInstanced
|
|
5156
5331
|
var universalShapesStart = buffers.position.specificShapesNumItems *
|
|
5157
5332
|
buffers.position.itemSize;
|
|
5158
|
-
|
|
5159
|
-
|
|
5160
|
-
|
|
5161
|
-
|
|
5162
|
-
|
|
5163
|
-
|
|
5164
|
-
|
|
5333
|
+
this_1.ctx.bindBuffer(this_1.ctx.ARRAY_BUFFER, buffers.position);
|
|
5334
|
+
this_1.ctx.vertexAttribPointer(shader_program.vertexPositionAttribute, buffers.position.itemSize, this_1.ctx.FLOAT, false, 0, 4 * universalShapesStart);
|
|
5335
|
+
this_1.ctx.bindBuffer(this_1.ctx.ARRAY_BUFFER, buffers.color);
|
|
5336
|
+
this_1.ctx.vertexAttribPointer(shader_program.vertexColorAttribute, buffers.color.itemSize, this_1.ctx.FLOAT, false, 0, 4 * universalShapesStart);
|
|
5337
|
+
this_1.ctx.bindBuffer(this_1.ctx.ARRAY_BUFFER, this_1.simple_count_buffer);
|
|
5338
|
+
this_1.ctx.vertexAttribPointer(shader_program.vertexOncoprintColumnAttribute, 1, this_1.ctx.FLOAT, false, 0, 4 * horz_first_id_in_window_index);
|
|
5339
|
+
this_1.ext.vertexAttribDivisorANGLE(shader_program.vertexOncoprintColumnAttribute, 1);
|
|
5165
5340
|
}
|
|
5166
|
-
|
|
5167
|
-
|
|
5168
|
-
|
|
5169
|
-
|
|
5170
|
-
|
|
5171
|
-
|
|
5172
|
-
|
|
5173
|
-
|
|
5174
|
-
|
|
5175
|
-
|
|
5176
|
-
|
|
5177
|
-
|
|
5178
|
-
|
|
5179
|
-
|
|
5180
|
-
|
|
5181
|
-
|
|
5341
|
+
this_1.ctx.activeTexture(this_1.ctx.TEXTURE0);
|
|
5342
|
+
this_1.ctx.bindTexture(this_1.ctx.TEXTURE_2D, buffers.color_tex.texture);
|
|
5343
|
+
this_1.ctx.uniform1i(shader_program.samplerUniform, 0);
|
|
5344
|
+
this_1.ctx.uniform1f(shader_program.texSizeUniform, buffers.color_tex.size);
|
|
5345
|
+
this_1.ctx.uniform1fv(shader_program.columnsRightAfterGapsUniform, this_1.getColumnIndexesAfterAGap(model)); // need min size of 1
|
|
5346
|
+
this_1.ctx.uniform1f(shader_program.gapSizeUniform, model.getGapSize());
|
|
5347
|
+
this_1.ctx.uniformMatrix4fv(shader_program.pMatrixUniform, false, this_1.pMatrix);
|
|
5348
|
+
this_1.ctx.uniformMatrix4fv(shader_program.mvMatrixUniform, false, this_1.mvMatrix);
|
|
5349
|
+
this_1.ctx.uniform1f(shader_program.columnWidthUniform, model.getCellWidth(true) + model.getCellPadding(true));
|
|
5350
|
+
this_1.ctx.uniform1f(shader_program.scrollXUniform, scroll_x);
|
|
5351
|
+
this_1.ctx.uniform1f(shader_program.scrollYUniform, scroll_y);
|
|
5352
|
+
this_1.ctx.uniform1f(shader_program.zoomXUniform, zoom_x);
|
|
5353
|
+
this_1.ctx.uniform1f(shader_program.zoomYUniform, zoom_y);
|
|
5354
|
+
this_1.ctx.uniform1f(shader_program.offsetYUniform, cell_top);
|
|
5355
|
+
this_1.ctx.uniform1f(shader_program.supersamplingRatioUniform, this_1.supersampling_ratio);
|
|
5356
|
+
this_1.ctx.uniform1f(shader_program.positionBitPackBaseUniform, this_1.position_bit_pack_base);
|
|
5182
5357
|
if (forSpecificShapes) {
|
|
5183
|
-
var first_index =
|
|
5358
|
+
var first_index = this_1.id_to_first_vertex_index[track_id][horz_first_id_in_window];
|
|
5184
5359
|
var first_index_out = horz_first_id_after_window === null
|
|
5185
5360
|
? buffers.position.specificShapesNumItems
|
|
5186
|
-
:
|
|
5187
|
-
|
|
5361
|
+
: this_1.id_to_first_vertex_index[track_id][horz_first_id_after_window];
|
|
5362
|
+
this_1.ctx.drawArrays(this_1.ctx.TRIANGLES, first_index, first_index_out - first_index);
|
|
5188
5363
|
}
|
|
5189
5364
|
else {
|
|
5190
|
-
|
|
5365
|
+
this_1.ext.drawArraysInstancedANGLE(this_1.ctx.TRIANGLES, 0, buffers.position.itemSize *
|
|
5191
5366
|
buffers.position.universalShapesNumItems, horz_first_id_after_window_index -
|
|
5192
5367
|
horz_first_id_in_window_index);
|
|
5193
5368
|
}
|
|
5194
5369
|
}
|
|
5370
|
+
};
|
|
5371
|
+
var this_1 = this;
|
|
5372
|
+
for (var i = 0; i < tracks.length; i++) {
|
|
5373
|
+
_loop_1(i);
|
|
5195
5374
|
}
|
|
5196
5375
|
this.ctx.flush();
|
|
5197
5376
|
this.renderColumnLabels(model, id_order.slice(horz_first_id_in_window_index, horz_first_id_after_window_index === -1
|
|
@@ -6200,21 +6379,57 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
6200
6379
|
return this.dummy_scroll_div_client_size.get();
|
|
6201
6380
|
}
|
|
6202
6381
|
});
|
|
6382
|
+
Object.defineProperty(OncoprintWebGLCellView.prototype, "getGaps", {
|
|
6383
|
+
enumerable: false,
|
|
6384
|
+
configurable: true,
|
|
6385
|
+
writable: true,
|
|
6386
|
+
value: function (model, track_id) {
|
|
6387
|
+
var _a;
|
|
6388
|
+
var custom = model.getTrackCustomOptions(track_id);
|
|
6389
|
+
return ___default["default"].isEmpty(model.ids_after_a_gap.get())
|
|
6390
|
+
? undefined
|
|
6391
|
+
: (_a = custom.find(function (t) { return !!t.gapLabelsFn; })) === null || _a === void 0 ? void 0 : _a.gapLabelsFn(model);
|
|
6392
|
+
}
|
|
6393
|
+
});
|
|
6203
6394
|
Object.defineProperty(OncoprintWebGLCellView.prototype, "toSVGGroup", {
|
|
6204
6395
|
enumerable: false,
|
|
6205
6396
|
configurable: true,
|
|
6206
6397
|
writable: true,
|
|
6207
6398
|
value: function (model, offset_x, offset_y) {
|
|
6399
|
+
var _a;
|
|
6208
6400
|
var root = svgfactory.group(offset_x || 0, offset_y || 0);
|
|
6209
6401
|
var cell_tops = model.getCellTops();
|
|
6210
6402
|
var tracks = model.getTracks();
|
|
6211
6403
|
var zoomedColumnLeft = model.getZoomedColumnLeft();
|
|
6212
6404
|
// add cell shapes
|
|
6213
|
-
|
|
6405
|
+
var gapOffsets = model.getGapOffsets();
|
|
6406
|
+
var _loop_2 = function (i) {
|
|
6214
6407
|
var track_id = tracks[i];
|
|
6215
6408
|
var offset_y_1 = cell_tops[track_id];
|
|
6409
|
+
var cell_height = model.getCellHeight(track_id);
|
|
6216
6410
|
var universal_shapes = model.getTrackUniversalShapes(track_id, false);
|
|
6217
6411
|
var identified_shape_list_list = model.getSpecificShapesForData(track_id, false);
|
|
6412
|
+
var custom = model.getTrackCustomOptions(track_id);
|
|
6413
|
+
if (gapOffsets[0]) {
|
|
6414
|
+
var gaps = ___default["default"].isEmpty(model.ids_after_a_gap.get())
|
|
6415
|
+
? undefined
|
|
6416
|
+
: (_a = custom.find(function (t) { return !!t.gapLabelsFn; })) === null || _a === void 0 ? void 0 : _a.gapLabelsFn(model);
|
|
6417
|
+
if (gaps) {
|
|
6418
|
+
gaps.forEach(function (gap, i) {
|
|
6419
|
+
var textElt = makesvgelement('text', {
|
|
6420
|
+
x: gapOffsets[i] - model.getGapSize() + 25,
|
|
6421
|
+
y: offset_y_1 + cell_height - 3,
|
|
6422
|
+
'font-size': '10',
|
|
6423
|
+
'font-family': 'Arial',
|
|
6424
|
+
'font-weight': 'normal',
|
|
6425
|
+
'text-anchor': 'end',
|
|
6426
|
+
'alignment-baseline': 'top',
|
|
6427
|
+
});
|
|
6428
|
+
textElt.textContent = gap.labelFormatter();
|
|
6429
|
+
root.appendChild(textElt);
|
|
6430
|
+
});
|
|
6431
|
+
}
|
|
6432
|
+
}
|
|
6218
6433
|
for (var j = 0; j < identified_shape_list_list.length; j++) {
|
|
6219
6434
|
var id_sl = identified_shape_list_list[j];
|
|
6220
6435
|
var id = id_sl.id;
|
|
@@ -6233,6 +6448,9 @@ var OncoprintWebGLCellView = /** @class */ (function () {
|
|
|
6233
6448
|
root.appendChild(svgfactory.fromShape(sl[h], offset_x_1, offset_y_1));
|
|
6234
6449
|
}
|
|
6235
6450
|
}
|
|
6451
|
+
};
|
|
6452
|
+
for (var i = 0; i < tracks.length; i++) {
|
|
6453
|
+
_loop_2(i);
|
|
6236
6454
|
}
|
|
6237
6455
|
// add column labels
|
|
6238
6456
|
var labels = model.getColumnLabels();
|
|
@@ -9720,20 +9938,24 @@ var OncoprintTrackOptionsView = /** @class */ (function () {
|
|
|
9720
9938
|
.addClass(SEPARATOR_CLASS);
|
|
9721
9939
|
}
|
|
9722
9940
|
});
|
|
9941
|
+
// 11/2/2023 we are removing sort arrow
|
|
9942
|
+
// leaving commented out if it needs to be restored based on complaint
|
|
9723
9943
|
Object.defineProperty(OncoprintTrackOptionsView, "renderSortArrow", {
|
|
9724
9944
|
enumerable: false,
|
|
9725
9945
|
configurable: true,
|
|
9726
9946
|
writable: true,
|
|
9727
9947
|
value: function ($sortarrow, model, track_id) {
|
|
9728
|
-
|
|
9729
|
-
if (model.isTrackSortDirectionChangeable(track_id)) {
|
|
9730
|
-
|
|
9731
|
-
|
|
9732
|
-
|
|
9733
|
-
|
|
9734
|
-
|
|
9735
|
-
|
|
9736
|
-
|
|
9948
|
+
// let sortarrow_char = '';
|
|
9949
|
+
// if (model.isTrackSortDirectionChangeable(track_id)) {
|
|
9950
|
+
// sortarrow_char = {
|
|
9951
|
+
// '1':
|
|
9952
|
+
// '<i class="fa fa-signal" aria-hidden="true" title="Sorted ascending"></i>',
|
|
9953
|
+
// '-1':
|
|
9954
|
+
// '<i class="fa fa-signal" style="transform: scaleX(-1);" aria-hidden="true" title="Sorted descending"></i>',
|
|
9955
|
+
// '0': '',
|
|
9956
|
+
// }[model.getTrackSortDirection(track_id)];
|
|
9957
|
+
// }
|
|
9958
|
+
// $sortarrow.html(sortarrow_char);
|
|
9737
9959
|
}
|
|
9738
9960
|
});
|
|
9739
9961
|
Object.defineProperty(OncoprintTrackOptionsView.prototype, "renderTrackOptions", {
|
|
@@ -10827,7 +11049,7 @@ var OncoprintTrackInfoView = /** @class */ (function () {
|
|
|
10827
11049
|
})
|
|
10828
11050
|
.appendTo(this.$div);
|
|
10829
11051
|
this.$text_ctr = $__default["default"]('<div></div>')
|
|
10830
|
-
.css({ position: 'absolute' })
|
|
11052
|
+
.css({ position: 'absolute', overflow: 'visible', width: '100%' })
|
|
10831
11053
|
.appendTo(this.$ctr);
|
|
10832
11054
|
}
|
|
10833
11055
|
Object.defineProperty(OncoprintTrackInfoView.prototype, "destroyLabelElts", {
|
|
@@ -10870,13 +11092,26 @@ var OncoprintTrackInfoView = /** @class */ (function () {
|
|
|
10870
11092
|
'font-family': self.font_family,
|
|
10871
11093
|
'font-weight': self.font_weight,
|
|
10872
11094
|
'font-size': font_size,
|
|
11095
|
+
right: '11px',
|
|
10873
11096
|
})
|
|
10874
11097
|
.addClass('noselect');
|
|
10875
11098
|
var text = model.getTrackInfo(tracks[i]);
|
|
10876
11099
|
if (!text) {
|
|
10877
11100
|
return;
|
|
10878
11101
|
}
|
|
10879
|
-
|
|
11102
|
+
var float = parseFloat(text);
|
|
11103
|
+
var formattedPercent = '';
|
|
11104
|
+
if (isNaN(float)) {
|
|
11105
|
+
formattedPercent = 'N/P';
|
|
11106
|
+
}
|
|
11107
|
+
else if (_.isNumber(float)) {
|
|
11108
|
+
formattedPercent =
|
|
11109
|
+
float < 1 && float > 0
|
|
11110
|
+
? '<1%'
|
|
11111
|
+
: Math.round(float) + '%';
|
|
11112
|
+
}
|
|
11113
|
+
else ;
|
|
11114
|
+
$new_label.text(formattedPercent);
|
|
10880
11115
|
$new_label.appendTo(self.$text_ctr);
|
|
10881
11116
|
self.$label_elts.push($new_label);
|
|
10882
11117
|
setTimeout(function () {
|
|
@@ -11179,6 +11414,7 @@ var OncoprintZoomSlider = /** @class */ (function () {
|
|
|
11179
11414
|
value: function (params) {
|
|
11180
11415
|
var $ctr = this.$div;
|
|
11181
11416
|
var icon_size = Math.round(params.btn_size * 0.7);
|
|
11417
|
+
var icon_div_border_size = 1;
|
|
11182
11418
|
var icon_padding = Math.round((params.btn_size - icon_size) / 2);
|
|
11183
11419
|
var $slider_bar = $__default["default"]('<div>')
|
|
11184
11420
|
.css({
|
|
@@ -11202,7 +11438,7 @@ var OncoprintZoomSlider = /** @class */ (function () {
|
|
|
11202
11438
|
'min-height': params.btn_size,
|
|
11203
11439
|
'min-width': params.btn_size,
|
|
11204
11440
|
'background-color': '#ffffff',
|
|
11205
|
-
border:
|
|
11441
|
+
border: "solid " + icon_div_border_size + "px black",
|
|
11206
11442
|
'border-radius': '3px',
|
|
11207
11443
|
cursor: 'pointer',
|
|
11208
11444
|
})
|
|
@@ -11211,8 +11447,8 @@ var OncoprintZoomSlider = /** @class */ (function () {
|
|
|
11211
11447
|
.addClass('icon fa fa-plus')
|
|
11212
11448
|
.css({
|
|
11213
11449
|
position: 'absolute',
|
|
11214
|
-
top: icon_padding,
|
|
11215
|
-
left: icon_padding,
|
|
11450
|
+
top: icon_padding - icon_div_border_size,
|
|
11451
|
+
left: icon_padding - icon_div_border_size,
|
|
11216
11452
|
'min-width': icon_size,
|
|
11217
11453
|
'min-height': icon_size,
|
|
11218
11454
|
})
|
|
@@ -11223,7 +11459,7 @@ var OncoprintZoomSlider = /** @class */ (function () {
|
|
|
11223
11459
|
'min-height': params.btn_size,
|
|
11224
11460
|
'min-width': params.btn_size,
|
|
11225
11461
|
'background-color': '#ffffff',
|
|
11226
|
-
border:
|
|
11462
|
+
border: "solid " + icon_div_border_size + "px black",
|
|
11227
11463
|
'border-radius': '3px',
|
|
11228
11464
|
cursor: 'pointer',
|
|
11229
11465
|
})
|
|
@@ -11232,8 +11468,8 @@ var OncoprintZoomSlider = /** @class */ (function () {
|
|
|
11232
11468
|
.addClass('icon fa fa-minus')
|
|
11233
11469
|
.css({
|
|
11234
11470
|
position: 'absolute',
|
|
11235
|
-
top: icon_padding,
|
|
11236
|
-
left: icon_padding,
|
|
11471
|
+
top: icon_padding - icon_div_border_size,
|
|
11472
|
+
left: icon_padding - icon_div_border_size,
|
|
11237
11473
|
'min-width': icon_size,
|
|
11238
11474
|
'min-height': icon_size,
|
|
11239
11475
|
})
|
|
@@ -13115,6 +13351,10 @@ var Oncoprint = /** @class */ (function () {
|
|
|
13115
13351
|
.attr({ width: '0px', height: '0px' })
|
|
13116
13352
|
.css({ position: 'absolute', top: '0px', left: '0px' })
|
|
13117
13353
|
.addClass('noselect');
|
|
13354
|
+
var $gap_canvas = $__default["default"]('<canvas></canvas>')
|
|
13355
|
+
.attr({ width: '0px', height: '0px' })
|
|
13356
|
+
.css({ position: 'absolute', top: '0px', left: '0px' })
|
|
13357
|
+
.addClass('noselect gap_canvas');
|
|
13118
13358
|
var $dummy_scroll_div = $__default["default"]('<div>')
|
|
13119
13359
|
.css({
|
|
13120
13360
|
position: 'absolute',
|
|
@@ -13177,6 +13417,7 @@ var Oncoprint = /** @class */ (function () {
|
|
|
13177
13417
|
$legend_div.appendTo($legend_ctr);
|
|
13178
13418
|
$minimap_div.appendTo($ctr);
|
|
13179
13419
|
$cell_canvas.appendTo($cell_div);
|
|
13420
|
+
$gap_canvas.appendTo($cell_div);
|
|
13180
13421
|
$cell_overlay_canvas.appendTo($cell_div);
|
|
13181
13422
|
$column_label_canvas.appendTo($cell_div); // column labels should show above the overlay canvas because the text should show over the highlights
|
|
13182
13423
|
$dummy_scroll_div.appendTo($cell_div);
|
|
@@ -13198,7 +13439,7 @@ var Oncoprint = /** @class */ (function () {
|
|
|
13198
13439
|
this.$cell_overlay_canvas = $cell_overlay_canvas;
|
|
13199
13440
|
this.model = new OncoprintModel(params);
|
|
13200
13441
|
this.header_view = new OncoprintHeaderView(this.$header_div);
|
|
13201
|
-
this.cell_view = new OncoprintWebGLCellView($cell_div, $cell_canvas, $cell_overlay_canvas, $column_label_canvas, $dummy_scroll_div_contents, this.model, new OncoprintToolTip($tooltip_ctr), function (left, right) {
|
|
13442
|
+
this.cell_view = new OncoprintWebGLCellView($cell_div, $cell_canvas, $cell_overlay_canvas, $gap_canvas, $column_label_canvas, $dummy_scroll_div_contents, this.model, new OncoprintToolTip($tooltip_ctr), function (left, right) {
|
|
13202
13443
|
var enclosed_ids = self.model.getIdsInZoomedLeftInterval(left, right);
|
|
13203
13444
|
self.setHorzZoom(self.model.getHorzZoomToFit(self.cell_view.getVisibleAreaWidth(), enclosed_ids));
|
|
13204
13445
|
self.$dummy_scroll_div.scrollLeft(self.model.getZoomedColumnLeft(enclosed_ids[0]));
|
|
@@ -14754,6 +14995,7 @@ var Oncoprint = /** @class */ (function () {
|
|
|
14754
14995
|
|
|
14755
14996
|
exports.GeneticAlterationRuleSet = GeneticAlterationRuleSet;
|
|
14756
14997
|
exports.OncoprintJS = Oncoprint;
|
|
14998
|
+
exports.OncoprintModel = OncoprintModel;
|
|
14757
14999
|
exports.Rule = Rule;
|
|
14758
15000
|
exports.RuleSet = RuleSet;
|
|
14759
15001
|
exports.shapeToSvg = shapeToSVG;
|