@datagrok/bio 1.7.4 → 1.7.7

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.
@@ -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
  }
@@ -1,7 +1,14 @@
1
1
  import * as DG from 'datagrok-api/dg';
2
2
  import * as ui from 'datagrok-api/ui';
3
+ import * as grok from 'datagrok-api/grok';
4
+
5
+ import {Subscription} from 'rxjs';
3
6
  import {NotationConverter, NOTATION} from '@datagrok-libraries/bio/src/utils/notation-converter';
4
7
 
8
+
9
+ let convertDialog: DG.Dialog | null = null;
10
+ let convertDialogSubs: Subscription[] = [];
11
+
5
12
  /**
6
13
  * Converts notations of a Macromolecule column
7
14
  *
@@ -22,19 +29,37 @@ export function convert(col: DG.Column): void {
22
29
 
23
30
  const separatorInput = ui.choiceInput('Choose separator', separatorArray[0], separatorArray);
24
31
 
25
- ui.dialog('Convert sequence notation')
26
- .add(ui.div([
27
- ui.h1('Current notation: ' + current),
28
- targetNotationInput.root,
29
- // TODO: conditional separator input
30
- separatorInput.root
31
- ]))
32
- .onOK(() => {
33
- //TODO: create new converted column
34
- const targetNotation = targetNotationInput.value as NOTATION;
35
- const separator = separatorInput.value!;
36
- const newColumn = converter.convert(targetNotation, separator);
37
- col.dataFrame.columns.add(newColumn);
38
- })
39
- .show();
32
+ if (convertDialog == null) {
33
+ convertDialog = ui.dialog('Convert sequence notation')
34
+ .add(ui.div([
35
+ ui.h1('Current notation: ' + current),
36
+ targetNotationInput.root,
37
+ // TODO: conditional separator input
38
+ separatorInput.root
39
+ ]))
40
+ .onOK(async () => {
41
+ const targetNotation = targetNotationInput.value as NOTATION;
42
+ const separator: string | null = separatorInput.value;
43
+
44
+ await convertDo(col, targetNotation, separator);
45
+ })
46
+ .show();
47
+
48
+ convertDialogSubs.push(convertDialog.onClose.subscribe((value) => {
49
+ convertDialogSubs.forEach((s) => { s.unsubscribe(); });
50
+ convertDialogSubs = [];
51
+ convertDialog = null;
52
+ }));
53
+ }
54
+ }
55
+
56
+ export async function convertDo(
57
+ srcCol: DG.Column, targetNotation: NOTATION, separator: string | null
58
+ ): Promise<DG.Column> {
59
+ const converter = new NotationConverter(srcCol);
60
+ const newColumn = converter.convert(targetNotation, separator);
61
+ srcCol.dataFrame.columns.add(newColumn);
62
+ await grok.data.detectSemanticTypes(srcCol.dataFrame);
63
+ return newColumn;
40
64
  }
65
+
@@ -32,7 +32,7 @@ function _fastaToStrings(fasta: string): string[] {
32
32
  * @param {boolean} isAligned Whether the column is aligned.
33
33
  * @return {Promise<DG.Column>} Aligned sequences.
34
34
  */
