@datagrok/sequence-translator 1.4.2 → 1.4.3

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,106 @@
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
+ import {Unsubscribable} from 'rxjs';
6
+
7
+ import {SeqHandler} from '@datagrok-libraries/bio/src/utils/seq-handler';
8
+ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
9
+ import {getUnusedColName} from '@datagrok-libraries/bio/src/monomer-works/utils';
10
+
11
+ import {defaultErrorHandler} from '../utils/err-info';
12
+ import {doPolyToolUnrule} from './pt-unrule';
13
+ import {getRules, RuleInputs, RULES_PATH, RULES_STORAGE_NAME} from './pt-rules';
14
+ import {PT_ERROR_DATAFRAME, PT_UI_DIALOG_UNRULE, PT_UI_RULES_USED} from './const';
15
+
16
+ type PolyToolUnruleSerialized = {
17
+ rules: string[];
18
+ };
19
+
20
+ export async function getPolyToolUnruleDialog(srcCol?: DG.Column<string>): Promise<DG.Dialog> {
21
+ const subs: Unsubscribable[] = [];
22
+ const destroy = () => {
23
+ for (const sub of subs) sub.unsubscribe();
24
+ };
25
+ try {
26
+ let srcColVal: DG.Column<string> | undefined = srcCol;
27
+ if (!srcColVal) {
28
+ const srcColList = grok.shell.t.columns.bySemTypeAll(DG.SEMTYPE.MACROMOLECULE);
29
+ if (!srcColList)
30
+ throw new Error(PT_ERROR_DATAFRAME);
31
+ srcColVal = srcColList[0];
32
+ }
33
+ const srcColInput = ui.input.column('Column', {
34
+ table: srcColVal.dataFrame, value: srcColVal,
35
+ filter: (col: DG.Column) => {
36
+ if (col.semType !== DG.SEMTYPE.MACROMOLECULE) return false;
37
+ const sh = SeqHandler.forColumn(col);
38
+ return sh.notation === NOTATION.HELM;
39
+ }
40
+ });
41
+ let ruleFileList: string[];
42
+ const ruleInputs = new RuleInputs(RULES_PATH, RULES_STORAGE_NAME, '.json', {
43
+ onValueChanged: (value: string[]) => { ruleFileList = value;}
44
+ });
45
+ const rulesHeader = ui.inlineText([PT_UI_RULES_USED]);
46
+ const rulesForm = await ruleInputs.getForm();
47
+
48
+ const div = ui.divV([
49
+ srcColInput,
50
+ rulesHeader,
51
+ rulesForm
52
+ ]);
53
+
54
+ const exec = async (): Promise<void> => {
55
+ try {
56
+ const ruleFileList = await ruleInputs.getActive();
57
+ await polyToolUnrule(srcColInput.value!, ruleFileList);
58
+ } catch (err: any) {
59
+ defaultErrorHandler(err);
60
+ }
61
+ };
62
+
63
+ const dialog = ui.dialog(PT_UI_DIALOG_UNRULE)
64
+ .add(div)
65
+ .onOK(() => { exec(); });
66
+ subs.push(dialog.onClose.subscribe(() => {
67
+ destroy();
68
+ }));
69
+ dialog.history(
70
+ /* getInput */ (): PolyToolUnruleSerialized => {
71
+ return {
72
+ rules: ruleFileList,
73
+ };
74
+ },
75
+ /* applyInput */ (x: PolyToolUnruleSerialized): void => {
76
+ ruleInputs.setActive(ruleFileList);
77
+ });
78
+ return dialog;
79
+ } catch (err: any) {
80
+ destroy(); // on failing to build a dialog
81
+ throw err;
82
+ }
83
+ }
84
+
85
+ export async function polyToolUnrule(
86
+ srcCol: DG.Column<string>, ruleFiles: string[]
87
+ ): Promise<DG.Column> {
88
+ const pi = DG.TaskBarProgressIndicator.create('PolyTool unrule...');
89
+ try {
90
+ const table = srcCol.dataFrame;
91
+ const rules = await getRules(ruleFiles);
92
+ const resHelmList = doPolyToolUnrule(srcCol.toList(), rules);
93
+ const resHelmColName = `harmonized(srcCol.name)`;
94
+ const resHelmCol = DG.Column.fromList(DG.COLUMN_TYPE.STRING, resHelmColName, resHelmList,);
95
+ resHelmCol.semType = DG.SEMTYPE.MACROMOLECULE;
96
+ resHelmCol.meta.units = NOTATION.CUSTOM;
97
+ if (table) {
98
+ resHelmCol.name = getUnusedColName(table, resHelmColName);
99
+ table.columns.add(resHelmCol, true);
100
+ await grok.data.detectSemanticTypes(table);
101
+ }
102
+ return resHelmCol;
103
+ } finally {
104
+ pi.close();
105
+ }
106
+ }
@@ -0,0 +1,37 @@
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
+ import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
6
+
7
+ import {Chain} from './pt-conversion';
8
+ import {getPolyToolUnruleDialog} from './pt-unrule-dialog';
9
+ import {Rules} from './pt-rules';
10
+
11
+ import {_package} from '../package';
12
+
13
+ export async function polyToolUnruleUI(): Promise<void> {
14
+ let dialog: DG.Dialog;
15
+ try {
16
+ dialog = await getPolyToolUnruleDialog();
17
+ dialog.show();
18
+ } catch (err: any) {
19
+ const [errMsg, errStack] = errInfo(err);
20
+ grok.shell.warning('To run PolyTool Unrule, open a dataframe with Helm');
21
+ _package.logger.error(errMsg, undefined, errStack);
22
+ }
23
+ }
24
+
25
+ /** Returns list of harmonized sequences. Covered with tests. */
26
+ export function doPolyToolUnrule(helms: string[], rules: Rules): string[] {
27
+ const resHrzSeqList = new Array<string>(helms.length);
28
+ for (let i = 0; i < helms.length; ++i) {
29
+ if (!helms[i])
30
+ resHrzSeqList[i] = '';
31
+ else {
32
+ const chain = Chain.fromHelm(helms[i]);
33
+ resHrzSeqList[i] = chain.getNotation(rules);
34
+ }
35
+ }
36
+ return resHrzSeqList;
37
+ }
@@ -6,7 +6,7 @@ import {before, after, category, expect, test, expectArray, testEvent, delay} fr
6
6
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
7
7
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
8
8
  import {
9
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
9
+ getUserLibSettings, setUserLibSettings
10
10
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
11
11
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
12
12
 
@@ -23,9 +23,8 @@ category('PolyTool: Convert', () => {
23
23
  before(async () => {
24
24
  monomerLibHelper = await getMonomerLibHelper();
25
25
  userLibSettings = await getUserLibSettings();
26
- // Clear settings to test default
27
- await setUserLibSettingsForTests();
28
- await monomerLibHelper.loadMonomerLib(true);
26
+
27
+ await monomerLibHelper.loadMonomerLibForTests();
29
28
  });
30
29
 
31
30
  after(async () => {
@@ -43,11 +42,11 @@ category('PolyTool: Convert', () => {
43
42
  'R-F-D(2)-T-G-H-F-Y-P-NH2(2)',
44
43
  ],
45
44
  tgt: [
46
- 'PEPTIDE1{[R].[F].[C].[T].[G].[H].[F].[Y].[P].[C].[meI]}$PEPTIDE1,PEPTIDE1,3:R3-10:R3$$$',
47
- 'PEPTIDE1{[C].[T].[G].[H].[F].[Y].[P].[C].[meI]}$PEPTIDE1,PEPTIDE1,1:R3-8:R3$$$',
48
- 'PEPTIDE1{[R].[F].[C].[T].[G].[H].[F].[Y].[P].[C]}$PEPTIDE1,PEPTIDE1,3:R3-10:R3$$$',
49
- 'PEPTIDE1{[C].[T].[G].[H].[F].[H].[P].[C]}$PEPTIDE1,PEPTIDE1,1:R3-8:R3$$$',
50
- 'PEPTIDE1{[R].[F].[D].[T].[G].[H].[F].[Y].[P].[NH2]}$PEPTIDE1,PEPTIDE1,10:R2-3:R3$$$',
45
+ 'PEPTIDE1{R.F.C.T.G.H.F.Y.P.C.[meI]}$PEPTIDE1,PEPTIDE1,3:R3-10:R3$$$',
46
+ 'PEPTIDE1{C.T.G.H.F.Y.P.C.[meI]}$PEPTIDE1,PEPTIDE1,1:R3-8:R3$$$',
47
+ 'PEPTIDE1{R.F.C.T.G.H.F.Y.P.C}$PEPTIDE1,PEPTIDE1,3:R3-10:R3$$$',
48
+ 'PEPTIDE1{C.T.G.H.F.H.P.C}$PEPTIDE1,PEPTIDE1,1:R3-8:R3$$$',
49
+ 'PEPTIDE1{R.F.D.T.G.H.F.Y.P.[NH2]}$PEPTIDE1,PEPTIDE1,10:R2-3:R3$$$',
51
50
  ]
52
51
  }
53
52
  };
@@ -7,7 +7,7 @@ import {getHelmHelper, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-
7
7
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
8
8
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
9
9
  import {
10
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
10
+ getUserLibSettings, setUserLibSettings
11
11
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
12
12
 
13
13
  import {PolyToolEnumeratorParams, PolyToolEnumeratorTypes} from '../polytool/types';
@@ -25,10 +25,8 @@ category('PolyTool: Enumerate', () => {
25
25
 
26
26
  monomerLibHelper = await getMonomerLibHelper();
27
27
  userLibSettings = await getUserLibSettings();
28
- // Clear settings to test default
29
- await setUserLibSettingsForTests();
30
- await monomerLibHelper.awaitLoaded();
31
- await monomerLibHelper.loadMonomerLib(true);
28
+
29
+ await monomerLibHelper.loadMonomerLibForTests();
32
30
  });
33
31
 
34
32
  after(async () => {
@@ -7,7 +7,7 @@ import {getHelmHelper, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-
7
7
  import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
8
8
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
9
9
  import {
10
- getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
10
+ getUserLibSettings, setUserLibSettings
11
11
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
12
12
 
13
13
  import {PolyToolEnumeratorParams, PolyToolEnumeratorTypes} from '../polytool/types';
@@ -26,9 +26,7 @@ category('PolyTool: Enumerate', () => {
26
26
  monomerLibHelper = await getMonomerLibHelper();
27
27
  userLibSettings = await getUserLibSettings();
28
28
  // Clear settings to test default
29
- await setUserLibSettingsForTests();
30
- await monomerLibHelper.awaitLoaded();
31
- await monomerLibHelper.loadMonomerLib(true);
29
+ await monomerLibHelper.loadMonomerLibForTests();
32
30
  });
33
31
 
34
32
  after(async () => {
@@ -0,0 +1,10 @@
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
+ import {before, after, category, expect, test, expectArray, testEvent, delay} from '@datagrok-libraries/utils/src/test';
6
+
7
+ import {doPolyToolUnrule} from '../polytool/pt-unrule';
8
+ import {getRules} from '../polytool/pt-rules';
9
+
10
+ import {_package} from '../package-test';
@@ -0,0 +1,72 @@
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
+ import {before, after, category, expect, test, expectArray, testEvent, delay} from '@datagrok-libraries/utils/src/test';
6
+ import {Monomer, MonomerLibData} from '@datagrok-libraries/bio/src/types/index';
7
+
8
+ import {PolymerTypes} from '@datagrok-libraries/bio/src/helm/consts';
9
+ import {getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
10
+ import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
11
+ import {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
12
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
13
+ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
14
+ import {getRdKitModule} from '@datagrok-libraries/bio/src/chem/rdkit-module';
15
+ import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
16
+
17
+ import {_package} from '../package-test';
18
+
19
+ category('toAtomicLevel', () => {
20
+ let userLibSettings: UserLibSettings;
21
+ let monomerLibHelper: IMonomerLibHelper;
22
+ let rdKitModule: RDModule;
23
+
24
+ before(async () => {
25
+
26
+ monomerLibHelper = await getMonomerLibHelper();
27
+ userLibSettings = await getUserLibSettings();
28
+ rdKitModule = await getRdKitModule();
29
+
30
+ await monomerLibHelper.loadMonomerLibForTests();
31
+ });
32
+
33
+ after(async () => {
34
+ await setUserLibSettings(userLibSettings);
35
+ await monomerLibHelper.loadMonomerLib(true); // load user settings libraries
36
+ });
37
+
38
+ test('override', async () => {
39
+ const systemMonomerLib = monomerLibHelper.getMonomerLib();
40
+ const rLibStr = await _package.files.readAsText('tests/polytool-reaction-lib.json');
41
+ const rLib: Monomer[] = JSON.parse(rLibStr);
42
+ const ggazM = rLib.find((m) => m.symbol === 'GGaz')!;
43
+ expect(ggazM != null, true, `Monomer 'GGaz' not found.`);
44
+
45
+ const overrideMonomerLibData: MonomerLibData = {[PolymerTypes.PEPTIDE]: {'GGaz': ggazM}};
46
+ const overriddenMonomerLib = systemMonomerLib.override(overrideMonomerLibData);
47
+
48
+ const seqHelper = await getSeqHelper();
49
+
50
+ const helmCol = DG.Column.fromList(DG.COLUMN_TYPE.STRING, 'helm',
51
+ ['PEPTIDE1{F.P.Y.[GGaz].H.A.A.G.G.A.C}|PEPTIDE2{A.A.A}$PEPTIDE1,PEPTIDE2,4:R4-1:R1|PEPTIDE1,PEPTIDE1,11:R2-4:R3$$$V2.0']);
52
+ helmCol.semType = DG.SEMTYPE.MACROMOLECULE;
53
+ helmCol.meta.units = NOTATION.HELM;
54
+ const talRes = await seqHelper.helmToAtomicLevel(helmCol, false, false, overriddenMonomerLib);
55
+
56
+ expect(talRes.molCol != null, true, 'Result molCol is null');
57
+ const molfile = talRes.molCol!.get(0)!;
58
+ expect(!!molfile, true, 'Molfile is empty');
59
+
60
+ const mol = rdKitModule.get_mol(molfile);
61
+ try {
62
+ const molInchi = mol.get_inchi();
63
+ const molInchiKey = rdKitModule.get_inchikey_for_inchi(molInchi);
64
+
65
+ expect(mol.get_num_bonds(), 103);
66
+ expect(mol.get_num_atoms(), 98);
67
+ expect(molInchiKey, 'XPQUTLNSNIMERR-WKBTUBAPSA-N');
68
+ } finally {
69
+ mol.delete();
70
+ }
71
+ });
72
+ });