comparison table_compute.xml @ 0:1b0f96ed73f2 draft

"planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/table_compute commit 1ee75135483d5db22c540bc043746cd986f85762"
author iuc
date Sat, 17 Aug 2019 16:25:37 -0400
parents
children dddadbbac949
comparison
equal deleted inserted replaced
-1:000000000000 0:1b0f96ed73f2
1 <tool id="table_compute" name="Table Compute" version="@VERSION@">
2 <description>computes operations on table data</description>
3 <macros>
4 <token name="@VERSION@">0.8</token>
5 <token name="@COPEN@"><![CDATA[<code>]]></token>
6 <token name="@CCLOSE@"><![CDATA[</code>]]></token>
7 <import>allowed_functions.xml</import>
8 <!-- text field validators -->
9 <macro name="validator_text" >
10 <validator type="regex" message="No special characters allowed">^(?:\w+)?$</validator>
11 <sanitizer sanitize="false" />
12 </macro>
13 <macro name="validator_text_required" >
14 <validator type="regex" message="No special characters allowed">^(?:\w+)?$</validator>
15 <validator type="empty_field" />
16 </macro>
17 <macro name="validator_index_identifiers" >
18 <validator type="regex" message="Specify a comma-separated list of index names without special characters">^(?:\w+(?:, *\w+)*)?$</validator>
19 <sanitizer sanitize="false" />
20 </macro>
21 <macro name="validator_index_ranges">
22 <validator type="regex" message="Specify a comma-separated list index numbers or ranges">^(?:\d+(?::\d)*(?:, *\d+(?::\d)*)*)?$</validator>
23 <sanitizer sanitize="false" />
24 </macro>
25 <macro name="validator_functiondef">
26 <validator type="regex" message="An expression is required and is allowed to contain only letters, numbers and the characters '_ !-+=/*%.&lt;&gt;()'">^[\w !\-+=/*%,.&lt;&gt;()]+$</validator>
27 <sanitizer sanitize="false" />
28 </macro>
29 <!-- macro for main input tests -->
30 <macro name="test_inputs_single" >
31 <conditional name="singtabop" >
32 <param name="use_type" value="single" />
33 <param name="input" value="small.tsv" />
34 <conditional name="user" >
35 <yield />
36 </conditional>
37 </conditional>
38 </macro>
39 <!-- macro for umi to transcript tests -->
40 <macro name="umi2trans" >
41 <yield />
42 <conditional name="user" >
43 <param name="mode" value="element" />
44 <param name="element_op" value="gt" />
45 <param name="element_value" value="0" />
46 <conditional name="element" >
47 <param name="mode" value="custom" />
48 <param name="custom_expr" value="-math.log(1 - elem/4096) * 4096 if elem != 4096 else elem - 0.5" />
49 </conditional>
50 </conditional>
51 </macro>
52 <!-- macro for file inputs -->
53 <macro name="file_opts">
54 <param name="input" type="data" format="tsv,tabular" label="Table" />
55 <param name="col_row_names" type="select" display="checkboxes" multiple="true" optional="true"
56 label="This input data has">
57 <option value="has_col_names" selected="true">Column names on the first row</option>
58 <option value="has_row_names" selected="true">Row names on the first column"</option>
59 </param>
60 </macro>
61 <!-- element value macro -->
62 <macro name="elem_val_macro" >
63 <param name="element_value" type="text" optional="true" label="Filter value" help="This value is converted to numeric if possible, otherwise it is treated as a string" />
64 </macro>
65 </macros>
66 <requirements>
67 <requirement type="package" version="0.25">pandas</requirement>
68 <requirement type="package" version="1.17">numpy</requirement>
69 </requirements>
70
71 <version_command><![CDATA[
72 touch '$__tool_directory__/scripts/userconfig.py' && python '$__tool_directory__/scripts/table_compute.py' --version
73 ]]></version_command>
74
75 <command detect_errors="exit_code"><![CDATA[
76 ## Can only import generated userconfig.py if calling
77 ## script is in the same directory. Soft-linking does
78 ## not satisfy importing, so we copy everything.
79 cp '$userconf' ./userconfig.py &&
80 cp '$__tool_directory__/scripts/safety.py' ./safety.py &&
81 cp '$__tool_directory__/scripts/table_compute.py' ./table_compute.py &&
82 python ./table_compute.py
83 ]]></command>
84 <configfiles>
85 <configfile name="userconf"><![CDATA[
86
87 ## Range Maker
88 ## "2:5,11,1:2" specifies "2,3,4,5,11,1,2" which in python is "1,2,3,4,10,0,1"
89 #def rangemake(tab):
90 #echo [(n-1) for r in map(lambda y: range(int(y[0]),int(y[-1])+1), map(lambda x: x.split(':'), tab.split(','))) for n in r]
91 #end def
92
93 ## Strip leading and trailing whitespace off custom functions
94
95 Default = {
96 "reader_skip": 0,
97 "precision": $precision,
98 #if 'ignore_nas' in str($out_opts):
99 "narm": True,
100 #else:
101 "narm": False,
102 #end if
103 #if 'output_headers_row' in str($out_opts):
104 "out_headers_row": True,
105 #else:
106 "out_headers_row": False,
107 #end if
108 #if 'output_headers_col' in str($out_opts):
109 "out_headers_col": True,
110 #else:
111 "out_headers_col": False,
112 #end if
113 "user_mode": '$singtabop.use_type',
114 "outtable": '$table'
115 }
116
117 #if str($singtabop.use_type) == "single":
118 Data = {
119 "tables": [
120 {
121 "reader_file": '$singtabop.input',
122 #if 'has_col_names' in str($singtabop.col_row_names):
123 "reader_header": 0,
124 #else:
125 "reader_header": None,
126 #end if
127 #if 'has_row_names' in str($singtabop.col_row_names):
128 "reader_row_col": 0,
129 #else:
130 "reader_row_col": False,
131 #end if
132 }
133 ],
134 "params": {
135 "user_mode_single": '$singtabop.user.mode.value',
136 #if $singtabop.user.mode.value == 'precision':
137 ## Literally do nothing, the user just sets the precision slider
138 ## at the top default level
139 }
140 #elif $singtabop.user.mode.value == 'select':
141 "select_cols_unique": #echo 'select_cols_keepdupe' in str($singtabop.user.select_keepdupe)#,
142 "select_rows_unique": #echo 'select_rows_keepdupe' in str($singtabop.user.select_keepdupe)#,
143 #if $singtabop.user.select_cols_wanted:
144 "select_cols_wanted": $rangemake(str($singtabop.user.select_cols_wanted)),
145 #else
146 "select_cols_wanted": None,
147 #end if
148 #if $singtabop.user.select_rows_wanted:
149 "select_rows_wanted": $rangemake(str($singtabop.user.select_rows_wanted)),
150 #else
151 "select_rows_wanted": None,
152 #end if
153 }
154 #elif $singtabop.user.mode.value == 'filtersumval':
155 "filtersumval_mode": '$singtabop.user.filtersumval_mode.use.value',
156 "filtersumval_axis": $singtabop.user.axis.value,
157 #if $singtabop.user.filtersumval_mode.use.value == 'operation':
158 "filtersumval_compare": '$singtabop.user.filtersumval_mode.compare_op.value',
159 "filtersumval_op": '$singtabop.user.filtersumval_mode.operation.value',
160 "filtersumval_against": $singtabop.user.filtersumval_mode.against,
161 "filtersumval_minmatch": None,
162 #elif $singtabop.user.filtersumval_mode.use.value == 'element':
163 "filtersumval_compare": None,
164 "filtersumval_op": '$singtabop.user.filtersumval_mode.operation.value',
165 ## against could be string or float, so we parse this in the code
166 "filtersumval_against": '$singtabop.user.filtersumval_mode.against',
167 "filtersumval_minmatch": $singtabop.user.filtersumval_mode.minmatch,
168 #end if
169 }
170 #elif $singtabop.user.mode.value == 'matrixapply':
171 "matrixapply_dimension": $singtabop.user.dimension.value,
172 #if str($singtabop.user.matrixapply_func.vector_op) == 'custom':
173 #set $custom_func = str($singtabop.user.matrixapply_func.custom_func).strip()
174 "matrixapply_custom": True,
175 "matrixapply_custom_func": '$custom_func',
176 "matrixapply_op": None,
177 #else
178 "matrixapply_custom": False,
179 "matrixapply_custom_func": None,
180 "matrixapply_op": '$singtabop.user.matrixapply_func.vector_op',
181 #end if
182 }
183 #elif $singtabop.user.mode.value == 'element':
184 #if str($singtabop.user.elem_val.element_op) != "None":
185 "element_op": '$singtabop.user.elem_val.element_op.value',
186 ## Value is string or float, parsed in code later
187 "element_value" : '$singtabop.user.elem_val.element_value',
188 #else:
189 "element_op": None,
190 #end if
191 "element_mode": '$singtabop.user.element.mode.value',
192 #if str($singtabop.user.element.mode) == "replace":
193 "element_replace": '$singtabop.user.element.replace_value.value',
194 #elif str($singtabop.user.element.mode) == "modify":
195 "element_modify_op": '$singtabop.user.element.modify_op.value',
196 #elif str($singtabop.user.element.mode) == "scale":
197 "element_scale_op": '$singtabop.user.element.scale_op.value',
198 "element_scale_value": $singtabop.user.element.scale_value,
199 #elif str($singtabop.user.element.mode) == "custom":
200 #set $custom_func = str($singtabop.user.element.custom_expr).strip()
201 "element_customop": '$custom_func',
202 #end if
203 }
204 #elif $singtabop.user.mode.value == 'fulltable':
205 "mode": '$singtabop.user.general.use',
206 #if str($singtabop.user.general.use) == 'melt':
207 #if str($singtabop.user.general.id_vars).strip():
208 #set $melt_ids = [i.strip() for i in str($singtabop.user.general.id_vars).split(',')]
209 #else
210 #set $melt_ids = 'None'
211 #end if
212 #if str($singtabop.user.general.value_vars).strip():
213 #set $melt_values = [i.strip() for i in str($singtabop.user.general.value_vars).split(',')]
214 #else
215 #set $melt_values = 'None'
216 #end if
217 "MELT": {
218 "melt_ids": $melt_ids,
219 "melt_values": $melt_values,
220 },
221 #elif str($singtabop.user.general.use) == 'pivot':
222 #set $pivot_index = str($singtabop.user.general.index).strip()
223 #if $pivot_index:
224 #set $pivot_index = "'" + $pivot_index + "'"
225 #else:
226 #set $pivot_index = 'None'
227 #end if
228 #set $pivot_column = "'" + str($singtabop.user.general.column).strip() + "'"
229 #if str($singtabop.user.general.values).strip():
230 #set $pivot_values = [i.strip() for i in str($singtabop.user.general.values).split(',')]
231 #else
232 #set $pivot_values = 'None'
233 #end if
234 "PIVOT": {
235 "pivot_index": $pivot_index,
236 "pivot_column": $pivot_column,
237 "pivot_values": $pivot_values,
238 },
239 #elif str($singtabop.user.general.use) == 'custom':
240 #set $custom_func = str($singtabop.user.general.fulltable_custom_expr.value).strip()
241 "fulltable_customop": '$custom_func',
242
243 #end if
244 },
245 #end if
246 }
247
248 #elif str($singtabop.use_type) == "multiple":
249 #set $custom_func = str($singtabop.fulltable_custom_expr).strip()
250 Data = {
251 "tables": [
252 #for $i, $s in enumerate($singtabop.tables)
253 {
254 "file": '${s.input}',
255 #if 'has_col_names' in str($s.col_row_names):
256 "header": 0,
257 #else:
258 "header": None,
259 #end if
260 #if 'has_row_names' in str($s.col_row_names):
261 "row_names": 0,
262 #else:
263 "row_names": False,
264 #end if
265 },
266 #end for
267 ],
268 'params': {
269 "fulltable_customop" : '$custom_func',
270 }
271 }
272 #end if
273
274 ]]>
275 </configfile>
276 </configfiles>
277 <inputs>
278 <conditional name="singtabop" >
279 <param name="use_type" type="select" label="Input Single or Multiple Tables" help="Operations on single tables are better tailored towards more general use-cases. For multiple tables usage, all tables should ideally be of the same dimensions for simple operations, although complex operations are also supported for unequally sized tables (see Help section)." >
280 <option value="single">Single Table</option>
281 <option value="multiple">Multiple Tables</option>
282 </param>
283 <when value="single">
284 <expand macro="file_opts" />
285 <conditional name="user" >
286 <param name="mode" type="select" label="Type of table operation" >
287 <option value="precision">No operation (just reformat on output)</option>
288 <option value="select">Drop, keep or duplicate rows and columns</option>
289 <option value="filtersumval">Filter rows or columns by their properties</option>
290 <option value="matrixapply">Compute expression across rows or columns</option>
291 <option value="element">Manipulate selected table elements</option>
292 <option value="fulltable">Perform a full table operation</option>
293 </param>
294 <when value="precision" />
295 <when value="select">
296 <param name="select_cols_wanted" type="text" optional="true" label="List of columns to select" help="Comma separated. (e.g. @COPEN@3:5,99,2:4@CCLOSE@ will select columns @COPEN@3,4,5,99,2,3,4@CCLOSE@). Columns can be duplicated by specifying them multiple times. Leave blank to retain all columns. See Example #1 for an example of using this mode." >
297 <expand macro="validator_index_ranges" />
298 </param>
299 <param name="select_rows_wanted" type="text" optional="true" label="List of rows to select" help="The same rules apply as above" >
300 <expand macro="validator_index_ranges" />
301 </param>
302 <param name="select_keepdupe" type="select" display="checkboxes" multiple="true" label="Duplicate Indices" help="Keep duplicates when specifying ranges (e.g. if unset, @COPEN@1:3,2:4@CCLOSE@ will yield @COPEN@1,2,3,4@CCLOSE@ instead of @COPEN@1,2,3,2,3,4@CCLOSE@)" >
303 <option value="select_cols_keepdupe" selected="true" >Keep duplicate columns</option>
304 <option value="select_rows_keepdupe" selected="true" >Keep duplicate rows</option>
305 </param>
306 </when>
307 <when value="filtersumval" >
308 <param name="axis" type="select" display="radio"
309 label="Filter" >
310 <option value="1">Rows</option>
311 <option value="0">Columns</option>
312 </param>
313 <conditional name="filtersumval_mode" >
314 <param name="use" type="select" label="Filter criterion" help="See Example #2 for an example of using this mode." >
315 <option value="operation" >Result of function applied to columns/rows</option>
316 <option value="element" >Number of column/row elements passing filter</option>
317 </param>
318 <when value="operation">
319 <param name="operation" type="select" label="Keep column/row if its observed" >
320 <expand macro="select_vectorops" />
321 </param>
322 <param name="compare_op" type="select" label="is" >
323 <expand macro="select_twovaluebooleanops" />
324 </param>
325 <param name="against" type="float" label="this value" value="0" />
326 </when>
327 <when value="element">
328 <param name="minmatch" type="integer" min="1" value="0" label="Keep column/row if at least" />
329 <param name="operation" type="select" label="of its element are" >
330 <expand macro="select_twovaluebooleanops" >
331 <option value="str_eq" >~ (Matching)</option>
332 <option value="str_ne" >!~ (not Matching)</option>
333 </expand>
334 </param>
335 <param name="against" type="text" label="this value">
336 <expand macro="validator_functiondef" />
337 </param>
338 </when>
339 </conditional>
340 </when>
341 <when value="matrixapply" >
342 <conditional name="matrixapply_func">
343 <param name="vector_op" type="select" label="Calculate">
344 <option value="custom">Custom Function</option>
345 <expand macro="select_vectorops" >
346 <option value="rank">Ranks</option>
347 <option value="cumsum" >Cumulative Sum</option>
348 <option value="cumprod" >Cumulative Product</option>
349 <option value="cummin" >Cumulative Minimum</option>
350 <option value="cummax" >Cumulative Maximum</option>
351 </expand>
352 </param>
353 <when value="custom">
354 <param name="custom_func" type="text"
355 label="Custom function on 'vec'"
356 help="The parameter name is @COPEN@vec@CCLOSE@, referring to a vector of a specific row or column being operated on. Numpy and Pandas DataFrame operators are supported. e.g. @COPEN@np.sum(vec) + np.median(vec)@CCLOSE@, and @COPEN@vec.sum() + vec.median()@CCLOSE@ are equivalent operations." >
357 <expand macro="validator_functiondef" />
358 </param>
359 </when>
360 <when value="min" />
361 <when value="max" />
362 <when value="sum" />
363 <when value="count" />
364 <when value="nunique" />
365 <when value="mean" />
366 <when value="median" />
367 <when value="std" />
368 <when value="sem" />
369 <when value="var" />
370 <when value="mad" />
371 <when value="product" />
372 <when value="rank" />
373 <when value="cumsum" />
374 <when value="cumprod" />
375 <when value="cummin" />
376 <when value="cummax" />
377 </conditional>
378 <param name="dimension" type="select" label="For each">
379 <option value="0">Column</option>
380 <option value="1">Row</option>
381 </param>
382 </when>
383 <when value="fulltable">
384 <conditional name="general" >
385 <param name="use" type="select" label="Operation" help="See Examples 5, 7, and 8 for usage" >
386 <option value="melt" >Melt</option>
387 <option value="pivot" >Pivot</option>
388 <option value="custom" >Custom</option>
389 </param>
390 <when value="melt" >
391 <param name="id_vars" type="text" value="" label="Variable IDs"
392 help="Comma-delimited list of column names to use as identifiers" >
393 <expand macro="validator_index_identifiers" />
394 </param>
395 <param name="value_vars" type="text" value="" label="Unpivoted IDs"
396 help="Comma-delimited list of column names to un-pivot. Leave blank to use all." >
397 <expand macro="validator_index_identifiers" />
398 </param>
399 </when>
400 <when value="pivot" >
401 <param name="index" type="text" value=""
402 label="Index"
403 help="Name of the column to use as new index" >
404 <expand macro="validator_text" />
405 </param>
406 <param name="column" type="text" value=""
407 label="Column"
408 help="Name of the column to use to generate the columns of the new table from" >
409 <expand macro="validator_text_required" />
410 </param>
411 <param name="values" type="text" value=""
412 label="Values"
413 help="Names of the columns to use for populating the cells of the new table. Leave blank to use all." >
414 <expand macro="validator_index_identifiers" />
415 </param>
416 </when>
417 <when value="custom" >
418 <param name="fulltable_custom_expr" type="text"
419 label="Custom expression on 'table', along 'axis' (0 or 1)"
420 help="The parameter name is @COPEN@table@CCLOSE@ and @COPEN@axis@CCLOSE@, referring to the table being acted on and the column (@COPEN@0@CCLOSE@) or row (@COPEN@1@CCLOSE@) to perform the operation on. Numpy, math, Pandas DataFrame operators, and inline @COPEN@if else@CCLOSE@ are supported (e.g. @COPEN@np.log(table) - table.mean(0) / table.std(1)@CCLOSE@). See Example #5 in the Help section. ">
421 <expand macro="validator_functiondef" />
422 </param>
423 </when>
424 </conditional>
425 </when>
426 <when value="element">
427 <conditional name="element" >
428 <param name="mode" type="select"
429 label="Operation to perform" >
430 <option value="replace">Replace values</option>
431 <option value="modify">Transform</option>
432 <option value="scale">Arithmetic operation</option>
433 <option value="custom">Custom</option>
434 </param>
435 <when value="replace" >
436 <param name="replace_value" type="text" label="Replacement value" help="This value is converted to numeric if possible, otherwise it is treated as a string" />
437 </when>
438 <when value="modify" >
439 <param name="modify_op" type="select" label="Transformation function" help="Example: to transform values to their square root, select @COPEN@Square Root@CCLOSE@ here.">
440 <expand macro="select_onevalueoperator" />
441 </param>
442 </when>
443 <when value="scale">
444 <param name="scale_op" type="select" label="Operation" help="The selected operation will be applied to the table elements as the first operand. The value of the second operand can be provided in the next box. Example: to raise all values to the power of 5, select @COPEN@Power@CCLOSE@ here and type @COPEN@5@CCLOSE@ in the box below." >
445 <expand macro="select_twovaluenumericoperator" />
446 </param>
447 <param name="scale_value" type="float" value="0" label="Second operand value" />
448 </when>
449 <when value="custom">
450 <param name="custom_expr" type="text"
451 label="Custom expression on 'elem'"
452 help="The parameter name is @COPEN@elem@CCLOSE@, referring to the element being acted on. Most operators and @COPEN@if@CCLOSE@ @COPEN@else@CCLOSE@ statements are supported. See Examples #3 and #4 in the Help section.">
453 <expand macro="validator_functiondef" />
454 </param>
455 </when>
456 </conditional>
457 <conditional name="elem_val" >
458 <param name="element_op" type="select" label="Operate on elements"
459 help="Only selected elements will be manipulated. Other elements will retain their original value." >
460 <expand macro="select_twovaluebooleanops" >
461 <option value="None" selected="true">All</option>
462 </expand>
463 </param>
464 <when value="None" />
465 <when value="lt">
466 <expand macro="elem_val_macro" />
467 </when>
468 <when value="le">
469 <expand macro="elem_val_macro" />
470 </when>
471 <when value="gt">
472 <expand macro="elem_val_macro" />
473 </when>
474 <when value="ge">
475 <expand macro="elem_val_macro" />
476 </when>
477 <when value="eq">
478 <expand macro="elem_val_macro" />
479 </when>
480 <when value="ne">
481 <expand macro="elem_val_macro" />
482 </when>
483 </conditional>
484 </when>
485 </conditional>
486 </when>
487 <when value="multiple">
488 <repeat name="tables" title="Tables" min="1" default="1">
489 <expand macro="file_opts" />
490 </repeat>
491 <param name="fulltable_custom_expr" type="text"
492 label="Custom expression on 'tableN'"
493 help="The parameter name is @COPEN@tableN@CCLOSE@, where @COPEN@N@CCLOSE@ refers to a specific table. e.g. @COPEN@table1 + table3 - table2@CCLOSE@, will add the first and third input tables and then subtract the second. Most operators and @COPEN@if@CCLOSE@ @COPEN@else@CCLOSE@ statements are supported. See Example #6 in the Help section for further examples.">
494 <expand macro="validator_functiondef" />
495 </param>
496 </when>
497 </conditional>
498 <param name="out_opts" type="select" display="checkboxes" multiple="true" optional="true"
499 label="Output formatting options">
500 <option value="ignore_nas" selected="true">Ignore NA values</option>
501 <option value="output_headers_col" selected="true">Output column headers</option>
502 <option value="output_headers_row" selected="true">Output row headers</option>
503 </param>
504 <param name="precision" type="integer" min="0" max="20" value="6" label="Output decimal precision" />
505 </inputs>
506 <outputs>
507 <data name="table" format="tabular" label="${tool.name} on ${on_string}" />
508 </outputs>
509 <tests>
510 <test expect_num_outputs="1">
511 <!-- Test 1: Select -->
512 <expand macro="test_inputs_single" >
513 <param name="mode" value="select" />
514 <param name="select_cols_wanted" value="2:4,2,2" />
515 <param name="select_rows_wanted" value="2:5,3,3" />
516 <param name="select_keepdupe" value="select_cols_keepdupe" />
517 </expand>
518 <param name="precision" value="2" />
519 <output name="table" value="small.select.tsv" />
520 </test>
521 <test expect_num_outputs="1">
522 <!-- Test 2: Select, cols only -->
523 <expand macro="test_inputs_single" >
524 <param name="mode" value="select" />
525 <param name="select_cols_wanted" value="2:4,2,2" />
526 <param name="select_keepdupe" value="select_cols_keepdupe,select_rows_keepdupe" />
527 </expand>
528 <param name="precision" value="2" />
529 <output name="table" value="small.select.colsonly.tsv" />
530 </test>
531 <test expect_num_outputs="1">
532 <!-- Test 3: Select, rows only -->
533 <expand macro="test_inputs_single" >
534 <param name="mode" value="select" />
535 <param name="select_rows_wanted" value="2:5,3,3" />
536 <param name="select_keepdupe" value="select_cols_keepdupe" />
537 </expand>
538 <param name="precision" value="2" />
539 <output name="table" value="small.select.rowsonly.tsv" />
540 </test>
541 <test expect_num_outputs="1">
542 <!-- Test 4: Filtersumval, row -->
543 <expand macro="test_inputs_single" >
544 <param name="mode" value="filtersumval" />
545 <param name="axis" value="1" />
546 <conditional name="filtersumval_mode" >
547 <param name="use" value="operation" />
548 <param name="operation" value="sum" />
549 <param name="compare_op" value="gt" />
550 <param name="against" value="50" />
551 </conditional>
552 </expand>
553 <param name="precision" value="2" />
554 <output name="table" value="small.fs.rowsum.gt.50.tsv" />
555 </test>
556 <test expect_num_outputs="1">
557 <!-- Test 5: Filtersumval, col neq 0 -->
558 <expand macro="test_inputs_single" >
559 <param name="mode" value="filtersumval" />
560 <param name="axis" value="0" />
561 <conditional name="filtersumval_mode" >
562 <param name="use" value="operation" />
563 <param name="operation" value="sum" />
564 <param name="compare_op" value="ne" />
565 <param name="against" value="0" />
566 </conditional>
567 </expand>
568 <param name="precision" value="2" />
569 <output name="table" value="small.fs.colsum.neq0.tsv" />
570 </test>
571 <test expect_num_outputs="1">
572 <!-- Test 6: Filtersumval, col val gt 10 -->
573 <expand macro="test_inputs_single" >
574 <param name="mode" value="filtersumval" />
575 <param name="axis" value="0" />
576 <conditional name="filtersumval_mode" >
577 <param name="use" value="operation" />
578 <param name="operation" value="sum" />
579 <param name="compare_op" value="gt" />
580 <param name="against" value="10" />
581 </conditional>
582 </expand>
583 <param name="precision" value="2" />
584 <output name="table" value="small.fs.colsum.gt10.tsv" />
585 </test>
586 <test expect_num_outputs="1">
587 <!-- Test 7: Filtersumval, median val col >= 2 -->
588 <expand macro="test_inputs_single" >
589 <param name="mode" value="filtersumval" />
590 <param name="axis" value="0" />
591 <conditional name="filtersumval_mode" >
592 <param name="use" value="operation" />
593 <param name="operation" value="median" />
594 <param name="compare_op" value="ge" />
595 <param name="against" value="2" />
596 </conditional>
597 </expand>
598 <param name="precision" value="5" />
599 <output name="table" value="small.fs.medvalcol.ge2.tsv" />
600 </test>
601 <test expect_num_outputs="1">
602 <!-- Test 8: Filtersumval, keep rows with at least
603 two values > 2 -->
604 <expand macro="test_inputs_single" >
605 <param name="mode" value="filtersumval" />
606 <param name="axis" value="1" />
607 <conditional name="filtersumval_mode" >
608 <param name="use" value="element" />
609 <param name="operation" value="gt" />
610 <param name="against" value="2" />
611 <param name="minmatch" value="2" />
612 </conditional>
613 </expand>
614 <param name="precision" value="5" />
615 <output name="table" value="small.fs.elemgt2.mm2.tsv" />
616 </test>
617 <test expect_num_outputs="1">
618 <!-- Test 9: Filtersumval, keep cols with at least
619 4 string values matching "0" -->
620 <expand macro="test_inputs_single" >
621 <param name="mode" value="filtersumval" />
622 <param name="axis" value="0" />
623 <conditional name="filtersumval_mode" >
624 <param name="use" value="element" />
625 <param name="operation" value="str_ne" />
626 <param name="against" value="0" />
627 <param name="minmatch" value="4" />
628 </conditional>
629 </expand>
630 <param name="precision" value="3" />
631 <output name="table" value="small.fs.elemnmatch0.mm4.tsv" />
632 </test>
633 <test expect_num_outputs="1">
634 <!-- Test 10: Matrix Apply, row max -->
635 <expand macro="test_inputs_single" >
636 <param name="mode" value="matrixapply" />
637 <param name="dimension" value="1" />
638 <conditional name="matrixapply_func" >
639 <param name="vector_op" value="max" />
640 </conditional>
641 </expand>
642 <param name="precision" value="0" />
643 <param name="out_opts" value="ignore_nas,output_headers_row" />
644 <output name="table" value="small.matapp.rowmax.tsv" />
645 </test>
646 <test expect_num_outputs="1">
647 <!-- Test 11: Element, all, scale, remainder 5 -->
648 <expand macro="test_inputs_single" >
649 <param name="mode" value="element" />
650 <conditional name="elem_val">
651 <param name="element_op" value="None" />
652 </conditional>
653 <conditional name="element" >
654 <param name="mode" value="scale" />
655 <param name="scale_op" value="mod" />
656 <param name="scale_value" value="5" />
657 </conditional>
658 </expand>
659 <param name="precision" value="2" />
660 <output name="table" value="small.element.scalerem5.tsv" />
661 </test>
662 <test expect_num_outputs="1">
663 <!-- Test 12: Matrix Apply, column custom -->
664 <expand macro="test_inputs_single" >
665 <param name="mode" value="matrixapply" />
666 <param name="dimension" value="0" />
667 <conditional name="matrixapply_func" >
668 <param name="vector_op" value="custom" />
669 <param name="custom_func" value="vec.sum()+vec.median()" />
670 </conditional>
671 </expand>
672 <param name="precision" value="2" />
673 <param name="out_opts" value="ignore_nas,output_headers_row" />
674 <output name="table" value="small.matapp.colcust.tsv" />
675 </test>
676 <test expect_num_outputs="1">
677 <!-- Test 13: Element, non-zero, custom -->
678 <expand macro="test_inputs_single" >
679 <param name="mode" value="element" />
680 <conditional name="elem_val">
681 <param name="element_op" value="gt" />
682 <param name="element_value" value="0" />
683 </conditional>
684 <conditional name="element" >
685 <param name="mode" value="custom" />
686 <!-- valid complex expression for non-zero vals -->
687 <param name="custom_expr" value="(math.log10(elem)+elem)/elem if (elem &lt; math.inf) else 1.0" />
688 </conditional>
689 </expand>
690 <output name="table" value="small.element.custom.tsv" />
691 </test>
692 <test expect_num_outputs="1">
693 <!-- Test 14: umi2transcript test1 -->
694 <expand macro="umi2trans" >
695 <param name="input" value="mat1.umi.tsv" />
696 <output name="table" value="mat1.trans.tsv" />
697 </expand>
698 </test>
699 <test expect_num_outputs="1">
700 <!-- Test 15: umi2transcript test2 -->
701 <expand macro="umi2trans" >
702 <param name="input" value="mat2.umi.tsv" />
703 <output name="table" value="mat2.trans.tsv" />
704 </expand>
705 </test>
706 <test expect_num_outputs="1">
707 <!-- Test 16: B-test - mean and sd in custom func -->
708 <expand macro="test_inputs_single" >
709 <param name="mode" value="fulltable" />
710 <conditional name="general" >
711 <param name="use" value="custom" />
712 <param name="fulltable_custom_expr"
713 value="table - table.mean(0) / table.std(0)" />
714 </conditional>
715 </expand>
716 <output name="table" value="small.fulltable.tsv" />
717 </test>
718 <test expect_num_outputs="1">
719 <!-- Test 17: Multiple table test -->
720 <conditional name="singtabop" >
721 <param name="use_type" value="multiple" />
722 <repeat name="tables">
723 <param name="input" value="small.tsv" />
724 </repeat>
725 <repeat name="tables">
726 <param name="input" value="small.tsv" />
727 </repeat>
728 <repeat name="tables">
729 <param name="input" value="small.tsv" />
730 </repeat>
731 <param name="fulltable_custom_expr" value="(3 * table1) + np.log(table3 + 20) - table2" /> </conditional>
732 <output name="table" value="small.multiple.tsv" />
733 </test>
734 <!-- User tests that failed previously -->
735 <test expect_num_outputs="1">
736 <!-- Test 18 -->
737 <expand macro="test_inputs_single" >
738 <param name="mode" value="fulltable" />
739 <conditional name="general" >
740 <param name="use" value="custom" />
741 <param name="fulltable_custom_expr" value="table * 2" />
742 </conditional>
743 </expand>
744 <output name="table" >
745 <assert_contents>
746 <has_n_columns n="10" />
747 <has_line_matching expression="^gene1\s20\.000000\s0\s12\s-20\.200000\s20\s2\.200000\s0\.000000\s0\s0\.000000$" />
748 <has_line_matching expression="gene5\s2\.000000\s0\s0\s-20\.000000\s880\s12\.000000\s0\.000000\s0\s3\.800000" />
749 </assert_contents>
750 </output>
751 </test>
752 <test expect_num_outputs="1">
753 <!-- Test 19 -->
754 <expand macro="test_inputs_single" >
755 <param name="mode" value="fulltable" />
756 <conditional name="general" >
757 <param name="use" value="custom" />
758 <param name="fulltable_custom_expr" value="table == 5" />
759 </conditional>
760 </expand>
761 <output name="table" >
762 <assert_contents>
763 <has_n_columns n="10" />
764 <has_line_matching expression="^gene1(\sFalse)+$" />
765 <has_line_matching expression="gene5(\sFalse)+$" />
766 </assert_contents>
767 </output>
768 </test>
769 <test expect_num_outputs="1" expect_failure="true">
770 <!-- Test 20 -->
771 <expand macro="test_inputs_single" >
772 <param name="mode" value="fulltable" />
773 <conditional name="general" >
774 <param name="use" value="custom" />
775 <param name="fulltable_custom_expr" value="for n in table: n = n + 1" />
776 </conditional>
777 </expand>
778 </test>
779 <test expect_num_outputs="1" expect_failure="true">
780 <!-- Test 21 -->
781 <expand macro="test_inputs_single" >
782 <param name="mode" value="fulltable" />
783 <conditional name="general" >
784 <param name="use" value="custom" />
785 <param name="fulltable_custom_expr" value="table + table[0,0]" />
786 </conditional>
787 </expand>
788 </test>
789 <test expect_num_outputs="1">
790 <!-- Test 22: Melt -->
791 <expand macro="test_inputs_single" >
792 <param name="mode" value="fulltable" />
793 <conditional name="general" >
794 <param name="use" value="melt" />
795 <param name="id_vars" value="cell1,cell3" />
796 <param name="value_vars" value="cell5,cell6" />
797 </conditional>
798 </expand>
799 <param name="out_opts" value="ignore_nas,output_headers_col" />
800 <output name="table" >
801 <assert_contents>
802 <has_n_columns n="4" />
803 <has_line_matching expression="^cell1\scell3\svariable\svalue$" />
804 <has_line_matching expression="^1\.0+\s0+\scell6\s6\.0+$" />
805 </assert_contents>
806 </output>
807 </test>
808 <test expect_num_outputs="1">
809 <!-- Test 23: Pivot -->
810 <expand macro="test_inputs_single" >
811 <param name="mode" value="fulltable" />
812 <conditional name="general" >
813 <param name="use" value="pivot" />
814 <param name="index" value="cell1" />
815 <param name="column" value="cell2" />
816 <param name="values" value="cell3,cell7,cell9" />
817 </conditional>
818 </expand>
819 <output name="table" >
820 <assert_contents>
821 <has_n_columns n="4" />
822 <has_line_matching expression="^\scell3\scell7\scell9$" />
823 <has_line_matching expression="^1\.0+\s0\.0+\s0\.0+\s1\.90+$" />
824 <has_line_matching expression="^10\.0+\s6\.0+\s0\.0+\s0\.0+$" />
825 </assert_contents>
826 </output>
827 </test>
828 <!-- Add Example Text Tests -->
829 <test expect_num_outputs="1" >
830 <!-- Test 24: Ex 1 -->
831 <conditional name="singtabop" >
832 <param name="use_type" value="single" />
833 <param name="input" value="examples.1.tsv" />
834 <param name="col_row_names" value="has_col_names,has_row_names" />
835 <conditional name="user" >
836 <param name="mode" value="select" />
837 <param name="select_cols_wanted" value="1,1,3" />
838 <param name="select_rows_wanted" value="1:3,2" />
839 <param name="select_keepdupe" value="select_cols_keepdupe,select_rows_keepdupe" />
840 </conditional>
841 </conditional>
842 <output name="table" >
843 <assert_contents>
844 <has_n_columns n="4" />
845 <has_line_matching expression="^\s+c1\s+c1\s+c3$" />
846 <has_line_matching expression="^g2\s+3\s+3\s+9$" />
847 </assert_contents>
848 </output>
849 </test>
850 <test expect_num_outputs="1" >
851 <!-- Test 25: Ex 2 -->
852 <conditional name="singtabop" >
853 <param name="use_type" value="single" />
854 <param name="input" value="examples.2.tsv" />
855 <param name="col_row_names" value="has_col_names,has_row_names" />
856 <conditional name="user" >
857 <param name="mode" value="filtersumval" />
858 <param name="axis" value="1" />
859 <conditional name="filtersumval_mode" >
860 <param name="use" value="operation" />
861 <param name="operation" value="sum" />
862 <param name="compare_op" value="lt" />
863 <param name="against" value="50" />
864 </conditional>
865 </conditional>
866 </conditional>
867 <output name="table" >
868 <assert_contents>
869 <has_n_columns n="4" />
870 <has_line_matching expression="^\s+c1\s+c2\s+c3$" />
871 <has_line_matching expression="^g3\s+4\s+8\s+12$" />
872 </assert_contents>
873 </output>
874 </test>
875 <test expect_num_outputs="1" >
876 <!-- Test 26: Ex 3_P1 -->
877 <conditional name="singtabop" >
878 <param name="use_type" value="single" />
879 <param name="input" value="examples.3p1.tsv" />
880 <param name="col_row_names" value="has_col_names,has_row_names" />
881 <conditional name="user" >
882 <param name="mode" value="element" />
883 <conditional name="element" >
884 <param name="mode" value="custom" />
885 <param name="custom_expr" value="elem &#60; 10" />
886 </conditional>
887 <conditional name="elem_val" >
888 <param name="element_op" value="None" />
889 </conditional>
890 </conditional>
891 </conditional>
892 <output name="table" >
893 <assert_contents>
894 <has_n_columns n="4" />
895 <has_line_matching expression="^g1\s+False\s+False\s+False$" />
896 <has_line_matching expression="^g4\s+False\s+True\s+True$" />
897 </assert_contents>
898 </output>
899 </test>
900 <test expect_num_outputs="1" >
901 <!-- Test 27: Ex 3_P2 -->
902 <conditional name="singtabop" >
903 <param name="use_type" value="single" />
904 <param name="input" value="examples.3p2.tsv" />
905 <param name="col_row_names" value="has_col_names,has_row_names" />
906 <conditional name="user" >
907 <param name="mode" value="matrixapply" />
908 <param name="dimension" value="1" />
909 <conditional name="matrixapply_func" >
910 <param name="vector_op" value="sum" />
911 </conditional>
912 </conditional>
913 </conditional>
914 <output name="table" >
915 <assert_contents>
916 <has_n_columns n="2" />
917 <has_line_matching expression="^g1\s+0$" />
918 <has_line_matching expression="^g4\s+2$" />
919 </assert_contents>
920 </output>
921 </test>
922 <test expect_num_outputs="1" >
923 <!-- Test 28: Ex 4 -->
924 <conditional name="singtabop" >
925 <param name="use_type" value="single" />
926 <param name="input" value="examples.4.tsv" />
927 <param name="col_row_names" value="has_col_names,has_row_names" />
928 <conditional name="user" >
929 <param name="mode" value="element" />
930 <conditional name="element" >
931 <param name="mode" value="custom" />
932 <param name="custom_expr" value="(math.log(elem) / elem) if (elem > 5) else 1" />
933 </conditional>
934 <conditional name="elem_val" >
935 <param name="element_op" value="All" />
936 </conditional>
937 </conditional>
938 </conditional>
939 <output name="table" >
940 <assert_contents>
941 <has_n_columns n="4" />
942 <has_line_matching expression="^g1\s+1\.00\d+\s+0\.149\d+\s+0\.113\d+$" />
943 <has_line_matching expression="^g4\s+0\.05\d+\s+1\.000\d+\s+1\.000\d+$" />
944 </assert_contents>
945 </output>
946 </test>
947 <test expect_num_outputs="1" >
948 <!-- Test 29: Ex 5 -->
949 <conditional name="singtabop" >
950 <param name="use_type" value="single" />
951 <param name="input" value="examples.5.tsv" />
952 <param name="col_row_names" value="has_col_names,has_row_names" />
953 <conditional name="user" >
954 <param name="mode" value="fulltable" />
955 <conditional name="general" >
956 <param name="use" value="custom" />
957 <param name="fulltable_custom_expr" value="table - table.mean(0)/table.std(0)" />
958 </conditional>
959 </conditional>
960 </conditional>
961 <output name="table" >
962 <assert_contents>
963 <has_n_columns n="4" />
964 <has_line_matching expression="^g1\s+9\.\d+\s+17\.\d+\s+28\.\d+$" />
965 <has_line_matching expression="^g4\s+80\.\d+\s+7\.\d+\s+8\.\d+$" />
966 </assert_contents>
967 </output>
968 </test>
969 <test expect_num_outputs="1" >
970 <!-- Test 30: Ex 6 -->
971 <conditional name="singtabop" >
972 <param name="use_type" value="multiple" />
973 <repeat name="tables" >
974 <param name="input" value="examples.6p1.tsv" />
975 <param name="col_row_names" value="has_col_names,has_row_names" />
976 </repeat>
977 <repeat name="tables" >
978 <param name="input" value="examples.6p2.tsv" />
979 <param name="col_row_names" value="has_col_names,has_row_names" />
980 </repeat>
981 <repeat name="tables" >
982 <param name="input" value="examples.6p3.tsv" />
983 <param name="col_row_names" value="has_col_names,has_row_names" />
984 </repeat>
985 <param name="fulltable_custom_expr" value="table1 / min(np.max(np.max(table2)), np.max(np.max(table3)))" />
986 </conditional>
987 <output name="table" >
988 <assert_contents>
989 <has_n_columns n="4" />
990 <has_line_matching expression="^g1\s+3\.3\d+\s+6\.6\d+\s+10\.0\d+$" />
991 <has_line_matching expression="^g3\s+1\.3\d+\s+2\.6\d+\s+3\.3\d+$" />
992 </assert_contents>
993 </output>
994 </test>
995 <test expect_num_outputs="1" >
996 <!-- Test 31: Ex 7 -->
997 <conditional name="singtabop" >
998 <param name="use_type" value="single" />
999 <param name="input" value="examples.7.tsv" />
1000 <param name="col_row_names" value="has_col_names,has_row_names" />
1001 <conditional name="user">
1002 <param name="mode" value="fulltable" />
1003 <conditional name="general" >
1004 <param name="use" value="melt" />
1005 <param name="id_vars" value="A" />
1006 <param name="value_vars" value="B,C" />
1007 </conditional>
1008 </conditional>
1009 </conditional>
1010 <output name="table" >
1011 <assert_contents>
1012 <has_n_columns n="4" />
1013 <has_line_matching expression="^0\s+a\s+B\s+B\s*$" />
1014 <has_line_matching expression="^5\s+c\s+C\s+5\s*$" />
1015 </assert_contents>
1016 </output>
1017 </test>
1018 <test expect_num_outputs="1" >
1019 <!-- Test 32: Ex 8 -->
1020 <conditional name="singtabop" >
1021 <param name="use_type" value="single" />
1022 <param name="input" value="examples.8.tsv" />
1023 <param name="col_row_names" value="has_col_names,has_row_names" />
1024 <conditional name="user" >
1025 <param name="mode" value="fulltable" />
1026 <conditional name="general" >
1027 <param name="use" value="pivot" />
1028 <param name="index" value="foo" />
1029 <param name="column" value="bar" />
1030 <param name="values" value="baz" />
1031 </conditional>
1032 </conditional>
1033 </conditional>
1034 <output name="table" >
1035 <assert_contents>
1036 <has_n_columns n="4" />
1037 <has_line_matching expression="^one\s+1\s+2\s+3$" />
1038 <has_line_matching expression="^two\s+4\s+5\s+6$" />
1039 </assert_contents>
1040 </output>
1041 </test>
1042 </tests>
1043 <help><![CDATA[
1044 This tool computes table expressions on the element, row, and column basis. It can sub-select,
1045 duplicate, as well as perform general and custom expressions on rows, columns or elements.
1046
1047 Only a single operation can be performed on the data. Multiple operations can be performed by
1048 chaining successive runs of this tool. This is to provide a more transparent workflow for complex operations.
1049
1050
1051
1052 Examples
1053 ========
1054
1055 Example 1: Sub-selecting from a table
1056 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1057
1058 We have the following table:
1059
1060 === === === ===
1061 . c1 c2 c3
1062 === === === ===
1063 g1 10 20 30
1064 g2 3 6 9
1065 g3 4 8 12
1066 g4 81 6 3
1067 === === === ===
1068
1069 and we want to duplicate c1 and remove c2. Also select g1 to g3 and add g2 at the end as well. This would result in the output table:
1070
1071 === === === ===
1072 . c1 c1 c3
1073 === === === ===
1074 g1 10 10 30
1075 g2 3 3 9
1076 g3 4 4 12
1077 g2 3 3 9
1078 === === === ===
1079
1080 In Galaxy we would select the following:
1081
1082 * *Input Single or Multiple Tables* → **Single Table**
1083 * *Column names on first row?* → **Yes**
1084 * *Row names on first column?* → **Yes**
1085 * *Type of table operation* → **Drop, keep or duplicate rows and columns**
1086
1087 * *List of columns to select* → **1,1,3**
1088 * *List of rows to select* → **1:3,2**
1089 * *Keep duplicate columns* → **Yes**
1090 * *Keep duplicate rows* → **Yes**
1091
1092 Example 2: Filter for rows with row sums less than 50
1093 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1094
1095 We have the following table:
1096
1097 === === === ===
1098 . c1 c2 c3
1099 === === === ===
1100 g1 10 20 30
1101 g2 3 6 9
1102 g3 4 8 12
1103 g4 81 6 3
1104 === === === ===
1105
1106 and we want:
1107
1108 === === === ===
1109 . c1 c2 c3
1110 === === === ===
1111 g2 3 6 9
1112 g3 4 8 12
1113 === === === ===
1114
1115 In Galaxy we would select the following:
1116
1117 * *Input Single or Multiple Tables* → **Single Table**
1118 * *Column names on first row?* → **Yes**
1119 * *Row names on first column?* → **Yes**
1120 * *Type of table operation* → **Filter rows or columns by their properties**
1121
1122 * *Filter* → **Rows**
1123 * *Filter Criterion* → **Result of function applied to columns/rows**
1124
1125 * *Keep column/row if its observed* → **Sum**
1126 * *is* → **< (Less Than)**
1127 * *this value* → **50**
1128
1129
1130 Example 3: Count the number of values per row smaller than a specified value
1131 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1132
1133 We have the following table:
1134
1135 === === === ===
1136 . c1 c2 c3
1137 === === === ===
1138 g1 10 20 30
1139 g2 3 6 9
1140 g3 4 8 12
1141 g4 81 6 3
1142 === === === ===
1143
1144 and we want to count how many elements in each row are smaller than 10, i.e.,
1145 we want to obtain the following results table:
1146
1147 === ===
1148 . vec
1149 === ===
1150 g1 0
1151 g2 3
1152 g3 2
1153 g4 2
1154 === ===
1155
1156 In Galaxy we would select the following:
1157
1158 * *Input Single or Multiple Tables* → **Single Table**
1159 * *Column names on first row?* → **Yes**
1160 * *Row names on first column?* → **Yes**
1161 * *Type of table operation* → **Manipulate selected table elements**
1162
1163 * *Operation to perform* → **Custom**
1164
1165 * *Custom Expression on 'elem'* → **elem < 10**
1166
1167 * *Operate on elements* → **All**
1168
1169 **Note:** *There are actually simpler ways to achieve our purpose, but here we are demonstrating the use of a custom expression.*
1170
1171 After executing, we would then be presented with a table like so:
1172
1173 === ===== ===== =====
1174 . c1 c2 c3
1175 === ===== ===== =====
1176 g1 False False False
1177 g2 True True True
1178 g3 True True False
1179 g4 False True True
1180 === ===== ===== =====
1181
1182 To get to our desired table, we would then process this table with the tool again:
1183
1184 * *Input Single or Multiple Tables* → **Single Table**
1185 * *Column names on first row?* → **Yes**
1186 * *Row names on first column?* → **Yes**
1187 * *Type of table operation* → **Compute Expression across Rows or Columns**
1188
1189 * *Calculate* → **Sum**
1190 * *For each* → **Row**
1191
1192 Executing this will sum all the 'True' values in each row. Note that the values must have no extra whitespace in them for this to work (e.g. 'True ' or ' True' will not be parsed correctly).
1193
1194
1195 Example 4: Perform a scaled log-transformation conditionally
1196 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1197
1198 We want to perform a scaled log transformation on all values greater than 5, and set all other values to 1.
1199
1200 We have the following table:
1201
1202 === === === ===
1203 . c1 c2 c3
1204 === === === ===
1205 g1 0 20 30
1206 g2 3 0 9
1207 g3 4 8 0
1208 g4 81 0 0
1209 === === === ===
1210
1211 and we want:
1212
1213 === ========== ========= =========
1214 . c1 c2 c3
1215 === ========== ========= =========
1216 g1 1.00000000 0.1497866 0.1133732
1217 g2 1.00000000 1.0000000 0.2441361
1218 g3 1.00000000 0.2599302 1.0000000
1219 g4 0.05425246 1.0000000 1.0000000
1220 === ========== ========= =========
1221
1222 In Galaxy we would select the following:
1223
1224 * *Input Single or Multiple Tables* → **Single Table**
1225 * *Column names on first row?* → **Yes**
1226 * *Row names on first column?* → **Yes**
1227 * *Type of table operation* → **Manipulate selected table elements**
1228
1229 * *Operation to perform* → **Custom**
1230
1231 * *Custom Expression* → ::
1232
1233 (math.log(elem) / elem) if (elem > 5) else 1
1234
1235 * *Operate on elements* → **All**
1236
1237
1238 Example 5: Perform a Full table operation
1239 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1240
1241 We have the following table:
1242
1243 === === === ===
1244 . c1 c2 c3
1245 === === === ===
1246 g1 10 20 30
1247 g2 3 10 9
1248 g3 4 8 10
1249 g4 81 10 10
1250 === === === ===
1251
1252 and we want to subtract from each column the mean of that column divided by the standard deviation of it to yield:
1253
1254
1255 === ========= ========= =========
1256 . c1 c2 c3
1257 === ========= ========= =========
1258 g1 9.351737 17.784353 28.550737
1259 g2 2.351737 7.784353 7.550737
1260 g3 3.351737 5.784353 8.550737
1261 g4 80.351737 7.784353 8.550737
1262 === ========= ========= =========
1263
1264 In Galaxy we would select the following:
1265
1266 * *Input Single or Multiple Tables* → **Single Table**
1267 * *Column names on first row?* → **Yes**
1268 * *Row names on first column?* → **Yes**
1269 * *Type of table operation* → **Perform a Full Table Operation**
1270
1271 * *Operation* → **Custom**
1272
1273 * *Custom Expression on 'table' along axis (0 or 1)* → ::
1274
1275 table - table.mean(0)/table.std(0)
1276
1277
1278 Example 6: Perform operations on multiple tables
1279 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1280
1281 We have the following three input tables:
1282
1283 Table 1
1284
1285 === === === ===
1286 . c1 c2 c3
1287 === === === ===
1288 g1 10 20 30
1289 g2 3 10 9
1290 g3 4 8 10
1291 === === === ===
1292
1293 Table 2
1294
1295 === === ===
1296 . c1 c2
1297 === === ===
1298 g1 1 2
1299 g2 3 4
1300 g3 6 5
1301 === === ===
1302
1303 Table 3
1304
1305 === === === ===
1306 . c1 c2 c3
1307 === === === ===
1308 g1 1 2 3
1309 g2 1 2 3
1310 === === === ===
1311
1312
1313 *Note that the dimensions of these tables do not match.*
1314
1315 Dimensions:
1316 * Table1 [3,3]
1317 * Table2 [3,2]
1318 * Table3 [2,3]
1319
1320 In order to perform simple operations between Tables, they must be of the same dimensions.
1321
1322 To add Table2 to Table3 we would have to transpose one of the tables using the in-built `T` method::
1323
1324 table2 + table3.T
1325
1326 or::
1327
1328 table2.T + table3
1329
1330 We can also perform more general operations using all 3 tables, such as taking the minimum value of
1331 the maximum values of Table2 and Table3, and dividing the Table1 values by it::
1332
1333 table1 / min(table2.values.max(), table3.values.max())
1334
1335
1336 To perform these types of operations in Galaxy we would select the following:
1337
1338 * *Input Single or Multiple Tables* → **Multiple Tables**
1339 * *(For each inserted table)*
1340 * *Column names on first row?* → **Yes**
1341 * *Row names on first column?* → **Yes**
1342 * *Custom Expression* → ::
1343
1344 <insert your desired function>
1345
1346 Please note that the last example shown above was chosen to illustrate the
1347 limitations of the tool. Nested attributes like `table2.values.max` are
1348 disallowed in expressions in the tool so the above would have to be replaced
1349 with the harder to read workaround::
1350
1351 table1 / min(np.max(np.max(table2)), np.max(np.max(table3)))
1352
1353 Also note that, currently `min()`, `max()` and `sum()` are the only built-in
1354 Python functions that can be used inside expressions. If you want to use
1355 additional functions, these have to be qualified functions from the `math`,
1356 `np` or `pd` libraries.
1357
1358
1359 Example 7: Melt
1360 ~~~~~~~~~~~~~~~
1361
1362 We have the following table
1363
1364 === === === ===
1365 . A B C
1366 === === === ===
1367 0 a B 1
1368 1 b B 3
1369 2 c B 5
1370 === === === ===
1371
1372 and we want:
1373
1374 === === ======== =====
1375 . A variable value
1376 === === ======== =====
1377 0 a B B
1378 1 b B B
1379 2 c B B
1380 3 a C 1
1381 4 b C 3
1382 5 c C 5
1383 === === ======== =====
1384
1385
1386 In Galaxy we would select the following:
1387
1388 * *Input Single or Multiple Tables* → **Single Table**
1389 * *Column names on first row?* → **Yes**
1390 * *Row names on first column?* → **Yes**
1391 * *Type of table operation* → **Perform a Full Table Operation**
1392
1393 * *Operation* → **Melt**
1394 * *Variable IDs* → "A"
1395 * *Unpivoted IDs* → "B,C"
1396
1397 This converts the "B" and "C" columns into variables.
1398
1399
1400 Example 8: Pivot
1401 ~~~~~~~~~~~~~~~~
1402
1403 We have the following table
1404
1405 === === === === ===
1406 . foo bar baz zoo
1407 === === === === ===
1408 0 one A 1 x
1409 1 one B 2 y
1410 2 one C 3 z
1411 3 two A 4 q
1412 4 two B 5 w
1413 5 two C 6 t
1414 === === === === ===
1415
1416 and we want:
1417
1418 === === === ===
1419 . A B C
1420 === === === ===
1421 one 1 2 3
1422 two 4 5 6
1423 === === === ===
1424
1425 In Galaxy we would select the following:
1426
1427 * *Input Single or Multiple Tables* → **Single Table**
1428 * *Column names on first row?* → **Yes**
1429 * *Row names on first column?* → **Yes**
1430 * *Type of table operation* → **Perform a Full Table Operation**
1431
1432 * *Operation* → **Pivot**
1433 * *Index* → "foo"
1434 * *Column* → "bar"
1435 * *Values* → "baz"
1436
1437 This splits the matrix using "foo" and "bar" using only the values from "baz". Header values may contain extra information.
1438
1439 ]]></help>
1440 <citations></citations>
1441 </tool>