35
- export async function runKalign(srcCol: DG.Column, isAligned = false): Promise<DG.Column> {
35
+ export async function runKalign(srcCol: DG.Column, isAligned = false, unUsedName:string = ''): Promise<DG.Column> {
36
36
  let sequences = srcCol.toList();
37
37
 
38
38
  if (isAligned)
@@ -56,7 +56,7 @@ export async function runKalign(srcCol: DG.Column, isAligned = false): Promise<D
56
56
  throw new Error(`kalign output no result`);
57
57
 
58
58
  const aligned = _fastaToStrings(buf).slice(0, sequences.length);
59
- const tgtCol = DG.Column.fromStrings(`msa(${srcCol.name})`, aligned);
59
+ const tgtCol = DG.Column.fromStrings(unUsedName, aligned);
60
60
 
61
61
  // units
62
62
  const srcUnits = srcCol.getTag(DG.TAGS.UNITS);
@@ -1,6 +1,7 @@
1
1
  import * as DG from 'datagrok-api/dg';
2
2
  import {WebLogo, SplitterFunc} from '@datagrok-libraries/bio/src/viewers/web-logo';
3
3
  import * as grok from 'datagrok-api/grok';
4
+ import { CAP_GROUP_NAME, CAP_GROUP_SMILES, jsonSdfMonomerLibDict, MONOMER_SYMBOL, RGROUP_ALTER_ID, RGROUP_FIELD, RGROUP_LABEL, SDF_MONOMER_NAME } from '../const';
4
5
 
5
6
  export const HELM_CORE_LIB_FILENAME = '/samples/HELMCoreLibrary.json';
6
7
  export const HELM_CORE_LIB_MONOMER_SYMBOL = 'symbol';
@@ -43,3 +44,37 @@ export function createMomomersMolDict(lib: any[]): { [key: string]: string | any
43
44
  });
44
45
  return dict;
45
46
  }
