@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.
- package/CHANGELOG.md +5 -1
- package/dist/23.js +2 -0
- package/dist/282.js +2 -0
- package/dist/301.js +2 -0
- package/dist/40.js +2 -0
- package/dist/427.js +2 -0
- package/dist/997.js +2 -0
- package/dist/package-test.js +2 -2
- package/dist/package.js +2 -2
- package/package.json +2 -2
- package/src/model.ts +127 -30
- package/src/package-test.ts +4 -0
- package/src/tests/core.ts +13 -23
- package/src/tests/viewers.ts +2 -1
- package/src/tests/widgets.ts +4 -2
- package/src/utils/cell-renderer.ts +6 -2
- package/src/utils/misc.ts +12 -0
- package/src/utils/types.ts +11 -0
- package/src/viewers/sar-viewer.ts +12 -3
- package/src/widgets/peptides.ts +29 -4
- package/src/widgets/settings.ts +87 -6
- package/webpack.config.js +1 -1
- package/dist/214.js +0 -2
- package/dist/802.js +0 -2
- package/src/utils/distance-matrix.worker.ts +0 -16
- package/src/utils/worker-creator.ts +0 -16
package/src/widgets/settings.ts
CHANGED
|
@@ -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'
|
|
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(() =>
|
|
301
|
+
dialog.onOK(() => {
|
|
302
|
+
model.settings = result;
|
|
303
|
+
});
|
|
223
304
|
dialog.show();
|
|
224
305
|
|
|
225
306
|
return {dialog, accordion, inputs};
|