@datagrok/bio 1.7.3 → 1.7.6
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/detectors.js +1 -1
- package/dist/package-test.js +295 -66
- package/dist/package.js +231 -41
- package/files/samples/sample_SEPARATOR_PT.csv +101 -0
- package/files/tests/testCereal.csv +78 -0
- package/package.json +7 -3
- package/src/__jest__/remote.test.ts +28 -14
- package/src/const.ts +21 -0
- package/src/package-test.ts +1 -1
- package/src/package.ts +11 -4
- package/src/tests/convert-test.ts +34 -10
- package/src/tests/detectors-test.ts +6 -0
- package/src/tests/{renderer-test.ts → renderers-test.ts} +25 -16
- package/src/utils/cell-renderer.ts +59 -16
- package/src/utils/convert.ts +40 -15
- package/src/utils/utils.ts +35 -0
- package/{test-Bio-34f75e5127b8-303cfb72.html → test-Bio-34f75e5127b8-c46c3f48.html} +5 -5
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
id,sequence
|
|
2
|
+
1,M-F-I-T-M-F-C-M-F-W-L-F-I-F-I-L-M-M-L-I-F-F-M-E-A-M-I-K-P-M-L
|
|
3
|
+
2,A-Q-M-T-M-F-C-I-M-F-F-L-M-L-M-F-I-I-M-I-M-F-M-I-L-E-A-M-K-K-M-L-N-A-I
|
|
4
|
+
3,I-L-M-T-M-F-C-I-C-W-M-I-M-I-F-F-L-L-L-I-M-F-M-L-M-A-M-M-K-M-L-I-F-L
|
|
5
|
+
4,F-Q-M-T-M-I-C-M-L-F-F-L-M-M-F-M-F-D-L-I-I-L-F-I-M-M-E-A-M-M-K-P-D-L-M-F-I
|
|
6
|
+
5,L-L-M-T-M-F-C-F-F-M-M-L-L-M-F-F-M-F-M-I-M-F-M-Y-F-E-A-M-K-K-F-F-I-L-F
|
|
7
|
+
6,A-M-M-T-M-F-C-F-M-L-I-M-M-F-I-L-L-F-I-D-I-I-M-E-A-M-L-K-L-D-N-F-I
|
|
8
|
+
7,L-L-M-T-M-F-C-M-I-L-I-S-M-I-M-I-L-M-M-I-M-F-L-M-E-A-M-K-K-I-F-F-A-V
|
|
9
|
+
8,L-I-M-T-M-F-C-M-L-I-L-I-F-M-L-M-D-F-M-I-I-M-I-F-F-E-A-M-F-K-M-L-F-L-M-F
|
|
10
|
+
9,F-Q-M-T-M-F-C-L-M-I-F-M-W-I-F-M-M-M-M-I-L-D-I-F-I-E-A-M-I-K-F-I-N-L-F-M
|
|
11
|
+
10,F-L-M-T-M-F-C-I-L-I-N-I-M-I-I-W-M-I-I-M-L-M-F-E-A-M-F-K-L-D-I-I-F
|
|
12
|
+
11,F-F-M-T-M-F-C-M-M-I-F-L-L-L-I-M-I-I-I-M-I-M-D-M-I-M-E-A-M-K-K-M-M-D-I-I-I
|
|
13
|
+
12,I-M-M-T-M-F-C-I-C-L-L-F-W-L-L-F-M-L-L-I-M-D-M-M-F-E-A-M-L-K-F-I-M-M-I
|
|
14
|
+
13,M-Q-M-T-M-F-C-F-M-L-L-L-M-F-F-M-D-I-M-I-I-M-L-L-D-E-A-M-L-K-L-D-L-I-L
|
|
15
|
+
14,L-Q-M-T-M-F-C-I-F-W-M-L-F-M-L-F-M-L-F-I-F-F-L-F-L-E-A-M-L-K-F-I-N-L-I
|
|
16
|
+
15,I-I-M-T-M-F-C-M-I-M-I-I-S-I-F-F-I-I-M-I-M-L-F-I-F-E-A-M-I-K-L-D-I-I-A-M
|
|
17
|
+
16,F-L-M-T-M-L-C-M-C-F-I-L-F-F-F-L-F-M-F-I-M-L-S-F-F-L-E-A-L-I-K-I-L-I-L-I
|
|
18
|
+
17,F-Q-M-T-M-F-C-M-M-I-F-L-F-I-M-W-M-I-I-F-I-I-F-F-I-F-E-A-M-K-M-L-L-L-L
|
|
19
|
+
18,M-F-M-T-M-F-C-M-C-I-M-F-W-I-F-D-I-I-I-I-I-L-F-L-I-E-A-M-L-K-L-F-F-I-I-V
|
|
20
|
+
19,I-M-L-M-T-M-F-C-M-F-F-F-M-W-I-F-M-F-M-L-I-I-F-S-L-I-L-E-A-M-M-K-P-D-I-I-I
|
|
21
|
+
20,A-F-L-T-M-F-C-F-M-W-L-L-M-L-M-F-L-F-L-I-M-I-I-I-D-E-A-M-I-K-L-F-F-L
|
|
22
|
+
21,F-Q-M-T-M-F-C-F-L-L-M-S-F-L-M-I-I-M-I-F-I-L-M-F-F-D-E-A-M-F-K-I-L-N-F-I
|
|
23
|
+
22,M-I-M-T-M-F-C-M-L-M-N-L-L-M-F-F-M-L-I-I-L-I-L-M-I-E-A-M-L-K-L-M-M-A-I
|
|
24
|
+
23,M-I-M-T-M-F-C-M-I-I-L-M-F-H-M-M-M-F-L-I-F-I-L-Y-E-A-M-K-K-L-F-N-M-I-V
|
|
25
|
+
24,L-F-T-M-F-C-M-C-W-M-I-M-I-F-W-I-I-I-L-M-I-M-I-F-L-A-M-K-K-P-M-F-L-F
|
|
26
|
+
25,A-F-L-M-T-M-F-C-I-C-W-F-L-F-F-L-F-M-I-L-I-M-L-M-F-F-E-A-M-K-K-F-F-L-V
|
|
27
|
+
26,L-L-M-T-M-F-C-M-C-M-N-M-M-M-F-M-L-I-M-M-I-L-M-S-Y-I-E-A-M-F-K-F-F-L-I
|
|
28
|
+
27,L-Q-L-T-M-F-C-F-I-L-L-I-F-L-M-I-L-L-I-L-M-I-L-F-E-A-M-M-K-M-F-F-A-L
|
|
29
|
+
28,I-Q-M-T-M-F-C-M-M-M-M-F-L-M-L-F-F-I-D-I-M-F-L-M-M-E-M-M-F-K-M-D-L-M-F-F
|
|
30
|
+
29,M-M-T-M-F-C-I-W-I-F-M-M-I-L-D-M-M-F-F-I-I-M-I-I-A-M-M-M-F-L-L-I-I-V
|
|
31
|
+
30,F-Q-M-T-M-F-C-M-M-L-F-M-F-I-L-W-D-I-F-I-M-I-S-M-L-E-A-M-M-K-L-D-I-I-M
|
|
32
|
+
31,L-F-M-T-M-F-C-M-M-M-N-F-M-I-F-W-L-I-L-I-F-F-S-L-F-E-A-M-K-K-L-I-L-A-M
|
|
33
|
+
32,A-F-M-T-M-F-C-M-F-L-W-F-I-L-H-L-W-I-F-F-I-M-M-L-I-M-I-E-A-M-I-K-I-D-I-A-V
|
|
34
|
+
33,L-L-T-M-F-C-M-I-L-I-F-W-H-F-M-F-M-D-I-M-M-M-M-I-F-E-A-M-L-M-I-F-I-M-I
|
|
35
|
+
34,I-M-M-T-M-F-C-F-C-F-L-I-F-H-M-M-I-F-D-I-M-I-S-M-I-E-A-M-K-K-I-I-M-L-L
|
|
36
|
+
35,F-M-M-T-M-F-C-M-M-M-L-F-I-I-M-F-L-I-M-M-I-D-I-L-L-F-I-D-E-A-M-M-K-D-F-I-L
|
|
37
|
+
36,I-M-M-T-M-F-C-M-I-I-L-F-M-F-M-F-M-M-I-I-I-M-L-F-F-M-L-E-A-M-F-K-M-M-F-F
|
|
38
|
+
37,L-L-M-T-M-F-C-M-L-W-M-M-L-F-I-F-F-I-M-L-I-F-I-S-L-F-E-A-M-K-K-I-F-I-I-M
|
|
39
|
+
38,F-I-M-T-M-F-C-M-M-L-L-L-F-F-F-I-I-L-D-I-M-L-M-F-I-E-A-M-K-K-L-L-L-L
|
|
40
|
+
39,I-M-M-T-M-F-C-F-M-M-M-S-M-M-F-F-F-L-I-I-I-I-L-F-M-F-D-M-A-M-K-I-L-L-I
|
|
41
|
+
40,M-F-M-T-M-F-C-M-F-I-L-I-L-L-L-W-I-I-D-I-M-F-M-L-D-E-A-M-K-K-P-D-F-L
|
|
42
|
+
41,L-I-M-T-M-F-C-M-C-M-F-L-I-L-W-M-M-F-I-M-L-I-I-I-E-A-M-K-K-P-I-I-L-I
|
|
43
|
+
42,A-F-M-T-M-F-C-F-M-M-M-F-M-H-F-M-L-I-F-I-F-M-I-F-M-E-A-M-K-K-F-F-L-F-L-M
|
|
44
|
+
43,A-F-I-Q-M-T-M-L-C-M-C-M-L-L-M-F-F-L-D-I-F-I-I-I-I-F-L-D-E-A-M-M-K-P-L-M-L-L
|
|
45
|
+
44,L-Q-M-T-M-F-C-M-F-M-I-I-L-F-D-M-I-M-M-M-M-M-E-A-M-L-K-I-M-I-F
|
|
46
|
+
45,A-L-M-T-M-F-C-F-I-W-N-S-I-F-I-F-I-F-D-I-L-M-I-L-L-I-E-A-M-F-K-M-D-N-I-I
|
|
47
|
+
46,L-M-M-T-M-F-C-L-M-L-F-S-W-L-M-W-L-M-I-I-F-I-I-M-M-I-L-E-A-M-L-K-P-L-F-A-F-V
|
|
48
|
+
47,F-F-M-T-M-F-C-M-F-F-I-M-F-L-I-F-F-L-L-L-I-M-L-F-M-M-E-A-M-L-K-I-F-L
|
|
49
|
+
48,L-M-M-M-T-M-F-C-I-F-M-L-L-F-F-F-F-M-F-I-M-M-M-F-D-E-A-M-F-K-M-D-M-I-L
|
|
50
|
+
49,Q-I-T-M-F-C-I-F-F-M-F-I-I-M-W-L-F-F-F-L-F-F-L-F-E-A-M-L-K-M-I-M-A-L
|
|
51
|
+
50,I-I-M-T-M-F-C-I-M-L-I-L-W-I-F-L-F-I-I-I-I-M-I-L-I-A-M-K-K-L-I-L-L-L
|
|
52
|
+
51,I-L-M-T-M-F-C-M-M-L-I-I-F-F-F-M-L-F-F-I-L-I-I-L-D-F-F-F-E-A-M-L-K-I-D-M-M-I
|
|
53
|
+
52,F-I-M-T-M-F-C-M-C-W-F-I-L-L-I-M-M-I-I-I-F-L-I-D-E-A-M-M-K-M-F-L-M-M
|
|
54
|
+
53,F-I-M-T-M-F-C-M-L-L-M-F-S-L-M-F-F-M-M-M-I-L-I-F-Y-I-E-A-M-I-K-M-M-L-F-I
|
|
55
|
+
54,I-Q-M-T-M-F-C-M-C-W-M-F-L-H-M-M-F-L-D-I-L-F-I-F-L-D-E-A-M-L-K-M-I-I-F-L
|
|
56
|
+
55,F-M-M-T-M-F-C-M-L-I-L-M-M-H-L-F-F-F-I-I-M-D-M-I-E-A-M-L-K-M-D-M-L-V
|
|
57
|
+
56,L-M-M-T-M-F-C-M-F-I-N-S-M-L-L-M-M-F-I-L-I-L-M-M-L-F-E-A-M-K-K-P-F-M-I-M
|
|
58
|
+
57,M-L-M-T-M-F-C-L-I-M-N-F-F-M-F-L-M-F-M-I-M-M-M-E-A-M-F-K-M-L-M
|
|
59
|
+
58,I-L-M-T-M-F-C-L-F-F-F-S-F-F-F-I-L-I-M-M-I-Y-I-E-A-M-L-K-I-M-M-I-L
|
|
60
|
+
59,I-I-M-M-T-M-F-C-M-C-L-L-M-L-M-F-W-I-I-M-I-M-I-S-F-L-M-E-A-M-K-K-F-L-I-A-M
|
|
61
|
+
60,I-F-M-T-M-F-C-M-M-F-N-S-F-L-I-F-W-I-I-L-M-F-F-L-L-I-L-E-A-M-M-K-P-L-N-L-V
|
|
62
|
+
61,I-F-I-T-M-F-C-M-I-L-L-S-M-L-F-I-L-F-D-I-F-F-I-I-M-E-I-M-K-K-F-I-I-A-F
|
|
63
|
+
62,I-M-M-T-M-F-C-F-C-M-I-M-F-M-F-I-L-F-L-I-L-F-L-D-E-A-M-M-K-M-L-I-L
|
|
64
|
+
63,I-F-M-T-M-F-C-M-F-L-M-F-M-I-M-L-L-F-D-I-F-L-S-F-F-E-A-M-K-K-F-F-I-A-V
|
|
65
|
+
64,I-Q-M-T-M-F-C-M-I-F-F-S-M-M-F-F-M-D-M-D-I-M-I-F-I-I-E-A-M-F-K-M-N-M-L-L
|
|
66
|
+
65,L-F-M-T-M-F-C-M-F-L-L-M-F-I-L-F-F-I-I-M-D-F-Y-F-F-E-A-M-K-K-P-M-L-I-L-L
|
|
67
|
+
66,A-M-M-T-M-F-C-M-L-L-M-M-F-H-M-L-D-F-I-F-D-F-F-M-E-A-M-K-K-M-M-M-L
|
|
68
|
+
67,A-I-M-T-M-F-C-M-F-L-N-L-M-L-M-M-F-I-F-M-M-I-D-E-A-M-I-K-F-L-L-F-I
|
|
69
|
+
68,M-F-M-T-M-F-C-M-F-I-I-F-L-I-I-M-M-D-L-I-I-M-I-I-M-L-E-A-M-I-F-I-L-I-L-L-L
|
|
70
|
+
69,I-F-M-T-M-F-F-M-F-M-M-I-I-F-W-L-M-W-D-L-M-I-I-F-S-I-M-I-M-A-M-I-K-L-M-M-A-L
|
|
71
|
+
70,I-L-M-T-M-F-C-M-M-L-F-L-L-F-F-F-L-I-I-I-I-F-S-M-M-E-A-M-M-K-P-D-I-M-M
|
|
72
|
+
71,F-F-M-T-M-F-C-M-F-F-I-F-L-H-M-I-F-F-D-I-F-L-F-F-Y-L-E-A-M-M-K-P-M-F-F-I
|
|
73
|
+
72,M-F-M-T-M-F-C-M-L-W-M-F-M-L-H-I-M-F-F-L-I-M-M-M-L-F-E-A-M-F-K-F-M-L-A-F
|
|
74
|
+
73,A-I-M-T-M-F-C-M-M-I-M-M-I-M-L-F-F-L-L-I-L-M-F-L-I-E-A-M-F-K-F-I-F-F-M
|
|
75
|
+
74,M-M-M-T-M-F-C-M-L-M-F-W-I-I-F-I-I-F-L-I-F-I-L-M-I-E-A-M-F-K-M-I-N-I-V
|
|
76
|
+
75,L-L-M-T-M-F-C-M-L-I-M-L-I-M-L-W-L-M-D-I-M-M-M-L-I-E-A-M-K-K-P-L-M-F-F-L
|
|
77
|
+
76,L-Q-I-T-M-F-I-M-M-W-I-L-L-F-M-I-F-I-F-I-L-F-F-E-A-M-M-K-F-M-L-F
|
|
78
|
+
77,I-L-M-T-M-F-C-I-F-F-I-F-F-M-F-M-F-M-F-F-I-M-F-F-L-I-E-A-M-K-K-L-D-I-M-L
|
|
79
|
+
78,M-L-M-T-M-L-C-M-M-M-F-S-L-L-I-F-I-F-L-D-I-I-I-F-I-L-E-A-M-L-K-F-M-M-I
|
|
80
|
+
79,I-L-M-T-M-F-C-M-C-M-M-M-I-M-M-I-I-I-I-M-D-S-F-L-E-A-M-K-K-P-M-M-M-I
|
|
81
|
+
80,Q-M-T-M-F-C-M-M-F-F-I-I-H-M-M-I-I-F-F-M-D-L-I-M-M-L-A-M-K-K-P-D-M-A-I
|
|
82
|
+
81,L-L-M-T-M-I-C-I-L-F-F-M-F-M-F-L-M-M-L-I-I-M-F-L-Y-F-E-A-M-M-K-M-L-N-I-I
|
|
83
|
+
82,M-M-M-M-F-C-M-F-I-F-F-I-H-F-M-L-I-L-I-M-L-I-Y-M-M-I-M-K-I-M-M-N-M-L
|
|
84
|
+
83,A-L-M-T-M-F-C-M-F-I-F-F-M-L-M-M-M-I-I-I-F-F-F-F-E-A-M-M-K-M-F-I-F-V
|
|
85
|
+
84,A-L-M-T-M-F-C-M-W-L-I-L-M-W-F-M-I-I-I-L-M-M-D-E-A-M-K-K-L-L-N-I-L
|
|
86
|
+
85,L-I-I-M-T-M-F-C-M-M-L-L-L-I-I-M-M-F-L-I-F-I-F-L-L-E-A-M-I-K-F-L-L-F-L-L
|
|
87
|
+
86,M-L-M-T-M-F-C-M-L-L-M-F-H-F-L-I-M-M-I-L-I-S-Y-F-E-A-M-K-K-L-I-F-M-L
|
|
88
|
+
87,F-I-M-T-M-F-C-M-M-I-F-I-F-F-F-M-F-D-I-I-L-S-M-M-A-M-F-K-I-D-L-I-M
|
|
89
|
+
88,F-M-T-M-F-C-M-M-W-L-S-L-F-F-M-F-L-I-L-F-F-I-F-I-E-A-M-F-K-L-M-N-F-V
|
|
90
|
+
89,M-M-M-T-M-M-C-M-L-L-I-M-F-L-F-M-F-I-M-F-I-F-M-L-I-E-A-M-K-K-L-D-L-L-I
|
|
91
|
+
90,A-F-M-T-M-F-C-F-M-F-I-S-W-M-M-I-I-F-M-L-I-M-F-I-L-F-E-A-M-M-K-M-F-F-F-L
|
|
92
|
+
91,L-I-M-T-M-F-C-M-I-W-F-I-M-H-F-L-I-L-M-L-I-M-I-L-Y-L-E-A-M-F-K-P-L-I-F-F
|
|
93
|
+
92,M-I-M-T-M-F-C-M-F-I-N-L-W-I-F-F-L-L-D-I-F-F-L-I-M-E-A-M-K-L-D-M-I-M
|
|
94
|
+
93,L-L-M-T-M-F-C-M-F-I-I-M-L-F-F-L-F-M-F-L-I-M-F-F-I-D-E-A-M-F-K-P-L-F-I-M
|
|
95
|
+
94,F-F-M-T-M-F-C-I-F-F-M-S-L-H-L-F-M-L-L-I-I-F-M-F-D-E-A-M-K-K-M-L-L-F-I
|
|
96
|
+
95,I-F-F-T-M-F-L-I-F-L-L-F-I-M-M-M-I-D-M-I-I-F-I-L-L-E-A-M-K-K-P-M-F-I-I
|
|
97
|
+
96,M-F-M-M-T-M-F-C-F-M-I-I-F-F-M-M-M-D-I-M-I-I-M-D-F-I-L-E-A-M-L-K-I-F-L-I-I-I
|
|
98
|
+
97,I-I-M-T-M-F-C-M-I-I-N-M-L-F-F-D-L-L-I-I-I-L-L-E-A-M-L-K-F-D-M-F-F
|
|
99
|
+
98,M-L-M-T-M-F-C-M-L-L-I-M-F-M-I-L-I-L-M-F-I-F-L-L-Y-D-E-A-M-K-K-M-L-M-L-I
|
|
100
|
+
99,L-F-M-T-M-F-C-M-L-I-N-S-L-I-M-I-F-F-D-I-I-I-F-L-E-A-M-F-K-F-F-L-I-L-L
|
|
101
|
+
100,F-L-M-T-M-F-C-M-M-M-F-S-M-M-M-M-F-I-I-F-M-L-L-I-E-A-M-L-K-I-F-N-A-L
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
cereal_name,Calories,Carbohydrates,Fat,Fiber,Potassium,Protein,Sodium,Sugar,Vitamins/Minerals
|
|
2
|
+
Mueslix_Crispy_Blend,160,17,2,3,160,3,150,13,25
|
|
3
|
+
"Muesli_Raisins,_Dates,_&_Almonds",150,16,3,3,170,4,95,11,25
|
|
4
|
+
"Muesli_Raisins,_Peaches,_&_Pecans",150,16,3,3,170,4,150,11,25
|
|
5
|
+
Just_Right_Fruit_&_Nut,140,20,1,2,95,3,170,9,100
|
|
6
|
+
Nutri-Grain_Almond-Raisin,140,21,2,3,130,3,220,7,25
|
|
7
|
+
Total_Raisin_Bran,140,15,1,4,230,3,190,14,100
|
|
8
|
+
Basic_4,130,18,2,2,100,3,210,8,25
|
|
9
|
+
Oatmeal_Raisin_Crisp,130,null,2,null,120,3,170,10,25
|
|
10
|
+
100%_Natural_Bran,120,8,5,2,135,3,15,8,0
|
|
11
|
+
Cap'n'Crunch,120,12,2,0,35,1,220,12,25
|
|
12
|
+
Cinnamon_Toast_Crunch,120,13,3,0,45,1,210,9,25
|
|
13
|
+
"Fruit_&_Fibre_Dates,_Walnuts,_and_Oats",120,12,2,5,200,3,160,10,25
|
|
14
|
+
Fruitful_Bran,120,14,0,5,190,3,240,12,25
|
|
15
|
+
Great_Grains_Pecan,120,13,3,3,100,3,75,4,25
|
|
16
|
+
Honey_Graham_Ohs,120,12,2,1,45,1,220,11,25
|
|
17
|
+
Nut&Honey_Crunch,120,15,1,0,40,2,190,9,25
|
|
18
|
+
Post_Nat._Raisin_Bran,120,11,1,6,260,3,200,14,25
|
|
19
|
+
Raisin_Bran,120,14,1,5,240,3,210,12,25
|
|
20
|
+
Almond_Delight,110,14,2,1,-1,2,200,8,25
|
|
21
|
+
Apple_Cinnamon_Cheerios,110,null,2,null,70,2,180,10,25
|
|
22
|
+
Apple_Jacks,110,11,0,1,30,2,125,14,25
|
|
23
|
+
Cheerios,110,17,2,2,105,6,290,1,25
|
|
24
|
+
Clusters,110,13,2,2,105,3,140,7,25
|
|
25
|
+
Cocoa_Puffs,110,12,1,0,55,1,180,13,25
|
|
26
|
+
Corn_Chex,110,22,0,0,25,2,280,3,25
|
|
27
|
+
Corn_Pops,110,13,0,1,20,1,90,12,25
|
|
28
|
+
Count_Chocula,110,12,1,0,65,1,180,13,25
|
|
29
|
+
Cracklin'_Oat_Bran,110,10,3,4,160,3,140,7,25
|
|
30
|
+
Crispix,110,21,0,1,30,2,220,3,25
|
|
31
|
+
Froot_Loops,110,11,1,1,30,2,125,13,25
|
|
32
|
+
Frosted_Flakes,110,14,0,1,25,1,200,11,25
|
|
33
|
+
Fruity_Pebbles,110,13,1,0,25,1,135,12,25
|
|
34
|
+
Golden_Grahams,110,15,1,0,45,1,280,9,25
|
|
35
|
+
Grape-Nuts,110,17,0,3,90,3,170,3,25
|
|
36
|
+
Honey-comb,110,14,0,0,35,1,180,11,25
|
|
37
|
+
Honey_Nut_Cheerios,110,null,1,null,90,3,250,10,25
|
|
38
|
+
Just_Right_Crunchy__Nuggets,110,17,1,1,60,2,170,6,100
|
|
39
|
+
Kix,110,21,1,0,40,2,260,3,25
|
|
40
|
+
Lucky_Charms,110,12,1,0,55,2,180,12,25
|
|
41
|
+
Rice_Chex,110,23,0,0,30,1,240,2,25
|
|
42
|
+
Rice_Krispies,110,22,0,0,35,2,290,3,25
|
|
43
|
+
Smacks,110,9,1,1,40,2,70,15,25
|
|
44
|
+
Special_K,110,16,0,1,55,6,230,3,25
|
|
45
|
+
Total_Corn_Flakes,110,21,1,0,35,2,200,3,100
|
|
46
|
+
Triples,110,21,1,0,60,2,250,3,25
|
|
47
|
+
Trix,110,13,1,0,25,1,140,12,25
|
|
48
|
+
Wheaties_Honey_Gold,110,16,1,1,60,2,200,8,25
|
|
49
|
+
Corn_Flakes,100,21,0,1,35,2,290,2,25
|
|
50
|
+
Cream_of_Wheat_(Quick),100,21,0,1,-1,3,80,0,0
|
|
51
|
+
Crispy_Wheat_&_Raisins,100,11,1,2,120,2,140,10,25
|
|
52
|
+
Double_Chex,100,18,0,1,80,2,190,5,25
|
|
53
|
+
Frosted_Mini-Wheats,100,14,0,3,100,3,0,7,25
|
|
54
|
+
Golden_Crisp,100,11,0,0,40,2,45,15,25
|
|
55
|
+
Grape_Nuts_Flakes,100,15,1,3,85,3,140,5,25
|
|
56
|
+
Life,100,12,2,2,95,4,150,6,25
|
|
57
|
+
Maypo,100,16,1,0,95,4,0,3,25
|
|
58
|
+
Multi-Grain_Cheerios,100,15,1,2,90,2,220,6,25
|
|
59
|
+
Product_19,100,20,0,1,45,3,320,3,100
|
|
60
|
+
Quaker_Oat_Squares,100,14,1,2,110,4,135,6,25
|
|
61
|
+
Quaker_Oatmeal,100,-1,2,null,110,5,0,-1,0
|
|
62
|
+
Raisin_Nut_Bran,100,null,2,null,140,3,140,8,25
|
|
63
|
+
Total_Whole_Grain,100,16,1,3,110,3,200,3,100
|
|
64
|
+
Wheat_Chex,100,17,1,3,115,3,230,3,25
|
|
65
|
+
Wheaties,100,17,1,3,110,3,200,3,25
|
|
66
|
+
Bran_Chex,90,15,1,4,125,2,200,6,25
|
|
67
|
+
Bran_Flakes,90,13,0,5,190,3,210,5,25
|
|
68
|
+
Nutri-grain_Wheat,90,18,0,3,90,3,170,2,25
|
|
69
|
+
Raisin_Squares,90,15,0,2,110,2,0,6,25
|
|
70
|
+
Shredded_Wheat_'n'Bran,90,19,0,4,140,3,0,0,0
|
|
71
|
+
Shredded_Wheat_spoon_size,90,20,0,3,120,3,0,0,0
|
|
72
|
+
Strawberry_Fruit_Wheats,90,15,0,3,90,2,15,5,25
|
|
73
|
+
Shredded_Wheat,80,16,0,3,95,2,0,0,0
|
|
74
|
+
100%_Bran,70,5,1,10,280,4,130,6,25
|
|
75
|
+
All-Bran,70,7,1,9,320,4,260,5,25
|
|
76
|
+
All-Bran_with_Extra_Fiber,50,8,0,14,330,4,140,0,25
|
|
77
|
+
Puffed_Rice,50,13,0,0,15,1,0,0,0
|
|
78
|
+
Puffed_Wheat,50,10,0,1,50,2,0,0,0
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@datagrok/bio",
|
|
3
3
|
"beta": false,
|
|
4
4
|
"friendlyName": "Bio",
|
|
5
|
-
"version": "1.7.
|
|
5
|
+
"version": "1.7.6",
|
|
6
6
|
"description": "Bio is a [package](https://datagrok.ai/help/develop/develop#packages) for the [Datagrok](https://datagrok.ai) platform",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
@@ -11,12 +11,13 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@biowasm/aioli": ">=2.4.0",
|
|
14
|
-
"@datagrok-libraries/bio": "2.8.
|
|
14
|
+
"@datagrok-libraries/bio": "2.8.3",
|
|
15
15
|
"@datagrok-libraries/utils": "^1.0.0",
|
|
16
16
|
"@datagrok-libraries/ml": "^2.0.10",
|
|
17
17
|
"cash-dom": "latest",
|
|
18
18
|
"datagrok-api": "^1.4.12",
|
|
19
19
|
"dayjs": "latest",
|
|
20
|
+
"rxjs": "^6.5.5",
|
|
20
21
|
"ts-loader": "^9.2.5",
|
|
21
22
|
"typescript": "^4.4.2",
|
|
22
23
|
"openchemlib": "6.0.1"
|
|
@@ -60,7 +61,10 @@
|
|
|
60
61
|
],
|
|
61
62
|
"sources": [
|
|
62
63
|
"css/helm.css",
|
|
63
|
-
"https://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js"
|
|
64
|
+
"https://ajax.googleapis.com/ajax/libs/dojo/1.10.4/dojo/dojo.js",
|
|
65
|
+
"helm/JSDraw/Scilligence.JSDraw2.Lite.js",
|
|
66
|
+
"helm/JSDraw/Scilligence.JSDraw2.Resources.js",
|
|
67
|
+
"helm/JSDraw/Pistoia.HELM-uncompressed.js"
|
|
64
68
|
],
|
|
65
69
|
"category": "Bioinformatics"
|
|
66
70
|
}
|
|
@@ -16,15 +16,30 @@ beforeAll(async () => {
|
|
|
16
16
|
}, P_START_TIMEOUT);
|
|
17
17
|
|
|
18
18
|
afterAll(async () => {
|
|
19
|
-
await browser
|
|
19
|
+
await browser?.close();
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
expect.extend({
|
|
23
|
+
checkOutput(received, expected, context) {
|
|
24
|
+
if (received === expected) {
|
|
25
|
+
return {
|
|
26
|
+
message: () => context,
|
|
27
|
+
pass: true
|
|
28
|
+
};
|
|
29
|
+
} else {
|
|
30
|
+
return {
|
|
31
|
+
message: () => context,
|
|
32
|
+
pass: false
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
20
36
|
});
|
|
21
37
|
|
|
22
38
|
it('TEST', async () => {
|
|
23
|
-
const targetPackage:
|
|
39
|
+
const targetPackage:string = process.env.TARGET_PACKAGE ?? 'Bio';
|
|
24
40
|
console.log(`Testing ${targetPackage} package`);
|
|
25
41
|
|
|
26
|
-
|
|
27
|
-
const r = await page.evaluate((targetPackage): Promise<object> => {
|
|
42
|
+
const r = await page.evaluate((targetPackage):Promise<object> => {
|
|
28
43
|
return new Promise<object>((resolve, reject) => {
|
|
29
44
|
(<any>window).grok.functions.eval(targetPackage + ':test()').then((df: any) => {
|
|
30
45
|
const cStatus = df.columns.byName('success');
|
|
@@ -32,23 +47,22 @@ it('TEST', async () => {
|
|
|
32
47
|
const cCat = df.columns.byName('category');
|
|
33
48
|
const cName = df.columns.byName('name');
|
|
34
49
|
let failed = false;
|
|
35
|
-
let
|
|
50
|
+
let passReport = '';
|
|
51
|
+
let failReport = '';
|
|
36
52
|
for (let i = 0; i < df.rowCount; i++) {
|
|
37
|
-
if (
|
|
38
|
-
|
|
53
|
+
if (cStatus.get(i)) {
|
|
54
|
+
passReport += `Test result : ${targetPackage}.${cCat.get(i)}.${cName.get(i)} : ${cMessage.get(i)}\n`;
|
|
55
|
+
} else {
|
|
39
56
|
failed = true;
|
|
57
|
+
failReport += `Test result : ${targetPackage}.${cCat.get(i)}.${cName.get(i)} : ${cMessage.get(i)}\n`;
|
|
40
58
|
}
|
|
41
59
|
}
|
|
42
|
-
resolve({
|
|
60
|
+
resolve({failReport, passReport, failed});
|
|
43
61
|
}).catch((e: any) => reject(e));
|
|
44
62
|
});
|
|
45
63
|
}, targetPackage);
|
|
46
64
|
// @ts-ignore
|
|
47
|
-
console.log(r.
|
|
65
|
+
console.log(r.passReport);
|
|
48
66
|
// @ts-ignore
|
|
49
|
-
expect(r.failed).
|
|
67
|
+
expect(r.failed).checkOutput(false, r.failReport);
|
|
50
68
|
}, 100000);
|
|
51
|
-
|
|
52
|
-
// it('WebLogo.getAlphabetSimilarity', () => {
|
|
53
|
-
//
|
|
54
|
-
// });
|
package/src/const.ts
CHANGED
|
@@ -2,3 +2,24 @@ import * as ui from 'datagrok-api/ui';
|
|
|
2
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
import * as DG from 'datagrok-api/dg';
|
|
4
4
|
|
|
5
|
+
export const jsonSdfMonomerLibDict = {
|
|
6
|
+
'monomerType': null,
|
|
7
|
+
'smiles': null,
|
|
8
|
+
'name': 'MonomerName',
|
|
9
|
+
'author': null,
|
|
10
|
+
'molfile': 'molecule',
|
|
11
|
+
'naturalAnalog': 'MonomerNaturalAnalogCode',
|
|
12
|
+
'rgroups': 'MonomerCaps',
|
|
13
|
+
'createDate': null,
|
|
14
|
+
'id': null,
|
|
15
|
+
'polymerType': 'MonomerType',
|
|
16
|
+
'symbol': 'MonomerCode'
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const RGROUP_FIELD = 'rgroups';
|
|
20
|
+
export const CAP_GROUP_SMILES = 'capGroupSmiles';
|
|
21
|
+
export const RGROUP_ALTER_ID = 'alternateId';
|
|
22
|
+
export const CAP_GROUP_NAME = 'capGroupName';
|
|
23
|
+
export const RGROUP_LABEL = 'label';
|
|
24
|
+
export const MONOMER_SYMBOL = 'symbol';
|
|
25
|
+
export const SDF_MONOMER_NAME = 'MonomerName';
|
package/src/package-test.ts
CHANGED
|
@@ -9,7 +9,7 @@ import './tests/msa-tests';
|
|
|
9
9
|
import './tests/sequence-space-test';
|
|
10
10
|
import './tests/activity-cliffs-tests';
|
|
11
11
|
import './tests/splitters-test';
|
|
12
|
-
import './tests/
|
|
12
|
+
import './tests/renderers-test';
|
|
13
13
|
import './tests/convert-test';
|
|
14
14
|
|
|
15
15
|
export const _package = new DG.Package();
|
package/src/package.ts
CHANGED
|
@@ -15,10 +15,9 @@ import {getEmbeddingColsNames, sequenceSpace} from './utils/sequence-space';
|
|
|
15
15
|
import {AvailableMetrics} from '@datagrok-libraries/ml/src/typed-metrics';
|
|
16
16
|
import {getActivityCliffs} from '@datagrok-libraries/ml/src/viewers/activity-cliffs';
|
|
17
17
|
import {sequenceGetSimilarities, drawTooltip} from './utils/sequence-activity-cliffs';
|
|
18
|
-
import {getMolfilesFromSeq, HELM_CORE_LIB_FILENAME} from './utils/utils';
|
|
18
|
+
import {createJsonMonomerLibFromSdf, getMolfilesFromSeq, HELM_CORE_LIB_FILENAME} from './utils/utils';
|
|
19
19
|
import {getMacroMol} from './utils/atomic-works';
|
|
20
20
|
import {MacromoleculeSequenceCellRenderer} from './utils/cell-renderer';
|
|
21
|
-
import {delay} from '@datagrok-libraries/utils/src/test';
|
|
22
21
|
import {convert} from './utils/convert';
|
|
23
22
|
|
|
24
23
|
//tags: init
|
|
@@ -245,7 +244,15 @@ export async function compositionAnalysis(): Promise<void> {
|
|
|
245
244
|
return;
|
|
246
245
|
}
|
|
247
246
|
|
|
248
|
-
tv.addViewer('WebLogo', {sequenceColumnName: col.name});
|
|
247
|
+
const wlViewer = tv.addViewer('WebLogo', {sequenceColumnName: col.name});
|
|
248
|
+
grok.shell.tv.dockManager.dock(wlViewer, DG.DOCK_TYPE.DOWN, null, 'Composition analysis', 0.25);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
//top-menu: Bio | Sdf to Json lib...
|
|
252
|
+
//name: sdfToJsonLib
|
|
253
|
+
//input: dataframe table
|
|
254
|
+
export async function sdfToJsonLib(table: DG.DataFrame) {
|
|
255
|
+
const jsonMonomerLibrary = createJsonMonomerLibFromSdf(table);
|
|
249
256
|
}
|
|
250
257
|
|
|
251
258
|
// helper function for importFasta
|
|
@@ -325,7 +332,7 @@ export function importFasta(fileContent: string): DG.DataFrame [] {
|
|
|
325
332
|
])];
|
|
326
333
|
}
|
|
327
334
|
|
|
328
|
-
//name: Bio | Convert
|
|
335
|
+
//name: Bio | Convert ...
|
|
329
336
|
//friendly-name: Bio | Convert
|
|
330
337
|
//tags: panel, bio
|
|
331
338
|
//input: column col {semType: Macromolecule}
|
|
@@ -83,7 +83,7 @@ MKP---SEYV
|
|
|
83
83
|
|
|
84
84
|
separatorGaps: `seq
|
|
85
85
|
F/W//P/H//E/Y
|
|
86
|
-
|
|
86
|
+
/Y/N/R/Q/W/Y/V/
|
|
87
87
|
M/K/P////S/E/Y/V
|
|
88
88
|
`,
|
|
89
89
|
|
|
@@ -133,6 +133,7 @@ PEPTIDE1{M.K.P.*.*.*.S.E.Y.V}$$$
|
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
// FASTA tests
|
|
136
|
+
// fasta -> separator
|
|
136
137
|
test('testFastaPtToSeparator', async () => {
|
|
137
138
|
await _testConvert(Samples.fastaPt, converter(NOTATION.SEPARATOR, '-'), Samples.separatorPt);
|
|
138
139
|
});
|
|
@@ -142,7 +143,11 @@ PEPTIDE1{M.K.P.*.*.*.S.E.Y.V}$$$
|
|
|
142
143
|
test('testFastaRnaToSeparator', async () => {
|
|
143
144
|
await _testConvert(Samples.fastaRna, converter(NOTATION.SEPARATOR, '*'), Samples.separatorRna);
|
|
144
145
|
});
|
|
146
|
+
test('testFastaGapsToSeparator', async () => {
|
|
147
|
+
await _testConvert(Samples.fastaGaps, converter(NOTATION.SEPARATOR, '/'), Samples.separatorGaps);
|
|
148
|
+
});
|
|
145
149
|
|
|
150
|
+
// fasta -> helm
|
|
146
151
|
test('testFastaPtToHelm', async () => {
|
|
147
152
|
await _testConvert(Samples.fastaPt, converter(NOTATION.HELM), Samples.helmPt);
|
|
148
153
|
});
|
|
@@ -152,16 +157,13 @@ PEPTIDE1{M.K.P.*.*.*.S.E.Y.V}$$$
|
|
|
152
157
|
test('testFastaRnaToHelm', async () => {
|
|
153
158
|
await _testConvert(Samples.fastaRna, converter(NOTATION.HELM), Samples.helmRna);
|
|
154
159
|
});
|
|
155
|
-
|
|
156
|
-
test('testFastaGapsToSeparator', async () => {
|
|
157
|
-
await _testConvert(Samples.fastaGaps, converter(NOTATION.SEPARATOR, '/'), Samples.separatorGaps);
|
|
158
|
-
});
|
|
159
160
|
test('testFastaGapsToHelm', async () => {
|
|
160
|
-
await _testConvert(Samples.fastaGaps, converter(NOTATION.
|
|
161
|
+
await _testConvert(Samples.fastaGaps, converter(NOTATION.HELM), Samples.helmGaps);
|
|
161
162
|
});
|
|
162
163
|
|
|
163
164
|
|
|
164
165
|
// SEPARATOR tests
|
|
166
|
+
// separator -> fasta
|
|
165
167
|
test('testSeparatorPtToFasta', async () => {
|
|
166
168
|
await _testConvert(Samples.separatorPt, converter(NOTATION.FASTA), Samples.fastaPt);
|
|
167
169
|
});
|
|
@@ -171,7 +173,11 @@ PEPTIDE1{M.K.P.*.*.*.S.E.Y.V}$$$
|
|
|
171
173
|
test('testSeparatorRnaToFasta', async () => {
|
|
172
174
|
await _testConvert(Samples.separatorRna, converter(NOTATION.FASTA), Samples.fastaRna);
|
|
173
175
|
});
|
|
176
|
+
test('testSeparatorGapsToFasta', async () => {
|
|
177
|
+
await _testConvert(Samples.separatorGaps, converter(NOTATION.FASTA), Samples.fastaGaps);
|
|
178
|
+
});
|
|
174
179
|
|
|
180
|
+
// separator -> helm
|
|
175
181
|
test('testSeparatorPtToHelm', async () => {
|
|
176
182
|
await _testConvert(Samples.separatorPt, converter(NOTATION.HELM), Samples.helmPt);
|
|
177
183
|
});
|
|
@@ -181,13 +187,31 @@ PEPTIDE1{M.K.P.*.*.*.S.E.Y.V}$$$
|
|
|
181
187
|
test('testSeparatorRnaToHelm', async () => {
|
|
182
188
|
await _testConvert(Samples.separatorRna, converter(NOTATION.HELM), Samples.helmRna);
|
|
183
189
|
});
|
|
184
|
-
test('testSeparatorGapsToFasta', async () => {
|
|
185
|
-
await _testConvert(Samples.separatorGaps, converter(NOTATION.FASTA), Samples.fastaGaps);
|
|
186
|
-
});
|
|
187
190
|
test('testSeparatorGapsToHelm', async () => {
|
|
188
191
|
await _testConvert(Samples.separatorGaps, converter(NOTATION.HELM), Samples.helmGaps);
|
|
189
192
|
});
|
|
190
193
|
|
|
191
194
|
|
|
192
|
-
// HELM tests
|
|
195
|
+
// HELM tests
|
|
196
|
+
// helm -> fasta
|
|
197
|
+
test('HelmDnaToFasta', async () => {
|
|
198
|
+
await _testConvert(Samples.helmDna, converter(NOTATION.FASTA), Samples.fastaDna);
|
|
199
|
+
});
|
|
200
|
+
test('HelmRnaToFasta', async () => {
|
|
201
|
+
await _testConvert(Samples.helmRna, converter(NOTATION.FASTA), Samples.fastaRna);
|
|
202
|
+
});
|
|
203
|
+
test('HelmPtToFasta', async () => {
|
|
204
|
+
await _testConvert(Samples.helmPt, converter(NOTATION.FASTA), Samples.fastaPt);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
// helm -> separator
|
|
208
|
+
test('HelmDnaToSeparator', async () => {
|
|
209
|
+
await _testConvert(Samples.helmDna, converter(NOTATION.SEPARATOR), Samples.separatorDna);
|
|
210
|
+
});
|
|
211
|
+
test('HelmRnaToSeparator', async () => {
|
|
212
|
+
await _testConvert(Samples.helmRna, converter(NOTATION.SEPARATOR, '*'), Samples.separatorRna);
|
|
213
|
+
});
|
|
214
|
+
test('HelmPtToSeparator', async () => {
|
|
215
|
+
await _testConvert(Samples.helmPt, converter(NOTATION.SEPARATOR, '-'), Samples.separatorPt);
|
|
216
|
+
});
|
|
193
217
|
});
|
|
@@ -113,6 +113,7 @@ MWRSWY-CKHP
|
|
|
113
113
|
testIdCsv = 'testIdCsv',
|
|
114
114
|
testSmilesCsv = 'testSmilesCsv',
|
|
115
115
|
testSmiles2Csv = 'testSmiles2Csv',
|
|
116
|
+
testCerealCsv = 'testCerealCsv',
|
|
116
117
|
}
|
|
117
118
|
|
|
118
119
|
const samples: { [key: string]: string } = {
|
|
@@ -128,6 +129,7 @@ MWRSWY-CKHP
|
|
|
128
129
|
'testIdCsv': 'System:AppData/Bio/tests/testId.csv',
|
|
129
130
|
'testSmilesCsv': 'System:AppData/Bio/tests/testSmiles.csv',
|
|
130
131
|
'testSmiles2Csv': 'System:AppData/Bio/tests/testSmiles2.csv',
|
|
132
|
+
'testCerealCsv': 'System:AppData/Bio/tests/testCereal.csv',
|
|
131
133
|
};
|
|
132
134
|
|
|
133
135
|
const _samplesDfs: { [key: string]: Promise<DG.DataFrame> } = {};
|
|
@@ -306,6 +308,10 @@ MWRSWY-CKHP
|
|
|
306
308
|
test('samplesFastaPtPosSequence', async () => {
|
|
307
309
|
await (_testPos(readSamples(Samples.fastaPtCsv), 'sequence', 'fasta:SEQ:PT'));
|
|
308
310
|
});
|
|
311
|
+
|
|
312
|
+
test('samplesTestCerealNegativeCerealName', async () => {
|
|
313
|
+
await (_testNeg(readSamples(Samples.testCerealCsv), 'cereal_name'));
|
|
314
|
+
});
|
|
309
315
|
});
|
|
310
316
|
|
|
311
317
|
export async function _testNeg(readDf: DfReaderFunc, colName: string) {
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {after, before, category,
|
|
1
|
+
import {after, before, category, expect, test} from '@datagrok-libraries/utils/src/test';
|
|
2
2
|
|
|
3
3
|
import * as grok from 'datagrok-api/grok';
|
|
4
|
-
import * as ui from 'datagrok-api/ui';
|
|
5
4
|
import * as DG from 'datagrok-api/dg';
|
|
6
5
|
import {importFasta, multipleSequenceAlignmentAny} from '../package';
|
|
6
|
+
import {readDataframe} from './utils';
|
|
7
|
+
import {convertDo} from '../utils/convert';
|
|
8
|
+
import {NOTATION} from '@datagrok-libraries/bio/src/utils/notation-converter';
|
|
7
9
|
|
|
8
10
|
category('renderers', () => {
|
|
9
11
|
let tvList: DG.TableView[];
|
|
@@ -23,42 +25,49 @@ category('renderers', () => {
|
|
|
23
25
|
await _testAfterMsa();
|
|
24
26
|
});
|
|
25
27
|
|
|
28
|
+
test('afterConvert', async () => {
|
|
29
|
+
await _testAfterConvert();
|
|
30
|
+
});
|
|
31
|
+
|
|
26
32
|
async function _testAfterMsa() {
|
|
27
33
|
const fastaTxt: string = await grok.dapi.files.readAsText('System:AppData/Bio/samples/sample_FASTA.fasta');
|
|
28
34
|
const df: DG.DataFrame = importFasta(fastaTxt)[0];
|
|
29
|
-
// await grok.data.detectSemanticTypes(df);
|
|
30
|
-
|
|
31
|
-
const srcSeqCol: DG.Column | null = df.col('sequence');
|
|
32
|
-
expect(srcSeqCol !== null, true);
|
|
33
|
-
console.log('Bio: tests/renderers/afterMsa, src data loaded');
|
|
34
|
-
|
|
35
35
|
const tv: DG.TableView = grok.shell.addTableView(df);
|
|
36
|
+
await grok.data.detectSemanticTypes(df);
|
|
36
37
|
console.log('Bio: tests/renderers/afterMsa, table view');
|
|
37
38
|
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
const srcSeqCol: DG.Column | null = df.col('sequence');
|
|
40
|
+
expect(srcSeqCol !== null, true);
|
|
40
41
|
|
|
41
42
|
console.log('Bio: tests/renderers/afterMsa, src before test ' +
|
|
42
43
|
`semType="${srcSeqCol!.semType}", units="${srcSeqCol!.getTag(DG.TAGS.UNITS)}", ` +
|
|
43
44
|
`cell.renderer="${srcSeqCol!.getTag('cell.renderer')}"`);
|
|
44
45
|
expect(srcSeqCol!.semType, DG.SEMTYPE.MACROMOLECULE);
|
|
45
46
|
expect(srcSeqCol!.getTag(DG.TAGS.UNITS), 'fasta:SEQ:PT');
|
|
46
|
-
// TODO: Find the way to check renderer for columns
|
|
47
47
|
expect(srcSeqCol!.getTag('cell.renderer'), 'Macromolecule');
|
|
48
|
-
console.log('Bio: tests/renderers/afterMsa, src semType tested');
|
|
49
48
|
|
|
50
49
|
const msaSeqCol: DG.Column | null = await multipleSequenceAlignmentAny(df, srcSeqCol!);
|
|
51
|
-
console.log('Bio: tests/renderers/afterMsa, msaSeqCol created');
|
|
52
|
-
|
|
53
50
|
tv.grid.invalidate();
|
|
54
|
-
console.log('Bio: tests/renderers/afterMsa, tv.grid invalidated');
|
|
55
51
|
|
|
56
52
|
expect(msaSeqCol!.semType, DG.SEMTYPE.MACROMOLECULE);
|
|
57
53
|
expect(msaSeqCol!.getTag(DG.TAGS.UNITS), 'fasta:SEQ.MSA:PT');
|
|
58
54
|
expect(msaSeqCol!.getTag('cell.renderer'), 'Macromolecule');
|
|
59
|
-
console.log('Bio: tests/renderers/afterMsa, msa semType tested');
|
|
60
55
|
|
|
61
56
|
dfList.push(df);
|
|
62
57
|
tvList.push(tv);
|
|
63
58
|
}
|
|
59
|
+
|
|
60
|
+
async function _testAfterConvert() {
|
|
61
|
+
const csv: string = await grok.dapi.files.readAsText('System:AppData/Bio/samples/sample_FASTA_PT.csv');
|
|
62
|
+
const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);
|
|
63
|
+
const tv: DG.TableView = grok.shell.addTableView(df);
|
|
64
|
+
await grok.data.detectSemanticTypes(df);
|
|
65
|
+
|
|
66
|
+
const srcCol: DG.Column = df.col('sequence')!;
|
|
67
|
+
const tgtCol: DG.Column = await convertDo(srcCol, NOTATION.SEPARATOR, '/');
|
|
68
|
+
expect(tgtCol.getTag('cell.renderer'), 'Macromolecule');
|
|
69
|
+
|
|
70
|
+
tvList.push(tv);
|
|
71
|
+
dfList.push(df);
|
|
72
|
+
};
|
|
64
73
|
});
|
|
@@ -9,6 +9,7 @@ import * as ui from 'datagrok-api/ui';
|
|
|
9
9
|
|
|
10
10
|
const lru = new DG.LruCache<any, any>();
|
|
11
11
|
const undefinedColor = 'rgb(100,100,100)';
|
|
12
|
+
const grayColor = '#808080'
|
|
12
13
|
|
|
13
14
|
function getPalleteByType(paletteType: string): SeqPalette {
|
|
14
15
|
switch (paletteType) {
|
|
@@ -81,7 +82,7 @@ function printLeftOrCentered(
|
|
|
81
82
|
g.fillStyle = color;
|
|
82
83
|
g.globalAlpha = transparencyRate;
|
|
83
84
|
g.fillText(colorPart, x + dx1, y + dy);
|
|
84
|
-
g.fillStyle =
|
|
85
|
+
g.fillStyle = grayColor;
|
|
85
86
|
g.fillText(grayPart, x + dx2, y + dy);
|
|
86
87
|
}
|
|
87
88
|
|
|
@@ -96,6 +97,22 @@ function printLeftOrCentered(
|
|
|
96
97
|
}
|
|
97
98
|
}
|
|
98
99
|
|
|
100
|
+
function findMonomers(helmString: string) {
|
|
101
|
+
//@ts-ignore
|
|
102
|
+
const types = Object.keys(org.helm.webeditor.monomerTypeList());
|
|
103
|
+
const monomers: any = [];
|
|
104
|
+
const monomer_names: any = [];
|
|
105
|
+
for (var i = 0; i < types.length; i++) {
|
|
106
|
+
//@ts-ignore
|
|
107
|
+
monomers.push(new scil.helm.Monomers.getMonomerSet(types[i]));
|
|
108
|
+
Object.keys(monomers[i]).forEach(k => {
|
|
109
|
+
monomer_names.push(monomers[i][k].id);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const split_string = WebLogo.splitterAsHelm(helmString);
|
|
113
|
+
return new Set(split_string.filter(val => !monomer_names.includes(val)));
|
|
114
|
+
}
|
|
115
|
+
|
|
99
116
|
export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
100
117
|
get name(): string { return 'macromoleculeSequence'; }
|
|
101
118
|
|
|
@@ -125,22 +142,47 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
125
142
|
const cell = gridCell.cell;
|
|
126
143
|
const tag = gridCell.cell.column.getTag(DG.TAGS.UNITS);
|
|
127
144
|
if (tag === 'HELM') {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const formula = canvas.getFormula(true);
|
|
135
|
-
if (!formula) {
|
|
136
|
-
gridCell.element = ui.divText(gridCell.cell.value, {style: {color: 'red'}});
|
|
137
|
-
} else {
|
|
145
|
+
console.log(findMonomers(cell.value));
|
|
146
|
+
const monomers = findMonomers(cell.value);
|
|
147
|
+
if (monomers.size == 0) {
|
|
148
|
+
const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});
|
|
149
|
+
host.setAttribute('dataformat', 'helm');
|
|
150
|
+
host.setAttribute('data', gridCell.cell.value);
|
|
138
151
|
gridCell.element = host;
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
152
|
+
//@ts-ignore
|
|
153
|
+
const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});
|
|
154
|
+
const formula = canvas.getFormula(true);
|
|
155
|
+
if (!formula) {
|
|
156
|
+
gridCell.element = ui.divText(gridCell.cell.value, {style: {color: 'red'}});
|
|
157
|
+
}
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (monomers.size > 0) {
|
|
161
|
+
w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;
|
|
162
|
+
g.save();
|
|
163
|
+
g.beginPath();
|
|
164
|
+
g.rect(x, y, w, h);
|
|
165
|
+
g.clip();
|
|
166
|
+
g.font = '12px monospace';
|
|
167
|
+
g.textBaseline = 'top';
|
|
168
|
+
let x1 = x;
|
|
169
|
+
const s: string = cell.value ?? '';
|
|
170
|
+
let subParts: string[] = WebLogo.splitterAsHelm(s);
|
|
171
|
+
let color = undefinedColor;
|
|
172
|
+
subParts.forEach((amino, index) => {
|
|
173
|
+
if (monomers.has(amino)) {
|
|
174
|
+
color = 'red';
|
|
175
|
+
} else {
|
|
176
|
+
color = grayColor;
|
|
177
|
+
}
|
|
178
|
+
g.fillStyle = undefinedColor;
|
|
179
|
+
let last = false;
|
|
180
|
+
if (index === subParts.length - 1)
|
|
181
|
+
last = true;
|
|
182
|
+
x1 = printLeftOrCentered(x1, y, w, h, g, amino, color, 0, true, 1.0, '/', last);
|
|
183
|
+
});
|
|
184
|
+
g.restore();
|
|
185
|
+
return;
|
|
144
186
|
}
|
|
145
187
|
} else {
|
|
146
188
|
const [type, subtype, paletteType] = gridCell.cell.column.getTag(DG.TAGS.UNITS).split(':');
|
|
@@ -176,6 +218,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
176
218
|
});
|
|
177
219
|
|
|
178
220
|
g.restore();
|
|
221
|
+
return;
|
|
179
222
|
}
|
|
180
223
|
}
|
|
181
224
|
}
|