47
+
48
+
49
+ export function createJsonMonomerLibFromSdf(table: DG.DataFrame): any {
50
+ const resultLib = [];
51
+ for (let i = 0; i < table.rowCount; i++) {
52
+ const monomer: { [key: string]: string | any } = {};
53
+ Object.keys(jsonSdfMonomerLibDict).forEach(key => {
54
+ if (key === MONOMER_SYMBOL) {
55
+ const monomerSymbol = table.get(jsonSdfMonomerLibDict[key], i);
56
+ monomer[key] = monomerSymbol === '.' ? table.get(SDF_MONOMER_NAME, i) : monomerSymbol;
57
+ } else if (key === RGROUP_FIELD) {
58
+ const rgroups = table.get(jsonSdfMonomerLibDict[key], i).split('\n');
59
+ const jsonRgroups: any[] = [];
60
+ rgroups.forEach((g: string) => {
61
+ const rgroup: { [key: string]: string | any } = {};
62
+ const altAtom = g.substring(g.lastIndexOf("]") + 1);
63
+ let radicalNum = g.match(/\[R(\d+)\]/)![1];
64
+ rgroup[CAP_GROUP_SMILES] = altAtom === 'H' ? `[*:${radicalNum}][H]` : `O[*:${radicalNum}]`;
65
+ rgroup[RGROUP_ALTER_ID] = altAtom === 'H' ? `R${radicalNum}-H` : `R${radicalNum}-OH`;
66
+ rgroup[CAP_GROUP_NAME] = altAtom === 'H' ? `H` : `OH`;
67
+ rgroup[RGROUP_LABEL] = `R${radicalNum}`;
68
+ jsonRgroups.push(rgroup);
69
+ })
70
+ monomer[key] = jsonRgroups;
71
+ } else {
72
+ if((jsonSdfMonomerLibDict as { [key: string]: string | any })[key]) {
73
+ monomer[key] = table.get((jsonSdfMonomerLibDict as { [key: string]: string | any })[key], i);
74
+ }
75
+ }
76
+ })
77
+ resultLib.push(monomer);
78
+ }
79
+ return resultLib;
80
+ }
@@ -0,0 +1,335 @@
1
+ <html><head><meta charset="utf-8"/><title>Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=34f75e5127b8. Commit 7c42ea4b.</title><style type="text/css">html,
2
+ body {
3
+ font-family: Arial, Helvetica, sans-serif;
4
+ font-size: 1rem;
5
+ margin: 0;
6
+ padding: 0;
7
+ color: #333;
8
+ }
9
+ body {
10
+ padding: 2rem 1rem;
11
+ font-size: 0.85rem;
12
+ }
13
+ #jesthtml-content {
14
+ margin: 0 auto;
15
+ max-width: 70rem;
16
+ }
17
+ header {
18
+ display: flex;
19
+ align-items: center;
20
+ }
21
+ #title {
22
+ margin: 0;
23
+ flex-grow: 1;
24
+ }
25
+ #logo {
26
+ height: 4rem;
27
+ }
28
+ #timestamp {
29
+ color: #777;
30
+ margin-top: 0.5rem;
31
+ }
32
+
33
+ /** SUMMARY */
34
+ #summary {
35
+ color: #333;
36
+ margin: 2rem 0;
37
+ display: flex;
38
+ font-family: monospace;
39
+ font-size: 1rem;
40
+ }
41
+ #summary > div {
42
+ margin-right: 2rem;
43
+ background: #eee;
44
+ padding: 1rem;
45
+ min-width: 15rem;
46
+ }
47
+ #summary > div:last-child {
48
+ margin-right: 0;
49
+ }
50
+ @media only screen and (max-width: 720px) {
51
+ #summary {
52
+ flex-direction: column;
53
+ }
54
+ #summary > div {
55
+ margin-right: 0;
56
+ margin-top: 2rem;
57
+ }
58
+ #summary > div:first-child {
59
+ margin-top: 0;
60
+ }
61
+ }
62
+
63
+ .summary-total {
64
+ font-weight: bold;
65
+ margin-bottom: 0.5rem;
66
+ }
67
+ .summary-passed {
68
+ color: #4f8a10;
69
+ border-left: 0.4rem solid #4f8a10;
70
+ padding-left: 0.5rem;
71
+ }
72
+ .summary-failed,
73
+ .summary-obsolete-snapshots {
74
+ color: #d8000c;
75
+ border-left: 0.4rem solid #d8000c;
76
+ padding-left: 0.5rem;
77
+ }
78
+ .summary-pending {
79
+ color: #9f6000;
80
+ border-left: 0.4rem solid #9f6000;
81
+ padding-left: 0.5rem;
82
+ }
83
+ .summary-empty {
84
+ color: #999;
85
+ border-left: 0.4rem solid #999;
86
+ }
87
+
88
+ .test-result {
89
+ padding: 1rem;
90
+ margin-bottom: 0.25rem;
91
+ }
92
+ .test-result:last-child {
93
+ border: 0;
94
+ }
95
+ .test-result.passed {
96
+ background-color: #dff2bf;
97
+ color: #4f8a10;
98
+ }
99
+ .test-result.failed {
100
+ background-color: #ffbaba;
101
+ color: #d8000c;
102
+ }
103
+ .test-result.pending {
104
+ background-color: #ffdf61;
105
+ color: #9f6000;
106
+ }
107
+
108
+ .test-info {
109
+ display: flex;
110
+ justify-content: space-between;
111
+ }
112
+ .test-suitename {
113
+ width: 20%;
114
+ text-align: left;
115
+ font-weight: bold;
116
+ word-break: break-word;
117
+ }
118
+ .test-title {
119
+ width: 40%;
120
+ text-align: left;
121
+ font-style: italic;
122
+ }
123
+ .test-status {
124
+ width: 20%;
125
+ text-align: right;
126
+ }
127
+ .test-duration {
128
+ width: 10%;
129
+ text-align: right;
130
+ font-size: 0.75rem;
131
+ }
132
+
133
+ .failureMessages {
134
+ padding: 0 1rem;
135
+ margin-top: 1rem;
136
+ border-top: 1px dashed #d8000c;
137
+ }
138
+ .failureMessages.suiteFailure {
139
+ border-top: none;
140
+ }
141
+ .failureMsg {
142
+ white-space: pre-wrap;
143
+ white-space: -moz-pre-wrap;
144
+ white-space: -pre-wrap;
145
+ white-space: -o-pre-wrap;
146
+ word-wrap: break-word;
147
+ }
148
+
149
+ .suite-container {
150
+ margin-bottom: 2rem;
151
+ }
152
+ .suite-info {
153
+ padding: 1rem;
154
+ background-color: #eee;
155
+ color: #777;
156
+ display: flex;
157
+ align-items: center;
158
+ margin-bottom: 0.25rem;
159
+ }
160
+ .suite-info .suite-path {
161
+ word-break: break-all;
162
+ flex-grow: 1;
163
+ font-family: monospace;
164
+ font-size: 1rem;
165
+ }
166
+ .suite-info .suite-time {
167
+ margin-left: 0.5rem;
168
+ padding: 0.2rem 0.3rem;
169
+ font-size: 0.75rem;
170
+ }
171
+ .suite-info .suite-time.warn {
172
+ background-color: #d8000c;
173
+ color: #fff;
174
+ }
175
+
176
+ /* CONSOLE LOGS */
177
+ .suite-consolelog {
178
+ margin-bottom: 0.25rem;
179
+ padding: 1rem;
180
+ background-color: #efefef;
181
+ }
182
+ .suite-consolelog-header {
183
+ font-weight: bold;
184
+ }
185
+ .suite-consolelog-item {
186
+ padding: 0.5rem;
187
+ }
188
+ .suite-consolelog-item pre {
189
+ margin: 0.5rem 0;
190
+ white-space: pre-wrap;
191
+ white-space: -moz-pre-wrap;
192
+ white-space: -pre-wrap;
193
+ white-space: -o-pre-wrap;
194
+ word-wrap: break-word;
195
+ }
196
+ .suite-consolelog-item-origin {
197
+ color: #777;
198
+ font-weight: bold;
199
+ }
200
+ .suite-consolelog-item-message {
201
+ color: #000;
202
+ font-size: 1rem;
203
+ padding: 0 0.5rem;
204
+ }
205
+
206
+ /* OBSOLETE SNAPSHOTS */
207
+ .suite-obsolete-snapshots {
208
+ margin-bottom: 0.25rem;
209
+ padding: 1rem;
210
+ background-color: #ffbaba;
211
+ color: #d8000c;
212
+ }
213
+ .suite-obsolete-snapshots-header {
214
+ font-weight: bold;
215
+ }
216
+ .suite-obsolete-snapshots-item {
217
+ padding: 0.5rem;
218
+ }
219
+ .suite-obsolete-snapshots-item pre {
220
+ margin: 0.5rem 0;
221
+ white-space: pre-wrap;
222
+ white-space: -moz-pre-wrap;
223
+ white-space: -pre-wrap;
224
+ white-space: -o-pre-wrap;
225
+ word-wrap: break-word;
226
+ }
227
+ .suite-obsolete-snapshots-item-message {
228
+ color: #000;
229
+ font-size: 1rem;
230
+ padding: 0 0.5rem;
231
+ }
232
+ </style></head><body><div id="jesthtml-content"><header><h1 id="title">Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=34f75e5127b8. Commit 7c42ea4b.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-07-15 17:01:22</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed summary-empty">0 passed</div><div class="summary-failed">1 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (1)</div><div class="summary-passed summary-empty">0 passed</div><div class="summary-failed">1 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><div class="suite-info"><div class="suite-path">/home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts</div><div class="suite-time warn">175.127s</div></div><div class="suite-tests"><div class="test-result failed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">failed</div><div class="test-duration">165.279s</div></div><div class="failureMessages"> <pre class="failureMsg">Error: Test result : Bio.MSA.is_correct : TypeError: Cannot read properties of undefined (reading 'split')
233
+ Test result : Bio.converters.testFastaGapsToSeparator : Error: Units are not specified in column
234
+ Test result : Bio.converters.testFastaGapsToHelm : Error: Units are not specified in column
235
+ Test result : Bio.converters.HelmDnaToFasta : Error: Units are not specified in column
236
+ Test result : Bio.converters.HelmDnaToSeparator : Error: Units are not specified in column
237
+
238
+ at /home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:67:20
239
+ at Generator.next (&lt;anonymous&gt;)
240
+ at fulfilled (/home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:31:58)
241
+ at runMicrotasks (&lt;anonymous&gt;)
242
+ at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre></div></div></div><div class="suite-consolelog"><div class="suite-consolelog-header">Console Log</div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/Bio/src/__jest__/test-node.ts:63:11)
243
+ at Generator.next (&lt;anonymous&gt;)
244
+ at fulfilled (/home/runner/work/public/public/packages/Bio/src/__jest__/test-node.ts:28:58)
245
+ at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Using web root: http://localhost:8080</pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:40:11
246
+ at Generator.next (&lt;anonymous&gt;)
247
+ at /home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:34:71
248
+ at new Promise (&lt;anonymous&gt;)
249
+ at Object.&lt;anonymous&gt;.__awaiter (/home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:30:12)
250
+ at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:38:23)
251
+ at Promise.then.completed (/home/runner/work/public/public/packages/Bio/node_modules/jest-circus/build/utils.js:391:28)
252
+ at new Promise (&lt;anonymous&gt;)</pre><pre class="suite-consolelog-item-message">Testing Bio package</pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:65:11
253
+ at Generator.next (&lt;anonymous&gt;)
254
+ at fulfilled (/home/runner/work/public/public/packages/Bio/src/__jest__/remote.test.ts:31:58)
255
+ at runMicrotasks (&lt;anonymous&gt;)
256
+ at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Test result : Bio.WebLogo.testGetStats : OK
257
+ Test result : Bio.WebLogo.testGetAlphabetSimilarity : OK
258
+ Test result : Bio.WebLogo.testPickupPaletteN1 : OK
259
+ Test result : Bio.WebLogo.testPickupPaletteN1e : OK
260
+ Test result : Bio.WebLogo.testPickupPaletteAA1 : OK
261
+ Test result : Bio.WebLogo.testPickupPaletteX : OK
262
+ Test result : Bio.WebLogo.monomerToText.longMonomerSingle : OK
263
+ Test result : Bio.WebLogo.monomerToText.longMonomerShort : OK
264
+ Test result : Bio.WebLogo.monomerToText.longMonomerLong56 : OK
265
+ Test result : Bio.WebLogo.monomerToText.longMonomerComplexFirstPartShort : OK
266
+ Test result : Bio.WebLogo.monomerToText.longMonomerComplexFirstPartLong56 : OK
267
+ Test result : Bio.Palettes.testPaletteN : OK
268
+ Test result : Bio.Palettes.testPaletteAA : OK
269
+ Test result : Bio.detectors.Negative1 : OK
270
+ Test result : Bio.detectors.Negative2 : OK
271
+ Test result : Bio.detectors.Negative3 : OK
272
+ Test result : Bio.detectors.NegativeSmiles : OK
273
+ Test result : Bio.detectors.Dna1 : OK
274
+ Test result : Bio.detectors.Rna1 : OK
275
+ Test result : Bio.detectors.AA1 : OK
276
+ Test result : Bio.detectors.MsaDna1 : OK
277
+ Test result : Bio.detectors.MsaAA1 : OK
278
+ Test result : Bio.detectors.SepDna : OK
279
+ Test result : Bio.detectors.SepRna : OK
280
+ Test result : Bio.detectors.SepPt : OK
281
+ Test result : Bio.detectors.SepUn1 : OK
282
+ Test result : Bio.detectors.SepUn2 : OK
283
+ Test result : Bio.detectors.SepMsaN1 : OK
284
+ Test result : Bio.detectors.SamplesFastaCsvPt : OK
285
+ Test result : Bio.detectors.SamplesFastaCsvNegativeEntry : OK
286
+ Test result : Bio.detectors.SamplesFastaCsvNegativeLength : OK
287
+ Test result : Bio.detectors.SamplesFastaCsvNegativeUniProtKB : OK
288
+ Test result : Bio.detectors.SamplesFastaFastaPt : OK
289
+ Test result : Bio.detectors.samplesPeptidesComplexNegativeID : OK
290
+ Test result : Bio.detectors.SamplesPeptidesComplexNegativeMeasured : OK
291
+ Test result : Bio.detectors.SamplesPeptidesComplexNegativeValue : OK
292
+ Test result : Bio.detectors.samplesMsaComplexUn : OK
293
+ Test result : Bio.detectors.samplesMsaComplexNegativeActivity : OK
294
+ Test result : Bio.detectors.samplesIdCsvNegativeID : OK
295
+ Test result : Bio.detectors.samplesSarSmallCsvNegativeSmiles : OK
296
+ Test result : Bio.detectors.samplesHelmCsvHELM : OK
297
+ Test result : Bio.detectors.samplesHelmCsvNegativeActivity : OK
298
+ Test result : Bio.detectors.samplesTestHelmNegativeID : OK
299
+ Test result : Bio.detectors.samplesTestHelmNegativeTestType : OK
300
+ Test result : Bio.detectors.samplesTestHelmPositiveHelmString : OK
301
+ Test result : Bio.detectors.samplesTestHelmNegativeValid : OK
302
+ Test result : Bio.detectors.samplesTestHelmNegativeMolWeight : OK
303
+ Test result : Bio.detectors.samplesTestHelmNegativeMolFormula : OK
304
+ Test result : Bio.detectors.samplesTestHelmNegativeSmiles : OK
305
+ Test result : Bio.detectors.samplesTestDemogNegativeAll : OK
306
+ Test result : Bio.detectors.samplesTestSmiles2NegativeSmiles : OK
307
+ Test result : Bio.detectors.samplesFastaPtPosSequence : OK
308
+ Test result : Bio.detectors.samplesTestCerealNegativeCerealName : OK
309
+ Test result : Bio.MSA.test_table.is_not_empty : OK
310
+ Test result : Bio.sequenceSpace.sequenceSpaceOpens : OK
311
+ Test result : Bio.activityCliffs.activityCliffsOpen : OK
312
+ Test result : Bio.splitters.helm1 : OK
313
+ Test result : Bio.splitters.helm2 : OK
314
+ Test result : Bio.splitters.helm3-multichar : OK
315
+ Test result : Bio.renderers.afterMsa : OK
316
+ Test result : Bio.renderers.afterConvert : OK
317
+ Test result : Bio.converters.testFastaPtToSeparator : OK
318
+ Test result : Bio.converters.testFastaDnaToSeparator : OK
319
+ Test result : Bio.converters.testFastaRnaToSeparator : OK
320
+ Test result : Bio.converters.testFastaPtToHelm : OK
321
+ Test result : Bio.converters.testFastaDnaToHelm : OK
322
+ Test result : Bio.converters.testFastaRnaToHelm : OK
323
+ Test result : Bio.converters.testSeparatorPtToFasta : OK
324
+ Test result : Bio.converters.testSeparatorDnaToFasta : OK
325
+ Test result : Bio.converters.testSeparatorRnaToFasta : OK
326
+ Test result : Bio.converters.testSeparatorGapsToFasta : OK
327
+ Test result : Bio.converters.testSeparatorPtToHelm : OK
328
+ Test result : Bio.converters.testSeparatorDnaToHelm : OK
329
+ Test result : Bio.converters.testSeparatorRnaToHelm : OK
330
+ Test result : Bio.converters.testSeparatorGapsToHelm : OK
331
+ Test result : Bio.converters.HelmRnaToFasta : OK
332
+ Test result : Bio.converters.HelmPtToFasta : OK
333
+ Test result : Bio.converters.HelmRnaToSeparator : OK
334
+ Test result : Bio.converters.HelmPtToSeparator : OK
335
+ </pre></div></div></div></div></body></html>