@datagrok/bio 2.23.2 → 2.25.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 (63) hide show
  1. package/.eslintrc.json +0 -2
  2. package/CHANGELOG.md +9 -0
  3. package/README.md +1 -1
  4. package/dist/455.js.map +1 -1
  5. package/dist/package-test.js +3 -3
  6. package/dist/package-test.js.map +1 -1
  7. package/dist/package.js +2 -2
  8. package/dist/package.js.map +1 -1
  9. package/files/samples/HELM_CHEMS.csv +11 -0
  10. package/package.json +2 -2
  11. package/src/analysis/sequence-space.ts +1 -1
  12. package/src/demo/bio03-atomic-level.ts +1 -1
  13. package/src/package-types.ts +2 -2
  14. package/src/package.ts +10 -4
  15. package/src/tests/activity-cliffs-tests.ts +2 -2
  16. package/src/tests/monomer-libraries-tests.ts +9 -7
  17. package/src/tests/renderers-monomer-placer-tests.ts +1 -1
  18. package/src/tests/scoring.ts +1 -1
  19. package/src/tests/seq-handler-get-helm-tests.ts +1 -1
  20. package/src/tests/splitters-test.ts +2 -2
  21. package/src/tests/substructure-filters-tests.ts +11 -11
  22. package/src/tests/to-atomic-level-tests.ts +2 -2
  23. package/src/tests/to-atomic-level-ui-tests.ts +13 -14
  24. package/src/utils/cell-renderer.ts +1 -1
  25. package/src/utils/get-region.ts +2 -2
  26. package/src/utils/helm-to-molfile/converter/const.ts +0 -1
  27. package/src/utils/helm-to-molfile/converter/converter.ts +4 -4
  28. package/src/utils/helm-to-molfile/converter/helm.ts +14 -6
  29. package/src/utils/helm-to-molfile/converter/mol-bonds.ts +2 -2
  30. package/src/utils/helm-to-molfile/converter/mol-wrapper.ts +2 -2
  31. package/src/utils/helm-to-molfile/converter/monomer-wrapper.ts +1 -1
  32. package/src/utils/helm-to-molfile/converter/polymer.ts +1 -1
  33. package/src/utils/helm-to-molfile/converter/r-group-handler.ts +2 -2
  34. package/src/utils/helm-to-molfile/utils.ts +3 -2
  35. package/src/utils/monomer-cell-renderer-base.ts +1 -2
  36. package/src/utils/monomer-lib/consts.ts +1 -6
  37. package/src/utils/monomer-lib/lib-manager.ts +239 -112
  38. package/src/utils/monomer-lib/library-file-manager/file-validator.ts +1 -1
  39. package/src/utils/monomer-lib/library-file-manager/monomers-lib-provider.ts +378 -0
  40. package/src/utils/monomer-lib/library-file-manager/ui.ts +120 -81
  41. package/src/utils/monomer-lib/monomer-colors.ts +37 -39
  42. package/src/utils/monomer-lib/monomer-lib-base.ts +34 -7
  43. package/src/utils/monomer-lib/monomer-lib.ts +7 -33
  44. package/src/utils/monomer-lib/monomer-manager/duplicate-monomer-manager.ts +3 -3
  45. package/src/utils/monomer-lib/monomer-manager/monomer-manager.ts +91 -82
  46. package/src/utils/monomer-lib/smiles2Monomer.ts +128 -0
  47. package/src/utils/monomer-lib/web-editor-monomer-dummy.ts +15 -1
  48. package/src/utils/monomer-lib/web-editor-monomer-of-library.ts +2 -1
  49. package/src/utils/multiple-sequence-alignment-ui.ts +1 -1
  50. package/src/utils/multiple-sequence-alignment.ts +1 -1
  51. package/src/utils/seq-helper/seq-handler.ts +26 -13
  52. package/src/utils/seq-helper/seq-helper.ts +1 -2
  53. package/src/utils/sequence-to-mol.ts +1 -1
  54. package/src/utils/ui-utils.ts +1 -1
  55. package/src/viewers/web-logo-viewer.ts +20 -9
  56. package/src/widgets/composition-analysis-widget.ts +1 -1
  57. package/src/widgets/sequence-scrolling-widget.ts +1 -2
  58. package/test-console-output-1.log +670 -721
  59. package/test-record-1.mp4 +0 -0
  60. package/src/utils/monomer-lib/library-file-manager/custom-monomer-lib-handlers.ts +0 -41
  61. package/src/utils/monomer-lib/library-file-manager/event-manager.ts +0 -93
  62. package/src/utils/monomer-lib/library-file-manager/file-manager.ts +0 -317
  63. package/src/utils/monomer-lib/monomer-set.ts +0 -61
