@datagrok/sequence-translator 1.3.14 → 1.4.0

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.
Files changed (31) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/dist/package-test.js +1 -1
  3. package/dist/package-test.js.map +1 -1
  4. package/dist/package.js +1 -1
  5. package/dist/package.js.map +1 -1
  6. package/files/polytool-rules/rules_example.json +34 -34
  7. package/files/samples/cyclized.csv +6 -0
  8. package/package.json +9 -10
  9. package/src/apps/common/view/components/colored-input/colored-text-input.ts +2 -2
  10. package/src/apps/pattern/view/components/bulk-convert/column-input.ts +2 -2
  11. package/src/apps/pattern/view/components/bulk-convert/table-input.ts +8 -6
  12. package/src/apps/pattern/view/components/edit-block-controls.ts +5 -5
  13. package/src/apps/pattern/view/components/load-block-controls.ts +7 -3
  14. package/src/apps/pattern/view/components/numeric-label-visibility-controls.ts +1 -1
  15. package/src/apps/pattern/view/components/strand-editor/header-controls.ts +2 -2
  16. package/src/apps/pattern/view/components/strand-editor/strand-controls.ts +2 -2
  17. package/src/apps/pattern/view/components/terminal-modification-editor.ts +1 -1
  18. package/src/apps/structure/view/ui.ts +5 -5
  19. package/src/apps/translator/view/ui.ts +27 -18
  20. package/src/package-test.ts +1 -0
  21. package/src/package.ts +34 -12
  22. package/src/polytool/pt-conversion.ts +2 -33
  23. package/src/polytool/pt-convert-editor.ts +116 -0
  24. package/src/polytool/pt-dialog.ts +177 -97
  25. package/src/polytool/pt-enumeration-helm-dialog.ts +338 -282
  26. package/src/polytool/pt-enumeration-helm.ts +6 -2
  27. package/src/polytool/pt-placeholders-input.ts +1 -2
  28. package/src/polytool/utils.ts +0 -7
  29. package/src/tests/polytool-convert-tests.ts +99 -0
  30. package/src/tests/polytool-enumerate-tests.ts +21 -5
  31. package/src/utils/context-menu.ts +7 -10
@@ -12,7 +12,8 @@ import {Chain} from './pt-conversion';
12
12
  import {getAvailableMonomers} from './utils';
13
13
  import {PolyToolEnumeratorParams, PolyToolEnumeratorTypes, PolyToolPlaceholders} from './types';
14
14
 
15
- export const PT_HELM_EXAMPLE = 'PEPTIDE1{[R].[F].[T].[G].[H].[F].[G].[A].[A].[Y].[P].[E].[NH2]}$$$$';
15
+ // For example keep monomers presented in HELMCoreLibrary.json only (not [NH2])
16
+ export const PT_HELM_EXAMPLE = 'PEPTIDE1{R.[Aca].T.G.H.F.G.A.A.Y.P.E.[meI]}$$$$';
16
17
 
17
18
  /** Initialized by getHelmHelper via init Helm package */
18
19
  declare const JSDraw2: JSDraw2ModuleType;
@@ -55,7 +56,10 @@ function getPtEnumeratorMatrix(m: HelmMol, placeholders: PolyToolPlaceholders):
55
56
  return resMolList;
56
57
  }
57
58
 
