Step 11 - A more generic process
What if we rewrite the previous using some of the techniques introduced earlier. Let us specify the operator as a parameter and try to stick to just 1 process definition.
// Step - 11
process process_step11 {
input:
tuple val(id), val(input), val(config)
output:
tuple val("${id}"), val(output), val("${config}")
exec:
if (config.operator == "+")
output = input.toInteger() + config.term.toInteger()
else
output = input.toInteger() - config.term.toInteger()
}
workflow step11 {
Channel.from( [ 1, 2, 3 ] ) \
| map{ el -> [ el.toString(), el, [ : ] ] } \
| process_step11 \
| map{ id, value, config ->
[
id,
value,
[ "term" : 11, "operator" : "-" ]
] } \
| process_step11 \
| view{ [ it[0], it[1] ] }
}
This little workflow definition results in an error, just like we warned before:
> nextflow -q run . -entry step11
WARN: DSL 2 IS AN EXPERIMENTAL FEATURE UNDER DEVELOPMENT -- SYNTAX MAY CHANGE IN FUTURE RELEASE
assert processConfig==null
|
['echo':false, 'cacheable':true, 'shell':['/bin/bash', '-ue'], 'validExitStatus':[0], 'maxRetries':0, 'maxErrors':-1, 'errorStrategy':TERMINATE]
-- Check script 'main.nf' at line: 248 or see '.nextflow.log' file for more details
There is, however, one simple way around this: include { ... as ...}. Let us see how this works.
First, we store the process in a file examples/step/step11.nf:
process process_step11 {
input:
tuple val(id), val(input), val(config)
output:
tuple val("${id}"), val(output), val("${config}")
exec:
if (config.operator == "+")
output = input.toInteger() + config.term.toInteger()
else
output = input.toInteger() - config.term.toInteger()
}
The workflow definition becomes:
// Step - 11a
include { process_step11 as process_step11a } \
from './examples/modules/step11.nf'
include { process_step11 as process_step11b } \
from './examples/modules/step11.nf'
workflow step11a {
Channel.from( [ 1, 2, 3 ] ) \
| map{ el -> [ el.toString(), el, [ : ] ] } \
| map{ id, value, config ->
[
id,
value,
[ "term" : 5, "operator" : "+" ]
] } \
| process_step11a \
| map{ id, value, config ->
[
id,
value,
[ "term" : 11, "operator" : "-" ]
] } \
| process_step11b \
| view{ [ it[0], it[1] ] }
}
Running this yields an output similar to this:
> nextflow -q run . -entry step11a
WARN: DSL 2 IS AN EXPERIMENTAL FEATURE UNDER DEVELOPMENT -- SYNTAX MAY CHANGE IN FUTURE RELEASE
[1, -5]
[2, -4]
[3, -3]
We made a few minor changes to the workflow code in the meanwhile:
- Splitting the conversion from an array of items to the triplet is now done explicitly and separate from specifying the configuration for the
processitself. - The
viewnow only contains the relevant parts, not the configuration part for the lastprocess.
The above example illustrates the include functionality of NextFlow DSL2. This was not possible with prior versions.