@datagrok/bio 2.19.0 → 2.20.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 (39) hide show
  1. package/README.md +2 -2
  2. package/dist/242.js +1 -1
  3. package/dist/242.js.map +1 -1
  4. package/dist/284.js +1 -1
  5. package/dist/284.js.map +1 -1
  6. package/dist/589.js +1 -1
  7. package/dist/589.js.map +1 -1
  8. package/dist/731.js +1 -1
  9. package/dist/731.js.map +1 -1
  10. package/dist/810.js +2 -0
  11. package/dist/810.js.map +1 -0
  12. package/dist/980.js +1 -1
  13. package/dist/980.js.map +1 -1
  14. package/dist/package-test.js +2 -2
  15. package/dist/package-test.js.map +1 -1
  16. package/dist/package.js +3 -3
  17. package/dist/package.js.map +1 -1
  18. package/dockerfiles/container.json +1 -1
  19. package/files/samples/HELM_BI_CYCLIC.csv +7 -0
  20. package/files/samples/peptides-non-natural.csv +1001 -0
  21. package/package.json +6 -6
  22. package/projects/seq_space_demo.zip +0 -0
  23. package/src/analysis/sequence-diversity-viewer.ts +22 -14
  24. package/src/analysis/sequence-search-base-viewer.ts +6 -72
  25. package/src/analysis/sequence-similarity-viewer.ts +42 -23
  26. package/src/demo/bio01-similarity-diversity.ts +21 -2
  27. package/src/demo/bio01a-hierarchical-clustering-and-sequence-space.ts +7 -0
  28. package/src/demo/bio01b-hierarchical-clustering-and-activity-cliffs.ts +1 -1
  29. package/src/demo/bio03-atomic-level.ts +15 -0
  30. package/src/package.ts +9 -31
  31. package/src/tests/activity-cliffs-utils.ts +7 -6
  32. package/src/tests/similarity-diversity-tests.ts +2 -2
  33. package/src/utils/cell-renderer.ts +11 -1
  34. package/src/utils/helm-to-molfile/converter/monomer-wrapper.ts +8 -4
  35. package/src/utils/pepsea.ts +22 -39
  36. package/src/utils/seq-helper/seq-helper.ts +14 -34
  37. package/src/utils/ui-utils.ts +23 -0
  38. package/test-console-output-1.log +0 -7396
  39. package/test-record-1.mp4 +0 -0
@@ -7,7 +7,7 @@ import {Subject} from 'rxjs';
7
7
 
8
8
  import {testEvent} from '@datagrok-libraries/utils/src/test';
9
9
  import {NOTATION, TAGS as bioTAGS, ALIGNMENT, ALPHABET} from '@datagrok-libraries/bio/src/utils/macromolecule';
10
- import { fetchWrapper } from '@datagrok-libraries/utils/src/fetch-utils';
10
+ import {fetchWrapper} from '@datagrok-libraries/utils/src/fetch-utils';
11
11
  import {ILogger} from '@datagrok-libraries/bio/src/utils/logger';
12
12
 
13
13
  import {checkForSingleSeqClusters} from './multiple-sequence-alignment';
@@ -108,50 +108,33 @@ async function requestAlignedObjects(
108
108
  body: JSON.stringify(body),
109
109
  };
110
110
  const path = `/align?method=${method}&gap_open=${gapOpen}&gap_extend=${gapExtend}`;