@@ -0,0 +1,11 @@
1
+ HELM,Activity
2
+ "PEPTIDE1{[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@@H](C(=O)*)C |$_R1;;;;;_R2;$|].[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@@H](C(=O)*)Cc1ccccc1 |$_R1;;;;;_R2;;;;;;;$|].[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@H](C(=O)*)C |$_R1;;;;;_R2;$|].[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@@H](C(=O)*)Cc1ccccc1 |$_R1;;;;;_R2;;;;;;;$|]}$PEPTIDE1,PEPTIDE1,8:R2-1:R1$$$",5.3075109739681280
3
+ "PEPTIDE1{[ac].D.A.D.E.[*N[C@H](C(=O)*)Cc1ccc(cc1)OC(C(=O)O)C(=O)O |$_R1;;;;;_R2;;;;;;;;;;;;;;;$|].L.[am]}$$$$ CHEMBL8284
4
+ PEPTIDE1{[N[C@](C)(C(=O)O)Cc1ccc(c(c1)O)O]}$$$$",5.7238768534315438
5
+ "PEPTIDE1{[meL].[*O[C@@H](C(=O)*)C |$_R1;;;;;_R2;$|].[meL].[*O[C@@H](C(=O)*)Cc1ccccc1 |$_R1;;;;;_R2;;;;;;;$|].[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@H](C(=O)*)C |$_R1;;;;;_R2;$|].[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@@H](C(=O)*)Cc1ccccc1 |$_R1;;;;;_R2;;;;;;;$|]}|PEPTIDE2{E.[*O[C@@H](C(=O)*)C |$_R1;;;;;_R2;$|].E.[*O[C@@H](C(=O)*)Cc1ccccc1 |$_R1;;;;;_R2;;;;;;;$|].[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@H](C(=O)*)C |$_R1;;;;;_R2;$|].[*N(C)[C@H](C(=O)*)CCC |$_R1;;;;;;_R2;;;$|].[*O[C@@H](C(=O)*)Cc1ccccc1 |$_R1;;;;;_R2;;;;;;;$|]}$PEPTIDE2,PEPTIDE2,8:R2-1:R1|PEPTIDE1,PEPTIDE2,1:R1-3:R3|PEPTIDE2,PEPTIDE1,1:R3-8:R2$$$V2.0",5.1858112460224372
6
+ "PEPTIDE1{[[C@H](C(=O)*)CS* |$;;;_R2;;;_R3$|].F.I.Q.N.[dC].S.R.G.[am]}$PEPTIDE1,PEPTIDE1,1:R3-6:R3$$$V2.0",6.2235023908043692
7
+ "PEPTIDE1{A.[dP].D.[dW].F.[dF].N.[dY].Y.[dW].G.[dN].W.[dH].G.[*N[C@@H](C(=O)*)[C@@H](C)O |$_R1;;;;;_R2;;;$|]}$PEPTIDE1,PEPTIDE1,16:R2-1:R1$$$",3.8459123763832412
8
+ PEPTIDE1{N.L.E.R.E.[*N[C@H](C(=O)*)CSCNC(=O)C |$_R1;;;;;_R2;;;;;;;$|].L.E.E.P.[*N[C@H](C(=O)*)CSCNC(=O)C |$_R1;;;;;_R2;;;;;;;$|].S.R.E.E.A.F}$$$$,3.2792043882465700
9
+ "PEPTIDE1{[[C@H](C(=O)*)CS* |$;;;_R2;;;_R3$|].Y.[dF].G.[dN].[dC].[dP].R.G.[am]}$PEPTIDE1,PEPTIDE1,1:R3-6:R3$$$",2.1058521529925680
10
+ PEPTIDE1{A.[[*]C(=O)[C@H](C)N([*])C |$_R2;;;;;;_R1;;;$|].A}$$$$V2.0,1.8036950016492720
11
+ "CHEM1{[*N[C@H](C(=O)*)Cc1ccc(cc1)OP(=O)(O)O |$_R1;;;;;_R2;;;;;;;;;;;;$|]}|PEPTIDE1{[C[C@H](N[*])C(=O)C[*] |$;;;_R1;;;;_R2$|].G.G.G.C.C.K.K.K.K}$PEPTIDE1,CHEM1,10:R3-1:R1$$$V2.0",6.3880602836120888
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "name": "Davit Rizhinashvili",
6
6
  "email": "drizhinashvili@datagrok.ai"
7
7
  },
8
- "version": "2.23.2",
8
+ "version": "2.25.0",
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",
@@ -44,7 +44,7 @@
44
44
  ],
