From 1f46499e3b343de151fec3f31104b6c565e60179 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 21 Jan 2020 11:24:32 +0100 Subject: [PATCH 01/30] add bwa index --- tools/bwa/index/main.nf | 16 ++++++++++++++++ tools/bwa/index/meta.yml | 25 +++++++++++++++++++++++++ tools/bwa/index/test/main.nf | 16 ++++++++++++++++ tools/bwa/index/test/nextflow.config | 2 ++ 4 files changed, 59 insertions(+) create mode 100644 tools/bwa/index/main.nf create mode 100644 tools/bwa/index/meta.yml create mode 100644 tools/bwa/index/test/main.nf create mode 100644 tools/bwa/index/test/nextflow.config diff --git a/tools/bwa/index/main.nf b/tools/bwa/index/main.nf new file mode 100644 index 00000000..0c943bb4 --- /dev/null +++ b/tools/bwa/index/main.nf @@ -0,0 +1,16 @@ +process bwa_index { + tag {fasta} + + container 'quay.io/biocontainers/bwa:0.7.17--hed695b0_7' + + input: + path(fasta) + + output: + path("${fasta}.*") + + script: + """ + bwa index ${fasta} + """ +} \ No newline at end of file diff --git a/tools/bwa/index/meta.yml b/tools/bwa/index/meta.yml new file mode 100644 index 00000000..4509d34d --- /dev/null +++ b/tools/bwa/index/meta.yml @@ -0,0 +1,25 @@ +name: bwa index +description: create indexes for BWA from a fasta file +keywords: + - index +tools: + - bwa: + description: | + BWA is a software package for mapping DNA sequences against a large reference genome, such as the human genome. + homepage: http://bio-bwa.sourceforge.net/ + documentation: hhttp://www.htslib.org/doc/samtools.html + arxiv: arXiv:1303.3997 +input: + - + - input: + type: file + description: Input fasta file + pattern: *.{fasta,fa} +output: + - + - index: + type: file + description: bwa indexes file + pattern: *.{fasta,fa}.{amb,ann,bwt,pac,sa} +authors: + - @maxulysse \ No newline at end of file diff --git a/tools/bwa/index/test/main.nf b/tools/bwa/index/test/main.nf new file mode 100644 index 00000000..6acb4d61 --- /dev/null +++ b/tools/bwa/index/test/main.nf @@ -0,0 +1,16 @@ +#!/usr/bin/env nextflow +nextflow.preview.dsl = 2 +include '../../../nf-core/module_testing/check_process_outputs.nf' params(params) +include '../main.nf' params(params) + +// Define input channels +input = '../../../test-datasets/tools/bwa/index/input/reference.fasta' +Channel + .from(input) + .set { ch_input } + +// Run the workflow +workflow { + fastqc(ch_input) + // .check_output() +} diff --git a/tools/bwa/index/test/nextflow.config b/tools/bwa/index/test/nextflow.config new file mode 100644 index 00000000..c137a138 --- /dev/null +++ b/tools/bwa/index/test/nextflow.config @@ -0,0 +1,2 @@ +docker.enabled = true +params.outdir = './results' From ad3c14a96453d2664c469dbfeda58097a339a0fb Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 21 Jan 2020 11:25:13 +0100 Subject: [PATCH 02/30] fix typo --- tools/samtools/index/meta.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/samtools/index/meta.yml b/tools/samtools/index/meta.yml index 3cd7a402..e665789b 100644 --- a/tools/samtools/index/meta.yml +++ b/tools/samtools/index/meta.yml @@ -1,7 +1,7 @@ -name: samtools sort -description: Sort a BAM or CRAM file +name: samtools index +description: index a BAM or CRAM file keywords: - - sort + - index tools: - samtools: description: | From a69aebd01b0e37ffda790839c24c8b07f557514f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 10:19:00 +0100 Subject: [PATCH 03/30] fix index process --- tools/samtools/index/main.nf | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tools/samtools/index/main.nf b/tools/samtools/index/main.nf index acf1af41..7b065fa9 100644 --- a/tools/samtools/index/main.nf +++ b/tools/samtools/index/main.nf @@ -7,15 +7,14 @@ process samtools_index { path(bam) output: - path "*.sorted.bam" + path "*.bai" script: def suff_mem = ("${(task.memory.toBytes() - 6000000000) / task.cpus}" > 2000000000) ? 'true' : 'false' def avail_mem = (task.memory && suff_mem) ? "-m" + "${(task.memory.toBytes() - 6000000000) / task.cpus}" : '' """ - samtools sort $bam \\ - -@ ${task.cpus} ${avail_mem} \\ - -o ${bam.baseName}.sorted.bam + samtools index $bam \\ + -@ ${task.cpus} ${avail_mem} samtools --version &> v_samtools.txt """ From 9db873c3bc8f3deaa4c8fdb27f0644c87a321155 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 11:35:19 +0100 Subject: [PATCH 04/30] add gatk dict to create dictionnary from fasta file --- tools/gatk/dict/main.nf | 19 +++++++++++++++++++ tools/gatk/dict/meta.yml | 25 +++++++++++++++++++++++++ tools/gatk/dict/test/main.nf | 13 +++++++++++++ tools/gatk/dict/test/nextflow.config | 2 ++ 4 files changed, 59 insertions(+) create mode 100644 tools/gatk/dict/main.nf create mode 100644 tools/gatk/dict/meta.yml create mode 100644 tools/gatk/dict/test/main.nf create mode 100644 tools/gatk/dict/test/nextflow.config diff --git a/tools/gatk/dict/main.nf b/tools/gatk/dict/main.nf new file mode 100644 index 00000000..49edf5a1 --- /dev/null +++ b/tools/gatk/dict/main.nf @@ -0,0 +1,19 @@ +process gatk_dict { + tag {fasta} + + container 'quay.io/biocontainers/gatk4-spark:4.1.4.1--1' + + input: + path(fasta) + + output: + path("${fasta.baseName}.dict") + + script: + """ + gatk --java-options "-Xmx${task.memory.toGiga()}g" \ + CreateSequenceDictionary \ + --REFERENCE ${fasta} \ + --OUTPUT ${fasta.baseName}.dict + """ +} \ No newline at end of file diff --git a/tools/gatk/dict/meta.yml b/tools/gatk/dict/meta.yml new file mode 100644 index 00000000..bc9e18b6 --- /dev/null +++ b/tools/gatk/dict/meta.yml @@ -0,0 +1,25 @@ +name: gatk dict +description: create a dictionary file from a fasta file +keywords: + - dictionary +tools: + - gatk: + description: | + The GATK toolkit offers a wide variety of tools with a primary focus on variant discovery and genotyping, developed in the Data Sciences Platform at the Broad Institute. + homepage: https://gatk.broadinstitute.org/hc/en-us + documentation: https://gatk.broadinstitute.org/hc/en-us/categories/360002369672s + doi: 10.1158/1538-7445.AM2017-3590 +input: + - + - input: + type: file + description: Input fasta file + pattern: *.{fasta,fa} +output: + - + - dict: + type: file + description: gatk dictionary file + pattern: *.{fasta,fa}.{dict} +authors: + - @maxulysse \ No newline at end of file diff --git a/tools/gatk/dict/test/main.nf b/tools/gatk/dict/test/main.nf new file mode 100644 index 00000000..41c1862c --- /dev/null +++ b/tools/gatk/dict/test/main.nf @@ -0,0 +1,13 @@ +#!/usr/bin/env nextflow +nextflow.preview.dsl = 2 +include '../../../nf-core/module_testing/check_process_outputs.nf' params(params) +include '../main.nf' params(params) + +// Define input channels +input = '../../../test-datasets/tools/bwa/index/input/reference.fasta' + +// Run the workflow +workflow { + gatk_dict(input) + // .check_output() +} diff --git a/tools/gatk/dict/test/nextflow.config b/tools/gatk/dict/test/nextflow.config new file mode 100644 index 00000000..c137a138 --- /dev/null +++ b/tools/gatk/dict/test/nextflow.config @@ -0,0 +1,2 @@ +docker.enabled = true +params.outdir = './results' From b8dda67338cfe2deac074c3ce7c085ccde825f37 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 11:35:49 +0100 Subject: [PATCH 05/30] add htslib tabix to index bgzipped vcf files --- tools/htslib/tabix/main.nf | 16 +++++++++++++++ tools/htslib/tabix/meta.yml | 26 +++++++++++++++++++++++++ tools/htslib/tabix/test/main.nf | 13 +++++++++++++ tools/htslib/tabix/test/nextflow.config | 2 ++ 4 files changed, 57 insertions(+) create mode 100644 tools/htslib/tabix/main.nf create mode 100644 tools/htslib/tabix/meta.yml create mode 100644 tools/htslib/tabix/test/main.nf create mode 100644 tools/htslib/tabix/test/nextflow.config diff --git a/tools/htslib/tabix/main.nf b/tools/htslib/tabix/main.nf new file mode 100644 index 00000000..e228bb02 --- /dev/null +++ b/tools/htslib/tabix/main.nf @@ -0,0 +1,16 @@ +process htslib_tabix { + tag {vcf} + + container 'quay.io/biocontainers/tabix:0.2.6--ha92aebf_0' + + input: + path(vcf) + + output: + path("${vcf}.tbi") + + script: + """ + tabix -p vcf ${vcf} + """ +} diff --git a/tools/htslib/tabix/meta.yml b/tools/htslib/tabix/meta.yml new file mode 100644 index 00000000..027780c3 --- /dev/null +++ b/tools/htslib/tabix/meta.yml @@ -0,0 +1,26 @@ +name: htslib tabix +description: create tabix index from a bgzip vcf file +keywords: + - index + - tabix +tools: + - bwa: + description: | + Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/ + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 +input: + - + - input: + type: file + description: Input vcf.gz file + pattern: *.{vcf.gz} +output: + - + - index: + type: file + description: tabix index file + pattern: *.{vcf.gz.tbi} +authors: + - @maxulysse \ No newline at end of file diff --git a/tools/htslib/tabix/test/main.nf b/tools/htslib/tabix/test/main.nf new file mode 100644 index 00000000..6fd80089 --- /dev/null +++ b/tools/htslib/tabix/test/main.nf @@ -0,0 +1,13 @@ +#!/usr/bin/env nextflow +nextflow.preview.dsl = 2 +include '../../../nf-core/module_testing/check_process_outputs.nf' params(params) +include '../main.nf' params(params) + +// Define input channels +input = '../../../test-datasets/tools/file.vcf.gz' + +// Run the workflow +workflow { + tabix_index(ch_read_files) + // .check_output() +} diff --git a/tools/htslib/tabix/test/nextflow.config b/tools/htslib/tabix/test/nextflow.config new file mode 100644 index 00000000..c137a138 --- /dev/null +++ b/tools/htslib/tabix/test/nextflow.config @@ -0,0 +1,2 @@ +docker.enabled = true +params.outdir = './results' From 7fbfd2d6cb92907e9c981d04f7bf5a408a3f8e7d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 23 Jan 2020 11:36:21 +0100 Subject: [PATCH 06/30] add samtools faidx to index fasta file --- tools/samtools/faidx/main.nf | 16 ++++++++++++++ tools/samtools/faidx/meta.yml | 27 +++++++++++++++++++++++ tools/samtools/faidx/test/main.nf | 13 +++++++++++ tools/samtools/faidx/test/nextflow.config | 2 ++ 4 files changed, 58 insertions(+) create mode 100644 tools/samtools/faidx/main.nf create mode 100644 tools/samtools/faidx/meta.yml create mode 100644 tools/samtools/faidx/test/main.nf create mode 100644 tools/samtools/faidx/test/nextflow.config diff --git a/tools/samtools/faidx/main.nf b/tools/samtools/faidx/main.nf new file mode 100644 index 00000000..458a5ab8 --- /dev/null +++ b/tools/samtools/faidx/main.nf @@ -0,0 +1,16 @@ +process samtools_faidx { + tag {fasta} + + container 'quay.io/biocontainers/samtools:1.9--h10a08f8_12' + + input: + path(fasta) + + output: + path("${fasta}.fai") + + script: + """ + samtools faidx ${fasta} + """ +} diff --git a/tools/samtools/faidx/meta.yml b/tools/samtools/faidx/meta.yml new file mode 100644 index 00000000..1e402057 --- /dev/null +++ b/tools/samtools/faidx/meta.yml @@ -0,0 +1,27 @@ +name: samtools faidx +description: index a fasta file +keywords: + - faidx +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 +input: + - + - input: + type: file + description: Input fasta file + pattern: *.{fasta,fa} +output: + - + - faidx: + type: file + description: samtools index fasta file + pattern: *.fasta.fai +authors: + - @maxulysse \ No newline at end of file diff --git a/tools/samtools/faidx/test/main.nf b/tools/samtools/faidx/test/main.nf new file mode 100644 index 00000000..f01ab6c9 --- /dev/null +++ b/tools/samtools/faidx/test/main.nf @@ -0,0 +1,13 @@ +#!/usr/bin/env nextflow +nextflow.preview.dsl = 2 +include '../../../nf-core/module_testing/check_process_outputs.nf' params(params) +include '../main.nf' params(params) + +// Define input channels +input = '../../../test-datasets/tools/bwa/index/input/reference.fasta' + +// Run the workflow +workflow { + samtools_faidx(input) + // .check_output() +} diff --git a/tools/samtools/faidx/test/nextflow.config b/tools/samtools/faidx/test/nextflow.config new file mode 100644 index 00000000..c137a138 --- /dev/null +++ b/tools/samtools/faidx/test/nextflow.config @@ -0,0 +1,2 @@ +docker.enabled = true +params.outdir = './results' From 48be154434c6c6ab3725156d6fa2fe5067f18a57 Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Fri, 24 Jan 2020 10:39:52 +0100 Subject: [PATCH 07/30] Update tools/bwa/index/meta.yml Co-Authored-By: Olga Botvinnik --- tools/bwa/index/meta.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/bwa/index/meta.yml b/tools/bwa/index/meta.yml index 4509d34d..d03c71a2 100644 --- a/tools/bwa/index/meta.yml +++ b/tools/bwa/index/meta.yml @@ -7,7 +7,7 @@ tools: description: | BWA is a software package for mapping DNA sequences against a large reference genome, such as the human genome. homepage: http://bio-bwa.sourceforge.net/ - documentation: hhttp://www.htslib.org/doc/samtools.html + documentation: http://www.htslib.org/doc/samtools.html arxiv: arXiv:1303.3997 input: - @@ -22,4 +22,4 @@ output: description: bwa indexes file pattern: *.{fasta,fa}.{amb,ann,bwt,pac,sa} authors: - - @maxulysse \ No newline at end of file + - @maxulysse From 3e8475baf051faab85894abd811677788e3f7ae8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 11 Feb 2020 15:17:53 +0100 Subject: [PATCH 08/30] add social preview image --- assets/nf-core-modules_social_preview.png | Bin 0 -> 54958 bytes assets/nf-core-modules_social_preview.svg | 450 ++++++++++++++++++++++ 2 files changed, 450 insertions(+) create mode 100644 assets/nf-core-modules_social_preview.png create mode 100644 assets/nf-core-modules_social_preview.svg diff --git a/assets/nf-core-modules_social_preview.png b/assets/nf-core-modules_social_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..5f1cf9cdcbf035a933115804bfe08fb2ef9e0dd2 GIT binary patch literal 54958 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ǖJ1o~6jdx4uct75FU7G&AZ z4rM95p>I<13W|z^#9+yE@68o0Ro{VfcgybVm{{+X-a`yK@~RdVX*)}CyQwCP?>tsX zu1`oo?|2NdhpJy>K-NQ}ceEwW;Ow{S9q`{zU0FI)pCa_rudxkw8~A1^#fVM>3Jn}^ z;T*HsSf22C=BrogbZ`@Z_0*xFWq4Dxx3lH&#_s6YyHI7I-;+goTSevVY{lxpn?tG& z4h~L01x$u2OSWa;E7OybzGS~tl$URVW;kPgNydttg9mPl)&0*giOuPJsP|!ui;MgY zf9_;y<;#X%R16`p0;uv7XRTOl;PeTsn5*1`_Icq?IQ_(?Ow<#StfpotUHR};bswJUzcY%jNdxu)+Xad4UBI;bV7k;5YHb{~zd#gWD*qz0{u z<@URxcE9{gf4)yhO-(f{8V+?|8nqZ}j*$!&E1l%;=c?BP!hy5L=IJwNKomGdGdFUF zd=mwcrvrB%Bfk=#To7R_UbFWOE4_NPx+?MWSc=t8TAqyWEX7Rn$9w?EB%PIcuHH9q z3(+~*n{W2xxv!iJ1R{Wi_6>5Ejjfp1TF&z$3?F^AH!zX&c!MgRv&VK=1Uy%)(fDRn zHs7AUtE9AI)eq5dl7+>lILhD5J-JZGOhb^#ah0-+3OR59l8{l$4EaY!gZ*Hea<3S9 zP5GN<7aLdD^G`slsA)CQUlH1JU zqJ#5HpTM-Owgd+|yG(?h%LhU0o}<%Pua&{w9Sz^@DT61ZS`lJ_Md&FWeaI3&e%t|s z(C|2jBbJS~h_dWiP9C2Wdk+^PEe$=t^!xR>fw^VUS4BWPXTML8Eq}hh9?5H>kfU=j z625DD*0rjm)OqSL$zSEehYyf|<7wC=tqZanN7`d0!i@>{Q z`dIeN)f{4|319kg7zwA{a|U?|aDzcRXSdF<=+V*n22T9=`dA#T3)784pKT8ba;Mr? zT(#=!Q(Wzku$ZB^Gf*zC))MY7%!z8IDL+^tYY+7&3LjMUyF6Mkgrqn$gxQABO8ZL=WQ7l z0WX3!J4TiOm>@TB6bCX1O}6;%IKr@SK#wFgTP$N@GUV&t3~*w)yD2>!18aoUYaZAh zqfSV=*&>dklx2Zx4rQcBad)77=BjpmU|4h?3FEV2P`D=hW!O(No*WU~UfAQ}n(f1+ z5#J(e@Nx3(^>?c#;nBQ z>n}m^j%XQ1t6mhYv>ujb^74cHG56T<%8M-g=i4rn@U^(#6L5VlX*qa9rpUT$;K5SH zM0Vo5$(~~^zEGC%0A@6llg4 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + Repository to host tool-specific module files forthe Nextflow DSL2 community! + modules + + + + + + + + + + + + + + + + + + + + + + + + + From e623dca3b739ada28d1ccfac1bb63e3ae34947b5 Mon Sep 17 00:00:00 2001 From: annacprice Date: Thu, 5 Mar 2020 09:29:23 +0000 Subject: [PATCH 09/30] initial commit of shovill --- tools/shovill/main.nf | 20 ++++++++++++++++++++ tools/shovill/meta.yml | 30 ++++++++++++++++++++++++++++++ tools/shovill/test/main.nf | 17 +++++++++++++++++ tools/shovill/test/nextflow.config | 5 +++++ 4 files changed, 72 insertions(+) create mode 100644 tools/shovill/main.nf create mode 100644 tools/shovill/meta.yml create mode 100644 tools/shovill/test/main.nf create mode 100644 tools/shovill/test/nextflow.config diff --git a/tools/shovill/main.nf b/tools/shovill/main.nf new file mode 100644 index 00000000..cf52ba10 --- /dev/null +++ b/tools/shovill/main.nf @@ -0,0 +1,20 @@ +process shovill { + + tag { shovill } + + publishDir "${params.outdir}", pattern: '*.fasta', mode: 'copy' + + container "quay.io/biocontainers/shovill:1.0.9--0" + + input: + tuple(sample_id, path(forward), path(reverse)) + + output: + path("${sample_id}.fasta") + + script: + """ + shovill --R1 ${forward} --R2 ${reverse} --outdir shovill_out + mv shovill_out/contigs.fa ${sample_id}.fasta + """ +} diff --git a/tools/shovill/meta.yml b/tools/shovill/meta.yml new file mode 100644 index 00000000..7c204c24 --- /dev/null +++ b/tools/shovill/meta.yml @@ -0,0 +1,30 @@ +name: Shovill +description: Create a bacterial assembly from paired fastq using shovill +keywords: + - Genome Assembly + - Bacterial Isolates +tools: + - fastqc: + description: | + Shovill assembles bacterial isolate genomes from Illumina + paired-end reads. Shovill uses the SPAdes genome assembler, + providing pre and post-processing to the SPAdes assembly. + It also supports SKESA, Velvet and Megahit. + homepage: https://github.com/tseemann/shovill + documentation: https://github.com/tseemann/shovill/blob/master/README.md +input: + - + - sample_id: + type: string + description: Sample identifier + - reads: + type: file + description: pair of fastq files +output: + - + - assembly: + type: file + description: fasta file + pattern: ${sample_id}.fasta +authors: + - @annacprice diff --git a/tools/shovill/test/main.nf b/tools/shovill/test/main.nf new file mode 100644 index 00000000..85ba6627 --- /dev/null +++ b/tools/shovill/test/main.nf @@ -0,0 +1,17 @@ +#!/usr/bin/env nextflow + +nextflow.preview.dsl = 2 + +// import shovill +include {shovill} from '../main.nf' params(params) + +// define input channel +readsPath = '../../../test-datasets/tools/shovill/input/SRR3609257_{1,2}.fastq.gz' +Channel + .fromFilePairs( "${readsPath}", flat: true ) + .set{ ch_reads } + +// main workflow +workflow { + shovill(ch_reads) +} diff --git a/tools/shovill/test/nextflow.config b/tools/shovill/test/nextflow.config new file mode 100644 index 00000000..44cfb78d --- /dev/null +++ b/tools/shovill/test/nextflow.config @@ -0,0 +1,5 @@ +// docker +docker.enabled = true + +// output directory +params.outdir = './results' From 97d9ae76f0e17d369ddd05833db2a821d4be0c22 Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Thu, 5 Mar 2020 15:56:11 +0000 Subject: [PATCH 10/30] add cutadapt module --- tools/cutadapt/main.nf | 24 ++++++++++++++++++++++++ tools/cutadapt/meta.yml | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 tools/cutadapt/main.nf create mode 100644 tools/cutadapt/meta.yml diff --git a/tools/cutadapt/main.nf b/tools/cutadapt/main.nf new file mode 100644 index 00000000..c647140b --- /dev/null +++ b/tools/cutadapt/main.nf @@ -0,0 +1,24 @@ +process cutadapt { + tag "${sample_id}" + + container 'quay.io/biocontainers/cutadapt:1.16--py27_1' + + input: + tuple sample_id, file(input_forward_fq), file(input_reverse_fq) + + output: + tuple sample_id, file(output_forward_fq), file(output_reverse_fq) + + script: + """ + cutadapt \ + -j ${task.cpus} \ + -q $params.cutadapt_min_quality \ + --minimum-length $params.cutadapt_min_length \ + --pair-filter=any \ + --output ${forward_fq} \ + --paired-output ${reverse_fq} '$input_forward_fq' '$input_reverse_fq' + + cutadapt --version &> v_cutadapt.txt + """ +} diff --git a/tools/cutadapt/meta.yml b/tools/cutadapt/meta.yml new file mode 100644 index 00000000..e4e1deb6 --- /dev/null +++ b/tools/cutadapt/meta.yml @@ -0,0 +1,40 @@ +name: Cutadapt +description: cutadapt removes adapter sequences from high-throughput sequencing reads +keywords: + - Quality Control + - QC + - Adapters +tools: + - fastqc: + description: | + Cutadapt finds and removes adapter sequences, primers, poly-A tails and other types of unwanted sequence + from your high-throughput sequencing reads. + + Cleaning your data in this way is often required: Reads from small-RNA sequencing contain the 3’ + sequencing adapter because the read is longer than the molecule that is sequenced. Amplicon reads + start with a primer sequence. Poly-A tails are useful for pulling out RNA from your sample, but + often you don’t want them to be in your reads. + homepage: https://cutadapt.readthedocs.io/en/stable/ + documentation: https://cutadapt.readthedocs.io/en/stable/ +input: + - - sample_id: + type: string + description: Sample identifier + - input_forward_fq: + type: file + description: Input FastQ forward read file of the pair + - input_reverse_fq: + type: file + description: Input FastQ reverse read file of the pair +output: + - - sample_id: + type: string + description: Sample identifier + - output_forward_fq: + type: file + description: Output FastQ forward read file of the pair + - output_reverse_fq: + type: file + description: Output FastQ reverse read file of the pair +authors: + - @piotr-faba-ardigen From 88bc7dcdd8b261549baff4029126e04d85390a7d Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 10:51:46 +0000 Subject: [PATCH 11/30] the module is working in test --- test-datasets | 2 +- tools/cutadapt/main.nf | 7 +++++-- tools/cutadapt/test/main.nf | 22 ++++++++++++++++++++++ tools/cutadapt/test/nextflow.config | 8 ++++++++ 4 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 tools/cutadapt/test/main.nf create mode 100644 tools/cutadapt/test/nextflow.config diff --git a/test-datasets b/test-datasets index e5fef889..be215c08 160000 --- a/test-datasets +++ b/test-datasets @@ -1 +1 @@ -Subproject commit e5fef88994b8d34c7bf4b07116e5f7a330d2ee3b +Subproject commit be215c0874e2485f0d8e12a6f0addf08f2cd08df diff --git a/tools/cutadapt/main.nf b/tools/cutadapt/main.nf index c647140b..432eccb4 100644 --- a/tools/cutadapt/main.nf +++ b/tools/cutadapt/main.nf @@ -7,9 +7,12 @@ process cutadapt { tuple sample_id, file(input_forward_fq), file(input_reverse_fq) output: - tuple sample_id, file(output_forward_fq), file(output_reverse_fq) + tuple sample_id, file(forward_fq), file(reverse_fq) script: + forward_fq = "trimmed_forward.fastq" + reverse_fq = "trimmed_reverse.fastq" + """ cutadapt \ -j ${task.cpus} \ @@ -17,7 +20,7 @@ process cutadapt { --minimum-length $params.cutadapt_min_length \ --pair-filter=any \ --output ${forward_fq} \ - --paired-output ${reverse_fq} '$input_forward_fq' '$input_reverse_fq' + --paired-output ${reverse_fq} '${input_forward_fq}' '${input_reverse_fq}' cutadapt --version &> v_cutadapt.txt """ diff --git a/tools/cutadapt/test/main.nf b/tools/cutadapt/test/main.nf new file mode 100644 index 00000000..69c1eef8 --- /dev/null +++ b/tools/cutadapt/test/main.nf @@ -0,0 +1,22 @@ +#!/usr/bin/env nextflow +nextflow.preview.dsl = 2 +include '../../../nf-core/module_testing/check_process_outputs.nf' params(params) +include '../main.nf' params(params) + +// Define input channels +readPaths = [ + [ sample: 'SRR4238351', + R1: '../../../test-datasets/tools/cutadapt/input/SRR396636.sra_1.fastq', + R2: '../../../test-datasets/tools/cutadapt/input/SRR396636.sra_2.fastq' + ] +] +Channel + .from(readPaths) + .map { row -> tuple( row.sample_name, file(row.R1.trim()), file(row.R2.trim()) ) } + .set { ch_read_files } + +// Run the workflow +workflow { + cutadapt(ch_read_files) + // .check_output() +} diff --git a/tools/cutadapt/test/nextflow.config b/tools/cutadapt/test/nextflow.config new file mode 100644 index 00000000..b1c505a7 --- /dev/null +++ b/tools/cutadapt/test/nextflow.config @@ -0,0 +1,8 @@ +docker.enabled = true +params.outdir = './results' + +params{ + //preprocessing options + cutadapt_min_length = 40 + cutadapt_min_quality = 25 +} From 490eca706c3d2ecc52395d977e5fe29145eba60c Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 13:23:12 +0000 Subject: [PATCH 12/30] single and paired end supported --- tools/cutadapt/main.nf | 42 +++++++++++++------ tools/cutadapt/test/main.nf | 22 ---------- tools/cutadapt/test_paired/main.nf | 14 +++++++ tools/cutadapt/test_paired/nextflow.config | 9 ++++ tools/cutadapt/test_single/main.nf | 21 ++++++++++ .../{test => test_single}/nextflow.config | 1 + 6 files changed, 75 insertions(+), 34 deletions(-) delete mode 100644 tools/cutadapt/test/main.nf create mode 100644 tools/cutadapt/test_paired/main.nf create mode 100644 tools/cutadapt/test_paired/nextflow.config create mode 100644 tools/cutadapt/test_single/main.nf rename tools/cutadapt/{test => test_single}/nextflow.config (87%) diff --git a/tools/cutadapt/main.nf b/tools/cutadapt/main.nf index 432eccb4..bdd444af 100644 --- a/tools/cutadapt/main.nf +++ b/tools/cutadapt/main.nf @@ -4,24 +4,42 @@ process cutadapt { container 'quay.io/biocontainers/cutadapt:1.16--py27_1' input: - tuple sample_id, file(input_forward_fq), file(input_reverse_fq) + tuple val(sample_id), file(reads) output: - tuple sample_id, file(forward_fq), file(reverse_fq) + tuple sample_id, file("trimmed_*.fastq") script: - forward_fq = "trimmed_forward.fastq" - reverse_fq = "trimmed_reverse.fastq" + forward_fq = "trimmed_1.fastq" + reverse_fq = "trimmed_2.fastq" - """ - cutadapt \ - -j ${task.cpus} \ - -q $params.cutadapt_min_quality \ - --minimum-length $params.cutadapt_min_length \ - --pair-filter=any \ - --output ${forward_fq} \ - --paired-output ${reverse_fq} '${input_forward_fq}' '${input_reverse_fq}' + if (params.singleEnd) { + processing = """ + cutadapt \ + -j ${task.cpus} \ + -q $params.cutadapt_min_quality \ + --minimum-length $params.cutadapt_min_length \ + --output ${forward_fq} \ + ${reads} + """ + } else { + processing = """ + cutadapt \ + -j ${task.cpus} \ + -q $params.cutadapt_min_quality \ + --minimum-length $params.cutadapt_min_length \ + --pair-filter=any \ + --output ${forward_fq} \ + --paired-output ${reverse_fq} ${reads} + + + """ + } + + version = """ cutadapt --version &> v_cutadapt.txt """ + + return processing + version } diff --git a/tools/cutadapt/test/main.nf b/tools/cutadapt/test/main.nf deleted file mode 100644 index 69c1eef8..00000000 --- a/tools/cutadapt/test/main.nf +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env nextflow -nextflow.preview.dsl = 2 -include '../../../nf-core/module_testing/check_process_outputs.nf' params(params) -include '../main.nf' params(params) - -// Define input channels -readPaths = [ - [ sample: 'SRR4238351', - R1: '../../../test-datasets/tools/cutadapt/input/SRR396636.sra_1.fastq', - R2: '../../../test-datasets/tools/cutadapt/input/SRR396636.sra_2.fastq' - ] -] -Channel - .from(readPaths) - .map { row -> tuple( row.sample_name, file(row.R1.trim()), file(row.R2.trim()) ) } - .set { ch_read_files } - -// Run the workflow -workflow { - cutadapt(ch_read_files) - // .check_output() -} diff --git a/tools/cutadapt/test_paired/main.nf b/tools/cutadapt/test_paired/main.nf new file mode 100644 index 00000000..46d0fdc6 --- /dev/null +++ b/tools/cutadapt/test_paired/main.nf @@ -0,0 +1,14 @@ +#!/usr/bin/env nextflow +nextflow.preview.dsl = 2 +include '../main.nf' params(params) + +// Define input channels + +Channel + .fromFilePairs('../../../test-datasets/tools/cutadapt/input/*_{1,2}.fastq' ) + .set { ch_read_files } + +// Run the workflow +workflow { + cutadapt(ch_read_files) +} diff --git a/tools/cutadapt/test_paired/nextflow.config b/tools/cutadapt/test_paired/nextflow.config new file mode 100644 index 00000000..08e52203 --- /dev/null +++ b/tools/cutadapt/test_paired/nextflow.config @@ -0,0 +1,9 @@ +docker.enabled = true +params.outdir = './results' + +params{ + //preprocessing options + cutadapt_min_length = 40 + cutadapt_min_quality = 25 + singleEnd = false +} diff --git a/tools/cutadapt/test_single/main.nf b/tools/cutadapt/test_single/main.nf new file mode 100644 index 00000000..96947ad0 --- /dev/null +++ b/tools/cutadapt/test_single/main.nf @@ -0,0 +1,21 @@ +#!/usr/bin/env nextflow +nextflow.preview.dsl = 2 +include '../main.nf' params(params) + +// Define input channels + +readPaths = [ + ['SRR4238351', '../../../test-datasets/tools/fastqc/input/SRR4238351_subsamp.fastq.gz'], + ['SRR4238355', '../../../test-datasets/tools/fastqc/input/SRR4238355_subsamp.fastq.gz'], + ['SRR4238359', '../../../test-datasets/tools/fastqc/input/SRR4238359_subsamp.fastq.gz'], + ['SRR4238379', '../../../test-datasets/tools/fastqc/input/SRR4238379_subsamp.fastq.gz'] +] +Channel + .from(readPaths) + .map { row -> [ row[0], [ file(row[1]) ] ] } + .set { ch_read_files } + +// Run the workflow +workflow { + cutadapt(ch_read_files) +} diff --git a/tools/cutadapt/test/nextflow.config b/tools/cutadapt/test_single/nextflow.config similarity index 87% rename from tools/cutadapt/test/nextflow.config rename to tools/cutadapt/test_single/nextflow.config index b1c505a7..4b805ff3 100644 --- a/tools/cutadapt/test/nextflow.config +++ b/tools/cutadapt/test_single/nextflow.config @@ -5,4 +5,5 @@ params{ //preprocessing options cutadapt_min_length = 40 cutadapt_min_quality = 25 + singleEnd = true } From 1c941ef8d667a7d078f9f4e606c6358b689beb7d Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 13:59:14 +0000 Subject: [PATCH 13/30] Update test-data commit and references --- test-datasets | 2 +- tools/cutadapt/test_single/main.nf | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test-datasets b/test-datasets index be215c08..aae85a5c 160000 --- a/test-datasets +++ b/test-datasets @@ -1 +1 @@ -Subproject commit be215c0874e2485f0d8e12a6f0addf08f2cd08df +Subproject commit aae85a5c9c72238959108212481ce83bae569709 diff --git a/tools/cutadapt/test_single/main.nf b/tools/cutadapt/test_single/main.nf index 96947ad0..657e2428 100644 --- a/tools/cutadapt/test_single/main.nf +++ b/tools/cutadapt/test_single/main.nf @@ -5,10 +5,10 @@ include '../main.nf' params(params) // Define input channels readPaths = [ - ['SRR4238351', '../../../test-datasets/tools/fastqc/input/SRR4238351_subsamp.fastq.gz'], - ['SRR4238355', '../../../test-datasets/tools/fastqc/input/SRR4238355_subsamp.fastq.gz'], - ['SRR4238359', '../../../test-datasets/tools/fastqc/input/SRR4238359_subsamp.fastq.gz'], - ['SRR4238379', '../../../test-datasets/tools/fastqc/input/SRR4238379_subsamp.fastq.gz'] + ['SRR4238351', '../../../test-datasets/tools/cutadapt/input/SRR4238351_subsamp.fastq.gz'], + ['SRR4238355', '../../../test-datasets/tools/cutadapt/input/SRR4238355_subsamp.fastq.gz'], + ['SRR4238359', '../../../test-datasets/tools/cutadapt/input/SRR4238359_subsamp.fastq.gz'], + ['SRR4238379', '../../../test-datasets/tools/cutadapt/input/SRR4238379_subsamp.fastq.gz'] ] Channel .from(readPaths) From c90474202c3ff4b381ca184be6cd2a7b5914365a Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:23:32 +0000 Subject: [PATCH 14/30] update meta --- tools/cutadapt/meta.yml | 62 +++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 33 deletions(-) diff --git a/tools/cutadapt/meta.yml b/tools/cutadapt/meta.yml index e4e1deb6..8df0b244 100644 --- a/tools/cutadapt/meta.yml +++ b/tools/cutadapt/meta.yml @@ -1,40 +1,36 @@ name: Cutadapt description: cutadapt removes adapter sequences from high-throughput sequencing reads keywords: - - Quality Control - - QC - - Adapters + - Quality Control + - QC + - Adapters tools: - - fastqc: - description: | - Cutadapt finds and removes adapter sequences, primers, poly-A tails and other types of unwanted sequence - from your high-throughput sequencing reads. - - Cleaning your data in this way is often required: Reads from small-RNA sequencing contain the 3’ - sequencing adapter because the read is longer than the molecule that is sequenced. Amplicon reads - start with a primer sequence. Poly-A tails are useful for pulling out RNA from your sample, but - often you don’t want them to be in your reads. - homepage: https://cutadapt.readthedocs.io/en/stable/ - documentation: https://cutadapt.readthedocs.io/en/stable/ + - fastqc: + description: | + Cutadapt finds and removes adapter sequences, primers, poly-A tails and other types of unwanted sequence + from your high-throughput sequencing reads. + + Cleaning your data in this way is often required: Reads from small-RNA sequencing contain the 3’ + sequencing adapter because the read is longer than the molecule that is sequenced. Amplicon reads + start with a primer sequence. Poly-A tails are useful for pulling out RNA from your sample, but + often you don’t want them to be in your reads. + homepage: https://cutadapt.readthedocs.io/en/stable/ + documentation: https://cutadapt.readthedocs.io/en/stable/ input: - - - sample_id: - type: string - description: Sample identifier - - input_forward_fq: - type: file - description: Input FastQ forward read file of the pair - - input_reverse_fq: - type: file - description: Input FastQ reverse read file of the pair + - + - sample_id: + type: string + description: Sample identifier + - reads: + type: file + description: Input FastQ file, or pair of files output: - - - sample_id: - type: string - description: Sample identifier - - output_forward_fq: - type: file - description: Output FastQ forward read file of the pair - - output_reverse_fq: - type: file - description: Output FastQ reverse read file of the pair + - + - sample_id: + type: string + description: Sample identifier + - reads: + type: file + description: trimmed FastQ file, or pair of files authors: - - @piotr-faba-ardigen + - @piotr-faba-ardigen From f33dd2d2e9f322535dffd572079969e6862f7a1c Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:31:44 +0000 Subject: [PATCH 15/30] add ci test --- .github/workflows/cutadapt.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/cutadapt.yml diff --git a/.github/workflows/cutadapt.yml b/.github/workflows/cutadapt.yml new file mode 100644 index 00000000..c7e5d8b1 --- /dev/null +++ b/.github/workflows/cutadapt.yml @@ -0,0 +1,22 @@ +name: cutadapt +on: + push: {} + pull_request: + paths: tools/cutadapt/* + +jobs: + run_ci_test: + runs-on: ubuntu-latest + + steps: + # Check out the repository + - uses: actions/checkout@v1 + submodules: true + + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + + # Test the module + - run: nextflow run ./tools/cutadapt/sort/test_paired/ -ansi-log false From 977a9b3ee8c6a425ae6521d0774bcff33f7baad9 Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:34:34 +0000 Subject: [PATCH 16/30] test fix --- .github/workflows/cutadapt.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cutadapt.yml b/.github/workflows/cutadapt.yml index c7e5d8b1..3058bd23 100644 --- a/.github/workflows/cutadapt.yml +++ b/.github/workflows/cutadapt.yml @@ -10,8 +10,13 @@ jobs: steps: # Check out the repository - - uses: actions/checkout@v1 - submodules: true + - uses: actions/checkout@v2 + - name: Checkout submodules + shell: bash + run: | + auth_header="$(git config --local --get http.https://github.com/.extraheader)" + git submodule sync --recursive + git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1 - name: Install Nextflow run: | From 36cad5059347e8d420e034aecf10387fdfba9b79 Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:38:49 +0000 Subject: [PATCH 17/30] test submodules checkout --- .github/workflows/cutadapt.yml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/.github/workflows/cutadapt.yml b/.github/workflows/cutadapt.yml index 3058bd23..81c734ad 100644 --- a/.github/workflows/cutadapt.yml +++ b/.github/workflows/cutadapt.yml @@ -10,13 +10,8 @@ jobs: steps: # Check out the repository - - uses: actions/checkout@v2 - - name: Checkout submodules - shell: bash - run: | - auth_header="$(git config --local --get http.https://github.com/.extraheader)" - git submodule sync --recursive - git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1 + - uses: actions/checkout@v1 + submodules: true - name: Install Nextflow run: | @@ -24,4 +19,4 @@ jobs: sudo mv nextflow /usr/local/bin/ # Test the module - - run: nextflow run ./tools/cutadapt/sort/test_paired/ -ansi-log false + - run: nextflow run ./tools/cutadapt/sort/test_paired/main.nf -ansi-log false From 660be047083e39bcc36c7e65d8401c7a66b6e8fd Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:41:37 +0000 Subject: [PATCH 18/30] fix test --- .github/workflows/cutadapt.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cutadapt.yml b/.github/workflows/cutadapt.yml index 81c734ad..0aa773d8 100644 --- a/.github/workflows/cutadapt.yml +++ b/.github/workflows/cutadapt.yml @@ -10,8 +10,13 @@ jobs: steps: # Check out the repository - - uses: actions/checkout@v1 - submodules: true + - uses: actions/checkout@v2 + - name: Checkout submodules + shell: bash + run: | + auth_header="$(git config --local --get http.https://github.com/.extraheader)" + git submodule sync --recursive + git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1 - name: Install Nextflow run: | From 2646e55e2b1fac534c47b94d0ccc3efdcf1f5072 Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:50:29 +0000 Subject: [PATCH 19/30] get test working --- .github/workflows/cutadapt.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cutadapt.yml b/.github/workflows/cutadapt.yml index 0aa773d8..9d9f5a2c 100644 --- a/.github/workflows/cutadapt.yml +++ b/.github/workflows/cutadapt.yml @@ -24,4 +24,6 @@ jobs: sudo mv nextflow /usr/local/bin/ # Test the module - - run: nextflow run ./tools/cutadapt/sort/test_paired/main.nf -ansi-log false + - run: | + cd tools/cutadapt/sort/test_paired/ + nextflow run . -ansi-log false From fa134a1196d92a883d2f1a0cffce805482cb6dfb Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:54:26 +0000 Subject: [PATCH 20/30] fix path error --- .github/workflows/cutadapt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cutadapt.yml b/.github/workflows/cutadapt.yml index 9d9f5a2c..c30f4ff3 100644 --- a/.github/workflows/cutadapt.yml +++ b/.github/workflows/cutadapt.yml @@ -25,5 +25,5 @@ jobs: # Test the module - run: | - cd tools/cutadapt/sort/test_paired/ + cd tools/cutadapt/test_paired/ nextflow run . -ansi-log false From 6fd86ad9e5ae26c608e80472ec8f69e2bad93ed6 Mon Sep 17 00:00:00 2001 From: Piotr Faba Date: Fri, 6 Mar 2020 14:56:33 +0000 Subject: [PATCH 21/30] 2 tests --- .github/workflows/cutadapt.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cutadapt.yml b/.github/workflows/cutadapt.yml index c30f4ff3..ba92681d 100644 --- a/.github/workflows/cutadapt.yml +++ b/.github/workflows/cutadapt.yml @@ -23,7 +23,12 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - # Test the module - - run: | + - name: Test module with paired-end data + run: | cd tools/cutadapt/test_paired/ nextflow run . -ansi-log false + + - name: Test module with single-end data + run: | + cd tools/cutadapt/test_single/ + nextflow run . -ansi-log false From 4303ec700cf685f07569ac301475361e8680ab2a Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 16 Mar 2020 14:06:03 +0100 Subject: [PATCH 22/30] Propose module organization See above changes to readme :_) --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b97d8e1e..375e3ab9 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > DSL2 IS AN EXPERIMENTAL FEATURE UNDER DEVELOPMENT. SYNTAX, ORGANISATION AND LAYOUT OF THIS REPOSITORY MAY CHANGE IN THE NEAR FUTURE! -A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl2.htmlhttps://www.nextflow.io/docs/edge/dsl2.html) module files containing tool-specific process definitions and their associated documentation. +A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl2.htmlhttps://www.nextflow.io/docs/edge/dsl2.html) module files and subworkflows containing tool-specific process definitions and their associated documentation. ## Table of contents * [Using existing modules](#using-existing-modules) @@ -14,6 +14,21 @@ A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl * [Uploading to `nf-core/modules`](#uploading-to-nf-coremodules) * [Help](#help) +## Terminology + +The DSLv2 features for Nextflow are new for everyone and not just beginners. We discussed some terminology terms to discuss things related to modules & subworkflows more appropriately: + +* *Module*: An "atomic" module (one thing), e.g. a reusable process from an old pipeline that can be used between different pipelines +* *Subworkflow*: A combined set of modules, that do e.g. preprocessing for a much bigger pipeline. A good example could be a QC subworkflow for FastQ input, that could be (re-) used across multiple pipelines +* *Workflow*: What DSLv1 users would consider a pipeline, e.g. from input to potentially complex output. Can either consist of individual modules, a large monolithic script as in DSLv1 or a combination of subworkflows (or any combination of these three). + +## Organization of repository + +* Modules should end up in the subdirectory `modules` +* Subworkflows that are of general interest should end up in `subworkflows` IF they are useful for multiple pipelines (which will be clarified via Review) + +Individual pipelines that want to utilize subworkflows to keep their code base cleaner, should probably start implementing subworkflows and then decide / find out which parts can be made accessible to a broader audience here. + ## Using existing modules The Nextflow [`include`](https://www.nextflow.io/docs/edge/dsl2.html#modules-include) statement can be used within your pipelines in order to load module files that you have available locally. From 9753e803e0f34b933bfd2089aa3b9bfd736d9508 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 16 Mar 2020 14:27:08 +0100 Subject: [PATCH 23/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 375e3ab9..531dea64 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ The DSLv2 features for Nextflow are new for everyone and not just beginners. We ## Organization of repository -* Modules should end up in the subdirectory `modules` +* Modules should end up in the subdirectory `tools` * Subworkflows that are of general interest should end up in `subworkflows` IF they are useful for multiple pipelines (which will be clarified via Review) Individual pipelines that want to utilize subworkflows to keep their code base cleaner, should probably start implementing subworkflows and then decide / find out which parts can be made accessible to a broader audience here. From f091e174c026dc5f4f535d71f4ac9789cd65f7eb Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 16 Mar 2020 14:37:07 +0100 Subject: [PATCH 24/30] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 531dea64..22de0bbe 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,7 @@ The DSLv2 features for Nextflow are new for everyone and not just beginners. We ## Organization of repository * Modules should end up in the subdirectory `tools` -* Subworkflows that are of general interest should end up in `subworkflows` IF they are useful for multiple pipelines (which will be clarified via Review) - -Individual pipelines that want to utilize subworkflows to keep their code base cleaner, should probably start implementing subworkflows and then decide / find out which parts can be made accessible to a broader audience here. +* Subworkflows should be kept with individual pipelines, and not end up here in the modules repository. ## Using existing modules From 05b4bbe8a112348fa5a9c997e06fba44e7c4d546 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 16 Mar 2020 14:39:27 +0100 Subject: [PATCH 25/30] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 22de0bbe..c1696045 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,8 @@ A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl The DSLv2 features for Nextflow are new for everyone and not just beginners. We discussed some terminology terms to discuss things related to modules & subworkflows more appropriately: -* *Module*: An "atomic" module (one thing), e.g. a reusable process from an old pipeline that can be used between different pipelines -* *Subworkflow*: A combined set of modules, that do e.g. preprocessing for a much bigger pipeline. A good example could be a QC subworkflow for FastQ input, that could be (re-) used across multiple pipelines +* *Module*: A `process`that can be used between different pipelines, which is atomic (i.e. can/should not be divided further). +* *Subworkflow*: A combined set of modules, that combine a logical step in a pipeline using multiple modules together. Example: A preprocessing subworkflow for FastQ input, that could be (re-) used across multiple pipelines to QC input FastQ files. * *Workflow*: What DSLv1 users would consider a pipeline, e.g. from input to potentially complex output. Can either consist of individual modules, a large monolithic script as in DSLv1 or a combination of subworkflows (or any combination of these three). ## Organization of repository From 771e53625bc5ae54711054007947df1f5ed5b391 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 16 Mar 2020 14:42:22 +0100 Subject: [PATCH 26/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1696045..a932ff72 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > DSL2 IS AN EXPERIMENTAL FEATURE UNDER DEVELOPMENT. SYNTAX, ORGANISATION AND LAYOUT OF THIS REPOSITORY MAY CHANGE IN THE NEAR FUTURE! -A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl2.htmlhttps://www.nextflow.io/docs/edge/dsl2.html) module files and subworkflows containing tool-specific process definitions and their associated documentation. +A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl2.htmlhttps://www.nextflow.io/docs/edge/dsl2.html) module files containing tool-specific process definitions and their associated documentation. ## Table of contents * [Using existing modules](#using-existing-modules) From 95d57bcef296ade45d431b71cfed208d59145b68 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 16 Mar 2020 15:42:52 +0100 Subject: [PATCH 27/30] Apply suggestions from code review Co-Authored-By: Harshil Patel --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a932ff72..a422d95a 100644 --- a/README.md +++ b/README.md @@ -16,16 +16,16 @@ A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl ## Terminology -The DSLv2 features for Nextflow are new for everyone and not just beginners. We discussed some terminology terms to discuss things related to modules & subworkflows more appropriately: +The features offered by Nextflow DSL 2 can be used in various ways depending on the granularity with which you would like to write pipelines. Please see the listing below for the hierarchy and associated terminology we have decided to use when referring to DSL 2 components: -* *Module*: A `process`that can be used between different pipelines, which is atomic (i.e. can/should not be divided further). -* *Subworkflow*: A combined set of modules, that combine a logical step in a pipeline using multiple modules together. Example: A preprocessing subworkflow for FastQ input, that could be (re-) used across multiple pipelines to QC input FastQ files. -* *Workflow*: What DSLv1 users would consider a pipeline, e.g. from input to potentially complex output. Can either consist of individual modules, a large monolithic script as in DSLv1 or a combination of subworkflows (or any combination of these three). +* *Module*: A `process`that can be used within different pipelines and is as atomic as possible i.e. cannot be split into another module. An example of this would be a module file containing the process definition for a single tool such as `FastQC`. +* *Sub-workflow*: A chain of multiple modules that offer a higher-level of functionality within the context of a pipeline. For example, a sub-workflow to run multiple QC tools with FastQ files as input. +* *Workflow*: What DSL 1 users would consider an end-to-end pipeline. For example, from one or more inputs to a series of outputs. This can either be implemented using a large monolithic script as with DSL 1, or by using a combination of DSL 2 individual modules and sub-workflows. ## Organization of repository -* Modules should end up in the subdirectory `tools` -* Subworkflows should be kept with individual pipelines, and not end up here in the modules repository. +* This repository has been created to only host atomic module files that should be added to the `tools` sub-directory along with the required documentation, software and tests. +* Sub-workflows should be shipped with the pipeline implementation and if required they should be shared amongst different pipelines directly from there. As it stands, this repository will not host sub-workflows. ## Using existing modules From 300e89c4dcd4ede25c82bff5f3edfc2d7a868be3 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 16 Mar 2020 14:47:03 +0000 Subject: [PATCH 28/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a422d95a..efb98cb0 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl The features offered by Nextflow DSL 2 can be used in various ways depending on the granularity with which you would like to write pipelines. Please see the listing below for the hierarchy and associated terminology we have decided to use when referring to DSL 2 components: -* *Module*: A `process`that can be used within different pipelines and is as atomic as possible i.e. cannot be split into another module. An example of this would be a module file containing the process definition for a single tool such as `FastQC`. +* *Module*: A `process`that can be used within different pipelines and is as atomic as possible i.e. cannot be split into another module. An example of this would be a module file containing the process definition for a single tool such as `FastQC`. This repository has been created to only host atomic module files that should be added to the `tools` sub-directory along with the required documentation, software and tests. * *Sub-workflow*: A chain of multiple modules that offer a higher-level of functionality within the context of a pipeline. For example, a sub-workflow to run multiple QC tools with FastQ files as input. * *Workflow*: What DSL 1 users would consider an end-to-end pipeline. For example, from one or more inputs to a series of outputs. This can either be implemented using a large monolithic script as with DSL 1, or by using a combination of DSL 2 individual modules and sub-workflows. From d553406fa5de4f0236456371c56c9681911bd42c Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 16 Mar 2020 14:47:11 +0000 Subject: [PATCH 29/30] Update README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index efb98cb0..cb21a0b8 100644 --- a/README.md +++ b/README.md @@ -22,11 +22,6 @@ The features offered by Nextflow DSL 2 can be used in various ways depending on * *Sub-workflow*: A chain of multiple modules that offer a higher-level of functionality within the context of a pipeline. For example, a sub-workflow to run multiple QC tools with FastQ files as input. * *Workflow*: What DSL 1 users would consider an end-to-end pipeline. For example, from one or more inputs to a series of outputs. This can either be implemented using a large monolithic script as with DSL 1, or by using a combination of DSL 2 individual modules and sub-workflows. -## Organization of repository - -* This repository has been created to only host atomic module files that should be added to the `tools` sub-directory along with the required documentation, software and tests. -* Sub-workflows should be shipped with the pipeline implementation and if required they should be shared amongst different pipelines directly from there. As it stands, this repository will not host sub-workflows. - ## Using existing modules The Nextflow [`include`](https://www.nextflow.io/docs/edge/dsl2.html#modules-include) statement can be used within your pipelines in order to load module files that you have available locally. From 5e71d61f27156b26a028a73f45c70281ed00c237 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Mon, 16 Mar 2020 14:47:20 +0000 Subject: [PATCH 30/30] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cb21a0b8..276f8943 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ A repository for hosting nextflow [`DSL2`](https://www.nextflow.io/docs/edge/dsl The features offered by Nextflow DSL 2 can be used in various ways depending on the granularity with which you would like to write pipelines. Please see the listing below for the hierarchy and associated terminology we have decided to use when referring to DSL 2 components: * *Module*: A `process`that can be used within different pipelines and is as atomic as possible i.e. cannot be split into another module. An example of this would be a module file containing the process definition for a single tool such as `FastQC`. This repository has been created to only host atomic module files that should be added to the `tools` sub-directory along with the required documentation, software and tests. -* *Sub-workflow*: A chain of multiple modules that offer a higher-level of functionality within the context of a pipeline. For example, a sub-workflow to run multiple QC tools with FastQ files as input. +* *Sub-workflow*: A chain of multiple modules that offer a higher-level of functionality within the context of a pipeline. For example, a sub-workflow to run multiple QC tools with FastQ files as input. Sub-workflows should be shipped with the pipeline implementation and if required they should be shared amongst different pipelines directly from there. As it stands, this repository will not host sub-workflows. * *Workflow*: What DSL 1 users would consider an end-to-end pipeline. For example, from one or more inputs to a series of outputs. This can either be implemented using a large monolithic script as with DSL 1, or by using a combination of DSL 2 individual modules and sub-workflows. ## Using existing modules