58
- export function getPtEnumeratorHelm(helm: string, id: string, params: PolyToolEnumeratorParams): [string, string][] {
59
+ /** Returns list of Helm with id. Covered with tests. */
60
+ export function doPolyToolEnumerateHelm(
61
+ helm: string, id: string, params: PolyToolEnumeratorParams
62
+ ): [ /* helm */ string, /* id */ string][] {
59
63
  const molHandler = new JSDraw2.MolHandler<HelmType>();
60
64
  const plugin = new org.helm.webeditor.Plugin(molHandler);
61
65
  org.helm.webeditor.IO.parseHelm(plugin, helm, new JSDraw2.Point(0, 0), undefined);
@@ -121,8 +121,7 @@ export function dfToPlaceholders(df: DG.DataFrame): PolyToolPlaceholders {
121
121
  const pos = parseInt(df.get('Position', rowI));
122
122
  if (!isNaN(pos)) {
123
123
  const monomerSymbolList = parseMonomerSymbolList(df.get('Monomers', rowI));
124
- if (monomerSymbolList.length > 0)
125
- res[pos - 1] = monomerSymbolList;
124
+ res[pos - 1] = monomerSymbolList;
126
125
  }
127
126
  }
128
127
  return res;
@@ -27,13 +27,6 @@ function addCommonTags(col: DG.Column<any>) {
27
27
  col.setTag('alphabet', ALPHABET.PT);
28
28
  }
29
29
 
30
- export function handleError(err: any): void {
31
- const errMsg: string = err instanceof Error ? err.message : err.toString();
32
- const stack: string | undefined = err instanceof Error ? err.stack : undefined;
33
- grok.shell.error(errMsg);
34
- _package.logger.error(err.message, undefined, stack);
35
- }
36
-
37
30
  export async function getAvailableMonomers(screenLibrary: string): Promise<string[]> {
38
31
  const monomerLibHelper: IMonomerLibHelper = await grok.functions.call('Bio:getMonomerLibHelper', {});
39
32
  const monomerLib = await monomerLibHelper.readLibrary(LIB_PATH, screenLibrary);
@@ -0,0 +1,99 @@
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 {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
7
+ import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
8
+ import {
9
+ getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
10
+ } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
11
+ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
12
+
13
+ import {doPolyToolConvert} from '../polytool/pt-conversion';
14
+ import {getRules} from '../polytool/pt-rules';
15
+
16
+ import {_package} from '../package-test';
17
+
18
+
19
+ category('PolyTool: Convert', () => {
20
+ let monomerLibHelper: IMonomerLibHelper;
21
+ let userLibSettings: UserLibSettings; //backup
22
+
23
+ before(async () => {
24
+ monomerLibHelper = await getMonomerLibHelper();
25
+ userLibSettings = await getUserLibSettings();
26
+ // Clear settings to test default
27
+ await setUserLibSettingsForTests();
28
+ await monomerLibHelper.loadMonomerLib(true);
29
+ });
30
+
31
+ after(async () => {
32
+ await setUserLibSettings(userLibSettings);
33
+ await monomerLibHelper.loadMonomerLib(true);
34
+ });
35
+
36
+ const tests: { [testName: string]: { src: string[], tgt: string[] } } = {
37
+ 'cyclized': {
38
+ src: [
39
+ 'R-F-C(1)-T-G-H-F-Y-P-C(1)-meI',
40
+ 'C(1)-T-G-H-F-Y-P-C(1)-meI',
41
+ 'R-F-C(1)-T-G-H-F-Y-P-C(1)',
42
+ 'C(1)-T-G-H-F-H-P-C(1)',
43
+ 'R-F-D(2)-T-G-H-F-Y-P-NH2(2)',
44
+ ],
45
+ 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$$$',
51
+ ]
52
+ }
53
+ };
54
+
55
+ for (const [testName, testData] of Object.entries(tests)) {
56
+ test(`${testName}`, async () => {
57
+ const rules = await getRules(['rules_example.json']);
58
+ const res = doPolyToolConvert(testData.src, rules);
59
+ expectArray(res, testData.tgt);
60
+ });
61
+ }
62
+
63
+
64
+ test('ui-col-wo-table', async () => {
65
+ const packageName = _package.name;
66
+ const seqCol = DG.Column.fromStrings('seq', tests['cyclized'].src);
67
+ const helmCol: DG.Column = await grok.functions.call(`${packageName}:polyToolConvert2`, {
68
+ seqCol: seqCol,
69
+ generateHelm: true,
70
+ chiralityEngine: true,
71
+ rules: ['rules_example.json']
72
+ });
73
+ expect(helmCol.semType, DG.SEMTYPE.MACROMOLECULE);
74
+ expect(helmCol.meta.units, NOTATION.HELM);
75
+ expect(helmCol.dataFrame, null);
76
+ });
77
+
78
+ test('ui-col', async () => {
79
+ const packageName = _package.name;
80
+ const seqCol = DG.Column.fromStrings('seq', tests['cyclized'].src);
81
+ const df = DG.DataFrame.fromColumns([seqCol]);
82
+ const tv = grok.shell.addTableView(df);
83
+
84
+ const helmCol: DG.Column = await grok.functions.call(`${packageName}:polyToolConvert2`, {
85
+ seqCol: seqCol,
86
+ generateHelm: true,
87
+ chiralityEngine: true,
88
+ rules: ['rules_example.json']
89
+ });
90
+ expect(helmCol.semType, DG.SEMTYPE.MACROMOLECULE);
91
+ expect(helmCol.meta.units, NOTATION.HELM);
92
+ expect(helmCol.dataFrame.id, df.id);
93
+
94
+ await testEvent(tv.grid.onAfterDrawContent, () => {}, async () => {
95
+ tv.grid.invalidate();
96
+ }, 15000);
97
+ expect(helmCol.getTag(DG.TAGS.CELL_RENDERER), 'helm');
98
+ });
99
+ });
@@ -4,19 +4,35 @@ import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import {before, after, category, expect, test, expectArray} from '@datagrok-libraries/utils/src/test';
6
6
  import {getHelmHelper, IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
7
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
8
+ import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
9
+ import {
10
+ getUserLibSettings, setUserLibSettings, setUserLibSettingsForTests
11
+ } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
7
12
 
8
13
  import {PolyToolEnumeratorParams, PolyToolEnumeratorTypes} from '../polytool/types';
9
- import {getPtEnumeratorHelm} from '../polytool/pt-enumeration-helm';
14
+ import {doPolyToolEnumerateHelm} from '../polytool/pt-enumeration-helm';
10
15
 
11
- category('PolyTool', () => {
16
+ import {_package} from '../package-test';
17
+
18
+ category('PolyTool: Enumerate', () => {
12
19
  let helmHelper: IHelmHelper;
20
+ let monomerLibHelper: IMonomerLibHelper;
21
+ let userLibSettings: UserLibSettings; //backup
13
22
 
14
23
  before(async () => {
15
24
  helmHelper = await getHelmHelper(); // initialize JSDraw2 and org
25
+
26
+ monomerLibHelper = await getMonomerLibHelper();
27
+ userLibSettings = await getUserLibSettings();
28
+ // Clear settings to test default
29
+ await setUserLibSettingsForTests();
30
+ await monomerLibHelper.loadMonomerLib(true);
16
31
  });
17
32
 
18
33
  after(async () => {
19
-
34
+ await setUserLibSettings(userLibSettings);
35
+ await monomerLibHelper.loadMonomerLib(true);
20
36
  });
21
37
 
22
38
  const tests: {
@@ -87,8 +103,8 @@ category('PolyTool', () => {
87
103
  };
88
104
 
89
105
  for (const [testName, testData] of Object.entries(tests)) {
90
- test(`enumerator-${testName}`, async () => {
91
- const res = getPtEnumeratorHelm(testData.src, '', testData.params);
106
+ test(`${testName}`, async () => {
107
+ const res = doPolyToolEnumerateHelm(testData.src, '', testData.params);
92
108
  expectArray(res, testData.tgt);
93
109
  });
94
110
  }
@@ -7,6 +7,7 @@ import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
7
7
 
8
8
  import {defaultErrorHandler} from './err-info';
9
9
  import {polyToolEnumerateHelmUI} from '../polytool/pt-enumeration-helm-dialog';
10
+ import {polyToolEnumerateChemUI} from '../polytool/pt-dialog';
10
11
 
11
12
  import {_package} from '../package';
12
13
 
@@ -39,19 +40,15 @@ function addContextMenuForCell(gridCell: DG.GridCell, menu: DG.Menu): boolean {
39
40
  const logPrefix: string = `ST: addContextMenuForCell()`;
40
41
  _package.logger.debug(`${logPrefix}, start`);
41
42
 
42
- const polyToolEnumerate = () => {
43
- polyToolEnumerateHelmUI(gridCell.cell);
44
- };
45
-
46
43
  if (gridCell && gridCell.tableColumn) {
47
44
  switch (gridCell.tableColumn.semType) {
48
45
  case DG.SEMTYPE.MACROMOLECULE: {
49
- const sh = SeqHandler.forColumn(gridCell.tableColumn);
50
- if (sh.notation === NOTATION.HELM) {
51
- menu
52
- .item('PolyTool-Enumerate', polyToolEnumerate);
53
- true;
54
- }
46
+ menu.item('PolyTool-Enumerate', () => { polyToolEnumerateHelmUI(gridCell.cell); });
47
+ return true;
48
+ }
49
+ case DG.SEMTYPE.MOLECULE: {
50
+ menu.item('PolyTool-Enumerate', () => { polyToolEnumerateChemUI(gridCell.cell); });
51
+ return true;
55
52
  }
56
53
  }
57
54
  }