45
45
  "dependencies": {
46
46
  "@biowasm/aioli": "^3.1.0",
47
- "@datagrok-libraries/bio": "^5.55.1",
47
+ "@datagrok-libraries/bio": "^5.61.0",
48
48
  "@datagrok-libraries/chem-meta": "^1.2.9",
49
49
  "@datagrok-libraries/math": "^1.2.6",
50
50
  "@datagrok-libraries/ml": "^6.10.6",
@@ -33,7 +33,7 @@ export async function getEncodedSeqSpaceCol(
33
33
  for (let rowIdx = 0; rowIdx < rowCount; rowIdx++) {
34
34
  const catI = seqColRawData[rowIdx];
35
35
  const seq = seqColCats[catI];
36
- if (seq === null || seqCol.isNone(rowIdx)) {
36
+ if (seq == null || seqCol.isNone(rowIdx)) {
37
37
  //@ts-ignore
38
38
  encList[rowIdx] = null;
39
39
  continue;
@@ -18,7 +18,7 @@ export async function demoToAtomicLevel(): Promise<void> {
18
18
  adjustGridcolAfterRender(view.grid, 'molfile(HELM)', 500, 300, true);
19
19
  adjustGridcolAfterRender(view.grid, 'HELM', 500, undefined, true);
20
20
  grok.shell.info('Hover over monomers in HELM column to highlight them in molecular structure.', {timeout: 10});
21
- grok.shell.windows.help.showHelp('/help/datagrok/solutions/domains/bio/bio.md#get-atomic-level-structure');
21
+ grok.shell.windows.help.showHelp('/help/datagrok/solutions/domains/bio/bio.md#convert-to-atomic-level');
22
22
  }
23
23
 
24
24
  export async function demoBio03UI(): Promise<void> {
@@ -8,7 +8,7 @@ import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
8
8
  import {LoggerWrapper} from '@datagrok-libraries/bio/src/utils/logger';
9
9
  import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
10
10
  import {ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
11
- import {IMonomerLib, IMonomerLibBase, IMonomerSet} from '@datagrok-libraries/bio/src/types';
11
+ import {IMonomerLib, IMonomerLibBase, IMonomerSet} from '@datagrok-libraries/bio/src/types/monomer-library';
12
12
 
13
13
  /** Names of package properties/settings declared in properties section of {@link './package.json'} */
14
14
  export const enum BioPackagePropertiesNames {
@@ -41,7 +41,7 @@ export class BioPackageProperties extends Map<string, any> {
41
41
  }
42
42
 
43
43
  public set maxMonomerLength(value: number | null) {
44
- const vs = value === null ? 'long' : value.toString();
44
+ const vs = value == null ? 'long' : value.toString();
45
45
  super.set(BioPackagePropertiesNames.MaxMonomerLength, vs);
46
46
  this._onPropertyChanged.next(BioPackagePropertiesNames.MaxMonomerLength);
47
47
  }
package/src/package.ts CHANGED
@@ -13,11 +13,11 @@ import {getActivityCliffs} from '@datagrok-libraries/ml/src/viewers/activity-cli
13
13
  import {MmDistanceFunctionsNames} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';
14
14
  import {BitArrayMetrics, KnownMetrics} from '@datagrok-libraries/ml/src/typed-metrics';
15
15
  import {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
16
- import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
16
+ import {IMonomerLib, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
17
17
  import {SeqPalette} from '@datagrok-libraries/bio/src/seq-palettes';
18
18
  import {FastaFileHandler} from '@datagrok-libraries/bio/src/utils/fasta-handler';
19
19
  import {SCORE} from '@datagrok-libraries/bio/src/utils/macromolecule/scoring';
20
- import {createJsonMonomerLibFromSdf, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
20
+ import {createJsonMonomerLibFromSdf,} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
21
21
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
22
22
  import {ActivityCliffsEditor} from '@datagrok-libraries/ml/src/functionEditors/activity-cliffs-function-editor';
23
23
  import BitArray from '@datagrok-libraries/utils/src/bit-array';
@@ -78,6 +78,7 @@ import {molecular3DStructureWidget, toAtomicLevelWidget} from './widgets/to-atom
78
78
  import {handleSequenceHeaderRendering} from './widgets/sequence-scrolling-widget';
79
79
  import {PolymerType} from '@datagrok-libraries/js-draw-lite/src/types/org';
80
80
  import {BilnNotationProvider} from './utils/biln';
81
+ import {MonomerLibFromFilesProvider} from './utils/monomer-lib/library-file-manager/monomers-lib-provider';
81
82
  export const _package = new BioPackage(/*{debug: true}/**/);
82
83
  export * from './package.g';
83
84
 
@@ -122,7 +123,7 @@ export class PackageFunctions {
122
123
 
123
124
  @grok.decorators.init({})
124
125
  static async initBio(): Promise<void> {
125
- if (initBioPromise === null)
126
+ if (initBioPromise == null)
126
127
  initBioPromise = initBioInt();
127
128
 
128
129
  await initBioPromise;
@@ -1056,9 +1057,14 @@ export class PackageFunctions {
1056
1057
  return await showManageLibrariesView(false);
1057
1058
  }
1058
1059
 
1060
+ // @grok.decorators.func({tags: ['monomer-lib-provider'], result: {type: 'object', name: 'result'}})
1061
+ // static async getMonomerLibFileProvider(): Promise<MonomerLibFromFilesProvider> {
1062
+ // return
1063
+ // }
1064
+
1059
1065
  @grok.decorators.func({name: 'Monomer Manager Tree Browser', meta: {role: 'appTreeBrowser'}})
1060
1066
  static async manageMonomerLibrariesViewTreeBrowser(treeNode: DG.TreeViewGroup) {
1061
- const libraries = (await (await MonomerLibManager.getInstance()).getFileManager()).getValidLibraryPaths();
1067
+ const libraries = (await (await MonomerLibManager.getInstance()).getAvaliableLibraryNames());
1062
1068
  libraries.forEach((libName) => {
1063
1069
  const nodeName = libName.endsWith('.json') ? libName.substring(0, libName.length - 5) : libName;
1064
1070
  const libNode = treeNode.item(nodeName);
@@ -8,7 +8,7 @@ import {_testActivityCliffsOpen} from './activity-cliffs-utils';
8
8
 
9
9
  import {MmDistanceFunctionsNames} from '@datagrok-libraries/ml/src/macromolecule-distance-functions';
10
10
  import {BitArrayMetricsNames} from '@datagrok-libraries/ml/src/typed-metrics';
11
- import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
11
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
12
12
  import {
13
13
  getUserLibSettings, setUserLibSettings
14
14
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
@@ -67,7 +67,7 @@ category('activityCliffs', async () => {
67
67
  if (helmPackInstalled) {
68
68
  const df = await _package.files.readCsv('samples/HELM_50.csv');
69
69
  const _view = grok.shell.addTableView(df);
70
-
70
+
71
71
  await _testActivityCliffsOpen(df, DimReductionMethods.UMAP,
72
72
  'HELM', 'Activity', 65, 20, BitArrayMetricsNames.Tanimoto, helmEncodingFunc);
73
73
  }
@@ -3,13 +3,13 @@ import * as DG from 'datagrok-api/dg';
3
3
  import * as ui from 'datagrok-api/ui';
4
4
 
5
5
  import {test, after, before, category, expect, expectObject} from '@datagrok-libraries/utils/src/test';
6
- import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
6
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
7
7
  import {
8
8
  getUserLibSettings, setUserLibSettings
9
9
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
10
10
  import {expectMonomerLib} from '@datagrok-libraries/bio/src/tests/monomer-lib-tests';
11
11
  import {MonomerTypes, PolymerTypes} from '@datagrok-libraries/bio/src/helm/consts';
12
- import {Monomer} from '@datagrok-libraries/bio/src/types/index';
12
+ import {Monomer} from '@datagrok-libraries/bio/src/types/monomer-library';
13
13
 
14
14
  import {monomerLibForTestsSummary} from '../utils/monomer-lib/consts';
15
15
 
@@ -50,11 +50,13 @@ category('monomerLibraries', () => {
50
50
  test('empty', async () => {
51
51
  // exclude all monomer libraries for empty set
52
52
  const libSettings = await getUserLibSettings();
53
- const libFileManager = await monomerLibHelper.getFileManager();
54
53
 
55
- let libFnList = libFileManager.getValidLibraryPaths();
56
- if (libFnList.length === 0)
57
- libFnList = await libFileManager.getValidLibraryPathsAsynchronously();
54
+
55
+ let libFnList = await monomerLibHelper.getAvaliableLibraryNames();
56
+ if (libFnList.length === 0) {
57
+ await monomerLibHelper.refreshValidLibraryLists();
58
+ libFnList = await monomerLibHelper.getAvaliableLibraryNames();
59
+ }
58
60
 
59
61
  libSettings.exclude = libFnList;
60
62
  libSettings.explicit = [];
@@ -81,7 +83,7 @@ category('monomerLibraries', () => {
81
83
  };
82
84
  const monomerLib = monomerLibHelper.getMonomerLib();
83
85
  const absentOverrideMonomer = monomerLib.getMonomer(overMon.polymerType, overMon.symbol);
84
- expect(absentOverrideMonomer === null, true, `Unexpectedly found monomer '${overMon.symbol}' `);
86
+ expect(absentOverrideMonomer == null, true, `Unexpectedly found monomer '${overMon.symbol}' `);
85
87
 
86
88
  const overriddenMonomerLib = monomerLib.override({[overMon.polymerType]: {[overMon.symbol]: overMon}}, 'test');
87
89
  const resOverMon = overriddenMonomerLib.getMonomer(overMon.polymerType, overMon.symbol);
@@ -8,7 +8,7 @@ import wu from 'wu';
8
8
  import {after, before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
9
9
  import {MonomerPlacer, hitBounds} from '@datagrok-libraries/bio/src/utils/cell-renderer-monomer-placer';
10
10
  import {monomerToShort} from '@datagrok-libraries/bio/src/utils/macromolecule';
11
- import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
11
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
12
12
  import {
13
13
  getUserLibSettings, setUserLibSettings
14
14
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
@@ -6,7 +6,7 @@ import wu from 'wu';
6
6
 
7
7
  import {category, test, expectFloat, before, after, expect} from '@datagrok-libraries/utils/src/test';
8
8
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
9
- import {IMonomerLibHelper, getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
9
+ import {IMonomerLibHelper, getMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
10
10
 
11
11
  import {
12
12
  getUserLibSettings, setUserLibSettings
@@ -5,7 +5,7 @@ import * as DG from 'datagrok-api/dg';
5
5
  import {after, before, category, expect, test} from '@datagrok-libraries/utils/src/test';
6
6
  import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
7
7
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
8
- import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
8
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
9
9
  import {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
10
10
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
11
11
 
@@ -8,9 +8,9 @@ import {after, before, category, test, expect, expectArray} from '@datagrok-libr
8
8
  import {TAGS as bioTAGS, splitterAsFasta} from '@datagrok-libraries/bio/src/utils/macromolecule';
9
9
  import {splitterAsHelm} from '@datagrok-libraries/bio/src/utils/macromolecule/utils';
10
10
  import {ISeqSplitted} from '@datagrok-libraries/bio/src/utils/macromolecule/types';
11
- import {IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
11
+ import {IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
12
12
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
13
- import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
13
+ import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
14
14
  import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
15
15
 
16
16
  import {splitToMonomersUI} from '../utils/split-to-monomers';
@@ -8,7 +8,7 @@ import $ from 'cash-dom';
8
8
  import wu from 'wu';
9
9
 
10
10
  import {after, before, category, test, expect, delay, testEvent, awaitCheck} from '@datagrok-libraries/utils/src/test';
11
- import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
11
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
12
12
  import {
13
13
  getUserLibSettings, setUserLibSettings
14
14
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
@@ -159,7 +159,7 @@ category('bio-substructure-filters', async () => {
159
159
  const view = grok.shell.addTableView(df);
160
160
  await grok.data.detectSemanticTypes(df);
161
161
  await df.meta.detectSemanticTypes();
162
-
162
+
163
163
  _package.logger.debug(`${logPrefix}, filter attaching.`);
164
164
  const filter = new BioSubstructureFilter(seqHelper, _package.logger);
165
165
  filter.attach(df);
@@ -168,7 +168,7 @@ category('bio-substructure-filters', async () => {
168
168
  try {
169
169
  const bf = filter.bioFilter as HelmBioFilter;
170
170
  expect(filter.bioFilter !== null, true, 'bioFilter is not created');
171
-
171
+
172
172
  // filter 1
173
173
  _package.logger.debug(`${logPrefix}, filter 1 change awaiting...`);
174
174
  await testEvent(df.onRowsFiltered, () => {}, () => {
@@ -177,7 +177,7 @@ category('bio-substructure-filters', async () => {
177
177
  _package.logger.debug(`${logPrefix}, filter 1 changed.`);
178
178
  expect(filter.dataFrame!.filter.trueCount, 1);
179
179
  expect(filter.dataFrame!.filter.toBinaryString(), '0001');
180
-
180
+
181
181
  // filter 2
182
182
  _package.logger.debug(`${logPrefix}, filter 2 change awaiting...`);
183
183
  await testEvent(df.onRowsFiltered, () => {}, () => {
@@ -206,9 +206,9 @@ category('bio-substructure-filters', async () => {
206
206
  const col = df.getCol('HELM string');
207
207
  await grok.data.detectSemanticTypes(df);
208
208
  const view = grok.shell.addTableView(df);
209
-
209
+
210
210
  const fg = view.getFiltersGroup();
211
-
211
+
212
212
  // await awaitCheck(() => fg.filters.length == 1, 'await filters.length == 1', 1000);
213
213
  // const filter = fg.filters.filter((f) => f.columnName == col.name)[0] as BioSubstructureFilter;
214
214
  await awaitGrid(view.grid);
@@ -287,10 +287,10 @@ category('bio-substructure-filters', async () => {
287
287
  const df = await _package.files.readCsv('tests/filter_HELM.csv');
288
288
  await grok.data.detectSemanticTypes(df);
289
289
  const view = grok.shell.addTableView(df);
290
-
290
+
291
291
  const fSubStr: string = 'PEPTIDE1{A.C}$$$$V2.0';
292
292
  const fTrueCount: number = 1;
293
-
293
+
294
294
  const f1 = await createFilter('HELM string', df);
295
295
  const f2 = await createFilter('HELM string', df);
296
296
  const dlg = ui.dialog('Test filters').add(f1.root).add(f2.root).show(); // to waitForElementInDom
@@ -302,18 +302,18 @@ category('bio-substructure-filters', async () => {
302
302
  expect(f2.bioFilter!.type, 'HelmBioFilter');
303
303
  const bf1 = f1.bioFilter as HelmBioFilter;
304
304
  const bf2 = f2.bioFilter as HelmBioFilter;
305
-
305
+
306
306
  await testEvent(df.onRowsFiltered, () => {}, () => {
307
307
  bf1.props = new BioFilterProps(fSubStr, undefined, _package.logger);
308
308
  }, 60000, 'await onRowsFiltered'); // wait to load monomers
309
309
  await awaitGrid(view.grid);
310
310
  //debugger;
311
-
311
+
312
312
  _package.logger.debug('Bio tests: substructureFilters/sync-helm, before changed event');
313
313
  await delay(f1.debounceTime * 2);
314
314
  _package.logger.debug('Bio tests: substructureFilters/sync-helm, after changed event');
315
315
  expect(df.filter.trueCount, fTrueCount);
316
-
316
+
317
317
  await f1.awaitRendered();
318
318
  expect(bf2.props.substructure, fSubStr);
319
319
  } finally {
@@ -8,9 +8,9 @@ import wu from 'wu';
8
8
  import {before, after, category, test, expectArray, expect} from '@datagrok-libraries/utils/src/test';
9
9
  import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
10
10
  import {_toAtomicLevel} from '@datagrok-libraries/bio/src/monomer-works/to-atomic-level';
11
- import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
11
+ import {IMonomerLib} from '@datagrok-libraries/bio/src/types/monomer-library';
12
12
  import {ALPHABET, NOTATION, TAGS as bioTAGS} from '@datagrok-libraries/bio/src/utils/macromolecule';
13
- import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
13
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
14
14
  import {
15
15
  getUserLibSettings, setUserLibSettings
16
16
  } from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
@@ -2,9 +2,9 @@ import * as DG from 'datagrok-api/dg';
2
2
  import * as grok from 'datagrok-api/grok';
3
3
 
4
4
  import {after, before, category, expect, expectArray, test} from '@datagrok-libraries/utils/src/test';
5
- import {IMonomerLib} from '@datagrok-libraries/bio/src/types';
5
+ import {IMonomerLib} from '@datagrok-libraries/bio/src/types/monomer-library';
6
6
  import {sequenceToMolfile} from '../utils/sequence-to-mol';
7
- import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
7
+ import {getMonomerLibHelper, IMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
8
8
  import {getUserLibSettings, setUserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/lib-settings';
9
9
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
10
10
 
@@ -20,7 +20,6 @@ type TestDataType = {
20
20
  };
21
21
 
22
22
  category('toAtomicLevel-ui', () => {
23
-
24
23
  let monomerLibHelper: IMonomerLibHelper;
25
24
  let userLibSettings: UserLibSettings;
26
25
  let seqHelper: ISeqHelper;
@@ -64,16 +63,16 @@ category('toAtomicLevel-ui', () => {
64
63
  },
65
64
  };
66
65
 
67
- // const fastaCsv = `seq
68
- // MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW
69
- // MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL
70
- // MMELVLKTIIGPIVVGVVLRIVDKWLNKDK
71
- // `;
72
- // const helmCsv = `seq
73
- // PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$$
74
- // PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.meM.D-Chg.dV.E.N.D-Orn.D-aThr.Phe_4Me}$$$$
75
- // PEPTIDE1{meI.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Tyr_ab-dehydroMe.dV.D-Cit.N.D-Orn.D-aThr.Phe_4Me}$$$$
76
- // `;
66
+ // const fastaCsv = `seq
67
+ // MDYKETLLMPKTDFPMRGGLPNKEPQIQEKW
68
+ // MIEVFLFGIVLGLIPITLAGLFVTAYLQYRRGDQLDL
69
+ // MMELVLKTIIGPIVVGVVLRIVDKWLNKDK
70
+ // `;
71
+ // const helmCsv = `seq
72
+ // PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Aze.dV.E.N.dV.Phe_4Me}$$$$
73
+ // PEPTIDE1{meI.hHis.Aca.N.T.dK.Thr_PO3H2.Aca.meM.D-Chg.dV.E.N.D-Orn.D-aThr.Phe_4Me}$$$$
74
+ // PEPTIDE1{meI.Aca.N.T.dK.Thr_PO3H2.Aca.D-Tyr_Et.Tyr_ab-dehydroMe.dV.D-Cit.N.D-Orn.D-aThr.Phe_4Me}$$$$
75
+ // `;
77
76
 
78
77
  const getSeqCol = async (testData: TestDataType): Promise<DG.Column<string>> => {
79
78
  const seq = testData.src.seq;
@@ -98,7 +97,7 @@ category('toAtomicLevel-ui', () => {
98
97
  await _testToAtomicLevelFunc(seqCol, true, testData.tgt);
99
98
  });
100
99
  }
101
- }
100
+ }
102
101
 
103
102
  async function _testToAtomicLevelFunc(
104
103
  seqCol: DG.Column<string>, nonlinear: boolean, tgt: TestDataTargetType,
@@ -20,7 +20,7 @@ import {
20
20
  } from '@datagrok-libraries/bio/src/utils/macromolecule';
21
21
  import {ISeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
22
22
  import {getSplitter} from '@datagrok-libraries/bio/src/utils/macromolecule/utils';
23
- import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types';
23
+ import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types/monomer-library';
24
24
  import {GapOriginals} from '@datagrok-libraries/bio/src/utils/macromolecule/consts';
25
25
  import {execMonomerHoverLinks} from '@datagrok-libraries/bio/src/monomer-works/monomer-hover';
26
26
  import {CellRendererBackBase, getGridCellColTemp} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
@@ -47,9 +47,9 @@ export function getRegionDo(
47
47
  if (sh.posList[posJ] == startPosName) startPosIdx = posJ;
48
48
  if (sh.posList[posJ] == endPosName) endPosIdx = posJ;
49
49
  }
50
- if (startPosIdx === null && startPosName !== null)
50
+ if (startPosIdx == null && startPosName !== null)
51
51
  throw new Error(`Start position ${startPosName} not found.`);
52
- if (endPosIdx === null && endPosName !== null)
52
+ if (endPosIdx == null && endPosName !== null)
53
53
  throw new Error(`End position ${endPosName} not found.`);
54
54
 
55
55
  if (sh.posList.length < endPosIdx!)
@@ -1,4 +1,3 @@
1
1
  export const HELM_ITEM_SEPARATOR = '|';
2
- export const HELM_SECTION_SEPARATOR = '$';
3
2
 
4
3
  export const HYDROGEN_SYMBOL = 'H';
@@ -4,7 +4,7 @@ import * as OCL from 'openchemlib/full';
4
4
 
5
5
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
6
6
  import {RDModule, RDMol} from '@datagrok-libraries/chem-meta/src/rdkit-api';
7
- import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types/index';
7
+ import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types/monomer-library';
8
8
  import {IHelmHelper} from '@datagrok-libraries/bio/src/helm/helm-helper';
9
9
  import {MolfileWithMap, MonomerMap} from '@datagrok-libraries/bio/src/monomer-works/types';
10
10
 
@@ -29,7 +29,7 @@ export class HelmToMolfileConverter implements IHelmToMolfileConverter {
29
29
  const smilesColName = `smiles(${helmCol.name})`;
30
30
  const smilesColNameU = df ? df.columns.getUnusedName(smilesColName) : smilesColName;
31
31
  return DG.Column.fromStrings(smilesColNameU, smiles.map((molecule) => {
32
- if (molecule === null)
32
+ if (molecule == null)
33
33
  return '';
34
34
  return molecule;
35
35
  }));
@@ -57,7 +57,7 @@ export class HelmToMolfileConverter implements IHelmToMolfileConverter {
57
57
 
58
58
  public getMolV3000ViaOCL(beautifiedMols: (RDMol | null)[], columnName: string): DG.Column<string> {
59
59
  const beautifiedMolV2000 = beautifiedMols.map((mol) => {
60
- if (mol === null)
60
+ if (mol == null)
61
61
  return '';
62
62
  const molBlock = mol.get_v3Kmolblock();
63
63
  mol!.delete();
@@ -97,7 +97,7 @@ export class HelmToMolfileConverter implements IHelmToMolfileConverter {
97
97
  if (chiralityEngine)
98
98
  return this.getMolV3000ViaOCL(beautifiedMols, molColNameU);
99
99
  return DG.Column.fromStrings(molColNameU, beautifiedMols.map((mol) => {
100
- if (mol === null)
100
+ if (mol == null)
101
101
  return '';
102
102
  const molBlock = mol.get_v3Kmolblock();
103
103
  mol!.delete();
@@ -1,16 +1,24 @@
1
1
  import {HELM_POLYMER_TYPE} from '@datagrok-libraries/bio/src/utils/const';
2
2
  import {ConnectionList} from './connection-list';
3
- import {HELM_ITEM_SEPARATOR, HELM_SECTION_SEPARATOR} from './const';
3
+ import {HELM_ITEM_SEPARATOR} from './const';
4
4
  import {SimplePolymer} from './simple-polymer';
5
5
  import {Bond} from './types';
6
6
 
7
7
  export class Helm {
8
8
  constructor(private helmString: string) {
9
- const helmSections = this.helmString.split(HELM_SECTION_SEPARATOR);
10
- const simplePolymers = helmSections[0].split(HELM_ITEM_SEPARATOR);
11
- this.simplePolymers = simplePolymers
9
+ const indexOfSequenceEnd = helmString.indexOf('}$');
10
+ const sequencePart = helmString.substring(0, indexOfSequenceEnd + 1);
11
+ const connectionsEndPart = helmString.indexOf('$', indexOfSequenceEnd + 2);
12
+ const connectionsPart = helmString.substring(indexOfSequenceEnd + 2, connectionsEndPart);
13
+ // const helmParts = seq.split('$');
14
+ const spList = sequencePart.split('}|');
15
+ // since we removed }|, need to add } to last part
16
+ for (let i = 0; i < spList.length - 1; i++)
17
+ spList[i] = spList[i] + '}';
18
+
19
+ this.simplePolymers = spList
12
20
  .map((item) => new SimplePolymer(item));
13
- this.connectionList = new ConnectionList(helmSections[1]);
21
+ this.connectionList = new ConnectionList(connectionsPart);
14
22
  this.bondData = this.getBondData();
15
23
 
16
24
  this.bondedRGroupsMap = this.getBondedRGroupsMap();
@@ -58,7 +66,7 @@ export class Helm {
58
66
  const lowerBound = shiftValues.sort((a, b) => b - a).find( // find the largest shift not exceeding monomerGlobalIdx
59
67
  (shift) => monomerGlobalIdx >= shift
60
68
  );
61
- if (lowerBound === undefined)
69
+ if (lowerBound == undefined)
62
70
  throw new Error(`Cannot find simple polymer for monomer ${monomerGlobalIdx}`);
63
71
  const simplePolymerId = Object.keys(shifts).find((simplePolymerId) => shifts[simplePolymerId] === lowerBound)!;
64
72
  const simplePolymer = this.simplePolymers.find((simplePolymer) => simplePolymer.id === simplePolymerId)!;
@@ -4,7 +4,7 @@ export abstract class MolfileBonds {
4
4
  protected bondedAtomPairs: number[][] = [];
5
5
  protected rawBondLines: string[] = [];
6
6
 
7
- public get count(): number { return this.bondedAtomPairs.length;}
7
+ public get count(): number { return this.bondedAtomPairs.length; }
8
8
 
9
9
  /** Get bond lines with new values for bonded atoms */
10
10
  abstract getBondLines(): string[];
@@ -31,7 +31,7 @@ export abstract class MolfileBonds {
31
31
  }
32
32
 
33
33
  replacePositionsInBondsByDummy(positions: PositionInBonds[], dummy?: number): void {
34
- if (dummy === undefined)
34
+ if (dummy == undefined)
35
35
  dummy = -1;
36
36
  positions.forEach((position) => {
37
37
  const {bondLineIdx, nodeIdx} = position;
@@ -15,7 +15,7 @@ export abstract class MolfileWrapper {
15
15
 
16
16
  protected shiftR1GroupToOrigin(): void {
17
17
  const r1Idx = this.rGroups.getAtomicIdx(1);
18
- if (r1Idx === null)
18
+ if (r1Idx == null)
19
19
  return; // R1 group is not present, nothing to shift
20
20
  const {x, y} = this.atoms.atomCoordinates[r1Idx];
21
21
  this.atoms.shift({x: -x, y: -y});
@@ -23,7 +23,7 @@ export abstract class MolfileWrapper {
23
23
 
24
24
  protected alignR2AlongX(): void {
25
25
  const r2Idx = this.rGroups.getAtomicIdx(2);
26
- if (r2Idx === null)
26
+ if (r2Idx == null)
27
27
  throw new Error(`Cannot find R2 group for monomer ${this.monomerSymbol}`);
28
28
  const r2Coordinates = this.atoms.atomCoordinates[r2Idx];
29
29
  const tan = r2Coordinates.y / r2Coordinates.x;
@@ -1,4 +1,4 @@
1
- import {IMonomerLib, IMonomerLibBase, Monomer} from '@datagrok-libraries/bio/src/types';
1
+ import {IMonomerLib, IMonomerLibBase, Monomer} from '@datagrok-libraries/bio/src/types/monomer-library';
2
2
  import {HELM_RGROUP_FIELDS} from '@datagrok-libraries/bio/src/utils/const';
3
3
  import {RDModule, RDMol} from '@datagrok-libraries/chem-meta/src/rdkit-api';
4
4
  import {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';
@@ -3,7 +3,7 @@ import wu from 'wu';
3
3
  import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
4
4
  import {V3K_CONST} from '@datagrok-libraries/chem-meta/src/formats/molfile-const';
5
5
  import {HelmTypes, PolymerTypes} from '@datagrok-libraries/bio/src/helm/consts';
6
- import {IMonomerLib, IMonomerLibBase} from '@datagrok-libraries/bio/src/types/index';
6
+ import {IMonomerLib, IMonomerLibBase} from '@datagrok-libraries/bio/src/types/monomer-library';
7
7
  import {NOTATION} from '@datagrok-libraries/bio/src/utils/macromolecule';
8
8
  import {GapOriginals} from '@datagrok-libraries/bio/src/utils/macromolecule/consts';
9
9
  import {MolfileWithMap, MonomerMap} from '@datagrok-libraries/bio/src/monomer-works/types';
@@ -19,13 +19,13 @@ export class RGroupHandler {
19
19
 
20
20
  getAtomicIdx(rGroupId: number): number | null {
21
21
  const atomicIdx = this.rGroupIdToAtomicIndexMap.get(rGroupId);
22
- return atomicIdx === undefined ? null : atomicIdx;
22
+ return atomicIdx == undefined ? null : atomicIdx;
23
23
  }
24
24
 
25
25
  private removeRGroupsFromAtomBlock(rGroupIds: number[]): void {
26
26
  rGroupIds.forEach((rgroupId) => {
27
27
  const atomicIdx = this.rGroupIdToAtomicIndexMap.get(rgroupId);
28
- if (atomicIdx === undefined)
28
+ if (atomicIdx == undefined)
29
29
  throw new Error(`Cannot find atomic index for R group ${rgroupId}`);
30
30
  });
31
31
 
@@ -2,7 +2,7 @@ import * as grok from 'datagrok-api/grok';
2
2
  import * as ui from 'datagrok-api/ui';
3
3
  import * as DG from 'datagrok-api/dg';
4
4
 
5
- import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types';
5
+ import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types/monomer-library';
6
6
 
7
7
  import {SeqHelper} from '../seq-helper';
8
8
 
@@ -14,7 +14,8 @@ export async function getMolColumnFromHelm(
14
14
  ): Promise<DG.Column<string>> {
15
15
  const seqHelper: SeqHelper = _package.seqHelper as SeqHelper;
16
16
  const converter = await seqHelper.getHelmToMolfileConverter(monomerLib);
17
- const molCol = converter.convertToRdKitBeautifiedMolfileColumn(helmCol, chiralityEngine, _package.rdKitModule, monomerLib);
17
+ const molCol = converter
18
+ .convertToRdKitBeautifiedMolfileColumn(helmCol, chiralityEngine, _package.rdKitModule, monomerLib);
18
19
  molCol.semType = DG.SEMTYPE.MOLECULE;
19
20
  return molCol;
20
21
  }
@@ -2,9 +2,8 @@ import * as grok from 'datagrok-api/grok';
2
2
  import * as DG from 'datagrok-api/dg';
3
3
  import * as ui from 'datagrok-api/ui';
4
4
 
5
- import {getMonomerLibHelper} from '@datagrok-libraries/bio/src/monomer-works/monomer-utils';
6
5
  import {CellRendererBackBase} from '@datagrok-libraries/bio/src/utils/cell-renderer-back-base';
7
- import {IMonomerLibBase} from '@datagrok-libraries/bio/src/types/index';
6
+ import {IMonomerLibBase, getMonomerLibHelper} from '@datagrok-libraries/bio/src/types/monomer-library';
8
7
  import {ISeqHelper, getSeqHelper} from '@datagrok-libraries/bio/src/utils/seq-helper';
9
8
 
10
9
  import {_package} from '../package';
@@ -3,12 +3,7 @@ import * as ui from 'datagrok-api/ui';
3
3
  import * as DG from 'datagrok-api/dg';
4
4
 
5
5
  import {UserLibSettings} from '@datagrok-libraries/bio/src/monomer-works/types';
6
- import {MonomerLibSummaryType} from '@datagrok-libraries/bio/src/types/index';
7
-
8
- export const LIB_PATH = 'System:AppData/Bio/monomer-libraries/';
9
- export const SETS_PATH: string = 'System:AppData/Bio/monomer-sets/';
10
-
11
- export const HELM_JSON_SCHEMA_PATH = 'System:AppData/Bio/tests/libraries/HELMmonomerSchema.json';
6
+ import {MonomerLibSummaryType} from '@datagrok-libraries/bio/src/types/monomer-library';
12
7
 
13
8
  export const LIB_SETTINGS_FOR_TESTS: UserLibSettings =
14
9
  {explicit: ['HELMCoreLibrary.json', 'polytool-lib.json'], exclude: [], duplicateMonomerPreferences: {}};