From 62e906cdb0c0f95d058281c835b78a561475a575 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 20 Jan 2021 14:59:01 +1000 Subject: [PATCH 01/46] Update README.md --- README.md | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 39256cc..e230ab2 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ For more information please see our preprint here: **URL for BioRxiv** Please note that this pipeline does not perform extensive quality assessment of the input sequencing data. Contamination and sequencing read quality should be assessed independently to avoid problems with assembly. -#Contents +# Contents * [Quickstart](#quickstart) * [Installation](#installation) @@ -29,7 +29,7 @@ Please note that this pipeline does not perform extensive quality assessment of * [Comments](#comments) -#Quickstart +# Quickstart 1. Basecalling, demultiplexing and assembly workflow @@ -44,7 +44,7 @@ Please note that this pipeline does not perform extensive quality assessment of `nextflow main.nf --samplesheet /path/to/samples.csv --outdir /path/to/outdir/` -#Installation +# Installation microPIPE has been built using Nextflow and Singularity to enable ease of use and installation across different platforms. @@ -67,7 +67,7 @@ It will create the nextflow main executable file in the current directory. Optio microPIPE only requires the `main.nf` and `nexflow.config` files to run. You will also need to provide a samplesheet (explained below). -#Usage +# Usage **1. Prepare the Nextflow configuration file** @@ -95,7 +95,7 @@ params { gpu = false <-- change this to "true" ``` -Enabling GPU will result in Guppy (basecalling) and Racon processes to be completed using the GPU resource. +Enabling GPU will result in Guppy (basecalling and/or demultiplexing) process to be completed using the GPU resource. **2. Prepare the samplesheet file (csv)** @@ -208,7 +208,7 @@ barcode01,S24,barcode01.fastq.gz,S24EC.filtered_1P.fastq.gz,S24EC.filtered_2P.fa barcode02,S34,barcode02.fastq.gz,S34EC.filtered_1P.fastq.gz,S34EC.filtered_2P.fastq.gz,5.5m ``` -#Example data +# Example data To test the pipeline, we have provided some [test data](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/tree/main/test_data). In here you will find: @@ -226,7 +226,7 @@ To test the assembly-only pipeline, edit the `sample_1.csv` samplesheet to point `nextflow main.nf --samplesheet /path/to/samples_1.csv --outdir /path/to/test_outdir/` -#Optional parameters +# Optional parameters Some parameters can be added to the command line in order to include or skip some steps and modify some parameters: @@ -280,7 +280,7 @@ Assembly evaluation: * `--quast_args`: QUAST optional parameters (default=""), see [details](http://quast.sourceforge.net/docs/manual.html#sec2.3) * `--quast_threads`: number of threads for QUAST (default=1) -#Structure of the output folders +# Structure of the output folders The pipeline will create several folders corresponding to the different steps of the pipeline. The main output folder (`--outdir`) will contain the following folders: @@ -295,8 +295,10 @@ Each sample folder will contain the following folders: * **4_polishing_short_reads:** Final polished assembly fasta file (sample_id_flye_polishedLR_SR.fasta) * **5_quast:** QUAST quality assessment report, see [details](http://quast.sourceforge.net/docs/manual.html) -#Comments +# Comments The pipeline has been tested using the following grid based executors: SLURM, PBS Pro and LSF. Planned upgrades: +- Enabling GPU resource for Racon and Medaka processes. + From 46a884cdffe044b7f4597c0457ef21c372f0b5dd Mon Sep 17 00:00:00 2001 From: Leah Roberts Date: Wed, 20 Jan 2021 17:48:33 +0000 Subject: [PATCH 02/46] fixed some small edits --- README.md | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e230ab2..0d65ee9 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ microPIPE only requires the `main.nf` and `nexflow.config` files to run. You wil When a Nexflow pipeline script is launched, Nextflow looks for a file named **nextflow.config** in the current directory. The configuration file defines default parameters values for the pipeline and cluster settings such as the executor (e.g. "slurm", "local") and queues to be used (https://www.nextflow.io/docs/latest/config.html). -The pipeline uses separated Singularity containers for all processes. Nextflow will automatically pull the singularity images required to run the pipeline and cache those images in the singularity directory in the pipeline work directory by default or in the singularity.cacheDir specified in the [nextflow.config]((https://www.nextflow.io/docs/latest/singularity.html) file: +The pipeline uses separated Singularity containers for all processes. Nextflow will automatically pull the singularity images required to run the pipeline and cache those images in the singularity directory in the pipeline work directory by default or in the singularity.cacheDir specified in the [nextflow.config](https://www.nextflow.io/docs/latest/singularity.html) file: ``` singularity { @@ -83,19 +83,10 @@ singularity { } ``` -An example configuration file can be found in the [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). +An example configuration file can be found in this [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). -**NOTE:** to use GPU resources, you must edit the `nextflow.config` file: +**NOTE:** to use **GPU** resources for basecalling and demultiplexing, use the `--gpu` flag. -``` -params { - outdir = './results' - basecalling = false - demultiplexing = false - gpu = false <-- change this to "true" -``` - -Enabling GPU will result in Guppy (basecalling and/or demultiplexing) process to be completed using the GPU resource. **2. Prepare the samplesheet file (csv)** @@ -210,7 +201,7 @@ barcode02,S34,barcode02.fastq.gz,S34EC.filtered_1P.fastq.gz,S34EC.filtered_2P.fa # Example data -To test the pipeline, we have provided some [test data](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/tree/main/test_data). In here you will find: +To test the pipeline, we have provided some [test data](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/tree/main/test_data). In this directory you will find: File | Description ---|--- From c175d2d8970ac9e38662cabc10a1d016a13464be Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Fri, 22 Jan 2021 15:23:55 +1000 Subject: [PATCH 03/46] Add config file for microPIPE v0.9 --- nextflow.config | 6 +-- nextflow.config.v0.9 | 95 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 nextflow.config.v0.9 diff --git a/nextflow.config b/nextflow.config index 7b75323..c2f9b09 100644 --- a/nextflow.config +++ b/nextflow.config @@ -3,8 +3,8 @@ process { withLabel: cpu { queue = 'main' } withLabel: gpu { queue = 'gpu' } withLabel: big_mem { memory = 32.GB } - withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.6.1'} - withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } + withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.4.3'} + withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.4.3' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } @@ -88,7 +88,7 @@ dag { manifest { name = 'microPIPE' author = 'Valentine Murigneux' - description = 'Bacterial genome assembly pipeline.' + description = 'Bacterial genome assembly pipeline' mainScript = 'main.nf' version = '0.8' } diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 new file mode 100644 index 0000000..9fec2e8 --- /dev/null +++ b/nextflow.config.v0.9 @@ -0,0 +1,95 @@ +process { + executor='slurm' + withLabel: cpu { queue = 'main' } + withLabel: gpu { queue = 'gpu' } + withLabel: big_mem { memory = 32.GB } + withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.6.1'} + withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } + withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } + withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } + withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } + withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } + withName: japsa { container = 'docker://vmurigneux/japsa:latest' } + withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } + withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } + withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } + withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } + withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } + withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } +} + +singularity { + enabled = true + autoMounts = true +} + +params { + outdir = './results' + basecalling = false + demultiplexing = false + gpu = false # CHANGE THIS TO TRUE TO ENABLE GPU BASECALLING + fast5 = false + fastq = false + demultiplexer = 'guppy' + guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" + guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" + kit = false + flowcell = false + guppy_gpu_device = "auto" + guppy_num_callers = 8 + guppy_cpu_threads_per_caller = 1 + guppy_basecaller_args = "--recursive --trim_barcodes -q 0" + guppy_barcoder_args = "--recursive --trim_barcodes -q 0" + guppy_barcode_kits= "SQK-RBK004" + guppy_barcoder_threads = 2 + qcat_args = "" + skip_pycoqc = false + skip_porechop = false + skip_filtering = false + filtering = "japsa" + porechop_args = "" + porechop_threads = 4 + japsa_args = "--lenMin 1000 --qualMin 10" + filtlong_args = "--min_length 1000 --keep_percent 90" + flye_args = "--plasmids" + flye_threads = 4 + polisher = "medaka" + racon_nb = 4 + racon_args = "-m 8 -x -6 -g -8 -w 500" + racon_threads = 4 + medaka_model = "r941_min_high" + medaka_threads = 8 + nextpolish_threads = 4 + skip_illumina = false + fixstart_args = "" + skip_fixstart = false + quast_threads = 1 + quast_args = "" + skip_quast = false +} + +trace { + enabled = true + file = "${params.outdir}/trace.txt" +} +timeline { + enabled = true + file = "${params.outdir}/timeline.html" +} +report { + enabled = true + file = "${params.outdir}/report.html" +} +dag { + enabled = true + file = "${params.outdir}/flowchart_dag.svg" +} + +manifest { + name = 'microPIPE' + author = 'Valentine Murigneux' + description = 'Bacterial genome assembly pipeline' + mainScript = 'main.nf' + version = '0.9' +} + From eabe9d115cdd62bca3414dc1811f9c2838d7a162 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 28 Jan 2021 12:54:55 +1000 Subject: [PATCH 04/46] Add subsampling Rasusa step --- README.md | 2 ++ main.nf | 66 +++++++++++++++++++++++++++++++++++++++----- nextflow.config | 3 ++ nextflow.config.v0.9 | 3 ++ 4 files changed, 67 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 0d65ee9..0a48689 100644 --- a/README.md +++ b/README.md @@ -250,6 +250,8 @@ Filtering: * `--filtering`: filtering tool: "japsa" or "filtlong" (default="japsa") * `--japsa_args`: Japsa optional parameters (default="--lenMin 1000 --qualMin 10"), see [details](https://japsa.readthedocs.io/en/latest/tools/jsa.np.filter.html) * `--filtlong_args`: Filtlong optional parameters (default="--min_length 1000 --keep_percent 90"), see [details](https://github.com/rrwick/Filtlong#full-usage) +* `--skip_rasusa`: Skip the sub-sampling Rasusa step +* `--rasusa_coverage`: The desired coverage to sub-sample the reads to (default=100), see [details](https://github.com/mbhall88/rasusa#-c---coverage) Assembly: * `--flye_args`: Flye optional parameters (default="--plasmids") diff --git a/main.nf b/main.nf index 683d0ce..362a70f 100644 --- a/main.nf +++ b/main.nf @@ -70,6 +70,8 @@ def helpMessage() { --filtering Filtering tool: "japsa" or "filtlong" (default="japsa") --japsa_args Japsa optional parameters (default="--lenMin 1000 --qualMin 10"), see https://japsa.readthedocs.io/en/latest/tools/jsa.np.filter.html --filtlong_args Filtlong optional parameters (default="--min_length 1000 --keep_percent 90"), see https://github.com/rrwick/Filtlong#full-usage + --skip_rasusa Skip the sub-sampling Rasusa step + --rasusa_coverage The desired coverage to sub-sample the reads to (default=100) Assembly: --flye_args Flye optional parameters (default="--plasmids") @@ -384,6 +386,29 @@ process pycoqc { """ } +process rasusa { + cpus 1 + tag "${sample}" + label "cpu" + publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*.log", saveAs: { filename -> "${sample}_$filename" } + publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*_version.txt" + input: + tuple val(barcode), file(long_reads), val(sample), file(reads_1), file(reads_2), val(genome_size) + output: + tuple val(barcode), file("subsampled.fastq.gz"), val(sample), file(reads_1), file(reads_2), val(genome_size), emit: subsampled_fastq + path("rasusa.log") + path("rasusa_version.txt") + when: + !params.skip_rasusa + script: + """ + set +eu + rasusa --coverage ${params.rasusa_coverage} --genome-size ${genome_size} --input ${long_reads} --output subsampled.fastq.gz + cp .command.log rasusa.log + rasusa --version > rasusa_version.txt + """ +} + process porechop { cpus "${params.porechop_threads}" tag "${sample}" @@ -658,7 +683,12 @@ workflow assembly { ch_samplesheet main: if (!params.skip_porechop & !params.skip_filtering) { - porechop(ch_samplesheet) + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + porechop(rasusa.out.subsampled_fastq) + } else if (params.skip_rasusa) { + porechop(ch_samplesheet) + } if (params.filtering == "japsa") { japsa(porechop.out.trimmed_fastq) flye(japsa.out.filtered_fastq) @@ -667,18 +697,40 @@ workflow assembly { flye(filtlong.out.filtered_fastq) } } else if (!params.skip_porechop & params.skip_filtering) { - porechop(ch_samplesheet) + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + porechop(rasusa.out.subsampled_fastq) + } else if (params.skip_rasusa) { + porechop(ch_samplesheet) + } flye(porechop.out.trimmed_fastq) } else if (params.skip_porechop & !params.skip_filtering) { if (params.filtering == "japsa") { - japsa(ch_samplesheet) - flye(japsa.out.filtered_fastq) + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + japsa(rasusa.out.subsampled_fastq) + flye(japsa.out.filtered_fastq) + } else if (params.skip_rasusa) { + japsa(ch_samplesheet) + flye(japsa.out.filtered_fastq) + } } else if (params.filtering == "filtlong") { - filtlong(ch_samplesheet) - flye(filtlong.out.filtered_fastq) + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + filtlong(rasusa.out.subsampled_fastq) + flye(filtlong.out.filtered_fastq) + } else if (params.skip_rasusa) { + filtlong(ch_samplesheet) + flye(filtlong.out.filtered_fastq) + } } } else { - flye(ch_samplesheet) + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + flye(rasusa.out.subsampled_fastq) + } else if (params.skip_rasusa) { + flye(ch_samplesheet) + } } if (params.polisher == 'medaka') { racon_cpu(flye.out.assembly_out) diff --git a/nextflow.config b/nextflow.config index c2f9b09..d59d81a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -7,6 +7,7 @@ process { withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.4.3' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } + withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } withName: japsa { container = 'docker://vmurigneux/japsa:latest' } @@ -44,8 +45,10 @@ params { guppy_barcoder_threads = 2 qcat_args = "" skip_pycoqc = false + skip_rasusa = true skip_porechop = false skip_filtering = false + rasusa_coverage = 100 filtering = "japsa" porechop_args = "" porechop_threads = 4 diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 index 9fec2e8..65e1c50 100644 --- a/nextflow.config.v0.9 +++ b/nextflow.config.v0.9 @@ -7,6 +7,7 @@ process { withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } + withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } withName: japsa { container = 'docker://vmurigneux/japsa:latest' } @@ -44,8 +45,10 @@ params { guppy_barcoder_threads = 2 qcat_args = "" skip_pycoqc = false + skip_rasusa = true skip_porechop = false skip_filtering = false + rasusa_coverage = 100 filtering = "japsa" porechop_args = "" porechop_threads = 4 From 12c56f22ddd41bd46c6b4176af2b81b5b6fd3bea Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 1 Feb 2021 15:52:47 +1000 Subject: [PATCH 05/46] Update Fig workflow --- docs/Fig_workflow.png | Bin 54327 -> 82123 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/Fig_workflow.png b/docs/Fig_workflow.png index a045a161743d5c9e37458e438130e7625eb69349..fd85d30de069aeff164fa597f7f77fd91a352805 100644 GIT binary patch literal 82123 zcmZU519W7~)^=>$wylY6b0+H8wrxyo+vZGc+sQ-|Op=Mszh~b2-TSWf_gd-IU8icF zs$IKw)p?$$6RE5yg$RcS2Lb|uC?hSd3IYOV4*V;DfdZDqCCb%;fPhL^iis)9h>4LX zJK39A+L(fX&?Fce8luTC(2N2AhK8e4^t5nJ?y3G)m@GI$QsC=nG92iABLu=)$-9t!0XY`-9wCOXzygm7iH0%OJ;(e$%vK4T- zo?~8oaFS4xVF(EMEaBzvKHvnYF-8P14asg$P{xe;B-o-1r?B7yxxWw)g33^gPS%9& z*H~EyA{e9@WJ5j$T;a<(W;URPOm*c12D+|)eB=$_;;eGw;=JpBe0)6I1K*f{j_QV7 zd_e@6k^^{tTXa?eIyA>pUE4)lL7vap-j)eqVsB*18SPPJ8D=3qQ**lq%a58Z)v5*PEk&uw^JDHgAsftVf zr#bMO0GWl0ivu4sv%9-HlRG<;y^}dJD=#lEGYcCt8yh3A2BWj5oeRK&(axFtA0z)~ zN8Hre*vZnt#nRr6;HdO{&&ZJwbc1nOK$FexBSeN2oO{fFmYif7@E;g3<`)pUjqJf zB_INX*4%~k-__z^zB*A!<%ksit1uv$y%XvmGk;r>NI^*RCKXMSsQjx?cpO&`{J)k# zP`{Fc6=#pBn17}DS0TwkOzr>r6aX`d3aUE&vz%QTTI50$fF7c^MPL(=+0S@csGkV#4wFu!WN|LWf2U+c+t@hi3XKPK+ z8kOpSIXOAUBUWZ+VQ`pq7zQU4y#EaTr_9cJi!}^9d~jJA^^fnK!Jyz!`360H#pMSw zu}G;HU{032pPYWe98P6X8}a)*Iyg`&Xlb<-vy{30;}u~+h~gSkR8-W}PFH#YLc+O9 z4SM+;zLexr&mZhQAf;t$06(1Kwwh(J5)vupIbKHpNg+#aj2X<+MbtIGUwe;}HI zVP6pBYCQmaI!`FR)Acm+hvJZRhY zBZsVEF;vBM659z^gxL|I6GTtKVDIQ4l1BM69l{M{y}n5U0|OH5yd81~Px+Wt=i~rq z(#rt`^G)-7&znOS1Oy6a7p5GsZ;}6mAs5*6^mJj&msXpE-w@*x5I@s|4kIHYuxmXgq%H}zL#dtc$>pDF1+g(P(ySA8?#Dd; zR2&r#KsJBBnGteubWETXG9?4Mmd_t$H0Mv%xjR|13%l!_$Vz@ zlT`c^7VXCj=j2uE3Enjv5x3=w6ZpO#_cODO1iE;`K)bQkS`!>U?G`1n!S+IdVaun8 zgzO+wYu+z+*ZUT;$Ihj)yvT<)Mb|VRd?*RzL15pS+5hn}(98~NhKZsAH;@dmWcT2J z@^i1Q*A&MIB$=`@*cEY7{l}v(0S|7#*EC}BGJN&AfXq(J-jtHfM8%~TQ~m4lw2dd; z-}W}S4Tn|6)acC?>H=jp23_$Jy4sDhZ9VlSHKjRy$xSp2IwgUani=!HoX#0((g`0O z-U2Qc%G`REX|-vs(bS;l-pk+I?H`|?=V#5X&O{S4QE5~saN`dr7pird#QlE>ktw5q zp_SMy{P-3TD<@8#M0ad!AH~IZE1~%{C|SZ&jvJJCTiL?^v9D)@I8xXFe&@RkmkVLa z*NLDyz5#TDlSnjFnmC9kb>7p3GUQUl99cOI%n|wn=!wbjg5haF+Q#H7=wEfgnF%fX z&<`>)<$~7=1owpB;_tlAqcWR%TNt0+*qLD!=$CAFia1VJ>YyJSOT{6g$OFkVrXj#U zpFlB2s(wOG_>8}>>SB9|is@ncPt^x&IKL4yplTS*!#Ggd_HU~F63eM&O8ptH8S^Ov zn%CXgnf#y{=K)}e-8E`v?L@7RYhf8X?>C0|{q5vHT|z8fiu-|lsCwt|7y%dNatzda zg)i_W|EfUoh*qjEe2x}V3Cu@SSXo*53M03e3M@uAL1+3g3xRn4=c$D%*`FjmN)H-Y zqUl9d`F&j0=|C|cei0_Lf0KO{m5gKrB5KlU7}vtma*P!YO(7S?fw<}2_&(`QG?%X= zdDO^WPmAL;Ib1@gz6LwoMyX~UPtIWmCf;7^>HLK`oj?q#x91wDzoEqPnmt0j~# z{x`$W0k;QCOv_3sDlq;-3?+UN8cMRuB3OqH_U>m0gV-RnKMOm*9Jn26sux!fWx$*P zvv*_WoI|O6JB=DD3J!O5$Eeq^7UqBK!TqrZX<8{p1@^i-l4iPhDhTxAwP?PAGk5|` zUE#bD=XkU(1vJnsWtwmTlaIa=tLg+?aBs~Ev&4`zQCO%7Rf-5icM5QI!QbND)C|o& z{oT1TV80&7o2e&Xd82z^+-f$Xf%xP6Ge3W_$!Az#2S0o3BW+9t`?WTfGleH6NSEY* z#CMHoA?-9p(xU!J`Q6;WeXg4uK-VJ-u{cqMMI&TN1tuXvLUYRq3^+0xicXr!BECO~ z_W-!H(jQ=haOMHC_A4w0+XAMk7uqY=$7FKwpY(MZ3#{-W8Q{YA$3Oqs$l;QJ`*^5K z()i!70oDTM=3Z{Jd}X|Cn6HY=9T4689gzv}#QU+zov~4~Y?YC@;0&`{?Fym6jIRx2a8oJWJ1sMq@*B5kL9LqF`_M8gghEUv zxRb+zdF3c0P5X0R&eyRYhoAopD((Jm&36zZE-TMOZx%sO4>oRi9y#qgdr zgu>LzdekTPlJWd3J4`<|cIbiHn8P(YOs{R5EWU{?O=KJB>qh{@sFNniEp0?s16I#_ zCsy|b$83EayIEU#cxGnrw|bCG0e@t_KF4FLe9cKlI>;c^J$Cw&CDEC4FX@*Cj(~w* zH#j%;7;#?W`7hdUXm&EHqB-4e+Ln0GoJn-$+I!yLXz+332By1M*64}w@H&>VLa?=% zNZUIFbi+BsY*Vz_JMHP+&a#6@`=c(kXNgYM6cxlrYh`daUYM-zvLjNqVhXO$k&xcI zV4b16q&jY_XXUc&-qz~pkjQ{%uw(4c0n;d97b79NRXbXJpmH0ic4b>Txe(6feP|t^^vR2{my>6BTZr}1)+~xhXxA2fZaTTWv zSoT`It7Iqg87|ba>2nf>FP!VQbC(HJH~tvv;qMJpSh?&NhGBTM#$dpB8v8w~eu_< zNkA&t?G6J*(+o$196vHUd6HDTlgKGrBT&==s)o#}uBD*7) zkO%-1qd*T2hPilR6>9ocDYC0Ub5GYn(Y|_D0gPn?Ra`)xH!K_6+Jzn6G_mi5QM8k3Qv zRnCI!n4cJ_Dhb|_biz6kp?WQF${J%Yt;{j^L#?n$_4ljbgK#MYYZf4f)#*{^^AF#P z4YPGR5a>T{`jfQ%3Q{FFtNPMg3<>yTu0w6YitdaaxzjDr(}=ADvCr+&Ioy%YuZV+%(T9DH*wVnDkFTjz$iOJm z1AbPh1Z8PUD@1pP86On};BB$YDpG#{b3+!j z8p7j%3QjjVxK-0zD*SF1&4C`7PlT(Uwm=IsK+EIvRN=`lp*2{Fk-qIyDlB_=v2001 z1o!f==C2)-mOq3DK*v)6+gsUBr5T061t5J|=SIIiL{S;fp#b6}SRcRRKjqQq`*Nq& zm9b`Om>|o!UJbDEVjaEn#`o}Vi#27yLh)u4DV@Sa^f+TXzk3Er%eces?>5~dlz!j` z8J5T%kDj_z#uL@FW|E*y|g?Dfvp-Tu-XG}uiJ>)+K1YC8u48f z%m?>7pY+*N^x6yAwzsfLIh-W(aRQ|VN6WWaK-arX?$KCRb@fBLdHOYF#!*Tw!mAx? z8RPcL3|@o7?L6-HFWl8IU(Ry*P7vg6!^ihxWN${26F(lXBn;&uYk2u%4O)f13rb#E z%sH(K!<*mY$F6OCXl0dTllfw=umH8&~y>RV2Qb^ld#mO<}NDQ?@Z)rcZYnApsxLM$Z-8 zJfr$1ok$f>5�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 z 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 literal 54327 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 From e7bd22ce811646aa23e5faa562bdb3f1fb5059a8 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 3 Feb 2021 13:37:33 +1000 Subject: [PATCH 06/46] Add logo --- README.md | 5 ++++- docs/micropipe_logo.png | Bin 0 -> 157194 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 docs/micropipe_logo.png diff --git a/README.md b/README.md index 0a48689..ca362f8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +

Logo

+ **microPIPE: a pipeline for high-quality bacterial genome construction using ONT and Illumina sequencing** ====== @@ -11,7 +13,6 @@ Micropipe has been written in Nextflow and uses Singularity containers. It can u For more information please see our preprint here: **URL for BioRxiv** -

Workflow

@@ -85,6 +86,8 @@ singularity { An example configuration file can be found in this [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). +Two versions of the configuration file are available and corresponds to MicroPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1) as referenced in the paper. + **NOTE:** to use **GPU** resources for basecalling and demultiplexing, use the `--gpu` flag. diff --git a/docs/micropipe_logo.png b/docs/micropipe_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..be038d67b43a11d1b4ce2e63bdd94cb2a9c963b1 GIT binary patch literal 157194 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

K`$N5sHvnL-jSQ@P71IIi^@?_P=0YWR8 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 L3gR`Q27&(r08H^7 literal 0 HcmV?d00001 From c84386858ee844509432f73c67d8577e64f9d98c Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 3 Feb 2021 13:39:03 +1000 Subject: [PATCH 07/46] Add logo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ca362f8..83c49d9 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

Logo

+

Logo

**microPIPE: a pipeline for high-quality bacterial genome construction using ONT and Illumina sequencing** ====== @@ -86,7 +86,7 @@ singularity { An example configuration file can be found in this [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). -Two versions of the configuration file are available and corresponds to MicroPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1) as referenced in the paper. +Two versions of the configuration file are available and corresponds to microPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1) as referenced in the paper. **NOTE:** to use **GPU** resources for basecalling and demultiplexing, use the `--gpu` flag. From 219a1fd3ff034dfeca8fe44e0b18d4292666bbb1 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 3 Feb 2021 13:40:27 +1000 Subject: [PATCH 08/46] Add logo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 83c49d9..da4be88 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -

Logo

+

Logo

