@datagrok/peptides 1.17.3 → 1.17.5

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.
@@ -19,6 +19,7 @@ export enum SETTINGS_PANES {
19
19
  VIEWERS = 'Viewers',
20
20
  COLUMNS = 'Columns',
21
21
  SEQUENCE_SPACE = 'Sequence space',
22
+ MCL = 'MCL',
22
23
  }
23
24
 
24
25
  export enum GENERAL_INPUTS {
@@ -44,12 +45,22 @@ export enum SEQUENCE_SPACE_INPUTS {
44
45
  FINGERPRINT_TYPE = 'Fingerprint type',
45
46
  }
46
47
 
48
+ export enum MCL_INPUTS {
49
+ DISTANCE_FUNCTION = 'Distance function',
50
+ GAP_OPEN = 'Gap open penalty',
51
+ GAP_EXTEND = 'Gap extend penalty',
52
+ FINGERPRINT_TYPE = 'Fingerprint type',
53
+ THRESHOLD = 'Similarity threshold',
54
+ MAX_ITERATIONS = 'Max iterations',
55
+ }
56
+
47
57
 
48
58
  export const PANES_INPUTS = {
49
59
  [SETTINGS_PANES.GENERAL]: GENERAL_INPUTS,
50
60
  [SETTINGS_PANES.VIEWERS]: VIEWERS_INPUTS,
51
61
  [SETTINGS_PANES.COLUMNS]: COLUMNS_INPUTS,
52
62
  [SETTINGS_PANES.SEQUENCE_SPACE]: SEQUENCE_SPACE_INPUTS,
63
+ [SETTINGS_PANES.MCL]: MCL_INPUTS,
53
64
  };
54
65
 
55
66
  /**
@@ -69,7 +80,7 @@ export function getSettingsDialog(model: PeptidesModel): SettingsElements {
69
80
  const result: type.PartialPeptidesSettings = {};
70
81
  const inputs: PaneInputs = {};
71
82
  const seqSpaceParams = settings?.sequenceSpaceParams ?? new type.SequenceSpaceParams();
72
-
83
+ const mclParams = settings?.mclSettings ?? new type.MCLSettings();
73
84
  // General pane options
74
85
  const activityCol = ui.columnInput(GENERAL_INPUTS.ACTIVITY, model.df,
75
86
  model.df.getCol(model.settings!.activityColumnName!), () => result.activityColumnName = activityCol.value!.name,
@@ -102,10 +113,23 @@ export function getSettingsDialog(model: PeptidesModel): SettingsElements {
102
113
  const isDendrogramEnabled = wu(model.analysisView.viewers).some((v) => v.type === VIEWER_TYPE.DENDROGRAM);
103
114
  const dendrogram = ui.boolInput(VIEWER_TYPE.DENDROGRAM, isDendrogramEnabled ?? false,
104
115
  () => result.showDendrogram = dendrogram.value) as DG.InputBase<boolean>;
116
+ const showSeqSpace = ui.boolInput('Sequence space', !!settings?.showSequenceSpace, () => {
117
+ result.showSequenceSpace = showSeqSpace.value ?? undefined;
118
+ if (showSeqSpace.value) {
119
+ seqSpacePane.root.style.display = 'flex';
120
+ if (!settings?.showSequenceSpace)
121
+ result.sequenceSpaceParams = seqSpaceParams;
122
+ } else {
123
+ seqSpacePane.root.style.display = 'none';
124
+ delete result.sequenceSpaceParams;
125
+ }
126
+ if (result.showSequenceSpace === settings?.showSequenceSpace)
127
+ delete result.showSequenceSpace;
128
+ });
105
129
  dendrogram.setTooltip('Show dendrogram viewer');
106
130
  dendrogram.enabled = getTreeHelperInstance() !== null;
107
131
 
108
- accordion.addPane(SETTINGS_PANES.VIEWERS, () => ui.inputs([dendrogram]), true);
132
+ accordion.addPane(SETTINGS_PANES.VIEWERS, () => ui.inputs([dendrogram, showSeqSpace]), true);
109
133
  inputs[SETTINGS_PANES.VIEWERS] = [dendrogram];
110
134
 
111
135
  // Columns to include pane options
@@ -182,7 +206,7 @@ export function getSettingsDialog(model: PeptidesModel): SettingsElements {
182
206
  input.root.style.display = 'none';
183
207
  });
184
208
  }
185
-
209
+ // SEQ SPACE INPUTS
186
210
  const distanceFunctionInput = ui.choiceInput(SEQUENCE_SPACE_INPUTS.DISTANCE_FUNCTION, seqSpaceParams.distanceF,
187
211
  [distFNames.NEEDLEMANN_WUNSCH, distFNames.HAMMING, distFNames.LEVENSHTEIN, distFNames.MONOMER_CHEMICAL_DISTANCE],
188
212
  () => onSeqSpaceParamsChange('distanceF', distanceFunctionInput.value));
@@ -203,7 +227,8 @@ export function getSettingsDialog(model: PeptidesModel): SettingsElements {
203
227
  () => onSeqSpaceParamsChange('minPts', minPtsInput.value));
204
228
  minPtsInput.setTooltip('Minimum number of points in a cluster');
205
229
  const fingerprintTypesInput = ui.choiceInput('Fingerprint type', seqSpaceParams.fingerprintType,
206
- ['Morgan', 'RDKit', 'Pattern'], () => onSeqSpaceParamsChange('fingerprintType', fingerprintTypesInput.value));
230
+ ['Morgan', 'RDKit', 'Pattern', 'AtomPair', 'MACCS', 'TopologicalTorsion'],
231
+ () => onSeqSpaceParamsChange('fingerprintType', fingerprintTypesInput.value));
207
232
  function correctSeqSpaceInputs(): void {
208
233
  toggleInputs([gapOpenInput, gapExtendInput], distanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);
209
234
  toggleInputs([epsilonInput, minPtsInput], clusterEmbeddingsInput.value === true);
@@ -212,14 +237,70 @@ export function getSettingsDialog(model: PeptidesModel): SettingsElements {
212
237
  distanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);
213
238
  }
214
239
  correctSeqSpaceInputs();
240
+ // END OF SEQ SPACE INPUTS
241
+
242
+ //MCL INPUTS
243
+
244
+ const modifiedMCLParams: Partial<type.MCLSettings> = {};
245
+ function onMCLParamsChange(fieldName: keyof type.MCLSettings, value: any): void {
246
+ correctMCLInputs();
247
+ //correctSeqSpaceInputs();
248
+ if (value === null || value === undefined || value === '')
249
+ return;
250
+ modifiedMCLParams[fieldName] = value;
251
+ let isAllSame = true;
252
+ for (const [key, val] of Object.entries(modifiedMCLParams)) {
253
+ if (val !== mclParams[key as keyof type.MCLSettings]) {
254
+ isAllSame = false;
255
+ break;
256
+ }
257
+ }
258
+ if (isAllSame)
259
+ delete result.mclSettings;
260
+ else
261
+ result.mclSettings = {...mclParams, ...modifiedMCLParams};
262
+ }
263
+
264
+ function correctMCLInputs(): void {
265
+ toggleInputs([mclGapOpenInput, mclGapExtendInput], mclDistanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);
266
+ toggleInputs([mclFingerprintTypesInput],
267
+ mclDistanceFunctionInput.value === distFNames.MONOMER_CHEMICAL_DISTANCE ||
268
+ mclDistanceFunctionInput.value === distFNames.NEEDLEMANN_WUNSCH);
269
+ }
270
+
271
+ const mclDistanceFunctionInput = ui.choiceInput(SEQUENCE_SPACE_INPUTS.DISTANCE_FUNCTION, mclParams.distanceF,
272
+ [distFNames.NEEDLEMANN_WUNSCH, distFNames.MONOMER_CHEMICAL_DISTANCE, distFNames.HAMMING, distFNames.LEVENSHTEIN],
273
+ () => onMCLParamsChange('distanceF', mclDistanceFunctionInput.value));
274
+ const mclGapOpenInput = ui.floatInput(SEQUENCE_SPACE_INPUTS.GAP_OPEN, mclParams.gapOpen,
275
+ () => onMCLParamsChange('gapOpen', mclGapOpenInput.value));
276
+ const mclGapExtendInput = ui.floatInput(SEQUENCE_SPACE_INPUTS.GAP_EXTEND, mclParams.gapExtend,
277
+ () => onMCLParamsChange('gapExtend', mclGapExtendInput.value));
278
+ const mclFingerprintTypesInput = ui.choiceInput('Fingerprint type', mclParams.fingerprintType,
279
+ ['Morgan', 'RDKit', 'Pattern', 'AtomPair', 'MACCS', 'TopologicalTorsion'],
280
+ () => onMCLParamsChange('fingerprintType', mclFingerprintTypesInput.value));
281
+ const mclThresholdInput = ui.intInput('Similarity threshold', mclParams.threshold ?? 80,
282
+ () => onMCLParamsChange('threshold', mclThresholdInput.value));
283
+ const mclMaxIterationsInput = ui.intInput('Max iterations', mclParams.maxIterations ?? 5,
284
+ () => onMCLParamsChange('maxIterations', mclMaxIterationsInput.value));
285
+ correctMCLInputs();
286
+
287
+ const mclInputs = [mclThresholdInput, mclDistanceFunctionInput, mclFingerprintTypesInput,
288
+ mclGapOpenInput, mclGapExtendInput, mclMaxIterationsInput];
289
+
290
+ accordion.addPane(SETTINGS_PANES.MCL, () => ui.inputs(mclInputs), true);
291
+ inputs[SETTINGS_PANES.MCL] = mclInputs;
292
+ // END OF MCL INPUTS
215
293
 
216
294
  const seqSpaceInputs = [distanceFunctionInput, fingerprintTypesInput, gapOpenInput,
217
295
  gapExtendInput, clusterEmbeddingsInput, epsilonInput, minPtsInput];
218
- accordion.addPane(SETTINGS_PANES.SEQUENCE_SPACE, () => ui.inputs(seqSpaceInputs), true);
296
+ const seqSpacePane = accordion.addPane(SETTINGS_PANES.SEQUENCE_SPACE, () => ui.inputs(seqSpaceInputs), true);
219
297
  inputs[SETTINGS_PANES.SEQUENCE_SPACE] = seqSpaceInputs;
298
+ showSeqSpace.fireChanged();
220
299
  const dialog = ui.dialog('Peptides settings').add(accordion);
221
300
  dialog.root.style.width = '400px';
222
- dialog.onOK(() => model.settings = result);
301
+ dialog.onOK(() => {
302
+ model.settings = result;
303
+ });
223
304
  dialog.show();
224
305
 
225
306
  return {dialog, accordion, inputs};
package/webpack.config.js CHANGED
@@ -29,7 +29,7 @@ module.exports = {
29
29
  ],
30
30
  },
31
31
  resolve: {
32
- extensions: ['.mjs', '.js', '.json', '.ts', '.tsx'],
32
+ extensions: ['.mjs', '.ts', '.js', '.json', '.tsx'],
33
33
  },
34
34
  devtool: 'inline-source-map',
35
35
  externals: {