Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions lib/Sample.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@

import java.nio.file.Path
import nextflow.io.ValueObject
import nextflow.util.KryoHelper

@ValueObject
class Sample {
String id
List<Path> reads

static {
KryoHelper.register(Sample)
}
}
9 changes: 5 additions & 4 deletions main.nf
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,11 @@ include { MULTIQC } from './modules/multiqc'
/*
* main script flow
*/
workflow {
read_pairs_ch = channel.fromFilePairs( params.reads, checkIfExists: true )
RNASEQ( params.transcriptome, read_pairs_ch )
MULTIQC( RNASEQ.out, params.multiqc )
@WorkflowFn(main=true)
def MAIN() {
read_pairs_ch = channel.fromFilePairs( params.reads, checkIfExists: true ).map { args -> new Sample(*args) }
RNASEQ( file(params.transcriptome), read_pairs_ch )
MULTIQC( RNASEQ.out, file(params.multiqc) )
}

/*
Expand Down
30 changes: 17 additions & 13 deletions modules/fastqc/main.nf
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
params.outdir = 'results'

process FASTQC {
tag "FASTQC on $sample_id"
conda 'fastqc=0.12.1'
publishDir params.outdir, mode:'copy'

input:
tuple val(sample_id), path(reads)

output:
path "fastqc_${sample_id}_logs"

script:
@ProcessFn(
directives={
tag { "FASTQC on $sample.id" }
conda 'fastqc=0.12.1'
publishDir params.outdir, mode:'copy'
},
inputs={
path { sample.reads }
},
outputs={
path '$file0', { "fastqc_${sample.id}_logs" }
emit { path('$file0') }
},
script=true
)
def FASTQC(Sample sample) {
"""
fastqc.sh "$sample_id" "$reads"
fastqc.sh "$sample.id" "$sample.reads"
"""
}
26 changes: 15 additions & 11 deletions modules/index/main.nf
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@

process INDEX {
tag "$transcriptome.simpleName"
conda 'salmon=1.10.2'

input:
path transcriptome

output:
path 'index'

script:
@ProcessFn(
directives={
tag { transcriptome.simpleName }
conda 'salmon=1.10.2'
},
inputs={
path { transcriptome }
},
outputs={
path '$file0', 'index'
emit { path('$file0') }
},
script=true
)
def INDEX(Path transcriptome) {
"""
salmon index --threads $task.cpus -t $transcriptome -i index
"""
Expand Down
28 changes: 16 additions & 12 deletions modules/multiqc/main.nf
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
params.outdir = 'results'

process MULTIQC {
conda 'multiqc=1.17'
publishDir params.outdir, mode:'copy'

input:
path('*')
path(config)

output:
path('multiqc_report.html')

script:
@ProcessFn(
directives={
conda 'multiqc=1.17'
publishDir params.outdir, mode:'copy'
},
inputs={
path { files }, stageAs: '*'
path { config }
},
outputs={
path '$file0', 'multiqc_report.html'
emit { path('$file0') }
},
script=true
)
def MULTIQC(List<Path> files, Path config) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I appreciate the typing on input channels. It makes me wonder if it would be possible to add a decorator like this:

    input:
    @type:List<Path>
    @description: a list of files output from various processes for multiqc to parse
    path('*') 
    
    output:
    @type:Path
    @description: multiqc html summary
    path('multiqc_report.html')

To the current syntax that could be both checked, and generate some automatic documentation. It would be especially nice if the type of channel -- value or queue -- was included. This would be helpful in development and maintenance, I think.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The syntax would have to be something like this:

    input:
    path('*'), type: List<Path>, description: 'a list of files output from various processes for multiqc to parse'

But you have the right idea.

As for channels, I think the process definition should be decoupled from whether the input channels are queue or value, because it shouldn't really matter

"""
cp $config/* .
echo "custom_logo: \$PWD/logo.png" >> multiqc_config.yaml
Expand Down
30 changes: 17 additions & 13 deletions modules/quant/main.nf
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@

process QUANT {
tag "$pair_id"
conda 'salmon=1.10.2'

input:
path index
tuple val(pair_id), path(reads)

output:
path pair_id

script:
@ProcessFn(
directives={
tag { pair.id }
conda 'salmon=1.10.2'
},
inputs={
path { index }
path { pair.reads }
},
outputs={
path '$file0', { pair.id }
emit { path('$file0') }
},
script=true
)
def QUANT(Path index, Sample pair) {
"""
salmon quant --threads $task.cpus --libType=U -i $index -1 ${reads[0]} -2 ${reads[1]} -o $pair_id
salmon quant --threads $task.cpus --libType=U -i $index -1 ${pair.reads[0]} -2 ${pair.reads[1]} -o $pair.id
"""
}
19 changes: 7 additions & 12 deletions modules/rnaseq.nf
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,11 @@ include { INDEX } from './index'
include { QUANT } from './quant'
include { FASTQC } from './fastqc'

workflow RNASEQ {
take:
transcriptome
read_pairs_ch

main:
INDEX(transcriptome)
FASTQC(read_pairs_ch)
QUANT(INDEX.out, read_pairs_ch)

emit:
QUANT.out | concat(FASTQC.out) | collect
@WorkflowFn
def RNASEQ(transcriptome, read_pairs_ch) {
INDEX(transcriptome)
FASTQC(read_pairs_ch)
QUANT(INDEX.out, read_pairs_ch)
| concat(FASTQC.out)
| collect
}