@datagrok/bio 2.10.22 → 2.10.24
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/dist/package-test.js +1 -1
- package/dist/package-test.js.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/files/samples/HELM-non-linear.csv +8 -0
- package/package.json +2 -2
- package/src/demo/bio03-atomic-level.ts +1 -1
- package/src/package.ts +13 -21
- package/src/tests/WebLogo-positions-test.ts +13 -13
- package/src/tests/detectors-benchmark-tests.ts +2 -2
- package/src/tests/detectors-tests.ts +4 -1
- package/src/tests/to-atomic-level-tests.ts +1 -1
- package/src/utils/cell-renderer.ts +7 -1
- package/src/utils/err-info.ts +28 -0
- package/src/utils/helm-to-molfile.ts +904 -0
- package/src/utils/sequence-to-mol.ts +37 -0
- package/src/viewers/vd-regions-viewer.ts +56 -31
- package/src/viewers/web-logo-viewer.ts +108 -102
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
HELM
|
|
2
|
+
"PEPTIDE1{[meI].[hHis].[Aca].N.T.[dE].[Thr_PO3H2].[Aca].[D-Tyr_Et].[Tyr_ab-dehydroMe].[dV].E.N.[D-Orn].[D-aThr].[Phe_4Me]}$PEPTIDE1,PEPTIDE1,16:R2-1:R1$$$V2.0"
|
|
3
|
+
PEPTIDE1{meI.hHis.Aca.Cys_SEt.T.dK.Thr_PO3H2.Aca.Tyr_PO3H2.D-Chg.dV.Phe_ab-dehydro.N.D-Orn.D-aThr.Phe_4Me}$$$$
|
|
4
|
+
"PEPTIDE1{C.A.C.A.C.A.C.A}|PEPTIDE2{C.A.C.A.C.A.C.A}|PEPTIDE3{C.A.C.A.C.A.C.A}|PEPTIDE4{C.A.C.A.C.A.C.A}$PEPTIDE1,PEPTIDE2,3:R3-8:R2|PEPTIDE3,PEPTIDE4,3:R3-8:R2|PEPTIDE1,PEPTIDE3,5:R3-5:R3$$$V2.0"
|
|
5
|
+
"PEPTIDE1{C.A.C.A.C.A.C.A.C.A.C.A}|PEPTIDE2{C.A.C.A.C.A.C.A.C.A.C.A}$PEPTIDE2,PEPTIDE1,1:R1-3:R3|PEPTIDE2,PEPTIDE2,1:R3-12:R2$$$V2.0"
|
|
6
|
+
RNA1{d(A)p.d(G)p.d(C)p.d(T)p.d(A)p.d(G)p.d(C)p.d(T)p}$$$$V2.0
|
|
7
|
+
RNA1{d(A)p.d(G)p.d(C)p.d(T)p.d(A)p.d(G)p.d(C)p.d(T)p}|RNA2{d(G)p.d(G)p.d(G)p.d(G)p.d(A)p.d(G)p.d(C)p.d(T)p}$$$$V2.0
|
|
8
|
+
"RNA1{d(A)p.d(G)p.d(C)p.d(T)p.d(A)p.d(G)p.d(C)p.d(T)p}$RNA1,RNA1,24:R2-1:R1$$$V2.0"
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"name": "Leonid Stolbov",
|
|
6
6
|
"email": "lstolbov@datagrok.ai"
|
|
7
7
|
},
|
|
8
|
-
"version": "2.10.
|
|
8
|
+
"version": "2.10.24",
|
|
9
9
|
"description": "Bioinformatics support (import/export of sequences, conversion, visualization, analysis). [See more](https://github.com/datagrok-ai/public/blob/master/packages/Bio/README.md) for details.",
|
|
10
10
|
"repository": {
|
|
11
11
|
"type": "git",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
],
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@biowasm/aioli": "^3.1.0",
|
|
37
|
-
"@datagrok-libraries/bio": "^5.38.
|
|
37
|
+
"@datagrok-libraries/bio": "^5.38.12",
|
|
38
38
|
"@datagrok-libraries/chem-meta": "^1.0.1",
|
|
39
39
|
"@datagrok-libraries/ml": "^6.3.49",
|
|
40
40
|
"@datagrok-libraries/tutorials": "^1.3.6",
|
|
@@ -35,7 +35,7 @@ export async function demoBio03UI(): Promise<void> {
|
|
|
35
35
|
})
|
|
36
36
|
.step('To atomic level', async () => {
|
|
37
37
|
const seqCol = df.getCol(seqColName);
|
|
38
|
-
await toAtomicLevel(df, seqCol);
|
|
38
|
+
await toAtomicLevel(df, seqCol, false);
|
|
39
39
|
}, {
|
|
40
40
|
description: 'Get atomic level structures of Macromolecules.',
|
|
41
41
|
delay: 2000,
|
package/src/package.ts
CHANGED
|
@@ -60,7 +60,7 @@ import {SplitToMonomersFunctionEditor} from './function-edtiors/split-to-monomer
|
|
|
60
60
|
import {splitToMonomersUI} from './utils/split-to-monomers';
|
|
61
61
|
import {MonomerCellRenderer} from './utils/monomer-cell-renderer';
|
|
62
62
|
import {BioPackage, BioPackageProperties} from './package-types';
|
|
63
|
-
import {
|
|
63
|
+
import {RDMol} from '@datagrok-libraries/chem-meta/src/rdkit-api';
|
|
64
64
|
import {PackageSettingsEditorWidget} from './widgets/package-settings-editor-widget';
|
|
65
65
|
import {getCompositionAnalysisWidget} from './widgets/composition-analysis-widget';
|
|
66
66
|
import {MacromoleculeColumnWidget} from './utils/macromolecule-column-widget';
|
|
@@ -69,9 +69,11 @@ import {_getEnumeratorWidget, _setPeptideColumn} from './utils/enumerator-tools'
|
|
|
69
69
|
import {getRegionDo} from './utils/get-region';
|
|
70
70
|
import {GetRegionApp} from './apps/get-region-app';
|
|
71
71
|
import {GetRegionFuncEditor} from './utils/get-region-func-editor';
|
|
72
|
+
import {HelmToMolfileConverter} from './utils/helm-to-molfile';
|
|
72
73
|
import {DIMENSIONALITY_REDUCER_TERMINATE_EVENT}
|
|
73
74
|
from '@datagrok-libraries/ml/src/workers/dimensionality-reducing-worker-creator';
|
|
74
75
|
import {Options} from '@datagrok-libraries/utils/src/type-declarations';
|
|
76
|
+
import { sequenceToMolfile } from './utils/sequence-to-mol';
|
|
75
77
|
|
|
76
78
|
export const _package = new BioPackage();
|
|
77
79
|
|
|
@@ -385,7 +387,7 @@ export async function getRegionTopMenu(
|
|
|
385
387
|
//input: object options {optional: true}
|
|
386
388
|
//output: viewer result
|
|
387
389
|
//editor: Bio:SeqActivityCliffsEditor
|
|
388
|
-
export async function activityCliffs(df: DG.DataFrame, macroMolecule: DG.Column
|
|
390
|
+
export async function activityCliffs(df: DG.DataFrame, macroMolecule: DG.Column<string>, activities: DG.Column,
|
|
389
391
|
similarity: number, methodName: DimReductionMethods, options?: (IUMAPOptions | ITSNEOptions) & Options,
|
|
390
392
|
): Promise<DG.Viewer | undefined> {
|
|
391
393
|
if (!checkInputColumnUI(macroMolecule, 'Activity Cliffs'))
|
|
@@ -495,8 +497,8 @@ export async function sequenceSpaceTopMenu(
|
|
|
495
497
|
embedYCol = table.columns.byName(embedColsNames[1]);
|
|
496
498
|
}
|
|
497
499
|
|
|
498
|
-
embedXCol.init((i) => embeddings[i][0]);
|
|
499
|
-
embedYCol.init((i) => embeddings[i][1]);
|
|
500
|
+
embedXCol.init((i) => embeddings[i] ? embeddings[i][0] : undefined);
|
|
501
|
+
embedYCol.init((i) => embeddings[i] ? embeddings[i][1] : undefined);
|
|
500
502
|
const progress = (_nEpoch / epochsLength * 100);
|
|
501
503
|
pg.update(progress, `Running sequence space ... ${progress.toFixed(0)}%`);
|
|
502
504
|
}
|
|
@@ -613,29 +615,18 @@ export async function sequenceSpaceTopMenu(
|
|
|
613
615
|
sp = (v as DG.TableView).scatterPlot({x: embedColsNames[0], y: embedColsNames[1], title: 'Sequence space'});
|
|
614
616
|
}
|
|
615
617
|
} */
|
|
616
|
-
}
|
|
618
|
+
}
|
|
617
619
|
|
|
618
620
|
//top-menu: Bio | Convert | To Atomic Level...
|
|
619
621
|
//name: To Atomic Level
|
|
620
622
|
//description: Converts sequences to molblocks
|
|
621
623
|
//input: dataframe df [Input data table]
|
|
622
624
|
//input: column macroMolecule {semType: Macromolecule}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
if (!checkInputColumnUI(macroMolecule, 'To Atomic Level'))
|
|
629
|
-
return;
|
|
630
|
-
const monomerLib: IMonomerLib = (await getMonomerLibHelper()).getBioLib();
|
|
631
|
-
const atomicLevelRes = await _toAtomicLevel(df, macroMolecule, monomerLib);
|
|
632
|
-
if (atomicLevelRes.col !== null) {
|
|
633
|
-
df.columns.add(atomicLevelRes.col, true);
|
|
634
|
-
await grok.data.detectSemanticTypes(df);
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
if (atomicLevelRes.warnings && atomicLevelRes.warnings.length > 0)
|
|
638
|
-
grok.shell.warning(ui.list(atomicLevelRes.warnings));
|
|
625
|
+
//input: bool nonlinear=false { description: Slower mode for cycling/branching HELM structures }
|
|
626
|
+
export async function toAtomicLevel(df: DG.DataFrame, macroMolecule: DG.Column, nonlinear: boolean): Promise<void> {
|
|
627
|
+
const pi = DG.TaskBarProgressIndicator.create('Converting to atomic level ...');
|
|
628
|
+
sequenceToMolfile(df, macroMolecule, nonlinear);
|
|
629
|
+
pi.close();
|
|
639
630
|
}
|
|
640
631
|
|
|
641
632
|
//top-menu: Bio | Analyze | MSA...
|
|
@@ -1059,6 +1050,7 @@ export function getEnumeratorWidget(molColumn: DG.Column): DG.Widget {
|
|
|
1059
1050
|
return _getEnumeratorWidget(molColumn);
|
|
1060
1051
|
}
|
|
1061
1052
|
|
|
1053
|
+
|
|
1062
1054
|
//top-menu: Bio | Convert | SDF to JSON Library...
|
|
1063
1055
|
//name: SDF to JSON Library
|
|
1064
1056
|
//input: dataframe table
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as grok from 'datagrok-api/grok';
|
|
2
2
|
import * as DG from 'datagrok-api/dg';
|
|
3
3
|
|
|
4
|
-
import {category, expect, expectArray, test,
|
|
4
|
+
import {category, expect, expectArray, test, testEvent} from '@datagrok-libraries/utils/src/test';
|
|
5
5
|
import {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
|
|
6
6
|
import {
|
|
7
7
|
countForMonomerAtPosition,
|
|
@@ -30,9 +30,9 @@ ATC-G-TTGC--
|
|
|
30
30
|
seqCol.setTag(bioTAGS.aligned, 'SEQ.MSA');
|
|
31
31
|
|
|
32
32
|
const wlViewer: WebLogoViewer = (await df.plot.fromType('WebLogo')) as WebLogoViewer;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
await testEvent(wlViewer.onLayoutCalculated, () => {}, () => {
|
|
34
|
+
tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);
|
|
35
|
+
}, 200);
|
|
36
36
|
const positions: PI[] = wlViewer['positions'];
|
|
37
37
|
|
|
38
38
|
const resAllDf1: PI[] = [
|
|
@@ -82,9 +82,9 @@ ATC-G-TTGC--
|
|
|
82
82
|
df.filter.fireChanged();
|
|
83
83
|
const wlViewer: WebLogoViewer = (await df.plot.fromType('WebLogo',
|
|
84
84
|
{'shrinkEmptyTail': true})) as WebLogoViewer;
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
await testEvent(wlViewer.onLayoutCalculated, () => {}, () => {
|
|
86
|
+
tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);
|
|
87
|
+
}, 200);
|
|
88
88
|
const positions: PI[] = wlViewer['positions'];
|
|
89
89
|
|
|
90
90
|
const resAllDf1: PI[] = [
|
|
@@ -120,9 +120,9 @@ ATC-G-TTGC--
|
|
|
120
120
|
|
|
121
121
|
const wlViewer: WebLogoViewer = (await df.plot.fromType('WebLogo',
|
|
122
122
|
{'skipEmptyPositions': true})) as WebLogoViewer;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
123
|
+
await testEvent(wlViewer.onLayoutCalculated, () => {}, () => {
|
|
124
|
+
tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);
|
|
125
|
+
}, 200);
|
|
126
126
|
const resPosList: PI[] = wlViewer['positions'];
|
|
127
127
|
|
|
128
128
|
const tgtPosList: PI[] = [
|
|
@@ -156,9 +156,9 @@ ATC-G-TTGC--
|
|
|
156
156
|
endPositionName: '7',
|
|
157
157
|
skipEmptyPositions: true,
|
|
158
158
|
})) as WebLogoViewer;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
159
|
+
await testEvent(wlViewer.onLayoutCalculated, () => {}, () => {
|
|
160
|
+
tv.dockManager.dock(wlViewer.root, DG.DOCK_TYPE.DOWN);
|
|
161
|
+
}, 200);
|
|
162
162
|
const resPosList: PI[] = wlViewer['positions'];
|
|
163
163
|
const tgtPosList: PI[] = [
|
|
164
164
|
new PI(2, '3', {'C': new PMI(5)}),
|
|
@@ -29,7 +29,7 @@ category('detectorsBenchmark', () => {
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
test('fastaDnaLong1e6Few50', async () => {
|
|
32
|
-
await detectMacromoleculeBenchmark(
|
|
32
|
+
await detectMacromoleculeBenchmark(20, NOTATION.FASTA, ALPHABET.DNA, 1E6, 50);
|
|
33
33
|
});
|
|
34
34
|
|
|
35
35
|
// -- separator --
|
|
@@ -49,7 +49,7 @@ category('detectorsBenchmark', () => {
|
|
|
49
49
|
async function detectMacromoleculeBenchmark(
|
|
50
50
|
maxET: number, notation: NOTATION, alphabet: ALPHABET, length: number, count: number, separator?: string,
|
|
51
51
|
): Promise<number> {
|
|
52
|
-
return await benchmark<DG.FuncCall, DG.Column>(
|
|
52
|
+
return await benchmark<DG.FuncCall, DG.Column>(maxET,
|
|
53
53
|
(): DG.FuncCall => {
|
|
54
54
|
const col: DG.Column = generate(notation, [...getAlphabet(alphabet)], length, count, separator);
|
|
55
55
|
const funcCall: DG.FuncCall = detectFunc.prepare({col: col});
|
|
@@ -182,7 +182,10 @@ MWRSWY-CKHP`;
|
|
|
182
182
|
const df: DG.DataFrame = await readFile(samples[key]);
|
|
183
183
|
// await grok.data.detectSemanticTypes(df);
|
|
184
184
|
return df;
|
|
185
|
-
})()
|
|
185
|
+
})().catch((err: any) => {
|
|
186
|
+
delete _samplesDfs[key];
|
|
187
|
+
throw err;
|
|
188
|
+
});
|
|
186
189
|
}
|
|
187
190
|
return _samplesDfs[key];
|
|
188
191
|
};
|
|
@@ -64,7 +64,7 @@ category('toAtomicLevel', async () => {
|
|
|
64
64
|
|
|
65
65
|
async function getTestResult(source: DG.DataFrame, target: DG.DataFrame): Promise<void> {
|
|
66
66
|
const inputCol = source.getCol(inputColName);
|
|
67
|
-
await toAtomicLevel(source, inputCol);
|
|
67
|
+
await toAtomicLevel(source, inputCol, false);
|
|
68
68
|
const obtainedCol = source.getCol(outputColName);
|
|
69
69
|
const expectedCol = target.getCol(outputColName);
|
|
70
70
|
const obtainedArray = [...obtainedCol.values()];
|
|
@@ -27,6 +27,7 @@ import * as C from './constants';
|
|
|
27
27
|
import {_package, getBioLib} from '../package';
|
|
28
28
|
import {ISeqSplitted} from '@datagrok-libraries/bio/src/utils/macromolecule/types';
|
|
29
29
|
import {getSplitter} from '@datagrok-libraries/bio/src/utils/macromolecule/utils';
|
|
30
|
+
import {errInfo} from './err-info';
|
|
30
31
|
|
|
31
32
|
|
|
32
33
|
type TempType = { [tagName: string]: any };
|
|
@@ -136,7 +137,12 @@ export class MacromoleculeSequenceCellRenderer extends DG.GridCellRenderer {
|
|
|
136
137
|
|
|
137
138
|
// TODO: Store temp data to GridColumn
|
|
138
139
|
// Now the renderer requires data frame table Column underlying GridColumn
|
|
139
|
-
|
|
140
|
+
let grid: DG.Grid | undefined = undefined;
|
|
141
|
+
try { grid = gridCell.grid; } catch (err: any) {
|
|
142
|
+
grid = undefined;
|
|
143
|
+
const [errMsg, errStack] = errInfo(err);
|
|
144
|
+
_package.logger.error(errMsg, undefined, errStack);
|
|
145
|
+
}
|
|
140
146
|
const tableCol: DG.Column = gridCell.cell.column;
|
|
141
147
|
if (!grid || !tableCol) return;
|
|
142
148
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as grok from 'datagrok-api/grok';
|
|
2
|
+
import * as ui from 'datagrok-api/ui';
|
|
3
|
+
import * as DG from 'datagrok-api/dg';
|
|
4
|
+
|
|
5
|
+
export function errMsg(err: any): string {
|
|
6
|
+
if (typeof err === 'string' || err instanceof String)
|
|
7
|
+
return err as string;
|
|
8
|
+
else if (err.constructor.name === 'StateError')
|
|
9
|
+
return err['message'];
|
|
10
|
+
else if (err.constructor.name === 'StateError' && '$thrownJsError' in err)
|
|
11
|
+
return errMsg(err['$thrownJsError']);
|
|
12
|
+
else if (err instanceof Error)
|
|
13
|
+
return (err as Error).message;
|
|
14
|
+
else
|
|
15
|
+
return err.toString();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function errStack(err: any): string | undefined {
|
|
19
|
+
if (err instanceof Error)
|
|
20
|
+
return err.stack;
|
|
21
|
+
else if (err.constructor.name === 'StateError' && '$thrownJsError' in err)
|
|
22
|
+
return errStack(err['$thrownJsError']);
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function errInfo(err: any): [string, string | undefined] {
|
|
27
|
+
return [errMsg(err), errStack(err)];
|
|
28
|
+
}
|