@datagrok/bio 1.9.1 → 1.10.2
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 +13 -3
- package/dist/package-test.js +164 -105
- package/dist/package.js +144 -87
- package/package.json +3 -2
- package/src/package.ts +10 -33
- package/src/tests/detectors-test.ts +21 -18
- package/src/tests/test-sequnces-generators.ts +27 -4
- package/src/utils/atomic-works.ts +1 -1
- package/src/utils/cell-renderer.ts +18 -11
- package/src/utils/sequence-space.ts +5 -3
- package/{test-Bio-fe2f9610d4ed-cdfe422f.html → test-Bio-eb4783c07294-0aa1538b.html} +2 -2
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"name": "Leonid Stolbov",
|
|
6
6
|
"email": "lstolbov@datagrok.ai"
|
|
7
7
|
},
|
|
8
|
-
"version": "1.
|
|
8
|
+
"version": "1.10.2",
|
|
9
9
|
"description": "Bio is a [package](https://datagrok.ai/help/develop/develop#packages) for the [Datagrok](https://datagrok.ai) platform",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@biowasm/aioli": ">=2.4.0",
|
|
17
|
-
"@datagrok-libraries/bio": "^
|
|
17
|
+
"@datagrok-libraries/bio": "^4.1.0",
|
|
18
|
+
"@datagrok-libraries/chem-meta": "1.0.0",
|
|
18
19
|
"@datagrok-libraries/ml": "^4.0.0",
|
|
19
20
|
"@datagrok-libraries/utils": "^1.6.2",
|
|
20
21
|
"cash-dom": "latest",
|
package/src/package.ts
CHANGED
|
@@ -24,7 +24,11 @@ import {representationsWidget} from './widgets/representations';
|
|
|
24
24
|
import {UnitsHandler} from '@datagrok-libraries/bio/src/utils/units-handler';
|
|
25
25
|
import {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';
|
|
26
26
|
import {removeEmptyStringRows} from '@datagrok-libraries/utils/src/dataframe-utils';
|
|
27
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
generateManySequences,
|
|
29
|
+
generateLongSequence,
|
|
30
|
+
performanceTest
|
|
31
|
+
} from './tests/test-sequnces-generators';
|
|
28
32
|
|
|
29
33
|
//tags: init
|
|
30
34
|
export async function initBio() {
|
|
@@ -32,39 +36,12 @@ export async function initBio() {
|
|
|
32
36
|
|
|
33
37
|
//name: testManySequencesPerformance
|
|
34
38
|
export function testManySequencesPerformance(): void {
|
|
35
|
-
|
|
36
|
-
const csv = generateManySequences();
|
|
37
|
-
const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);
|
|
38
|
-
const col: DG.Column = df.columns.byName('MSA');
|
|
39
|
-
df.columns.byName('MSA').semType = DG.SEMTYPE.MACROMOLECULE;
|
|
40
|
-
col.setTag('units', 'separator');
|
|
41
|
-
col.setTag('aligned', 'SEQ.MSA');
|
|
42
|
-
col.setTag('alphabet', 'UN');
|
|
43
|
-
col.setTag('separator', '/');
|
|
44
|
-
grok.shell.addTableView(df);
|
|
45
|
-
|
|
46
|
-
const endTime: number = Date.now();
|
|
47
|
-
const elapsedTime: number = endTime - startTime;
|
|
48
|
-
console.log(`Elapsed time: ${elapsedTime}ms`);
|
|
49
|
-
|
|
39
|
+
performanceTest(generateManySequences, 'Many sequences');
|
|
50
40
|
}
|
|
41
|
+
|
|
51
42
|
//name: testLongSequencesPerformance
|
|
52
43
|
export function testLongSequencesPerformance(): void {
|
|
53
|
-
|
|
54
|
-
const csv = generateLongSequence();
|
|
55
|
-
const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);
|
|
56
|
-
const col: DG.Column = df.columns.byName('MSA');
|
|
57
|
-
df.columns.byName('MSA').semType = DG.SEMTYPE.MACROMOLECULE;
|
|
58
|
-
col.setTag('units', 'separator');
|
|
59
|
-
col.setTag('aligned', 'SEQ.MSA');
|
|
60
|
-
col.setTag('alphabet', 'UN');
|
|
61
|
-
col.setTag('separator', '/');
|
|
62
|
-
grok.shell.addTableView(df);
|
|
63
|
-
|
|
64
|
-
const endTime: number = Date.now();
|
|
65
|
-
const elapsedTime: number = endTime - startTime;
|
|
66
|
-
console.log(`Elapsed time: ${elapsedTime}ms`);
|
|
67
|
-
|
|
44
|
+
performanceTest(generateLongSequence, 'Long sequences');
|
|
68
45
|
}
|
|
69
46
|
|
|
70
47
|
|
|
@@ -200,11 +177,11 @@ export async function sequenceSpaceTopMenu(table: DG.DataFrame, macroMolecule: D
|
|
|
200
177
|
if (!encodedCol)
|
|
201
178
|
return;
|
|
202
179
|
const embedColsNames = getEmbeddingColsNames(table);
|
|
203
|
-
const withoutEmptyValues = DG.DataFrame.fromColumns([
|
|
180
|
+
const withoutEmptyValues = DG.DataFrame.fromColumns([encodedCol]).clone();
|
|
204
181
|
const emptyValsIdxs = removeEmptyStringRows(withoutEmptyValues, encodedCol);
|
|
205
182
|
|
|
206
183
|
const chemSpaceParams = {
|
|
207
|
-
seqCol: withoutEmptyValues.col(
|
|
184
|
+
seqCol: withoutEmptyValues.col(encodedCol.name)!,
|
|
208
185
|
methodName: methodName,
|
|
209
186
|
similarityMetric: similarityMetric,
|
|
210
187
|
embedAxesNames: embedColsNames
|
|
@@ -199,44 +199,44 @@ MWRSWY-CKHP
|
|
|
199
199
|
test('NegativeSmiles', async () => { await _testNeg(readCsv('csvDfSmiles', csvDfSmiles), 'col1'); });
|
|
200
200
|
|
|
201
201
|
test('Dna1', async () => {
|
|
202
|
-
await _testPos(readCsv('csvDfDna1', csvDfDna1), 'seq', 'fasta', 'SEQ', 'DNA');
|
|
202
|
+
await _testPos(readCsv('csvDfDna1', csvDfDna1), 'seq', 'fasta', 'SEQ', 'DNA', 4, false);
|
|
203
203
|
});
|
|
204
204
|
test('Rna1', async () => {
|
|
205
|
-
await _testPos(readCsv('csvDfRna1', csvDfRna1), 'seq', 'fasta', 'SEQ', 'RNA');
|
|
205
|
+
await _testPos(readCsv('csvDfRna1', csvDfRna1), 'seq', 'fasta', 'SEQ', 'RNA', 4, false);
|
|
206
206
|
});
|
|
207
207
|
test('AA1', async () => {
|
|
208
|
-
await _testPos(readCsv('csvDfPt1', csvDfPt1), 'seq', 'fasta', 'SEQ', 'PT');
|
|
208
|
+
await _testPos(readCsv('csvDfPt1', csvDfPt1), 'seq', 'fasta', 'SEQ', 'PT', 20, false);
|
|
209
209
|
});
|
|
210
210
|
test('MsaDna1', async () => {
|
|
211
|
-
await _testPos(readCsv('csvDfMsaDna1', csvDfMsaDna1), 'seq', 'fasta', 'SEQ.MSA', 'DNA');
|
|
211
|
+
await _testPos(readCsv('csvDfMsaDna1', csvDfMsaDna1), 'seq', 'fasta', 'SEQ.MSA', 'DNA', 4, false);
|
|
212
212
|
});
|
|
213
213
|
|
|
214
214
|
test('MsaAA1', async () => {
|
|
215
|
-
await _testPos(readCsv('csvDfMsaPt1', csvDfMsaPt1), 'seq', 'fasta', 'SEQ.MSA', 'PT');
|
|
215
|
+
await _testPos(readCsv('csvDfMsaPt1', csvDfMsaPt1), 'seq', 'fasta', 'SEQ.MSA', 'PT', 20, false);
|
|
216
216
|
});
|
|
217
217
|
|
|
218
218
|
test('SepDna', async () => {
|
|
219
|
-
await _testPos(readCsv('csvDfSepDna', csvDfSepDna), 'seq', 'separator', 'SEQ', 'DNA', '*');
|
|
219
|
+
await _testPos(readCsv('csvDfSepDna', csvDfSepDna), 'seq', 'separator', 'SEQ', 'DNA', 4, false, '*');
|
|
220
220
|
});
|
|
221
221
|
test('SepRna', async () => {
|
|
222
|
-
await _testPos(readCsv('csvDfSepRna', csvDfSepRna), 'seq', 'separator', 'SEQ', 'RNA', '*');
|
|
222
|
+
await _testPos(readCsv('csvDfSepRna', csvDfSepRna), 'seq', 'separator', 'SEQ', 'RNA', 4, false, '*');
|
|
223
223
|
});
|
|
224
224
|
test('SepPt', async () => {
|
|
225
|
-
await _testPos(readCsv('csvDfSepPt', csvDfSepPt), 'seq', 'separator', 'SEQ', 'PT', '-');
|
|
225
|
+
await _testPos(readCsv('csvDfSepPt', csvDfSepPt), 'seq', 'separator', 'SEQ', 'PT', 20, false, '-');
|
|
226
226
|
});
|
|
227
227
|
test('SepUn1', async () => {
|
|
228
|
-
await _testPos(readCsv('csvDfSepUn1', csvDfSepUn1), 'seq', 'separator', 'SEQ', 'UN', '-');
|
|
228
|
+
await _testPos(readCsv('csvDfSepUn1', csvDfSepUn1), 'seq', 'separator', 'SEQ', 'UN', 8, true, '-');
|
|
229
229
|
});
|
|
230
230
|
test('SepUn2', async () => {
|
|
231
|
-
await _testPos(readCsv('csvDfSepUn2', csvDfSepUn2), 'seq', 'separator', 'SEQ', 'UN', '/');
|
|
231
|
+
await _testPos(readCsv('csvDfSepUn2', csvDfSepUn2), 'seq', 'separator', 'SEQ', 'UN', 9, true, '/');
|
|
232
232
|
});
|
|
233
233
|
|
|
234
234
|
test('SepMsaN1', async () => {
|
|
235
|
-
await _testPos(readCsv('csvDfSepMsaDna1', csvDfSepMsaDna1), 'seq', 'separator', 'SEQ.MSA', 'DNA', '-');
|
|
235
|
+
await _testPos(readCsv('csvDfSepMsaDna1', csvDfSepMsaDna1), 'seq', 'separator', 'SEQ.MSA', 'DNA', 4, false, '-');
|
|
236
236
|
});
|
|
237
237
|
|
|
238
238
|
test('SamplesFastaCsvPt', async () => {
|
|
239
|
-
await _testPos(readSamples(Samples.fastaCsv), 'sequence', 'fasta', 'SEQ', 'PT');
|
|
239
|
+
await _testPos(readSamples(Samples.fastaCsv), 'sequence', 'fasta', 'SEQ', 'PT', 20, false);
|
|
240
240
|
});
|
|
241
241
|
test('SamplesFastaCsvNegativeEntry', async () => {
|
|
242
242
|
await _testNeg(readSamples(Samples.fastaCsv), 'Entry');
|
|
@@ -249,7 +249,7 @@ MWRSWY-CKHP
|
|
|
249
249
|
});
|
|
250
250
|
|
|
251
251
|
test('SamplesFastaFastaPt', async () => {
|
|
252
|
-
await _testPos(readSamples(Samples.fastaFasta, readFileFasta), 'sequence', 'fasta', 'SEQ', 'PT');
|
|
252
|
+
await _testPos(readSamples(Samples.fastaFasta, readFileFasta), 'sequence', 'fasta', 'SEQ', 'PT', 20, false);
|
|
253
253
|
});
|
|
254
254
|
|
|
255
255
|
// peptidesComplex contains monomers with spaces in AlignedSequence columns, which are forbidden
|
|
@@ -267,7 +267,7 @@ MWRSWY-CKHP
|
|
|
267
267
|
});
|
|
268
268
|
|
|
269
269
|
test('samplesMsaComplexUn', async () => {
|
|
270
|
-
await _testPos(readSamples(Samples.msaComplex), 'MSA', 'separator', 'SEQ.MSA', 'UN', '/');
|
|
270
|
+
await _testPos(readSamples(Samples.msaComplex), 'MSA', 'separator', 'SEQ.MSA', 'UN', 161, true, '/');
|
|
271
271
|
});
|
|
272
272
|
test('samplesMsaComplexNegativeActivity', async () => {
|
|
273
273
|
await _testNeg(readSamples(Samples.msaComplex), 'Activity');
|
|
@@ -282,7 +282,7 @@ MWRSWY-CKHP
|
|
|
282
282
|
});
|
|
283
283
|
|
|
284
284
|
test('samplesHelmCsvHELM', async () => {
|
|
285
|
-
await _testPos(readSamples(Samples.helmCsv), 'HELM', 'helm', null, null, null);
|
|
285
|
+
await _testPos(readSamples(Samples.helmCsv), 'HELM', 'helm', null, null, 160, true, null);
|
|
286
286
|
});
|
|
287
287
|
|
|
288
288
|
test('samplesHelmCsvNegativeActivity', async () => {
|
|
@@ -298,7 +298,7 @@ MWRSWY-CKHP
|
|
|
298
298
|
await _testNeg(readSamples(Samples.testHelmCsv), 'Test type');
|
|
299
299
|
});
|
|
300
300
|
test('samplesTestHelmPositiveHelmString', async () => {
|
|
301
|
-
await _testPos(readSamples(Samples.testHelmCsv), 'HELM string', 'helm', null, null, null);
|
|
301
|
+
await _testPos(readSamples(Samples.testHelmCsv), 'HELM string', 'helm', null, null, 9, true, null);
|
|
302
302
|
});
|
|
303
303
|
test('samplesTestHelmNegativeValid', async () => {
|
|
304
304
|
await _testNeg(readSamples(Samples.testHelmCsv), 'Valid?');
|
|
@@ -330,7 +330,7 @@ MWRSWY-CKHP
|
|
|
330
330
|
});
|
|
331
331
|
|
|
332
332
|
test('samplesFastaPtPosSequence', async () => {
|
|
333
|
-
await _testPos(readSamples(Samples.fastaPtCsv), 'sequence', 'fasta', 'SEQ', 'PT');
|
|
333
|
+
await _testPos(readSamples(Samples.fastaPtCsv), 'sequence', 'fasta', 'SEQ', 'PT', 20, false);
|
|
334
334
|
});
|
|
335
335
|
|
|
336
336
|
test('samplesTestCerealNegativeCerealName', async () => {
|
|
@@ -388,7 +388,8 @@ export async function _testNeg(readDf: DfReaderFunc, colName: string) {
|
|
|
388
388
|
|
|
389
389
|
export async function _testPos(
|
|
390
390
|
readDf: DfReaderFunc, colName: string, units: string,
|
|
391
|
-
aligned: string | null, alphabet: string | null,
|
|
391
|
+
aligned: string | null, alphabet: string | null, alphabetSize: number, alphabetIsMultichar: boolean,
|
|
392
|
+
separator: string | null = null
|
|
392
393
|
) {
|
|
393
394
|
const df: DG.DataFrame = await readDf();
|
|
394
395
|
const col: DG.Column = df.col(colName)!;
|
|
@@ -405,6 +406,8 @@ export async function _testPos(
|
|
|
405
406
|
expect(col.getTag('separator'), separator);
|
|
406
407
|
|
|
407
408
|
const uh = new UnitsHandler(col);
|
|
409
|
+
expect(uh.getAlphabetSize(), alphabetSize);
|
|
410
|
+
expect(uh.getAlphabetIsMultichar(), alphabetIsMultichar);
|
|
408
411
|
if (!uh.isHelm()) {
|
|
409
412
|
expect(uh.aligned, aligned);
|
|
410
413
|
expect(uh.alphabet, alphabet);
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import * as DG from 'datagrok-api/dg';
|
|
2
|
+
import * as grok from 'datagrok-api/grok';
|
|
3
|
+
|
|
1
4
|
export function generateManySequences(): string {
|
|
2
5
|
let csvData = `MSA,Activity
|
|
3
6
|
meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr//Phe_4Me,5.30751`;
|
|
@@ -9,14 +12,34 @@ meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr/
|
|
|
9
12
|
|
|
10
13
|
export function generateLongSequence(): string {
|
|
11
14
|
let longSequence = `meI/hHis/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/E/N/D-Orn/D-aThr`;
|
|
12
|
-
for (let i = 0; i < 10 **
|
|
15
|
+
for (let i = 0; i < 10 ** 5; i++) {
|
|
13
16
|
longSequence += `/Aca/N/T/dE/Thr_PO3H2/Aca/D-Tyr_Et/Tyr_ab-dehydroMe/dV/dv`;
|
|
14
17
|
}
|
|
15
18
|
longSequence += `//Phe_4Me,5.30751`;
|
|
16
|
-
let csvData = `MSA,Activity
|
|
17
|
-
|
|
18
|
-
for (let i = 0; i <= 10 ** 2; i++) {
|
|
19
|
+
let csvData = `MSA,Activity `;
|
|
20
|
+
for (let i = 0; i <= 10 ** 1 * 4; i++) {
|
|
19
21
|
csvData += `\n ${longSequence}`;
|
|
20
22
|
}
|
|
21
23
|
return csvData;
|
|
22
24
|
}
|
|
25
|
+
export function setTagsMacromolecule(col: DG.Column) {
|
|
26
|
+
col.semType = DG.SEMTYPE.MACROMOLECULE;
|
|
27
|
+
col.setTag('units', 'separator');
|
|
28
|
+
col.setTag('aligned', 'SEQ.MSA');
|
|
29
|
+
col.setTag('alphabet', 'UN');
|
|
30
|
+
col.setTag('separator', '/');
|
|
31
|
+
return col;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function performanceTest(generateFunc: () => string,testName: string) {
|
|
35
|
+
const startTime: number = Date.now();
|
|
36
|
+
const csv = generateFunc();
|
|
37
|
+
const df: DG.DataFrame = DG.DataFrame.fromCsv(csv);
|
|
38
|
+
const col: DG.Column = df.columns.byName('MSA');
|
|
39
|
+
setTagsMacromolecule(col);
|
|
40
|
+
grok.shell.addTableView(df);
|
|
41
|
+
|
|
42
|
+
const endTime: number = Date.now();
|
|
43
|
+
const elapsedTime: number = endTime - startTime;
|
|
44
|
+
console.log(`Performance test: ${testName}: ${elapsedTime}ms`);
|
|
45
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as OCL from 'openchemlib/full.js';
|
|
2
2
|
import * as grok from 'datagrok-api/grok';
|
|
3
3
|
|
|
4
|
-
import {RDModule} from '@datagrok-libraries/
|
|
4
|
+
import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
|
|
5
5
|
|
|
6
6
|
export async function getMacroMol(monomers: any[][]): Promise<string[]> {
|
|
7
7
|
let result: string[] = [];
|
|
@@ -6,12 +6,13 @@ import {UnknownSeqPalette, UnknownSeqPalettes} from '@datagrok-libraries/bio/src
|
|
|
6
6
|
import {SplitterFunc, WebLogo} from '@datagrok-libraries/bio/src/viewers/web-logo';
|
|
7
7
|
import {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';
|
|
8
8
|
import * as ui from 'datagrok-api/ui';
|
|
9
|
-
import {printLeftOrCentered} from '@datagrok-libraries/bio/src/utils/cell-renderer';
|
|
9
|
+
import {printLeftOrCentered, DrawStyle} from '@datagrok-libraries/bio/src/utils/cell-renderer';
|
|
10
10
|
|
|
11
11
|
const undefinedColor = 'rgb(100,100,100)';
|
|
12
12
|
const monomerToShortFunction: (amino: string, maxLengthOfMonomer: number) => string = WebLogo.monomerToShort;
|
|
13
13
|
const gapRenderer = 5;
|
|
14
14
|
|
|
15
|
+
|
|
15
16
|
function getPalleteByType(paletteType: string): SeqPalette {
|
|
16
17
|
switch (paletteType) {
|
|
17
18
|
case 'PT':
|
|
@@ -62,7 +63,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
62
63
|
const maxLengthWordsSum = gridCell.cell.column.temp['bio-sum-maxLengthWords'];
|
|
63
64
|
const maxIndex = gridCell.cell.column.temp['bio-maxIndex'];
|
|
64
65
|
//@ts-ignore
|
|
65
|
-
const argsX = e.layerX - gridCell.gridColumn.left
|
|
66
|
+
const argsX = e.layerX - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x);
|
|
66
67
|
let left = 0;
|
|
67
68
|
let right = maxIndex;
|
|
68
69
|
let found = false;
|
|
@@ -88,7 +89,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
88
89
|
const separator = gridCell.cell.column.getTag('separator') ?? '';
|
|
89
90
|
const splitterFunc: SplitterFunc = WebLogo.getSplitter('separator', separator);
|
|
90
91
|
const subParts: string[] = splitterFunc(gridCell.cell.value);
|
|
91
|
-
ui.tooltip.show(ui.div(subParts[left]), e.x + 16, e.y + 16);
|
|
92
|
+
(((subParts[left]?.length ?? 0) > 0)) ? ui.tooltip.show(ui.div(subParts[left]), e.x + 16, e.y + 16) : ui.tooltip.hide();
|
|
92
93
|
}
|
|
93
94
|
|
|
94
95
|
/**
|
|
@@ -110,6 +111,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
110
111
|
const grid = gridCell.gridRow !== -1 ? gridCell.grid : undefined;
|
|
111
112
|
const cell = gridCell.cell;
|
|
112
113
|
const [type, subtype, paletteType] = gridCell.cell.column.getTag(DG.TAGS.UNITS).split(':');
|
|
114
|
+
const minDistanceRenderer = 50;
|
|
113
115
|
w = grid ? Math.min(grid.canvas.width - x, w) : g.canvas.width - x;
|
|
114
116
|
g.save();
|
|
115
117
|
g.beginPath();
|
|
@@ -125,15 +127,16 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
125
127
|
const palette = getPalleteByType(paletteType);
|
|
126
128
|
|
|
127
129
|
const separator = gridCell.cell.column.getTag('separator') ?? '';
|
|
128
|
-
const
|
|
130
|
+
const splitLimit = gridCell.bounds.width / 5;
|
|
131
|
+
const splitterFunc: SplitterFunc = WebLogo.getSplitter(units, separator, gridCell.bounds.width / 5);
|
|
129
132
|
|
|
130
133
|
|
|
131
134
|
const maxLengthOfMonomer = 8;
|
|
132
135
|
|
|
133
136
|
let maxLengthWords: any = {};
|
|
134
|
-
if (gridCell.cell.column.getTag('.calculatedCellRender') !==
|
|
137
|
+
if (gridCell.cell.column.getTag('.calculatedCellRender') !== splitLimit.toString()) {
|
|
135
138
|
let samples = 0;
|
|
136
|
-
while (samples < Math.
|
|
139
|
+
while (samples < Math.min(gridCell.cell.column.length, 100)) {
|
|
137
140
|
let column = gridCell.cell.column.get(samples);
|
|
138
141
|
let subParts: string[] = splitterFunc(column);
|
|
139
142
|
subParts.forEach((amino, index) => {
|
|
@@ -163,7 +166,7 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
163
166
|
'bio-maxIndex': maxLengthWords['bio-maxIndex'],
|
|
164
167
|
'bio-maxLengthWords': maxLengthWords
|
|
165
168
|
};
|
|
166
|
-
gridCell.cell.column.setTag('.calculatedCellRender',
|
|
169
|
+
gridCell.cell.column.setTag('.calculatedCellRender', splitLimit.toString());
|
|
167
170
|
} else {
|
|
168
171
|
maxLengthWords = gridCell.cell.column.temp['bio-maxLengthWords'];
|
|
169
172
|
}
|
|
@@ -171,15 +174,19 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
171
174
|
const subParts: string[] = splitterFunc(cell.value);
|
|
172
175
|
let x1 = x;
|
|
173
176
|
let color = undefinedColor;
|
|
174
|
-
let drawStyle =
|
|
175
|
-
if (gridCell.cell.column.getTag('aligned').includes('MSA')) {
|
|
176
|
-
drawStyle =
|
|
177
|
+
let drawStyle = DrawStyle.classic;
|
|
178
|
+
if (gridCell.cell.column.getTag('aligned').includes('MSA') && gridCell.cell.column.getTag('units') === 'separator') {
|
|
179
|
+
drawStyle = DrawStyle.MSA;
|
|
177
180
|
}
|
|
178
|
-
subParts.
|
|
181
|
+
subParts.every((amino, index) => {
|
|
179
182
|
color = palette.get(amino);
|
|
180
183
|
g.fillStyle = undefinedColor;
|
|
181
184
|
let last = index === subParts.length - 1;
|
|
182
185
|
x1 = printLeftOrCentered(x1, y, w, h, g, monomerToShortFunction(amino, maxLengthOfMonomer), color, 0, true, 1.0, separator, last, drawStyle, maxLengthWords, index, gridCell);
|
|
186
|
+
if (x1 - minDistanceRenderer - gridCell.gridColumn.left + (gridCell.gridColumn.left - gridCell.bounds.x) > gridCell.bounds.width) {
|
|
187
|
+
return false;
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
183
190
|
});
|
|
184
191
|
|
|
185
192
|
g.restore();
|
|
@@ -12,7 +12,9 @@ export interface ISequenceSpaceResult {
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export async function sequenceSpace(spaceParams: ISequenceSpaceParams): Promise<ISequenceSpaceResult> {
|
|
15
|
-
|
|
15
|
+
|
|
16
|
+
// code deprecated since seqCol is encoded
|
|
17
|
+
/* let preparedData: any;
|
|
16
18
|
if (!(spaceParams.seqCol!.tags[DG.TAGS.UNITS] === 'HELM')) {
|
|
17
19
|
const sep = spaceParams.seqCol.getTag('separator');
|
|
18
20
|
const sepFinal = sep ? sep === '.' ? '\\\.' : sep : '-';
|
|
@@ -23,10 +25,10 @@ export async function sequenceSpace(spaceParams: ISequenceSpaceParams): Promise<
|
|
|
23
25
|
preparedData = spaceParams.seqCol.toList().map((v: string) => v.replace(regex, '')) as string[];
|
|
24
26
|
} else {
|
|
25
27
|
preparedData = spaceParams.seqCol.toList();
|
|
26
|
-
}
|
|
28
|
+
} */
|
|
27
29
|
|
|
28
30
|
const sequenceSpaceResult = await reduceDimensinalityWithNormalization(
|
|
29
|
-
|
|
31
|
+
spaceParams.seqCol.toList(),
|
|
30
32
|
spaceParams.methodName,
|
|
31
33
|
spaceParams.similarityMetric as StringMetrics | BitArrayMetrics,
|
|
32
34
|
spaceParams.options);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<html><head><meta charset="utf-8"/><title>Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=
|
|
1
|
+
<html><head><meta charset="utf-8"/><title>Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=eb4783c07294. Commit 0aa1538b.</title><style type="text/css">html,
|
|
2
2
|
body {
|
|
3
3
|
font-family: Arial, Helvetica, sans-serif;
|
|
4
4
|
font-size: 1rem;
|
|
@@ -229,7 +229,7 @@ header {
|
|
|
229
229
|
font-size: 1rem;
|
|
230
230
|
padding: 0 0.5rem;
|
|
231
231
|
}
|
|
232
|
-
</style></head><body><div id="jesthtml-content"><header><h1 id="title">Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=
|
|
232
|
+
</style></head><body><div id="jesthtml-content"><header><h1 id="title">Bio Test Report. Datagrok version datagrok/datagrok:latest SHA=eb4783c07294. Commit 0aa1538b.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-09-02 13:13:34</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed">1 passed</div><div class="summary-failed summary-empty">0 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">1 passed</div><div class="summary-failed summary-empty">0 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">45.182s</div></div><div class="suite-tests"><div class="test-result passed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">passed</div><div class="test-duration">30.315s</div></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.<anonymous> (/home/runner/work/public/public/packages/Bio/src/__jest__/test-node.ts:63:11)
|
|
233
233
|
at Generator.next (<anonymous>)
|
|
234
234
|
at fulfilled (/home/runner/work/public/public/packages/Bio/src/__jest__/test-node.ts:28:58)
|
|
235
235
|
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
|