@datagrok/bio 2.11.40 → 2.11.41

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/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "name": "Leonid Stolbov",
6
6
  "email": "lstolbov@datagrok.ai"
7
7
  },
8
- "version": "2.11.40",
8
+ "version": "2.11.41",
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",
@@ -1,11 +1,11 @@
1
1
  /* Do not change these import lines to match external modules in webpack configuration */
2
2
  import * as grok from 'datagrok-api/grok';
3
- import * as ui from 'datagrok-api/ui';
4
3
  import * as DG from 'datagrok-api/dg';
4
+ import * as OCL from 'openchemlib/full';
5
5
 
6
6
  import {MolfileHandler} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler';
7
7
  import {MolfileHandlerBase} from '@datagrok-libraries/chem-meta/src/parsing-utils/molfile-handler-base';
8
- import {RDModule} from '@datagrok-libraries/chem-meta/src/rdkit-api';
8
+ import {RDModule, RDMol} from '@datagrok-libraries/chem-meta/src/rdkit-api';
9
9
  import {HELM_POLYMER_TYPE, HELM_RGROUP_FIELDS} from '@datagrok-libraries/bio/src/utils/const';
10
10
  import {errInfo} from '@datagrok-libraries/bio/src/utils/err-info';
11
11
 
@@ -51,10 +51,10 @@ export async function helm2mol(df: DG.DataFrame, helmCol: DG.Column<string>): Pr
51
51
 
52
52
  /** Translate HELM column into molfile column and append to the dataframe */
53
53
  export async function getMolColumnFromHelm(
54
- df: DG.DataFrame, helmCol: DG.Column<string>
54
+ df: DG.DataFrame, helmCol: DG.Column<string>, chiralityEngine?: boolean
55
55
  ): Promise<DG.Column<string>> {
56
56
  const converter = new HelmToMolfileConverter(helmCol, df);
57
- const molCol = await converter.convertToRdKitBeautifiedMolfileColumn();
57
+ const molCol = await converter.convertToRdKitBeautifiedMolfileColumn(chiralityEngine);
58
58
  molCol.semType = DG.SEMTYPE.MOLECULE;
59
59
  return molCol;
60
60
  }
@@ -89,7 +89,28 @@ export class HelmToMolfileConverter {
89
89
  return smiles;
90
90
  }
91
91
 
92
- async convertToRdKitBeautifiedMolfileColumn(): Promise<DG.Column<string>> {
92
+ async getMolV3000ViaOCL(beautifiedMols: (RDMol | null)[], columnName: string) {
93
+ const beautifiedMolV2000 = beautifiedMols.map((mol) => {
94
+ if (mol === null)
95
+ return '';
96
+ const molBlock = mol.get_molblock();
97
+ mol!.delete();
98
+ return molBlock;
99
+ });
100
+ const molv3000Arr = new Array<string>(beautifiedMolV2000.length);
101
+ const chiralityPb = DG.TaskBarProgressIndicator.create(`Handling chirality...`);
102
+ for (let i = 0; i < beautifiedMolV2000.length; i++) {
103
+ const oclMolecule = OCL.Molecule.fromMolfile(beautifiedMolV2000[i]);
104
+ const molV3000 = oclMolecule.toMolfileV3();
105
+ molv3000Arr[i] = molV3000.replace('STERAC1', 'STEABS');
106
+ const progress = i/beautifiedMolV2000.length*100;
107
+ chiralityPb.update(progress, `${progress?.toFixed(2)}% of molecules completed`);
108
+ }
109
+ chiralityPb.close();
110
+ return DG.Column.fromStrings(columnName, molv3000Arr);
111
+ }
112
+
113
+ async convertToRdKitBeautifiedMolfileColumn(chiralityEngine?: boolean): Promise<DG.Column<string>> {
93
114
  const smiles = await this.getSmilesList();
94
115
  const rdKitModule: RDModule = await grok.functions.call('Chem:getRdKitModule');
95
116
  const beautifiedMols = smiles.map((item) =>{
@@ -103,13 +124,16 @@ export class HelmToMolfileConverter {
103
124
  return mol;
104
125
  });
105
126
  const columnName = this.df.columns.getUnusedName(`molfile(${this.helmColumn.name})`);
127
+
128
+ if (chiralityEngine)
129
+ return await this.getMolV3000ViaOCL(beautifiedMols, columnName);
106
130
  return DG.Column.fromStrings(columnName, beautifiedMols.map((mol) => {
107
131
  if (mol === null)
108
132
  return '';
109
133
  const molBlock = mol.get_v3Kmolblock();
110
134
  mol!.delete();
111
135
  return molBlock;
112
- }));
136
+ }));
113
137
  }
114
138
 
115
139
  async convertToMolfileV2KColumn(): Promise<DG.Column<string>> {
@@ -221,7 +221,7 @@ function getHelmCycle(helm: string, source: ConnectionData): string {
221
221
  }
222
222
 
223
223
  export async function addTransformedColumn(
224
- molColumn: DG.Column<string>, addHelm: boolean, ruleFiles: string[]
224
+ molColumn: DG.Column<string>, addHelm: boolean, ruleFiles: string[], chiralityEngine?: boolean
225
225
  ): Promise<void> {
226
226
  const df = molColumn.dataFrame;
227
227
  const uh = UnitsHandler.getOrCreate(molColumn);
@@ -243,7 +243,7 @@ export async function addTransformedColumn(
243
243
  addCommonTags(targetHelmCol);
244
244
  targetHelmCol.setTag('units', NOTATION.HELM);
245
245
 
246
- const molCol = await getMolColumnFromHelm(df, targetHelmCol);
246
+ const molCol = await getMolColumnFromHelm(df, targetHelmCol, chiralityEngine);
247
247
  molCol.name = df.columns.getUnusedName('molfile(' + molColumn.name + ')');
248
248
 
249
249
  if (addHelm) {
@@ -121,10 +121,12 @@ export class PolyTool {
121
121
  const addButton = this.getAddButton();
122
122
  this.ruleFilesInputs = ui.div(await this.getRuleFilesBlock());
123
123
  //const rulesFiles = ui.div(this.ruleFilesInputs);
124
+ const chiralityEngineInput = ui.boolInput('Chirality engine', false);
124
125
 
125
126
  const div = ui.div([
126
127
  targetColumnInput,
127
128
  generateHelmChoiceInput,
129
+ chiralityEngineInput,
128
130
  'Rules used',
129
131
  this.ruleFilesInputs,
130
132
  addButton
@@ -138,7 +140,7 @@ export class PolyTool {
138
140
  grok.shell.warning('No marcomolecule column chosen!');
139
141
  return;
140
142
  }
141
- addTransformedColumn(molCol!, generateHelmChoiceInput.value!, this.userRuleSettings.included);
143
+ addTransformedColumn(molCol!, generateHelmChoiceInput.value!, this.userRuleSettings.included, chiralityEngineInput.value!);
142
144
  });
143
145
 
144
146
  return this.dialog;