111
- let responseObj: any;
112
- if ('fetchProxy' in grok.dapi.docker.dockerContainers) {
113
- // new dockerContainers API
114
- const t1: number = window.performance.now();
115
- // @ts-ignore
116
- const response: Response = await grok.dapi.docker.dockerContainers.fetchProxy(dockerfileId, path, params);
117
- const t2: number = window.performance.now();
118
- _package.logger.debug(`Bio: requestAlignedObjects() dockerContainers.fetchProxy(), ET: ${(t2 - t1)} ms`);
119
- const responseContentType = response.headers.get('content-type');
120
- const isJson: boolean = responseContentType === 'application/json';
121
- if (!response.ok && isJson) {
122
- const responseJson = await response.json();
123
- const pepseaErrorMsg = responseJson['pepsea-error'];
124
- if (!!pepseaErrorMsg)
125
- throw new Error(`PepSeA error: ${pepseaErrorMsg}`);
126
-
127
- const datagrokErrorMsg = responseJson['datagrok-error'];
128
- if (!!datagrokErrorMsg)
129
- throw new Error(`Datagrok error: ${datagrokErrorMsg}`);
130
-
131
- throw new Error(response.statusText);
132
- } else if (!response.ok && !isJson) {
133
- const responseStr = await response.text();
134
- throw new Error(`Error: ${responseStr}`);
135
- } else if (!isJson) {
136
- const responseStr = await response.text();
137
- throw new Error(`Error: PepSeA expected JSON response, got '${responseStr}'.`);
138
- }
139
- responseObj = await response.json();
140
- } else {
141
- // @ts-ignore
142
- const responseStr = await grok.dapi.docker.dockerContainers.request(dockerfileId, path, params)!;
143
- if (!responseStr)
144
- throw new Error('Empty response');
145
- responseObj = JSON.parse(responseStr);
146
-
147
- const pepseaErrorMsg = responseObj['pepsea-error'];
111
+ // new dockerContainers API
112
+ const t1: number = window.performance.now();
113
+ // @ts-ignore
114
+ const response: Response = await grok.dapi.docker.dockerContainers.fetchProxy(dockerfileId, path, params);
115
+ const t2: number = window.performance.now();
116
+ _package.logger.debug(`Bio: requestAlignedObjects() dockerContainers.fetchProxy(), ET: ${(t2 - t1)} ms`);
117
+ const responseContentType = response.headers.get('content-type');
118
+ const isJson: boolean = responseContentType === 'application/json';
119
+ if (!response.ok && isJson) {
120
+ const responseJson = await response.json();
121
+ const pepseaErrorMsg = responseJson['pepsea-error'];
148
122
  if (!!pepseaErrorMsg)
149
123
  throw new Error(`PepSeA error: ${pepseaErrorMsg}`);
150
124
 
151
- const datagrokErrorMsg = responseObj['datagrok-error'];
125
+ const datagrokErrorMsg = responseJson['datagrok-error'];
152
126
  if (!!datagrokErrorMsg)
153
127
  throw new Error(`Datagrok error: ${datagrokErrorMsg}`);
128
+
129
+ throw new Error(response.statusText);
130
+ } else if (!response.ok && !isJson) {
131
+ const responseStr = await response.text();
132
+ throw new Error(`Error: ${responseStr}`);
133
+ } else if (!isJson) {
134
+ const responseStr = await response.text();
135
+ throw new Error(`Error: PepSeA expected JSON response, got '${responseStr}'.`);
154
136
  }
137
+ const responseObj = await response.json();
155
138
  // Check for pepsea stderr output
156
139
  if ('pepsea-stderr' in responseObj) {
157
140
  const pepseaStdErr: string = responseObj['pepsea-stderr'] as string;
@@ -86,43 +86,23 @@ export class SeqHelper implements ISeqHelper {
86
86
 
87
87
  const converter = await this.getHelmToMolfileConverter(monomerLib);
88
88
 
89
- // //#region From HelmToMolfileConverter.convertToRdKitBeautifiedMolfileColumn
90
-
91
- // const molfilesV3K = converter.convertToMolfileV3K(helmCol.toList());
92
-
93
- // const beautifiedMolList: (RDMol | null)[] = molfilesV3K.map((item) => {
94
- // const molfile = item.molfile;
95
- // if (molfile === '')
96
- // return null;
97
- // const mol = this.rdKitModule.get_mol(molfile);
98
- // if (!mol)
99
- // return null;
100
- // mol.set_new_coords();
101
- // mol.normalize_depiction(1);
102
- // mol.straighten_depiction(true);
103
- // return mol;
104
- // });
105
-
106
- // let molList: string[];
107
- // if (chiralityEngine)// also creates progress indicator
108
- // molList = converter.getMolV3000ViaOCL(beautifiedMolList, molColName).toList();
109
- // // TODO: Cleanup mol objects
110
- // else {
111
- // molList = beautifiedMolList.map((mol) => {
112
- // if (mol === null)
113
- // return '';
114
- // const molBlock = mol.get_v3Kmolblock();
115
- // mol!.delete();
116
- // return molBlock;
117
- // });
118
- // }
119
-
120
89
  //#endregion From HelmToMolfileConverter
121
90
  const helmList = helmCol.toList();
122
91
  const molList = new Array<string>(helmCol.length);
123
- for (let i = 0; i < helmCol.length; i++)
124
- molList[i] = (await this.helmToAtomicLevelSingle(helmList[i], converter, chiralityEngine)).molfile;
125
-
92
+ const beautifyMolsChemFunc = DG.Func.find({package: 'Chem', name: 'beautifyMols'})[0];
93
+ // both options set to false, ugly molfiles
94
+ for (let i = 0; i < helmCol.length; i++) {
95
+ molList[i] = (this.helmToAtomicLevelSingle(helmList[i], converter,
96
+ chiralityEngine, !beautifyMolsChemFunc)).molfile;
97
+ }
98
+ // need to beautify the molfiles
99
+ if (beautifyMolsChemFunc) {
100
+ const beautifiedMols = await beautifyMolsChemFunc.apply({mols: molList});
101
+ if (beautifiedMols && Array.isArray(beautifiedMols) && beautifiedMols.length === helmCol.length) {
102
+ for (let i = 0; i < helmCol.length; i++)
103
+ beautifiedMols[i] && (molList[i] = beautifiedMols[i]);
104
+ }
105
+ }
126
106
  //const molHlList = molfilesV3K.map((item: MolfileWithMap) => getMolHighlight(item.monomers.values(), monomerLib));
127
107
 
128
108
  const molCol = DG.Column.fromStrings(molColName, molList);
@@ -14,3 +14,26 @@ export function updateDivInnerHTML(div: HTMLElement, content: string | Node): vo
14
14
  div.innerHTML = '';
15
15
  div.append(content);
16
16
  }
17
+
18
+ export function adjustGridcolAfterRender(
19
+ grid: DG.Grid, colName: string, width: number, rowHeight?: number, dontWait?: boolean
20
+ ) {
21
+ const update = () => {
22
+ const col = grid.col(colName);
23
+ if (col)
24
+ col.width = width;
25
+ if (rowHeight)
26
+ grid.props.rowHeight = rowHeight;
27
+ };
28
+ if (dontWait) {
29
+ update();
30
+ return;
31
+ }
32
+
33
+ const sub = grid.onAfterDrawOverlay.subscribe(() => {
34
+ sub.unsubscribe();
35
+ setTimeout(() => {
36
+ update();
37
+ });
38
+ });
39
+ }