@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.
@@ -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.3",
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.1",
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.close();
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: string = process.env.TARGET_PACKAGE ?? 'Bio';
39
+ const targetPackage:string = process.env.TARGET_PACKAGE ?? 'Bio';
24
40
  console.log(`Testing ${targetPackage} package`);
25
41
 
26
- //console.log(require('root-require')('package.json').version);
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 report = '';
50
+ let passReport = '';
51
+ let failReport = '';
36
52
  for (let i = 0; i < df.rowCount; i++) {
37
- if (!cStatus.get(i)) {
38
- report += `${cCat.get(i)}.${cName.get(i)}: ${cMessage.get(i)}\n`;
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({report, failed});
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.report);
65
+ console.log(r.passReport);
48
66
  // @ts-ignore
49
- expect(r.failed).toBe(false);
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';
@@ -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/renderer-test';
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
- //Y/N/R/Q/W/Y/V//
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.SEPARATOR), Samples.helmGaps);
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: TODO
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, test, expect, expectObject} from '@datagrok-libraries/utils/src/test';
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
- // await grok.data.detectSemanticTypes(df);
39
- console.log('Bio: tests/renderers/afterMsa, detectSemanticTypes');
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 = '#808080';
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
- const host = ui.div([], {style: {width: `${w}px`, height: `${h}px`}});
129
- host.setAttribute('dataformat', 'helm');
130
- host.setAttribute('data', gridCell.cell.value);
131
- gridCell.element = host;
132
- //@ts-ignore
133
- const canvas = new JSDraw2.Editor(host, {width: w, height: h, skin: 'w8', viewonly: true});
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
- const molWeight = Math.round(canvas.getMolWeight() * 100) / 100;
140
- const coef = Math.round(canvas.getExtinctionCoefficient(true) * 100) / 100;
141
- const molfile = canvas.getMolfile();
142
- const result = formula + ', ' + molWeight + ', ' + coef + ', ' + molfile;
143
- lru.set(gridCell.cell.value, result);
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
  }