**microPIPE: a pipeline for high-quality bacterial genome construction using ONT and Illumina sequencing** ====== @@ -86,7 +86,7 @@ singularity { An example configuration file can be found in this [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). -Two versions of the configuration file are available and corresponds to microPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1) as referenced in the paper. +Two versions of the configuration file are available and correspond to microPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1), as referenced in the paper. **NOTE:** to use **GPU** resources for basecalling and demultiplexing, use the `--gpu` flag. From 2130e49d48c4e1f14955b33cf59016d266a56b87 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 4 Feb 2021 09:00:44 +1000 Subject: [PATCH 09/46] Add URL for biorxiv --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index da4be88..2701629 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The workflow below summarises the different steps of the pipeline (with each sel Micropipe has been written in Nextflow and uses Singularity containers. It can use both GPU and CPU resources. -For more information please see our preprint here: **URL for BioRxiv** +For more information please see our preprint here: https://www.biorxiv.org/content/10.1101/2021.02.02.429319v1

Workflow From 8ba1bfc6447af13c49771feda55f794767a5e523 Mon Sep 17 00:00:00 2001 From: thom Date: Fri, 5 Feb 2021 14:41:45 +1000 Subject: [PATCH 10/46] Various fixes --- main.nf | 26 ++++++++ nextflow.config | 148 ++++++++++++++++++++++++------------------- nextflow.config.v0.9 | 148 ++++++++++++++++++++++++------------------- 3 files changed, 190 insertions(+), 132 deletions(-) diff --git a/main.nf b/main.nf index 362a70f..aa1ab4d 100644 --- a/main.nf +++ b/main.nf @@ -107,6 +107,7 @@ process basecalling { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.txt' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.log' input: @@ -135,6 +136,7 @@ process basecalling_single_isolate { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.txt' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.log' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*fastq.gz' @@ -254,6 +256,7 @@ process basecalling_demultiplexing_guppy { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: path(fast5_dir) @@ -316,6 +319,7 @@ process demultiplexing_guppy { cpus "${params.guppy_barcoder_threads}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: path(fastq_dir) @@ -406,6 +410,8 @@ process rasusa { rasusa --coverage ${params.rasusa_coverage} --genome-size ${genome_size} --input ${long_reads} --output subsampled.fastq.gz cp .command.log rasusa.log rasusa --version > rasusa_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -430,6 +436,8 @@ process porechop { porechop -i ${long_reads} -t ${params.porechop_threads} -o trimmed.fastq.gz ${params.porechop_args} cp .command.log porechop.log porechop --version > porechop_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -448,6 +456,8 @@ process japsa { """ set +eu jsa.np.filter --input ${trimmed} ${params.japsa_args} --output filtered.fastq.gz +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -472,6 +482,8 @@ process filtlong { filtlong ${params.filtlong_args} ${trimmed} | gzip > filtered.fastq.gz cp .command.log filtlong.log filtlong --version > filtlong_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -494,6 +506,8 @@ process flye { set +eu flye --nano-raw ${filtered} --genome-size ${genome_size} --threads ${params.flye_threads} --out-dir \$PWD ${params.flye_args} flye -v 2> flye_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -532,6 +546,8 @@ process racon_cpu { done cp .command.log racon.log racon --version > racon_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -558,6 +574,8 @@ process medaka_cpu { rm consensus_probs.hdf calls_to_draft.bam calls_to_draft.bam.bai cp .command.log medaka.log medaka --version > medaka_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -588,6 +606,8 @@ process nextpolish_LR { rm -r 00.lgs_polish 01.lgs_polish cp .command.log nextpolish_LR.log nextPolish --version 2> nextpolish_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -637,6 +657,8 @@ process fixstart { """ set +eu circlator fixstart ${params.fixstart_args} ${polished} ${prefix_lr_sr}_fixstart +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -655,6 +677,8 @@ process fixstart_LR { """ set +eu circlator fixstart ${params.fixstart_args} ${polished} ${prefix_lr}_fixstart +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -675,6 +699,8 @@ process quast { set +eu quast.py -o \$PWD -t ${params.quast_threads} -l ${sample} ${polished} ${params.quast_args} quast --version > quast_version.txt +[ ! -f ${reads_1} ] && touch ${reads_1} +[ ! -f ${reads_2} ] && touch ${reads_2} """ } diff --git a/nextflow.config b/nextflow.config index d59d81a..41eed73 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,76 +1,65 @@ -process { - executor='slurm' - withLabel: cpu { queue = 'main' } - withLabel: gpu { queue = 'gpu' } - withLabel: big_mem { memory = 32.GB } - withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.4.3'} - withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.4.3' } - withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } - withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } - withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } - withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } - withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } - withName: japsa { container = 'docker://vmurigneux/japsa:latest' } - withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } - withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } - withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } - withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } - withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } - withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } +// Singularity containter cache. Change this as appropriate +singularity { + cacheDir = "/opt/singularity_cache" } -singularity { - enabled = true - autoMounts = true +// Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) +// If your job scheduler has different queues/partitions for cpu and gpu, please also set them here +process { + executor='local' + withLabel: cpu { queue = 'main' } + withLabel: gpu { queue = 'gpu' } } +// Default parameters. Commandline parameters will take priority over these params { - outdir = './results' - basecalling = false - demultiplexing = false - gpu = false # CHANGE THIS TO TRUE TO ENABLE GPU BASECALLING - fast5 = false - fastq = false - demultiplexer = 'guppy' - guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" - guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" - kit = false - flowcell = false - guppy_gpu_device = "auto" - guppy_num_callers = 8 - guppy_cpu_threads_per_caller = 1 - guppy_basecaller_args = "--recursive --trim_barcodes -q 0" - guppy_barcoder_args = "--recursive --trim_barcodes -q 0" - guppy_barcode_kits= "SQK-RBK004" - guppy_barcoder_threads = 2 - qcat_args = "" - skip_pycoqc = false - skip_rasusa = true - skip_porechop = false - skip_filtering = false - rasusa_coverage = 100 - filtering = "japsa" - porechop_args = "" - porechop_threads = 4 - japsa_args = "--lenMin 1000 --qualMin 10" - filtlong_args = "--min_length 1000 --keep_percent 90" - flye_args = "--plasmids" - flye_threads = 4 - polisher = "medaka" - racon_nb = 4 - racon_args = "-m 8 -x -6 -g -8 -w 500" - racon_threads = 4 - medaka_model = "r941_min_high" - medaka_threads = 8 - nextpolish_threads = 4 - skip_illumina = false - fixstart_args = "" - skip_fixstart = false - quast_threads = 1 - quast_args = "" - skip_quast = false + outdir = './results' + basecalling = false + demultiplexing = false + gpu = true + fast5 = false + fastq = false + demultiplexer = 'guppy' + guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" + guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" + kit = false + flowcell = false + guppy_gpu_device = "auto" + guppy_num_callers = 8 + guppy_cpu_threads_per_caller = 1 + guppy_basecaller_args = "--recursive --trim_barcodes -q 0" + guppy_barcoder_args = "--recursive --trim_barcodes -q 0" + guppy_barcode_kits= "SQK-RBK004" + guppy_barcoder_threads = 2 + qcat_args = "" + skip_pycoqc = false + skip_rasusa = true + skip_porechop = false + skip_filtering = false + rasusa_coverage = 100 + filtering = "japsa" + porechop_args = "" + porechop_threads = 4 + japsa_args = "--lenMin 1000 --qualMin 10" + filtlong_args = "--min_length 1000 --keep_percent 90" + flye_args = "--plasmids" + flye_threads = 4 + polisher = "medaka" + racon_nb = 4 + racon_args = "-m 8 -x -6 -g -8 -w 500" + racon_threads = 4 + medaka_model = "r941_min_high" + medaka_threads = 8 + nextpolish_threads = 4 + skip_illumina = false + fixstart_args = "" + skip_fixstart = false + quast_threads = 1 + quast_args = "" + skip_quast = false } +// Debug and report options trace { enabled = true file = "${params.outdir}/trace.txt" @@ -88,6 +77,33 @@ dag { file = "${params.outdir}/flowchart_dag.svg" } + + +// Not generally user-modifiable !!! +process { + withLabel: big_mem { memory = 32.GB } + withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.4.3'} + withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.4.3' } + withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } + withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } + withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } + withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } + withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } + withName: japsa { container = 'docker://vmurigneux/japsa:latest' } + withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } + withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } + withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } + withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } + withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } + withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } +} + +singularity { + enabled = true + autoMounts = false + runOptions = "-B \"$launchDir\" -B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\" -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" +} + manifest { name = 'microPIPE' author = 'Valentine Murigneux' diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 index 65e1c50..bd174ed 100644 --- a/nextflow.config.v0.9 +++ b/nextflow.config.v0.9 @@ -1,76 +1,65 @@ -process { - executor='slurm' - withLabel: cpu { queue = 'main' } - withLabel: gpu { queue = 'gpu' } - withLabel: big_mem { memory = 32.GB } - withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.6.1'} - withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } - withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } - withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } - withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } - withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } - withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } - withName: japsa { container = 'docker://vmurigneux/japsa:latest' } - withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } - withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } - withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } - withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } - withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } - withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } +// Singularity containter cache. Change this as appropriate +singularity { + cacheDir = "/opt/singularity_cache" } -singularity { - enabled = true - autoMounts = true +// Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) +// If your job scheduler has different queues/partitions for cpu and gpu, please also set them here +process { + executor='local' + withLabel: cpu { queue = 'main' } + withLabel: gpu { queue = 'gpu' } } +// Default parameters. Commandline parameters will take priority over these params { - outdir = './results' - basecalling = false - demultiplexing = false - gpu = false # CHANGE THIS TO TRUE TO ENABLE GPU BASECALLING - fast5 = false - fastq = false - demultiplexer = 'guppy' - guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" - guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" - kit = false - flowcell = false - guppy_gpu_device = "auto" - guppy_num_callers = 8 - guppy_cpu_threads_per_caller = 1 - guppy_basecaller_args = "--recursive --trim_barcodes -q 0" - guppy_barcoder_args = "--recursive --trim_barcodes -q 0" - guppy_barcode_kits= "SQK-RBK004" - guppy_barcoder_threads = 2 - qcat_args = "" - skip_pycoqc = false - skip_rasusa = true - skip_porechop = false - skip_filtering = false - rasusa_coverage = 100 - filtering = "japsa" - porechop_args = "" - porechop_threads = 4 - japsa_args = "--lenMin 1000 --qualMin 10" - filtlong_args = "--min_length 1000 --keep_percent 90" - flye_args = "--plasmids" - flye_threads = 4 - polisher = "medaka" - racon_nb = 4 - racon_args = "-m 8 -x -6 -g -8 -w 500" - racon_threads = 4 - medaka_model = "r941_min_high" - medaka_threads = 8 - nextpolish_threads = 4 - skip_illumina = false - fixstart_args = "" - skip_fixstart = false - quast_threads = 1 - quast_args = "" - skip_quast = false + outdir = './results' + basecalling = false + demultiplexing = false + gpu = false + fast5 = false + fastq = false + demultiplexer = 'guppy' + guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" + guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" + kit = false + flowcell = false + guppy_gpu_device = "auto" + guppy_num_callers = 8 + guppy_cpu_threads_per_caller = 1 + guppy_basecaller_args = "--recursive --trim_barcodes -q 0" + guppy_barcoder_args = "--recursive --trim_barcodes -q 0" + guppy_barcode_kits= "SQK-RBK004" + guppy_barcoder_threads = 2 + qcat_args = "" + skip_pycoqc = false + skip_rasusa = true + skip_porechop = false + skip_filtering = false + rasusa_coverage = 100 + filtering = "japsa" + porechop_args = "" + porechop_threads = 4 + japsa_args = "--lenMin 1000 --qualMin 10" + filtlong_args = "--min_length 1000 --keep_percent 90" + flye_args = "--plasmids" + flye_threads = 4 + polisher = "medaka" + racon_nb = 4 + racon_args = "-m 8 -x -6 -g -8 -w 500" + racon_threads = 4 + medaka_model = "r941_min_high" + medaka_threads = 8 + nextpolish_threads = 4 + skip_illumina = false + fixstart_args = "" + skip_fixstart = false + quast_threads = 1 + quast_args = "" + skip_quast = false } +// Debug and report options trace { enabled = true file = "${params.outdir}/trace.txt" @@ -88,6 +77,33 @@ dag { file = "${params.outdir}/flowchart_dag.svg" } + + +// Not generally user-modifiable !!! +process { + withLabel: big_mem { memory = 32.GB } + withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.6.1'} + withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } + withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } + withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } + withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } + withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } + withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } + withName: japsa { container = 'docker://vmurigneux/japsa:latest' } + withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } + withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } + withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } + withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } + withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } + withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } +} + +singularity { + enabled = true + autoMounts = false + runOptions = "-B \"$launchDir\" -B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\" -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" +} + manifest { name = 'microPIPE' author = 'Valentine Murigneux' From 04f3ed800cbe68790e897332cca4efb187c626ef Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Fri, 5 Feb 2021 16:55:19 +1000 Subject: [PATCH 11/46] Modify main.nf when --skip_illumina --- main.nf | 210 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 128 insertions(+), 82 deletions(-) diff --git a/main.nf b/main.nf index aa1ab4d..ca6b279 100644 --- a/main.nf +++ b/main.nf @@ -7,7 +7,7 @@ nextflow.preview.dsl=2 microPIPE - Bacterial genome construction pipeline using ONT sequencing ======================================================================================== #### Documentation - https://github.com/ +https://github.com/BeatsonLab-MicrobialGenomics/micropipe #### Authors Valentine Murigneux ======================================================================================== @@ -107,7 +107,6 @@ process basecalling { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" - containerOptions '--nv' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.txt' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.log' input: @@ -136,7 +135,6 @@ process basecalling_single_isolate { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" - containerOptions '--nv' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.txt' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.log' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*fastq.gz' @@ -256,7 +254,6 @@ process basecalling_demultiplexing_guppy { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" - containerOptions '--nv' publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: path(fast5_dir) @@ -319,7 +316,6 @@ process demultiplexing_guppy { cpus "${params.guppy_barcoder_threads}" label "gpu" label "guppy_gpu" - containerOptions '--nv' publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: path(fastq_dir) @@ -397,9 +393,9 @@ process rasusa { publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*.log", saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), file(long_reads), val(sample), file(reads_1), file(reads_2), val(genome_size) + tuple val(barcode), file(long_reads), val(sample), val(genome_size) output: - tuple val(barcode), file("subsampled.fastq.gz"), val(sample), file(reads_1), file(reads_2), val(genome_size), emit: subsampled_fastq + tuple val(barcode), file("subsampled.fastq.gz"), val(sample), val(genome_size), emit: subsampled_fastq path("rasusa.log") path("rasusa_version.txt") when: @@ -410,8 +406,6 @@ process rasusa { rasusa --coverage ${params.rasusa_coverage} --genome-size ${genome_size} --input ${long_reads} --output subsampled.fastq.gz cp .command.log rasusa.log rasusa --version > rasusa_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -423,9 +417,9 @@ process porechop { publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*.log", saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), file(long_reads), val(sample), file(reads_1), file(reads_2), val(genome_size) + tuple val(barcode), file(long_reads), val(sample), val(genome_size) output: - tuple val(barcode), file("trimmed.fastq.gz"), val(sample), file(reads_1), file(reads_2), val(genome_size), emit: trimmed_fastq + tuple val(barcode), file("trimmed.fastq.gz"), val(sample), val(genome_size), emit: trimmed_fastq path("porechop.log") path("porechop_version.txt") when: @@ -436,8 +430,6 @@ process porechop { porechop -i ${long_reads} -t ${params.porechop_threads} -o trimmed.fastq.gz ${params.porechop_args} cp .command.log porechop.log porechop --version > porechop_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -447,17 +439,15 @@ process japsa { label "cpu" publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: '*filtered.fastq.gz', saveAs: { filename -> "${sample}_$filename" } input: - tuple val(barcode), path(trimmed), val(sample), path(reads_1), path(reads_2), val(genome_size) + tuple val(barcode), path(trimmed), val(sample), val(genome_size) output: - tuple val(barcode), path("filtered.fastq.gz"), val(sample), path(reads_1), path(reads_2), val(genome_size), emit: filtered_fastq + tuple val(barcode), path("filtered.fastq.gz"), val(sample), val(genome_size), emit: filtered_fastq when: !params.skip_filtering & params.filtering == 'japsa' script: """ set +eu jsa.np.filter --input ${trimmed} ${params.japsa_args} --output filtered.fastq.gz -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -469,9 +459,9 @@ process filtlong { publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: 'filtlong.log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(trimmed), val(sample), path(reads_1), path(reads_2), val(genome_size) + tuple val(barcode), path(trimmed), val(sample), val(genome_size) output: - tuple val(barcode), path("filtered.fastq.gz"), val(sample), path(reads_1), path(reads_2), val(genome_size), emit: filtered_fastq + tuple val(barcode), path("filtered.fastq.gz"), val(sample), val(genome_size), emit: filtered_fastq path("*.log") path("filtlong_version.txt") when: @@ -482,8 +472,6 @@ process filtlong { filtlong ${params.filtlong_args} ${trimmed} | gzip > filtered.fastq.gz cp .command.log filtlong.log filtlong --version > filtlong_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -496,9 +484,9 @@ process flye { publishDir "$params.outdir/$sample/2_assembly", mode: 'copy', pattern: 'flye.log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/2_assembly", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), val(genome_size) + tuple val(barcode), path(filtered), val(sample), val(genome_size) output: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path("assembly.fasta"), path("assembly_info.txt"), path("assembly_graph.gfa"), path("assembly_graph.gv"), emit: assembly_out + tuple val(barcode), path(filtered), val(sample), path("assembly.fasta"), path("assembly_info.txt"), path("assembly_graph.gfa"), path("assembly_graph.gv"), emit: assembly_out path("flye.log") path("flye_version.txt") script: @@ -506,8 +494,6 @@ process flye { set +eu flye --nano-raw ${filtered} --genome-size ${genome_size} --threads ${params.flye_threads} --out-dir \$PWD ${params.flye_args} flye -v 2> flye_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -525,9 +511,9 @@ process racon_cpu { publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: '*log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path(assembly), path(info), path(gfa), path(gv) + tuple val(barcode), path(filtered), val(sample), path(assembly), path(info), path(gfa), path(gv) output: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path("${prefix}_${raconv}_${params.racon_nb}.fasta"), emit: polished_racon + tuple val(barcode), path(filtered), val(sample), path("${prefix}_${raconv}_${params.racon_nb}.fasta"), emit: polished_racon path("racon.log") path("racon_version.txt") when: @@ -546,8 +532,6 @@ process racon_cpu { done cp .command.log racon.log racon --version > racon_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -560,9 +544,9 @@ process medaka_cpu { publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: '*log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path(draft) + tuple val(barcode), path(filtered), val(sample), path(draft) output: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path ("consensus.fasta"), emit: polished_medaka + tuple val(barcode), path(filtered), val(sample), path ("consensus.fasta"), emit: polished_medaka path("medaka.log") path("medaka_version.txt") when: @@ -574,8 +558,6 @@ process medaka_cpu { rm consensus_probs.hdf calls_to_draft.bam calls_to_draft.bam.bai cp .command.log medaka.log medaka --version > medaka_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -588,9 +570,9 @@ process nextpolish_LR { publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: '*log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path(assembly), path(info), path(gfa), path(gv) + tuple val(barcode), path(filtered), val(sample), path(assembly), path(info), path(gfa), path(gv) output: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path ("${sample}_${prefix_lr}.fasta"), emit: polished_LR + tuple val(barcode), path(filtered), val(sample), path ("${sample}_${prefix_lr}.fasta"), emit: polished_LR path("nextpolish_LR.log") path("nextpolish_version.txt") when: @@ -606,8 +588,6 @@ process nextpolish_LR { rm -r 00.lgs_polish 01.lgs_polish cp .command.log nextpolish_LR.log nextPolish --version 2> nextpolish_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -620,9 +600,9 @@ process nextpolish { publishDir "$params.outdir/$sample/4_polishing_short_reads", mode: 'copy', pattern: '*log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/4_polishing_short_reads", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path(draft) + tuple val(barcode), path(filtered), val(sample), path(draft), path(reads_1), path(reads_2) output: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path ("${sample}_${prefix_lr_sr}_2.fasta"), emit: polished_SR + tuple val(barcode), path(filtered), val(sample), path ("${sample}_${prefix_lr_sr}_2.fasta"), emit: polished_SR path("nextpolish.log") path("nextpolish_version.txt") when: @@ -649,16 +629,14 @@ process fixstart { publishDir "$params.outdir/$sample/4_polishing_short_reads", mode: 'copy', pattern: '*fixstart.fasta', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/4_polishing_short_reads", mode: 'copy', pattern: '*log', saveAs: { filename -> "${sample}_$filename" } input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path(polished) + tuple val(barcode), path(filtered), val(sample), path(polished) output: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path ("${prefix_lr_sr}_fixstart.fasta"), emit: polished_fixstart + tuple val(barcode), path(filtered), val(sample), path ("${prefix_lr_sr}_fixstart.fasta"), emit: polished_fixstart path("*log") script: """ set +eu circlator fixstart ${params.fixstart_args} ${polished} ${prefix_lr_sr}_fixstart -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -669,16 +647,14 @@ process fixstart_LR { publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: '*fixstart.fasta', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: '*log', saveAs: { filename -> "${sample}_$filename" } input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path(polished) + tuple val(barcode), path(filtered), val(sample), path(polished) output: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path ("${prefix_lr}_fixstart.fasta"), emit: polished_fixstart + tuple val(barcode), path(filtered), val(sample), path ("${prefix_lr}_fixstart.fasta"), emit: polished_fixstart path("*log") script: """ set +eu circlator fixstart ${params.fixstart_args} ${polished} ${prefix_lr}_fixstart -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } @@ -690,7 +666,7 @@ process quast { publishDir "$params.outdir/$sample/5_quast", mode: 'copy', pattern: 'quast.log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/5_quast", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(filtered), val(sample), path(reads_1), path(reads_2), path(polished) + tuple val(barcode), path(filtered), val(sample), path(polished) output: tuple path("report.txt"), path("report.html"), path("report.tsv"), path("report.pdf"), path("quast.log"), emit: quast_out path("quast_version.txt") @@ -699,14 +675,13 @@ process quast { set +eu quast.py -o \$PWD -t ${params.quast_threads} -l ${sample} ${polished} ${params.quast_args} quast --version > quast_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} """ } workflow assembly { take: ch_samplesheet + ch_samplesheet_illumina main: if (!params.skip_porechop & !params.skip_filtering) { if (!params.skip_rasusa) { @@ -762,7 +737,7 @@ workflow assembly { racon_cpu(flye.out.assembly_out) medaka_cpu(racon_cpu.out.polished_racon) if (!params.skip_illumina) { - nextpolish(medaka_cpu.out.polished_medaka) + nextpolish(medaka_cpu.out.polished_medaka.combine (ch_samplesheet_illumina, by: 0)) if (params.skip_fixstart) { quast(nextpolish.out.polished_SR) } @@ -784,7 +759,7 @@ workflow assembly { else if (params.polisher == 'nextpolish') { nextpolish_LR(flye.out.assembly_out) if (!params.skip_illumina) { - nextpolish(nextpolish_LR.out.polished_LR) + nextpolish(nextpolish_LR.out.polished_LR.combine (ch_samplesheet_illumina, by: 0)) if (params.skip_fixstart) { quast(nextpolish.out.polished_SR) } @@ -806,12 +781,26 @@ workflow assembly { } workflow { + //basecalling, demultiplexing and assembly workflow if( params.basecalling && params.demultiplexing) { - Channel. - fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.barcode_id, row.sample_id, file(row.short_fastq_1, checkIfExists: false), file(row.short_fastq_2, checkIfExists: false), row.genome_size) } - .set { ch_samplesheet_basecalling } + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, row.sample_id, row.genome_size) } + .set { ch_samplesheet_basecalling } + ch_samplesheet_basecalling.view() + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() + } else { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, row.sample_id, row.genome_size) } + .set { ch_samplesheet_basecalling } + ch_samplesheet_basecalling.view() + } fast5 = Channel.fromPath("${params.fast5}", checkIfExists: true ) if( params.demultiplexer == "qcat") { if( params.gpu ) { @@ -840,13 +829,30 @@ workflow { ch_fastq.view() ch_data=ch_fastq.combine(ch_samplesheet_basecalling, by: 0) } - assembly( ch_data ) + if ( !params.skip_illumina ) { + assembly( ch_data, ch_samplesheet_illumina) + } else { + assembly( ch_data, Channel.empty() ) + } + //basecalling and assembly workflow (single isolate) } else if( params.basecalling && !params.demultiplexing) { - Channel. - fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.sample_id, file(row.short_fastq_1, checkIfExists: false), file(row.short_fastq_2, checkIfExists: false), row.genome_size) } - .set { ch_samplesheet_basecalling } + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.sample_id, row.genome_size) } + .set { ch_samplesheet_basecalling } + ch_samplesheet_basecalling.view() + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.sample_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() + } else { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.sample_id, row.genome_size) } + .set { ch_samplesheet_basecalling } + } fast5 = Channel.fromPath("${params.fast5}", checkIfExists: true ) ch_sample = ch_samplesheet_basecalling.first().map { it[0] } ch_fast5 = fast5.concat( ch_sample ).collect() @@ -861,15 +867,35 @@ workflow { ch_fastq=basecalling_cpu_single_isolate.out.basecalled_fastq.map { file -> tuple(file.simpleName, file) }.transpose() } ch_fastq.view() - ch_data = ch_fastq.concat( ch_samplesheet_basecalling ).collect() - ch_data.view() - assembly( ch_data ) + if ( !params.skip_illumina ) { + ch_data = ch_fastq.concat( ch_samplesheet_basecalling ).collect() + ch_data.view() + assembly( ch_data, ch_samplesheet_illumina ) + } else { + ch_data = ch_fastq.concat( ch_samplesheet_basecalling ).collect() + ch_data.view() + assembly( ch_data, Channel.empty() ) + } + //demultiplexing and assembly workflow } else if ( !params.basecalling && params.demultiplexing ){ - Channel. - fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.barcode_id, row.sample_id, file(row.short_fastq_1, checkIfExists: false), file(row.short_fastq_2, checkIfExists: false), row.genome_size) } - .set { ch_samplesheet_basecalling } + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, row.sample_id, row.genome_size) } + .set { ch_samplesheet_basecalling } + ch_samplesheet_basecalling.view() + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() + } else { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, row.sample_id, row.genome_size) } + .set { ch_samplesheet_basecalling } + ch_samplesheet_basecalling.view() + } fastq = Channel.fromPath("${params.fastq}", checkIfExists: true ) if( params.demultiplexer == "qcat") { demultiplexing_qcat(fastq) @@ -884,16 +910,36 @@ workflow { } } ch_fastq.view() - ch_data=ch_fastq.combine(ch_samplesheet_basecalling, by: 0) - ch_data.view() - assembly( ch_data ) + if ( !params.skip_illumina ) { + ch_data=ch_fastq.combine(ch_samplesheet_basecalling, by: 0) + ch_data.view() + assembly( ch_data, ch_samplesheet_illumina) + } else { + ch_data=ch_fastq.combine(ch_samplesheet_basecalling, by: 0) + ch_data.view() + assembly( ch_data, Channel.empty() ) + } + //assembly only workflow } else if ( !params.basecalling && !params.demultiplexing ) { - Channel. - fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.barcode_id, file(row.long_fastq, checkIfExists: true), row.sample_id, file(row.short_fastq_1, checkIfExists: false), file(row.short_fastq_2, checkIfExists: false), row.genome_size) } - .set { ch_samplesheet } - ch_samplesheet.view() - assembly( ch_samplesheet ) + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.long_fastq, checkIfExists: true), row.sample_id, row.genome_size) } + .set { ch_samplesheet } + ch_samplesheet.view() + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() + assembly( ch_samplesheet, ch_samplesheet_illumina ) + } else { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.long_fastq, checkIfExists: true), row.sample_id, row.genome_size) } + .set { ch_samplesheet } + ch_samplesheet.view() + assembly( ch_samplesheet, Channel.empty() ) + } } -} +} \ No newline at end of file From d6481801d12f6d9ae7604f7be3e8b4e211ba64b6 Mon Sep 17 00:00:00 2001 From: thom Date: Mon, 8 Feb 2021 09:25:56 +1000 Subject: [PATCH 12/46] Don't fail on error --- main.nf | 44 ++++++++++++++++++++++---------------------- nextflow.config | 1 + 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/main.nf b/main.nf index aa1ab4d..e1fb279 100644 --- a/main.nf +++ b/main.nf @@ -410,8 +410,8 @@ process rasusa { rasusa --coverage ${params.rasusa_coverage} --genome-size ${genome_size} --input ${long_reads} --output subsampled.fastq.gz cp .command.log rasusa.log rasusa --version > rasusa_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -436,8 +436,8 @@ process porechop { porechop -i ${long_reads} -t ${params.porechop_threads} -o trimmed.fastq.gz ${params.porechop_args} cp .command.log porechop.log porechop --version > porechop_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -456,8 +456,8 @@ process japsa { """ set +eu jsa.np.filter --input ${trimmed} ${params.japsa_args} --output filtered.fastq.gz -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -482,8 +482,8 @@ process filtlong { filtlong ${params.filtlong_args} ${trimmed} | gzip > filtered.fastq.gz cp .command.log filtlong.log filtlong --version > filtlong_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -506,8 +506,8 @@ process flye { set +eu flye --nano-raw ${filtered} --genome-size ${genome_size} --threads ${params.flye_threads} --out-dir \$PWD ${params.flye_args} flye -v 2> flye_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -546,8 +546,8 @@ process racon_cpu { done cp .command.log racon.log racon --version > racon_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -574,8 +574,8 @@ process medaka_cpu { rm consensus_probs.hdf calls_to_draft.bam calls_to_draft.bam.bai cp .command.log medaka.log medaka --version > medaka_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -606,8 +606,8 @@ process nextpolish_LR { rm -r 00.lgs_polish 01.lgs_polish cp .command.log nextpolish_LR.log nextPolish --version 2> nextpolish_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -657,8 +657,8 @@ process fixstart { """ set +eu circlator fixstart ${params.fixstart_args} ${polished} ${prefix_lr_sr}_fixstart -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -677,8 +677,8 @@ process fixstart_LR { """ set +eu circlator fixstart ${params.fixstart_args} ${polished} ${prefix_lr}_fixstart -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } @@ -699,8 +699,8 @@ process quast { set +eu quast.py -o \$PWD -t ${params.quast_threads} -l ${sample} ${polished} ${params.quast_args} quast --version > quast_version.txt -[ ! -f ${reads_1} ] && touch ${reads_1} -[ ! -f ${reads_2} ] && touch ${reads_2} +[ ! -f ${reads_1} ] && touch ${reads_1} || true +[ ! -f ${reads_2} ] && touch ${reads_2} || true """ } diff --git a/nextflow.config b/nextflow.config index 41eed73..7094480 100644 --- a/nextflow.config +++ b/nextflow.config @@ -96,6 +96,7 @@ process { withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } + errorStrategy = 'ignore' } singularity { From 4ac3993d70c6e6861efd769d7932d0183797850c Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 8 Feb 2021 14:26:26 +1000 Subject: [PATCH 13/46] Fix identation --- main.nf | 272 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 136 insertions(+), 136 deletions(-) diff --git a/main.nf b/main.nf index c6bd32b..1708c95 100644 --- a/main.nf +++ b/main.nf @@ -70,8 +70,8 @@ def helpMessage() { --filtering Filtering tool: "japsa" or "filtlong" (default="japsa") --japsa_args Japsa optional parameters (default="--lenMin 1000 --qualMin 10"), see https://japsa.readthedocs.io/en/latest/tools/jsa.np.filter.html --filtlong_args Filtlong optional parameters (default="--min_length 1000 --keep_percent 90"), see https://github.com/rrwick/Filtlong#full-usage - --skip_rasusa Skip the sub-sampling Rasusa step - --rasusa_coverage The desired coverage to sub-sample the reads to (default=100) + --skip_rasusa Skip the sub-sampling Rasusa step + --rasusa_coverage The desired coverage to sub-sample the reads to (default=100) Assembly: --flye_args Flye optional parameters (default="--plasmids") @@ -121,9 +121,9 @@ process basecalling { script: """ set +eu - if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} - elif if [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then + if [[ "${params.guppy_config_gpu}" != "false" ]] ; then + guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} + elif if [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log @@ -152,7 +152,7 @@ process basecalling_single_isolate { set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} - elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then + elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log @@ -178,16 +178,16 @@ process basecalling_cpu { when: params.basecalling & !params.gpu & params.demultiplexer == 'qcat' script: - """ - set +eu + """ + set +eu if [[ "${params.guppy_config_cpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} - elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} - fi - cp .command.log guppy_basecaller.log + guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then + guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + fi + cp .command.log guppy_basecaller.log guppy_basecaller --version > guppy_basecaller_version.txt - """ + """ } process basecalling_cpu_single_isolate { @@ -210,10 +210,10 @@ process basecalling_cpu_single_isolate { """ set +eu if [[ "${params.guppy_config_cpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} - fi + guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + fi cp .command.log guppy_basecaller.log cat *.fastq > ${sample}.fastq gzip ${sample}.fastq @@ -247,38 +247,38 @@ process demultiplexing_qcat { gzip none.fastq fi qcat --version > qcat_version.txt - """ + """ } process basecalling_demultiplexing_guppy { - cpus "${params.guppy_num_callers}" - label "gpu" - label "guppy_gpu" - publishDir "$params.outdir/0_demultiplexing", mode: 'copy' - input: - path(fast5_dir) - output: - path "sequencing_summary.txt", emit: sequencing_summary - path "*fastq.gz", emit: demultiplexed_fastq - path("*log") + cpus "${params.guppy_num_callers}" + label "gpu" + label "guppy_gpu" + publishDir "$params.outdir/0_demultiplexing", mode: 'copy' + input: + path(fast5_dir) + output: + path "sequencing_summary.txt", emit: sequencing_summary + path "*fastq.gz", emit: demultiplexed_fastq + path("*log") path("guppy_basecaller_version.txt") - when: + when: params.basecalling & params.gpu & params.demultiplexer == 'guppy' script: - """ - set +eu - if [[ "${params.guppy_config_gpu}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config "${params.guppy_config_gpu}" --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} - elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} - fi - cp .command.log guppy_basecaller.log + """ + set +eu + if [[ "${params.guppy_config_gpu}" != "false" ]]; then + guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config "${params.guppy_config_gpu}" --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then + guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + fi + cp .command.log guppy_basecaller.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done guppy_basecaller --version > guppy_basecaller_version.txt - """ + """ } process basecalling_demultiplexing_guppy_cpu { @@ -287,56 +287,56 @@ process basecalling_demultiplexing_guppy_cpu { label "guppy_cpu" publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: - path(fast5_dir) - output: - path "sequencing_summary.txt", emit: sequencing_summary - path "*fastq.gz", emit: demultiplexed_fastq - path("*log") + path(fast5_dir) + output: + path "sequencing_summary.txt", emit: sequencing_summary + path "*fastq.gz", emit: demultiplexed_fastq + path("*log") path("guppy_basecaller_version.txt") - when: + when: params.basecalling & !params.gpu & params.demultiplexer == 'guppy' script: - """ - set +eu - if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --config "${params.guppy_config_cpu}" --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} - elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} - fi - cp .command.log guppy_basecaller.log - for dir in barc*/ uncl*/; do - barcode_id=\${dir%*/} - cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz - done + """ + set +eu + if [[ "${params.guppy_config_gpu}" != "false" ]] ; then + guppy_basecaller -i ${fast5_dir} -s \$PWD --config "${params.guppy_config_cpu}" --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then + guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + fi + cp .command.log guppy_basecaller.log + for dir in barc*/ uncl*/; do + barcode_id=\${dir%*/} + cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz + done guppy_basecaller --version > guppy_basecaller_version.txt - """ + """ } process demultiplexing_guppy { - cpus "${params.guppy_barcoder_threads}" - label "gpu" - label "guppy_gpu" - publishDir "$params.outdir/0_demultiplexing", mode: 'copy' - input: - path(fastq_dir) - output: - path "*fastq.gz", emit: demultiplexed_fastq - path("*log") + cpus "${params.guppy_barcoder_threads}" + label "gpu" + label "guppy_gpu" + publishDir "$params.outdir/0_demultiplexing", mode: 'copy' + input: + path(fastq_dir) + output: + path "*fastq.gz", emit: demultiplexed_fastq + path("*log") path "barcoding_summary.txt" path("guppy_barcoder_version.txt") - when: + when: params.demultiplexer == 'guppy' & params.demultiplexing & params.gpu script: - """ - set +eu - guppy_barcoder -i ${fastq_dir} -s \$PWD --device ${params.guppy_gpu_device} --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} - cp .command.log guppy_barcoder.log - for dir in barc*/ uncl*/; do - barcode_id=\${dir%*/} - cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz - done + """ + set +eu + guppy_barcoder -i ${fastq_dir} -s \$PWD --device ${params.guppy_gpu_device} --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} + cp .command.log guppy_barcoder.log + for dir in barc*/ uncl*/; do + barcode_id=\${dir%*/} + cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz + done guppy_barcoder --version > guppy_barcoder_version.txt - """ + """ } process demultiplexing_guppy_cpu { @@ -345,25 +345,25 @@ process demultiplexing_guppy_cpu { label "guppy_cpu" publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: - path(fastq_dir) + path(fastq_dir) output: - path "*fastq.gz", emit: demultiplexed_fastq - path("*log") + path "*fastq.gz", emit: demultiplexed_fastq + path("*log") path "barcoding_summary.txt" path("guppy_barcoder_version.txt") - when: + when: params.demultiplexer == 'guppy' & params.demultiplexing & !params.gpu script: - """ - set +eu - guppy_barcoder -i ${fastq_dir} -s \$PWD --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} - cp .command.log guppy_barcoder.log - for dir in barc*/ uncl*/; do - barcode_id=\${dir%*/} - cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz - done + """ + set +eu + guppy_barcoder -i ${fastq_dir} -s \$PWD --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} + cp .command.log guppy_barcoder.log + for dir in barc*/ uncl*/; do + barcode_id=\${dir%*/} + cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz + done guppy_barcoder --version > guppy_barcoder_version.txt - """ + """ } process pycoqc { @@ -395,7 +395,7 @@ process rasusa { input: tuple val(barcode), file(long_reads), val(sample), val(genome_size) output: - tuple val(barcode), file("subsampled.fastq.gz"), val(sample), val(genome_size), emit: subsampled_fastq + tuple val(barcode), file("subsampled.fastq.gz"), val(sample), val(genome_size), emit: subsampled_fastq path("rasusa.log") path("rasusa_version.txt") when: @@ -403,7 +403,7 @@ process rasusa { script: """ set +eu - rasusa --coverage ${params.rasusa_coverage} --genome-size ${genome_size} --input ${long_reads} --output subsampled.fastq.gz + rasusa --coverage ${params.rasusa_coverage} --genome-size ${genome_size} --input ${long_reads} --output subsampled.fastq.gz cp .command.log rasusa.log rasusa --version > rasusa_version.txt """ @@ -411,7 +411,7 @@ process rasusa { process porechop { cpus "${params.porechop_threads}" - tag "${sample}" + tag "${sample}" label "cpu" label "big_mem" publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*.log", saveAs: { filename -> "${sample}_$filename" } @@ -419,7 +419,7 @@ process porechop { input: tuple val(barcode), file(long_reads), val(sample), val(genome_size) output: - tuple val(barcode), file("trimmed.fastq.gz"), val(sample), val(genome_size), emit: trimmed_fastq + tuple val(barcode), file("trimmed.fastq.gz"), val(sample), val(genome_size), emit: trimmed_fastq path("porechop.log") path("porechop_version.txt") when: @@ -434,67 +434,67 @@ process porechop { } process japsa { - cpus 1 - tag "${sample}" - label "cpu" - publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: '*filtered.fastq.gz', saveAs: { filename -> "${sample}_$filename" } - input: - tuple val(barcode), path(trimmed), val(sample), val(genome_size) - output: - tuple val(barcode), path("filtered.fastq.gz"), val(sample), val(genome_size), emit: filtered_fastq - when: + cpus 1 + tag "${sample}" + label "cpu" + publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: '*filtered.fastq.gz', saveAs: { filename -> "${sample}_$filename" } + input: + tuple val(barcode), path(trimmed), val(sample), val(genome_size) + output: + tuple val(barcode), path("filtered.fastq.gz"), val(sample), val(genome_size), emit: filtered_fastq + when: !params.skip_filtering & params.filtering == 'japsa' - script: - """ - set +eu - jsa.np.filter --input ${trimmed} ${params.japsa_args} --output filtered.fastq.gz - """ + script: + """ + set +eu + jsa.np.filter --input ${trimmed} ${params.japsa_args} --output filtered.fastq.gz + """ } process filtlong { - cpus 1 - tag "${sample}" - label "cpu" - publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: '*filtered.fastq.gz', saveAs: { filename -> "${sample}_$filename" } - publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: 'filtlong.log', saveAs: { filename -> "${sample}_$filename" } + cpus 1 + tag "${sample}" + label "cpu" + publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: '*filtered.fastq.gz', saveAs: { filename -> "${sample}_$filename" } + publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: 'filtlong.log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*_version.txt" input: - tuple val(barcode), path(trimmed), val(sample), val(genome_size) - output: - tuple val(barcode), path("filtered.fastq.gz"), val(sample), val(genome_size), emit: filtered_fastq - path("*.log") + tuple val(barcode), path(trimmed), val(sample), val(genome_size) + output: + tuple val(barcode), path("filtered.fastq.gz"), val(sample), val(genome_size), emit: filtered_fastq + path("*.log") path("filtlong_version.txt") when: !params.skip_filtering & params.filtering == 'filtlong' - script: - """ - set +eu + script: + """ + set +eu filtlong ${params.filtlong_args} ${trimmed} | gzip > filtered.fastq.gz cp .command.log filtlong.log filtlong --version > filtlong_version.txt - """ + """ } process flye { cpus "${params.flye_threads}" - tag "${sample}" - label "cpu" + tag "${sample}" + label "cpu" label "big_mem" - publishDir "$params.outdir/$sample/2_assembly", mode: 'copy', pattern: 'assembly*', saveAs: { filename -> "${sample}_$filename" } - publishDir "$params.outdir/$sample/2_assembly", mode: 'copy', pattern: 'flye.log', saveAs: { filename -> "${sample}_$filename" } + publishDir "$params.outdir/$sample/2_assembly", mode: 'copy', pattern: 'assembly*', saveAs: { filename -> "${sample}_$filename" } + publishDir "$params.outdir/$sample/2_assembly", mode: 'copy', pattern: 'flye.log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/2_assembly", mode: 'copy', pattern: "*_version.txt" - input: + input: tuple val(barcode), path(filtered), val(sample), val(genome_size) - output: + output: tuple val(barcode), path(filtered), val(sample), path("assembly.fasta"), path("assembly_info.txt"), path("assembly_graph.gfa"), path("assembly_graph.gv"), emit: assembly_out path("flye.log") path("flye_version.txt") - script: - """ - set +eu - flye --nano-raw ${filtered} --genome-size ${genome_size} --threads ${params.flye_threads} --out-dir \$PWD ${params.flye_args} + script: + """ + set +eu + flye --nano-raw ${filtered} --genome-size ${genome_size} --threads ${params.flye_threads} --out-dir \$PWD ${params.flye_args} flye -v 2> flye_version.txt - """ + """ } prefix="flye" @@ -545,11 +545,11 @@ process medaka_cpu { publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: "*_version.txt" input: tuple val(barcode), path(filtered), val(sample), path(draft) - output: + output: tuple val(barcode), path(filtered), val(sample), path ("consensus.fasta"), emit: polished_medaka path("medaka.log") path("medaka_version.txt") - when: + when: params.polisher == 'medaka' script: """ @@ -661,7 +661,7 @@ process fixstart_LR { process quast { cpus "${params.quast_threads}" tag "${sample}" - label "cpu" + label "cpu" publishDir "$params.outdir/$sample/5_quast", mode: 'copy', pattern: 'report*', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/5_quast", mode: 'copy', pattern: 'quast.log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/5_quast", mode: 'copy', pattern: "*_version.txt" @@ -670,8 +670,8 @@ process quast { output: tuple path("report.txt"), path("report.html"), path("report.tsv"), path("report.pdf"), path("quast.log"), emit: quast_out path("quast_version.txt") - script: - """ + script: + """ set +eu quast.py -o \$PWD -t ${params.quast_threads} -l ${sample} ${polished} ${params.quast_args} quast --version > quast_version.txt From 022ed57647fb791350f52c538751d336d3fd89db Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 8 Feb 2021 14:42:15 +1000 Subject: [PATCH 14/46] Fix identation --- main.nf | 224 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/main.nf b/main.nf index 1708c95..3a6768b 100644 --- a/main.nf +++ b/main.nf @@ -124,7 +124,7 @@ process basecalling { if [[ "${params.guppy_config_gpu}" != "false" ]] ; then guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} elif if [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} + guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log guppy_basecaller --version > guppy_basecaller_version.txt @@ -151,9 +151,9 @@ process basecalling_single_isolate { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} + guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} + guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log cat *.fastq > ${sample}.fastq @@ -222,15 +222,15 @@ process basecalling_cpu_single_isolate { } process demultiplexing_qcat { - cpus 1 - label "cpu" - publishDir "$params.outdir/0_basecalling", mode: 'copy' - input: - path(fastq) - output: - path "*fastq.gz", emit: demultiplexed_fastq + cpus 1 + label "cpu" + publishDir "$params.outdir/0_basecalling", mode: 'copy' + input: + path(fastq) + output: + path "*fastq.gz", emit: demultiplexed_fastq path("qcat.log") - path("qcat_version.txt") + path("qcat_version.txt") when: params.demultiplexer == 'qcat' script: @@ -282,11 +282,11 @@ process basecalling_demultiplexing_guppy { } process basecalling_demultiplexing_guppy_cpu { - cpus "${params.guppy_num_callers}" - label "cpu" - label "guppy_cpu" - publishDir "$params.outdir/0_demultiplexing", mode: 'copy' - input: + cpus "${params.guppy_num_callers}" + label "cpu" + label "guppy_cpu" + publishDir "$params.outdir/0_demultiplexing", mode: 'copy' + input: path(fast5_dir) output: path "sequencing_summary.txt", emit: sequencing_summary @@ -388,7 +388,7 @@ process pycoqc { process rasusa { cpus 1 - tag "${sample}" + tag "${sample}" label "cpu" publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*.log", saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/1_filtering", mode: 'copy', pattern: "*_version.txt" @@ -689,7 +689,7 @@ workflow assembly { porechop(rasusa.out.subsampled_fastq) } else if (params.skip_rasusa) { porechop(ch_samplesheet) - } + } if (params.filtering == "japsa") { japsa(porechop.out.trimmed_fastq) flye(japsa.out.filtered_fastq) @@ -698,84 +698,84 @@ workflow assembly { flye(filtlong.out.filtered_fastq) } } else if (!params.skip_porechop & params.skip_filtering) { - if (!params.skip_rasusa) { - rasusa(ch_samplesheet) - porechop(rasusa.out.subsampled_fastq) - } else if (params.skip_rasusa) { - porechop(ch_samplesheet) - } + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + porechop(rasusa.out.subsampled_fastq) + } else if (params.skip_rasusa) { + porechop(ch_samplesheet) + } flye(porechop.out.trimmed_fastq) } else if (params.skip_porechop & !params.skip_filtering) { if (params.filtering == "japsa") { - if (!params.skip_rasusa) { - rasusa(ch_samplesheet) - japsa(rasusa.out.subsampled_fastq) - flye(japsa.out.filtered_fastq) - } else if (params.skip_rasusa) { - japsa(ch_samplesheet) - flye(japsa.out.filtered_fastq) - } + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + japsa(rasusa.out.subsampled_fastq) + flye(japsa.out.filtered_fastq) + } else if (params.skip_rasusa) { + japsa(ch_samplesheet) + flye(japsa.out.filtered_fastq) + } } else if (params.filtering == "filtlong") { - if (!params.skip_rasusa) { - rasusa(ch_samplesheet) - filtlong(rasusa.out.subsampled_fastq) - flye(filtlong.out.filtered_fastq) - } else if (params.skip_rasusa) { - filtlong(ch_samplesheet) - flye(filtlong.out.filtered_fastq) + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + filtlong(rasusa.out.subsampled_fastq) + flye(filtlong.out.filtered_fastq) + } else if (params.skip_rasusa) { + filtlong(ch_samplesheet) + flye(filtlong.out.filtered_fastq) } } } else { - if (!params.skip_rasusa) { - rasusa(ch_samplesheet) - flye(rasusa.out.subsampled_fastq) - } else if (params.skip_rasusa) { - flye(ch_samplesheet) - } + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + flye(rasusa.out.subsampled_fastq) + } else if (params.skip_rasusa) { + flye(ch_samplesheet) + } } if (params.polisher == 'medaka') { racon_cpu(flye.out.assembly_out) medaka_cpu(racon_cpu.out.polished_racon) if (!params.skip_illumina) { nextpolish(medaka_cpu.out.polished_medaka.combine (ch_samplesheet_illumina, by: 0)) - if (params.skip_fixstart) { - quast(nextpolish.out.polished_SR) - } - else if (!params.skip_fixstart) { - fixstart(nextpolish.out.polished_SR) - quast(fixstart.out.polished_fixstart) - } + if (params.skip_fixstart) { + quast(nextpolish.out.polished_SR) + } + else if (!params.skip_fixstart) { + fixstart(nextpolish.out.polished_SR) + quast(fixstart.out.polished_fixstart) + } } else if (params.skip_illumina) { - if (params.skip_fixstart) { + if (params.skip_fixstart) { quast(medaka_cpu.out.polished_medaka) - } - else if (!params.skip_fixstart) { - fixstart_LR(medaka_cpu.out.polished_medaka) - quast(fixstart_LR.out.polished_fixstart) - } + } + else if (!params.skip_fixstart) { + fixstart_LR(medaka_cpu.out.polished_medaka) + quast(fixstart_LR.out.polished_fixstart) + } } - } + } else if (params.polisher == 'nextpolish') { nextpolish_LR(flye.out.assembly_out) if (!params.skip_illumina) { nextpolish(nextpolish_LR.out.polished_LR.combine (ch_samplesheet_illumina, by: 0)) - if (params.skip_fixstart) { + if (params.skip_fixstart) { quast(nextpolish.out.polished_SR) - } - else if (!params.skip_fixstart) { - fixstart(nextpolish.out.polished_SR) - quast(fixstart.out.polished_fixstart) - } - } + } + else if (!params.skip_fixstart) { + fixstart(nextpolish.out.polished_SR) + quast(fixstart.out.polished_fixstart) + } + } else if (params.skip_illumina) { - if (params.skip_fixstart) { + if (params.skip_fixstart) { quast(nextpolish_LR.out.polished_LR) - } - else if (!params.skip_fixstart) { - fixstart_LR(nextpolish_LR.out.polished_LR) - quast(fixstart_LR.out.polished_fixstart) - } + } + else if (!params.skip_fixstart) { + fixstart_LR(nextpolish_LR.out.polished_LR) + quast(fixstart_LR.out.polished_fixstart) + } } } } @@ -783,18 +783,18 @@ workflow assembly { workflow { //basecalling, demultiplexing and assembly workflow if( params.basecalling && params.demultiplexing) { - Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) .splitCsv(header:true, sep:',') .map { row -> tuple(row.barcode_id, row.sample_id, row.genome_size) } .set { ch_samplesheet_basecalling } - ch_samplesheet_basecalling.view() - if ( !params.skip_illumina ) { - Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } - .set { ch_samplesheet_illumina } - ch_samplesheet_illumina.view() - } + ch_samplesheet_basecalling.view() + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() + } fast5 = Channel.fromPath("${params.fast5}", checkIfExists: true ) if( params.demultiplexer == "qcat") { if( params.gpu ) { @@ -824,24 +824,24 @@ workflow { ch_data=ch_fastq.combine(ch_samplesheet_basecalling, by: 0) } if ( !params.skip_illumina ) { - assembly( ch_data, ch_samplesheet_illumina) + assembly( ch_data, ch_samplesheet_illumina) } else { assembly( ch_data, Channel.empty() ) } //basecalling and assembly workflow (single isolate) } else if( params.basecalling && !params.demultiplexing) { - Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) .splitCsv(header:true, sep:',') .map { row -> tuple(row.sample_id, row.genome_size) } .set { ch_samplesheet_basecalling } ch_samplesheet_basecalling.view() - if ( !params.skip_illumina ) { - Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.sample_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } - .set { ch_samplesheet_illumina } - ch_samplesheet_illumina.view() - } + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.sample_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() + } fast5 = Channel.fromPath("${params.fast5}", checkIfExists: true ) ch_sample = ch_samplesheet_basecalling.first().map { it[0] } ch_fast5 = fast5.concat( ch_sample ).collect() @@ -856,28 +856,28 @@ workflow { ch_fastq=basecalling_cpu_single_isolate.out.basecalled_fastq.map { file -> tuple(file.simpleName, file) }.transpose() } ch_fastq.view() - if ( !params.skip_illumina ) { + if ( !params.skip_illumina ) { ch_data = ch_fastq.concat( ch_samplesheet_basecalling ).collect() ch_data.view() - assembly( ch_data, ch_samplesheet_illumina ) + assembly( ch_data, ch_samplesheet_illumina ) } else { ch_data = ch_fastq.concat( ch_samplesheet_basecalling ).collect() - ch_data.view() - assembly( ch_data, Channel.empty() ) - } + ch_data.view() + assembly( ch_data, Channel.empty() ) + } //demultiplexing and assembly workflow } else if ( !params.basecalling && params.demultiplexing ){ Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) .splitCsv(header:true, sep:',') .map { row -> tuple(row.barcode_id, row.sample_id, row.genome_size) } .set { ch_samplesheet_basecalling } - ch_samplesheet_basecalling.view() - if ( !params.skip_illumina ) { - Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } - .set { ch_samplesheet_illumina } - ch_samplesheet_illumina.view() + ch_samplesheet_basecalling.view() + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() } fastq = Channel.fromPath("${params.fastq}", checkIfExists: true ) if( params.demultiplexer == "qcat") { @@ -907,15 +907,15 @@ workflow { .map { row -> tuple(row.barcode_id, file(row.long_fastq, checkIfExists: true), row.sample_id, row.genome_size) } .set { ch_samplesheet } ch_samplesheet.view() - if ( !params.skip_illumina ) { - Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) - .splitCsv(header:true, sep:',') - .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } - .set { ch_samplesheet_illumina } - ch_samplesheet_illumina.view() - assembly( ch_samplesheet, ch_samplesheet_illumina ) - } else { - assembly( ch_samplesheet, Channel.empty() ) - } + if ( !params.skip_illumina ) { + Channel.fromPath( "${params.samplesheet}", checkIfExists:true ) + .splitCsv(header:true, sep:',') + .map { row -> tuple(row.barcode_id, file(row.short_fastq_1, checkIfExists: true), file(row.short_fastq_2, checkIfExists: true)) } + .set { ch_samplesheet_illumina } + ch_samplesheet_illumina.view() + assembly( ch_samplesheet, ch_samplesheet_illumina ) + } else { + assembly( ch_samplesheet, Channel.empty() ) + } } } \ No newline at end of file From 5c4c89c81dbf1c696ea4bca0bf4f885a770ecba9 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 8 Feb 2021 15:01:24 +1000 Subject: [PATCH 15/46] Fix print version in help message --- main.nf | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/main.nf b/main.nf index 3a6768b..76bd2f1 100644 --- a/main.nf +++ b/main.nf @@ -16,7 +16,7 @@ https://github.com/BeatsonLab-MicrobialGenomics/micropipe def helpMessage() { log.info""" ========================================= - microPIPE v${params.version} + microPIPE v${v${workflow.manifest.version} ========================================= Usage: Basecalling, demultiplexing and assembly workflow: @@ -679,16 +679,16 @@ process quast { } workflow assembly { - take: - ch_samplesheet - ch_samplesheet_illumina - main: - if (!params.skip_porechop & !params.skip_filtering) { - if (!params.skip_rasusa) { - rasusa(ch_samplesheet) - porechop(rasusa.out.subsampled_fastq) - } else if (params.skip_rasusa) { - porechop(ch_samplesheet) + take: + ch_samplesheet + ch_samplesheet_illumina + main: + if (!params.skip_porechop & !params.skip_filtering) { + if (!params.skip_rasusa) { + rasusa(ch_samplesheet) + porechop(rasusa.out.subsampled_fastq) + } else if (params.skip_rasusa) { + porechop(ch_samplesheet) } if (params.filtering == "japsa") { japsa(porechop.out.trimmed_fastq) @@ -753,7 +753,7 @@ workflow assembly { else if (!params.skip_fixstart) { fixstart_LR(medaka_cpu.out.polished_medaka) quast(fixstart_LR.out.polished_fixstart) - } + } } } else if (params.polisher == 'nextpolish') { From 8658d98a161ef42bdb736f3d1a0282c11a70ebea Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 8 Feb 2021 15:10:35 +1000 Subject: [PATCH 16/46] Fix print version in help message --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 76bd2f1..64b36fb 100644 --- a/main.nf +++ b/main.nf @@ -16,7 +16,7 @@ https://github.com/BeatsonLab-MicrobialGenomics/micropipe def helpMessage() { log.info""" ========================================= - microPIPE v${v${workflow.manifest.version} + microPIPE v${workflow.manifest.version} ========================================= Usage: Basecalling, demultiplexing and assembly workflow: @@ -918,4 +918,4 @@ workflow { assembly( ch_samplesheet, Channel.empty() ) } } -} \ No newline at end of file +} From ddfd3532fa137ff81d094c0d3e66be1c52006414 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Fri, 12 Feb 2021 15:28:20 +1000 Subject: [PATCH 17/46] Update Readme when --skip_illumina --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 2701629..f81db2a 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,14 @@ barcode01,S24,barcode01.fastq.gz,S24EC.filtered_1P.fastq.gz,S24EC.filtered_2P.fa barcode02,S34,barcode02.fastq.gz,S34EC.filtered_1P.fastq.gz,S34EC.filtered_2P.fastq.gz,5.5m ``` +4. If Illumina reads are not available (--skip_illumina), do not include the two columns with the Illumina files: + +``` +barcode_id,sample_id,long_fastq,genome_size +barcode01,S24,barcode01.fastq.gz,5.5m +barcode02,S34,barcode02.fastq.gz,5.5m +``` + **3. Run the pipeline** The pipeline can be used to run: From 1a14f9c2ce03435f8bbc4937327d0c8ee11308d0 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 15 Feb 2021 11:54:57 +1000 Subject: [PATCH 18/46] Add containerOptions --- main.nf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/main.nf b/main.nf index 64b36fb..fef75f6 100644 --- a/main.nf +++ b/main.nf @@ -107,6 +107,7 @@ process basecalling { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.txt' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.log' input: @@ -135,6 +136,7 @@ process basecalling_single_isolate { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.txt' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*.log' publishDir "$params.outdir/0_basecalling", mode: 'copy', pattern: '*fastq.gz' @@ -254,6 +256,7 @@ process basecalling_demultiplexing_guppy { cpus "${params.guppy_num_callers}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: path(fast5_dir) @@ -316,6 +319,7 @@ process demultiplexing_guppy { cpus "${params.guppy_barcoder_threads}" label "gpu" label "guppy_gpu" + containerOptions '--nv' publishDir "$params.outdir/0_demultiplexing", mode: 'copy' input: path(fastq_dir) From 7f68ce9a47efb4e1da45dbc780cb98caf8b1c14e Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Tue, 16 Feb 2021 15:48:24 +1000 Subject: [PATCH 19/46] Fix elif statement in process basecalling --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index fef75f6..4dd3a38 100644 --- a/main.nf +++ b/main.nf @@ -124,7 +124,7 @@ process basecalling { set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} - elif if [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then + elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log From 20ccf6b0ce246cd52352968118bb8f593bad241a Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Tue, 16 Mar 2021 10:26:09 +1000 Subject: [PATCH 20/46] Add default parameters in README --- README.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index f81db2a..353ba23 100644 --- a/README.md +++ b/README.md @@ -242,26 +242,26 @@ Basecalling * `--kit`: Name of the ONT kit used for sequencing (default=false). Ignored if '--guppy_config_gpu' or '--guppy_congif_cpu' is specified Quality control: -* `--skip_pycoqc`: skip the pycoQC step to generate a quality control html report (when --basecalling) +* `--skip_pycoqc`: skip the pycoQC step to generate a quality control html report, when --basecalling (default=false) Demultiplexing: -* `--demultiplexer`: demultiplexing tool: "qcat" or "guppy" (default="qcat") +* `--demultiplexer`: demultiplexing tool: "qcat" or "guppy" (default=`--demultiplexer "qcat"`) * `--qcat_args`: qcat optional parameters (default="") * `--guppy_barcoder_args`: Guppy barcoder parameters (default="--recursive --trim_barcodes -q 0") * `--guppy_barcode_kits`: Space separated list of barcoding kit(s) to detect against (default="SQK-RBK004") * `--guppy_barcoder_threads`: number of worker threads to spawn for Guppy barcoder to use. Increasing this number will allow Guppy barcoder to make better use of multi-core CPU systems, but may impact overall system performance (default=2) Adapter trimming: -* `--skip_porechop` : skip the Porechop trimming step +* `--skip_porechop`: skip the Porechop trimming step (default=false) * `--porechop_threads`: number of threads for Porechop (default=4) * `--porechop_args`: Porechop optional parameters (default=""), see [details](https://github.com/rrwick/Porechop#full-usage) Filtering: -* `--skip_filtering` : skip the filtering step -* `--filtering`: filtering tool: "japsa" or "filtlong" (default="japsa") +* `--skip_filtering`: skip the filtering step (default=false) +* `--filtering`: filtering tool: "japsa" or "filtlong" (default=`--filtering "japsa"`) * `--japsa_args`: Japsa optional parameters (default="--lenMin 1000 --qualMin 10"), see [details](https://japsa.readthedocs.io/en/latest/tools/jsa.np.filter.html) * `--filtlong_args`: Filtlong optional parameters (default="--min_length 1000 --keep_percent 90"), see [details](https://github.com/rrwick/Filtlong#full-usage) -* `--skip_rasusa`: Skip the sub-sampling Rasusa step +* `--skip_rasusa`: Skip the sub-sampling Rasusa step (default=false) * `--rasusa_coverage`: The desired coverage to sub-sample the reads to (default=100), see [details](https://github.com/mbhall88/rasusa#-c---coverage) Assembly: @@ -274,13 +274,13 @@ Polishing: * `--racon_args`: Racon optional parameters (default="-m 8 -x -6 -g -8 -w 500") * `--racon_threads`: number of threads for Racon (default=4) * `--medaka_threads`: number of threads for Medaka (default=4) -* `--skip_illumina`: skip the short-read polishing step if Illumina reads are not available (not recommended) +* `--skip_illumina`: skip the short-read polishing step if Illumina reads are not available (not recommended, default=false) * `--nextpolish_threads`: number of threads for Nextpolish (default=4) -* `--skip_fixstart`: skip the Circlator fixstart step, see [details](https://github.com/sanger-pathogens/circlator/wiki/Task:-fixstart) -* `--fixstart_args`: Circlator fixstart optional parameters (default=""). Example "--genes_fa /path/to/fasta". +* `--skip_fixstart`: skip the Circlator fixstart step (default=false), see [details](https://github.com/sanger-pathogens/circlator/wiki/Task:-fixstart) +* `--fixstart_args`: Circlator fixstart optional parameters (default=""). Example `--fixstart_args "--genes_fa /path/to/fasta"`. Assembly evaluation: -* `--skip_quast`: skip the QUAST assembly assessment step +* `--skip_quast`: skip the QUAST assembly assessment step (default=false) * `--quast_args`: QUAST optional parameters (default=""), see [details](http://quast.sourceforge.net/docs/manual.html#sec2.3) * `--quast_threads`: number of threads for QUAST (default=1) From 9cfcbdf9857b877b356a90af9584d39b6acaaa3e Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 17 Mar 2021 15:10:42 +1000 Subject: [PATCH 21/46] Modify singularity.runOptions in nextflow.config --- README.md | 4 ++-- nextflow.config | 11 +++++++++++ nextflow.config.v0.9 | 14 +++++++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 353ba23..b13b8bd 100644 --- a/README.md +++ b/README.md @@ -233,7 +233,7 @@ To test the assembly-only pipeline, edit the `sample_1.csv` samplesheet to point Some parameters can be added to the command line in order to include or skip some steps and modify some parameters: Basecalling -* `--gpu`: use the GPU node to run the Guppy basecalling and/or demultiplexing step (default=false) +* `--gpu`: use the GPU node to run the Guppy basecalling and/or demultiplexing step (default=true) * `--guppy_basecaller_args`: Guppy basecaller parameters (default="--recursive --trim_barcodes -q 0") * `--guppy_num_callers`: number of parallel basecallers to create when running guppy basecalling (default=8) * `--guppy_cpu_threads_per_caller`: number of CPU worker threads per basecaller (default=1). The number of CPU threads (num_callers * cpu_threads_per_caller ) used should generally not exceed the number of logical CPU cores your machine has. @@ -277,7 +277,7 @@ Polishing: * `--skip_illumina`: skip the short-read polishing step if Illumina reads are not available (not recommended, default=false) * `--nextpolish_threads`: number of threads for Nextpolish (default=4) * `--skip_fixstart`: skip the Circlator fixstart step (default=false), see [details](https://github.com/sanger-pathogens/circlator/wiki/Task:-fixstart) -* `--fixstart_args`: Circlator fixstart optional parameters (default=""). Example `--fixstart_args "--genes_fa /path/to/fasta"`. +* `--fixstart_args`: Circlator fixstart optional parameters (default=""). Example `--fixstart_args "--genes_fa /path/to/fasta"` (the file should be located in the nextflow launch directory). Assembly evaluation: * `--skip_quast`: skip the QUAST assembly assessment step (default=false) diff --git a/nextflow.config b/nextflow.config index 7094480..93f164e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -99,6 +99,17 @@ process { errorStrategy = 'ignore' } +mounts { + fast5 = "" + fastq = "" + if (params.fast5 != false) { + fast5 = "-B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\"" + } + if (params.fastq != false){ + fastq = "-B \"`[[ \"${params.fastq}\" =~ ^/ ]] && echo ${params.fastq} || echo ${PWD}/${params.fastq}`\"" + } +} + singularity { enabled = true autoMounts = false diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 index bd174ed..a4048cf 100644 --- a/nextflow.config.v0.9 +++ b/nextflow.config.v0.9 @@ -16,7 +16,7 @@ params { outdir = './results' basecalling = false demultiplexing = false - gpu = false + gpu = true fast5 = false fastq = false demultiplexer = 'guppy' @@ -96,6 +96,18 @@ process { withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } + errorStrategy = 'ignore' +} + +mounts { + fast5 = "" + fastq = "" + if (params.fast5 != false) { + fast5 = "-B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\"" + } + if (params.fastq != false){ + fastq = "-B \"`[[ \"${params.fastq}\" =~ ^/ ]] && echo ${params.fastq} || echo ${PWD}/${params.fastq}`\"" + } } singularity { From 993ee431d32c7c972a3c7e6bc464e54e1b6cbf46 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 24 Mar 2021 13:51:13 +1000 Subject: [PATCH 22/46] Add --datadir parameter --- README.md | 40 +++++++++++++++++++++++----------------- nextflow.config | 9 +++++++-- nextflow.config.v0.9 | 9 +++++++-- 3 files changed, 37 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index b13b8bd..989996b 100644 --- a/README.md +++ b/README.md @@ -34,15 +34,15 @@ Please note that this pipeline does not perform extensive quality assessment of 1. Basecalling, demultiplexing and assembly workflow -`nextflow main.nf --basecalling --demultiplexing --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --outdir /path/to/outdir/` +`nextflow main.nf --basecalling --demultiplexing --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` 2. Demultiplexing and assembly workflow (basecalling already complete) -`nextflow main.nf --demultiplexing --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --outdir /path/to/outdir/` +`nextflow main.nf --demultiplexing --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` 3. Assembly only workflow (basecalling and demultiplexing already complete) -`nextflow main.nf --samplesheet /path/to/samples.csv --outdir /path/to/outdir/` +`nextflow main.nf --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` # Installation @@ -79,7 +79,6 @@ The pipeline uses separated Singularity containers for all processes. Nextflow w ``` singularity { enabled = true - autoMounts = true singularity.cacheDir = '/path/to/cachedir' } ``` @@ -134,13 +133,14 @@ The pipeline can be used to run: The entire workflow from basecalling to polishing will be run. The input files will be the ONT fast5 files and the Illumina fastq files. -`nextflow main.nf --basecalling --demultiplexing --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --outdir /path/to/outdir/` +`nextflow main.nf --basecalling --demultiplexing --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` ``` --samplesheet: samplesheet file ---outdir: name of the output directory to be created --basecalling: flag to run the basecalling step --demultiplexing: flag to run the demultiplexing step --fast5: directory containing the ONT fast5 files +--outdir: path to the output directory to be created +--datadir: path to the directory containing the Illumina fastq files --guppy_config_gpu: Guppy configuration file name for basecalling using GPU resources (default=dna_r9.4.1_450bps_hac.cfg suitable if the Flow Cell Type = FLO-MIN106 and Kit = SQK-RBK004) --guppy_config_cpu: Guppy configuration file name for basecalling using CPU resources (default=dna_r9.4.1_450bps_fast.cfg) --medaka_model: Medaka model (default=r941_min_high, Available models: r941_min_fast, r941_min_high, r941_prom_fast, r941_prom_high, r10_min_high, r941_min_diploid_snp), see [details](https://github.com/nanoporetech/medaka#models) @@ -156,12 +156,13 @@ barcode02,S34,S34EC.filtered_1P.fastq.gz,S34EC.filtered_2P.fastq.gz,5.5m The entire workflow from basecalling to polishing will be run (excluding demultiplexing). The input files will be the ONT fast5 files and the Illumina fastq files. -`nextflow main.nf --basecalling --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --outdir /path/to/outdir/` +`nextflow main.nf --basecalling --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` ``` --samplesheet: path to the samplesheet file --basecalling: flag to run the basecalling step --fast5: path to the directory containing the ONT fast5 files --outdir: path to the output directory to be created +--datadir: path to the directory containing the Illumina fastq files --guppy_config_gpu: Guppy configuration file name for basecalling using GPU resources (default=dna_r9.4.1_450bps_hac.cfg suitable if the Flow Cell Type = FLO-MIN106 and Kit = SQK-LSK109) --guppy_config_cpu: Guppy configuration file name for basecalling using CPU resources (default=dna_r9.4.1_450bps_fast.cfg) --medaka_model: name of the Medaka model (default=r941_min_high, Available models: r941_min_fast, r941_min_high, r941_prom_fast, r941_prom_high, r10_min_high, r941_min_diploid_snp), see [details](https://github.com/nanoporetech/medaka#models) @@ -176,12 +177,13 @@ S24,S24EC.filtered_1P.fastq.gz,S24EC.filtered_2P.fastq.gz,5.5m The entire workflow from demultiplexing to polishing will be run. The input files will be the ONT fastq files and the Illumina fastq files. -`nextflow main.nf --demultiplexing --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --outdir /path/to/outdir/` +`nextflow main.nf --demultiplexing --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` ``` --samplesheet: path to the samplesheet file --demultiplexing: flag to run the demultiplexing step --fastq: path to the directory containing the ONT fastq files (gzip compressed) --outdir: path to the output directory to be created +--datadir: path to the directory containing the Illumina fastq files --guppy_config_gpu: Guppy configuration file name for basecalling using GPU resources (default=dna_r9.4.1_450bps_hac.cfg suitable if the Flow Cell Type = FLO-MIN106 and Kit = SQK-LSK109) --guppy_config_cpu: Guppy configuration file name for basecalling using CPU resources (default=dna_r9.4.1_450bps_fast.cfg) --medaka_model: name of the Medaka model (default=r941_min_high, available models: r941_min_fast, r941_min_high, r941_prom_fast, r941_prom_high, r10_min_high, r941_min_diploid_snp), see [details](https://github.com/nanoporetech/medaka#models) @@ -197,10 +199,12 @@ barcode02,S34,S34EC.filtered_1P.fastq.gz,S34EC.filtered_2P.fastq.gz,5.5m The assembly workflow from adapter trimming to polishing will be run. The input files will be the ONT fastq files and the Illumina fastq files. -`nextflow main.nf --samplesheet /path/to/samples.csv --outdir /path/to/outdir/` +`nextflow main.nf --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` ``` --samplesheet: path to the samplesheet file +--fastq: path to the directory containing the ONT fastq files (gzip compressed) --outdir: path to the output directory to be created +--datadir: path to the directory containing the Illumina fastq files --medaka_model: name of the Medaka model (default=r941_min_high, Available models: r941_min_fast, r941_min_high, r941_prom_fast, r941_prom_high, r10_min_high, r941_min_diploid_snp), see [details](https://github.com/nanoporetech/medaka#models) ``` Example of samplesheet file: @@ -246,7 +250,7 @@ Quality control: Demultiplexing: * `--demultiplexer`: demultiplexing tool: "qcat" or "guppy" (default=`--demultiplexer "qcat"`) -* `--qcat_args`: qcat optional parameters (default="") +* `--qcat_args`: qcat optional parameters (default=""), see [details](https://github.com/nanoporetech/qcat#full-usage) * `--guppy_barcoder_args`: Guppy barcoder parameters (default="--recursive --trim_barcodes -q 0") * `--guppy_barcode_kits`: Space separated list of barcoding kit(s) to detect against (default="SQK-RBK004") * `--guppy_barcoder_threads`: number of worker threads to spawn for Guppy barcoder to use. Increasing this number will allow Guppy barcoder to make better use of multi-core CPU systems, but may impact overall system performance (default=2) @@ -261,27 +265,27 @@ Filtering: * `--filtering`: filtering tool: "japsa" or "filtlong" (default=`--filtering "japsa"`) * `--japsa_args`: Japsa optional parameters (default="--lenMin 1000 --qualMin 10"), see [details](https://japsa.readthedocs.io/en/latest/tools/jsa.np.filter.html) * `--filtlong_args`: Filtlong optional parameters (default="--min_length 1000 --keep_percent 90"), see [details](https://github.com/rrwick/Filtlong#full-usage) -* `--skip_rasusa`: Skip the sub-sampling Rasusa step (default=false) +* `--skip_rasusa`: Skip the sub-sampling Rasusa step (default=true) * `--rasusa_coverage`: The desired coverage to sub-sample the reads to (default=100), see [details](https://github.com/mbhall88/rasusa#-c---coverage) Assembly: -* `--flye_args`: Flye optional parameters (default="--plasmids") +* `--flye_args`: Flye optional parameters (default=`--flye_args "--plasmids"`), see [details](https://github.com/fenderglass/Flye/blob/flye/docs/USAGE.md) * `--flye_threads`: number of threads for Flye (default=4) Polishing: * `--polisher`: Long-read polishing tool: "medaka" (racon followed by medaka) or "nextpolish" (default="medaka") * `--racon_nb`: number of Racon long-read polishing iterations (default=4) -* `--racon_args`: Racon optional parameters (default="-m 8 -x -6 -g -8 -w 500") +* `--racon_args`: Racon optional parameters (default="-m 8 -x -6 -g -8 -w 500"), see [details](https://github.com/isovic/racon#usage) * `--racon_threads`: number of threads for Racon (default=4) * `--medaka_threads`: number of threads for Medaka (default=4) * `--skip_illumina`: skip the short-read polishing step if Illumina reads are not available (not recommended, default=false) * `--nextpolish_threads`: number of threads for Nextpolish (default=4) * `--skip_fixstart`: skip the Circlator fixstart step (default=false), see [details](https://github.com/sanger-pathogens/circlator/wiki/Task:-fixstart) -* `--fixstart_args`: Circlator fixstart optional parameters (default=""). Example `--fixstart_args "--genes_fa /path/to/fasta"` (the file should be located in the nextflow launch directory). +* `--fixstart_args`: Circlator fixstart optional parameters (default=""). Example `--fixstart_args "--genes_fa /path/to/datadir/fasta"` (the file should be located in the nextflow launch directory or in the datadir). Assembly evaluation: * `--skip_quast`: skip the QUAST assembly assessment step (default=false) -* `--quast_args`: QUAST optional parameters (default=""), see [details](http://quast.sourceforge.net/docs/manual.html#sec2.3) +* `--quast_args`: QUAST optional parameters (default=""), see [details](http://quast.sourceforge.net/docs/manual.html#sec2.3). Example: `--quast_args "-r /path/to/datadir/fasta"` (the file should be located in the nextflow launch directory or in the datadir). * `--quast_threads`: number of threads for QUAST (default=1) # Structure of the output folders @@ -293,16 +297,18 @@ The main output folder (`--outdir`) will contain the following folders: * **a folder per sample:** see content below (the folder is named as in the column sample_id in the samplesheet file) Each sample folder will contain the following folders: -* **1_filtering:** Fastq files containing trimmed reads (sample_id_trimmed.fastq.gz) and filtered reads (sample_id_filtered.fastq.gz) +* **1_filtering:** Fastq files containing filtered reads (sample_id_filtered.fastq.gz) * **2_assembly:** Flye assembly output files (.fasta, .gfa, .gv, .info.txt), see [details](https://github.com/fenderglass/Flye/blob/flye/docs/USAGE.md#-flye-output) * **3_polishing_long_reads:** Long-read polished assembly fasta file (sample_id_flye_polishedLR.fasta) -* **4_polishing_short_reads:** Final polished assembly fasta file (sample_id_flye_polishedLR_SR.fasta) +* **4_polishing_short_reads:** Final polished assembly fasta file (sample_id_flye_polishedLR_SR_fixstart.fasta) * **5_quast:** QUAST quality assessment report, see [details](http://quast.sourceforge.net/docs/manual.html) # Comments The pipeline has been tested using the following grid based executors: SLURM, PBS Pro and LSF. +Do not forget to delete the /work directory created by Nextflow once the pipeline has completed. + Planned upgrades: - Enabling GPU resource for Racon and Medaka processes. diff --git a/nextflow.config b/nextflow.config index 93f164e..677edb0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,7 +19,8 @@ params { gpu = true fast5 = false fastq = false - demultiplexer = 'guppy' + datadir = false + demultiplexer = 'guppy' guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" kit = false @@ -102,18 +103,22 @@ process { mounts { fast5 = "" fastq = "" + datadir = "" if (params.fast5 != false) { fast5 = "-B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\"" } if (params.fastq != false){ fastq = "-B \"`[[ \"${params.fastq}\" =~ ^/ ]] && echo ${params.fastq} || echo ${PWD}/${params.fastq}`\"" } + if (params.datadir != false){ + datadir = "-B \"`[[ \"${params.datadir}\" =~ ^/ ]] && echo ${params.datadir} || echo ${PWD}/${params.datadir}`\"" + } } singularity { enabled = true autoMounts = false - runOptions = "-B \"$launchDir\" -B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\" -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" + runOptions = "-B \"$launchDir\" $mounts.fast5 $mounts.fastq $mounts.datadir -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" } manifest { diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 index a4048cf..633c71e 100644 --- a/nextflow.config.v0.9 +++ b/nextflow.config.v0.9 @@ -19,7 +19,8 @@ params { gpu = true fast5 = false fastq = false - demultiplexer = 'guppy' + datadir = false + demultiplexer = 'guppy' guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" kit = false @@ -102,18 +103,22 @@ process { mounts { fast5 = "" fastq = "" + datadir = "" if (params.fast5 != false) { fast5 = "-B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\"" } if (params.fastq != false){ fastq = "-B \"`[[ \"${params.fastq}\" =~ ^/ ]] && echo ${params.fastq} || echo ${PWD}/${params.fastq}`\"" } + if (params.datadir != false){ + datadir = "-B \"`[[ \"${params.datadir}\" =~ ^/ ]] && echo ${params.datadir} || echo ${PWD}/${params.datadir}`\"" + } } singularity { enabled = true autoMounts = false - runOptions = "-B \"$launchDir\" -B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\" -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" + runOptions = "-B \"$launchDir\" $mounts.fast5 $mounts.fastq $mounts.datadir -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" } manifest { From c1ec7272eacdce7d6b41739f15643945708f3765 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 29 Mar 2021 11:11:41 +1000 Subject: [PATCH 23/46] Add citation section --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 989996b..0c679d3 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Please note that this pipeline does not perform extensive quality assessment of * [Optional parameters](#optional-parameters) * [Structure of the output folders](#structure-of-the-output-folders) * [Comments](#comments) - +* [Citation](#citation) # Quickstart @@ -312,3 +312,10 @@ Do not forget to delete the /work directory created by Nextflow once the pipelin Planned upgrades: - Enabling GPU resource for Racon and Medaka processes. +# Citation + +If you use microPIPE in your work, please cite: + +MicroPIPE: An end-to-end solution for high-quality complete bacterial genome construction +Valentine Murigneux, Leah W. Roberts, Brian M. Forde, Minh-Duy Phan, Nguyen Thi Khanh Nhu, Adam D. Irwin, Patrick N. A. Harris, David L. Paterson, Mark A. Schembri, David M. Whiley, Scott A. Beatson +bioRxiv 2021.02.02.429319; doi: https://doi.org/10.1101/2021.02.02.429319 From fb1723e2932f0c1fda88317562420e3b40b61f97 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 21 Apr 2021 14:39:59 +1000 Subject: [PATCH 24/46] Add --nextpolish_task_SR and --nextpolish_task_LR parameters --- README.md | 6 ++++-- main.nf | 25 ++++++++++++++++++------- nextflow.config | 4 +++- nextflow.config.v0.9 | 4 +++- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 0c679d3..c3c6fd5 100644 --- a/README.md +++ b/README.md @@ -249,7 +249,7 @@ Quality control: * `--skip_pycoqc`: skip the pycoQC step to generate a quality control html report, when --basecalling (default=false) Demultiplexing: -* `--demultiplexer`: demultiplexing tool: "qcat" or "guppy" (default=`--demultiplexer "qcat"`) +* `--demultiplexer`: demultiplexing tool: "qcat" or "guppy" (default=`--demultiplexer "guppy"`) * `--qcat_args`: qcat optional parameters (default=""), see [details](https://github.com/nanoporetech/qcat#full-usage) * `--guppy_barcoder_args`: Guppy barcoder parameters (default="--recursive --trim_barcodes -q 0") * `--guppy_barcode_kits`: Space separated list of barcoding kit(s) to detect against (default="SQK-RBK004") @@ -279,7 +279,9 @@ Polishing: * `--racon_threads`: number of threads for Racon (default=4) * `--medaka_threads`: number of threads for Medaka (default=4) * `--skip_illumina`: skip the short-read polishing step if Illumina reads are not available (not recommended, default=false) -* `--nextpolish_threads`: number of threads for Nextpolish (default=4) +* `--nextpolish_threads`: number of threads for nextPolish (default=4) +* `--nextpolish_task_SR`: task to run for nextPolish short-read polishing ("12" or "1212", default="1212"), see [details](https://nextpolish.readthedocs.io/en/latest/OPTION.html#cmdoption-arg-task) +* `--nextpolish_task_LR`: task to run for nextPolish long-read polishing ("5" or "55", default="55"), see [details](https://nextpolish.readthedocs.io/en/latest/OPTION.html#cmdoption-arg-task) * `--skip_fixstart`: skip the Circlator fixstart step (default=false), see [details](https://github.com/sanger-pathogens/circlator/wiki/Task:-fixstart) * `--fixstart_args`: Circlator fixstart optional parameters (default=""). Example `--fixstart_args "--genes_fa /path/to/datadir/fasta"` (the file should be located in the nextflow launch directory or in the datadir). diff --git a/main.nf b/main.nf index 4dd3a38..465c8d8 100644 --- a/main.nf +++ b/main.nf @@ -511,6 +511,7 @@ process racon_cpu { cpus "${params.racon_threads}" tag "${sample}" label "cpu" + label "racon" publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: '*fasta', saveAs: { filename -> "${sample}_${prefix}_${raconv}_${params.racon_nb}.fasta"} publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: '*log', saveAs: { filename -> "${sample}_$filename" } publishDir "$params.outdir/$sample/3_polishing_long_reads", mode: 'copy', pattern: "*_version.txt" @@ -585,11 +586,16 @@ process nextpolish_LR { """ set +eu ls ${filtered} > lgs.fofn - echo -e "task = 55\ngenome = ${assembly}\nmultithread_jobs = ${task.cpus}\nlgs_fofn = lgs.fofn\nlgs_minimap2_options = -x map-ont -t ${params.nextpolish_threads}" > nextpolish.cfg + echo -e "task = ${params.nextpolish_task_LR}\ngenome = ${assembly}\nmultithread_jobs = ${task.cpus}\nlgs_fofn = lgs.fofn\nlgs_minimap2_options = -x map-ont -t ${params.nextpolish_threads}" > nextpolish.cfg nextPolish nextpolish.cfg - cat 01.lgs_polish/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr}.fasta + if [[ "${params.nextpolish_task_LR}" == "55" ]] || [[ "${params.nextpolish_task_LR}" == "best" ]] ; then + cat 01.lgs_polish/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr}.fasta + rm -r 00.lgs_polish 01.lgs_polish + elif [[ "${params.nextpolish_task_LR}" == "5" ]]; then + cat 00.lgs_polish/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr}.fasta + rm -r 00.lgs_polish + fi rm input.lgspart.*.gz - rm -r 00.lgs_polish 01.lgs_polish cp .command.log nextpolish_LR.log nextPolish --version 2> nextpolish_version.txt """ @@ -615,12 +621,17 @@ process nextpolish { """ set +eu ls ${reads_1} ${reads_2} > sgs.fofn - echo -e "task = 1212\ngenome = ${draft}\nsgs_fofn = sgs.fofn\nmultithread_jobs = ${params.nextpolish_threads}" > nextpolish.cfg + echo -e "task = ${params.nextpolish_task_SR}\ngenome = ${draft}\nsgs_fofn = sgs.fofn\nmultithread_jobs = ${params.nextpolish_threads}" > nextpolish.cfg nextPolish nextpolish.cfg - cat 01.kmer_count/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr_sr}_1.fasta - cat 03.kmer_count/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr_sr}_2.fasta + if [[ "${params.nextpolish_task_SR}" == "1212" ]] || [[ "${params.nextpolish_task_SR}" == "best" ]] ; then + cat 01.kmer_count/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr_sr}_1.fasta + cat 03.kmer_count/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr_sr}_2.fasta + rm -r 00.score_chain 01.kmer_count 02.score_chain 03.kmer_count + elif [[ "${params.nextpolish_task_SR}" == "12" ]]; then + cat 01.kmer_count/*polish.ref.sh.work/polish_genome*/genome.nextpolish.part*.fasta > ${sample}_${prefix_lr_sr}_2.fasta + rm -r 00.score_chain 01.kmer_count + fi rm input.sgspart*.fastq.gz - rm -r 00.score_chain 01.kmer_count 02.score_chain 03.kmer_count cp .command.log nextpolish.log nextPolish --version 2> nextpolish_version.txt """ diff --git a/nextflow.config b/nextflow.config index 677edb0..1f87a54 100644 --- a/nextflow.config +++ b/nextflow.config @@ -52,7 +52,9 @@ params { medaka_model = "r941_min_high" medaka_threads = 8 nextpolish_threads = 4 - skip_illumina = false + nextpolish_task_SR = "1212" + nextpolish_task_LR = "55" + skip_illumina = false fixstart_args = "" skip_fixstart = false quast_threads = 1 diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 index 633c71e..f013dd1 100644 --- a/nextflow.config.v0.9 +++ b/nextflow.config.v0.9 @@ -52,7 +52,9 @@ params { medaka_model = "r941_min_high" medaka_threads = 8 nextpolish_threads = 4 - skip_illumina = false + nextpolish_task_SR = "1212" + nextpolish_task_LR = "55" + skip_illumina = false fixstart_args = "" skip_fixstart = false quast_threads = 1 From 2609ec86523a9b7c8628de37796cf2181330da38 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Fri, 23 Apr 2021 14:29:54 +1000 Subject: [PATCH 25/46] Update path to test_data in batch_template.sh and samplesheets --- nextflow.config | 11 +- nextflow.config.v0.8 | 134 ++++++++++++++++++ nextflow.config.v0.9 | 1 + nextflow_batch_template.sh | 25 ++-- test_data/samples_1.csv | 2 +- test_data/samples_1_basecalling.csv | 2 +- .../samples_1_basecalling_single_isolate.csv | 2 +- 7 files changed, 157 insertions(+), 20 deletions(-) create mode 100644 nextflow.config.v0.8 diff --git a/nextflow.config b/nextflow.config index 1f87a54..6e2a119 100644 --- a/nextflow.config +++ b/nextflow.config @@ -52,7 +52,7 @@ params { medaka_model = "r941_min_high" medaka_threads = 8 nextpolish_threads = 4 - nextpolish_task_SR = "1212" + nextpolish_task_SR = "1212" nextpolish_task_LR = "55" skip_illumina = false fixstart_args = "" @@ -85,8 +85,8 @@ dag { // Not generally user-modifiable !!! process { withLabel: big_mem { memory = 32.GB } - withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.4.3'} - withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.4.3' } + withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.6.1'} + withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } @@ -114,7 +114,7 @@ mounts { } if (params.datadir != false){ datadir = "-B \"`[[ \"${params.datadir}\" =~ ^/ ]] && echo ${params.datadir} || echo ${PWD}/${params.datadir}`\"" - } + } } singularity { @@ -127,7 +127,8 @@ manifest { name = 'microPIPE' author = 'Valentine Murigneux' description = 'Bacterial genome assembly pipeline' + homePage = 'https://github.com/BeatsonLab-MicrobialGenomics/micropipe' mainScript = 'main.nf' - version = '0.8' + version = '0.9' } diff --git a/nextflow.config.v0.8 b/nextflow.config.v0.8 new file mode 100644 index 0000000..f2d4257 --- /dev/null +++ b/nextflow.config.v0.8 @@ -0,0 +1,134 @@ +// Singularity containter cache. Change this as appropriate +singularity { + cacheDir = "/opt/singularity_cache" +} + +// Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) +// If your job scheduler has different queues/partitions for cpu and gpu, please also set them here +process { + executor='local' + withLabel: cpu { queue = 'main' } + withLabel: gpu { queue = 'gpu' } +} + +// Default parameters. Commandline parameters will take priority over these +params { + outdir = './results' + basecalling = false + demultiplexing = false + gpu = true + fast5 = false + fastq = false + datadir = false + demultiplexer = 'guppy' + guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" + guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" + kit = false + flowcell = false + guppy_gpu_device = "auto" + guppy_num_callers = 8 + guppy_cpu_threads_per_caller = 1 + guppy_basecaller_args = "--recursive --trim_barcodes -q 0" + guppy_barcoder_args = "--recursive --trim_barcodes -q 0" + guppy_barcode_kits= "SQK-RBK004" + guppy_barcoder_threads = 2 + qcat_args = "" + skip_pycoqc = false + skip_rasusa = true + skip_porechop = false + skip_filtering = false + rasusa_coverage = 100 + filtering = "japsa" + porechop_args = "" + porechop_threads = 4 + japsa_args = "--lenMin 1000 --qualMin 10" + filtlong_args = "--min_length 1000 --keep_percent 90" + flye_args = "--plasmids" + flye_threads = 4 + polisher = "medaka" + racon_nb = 4 + racon_args = "-m 8 -x -6 -g -8 -w 500" + racon_threads = 4 + medaka_model = "r941_min_high" + medaka_threads = 8 + nextpolish_threads = 4 + nextpolish_task_SR = "1212" + nextpolish_task_LR = "55" + skip_illumina = false + fixstart_args = "" + skip_fixstart = false + quast_threads = 1 + quast_args = "" + skip_quast = false +} + +// Debug and report options +trace { + enabled = true + file = "${params.outdir}/trace.txt" +} +timeline { + enabled = true + file = "${params.outdir}/timeline.html" +} +report { + enabled = true + file = "${params.outdir}/report.html" +} +dag { + enabled = true + file = "${params.outdir}/flowchart_dag.svg" +} + + + +// Not generally user-modifiable !!! +process { + withLabel: big_mem { memory = 32.GB } + withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.4.3'} + withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.4.3' } + withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } + withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } + withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } + withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } + withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } + withName: japsa { container = 'docker://vmurigneux/japsa:latest' } + withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } + withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } + withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } + withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } + withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } + withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } + errorStrategy = 'ignore' +} + +mounts { + fast5 = "" + fastq = "" + datadir = "" + if (params.fast5 != false) { + fast5 = "-B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\"" + } + if (params.fastq != false){ + fastq = "-B \"`[[ \"${params.fastq}\" =~ ^/ ]] && echo ${params.fastq} || echo ${PWD}/${params.fastq}`\"" + } + if (params.datadir != false){ + datadir = "-B \"`[[ \"${params.datadir}\" =~ ^/ ]] && echo ${params.datadir} || echo ${PWD}/${params.datadir}`\"" + } +} + +singularity { + enabled = true + autoMounts = false + runOptions = "-B \"$launchDir\" $mounts.fast5 $mounts.fastq $mounts.datadir -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" +} + +manifest { + name = 'microPIPE' + author = 'Valentine Murigneux' + description = 'Bacterial genome assembly pipeline' + homePage = 'https://github.com/BeatsonLab-MicrobialGenomics/micropipe' + mainScript = 'main.nf' + version = '0.8' +} + diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 index f013dd1..6e2a119 100644 --- a/nextflow.config.v0.9 +++ b/nextflow.config.v0.9 @@ -127,6 +127,7 @@ manifest { name = 'microPIPE' author = 'Valentine Murigneux' description = 'Bacterial genome assembly pipeline' + homePage = 'https://github.com/BeatsonLab-MicrobialGenomics/micropipe' mainScript = 'main.nf' version = '0.9' } diff --git a/nextflow_batch_template.sh b/nextflow_batch_template.sh index bdc53ba..d6c4559 100644 --- a/nextflow_batch_template.sh +++ b/nextflow_batch_template.sh @@ -1,18 +1,19 @@ #!/bin/bash -#SBATCH --job-name=pipeline +#SBATCH --job-name=micropipe #SBATCH --nodes=1 #SBATCH --cpus-per-task=1 -#SBATCH --output=s%A.pipeline_assembly.out -#SBATCH --error=s%A.pipeline_assembly.err +#SBATCH --output=s%A.micropipe.out +#SBATCH --error=s%A.micropipe.err source activate nextflow #Cloud9: It is recommended to run the nextflow command in the background inside a tmux/screen session to avoid potential issues when submitting the pipeline in a batch script #directory containing the nextflow.config file and the main.nf script -dir=/scratch/uqvmurig/ST131_03c/pipeline_v15 +dir=/scratch/micropipe cd ${dir} +datadir=${dir}/test_data out_dir=${dir}/results #Run A, B or C depending on whether you are starting with ONT fast5 (A or B) or fastq files (C or D) @@ -20,21 +21,21 @@ out_dir=${dir}/results #A) Workflow including basecalling, demultiplexing and assembly #fast5_dir=${dir}/fast5_pass #csv=${dir}/samplesheet/samples_1_basecalling.csv -#nextflow main.nf --basecalling --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} +#nextflow main.nf --basecalling --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} #B) Workflow including basecalling and assembly (skip demultiplexing step) #fast5_dir=${dir}/fast5_pass -#csv=${dir}/samplesheet/samples_1_basecalling_single_isolate.csv -nextflow main.nf --basecalling --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} +#csv=${dir}/test_data/samples_1_basecalling_single_isolate.csv +#nextflow main.nf --basecalling --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} #C) Workflow including demultiplexing and assembly #fastq_dir=${dir}/fastq -#csv=${dir}/samplesheet/samples_1_basecalling.csv -#nextflow main.nf --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fastq ${fastq_dir} +#csv=${dir}/test_data/samples_1_basecalling.csv +#nextflow main.nf --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fastq ${fastq_dir} --datadir ${datadir} #D) Assembly workflow (skip basecalling and demultiplexing step) -csv=${dir}/samples_1.csv -nextflow main.nf --samplesheet ${csv} --outdir ${out_dir} +csv=${dir}/test_data/samples_1.csv +nextflow main.nf --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir} #to restart the pipeline if something failed, use the -resume flag after correcting the issue -#nextflow main.nf -resume --samplesheet ${csv} --outdir ${out_dir} +#nextflow main.nf -resume --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir} diff --git a/test_data/samples_1.csv b/test_data/samples_1.csv index 08d100f..b37cc39 100644 --- a/test_data/samples_1.csv +++ b/test_data/samples_1.csv @@ -1,2 +1,2 @@ barcode_id,sample_id,long_fastq,short_fastq_1,short_fastq_2,genome_size -barcode01,S24,ONT/barcode01.fastq.gz,Illumina/S24EC_1P_test.fastq.gz,Illumina/S24EC_2P_test.fastq.gz,5.5m +barcode01,S24,test_data/barcode01.fastq.gz,test_data/S24EC_1P_test.fastq.gz,test_data/S24EC_2P_test.fastq.gz,5.5m diff --git a/test_data/samples_1_basecalling.csv b/test_data/samples_1_basecalling.csv index c977615..c04f1c5 100644 --- a/test_data/samples_1_basecalling.csv +++ b/test_data/samples_1_basecalling.csv @@ -1,2 +1,2 @@ barcode_id,sample_id,short_fastq_1,short_fastq_2,genome_size -barcode01,S24,Illumina/S24EC.filtered_1P.fastq.gz,Illumina/S24EC.filtered_2P.fastq.gz,5.5m +barcode01,S24,test_data/S24EC_1P_test.fastq.gz,test_data/S24EC_2P_test.fastq.gz,5.5m diff --git a/test_data/samples_1_basecalling_single_isolate.csv b/test_data/samples_1_basecalling_single_isolate.csv index ec6ef1d..e317d19 100644 --- a/test_data/samples_1_basecalling_single_isolate.csv +++ b/test_data/samples_1_basecalling_single_isolate.csv @@ -1,2 +1,2 @@ sample_id,short_fastq_1,short_fastq_2,genome_size -S24,Illumina/S24EC.filtered_1P.fastq.gz,Illumina/S24EC.filtered_2P.fastq.gz,5.5m +S24,test_data/S24EC_1P_test.fastq.gz,test_data/S24EC_2P_test.fastq.gz,5.5m From 0debef957b363ebe7ad76d4d11d222e26a1dbafd Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Fri, 14 May 2021 16:44:52 +1000 Subject: [PATCH 26/46] Add parameter guppy_gpu_folder and guppy_cpu_folder --- README.md | 18 ++++++ main.nf | 59 ++++++++++--------- nextflow.config | 17 ++++-- nextflow.config.v0.8 | 15 +++-- nextflow.config.v0.9 | 134 ------------------------------------------- 5 files changed, 70 insertions(+), 173 deletions(-) delete mode 100644 nextflow.config.v0.9 diff --git a/README.md b/README.md index c3c6fd5..1fca20b 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,9 @@ It will create the nextflow main executable file in the current directory. Optio * [Singularity](https://singularity.lbl.gov/install-linux) >= 2.3 (microPIPE has been tested with version 3.4.1, 3.5.0 and 3.6.3) +* Guppy + +Due to the Oxford Nanopore Technologies terms and conditions, we are not allowed to redistribute the Guppy software either in its binary form or packaged form e.g. Docker or Singularity images. Therefore users will have to either install Guppy, provide a container image or start the pipeline from the basecalled fastq files. See [Usage](#usage) section below for instructions. **1. Installing microPIPE** @@ -83,6 +86,21 @@ singularity { } ``` +The **nextflow.config** file should be modified to specify the location of Guppy using one of the following possibilities: + +* Download and unpack the Guppy .tar.gz archive file. Provide the path to the Guppy binary folder in the params section: + ``` + //Path to the Guppy GPU and CPU binary folder. Change this as appropriate + guppy_gpu_folder= "/scratch/ont-guppy/bin" + guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin" + ``` +* Provide the link to a Guppy container in the process section: + ``` + //Path to the Guppy GPU and CPU container images. Change this if required + //withLabel: guppy_gpu { container = ''} + //withLabel: guppy_cpu { container = '' } + ``` + An example configuration file can be found in this [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). Two versions of the configuration file are available and correspond to microPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1), as referenced in the paper. diff --git a/main.nf b/main.nf index 465c8d8..3d12d89 100644 --- a/main.nf +++ b/main.nf @@ -20,20 +20,21 @@ def helpMessage() { ========================================= Usage: Basecalling, demultiplexing and assembly workflow: - nextflow main.nf --basecalling --demultiplexing --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --outdir /path/to/outdir/ + nextflow main.nf --basecalling --demultiplexing --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --outdir /path/to/outdir/ --datadir /path/to/datadir/ Basecalling and assembly workflow (single isolate): - nextflow main.nf --basecalling --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --outdir /path/to/outdir/ + nextflow main.nf --basecalling --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --outdir /path/to/outdir/ --datadir /path/to/datadir/ - Demultiplexing and assembly workflow: - nextflow main.nf --demultiplexing --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --outdir /path/to/outdir/ + Demultiplexing and assembly workflow (basecalling already complete): + nextflow main.nf --demultiplexing --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --outdir /path/to/outdir/ --datadir /path/to/datadir/ - Assembly only workflow: - nextflow main.nf --samplesheet /path/to/samples.csv --outdir /path/to/outdir/ + Assembly only workflow (basecalling and demultiplexing already complete): + nextflow main.nf --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --outdir /path/to/outdir/ --datadir /path/to/datadir/ Required arguments: --samplesheet Path to the samplesheet file --outdir Path to the output directory + --datadir Path to the directory containing the Illumina fastq files Basecalling: --basecalling Flag to run the basecalling step (default=false) @@ -43,6 +44,8 @@ def helpMessage() { --guppy_num_callers Number of parallel basecallers to create when running guppy basecalling (default=8) --guppy_cpu_threads_per_caller Number of CPU worker threads per basecaller (default=1). The number of CPU threads (num_callers * cpu_threads_per_caller ) used should generally not exceed the number of logical CPU cores your machine has. --guppy_gpu_device Basecalling device for Guppy: "auto" or "cuda:" (default="auto") + --guppy_gpu_folder Path to the Gupppy GPU binary folder (default="/scratch/ont-guppy/bin") + --guppy_cpu_folder Path to the Gupppy CPU binary folder (default="/scratch/ont-guppy-cpu/bin") --guppy_config_gpu Guppy configuration file name for basecalling using GPU resources (default=dna_r9.4.1_450bps_hac.cfg suitable if the Flow Cell Type = FLO-MIN106 and Kit = SQK-RBK004) --guppy_config_cpu Guppy configuration file name for basecalling using CPU resources (default=dna_r9.4.1_450bps_fast.cfg) --flowcell Name of the ONT flow cell used for sequencing (default=false). Ignored if '--guppy_config_gpu' or '--guppy_congif_cpu' is specified @@ -123,12 +126,12 @@ process basecalling { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log - guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_gpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -153,14 +156,14 @@ process basecalling_single_isolate { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log cat *.fastq > ${sample}.fastq gzip ${sample}.fastq - guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_gpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -183,12 +186,12 @@ process basecalling_cpu { """ set +eu if [[ "${params.guppy_config_cpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log - guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_cpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -212,14 +215,14 @@ process basecalling_cpu_single_isolate { """ set +eu if [[ "${params.guppy_config_cpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log cat *.fastq > ${sample}.fastq gzip ${sample}.fastq - guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_cpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -271,16 +274,16 @@ process basecalling_demultiplexing_guppy { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config "${params.guppy_config_gpu}" --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config "${params.guppy_config_gpu}" --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} fi cp .command.log guppy_basecaller.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_gpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -302,16 +305,16 @@ process basecalling_demultiplexing_guppy_cpu { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --config "${params.guppy_config_cpu}" --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --config "${params.guppy_config_cpu}" --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} fi cp .command.log guppy_basecaller.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_cpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -333,13 +336,13 @@ process demultiplexing_guppy { script: """ set +eu - guppy_barcoder -i ${fastq_dir} -s \$PWD --device ${params.guppy_gpu_device} --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} + ${params.guppy_gpu_folder}/guppy_barcoder -i ${fastq_dir} -s \$PWD --device ${params.guppy_gpu_device} --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} cp .command.log guppy_barcoder.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - guppy_barcoder --version > guppy_barcoder_version.txt + ${params.guppy_gpu_folder}/guppy_barcoder --version > guppy_barcoder_version.txt """ } @@ -360,13 +363,13 @@ process demultiplexing_guppy_cpu { script: """ set +eu - guppy_barcoder -i ${fastq_dir} -s \$PWD --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} + ${params.guppy_cpu_folder}/guppy_barcoder -i ${fastq_dir} -s \$PWD --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} cp .command.log guppy_barcoder.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - guppy_barcoder --version > guppy_barcoder_version.txt + ${params.guppy_cpu_folder}/guppy_barcoder --version > guppy_barcoder_version.txt """ } diff --git a/nextflow.config b/nextflow.config index 6e2a119..8f1491f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -6,14 +6,15 @@ singularity { // Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) // If your job scheduler has different queues/partitions for cpu and gpu, please also set them here process { - executor='local' + executor = params.executor withLabel: cpu { queue = 'main' } withLabel: gpu { queue = 'gpu' } } // Default parameters. Commandline parameters will take priority over these params { - outdir = './results' + executor = "local" + outdir = './results' basecalling = false demultiplexing = false gpu = true @@ -21,7 +22,10 @@ params { fastq = false datadir = false demultiplexer = 'guppy' - guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" + //Path to the Guppy GPU and CPU binary folder. Change this as appropriate + guppy_gpu_folder= "/scratch/ont-guppy/bin" + guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin" + guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" kit = false flowcell = false @@ -52,7 +56,7 @@ params { medaka_model = "r941_min_high" medaka_threads = 8 nextpolish_threads = 4 - nextpolish_task_SR = "1212" + nextpolish_task_SR = "1212" nextpolish_task_LR = "55" skip_illumina = false fixstart_args = "" @@ -85,8 +89,9 @@ dag { // Not generally user-modifiable !!! process { withLabel: big_mem { memory = 32.GB } - withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.6.1'} - withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } + //Path to the Guppy GPU and CPU container images. Change this if required + //withLabel: guppy_gpu { container = ''} + //withLabel: guppy_cpu { container = '' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } diff --git a/nextflow.config.v0.8 b/nextflow.config.v0.8 index f2d4257..f63d133 100644 --- a/nextflow.config.v0.8 +++ b/nextflow.config.v0.8 @@ -6,14 +6,15 @@ singularity { // Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) // If your job scheduler has different queues/partitions for cpu and gpu, please also set them here process { - executor='local' + executor = params.executor withLabel: cpu { queue = 'main' } withLabel: gpu { queue = 'gpu' } } // Default parameters. Commandline parameters will take priority over these params { - outdir = './results' + executor = "local" + outdir = './results' basecalling = false demultiplexing = false gpu = true @@ -21,7 +22,10 @@ params { fastq = false datadir = false demultiplexer = 'guppy' - guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" + //Path to the Guppy GPU and CPU binary folder. Change this as appropriate + guppy_gpu_folder= "/scratch/ont-guppy/bin" + guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin" + guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" kit = false flowcell = false @@ -85,8 +89,9 @@ dag { // Not generally user-modifiable !!! process { withLabel: big_mem { memory = 32.GB } - withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.4.3'} - withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.4.3' } + //Path to the Guppy GPU and CPU container images. Change this if required + //withLabel: guppy_gpu { container = ''} + //withLabel: guppy_cpu { container = '' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } diff --git a/nextflow.config.v0.9 b/nextflow.config.v0.9 deleted file mode 100644 index 6e2a119..0000000 --- a/nextflow.config.v0.9 +++ /dev/null @@ -1,134 +0,0 @@ -// Singularity containter cache. Change this as appropriate -singularity { - cacheDir = "/opt/singularity_cache" -} - -// Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) -// If your job scheduler has different queues/partitions for cpu and gpu, please also set them here -process { - executor='local' - withLabel: cpu { queue = 'main' } - withLabel: gpu { queue = 'gpu' } -} - -// Default parameters. Commandline parameters will take priority over these -params { - outdir = './results' - basecalling = false - demultiplexing = false - gpu = true - fast5 = false - fastq = false - datadir = false - demultiplexer = 'guppy' - guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" - guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" - kit = false - flowcell = false - guppy_gpu_device = "auto" - guppy_num_callers = 8 - guppy_cpu_threads_per_caller = 1 - guppy_basecaller_args = "--recursive --trim_barcodes -q 0" - guppy_barcoder_args = "--recursive --trim_barcodes -q 0" - guppy_barcode_kits= "SQK-RBK004" - guppy_barcoder_threads = 2 - qcat_args = "" - skip_pycoqc = false - skip_rasusa = true - skip_porechop = false - skip_filtering = false - rasusa_coverage = 100 - filtering = "japsa" - porechop_args = "" - porechop_threads = 4 - japsa_args = "--lenMin 1000 --qualMin 10" - filtlong_args = "--min_length 1000 --keep_percent 90" - flye_args = "--plasmids" - flye_threads = 4 - polisher = "medaka" - racon_nb = 4 - racon_args = "-m 8 -x -6 -g -8 -w 500" - racon_threads = 4 - medaka_model = "r941_min_high" - medaka_threads = 8 - nextpolish_threads = 4 - nextpolish_task_SR = "1212" - nextpolish_task_LR = "55" - skip_illumina = false - fixstart_args = "" - skip_fixstart = false - quast_threads = 1 - quast_args = "" - skip_quast = false -} - -// Debug and report options -trace { - enabled = true - file = "${params.outdir}/trace.txt" -} -timeline { - enabled = true - file = "${params.outdir}/timeline.html" -} -report { - enabled = true - file = "${params.outdir}/report.html" -} -dag { - enabled = true - file = "${params.outdir}/flowchart_dag.svg" -} - - - -// Not generally user-modifiable !!! -process { - withLabel: big_mem { memory = 32.GB } - withLabel: guppy_gpu { container = 'docker://vmurigneux/guppy-gpu:3.6.1'} - withLabel: guppy_cpu { container = 'docker://genomicpariscentre/guppy:3.6.1' } - withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } - withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } - withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } - withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } - withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } - withName: japsa { container = 'docker://vmurigneux/japsa:latest' } - withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } - withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } - withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } - withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } - withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } - withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } - errorStrategy = 'ignore' -} - -mounts { - fast5 = "" - fastq = "" - datadir = "" - if (params.fast5 != false) { - fast5 = "-B \"`[[ \"${params.fast5}\" =~ ^/ ]] && echo ${params.fast5} || echo ${PWD}/${params.fast5}`\"" - } - if (params.fastq != false){ - fastq = "-B \"`[[ \"${params.fastq}\" =~ ^/ ]] && echo ${params.fastq} || echo ${PWD}/${params.fastq}`\"" - } - if (params.datadir != false){ - datadir = "-B \"`[[ \"${params.datadir}\" =~ ^/ ]] && echo ${params.datadir} || echo ${PWD}/${params.datadir}`\"" - } -} - -singularity { - enabled = true - autoMounts = false - runOptions = "-B \"$launchDir\" $mounts.fast5 $mounts.fastq $mounts.datadir -B \"`[[ \"${params.outdir}\" =~ ^/ ]] && echo ${params.outdir} || echo ${PWD}/${params.outdir}`\"" -} - -manifest { - name = 'microPIPE' - author = 'Valentine Murigneux' - description = 'Bacterial genome assembly pipeline' - homePage = 'https://github.com/BeatsonLab-MicrobialGenomics/micropipe' - mainScript = 'main.nf' - version = '0.9' -} - From 6d2e189ccf0c11d026161e9fdbc42d9375f5675f Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Fri, 14 May 2021 21:11:26 +1000 Subject: [PATCH 27/46] Correct script when using parameter guppy_gpu_folder and guppy_cpu_folder --- README.md | 35 +++++++++++++++++++++++++++-------- main.nf | 44 ++++++++++++++++++++++---------------------- nextflow.config | 13 ++++++++----- nextflow.config.v0.8 | 15 +++++++++------ 4 files changed, 66 insertions(+), 41 deletions(-) diff --git a/README.md b/README.md index 1fca20b..f2457fc 100644 --- a/README.md +++ b/README.md @@ -86,19 +86,38 @@ singularity { } ``` -The **nextflow.config** file should be modified to specify the location of Guppy using one of the following possibilities: +The **nextflow.config** file should be modified to specify the location of Guppy using one of the following options: -* Download and unpack the Guppy .tar.gz archive file. Provide the path to the Guppy binary folder in the params section: +* Download and unpack the Guppy .tar.gz archive file. Provide the path to the Guppy binary folder in the params section and comment the following lines in the process section: ``` - //Path to the Guppy GPU and CPU binary folder. Change this as appropriate - guppy_gpu_folder= "/scratch/ont-guppy/bin" - guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin" + params { + //Path to the Guppy GPU and CPU binary folder. Change this as appropriate when providing Guppy as a binary folder and do not forget the "/" at the end of the path + guppy_gpu_folder= "/scratch/ont-guppy/bin/" + guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin/" + } ``` -* Provide the link to a Guppy container in the process section: ``` - //Path to the Guppy GPU and CPU container images. Change this if required - //withLabel: guppy_gpu { container = ''} + process { + //Path to the Guppy GPU and CPU container images. Uncomment and change this as appropriate if providing Guppy as a container image. + //withLabel: guppy_gpu { container = '' } //withLabel: guppy_cpu { container = '' } + } + ``` + +* Provide the link to a Guppy container in the process section and uncomment the two following lines in the params section: + ``` + params { + //Uncomment the two following lines when providing Guppy container images (and comment the two previous lines) + guppy_gpu_folder = "" + guppy_cpu_folder = "" + } + ``` + ``` + process { + //Path to the Guppy GPU and CPU container images. Uncomment and change this as appropriate if providing Guppy as a container image. + withLabel: guppy_gpu { container = '' } + withLabel: guppy_cpu { container = '' } + } ``` An example configuration file can be found in this [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). diff --git a/main.nf b/main.nf index 3d12d89..5bc7cb2 100644 --- a/main.nf +++ b/main.nf @@ -126,12 +126,12 @@ process basecalling { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log - ${params.guppy_gpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_gpu_folder}guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -156,14 +156,14 @@ process basecalling_single_isolate { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config ${params.guppy_config_gpu} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} + ${params.guppy_gpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log cat *.fastq > ${sample}.fastq gzip ${sample}.fastq - ${params.guppy_gpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_gpu_folder}guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -186,12 +186,12 @@ process basecalling_cpu { """ set +eu if [[ "${params.guppy_config_cpu}" != "false" ]] ; then - ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log - ${params.guppy_cpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_cpu_folder}guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -215,14 +215,14 @@ process basecalling_cpu_single_isolate { """ set +eu if [[ "${params.guppy_config_cpu}" != "false" ]] ; then - ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --config ${params.guppy_config_cpu} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} + ${params.guppy_cpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} fi cp .command.log guppy_basecaller.log cat *.fastq > ${sample}.fastq gzip ${sample}.fastq - ${params.guppy_cpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_cpu_folder}guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -274,16 +274,16 @@ process basecalling_demultiplexing_guppy { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]]; then - ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config "${params.guppy_config_gpu}" --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_gpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --config "${params.guppy_config_gpu}" --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - ${params.guppy_gpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_gpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --device ${params.guppy_gpu_device} --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} fi cp .command.log guppy_basecaller.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - ${params.guppy_gpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_gpu_folder}guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -305,16 +305,16 @@ process basecalling_demultiplexing_guppy_cpu { """ set +eu if [[ "${params.guppy_config_gpu}" != "false" ]] ; then - ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --config "${params.guppy_config_cpu}" --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_cpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --config "${params.guppy_config_cpu}" --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} elif [[ "${params.flowcell}" != "false" ]] && [[ "${params.kit}" != "false" ]]; then - ${params.guppy_cpu_folder}/guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} + ${params.guppy_cpu_folder}guppy_basecaller -i ${fast5_dir} -s \$PWD --flowcell ${params.flowcell} --kit ${params.kit} --compress_fastq --num_callers ${params.guppy_num_callers} --cpu_threads_per_caller ${params.guppy_cpu_threads_per_caller} ${params.guppy_basecaller_args} --barcode_kits ${params.guppy_barcode_kits} fi cp .command.log guppy_basecaller.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - ${params.guppy_cpu_folder}/guppy_basecaller --version > guppy_basecaller_version.txt + ${params.guppy_cpu_folder}guppy_basecaller --version > guppy_basecaller_version.txt """ } @@ -336,13 +336,13 @@ process demultiplexing_guppy { script: """ set +eu - ${params.guppy_gpu_folder}/guppy_barcoder -i ${fastq_dir} -s \$PWD --device ${params.guppy_gpu_device} --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} + ${params.guppy_gpu_folder}guppy_barcoder -i ${fastq_dir} -s \$PWD --device ${params.guppy_gpu_device} --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} cp .command.log guppy_barcoder.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - ${params.guppy_gpu_folder}/guppy_barcoder --version > guppy_barcoder_version.txt + ${params.guppy_gpu_folder}guppy_barcoder --version > guppy_barcoder_version.txt """ } @@ -363,13 +363,13 @@ process demultiplexing_guppy_cpu { script: """ set +eu - ${params.guppy_cpu_folder}/guppy_barcoder -i ${fastq_dir} -s \$PWD --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} + ${params.guppy_cpu_folder}guppy_barcoder -i ${fastq_dir} -s \$PWD --compress_fastq ${params.guppy_barcoder_args} --barcode_kits ${params.guppy_barcode_kits} --worker_threads ${params.guppy_barcoder_threads} cp .command.log guppy_barcoder.log for dir in barc*/ uncl*/; do barcode_id=\${dir%*/} cat \${dir}/*.fastq.gz > \${barcode_id}.fastq.gz done - ${params.guppy_cpu_folder}/guppy_barcoder --version > guppy_barcoder_version.txt + ${params.guppy_cpu_folder}guppy_barcoder --version > guppy_barcoder_version.txt """ } diff --git a/nextflow.config b/nextflow.config index 8f1491f..7f7cae1 100644 --- a/nextflow.config +++ b/nextflow.config @@ -22,9 +22,12 @@ params { fastq = false datadir = false demultiplexer = 'guppy' - //Path to the Guppy GPU and CPU binary folder. Change this as appropriate - guppy_gpu_folder= "/scratch/ont-guppy/bin" - guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin" + //Path to the Guppy GPU and CPU binary folder (v3.6.1). Change this as appropriate when providing Guppy as a binary folder and do not forget the "/" at the end of the path + guppy_gpu_folder = "/scratch/ont-guppy/bin/" + guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin/" + //Uncomment the two following lines when providing Guppy container images (and comment the two previous lines) + //guppy_gpu_folder = "" + //guppy_cpu_folder = "" guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" kit = false @@ -89,8 +92,8 @@ dag { // Not generally user-modifiable !!! process { withLabel: big_mem { memory = 32.GB } - //Path to the Guppy GPU and CPU container images. Change this if required - //withLabel: guppy_gpu { container = ''} + //Path to the Guppy GPU and CPU container images (v3.6.1). Uncomment and change this as appropriate if providing Guppy as a container image. + //withLabel: guppy_gpu { container = '' } //withLabel: guppy_cpu { container = '' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } diff --git a/nextflow.config.v0.8 b/nextflow.config.v0.8 index f63d133..60c4edf 100644 --- a/nextflow.config.v0.8 +++ b/nextflow.config.v0.8 @@ -22,9 +22,12 @@ params { fastq = false datadir = false demultiplexer = 'guppy' - //Path to the Guppy GPU and CPU binary folder. Change this as appropriate - guppy_gpu_folder= "/scratch/ont-guppy/bin" - guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin" + //Path to the Guppy GPU and CPU binary folder (v3.4.3). Change this as appropriate when providing Guppy as a binary folder and do not forget the "/" at the end of the path + guppy_gpu_folder = "/scratch/ont-guppy/bin/" + guppy_cpu_folder = "/scratch/ont-guppy-cpu/bin/" + //Uncomment the two following lines when providing Guppy container images (and comment the two previous lines) + //guppy_gpu_folder = "" + //guppy_cpu_folder = "" guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" kit = false @@ -89,8 +92,8 @@ dag { // Not generally user-modifiable !!! process { withLabel: big_mem { memory = 32.GB } - //Path to the Guppy GPU and CPU container images. Change this if required - //withLabel: guppy_gpu { container = ''} + //Path to the Guppy GPU and CPU container images (v3.4.3). Uncomment and change this as appropriate if providing Guppy as a container image. + //withLabel: guppy_gpu { container = '' } //withLabel: guppy_cpu { container = '' } withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } @@ -119,7 +122,7 @@ mounts { } if (params.datadir != false){ datadir = "-B \"`[[ \"${params.datadir}\" =~ ^/ ]] && echo ${params.datadir} || echo ${PWD}/${params.datadir}`\"" - } + } } singularity { From 2739d2e4480b4dbd0f1ce7e8e6745fa769e5a64e Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Fri, 14 May 2021 21:15:35 +1000 Subject: [PATCH 28/46] Correct script and config when using parameter guppy_gpu_folder or guppy_cpu_folder --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2457fc..de7bf24 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ It will create the nextflow main executable file in the current directory. Optio * [Singularity](https://singularity.lbl.gov/install-linux) >= 2.3 (microPIPE has been tested with version 3.4.1, 3.5.0 and 3.6.3) -* Guppy +* Guppy (4.4.1 was the latest working version) Due to the Oxford Nanopore Technologies terms and conditions, we are not allowed to redistribute the Guppy software either in its binary form or packaged form e.g. Docker or Singularity images. Therefore users will have to either install Guppy, provide a container image or start the pipeline from the basecalled fastq files. See [Usage](#usage) section below for instructions. From 4ec4c5ed6f51c2cbba4d3e03f05b65d8f758c6c3 Mon Sep 17 00:00:00 2001 From: thom Date: Tue, 6 Jul 2021 10:33:41 +1000 Subject: [PATCH 29/46] Update nextflow.config --- nextflow.config | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/nextflow.config b/nextflow.config index 7f7cae1..5c1ca6c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -3,14 +3,6 @@ singularity { cacheDir = "/opt/singularity_cache" } -// Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) -// If your job scheduler has different queues/partitions for cpu and gpu, please also set them here -process { - executor = params.executor - withLabel: cpu { queue = 'main' } - withLabel: gpu { queue = 'gpu' } -} - // Default parameters. Commandline parameters will take priority over these params { executor = "local" @@ -69,6 +61,14 @@ params { skip_quast = false } +// Process settings. Set job scheduler if appropriate (SLURM, PBS e.g.) +// If your job scheduler has different queues/partitions for cpu and gpu, please also set them here +process { + executor = params.executor + withLabel: cpu { queue = 'main' } + withLabel: gpu { queue = 'gpu' } +} + // Debug and report options trace { enabled = true From f82541e47e36ed20ba075a2c1f71d814da3b88e2 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Tue, 6 Jul 2021 12:00:09 +1000 Subject: [PATCH 30/46] Update README.md (note about Guppy > v4.5.2) --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index de7bf24..6a5b439 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,12 @@ It will create the nextflow main executable file in the current directory. Optio Due to the Oxford Nanopore Technologies terms and conditions, we are not allowed to redistribute the Guppy software either in its binary form or packaged form e.g. Docker or Singularity images. Therefore users will have to either install Guppy, provide a container image or start the pipeline from the basecalled fastq files. See [Usage](#usage) section below for instructions. +In versions greater than Guppy v4.5.2, the default Guppy parameters have changed. If you wish to use Guppy > v4.5.2, please modify the `nexflow.config` to run Guppy with the "--disable_qscore_filtering" flag: +``` +params { + guppy_basecaller_args = "--recursive --trim_barcodes -q 0 --disable_qscore_filtering" +} +``` **1. Installing microPIPE** microPIPE only requires the `main.nf` and `nexflow.config` files to run. You will also need to provide a samplesheet (explained below). From 549350fcd30dc7c8b8ab56e542f4fb7a00312803 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 8 Jul 2021 09:51:49 +1000 Subject: [PATCH 31/46] Update main.nf pycoqc process pycoQC will run by default when demultiplexer == qcat or guppy --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 5bc7cb2..a3eefba 100644 --- a/main.nf +++ b/main.nf @@ -384,7 +384,7 @@ process pycoqc { path("pycoQC.html") path("pycoqc_version.txt") when: - params.basecalling & !params.skip_pycoqc & params.demultiplexer == "qcat" + params.basecalling & !params.skip_pycoqc script: """ set +eu From 6d8975b4a0447d9f7e78c77f20ba1b2416062109 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 9 Aug 2021 10:01:42 +1000 Subject: [PATCH 32/46] Update link to publication in readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6a5b439..807e32f 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The workflow below summarises the different steps of the pipeline (with each sel Micropipe has been written in Nextflow and uses Singularity containers. It can use both GPU and CPU resources. -For more information please see our preprint here: https://www.biorxiv.org/content/10.1101/2021.02.02.429319v1 +For more information please see our publication here: https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-021-07767-z

Workflow From a37226cdb4f5aa87634d5bb052f6dcacf6f50f0f Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 9 Aug 2021 10:08:04 +1000 Subject: [PATCH 33/46] Update citation in readme --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 807e32f..b1330fd 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The workflow below summarises the different steps of the pipeline (with each sel Micropipe has been written in Nextflow and uses Singularity containers. It can use both GPU and CPU resources. -For more information please see our publication here: https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-021-07767-z +For more information please see our publication here: https://doi.org/10.1186/s12864-021-07767-z.

Workflow @@ -361,6 +361,4 @@ Planned upgrades: If you use microPIPE in your work, please cite: -MicroPIPE: An end-to-end solution for high-quality complete bacterial genome construction -Valentine Murigneux, Leah W. Roberts, Brian M. Forde, Minh-Duy Phan, Nguyen Thi Khanh Nhu, Adam D. Irwin, Patrick N. A. Harris, David L. Paterson, Mark A. Schembri, David M. Whiley, Scott A. Beatson -bioRxiv 2021.02.02.429319; doi: https://doi.org/10.1101/2021.02.02.429319 +MicroPIPE: validating an end-to-end workflow for high-quality complete bacterial genome construction. Murigneux V, Roberts LW, Forde BM, Phan MD, Nhu NTK, Irwin AD, Harris PNA, Paterson DL, Schembri MA, Whiley DM, Beatson SA. BMC Genomics. 2021 Jun 25;22(1):474. doi: [10.1186/s12864-021-07767-z](https://doi.org/10.1186/s12864-021-07767-z). From 91a1a1c11f4d32f04cd124f755126d0a1c9a4bcd Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Tue, 14 Sep 2021 11:47:56 +1000 Subject: [PATCH 34/46] Update nextflow.config --- nextflow.config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index 5c1ca6c..2905857 100644 --- a/nextflow.config +++ b/nextflow.config @@ -28,6 +28,8 @@ params { guppy_num_callers = 8 guppy_cpu_threads_per_caller = 1 guppy_basecaller_args = "--recursive --trim_barcodes -q 0" + //add the --disable_qscore_filtering if using Guppy v4.5.2 to avoid creating pass/fail folders and breaking the pipeline + //guppy_basecaller_args = "--recursive --trim_barcodes -q 0 --disable_qscore_filtering" guppy_barcoder_args = "--recursive --trim_barcodes -q 0" guppy_barcode_kits= "SQK-RBK004" guppy_barcoder_threads = 2 @@ -107,7 +109,7 @@ process { withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } - errorStrategy = 'ignore' + //errorStrategy = 'ignore' } mounts { From 14275ad921358126e2d1903f0fcd5869c85f66ea Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 16 Dec 2021 15:52:28 +1000 Subject: [PATCH 35/46] Update nextflow.config Add profile for Zeus at Pawsey --- nextflow.config | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/nextflow.config b/nextflow.config index 2905857..51481d7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -3,6 +3,49 @@ singularity { cacheDir = "/opt/singularity_cache" } +// profile for running the pipeline on Zeus at the Pawsey Supercomputing Centre +profiles { + zeus { + workDir = "$MYSCRATCH/nxf_work" + process { + cache = 'lenient' + stageInMode = 'symlink' + } + singularity { + enabled = true + // the line below does not work with multi-cluster + // envWhitelist = 'SINGULARITY_BINDPATH, SINGULARITYENV_LD_LIBRARY_PATH' + cacheDir = "$NXF_HOME/singularity" + runOptions = "-B /group,/scratch --nv" + } + process.module = 'singularity' + //params.slurm_account = 'director2172' + process { + executor = 'slurm' + clusterOptions = "--account=${params.slurm_account}" + queue = 'workq' + time = '2h' + memory = '16GB' + withName: 'basecalling|basecalling_single_isolate|basecalling_demultiplexing_guppy' { + time = '24h' + } + withLabel: big_mem { + memory = '32GB' + time = '4h' + } + withName: 'basecalling_cpu|basecalling_cpu_single_isolate|basecalling_demultiplexing_guppy_cpu' { + time = '72h' + queue = 'longq' + } + withLabel: gpu { + executor = 'slurm_topaz' + clusterOptions += " --gpus-per-node=1" + queue = 'gpuq' + } + } + } +} + // Default parameters. Commandline parameters will take priority over these params { executor = "local" From 6190e94688fcde4fc40270aed0d21a303b210f8d Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 17 Jan 2022 17:27:59 +1000 Subject: [PATCH 36/46] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index b1330fd..8a1b2d8 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,10 @@ params { ``` **1. Installing microPIPE** +Download the microPIPE repository using the command: +``` +git clone https://github.com/BeatsonLab-MicrobialGenomics/micropipe.git +``` microPIPE only requires the `main.nf` and `nexflow.config` files to run. You will also need to provide a samplesheet (explained below). # Usage From 9e33da20c497ce52b7e659fcc574b2946082c502 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 20 Jan 2022 13:57:00 +1000 Subject: [PATCH 37/46] Add documentation for running at Pawsey --- pawsey/infrastructure_optimisation_zeus.md | 154 +++ ...li_ST131_pawsey_guppy3.6.1_cpu.report.html | 1028 +++++++++++++++++ ..._ST131_pawsey_guppy3.6.1_cpu.timeline.html | 296 +++++ ...coli_ST131_pawsey_guppy3.6.1_cpu.trace.txt | 99 ++ ...li_ST131_pawsey_guppy3.6.1_gpu.report.html | 1028 +++++++++++++++++ ..._ST131_pawsey_guppy3.6.1_gpu.timeline.html | 296 +++++ ...coli_ST131_pawsey_guppy3.6.1_gpu.trace.txt | 99 ++ pawsey/nextflow.config | 146 +++ pawsey/nextflow_batch_template.sh | 49 + 9 files changed, 3195 insertions(+) create mode 100644 pawsey/infrastructure_optimisation_zeus.md create mode 100644 pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html create mode 100644 pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html create mode 100644 pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt create mode 100644 pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html create mode 100644 pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html create mode 100644 pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt create mode 100644 pawsey/nextflow.config create mode 100644 pawsey/nextflow_batch_template.sh diff --git a/pawsey/infrastructure_optimisation_zeus.md b/pawsey/infrastructure_optimisation_zeus.md new file mode 100644 index 0000000..a5b60f6 --- /dev/null +++ b/pawsey/infrastructure_optimisation_zeus.md @@ -0,0 +1,154 @@ +microPIPE on Zeus/Topaz @ Pawsey +=========== + +--- + +# Accessing tool/workflow + +The workflow can be downloaded from the GitHub page https://github.com/BeatsonLab-MicrobialGenomics/micropipe using the command: +``` +git clone https://github.com/BeatsonLab-MicrobialGenomics/micropipe.git +``` +--- + +# Installation + +* **[Nextflow](https://www.nextflow.io/)** +A modified version of Nextflow, capable of submitting jobs to Zeus, Topaz and Magnus, has been installed as a system module and can be accessed with the command: +``` +module load nextflow/20.07.1-multi +``` +* **[Singularity](https://singularity.lbl.gov/install-linux)** +Singularity has been installed as a system module and can be accessed with the command: +``` +module load singularity/3.6.4 +``` +* **Guppy** (3.6.1 was the latest working version) +Due to the Oxford Nanopore Technologies terms and conditions, we are not allowed to redistribute the Guppy software either in its binary form or packaged form e.g. Docker or Singularity images. Therefore users will have to either install Guppy, provide a container image or start the pipeline from the basecalled fastq files. See [Usage](https://github.com/BeatsonLab-MicrobialGenomics/micropipe#usage) section for instructions. +--- + +# Quickstart tutorial + +A tutorial is available on the GitHub page: https://github.com/BeatsonLab-MicrobialGenomics/micropipe#usage. The steps are summarised below including the specific instructions required to run the pipeline at Pawsey Zeus. + +**1. Prepare the Nextflow configuration file (nextflow.config)** +Use the configuration file to run microPIPE at Pawsey Zeus [here](./nextflow.config). + +**2. Prepare the samplesheet file (csv)** +See instructions at the microPIPE [GitHub page](https://github.com/BeatsonLab-MicrobialGenomics/micropipe#usage), section 2. Prepare the samplesheet file. + +**3. Prepare the slurm script (e.g. nextflow_batch_template.sh)** +The pipeline will be launched using a Slurm script submitted to Zeus. This script will load the required modules, define the input/output directories and files, and include the nextflow command line with optional parameters. Note that the configuration profile definition for the Zeus cluster should be specified when launching the pipeline execution by using the "-profile zeus" command line option, as well as the slurm account allocation by using the "--slurm_account='director2172'" command line option (replace 'director2172' by your account identifier). +``` +#!/bin/bash + +#SBATCH --job-name=micropipe +#SBATCH --nodes=1 +#SBATCH --cpus-per-task=1 +#SBATCH --output=s%A.micropipe_guppy3.6.1_gpu_12samples.out +#SBATCH --error=s%A.micropipe_guppy3.6.1_gpu_12samples.err +#SBATCH --time=24:00:00 + +module load nextflow/20.07.1-multi +module load singularity/3.6.4 + +#directory containing the nextflow.config file and the main.nf script +dir=/scratch/director2172/vmurigneux/micropipe +cd ${dir} +datadir=${dir}/Illumina +out_dir=${dir}/results_3.6.1_gpu + +#Run A, B or C depending on whether you are starting with ONT fast5 (A or B) or fastq files (C or D) + +#A) Workflow including basecalling, demultiplexing and assembly +fast5_dir=${dir}/fast5_pass +csv=${dir}/test_data/samples_all_basecalling.csv +nextflow main.nf --gpu true --basecalling -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} +#nextflow main.nf --gpu false --basecalling --guppy_num_callers 16 -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} + +#B) Workflow including basecalling and assembly (skip demultiplexing step) +#fast5_dir=${dir}/fast5_pass +#csv=${dir}/test_data/samples_1_basecalling_single_isolate.csv +#nextflow main.nf --basecalling --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} -profile zeus --slurm_account='director2172' + +#C) Workflow including demultiplexing and assembly +#fastq_dir=${dir}/fastq +#csv=${dir}/test_data/samples_1_basecalling.csv +#nextflow main.nf --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fastq ${fastq_dir} --datadir ${datadir} -profile zeus --slurm_account='director2172' + +#D) Assembly workflow (skip basecalling and demultiplexing step) +#csv=${dir}/test_data/samples_1.csv +#nextflow main.nf --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir} -profile zeus --slurm_account='director2172' + +#to restart the pipeline if something failed, use the -resume flag after correcting the issue +#nextflow main.nf -resume --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir} -profile zeus --slurm_account='director2172' +``` + +**4. Run the pipeline by submitting a job at Pawsey Zeus** +``` +sbatch nextflow_batch_template.sh +``` +--- + +# Optimisation required + +MicroPIPE was originally developed on a cluster for which the jobs could be submitted to both CPU nodes and a GPU node. At Pawsey, the CPU and GPU nodes are accessed from different clusters ie Zeus (CPU) and Topaz (GPU). Therefore, a modified version of Nextflow, capable of submitting jobs to Zeus, Topaz and Magnus, has been installed as a system module. +* The modified Nextflow module should be loaded prior to running the main nextflow command by using ```module load nextflow/20.07.1-multi```. +* The MicroPIPE pipeline will be launched using a Slurm script submitted to Zeus. +* As a result, Nextflow will automatically submit the GPU tasks to Topaz and the CPU tasks to Zeus. + +Here is a template script to hack Nextflow for multiple clusters (thanks to [@marcodelapierre](https://github.com/marcodelapierre)): +https://github.com/marcodelapierre/toy-gpu-nf/blob/master/extra/install-nextflow-hack-slurm-multi-cluster.sh + + +--- + +# Infrastructure usage and benchmarking + +--- + +## Summary + +## Exemplar 1: Assembly of 12 *E.coli* ST131 samples using GPU and CPU resources +You can collect usage metrics from your Canu run using the NCI Gadi optimised workflow using scripts available on the Sydney Informatics Hub, University of Sydney GitHub repository. +* We used the *E.coli* data from the [microPIPE publication](https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-021-07767-z) available from the NCBI SRA [BioProject PRJNA679678](https://www.ncbi.nlm.nih.gov/bioproject/PRJNA679678/) (Oxford Nanopore) and the [BioProject PRJEB2968](https://www.ncbi.nlm.nih.gov/bioproject/?term=PRJEB2968) (Illumina). + +* See Nextflow configuration file used [here](./nextflow.config) and slurm submission script [here](./nextflow_batch_template.sh). +* See Nextflow [HTML execution report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html), [trace report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt) and [HTML processes execution timeline](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html). + +* The table below summarised the assembly results for each strain. + +|Strain|Chromosome/plasmid|Size (bps)|Circularised?| +|-------|:-----:|:-----:|:-----:| +|S24EC| Chromosome
Plasmid A | 5078304
114708 | Yes
Yes | +|S34EC| Chromosome
Plasmid A
Plasmid B | 5050427
153321
108135 | Yes
Yes
Yes | +|S37EC| Chromosome
Plasmid A
Plasmid B | 4981928
157642
61072 | Yes
Yes
Yes | +|S39EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D
Plasmid E
Plasmid F | 5054402
141007
94979
68049
62085
2070
1846 | Yes
Yes
Yes
Yes
Yes
Yes
Yes | +|S65EC| Chromosome
Plasmid A | 5205011
147412 | Yes
Yes | +|S96EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 5069496
164355
115965
14479
4184 | Yes
Yes
Yes
Yes
Yes | +|S97EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 5178868
166099
96788
4092
3209 | Yes
Yes
Yes
Yes
Yes | +|S112EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 5020013
161028
68847
5338
4136 | Yes
Yes
Yes
Yes
Yes | +|S116EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 4989207
66792
5263
4257
4104 | Yes
Yes
Yes
Yes
Yes | +|S129EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D
Plasmid E
Plasmid F
Plasmid G | 5193964
163681
93505
33344
4087
2401
2121
1571 | Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes | +|EC958| Chromosome
Plasmid A
Plasmid B
Plasmid C | 5126816
136157
4145
1830 | Yes
Yes
Yes
Yes | +|HVM2044| Chromosome
Plasmid A
Plasmid B
Plasmid C | 5003288
142959
18716
18345 | Yes
Yes
Yes
Yes | + + +## Exemplar 2: Assembly of 12 *E.coli* ST131 samples using CPU resources + +* See Nextflow configuration file used [here](./nextflow.config) and slurm submission script [here](./nextflow_batch_template.sh). + +* See Nextflow [HTML execution report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html), [trace report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt) and [HTML processes execution timeline](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html). + +--- + +# Acknowledgements / citations / credits + +- The deployment of the workflow at the Pawsey Supercomputing Centre was supported by the Australian BioCommons via funding from Bioplatforms Australia, the Australian Research Data Commons (https://doi.org/10.47486/PL105) and the Queensland Government RICF programme. Bioplatforms Australia and the Australian Research Data Commons are funded by the National Collaborative Research Infrastructure Strategy (NCRIS). +- Marco de la Pierre (Pawsey Supercomputing Centre) [@marcodelapierre](https://github.com/marcodelapierre) +- Johan Gustafsson (Australian BioCommons) [@supernord](https://github.com/supernord) +``` +Any attribution information that is relevant to the workflow being documented, or the infrastructure being used. +``` + +--- diff --git a/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html new file mode 100644 index 0000000..5e709e6 --- /dev/null +++ b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html @@ -0,0 +1,1028 @@ + + + + + + + + + + + [voluminous_bernard] Nextflow Workflow Report + + + + + +

+ +
+
+ +

Nextflow workflow report

+

[voluminous_bernard] (resumed run)

+ + +
+ Workflow execution completed successfully! +
+ + +
+
Run times
+
+ 06-Aug-2021 07:34:23 - 06-Aug-2021 09:16:40 + (duration: 1h 42m 17s) +
+ +
+
+
  5 succeeded  
+
  93 cached  
+
  0 ignored  
+
  0 failed  
+
+
+ +
Nextflow command
+
nextflow main.nf -resume --gpu false --basecalling --guppy_num_callers 16 -profile zeus --slurm_account=director2172 --demultiplexing --samplesheet /scratch/director2172/vmurigneux/micropipe/test_data/samples_all_basecalling.csv --outdir /scratch/director2172/vmurigneux/micropipe/results_3.6.1_cpu --fast5 /scratch/director2172/vmurigneux/micropipe/fast5_pass --datadir /scratch/director2172/vmurigneux/micropipe/Illumina
+
+ +
+
CPU-Hours
+
1'573.6 (99.5% cached)
+ +
Launch directory
+
/scratch/director2172/vmurigneux/micropipe
+ +
Work directory
+
/scratch/director2172/vmurigneux/nxf_work
+ +
Project directory
+
/scratch/director2172/vmurigneux/micropipe
+ + +
Script name
+
main.nf
+ + + +
Script ID
+
064d528fa3031df0adeea16c3efadcc3
+ + +
Workflow session
+
e755801f-1826-4147-a9c8-7e6092df85cd
+ + + +
Workflow profile
+
zeus
+ + + +
Nextflow version
+
version 20.07.1, build 5413 (28-04-2021 08:55 UTC)
+
+
+
+ +
+

Resource Usage

+

These plots give an overview of the distribution of resource usage for each process.

+ +

CPU

+ +
+
+
+
+
+
+
+ +
+ +

Memory

+ +
+
+
+
+
+
+
+
+
+
+
+ +

Job Duration

+ +
+
+
+
+
+
+
+
+ +

I/O

+ +
+
+
+
+
+
+
+
+
+ +
+
+

Tasks

+

This table shows information about each task in the workflow. Use the search box on the right + to filter rows for specific values. Clicking headers will sort the table by that value and + scrolling side to side will reveal more columns.

+
+ + +
+
+
+
+
+ +
+ (tasks table omitted because the dataset is too big) +
+
+ +
+
+ Generated by Nextflow, version 20.07.1 +
+
+ + + + + diff --git a/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html new file mode 100644 index 0000000..bf8dcdc --- /dev/null +++ b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html @@ -0,0 +1,296 @@ + + + + + + + + + + + + +
+

Processes execution timeline

+

+ Launch time:
+ Elapsed time:
+ Legend: job wall time / memory usage (RAM) +

+
+
+ + + + + + diff --git a/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt new file mode 100644 index 0000000..3f49da9 --- /dev/null +++ b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt @@ -0,0 +1,99 @@ +task_id hash native_id name status exit submit duration realtime %cpu peak_rss peak_vmem rchar wchar +1 c4/cff327 5128765 basecalling_demultiplexing_guppy_cpu (1) CACHED 0 2021-07-27 12:21:53.554 3d 19h 21m 31s 3d 19h 21m 23s 1035.4% 16 GB 96.9 GB 206.6 GB 25.5 GB +3 f8/69b5c9 5132743 assembly:porechop (S24) CACHED 0 2021-07-31 07:43:27.265 34m 55s 34m 22s 328.1% 1.6 GB 2.1 GB 1.3 GB 1.3 GB +2 31/d0f8ef 5132741 pycoqc (1) CACHED 0 2021-07-31 07:43:26.899 1m 20s 50s 95.4% 2.1 GB 2.2 GB 868.5 MB 6.2 MB +4 de/b7f5b6 5132742 assembly:porechop (S34) CACHED 0 2021-07-31 07:43:27.056 50m 30s 49m 57s 317.7% 2.4 GB 2.9 GB 2.6 GB 2.5 GB +5 64/9adb46 5132808 assembly:japsa (S24) CACHED 0 2021-07-31 08:18:22.164 3m 55s 3m 16s 79.9% 583.2 MB 8.8 GB 462.8 MB 448.8 MB +6 3d/b69fbb 5132834 assembly:japsa (S34) CACHED 0 2021-07-31 08:33:57.178 6m 10s 5m 37s 88.2% 583.9 MB 8.8 GB 882.7 MB 873 MB +8 f0/1b86cd 5132841 assembly:flye (S34) CACHED 0 2021-07-31 08:40:07.215 43m 20s 42m 58s 304.9% 8 GB 8.3 GB 25.7 GB 18.7 GB +7 1a/98fba6 5132812 assembly:flye (S24) CACHED 0 2021-07-31 08:22:17.115 19m 18m 22s 294.5% 5.8 GB 6.3 GB 13.3 GB 9.7 GB +9 3d/0680aa 5132887 assembly:racon_cpu (S34) CACHED 0 2021-07-31 09:23:27.509 55m 55s 55m 21s 379.7% 3 GB 3.4 GB 14.1 GB 7.2 GB +10 fe/9f04cb 5132843 assembly:racon_cpu (S24) CACHED 0 2021-07-31 08:41:17.185 23m 45s 23m 3s 370.9% 1.6 GB 2 GB 7.3 GB 3.7 GB +12 51/b36433 5132744 assembly:porechop (S37) CACHED 0 2021-07-31 07:43:27.460 23m 40s 23m 3s 293.9% 1.6 GB 2.1 GB 1.4 GB 1.3 GB +11 d5/d57e72 5132967 assembly:medaka_cpu (S34) CACHED 0 2021-07-31 10:19:22.535 8m 30s 8m 400.6% 5.6 GB 12.5 GB 6.8 GB 4.2 GB +14 cb/1d9be8 5132800 assembly:japsa (S37) CACHED 0 2021-07-31 08:07:07.060 3m 40s 3m 18s 80.0% 582.5 MB 8.8 GB 475.9 MB 462.1 MB +13 22/8a1c61 5132870 assembly:medaka_cpu (S24) CACHED 0 2021-07-31 09:05:02.311 4m 40s 4m 18s 435.2% 5.3 GB 11.9 GB 3.6 GB 2.3 GB +15 e8/c68bcd 5132969 assembly:nextpolish (S34) CACHED 0 2021-07-31 10:27:52.603 9m 5s 8m 30s 330.5% 2.1 GB 58.1 GB 11.9 GB 9 GB +16 f0/008e4a 5132877 assembly:nextpolish (S24) CACHED 0 2021-07-31 09:09:42.376 9m 55s 9m 38s 340.2% 2.5 GB 69.5 GB 13.2 GB 10 GB +18 74/3a63b3 5132746 assembly:porechop (S39) CACHED 0 2021-07-31 07:43:27.812 43m 54s 43m 23s 305.1% 2.4 GB 3 GB 2.6 GB 2.5 GB +19 ca/010364 5132883 assembly:fixstart (S24) CACHED 0 2021-07-31 09:19:37.419 1m 50s 1m 30s 94.4% 205 MB 352.6 MB 257 MB 252.7 MB +20 11/b7aeb6 5132822 assembly:japsa (S39) CACHED 0 2021-07-31 08:27:22.163 6m 25s 5m 47s 85.6% 582.2 MB 8.8 GB 893.5 MB 885.3 MB +21 9f/6bd0ec 5132886 assembly:quast (S24) CACHED 0 2021-07-31 09:21:27.397 39.9s 4.8s 72.3% 85.9 MB 253.4 MB 65.5 MB 9.1 MB +17 8f/b3fad0 5132982 assembly:fixstart (S34) CACHED 0 2021-07-31 10:36:57.590 1m 55s 1m 16s 94.3% 212 MB 355.6 MB 264.3 MB 259.9 MB +22 52/b7e8fb 5132745 assembly:porechop (S65) CACHED 0 2021-07-31 07:43:27.622 26m 54s 26m 19s 286.2% 1.9 GB 2.4 GB 1.8 GB 1.7 GB +24 dc/7fbb3e 5132802 assembly:japsa (S65) CACHED 0 2021-07-31 08:10:22.055 4m 15s 3m 40s 95.5% 583.1 MB 8.8 GB 613.5 MB 602.5 MB +23 d4/68378c 5132986 assembly:quast (S34) CACHED 0 2021-07-31 10:38:52.675 50.2s 7.8s 64.8% 86 MB 253.4 MB 66.1 MB 9.2 MB +25 f9/e9b030 5132747 assembly:porechop (S96) CACHED 0 2021-07-31 07:43:27.995 35m 4s 34m 34s 309.9% 2.2 GB 2.8 GB 2.3 GB 2.2 GB +26 04/979f9e 5132809 assembly:japsa (S96) CACHED 0 2021-07-31 08:18:32.172 5m 55s 5m 31s 80.8% 584 MB 8.8 GB 787.3 MB 773.6 MB +27 55/0bfd77 5132748 assembly:porechop (S97) CACHED 0 2021-07-31 07:43:28.221 56m 54s 56m 21s 319.5% 2.7 GB 3.2 GB 2.9 GB 2.8 GB +28 45/8c42bb 5132842 assembly:japsa (S97) CACHED 0 2021-07-31 08:40:22.274 7m 45s 7m 8s 79.0% 582.5 MB 8.8 GB 1003.5 MB 994.8 MB +29 60/8e6782 5132803 assembly:flye (S37) CACHED 0 2021-07-31 08:10:47.149 25m 55s 25m 18s 307.2% 6.6 GB 7 GB 13.8 GB 10.1 GB +30 6e/d99278 5132749 assembly:porechop (S112) CACHED 0 2021-07-31 07:43:28.360 37m 34s 36m 57s 318.0% 1.8 GB 2.4 GB 1.8 GB 1.7 GB +31 78/ae522e 5132839 assembly:racon_cpu (S37) CACHED 0 2021-07-31 08:36:42.243 24m 40s 24m 23s 371.7% 2 GB 2.2 GB 7.5 GB 3.8 GB +32 a0/e08498 5132810 assembly:japsa (S112) CACHED 0 2021-07-31 08:21:02.406 4m 3m 34s 94.9% 582.8 MB 8.8 GB 603.3 MB 592.6 MB +33 cb/64b53a 5132864 assembly:medaka_cpu (S37) CACHED 0 2021-07-31 09:01:22.346 6m 5s 5m 35s 408.9% 5.4 GB 11.9 GB 3.7 GB 2.3 GB +34 00/3796d1 5132833 assembly:flye (S39) CACHED 0 2021-07-31 08:33:47.131 55m 54m 18s 273.3% 7.8 GB 8.3 GB 33.2 GB 23.5 GB +35 6f/6ea330 5132875 assembly:nextpolish (S37) CACHED 0 2021-07-31 09:07:27.339 9m 30s 9m 1s 339.7% 1.8 GB 56.7 GB 12 GB 9 GB +36 2b/59ed1f 5132900 assembly:racon_cpu (S39) CACHED 0 2021-07-31 09:28:47.505 57m 30s 56m 45s 379.3% 2.9 GB 3.2 GB 14.3 GB 7.4 GB +38 83/8233f4 5132750 assembly:porechop (S116) CACHED 0 2021-07-31 07:43:28.544 27m 38s 27m 5s 267.9% 2.2 GB 2.7 GB 2.2 GB 2.2 GB +37 46/bce82b 5132881 assembly:fixstart (S37) CACHED 0 2021-07-31 09:16:57.330 2m 1m 24s 94.4% 205.9 MB 352.4 MB 258.4 MB 254 MB +39 da/afde90 5132968 assembly:medaka_cpu (S39) CACHED 0 2021-07-31 10:26:17.551 7m 25s 6m 47s 421.6% 5.7 GB 12.4 GB 6.9 GB 4.3 GB +40 9b/02a72d 5132804 assembly:japsa (S116) CACHED 0 2021-07-31 08:11:07.148 5m 35s 5m 14s 81.7% 580.8 MB 8.8 GB 767.1 MB 758.4 MB +41 3a/227bae 5132975 assembly:nextpolish (S39) CACHED 0 2021-07-31 10:33:43.048 9m 25s 9m 8s 338.9% 2 GB 56.5 GB 12.1 GB 9 GB +42 5e/c02bea 5132988 assembly:fixstart (S39) CACHED 0 2021-07-31 10:43:07.656 1m 50s 1m 22s 94.5% 214.4 MB 358.7 MB 273 MB 268.7 MB +43 0b/f5b673 5132751 assembly:porechop (S129) CACHED 0 2021-07-31 07:43:28.749 20m 13s 19m 9s 284.8% 1.5 GB 2 GB 1.2 GB 1.2 GB +44 7a/b396aa 5132794 assembly:japsa (S129) CACHED 0 2021-07-31 08:03:42.293 3m 20s 2m 59s 78.7% 582.4 MB 8.8 GB 427.4 MB 415.5 MB +45 e8/ef1463 5132882 assembly:quast (S37) CACHED 0 2021-07-31 09:18:57.361 34.9s 4.1s 76.3% 74.9 MB 243.9 MB 65.8 MB 9.1 MB +46 c6/a3eeda 5132752 assembly:porechop (EC958) CACHED 0 2021-07-31 07:43:28.901 1h 17m 18s 1h 16m 19s 310.6% 3.9 GB 4.4 GB 4.6 GB 4.5 GB +48 cd/a76f82 5132863 assembly:japsa (EC958) CACHED 0 2021-07-31 09:00:47.268 11m 5s 10m 21s 85.5% 581.2 MB 8.8 GB 1.5 GB 1.5 GB +47 45/c66c08 5132991 assembly:quast (S39) CACHED 0 2021-07-31 10:44:57.661 39.9s 4s 68.5% 77.2 MB 243.9 MB 66.8 MB 9.3 MB +49 2b/52626c 5132753 assembly:porechop (HVM2044) CACHED 0 2021-07-31 07:43:29.084 26m 43s 25m 48s 295.5% 2.1 GB 2.6 GB 2 GB 2 GB +50 cd/79519d 5132801 assembly:japsa (HVM2044) CACHED 0 2021-07-31 08:10:12.143 5m 5s 4m 43s 82.5% 583.1 MB 8.8 GB 702.7 MB 688.9 MB +52 ef/e59015 5132816 assembly:flye (S96) CACHED 0 2021-07-31 08:24:27.151 26m 55s 26m 30s 303.4% 6.8 GB 7.2 GB 22.9 GB 16.7 GB +53 5e/4a8dd8 5132849 assembly:racon_cpu (S96) CACHED 0 2021-07-31 08:51:22.552 47m 55s 47m 22s 378.8% 2.5 GB 2.7 GB 12.5 GB 6.4 GB +54 53/7fa1c5 5132933 assembly:medaka_cpu (S96) CACHED 0 2021-07-31 09:39:17.503 7m 25s 6m 45s 386.9% 5.6 GB 12.2 GB 6 GB 3.8 GB +51 25/b3c79c 5132805 assembly:flye (S65) CACHED 0 2021-07-31 08:14:37.086 31m 25s 31m 1s 295.5% 6.1 GB 6.4 GB 17.8 GB 13 GB +55 e7/1b29a7 5132941 assembly:nextpolish (S96) CACHED 0 2021-07-31 09:46:42.570 8m 55s 8m 35s 335.6% 2 GB 58 GB 11.7 GB 8.7 GB +56 a3/23fb13 5132844 assembly:racon_cpu (S65) CACHED 0 2021-07-31 08:46:02.219 34m 10s 33m 46s 377.2% 2.3 GB 2.6 GB 9.7 GB 5 GB +57 20/95209a 5132947 assembly:fixstart (S96) CACHED 0 2021-07-31 09:55:37.420 1m 45s 1m 19s 94.5% 210.7 MB 356.9 MB 266.8 MB 262.5 MB +59 12/20eb5a 5132948 assembly:quast (S96) CACHED 0 2021-07-31 09:57:22.535 39.9s 3.8s 73.7% 75.4 MB 243.9 MB 66.8 MB 9.3 MB +58 10/804f8e 5132884 assembly:medaka_cpu (S65) CACHED 0 2021-07-31 09:20:12.331 5m 20s 5m 9s 438.5% 5.5 GB 12.3 GB 4.8 GB 3 GB +60 89/a4892e 5132890 assembly:nextpolish (S65) CACHED 0 2021-07-31 09:25:32.360 9m 25s 8m 57s 337.3% 2.1 GB 47.3 GB 12.4 GB 9.3 GB +61 d2/d29b5a 5132918 assembly:fixstart (S65) CACHED 0 2021-07-31 09:34:57.395 1m 50s 1m 14s 94.4% 205.4 MB 357.1 MB 264.1 MB 260 MB +62 48/cca92f 5132927 assembly:quast (S65) CACHED 0 2021-07-31 09:36:47.377 49.9s 4.5s 76.6% 86.5 MB 254 MB 66.3 MB 9.2 MB +63 d4/eebf15 5132846 assembly:flye (S97) CACHED 0 2021-07-31 08:48:07.318 47m 20s 46m 56s 304.6% 8.6 GB 9 GB 29.3 GB 21.3 GB +64 8b/193e17 5132920 assembly:racon_cpu (S97) CACHED 0 2021-07-31 09:35:27.488 1h 5m 55s 1h 5m 26s 379.8% 3.6 GB 3.8 GB 16 GB 8.2 GB +65 05/e59b01 5132987 assembly:medaka_cpu (S97) CACHED 0 2021-07-31 10:41:22.601 9m 5s 8m 32s 398.2% 5.9 GB 12.5 GB 7.7 GB 4.8 GB +66 9a/32a845 5132997 assembly:nextpolish (S97) CACHED 0 2021-07-31 10:50:27.697 9m 8m 31s 319.8% 2.1 GB 57.9 GB 10.9 GB 8.1 GB +67 a2/bec7fb 5133002 assembly:fixstart (S97) CACHED 0 2021-07-31 10:59:27.804 1m 55s 1m 24s 94.3% 213.4 MB 359.2 MB 269.6 MB 265.4 MB +68 3e/21ff7c 5132817 assembly:flye (S112) CACHED 0 2021-07-31 08:25:02.133 32m 20s 31m 52s 305.8% 5.9 GB 6.3 GB 17.7 GB 12.9 GB +69 92/c2ee04 5132856 assembly:racon_cpu (S112) CACHED 0 2021-07-31 08:57:22.296 33m 20s 32m 42s 376.5% 2.3 GB 2.6 GB 9.6 GB 4.9 GB +70 ae/c0007e 5132908 assembly:medaka_cpu (S112) CACHED 0 2021-07-31 09:30:42.425 5m 20s 5m 10s 440.9% 5.5 GB 12.2 GB 4.8 GB 2.9 GB +71 dc/945001 5132925 assembly:nextpolish (S112) CACHED 0 2021-07-31 09:36:02.500 8m 45s 8m 18s 335.1% 2 GB 47.5 GB 11.3 GB 8.4 GB +72 4d/06193a 5133004 assembly:quast (S97) CACHED 0 2021-07-31 11:01:22.704 40s 4.1s 67.0% 88.8 MB 255.3 MB 67.1 MB 9.3 MB +73 3f/a85814 5132939 assembly:fixstart (S112) CACHED 0 2021-07-31 09:44:47.429 2m 10s 1m 25s 93.8% 205.4 MB 354.2 MB 261.8 MB 257.5 MB +74 df/2546d0 5132942 assembly:quast (S112) CACHED 0 2021-07-31 09:46:57.494 39.9s 4.3s 79.7% 75.4 MB 243.9 MB 66.3 MB 9.1 MB +75 67/a0296d 5132807 assembly:flye (S116) CACHED 0 2021-07-31 08:16:42.108 38m 50s 38m 30s 299.2% 6.8 GB 7.1 GB 22.4 GB 16.3 GB +76 7d/4e31b5 5132854 assembly:racon_cpu (S116) CACHED 0 2021-07-31 08:55:32.346 33m 32m 40s 378.4% 2.8 GB 3.1 GB 12.3 GB 6.3 GB +77 98/70c224 5132898 assembly:medaka_cpu (S116) CACHED 0 2021-07-31 09:28:32.379 6m 20s 5m 58s 423.1% 5.7 GB 12.3 GB 6 GB 3.7 GB +78 67/e7265d 5132917 assembly:nextpolish (S116) CACHED 0 2021-07-31 09:34:52.554 8m 45s 8m 9s 339.4% 2 GB 46.9 GB 11.1 GB 8.3 GB +79 79/acc4de 5132938 assembly:fixstart (S116) CACHED 0 2021-07-31 09:43:37.464 1m 45s 1m 26s 94.1% 199.7 MB 349.3 MB 253 MB 248.6 MB +80 50/33aeb1 5132799 assembly:flye (S129) CACHED 0 2021-07-31 08:07:02.061 23m 40s 23m 17s 307.0% 5.4 GB 5.7 GB 12.7 GB 9.2 GB +81 3e/638ff9 5132827 assembly:racon_cpu (S129) CACHED 0 2021-07-31 08:30:42.167 20m 35s 20m 20s 369.1% 1.8 GB 2.2 GB 6.8 GB 3.5 GB +82 53/0ddc70 5132848 assembly:medaka_cpu (S129) CACHED 0 2021-07-31 08:51:17.281 6m 25s 5m 47s 398.3% 5.4 GB 12.2 GB 3.4 GB 2.1 GB +83 b0/1bce85 5132859 assembly:nextpolish (S129) CACHED 0 2021-07-31 08:57:42.372 10m 15s 9m 55s 338.3% 2.3 GB 57.6 GB 14.3 GB 10.7 GB +84 f7/1ed36b 5132876 assembly:fixstart (S129) CACHED 0 2021-07-31 09:07:57.886 2m 4s 1m 26s 93.6% 215.5 MB 360.6 MB 270.8 MB 266.6 MB +85 21/b34d25 5132940 assembly:quast (S116) CACHED 0 2021-07-31 09:45:22.404 44.9s 5.2s 78.6% 88.2 MB 254.9 MB 65.6 MB 9 MB +86 a3/e760f2 5132878 assembly:quast (S129) CACHED 0 2021-07-31 09:10:02.405 29.8s 5s 64.4% 75.8 MB 243.9 MB 67.3 MB 9.4 MB +87 d1/08b581 5132879 assembly:flye (EC958) CACHED 0 2021-07-31 09:11:52.352 55m 45s 55m 11s 302.5% 11 GB 11.3 GB 46.1 GB 33.5 GB +89 69/eba414 5132806 assembly:flye (HVM2044) CACHED 0 2021-07-31 08:15:17.118 34m 15s 33m 36s 303.6% 6.7 GB 7 GB 20.4 GB 14.9 GB +90 46/c4ca50 5132847 assembly:racon_cpu (HVM2044) CACHED 0 2021-07-31 08:49:32.215 41m 40s 41m 11s 378.9% 2.8 GB 3.2 GB 11.1 GB 5.7 GB +91 b8/68ae83 5132910 assembly:medaka_cpu (HVM2044) CACHED 0 2021-07-31 09:31:12.394 7m 40s 7m 28s 399.4% 5.6 GB 12.2 GB 5.4 GB 3.4 GB +92 cf/8ca4a3 5132932 assembly:nextpolish (HVM2044) CACHED 0 2021-07-31 09:38:52.405 10m 30s 9m 49s 342.7% 3.6 GB 71 GB 16 GB 9.5 GB +93 fd/e7a641 5132943 assembly:fixstart (HVM2044) CACHED 0 2021-07-31 09:49:22.429 2m 5s 1m 25s 93.5% 205.4 MB 355.2 MB 262.6 MB 258.2 MB +94 a4/bb705d 5132944 assembly:quast (HVM2044) CACHED 0 2021-07-31 09:51:27.467 39.9s 5.9s 78.7% 85.9 MB 253.4 MB 66.8 MB 9.2 MB +88 95/be4965 5141203 assembly:racon_cpu (EC958) COMPLETED 0 2021-08-06 07:35:05.128 1h 21m 30s 1h 20m 56s 382.7% 4.9 GB 5.1 GB 25.3 GB 13 GB +95 b0/61dec8 5141208 assembly:medaka_cpu (EC958) COMPLETED 0 2021-08-06 08:56:35.139 8m 30s 8m 18s 469.6% 6.2 GB 12.9 GB 11.8 GB 7.4 GB +96 bb/a737e7 5141211 assembly:nextpolish (EC958) COMPLETED 0 2021-08-06 09:05:05.112 10m 30s 10m 20s 353.5% 3.6 GB 70 GB 16.2 GB 12.4 GB +97 c1/a832e2 5141213 assembly:fixstart (EC958) COMPLETED 0 2021-08-06 09:15:35.087 50s 40s 93.9% 208.7 MB 354.7 MB 261.3 MB 257.1 MB +98 0a/3c096e 5141214 assembly:quast (EC958) COMPLETED 0 2021-08-06 09:16:25.102 14.9s 3.7s 65.8% 88.8 MB 255 MB 66.4 MB 9.2 MB diff --git a/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html new file mode 100644 index 0000000..eb6fd6e --- /dev/null +++ b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html @@ -0,0 +1,1028 @@ + + + + + + + + + + + [confident_shirley] Nextflow Workflow Report + + + + + + + +
+
+ +

Nextflow workflow report

+

[confident_shirley]

+ + +
+ Workflow execution completed successfully! +
+ + +
+
Run times
+
+ 22-Jul-2021 15:03:21 - 23-Jul-2021 06:45:02 + (duration: 15h 41m 41s) +
+ +
+
+
  98 succeeded  
+
  0 cached  
+
  0 ignored  
+
  0 failed  
+
+
+ +
Nextflow command
+
nextflow main.nf --gpu true --basecalling -profile zeus --slurm_account=director2172 --demultiplexing --samplesheet /scratch/director2172/vmurigneux/micropipe/test_data/samples_all_basecalling.csv --outdir /scratch/director2172/vmurigneux/micropipe/results_3.6.1_gpu --fast5 /scratch/director2172/vmurigneux/micropipe/fast5_pass --datadir /scratch/director2172/vmurigneux/micropipe/Illumina
+
+ +
+
CPU-Hours
+
196.1
+ +
Launch directory
+
/scratch/director2172/vmurigneux/micropipe
+ +
Work directory
+
/scratch/director2172/vmurigneux/nxf_work
+ +
Project directory
+
/scratch/director2172/vmurigneux/micropipe
+ + +
Script name
+
main.nf
+ + + +
Script ID
+
064d528fa3031df0adeea16c3efadcc3
+ + +
Workflow session
+
c4ed4bb5-7038-43b6-ace3-5a99212ec81f
+ + + +
Workflow profile
+
zeus
+ + + +
Nextflow version
+
version 20.07.1, build 5413 (28-04-2021 08:55 UTC)
+
+
+
+ +
+

Resource Usage

+

These plots give an overview of the distribution of resource usage for each process.

+ +

CPU

+ +
+
+
+
+
+
+
+ +
+ +

Memory

+ +
+
+
+
+
+
+
+
+
+
+
+ +

Job Duration

+ +
+
+
+
+
+
+
+
+ +

I/O

+ +
+
+
+
+
+
+
+
+
+ +
+
+

Tasks

+

This table shows information about each task in the workflow. Use the search box on the right + to filter rows for specific values. Clicking headers will sort the table by that value and + scrolling side to side will reveal more columns.

+
+ + +
+
+
+
+
+ +
+ (tasks table omitted because the dataset is too big) +
+
+ +
+
+ Generated by Nextflow, version 20.07.1 +
+
+ + + + + diff --git a/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html new file mode 100644 index 0000000..32fddc3 --- /dev/null +++ b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html @@ -0,0 +1,296 @@ + + + + + + + + + + + + +
+

Processes execution timeline

+

+ Launch time:
+ Elapsed time:
+ Legend: job wall time / memory usage (RAM) +

+
+
+ + + + + + diff --git a/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt new file mode 100644 index 0000000..8a8c8cd --- /dev/null +++ b/pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt @@ -0,0 +1,99 @@ +task_id hash native_id name status exit submit duration realtime %cpu peak_rss peak_vmem rchar wchar +1 1a/8164e8 164643 basecalling_demultiplexing_guppy (1) COMPLETED 0 2021-07-22 15:03:23.525 10h 17m 17s 10h 17m 13s 117.6% 2 GB 19.1 GB 206.3 GB 24.7 GB +2 39/46f733 5124085 pycoqc (1) COMPLETED 0 2021-07-23 01:20:41.133 1m 8s 48s 95.1% 2.1 GB 2.2 GB 868.3 MB 6.2 MB +5 7e/e9ba7b 5124088 assembly:porechop (S37) COMPLETED 0 2021-07-23 01:20:41.656 26m 48s 26m 29s 300.3% 1.7 GB 2.2 GB 1.5 GB 1.4 GB +8 fb/943eb7 5124091 assembly:porechop (S65) COMPLETED 0 2021-07-23 01:20:42.426 28m 47s 28m 20s 311.8% 2 GB 2.5 GB 2 GB 1.9 GB +15 cb/7cc851 5124115 assembly:japsa (S37) COMPLETED 0 2021-07-23 01:47:29.753 5m 30s 4m 46s 59.7% 581.9 MB 8.8 GB 510 MB 495.7 MB +16 40/c65d2d 5124118 assembly:japsa (S65) COMPLETED 0 2021-07-23 01:49:29.824 6m 25s 5m 41s 65.9% 580.5 MB 8.8 GB 666.6 MB 654.9 MB +6 9d/1307af 5124089 assembly:porechop (S39) COMPLETED 0 2021-07-23 01:20:41.949 39m 42s 39m 23s 302.2% 2.6 GB 3.2 GB 2.9 GB 2.8 GB +4 5f/f8d92b 5124087 assembly:porechop (S24) COMPLETED 0 2021-07-23 01:20:41.431 41m 8s 40m 49s 335.2% 1.7 GB 2.2 GB 1.5 GB 1.4 GB +12 2b/387112 5124094 assembly:porechop (S129) COMPLETED 0 2021-07-23 01:20:42.921 43m 36s 23m 45s 314.4% 1.6 GB 2.1 GB 1.4 GB 1.4 GB +20 27/44dc1d 5124130 assembly:japsa (S24) COMPLETED 0 2021-07-23 02:01:49.421 5m 5s 4m 41s 59.6% 579.7 MB 8.8 GB 499.8 MB 485.3 MB +7 78/ace859 5124090 assembly:porechop (S96) COMPLETED 0 2021-07-23 01:20:42.122 46m 37s 46m 22s 327.2% 2.4 GB 3 GB 2.5 GB 2.5 GB +21 04/7dc8bf 5124141 assembly:japsa (S129) COMPLETED 0 2021-07-23 02:04:19.390 5m 4m 45s 58.2% 582.9 MB 8.8 GB 490 MB 478 MB +19 0b/78832d 5124126 assembly:japsa (S39) COMPLETED 0 2021-07-23 02:00:24.399 9m 5s 8m 50s 61.8% 582.3 MB 8.8 GB 969 MB 960 MB +23 db/9bcd84 5124162 assembly:japsa (S96) COMPLETED 0 2021-07-23 02:07:19.347 5m 35s 5m 9s 92.4% 582.3 MB 8.8 GB 865.7 MB 851.1 MB +9 8e/f3fd6e 5124092 assembly:porechop (S97) COMPLETED 0 2021-07-23 01:20:42.597 1h 12s 59m 19s 320.8% 2.9 GB 3.4 GB 3.2 GB 3.1 GB +10 a7/d41558 5124093 assembly:porechop (S112) COMPLETED 0 2021-07-23 01:20:42.759 1h 32s 40m 40s 335.1% 2 GB 2.5 GB 2 GB 1.9 GB +3 65/6d678d 5124086 assembly:porechop (S34) COMPLETED 0 2021-07-23 01:20:41.194 1h 6m 18s 1h 6m 1s 338.0% 2.6 GB 3.1 GB 2.8 GB 2.7 GB +28 1a/13cd76 5124191 assembly:japsa (S112) COMPLETED 0 2021-07-23 02:21:14.486 6m 20s 5m 52s 64.7% 580.8 MB 8.8 GB 677.5 MB 666.2 MB +17 0a/f85cac 5124121 assembly:flye (S37) COMPLETED 0 2021-07-23 01:52:59.692 37m 27m 54s 301.6% 6.9 GB 7.2 GB 14.6 GB 10.6 GB +27 c2/ff2f50 5124190 assembly:japsa (S97) COMPLETED 0 2021-07-23 02:20:54.420 9m 55s 9m 37s 63.4% 581 MB 8.8 GB 1.1 GB 1 GB +18 8b/f23996 5124122 assembly:flye (S65) COMPLETED 0 2021-07-23 01:55:54.380 36m 27m 28s 294.7% 6.5 GB 6.8 GB 19.1 GB 13.8 GB +14 7b/03a3a1 5124097 assembly:porechop (HVM2044) COMPLETED 0 2021-07-23 01:20:43.578 1h 12m 6s 32m 17s 301.1% 2.3 GB 2.8 GB 2.3 GB 2.2 GB +29 66/eb3391 5124201 assembly:japsa (S34) COMPLETED 0 2021-07-23 02:26:59.414 6m 20s 5m 38s 92.7% 580.9 MB 8.8 GB 946.4 MB 936.1 MB +11 6e/1d6b75 5124096 assembly:porechop (S116) COMPLETED 0 2021-07-23 01:20:43.405 1h 13m 46s 44m 22s 329.2% 2.4 GB 2.9 GB 2.5 GB 2.4 GB +22 f1/d5bacf 5124159 assembly:flye (S24) COMPLETED 0 2021-07-23 02:06:54.579 30m 55s 30m 11s 197.8% 5.5 GB 6 GB 14.2 GB 10.3 GB +24 6f/110129 5124171 assembly:flye (S129) COMPLETED 0 2021-07-23 02:09:19.569 29m 20s 21m 59s 287.9% 5.6 GB 6 GB 14.4 GB 10.4 GB +34 e7/e27738 5124214 assembly:japsa (HVM2044) COMPLETED 0 2021-07-23 02:32:49.432 7m 5s 6m 41s 66.5% 581 MB 8.8 GB 788.2 MB 773.8 MB +36 c9/d09ba8 5124218 assembly:japsa (S116) COMPLETED 0 2021-07-23 02:34:29.732 8m 5s 7m 22s 65.6% 585.6 MB 8.8 GB 856 MB 846.7 MB +31 e9/3d12c5 5124209 assembly:racon_cpu (S37) COMPLETED 0 2021-07-23 02:29:59.503 17m 35s 16m 55s 367.2% 1.9 GB 2.3 GB 8 GB 4 GB +26 8f/39acfb 5124183 assembly:flye (S96) COMPLETED 0 2021-07-23 02:12:54.393 40m 10s 31m 54s 306.2% 7.4 GB 7.9 GB 24.8 GB 17.9 GB +41 5a/1cace9 5124227 assembly:medaka_cpu (S37) COMPLETED 0 2021-07-23 02:47:34.476 5m 35s 4m 58s 378.5% 5.3 GB 11.9 GB 3.7 GB 2.3 GB +30 41/ab170d 5124203 assembly:flye (S112) COMPLETED 0 2021-07-23 02:27:34.396 27m 45s 27m 12s 304.5% 6.2 GB 6.6 GB 19.6 GB 14.2 GB +33 02/5078ed 5124213 assembly:racon_cpu (S65) COMPLETED 0 2021-07-23 02:31:54.482 23m 25s 23m 11s 373.9% 2.2 GB 2.5 GB 10.5 GB 5.3 GB +38 35/ea2f71 5124222 assembly:racon_cpu (S129) COMPLETED 0 2021-07-23 02:38:39.465 16m 40s 16m 11s 361.7% 1.9 GB 2.1 GB 7.7 GB 3.9 GB +37 28/1a3211 5124221 assembly:racon_cpu (S24) COMPLETED 0 2021-07-23 02:37:49.527 18m 55s 18m 35s 368.4% 1.6 GB 1.9 GB 7.8 GB 3.9 GB +46 61/40b83a 5124237 assembly:medaka_cpu (S129) COMPLETED 0 2021-07-23 02:55:20.052 4m 29s 4m 7s 432.6% 5.2 GB 11.8 GB 3.6 GB 2.3 GB +45 e2/bde6cf 5124236 assembly:medaka_cpu (S65) COMPLETED 0 2021-07-23 02:55:19.872 5m 45s 5m 25s 375.5% 5.3 GB 12.3 GB 4.8 GB 3 GB +43 5a/678454 5124234 assembly:nextpolish (S37) COMPLETED 0 2021-07-23 02:53:09.472 8m 7m 30s 319.8% 1.9 GB 55.1 GB 12 GB 9 GB +47 ff/ae0867 5124238 assembly:medaka_cpu (S24) COMPLETED 0 2021-07-23 02:56:44.500 4m 25s 4m 2s 442.2% 5.4 GB 11.7 GB 3.6 GB 2.3 GB +13 ae/07abb0 5124095 assembly:porechop (EC958) COMPLETED 0 2021-07-23 01:20:43.100 1h 41m 56s 1h 14m 55s 300.9% 4.2 GB 4.7 GB 5 GB 4.8 GB +50 d3/e11f66 5124243 assembly:fixstart (S37) COMPLETED 0 2021-07-23 03:01:09.478 2m 5s 1m 26s 92.6% 201.3 MB 352.6 MB 258.4 MB 254 MB +53 6b/8e770d 5124247 assembly:quast (S37) COMPLETED 0 2021-07-23 03:03:15.131 34.3s 5s 66.1% 75 MB 243.9 MB 65.9 MB 9.1 MB +25 9a/1d1fee 5124173 assembly:flye (S39) COMPLETED 0 2021-07-23 02:09:29.341 56m 50s 49m 43s 279.1% 7.4 GB 7.7 GB 34.9 GB 24.6 GB +51 75/bfd4ed 5124244 assembly:nextpolish (S24) COMPLETED 0 2021-07-23 03:01:09.547 7m 45s 7m 15s 337.1% 1.8 GB 55.7 GB 13.2 GB 10 GB +49 c1/4f41f5 5124242 assembly:nextpolish (S65) COMPLETED 0 2021-07-23 03:01:04.541 7m 55s 7m 15s 332.2% 2 GB 57.7 GB 12.3 GB 9.3 GB +48 d1/aa7543 5124241 assembly:nextpolish (S129) COMPLETED 0 2021-07-23 02:59:49.550 9m 30s 9m 7s 341.0% 2.3 GB 57.9 GB 14.3 GB 10.7 GB +55 f7/be961c 5124252 assembly:fixstart (S24) COMPLETED 0 2021-07-23 03:08:54.600 1m 30s 1m 9s 94.3% 204.2 MB 352.6 MB 257 MB 252.7 MB +56 2e/fd8c61 5124253 assembly:fixstart (S65) COMPLETED 0 2021-07-23 03:08:59.489 1m 45s 1m 20s 93.9% 210.3 MB 357.1 MB 264.2 MB 260 MB +58 1d/02fc54 5124255 assembly:quast (S24) COMPLETED 0 2021-07-23 03:10:24.558 24.9s 4.8s 80.8% 86 MB 253.4 MB 65.4 MB 9.1 MB +57 54/dac8e6 5124254 assembly:fixstart (S129) COMPLETED 0 2021-07-23 03:09:19.507 1m 45s 1m 18s 95.0% 212.9 MB 360.4 MB 271 MB 266.9 MB +39 49/c9e93d 5124223 assembly:flye (HVM2044) COMPLETED 0 2021-07-23 02:39:54.420 31m 25s 31m 9s 307.0% 6.8 GB 7.1 GB 22.6 GB 16.4 GB +59 c0/1765c1 5124256 assembly:quast (S65) COMPLETED 0 2021-07-23 03:10:44.538 37.3s 7.1s 72.0% 86.7 MB 254 MB 66.3 MB 9.2 MB +60 8d/2b9319 5124257 assembly:quast (S129) COMPLETED 0 2021-07-23 03:11:04.527 45s 4.9s 77.5% 89.1 MB 255.3 MB 67.3 MB 9.4 MB +52 81/7c601e 5124246 assembly:japsa (EC958) COMPLETED 0 2021-07-23 03:02:39.562 10m 35s 9m 56s 95.9% 583 MB 8.7 GB 1.6 GB 1.6 GB +35 bd/63f521 5124215 assembly:flye (S34) COMPLETED 0 2021-07-23 02:33:19.448 41m 20s 40m 58s 285.1% 7.1 GB 7.5 GB 27.1 GB 19.7 GB +40 8d/313624 5124224 assembly:flye (S116) COMPLETED 0 2021-07-23 02:42:34.429 34m 50s 34m 17s 293.6% 8.2 GB 8.6 GB 24.7 GB 17.9 GB +44 b6/1ebf5d 5124235 assembly:racon_cpu (S112) COMPLETED 0 2021-07-23 02:55:19.739 24m 30s 24m 7s 373.4% 2.1 GB 2.5 GB 10.7 GB 5.4 GB +32 29/64088e 5124210 assembly:flye (S97) COMPLETED 0 2021-07-23 02:30:49.421 54m 10s 53m 43s 298.2% 8.2 GB 8.7 GB 31.1 GB 22.5 GB +65 7b/978783 5124265 assembly:medaka_cpu (S112) COMPLETED 0 2021-07-23 03:19:50.014 6m 25s 6m 390.3% 5.3 GB 11.8 GB 4.9 GB 3.1 GB +42 2c/b8272a 5124233 assembly:racon_cpu (S96) COMPLETED 0 2021-07-23 02:53:04.570 33m 15s 32m 37s 375.8% 2.7 GB 2.9 GB 13.6 GB 6.9 GB +67 51/9a4149 5124271 assembly:nextpolish (S112) COMPLETED 0 2021-07-23 03:26:14.600 6m 45s 6m 18s 334.9% 1.9 GB 56.5 GB 11.1 GB 8.4 GB +68 6c/2dca1f 5124272 assembly:medaka_cpu (S96) COMPLETED 0 2021-07-23 03:26:19.719 7m 6m 34s 394.6% 5.5 GB 12.4 GB 6.1 GB 3.9 GB +69 6e/6d1e31 5124276 assembly:fixstart (S112) COMPLETED 0 2021-07-23 03:32:59.746 1m 30s 1m 4s 95.1% 201.2 MB 353.5 MB 260.2 MB 255.9 MB +71 0d/c06f26 5124278 assembly:quast (S112) COMPLETED 0 2021-07-23 03:34:29.665 29.9s 4.7s 76.6% 86.3 MB 254.9 MB 66.3 MB 9.1 MB +70 7c/b422b2 5124277 assembly:nextpolish (S96) COMPLETED 0 2021-07-23 03:33:19.640 6m 50s 6m 17s 335.6% 2.1 GB 57.6 GB 11.6 GB 8.7 GB +72 15/d27de4 5124280 assembly:fixstart (S96) COMPLETED 0 2021-07-23 03:40:09.657 1m 40s 1m 23s 94.1% 205.4 MB 357.2 MB 266.7 MB 262.4 MB +73 7e/0ea7ba 5124281 assembly:quast (S96) COMPLETED 0 2021-07-23 03:41:49.672 44.9s 5.2s 75.5% 86.7 MB 255 MB 66.8 MB 9.3 MB +61 87/86df3a 5124258 assembly:racon_cpu (HVM2044) COMPLETED 0 2021-07-23 03:11:19.524 34m 20s 33m 55s 375.7% 2.5 GB 2.9 GB 12.4 GB 6.3 GB +64 1d/e146a5 5124262 assembly:racon_cpu (S116) COMPLETED 0 2021-07-23 03:17:24.850 33m 5s 32m 49s 376.4% 2.6 GB 2.9 GB 13.5 GB 6.9 GB +74 0b/b1ae00 5124283 assembly:medaka_cpu (HVM2044) COMPLETED 0 2021-07-23 03:45:39.716 6m 25s 6m 11s 409.5% 5.5 GB 12.4 GB 5.6 GB 3.5 GB +54 4f/11264a 5124250 assembly:racon_cpu (S39) COMPLETED 0 2021-07-23 03:06:19.604 50m 45s 50m 19s 374.5% 3 GB 3.1 GB 15.4 GB 7.9 GB +75 43/193218 5124288 assembly:medaka_cpu (S116) COMPLETED 0 2021-07-23 03:50:29.672 7m 30s 7m 7s 372.2% 5.4 GB 12.2 GB 6.2 GB 3.8 GB +63 6d/504667 5124261 assembly:racon_cpu (S34) COMPLETED 0 2021-07-23 03:14:39.626 44m 25s 43m 49s 377.3% 3 GB 3.3 GB 15 GB 7.6 GB +76 65/d0f7c4 5124290 assembly:nextpolish (HVM2044) COMPLETED 0 2021-07-23 03:52:04.690 9m 5s 8m 42s 340.0% 3.5 GB 71 GB 16 GB 9.5 GB +80 d0/50a6c3 5124297 assembly:fixstart (HVM2044) COMPLETED 0 2021-07-23 04:01:09.751 1m 15s 59s 94.7% 207.7 MB 355 MB 262.2 MB 257.9 MB +81 cc/9d2236 5124298 assembly:quast (HVM2044) COMPLETED 0 2021-07-23 04:02:24.772 35.2s 6.2s 74.0% 86.3 MB 254.9 MB 66.9 MB 9.2 MB +77 1a/c7d3e3 5124292 assembly:medaka_cpu (S39) COMPLETED 0 2021-07-23 03:57:04.750 7m 50s 7m 32s 383.7% 5.6 GB 12.2 GB 7 GB 4.3 GB +78 63/d185b5 5124293 assembly:nextpolish (S116) COMPLETED 0 2021-07-23 03:57:59.698 8m 40s 8m 12s 331.9% 1.6 GB 46.3 GB 11.1 GB 8.3 GB +79 4f/04de2c 5124294 assembly:medaka_cpu (S34) COMPLETED 0 2021-07-23 03:59:04.741 7m 50s 7m 30s 381.4% 5.6 GB 12.6 GB 6.9 GB 4.2 GB +83 f0/05fde9 5124302 assembly:fixstart (S116) COMPLETED 0 2021-07-23 04:06:40.018 1m 40s 1m 27s 94.4% 199.1 MB 349.4 MB 254 MB 249.6 MB +85 2e/2bd6ae 5124304 assembly:quast (S116) COMPLETED 0 2021-07-23 04:08:19.820 39.9s 6.4s 51.6% 88.2 MB 254.9 MB 65.6 MB 9 MB +82 51/c321bd 5124300 assembly:nextpolish (S39) COMPLETED 0 2021-07-23 04:04:54.711 8m 25s 7m 53s 339.1% 1.9 GB 54.6 GB 12 GB 8.9 GB +86 3f/a8c753 5124324 assembly:fixstart (S39) COMPLETED 0 2021-07-23 04:13:19.795 1m 30s 1m 17s 94.6% 210 MB 357.5 MB 268.5 MB 264.1 MB +87 d4/75e79a 5124326 assembly:quast (S39) COMPLETED 0 2021-07-23 04:14:49.780 20s 7.3s 70.3% 88.6 MB 255 MB 67 MB 9.3 MB +84 ed/185ae6 5124303 assembly:nextpolish (S34) COMPLETED 0 2021-07-23 04:06:54.716 8m 30s 8m 334.3% 1.6 GB 45.1 GB 11.9 GB 9 GB +88 33/16f97b 5124327 assembly:fixstart (S34) COMPLETED 0 2021-07-23 04:15:24.838 1m 20s 1m 5s 94.7% 208.1 MB 355.2 MB 264 MB 259.7 MB +89 b4/eea6b1 5124328 assembly:quast (S34) COMPLETED 0 2021-07-23 04:16:44.814 19.9s 6.4s 70.9% 87.7 MB 253.4 MB 66.1 MB 9.2 MB +66 26/2ae359 5124270 assembly:racon_cpu (S97) COMPLETED 0 2021-07-23 03:24:59.598 58m 50s 58m 34s 377.3% 3.3 GB 3.6 GB 17.1 GB 8.7 GB +90 76/e0d0e7 5124338 assembly:medaka_cpu (S97) COMPLETED 0 2021-07-23 04:23:49.820 6m 40s 6m 25s 419.5% 5.7 GB 12.4 GB 7.8 GB 4.8 GB +62 3d/2825d9 5124259 assembly:flye (EC958) COMPLETED 0 2021-07-23 03:13:14.535 1h 18m 32s 1h 18m 302.1% 11.1 GB 11.6 GB 48.4 GB 35 GB +91 c8/7753d0 5124341 assembly:nextpolish (S97) COMPLETED 0 2021-07-23 04:30:29.773 7m 25s 7m 12s 328.4% 1.9 GB 57.8 GB 10.8 GB 8.1 GB +93 5b/21c17e 5124345 assembly:fixstart (S97) COMPLETED 0 2021-07-23 04:37:54.781 1m 30s 1m 20s 94.9% 212 MB 359.3 MB 269.7 MB 265.5 MB +94 91/cbb24b 5124346 assembly:quast (S97) COMPLETED 0 2021-07-23 04:39:24.819 19.9s 5.5s 76.5% 87.1 MB 255.3 MB 67.2 MB 9.3 MB +92 cc/ba1340 5124342 assembly:racon_cpu (EC958) COMPLETED 0 2021-07-23 04:31:46.538 1h 48m 3s 1h 47m 50s 383.2% 5.1 GB 5.3 GB 26.5 GB 13.5 GB +95 4e/bc14af 5124381 assembly:medaka_cpu (EC958) COMPLETED 0 2021-07-23 06:19:50.044 8m 45s 8m 32s 419.0% 5.9 GB 12.8 GB 11.9 GB 7.4 GB +96 c9/ebdbbe 5124385 assembly:nextpolish (EC958) COMPLETED 0 2021-07-23 06:28:34.952 14m 25s 14m 10s 352.9% 4 GB 71.3 GB 16.2 GB 12.4 GB +97 13/2e8701 5124388 assembly:fixstart (EC958) COMPLETED 0 2021-07-23 06:43:00.017 1m 45s 1m 32s 94.1% 207.1 MB 354.7 MB 261.3 MB 257.1 MB +98 67/089d85 5124389 assembly:quast (EC958) COMPLETED 0 2021-07-23 06:44:45.665 14.3s 3.7s 71.7% 77.5 MB 243.9 MB 66.4 MB 9.2 MB diff --git a/pawsey/nextflow.config b/pawsey/nextflow.config new file mode 100644 index 0000000..6292aa6 --- /dev/null +++ b/pawsey/nextflow.config @@ -0,0 +1,146 @@ +profiles { + zeus { + workDir = "$MYSCRATCH/nxf_work" + process { + cache = 'lenient' + stageInMode = 'symlink' + } + singularity { + enabled = true + // the line below does not work with multi-cluster + // envWhitelist = 'SINGULARITY_BINDPATH, SINGULARITYENV_LD_LIBRARY_PATH' + cacheDir = "$NXF_HOME/singularity" + runOptions = "-B /group,/scratch --nv" + } + process.module = 'singularity' + //params.slurm_account = 'director2172' + process { + executor = 'slurm' + clusterOptions = "--account=${params.slurm_account}" + queue = 'workq' + time = '2h' + memory = '16GB' + withName: 'basecalling|basecalling_single_isolate|basecalling_demultiplexing_guppy' { + time = '24h' + } + withLabel: big_mem { + memory = '32GB' + time = '4h' + } + withName: 'basecalling_cpu|basecalling_cpu_single_isolate|basecalling_demultiplexing_guppy_cpu' { + time = '72h' + queue = 'longq' + } + withLabel: gpu { + executor = 'slurm_topaz' + clusterOptions += " --gpus-per-node=1" + queue = 'gpuq' + } + } + } +} + +// Default parameters. Commandline parameters will take priority over these +params { + outdir = './results' + basecalling = false + demultiplexing = false + gpu = true + fast5 = false + fastq = false + datadir = false + demultiplexer = 'guppy' + //Path to the Guppy GPU and CPU binary folder (v3.6.1). Change this as appropriate when providing Guppy as a binary folder and do not forget the "/" at the end of the path + guppy_gpu_folder = "/scratch/director2172/vmurigneux/sw/ont-guppy/bin/" + guppy_cpu_folder = "/scratch/director2172/vmurigneux/sw/ont-guppy-cpu/bin/" + //Uncomment the two following lines when providing Guppy container images (and comment the two previous lines) + //guppy_gpu_folder = "" + //guppy_cpu_folder = "" + guppy_config_gpu = "dna_r9.4.1_450bps_hac.cfg" + guppy_config_cpu = "dna_r9.4.1_450bps_fast.cfg" + kit = false + flowcell = false + guppy_gpu_device = "auto" + guppy_num_callers = 8 + guppy_cpu_threads_per_caller = 1 + guppy_basecaller_args = "--recursive --trim_barcodes -q 0" + guppy_barcoder_args = "--recursive --trim_barcodes -q 0" + guppy_barcode_kits= "SQK-RBK004" + guppy_barcoder_threads = 2 + qcat_args = "" + skip_pycoqc = false + skip_rasusa = true + skip_porechop = false + skip_filtering = false + rasusa_coverage = 100 + filtering = "japsa" + porechop_args = "" + porechop_threads = 4 + japsa_args = "--lenMin 1000 --qualMin 10" + filtlong_args = "--min_length 1000 --keep_percent 90" + flye_args = "--plasmids" + flye_threads = 4 + polisher = "medaka" + racon_nb = 4 + racon_args = "-m 8 -x -6 -g -8 -w 500" + racon_threads = 4 + medaka_model = "r941_min_high" + medaka_threads = 8 + nextpolish_threads = 4 + nextpolish_task_SR = "1212" + nextpolish_task_LR = "55" + skip_illumina = false + fixstart_args = "" + skip_fixstart = false + quast_threads = 1 + quast_args = "" + skip_quast = false +} + +// Debug and report options +trace { + enabled = true + file = "${params.outdir}/trace.txt" +} +timeline { + enabled = true + file = "${params.outdir}/timeline.html" +} +report { + enabled = true + file = "${params.outdir}/report.html" +} +dag { + enabled = true + file = "${params.outdir}/flowchart_dag.svg" +} + +// Not generally user-modifiable !!! +process { + //Path to the Guppy GPU and CPU container images (v3.6.1). Uncomment and change this as appropriate if providing Guppy as a container image. + //withLabel: guppy_gpu { container = '' } + //withLabel: guppy_cpu { container = '' } + withLabel: pycoqc { container = 'docker://quay.io/biocontainers/pycoqc:2.5.0.23--py_0' } + withName: demultiplexing_qcat { container = 'docker://quay.io/biocontainers/qcat:1.0.1--py_0' } + withName: rasusa { container = 'docker://quay.io/biocontainers/rasusa:0.3.0--h516909a_0' } + withName: porechop { container = 'docker://quay.io/biocontainers/porechop:0.2.3_seqan2.1.1--0' } + withName: filtlong { container = 'docker://quay.io/biocontainers/filtlong:0.2.0--he513fc3_3' } + withName: japsa { container = 'docker://vmurigneux/japsa:latest' } + withName: flye { container = 'docker://quay.io/biocontainers/flye:2.5--py27he513fc3_0' } + withName: racon_cpu { container = 'docker://vmurigneux/racon:1.4.9' } + withLabel: medaka { container = 'docker://quay.io/biocontainers/medaka:0.10.0--py36hbcae180_1' } + withLabel: nextpolish { container = 'docker://pvstodghill/nextpolish:1.1.0__2020-05-12' } + withLabel: circlator { container = 'docker://quay.io/biocontainers/circlator:1.5.5--py_3' } + withName: quast { container = 'docker://quay.io/biocontainers/quast:5.0.2--py37pl526hb5aa323_2' } + //errorStrategy = 'ignore' +} + +manifest { + name = 'microPIPE' + author = 'Valentine Murigneux' + description = 'Bacterial genome assembly pipeline' + homePage = 'https://github.com/BeatsonLab-MicrobialGenomics/micropipe' + mainScript = 'main.nf' + version = '0.9' +} + diff --git a/pawsey/nextflow_batch_template.sh b/pawsey/nextflow_batch_template.sh new file mode 100644 index 0000000..5371e67 --- /dev/null +++ b/pawsey/nextflow_batch_template.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +#SBATCH --job-name=micropipe +#SBATCH --nodes=1 +#SBATCH --cpus-per-task=1 +#SBATCH --output=s%A.micropipe_guppy3.6.1_cpu_12samples_72h.out +#SBATCH --error=s%A.micropipe_guppy3.6.1_cpu_12samples_72h.err +#SBATCH --time=96:00:00 +#SBATCH --partition='longq' + +module load nextflow/20.07.1-multi +#source activate nextflow +module load singularity/3.6.4 + +#Cloud9: It is recommended to run the nextflow command in the background inside a tmux/screen session to avoid potential issues when submitting the pipeline in a batch script + +#directory containing the nextflow.config file and the main.nf script +dir=/scratch/director2172/vmurigneux/micropipe +cd ${dir} +#datadir=${dir}/test_data +datadir=${dir}/Illumina +#out_dir=${dir}/results_3.6.1_gpu +out_dir=${dir}/results_3.6.1_cpu +#Run A, B or C depending on whether you are starting with ONT fast5 (A or B) or fastq files (C or D) + +#A) Workflow including basecalling, demultiplexing and assembly +fast5_dir=${dir}/fast5_pass +#fast5_dir=${dir}/fast5_pass/test +csv=${dir}/test_data/samples_all_basecalling.csv +#csv=${dir}/test_data/samples_1_basecalling.csv +#nextflow main.nf --gpu true --basecalling -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} +nextflow main.nf --gpu false --basecalling --guppy_num_callers 16 -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} + +#B) Workflow including basecalling and assembly (skip demultiplexing step) +#fast5_dir=${dir}/fast5_pass +#csv=${dir}/test_data/samples_1_basecalling_single_isolate.csv +#nextflow main.nf --basecalling --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} + +#C) Workflow including demultiplexing and assembly +#fastq_dir=${dir}/fastq +#csv=${dir}/test_data/samples_1_basecalling.csv +#nextflow main.nf --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fastq ${fastq_dir} --datadir ${datadir} + +#D) Assembly workflow (skip basecalling and demultiplexing step) +#csv=${dir}/test_data/samples_1.csv +#nextflow main.nf --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir} + +#to restart the pipeline if something failed, use the -resume flag after correcting the issue +#nextflow main.nf -resume --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir} From 68894f55a763fc98ed97587d8f36f8f984601b0b Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 20 Jan 2022 14:13:42 +1000 Subject: [PATCH 38/46] Update readme following Australian Biocommons template for workflows --- README.md | 292 ++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 227 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 8a1b2d8..05aa51b 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,54 @@

Logo

-**microPIPE: a pipeline for high-quality bacterial genome construction using ONT and Illumina sequencing** -====== +microPIPE: a pipeline for high-quality bacterial genome construction using ONT and Illumina sequencing +================ + + - [Description](#description) + - [Diagram](#diagram) + - [User guide](#user-guide) + - [Quick start guide](#quick-start-guide) + - [Step by step user guide](#step-by-step-user-guide) + - [Optional parameters](#optional-parameters) + - [Structure of the output folders](#structure-of-the-output-folders) + - [Test Data](#example-data) + - [Infrastructure usage and recommendations](#infrastructure-usage-and-recommendations) + - [Compute resource usage across tested infrastructures](#compute-resource-usage-across-tested-infrastructures) + - [Benchmarking](#benchmarking) + - [Workflow summaries](#workflow-summaries) + - [Metadata](#metadata) + - [Component tools](#component-tools) + - [Third party tools /dependencies](#third-party-toolsdependencies) + - [Additional notes](#additional-notes) + - [Help/FAQ/Troubleshooting](#helpfaqtroubleshooting) + - [Licence(s)](#licences) + - [Acknowledgements/citations/credits](#acknowledgementscitationscredits) + +# Description microPIPE was developed to automate high-quality complete bacterial genome assembly using Oxford Nanopore Sequencing in combination with Illumina sequencing. To build microPIPE we evaluated the performance of several tools at each step of bacterial genome assembly, including basecalling, assembly, and polishing. Results at each step were validated using the high-quality ST131 *Escherichia coli* strain EC958 (GenBank: HG941718.1). After appraisal of each step, we selected the best combination of tools to achieve the most consistent and best quality bacterial genome assemblies. -The workflow below summarises the different steps of the pipeline (with each selected tool) and the approximate run time (using GPU basecalling, averaged over 12 *E. coli* isolates sequenced on a R9.4 MinION flow cell). Dashed boxes correspond to optional steps in the pipeline. +Please note that this pipeline does not perform extensive quality assessment of the input sequencing data. Contamination and sequencing read quality should be assessed independently to avoid problems with assembly. Micropipe has been written in Nextflow and uses Singularity containers. It can use both GPU and CPU resources. For more information please see our publication here: https://doi.org/10.1186/s12864-021-07767-z. -

- Workflow -

+----- -Please note that this pipeline does not perform extensive quality assessment of the input sequencing data. Contamination and sequencing read quality should be assessed independently to avoid problems with assembly. +# Diagram -# Contents +The diagram below summarises the different steps of the pipeline (with each selected tool) and the approximate run time (using GPU basecalling, averaged over 12 E. coli isolates sequenced on a R9.4 MinION flow cell). Dashed boxes correspond to optional steps in the pipeline. +

+ Workflow +

-* [Quickstart](#quickstart) -* [Installation](#installation) -* [Usage](#usage) -* [Test data](#example-data) -* [Optional parameters](#optional-parameters) -* [Structure of the output folders](#structure-of-the-output-folders) -* [Comments](#comments) -* [Citation](#citation) +----- -# Quickstart +# User guide + +## Quick start guide 1. Basecalling, demultiplexing and assembly workflow @@ -44,13 +62,14 @@ Please note that this pipeline does not perform extensive quality assessment of `nextflow main.nf --samplesheet /path/to/samples.csv --fastq /path/to/fastq/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/` +An infrastructure specific guide for Zeus @ [Pawsey Supercomputing Centre](https://pawsey.org.au/) (Perth, Western Australia) is provided [here](https://github.com/vmurigneu/micropipe_pawsey/blob/master/docs/infrastructure_optimisation_zeus.md#quickstart-tutorial). -# Installation - -microPIPE has been built using Nextflow and Singularity to enable ease of use and installation across different platforms. +## Step by step user guide **0. Requirements** +microPIPE has been built using Nextflow and Singularity to enable ease of use and installation across different platforms. + * [Nextflow](https://www.nextflow.io/) >= 20.10.0 Nextflow can be used on any POSIX compatible system (Linux, OS X, etc). It requires Bash 3.2 (or later) and Java 8 (or later, up to 15) to be installed. @@ -65,25 +84,17 @@ It will create the nextflow main executable file in the current directory. Optio * Guppy (4.4.1 was the latest working version) -Due to the Oxford Nanopore Technologies terms and conditions, we are not allowed to redistribute the Guppy software either in its binary form or packaged form e.g. Docker or Singularity images. Therefore users will have to either install Guppy, provide a container image or start the pipeline from the basecalled fastq files. See [Usage](#usage) section below for instructions. +Due to the Oxford Nanopore Technologies terms and conditions, we are not allowed to redistribute the Guppy software either in its binary form or packaged form e.g. Docker or Singularity images. Therefore users will have to either install Guppy, provide a container image or start the pipeline from the basecalled fastq files. -In versions greater than Guppy v4.5.2, the default Guppy parameters have changed. If you wish to use Guppy > v4.5.2, please modify the `nexflow.config` to run Guppy with the "--disable_qscore_filtering" flag: -``` -params { - guppy_basecaller_args = "--recursive --trim_barcodes -q 0 --disable_qscore_filtering" -} -``` **1. Installing microPIPE** Download the microPIPE repository using the command: ``` git clone https://github.com/BeatsonLab-MicrobialGenomics/micropipe.git ``` -microPIPE only requires the `main.nf` and `nexflow.config` files to run. You will also need to provide a samplesheet (explained below). +microPIPE requires the files `main.nf`, `nexflow.config` and a samplesheet file to run. -# Usage - -**1. Prepare the Nextflow configuration file** +**2. Prepare the Nextflow configuration file** When a Nexflow pipeline script is launched, Nextflow looks for a file named **nextflow.config** in the current directory. The configuration file defines default parameters values for the pipeline and cluster settings such as the executor (e.g. "slurm", "local") and queues to be used (https://www.nextflow.io/docs/latest/config.html). @@ -132,12 +143,9 @@ The **nextflow.config** file should be modified to specify the location of Guppy An example configuration file can be found in this [repository](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/nextflow.config). -Two versions of the configuration file are available and correspond to microPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1), as referenced in the paper. - -**NOTE:** to use **GPU** resources for basecalling and demultiplexing, use the `--gpu` flag. - +Two versions of the configuration file are available and correspond to microPIPE v0.8 (utilizing Guppy v3.4.3) and v0.9 (utilizing Guppy v3.6.1), as referenced in the [paper](https://doi.org/10.1186/s12864-021-07767-z). -**2. Prepare the samplesheet file (csv)** +**3. Prepare the samplesheet file (csv)** The samplesheet file (comma-separated values) defines the input fastq files (Illumina [short] and Nanopore [long], and their directory path), barcode number, sample ID, and the estimated genome size (for Flye assembly). The header line should match the header line in the examples below: @@ -172,7 +180,7 @@ barcode01,S24,barcode01.fastq.gz,5.5m barcode02,S34,barcode02.fastq.gz,5.5m ``` -**3. Run the pipeline** +**4. Run the pipeline** The pipeline can be used to run: @@ -192,6 +200,8 @@ The entire workflow from basecalling to polishing will be run. The input files w --guppy_config_cpu: Guppy configuration file name for basecalling using CPU resources (default=dna_r9.4.1_450bps_fast.cfg) --medaka_model: Medaka model (default=r941_min_high, Available models: r941_min_fast, r941_min_high, r941_prom_fast, r941_prom_high, r10_min_high, r941_min_diploid_snp), see [details](https://github.com/nanoporetech/medaka#models) ``` +**NOTE:** to use **GPU** resources for basecalling and demultiplexing, use the `--gpu` flag. + Example of samplesheet file: ``` barcode_id,sample_id,short_fastq_1,short_fastq_2,genome_size @@ -261,25 +271,7 @@ barcode01,S24,barcode01.fastq.gz,S24EC.filtered_1P.fastq.gz,S24EC.filtered_2P.fa barcode02,S34,barcode02.fastq.gz,S34EC.filtered_1P.fastq.gz,S34EC.filtered_2P.fastq.gz,5.5m ``` -# Example data - -To test the pipeline, we have provided some [test data](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/tree/main/test_data). In this directory you will find: - -File | Description ----|--- -S24EC_1P_test.fastq.gz | Illumina reads 1st pair -S24EC_2P_test.fastq.gz | Illumina reads 2nd pair -barcode01.fastq.gz | ONT fastq reads -samples_1.csv | sample sheet for running assembly-only pipeline -samples_1_basecalling.csv | sample sheet for full pipeline -samples_1_basecalling_single_isolate.csv | sample sheet for a single isolate - -To test the assembly-only pipeline, edit the `sample_1.csv` samplesheet to point to the correct test files. Then run: - -`nextflow main.nf --samplesheet /path/to/samples_1.csv --outdir /path/to/test_outdir/` - - -# Optional parameters +## Optional parameters Some parameters can be added to the command line in order to include or skip some steps and modify some parameters: @@ -337,7 +329,7 @@ Assembly evaluation: * `--quast_args`: QUAST optional parameters (default=""), see [details](http://quast.sourceforge.net/docs/manual.html#sec2.3). Example: `--quast_args "-r /path/to/datadir/fasta"` (the file should be located in the nextflow launch directory or in the datadir). * `--quast_threads`: number of threads for QUAST (default=1) -# Structure of the output folders +## Structure of the output folders The pipeline will create several folders corresponding to the different steps of the pipeline. The main output folder (`--outdir`) will contain the following folders: @@ -352,17 +344,187 @@ Each sample folder will contain the following folders: * **4_polishing_short_reads:** Final polished assembly fasta file (sample_id_flye_polishedLR_SR_fixstart.fasta) * **5_quast:** QUAST quality assessment report, see [details](http://quast.sourceforge.net/docs/manual.html) -# Comments +## Example data + +To test the pipeline, we have provided some [test data](https://github.com/BeatsonLab-MicrobialGenomics/micropipe/tree/main/test_data). In this directory you will find: + +File | Description +---|--- +S24EC_1P_test.fastq.gz | Illumina reads 1st pair +S24EC_2P_test.fastq.gz | Illumina reads 2nd pair +barcode01.fastq.gz | ONT fastq reads +samples_1.csv | sample sheet for running assembly-only pipeline +samples_1_basecalling.csv | sample sheet for full pipeline +samples_1_basecalling_single_isolate.csv | sample sheet for a single isolate + +To test the assembly-only pipeline, edit the `sample_1.csv` samplesheet to point to the correct test files. Then run: + +`nextflow main.nf --samplesheet /path/to/samples_1.csv --outdir /path/to/test_outdir/` + +## Infrastructure usage and recommendations + +### General recommendations for using microPIPE + +When using microPIPE to run the Oxford Nanopore data basecalling and demultiplexing, it is recommended to use the GPU resources. As a result, the basecalling step will be performed using the high accuracy model (instead of the fast model) and the workflow will complete faster than with only the CPU resources. + +To use GPU resources for basecalling and demultiplexing, use the `--gpu` flag in the main nextflow command: +``` +nextflow main.nf --gpu true --basecalling --demultiplexing --samplesheet /path/to/samples.csv --fast5 /path/to/fast5/directory/ --datadir /path/to/datadir/ --outdir /path/to/outdir/ +``` + +----- + +## Compute resource usage across tested infrastructures + +The table below summarised the basecalling run time depending on the resources used at the Pawsey Supercomputing Centre. + +|Resources (Cluster)|Basecalling model|Guppy Configuration file|Run time| +|-------|:-----:|:-----:|:-----:| +|GPU (Pawsey Topaz)| high-accuracy | dna_r9.4.1_450bps_hac.cfg | 10h 17m 17s | +|CPU (Pawsey Zeus)| fast | dna_r9.4.1_450bps_fast.cfg | 3d 19h 21m 31s | + +----- + +# Benchmarking + +## Summary + +### Exemplar 1: Assembly of 12 *E.coli* ST131 samples using GPU and CPU resources + +You can collect usage metrics from your Canu run using the NCI Gadi optimised workflow using scripts available on the Sydney Informatics Hub, University of Sydney GitHub repository. +* We used the *E.coli* data from the [microPIPE publication](https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-021-07767-z) available from the NCBI SRA [BioProject PRJNA679678](https://www.ncbi.nlm.nih.gov/bioproject/PRJNA679678/) (Oxford Nanopore) and the [BioProject PRJEB2968](https://www.ncbi.nlm.nih.gov/bioproject/?term=PRJEB2968) (Illumina). + +* See Nextflow configuration file used [here](./nextflow.config) and slurm submission script [here](./nextflow_batch_template.sh). +* See Nextflow [HTML execution report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html), [trace report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt) and [HTML processes execution timeline](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html). + +* The table below summarised the assembly results for each strain. + +|Strain|Chromosome/plasmid|Size (bps)|Circularised?| +|-------|:-----:|:-----:|:-----:| +|S24EC| Chromosome
Plasmid A | 5078304
114708 | Yes
Yes | +|S34EC| Chromosome
Plasmid A
Plasmid B | 5050427
153321
108135 | Yes
Yes
Yes | +|S37EC| Chromosome
Plasmid A
Plasmid B | 4981928
157642
61072 | Yes
Yes
Yes | +|S39EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D
Plasmid E
Plasmid F | 5054402
141007
94979
68049
62085
2070
1846 | Yes
Yes
Yes
Yes
Yes
Yes
Yes | +|S65EC| Chromosome
Plasmid A | 5205011
147412 | Yes
Yes | +|S96EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 5069496
164355
115965
14479
4184 | Yes
Yes
Yes
Yes
Yes | +|S97EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 5178868
166099
96788
4092
3209 | Yes
Yes
Yes
Yes
Yes | +|S112EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 5020013
161028
68847
5338
4136 | Yes
Yes
Yes
Yes
Yes | +|S116EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D | 4989207
66792
5263
4257
4104 | Yes
Yes
Yes
Yes
Yes | +|S129EC| Chromosome
Plasmid A
Plasmid B
Plasmid C
Plasmid D
Plasmid E
Plasmid F
Plasmid G | 5193964
163681
93505
33344
4087
2401
2121
1571 | Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes | +|EC958| Chromosome
Plasmid A
Plasmid B
Plasmid C | 5126816
136157
4145
1830 | Yes
Yes
Yes
Yes | +|HVM2044| Chromosome
Plasmid A
Plasmid B
Plasmid C | 5003288
142959
18716
18345 | Yes
Yes
Yes
Yes | + + +### Exemplar 2: Assembly of 12 *E.coli* ST131 samples using CPU resources + +* See Nextflow configuration file used [here](./nextflow.config) and slurm submission script [here](./nextflow_batch_template.sh). + +* See Nextflow [HTML execution report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html), [trace report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt) and [HTML processes execution timeline](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html). + +----- + +# Workflow summaries + +## Metadata + +| metadata field | workflow\_name / workflow\_version | +| ---------------- | :--------------------------------: | +| Version | v0.9 | +| Maturity | stable | +| Creators | Valentine Murigneux, Leah W Roberts, Brian M Forde, Minh-Duy Phan, Nguyen Thi Khanh Nhu, Adam D Irwin, Patrick N A Harris, David L Paterson, Mark A Schembri, David M Whiley, Scott A Beatson | +| Source | https://github.com/BeatsonLab-MicrobialGenomics/micropipe | +| License | https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/LICENSE | +| Workflow manager | NextFlow | +| Container | Singularity | +| Install method | Manual | +| GitHub | https://github.com/BeatsonLab-MicrobialGenomics/micropipe | +| bio.tools | NA | +| BioContainers | NA | +| bioconda | NA | + +----- + +## Component tools + +| Workflow element | Workflow element version | Workflow title | +| ---------------- | :----------------------: | :------------: | +| Guppy | See workflow version | microPIPE | +| qcat | See workflow version | microPIPE | +| pycoQC | See workflow version | microPIPE | +| Porechop | See workflow version | microPIPE | +| Japsa | See workflow version | microPIPE | +| Flye | See workflow version | microPIPE | +| Racon | See workflow version | microPIPE | +| Medaka | See workflow version | microPIPE | +| NextPolish | See workflow version | microPIPE | + +----- + +## Required (minimum) inputs/parameters + + The minimum inputs required for the workflow to run. + +----- + +## Third party tools / dependencies + +* [Nextflow](https://www.nextflow.io/) >= 20.10.0 + +Nextflow can be used on any POSIX compatible system (Linux, OS X, etc). It requires Bash 3.2 (or later) and Java 8 (or later, up to 15) to be installed. + +To install Nextflow, run the command: + +`wget -qO- https://get.nextflow.io | bash` or `curl -s https://get.nextflow.io | bash` + +It will create the nextflow main executable file in the current directory. Optionally, move the nextflow file to a directory accessible by your $PATH variable. + +* [Singularity](https://singularity.lbl.gov/install-linux) >= 2.3 (microPIPE has been tested with version 3.4.1, 3.5.0 and 3.6.3) + +* Guppy (4.4.1 was the latest working version) + +Due to the Oxford Nanopore Technologies terms and conditions, we are not allowed to redistribute the Guppy software either in its binary form or packaged form e.g. Docker or Singularity images. Therefore users will have to either install Guppy, provide a container image or start the pipeline from the basecalled fastq files. + +----- + +# Additional notes + +* The pipeline has been tested using the following grid based executors: SLURM, PBS Pro and LSF. + +* Do not forget to delete the /work directory created by Nextflow once the pipeline has completed. + +* Planned upgrades: + + Enabling GPU resource for Racon and Medaka processes. + +----- + +# Help / FAQ / Troubleshooting +* In versions greater than Guppy v4.5.2, the default Guppy parameters have changed. If you wish to use Guppy > v4.5.2, please modify the `nexflow.config` to run Guppy with the "--disable_qscore_filtering" flag: +``` +params { + guppy_basecaller_args = "--recursive --trim_barcodes -q 0 --disable_qscore_filtering" +} +``` + +----- + +# Licence(s) + https://github.com/BeatsonLab-MicrobialGenomics/micropipe/blob/main/LICENSE + +----- + +# Acknowledgements / citations / credits + +## Citations -The pipeline has been tested using the following grid based executors: SLURM, PBS Pro and LSF. +- Murigneux, V., Roberts, L.W., Forde, B.M. et al. MicroPIPE: validating an end-to-end workflow for high-quality complete bacterial genome construction. BMC Genomics 22, 474 (2021). [https://doi.org/10.1186/s12864-021-07767-z](https://doi.org/10.1186/s12864-021-07767-z) +- Murigneux, V. (2021). microPIPE: a pipeline for high-quality bacterial genome construction using ONT and Illumina sequencing. WorkflowHub. [https://doi.org/10.48546/WORKFLOWHUB.WORKFLOW.140.1](https://doi.org/10.48546/WORKFLOWHUB.WORKFLOW.140.1) -Do not forget to delete the /work directory created by Nextflow once the pipeline has completed. +## Acknowledgements -Planned upgrades: -- Enabling GPU resource for Racon and Medaka processes. +This work was supported by funding from the Queensland Genomics Health Alliance (now Queensland Genomics), Queensland Health, the Queensland Government. -# Citation +The deployment of the workflow at the Pawsey Supercomputing Centre was supported by the Australian BioCommons via funding from Bioplatforms Australia, the Australian Research Data Commons (https://doi.org/10.47486/PL105) and the Queensland Government RICF programme. Bioplatforms Australia and the Australian Research Data Commons are funded by the National Collaborative Research Infrastructure Strategy (NCRIS). -If you use microPIPE in your work, please cite: +----- -MicroPIPE: validating an end-to-end workflow for high-quality complete bacterial genome construction. Murigneux V, Roberts LW, Forde BM, Phan MD, Nhu NTK, Irwin AD, Harris PNA, Paterson DL, Schembri MA, Whiley DM, Beatson SA. BMC Genomics. 2021 Jun 25;22(1):474. doi: [10.1186/s12864-021-07767-z](https://doi.org/10.1186/s12864-021-07767-z). From a47f3c22578e51e750f8d91f0442f7fdc6e7e9a5 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 20 Jan 2022 14:23:10 +1000 Subject: [PATCH 39/46] Update infrastructure_optimisation_zeus.md --- pawsey/infrastructure_optimisation_zeus.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/pawsey/infrastructure_optimisation_zeus.md b/pawsey/infrastructure_optimisation_zeus.md index a5b60f6..37862dd 100644 --- a/pawsey/infrastructure_optimisation_zeus.md +++ b/pawsey/infrastructure_optimisation_zeus.md @@ -35,9 +35,9 @@ A tutorial is available on the GitHub page: https://github.com/BeatsonLab-Microb Use the configuration file to run microPIPE at Pawsey Zeus [here](./nextflow.config). **2. Prepare the samplesheet file (csv)** -See instructions at the microPIPE [GitHub page](https://github.com/BeatsonLab-MicrobialGenomics/micropipe#usage), section 2. Prepare the samplesheet file. +See instructions at the microPIPE [GitHub page](https://github.com/BeatsonLab-MicrobialGenomics/micropipe#usage), section 3. Prepare the samplesheet file. -**3. Prepare the slurm script (e.g. nextflow_batch_template.sh)** +**3. Prepare the slurm script (e.g. [nextflow_batch_template.sh](./nextflow_batch_template.sh))** The pipeline will be launched using a Slurm script submitted to Zeus. This script will load the required modules, define the input/output directories and files, and include the nextflow command line with optional parameters. Note that the configuration profile definition for the Zeus cluster should be specified when launching the pipeline execution by using the "-profile zeus" command line option, as well as the slurm account allocation by using the "--slurm_account='director2172'" command line option (replace 'director2172' by your account identifier). ``` #!/bin/bash @@ -147,8 +147,5 @@ You can collect usage metrics from your Canu run using the NCI Gadi optimised wo - The deployment of the workflow at the Pawsey Supercomputing Centre was supported by the Australian BioCommons via funding from Bioplatforms Australia, the Australian Research Data Commons (https://doi.org/10.47486/PL105) and the Queensland Government RICF programme. Bioplatforms Australia and the Australian Research Data Commons are funded by the National Collaborative Research Infrastructure Strategy (NCRIS). - Marco de la Pierre (Pawsey Supercomputing Centre) [@marcodelapierre](https://github.com/marcodelapierre) - Johan Gustafsson (Australian BioCommons) [@supernord](https://github.com/supernord) -``` -Any attribution information that is relevant to the workflow being documented, or the infrastructure being used. -``` --- From 43ae9c6f09cd30a9b027c0f4aba374d2c843a88f Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 20 Jan 2022 14:38:52 +1000 Subject: [PATCH 40/46] Update nextflow_batch_template.sh --- pawsey/nextflow_batch_template.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pawsey/nextflow_batch_template.sh b/pawsey/nextflow_batch_template.sh index 5371e67..abf624c 100644 --- a/pawsey/nextflow_batch_template.sh +++ b/pawsey/nextflow_batch_template.sh @@ -9,11 +9,8 @@ #SBATCH --partition='longq' module load nextflow/20.07.1-multi -#source activate nextflow module load singularity/3.6.4 -#Cloud9: It is recommended to run the nextflow command in the background inside a tmux/screen session to avoid potential issues when submitting the pipeline in a batch script - #directory containing the nextflow.config file and the main.nf script dir=/scratch/director2172/vmurigneux/micropipe cd ${dir} @@ -28,8 +25,10 @@ fast5_dir=${dir}/fast5_pass #fast5_dir=${dir}/fast5_pass/test csv=${dir}/test_data/samples_all_basecalling.csv #csv=${dir}/test_data/samples_1_basecalling.csv -#nextflow main.nf --gpu true --basecalling -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} -nextflow main.nf --gpu false --basecalling --guppy_num_callers 16 -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} +#run pipeline using both GPU and CPU resources +#nextflow main.nf --gpu true --basecalling --guppy_num_callers 16 -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} +#run pipeline using CPU resources only +nextflow main.nf --gpu false --basecalling -profile zeus --slurm_account='director2172' --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fast5 ${fast5_dir} --datadir ${datadir} #B) Workflow including basecalling and assembly (skip demultiplexing step) #fast5_dir=${dir}/fast5_pass From b3874b62d3ab348a6c24c31b1138f67bb71b0887 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 20 Jan 2022 15:10:50 +1000 Subject: [PATCH 41/46] Update README.md --- README.md | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 05aa51b..7f5acdb 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,11 @@ microPIPE: a pipeline for high-quality bacterial genome construction using ONT a - [Workflow summaries](#workflow-summaries) - [Metadata](#metadata) - [Component tools](#component-tools) - - [Third party tools /dependencies](#third-party-toolsdependencies) + - [Third party tools /dependencies](#third-party-tools--dependencies) - [Additional notes](#additional-notes) - - [Help/FAQ/Troubleshooting](#helpfaqtroubleshooting) + - [Help/FAQ/Troubleshooting](#help--faq--troubleshooting) - [Licence(s)](#licences) - - [Acknowledgements/citations/credits](#acknowledgementscitationscredits) + - [Acknowledgements/citations/credits](#acknowledgements--citations--credits) # Description @@ -98,7 +98,7 @@ microPIPE requires the files `main.nf`, `nexflow.config` and a samplesheet file When a Nexflow pipeline script is launched, Nextflow looks for a file named **nextflow.config** in the current directory. The configuration file defines default parameters values for the pipeline and cluster settings such as the executor (e.g. "slurm", "local") and queues to be used (https://www.nextflow.io/docs/latest/config.html). -The pipeline uses separated Singularity containers for all processes. Nextflow will automatically pull the singularity images required to run the pipeline and cache those images in the singularity directory in the pipeline work directory by default or in the singularity.cacheDir specified in the [nextflow.config](https://www.nextflow.io/docs/latest/singularity.html) file: +The pipeline uses separated [Singularity containers](https://www.nextflow.io/docs/latest/singularity.html) for all processes. Nextflow will automatically pull the singularity images required to run the pipeline and cache those images in the singularity directory in the pipeline work directory by default or in the singularity.cacheDir specified in the [nextflow.config](./nextflow.config) file: ``` singularity { @@ -389,13 +389,12 @@ The table below summarised the basecalling run time depending on the resources u ## Summary -### Exemplar 1: Assembly of 12 *E.coli* ST131 samples using GPU and CPU resources +### Exemplar 1: Assembly of 12 *E.coli* ST131 samples using GPU and CPU resources @ Pawsey -You can collect usage metrics from your Canu run using the NCI Gadi optimised workflow using scripts available on the Sydney Informatics Hub, University of Sydney GitHub repository. * We used the *E.coli* data from the [microPIPE publication](https://bmcgenomics.biomedcentral.com/articles/10.1186/s12864-021-07767-z) available from the NCBI SRA [BioProject PRJNA679678](https://www.ncbi.nlm.nih.gov/bioproject/PRJNA679678/) (Oxford Nanopore) and the [BioProject PRJEB2968](https://www.ncbi.nlm.nih.gov/bioproject/?term=PRJEB2968) (Illumina). -* See Nextflow configuration file used [here](./nextflow.config) and slurm submission script [here](./nextflow_batch_template.sh). -* See Nextflow [HTML execution report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html), [trace report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt) and [HTML processes execution timeline](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html). +* See Nextflow configuration file used [here](./pawsey/nextflow.config) and slurm submission script [here](./pawsey/nextflow_batch_template.sh). +* See Nextflow [HTML execution report](./pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.report.html), [trace report](./pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.trace.txt) and [HTML processes execution timeline](./pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_gpu.timeline.html). * The table below summarised the assembly results for each strain. @@ -415,11 +414,11 @@ You can collect usage metrics from your Canu run using the NCI Gadi optimised wo |HVM2044| Chromosome
Plasmid A
Plasmid B
Plasmid C | 5003288
142959
18716
18345 | Yes
Yes
Yes
Yes | -### Exemplar 2: Assembly of 12 *E.coli* ST131 samples using CPU resources +### Exemplar 2: Assembly of 12 *E.coli* ST131 samples using CPU resources @ Pawsey -* See Nextflow configuration file used [here](./nextflow.config) and slurm submission script [here](./nextflow_batch_template.sh). +* See Nextflow configuration file used [here](./pawsey/nextflow.config) and slurm submission script [here](./nextflow_batch_template.sh). -* See Nextflow [HTML execution report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html), [trace report](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt) and [HTML processes execution timeline](./micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html). +* See Nextflow [HTML execution report](./pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.report.html), [trace report](./pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.trace.txt) and [HTML processes execution timeline](./pawsey/micropipe_ecoli_ST131_pawsey_guppy3.6.1_cpu.timeline.html). ----- @@ -460,12 +459,6 @@ You can collect usage metrics from your Canu run using the NCI Gadi optimised wo ----- -## Required (minimum) inputs/parameters - - The minimum inputs required for the workflow to run. - ------ - ## Third party tools / dependencies * [Nextflow](https://www.nextflow.io/) >= 20.10.0 From 3e3c5ba27fd91105105b079bc640ba2d91f7afd7 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Mon, 21 Feb 2022 10:29:16 +1000 Subject: [PATCH 42/46] Add tools version for microPIPE v0.9 in readme --- README.md | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 7f5acdb..9bf5e29 100644 --- a/README.md +++ b/README.md @@ -447,15 +447,19 @@ The table below summarised the basecalling run time depending on the resources u | Workflow element | Workflow element version | Workflow title | | ---------------- | :----------------------: | :------------: | -| Guppy | See workflow version | microPIPE | -| qcat | See workflow version | microPIPE | -| pycoQC | See workflow version | microPIPE | -| Porechop | See workflow version | microPIPE | -| Japsa | See workflow version | microPIPE | -| Flye | See workflow version | microPIPE | -| Racon | See workflow version | microPIPE | -| Medaka | See workflow version | microPIPE | -| NextPolish | See workflow version | microPIPE | +| Guppy | v3.6.1 | microPIPE v0.9 | +| qcat | v1.0.1 | microPIPE v0.9 | +| rasusa | v0.3.0 | microPIPE v0.9 | +| pycoQC | v2.5.0.23 | microPIPE v0.9 | +| Porechop | v0.2.3 | microPIPE v0.9 | +| Filtlong | v0.2.0 | microPIPE v0.9 | +| Japsa | v1.9-01a | microPIPE v0.9 | +| Flye | v2.5 | microPIPE v0.9 | +| Racon | v1.4.9 | microPIPE v0.9 | +| Medaka | v0.10.0 | microPIPE v0.9 | +| NextPolish | v1.1.0 | microPIPE v0.9 | +| Circlator | v1.5.5 | microPIPE v0.9 | +| QUAST | v5.0.2 | microPIPE v0.9 | ----- From ed49e5aac82816255df204fc20456b78b8ff7928 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 23 Feb 2022 09:28:38 +1000 Subject: [PATCH 43/46] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 9bf5e29..50f84e7 100644 --- a/README.md +++ b/README.md @@ -354,8 +354,6 @@ S24EC_1P_test.fastq.gz | Illumina reads 1st pair S24EC_2P_test.fastq.gz | Illumina reads 2nd pair barcode01.fastq.gz | ONT fastq reads samples_1.csv | sample sheet for running assembly-only pipeline -samples_1_basecalling.csv | sample sheet for full pipeline -samples_1_basecalling_single_isolate.csv | sample sheet for a single isolate To test the assembly-only pipeline, edit the `sample_1.csv` samplesheet to point to the correct test files. Then run: From 3ebf0d0867d4eb09aa5c3473a2c621d5892e9980 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 23 Feb 2022 09:29:33 +1000 Subject: [PATCH 44/46] Delete samples_1_basecalling.csv --- test_data/samples_1_basecalling.csv | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 test_data/samples_1_basecalling.csv diff --git a/test_data/samples_1_basecalling.csv b/test_data/samples_1_basecalling.csv deleted file mode 100644 index c04f1c5..0000000 --- a/test_data/samples_1_basecalling.csv +++ /dev/null @@ -1,2 +0,0 @@ -barcode_id,sample_id,short_fastq_1,short_fastq_2,genome_size -barcode01,S24,test_data/S24EC_1P_test.fastq.gz,test_data/S24EC_2P_test.fastq.gz,5.5m From 3208f74545279172cd5c80af9716f3d087d7b2b3 Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Wed, 23 Feb 2022 09:29:46 +1000 Subject: [PATCH 45/46] Delete samples_1_basecalling_single_isolate.csv --- test_data/samples_1_basecalling_single_isolate.csv | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 test_data/samples_1_basecalling_single_isolate.csv diff --git a/test_data/samples_1_basecalling_single_isolate.csv b/test_data/samples_1_basecalling_single_isolate.csv deleted file mode 100644 index e317d19..0000000 --- a/test_data/samples_1_basecalling_single_isolate.csv +++ /dev/null @@ -1,2 +0,0 @@ -sample_id,short_fastq_1,short_fastq_2,genome_size -S24,test_data/S24EC_1P_test.fastq.gz,test_data/S24EC_2P_test.fastq.gz,5.5m From e3c6129d6adbe6ccfb3ccaa200fcae76b9fb021f Mon Sep 17 00:00:00 2001 From: Valentine Murigneux Date: Thu, 22 Sep 2022 10:11:32 +1000 Subject: [PATCH 46/46] Add missing --fastq for assembly workflow --- nextflow_batch_template.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/nextflow_batch_template.sh b/nextflow_batch_template.sh index d6c4559..38c8fc2 100644 --- a/nextflow_batch_template.sh +++ b/nextflow_batch_template.sh @@ -34,8 +34,9 @@ out_dir=${dir}/results #nextflow main.nf --demultiplexing --samplesheet ${csv} --outdir ${out_dir} --fastq ${fastq_dir} --datadir ${datadir} #D) Assembly workflow (skip basecalling and demultiplexing step) +fastq_dir=${dir}/fastq csv=${dir}/test_data/samples_1.csv -nextflow main.nf --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir} +nextflow main.nf --samplesheet ${csv} --outdir ${out_dir} --fastq ${fastq_dir} --datadir ${datadir} #to restart the pipeline if something failed, use the -resume flag after correcting the issue #nextflow main.nf -resume --samplesheet ${csv} --outdir ${out_dir} --datadir ${datadir}