oncoprintjs 5.0.3 → 6.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.
- package/README.md +34 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.es.js +14746 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.js +14760 -0
- package/dist/index.js.map +1 -0
- package/dist/js/CachedProperty.d.ts +10 -10
- package/dist/js/binarysearch.d.ts +1 -1
- package/dist/js/bucketsort.d.ts +16 -16
- package/dist/js/clustering.d.ts +14 -14
- package/dist/js/extractrgba.d.ts +4 -4
- package/dist/js/haselementsininterval.d.ts +1 -1
- package/dist/js/heatmapcolors.d.ts +5 -4
- package/dist/js/makesvgelement.d.ts +1 -1
- package/dist/js/modelutils.d.ts +7 -7
- package/dist/js/oncoprint.d.ts +168 -170
- package/dist/js/oncoprintheaderview.d.ts +23 -22
- package/dist/js/oncoprintlabelview.d.ts +79 -78
- package/dist/js/oncoprintlegendrenderer.d.ts +32 -31
- package/dist/js/oncoprintminimapview.d.ts +69 -68
- package/dist/js/oncoprintmodel.d.ts +403 -398
- package/dist/js/oncoprintruleset.d.ts +176 -177
- package/dist/js/oncoprintshape.d.ts +67 -67
- package/dist/js/oncoprintshapetosvg.d.ts +2 -2
- package/dist/js/oncoprintshapetovertexes.d.ts +5 -5
- package/dist/js/oncoprinttooltip.d.ts +23 -22
- package/dist/js/oncoprinttrackinfoview.d.ts +40 -39
- package/dist/js/oncoprinttrackoptionsview.d.ts +58 -57
- package/dist/js/oncoprintwebglcellview.d.ts +168 -167
- package/dist/js/oncoprintzoomslider.d.ts +28 -27
- package/dist/js/polyfill.d.ts +4 -4
- package/dist/js/precomputedcomparator.d.ts +13 -13
- package/dist/js/shaders.d.ts +2 -2
- package/dist/js/svgfactory.d.ts +24 -23
- package/dist/js/utils.d.ts +16 -16
- package/dist/js/workers/clustering-worker.d.ts +19 -20
- package/dist/test/gradientCategoricalRuleset.spec.d.ts +1 -1
- package/dist/test/monolith.spec.d.ts +1 -1
- package/jest.config.ts +2 -0
- package/package.json +20 -26
- package/rollup.config.ts +14 -0
- package/rules/geneticrules.ts +344 -305
- package/server.js +11 -0
- package/src/img/menudots.svg +9 -9
- package/src/img/zoomtofit.svg +12 -12
- package/src/index.tsx +13 -0
- package/src/js/CachedProperty.ts +6 -7
- package/src/js/binarysearch.ts +8 -3
- package/src/js/bucketsort.ts +89 -47
- package/src/js/clustering.ts +22 -10
- package/src/js/extractrgba.ts +16 -12
- package/src/js/haselementsininterval.ts +8 -4
- package/src/js/heatmapcolors.ts +515 -515
- package/src/js/main.js +1 -1
- package/src/js/makesvgelement.ts +2 -2
- package/src/js/modelutils.ts +11 -8
- package/src/js/oncoprint.ts +706 -385
- package/src/js/oncoprintheaderview.ts +165 -125
- package/src/js/oncoprintlabelview.ts +388 -170
- package/src/js/oncoprintlegendrenderer.ts +203 -72
- package/src/js/oncoprintminimapview.ts +965 -423
- package/src/js/oncoprintmodel.ts +905 -532
- package/src/js/oncoprintruleset.ts +694 -379
- package/src/js/oncoprintshape.ts +240 -97
- package/src/js/oncoprintshapetosvg.ts +77 -26
- package/src/js/oncoprintshapetovertexes.ts +153 -48
- package/src/js/oncoprinttooltip.ts +58 -27
- package/src/js/oncoprinttrackinfoview.ts +115 -59
- package/src/js/oncoprinttrackoptionsview.ts +354 -187
- package/src/js/oncoprintwebglcellview.ts +951 -415
- package/src/js/oncoprintzoomslider.ts +172 -107
- package/src/js/polyfill.ts +7 -3
- package/src/js/precomputedcomparator.ts +133 -50
- package/src/js/shaders.ts +2 -4
- package/src/js/svgfactory.ts +128 -73
- package/src/js/utils.ts +51 -31
- package/src/js/workers/clustering-worker.ts +50 -42
- package/src/test/gradientCategoricalRuleset.spec.ts +55 -38
- package/src/test/monolith.spec.ts +718 -285
- package/test/generate_data.py +108 -0
- package/test/glyphmap-data.js +1041 -0
- package/test/heatmap-data.js +1027 -0
- package/test/index.html +21 -0
- package/test/oncoprint-glyphmap.js +79 -0
- package/test/oncoprint-heatmap.js +123 -0
- package/tsconfig.json +4 -10
- package/tsconfig.test.json +11 -0
- package/.idea/misc.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/oncoprintjs.iml +0 -12
- package/.idea/vcs.xml +0 -6
- package/.idea/workspace.xml +0 -105
- package/dist/.gitkeep +0 -0
- package/dist/js/minimaputils.d.ts +0 -0
- package/dist/oncoprint.bundle.js +0 -44313
- package/jest.config.js +0 -12
- package/src/js/minimaputils.ts +0 -0
- package/typings/custom.d.ts +0 -7
- package/typings/missing.d.ts +0 -7
- package/webpack.config.js +0 -43
package/server.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
var express = require('express');
|
|
2
|
+
|
|
3
|
+
var server = express();
|
|
4
|
+
server.use(express.static(__dirname + '/dist'));
|
|
5
|
+
server.use(express.static(__dirname + '/rules'));
|
|
6
|
+
server.use(express.static(__dirname + '/test'));
|
|
7
|
+
|
|
8
|
+
var port = 3000;
|
|
9
|
+
server.listen(port, function() {
|
|
10
|
+
console.log('View Oncoprint at http://localhost:' + port + '/index.html');
|
|
11
|
+
});
|
package/src/img/menudots.svg
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
-
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
3
|
-
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
4
|
-
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
5
|
-
width="4px" height="16px" viewBox="-0.031 0 4 16" enable-background="new -0.031 0 4 16" xml:space="preserve">
|
|
6
|
-
<circle fill="#B2B3B3" cx="1.969" cy="4" r="1.5"/>
|
|
7
|
-
<circle fill="#B2B3B3" cx="1.969" cy="8" r="1.5"/>
|
|
8
|
-
<circle fill="#B2B3B3" cx="1.969" cy="12" r="1.5"/>
|
|
9
|
-
</svg>
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
4
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
5
|
+
width="4px" height="16px" viewBox="-0.031 0 4 16" enable-background="new -0.031 0 4 16" xml:space="preserve">
|
|
6
|
+
<circle fill="#B2B3B3" cx="1.969" cy="4" r="1.5"/>
|
|
7
|
+
<circle fill="#B2B3B3" cx="1.969" cy="8" r="1.5"/>
|
|
8
|
+
<circle fill="#B2B3B3" cx="1.969" cy="12" r="1.5"/>
|
|
9
|
+
</svg>
|
package/src/img/zoomtofit.svg
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
-
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
3
|
-
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
4
|
-
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
5
|
-
width="20px" height="20px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
|
|
6
|
-
<line fill="none" x1="6.792" y1="5.667" x2="6.792" y2="12.125"/>
|
|
7
|
-
<polygon fill="#000000" points="0,5 0,0 5,0 "/>
|
|
8
|
-
<polygon fill="#000000" points="14.999,0 20,0 20,5 "/>
|
|
9
|
-
<polygon fill="#000000" points="20,15 20,20 15,20 "/>
|
|
10
|
-
<polygon fill="#000000" points="5,20 0,20 0,15 "/>
|
|
11
|
-
<rect x="3.75" y="4.708" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" width="12.5" height="10.583"/>
|
|
12
|
-
</svg>
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
|
3
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
4
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
5
|
+
width="20px" height="20px" viewBox="0 0 20 20" enable-background="new 0 0 20 20" xml:space="preserve">
|
|
6
|
+
<line fill="none" x1="6.792" y1="5.667" x2="6.792" y2="12.125"/>
|
|
7
|
+
<polygon fill="#000000" points="0,5 0,0 5,0 "/>
|
|
8
|
+
<polygon fill="#000000" points="14.999,0 20,0 20,5 "/>
|
|
9
|
+
<polygon fill="#000000" points="20,15 20,20 15,20 "/>
|
|
10
|
+
<polygon fill="#000000" points="5,20 0,20 0,15 "/>
|
|
11
|
+
<rect x="3.75" y="4.708" fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" width="12.5" height="10.583"/>
|
|
12
|
+
</svg>
|
package/src/index.tsx
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export {
|
|
2
|
+
default as OncoprintJS,
|
|
3
|
+
InitParams,
|
|
4
|
+
HorzZoomCallback,
|
|
5
|
+
MinimapCloseCallback,
|
|
6
|
+
CellMouseOverCallback,
|
|
7
|
+
CellClickCallback,
|
|
8
|
+
ClipboardChangeCallback,
|
|
9
|
+
} from './js/oncoprint';
|
|
10
|
+
|
|
11
|
+
export * from './js/oncoprintruleset';
|
|
12
|
+
export * from './js/oncoprintmodel';
|
|
13
|
+
export { default as shapeToSvg } from './js/oncoprintshapetosvg';
|
package/src/js/CachedProperty.ts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
export default class CachedProperty<T> {
|
|
2
|
-
private bound_properties:CachedProperty<any>[] = [];
|
|
2
|
+
private bound_properties: CachedProperty<any>[] = [];
|
|
3
3
|
|
|
4
|
-
constructor(private value:T, private updateFn:(...args:any[])=>T) {
|
|
5
|
-
}
|
|
4
|
+
constructor(private value: T, private updateFn: (...args: any[]) => T) {}
|
|
6
5
|
|
|
7
|
-
public update(...args:any[]) {
|
|
6
|
+
public update(...args: any[]) {
|
|
8
7
|
this.value = this.updateFn.apply(null, args);
|
|
9
|
-
for (let i=0; i<this.bound_properties.length; i++) {
|
|
8
|
+
for (let i = 0; i < this.bound_properties.length; i++) {
|
|
10
9
|
this.bound_properties[i].update(...args);
|
|
11
10
|
}
|
|
12
11
|
}
|
|
@@ -19,7 +18,7 @@ export default class CachedProperty<T> {
|
|
|
19
18
|
this.update();
|
|
20
19
|
return this.get();
|
|
21
20
|
}
|
|
22
|
-
public addBoundProperty(cached_property:CachedProperty<any>) {
|
|
21
|
+
public addBoundProperty(cached_property: CachedProperty<any>) {
|
|
23
22
|
this.bound_properties.push(cached_property);
|
|
24
23
|
}
|
|
25
|
-
}
|
|
24
|
+
}
|
package/src/js/binarysearch.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
|
-
export default function binarysearch<T>(
|
|
1
|
+
export default function binarysearch<T>(
|
|
2
|
+
array: T[],
|
|
3
|
+
target_key: number,
|
|
4
|
+
keyFn: (t: T) => number,
|
|
5
|
+
return_closest_lower_if_not_found?: boolean
|
|
6
|
+
) {
|
|
2
7
|
if (!array.length) {
|
|
3
8
|
return -1; // return -1 for an empty array
|
|
4
9
|
}
|
|
@@ -21,8 +26,8 @@ export default function binarysearch<T>(array:T[], target_key:number, keyFn:(t:T
|
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
if (return_closest_lower_if_not_found) {
|
|
24
|
-
return Math.max(0, lower_incl-1);
|
|
29
|
+
return Math.max(0, lower_incl - 1);
|
|
25
30
|
} else {
|
|
26
31
|
return -1;
|
|
27
32
|
}
|
|
28
|
-
}
|
|
33
|
+
}
|
package/src/js/bucketsort.ts
CHANGED
|
@@ -1,45 +1,58 @@
|
|
|
1
|
-
import {extendArray, fastParseInt10, sgndiff} from
|
|
1
|
+
import { extendArray, fastParseInt10, sgndiff } from './utils';
|
|
2
2
|
|
|
3
|
-
const string_type = typeof
|
|
3
|
+
const string_type = typeof '';
|
|
4
4
|
|
|
5
|
-
export type SortingVector = (number|string)[];
|
|
5
|
+
export type SortingVector = (number | string)[];
|
|
6
6
|
|
|
7
7
|
type BucketRange = {
|
|
8
|
-
lower_index_incl:number;
|
|
9
|
-
upper_index_excl:number;
|
|
10
|
-
}
|
|
8
|
+
lower_index_incl: number;
|
|
9
|
+
upper_index_excl: number;
|
|
10
|
+
};
|
|
11
11
|
|
|
12
|
-
type CompareEquals<T> = (a:T, b:T)=>number;
|
|
12
|
+
type CompareEquals<T> = (a: T, b: T) => number;
|
|
13
13
|
|
|
14
|
-
type GetVector<T> = (t:T)=>SortingVector;
|
|
14
|
+
type GetVector<T> = (t: T) => SortingVector;
|
|
15
15
|
|
|
16
|
-
export function bucketSort<T>(
|
|
16
|
+
export function bucketSort<T>(
|
|
17
|
+
array: T[],
|
|
18
|
+
getVector?: (t: T) => SortingVector,
|
|
19
|
+
compareEquals?: CompareEquals<T>
|
|
20
|
+
) {
|
|
17
21
|
// array: an array of data
|
|
18
22
|
// getVector: a function that takes an element of array and returns an int vector. defaults to identity
|
|
19
23
|
// compareEquals: an optional standard sort comparator - if specified it is run on the
|
|
20
24
|
// results of the final buckets before returning
|
|
21
|
-
getVector =
|
|
25
|
+
getVector =
|
|
26
|
+
getVector ||
|
|
27
|
+
(function(d: SortingVector) {
|
|
28
|
+
return d;
|
|
29
|
+
} as any);
|
|
22
30
|
|
|
23
31
|
var current_sorted_array = array;
|
|
24
|
-
var current_bucket_ranges = [
|
|
32
|
+
var current_bucket_ranges = [
|
|
33
|
+
{ lower_index_incl: 0, upper_index_excl: array.length },
|
|
34
|
+
];
|
|
25
35
|
|
|
26
|
-
var new_sorted_array:T[],
|
|
36
|
+
var new_sorted_array: T[],
|
|
37
|
+
new_bucket_ranges: BucketRange[],
|
|
38
|
+
bucket_range,
|
|
39
|
+
sorted_result;
|
|
27
40
|
|
|
28
41
|
// find max length vector, to use as template for vector component types, and whose length will be the sort depth
|
|
29
|
-
var max_length_vector:SortingVector = [];
|
|
42
|
+
var max_length_vector: SortingVector = [];
|
|
30
43
|
var proposed_vector;
|
|
31
|
-
for (var i=0; i<array.length; i++) {
|
|
44
|
+
for (var i = 0; i < array.length; i++) {
|
|
32
45
|
proposed_vector = getVector(array[i]);
|
|
33
46
|
if (proposed_vector.length > max_length_vector.length) {
|
|
34
47
|
max_length_vector = proposed_vector;
|
|
35
48
|
}
|
|
36
49
|
}
|
|
37
50
|
var vector_length = max_length_vector.length;
|
|
38
|
-
for (var vector_index=0; vector_index<vector_length; vector_index++) {
|
|
51
|
+
for (var vector_index = 0; vector_index < vector_length; vector_index++) {
|
|
39
52
|
new_sorted_array = [];
|
|
40
53
|
new_bucket_ranges = [];
|
|
41
54
|
// sort each bucket range, and collect sorted array and new bucket ranges
|
|
42
|
-
for (var j=0; j<current_bucket_ranges.length; j++) {
|
|
55
|
+
for (var j = 0; j < current_bucket_ranges.length; j++) {
|
|
43
56
|
bucket_range = current_bucket_ranges[j];
|
|
44
57
|
sorted_result = bucketSortHelper(
|
|
45
58
|
current_sorted_array,
|
|
@@ -47,7 +60,7 @@ export function bucketSort<T>(array:T[], getVector?:(t:T)=>SortingVector, compar
|
|
|
47
60
|
bucket_range.lower_index_incl,
|
|
48
61
|
bucket_range.upper_index_excl,
|
|
49
62
|
vector_index,
|
|
50
|
-
|
|
63
|
+
typeof max_length_vector[vector_index] === string_type
|
|
51
64
|
);
|
|
52
65
|
extendArray(new_sorted_array, sorted_result.sorted_array);
|
|
53
66
|
extendArray(new_bucket_ranges, sorted_result.bucket_ranges);
|
|
@@ -59,9 +72,12 @@ export function bucketSort<T>(array:T[], getVector?:(t:T)=>SortingVector, compar
|
|
|
59
72
|
if (compareEquals) {
|
|
60
73
|
new_sorted_array = [];
|
|
61
74
|
var bucket_elts;
|
|
62
|
-
for (var j=0; j<current_bucket_ranges.length; j++) {
|
|
75
|
+
for (var j = 0; j < current_bucket_ranges.length; j++) {
|
|
63
76
|
bucket_range = current_bucket_ranges[j];
|
|
64
|
-
bucket_elts = current_sorted_array.slice(
|
|
77
|
+
bucket_elts = current_sorted_array.slice(
|
|
78
|
+
bucket_range.lower_index_incl,
|
|
79
|
+
bucket_range.upper_index_excl
|
|
80
|
+
);
|
|
65
81
|
bucket_elts.sort(compareEquals);
|
|
66
82
|
extendArray(new_sorted_array, bucket_elts);
|
|
67
83
|
}
|
|
@@ -70,33 +86,41 @@ export function bucketSort<T>(array:T[], getVector?:(t:T)=>SortingVector, compar
|
|
|
70
86
|
return current_sorted_array;
|
|
71
87
|
}
|
|
72
88
|
|
|
73
|
-
export function stringSort<T>(array:T[], getString?:(t:T)=>string) {
|
|
89
|
+
export function stringSort<T>(array: T[], getString?: (t: T) => string) {
|
|
74
90
|
// array: an array of data
|
|
75
91
|
// getString: a function that takes an element of `array` and returns a string. defaults to identity
|
|
76
92
|
|
|
77
93
|
// returns strings sorted in "natural order" (i.e. numbers sorted correctly - P2 comes before P10)
|
|
78
|
-
getString =
|
|
94
|
+
getString =
|
|
95
|
+
getString ||
|
|
96
|
+
(function(d: string) {
|
|
97
|
+
return d;
|
|
98
|
+
} as any);
|
|
79
99
|
// compute string vectors we'll sort with
|
|
80
100
|
var data = array.map(function(d) {
|
|
81
101
|
return {
|
|
82
102
|
d: d,
|
|
83
|
-
vector: stringToVector(getString(d))
|
|
103
|
+
vector: stringToVector(getString(d)),
|
|
84
104
|
};
|
|
85
105
|
});
|
|
86
106
|
// sort
|
|
87
|
-
var sorted = bucketSort(data, function(d) {
|
|
107
|
+
var sorted = bucketSort(data, function(d) {
|
|
108
|
+
return d.vector;
|
|
109
|
+
});
|
|
88
110
|
// return original passed-in data
|
|
89
|
-
return sorted.map(function(datum) {
|
|
111
|
+
return sorted.map(function(datum) {
|
|
112
|
+
return datum.d;
|
|
113
|
+
});
|
|
90
114
|
}
|
|
91
115
|
|
|
92
|
-
export function stringToVector(string:string) {
|
|
116
|
+
export function stringToVector(string: string) {
|
|
93
117
|
var vector = [];
|
|
94
118
|
var len = string.length;
|
|
95
119
|
var numberStartIncl = -1;
|
|
96
120
|
var charCode;
|
|
97
|
-
for (var i=0; i<len; i++) {
|
|
121
|
+
for (var i = 0; i < len; i++) {
|
|
98
122
|
charCode = string.charCodeAt(i);
|
|
99
|
-
if (charCode >=48 && charCode <= 57) {
|
|
123
|
+
if (charCode >= 48 && charCode <= 57) {
|
|
100
124
|
// if character is numeric digit 0-9
|
|
101
125
|
if (numberStartIncl === -1) {
|
|
102
126
|
// if we're not in a number yet, start number
|
|
@@ -123,7 +147,12 @@ export function stringToVector(string:string) {
|
|
|
123
147
|
return vector;
|
|
124
148
|
}
|
|
125
149
|
|
|
126
|
-
export function compareFull<T>(
|
|
150
|
+
export function compareFull<T>(
|
|
151
|
+
d1: T,
|
|
152
|
+
d2: T,
|
|
153
|
+
getVector: GetVector<T>,
|
|
154
|
+
compareEquals?: CompareEquals<T>
|
|
155
|
+
) {
|
|
127
156
|
// utility function - comparator that describes sort order given by bucketSort
|
|
128
157
|
var ret = compare(getVector(d1), getVector(d2));
|
|
129
158
|
if (ret === 0 && compareEquals) {
|
|
@@ -132,22 +161,25 @@ export function compareFull<T>(d1:T, d2:T, getVector:GetVector<T>, compareEquals
|
|
|
132
161
|
return ret;
|
|
133
162
|
}
|
|
134
163
|
|
|
135
|
-
function compareVectorElements(elt1:number|string, elt2:number|string) {
|
|
164
|
+
function compareVectorElements(elt1: number | string, elt2: number | string) {
|
|
136
165
|
if (typeof elt1 === string_type) {
|
|
137
|
-
return compare(
|
|
166
|
+
return compare(
|
|
167
|
+
stringToVector(elt1 as string),
|
|
168
|
+
stringToVector(elt2 as string)
|
|
169
|
+
);
|
|
138
170
|
} else {
|
|
139
171
|
return sgndiff(elt1 as number, elt2 as number);
|
|
140
172
|
}
|
|
141
173
|
}
|
|
142
174
|
|
|
143
|
-
export function compare(vector1:SortingVector, vector2:SortingVector) {
|
|
175
|
+
export function compare(vector1: SortingVector, vector2: SortingVector) {
|
|
144
176
|
// utility function - comparator that describes vector sort order given by bucketSort
|
|
145
177
|
|
|
146
178
|
var ret = 0;
|
|
147
179
|
// go left to right, return result of first difference
|
|
148
180
|
// if one vector is shorter, that one comes first
|
|
149
181
|
var cmp;
|
|
150
|
-
for (var i=0; i<vector1.length; i++) {
|
|
182
|
+
for (var i = 0; i < vector1.length; i++) {
|
|
151
183
|
if (i >= vector2.length) {
|
|
152
184
|
// if we've gotten here, that means no change up til i, and vector2 is shorter
|
|
153
185
|
ret = 1;
|
|
@@ -171,32 +203,39 @@ export function compare(vector1:SortingVector, vector2:SortingVector) {
|
|
|
171
203
|
}
|
|
172
204
|
|
|
173
205
|
export function bucketSortHelper<T>(
|
|
174
|
-
array:T[],
|
|
175
|
-
getVector:GetVector<T>,
|
|
176
|
-
sort_range_lower_index_incl:number,
|
|
177
|
-
sort_range_upper_index_excl:number,
|
|
178
|
-
vector_index:number,
|
|
179
|
-
isStringElt:boolean
|
|
206
|
+
array: T[],
|
|
207
|
+
getVector: GetVector<T>,
|
|
208
|
+
sort_range_lower_index_incl: number,
|
|
209
|
+
sort_range_upper_index_excl: number,
|
|
210
|
+
vector_index: number,
|
|
211
|
+
isStringElt: boolean
|
|
180
212
|
) {
|
|
181
213
|
// returns { sorted_array: d[], bucket_ranges:{lower_index_incl, upper_index_excl}[]}} },
|
|
182
214
|
// where sorted_array only contains elements from the specified range of
|
|
183
215
|
// array[sort_range_lower_index_incl:sort_range_upper_index_excl]
|
|
184
216
|
|
|
185
217
|
// stop if empty sort range, or end of vector
|
|
186
|
-
if (
|
|
218
|
+
if (
|
|
219
|
+
!array.length ||
|
|
220
|
+
sort_range_lower_index_incl >= sort_range_upper_index_excl
|
|
221
|
+
) {
|
|
187
222
|
return {
|
|
188
223
|
sorted_array: [],
|
|
189
|
-
bucket_ranges: []
|
|
190
|
-
}
|
|
224
|
+
bucket_ranges: [],
|
|
225
|
+
};
|
|
191
226
|
}
|
|
192
227
|
|
|
193
228
|
// bucket sort the specified range
|
|
194
229
|
// gather elements into buckets
|
|
195
|
-
var buckets:{[vectorElt:string]:T[]} = {};
|
|
230
|
+
var buckets: { [vectorElt: string]: T[] } = {};
|
|
196
231
|
var keys = [];
|
|
197
232
|
var vector, key;
|
|
198
233
|
var sortFirst = [];
|
|
199
|
-
for (
|
|
234
|
+
for (
|
|
235
|
+
var i = sort_range_lower_index_incl;
|
|
236
|
+
i < sort_range_upper_index_excl;
|
|
237
|
+
i++
|
|
238
|
+
) {
|
|
200
239
|
vector = getVector(array[i]);
|
|
201
240
|
if (vector.length > vector_index) {
|
|
202
241
|
key = vector[vector_index];
|
|
@@ -219,7 +258,7 @@ export function bucketSortHelper<T>(
|
|
|
219
258
|
keys = stringSort(keys);
|
|
220
259
|
}
|
|
221
260
|
|
|
222
|
-
var sorted_array:T[] = [];
|
|
261
|
+
var sorted_array: T[] = [];
|
|
223
262
|
var bucket_ranges = [];
|
|
224
263
|
var lower_index_incl, upper_index_excl;
|
|
225
264
|
// add sortFirst
|
|
@@ -227,15 +266,18 @@ export function bucketSortHelper<T>(
|
|
|
227
266
|
lower_index_incl = sort_range_lower_index_incl + sorted_array.length;
|
|
228
267
|
bucket_ranges.push({
|
|
229
268
|
lower_index_incl: lower_index_incl,
|
|
230
|
-
upper_index_excl: lower_index_incl + sortFirst.length
|
|
269
|
+
upper_index_excl: lower_index_incl + sortFirst.length,
|
|
231
270
|
});
|
|
232
271
|
extendArray(sorted_array, sortFirst);
|
|
233
272
|
}
|
|
234
|
-
for (var i=0; i<keys.length; i++) {
|
|
273
|
+
for (var i = 0; i < keys.length; i++) {
|
|
235
274
|
var bucket = buckets[keys[i]];
|
|
236
275
|
lower_index_incl = sort_range_lower_index_incl + sorted_array.length;
|
|
237
276
|
upper_index_excl = lower_index_incl + bucket.length;
|
|
238
|
-
bucket_ranges.push({
|
|
277
|
+
bucket_ranges.push({
|
|
278
|
+
lower_index_incl: lower_index_incl,
|
|
279
|
+
upper_index_excl: upper_index_excl,
|
|
280
|
+
});
|
|
239
281
|
extendArray(sorted_array, bucket);
|
|
240
282
|
}
|
|
241
283
|
|
package/src/js/clustering.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
import ClusteringWorker from '
|
|
2
|
-
import {
|
|
1
|
+
import ClusteringWorker from 'web-worker:./workers/clustering-worker';
|
|
2
|
+
import {
|
|
3
|
+
CaseItem,
|
|
4
|
+
CasesAndEntities,
|
|
5
|
+
ClusteringMessage,
|
|
6
|
+
EntityItem,
|
|
7
|
+
} from './workers/clustering-worker';
|
|
3
8
|
|
|
4
9
|
/**
|
|
5
10
|
* Executes the clustering of casesAndEntitites in the requested
|
|
@@ -21,7 +26,10 @@ import {CaseItem, CasesAndEntities, ClusteringMessage, EntityItem} from "./worke
|
|
|
21
26
|
* @return a deferred which gets resolved with the clustering result
|
|
22
27
|
* when the clustering is done.
|
|
23
28
|
*/
|
|
24
|
-
function _hcluster(
|
|
29
|
+
function _hcluster(
|
|
30
|
+
casesAndEntitites: ClusteringMessage['casesAndEntities'],
|
|
31
|
+
dimension: ClusteringMessage['dimension']
|
|
32
|
+
) {
|
|
25
33
|
var worker = new ClusteringWorker();
|
|
26
34
|
var message = new Object() as ClusteringMessage;
|
|
27
35
|
//@ts-ignore
|
|
@@ -29,8 +37,8 @@ function _hcluster(casesAndEntitites:ClusteringMessage["casesAndEntities"], dime
|
|
|
29
37
|
message.casesAndEntities = casesAndEntitites;
|
|
30
38
|
message.dimension = dimension;
|
|
31
39
|
worker.postMessage(message);
|
|
32
|
-
worker.onmessage = function(m:any) {
|
|
33
|
-
def.resolve(m.data as
|
|
40
|
+
worker.onmessage = function(m: any) {
|
|
41
|
+
def.resolve(m.data as CaseItem[] | EntityItem[]);
|
|
34
42
|
};
|
|
35
43
|
return def.promise();
|
|
36
44
|
}
|
|
@@ -41,8 +49,10 @@ function _hcluster(casesAndEntitites:ClusteringMessage["casesAndEntities"], dime
|
|
|
41
49
|
* @return a deferred which gets resolved with the clustering result
|
|
42
50
|
* when the clustering is done.
|
|
43
51
|
*/
|
|
44
|
-
export function hclusterColumns(
|
|
45
|
-
|
|
52
|
+
export function hclusterColumns(
|
|
53
|
+
casesAndEntitites: CasesAndEntities
|
|
54
|
+
): Promise<CaseItem[]> {
|
|
55
|
+
return _hcluster(casesAndEntitites, 'CASES');
|
|
46
56
|
}
|
|
47
57
|
|
|
48
58
|
/**
|
|
@@ -51,6 +61,8 @@ export function hclusterColumns(casesAndEntitites:CasesAndEntities):Promise<Case
|
|
|
51
61
|
* @return a deferred which gets resolved with the clustering result
|
|
52
62
|
* when the clustering is done.
|
|
53
63
|
*/
|
|
54
|
-
export function hclusterTracks(
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
export function hclusterTracks(
|
|
65
|
+
casesAndEntitites: CasesAndEntities
|
|
66
|
+
): Promise<EntityItem[]> {
|
|
67
|
+
return _hcluster(casesAndEntitites, 'ENTITIES');
|
|
68
|
+
}
|
package/src/js/extractrgba.ts
CHANGED
|
@@ -1,29 +1,33 @@
|
|
|
1
|
-
import { fastParseInt16 } from
|
|
2
|
-
import {RGBAColor} from
|
|
1
|
+
import { fastParseInt16 } from './utils';
|
|
2
|
+
import { RGBAColor } from './oncoprintruleset';
|
|
3
3
|
|
|
4
|
-
export default function extractrgba(str:string):RGBAColor {
|
|
5
|
-
if (str[0] ===
|
|
4
|
+
export default function extractrgba(str: string): RGBAColor {
|
|
5
|
+
if (str[0] === '#') {
|
|
6
6
|
// hex, convert to rgba
|
|
7
7
|
return hexToRGBA(str);
|
|
8
8
|
}
|
|
9
|
-
const match = str.match(
|
|
9
|
+
const match = str.match(
|
|
10
|
+
/^[\s]*rgba\([\s]*([0-9.]+)[\s]*,[\s]*([0-9.]+)[\s]*,[\s]*([0-9.]+)[\s]*,[\s]*([0-9.]+)[\s]*\)[\s]*$/
|
|
11
|
+
);
|
|
10
12
|
if (match && match.length === 5) {
|
|
11
|
-
return [
|
|
13
|
+
return [
|
|
14
|
+
parseFloat(match[1]) / 255,
|
|
12
15
|
parseFloat(match[2]) / 255,
|
|
13
16
|
parseFloat(match[3]) / 255,
|
|
14
|
-
parseFloat(match[4])
|
|
17
|
+
parseFloat(match[4]),
|
|
18
|
+
];
|
|
15
19
|
}
|
|
16
20
|
throw `could not extract rgba from ${str}`;
|
|
17
|
-
}
|
|
21
|
+
}
|
|
18
22
|
|
|
19
|
-
export function hexToRGBA(str:string):RGBAColor {
|
|
23
|
+
export function hexToRGBA(str: string): RGBAColor {
|
|
20
24
|
const r = fastParseInt16(str[1] + str[2]);
|
|
21
25
|
const g = fastParseInt16(str[3] + str[4]);
|
|
22
26
|
const b = fastParseInt16(str[5] + str[6]);
|
|
23
|
-
return [r,g,b,1];
|
|
27
|
+
return [r, g, b, 1];
|
|
24
28
|
}
|
|
25
29
|
|
|
26
|
-
export function rgbaToHex(rgba:RGBAColor):string {
|
|
30
|
+
export function rgbaToHex(rgba: RGBAColor): string {
|
|
27
31
|
let hexR = rgba[0].toString(16);
|
|
28
32
|
let hexG = rgba[1].toString(16);
|
|
29
33
|
let hexB = rgba[2].toString(16);
|
|
@@ -37,4 +41,4 @@ export function rgbaToHex(rgba:RGBAColor):string {
|
|
|
37
41
|
hexB = '0' + hexB;
|
|
38
42
|
}
|
|
39
43
|
return `#${hexR}${hexG}${hexB}`;
|
|
40
|
-
}
|
|
44
|
+
}
|
|
@@ -30,8 +30,12 @@
|
|
|
30
30
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
export default function haselementsininterval<T>(
|
|
34
|
+
sorted_list: T[],
|
|
35
|
+
valueFn: (t: T) => number,
|
|
36
|
+
lower_inc_val: number,
|
|
37
|
+
upper_exc_val: number
|
|
38
|
+
): boolean {
|
|
35
39
|
// in: sorted_list, a list sorted in increasing order of valueFn
|
|
36
40
|
// valueFn, a function that takes an element of sorted_list and returns a number
|
|
37
41
|
// lower_inc and upper_ex: define a half-open interval [lower_inc, upper_exc)
|
|
@@ -45,7 +49,7 @@ export default function haselementsininterval<T>(sorted_list:T[], valueFn:(t:T)=
|
|
|
45
49
|
if (test_lower_inc >= test_upper_exc) {
|
|
46
50
|
break;
|
|
47
51
|
}
|
|
48
|
-
middle = Math.floor((test_lower_inc + test_upper_exc) / 2)
|
|
52
|
+
middle = Math.floor((test_lower_inc + test_upper_exc) / 2);
|
|
49
53
|
middle_val = valueFn(sorted_list[middle]);
|
|
50
54
|
if (middle_val >= upper_exc_val) {
|
|
51
55
|
test_upper_exc = middle;
|
|
@@ -59,4 +63,4 @@ export default function haselementsininterval<T>(sorted_list:T[], valueFn:(t:T)=
|
|
|
59
63
|
}
|
|
60
64
|
}
|
|
61
65
|
return ret;
|
|
62
|
-
}
|
|
66
|
+
}
|