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
process
itself. - The
view
now 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.