@datagrok/peptides 1.3.7 → 1.3.9

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.
@@ -1,41 +1,53 @@
1
1
  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
- import * as bio from '@datagrok-libraries/bio';
5
4
 
6
5
  import '../styles.css';
7
6
  import * as C from '../utils/constants';
8
7
  import {PeptidesModel} from '../model';
9
8
  import $ from 'cash-dom';
10
9
  import {scaleActivity} from '../utils/misc';
10
+ import {WebLogoViewer} from '@datagrok-libraries/bio';
11
11
 
12
12
  /** Peptide analysis widget.
13
13
  *
14
14
  * @param {DG.DataFrame} df Working table
15
15
  * @param {DG.Column} col Aligned sequence column
16
16
  * @return {Promise<DG.Widget>} Widget containing peptide analysis */
17
- export async function analyzePeptidesWidget(df: DG.DataFrame, col: DG.Column): Promise<DG.Widget> {
18
- if (!col.tags['aligned']?.includes('MSA') && col.tags[DG.TAGS.UNITS].toLowerCase() != 'helm')
19
- return new DG.Widget(ui.divText('Peptides analysis only works with aligned sequences'));
17
+ export async function analyzePeptidesUI(df: DG.DataFrame, col?: DG.Column<string>):
18
+ Promise<{host: HTMLElement, callback: () => Promise<void>}> {
19
+ let seqColInput: DG.InputBase | null = null;
20
+ if (typeof col === 'undefined') {
21
+ const sequenceColumns = df.columns.toList().filter((dfCol) => dfCol.semType === DG.SEMTYPE.MACROMOLECULE);
22
+ let potentialCol = DG.Utils.firstOrNull(sequenceColumns);
23
+ if (potentialCol === null)
24
+ throw new Error('Peptides Error: table doesn\'t contain sequence columns');
25
+ seqColInput = ui.columnInput('Sequence', df, potentialCol, () => {
26
+ const seqCol = seqColInput!.value;
27
+ if (!seqCol.tags['aligned']?.includes('MSA') && seqCol.tags[DG.TAGS.UNITS].toLowerCase() !== 'helm')
28
+ grok.shell.warning('Peptides analysis only works with aligned sequences');
29
+ });
30
+ } else if (!col.tags['aligned']?.includes('MSA') && col.tags[DG.TAGS.UNITS].toLowerCase() !== 'helm')
31
+ return {host: ui.label('Peptides analysis only works with aligned sequences'), callback: async () => {}};
20
32
 
21
33
  let funcs = DG.Func.find({package: 'Bio', name: 'webLogoViewer'});
22
34
  if (funcs.length == 0)
23
- return new DG.Widget(ui.label('Bio package is missing or out of date. Please install the latest version.'));
35
+ return {host: ui.label('Bio package is missing or out of date. Please install the latest version.'), callback: async () => {}};
24
36
 
25
- funcs = DG.Func.find({package: 'Helm', name: 'getMonomerLib'});
37
+ funcs = DG.Func.find({package: 'Bio', name: 'getBioLib'});
26
38
  if (funcs.length == 0)
27
- return new DG.Widget(ui.label('Helm package is missing or out of date. Please install the latest version.'));
39
+ return {host: ui.label('Bio package is missing or out of date. Please install the latest version.'), callback: async () => {}};
28
40
 
29
41
  let scaledCol: DG.Column<number>;
30
42
 
31
43
  const defaultActivityColumn: DG.Column<number> | null =
32
- df.col('activity') || df.col('IC50') || DG.Utils.firstOrNull(df.columns.numerical);;
44
+ df.col('activity') || df.col('IC50') || DG.Utils.firstOrNull(df.columns.numerical); ;
33
45
  const histogramHost = ui.div([], {id: 'pep-hist-host'});
34
46
 
35
47
  const activityScalingMethod = ui.choiceInput(
36
48
  'Scaling', 'none', ['none', 'lg', '-lg'],
37
49
  async (currentMethod: string): Promise<void> => {
38
- scaledCol = scaleActivity(currentMethod, activityColumnChoice.value!);
50
+ scaledCol = scaleActivity(activityColumnChoice.value!, currentMethod);
39
51
 
40
52
  const hist = DG.DataFrame.fromColumns([scaledCol]).plot.histogram({
41
53
  filteringEnabled: false,
@@ -62,37 +74,48 @@ export async function analyzePeptidesWidget(df: DG.DataFrame, col: DG.Column): P
62
74
  activityScalingMethod.fireChanged();
63
75
 
64
76
  const inputsList = [activityColumnChoice, activityScalingMethod, clustersColumnChoice];
77
+ if (seqColInput !== null)
78
+ inputsList.splice(0, 0, seqColInput);
65
79
 
66
80
  const bitsetChanged = df.filter.onChanged.subscribe(() => {
67
81
  activityScalingMethodState();
68
- })
82
+ });
69
83
 
70
- const startBtn = ui.button('Launch SAR', async () => {
71
- await startAnalysis(activityColumnChoice.value!, col, clustersColumnChoice.value, df, scaledCol,
72
- activityScalingMethod.value ?? 'none');
84
+ const startAnalysisCallback = async () => {
85
+ const sequencesCol = col ?? seqColInput!.value;
86
+ if (sequencesCol)
87
+ await startAnalysis(activityColumnChoice.value!, sequencesCol, clustersColumnChoice.value, df, scaledCol,
88
+ activityScalingMethod.value ?? 'none');
73
89
  bitsetChanged.unsubscribe();
74
- });
75
- startBtn.style.alignSelf = 'center';
90
+ };
91
+
92
+ const inputElements: HTMLElement[] = [ui.inputs(inputsList)];
93
+ $(inputElements[0]).find('label').css('width', 'unset');
94
+ if (typeof col !== 'undefined') {
95
+ const startBtn = ui.button('Launch SAR', startAnalysisCallback);
96
+ startBtn.style.alignSelf = 'center';
97
+ inputElements.push(startBtn);
98
+ }
76
99
 
77
- const viewer = await df.plot.fromType('WebLogo') as bio.WebLogoViewer;
100
+ const viewer = await df.plot.fromType('WebLogo') as WebLogoViewer;
78
101
  viewer.root.style.setProperty('height', '130px');
79
102
  const logoHost = ui.div();
80
103
  $(logoHost).empty().append(viewer.root);
81
104
 
82
- return new DG.Widget(
83
- ui.divV([
84
- logoHost,
85
- ui.splitH([
86
- ui.splitV([ui.inputs(inputsList), startBtn]),
87
- histogramHost,
88
- ], {style: {height: '215px'}}),
89
- ]),
90
- );
105
+ const mainHost = ui.divV([
106
+ logoHost,
107
+ ui.splitH([
108
+ ui.splitV(inputElements),
109
+ histogramHost,
110
+ ], {style: {height: '215px'}}),
111
+ ]);
112
+ mainHost.style.maxWidth = '400px';
113
+ return {host: mainHost, callback: startAnalysisCallback};
91
114
  }
92
115
 
93
116
  export async function startAnalysis(activityColumn: DG.Column<number>, peptidesCol: DG.Column<string>,
94
117
  clustersColumn: DG.Column | null, currentDf: DG.DataFrame, scaledCol: DG.Column<number>, scaling: string,
95
- ): Promise<PeptidesModel | null> {
118
+ ): Promise<PeptidesModel | null> {
96
119
  const progress = DG.TaskBarProgressIndicator.create('Loading SAR...');
97
120
  let model = null;
98
121
  if (activityColumn.type === DG.TYPE.FLOAT || activityColumn.type === DG.TYPE.INT) {
@@ -112,9 +135,9 @@ export async function startAnalysis(activityColumn: DG.Column<number>, peptidesC
112
135
  newDf.name = 'Peptides analysis';
113
136
  if (clustersColumn) {
114
137
  newDf.getCol(clustersColumn.name).name = C.COLUMNS_NAMES.CLUSTERS;
115
- newDf.tags[C.TAGS.CLUSTERS] = C.COLUMNS_NAMES.CLUSTERS;
138
+ newDf.setTag(C.TAGS.CLUSTERS, C.COLUMNS_NAMES.CLUSTERS);
116
139
  }
117
- newDf.tags['scaling'] = scaling;
140
+ newDf.setTag('settings', JSON.stringify({scaling: scaling}));
118
141
 
119
142
  let monomerType = 'HELM_AA';
120
143
  if (peptidesCol.getTag(DG.TAGS.UNITS).toLowerCase() == 'helm') {
@@ -126,6 +149,7 @@ export async function startAnalysis(activityColumn: DG.Column<number>, peptidesC
126
149
  }
127
150
 
128
151
  newDf.setTag('monomerType', monomerType);
152
+ newDf.setTag('newAnalysis', '1');
129
153
  model = await PeptidesModel.getInstance(newDf);
130
154
  } else
131
155
  grok.shell.error('The activity column must be of numeric type!');
@@ -0,0 +1,67 @@
1
+ import * as ui from 'datagrok-api/ui';
2
+ import * as grok from 'datagrok-api/grok';
3
+ import * as DG from 'datagrok-api/dg';
4
+
5
+ import * as type from '../utils/types';
6
+ import {PeptidesModel} from '../model';
7
+
8
+ import $ from 'cash-dom';
9
+ import wu from 'wu';
10
+
11
+ //TODO: show sliderInput values
12
+ export function getSettingsDialog(model: PeptidesModel): DG.Dialog {
13
+ const accordion = ui.accordion();
14
+ const settings = model.settings;
15
+ const result: type.PeptidesSettings = {columns: {}};
16
+ const activityScaling = ui.choiceInput('Activity scaling', settings.scaling ?? 'none', ['none', 'lg', '-lg'],
17
+ () => result.scaling = activityScaling.value! as type.ScalingMethods);
18
+ const bidirectionalAnalysis = ui.boolInput('Bidirectional analysis', settings.isBidirectional ?? false,
19
+ () => result.isBidirectional = bidirectionalAnalysis.value!);
20
+ accordion.addPane('General', () => ui.inputs([activityScaling, bidirectionalAnalysis]), true);
21
+
22
+ const maxMutations = ui.sliderInput('Max mutations', settings.maxMutations ?? 1, 0, 50, () => {
23
+ const val = Math.round(maxMutations.value!);
24
+ $(maxMutations.root).find('label.ui-input-description').remove();
25
+ result.maxMutations = val;
26
+ maxMutations.addPostfix(val.toString());
27
+ });
28
+ maxMutations.addPostfix((settings.maxMutations ?? 1).toString());
29
+ const minActivityDelta = ui.sliderInput('Min activity delta', settings.minActivityDelta ?? 0, 0, 100, () => {
30
+ const val = Math.round(minActivityDelta.value!);
31
+ result.minActivityDelta = val;
32
+ $(minActivityDelta.root).find('label.ui-input-description').remove();
33
+ minActivityDelta.addPostfix(val.toString());
34
+ });
35
+ minActivityDelta.addPostfix((settings.minActivityDelta ?? 0).toString());
36
+ accordion.addPane('Mutation Cliffs', () => ui.inputs([maxMutations, minActivityDelta]), true);
37
+
38
+ const inputsRows: HTMLElement[] = [];
39
+ for (const col of model.df.columns.numerical) {
40
+ const isIncluded = ui.boolInput('', typeof (settings.columns ?? {})[col.name] !== 'undefined',
41
+ () => {
42
+ if (isIncluded)
43
+ result.columns![col.name] = aggregation.stringValue;
44
+ else
45
+ delete result.columns![col.name];
46
+ }) as DG.InputBase<boolean>;
47
+ const aggregation = ui.choiceInput('Aggregation', (settings.columns ?? {})[col.name] ?? 'avg', Object.values(DG.STATS),
48
+ () => {
49
+ if (isIncluded)
50
+ result.columns![col.name] = aggregation.stringValue;
51
+ else
52
+ delete result.columns![col.name];
53
+ }) as DG.InputBase<string>;
54
+ $(aggregation.root).find('label').css('width', 'auto');
55
+ const inputsRow = ui.inputsRow(col.name, [isIncluded, aggregation]);
56
+ $(inputsRow).find('div.ui-div').css('display', 'inline-flex');
57
+ inputsRows.push(inputsRow);
58
+ }
59
+ accordion.addPane('Columns to include', () => ui.divV(inputsRows), false);
60
+
61
+ const dialog = ui.dialog('Peptides settings').add(accordion);
62
+ dialog.root.style.width = '400px';
63
+ dialog.onOK(() => model.settings = result);
64
+ dialog.show();
65
+
66
+ return dialog.show();
67
+ }
@@ -0,0 +1,276 @@
1
+ <html><head><meta charset="utf-8"/><title>Peptides Test Report. Datagrok version datagrok/datagrok:latest SHA=62cc009524f3. Commit 0949dc07.</title><style type="text/css">html,
2
+ body {
3
+ font-family: Arial, Helvetica, sans-serif;
4
+ font-size: 1rem;
5
+ margin: 0;
6
+ padding: 0;
7
+ color: #333;
8
+ }
9
+ body {
10
+ padding: 2rem 1rem;
11
+ font-size: 0.85rem;
12
+ }
13
+ #jesthtml-content {
14
+ margin: 0 auto;
15
+ max-width: 70rem;
16
+ }
17
+ header {
18
+ display: flex;
19
+ align-items: center;
20
+ }
21
+ #title {
22
+ margin: 0;
23
+ flex-grow: 1;
24
+ }
25
+ #logo {
26
+ height: 4rem;
27
+ }
28
+ #timestamp {
29
+ color: #777;
30
+ margin-top: 0.5rem;
31
+ }
32
+
33
+ /** SUMMARY */
34
+ #summary {
35
+ color: #333;
36
+ margin: 2rem 0;
37
+ display: flex;
38
+ font-family: monospace;
39
+ font-size: 1rem;
40
+ }
41
+ #summary > div {
42
+ margin-right: 2rem;
43
+ background: #eee;
44
+ padding: 1rem;
45
+ min-width: 15rem;
46
+ }
47
+ #summary > div:last-child {
48
+ margin-right: 0;
49
+ }
50
+ @media only screen and (max-width: 720px) {
51
+ #summary {
52
+ flex-direction: column;
53
+ }
54
+ #summary > div {
55
+ margin-right: 0;
56
+ margin-top: 2rem;
57
+ }
58
+ #summary > div:first-child {
59
+ margin-top: 0;
60
+ }
61
+ }
62
+
63
+ .summary-total {
64
+ font-weight: bold;
65
+ margin-bottom: 0.5rem;
66
+ }
67
+ .summary-passed {
68
+ color: #4f8a10;
69
+ border-left: 0.4rem solid #4f8a10;
70
+ padding-left: 0.5rem;
71
+ }
72
+ .summary-failed,
73
+ .summary-obsolete-snapshots {
74
+ color: #d8000c;
75
+ border-left: 0.4rem solid #d8000c;
76
+ padding-left: 0.5rem;
77
+ }
78
+ .summary-pending {
79
+ color: #9f6000;
80
+ border-left: 0.4rem solid #9f6000;
81
+ padding-left: 0.5rem;
82
+ }
83
+ .summary-empty {
84
+ color: #999;
85
+ border-left: 0.4rem solid #999;
86
+ }
87
+
88
+ .test-result {
89
+ padding: 1rem;
90
+ margin-bottom: 0.25rem;
91
+ }
92
+ .test-result:last-child {
93
+ border: 0;
94
+ }
95
+ .test-result.passed {
96
+ background-color: #dff2bf;
97
+ color: #4f8a10;
98
+ }
99
+ .test-result.failed {
100
+ background-color: #ffbaba;
101
+ color: #d8000c;
102
+ }
103
+ .test-result.pending {
104
+ background-color: #ffdf61;
105
+ color: #9f6000;
106
+ }
107
+
108
+ .test-info {
109
+ display: flex;
110
+ justify-content: space-between;
111
+ }
112
+ .test-suitename {
113
+ width: 20%;
114
+ text-align: left;
115
+ font-weight: bold;
116
+ word-break: break-word;
117
+ }
118
+ .test-title {
119
+ width: 40%;
120
+ text-align: left;
121
+ font-style: italic;
122
+ }
123
+ .test-status {
124
+ width: 20%;
125
+ text-align: right;
126
+ }
127
+ .test-duration {
128
+ width: 10%;
129
+ text-align: right;
130
+ font-size: 0.75rem;
131
+ }
132
+
133
+ .failureMessages {
134
+ padding: 0 1rem;
135
+ margin-top: 1rem;
136
+ border-top: 1px dashed #d8000c;
137
+ }
138
+ .failureMessages.suiteFailure {
139
+ border-top: none;
140
+ }
141
+ .failureMsg {
142
+ white-space: pre-wrap;
143
+ white-space: -moz-pre-wrap;
144
+ white-space: -pre-wrap;
145
+ white-space: -o-pre-wrap;
146
+ word-wrap: break-word;
147
+ }
148
+
149
+ .suite-container {
150
+ margin-bottom: 2rem;
151
+ }
152
+ .suite-info {
153
+ padding: 1rem;
154
+ background-color: #eee;
155
+ color: #777;
156
+ display: flex;
157
+ align-items: center;
158
+ margin-bottom: 0.25rem;
159
+ }
160
+ .suite-info .suite-path {
161
+ word-break: break-all;
162
+ flex-grow: 1;
163
+ font-family: monospace;
164
+ font-size: 1rem;
165
+ }
166
+ .suite-info .suite-time {
167
+ margin-left: 0.5rem;
168
+ padding: 0.2rem 0.3rem;
169
+ font-size: 0.75rem;
170
+ }
171
+ .suite-info .suite-time.warn {
172
+ background-color: #d8000c;
173
+ color: #fff;
174
+ }
175
+
176
+ /* CONSOLE LOGS */
177
+ .suite-consolelog {
178
+ margin-bottom: 0.25rem;
179
+ padding: 1rem;
180
+ background-color: #efefef;
181
+ }
182
+ .suite-consolelog-header {
183
+ font-weight: bold;
184
+ }
185
+ .suite-consolelog-item {
186
+ padding: 0.5rem;
187
+ }
188
+ .suite-consolelog-item pre {
189
+ margin: 0.5rem 0;
190
+ white-space: pre-wrap;
191
+ white-space: -moz-pre-wrap;
192
+ white-space: -pre-wrap;
193
+ white-space: -o-pre-wrap;
194
+ word-wrap: break-word;
195
+ }
196
+ .suite-consolelog-item-origin {
197
+ color: #777;
198
+ font-weight: bold;
199
+ }
200
+ .suite-consolelog-item-message {
201
+ color: #000;
202
+ font-size: 1rem;
203
+ padding: 0 0.5rem;
204
+ }
205
+
206
+ /* OBSOLETE SNAPSHOTS */
207
+ .suite-obsolete-snapshots {
208
+ margin-bottom: 0.25rem;
209
+ padding: 1rem;
210
+ background-color: #ffbaba;
211
+ color: #d8000c;
212
+ }
213
+ .suite-obsolete-snapshots-header {
214
+ font-weight: bold;
215
+ }
216
+ .suite-obsolete-snapshots-item {
217
+ padding: 0.5rem;
218
+ }
219
+ .suite-obsolete-snapshots-item pre {
220
+ margin: 0.5rem 0;
221
+ white-space: pre-wrap;
222
+ white-space: -moz-pre-wrap;
223
+ white-space: -pre-wrap;
224
+ white-space: -o-pre-wrap;
225
+ word-wrap: break-word;
226
+ }
227
+ .suite-obsolete-snapshots-item-message {
228
+ color: #000;
229
+ font-size: 1rem;
230
+ padding: 0 0.5rem;
231
+ }
232
+ </style></head><body><div id="jesthtml-content"><header><h1 id="title">Peptides Test Report. Datagrok version datagrok/datagrok:latest SHA=62cc009524f3. Commit 0949dc07.</h1></header><div id="metadata-container"><div id="timestamp">Started: 2022-11-11 14:09:20</div><div id="summary"><div id="suite-summary"><div class="summary-total">Suites (1)</div><div class="summary-passed summary-empty">0 passed</div><div class="summary-failed">1 failed</div><div class="summary-pending summary-empty">0 pending</div></div><div id="test-summary"><div class="summary-total">Tests (1)</div><div class="summary-passed summary-empty">0 passed</div><div class="summary-failed">1 failed</div><div class="summary-pending summary-empty">0 pending</div></div></div></div><div id="suite-1" class="suite-container"><div class="suite-info"><div class="suite-path">/home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts</div><div class="suite-time warn">96.038s</div></div><div class="suite-tests"><div class="test-result failed"><div class="test-info"><div class="test-suitename"> </div><div class="test-title">TEST</div><div class="test-status">failed</div><div class="test-duration">82.695s</div></div><div class="failureMessages"> <pre class="failureMsg">Error: Test result : Failed : 329 : Peptides.Core.Start analysis: сomplex : Error: For column 'macromolecule' of alphabet 'UN' tag '.alphabetSize' is mandatory.
233
+
234
+ at /home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:68:20
235
+ at Generator.next (&lt;anonymous&gt;)
236
+ at fulfilled (/home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:31:58)
237
+ at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre></div></div></div><div class="suite-consolelog"><div class="suite-consolelog-header">Console Log</div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/Peptides/src/__jest__/test-node.ts:62:11)
238
+ at Generator.next (&lt;anonymous&gt;)
239
+ at fulfilled (/home/runner/work/public/public/packages/Peptides/src/__jest__/test-node.ts:28:58)
240
+ at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Using web root: http://localhost:8080</pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:40:11
241
+ at Generator.next (&lt;anonymous&gt;)
242
+ at /home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:34:71
243
+ at new Promise (&lt;anonymous&gt;)
244
+ at Object.&lt;anonymous&gt;.__awaiter (/home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:30:12)
245
+ at Object.&lt;anonymous&gt; (/home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:38:23)
246
+ at Promise.then.completed (/home/runner/work/public/public/packages/Peptides/node_modules/jest-circus/build/utils.js:391:28)
247
+ at new Promise (&lt;anonymous&gt;)</pre><pre class="suite-consolelog-item-message">Testing Peptides package</pre></div><div class="suite-consolelog-item"><pre class="suite-consolelog-item-origin"> at /home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:66:11
248
+ at Generator.next (&lt;anonymous&gt;)
249
+ at fulfilled (/home/runner/work/public/public/packages/Peptides/src/__jest__/remote.test.ts:31:58)
250
+ at processTicksAndRejections (internal/process/task_queues.js:97:5)</pre><pre class="suite-consolelog-item-message">Test result : Success : 4295 : Peptides.Core.Start analysis: simple : OK
251
+ Test result : Success : 7421 : Peptides.Core.Save and load project : OK
252
+ Test result : Success : 0 : Peptides.Peptide space.test_table.is_not_empty : OK
253
+ Test result : Success : 2686 : Peptides.Peptide space.PeptideSimilaritySpaceWidget.is_drawing : OK
254
+ Test result : Success : 2 : Peptides.Peptide space.test_deminsionality_reducer : OK
255
+ Test result : Success : 0 : Peptides.Peptide space.test_peptide_similarity_space_viewer : OK
256
+ Test result : Success : 2238 : Peptides.Peptide space.peptide_space.DimensinalityReducer.UMAP.Levenshtein.is_numeric : OK
257
+ Test result : Success : 2625 : Peptides.Peptide space.peptide_space.DimensinalityReducer.UMAP.Jaro-Winkler.is_numeric : OK
258
+ Test result : Success : 3350 : Peptides.Peptide space.peptide_space.DimensinalityReducer.t-SNE.Levenshtein.is_numeric : OK
259
+ Test result : Success : 3819 : Peptides.Peptide space.peptide_space.DimensinalityReducer.t-SNE.Jaro-Winkler.is_numeric : OK
260
+ Test result : Success : 208 : Peptides.Peptide space.peptide_space.DimensinalityReducer.SPE.Levenshtein.is_numeric : OK
261
+ Test result : Success : 594 : Peptides.Peptide space.peptide_space.DimensinalityReducer.SPE.Jaro-Winkler.is_numeric : OK
262
+ Test result : Success : 171 : Peptides.Peptide space.peptide_space.DimensinalityReducer.pSPE.Levenshtein.is_numeric : OK
263
+ Test result : Success : 556 : Peptides.Peptide space.peptide_space.DimensinalityReducer.pSPE.Jaro-Winkler.is_numeric : OK
264
+ Test result : Success : 8614 : Peptides.Peptide space.peptide_space.DimensinalityReducer.OriginalSPE.Levenshtein.is_numeric : OK
265
+ Test result : Success : 9838 : Peptides.Peptide space.peptide_space.DimensinalityReducer.OriginalSPE.Jaro-Winkler.is_numeric : OK
266
+ Test result : Success : 2113 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.UMAP.Levenshtein.is_proper : OK
267
+ Test result : Success : 2618 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.UMAP.Jaro-Winkler.is_proper : OK
268
+ Test result : Success : 3392 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.t-SNE.Levenshtein.is_proper : OK
269
+ Test result : Success : 3850 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.t-SNE.Jaro-Winkler.is_proper : OK
270
+ Test result : Success : 232 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.SPE.Levenshtein.is_proper : OK
271
+ Test result : Success : 818 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.SPE.Jaro-Winkler.is_proper : OK
272
+ Test result : Success : 193 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.pSPE.Levenshtein.is_proper : OK
273
+ Test result : Success : 587 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.pSPE.Jaro-Winkler.is_proper : OK
274
+ Test result : Success : 8223 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.OriginalSPE.Levenshtein.is_proper : OK
275
+ Test result : Success : 9416 : Peptides.Peptide space.peptide_space.PeptideSimilaritySpaceViewer.OriginalSPE.Jaro-Winkler.is_proper : OK
276
+ </pre></div></div></div></div></body></html>