From ffabee76f6b17283cac72a1eeb82fbd6a94acc4d Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 9 May 2019 14:44:34 +0200 Subject: [PATCH 001/179] Get base requirements set up --- conf/base.config | 124 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 5 deletions(-) diff --git a/conf/base.config b/conf/base.config index 14c8f70aef..543afdd7a3 100644 --- a/conf/base.config +++ b/conf/base.config @@ -10,8 +10,6 @@ */ process { - - // TODO nf-core: Check the defaults for all processes cpus = { check_max( 1 * task.attempt, 'cpus' ) } memory = { check_max( 8.GB * task.attempt, 'memory' ) } time = { check_max( 2.h * task.attempt, 'time' ) } @@ -20,9 +18,125 @@ process { maxErrors = '-1' maxRetries = 1 - // Process-specific resource requirements - // TODO nf-core: Customise requirements for specific processes. - // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors + //We'll have low, medium, high labels + /* + * ------------------------------------------------- + * Nextflow config file for Sarek + * ------------------------------------------------- + * Generalized resource configuration for clusters + * ------------------------------------------------- + */ + +params { + singleCPUMem = 7.GB // for processes that are using more memory but a single CPU only. Use the 'core' queue for these +} + +process { + cpus = { check_max( 10, 'cpus' ) } + memory = { check_max( 16.GB * task.attempt, 'memory' ) } + time = { check_max( 8.h * task.attempt, 'time' ) } + + errorStrategy = {task.exitStatus == 143 ? 'retry' : 'terminate'} + maxErrors = '-1' + maxRetries = 3 + + withName:MapReads { + memory = { check_max( 60.GB * task.attempt, 'memory' ) } + cpus = { check_max( 16, 'cpus' ) } + } + withName:CreateRecalibrationTable { + cpus = { check_max( 1, 'cpus' ) } + memory = { check_max( 60.GB * task.attempt, 'memory') } + } + withName:MarkDuplicates { + // Actually the -Xmx value should be kept lower, + // and is set through the markdup_java_options + cpus = { check_max( 8, 'cpus' ) } + memory = { check_max( 8.GB * task.attempt, 'memory' ) } + } + withName:MergeBams { + cpus = { check_max( 4, 'cpus') } + memory = {params.singleCPUMem * task.attempt} + time = { check_max( 5.h * task.attempt, 'time' ) } + } + withName:RecalibrateBam { + cpus = { check_max( 2, 'cpus' ) } + memory = { check_max( 7.GB * 2 * task.attempt, 'memory' ) } + time = { check_max( 10.h * task.attempt, 'time' ) } + } + withName:RunAlleleCount { + cpus = { check_max( 1, 'cpus' ) } + memory = { check_max( 14.GB * task.attempt, 'memory' ) } + } + withName:RunAscat { + cpus = { check_max( 1, 'cpus' ) } + memory = { check_max( 14.GB * task.attempt, 'memory' ) } + } + withName:RunBamQCmapped { + cpus = { check_max( 6, 'cpus' ) } + memory = { check_max( 70.GB, 'memory' ) } + } + withName:RunBamQCrecalibrated { + cpus = { check_max( 6, 'cpus' ) } + memory = { check_max( 70.GB, 'memory' ) } + } + withName:RunBcftoolsStats { + cpus = { check_max( 1, 'cpus' ) } + } + withName:RunConvertAlleleCounts { + cpus = { check_max( 1, 'cpus' ) } + memory = { check_max( 14.GB * task.attempt, 'memory' ) } + } + withName:RunFastQC { + cpus = { check_max( 2, 'cpus' ) } // FastQC is only capable of running one thread per fastq file. + errorStrategy = { task.exitStatus == 143 ? 'retry' : 'ignore' } + } + withName:RunFreeBayes { + cpus = { check_max( 1, 'cpus' ) } + memory = { check_max( 8.GB * task.attempt, 'memory' ) } + } + withName:RunHaplotypecaller { + cpus = { check_max( 1, 'cpus' ) } + // Increase memory quadratically + memory = { check_max( 7.GB * 2 * task.attempt, 'memory' ) } + time = { check_max( 5.h * task.attempt, 'time' ) } + } + withName:RunGenotypeGVCFs { + cpus = { check_max( 1, 'cpus' ) } + memory = { check_max( 7.GB * task.attempt, 'memory' ) } + } + withName:RunMultiQC { + errorStrategy = { task.exitStatus == 143 ? 'retry' : 'ignore' } + } + withName:RunMutect2 { + cpus = { check_max( 2, 'cpus' ) } + memory = { check_max( 7.GB * task.attempt, 'memory' ) } + time = { check_max( 5.h * task.attempt, 'time' ) } + } + withName:RunSamtoolsStats { + cpus = { check_max( 2, 'cpus' ) } + time = { check_max( 5.h * task.attempt, 'time' ) } + } + withName:RunSingleManta { + cpus = { check_max( 20, 'cpus' ) } + memory = { check_max( 16.GB, 'memory') } + } + withName:RunSingleStrelka { + cpus = { check_max( 20, 'cpus' ) } + memory = { check_max( 16.GB, 'memory') } + time = { check_max( 5.h * task.attempt, 'time' ) } + } + withName:RunSnpeff { + cpus = { check_max( 1, 'cpus' ) } + } + withName:RunStrelka { + cpus = { check_max( 1, 'cpus' ) } + time = { check_max( 5.h * task.attempt, 'time' ) } + } + withName:RunVEP { + cpus = { check_max( 4, 'cpus' ) } + memory = {check_max (32.GB * task.attempt, 'memory' ) } + } } params { From e223831c37c1f2b6347e587683602348d7d950a0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 8 Oct 2019 15:54:03 +0200 Subject: [PATCH 002/179] nf-core bump-version . 2.5.1dev --- .circleci/config.yml | 8 ++++---- .github/workflows/ci-extra.yml | 2 +- .github/workflows/ci.yml | 2 +- .travis.yml | 2 +- CHANGELOG.md | 2 ++ Dockerfile | 2 +- README.md | 4 ++-- containers/snpeff/Dockerfile | 2 +- containers/snpeff/environment.yml | 2 +- containers/vep/Dockerfile | 2 +- containers/vep/environment.yml | 2 +- environment.yml | 2 +- nextflow.config | 4 ++-- 13 files changed, 19 insertions(+), 17 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1ede7ab8fe..0af952fcb0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,11 +10,11 @@ jobs: - checkout - setup_remote_docker - run: - command: docker build -t nfcore/sareksnpeff:2.5.${GENOME} containers/snpeff/. --build-arg GENOME=${GENOME} --build-arg SNPEFF_CACHE_VERSION=${SNPEFF_CACHE_VERSION} + command: docker build -t nfcore/sareksnpeff:dev.${GENOME} containers/snpeff/. --build-arg GENOME=${GENOME} --build-arg SNPEFF_CACHE_VERSION=${SNPEFF_CACHE_VERSION} - run: command: | echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/sareksnpeff:2.5.${GENOME} + docker push nfcore/sareksnpeff:dev.${GENOME} snpeffgrch38: << : *buildsnpeff @@ -45,10 +45,10 @@ jobs: - checkout - setup_remote_docker - run: - command: docker build -t nfcore/sarekvep:2.5.${GENOME} containers/vep/. --build-arg GENOME=${GENOME} --build-arg SPECIES=${SPECIES} --build-arg VEP_VERSION=${VEP_VERSION} + command: docker build -t nfcore/sarekvep:dev.${GENOME} containers/vep/. --build-arg GENOME=${GENOME} --build-arg SPECIES=${SPECIES} --build-arg VEP_VERSION=${VEP_VERSION} no_output_timeout: 3h - run: - command: echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin ; docker push nfcore/sarekvep:2.5.${GENOME} + command: echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin ; docker push nfcore/sarekvep:dev.${GENOME} vepgrch38: << : *buildvep diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index 040dc11ffe..d37a33aae0 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -18,7 +18,7 @@ jobs: sudo mv nextflow /usr/local/bin/ - name: Download image run: | - ${GITHUB_WORKSPACE}/scripts/download_image.sh -n docker --source-version dev --target-version 2.5 --test ${{ matrix.test }} + ${GITHUB_WORKSPACE}/scripts/download_image.sh -n docker --source-version dev --target-version dev --test ${{ matrix.test }} - name: Run test run: | ${GITHUB_WORKSPACE}/scripts/run_tests.sh --test ${{ matrix.test }} --verbose \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 785fb9269c..22c1031208 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - name: Download and tag image run: | docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:2.5 + docker tag nfcore/sarek:dev nfcore/sarek:dev - name: Run test run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 3598ccf284..450539446e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ before_install: - docker pull nfcore/sarek:dev # Fake the tag locally so that the pipeline runs properly # Looks weird when this is :dev to :dev, but makes sense when testing code for a release (:dev to :1.0.1) - - docker tag nfcore/sarek:dev nfcore/sarek:2.5 + - docker tag nfcore/sarek:dev nfcore/sarek:dev install: # Install Nextflow diff --git a/CHANGELOG.md b/CHANGELOG.md index 080ba18d72..52ca85db3d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## dev + ## [2.5] - Ålkatj Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) template. diff --git a/Dockerfile b/Dockerfile index c012a49d05..8b2563a995 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,4 @@ LABEL authors="Maxime Garcia, Szilveszter Juhos" \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/nf-core-sarek-2.5/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-sarek-2.5.1dev/bin:$PATH diff --git a/README.md b/README.md index 10e2544ca6..8b4cfdff20 100644 --- a/README.md +++ b/README.md @@ -95,10 +95,10 @@ For further information or help, don't hesitate to get in touch on [Slack](https ## Citation -If you use nf-core/sarek for your analysis, please cite the `Sarek` pre-print as follows: +If you use `nf-core/sarek` for your analysis, please cite the `Sarek` pre-print as follows: > Garcia MU, Juhos S, Larsson M, Olason PI, Martin M, Eisfeldt J, DiLorenzo S, Sandgren J, de Ståhl TD, Wirta V, Nistér M, Nystedt B, Käller M. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants**. *bioRxiv*. 2018. p. 316976. [doi: 10.1101/316976](https://www.biorxiv.org/content/10.1101/316976v1). -You can cite the sarek zenodo record for a specific version using the following [DOI: 10.5281/zenodo.3476426 ](https://zenodo.org/badge/latestdoi/184289291) +You can cite the sarek zenodo record for a specific version using the following [DOI: 10.5281/zenodo.3476426](https://zenodo.org/badge/latestdoi/184289291) You can cite the `nf-core` pre-print as follows: > Ewels PA, Peltzer A, Fillinger S, Alneberg JA, Patel H, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. **nf-core: Community curated bioinformatics pipelines**. *bioRxiv*. 2019. p. 610741. [doi: 10.1101/610741](https://www.biorxiv.org/content/10.1101/610741v3). diff --git a/containers/snpeff/Dockerfile b/containers/snpeff/Dockerfile index 3ac9b89dd7..5c52720260 100644 --- a/containers/snpeff/Dockerfile +++ b/containers/snpeff/Dockerfile @@ -7,7 +7,7 @@ LABEL \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/sarek-snpeff-2.5/bin:$PATH +ENV PATH /opt/conda/envs/sarek-snpeff-2.5.1dev/bin:$PATH # Setup default ARG variables ARG GENOME=GRCh38 diff --git a/containers/snpeff/environment.yml b/containers/snpeff/environment.yml index fd93bd1815..2dfdc6f3ff 100644 --- a/containers/snpeff/environment.yml +++ b/containers/snpeff/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: sarek-snpeff-2.5 +name: sarek-snpeff-2.5.1dev channels: - conda-forge - bioconda diff --git a/containers/vep/Dockerfile b/containers/vep/Dockerfile index cfe2d8eeb5..75a8497b3b 100644 --- a/containers/vep/Dockerfile +++ b/containers/vep/Dockerfile @@ -7,7 +7,7 @@ LABEL \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/sarek-vep-2.5/bin:$PATH +ENV PATH /opt/conda/envs/sarek-vep-2.5.1dev/bin:$PATH # Setup default ARG variables ARG GENOME=GRCh38 diff --git a/containers/vep/environment.yml b/containers/vep/environment.yml index b5c73474a6..d426f78a68 100644 --- a/containers/vep/environment.yml +++ b/containers/vep/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: sarek-vep-2.5 +name: sarek-vep-2.5.1dev channels: - conda-forge - bioconda diff --git a/environment.yml b/environment.yml index 2ae3303c97..94ca2d5a19 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-sarek-2.5 +name: nf-core-sarek-2.5.1dev channels: - conda-forge - bioconda diff --git a/nextflow.config b/nextflow.config index 852831b8e4..6ddfb53847 100644 --- a/nextflow.config +++ b/nextflow.config @@ -86,7 +86,7 @@ params { // Container slug. Stable releases should specify release tag! // Developmental code should specify :dev -process.container = 'nfcore/sarek:2.5' +process.container = 'nfcore/sarek:dev' // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -156,7 +156,7 @@ manifest { description = 'An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing' mainScript = 'main.nf' nextflowVersion = '>=19.04.0' - version = '2.5' + version = '2.5.1dev' } // Return the minimum between requirements and a maximum limit to ensure that resource requirements don't go over From 5a1c386844f93519247fb701e758af9468af8f1e Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Wed, 9 Oct 2019 13:44:02 +0200 Subject: [PATCH 003/179] Remove PublishDirMode from test profile (#40) * remove PublishDirMode from test profile --- CHANGELOG.md | 4 ++++ conf/test.config | 3 --- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52ca85db3d..eb7262e651 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## dev +### `Fixed` + +- [#40](https://github.com/nf-core/sarek/pull/40) - Fix issue with `publishDirMode` within `test` profile + ## [2.5] - Ålkatj Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) template. diff --git a/conf/test.config b/conf/test.config index 9c32937aca..9652998f3b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,9 +20,6 @@ params { igenomesIgnore = true genome = 'smallGRCh37' genomes_base = "https://github.com/nf-core/test-datasets/raw/sarek/reference" - - // Use publishDir mode link so that work can be removed - publishDirMode = 'link' } process { From 436af40c27cbad4cc951351430dc83610a70405d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 9 Oct 2019 17:17:12 +0200 Subject: [PATCH 004/179] update all tools --- CHANGELOG.md | 11 +++++++++++ containers/vep/Dockerfile | 2 +- containers/vep/environment.yml | 2 +- docs/containers.md | 18 +++++++++--------- environment.yml | 16 ++++++++-------- 5 files changed, 30 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb7262e651..417b6da2ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## dev +### `Added` + +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `control-freec` from `11.4` to `11.5` +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `ensembl-vep` from `95.2` to `98.2` +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `freebayes` from `1.2.0` to `1.3.1` +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `gatk4` from `4.1.2.0` to `4.1.4.0` +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `manta` from `1.5.0` to `1.6.0` +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `tiddit` from `2.7.1` to `2.8.0` +- [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` + ### `Fixed` - [#40](https://github.com/nf-core/sarek/pull/40) - Fix issue with `publishDirMode` within `test` profile diff --git a/containers/vep/Dockerfile b/containers/vep/Dockerfile index 75a8497b3b..ee617f9f98 100644 --- a/containers/vep/Dockerfile +++ b/containers/vep/Dockerfile @@ -12,7 +12,7 @@ ENV PATH /opt/conda/envs/sarek-vep-2.5.1dev/bin:$PATH # Setup default ARG variables ARG GENOME=GRCh38 ARG SPECIES=homo_sapiens -ARG VEP_VERSION=95 +ARG VEP_VERSION=98 # Download Genome RUN vep_install \ diff --git a/containers/vep/environment.yml b/containers/vep/environment.yml index d426f78a68..831df73abd 100644 --- a/containers/vep/environment.yml +++ b/containers/vep/environment.yml @@ -7,5 +7,5 @@ channels: - defaults dependencies: - - ensembl-vep=95.2 + - ensembl-vep=98.2 - genesplicer=1.0 diff --git a/docs/containers.md b/docs/containers.md index 87b7f05b87..b86347db11 100644 --- a/docs/containers.md +++ b/docs/containers.md @@ -18,22 +18,22 @@ For annotation, the main container can be used, but the cache has to be download - Contain **[AlleleCount](https://github.com/cancerit/alleleCount)** 4.0.2 - Contain **[BCFTools](https://github.com/samtools/bcftools)** 1.9 - Contain **[BWA](https://github.com/lh3/bwa)** 0.7.17 -- Contain **[Control-FREEC](https://github.com/BoevaLab/FREEC)** 11.4 +- Contain **[Control-FREEC](https://github.com/BoevaLab/FREEC)** 11.5 - Contain **[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/)** 0.11.8 -- Contain **[FreeBayes](https://github.com/ekg/freebayes)** 1.2.0 -- Contain **[GATK4](https://github.com/broadinstitute/gatk)** 4.1.2.0 +- Contain **[FreeBayes](https://github.com/ekg/freebayes)** 1.3.1 +- Contain **[GATK4](https://github.com/broadinstitute/gatk)** 4.1.4.0 - Contain **[GeneSplicer](https://ccb.jhu.edu/software/genesplicer/)** 1.0 - Contain **[HTSlib](https://github.com/samtools/htslib)** 1.9 -- Contain **[Manta](https://github.com/Illumina/manta)** 1.5.0 +- Contain **[Manta](https://github.com/Illumina/manta)** 1.6.0 - Contain **[MultiQC](https://github.com/ewels/MultiQC/)** 1.7 -- Contain **[Qualimap](http://qualimap.bioinfo.cipf.es)** 2.2.2b +- Contain **[Qualimap](http://qualimap.bioinfo.cipf.es)** 2.2.2c - Contain **[samtools](https://github.com/samtools/samtools)** 1.9 - Contain **[snpEff](http://snpeff.sourceforge.net/)** 4.3.1t - Contain **[Strelka2](https://github.com/Illumina/strelka)** 2.9.10 -- Contain **[TIDDIT](https://github.com/SciLifeLab/TIDDIT)** 2.7.1 -- Contain **[VCFanno](https://github.com/brentp/vcfanno)** 0.3.1 +- Contain **[TIDDIT](https://github.com/SciLifeLab/TIDDIT)** 2.8.0 +- Contain **[VCFanno](https://github.com/brentp/vcfanno)** 0.3.2 - Contain **[VCFtools](https://vcftools.github.io/index.html)** 0.1.16 -- Contain **[VEP](https://github.com/Ensembl/ensembl-vep)** 95.2 +- Contain **[VEP](https://github.com/Ensembl/ensembl-vep)** 98.2 ### sareksnpeff [![sareksnpeff-docker status](https://img.shields.io/docker/automated/nfcore/sareksnpeff.svg)](https://hub.docker.com/r/nfcore/sareksnpeff) @@ -45,7 +45,7 @@ For annotation, the main container can be used, but the cache has to be download - Based on `nfcore/base:latest` - Contain **[GeneSplicer](https://ccb.jhu.edu/software/genesplicer/)** 1.0 -- Contain **[VEP](https://github.com/Ensembl/ensembl-vep)** 95.2 +- Contain **[VEP](https://github.com/Ensembl/ensembl-vep)** 98.2 - Contain cache for `GRCh37`, `GRCh38`, `GRCm38` or `CanFam3.1` ## Using helper script diff --git a/environment.yml b/environment.yml index 94ca2d5a19..797ba0c1ae 100644 --- a/environment.yml +++ b/environment.yml @@ -10,19 +10,19 @@ dependencies: - bcftools=1.9 - bwa=0.7.17 - cancerit-allelecount=4.0.2 - - control-freec=11.4 - - ensembl-vep=95.2 + - control-freec=11.5 + - ensembl-vep=98.2 - fastqc=0.11.8 - - freebayes=1.2.0 - - gatk4=4.1.2.0 + - freebayes=1.3.1 + - gatk4=4.1.4.0 - genesplicer=1.0 - htslib=1.9 - - manta=1.5.0 + - manta=1.6.0 - multiqc=1.7 - - qualimap=2.2.2b + - qualimap=2.2.2c - samtools=1.9 - snpeff=4.3.1t - strelka=2.9.10 - - tiddit=2.7.1 - - vcfanno=0.3.1 + - tiddit=2.8.0 + - vcfanno=0.3.2 - vcftools=0.1.16 \ No newline at end of file From 0dd946135d77c6051d2090b5b0531e158344cd5a Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Wed, 9 Oct 2019 17:59:01 +0200 Subject: [PATCH 005/179] minor updates + typo fix (#42) * minor updates + typo fix --- CHANGELOG.md | 1 + README.md | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb7262e651..bf85a9f1a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### `Fixed` - [#40](https://github.com/nf-core/sarek/pull/40) - Fix issue with `publishDirMode` within `test` profile +- [#42](https://github.com/nf-core/sarek/pull/42) - Fix typos, and minor updates in `README.md` ## [2.5] - Ålkatj diff --git a/README.md b/README.md index 8b4cfdff20..0de61ba17c 100644 --- a/README.md +++ b/README.md @@ -29,7 +29,7 @@ across multiple compute infrastructures in a very portable manner. Software dependencies are handled using [Conda](https://conda.io/), [Docker](https://www.docker.com) or [Singularity](https://www.sylabs.io/singularity/) - environment/container technologies that provide excellent reproducibility and ease of use. Thus making installation trivial and results highly reproducible. -It's listed on the [Elixir - Tools and Data Services Registry](https://bio.tools/Sarek), [Dockstore](https://dockstore.org/workflows/github.com/SciLifeLab/Sarek/) and [omicX - Bioinformatics tools](https://omictools.com/sarek-tool). +It's listed on the [Elixir - Tools and Data Services Registry](https://bio.tools/Sarek), [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek) and [omicX - Bioinformatics tools](https://omictools.com/sarek-tool). ## Documentation @@ -98,7 +98,7 @@ For further information or help, don't hesitate to get in touch on [Slack](https If you use `nf-core/sarek` for your analysis, please cite the `Sarek` pre-print as follows: > Garcia MU, Juhos S, Larsson M, Olason PI, Martin M, Eisfeldt J, DiLorenzo S, Sandgren J, de Ståhl TD, Wirta V, Nistér M, Nystedt B, Käller M. **Sarek: A portable workflow for whole-genome sequencing analysis of germline and somatic variants**. *bioRxiv*. 2018. p. 316976. [doi: 10.1101/316976](https://www.biorxiv.org/content/10.1101/316976v1). -You can cite the sarek zenodo record for a specific version using the following [DOI: 10.5281/zenodo.3476426](https://zenodo.org/badge/latestdoi/184289291) +You can cite the sarek zenodo record for a specific version using the following [doi: 10.5281/zenodo.3476426](https://zenodo.org/badge/latestdoi/184289291) You can cite the `nf-core` pre-print as follows: > Ewels PA, Peltzer A, Fillinger S, Alneberg JA, Patel H, Wilm A, Garcia MU, Di Tommaso P, Nahnsen S. **nf-core: Community curated bioinformatics pipelines**. *bioRxiv*. 2019. p. 610741. [doi: 10.1101/610741](https://www.biorxiv.org/content/10.1101/610741v3). From 9c977def770a624aae189cfb67a4897f420be1e9 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 10 Oct 2019 09:38:49 +0200 Subject: [PATCH 006/179] fix VEP automated builds --- .circleci/config.yml | 8 ++++---- CHANGELOG.md | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0af952fcb0..582f2750a9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -40,7 +40,7 @@ jobs: environment: GENOME: GRCh37 SPECIES: homo_sapiens - VEP_VERSION: "95" + VEP_VERSION: "98" steps: - checkout - setup_remote_docker @@ -55,21 +55,21 @@ jobs: environment: GENOME: GRCh38 SPECIES: homo_sapiens - VEP_VERSION: "95" + VEP_VERSION: "98" vepgrcm38: << : *buildvep environment: GENOME: GRCm38 SPECIES: mus_musculus - VEP_VERSION: "95" + VEP_VERSION: "98" vepcanfam3_1: << : *buildvep environment: GENOME: CanFam3.1 SPECIES: canis_familiaris - VEP_VERSION: "95" + VEP_VERSION: "98" workflows: version: 2 diff --git a/CHANGELOG.md b/CHANGELOG.md index c9cf5a70a5..436428b1c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#40](https://github.com/nf-core/sarek/pull/40) - Fix issue with `publishDirMode` within `test` profile - [#42](https://github.com/nf-core/sarek/pull/42) - Fix typos, and minor updates in `README.md` +- [#43](https://github.com/nf-core/sarek/pull/43) - Fix automated `VEP` builds with circleCI ## [2.5] - Ålkatj From f0e822531d158042b755a9be42fb33c3e64e66d7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 11 Oct 2019 14:25:51 +0200 Subject: [PATCH 007/179] add location for abstracts --- docs/abstracts/2016-09-KICR.md | 2 +- docs/abstracts/2017-05-ESHG.md | 2 +- docs/abstracts/2018-05-PMC.md | 2 +- docs/abstracts/2018-06-EACR25.md | 2 +- docs/abstracts/2018-06-NPMI.md | 2 +- docs/abstracts/2018-07-JOBIM.md | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/abstracts/2016-09-KICR.md b/docs/abstracts/2016-09-KICR.md index 3b3df35eec..a5758c5288 100644 --- a/docs/abstracts/2016-09-KICR.md +++ b/docs/abstracts/2016-09-KICR.md @@ -1,4 +1,4 @@ -# The XVth KICancer Retreat 2016 +# The XVth KICancer Retreat - Djurö, Sweden, 2016/09 ## Cancer Analysis Workflow Of Tumor/Normal Pairs At The National Genomics Infrastructure Of SciLifeLab diff --git a/docs/abstracts/2017-05-ESHG.md b/docs/abstracts/2017-05-ESHG.md index 76e86db02f..8098600c34 100644 --- a/docs/abstracts/2017-05-ESHG.md +++ b/docs/abstracts/2017-05-ESHG.md @@ -1,4 +1,4 @@ -# European Human Genetics Conference 2017 +# European Human Genetics Conference - Copenhagen, Denmark, 2017/05 ## CAW - Cancer Analysis Workflow to process normal/tumor WGS data diff --git a/docs/abstracts/2018-05-PMC.md b/docs/abstracts/2018-05-PMC.md index 7e25e269b4..6f4ab2a166 100644 --- a/docs/abstracts/2018-05-PMC.md +++ b/docs/abstracts/2018-05-PMC.md @@ -1,4 +1,4 @@ -# Keystone Symposia - Precision Medicine in Cancer +# Keystone Symposia - Precision Medicine in Cancer - Stockholm, Sweden, 2018/05 ## Sarek, a workflow for WGS analysis of germline and somatic mutations diff --git a/docs/abstracts/2018-06-EACR25.md b/docs/abstracts/2018-06-EACR25.md index 57af817151..6a4be1c8df 100644 --- a/docs/abstracts/2018-06-EACR25.md +++ b/docs/abstracts/2018-06-EACR25.md @@ -1,4 +1,4 @@ -# 25th Biennial Congress Of The European Association For Cancer Research 2018 +# 25th Biennial Congress Of The European Association For Cancer Research - Amsterdam, Netherlands, 2018/06-07 ## Somatic and germline calls from tumour/normal whole genome data: bioinformatics workflow for reproducible research diff --git a/docs/abstracts/2018-06-NPMI.md b/docs/abstracts/2018-06-NPMI.md index ef15cc035f..fbb3d97d8c 100644 --- a/docs/abstracts/2018-06-NPMI.md +++ b/docs/abstracts/2018-06-NPMI.md @@ -1,4 +1,4 @@ -# The Nordic Precision Medicine Initiative - Meeting No 5 +# The Nordic Precision Medicine Initiative - Meeting No 5 - Reykjavìk, Iceland, 2018/06 ## Sarek, a portable workflow for WGS analysis of germline and somatic mutations diff --git a/docs/abstracts/2018-07-JOBIM.md b/docs/abstracts/2018-07-JOBIM.md index 19e42d372c..9a6257cddb 100644 --- a/docs/abstracts/2018-07-JOBIM.md +++ b/docs/abstracts/2018-07-JOBIM.md @@ -1,4 +1,4 @@ -# Journées Ouvertes en Biologie, Informatique et Mathématiques 2018 +# Journées Ouvertes en Biologie, Informatique et Mathématiques - Marseille, France, 2018/07 ## Sarek, a portable workflow for WGS analysis of germline and somatic mutations From 2eef74344afd9e8e5af12121bfd583cd84d7025f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 11 Oct 2019 14:26:06 +0200 Subject: [PATCH 008/179] remove reference to old buil.nf script --- docs/reference.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/reference.md b/docs/reference.md index 1d5d10c729..6240efe77f 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -12,8 +12,8 @@ Settings in `igenomes.config` can be tailored to your needs. To speed up some preprocessing and variant calling processes, the reference is chopped into smaller pieces. The intervals are chromosomes cut at their centromeres (so each chromosome arm processed separately) also additional unassigned contigs. -We are ignoring the hs37d5 contig that contains concatenated decoy sequences. -Parts of preprocessing and variant calling are done by this intervals, and the different resulting files are then merged. +We are ignoring the `hs37d5` contig that contains concatenated decoy sequences. +Parts of preprocessing and variant calling are done by these intervals, and the different resulting files are then merged. This can parallelize processes, and push down wall clock time significantly. The calling intervals can be defined using a `.list` or a `.bed` file. @@ -36,11 +36,3 @@ First, when there are multiple consecutive intervals in the file that take littl Second, the jobs with largest processing time are started first, which reduces wall-clock time. If no runtime is given, a time of 1000 nucleotides per second is assumed. Actual figures vary from 2 nucleotides/second to 30000 nucleotides/second. - -## build.nf - -The [`build.nf`](#buildnf) script is used to build reference needed for smallGRCh37. - -```bash -nextflow run build.nf -``` From 5df80a58a888e64c065ec19b90fb344461670799 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 11 Oct 2019 14:29:48 +0200 Subject: [PATCH 009/179] update CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 436428b1c0..06ddb12e8a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `tiddit` from `2.7.1` to `2.8.0` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` +- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts. + +### `Removed` + +- [#46](https://github.com/nf-core/sarek/pull/46) - Remove mention of old `build.nf` script which was included in `main.nf` ### `Fixed` From 318a7abefc67b9bc0a7e9625b4e6e7c5f823cb8a Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Fri, 11 Oct 2019 15:25:04 +0200 Subject: [PATCH 010/179] Update docs/reference.md Co-Authored-By: Szilveszter Juhos --- docs/reference.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/reference.md b/docs/reference.md index 6240efe77f..7fe7b43ad1 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -35,4 +35,12 @@ The runtime estimate is used in two different ways. First, when there are multiple consecutive intervals in the file that take little time to compute, they are processed as a single job, thus reducing the number of processes that needs to be spawned. Second, the jobs with largest processing time are started first, which reduces wall-clock time. If no runtime is given, a time of 1000 nucleotides per second is assumed. -Actual figures vary from 2 nucleotides/second to 30000 nucleotides/second. + Actual figures vary from 2 nucleotides/second to 30000 nucleotides/second. + +### Working with whole exom (WES) or panel data + +The `--targetBED` parameter does _not_ imply that the workflow is running alignment or variant calling only for the supplied targets. +Instead, we are aligning for the whole genome, and selecting variants only at the very end by intersecting with the provided target file. +Adding every exon as an interval in case of WES can generate >200K processes or jobs, much more forks, and similar number of directories in the Nextflow work directory. +Furthermore, primers and/or baits are not 100% specific, (certainly not for MHC and KIR, etc.), quite likely there going to be reads mapping to multiple locations. +If you are certain that the target is unique for your genome (all the reads will certainly map to only one location), and aligning to the whole genome is an overkill, better to change the reference itself. From c8f748f83644321709e0e69bf843cfcec2d98c1d Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Fri, 11 Oct 2019 15:25:24 +0200 Subject: [PATCH 011/179] Update docs/reference.md --- docs/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference.md b/docs/reference.md index 7fe7b43ad1..071d9c385f 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -35,7 +35,7 @@ The runtime estimate is used in two different ways. First, when there are multiple consecutive intervals in the file that take little time to compute, they are processed as a single job, thus reducing the number of processes that needs to be spawned. Second, the jobs with largest processing time are started first, which reduces wall-clock time. If no runtime is given, a time of 1000 nucleotides per second is assumed. - Actual figures vary from 2 nucleotides/second to 30000 nucleotides/second. +Actual figures vary from 2 nucleotides/second to 30000 nucleotides/second. ### Working with whole exom (WES) or panel data From 444584714b45c638d3458ebb6c064e90e2c81906 Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Fri, 11 Oct 2019 15:26:24 +0200 Subject: [PATCH 012/179] Update docs/reference.md --- docs/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference.md b/docs/reference.md index 071d9c385f..5c47b7dddb 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -37,7 +37,7 @@ Second, the jobs with largest processing time are started first, which reduces w If no runtime is given, a time of 1000 nucleotides per second is assumed. Actual figures vary from 2 nucleotides/second to 30000 nucleotides/second. -### Working with whole exom (WES) or panel data +### Working with whole exome (WES) or panel data The `--targetBED` parameter does _not_ imply that the workflow is running alignment or variant calling only for the supplied targets. Instead, we are aligning for the whole genome, and selecting variants only at the very end by intersecting with the provided target file. From f1483acfb02af4aa90ccf9d538b5283f36c0039b Mon Sep 17 00:00:00 2001 From: Maxime Garcia Date: Fri, 11 Oct 2019 15:38:50 +0200 Subject: [PATCH 013/179] Worfklow (#45) * Add workflow figure * Include workflow figure in readme * Update CHANGELOG --- .github/markdownlint.yml | 3 +- CHANGELOG.md | 1 + README.md | 7 +- docs/images/sarek_workflow.png | Bin 0 -> 50856 bytes docs/images/sarek_workflow.svg | 3675 ++++++++++++++++++++++++++++++++ 5 files changed, 3683 insertions(+), 3 deletions(-) create mode 100644 docs/images/sarek_workflow.png create mode 100644 docs/images/sarek_workflow.svg diff --git a/.github/markdownlint.yml b/.github/markdownlint.yml index 8f97a170e8..9a0066d6f0 100644 --- a/.github/markdownlint.yml +++ b/.github/markdownlint.yml @@ -9,4 +9,5 @@ no-duplicate-header: siblings_only: true no-inline-html: allowed_elements: - - img \ No newline at end of file + - img + - p \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 436428b1c0..e39a31024d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `tiddit` from `2.7.1` to `2.8.0` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` +- [#45](https://github.com/nf-core/sarek/pull/45) - Include Workflow figure in `README.md` ### `Fixed` diff --git a/README.md b/README.md index 0de61ba17c..d689576f19 100644 --- a/README.md +++ b/README.md @@ -15,10 +15,9 @@ [![Join us on Slack](https://img.shields.io/badge/slack-nfcore/sarek-blue.svg)](https://nfcore.slack.com/messages/CGFUX04HZ/) - ## Introduction - + Previously known as the Cancer Analysis Workflow (CAW), Sarek is a workflow designed to run analyses on whole genome or targeted sequencing data from regular samples or tumour / normal pairs and could include additional relapses. @@ -29,6 +28,10 @@ across multiple compute infrastructures in a very portable manner. Software dependencies are handled using [Conda](https://conda.io/), [Docker](https://www.docker.com) or [Singularity](https://www.sylabs.io/singularity/) - environment/container technologies that provide excellent reproducibility and ease of use. Thus making installation trivial and results highly reproducible. +

+ +

+ It's listed on the [Elixir - Tools and Data Services Registry](https://bio.tools/Sarek), [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek) and [omicX - Bioinformatics tools](https://omictools.com/sarek-tool). ## Documentation diff --git a/docs/images/sarek_workflow.png b/docs/images/sarek_workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f019de0cd8cec8f39e17cfdc182eefb16a9160 GIT binary patch literal 50856 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 + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +r + + + + + + + + +fastqfastqfastqbambambamvcfvcfvcfBased on GATK Best PracticesPreprocessing + + +• HaplotypeCaller Strelka2• Manta, TIDDITVariant Calling• Freebayes, Mutect2 Strelka2• Manta• ASCAT, Control-FREECsnpEff, VEPsnpEff, VEPAnnotation + + +Reports + + +2.5 \ No newline at end of file From 2b2f7e8fdcb5651ea80f4de7c691ce29ae9a94b1 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 21 Oct 2019 10:07:13 +0200 Subject: [PATCH 014/179] add minimal genome and update some processes --- conf/genomes.config | 4 +++ main.nf | 78 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 7d7527b21a..d9ffcef42c 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -58,5 +58,9 @@ params { snpeffDb = "GRCh37.75" vepCacheVersion = "95" } + 'minimalGRCh37' { + fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" + knownIndels = "${params.genomes_base}/dbsnp_138.b37.small.vcf.gz" + } } } diff --git a/main.nf b/main.nf index ffe3b12b7d..140c851af9 100644 --- a/main.nf +++ b/main.nf @@ -518,7 +518,7 @@ process CreateIntervalBeds { output: file '*.bed' into bedIntervals mode flatten - when: step != 'annotate' + when: params.intervals && step != 'annotate' script: // If the interval file is BED format, the fifth column is interpreted to @@ -762,7 +762,10 @@ if ('markduplicates' in skipQC) markDuplicatesReport.close() duplicateMarkedBams = duplicateMarkedBams.dump(tag:'MD BAM') markDuplicatesReport = markDuplicatesReport.dump(tag:'MD Report') -(bamMD, bamMDToJoin) = duplicateMarkedBams.into(2) +(bamMD, bamBaseRecalibratorNoInt, bamMDToJoin) = duplicateMarkedBams.into(3) + +// if (params.intervals) bamBaseRecalibratorNoInt.close() + bamBaseRecalibrator = bamMD.combine(intBaseRecalibrator) bamBaseRecalibrator = bamBaseRecalibrator.dump(tag:'BAM FOR BASERECALIBRATOR') @@ -791,7 +794,8 @@ process BaseRecalibrator { when: step == 'mapping' script: - known = knownIndels.collect{"--known-sites ${it}"}.join(' ') + dbsnpOptions = params.dbsnp ? "--known-sites ${dbsnp}" : "" + knownOptions = params.knownIndels ? knownIndels.collect{"--known-sites ${it}"}.join(' ') : "" // TODO: --use-original-qualities ??? """ gatk --java-options -Xmx${task.memory.toGiga()}g \ @@ -801,8 +805,44 @@ process BaseRecalibrator { --tmp-dir /tmp \ -R ${fasta} \ -L ${intervalBed} \ - --known-sites ${dbsnp} \ - ${known} \ + ${dbsnpOptions} \ + ${knownOptions} \ + --verbosity INFO + """ +} + +// STEP 3': CREATING RECALIBRATION TABLES WITHOUT INTERVALS + +process BaseRecalibratorNoIntervals { + label 'memory_max' + label 'cpus_1' + + tag {idPatient + "-" + idSample} + + input: + set idPatient, idSample, file(bam), file(bai) from bamBaseRecalibratorNoInt + file(fasta) from ch_fasta + file(dict) from ch_dict + file(fastaFai) from ch_fastaFai + file(knownIndels) from ch_knownIndels + file(knownIndelsIndex) from ch_knownIndelsIndex + + output: + set idPatient, idSample, file("${idSample}.recal.table") into bamMDnoInt + + when: step == 'mapping' + + script: + knownOptions = params.knownIndels ? knownIndels.collect{"--known-sites ${it}"}.join(' ') : "" + // TODO: --use-original-qualities ??? + """ + gatk --java-options -Xmx${task.memory.toGiga()}g \ + BaseRecalibrator \ + -I ${bam} \ + -O ${idSample}.recal.table \ + --tmp-dir /tmp \ + -R ${fasta} \ + ${knownOptions} \ --verbosity INFO """ } @@ -894,6 +934,34 @@ process ApplyBQSR { bamMergeBamRecal = bamMergeBamRecal.groupTuple(by:[0, 1]) +// STEP 4': RECALIBRATING WITHOUT INTERVALS + +process ApplyBQSRnoIntervals { + label 'memory_singleCPU_2_task' + label 'cpus_2' + + tag {idPatient + "-" + idSample} + + input: + set idPatient, idSample, file(bam), file(bai), file(recalibrationReport) from bamMDnoInt + file(dict) from ch_dict + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + + output: + set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalNoInt + + script: + """ + gatk --java-options -Xmx${task.memory.toGiga()}g \ + ApplyBQSR \ + -R ${fasta} \ + --input ${bam} \ + --output ${idSample}.recal.bam \ + --bqsr-recal-file ${recalibrationReport} + """ +} + // STEP 4.5: MERGING THE RECALIBRATED BAM FILES process MergeBamRecal { From 065ae5054c9cbefdc1d7900a3f64e473f8835011 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 21 Oct 2019 12:10:45 +0200 Subject: [PATCH 015/179] Start adding mouse data --- conf/igenomes.config | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/conf/igenomes.config b/conf/igenomes.config index 79f7b85484..1f04ab3074 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -47,5 +47,24 @@ params { snpeffDb = "GRCh38.86" vepCacheVersion = "95" } + 'GRCm38' { + acLoci = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/GRCm38.loci" + acLociGC = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/GRCm38.loci.gc" + bwaIndex = "${params.igenomes_base}/Mus_musculus/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + chrDir = "${params.igenomes_base}/Mus_musculus/Sequence/Chromosomes" + chrLength = "${params.igenomes_base}/Mus_musculus/Sequence/Length/Homo_sapiens_assembly38.len" + dbsnp = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/dbsnp_146.hg38.vcf.gz" + dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/dbsnp_146.hg38.vcf.gz.tbi" + dict = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.dict" + fasta = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fa" + fastaFai = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fai" + germlineResource = "${params.igenomes_base}/Mus_musculus/Annotation/GermlineResource/gnomAD.r2.1.1.GRCh38.PASS.AC.AF.only.vcf.gz" + germlineResourceIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GermlineResource/gnomAD.r2.1.1.GRCh38.PASS.AC.AF.only.vcf.gz.tbi" + intervals = "${params.igenomes_base}/Mus_musculus/Annotation/intervals/wgs_calling_regions.hg38.bed" + knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz" + knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" + snpeffDb = "GRCh38.86" + vepCacheVersion = "95" + } } } From 77ec187a3ecadce02f158a447775b007cda57ada Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 21 Oct 2019 15:47:37 +0200 Subject: [PATCH 016/179] Update iGenomes.config --- conf/igenomes.config | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 1f04ab3074..6acb25efd7 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -48,21 +48,21 @@ params { vepCacheVersion = "95" } 'GRCm38' { - acLoci = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/GRCm38.loci" - acLociGC = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/GRCm38.loci.gc" + acLoci = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/fake.loci" + acLociGC = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/fake.loci.gc" bwaIndex = "${params.igenomes_base}/Mus_musculus/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" chrDir = "${params.igenomes_base}/Mus_musculus/Sequence/Chromosomes" chrLength = "${params.igenomes_base}/Mus_musculus/Sequence/Length/Homo_sapiens_assembly38.len" - dbsnp = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/dbsnp_146.hg38.vcf.gz" - dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/dbsnp_146.hg38.vcf.gz.tbi" + dbsnp = "${params.igenomes_base}/Mus_musculus/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz" + dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" dict = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.dict" fasta = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fa" fastaFai = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fai" germlineResource = "${params.igenomes_base}/Mus_musculus/Annotation/GermlineResource/gnomAD.r2.1.1.GRCh38.PASS.AC.AF.only.vcf.gz" germlineResourceIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GermlineResource/gnomAD.r2.1.1.GRCh38.PASS.AC.AF.only.vcf.gz.tbi" intervals = "${params.igenomes_base}/Mus_musculus/Annotation/intervals/wgs_calling_regions.hg38.bed" - knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz" - knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" + knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" + knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.snps_all.dbSNP142.vcf.gz" snpeffDb = "GRCh38.86" vepCacheVersion = "95" } From db69d295695a210537b25bfb355fab6d311e886a Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 21 Oct 2019 15:48:10 +0200 Subject: [PATCH 017/179] Add tbi --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 6acb25efd7..069ae30881 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -62,7 +62,7 @@ params { germlineResourceIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GermlineResource/gnomAD.r2.1.1.GRCh38.PASS.AC.AF.only.vcf.gz.tbi" intervals = "${params.igenomes_base}/Mus_musculus/Annotation/intervals/wgs_calling_regions.hg38.bed" knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" - knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.snps_all.dbSNP142.vcf.gz" + knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCh38.86" vepCacheVersion = "95" } From 8995981e88c8154684ea45393b8f3f3b7d47d1be Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 21 Oct 2019 16:00:48 +0200 Subject: [PATCH 018/179] Drop ASCAT files --- conf/igenomes.config | 2 -- 1 file changed, 2 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 069ae30881..a04e2e5397 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -48,8 +48,6 @@ params { vepCacheVersion = "95" } 'GRCm38' { - acLoci = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/fake.loci" - acLociGC = "${params.igenomes_base}/Mus_musculus/Annotation/ASCAT/fake.loci.gc" bwaIndex = "${params.igenomes_base}/Mus_musculus/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" chrDir = "${params.igenomes_base}/Mus_musculus/Sequence/Chromosomes" chrLength = "${params.igenomes_base}/Mus_musculus/Sequence/Length/Homo_sapiens_assembly38.len" From d1a2e13ac7461e73defa53729772e91663693e5a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 22 Oct 2019 15:48:02 +0200 Subject: [PATCH 019/179] apply changes from 2.5.1 to dev --- .github/workflows/branch.yml | 2 +- .travis.yml | 2 +- CHANGELOG.md | 10 ++++++++++ Dockerfile | 2 +- Jenkinsfile | 2 +- containers/snpeff/Dockerfile | 2 +- containers/snpeff/environment.yml | 2 +- containers/vep/Dockerfile | 2 +- containers/vep/environment.yml | 2 +- docs/annotation.md | 4 ++-- docs/install_bianca.md | 4 ++-- environment.yml | 2 +- main.nf | 16 ++++++++-------- nextflow.config | 2 +- scripts/download_image.sh | 5 +---- 15 files changed, 33 insertions(+), 26 deletions(-) diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 58a41ff689..174e995a05 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,4 +13,4 @@ jobs: - uses: actions/checkout@v1 - name: Check PRs run: | - [[ $(git remote get-url origin) == *nf-core/sarek ]] && [ ${GITHUB_BASE_REF} = "master" ] && [ ${GITHUB_HEAD_REF} = "dev" ] + { [[ $(git remote get-url origin) == *nf-core/sarek ]] && [[ ${GITHUB_BASE_REF} = "master" ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == patch* ]] \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 450539446e..b270cdf879 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ matrix: before_install: # PRs to master are only ok if coming from dev branch - - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && ([ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ] || [ $TRAVIS_PULL_REQUEST_BRANCH = "patch" ]))' + - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && [ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ]) || [ $TRAVIS_PULL_REQUEST_BRANCH = "patch" ]' # Pull the docker image first so the test doesn't wait for this - docker pull nfcore/sarek:dev # Fake the tag locally so that the pipeline runs properly diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f1d71a6ea..61afc594d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,16 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#42](https://github.com/nf-core/sarek/pull/42) - Fix typos, and minor updates in `README.md` - [#43](https://github.com/nf-core/sarek/pull/43) - Fix automated `VEP` builds with circleCI +## [2.5.1] - Årjep-Ålkatjjekna + +Årjep-Ålkatjjekna is one of the two glaciers of the Ålkatj Massif. + +### `Fixed` + +- [#48](https://github.com/nf-core/sarek/issues/48) - Fix `singularity.autoMounts` issue. +- [#49](https://github.com/nf-core/sarek/issues/49) - Use correct tag for annotation containers. +- [#50](https://github.com/nf-core/sarek/issues/50) - Fix paths for scripts. + ## [2.5] - Ålkatj Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) template. diff --git a/Dockerfile b/Dockerfile index 8b2563a995..2179ebbdda 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,4 @@ LABEL authors="Maxime Garcia, Szilveszter Juhos" \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/nf-core-sarek-2.5.1dev/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-sarek-2.5.2dev/bin:$PATH diff --git a/Jenkinsfile b/Jenkinsfile index 924e454f0d..00c743cde2 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,7 +8,7 @@ pipeline { stages { stage('Docker setup') { steps { - sh "./scripts/download_image.sh -n docker -t ALL --source-version dev --target-version 2.5 -g smallGRCh37" + sh "./scripts/download_image.sh -n docker -t ALL --source-version dev --target-version dev -g smallGRCh37" } } stage('Germline') { diff --git a/containers/snpeff/Dockerfile b/containers/snpeff/Dockerfile index 5c52720260..cbd68c52d8 100644 --- a/containers/snpeff/Dockerfile +++ b/containers/snpeff/Dockerfile @@ -7,7 +7,7 @@ LABEL \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/sarek-snpeff-2.5.1dev/bin:$PATH +ENV PATH /opt/conda/envs/sarek-snpeff-2.5.2dev/bin:$PATH # Setup default ARG variables ARG GENOME=GRCh38 diff --git a/containers/snpeff/environment.yml b/containers/snpeff/environment.yml index 2dfdc6f3ff..5e73063ece 100644 --- a/containers/snpeff/environment.yml +++ b/containers/snpeff/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: sarek-snpeff-2.5.1dev +name: sarek-snpeff-2.5.2dev channels: - conda-forge - bioconda diff --git a/containers/vep/Dockerfile b/containers/vep/Dockerfile index ee617f9f98..562b770bef 100644 --- a/containers/vep/Dockerfile +++ b/containers/vep/Dockerfile @@ -7,7 +7,7 @@ LABEL \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/sarek-vep-2.5.1dev/bin:$PATH +ENV PATH /opt/conda/envs/sarek-vep-2.5.2dev/bin:$PATH # Setup default ARG variables ARG GENOME=GRCh38 diff --git a/containers/vep/environment.yml b/containers/vep/environment.yml index 831df73abd..993a963ab0 100644 --- a/containers/vep/environment.yml +++ b/containers/vep/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: sarek-vep-2.5.1dev +name: sarek-vep-2.5.2dev channels: - conda-forge - bioconda diff --git a/docs/annotation.md b/docs/annotation.md index 8e426e2140..bec92ff7d6 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -63,7 +63,7 @@ An helper script has been designed to help downloading CADD files. Such files are meant to be share between multiple users, so this script is mainly meant for people administrating servers, clusters and advanced users. ```bash -nextflow run build.nf --cadd_cache /Path/To/CADDcache --cadd_version --genome +nextflow run downloadcache.nf --cadd_cache /Path/To/CADDcache --cadd_version --genome ``` ## Using VEP GeneSplicer plugin @@ -75,5 +75,5 @@ To enable the use of the VEP GeneSplicer plugin: Example: ```bash -nextflow run annotate.nf --tools VEP --sample file.vcf.gz --genesplicer +nextflow run nf-core/sarek/main.nf --step annotate --tools VEP --sample file.vcf.gz --genesplicer ``` diff --git a/docs/install_bianca.md b/docs/install_bianca.md index 5bb8c176c8..6cc0b51960 100644 --- a/docs/install_bianca.md +++ b/docs/install_bianca.md @@ -92,10 +92,10 @@ You can either download nf-core/sarek on your computer or on `rackham`, make an > pip install git-archive-all # If you used --user before, you might want to do that here too > pip install git-archive-all --user -> ./scripts/makeSnapshot.sh --include-test-data --include-configs +> ./scripts/make_snapshot.sh --include-test-data --include-configs # Or you can just include nf-core/sarek: -> ./scripts/makeSnapshot.sh +> ./scripts/make_snapshot.sh # You will get this message in your terminal Wrote sarek-[snapID].tar.gz diff --git a/environment.yml b/environment.yml index 797ba0c1ae..f1858415aa 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-sarek-2.5.1dev +name: nf-core-sarek-2.5.2dev channels: - conda-forge - bioconda diff --git a/main.nf b/main.nf index ffe3b12b7d..204f315b4d 100644 --- a/main.nf +++ b/main.nf @@ -1983,12 +1983,12 @@ process ControlFreecViz { when: 'controlfreec' in tools """ - cat /opt/conda/envs/sarek-${workflow.manifest.version}/bin/assess_significance.R | R --slave --args ${cnvTumor} ${ratioTumor} - cat /opt/conda/envs/sarek-${workflow.manifest.version}/bin/assess_significance.R | R --slave --args ${cnvNormal} ${ratioNormal} - cat /opt/conda/envs/sarek-${workflow.manifest.version}/bin/makeGraph.R | R --slave --args 2 ${ratioTumor} ${bafTumor} - cat /opt/conda/envs/sarek-${workflow.manifest.version}/bin/makeGraph.R | R --slave --args 2 ${ratioNormal} ${bafNormal} - perl /opt/conda/envs/sarek-${workflow.manifest.version}/bin/freec2bed.pl -f ${ratioTumor} > ${idSampleTumor}.bed - perl /opt/conda/envs/sarek-${workflow.manifest.version}/bin/freec2bed.pl -f ${ratioNormal} > ${idSampleNormal}.bed + cat /opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/assess_significance.R | R --slave --args ${cnvTumor} ${ratioTumor} + cat /opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/assess_significance.R | R --slave --args ${cnvNormal} ${ratioNormal} + cat /opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/makeGraph.R | R --slave --args 2 ${ratioTumor} ${bafTumor} + cat /opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/makeGraph.R | R --slave --args 2 ${ratioNormal} ${bafNormal} + perl /opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/freec2bed.pl -f ${ratioTumor} > ${idSampleTumor}.bed + perl /opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/freec2bed.pl -f ${ratioNormal} > ${idSampleNormal}.bed """ } @@ -2249,7 +2249,7 @@ process VEP { genome = params.genome == 'smallGRCh37' ? 'GRCh37' : params.genome dir_cache = (params.vep_cache && params.annotation_cache) ? " \${PWD}/${dataDir}" : "/.vep" cadd = (params.cadd_cache && params.cadd_WG_SNVs && params.cadd_InDels) ? "--plugin CADD,whole_genome_SNVs.tsv.gz,InDels.tsv.gz" : "" - genesplicer = params.genesplicer ? "--plugin GeneSplicer,/opt/conda/envs/sarek-${workflow.manifest.version}/bin/genesplicer,/opt/conda/envs/sarek-${workflow.manifest.version}/share/genesplicer-1.0-1/human,context=200,tmpdir=\$PWD/${reducedVCF}" : "--offline" + genesplicer = params.genesplicer ? "--plugin GeneSplicer,/opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/genesplicer,/opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/share/genesplicer-1.0-1/human,context=200,tmpdir=\$PWD/${reducedVCF}" : "--offline" """ mkdir ${reducedVCF} @@ -2310,7 +2310,7 @@ process VEPmerge { genome = params.genome == 'smallGRCh37' ? 'GRCh37' : params.genome dir_cache = (params.vep_cache && params.annotation_cache) ? " \${PWD}/${dataDir}" : "/.vep" cadd = (params.cadd_cache && params.cadd_WG_SNVs && params.cadd_InDels) ? "--plugin CADD,whole_genome_SNVs.tsv.gz,InDels.tsv.gz" : "" - genesplicer = params.genesplicer ? "--plugin GeneSplicer,/opt/conda/envs/sarek-${workflow.manifest.version}/bin/genesplicer,/opt/conda/envs/sarek-${workflow.manifest.version}/share/genesplicer-1.0-1/human,context=200,tmpdir=\$PWD/${reducedVCF}" : "--offline" + genesplicer = params.genesplicer ? "--plugin GeneSplicer,/opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/bin/genesplicer,/opt/conda/envs/nf-core-sarek-${workflow.manifest.version}/share/genesplicer-1.0-1/human,context=200,tmpdir=\$PWD/${reducedVCF}" : "--offline" """ mkdir ${reducedVCF} diff --git a/nextflow.config b/nextflow.config index 6ddfb53847..0f9dfeb01a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -115,8 +115,8 @@ profiles { singularity.enabled = false } singularity { - autoMounts = true docker.enabled = false + singularity.autoMounts = true singularity.enabled = true } test { includeConfig 'conf/test.config' } diff --git a/scripts/download_image.sh b/scripts/download_image.sh index 00892c09b3..b4ce89205b 100755 --- a/scripts/download_image.sh +++ b/scripts/download_image.sh @@ -80,7 +80,4 @@ then get_image sarekvep ${VERSION}.${SOURCEGENOME} ${TARGETVERSION}.${GENOME} fi -if ! [[ ANNOTATEBOTH,ANNOTATESNPEFF,ANNOTATEVEP,LINT,SNPEFF,VEP =~ $TEST ]] -then - get_image sarek ${VERSION} ${TARGETVERSION} -fi +get_image sarek ${VERSION} ${TARGETVERSION} \ No newline at end of file From a0179d42e38653cde80ee0db9486bc4477840892 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 22 Oct 2019 15:52:32 +0200 Subject: [PATCH 020/179] bump version to 2.5.2dev --- .travis.yml | 2 +- nextflow.config | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index b270cdf879..450539446e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,7 +9,7 @@ matrix: before_install: # PRs to master are only ok if coming from dev branch - - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && [ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ]) || [ $TRAVIS_PULL_REQUEST_BRANCH = "patch" ]' + - '[ $TRAVIS_PULL_REQUEST = "false" ] || [ $TRAVIS_BRANCH != "master" ] || ([ $TRAVIS_PULL_REQUEST_SLUG = $TRAVIS_REPO_SLUG ] && ([ $TRAVIS_PULL_REQUEST_BRANCH = "dev" ] || [ $TRAVIS_PULL_REQUEST_BRANCH = "patch" ]))' # Pull the docker image first so the test doesn't wait for this - docker pull nfcore/sarek:dev # Fake the tag locally so that the pipeline runs properly diff --git a/nextflow.config b/nextflow.config index 0f9dfeb01a..4632a988a6 100644 --- a/nextflow.config +++ b/nextflow.config @@ -156,7 +156,7 @@ manifest { description = 'An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing' mainScript = 'main.nf' nextflowVersion = '>=19.04.0' - version = '2.5.1dev' + version = '2.5.2dev' } // Return the minimum between requirements and a maximum limit to ensure that resource requirements don't go over From 7a6650e3596cc282a4eca44dee2812991d74ece5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 22 Oct 2019 15:57:02 +0200 Subject: [PATCH 021/179] update CHANGELOG --- CHANGELOG.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61afc594d8..c42715a89b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `tiddit` from `2.7.1` to `2.8.0` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` -- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts. +- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts + +### `Changed` + +- [#54](https://github.com/nf-core/sarek/pull/54) - Bump version to `2.5.2dev` ### `Removed` @@ -29,11 +33,16 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#40](https://github.com/nf-core/sarek/pull/40) - Fix issue with `publishDirMode` within `test` profile - [#42](https://github.com/nf-core/sarek/pull/42) - Fix typos, and minor updates in `README.md` - [#43](https://github.com/nf-core/sarek/pull/43) - Fix automated `VEP` builds with circleCI +- [#54](https://github.com/nf-core/sarek/pull/54) - Apply fixes from release `2.5.1` ## [2.5.1] - Årjep-Ålkatjjekna Årjep-Ålkatjjekna is one of the two glaciers of the Ålkatj Massif. +### `Added` + +- [#53](https://github.com/nf-core/sarek/pull/53) - Release `2.5.1` + ### `Fixed` - [#48](https://github.com/nf-core/sarek/issues/48) - Fix `singularity.autoMounts` issue. From a7cb0f11712efa5541d8fee1de4d6f82034c532b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 28 Oct 2019 13:12:43 +0100 Subject: [PATCH 022/179] update tiddit to 2.8.1 --- CHANGELOG.md | 10 +++++----- docs/containers.md | 2 +- environment.yml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c42715a89b..6a8e7c2d25 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,18 +9,18 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### `Added` +- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts + +### `Changed` + - [#41](https://github.com/nf-core/sarek/pull/41) - Update `control-freec` from `11.4` to `11.5` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `ensembl-vep` from `95.2` to `98.2` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `freebayes` from `1.2.0` to `1.3.1` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `gatk4` from `4.1.2.0` to `4.1.4.0` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `manta` from `1.5.0` to `1.6.0` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `tiddit` from `2.7.1` to `2.8.0` +- [#41](https://github.com/nf-core/sarek/pull/41), [#55](https://github.com/nf-core/sarek/pull/55) - Update `tiddit` from `2.7.1` to `2.8.1` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` -- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts - -### `Changed` - - [#54](https://github.com/nf-core/sarek/pull/54) - Bump version to `2.5.2dev` ### `Removed` diff --git a/docs/containers.md b/docs/containers.md index b86347db11..b75d74db9a 100644 --- a/docs/containers.md +++ b/docs/containers.md @@ -30,7 +30,7 @@ For annotation, the main container can be used, but the cache has to be download - Contain **[samtools](https://github.com/samtools/samtools)** 1.9 - Contain **[snpEff](http://snpeff.sourceforge.net/)** 4.3.1t - Contain **[Strelka2](https://github.com/Illumina/strelka)** 2.9.10 -- Contain **[TIDDIT](https://github.com/SciLifeLab/TIDDIT)** 2.8.0 +- Contain **[TIDDIT](https://github.com/SciLifeLab/TIDDIT)** 2.8.1 - Contain **[VCFanno](https://github.com/brentp/vcfanno)** 0.3.2 - Contain **[VCFtools](https://vcftools.github.io/index.html)** 0.1.16 - Contain **[VEP](https://github.com/Ensembl/ensembl-vep)** 98.2 diff --git a/environment.yml b/environment.yml index f1858415aa..56e57e8f0a 100644 --- a/environment.yml +++ b/environment.yml @@ -23,6 +23,6 @@ dependencies: - samtools=1.9 - snpeff=4.3.1t - strelka=2.9.10 - - tiddit=2.8.0 + - tiddit=2.8.1 - vcfanno=0.3.2 - vcftools=0.1.16 \ No newline at end of file From 0d1e56ca83091f46fa09c30eac4e8bee8b2e9662 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 28 Oct 2019 16:28:00 +0100 Subject: [PATCH 023/179] Use Version 98 of Mouse --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index a04e2e5397..c4e67148c2 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -62,7 +62,7 @@ params { knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCh38.86" - vepCacheVersion = "95" + vepCacheVersion = "98" } } } From 9195f0f0060f4a8bacb2e791e8ce73d17494f817 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 28 Oct 2019 16:31:49 +0100 Subject: [PATCH 024/179] Add for grcm38 --- conf/igenomes.config | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index c4e67148c2..a1ecc4cc22 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -56,9 +56,7 @@ params { dict = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.dict" fasta = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fa" fastaFai = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fai" - germlineResource = "${params.igenomes_base}/Mus_musculus/Annotation/GermlineResource/gnomAD.r2.1.1.GRCh38.PASS.AC.AF.only.vcf.gz" - germlineResourceIndex = "${params.igenomes_base}/Mus_musculus/Annotation/GermlineResource/gnomAD.r2.1.1.GRCh38.PASS.AC.AF.only.vcf.gz.tbi" - intervals = "${params.igenomes_base}/Mus_musculus/Annotation/intervals/wgs_calling_regions.hg38.bed" + intervals = "${params.igenomes_base}/Mus_musculus/Annotation/intervals/wgs_calling_regions.grcm38.bed" knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCh38.86" From 228592dc11901abc653090ba3c7fae5a7126ff30 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 28 Oct 2019 16:34:09 +0100 Subject: [PATCH 025/179] Adjust mus musculus DB --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index a1ecc4cc22..c27ea0fcff 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -59,7 +59,7 @@ params { intervals = "${params.igenomes_base}/Mus_musculus/Annotation/intervals/wgs_calling_regions.grcm38.bed" knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" - snpeffDb = "GRCh38.86" + snpeffDb = "GRCm38.86" vepCacheVersion = "98" } } From e216b2489b8b301f8ac11b74423486b5dc2e6e58 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Mon, 28 Oct 2019 16:38:11 +0100 Subject: [PATCH 026/179] Annotation --- conf/igenomes.config | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index c27ea0fcff..5413cec2a2 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -48,15 +48,15 @@ params { vepCacheVersion = "95" } 'GRCm38' { - bwaIndex = "${params.igenomes_base}/Mus_musculus/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - chrDir = "${params.igenomes_base}/Mus_musculus/Sequence/Chromosomes" - chrLength = "${params.igenomes_base}/Mus_musculus/Sequence/Length/Homo_sapiens_assembly38.len" - dbsnp = "${params.igenomes_base}/Mus_musculus/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz" - dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" - dict = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.dict" - fasta = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fa" - fastaFai = "${params.igenomes_base}/Mus_musculus/Sequence/WholeGenomeFasta/genome.fai" - intervals = "${params.igenomes_base}/Mus_musculus/Annotation/intervals/wgs_calling_regions.grcm38.bed" + bwaIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + chrDir = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Chromosomes" + chrLength = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Length/Homo_sapiens_assembly38.len" + dbsnp = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz" + dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" + dict = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.dict" + fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" + fastaFai = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fai" + intervals = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/intervals/wgs_calling_regions.grcm38.bed" knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCm38.86" From 5c13e435afa938a6c2223a4b095761818f51b33b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 28 Oct 2019 17:08:08 +0100 Subject: [PATCH 027/179] add smallerGRCh37 and minimalGRCh37 --- conf/genomes.config | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index d9ffcef42c..2b01bf7bd9 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -58,9 +58,12 @@ params { snpeffDb = "GRCh37.75" vepCacheVersion = "95" } - 'minimalGRCh37' { + 'smallerGRCh37' { fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" knownIndels = "${params.genomes_base}/dbsnp_138.b37.small.vcf.gz" } + 'minimalGRCh37' { + fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" + } } } From 05d174db38a06b03875048b942f1adaeeb112ea5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 28 Oct 2019 17:08:58 +0100 Subject: [PATCH 028/179] use bwa aln when no knowIndels, otherwise use bwa mem, noIntervals currently in the process of being added everywhere --- main.nf | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 93 insertions(+), 11 deletions(-) diff --git a/main.nf b/main.nf index 140c851af9..eee29e19f1 100644 --- a/main.nf +++ b/main.nf @@ -575,8 +575,8 @@ bedIntervals = bedIntervals.dump(tag:'bedintervals') // PREPARING CHANNELS FOR PREPROCESSING AND QC -if (step == 'mapping') (inputReads, inputReadsFastQC) = inputSample.into(2) -else (inputReads, inputReadsFastQC) = Channel.empty().into(2) +if (step == 'mapping') (inputReads, inputReadsBWAaln, inputReadsFastQC) = inputSample.into(3) +else (inputReads, inputReadsBWAaln, inputReadsFastQC) = Channel.empty().into(3) inputPairReadsFastQC = Channel.create() inputBAMFastQC = Channel.create() @@ -658,7 +658,7 @@ process MapReads { set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC - when: step == 'mapping' + when: step == 'mapping' && params.knownIndels script: // -K is an hidden option, used to fix the number of reads processed by bwa mem @@ -683,10 +683,42 @@ process MapReads { bamMapped = bamMapped.dump(tag:'Mapped BAM') +process MapReadsBWAaln { + label 'cpus_max' + + tag {idPatient + "-" + idRun} + + input: + set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputReadsBWAaln + file(bwaIndex) from ch_bwaIndex + file(fasta) from ch_fasta + + output: + set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMappedbwaaln + set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQCbwaaln + + when: step == 'mapping' && !params.knownIndels + + script: + """ + bwa aln ${fasta} ${inputFile1} > ${idSample}_${idRun}_R1.sai + bwa aln ${fasta} ${inputFile2} > ${idSample}_${idRun}_R2.sai + + bwa sampe ${fasta} ${idSample}_${idRun}_R1.sai ${idSample}_${idRun}_R2.sai ${inputFile1} ${inputFile2} > ${idSample}_${idRun}.sam + + samtools view -S -b ${idSample}_${idRun}.sam > ${idSample}_${idRun}.unsorted.sam + + samtools sort ${idSample}_${idRun}.unsorted.sam -o ${idSample}_${idRun}.bam + """ +} + +bamMappedbwaaln = bamMappedbwaaln.dump(tag:'Mapped BAM bwa aln') + // Sort BAM whether they are standalone or should be merged singleBam = Channel.create() multipleBam = Channel.create() +bamMapped = bamMapped.mix(bamMappedbwaaln) bamMapped.groupTuple(by:[0, 1]) .choice(singleBam, multipleBam) {it[2].size() > 1 ? 1 : 0} singleBam = singleBam.map { @@ -720,6 +752,28 @@ mergedBam = mergedBam.dump(tag:'Merged BAM') mergedBam = mergedBam.mix(singleBam) mergedBam = mergedBam.dump(tag:'BAMs for MD') +(mergedBam, mergedBamBWAaln) = mergedBam.into(2) + +process IndexBamFile { + label 'cpus_8' + + tag {idPatient + "-" + idSample} + + input: + set idPatient, idSample, file(bam) from mergedBamBWAaln + + output: + set idPatient, idSample, file(bam), file("*.bai") into indexedBam + + when: !params.knownIndels + + script: + """ + samtools index ${bam} + mv ${bam}.bai ${bam.baseName}.bai + """ +} + // STEP 2: MARKING DUPLICATES process MarkDuplicates { @@ -740,7 +794,7 @@ process MarkDuplicates { set idPatient, idSample, file("${idSample}.md.bam"), file("${idSample}.md.bai") into duplicateMarkedBams file ("${idSample}.bam.metrics") into markDuplicatesReport - when: step == 'mapping' + when: step == 'mapping' && params.knownIndels script: markdup_java_options = task.memory.toGiga() > 8 ? params.markdup_java_options : "\"-Xms" + (task.memory.toGiga() / 2).trunc() + "g -Xmx" + (task.memory.toGiga() - 1) + "g\"" @@ -762,7 +816,7 @@ if ('markduplicates' in skipQC) markDuplicatesReport.close() duplicateMarkedBams = duplicateMarkedBams.dump(tag:'MD BAM') markDuplicatesReport = markDuplicatesReport.dump(tag:'MD Report') -(bamMD, bamBaseRecalibratorNoInt, bamMDToJoin) = duplicateMarkedBams.into(3) +(bamMD, bamBaseRecalibratorNoInt, bamMDToJoin, bamMDToJoinNoInt) = duplicateMarkedBams.into(4) // if (params.intervals) bamBaseRecalibratorNoInt.close() @@ -828,9 +882,9 @@ process BaseRecalibratorNoIntervals { file(knownIndelsIndex) from ch_knownIndelsIndex output: - set idPatient, idSample, file("${idSample}.recal.table") into bamMDnoInt + set idPatient, idSample, file("${idSample}.recal.table") into recalNoInt - when: step == 'mapping' + when: !params.intervals && step == 'mapping' script: knownOptions = params.knownIndels ? knownIndels.collect{"--known-sites ${it}"}.join(' ') : "" @@ -903,6 +957,8 @@ bamApplyBQSR = bamApplyBQSR.dump(tag:'recal.table') bamApplyBQSR = bamApplyBQSR.combine(intApplyBQSR) +bamApplyBQSRnoInt = bamMDToJoinNoInt.join(recalNoInt, by:[0,1]) + // STEP 4: RECALIBRATING process ApplyBQSR { @@ -943,13 +999,13 @@ process ApplyBQSRnoIntervals { tag {idPatient + "-" + idSample} input: - set idPatient, idSample, file(bam), file(bai), file(recalibrationReport) from bamMDnoInt + set idPatient, idSample, file(bam), file(bai), file(recalibrationReport) from bamApplyBQSRnoInt file(dict) from ch_dict file(fasta) from ch_fasta file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalNoInt + set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecalNoInt script: """ @@ -959,6 +1015,9 @@ process ApplyBQSRnoIntervals { --input ${bam} \ --output ${idSample}.recal.bam \ --bqsr-recal-file ${recalibrationReport} + + samtools index ${idSample}.recal.bam + mv ${idSample}.recal.bam.bai ${idSample}.recal.bai """ } @@ -1073,6 +1132,8 @@ bamQCReport = bamQCReport.dump(tag:'BamQC') ================================================================================ */ +bamRecal = params.knownIndels ? bamRecal.mix(bamRecalNoInt) : indexedBam + if (step == 'variantcalling') bamRecal = inputSample bamRecal = bamRecal.dump(tag:'BAM') @@ -1313,7 +1374,7 @@ vcfTIDDIT = vcfTIDDIT.dump(tag:'TIDDIT') */ // Ascat, Control-FREEC -(bamAscat, bamMpileup, bamRecalAll) = bamRecalAll.into(3) +(bamAscat, bamMpileup, bamMpileupNoInt, bamRecalAll) = bamRecalAll.into(4) // separate BAM by status bamNormal = Channel.create() @@ -1924,7 +1985,28 @@ process Mpileup { """ } -mpileupMerge = mpileupMerge.groupTuple(by:[0, 1]) +process MpileupNoIntervals { + label 'memory_singleCPU_2_task' + + tag {idSample} + + input: + set idPatient, idSample, file(bam), file(bai) from bamMpileupNoInt + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + + output: + set idPatient, idSample, file("${idSample}.pileup.gz") into mpileupNoIntOut + + when: !params.intervals && 'mpileup' in tools + + script: + """ + samtools mpileup \ + -f ${fasta} ${bam} \ + | bgzip --threads ${task.cpus} -c > ${idSample}.pileup.gz + """ +} // STEP CONTROLFREEC.2 - MERGE MPILEUP From c61768b2e0bac09ef07ed91cc2b1ad297aa7a50f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 29 Oct 2019 09:43:49 +0100 Subject: [PATCH 029/179] don't use bwa aln --- main.nf | 38 ++++---------------------------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/main.nf b/main.nf index eee29e19f1..f61dd3db3e 100644 --- a/main.nf +++ b/main.nf @@ -683,42 +683,10 @@ process MapReads { bamMapped = bamMapped.dump(tag:'Mapped BAM') -process MapReadsBWAaln { - label 'cpus_max' - - tag {idPatient + "-" + idRun} - - input: - set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputReadsBWAaln - file(bwaIndex) from ch_bwaIndex - file(fasta) from ch_fasta - - output: - set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMappedbwaaln - set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQCbwaaln - - when: step == 'mapping' && !params.knownIndels - - script: - """ - bwa aln ${fasta} ${inputFile1} > ${idSample}_${idRun}_R1.sai - bwa aln ${fasta} ${inputFile2} > ${idSample}_${idRun}_R2.sai - - bwa sampe ${fasta} ${idSample}_${idRun}_R1.sai ${idSample}_${idRun}_R2.sai ${inputFile1} ${inputFile2} > ${idSample}_${idRun}.sam - - samtools view -S -b ${idSample}_${idRun}.sam > ${idSample}_${idRun}.unsorted.sam - - samtools sort ${idSample}_${idRun}.unsorted.sam -o ${idSample}_${idRun}.bam - """ -} - -bamMappedbwaaln = bamMappedbwaaln.dump(tag:'Mapped BAM bwa aln') - // Sort BAM whether they are standalone or should be merged singleBam = Channel.create() multipleBam = Channel.create() -bamMapped = bamMapped.mix(bamMappedbwaaln) bamMapped.groupTuple(by:[0, 1]) .choice(singleBam, multipleBam) {it[2].size() > 1 ? 1 : 0} singleBam = singleBam.map { @@ -752,7 +720,7 @@ mergedBam = mergedBam.dump(tag:'Merged BAM') mergedBam = mergedBam.mix(singleBam) mergedBam = mergedBam.dump(tag:'BAMs for MD') -(mergedBam, mergedBamBWAaln) = mergedBam.into(2) +(mergedBam, mergedBamToIndex) = mergedBam.into(2) process IndexBamFile { label 'cpus_8' @@ -760,7 +728,7 @@ process IndexBamFile { tag {idPatient + "-" + idSample} input: - set idPatient, idSample, file(bam) from mergedBamBWAaln + set idPatient, idSample, file(bam) from mergedBamToIndex output: set idPatient, idSample, file(bam), file("*.bai") into indexedBam @@ -1985,6 +1953,8 @@ process Mpileup { """ } +mpileupMerge = mpileupMerge.groupTuple(by:[0, 1]) + process MpileupNoIntervals { label 'memory_singleCPU_2_task' From 044de7517690c730e8925f09e5d7dc72fed3dd5e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 29 Oct 2019 16:22:30 +0100 Subject: [PATCH 030/179] add automatic generation of intervals file based on fastaFai file --- main.nf | 63 +++++++++++++++++++++++++++++++++++++------------ nextflow.config | 1 + 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/main.nf b/main.nf index f61dd3db3e..58abea6254 100644 --- a/main.nf +++ b/main.nf @@ -43,6 +43,7 @@ def helpMessage() { --genome Name of iGenomes reference --noGVCF No g.vcf output from HaplotypeCaller --noStrelkaBP Will not use Manta candidateSmallIndels for Strelka as Best Practice + --noIntervals Disable usage of intervals --nucleotidesPerSecond To estimate interval size Default: 1000.0 --targetBED Target BED file for targeted or whole exome sequencing @@ -69,14 +70,21 @@ def helpMessage() { --acLoci acLoci file --acLociGC acLoci GC file --bwaIndex bwa indexes + If none provided, will be generated automatically --dbsnp dbsnp file --dbsnpIndex dbsnp index + If none provided, will be generated automatically --dict dict from the fasta reference + If none provided, will be generated automatically --fasta fasta reference --fastafai reference index + If none provided, will be generated automatically --intervals intervals + If none provided, will be generated automatically + Use --noIntervals to disable automatic generation --knownIndels knownIndels file --knownIndelsIndex knownIndels index + If none provided, will be generated automatically --snpeffDb snpeffDb version --vepCacheVersion VEP Cache version @@ -236,7 +244,6 @@ ch_dbsnp = params.dbsnp && ('mapping' in step || 'controlfreec' in tools || 'hap ch_fasta = params.fasta && !('annotate' in step) ? Channel.value(file(params.fasta)) : "null" ch_fastaFai = params.fastaFai && !('annotate' in step) ? Channel.value(file(params.fastaFai)) : "null" ch_germlineResource = params.germlineResource && 'mutect2' in tools ? Channel.value(file(params.germlineResource)) : "null" -ch_intervals = params.intervals && !('annotate' in step) ? Channel.value(file(params.intervals)) : "null" // knownIndels is currently a list of file for smallGRCh37, so transform it in a channel li_knownIndels = [] @@ -371,6 +378,8 @@ yamlSoftwareVersion = yamlSoftwareVersion.dump(tag:'SOFTWARE VERSIONS') ================================================================================ */ +// And then initialize channels based on params or indexes that were just built + process BuildBWAindexes { tag {fasta} @@ -391,6 +400,8 @@ process BuildBWAindexes { """ } +ch_bwaIndex = params.bwaIndex ? Channel.value(file(params.bwaIndex)) : bwaIndexes + process BuildDict { tag {fasta} @@ -414,6 +425,8 @@ process BuildDict { """ } +ch_dict = params.dict ? Channel.value(file(params.dict)) : dictBuilt + process BuildFastaFai { tag {fasta} @@ -434,6 +447,8 @@ process BuildFastaFai { """ } +ch_fastaFai = params.fastaFai ? Channel.value(file(params.fastaFai)) : fastaFaiBuilt + process BuildDbsnpIndex { tag {dbsnp} @@ -453,6 +468,8 @@ process BuildDbsnpIndex { """ } +ch_dbsnpIndex = params.dbsnpIndex ? Channel.value(file(params.dbsnpIndex)) : dbsnpIndexBuilt + process BuildGermlineResourceIndex { tag {germlineResource} @@ -473,6 +490,8 @@ process BuildGermlineResourceIndex { """ } +ch_germlineResourceIndex = params.germlineResourceIndex ? Channel.value(file(params.germlineResourceIndex)) : germlineResourceIndexBuilt + process BuildKnownIndelsIndex { tag {knownIndels} @@ -493,14 +512,30 @@ process BuildKnownIndelsIndex { """ } -// Initialize channels based on params or indexes that were just built -ch_bwaIndex = params.bwaIndex ? Channel.value(file(params.bwaIndex)) : bwaIndexes -ch_dbsnpIndex = params.dbsnpIndex ? Channel.value(file(params.dbsnpIndex)) : dbsnpIndexBuilt -ch_dict = params.dict ? Channel.value(file(params.dict)) : dictBuilt -ch_fastaFai = params.fastaFai ? Channel.value(file(params.fastaFai)) : fastaFaiBuilt -ch_germlineResourceIndex = params.germlineResourceIndex ? Channel.value(file(params.germlineResourceIndex)) : germlineResourceIndexBuilt ch_knownIndelsIndex = params.knownIndelsIndex ? Channel.value(file(params.knownIndelsIndex)) : knownIndelsIndexBuilt.collect() +process BuildIntervals { + tag {fastaFai} + + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } + + input: + file(fastaFai) from ch_fastaFai + + output: + file("${fastaFai.baseName}.bed") into intervalBuilt + + when: !(params.intervals) && !('annotate' in step) && !(params.noIntervals) + + script: + """ + awk -v FS='\t' -v OFS='\t' '{ print \$1, \"0\", \$2 }' ${fastaFai} > ${fastaFai.baseName}.bed + """ +} + +ch_intervals = params.noIntervals ? "null" : params.intervals && !('annotate' in step) ? Channel.value(file(params.intervals)) : intervalBuilt + /* ================================================================================ PREPROCESSING @@ -518,7 +553,7 @@ process CreateIntervalBeds { output: file '*.bed' into bedIntervals mode flatten - when: params.intervals && step != 'annotate' + when: !(params.noIntervals) && step != 'annotate' script: // If the interval file is BED format, the fifth column is interpreted to @@ -575,8 +610,8 @@ bedIntervals = bedIntervals.dump(tag:'bedintervals') // PREPARING CHANNELS FOR PREPROCESSING AND QC -if (step == 'mapping') (inputReads, inputReadsBWAaln, inputReadsFastQC) = inputSample.into(3) -else (inputReads, inputReadsBWAaln, inputReadsFastQC) = Channel.empty().into(3) +if (step == 'mapping') (inputReads, inputReadsFastQC) = inputSample.into(2) +else (inputReads, inputReadsFastQC) = Channel.empty().into(2) inputPairReadsFastQC = Channel.create() inputBAMFastQC = Channel.create() @@ -658,7 +693,7 @@ process MapReads { set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC - when: step == 'mapping' && params.knownIndels + when: step == 'mapping' script: // -K is an hidden option, used to fix the number of reads processed by bwa mem @@ -786,8 +821,6 @@ markDuplicatesReport = markDuplicatesReport.dump(tag:'MD Report') (bamMD, bamBaseRecalibratorNoInt, bamMDToJoin, bamMDToJoinNoInt) = duplicateMarkedBams.into(4) -// if (params.intervals) bamBaseRecalibratorNoInt.close() - bamBaseRecalibrator = bamMD.combine(intBaseRecalibrator) bamBaseRecalibrator = bamBaseRecalibrator.dump(tag:'BAM FOR BASERECALIBRATOR') @@ -852,7 +885,7 @@ process BaseRecalibratorNoIntervals { output: set idPatient, idSample, file("${idSample}.recal.table") into recalNoInt - when: !params.intervals && step == 'mapping' + when: params.noIntervals && step == 'mapping' script: knownOptions = params.knownIndels ? knownIndels.collect{"--known-sites ${it}"}.join(' ') : "" @@ -1968,7 +2001,7 @@ process MpileupNoIntervals { output: set idPatient, idSample, file("${idSample}.pileup.gz") into mpileupNoIntOut - when: !params.intervals && 'mpileup' in tools + when: params.noIntervals && 'mpileup' in tools script: """ diff --git a/nextflow.config b/nextflow.config index 6ddfb53847..4cdead349e 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,6 +14,7 @@ params { input = null // No default input noGVCF = null // g.vcf are produced by HaplotypeCaller noStrelkaBP = null // Strelka will use Manta candidateSmallIndels if available + noIntervals = null // Intervals will be built from the fastaFai file skipQC = null // All QC tools are used step = 'mapping' // Starts with mapping tools = null // No default Variant Calling or Annotation tools From 0dacda143a5e71c7647e9c837f52d6b7b43ab028 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 10:52:28 +0100 Subject: [PATCH 031/179] Adjusted genomes.config --- conf/genomes.config | 15 +++++++++++++++ conf/igenomes.config | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 7d7527b21a..df2b0d9f79 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -58,5 +58,20 @@ params { snpeffDb = "GRCh37.75" vepCacheVersion = "95" } + 'GRCm38' { + bwaIndex = "${params.genomes_base}/genome.fa.{amb,ann,bwt,pac,sa}" + chrDir = "${params.genomes_base}/Chromosomes" + chrLength = "${params.genomes_base}/GRCm38.len" + dbsnp = "${params.genomes_base}/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz" + dbsnpIndex = "${params.genomes_base}/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" + dict = "${params.genomes_base}/genome.dict" + fasta = "${params.genomes_base}/genome.fa" + fastaFai = "${params.genomes_base}/genome.fai" + intervals = "${params.genomes_base}/wgs_calling_regions.grcm38.bed" + knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" + knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" + snpeffDb = "GRCm38.86" + vepCacheVersion = "98" + } } } diff --git a/conf/igenomes.config b/conf/igenomes.config index 5413cec2a2..3637b731d6 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -50,7 +50,7 @@ params { 'GRCm38' { bwaIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" chrDir = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Chromosomes" - chrLength = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Length/Homo_sapiens_assembly38.len" + chrLength = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Length/GRCm38.len" dbsnp = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz" dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" dict = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.dict" From 9a35195ae62af28cd3952ea793c101ae06ee21bc Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 11:52:33 +0100 Subject: [PATCH 032/179] Should be list --- conf/genomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index df2b0d9f79..151562d5b7 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -67,7 +67,7 @@ params { dict = "${params.genomes_base}/genome.dict" fasta = "${params.genomes_base}/genome.fa" fastaFai = "${params.genomes_base}/genome.fai" - intervals = "${params.genomes_base}/wgs_calling_regions.grcm38.bed" + intervals = "${params.genomes_base}/wgs_calling_regions.grcm38.list" knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCm38.86" From e6c07a5051209b65dad5429c3c8ff91dee91378e Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 11:59:45 +0100 Subject: [PATCH 033/179] Set genomes_base to something --- nextflow.config | 1 + 1 file changed, 1 insertion(+) diff --git a/nextflow.config b/nextflow.config index 6ddfb53847..af89c56254 100644 --- a/nextflow.config +++ b/nextflow.config @@ -53,6 +53,7 @@ params { // Reference genomes igenomesIgnore = false igenomes_base = 's3://ngi-igenomes/igenomes/' + genomes_base = false // Default help = false From 934622da52287d94a57dd5f1964d0c84963baf8d Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 12:13:26 +0100 Subject: [PATCH 034/179] Revert back --- nextflow.config | 1 - 1 file changed, 1 deletion(-) diff --git a/nextflow.config b/nextflow.config index af89c56254..6ddfb53847 100644 --- a/nextflow.config +++ b/nextflow.config @@ -53,7 +53,6 @@ params { // Reference genomes igenomesIgnore = false igenomes_base = 's3://ngi-igenomes/igenomes/' - genomes_base = false // Default help = false From 1cde457dedb08e99be965653cb3372d5b6e9d609 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 30 Oct 2019 13:31:01 +0100 Subject: [PATCH 035/179] enable CreateIntervalsBed for intervals_list from GATK Bundle --- main.nf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/main.nf b/main.nf index 204f315b4d..d1acd29d57 100644 --- a/main.nf +++ b/main.nf @@ -543,6 +543,14 @@ process CreateIntervalBeds { print \$0 > name }' ${intervals} """ + else if (hasExtension(intervals, "interval_list")) + """ + cat ${intervals} | grep -v "@" > intervals.temp + awk -vFS="\t" '{ + name = sprintf("%s_%d-%d", \$1, \$2, \$3); + printf("%s\\t%d\\t%d\\n", \$1, \$2-1, \$3) > name ".bed" + }' intervals.temp + """ else """ awk -vFS="[:-]" '{ From 985af84438a224216850ffaff77351b5b23b2a7e Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 14:04:54 +0100 Subject: [PATCH 036/179] Add proper calling list --- conf/genomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 151562d5b7..16886883b6 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -67,7 +67,7 @@ params { dict = "${params.genomes_base}/genome.dict" fasta = "${params.genomes_base}/genome.fa" fastaFai = "${params.genomes_base}/genome.fai" - intervals = "${params.genomes_base}/wgs_calling_regions.grcm38.list" + intervals = "${params.genomes_base}/GRCm38_calling_list.list" knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCm38.86" From da5ea62a98deb9e82887361ac55501f8a88fb3b2 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 14:08:58 +0100 Subject: [PATCH 037/179] Use the bed file --- conf/genomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index 16886883b6..b2faba0ae0 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -67,7 +67,7 @@ params { dict = "${params.genomes_base}/genome.dict" fasta = "${params.genomes_base}/genome.fa" fastaFai = "${params.genomes_base}/genome.fai" - intervals = "${params.genomes_base}/GRCm38_calling_list.list" + intervals = "${params.genomes_base}/GRCm38_calling_list.bed" knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCm38.86" From 793ba99a0bbecc6e13411bda7421404196372831 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 30 Oct 2019 15:27:16 +0100 Subject: [PATCH 038/179] remove temp file --- main.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index d1acd29d57..2aec0d0e2c 100644 --- a/main.nf +++ b/main.nf @@ -545,11 +545,10 @@ process CreateIntervalBeds { """ else if (hasExtension(intervals, "interval_list")) """ - cat ${intervals} | grep -v "@" > intervals.temp - awk -vFS="\t" '{ + grep -v '^@' ${intervals} | awk -vFS="\t" '{ name = sprintf("%s_%d-%d", \$1, \$2, \$3); printf("%s\\t%d\\t%d\\n", \$1, \$2-1, \$3) > name ".bed" - }' intervals.temp + }' """ else """ From 962ebe68e3de9d2d12b35299a2d879b0d04229f6 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 30 Oct 2019 15:32:36 +0100 Subject: [PATCH 039/179] update CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a8e7c2d25..70736a1d59 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#42](https://github.com/nf-core/sarek/pull/42) - Fix typos, and minor updates in `README.md` - [#43](https://github.com/nf-core/sarek/pull/43) - Fix automated `VEP` builds with circleCI - [#54](https://github.com/nf-core/sarek/pull/54) - Apply fixes from release `2.5.1` +- [#58](https://github.com/nf-core/sarek/pull/58) - Fix issue with `.interval_list` file from the GATK bundle [#56](https://github.com/nf-core/sarek/issues/56) that was not recognized in the `CreateIntervalsBed` process ## [2.5.1] - Årjep-Ålkatjjekna From 888a22050263de6541fdf4e7aa626fac35dc2187 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 15:36:14 +0100 Subject: [PATCH 040/179] Fix genome fa.fai --- conf/genomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index b2faba0ae0..d567b35772 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -66,7 +66,7 @@ params { dbsnpIndex = "${params.genomes_base}/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" dict = "${params.genomes_base}/genome.dict" fasta = "${params.genomes_base}/genome.fa" - fastaFai = "${params.genomes_base}/genome.fai" + fastaFai = "${params.genomes_base}/genome.fa.fai" intervals = "${params.genomes_base}/GRCm38_calling_list.bed" knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" From 17e1f23de1f162d3f1a7c7336f2ae5a2736c205c Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Wed, 30 Oct 2019 23:57:43 +0100 Subject: [PATCH 041/179] Add in mgpv5 --- conf/genomes.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index d567b35772..be88bad126 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -62,8 +62,8 @@ params { bwaIndex = "${params.genomes_base}/genome.fa.{amb,ann,bwt,pac,sa}" chrDir = "${params.genomes_base}/Chromosomes" chrLength = "${params.genomes_base}/GRCm38.len" - dbsnp = "${params.genomes_base}/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz" - dbsnpIndex = "${params.genomes_base}/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" + dbsnp = "${params.genomes_base}/mgp.v5.merged.snps_all.dbSNP142.vcf.gz" + dbsnpIndex = "${params.genomes_base}/mgp.v5.merged.snps_all.dbSNP142.vcf.gz.tbi" dict = "${params.genomes_base}/genome.dict" fasta = "${params.genomes_base}/genome.fa" fastaFai = "${params.genomes_base}/genome.fa.fai" From c3c6e93b61918414b179349d298f9a45e0a6463d Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 10:24:22 +0100 Subject: [PATCH 042/179] Try short track --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index ffe3b12b7d..1570175677 100644 --- a/main.nf +++ b/main.nf @@ -2247,6 +2247,7 @@ process VEP { script: reducedVCF = reduceVCF(vcf.fileName) genome = params.genome == 'smallGRCh37' ? 'GRCh37' : params.genome + dir_cache = (params.vep_cache && params.annotation_cache) ? " \${PWD}/${dataDir}" : "/.vep" cadd = (params.cadd_cache && params.cadd_WG_SNVs && params.cadd_InDels) ? "--plugin CADD,whole_genome_SNVs.tsv.gz,InDels.tsv.gz" : "" genesplicer = params.genesplicer ? "--plugin GeneSplicer,/opt/conda/envs/sarek-${workflow.manifest.version}/bin/genesplicer,/opt/conda/envs/sarek-${workflow.manifest.version}/share/genesplicer-1.0-1/human,context=200,tmpdir=\$PWD/${reducedVCF}" : "--offline" @@ -2257,6 +2258,7 @@ process VEP { -i ${vcf} \ -o ${reducedVCF}_VEP.ann.vcf \ --assembly ${genome} \ + --species mus_musculus \ ${cadd} \ ${genesplicer} \ --cache \ From 7fa975687402322b44a7b6a2528b1b5852374deb Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 10:48:17 +0100 Subject: [PATCH 043/179] Add in species handling --- conf/genomes.config | 4 ++++ conf/igenomes.config | 3 +++ main.nf | 3 ++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/conf/genomes.config b/conf/genomes.config index be88bad126..64745178e2 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -27,6 +27,7 @@ params { knownIndelsIndex = "${params.genomes_base}/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf.idx" snpeffDb = "GRCh37.75" vepCacheVersion = "95" + species = 'homo_sapiens' } 'GRCh38' { acLoci = "${params.genomes_base}/1000G_phase3_GRCh38_maf0.3.loci" @@ -46,6 +47,7 @@ params { knownIndelsIndex = "${params.genomes_base}/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" snpeffDb = "GRCh38.86" vepCacheVersion = "95" + species = 'homo_sapiens' } 'smallGRCh37' { acLoci = "${params.genomes_base}/1000G_phase3_20130502_SNP_maf0.3.small.loci" @@ -57,6 +59,7 @@ params { knownIndels = ["${params.genomes_base}/1000G_phase1.indels.b37.small.vcf.gz", "${params.genomes_base}/Mills_and_1000G_gold_standard.indels.b37.small.vcf.gz"] snpeffDb = "GRCh37.75" vepCacheVersion = "95" + species = 'homo_sapiens' } 'GRCm38' { bwaIndex = "${params.genomes_base}/genome.fa.{amb,ann,bwt,pac,sa}" @@ -72,6 +75,7 @@ params { knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCm38.86" vepCacheVersion = "98" + species = 'mus_musculus' } } } diff --git a/conf/igenomes.config b/conf/igenomes.config index 3637b731d6..d3adee8854 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -27,6 +27,7 @@ params { knownIndelsIndex = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/GATKBundle/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf.idx" snpeffDb = "GRCh37.75" vepCacheVersion = "95" + species = 'homo_sapiens' } 'GRCh38' { acLoci = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/1000G_phase3_GRCh38_maf0.3.loci" @@ -46,6 +47,7 @@ params { knownIndelsIndex = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" snpeffDb = "GRCh38.86" vepCacheVersion = "95" + species = 'homo_sapiens' } 'GRCm38' { bwaIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" @@ -61,6 +63,7 @@ params { knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = "GRCm38.86" vepCacheVersion = "98" + species = 'mus_musculus' } } } diff --git a/main.nf b/main.nf index 1570175677..7fdeb24cc5 100644 --- a/main.nf +++ b/main.nf @@ -2258,7 +2258,7 @@ process VEP { -i ${vcf} \ -o ${reducedVCF}_VEP.ann.vcf \ --assembly ${genome} \ - --species mus_musculus \ + --species ${params.species} \ ${cadd} \ ${genesplicer} \ --cache \ @@ -2320,6 +2320,7 @@ process VEPmerge { -i ${vcf} \ -o ${reducedVCF}_VEP.ann.vcf \ --assembly ${genome} \ + --species ${params.species} \ ${cadd} \ ${genesplicer} \ --cache \ From 2f9530ffd7f22e701304bae291f47eb9768a481a Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 10:48:24 +0100 Subject: [PATCH 044/179] Document new parameter species --- docs/usage.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index f1532af20b..ef4346006d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -47,6 +47,7 @@ * [`--snpeffDb`](#--snpeffdb) * [`--vepCacheVersion`](#--vepcacheversion) * [`--igenomesIgnore`](#--igenomesignore) + * [`--species`](#--species) * [Job resources](#job-resources) * [Automatic resubmission](#automatic-resubmission) * [Custom resource requests](#custom-resource-requests) @@ -514,6 +515,10 @@ If you prefer, you can specify the cache version when you run the pipeline: Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`. +### `--species` + +This specifies the species used for running VEP annotation. For human data, this needs to be set to `homo_sapiens`, for mouse data `mus_musculus` as the annotation needs to know where to look for appropriate annotation references. If you use iGenomes or a local resource with `genomes.conf`, this has already been set for you appropriately. + ## Job resources ### Automatic resubmission From 30e6b4c9848a3e77602db0f630431681a32c9a6c Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 10:53:50 +0100 Subject: [PATCH 045/179] Add changelog --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f1d71a6ea..d516c37ebe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,7 +17,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `tiddit` from `2.7.1` to `2.8.0` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` -- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts. +- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstracts. +- [#52](https://github.com/nf-core/sarek/pull/52) - Add support for mouse data `GRCm38` ### `Removed` From c86114ab6d98ce48ed0f841acf551c4672990ae1 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 10:56:33 +0100 Subject: [PATCH 046/179] Fix iGenomes stuff --- conf/igenomes.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index d3adee8854..f137b7f121 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -53,8 +53,8 @@ params { bwaIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" chrDir = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Chromosomes" chrLength = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Length/GRCm38.len" - dbsnp = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz" - dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v6.merged.norm.snp.indels.sfiltered.vcf.gz.tbi" + dbsnp = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v5.merged.snps_all.dbSNP142.vcf.gz" + dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v5.merged.snps_all.dbSNP142.vcf.gz.tbi" dict = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.dict" fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" fastaFai = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fai" From 9ba7c6fb9ecc588272995c073940b05df302dfcd Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 10:57:28 +0100 Subject: [PATCH 047/179] Add in note about GRCm38 --- docs/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference.md b/docs/reference.md index 5c47b7dddb..5fd89e59e7 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -5,7 +5,7 @@ Sarek is using [AWS iGenomes](https://ewels.github.io/AWS-iGenomes/), which facilitate storing and sharing references. Sarek currently uses `GRCh38` by default. Both `GRCh37` and `GRCh38` are available with `--genome GRCh37` or `--genome GRCh38` respectively with any profile using the `conf/igenomes.config` file, or you can specify it with `-c conf/igenomes.config`. -Use `--genome smallGRCh37` to map against a small reference genome based on GRCh37. +Use `--genome smallGRCh37` to map against a small reference genome based on GRCh37. Furthermore, mouse genome data can be analyzed using `--genome GRCm38`. Settings in `igenomes.config` can be tailored to your needs. ### Intervals From b33576bfb4bd5e767ecad67621ddf34a3ce00bd9 Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 11:14:19 +0100 Subject: [PATCH 048/179] Fix small fai index issue --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index f137b7f121..75f26a1ddd 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -57,7 +57,7 @@ params { dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v5.merged.snps_all.dbSNP142.vcf.gz.tbi" dict = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.dict" fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - fastaFai = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fai" + fastaFai = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa.fai" intervals = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/intervals/wgs_calling_regions.grcm38.bed" knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" From c70dd719625d51419c16963f84b4fff22db2984e Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 11:35:31 +0100 Subject: [PATCH 049/179] Adjusted quotes in genomes.config --- conf/genomes.config | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 64745178e2..b29d038e29 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -25,8 +25,8 @@ params { intervals = "${params.genomes_base}/wgs_calling_regions_Sarek.list" knownIndels = "${params.genomes_base}/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf" knownIndelsIndex = "${params.genomes_base}/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf.idx" - snpeffDb = "GRCh37.75" - vepCacheVersion = "95" + snpeffDb = 'GRCh37.75' + vepCacheVersion = '95' species = 'homo_sapiens' } 'GRCh38' { @@ -45,8 +45,8 @@ params { intervals = "${params.genomes_base}/wgs_calling_regions.hg38.bed" knownIndels = "${params.genomes_base}/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz" knownIndelsIndex = "${params.genomes_base}/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" - snpeffDb = "GRCh38.86" - vepCacheVersion = "95" + snpeffDb = 'GRCh38.86' + vepCacheVersion = '95' species = 'homo_sapiens' } 'smallGRCh37' { @@ -57,8 +57,8 @@ params { germlineResource = "${params.genomes_base}/dbsnp_138.b37.small.vcf.gz" intervals = "${params.genomes_base}/small.intervals" knownIndels = ["${params.genomes_base}/1000G_phase1.indels.b37.small.vcf.gz", "${params.genomes_base}/Mills_and_1000G_gold_standard.indels.b37.small.vcf.gz"] - snpeffDb = "GRCh37.75" - vepCacheVersion = "95" + snpeffDb = 'GRCh37.75' + vepCacheVersion = '95' species = 'homo_sapiens' } 'GRCm38' { @@ -73,8 +73,8 @@ params { intervals = "${params.genomes_base}/GRCm38_calling_list.bed" knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" - snpeffDb = "GRCm38.86" - vepCacheVersion = "98" + snpeffDb = 'GRCm38.86' + vepCacheVersion = '98' species = 'mus_musculus' } } From fffc46f3b03b663d62b137262e60886588999b4a Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 11:36:01 +0100 Subject: [PATCH 050/179] And the same for igenomes --- conf/igenomes.config | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 75f26a1ddd..0b5e9dbde1 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -25,8 +25,8 @@ params { intervals = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/intervals/wgs_calling_regions_Sarek.list" knownIndels = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/GATKBundle/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf" knownIndelsIndex = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/GATKBundle/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf.idx" - snpeffDb = "GRCh37.75" - vepCacheVersion = "95" + snpeffDb = 'GRCh37.75' + vepCacheVersion = '95' species = 'homo_sapiens' } 'GRCh38' { @@ -45,8 +45,8 @@ params { intervals = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/intervals/wgs_calling_regions.hg38.bed" knownIndels = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" - snpeffDb = "GRCh38.86" - vepCacheVersion = "95" + snpeffDb = 'GRCh38.86' + vepCacheVersion = '95' species = 'homo_sapiens' } 'GRCm38' { @@ -61,8 +61,8 @@ params { intervals = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/intervals/wgs_calling_regions.grcm38.bed" knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" - snpeffDb = "GRCm38.86" - vepCacheVersion = "98" + snpeffDb = 'GRCm38.86' + vepCacheVersion = '98' species = 'mus_musculus' } } From 2c821e437ce300daa9b2eb66a50899add2a01f2f Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 11:54:14 +0100 Subject: [PATCH 051/179] Better folder structure for Mouse Genome Project data --- conf/igenomes.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index 0b5e9dbde1..e4ad3d9871 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -53,8 +53,8 @@ params { bwaIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" chrDir = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Chromosomes" chrLength = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Length/GRCm38.len" - dbsnp = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v5.merged.snps_all.dbSNP142.vcf.gz" - dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/mgp.v5.merged.snps_all.dbSNP142.vcf.gz.tbi" + dbsnp = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/MouseGenomeProject/Annotation/mgp.v5.merged.snps_all.dbSNP142.vcf.gz" + dbsnpIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/MouseGenomeProject/Annotation/mgp.v5.merged.snps_all.dbSNP142.vcf.gz.tbi" dict = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.dict" fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" fastaFai = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa.fai" From 092518954b0a43b78d03cefacb71963a0f7bec2a Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 12:07:17 +0100 Subject: [PATCH 052/179] Minor adjustment to propoer paths --- conf/igenomes.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/igenomes.config b/conf/igenomes.config index e4ad3d9871..b06dffac39 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -58,7 +58,7 @@ params { dict = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.dict" fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" fastaFai = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa.fai" - intervals = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/intervals/wgs_calling_regions.grcm38.bed" + intervals = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Annotation/intervals/GRCm38_calling_list.bed" knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = 'GRCm38.86' From 12a515293d93e2f7bdd0afd19bf655bd0688f24e Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 12:50:48 +0100 Subject: [PATCH 053/179] Apply suggestions from code review Add changes by Maxime Co-Authored-By: Maxime Garcia --- docs/reference.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/reference.md b/docs/reference.md index 5fd89e59e7..f09702f939 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -4,8 +4,8 @@ Sarek is using [AWS iGenomes](https://ewels.github.io/AWS-iGenomes/), which facilitate storing and sharing references. Sarek currently uses `GRCh38` by default. -Both `GRCh37` and `GRCh38` are available with `--genome GRCh37` or `--genome GRCh38` respectively with any profile using the `conf/igenomes.config` file, or you can specify it with `-c conf/igenomes.config`. -Use `--genome smallGRCh37` to map against a small reference genome based on GRCh37. Furthermore, mouse genome data can be analyzed using `--genome GRCm38`. +`GRCh37`, `GRCh38` and `GRCm38 `are available with `--genome GRCh37`, `--genome GRCh38` or `--genome GRCm38` respectively with any profile using the `conf/igenomes.config` file, or you can specify it with `-c conf/igenomes.config`. +Use `--genome smallGRCh37` to map against a small reference genome based on GRCh37. Settings in `igenomes.config` can be tailored to your needs. ### Intervals From 92be499571770e15d20cda1ce366425a2cba11fa Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 13:25:43 +0100 Subject: [PATCH 054/179] Remove space --- docs/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference.md b/docs/reference.md index f09702f939..65d96997e0 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -4,7 +4,7 @@ Sarek is using [AWS iGenomes](https://ewels.github.io/AWS-iGenomes/), which facilitate storing and sharing references. Sarek currently uses `GRCh38` by default. -`GRCh37`, `GRCh38` and `GRCm38 `are available with `--genome GRCh37`, `--genome GRCh38` or `--genome GRCm38` respectively with any profile using the `conf/igenomes.config` file, or you can specify it with `-c conf/igenomes.config`. +`GRCh37`, `GRCh38` and `GRCm38` are available with `--genome GRCh37`, `--genome GRCh38` or `--genome GRCm38` respectively with any profile using the `conf/igenomes.config` file, or you can specify it with `-c conf/igenomes.config`. Use `--genome smallGRCh37` to map against a small reference genome based on GRCh37. Settings in `igenomes.config` can be tailored to your needs. From 98ea8985710448492a85c65f65c96275e235bd5a Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 13:52:51 +0100 Subject: [PATCH 055/179] Move it up --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fcfc6b8369..58b2ce302f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ### `Added` - [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts +- [#52](https://github.com/nf-core/sarek/pull/52) - Add support for mouse data `GRCm38` ### `Changed` @@ -22,7 +23,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41), [#55](https://github.com/nf-core/sarek/pull/55) - Update `tiddit` from `2.7.1` to `2.8.1` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` - [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstracts. -- [#52](https://github.com/nf-core/sarek/pull/52) - Add support for mouse data `GRCm38` - [#54](https://github.com/nf-core/sarek/pull/54) - Bump version to `2.5.2dev` ### `Removed` From bf3f262e622c8c76e906f14cc8d5a2685e3d2f3d Mon Sep 17 00:00:00 2001 From: Alexander Peltzer Date: Thu, 31 Oct 2019 13:57:26 +0100 Subject: [PATCH 056/179] Update CHANGELOG.md Co-Authored-By: Maxime Garcia --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 58b2ce302f..036e279327 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,6 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` - [#41](https://github.com/nf-core/sarek/pull/41), [#55](https://github.com/nf-core/sarek/pull/55) - Update `tiddit` from `2.7.1` to `2.8.1` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` -- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstracts. - [#54](https://github.com/nf-core/sarek/pull/54) - Bump version to `2.5.2dev` ### `Removed` From 1bebb786ee11b5e39f190047d9864e097f3db2ca Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 Nov 2019 16:01:16 +0100 Subject: [PATCH 057/179] add minimal tests --- .github/workflows/ci-extra.yml | 2 +- scripts/run_tests.sh | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index d37a33aae0..84d58bbde2 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - test: [ANNOTATESNPEFF, GERMLINE, SOMATIC, TARGETED] + test: [ANNOTATESNPEFF, GERMLINE, MINIMAL, SOMATIC, TARGETED] nxf_ver: ['19.04.0', ''] steps: - uses: actions/checkout@v1 diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index cb6db88901..eb02a84d18 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -84,7 +84,7 @@ else SUFFIX="" fi -OPTIONS="--tools FreeBayes,HaplotypeCaller,Manta,Mutect2,Strelka,TIDDIT" +OPTIONS="--tools FreeBayes,HaplotypeCaller,Manta,mpileup,Mutect2,Strelka" if [[ $TEST == "GERMLINE" ]] && [[ $OFFLINE == false ]] then @@ -113,11 +113,17 @@ case $TEST in ;; GERMLINE) run_sarek --tools=false --input data/testdata/tiny/normal - run_sarek --tools=false --input results/Preprocessing/TSV/duplicateMarked.tsv --step recalibrate + run_sarek --tools=false --input results/Preprocessing/TSV/duplicateMarked.tsv --step recalibrate -resume run_sarek --tools HaplotypeCaller --input results/Preprocessing/TSV/recalibrated.tsv --step variantCalling ;; + MINIMAL) + run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 + run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 --noIntervals -resume + run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 -resume + run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 --noIntervals -resume + ;; MULTIPLE) - run_sarek --tools FreeBayes,HaplotypeCaller,Manta,Strelka,TIDDIT,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv + run_sarek --tools FreeBayes,HaplotypeCaller,Manta,mpileup,Strelka,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv ;; SOMATIC) run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv From 528cc1f293536ad944b666859d98333114c4fe81 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 Nov 2019 16:09:37 +0100 Subject: [PATCH 058/179] fix processes with no intervals --- main.nf | 216 ++++++++++++++++++++++++++------------------------------ 1 file changed, 101 insertions(+), 115 deletions(-) diff --git a/main.nf b/main.nf index 60b1e7c3d5..457b993b65 100644 --- a/main.nf +++ b/main.nf @@ -468,7 +468,7 @@ process BuildDbsnpIndex { """ } -ch_dbsnpIndex = params.dbsnpIndex ? Channel.value(file(params.dbsnpIndex)) : dbsnpIndexBuilt +ch_dbsnpIndex = params.dbsnp ? params.dbsnpIndex ? Channel.value(file(params.dbsnpIndex)) : dbsnpIndexBuilt : "null" process BuildGermlineResourceIndex { tag {germlineResource} @@ -490,7 +490,7 @@ process BuildGermlineResourceIndex { """ } -ch_germlineResourceIndex = params.germlineResourceIndex ? Channel.value(file(params.germlineResourceIndex)) : germlineResourceIndexBuilt +ch_germlineResourceIndex = params.germlineResource ? params.germlineResourceIndex ? Channel.value(file(params.germlineResourceIndex)) : germlineResourceIndexBuilt : "null" process BuildKnownIndelsIndex { tag {knownIndels} @@ -512,7 +512,7 @@ process BuildKnownIndelsIndex { """ } -ch_knownIndelsIndex = params.knownIndelsIndex ? Channel.value(file(params.knownIndelsIndex)) : knownIndelsIndexBuilt.collect() +ch_knownIndelsIndex = params.knownIndels ? params.knownIndelsIndex ? Channel.value(file(params.knownIndelsIndex)) : knownIndelsIndexBuilt.collect() : "null" process BuildIntervals { tag {fastaFai} @@ -553,7 +553,7 @@ process CreateIntervalBeds { output: file '*.bed' into bedIntervals mode flatten - when: !(params.noIntervals) && step != 'annotate' + when: (!params.noIntervals) && step != 'annotate' script: // If the interval file is BED format, the fifth column is interpreted to @@ -606,6 +606,8 @@ bedIntervals = bedIntervals bedIntervals = bedIntervals.dump(tag:'bedintervals') +if (params.noIntervals) bedIntervals = Channel.from(file("no_intervals.bed")) + (intBaseRecalibrator, intApplyBQSR, intHaplotypeCaller, intMpileup, bedIntervals) = bedIntervals.into(5) // PREPARING CHANNELS FOR PREPROCESSING AND QC @@ -786,7 +788,8 @@ process MarkDuplicates { publishDir params.outdir, mode: params.publishDirMode, saveAs: { - if (it == "${idSample}.bam.metrics" && 'markduplicates' in skipQC) "Reports/${idSample}/MarkDuplicates/${it}" + if (it == "${idSample}.bam.metrics" && 'markduplicates' in skipQC) null + else if (it == "${idSample}.bam.metrics") "Reports/${idSample}/MarkDuplicates/${it}" else "Preprocessing/${idSample}/DuplicateMarked/${it}" } @@ -819,7 +822,7 @@ if ('markduplicates' in skipQC) markDuplicatesReport.close() duplicateMarkedBams = duplicateMarkedBams.dump(tag:'MD BAM') markDuplicatesReport = markDuplicatesReport.dump(tag:'MD Report') -(bamMD, bamBaseRecalibratorNoInt, bamMDToJoin, bamMDToJoinNoInt) = duplicateMarkedBams.into(4) +(bamMD, bamMDToJoin) = duplicateMarkedBams.into(2) bamBaseRecalibrator = bamMD.combine(intBaseRecalibrator) @@ -831,7 +834,7 @@ process BaseRecalibrator { label 'memory_max' label 'cpus_1' - tag {idPatient + "-" + idSample + "-" + intervalBed} + tag {idPatient + "-" + idSample + "-" + intervalBed.baseName} input: set idPatient, idSample, file(bam), file(bai), file(intervalBed) from bamBaseRecalibrator @@ -844,65 +847,39 @@ process BaseRecalibrator { file(knownIndelsIndex) from ch_knownIndelsIndex output: - set idPatient, idSample, file("${intervalBed.baseName}_${idSample}.recal.table") into tableGatherBQSRReports + set idPatient, idSample, file("${prefix}${idSample}.recal.table") into tableGatherBQSRReports + set idPatient, idSample into recalTableTSVnoInt - when: step == 'mapping' + when: step == 'mapping' && params.knownIndels script: dbsnpOptions = params.dbsnp ? "--known-sites ${dbsnp}" : "" knownOptions = params.knownIndels ? knownIndels.collect{"--known-sites ${it}"}.join(' ') : "" + prefix = params.noIntervals ? "" : "${intervalBed.baseName}_" + intervalsOptions = params.noIntervals ? "" : "-L ${intervalBed}" // TODO: --use-original-qualities ??? """ gatk --java-options -Xmx${task.memory.toGiga()}g \ BaseRecalibrator \ -I ${bam} \ - -O ${intervalBed.baseName}_${idSample}.recal.table \ + -O ${prefix}${idSample}.recal.table \ --tmp-dir /tmp \ -R ${fasta} \ - -L ${intervalBed} \ + ${intervalsOptions} \ ${dbsnpOptions} \ ${knownOptions} \ --verbosity INFO """ } -// STEP 3': CREATING RECALIBRATION TABLES WITHOUT INTERVALS - -process BaseRecalibratorNoIntervals { - label 'memory_max' - label 'cpus_1' - - tag {idPatient + "-" + idSample} - - input: - set idPatient, idSample, file(bam), file(bai) from bamBaseRecalibratorNoInt - file(fasta) from ch_fasta - file(dict) from ch_dict - file(fastaFai) from ch_fastaFai - file(knownIndels) from ch_knownIndels - file(knownIndelsIndex) from ch_knownIndelsIndex +if (!params.noIntervals) tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) - output: - set idPatient, idSample, file("${idSample}.recal.table") into recalNoInt +tableGatherBQSRReports = tableGatherBQSRReports.dump(tag:'BQSR REPORTS') - when: params.noIntervals && step == 'mapping' - - script: - knownOptions = params.knownIndels ? knownIndels.collect{"--known-sites ${it}"}.join(' ') : "" - // TODO: --use-original-qualities ??? - """ - gatk --java-options -Xmx${task.memory.toGiga()}g \ - BaseRecalibrator \ - -I ${bam} \ - -O ${idSample}.recal.table \ - --tmp-dir /tmp \ - -R ${fasta} \ - ${knownOptions} \ - --verbosity INFO - """ -} - -tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) +if (params.noIntervals) { + (tableGatherBQSRReports, tableGatherBQSRReportsNoInt) = tableGatherBQSRReports.into(2) + recalTable = tableGatherBQSRReportsNoInt +} else recalTableTSVnoInt.close() // STEP 3.5: MERGING RECALIBRATION TABLES @@ -919,9 +896,9 @@ process GatherBQSRReports { output: set idPatient, idSample, file("${idSample}.recal.table") into recalTable - set idPatient, idSample, val("${idSample}.md.bam"), val("${idSample}.md.bai"), val("${idSample}.recal.table") into (recalTableTSV, recalTableSampleTSV) + set idPatient, idSample into recalTableTSV - when: step == 'mapping' + when: step == 'mapping' && !(params.noIntervals) script: input = recal.collect{"-I ${it}"}.join(' ') @@ -933,32 +910,44 @@ process GatherBQSRReports { """ } +recalTable = recalTable.dump(tag:'RECAL TABLE') + +(recalTableTSV, recalTableSampleTSV) = recalTableTSV.mix(recalTableTSVnoInt).into(2) + // Create TSV files to restart from this step -recalTableTSV.map { idPatient, idSample, bam, bai, recalTable -> +recalTableTSV.map { idPatient, idSample -> status = statusMap[idPatient, idSample] gender = genderMap[idPatient] - "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bam}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bai}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${recalTable}\n" + bam = "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${idSample}.md.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${idSample}.md.bai" + recalTable = "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${idSample}.recal.table" + "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\t${recalTable}\n" }.collectFile( name: 'duplicateMarked.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" ) recalTableSampleTSV .collectFile(storeDir: "${params.outdir}/Preprocessing/TSV/") { - idPatient, idSample, bam, bai, recalTable -> + idPatient, idSample -> status = statusMap[idPatient, idSample] gender = genderMap[idPatient] - ["duplicateMarked_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bam}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bai}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${recalTable}\n"] + bam = "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${idSample}.md.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${idSample}.md.bai" + recalTable = "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${idSample}.recal.table" + ["duplicateMarked_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\t${recalTable}\n"] } bamApplyBQSR = bamMDToJoin.join(recalTable, by:[0,1]) if (step == 'recalibrate') bamApplyBQSR = inputSample -bamApplyBQSR = bamApplyBQSR.dump(tag:'recal.table') +bamApplyBQSR = bamApplyBQSR.dump(tag:'BAM + BAI + RECAL TABLE') +// [DUMP: recal.table] ['normal', 'normal', normal.md.bam, normal.md.bai, normal.recal.table] bamApplyBQSR = bamApplyBQSR.combine(intApplyBQSR) -bamApplyBQSRnoInt = bamMDToJoinNoInt.join(recalNoInt, by:[0,1]) +bamApplyBQSR = bamApplyBQSR.dump(tag:'BAM + BAI + RECAL TABLE + INT') +// [DUMP: BAM + BAI + RECAL TABLE + INT] ['normal', 'normal', normal.md.bam, normal.md.bai, normal.recal.table, 1_1-200000.bed] // STEP 4: RECALIBRATING @@ -975,56 +964,55 @@ process ApplyBQSR { file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, file("${intervalBed.baseName}_${idSample}.recal.bam") into bamMergeBamRecal + set idPatient, idSample, file("${prefix}${idSample}.recal.bam") into bamMergeBamRecal script: + prefix = params.noIntervals ? "" : "${intervalBed.baseName}_" + intervalsOptions = params.noIntervals ? "" : "-L ${intervalBed}" """ gatk --java-options -Xmx${task.memory.toGiga()}g \ ApplyBQSR \ -R ${fasta} \ --input ${bam} \ - --output ${intervalBed.baseName}_${idSample}.recal.bam \ - -L ${intervalBed} \ + --output ${prefix}${idSample}.recal.bam \ + ${intervalsOptions} \ --bqsr-recal-file ${recalibrationReport} """ } bamMergeBamRecal = bamMergeBamRecal.groupTuple(by:[0, 1]) +(bamMergeBamRecal, bamMergeBamRecalNoInt) = bamMergeBamRecal.into(2) -// STEP 4': RECALIBRATING WITHOUT INTERVALS +// STEP 4.5: MERGING THE RECALIBRATED BAM FILES -process ApplyBQSRnoIntervals { - label 'memory_singleCPU_2_task' - label 'cpus_2' +process MergeBamRecal { + label 'cpus_8' tag {idPatient + "-" + idSample} + publishDir "${params.outdir}/Preprocessing/${idSample}/Recalibrated", mode: params.publishDirMode + input: - set idPatient, idSample, file(bam), file(bai), file(recalibrationReport) from bamApplyBQSRnoInt - file(dict) from ch_dict - file(fasta) from ch_fasta - file(fastaFai) from ch_fastaFai + set idPatient, idSample, file(bam) from bamMergeBamRecal output: - set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecalNoInt + set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecal + set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalQC + set idPatient, idSample into bamRecalTSV + + when: !(params.noIntervals) script: """ - gatk --java-options -Xmx${task.memory.toGiga()}g \ - ApplyBQSR \ - -R ${fasta} \ - --input ${bam} \ - --output ${idSample}.recal.bam \ - --bqsr-recal-file ${recalibrationReport} - + samtools merge --threads ${task.cpus} ${idSample}.recal.bam ${bam} samtools index ${idSample}.recal.bam mv ${idSample}.recal.bam.bai ${idSample}.recal.bai """ } -// STEP 4.5: MERGING THE RECALIBRATED BAM FILES +// STEP 4.5': INDEXING THE RECALIBRATED BAM FILES -process MergeBamRecal { +process IndexBamRecal { label 'cpus_8' tag {idPatient + "-" + idSample} @@ -1032,36 +1020,48 @@ process MergeBamRecal { publishDir "${params.outdir}/Preprocessing/${idSample}/Recalibrated", mode: params.publishDirMode input: - set idPatient, idSample, file(bam) from bamMergeBamRecal + set idPatient, idSample, file("${idSample}.recal.bam") from bamMergeBamRecalNoInt output: - set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecal - set idPatient, idSample, file("${idSample}.recal.bam") into (bamRecalBamQC, bamRecalSamToolsStats) - set idPatient, idSample, val("${idSample}.recal.bam"), val("${idSample}.recal.bai") into (bamRecalTSV, bamRecalSampleTSV) + set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecalNoInt + set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalQCnoInt + set idPatient, idSample into bamRecalTSVnoInt + + when: params.noIntervals script: """ - samtools merge --threads ${task.cpus} ${idSample}.recal.bam ${bam} samtools index ${idSample}.recal.bam mv ${idSample}.recal.bam.bai ${idSample}.recal.bai """ } +bamRecal = bamRecal.mix(bamRecalNoInt) +bamRecalQC = bamRecalQC.mix(bamRecalQCnoInt) +bamRecalTSV = bamRecalTSV.mix(bamRecalTSVnoInt) + +(bamRecalBamQC, bamRecalSamToolsStats) = bamRecalQC.into(2) +(bamRecalTSV, bamRecalSampleTSV) = bamRecalTSV.into(2) + // Creating a TSV file to restart from this step -bamRecalTSV.map { idPatient, idSample, bam, bai -> +bamRecalTSV.map { idPatient, idSample -> gender = genderMap[idPatient] status = statusMap[idPatient, idSample] - "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/Recalibrated/${bam}\t${params.outdir}/Preprocessing/${idSample}/Recalibrated/${bai}\n" + bam = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bai" + "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n" }.collectFile( name: 'recalibrated.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" ) bamRecalSampleTSV .collectFile(storeDir: "${params.outdir}/Preprocessing/TSV") { - idPatient, idSample, bam, bai -> + idPatient, idSample -> status = statusMap[idPatient, idSample] gender = genderMap[idPatient] - ["recalibrated_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/Recalibrated/${bam}\t${params.outdir}/Preprocessing/${idSample}/Recalibrated/${bai}\n"] + bam = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bai" + ["recalibrated_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] } // STEP 5: QC @@ -1133,7 +1133,7 @@ bamQCReport = bamQCReport.dump(tag:'BamQC') ================================================================================ */ -bamRecal = params.knownIndels ? bamRecal.mix(bamRecalNoInt) : indexedBam +bamRecal = params.knownIndels ? bamRecal : indexedBam if (step == 'variantcalling') bamRecal = inputSample @@ -1960,7 +1960,7 @@ process Ascat { ascatOut.dump(tag:'ASCAT') -// STEP CONTROLFREEC.1 - MPILEUP +// STEP MPILEUP.1 process Mpileup { label 'memory_singleCPU_2_task' @@ -1973,45 +1973,30 @@ process Mpileup { file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, file("${intervalBed.baseName}_${idSample}.pileup.gz") into mpileupMerge + set idPatient, idSample, file("${prefix}${idSample}.pileup.gz") into mpileupMerge when: 'controlfreec' in tools || 'mpileup' in tools script: + prefix = params.noIntervals ? "" : "${intervalBed.baseName}_" + intervalsOptions = params.noIntervals ? "" : "-l ${intervalBed}" """ samtools mpileup \ -f ${fasta} ${bam} \ - -l ${intervalBed} \ - | bgzip --threads ${task.cpus} -c > ${intervalBed.baseName}_${idSample}.pileup.gz + ${intervalsOptions} \ + | bgzip --threads ${task.cpus} -c > ${prefix}${idSample}.pileup.gz """ } -mpileupMerge = mpileupMerge.groupTuple(by:[0, 1]) - -process MpileupNoIntervals { - label 'memory_singleCPU_2_task' - - tag {idSample} - - input: - set idPatient, idSample, file(bam), file(bai) from bamMpileupNoInt - file(fasta) from ch_fasta - file(fastaFai) from ch_fastaFai - - output: - set idPatient, idSample, file("${idSample}.pileup.gz") into mpileupNoIntOut - - when: params.noIntervals && 'mpileup' in tools - - script: - """ - samtools mpileup \ - -f ${fasta} ${bam} \ - | bgzip --threads ${task.cpus} -c > ${idSample}.pileup.gz - """ +if (!params.noIntervals) { + mpileupMerge = mpileupMerge.groupTuple(by:[0, 1]) + mpileupNoInt = Channel.empty() +} else { + (mpileupMerge, mpileupNoInt) = mpileupMerge.into(2) + mpileupMerge.close() } -// STEP CONTROLFREEC.2 - MERGE MPILEUP +// STEP MPILEUP.2 - MERGE process MergeMpileup { tag {idSample} @@ -2024,7 +2009,7 @@ process MergeMpileup { output: set idPatient, idSample, file("${idSample}.pileup.gz") into mpileupOut - when: 'controlfreec' in tools || 'mpileup' in tools + when: !(params.noIntervals) && 'controlfreec' in tools || 'mpileup' in tools script: """ @@ -2038,6 +2023,7 @@ process MergeMpileup { """ } +mpileupOut = mpileupOut.mix(mpileupNoInt) mpileupOut = mpileupOut.dump(tag:'mpileup') mpileupOutNormal = Channel.create() @@ -2054,7 +2040,7 @@ mpileupOut = mpileupOut.map { [idPatientNormal, idSampleNormal, idSampleTumor, mpileupOutNormal, mpileupOutTumor] } -// STEP CONTROLFREEC.3 - CONTROLFREEC +// STEP CONTROLFREEC.1 - CONTROLFREEC process ControlFREEC { label 'memory_singleCPU_2_task' From 4b7d1ffef54688310512591264df136620abac1e Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 Nov 2019 16:14:11 +0100 Subject: [PATCH 059/179] add comments --- main.nf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 457b993b65..b2345649af 100644 --- a/main.nf +++ b/main.nf @@ -73,18 +73,21 @@ def helpMessage() { If none provided, will be generated automatically --dbsnp dbsnp file --dbsnpIndex dbsnp index - If none provided, will be generated automatically + If none provided, will be generated automatically if a dbsnp file is provided --dict dict from the fasta reference If none provided, will be generated automatically --fasta fasta reference --fastafai reference index If none provided, will be generated automatically + --germlineResource Germline Resource File + --germlineResourceIndex Germline Resource Index + If none provided, will be generated automatically if a germlineResource file is provided --intervals intervals If none provided, will be generated automatically Use --noIntervals to disable automatic generation --knownIndels knownIndels file --knownIndelsIndex knownIndels index - If none provided, will be generated automatically + If none provided, will be generated automatically if a knownIndels file is provided --snpeffDb snpeffDb version --vepCacheVersion VEP Cache version From f1cdd93e75da91d04fecb96a4806e1e422c4dfa5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 Nov 2019 16:25:31 +0100 Subject: [PATCH 060/179] params noIntervals -> no_intervals --- main.nf | 58 ++++++++++++++++++++++++++----------------------- nextflow.config | 2 +- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/main.nf b/main.nf index a9387c0b79..ba1afa1e84 100644 --- a/main.nf +++ b/main.nf @@ -43,7 +43,7 @@ def helpMessage() { --genome Name of iGenomes reference --noGVCF No g.vcf output from HaplotypeCaller --noStrelkaBP Will not use Manta candidateSmallIndels for Strelka as Best Practice - --noIntervals Disable usage of intervals + --no_intervals Disable usage of intervals --nucleotidesPerSecond To estimate interval size Default: 1000.0 --targetBED Target BED file for targeted or whole exome sequencing @@ -70,24 +70,25 @@ def helpMessage() { --acLoci acLoci file --acLociGC acLoci GC file --bwaIndex bwa indexes - If none provided, will be generated automatically + If none provided, will be generated automatically from the fasta reference --dbsnp dbsnp file --dbsnpIndex dbsnp index If none provided, will be generated automatically if a dbsnp file is provided --dict dict from the fasta reference - If none provided, will be generated automatically + If none provided, will be generated automatically from the fasta reference --fasta fasta reference --fastafai reference index - If none provided, will be generated automatically + If none provided, will be generated automatically from the fasta reference --germlineResource Germline Resource File --germlineResourceIndex Germline Resource Index If none provided, will be generated automatically if a germlineResource file is provided --intervals intervals - If none provided, will be generated automatically - Use --noIntervals to disable automatic generation + If none provided, will be generated automatically from the fasta reference + Use --no_intervals to disable automatic generation --knownIndels knownIndels file --knownIndelsIndex knownIndels index If none provided, will be generated automatically if a knownIndels file is provided + --species species for VEP --snpeffDb snpeffDb version --vepCacheVersion VEP Cache version @@ -168,6 +169,7 @@ params.intervals = params.genome && !('annotate' in step) ? params.genomes[param params.knownIndels = params.genome && 'mapping' in step ? params.genomes[params.genome].knownIndels ?: null : null params.knownIndelsIndex = params.genome && params.knownIndels ? params.genomes[params.genome].knownIndelsIndex ?: null : null params.snpeffDb = params.genome && 'snpeff' in tools ? params.genomes[params.genome].snpeffDb ?: null : null +params.species = params.genome && 'vep' in tools ? params.genomes[params.genome].species ?: null : null params.vepCacheVersion = params.genome && 'vep' in tools ? params.genomes[params.genome].vepCacheVersion ?: null : null // Handle deprecation @@ -285,10 +287,11 @@ if (params.step) summary['Step'] = params.step if (params.tools) summary['Tools'] = tools.join(', ') if (params.skipQC) summary['QC tools skip'] = skipQC.join(', ') -if ('haplotypecaller' in tools) summary['GVCF'] = params.noGVCF ? 'No' : 'Yes' -if ('strelka' in tools && 'manta' in tools ) summary['Strelka BP'] = params.noStrelkaBP ? 'No' : 'Yes' -if (params.sequencing_center) summary['Sequenced by'] = params.sequencing_center -if (params.pon && 'mutect2' in tools) summary['Panel of normals'] = params.pon +if (params.no_intervals && step != 'annotate') summary['Intervals'] = 'Do not use' +if ('haplotypecaller' in tools) summary['GVCF'] = params.noGVCF ? 'No' : 'Yes' +if ('strelka' in tools && 'manta' in tools ) summary['Strelka BP'] = params.noStrelkaBP ? 'No' : 'Yes' +if (params.sequencing_center) summary['Sequenced by'] = params.sequencing_center +if (params.pon && 'mutect2' in tools) summary['Panel of normals'] = params.pon summary['Save Genome Index'] = params.saveGenomeIndex ? 'Yes' : 'No' summary['Nucleotides/s'] = params.nucleotidesPerSecond @@ -315,6 +318,7 @@ if (params.dbsnpIndex) summary['dbsnpIndex'] = params.dbsn if (params.knownIndels) summary['knownIndels'] = params.knownIndels if (params.knownIndelsIndex) summary['knownIndelsIndex'] = params.knownIndelsIndex if (params.snpeffDb) summary['snpeffDb'] = params.snpeffDb +if (params.species) summary['species'] = params.species if (params.vepCacheVersion) summary['vepCacheVersion'] = params.vepCacheVersion if (workflow.profile == 'awsbatch') { @@ -529,7 +533,7 @@ process BuildIntervals { output: file("${fastaFai.baseName}.bed") into intervalBuilt - when: !(params.intervals) && !('annotate' in step) && !(params.noIntervals) + when: !(params.intervals) && !('annotate' in step) && !(params.no_intervals) script: """ @@ -537,7 +541,7 @@ process BuildIntervals { """ } -ch_intervals = params.noIntervals ? "null" : params.intervals && !('annotate' in step) ? Channel.value(file(params.intervals)) : intervalBuilt +ch_intervals = params.no_intervals ? "null" : params.intervals && !('annotate' in step) ? Channel.value(file(params.intervals)) : intervalBuilt /* ================================================================================ @@ -556,7 +560,7 @@ process CreateIntervalBeds { output: file '*.bed' into bedIntervals mode flatten - when: (!params.noIntervals) && step != 'annotate' + when: (!params.no_intervals) && step != 'annotate' script: // If the interval file is BED format, the fifth column is interpreted to @@ -616,7 +620,7 @@ bedIntervals = bedIntervals bedIntervals = bedIntervals.dump(tag:'bedintervals') -if (params.noIntervals) bedIntervals = Channel.from(file("no_intervals.bed")) +if (params.no_intervals && step != 'annotate') bedIntervals = Channel.from(file("no_intervals.bed")) (intBaseRecalibrator, intApplyBQSR, intHaplotypeCaller, intMpileup, bedIntervals) = bedIntervals.into(5) @@ -865,8 +869,8 @@ process BaseRecalibrator { script: dbsnpOptions = params.dbsnp ? "--known-sites ${dbsnp}" : "" knownOptions = params.knownIndels ? knownIndels.collect{"--known-sites ${it}"}.join(' ') : "" - prefix = params.noIntervals ? "" : "${intervalBed.baseName}_" - intervalsOptions = params.noIntervals ? "" : "-L ${intervalBed}" + prefix = params.no_intervals ? "" : "${intervalBed.baseName}_" + intervalsOptions = params.no_intervals ? "" : "-L ${intervalBed}" // TODO: --use-original-qualities ??? """ gatk --java-options -Xmx${task.memory.toGiga()}g \ @@ -882,11 +886,11 @@ process BaseRecalibrator { """ } -if (!params.noIntervals) tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) +if (!params.no_intervals) tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) tableGatherBQSRReports = tableGatherBQSRReports.dump(tag:'BQSR REPORTS') -if (params.noIntervals) { +if (params.no_intervals) { (tableGatherBQSRReports, tableGatherBQSRReportsNoInt) = tableGatherBQSRReports.into(2) recalTable = tableGatherBQSRReportsNoInt } else recalTableTSVnoInt.close() @@ -908,7 +912,7 @@ process GatherBQSRReports { set idPatient, idSample, file("${idSample}.recal.table") into recalTable set idPatient, idSample into recalTableTSV - when: step == 'mapping' && !(params.noIntervals) + when: step == 'mapping' && !(params.no_intervals) script: input = recal.collect{"-I ${it}"}.join(' ') @@ -977,8 +981,8 @@ process ApplyBQSR { set idPatient, idSample, file("${prefix}${idSample}.recal.bam") into bamMergeBamRecal script: - prefix = params.noIntervals ? "" : "${intervalBed.baseName}_" - intervalsOptions = params.noIntervals ? "" : "-L ${intervalBed}" + prefix = params.no_intervals ? "" : "${intervalBed.baseName}_" + intervalsOptions = params.no_intervals ? "" : "-L ${intervalBed}" """ gatk --java-options -Xmx${task.memory.toGiga()}g \ ApplyBQSR \ @@ -1010,7 +1014,7 @@ process MergeBamRecal { set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalQC set idPatient, idSample into bamRecalTSV - when: !(params.noIntervals) + when: !(params.no_intervals) script: """ @@ -1037,7 +1041,7 @@ process IndexBamRecal { set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalQCnoInt set idPatient, idSample into bamRecalTSVnoInt - when: params.noIntervals + when: params.no_intervals script: """ @@ -1988,8 +1992,8 @@ process Mpileup { when: 'controlfreec' in tools || 'mpileup' in tools script: - prefix = params.noIntervals ? "" : "${intervalBed.baseName}_" - intervalsOptions = params.noIntervals ? "" : "-l ${intervalBed}" + prefix = params.no_intervals ? "" : "${intervalBed.baseName}_" + intervalsOptions = params.no_intervals ? "" : "-l ${intervalBed}" """ samtools mpileup \ -f ${fasta} ${bam} \ @@ -1998,7 +2002,7 @@ process Mpileup { """ } -if (!params.noIntervals) { +if (!params.no_intervals) { mpileupMerge = mpileupMerge.groupTuple(by:[0, 1]) mpileupNoInt = Channel.empty() } else { @@ -2019,7 +2023,7 @@ process MergeMpileup { output: set idPatient, idSample, file("${idSample}.pileup.gz") into mpileupOut - when: !(params.noIntervals) && 'controlfreec' in tools || 'mpileup' in tools + when: !(params.no_intervals) && 'controlfreec' in tools || 'mpileup' in tools script: """ diff --git a/nextflow.config b/nextflow.config index d4d5355c9c..4c18796b63 100644 --- a/nextflow.config +++ b/nextflow.config @@ -14,7 +14,7 @@ params { input = null // No default input noGVCF = null // g.vcf are produced by HaplotypeCaller noStrelkaBP = null // Strelka will use Manta candidateSmallIndels if available - noIntervals = null // Intervals will be built from the fastaFai file + no_intervals = null // Intervals will be built from the fasta file skipQC = null // All QC tools are used step = 'mapping' // Starts with mapping tools = null // No default Variant Calling or Annotation tools From daca2ba7213f1eceeb05c1f9d35dd56a9159c792 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 Nov 2019 16:56:43 +0100 Subject: [PATCH 061/179] sort genomes + add news --- conf/genomes.config | 10 ++- conf/igenomes.config | 142 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 143 insertions(+), 9 deletions(-) diff --git a/conf/genomes.config b/conf/genomes.config index 12993d52e1..acc6137506 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -26,8 +26,8 @@ params { knownIndels = "${params.genomes_base}/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf" knownIndelsIndex = "${params.genomes_base}/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf.idx" snpeffDb = 'GRCh37.75' - vepCacheVersion = '95' species = 'homo_sapiens' + vepCacheVersion = '95' } 'GRCh38' { acLoci = "${params.genomes_base}/1000G_phase3_GRCh38_maf0.3.loci" @@ -46,20 +46,18 @@ params { knownIndels = "${params.genomes_base}/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz" knownIndelsIndex = "${params.genomes_base}/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" snpeffDb = 'GRCh38.86' - vepCacheVersion = '95' species = 'homo_sapiens' + vepCacheVersion = '95' } 'smallGRCh37' { - acLoci = "${params.genomes_base}/1000G_phase3_20130502_SNP_maf0.3.small.loci" - acLociGC = "${params.genomes_base}/1000G_phase3_20130502_SNP_maf0.3.small.loci.gc" dbsnp = "${params.genomes_base}/dbsnp_138.b37.small.vcf.gz" fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" germlineResource = "${params.genomes_base}/dbsnp_138.b37.small.vcf.gz" intervals = "${params.genomes_base}/small.intervals" knownIndels = ["${params.genomes_base}/1000G_phase1.indels.b37.small.vcf.gz", "${params.genomes_base}/Mills_and_1000G_gold_standard.indels.b37.small.vcf.gz"] snpeffDb = 'GRCh37.75' - vepCacheVersion = '95' species = 'homo_sapiens' + vepCacheVersion = '95' } 'GRCm38' { bwaIndex = "${params.genomes_base}/genome.fa.{amb,ann,bwt,pac,sa}" @@ -74,8 +72,8 @@ params { knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = 'GRCm38.86' - vepCacheVersion = '98' species = 'mus_musculus' + vepCacheVersion = '98' } 'smallerGRCh37' { fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" diff --git a/conf/igenomes.config b/conf/igenomes.config index b06dffac39..0dc0f857a0 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -26,8 +26,8 @@ params { knownIndels = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/GATKBundle/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf" knownIndelsIndex = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh37/Annotation/GATKBundle/{1000G_phase1,Mills_and_1000G_gold_standard}.indels.b37.vcf.idx" snpeffDb = 'GRCh37.75' - vepCacheVersion = '95' species = 'homo_sapiens' + vepCacheVersion = '95' } 'GRCh38' { acLoci = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/ASCAT/1000G_phase3_GRCh38_maf0.3.loci" @@ -46,8 +46,8 @@ params { knownIndels = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Homo_sapiens/GATK/GRCh38/Annotation/GATKBundle/{Mills_and_1000G_gold_standard.indels.hg38,beta/Homo_sapiens_assembly38.known_indels}.vcf.gz.tbi" snpeffDb = 'GRCh38.86' - vepCacheVersion = '95' species = 'homo_sapiens' + vepCacheVersion = '95' } 'GRCm38' { bwaIndex = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" @@ -62,8 +62,144 @@ params { knownIndels = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" knownIndelsIndex = "${params.igenomes_base}/Mus_musculus/Annotation/MouseGenomeProject/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" snpeffDb = 'GRCm38.86' - vepCacheVersion = '98' species = 'mus_musculus' + vepCacheVersion = '98' + } + 'TAIR10' { + bwaIndex = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" + } + 'EB2' { + bwaIndex = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" + } + 'UMD3.1' { + bwaIndex = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" + } + 'WBcel235' { + bwaIndex = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" + } + 'CanFam3.1' { + bwaIndex = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" + } + 'GRCz10' { + bwaIndex = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" + } + 'BDGP6' { + bwaIndex = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" + } + 'EquCab2' { + bwaIndex = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" + } + 'EB1' { + bwaIndex = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" + } + 'Galgal4' { + bwaIndex = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" + } + 'Gm01' { + bwaIndex = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" + } + 'Mmul_1' { + bwaIndex = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" + } + 'IRGSP-1.0' { + bwaIndex = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" + } + 'CHIMP2.1.4' { + bwaIndex = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" + } + 'Rnor_6.0' { + bwaIndex = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" + } + 'R64-1-1' { + bwaIndex = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" + } + 'EF2' { + bwaIndex = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" + } + 'Sbi1' { + bwaIndex = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" + } + 'Sscrofa10.2' { + bwaIndex = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" + } + 'AGPv3' { + bwaIndex = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" + } + 'hg38' { + bwaIndex = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" + } + 'hg19' { + bwaIndex = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" + } + 'mm10' { + bwaIndex = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" + } + 'bosTau8' { + bwaIndex = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" + } + 'ce10' { + bwaIndex = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" + } + 'canFam3' { + bwaIndex = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" + } + 'danRer10' { + bwaIndex = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" + } + 'dm6' { + bwaIndex = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" + } + 'equCab2' { + bwaIndex = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" + } + 'galGal4' { + bwaIndex = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" + } + 'panTro4' { + bwaIndex = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" + } + 'rn6' { + bwaIndex = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" + } + 'sacCer3' { + bwaIndex = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" + } + 'susScr3' { + bwaIndex = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" } } } From 3fce99c6b3b9081c646f3b464d5df9f79f119dff Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 Nov 2019 17:08:04 +0100 Subject: [PATCH 062/179] code polishing --- scripts/run_tests.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index eb02a84d18..1f61b81207 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -84,7 +84,7 @@ else SUFFIX="" fi -OPTIONS="--tools FreeBayes,HaplotypeCaller,Manta,mpileup,Mutect2,Strelka" +OPTIONS="--tools FreeBayes,HaplotypeCaller,Manta,Mpileup,Mutect2,Strelka" if [[ $TEST == "GERMLINE" ]] && [[ $OFFLINE == false ]] then @@ -117,13 +117,13 @@ case $TEST in run_sarek --tools HaplotypeCaller --input results/Preprocessing/TSV/recalibrated.tsv --step variantCalling ;; MINIMAL) - run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 - run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 --noIntervals -resume - run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 -resume - run_sarek --tools manta,mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 --noIntervals -resume + run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 + run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 --noIntervals -resume + run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 -resume + run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 --noIntervals -resume ;; MULTIPLE) - run_sarek --tools FreeBayes,HaplotypeCaller,Manta,mpileup,Strelka,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv + run_sarek --tools FreeBayes,HaplotypeCaller,Manta,Mpileup,Strelka,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv ;; SOMATIC) run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv From 7adfe02a64eda25f3b9b7774d525f2c11bc74784 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 4 Nov 2019 17:08:11 +0100 Subject: [PATCH 063/179] update CHANGELOG --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7238d184b1..037e85c3f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,12 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts - [#52](https://github.com/nf-core/sarek/pull/52) - Add support for mouse data `GRCm38` +- [#60](https://github.com/nf-core/sarek/pull/60) - Add `no_intervals` params +- [#60](https://github.com/nf-core/sarek/pull/60) - Add automatic generation of `intervals` file with `BuildIntervals` process +- [#60](https://github.com/nf-core/sarek/pull/60) - Add minimal support for minimal genome (only `fasta`, or `fasta` + `knownIndels`) +- [#60](https://github.com/nf-core/sarek/pull/60) - Add new processes (`IndexBamFile`, `IndexBamRecal`) to deal with optional usage of interval files and minimal genome +- [#60](https://github.com/nf-core/sarek/pull/60) - Add tests for minimal genome usage +- [#60](https://github.com/nf-core/sarek/pull/60) - Add new minimal genomes (`AGPv3`, `BDGP6`, `CHIMP2.1.4`, `CanFam3.1`, `EB1`, `EB2`, `EF2`, `EquCab2`, `GRCz10`, `Galgal4`, `Gm01`, `IRGSP-1.0`, `Mmul_1`, `R64-1-1`, `Rnor_6.0`, `Sbi1`, `Sscrofa10.2`, `TAIR10`, `UMD3.1`, `WBcel235`, `bosTau8`, `canFam3`, `ce10`, `danRer10`, `dm6`, `equCab2`, `galGal4`, `hg19`, `hg38`, `mm10`, `panTro4`, `rn6`, `sacCer3`, `susScr3`) to `igenomes.config` ### `Changed` @@ -23,6 +29,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41), [#55](https://github.com/nf-core/sarek/pull/55) - Update `tiddit` from `2.7.1` to `2.8.1` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` - [#54](https://github.com/nf-core/sarek/pull/54) - Bump version to `2.5.2dev` +- [#60](https://github.com/nf-core/sarek/pull/60) - Some process (`BaseRecalibrator`, `ApplyBQSR`, `Mpileup`) have now optional usage of interval files +- [#60](https://github.com/nf-core/sarek/pull/60) - Update documentation ### `Removed` From 0401b894f459b873503ce6bf4d5c7550bf09f04f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 14:08:49 +0100 Subject: [PATCH 064/179] add split_fastq params to split the fastq files with the splitFastq() nf method --- main.nf | 39 ++++++++++++++++++++++++++++++--------- nextflow.config | 1 + 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/main.nf b/main.nf index 204f315b4d..84fe76fe79 100644 --- a/main.nf +++ b/main.nf @@ -575,21 +575,40 @@ bedIntervals = bedIntervals.dump(tag:'bedintervals') // PREPARING CHANNELS FOR PREPROCESSING AND QC -if (step == 'mapping') (inputReads, inputReadsFastQC) = inputSample.into(2) -else (inputReads, inputReadsFastQC) = Channel.empty().into(2) +inputPairReads = Channel.create() +inputBam = Channel.create() -inputPairReadsFastQC = Channel.create() -inputBAMFastQC = Channel.create() +inputSample.choice(inputPairReads, inputBam) {hasExtension(it[3], "bam") ? 1 : 0} -inputReadsFastQC.choice(inputPairReadsFastQC, inputBAMFastQC) {hasExtension(it[3], "bam") ? 1 : 0} +(inputBam, inputBamFastQC) = inputBam.into(2) // Removing inputFile2 wich is null in case of uBAM -inputBAMFastQC = inputBAMFastQC.map { +inputBamFastQC = inputBamFastQC.map { idPatient, idSample, idRun, inputFile1, inputFile2 -> [idPatient, idSample, idRun, inputFile1] } -inputReads = inputReads.dump(tag:'INPUT') +if (params.split_fastq){ + inputPairReads = inputPairReads + // newly splitfastq are named based on split, so the name is easier to catch + .splitFastq(by: params.split_fastq, compress:true, file:"split", pe:true) + .map {idPatient, idSample, idRun, reads1, reads2 -> + // The split fastq read1 is the 4th element (indexed 3) its name is split_3 + // The split fastq read2's name is split_4 + // It's followed by which split it's acutally based on the mother fastq file + // Index start at 1 + // Extracting the index to get a new IdRun + splitIndex = reads1.fileName.toString().minus("split_3.").minus(".gz") + newIdRun = idRun + "_" + splitIndex + // Giving the files a new nice name + newReads1 = file("${idSample}_${newIdRun}_R1.fastq.gz") + newReads2 = file("${idSample}_${newIdRun}_R2.fastq.gz") + [idPatient, idSample, newIdRun, reads1, reads2]} +} + +inputPairReads = inputPairReads.dump(tag:'INPUT') + +(inputPairReads, inputPairReadsFastQC) = inputPairReads.into(2) // STEP 0.5: QC ON READS @@ -625,7 +644,7 @@ process FastQCBAM { publishDir "${params.outdir}/Reports/${idSample}/FastQC/${idSample}_${idRun}", mode: params.publishDirMode input: - set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") from inputBAMFastQC + set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") from inputBamFastQC output: file("*.{html,zip}") into fastQCBAMReport @@ -644,6 +663,8 @@ fastQCReport = fastQCReport.dump(tag:'FastQC') // STEP 1: MAPPING READS TO REFERENCE GENOME WITH BWA MEM +inputReads = inputPairReads.mix(inputBam) + process MapReads { label 'cpus_max' @@ -656,7 +677,7 @@ process MapReads { output: set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped - set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC + set idPatient, val("${idSample}_${idRun}"), file("${idSample}_${idRun}.bam") into bamMappedBamQC when: step == 'mapping' diff --git a/nextflow.config b/nextflow.config index 4632a988a6..d5ef7098be 100644 --- a/nextflow.config +++ b/nextflow.config @@ -24,6 +24,7 @@ params { genesplicer = null // genesplicer disabled markdup_java_options = '"-Xms4000m -Xmx7g"' //Established values for markDuplicate memory consumption, see https://github.com/SciLifeLab/Sarek/pull/689 for details nucleotidesPerSecond = 1000.0 // Default interval size + split_fastq = null // Fastq files will not be split by default outdir = './results' publishDirMode = 'copy' // Default PublishDirMode (same as other nf-core pipelines) saveGenomeIndex = null // Built Indexes not saved From bab56042662f984e614bfec42a3811f4f8201bf0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 14:33:47 +0100 Subject: [PATCH 065/179] add tests --- .github/workflows/ci-extra.yml | 2 +- scripts/run_tests.sh | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index d37a33aae0..aae78639a2 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - test: [ANNOTATESNPEFF, GERMLINE, SOMATIC, TARGETED] + test: [ANNOTATESNPEFF, GERMLINE, SOMATIC, SPLITFASTQ, TARGETED] nxf_ver: ['19.04.0', ''] steps: - uses: actions/checkout@v1 diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index cb6db88901..1057692a41 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -122,6 +122,9 @@ case $TEST in SOMATIC) run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv ;; + SPLITFASTQ) + run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --split_fastq 500 + ;; TARGETED) run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --targetBED ${PATHTOSAMPLE}/target.bed ;; From cbd81569a5e8dc0747ce7671eed7de14c8f21077 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 14:38:19 +0100 Subject: [PATCH 066/179] temporarely remove TIDDIT tests --- scripts/run_tests.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index 1057692a41..e350e7f60c 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -84,7 +84,7 @@ else SUFFIX="" fi -OPTIONS="--tools FreeBayes,HaplotypeCaller,Manta,Mutect2,Strelka,TIDDIT" +OPTIONS="--tools FreeBayes,HaplotypeCaller,Manta,Mutect2,Strelka" if [[ $TEST == "GERMLINE" ]] && [[ $OFFLINE == false ]] then @@ -117,7 +117,7 @@ case $TEST in run_sarek --tools HaplotypeCaller --input results/Preprocessing/TSV/recalibrated.tsv --step variantCalling ;; MULTIPLE) - run_sarek --tools FreeBayes,HaplotypeCaller,Manta,Strelka,TIDDIT,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv + run_sarek --tools FreeBayes,HaplotypeCaller,Manta,Strelka,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv ;; SOMATIC) run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv From f3312d95b0e89791560d34dfcfae14471ba1debf Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 14:58:23 +0100 Subject: [PATCH 067/179] add sention for bwa mem --- conf/base.config | 3 +++ main.nf | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/conf/base.config b/conf/base.config index 5c76d275e6..65190bff68 100644 --- a/conf/base.config +++ b/conf/base.config @@ -75,4 +75,7 @@ process { container = {(params.annotation_cache && params.vep_cache) ? 'nfcore/sarek:dev' : "nfcore/sarekvep:dev.${params.genome}"} errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} } + withLabel:sentieon { + beforeScript = {params.sentieon ? 'module load sentieon/201808.05 samtools/1.9' : ''} + } } diff --git a/main.nf b/main.nf index 052b7fb26b..778547fdc5 100644 --- a/main.nf +++ b/main.nf @@ -653,6 +653,7 @@ fastQCReport = fastQCReport.dump(tag:'FastQC') process MapReads { label 'cpus_max' + label 'sentieon' tag {idPatient + "-" + idRun} @@ -680,12 +681,19 @@ process MapReads { extra = status == 1 ? "-B 3" : "" convertToFastq = hasExtension(inputFile1, "bam") ? "gatk --java-options -Xmx${task.memory.toGiga()}g SamToFastq --INPUT=${inputFile1} --FASTQ=/dev/stdout --INTERLEAVE=true --NON_PF=true | \\" : "" input = hasExtension(inputFile1, "bam") ? "-p /dev/stdin - 2> >(tee ${inputFile1}.bwa.stderr.log >&2)" : "${inputFile1} ${inputFile2}" + if (!params.sentieon) """ ${convertToFastq} bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ ${input} | \ samtools sort --threads ${task.cpus} -m 2G - > ${idSample}_${idRun}.bam """ + else + """ + sentieon bwa mem -K 100000000 -R \"${readGroup}\" -t ${task.cpus} -M ${fasta} \ + ${input} | \ + sentieon util sort -r ${fasta} -o ${idSample}_${idRun}.sorted.bam -t ${task.cpus} --sam2bam -i - + """ } bamMapped = bamMapped.dump(tag:'Mapped BAM') From 9f085337c0c71bf43522f9fbacdb37142718a7e8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 15:05:29 +0100 Subject: [PATCH 068/179] disable docker and singularity --- conf/base.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/base.config b/conf/base.config index 65190bff68..52c511593f 100644 --- a/conf/base.config +++ b/conf/base.config @@ -77,5 +77,7 @@ process { } withLabel:sentieon { beforeScript = {params.sentieon ? 'module load sentieon/201808.05 samtools/1.9' : ''} + docker.enabled = {params.sentieon ? false : false} + singularity.enabled = {params.sentieon ? false : false} } } From 477a99f6a5d1f03d7db4ee2322531e43cbeaabf7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 15:07:58 +0100 Subject: [PATCH 069/179] disable container --- conf/base.config | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/conf/base.config b/conf/base.config index 52c511593f..443701a2f5 100644 --- a/conf/base.config +++ b/conf/base.config @@ -77,7 +77,6 @@ process { } withLabel:sentieon { beforeScript = {params.sentieon ? 'module load sentieon/201808.05 samtools/1.9' : ''} - docker.enabled = {params.sentieon ? false : false} - singularity.enabled = {params.sentieon ? false : false} + container = {params.sentieon ? '' : 'nfcore/sarek:dev'} } } From 0cf67cab1876182db12d5b6ae4174e1e703b09e4 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 15:18:39 +0100 Subject: [PATCH 070/179] add fastaFai for bwamem --- main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/main.nf b/main.nf index 778547fdc5..24627eec4a 100644 --- a/main.nf +++ b/main.nf @@ -661,6 +661,7 @@ process MapReads { set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputReads file(bwaIndex) from ch_bwaIndex file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai output: set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped From c55c19f90efc50dee2a471cd1557df3f8d631611 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 15:23:24 +0100 Subject: [PATCH 071/179] remove module samtools from label sentieon --- conf/base.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/base.config b/conf/base.config index 443701a2f5..3eeac179f5 100644 --- a/conf/base.config +++ b/conf/base.config @@ -76,7 +76,7 @@ process { errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} } withLabel:sentieon { - beforeScript = {params.sentieon ? 'module load sentieon/201808.05 samtools/1.9' : ''} + beforeScript = {params.sentieon ? 'module load sentieon/201808.05' : ''} container = {params.sentieon ? '' : 'nfcore/sarek:dev'} } } From 6a06f02c3fc0fd8b0ff0dbc2c0265c11e6bf1378 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 15:23:38 +0100 Subject: [PATCH 072/179] fix output from bwa mem --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 24627eec4a..908b5b2d3d 100644 --- a/main.nf +++ b/main.nf @@ -693,7 +693,7 @@ process MapReads { """ sentieon bwa mem -K 100000000 -R \"${readGroup}\" -t ${task.cpus} -M ${fasta} \ ${input} | \ - sentieon util sort -r ${fasta} -o ${idSample}_${idRun}.sorted.bam -t ${task.cpus} --sam2bam -i - + sentieon util sort -r ${fasta} -o ${idSample}_${idRun}.bam -t ${task.cpus} --sam2bam -i - """ } From aea3512c1fb3499aa2956a9acc258bfb54070c83 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 15:52:28 +0100 Subject: [PATCH 073/179] fix output channel BamMapped from MapReads --- main.nf | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 908b5b2d3d..267ffc9c34 100644 --- a/main.nf +++ b/main.nf @@ -664,7 +664,7 @@ process MapReads { file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped + set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam"), file("${idSample}_${idRun}.bam.bai") into bamMapped set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC when: step == 'mapping' @@ -688,6 +688,7 @@ process MapReads { bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ ${input} | \ samtools sort --threads ${task.cpus} -m 2G - > ${idSample}_${idRun}.bam + touch ${idSample}_${idRun}.bam.bai """ else """ @@ -697,8 +698,12 @@ process MapReads { """ } -bamMapped = bamMapped.dump(tag:'Mapped BAM') +if (!params.sentieon) { + bamMapped = bamMapped.map{idPatient, idSample, idRun, bam, bai -> + [idPatient, idSample, idRun, bam]} +} +bamMapped = bamMapped.dump(tag:'Mapped BAM') // Sort BAM whether they are standalone or should be merged singleBam = Channel.create() From b93b1f25214285f9ab49a7e9fb14b65a13c0961a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 15:52:48 +0100 Subject: [PATCH 074/179] set params.sentieon to null by default --- nextflow.config | 1 + 1 file changed, 1 insertion(+) diff --git a/nextflow.config b/nextflow.config index 4632a988a6..a39be4f66a 100644 --- a/nextflow.config +++ b/nextflow.config @@ -28,6 +28,7 @@ params { publishDirMode = 'copy' // Default PublishDirMode (same as other nf-core pipelines) saveGenomeIndex = null // Built Indexes not saved sequencing_center = null // No sequencing center to be writen in BAM header in MapReads process + sentieon = null // Not using Sentieon by default // Optional files/directory cadd_InDels = false // No CADD files From 313fda0eb2b74b5ba20e386445a2ae086728f302 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:18:34 +0100 Subject: [PATCH 075/179] add SentieonDedup process --- main.nf | 56 +++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 49 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index 267ffc9c34..6c4b77e157 100644 --- a/main.nf +++ b/main.nf @@ -664,7 +664,7 @@ process MapReads { file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam"), file("${idSample}_${idRun}.bam.bai") into bamMapped + set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC when: step == 'mapping' @@ -688,7 +688,6 @@ process MapReads { bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ ${input} | \ samtools sort --threads ${task.cpus} -m 2G - > ${idSample}_${idRun}.bam - touch ${idSample}_${idRun}.bam.bai """ else """ @@ -698,11 +697,6 @@ process MapReads { """ } -if (!params.sentieon) { - bamMapped = bamMapped.map{idPatient, idSample, idRun, bam, bai -> - [idPatient, idSample, idRun, bam]} -} - bamMapped = bamMapped.dump(tag:'Mapped BAM') // Sort BAM whether they are standalone or should be merged @@ -741,6 +735,11 @@ mergedBam = mergedBam.dump(tag:'Merged BAM') mergedBam = mergedBam.mix(singleBam) mergedBam = mergedBam.dump(tag:'BAMs for MD') +(mergedBam, mergedBamForSentieion) = mergedBam.into(2) + +if (params.sentieon) mergedBam.close() +else mergedBamForSentieion.close() + // STEP 2: MARKING DUPLICATES process MarkDuplicates { @@ -788,6 +787,49 @@ bamBaseRecalibrator = bamMD.combine(intBaseRecalibrator) bamBaseRecalibrator = bamBaseRecalibrator.dump(tag:'BAM FOR BASERECALIBRATOR') +// STEP 2': SENTIEON DEDUP + +process SentieonDedup { + label 'cpus_16' + label 'sentieon' + + tag {idPatient + "-" + idSample} + + publishDir params.outdir, mode: params.publishDirMode, + saveAs: { + if (it == "${idSample}_*.txt" && 'sentieon' in skipQC) "Reports/${idSample}/Sentieion/${it}" + else "Preprocessing/${idSample}/Deduped/${it}" + } + + input: + set idPatient, idSample, file("${idSample}.bam") from mergedBamForSentieion + file(fasta) from ch_fasta + + output: + set idPatient, idSample, file("${idSample}.deduped.bam") into dedupedSentieionBams + file("${idSample}_*.txt") into dedupedSentieionBamsQC + + when: step == 'mapping' && params.sentieon + + script: + markdup_java_options = task.memory.toGiga() > 8 ? params.markdup_java_options : "\"-Xms" + (task.memory.toGiga() / 2).trunc() + "g -Xmx" + (task.memory.toGiga() - 1) + "g\"" + """ + sentieon driver -t ${task.cpus} -r ${fasta} -i ${idSample}.bam \ + --algo GCBias --summary ${idSample}_gc_summary.txt ${idSample}_gc_metric.txt \ + --algo MeanQualityByCycle ${idSample}_mq_metric.txt \ + --algo QualDistribution ${idSample}_qd_metric.txt \ + --algo InsertSizeMetricAlgo ${idSample}_is_metric.txt \ + --algo AlignmentStat ${idSample}_aln_metric.txt + + sentieon driver -t $THREADS -i ${idSample}.bam \ + --algo LocusCollector --fun score_info ${idSample}_score.gz + + sentieon driver -t $THREADS -i ${idSample}.bam \ + --algo Dedup --rmdup --score_info ${idSample}_score.gz \ + --metrics ${idSample}_dedup_metric.txt ${idSample}.deduped.bam + """ +} + // STEP 3: CREATING RECALIBRATION TABLES process BaseRecalibrator { From 152016edd71d3e0ee45f0a800abab75ef2354fc7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:19:55 +0100 Subject: [PATCH 076/179] fix typo --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 6c4b77e157..46bd1be79d 100644 --- a/main.nf +++ b/main.nf @@ -821,10 +821,10 @@ process SentieonDedup { --algo InsertSizeMetricAlgo ${idSample}_is_metric.txt \ --algo AlignmentStat ${idSample}_aln_metric.txt - sentieon driver -t $THREADS -i ${idSample}.bam \ + sentieon driver -t ${task.cpus} -i ${idSample}.bam \ --algo LocusCollector --fun score_info ${idSample}_score.gz - sentieon driver -t $THREADS -i ${idSample}.bam \ + sentieon driver -t ${task.cpus} -i ${idSample}.bam \ --algo Dedup --rmdup --score_info ${idSample}_score.gz \ --metrics ${idSample}_dedup_metric.txt ${idSample}.deduped.bam """ From 962600e2687e3560c9bbba4347e49690ae722087 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:21:20 +0100 Subject: [PATCH 077/179] add fastaFai to SentieonDedup process --- main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/main.nf b/main.nf index 46bd1be79d..2790b4acad 100644 --- a/main.nf +++ b/main.nf @@ -804,6 +804,7 @@ process SentieonDedup { input: set idPatient, idSample, file("${idSample}.bam") from mergedBamForSentieion file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai output: set idPatient, idSample, file("${idSample}.deduped.bam") into dedupedSentieionBams From 22f545cbabf8673b3c30b05f7282bf0fd6e5f1ad Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:28:05 +0100 Subject: [PATCH 078/179] fix bam indexing --- main.nf | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index 2790b4acad..05a5a85a39 100644 --- a/main.nf +++ b/main.nf @@ -664,7 +664,7 @@ process MapReads { file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped + set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam"), file("${idSample}_${idRun}.bam.bai") into bamMapped set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC when: step == 'mapping' @@ -688,6 +688,7 @@ process MapReads { bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ ${input} | \ samtools sort --threads ${task.cpus} -m 2G - > ${idSample}_${idRun}.bam + samtools index ${idSample}_${idRun}.bam """ else """ @@ -721,22 +722,24 @@ process MergeBamMapped { set idPatient, idSample, idRun, file(bam) from multipleBam output: - set idPatient, idSample, file("${idSample}.bam") into mergedBam + set idPatient, idSample, file("${idSample}.bam"), file("${idSample}.bam.bai") into mergedBam when: step == 'mapping' script: """ samtools merge --threads ${task.cpus} ${idSample}.bam ${bam} + samtools index ${idSample}.bam """ } mergedBam = mergedBam.dump(tag:'Merged BAM') -mergedBam = mergedBam.mix(singleBam) -mergedBam = mergedBam.dump(tag:'BAMs for MD') (mergedBam, mergedBamForSentieion) = mergedBam.into(2) +mergedBam = mergedBam.mix(singleBam) +mergedBam = mergedBam.dump(tag:'BAMs for MD') + if (params.sentieon) mergedBam.close() else mergedBamForSentieion.close() @@ -971,15 +974,14 @@ process MergeBamRecal { set idPatient, idSample, file(bam) from bamMergeBamRecal output: - set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecal + set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bam.bai") into bamRecal set idPatient, idSample, file("${idSample}.recal.bam") into (bamRecalBamQC, bamRecalSamToolsStats) - set idPatient, idSample, val("${idSample}.recal.bam"), val("${idSample}.recal.bai") into (bamRecalTSV, bamRecalSampleTSV) + set idPatient, idSample, val("${idSample}.recal.bam"), val("${idSample}.recal.bam.bai") into (bamRecalTSV, bamRecalSampleTSV) script: """ samtools merge --threads ${task.cpus} ${idSample}.recal.bam ${bam} samtools index ${idSample}.recal.bam - mv ${idSample}.recal.bam.bai ${idSample}.recal.bai """ } From ea839de82c3480ea6ec89c1b0b6b5065312079d8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:30:49 +0100 Subject: [PATCH 079/179] fix bam indexing --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 05a5a85a39..c8759c2d67 100644 --- a/main.nf +++ b/main.nf @@ -757,7 +757,7 @@ process MarkDuplicates { } input: - set idPatient, idSample, file("${idSample}.bam") from mergedBam + set idPatient, idSample, file("${idSample}.bam"), file("${idSample}.bam.bai") from mergedBam output: set idPatient, idSample, file("${idSample}.md.bam"), file("${idSample}.md.bai") into duplicateMarkedBams @@ -805,7 +805,7 @@ process SentieonDedup { } input: - set idPatient, idSample, file("${idSample}.bam") from mergedBamForSentieion + set idPatient, idSample, file("${idSample}.bam"), file("${idSample}.bam.bai") from mergedBamForSentieion file(fasta) from ch_fasta file(fastaFai) from ch_fastaFai From 3419fd94e2bcee255999476d9cb005802d2e99b8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:32:11 +0100 Subject: [PATCH 080/179] fix bam indexing --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index c8759c2d67..c3f59a6344 100644 --- a/main.nf +++ b/main.nf @@ -719,7 +719,7 @@ process MergeBamMapped { tag {idPatient + "-" + idSample} input: - set idPatient, idSample, idRun, file(bam) from multipleBam + set idPatient, idSample, idRun, file(bam), file(bai) from multipleBam output: set idPatient, idSample, file("${idSample}.bam"), file("${idSample}.bam.bai") into mergedBam From 4f6154e05db11628b5db4f687574c24d7ee8fb55 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:45:25 +0100 Subject: [PATCH 081/179] add SentieonBQSR --- main.nf | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index c3f59a6344..becb979d8f 100644 --- a/main.nf +++ b/main.nf @@ -801,7 +801,7 @@ process SentieonDedup { publishDir params.outdir, mode: params.publishDirMode, saveAs: { if (it == "${idSample}_*.txt" && 'sentieon' in skipQC) "Reports/${idSample}/Sentieion/${it}" - else "Preprocessing/${idSample}/Deduped/${it}" + else "Preprocessing/${idSample}/DedupedSentieon/${it}" } input: @@ -810,8 +810,8 @@ process SentieonDedup { file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, file("${idSample}.deduped.bam") into dedupedSentieionBams - file("${idSample}_*.txt") into dedupedSentieionBamsQC + set idPatient, idSample, file("${idSample}.deduped.bam"), file("${idSample}.deduped.bam.bai") into dedupedSentieionBam + file("${idSample}_*.txt") into dedupedSentieionBamQC when: step == 'mapping' && params.sentieon @@ -876,6 +876,67 @@ process BaseRecalibrator { tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) +// STEP 3': SENTIEON BQSR + +process SentieonBQSR { + label 'memory_max' + label 'cpus_1' + + tag {idPatient + "-" + idSample} + + publishDir params.outdir, mode: params.publishDirMode, + saveAs: { + if (it == "${idSample}_recal_result.csv" && 'sentieon' in skipQC) "Reports/${idSample}/Sentieion/${it}" + else "Preprocessing/${idSample}/RecalSentieon/${it}" + } + + input: + set idPatient, idSample, file(bam), file(bai) from dedupedSentieionBam + file(dbsnp) from ch_dbsnp + file(dbsnpIndex) from ch_dbsnpIndex + file(fasta) from ch_fasta + file(dict) from ch_dict + file(fastaFai) from ch_fastaFai + file(knownIndels) from ch_knownIndels + file(knownIndelsIndex) from ch_knownIndelsIndex + + output: + set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bam.bai") into bamRecalSentieon + file("${idSample}_recal_result.CSV") into bamRecalSentieonQC + + when: step == 'mapping' && params.sentieon + + script: + known = knownIndels.collect{"--known-sites ${it}"}.join(' ') + """ + sentieon driver \ + -t ${task.cpus} \ + -r ${fasta} \ + -i ${idSample}.deduped.bam \ + --algo QualCal \ + -k ${dbsnp} \ + ${idSample}.recal.table + + sentieon driver \ + -t ${task.cpus} \ + -r ${fasta} \ + -i ${idSample}.deduped.bam \ + -q ${idSample}.recal.table \ + --algo QualCal \ + -k ${dbsnp} \ + ${idSample}.table.post \ + --algo ReadWriter ${idSample}.recal.bam + + sentieon driver \ + -t ${task.cpus} \ + --algo QualCal \ + --plot \ + --before ${idSample}.recal.table \ + --after ${idSample}.table.post \ + ${idSample}_recal_result.csv + """ +} + // STEP 3.5: MERGING RECALIBRATION TABLES process GatherBQSRReports { @@ -1071,6 +1132,8 @@ bamQCReport = bamQCReport.dump(tag:'BamQC') ================================================================================ */ +if (params.sentieon) bamRecal = bamRecalSentieon + if (step == 'variantcalling') bamRecal = inputSample bamRecal = bamRecal.dump(tag:'BAM') From 7e00bb22cb942226b2772b9e32537f7afecd2232 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:46:57 +0100 Subject: [PATCH 082/179] add label sentieon to SentieonBQSR --- main.nf | 1 + 1 file changed, 1 insertion(+) diff --git a/main.nf b/main.nf index becb979d8f..cc4de4e3f4 100644 --- a/main.nf +++ b/main.nf @@ -880,6 +880,7 @@ tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) process SentieonBQSR { label 'memory_max' + label 'sentieon' label 'cpus_1' tag {idPatient + "-" + idSample} From 04395c7b53dd6ca465790f27914e8e67a6172d65 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 5 Nov 2019 16:48:45 +0100 Subject: [PATCH 083/179] fix metrics output for SentieonBQSR --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index cc4de4e3f4..4fad762a52 100644 --- a/main.nf +++ b/main.nf @@ -903,7 +903,7 @@ process SentieonBQSR { output: set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bam.bai") into bamRecalSentieon - file("${idSample}_recal_result.CSV") into bamRecalSentieonQC + file("${idSample}_recal_result.csv") into bamRecalSentieonQC when: step == 'mapping' && params.sentieon From c31bf4ee4750e8f11651a51a79763462d65b53e8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 8 Nov 2019 11:02:34 +0100 Subject: [PATCH 084/179] increase cpus for Sentieon BQSR --- main.nf | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 4fad762a52..a317d8c012 100644 --- a/main.nf +++ b/main.nf @@ -692,7 +692,7 @@ process MapReads { """ else """ - sentieon bwa mem -K 100000000 -R \"${readGroup}\" -t ${task.cpus} -M ${fasta} \ + sentieon bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ ${input} | \ sentieon util sort -r ${fasta} -o ${idSample}_${idRun}.bam -t ${task.cpus} --sam2bam -i - """ @@ -881,7 +881,6 @@ tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) process SentieonBQSR { label 'memory_max' label 'sentieon' - label 'cpus_1' tag {idPatient + "-" + idSample} From 2d5f759cb1068c31362b699f1e131f89c6f5cae0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 8 Nov 2019 12:02:52 +0100 Subject: [PATCH 085/179] remove indexing --- main.nf | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index a317d8c012..bb8f6d3c1f 100644 --- a/main.nf +++ b/main.nf @@ -664,7 +664,7 @@ process MapReads { file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam"), file("${idSample}_${idRun}.bam.bai") into bamMapped + set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC when: step == 'mapping' @@ -688,7 +688,6 @@ process MapReads { bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ ${input} | \ samtools sort --threads ${task.cpus} -m 2G - > ${idSample}_${idRun}.bam - samtools index ${idSample}_${idRun}.bam """ else """ @@ -719,17 +718,16 @@ process MergeBamMapped { tag {idPatient + "-" + idSample} input: - set idPatient, idSample, idRun, file(bam), file(bai) from multipleBam + set idPatient, idSample, idRun, file(bam) from multipleBam output: - set idPatient, idSample, file("${idSample}.bam"), file("${idSample}.bam.bai") into mergedBam + set idPatient, idSample, file("${idSample}.bam") into mergedBam when: step == 'mapping' script: """ samtools merge --threads ${task.cpus} ${idSample}.bam ${bam} - samtools index ${idSample}.bam """ } @@ -757,7 +755,7 @@ process MarkDuplicates { } input: - set idPatient, idSample, file("${idSample}.bam"), file("${idSample}.bam.bai") from mergedBam + set idPatient, idSample, file("${idSample}.bam") from mergedBam output: set idPatient, idSample, file("${idSample}.md.bam"), file("${idSample}.md.bai") into duplicateMarkedBams @@ -805,7 +803,7 @@ process SentieonDedup { } input: - set idPatient, idSample, file("${idSample}.bam"), file("${idSample}.bam.bai") from mergedBamForSentieion + set idPatient, idSample, file("${idSample}.bam") from mergedBamForSentieion file(fasta) from ch_fasta file(fastaFai) from ch_fastaFai From 23a88b3368be399480455f35a1f5a9d6544765e6 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 11 Nov 2019 10:33:27 +0100 Subject: [PATCH 086/179] add index for dedup --- main.nf | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/main.nf b/main.nf index bb8f6d3c1f..ece1cf0254 100644 --- a/main.nf +++ b/main.nf @@ -733,14 +733,34 @@ process MergeBamMapped { mergedBam = mergedBam.dump(tag:'Merged BAM') -(mergedBam, mergedBamForSentieion) = mergedBam.into(2) - mergedBam = mergedBam.mix(singleBam) mergedBam = mergedBam.dump(tag:'BAMs for MD') +(mergedBam, mergedBamForSentieion) = mergedBam.into(2) + if (params.sentieon) mergedBam.close() else mergedBamForSentieion.close() +process IndexBamMergedForSentieon { + label 'cpus_8' + + tag {idPatient + "-" + idSample} + + input: + set idPatient, idSample, file(bam) from mergedBamForSentieion + + output: + set idPatient, idSample, file(bam), file("${idSample}.bam.bai") into bamForSentieionDedup + + when: step == 'mapping' && params.sentieon + + script: + """ + samtools index ${bam} + """ +} + + // STEP 2: MARKING DUPLICATES process MarkDuplicates { @@ -798,12 +818,13 @@ process SentieonDedup { publishDir params.outdir, mode: params.publishDirMode, saveAs: { - if (it == "${idSample}_*.txt" && 'sentieon' in skipQC) "Reports/${idSample}/Sentieion/${it}" + if (it == "${idSample}_*.txt" && 'sentieon' in skipQC) null + else if (it == "${idSample}_*.txt") "Reports/${idSample}/Sentieion/${it}" else "Preprocessing/${idSample}/DedupedSentieon/${it}" } input: - set idPatient, idSample, file("${idSample}.bam") from mergedBamForSentieion + set idPatient, idSample, file(bam), file(bai) from bamForSentieionDedup file(fasta) from ch_fasta file(fastaFai) from ch_fastaFai @@ -814,19 +835,18 @@ process SentieonDedup { when: step == 'mapping' && params.sentieon script: - markdup_java_options = task.memory.toGiga() > 8 ? params.markdup_java_options : "\"-Xms" + (task.memory.toGiga() / 2).trunc() + "g -Xmx" + (task.memory.toGiga() - 1) + "g\"" """ - sentieon driver -t ${task.cpus} -r ${fasta} -i ${idSample}.bam \ + sentieon driver -t ${task.cpus} -r ${fasta} -i ${bam} \ --algo GCBias --summary ${idSample}_gc_summary.txt ${idSample}_gc_metric.txt \ --algo MeanQualityByCycle ${idSample}_mq_metric.txt \ --algo QualDistribution ${idSample}_qd_metric.txt \ --algo InsertSizeMetricAlgo ${idSample}_is_metric.txt \ --algo AlignmentStat ${idSample}_aln_metric.txt - sentieon driver -t ${task.cpus} -i ${idSample}.bam \ + sentieon driver -t ${task.cpus} -i ${bam} \ --algo LocusCollector --fun score_info ${idSample}_score.gz - sentieon driver -t ${task.cpus} -i ${idSample}.bam \ + sentieon driver -t ${task.cpus} -i ${bam} \ --algo Dedup --rmdup --score_info ${idSample}_score.gz \ --metrics ${idSample}_dedup_metric.txt ${idSample}.deduped.bam """ @@ -2762,6 +2782,7 @@ def defineSkipQClist() { 'markduplicates', 'multiqc', 'samtools', + 'senteion', 'vcftools', 'versions' ] @@ -2782,6 +2803,8 @@ def defineToolList() { return [ 'ascat', 'controlfreec', + 'dnascope', + 'dnaseq', 'freebayes', 'haplotypecaller', 'manta', @@ -2791,16 +2814,11 @@ def defineToolList() { 'snpeff', 'strelka', 'tiddit', + 'tnscope', 'vep' ] } -// Print deprecation message -def deprecationMessage(oldItem, newItem = null) { - extra = newItem == null ? "": ", please use `${newItem}` instead" - log.warn "The ${oldItem} is deprecated${extra} -- it will be removed in a future release" -} - // Channeling the TSV file containing BAM. // Format is: "subject gender status sample bam bai" def extractBam(tsvFile) { From bc5599796534702649d283df0f7f0370ce69bfed Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 09:57:48 +0100 Subject: [PATCH 087/179] bwa mem sentieon specific process --- main.nf | 230 ++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 140 insertions(+), 90 deletions(-) diff --git a/main.nf b/main.nf index ece1cf0254..94fca70c3b 100644 --- a/main.nf +++ b/main.nf @@ -372,125 +372,126 @@ yamlSoftwareVersion = yamlSoftwareVersion.dump(tag:'SOFTWARE VERSIONS') */ process BuildBWAindexes { - tag {fasta} + tag {fasta} - publishDir params.outdir, mode: params.publishDirMode, - saveAs: {params.saveGenomeIndex ? "reference_genome/BWAIndex/${it}" : null } + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/BWAIndex/${it}" : null } - input: - file(fasta) from ch_fasta + input: + file(fasta) from ch_fasta - output: - file("${fasta}.*") into bwaIndexes + output: + file("${fasta}.*") into bwaIndexes - when: !(params.bwaIndex) && params.fasta && 'mapping' in step + when: !(params.bwaIndex) && params.fasta && 'mapping' in step - script: - """ - bwa index ${fasta} - """ + script: + """ + bwa index ${fasta} + """ } process BuildDict { - tag {fasta} + tag {fasta} - publishDir params.outdir, mode: params.publishDirMode, - saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } - input: - file(fasta) from ch_fasta + input: + file(fasta) from ch_fasta - output: - file("${fasta.baseName}.dict") into dictBuilt + output: + file("${fasta.baseName}.dict") into dictBuilt - when: !(params.dict) && params.fasta && !('annotate' in step) + when: !(params.dict) && params.fasta && !('annotate' in step) - script: - """ - gatk --java-options "-Xmx${task.memory.toGiga()}g" \ - CreateSequenceDictionary \ - --REFERENCE ${fasta} \ - --OUTPUT ${fasta.baseName}.dict - """ + script: + """ + gatk --java-options "-Xmx${task.memory.toGiga()}g" \ + CreateSequenceDictionary \ + --REFERENCE ${fasta} \ + --OUTPUT ${fasta.baseName}.dict + """ } process BuildFastaFai { - tag {fasta} + tag {fasta} - publishDir params.outdir, mode: params.publishDirMode, - saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } - input: - file(fasta) from ch_fasta + input: + file(fasta) from ch_fasta - output: - file("${fasta}.fai") into fastaFaiBuilt + output: + file("${fasta}.fai") into fastaFaiBuilt - when: !(params.fastaFai) && params.fasta && !('annotate' in step) + when: !(params.fastaFai) && params.fasta && !('annotate' in step) - script: - """ - samtools faidx ${fasta} - """ + script: + """ + samtools faidx ${fasta} + """ } process BuildDbsnpIndex { - tag {dbsnp} + tag {dbsnp} + + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } - publishDir params.outdir, mode: params.publishDirMode, - saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } + input: + file(dbsnp) from ch_dbsnp - input: - file(dbsnp) from ch_dbsnp + output: + file("${dbsnp}.tbi") into dbsnpIndexBuilt - output: - file("${dbsnp}.tbi") into dbsnpIndexBuilt + when: !(params.dbsnpIndex) && params.dbsnp && ('mapping' in step || 'controlfreec' in tools || 'haplotypecaller' in tools || 'mutect2' in tools) - when: !(params.dbsnpIndex) && params.dbsnp && ('mapping' in step || 'controlfreec' in tools || 'haplotypecaller' in tools || 'mutect2' in tools) - script: - """ - tabix -p vcf ${dbsnp} - """ + script: + """ + tabix -p vcf ${dbsnp} + """ } process BuildGermlineResourceIndex { - tag {germlineResource} + tag {germlineResource} - publishDir params.outdir, mode: params.publishDirMode, - saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } - input: - file(germlineResource) from ch_germlineResource + input: + file(germlineResource) from ch_germlineResource - output: - file("${germlineResource}.tbi") into germlineResourceIndexBuilt + output: + file("${germlineResource}.tbi") into germlineResourceIndexBuilt - when: !(params.germlineResourceIndex) && params.germlineResource && 'mutect2' in tools + when: !(params.germlineResourceIndex) && params.germlineResource && 'mutect2' in tools - script: - """ - tabix -p vcf ${germlineResource} - """ + script: + """ + tabix -p vcf ${germlineResource} + """ } process BuildKnownIndelsIndex { - tag {knownIndels} + tag {knownIndels} - publishDir params.outdir, mode: params.publishDirMode, - saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } - input: - each file(knownIndels) from ch_knownIndels + input: + each file(knownIndels) from ch_knownIndels - output: - file("${knownIndels}.tbi") into knownIndelsIndexBuilt + output: + file("${knownIndels}.tbi") into knownIndelsIndexBuilt - when: !(params.knownIndelsIndex) && params.knownIndels && 'mapping' in step + when: !(params.knownIndelsIndex) && params.knownIndels && 'mapping' in step - script: - """ - tabix -p vcf ${knownIndels} - """ + script: + """ + tabix -p vcf ${knownIndels} + """ } // Initialize channels based on params or indexes that were just built @@ -596,8 +597,6 @@ inputBAMFastQC = inputBAMFastQC.map { [idPatient, idSample, idRun, inputFile1] } -inputReads = inputReads.dump(tag:'INPUT') - // STEP 0.5: QC ON READS // TODO: Use only one process for FastQC for FASTQ files and uBAM files @@ -651,9 +650,14 @@ fastQCReport = fastQCReport.dump(tag:'FastQC') // STEP 1: MAPPING READS TO REFERENCE GENOME WITH BWA MEM +inputReads = inputReads.dump(tag:'INPUT') + +(inputReads, inputReadsSentieon) = inputReads.into(2) +if (params.sentieon) inputReads.close() +else inputReadsSentieon.close() + process MapReads { label 'cpus_max' - label 'sentieon' tag {idPatient + "-" + idRun} @@ -682,19 +686,12 @@ process MapReads { extra = status == 1 ? "-B 3" : "" convertToFastq = hasExtension(inputFile1, "bam") ? "gatk --java-options -Xmx${task.memory.toGiga()}g SamToFastq --INPUT=${inputFile1} --FASTQ=/dev/stdout --INTERLEAVE=true --NON_PF=true | \\" : "" input = hasExtension(inputFile1, "bam") ? "-p /dev/stdin - 2> >(tee ${inputFile1}.bwa.stderr.log >&2)" : "${inputFile1} ${inputFile2}" - if (!params.sentieon) """ ${convertToFastq} bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ ${input} | \ samtools sort --threads ${task.cpus} -m 2G - > ${idSample}_${idRun}.bam """ - else - """ - sentieon bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ - ${input} | \ - sentieon util sort -r ${fasta} -o ${idSample}_${idRun}.bam -t ${task.cpus} --sam2bam -i - - """ } bamMapped = bamMapped.dump(tag:'Mapped BAM') @@ -710,8 +707,61 @@ singleBam = singleBam.map { } singleBam = singleBam.dump(tag:'Single BAM') +// STEP 1': MAPPING READS TO REFERENCE GENOME WITH SENTIEON BWA MEM + +process SentieonMapReads { + label 'cpus_max' + label 'sentieon' + + tag {idPatient + "-" + idRun} + + input: + set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputReadsSentieon + file(bwaIndex) from ch_bwaIndex + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + + output: + set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMappedSentieon + set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedSentieonBamQC + + when: step == 'mapping' && params.sentieon + + script: + // -K is an hidden option, used to fix the number of reads processed by bwa mem + // Chunk size can affect bwa results, if not specified, + // the number of threads can change which can give not deterministic result. + // cf https://github.com/CCDG/Pipeline-Standardization/blob/master/PipelineStandard.md + // and https://github.com/gatk-workflows/gatk4-data-processing/blob/8ffa26ff4580df4ac3a5aa9e272a4ff6bab44ba2/processing-for-variant-discovery-gatk4.b37.wgs.inputs.json#L29 + CN = params.sequencing_center ? "CN:${params.sequencing_center}\\t" : "" + readGroup = "@RG\\tID:${idRun}\\t${CN}PU:${idRun}\\tSM:${idSample}\\tLB:${idSample}\\tPL:illumina" + // adjust mismatch penalty for tumor samples + status = statusMap[idPatient, idSample] + extra = status == 1 ? "-B 3" : "" + """ + sentieon bwa mem -K 100000000 -R \"${readGroup}\" ${extra} -t ${task.cpus} -M ${fasta} \ + ${inputFile1} ${inputFile2} | \ + sentieon util sort -r ${fasta} -o ${idSample}_${idRun}.bam -t ${task.cpus} --sam2bam -i - + """ +} + +bamMappedSentieon = bamMappedSentieon.dump(tag:'Sentieon Mapped BAM') +// Sort BAM whether they are standalone or should be merged + +singleBamSentieon = Channel.create() +multipleBamSentieon = Channel.create() +bamMappedSentieon.groupTuple(by:[0, 1]) + .choice(singleBamSentieon, multipleBamSentieon) {it[2].size() > 1 ? 1 : 0} +singleBamSentieon = singleBamSentieon.map { + idPatient, idSample, idRun, bam -> + [idPatient, idSample, bam] +} +singleBamSentieon = singleBamSentieon.dump(tag:'Single BAM') + // STEP 1.5: MERGING BAM FROM MULTIPLE LANES +multipleBam = multipleBam.mix(multipleBamSentieon) + process MergeBamMapped { label 'cpus_8' @@ -733,7 +783,8 @@ process MergeBamMapped { mergedBam = mergedBam.dump(tag:'Merged BAM') -mergedBam = mergedBam.mix(singleBam) +mergedBam = mergedBam.mix(singleBam,singleBamSentieon) + mergedBam = mergedBam.dump(tag:'BAMs for MD') (mergedBam, mergedBamForSentieion) = mergedBam.into(2) @@ -760,7 +811,6 @@ process IndexBamMergedForSentieon { """ } - // STEP 2: MARKING DUPLICATES process MarkDuplicates { @@ -1286,7 +1336,7 @@ process StrelkaSingle { Strelka_${idSample}_variants.vcf.gz mv Strelka/results/variants/variants.vcf.gz.tbi \ Strelka_${idSample}_variants.vcf.gz.tbi - """ + """ } vcfStrelkaSingle = vcfStrelkaSingle.dump(tag:'Strelka - Single Mode') @@ -1755,7 +1805,7 @@ process Strelka { Strelka_${idSampleTumor}_vs_${idSampleNormal}_somatic_snvs.vcf.gz mv Strelka/results/variants/somatic.snvs.vcf.gz.tbi \ Strelka_${idSampleTumor}_vs_${idSampleNormal}_somatic_snvs.vcf.gz.tbi - """ + """ } vcfStrelka = vcfStrelka.dump(tag:'Strelka') @@ -1871,7 +1921,7 @@ process StrelkaBP { StrelkaBP_${idSampleTumor}_vs_${idSampleNormal}_somatic_snvs.vcf.gz mv Strelka/results/variants/somatic.snvs.vcf.gz.tbi \ StrelkaBP_${idSampleTumor}_vs_${idSampleNormal}_somatic_snvs.vcf.gz.tbi - """ + """ } vcfStrelkaBP = vcfStrelkaBP.dump(tag:'Strelka BP') From d874bd665f30308d3a5cec6df4bf20623043c87a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 10:21:39 +0100 Subject: [PATCH 088/179] TSV file for sentieon Dedup --- main.nf | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 94fca70c3b..8d8bc15059 100644 --- a/main.nf +++ b/main.nf @@ -192,7 +192,7 @@ if (params.sampleDir) tsvPath = params.sampleDir // If no input file specified, trying to get TSV files corresponding to step in the TSV directory // only for steps recalibrate and variantCalling if (!params.input && step != 'mapping' && step != 'annotate') { - tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/duplicateMarked.tsv": "${params.outdir}/Preprocessing/TSV/recalibrated.tsv" + tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/duplicateMarked.tsv": params.sention ? "${params.outdir}/Preprocessing/TSV/sentieon.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated.tsv" } inputSample = Channel.empty() @@ -970,6 +970,7 @@ process SentieonBQSR { output: set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bam.bai") into bamRecalSentieon + set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC when: step == 'mapping' && params.sentieon @@ -1005,6 +1006,28 @@ process SentieonBQSR { """ } +(bamRecalSentieonTSV, bamRecalSentieonSampleTSV) = bamRecalSentieonTSV.into(2) + +// Creating a TSV file to restart from this step +bamRecalSentieonTSV.map { idPatient, idSample -> + gender = genderMap[idPatient] + status = statusMap[idPatient, idSample] + bam = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam.bai" + "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n" +}.collectFile( + name: 'sentieion.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" +) + +bamRecalSentieonSampleTSV + .collectFile(storeDir: "${params.outdir}/Preprocessing/TSV") { + idPatient, idSample -> + status = statusMap[idPatient, idSample] + gender = genderMap[idPatient] + bam = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam.bai" + ["sentieion_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] +} // STEP 3.5: MERGING RECALIBRATION TABLES process GatherBQSRReports { From 2ce9735d5807e5a2f112559b63521ae647389a06 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 10:45:01 +0100 Subject: [PATCH 089/179] TSV for every step for Sentieon --- main.nf | 71 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 19 deletions(-) diff --git a/main.nf b/main.nf index 8d8bc15059..2c49212393 100644 --- a/main.nf +++ b/main.nf @@ -192,7 +192,12 @@ if (params.sampleDir) tsvPath = params.sampleDir // If no input file specified, trying to get TSV files corresponding to step in the TSV directory // only for steps recalibrate and variantCalling if (!params.input && step != 'mapping' && step != 'annotate') { - tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/duplicateMarked.tsv": params.sention ? "${params.outdir}/Preprocessing/TSV/sentieon.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated.tsv" + if (!params.sentieon) { + tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/duplicateMarked.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated.tsv" + } + else { + tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/deduped_sentieon.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated_sentieon.tsv" + } } inputSample = Channel.empty() @@ -200,7 +205,7 @@ if (tsvPath) { tsvFile = file(tsvPath) switch (step) { case 'mapping': inputSample = extractFastq(tsvFile); break - case 'recalibrate': inputSample = extractRecal(tsvFile); break + case 'recalibrate': inputSample = params.sentieon ? extractBam(tsvFile) : extractRecal(tsvFile) ; break case 'variantcalling': inputSample = extractBam(tsvFile); break case 'annotate': break default: exit 1, "Unknown step ${step}" @@ -711,6 +716,7 @@ singleBam = singleBam.dump(tag:'Single BAM') process SentieonMapReads { label 'cpus_max' + label 'memory_max' label 'sentieon' tag {idPatient + "-" + idRun} @@ -787,10 +793,10 @@ mergedBam = mergedBam.mix(singleBam,singleBamSentieon) mergedBam = mergedBam.dump(tag:'BAMs for MD') -(mergedBam, mergedBamForSentieion) = mergedBam.into(2) +(mergedBam, mergedBamForSentieon) = mergedBam.into(2) if (params.sentieon) mergedBam.close() -else mergedBamForSentieion.close() +else mergedBamForSentieon.close() process IndexBamMergedForSentieon { label 'cpus_8' @@ -798,10 +804,10 @@ process IndexBamMergedForSentieon { tag {idPatient + "-" + idSample} input: - set idPatient, idSample, file(bam) from mergedBamForSentieion + set idPatient, idSample, file(bam) from mergedBamForSentieon output: - set idPatient, idSample, file(bam), file("${idSample}.bam.bai") into bamForSentieionDedup + set idPatient, idSample, file(bam), file("${idSample}.bam.bai") into bamForSentieonDedup when: step == 'mapping' && params.sentieon @@ -861,7 +867,8 @@ bamBaseRecalibrator = bamBaseRecalibrator.dump(tag:'BAM FOR BASERECALIBRATOR') // STEP 2': SENTIEON DEDUP process SentieonDedup { - label 'cpus_16' + label 'cpus_max' + label 'memory_max' label 'sentieon' tag {idPatient + "-" + idSample} @@ -869,18 +876,19 @@ process SentieonDedup { publishDir params.outdir, mode: params.publishDirMode, saveAs: { if (it == "${idSample}_*.txt" && 'sentieon' in skipQC) null - else if (it == "${idSample}_*.txt") "Reports/${idSample}/Sentieion/${it}" + else if (it == "${idSample}_*.txt") "Reports/${idSample}/Sentieon/${it}" else "Preprocessing/${idSample}/DedupedSentieon/${it}" } input: - set idPatient, idSample, file(bam), file(bai) from bamForSentieionDedup + set idPatient, idSample, file(bam), file(bai) from bamForSentieonDedup file(fasta) from ch_fasta file(fastaFai) from ch_fastaFai output: - set idPatient, idSample, file("${idSample}.deduped.bam"), file("${idSample}.deduped.bam.bai") into dedupedSentieionBam - file("${idSample}_*.txt") into dedupedSentieionBamQC + set idPatient, idSample, file("${idSample}.deduped.bam"), file("${idSample}.deduped.bam.bai") into bamDedupedSentieon + set idPatient, idSample into bamDedupedSentieonTSV + file("${idSample}_*.txt") into bamDedupedSentieonQC when: step == 'mapping' && params.sentieon @@ -902,6 +910,29 @@ process SentieonDedup { """ } +(bamDedupedSentieonTSV, bamDedupedSentieonSampleTSV) = bamDedupedSentieonTSV.into(2) + +// Creating a TSV file to restart from this step +bamDedupedSentieonTSV.map { idPatient, idSample -> + gender = genderMap[idPatient] + status = statusMap[idPatient, idSample] + bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam.bai" + "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n" +}.collectFile( + name: 'deduped_sentieon.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" +) + +bamDedupedSentieonSampleTSV + .collectFile(storeDir: "${params.outdir}/Preprocessing/TSV") { + idPatient, idSample -> + status = statusMap[idPatient, idSample] + gender = genderMap[idPatient] + bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam.bai" + ["deduped_sentieon_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] +} + // STEP 3: CREATING RECALIBRATION TABLES process BaseRecalibrator { @@ -947,6 +978,7 @@ tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) // STEP 3': SENTIEON BQSR process SentieonBQSR { + label 'cpus_max' label 'memory_max' label 'sentieon' @@ -954,12 +986,12 @@ process SentieonBQSR { publishDir params.outdir, mode: params.publishDirMode, saveAs: { - if (it == "${idSample}_recal_result.csv" && 'sentieon' in skipQC) "Reports/${idSample}/Sentieion/${it}" + if (it == "${idSample}_recal_result.csv" && 'sentieon' in skipQC) "Reports/${idSample}/Sentieon/${it}" else "Preprocessing/${idSample}/RecalSentieon/${it}" } input: - set idPatient, idSample, file(bam), file(bai) from dedupedSentieionBam + set idPatient, idSample, file(bam), file(bai) from bamDedupedSentieon file(dbsnp) from ch_dbsnp file(dbsnpIndex) from ch_dbsnpIndex file(fasta) from ch_fasta @@ -1012,11 +1044,11 @@ process SentieonBQSR { bamRecalSentieonTSV.map { idPatient, idSample -> gender = genderMap[idPatient] status = statusMap[idPatient, idSample] - bam = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam.bai" + bam = "${params.outdir}/Preprocessing/${idSample}/RecalSentieon/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/RecalSentieon/${idSample}.recal.bam.bai" "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n" }.collectFile( - name: 'sentieion.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" + name: 'recalibrated_sentieon.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" ) bamRecalSentieonSampleTSV @@ -1024,10 +1056,11 @@ bamRecalSentieonSampleTSV idPatient, idSample -> status = statusMap[idPatient, idSample] gender = genderMap[idPatient] - bam = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/Sentieion/${idSample}.recal.bam.bai" - ["sentieion_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] + bam = "${params.outdir}/Preprocessing/${idSample}/RecalSentieon/${idSample}.recal.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/RecalSentieon/${idSample}.recal.bam.bai" + ["recalibrated_sentieon_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] } + // STEP 3.5: MERGING RECALIBRATION TABLES process GatherBQSRReports { From babb391c9fdbcbd366923fd0cc602345067832a6 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 10:54:44 +0100 Subject: [PATCH 090/179] recal -> deduped --- main.nf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.nf b/main.nf index 2c49212393..f079290c44 100644 --- a/main.nf +++ b/main.nf @@ -916,8 +916,8 @@ process SentieonDedup { bamDedupedSentieonTSV.map { idPatient, idSample -> gender = genderMap[idPatient] status = statusMap[idPatient, idSample] - bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam.bai" + bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam.bai" "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n" }.collectFile( name: 'deduped_sentieon.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" @@ -928,8 +928,8 @@ bamDedupedSentieonSampleTSV idPatient, idSample -> status = statusMap[idPatient, idSample] gender = genderMap[idPatient] - bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.recal.bam.bai" + bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam" + bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam.bai" ["deduped_sentieon_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] } From bea7238b14ffd9e0e07156ff4d0735ae046a6af2 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 10:58:54 +0100 Subject: [PATCH 091/179] fix input for TSV recalibrate --- main.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index f079290c44..8fab56b1f5 100644 --- a/main.nf +++ b/main.nf @@ -977,6 +977,8 @@ tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) // STEP 3': SENTIEON BQSR +if (step == 'recalibrate' && params.sentieon) bamDedupedSentieon = inputSample + process SentieonBQSR { label 'cpus_max' label 'memory_max' @@ -1109,7 +1111,7 @@ recalTableSampleTSV bamApplyBQSR = bamMDToJoin.join(recalTable, by:[0,1]) -if (step == 'recalibrate') bamApplyBQSR = inputSample +if (step == 'recalibrate' && (!params.sentieon)) bamApplyBQSR = inputSample bamApplyBQSR = bamApplyBQSR.dump(tag:'recal.table') From efaec9fa02379ef53a04f9e97efe69e3409729e0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 11:03:06 +0100 Subject: [PATCH 092/179] enable restart from recalibrate with TSV with Sentieon --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 8fab56b1f5..40038d8b89 100644 --- a/main.nf +++ b/main.nf @@ -1007,7 +1007,7 @@ process SentieonBQSR { set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC - when: step == 'mapping' && params.sentieon + when: params.sentieon && (step == 'mapping' || step == 'recalibrate') script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') From f5744e440b75c1ec56ccbdc96d76e05115c595b3 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 11:10:58 +0100 Subject: [PATCH 093/179] fix sention variant calling from mapping and recalibrate --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 40038d8b89..b01646fe00 100644 --- a/main.nf +++ b/main.nf @@ -1258,7 +1258,7 @@ bamQCReport = bamQCReport.dump(tag:'BamQC') ================================================================================ */ -if (params.sentieon) bamRecal = bamRecalSentieon +if (params.sentieon && (step == 'mapping' || step == 'recalibrate')) bamRecal = bamRecalSentieon if (step == 'variantcalling') bamRecal = inputSample From ee5beaf84bfb84d8340b4026edf9028530f617dd Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 11:35:54 +0100 Subject: [PATCH 094/179] code polishing --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index b01646fe00..a9aeaf4c2c 100644 --- a/main.nf +++ b/main.nf @@ -1007,7 +1007,7 @@ process SentieonBQSR { set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC - when: params.sentieon && (step == 'mapping' || step == 'recalibrate') + when: params.sentieon && step in ['mapping','recalibrate'] script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') @@ -1258,7 +1258,7 @@ bamQCReport = bamQCReport.dump(tag:'BamQC') ================================================================================ */ -if (params.sentieon && (step == 'mapping' || step == 'recalibrate')) bamRecal = bamRecalSentieon +if (params.sentieon && step in ['mapping', 'recalibrate']) bamRecal = bamRecalSentieon if (step == 'variantcalling') bamRecal = inputSample From 88f4af3cfc657e9edf6ccdde01bedce2e693303d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 12:29:35 +0100 Subject: [PATCH 095/179] add dump tag for imput sample --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index a9aeaf4c2c..919e7d137e 100644 --- a/main.nf +++ b/main.nf @@ -588,6 +588,8 @@ bedIntervals = bedIntervals.dump(tag:'bedintervals') // PREPARING CHANNELS FOR PREPROCESSING AND QC +inputSample = inputSample.dump(tag:'INPUT SAMPLE') + if (step == 'mapping') (inputReads, inputReadsFastQC) = inputSample.into(2) else (inputReads, inputReadsFastQC) = Channel.empty().into(2) From 2b6842fc0967360700e86ce4346e4f63c600f48c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 12:35:09 +0100 Subject: [PATCH 096/179] add dump tag for bamDedupedSentieon --- main.nf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/main.nf b/main.nf index 919e7d137e..649755e0da 100644 --- a/main.nf +++ b/main.nf @@ -981,6 +981,8 @@ tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) if (step == 'recalibrate' && params.sentieon) bamDedupedSentieon = inputSample +bamDedupedSentieon = bamDedupedSentieon.dump(tag:'deduped.bam') + process SentieonBQSR { label 'cpus_max' label 'memory_max' From 1b979e53548e4fafbb07aa80b2f27c8f06efb066 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 13:10:36 +0100 Subject: [PATCH 097/179] code polishing --- main.nf | 59 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/main.nf b/main.nf index 649755e0da..65ccc0ab28 100644 --- a/main.nf +++ b/main.nf @@ -192,11 +192,11 @@ if (params.sampleDir) tsvPath = params.sampleDir // If no input file specified, trying to get TSV files corresponding to step in the TSV directory // only for steps recalibrate and variantCalling if (!params.input && step != 'mapping' && step != 'annotate') { - if (!params.sentieon) { - tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/duplicateMarked.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated.tsv" + if (params.sentieon) { + tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/deduped_sentieon.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated_sentieon.tsv" } else { - tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/deduped_sentieon.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated_sentieon.tsv" + tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/duplicateMarked.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated.tsv" } } @@ -793,12 +793,13 @@ mergedBam = mergedBam.dump(tag:'Merged BAM') mergedBam = mergedBam.mix(singleBam,singleBamSentieon) -mergedBam = mergedBam.dump(tag:'BAMs for MD') - (mergedBam, mergedBamForSentieon) = mergedBam.into(2) -if (params.sentieon) mergedBam.close() -else mergedBamForSentieon.close() +if (!params.sentieon) mergedBamForSentieon.close() +else mergedBam.close() + +mergedBam = mergedBam.dump(tag:'BAMs for MD') +mergedBamForSentieon = mergedBamForSentieon.dump(tag:'Sentieon BAMs to Index') process IndexBamMergedForSentieon { label 'cpus_8' @@ -811,7 +812,7 @@ process IndexBamMergedForSentieon { output: set idPatient, idSample, file(bam), file("${idSample}.bam.bai") into bamForSentieonDedup - when: step == 'mapping' && params.sentieon + when: step == 'mapping' script: """ @@ -1011,36 +1012,36 @@ process SentieonBQSR { set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC - when: params.sentieon && step in ['mapping','recalibrate'] + when: params.sentieon && step in ['mapping', 'recalibrate'] script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') """ sentieon driver \ - -t ${task.cpus} \ - -r ${fasta} \ - -i ${idSample}.deduped.bam \ - --algo QualCal \ - -k ${dbsnp} \ - ${idSample}.recal.table + -t ${task.cpus} \ + -r ${fasta} \ + -i ${idSample}.deduped.bam \ + --algo QualCal \ + -k ${dbsnp} \ + ${idSample}.recal.table sentieon driver \ - -t ${task.cpus} \ - -r ${fasta} \ - -i ${idSample}.deduped.bam \ - -q ${idSample}.recal.table \ - --algo QualCal \ - -k ${dbsnp} \ - ${idSample}.table.post \ - --algo ReadWriter ${idSample}.recal.bam + -t ${task.cpus} \ + -r ${fasta} \ + -i ${idSample}.deduped.bam \ + -q ${idSample}.recal.table \ + --algo QualCal \ + -k ${dbsnp} \ + ${idSample}.table.post \ + --algo ReadWriter ${idSample}.recal.bam sentieon driver \ - -t ${task.cpus} \ - --algo QualCal \ - --plot \ - --before ${idSample}.recal.table \ - --after ${idSample}.table.post \ - ${idSample}_recal_result.csv + -t ${task.cpus} \ + --algo QualCal \ + --plot \ + --before ${idSample}.recal.table \ + --after ${idSample}.table.post \ + ${idSample}_recal_result.csv """ } From 60a9fb3a9a8b92531490073a48915744a3fd8109 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 13:27:11 +0100 Subject: [PATCH 098/179] code polishing --- main.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.nf b/main.nf index 65ccc0ab28..a0f0b3e550 100644 --- a/main.nf +++ b/main.nf @@ -211,9 +211,9 @@ if (tsvPath) { default: exit 1, "Unknown step ${step}" } } else if (params.input && !hasExtension(params.input, "tsv")) { - println "No TSV file" + log.info "No TSV file" if (step != 'mapping') exit 1, 'No other step than "mapping" support a dir as an input' - println "Reading ${params.input} directory" + log.info "Reading ${params.input} directory" inputSample = extractFastqFromDir(params.input) (inputSample, fastqTMP) = inputSample.into(2) fastqTMP.toList().subscribe onNext: { @@ -221,7 +221,7 @@ if (tsvPath) { } tsvFile = params.input // used in the reports } else if (step == 'annotate') { - println "Annotating ${tsvFile}" + log.info "Annotating ${tsvFile}" } else exit 1, 'No sample were defined, see --help' (genderMap, statusMap, inputSample) = extractInfos(inputSample) @@ -1012,7 +1012,7 @@ process SentieonBQSR { set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC - when: params.sentieon && step in ['mapping', 'recalibrate'] + when: params.sentieon && (step in ['mapping', 'recalibrate']) script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') @@ -2853,7 +2853,7 @@ def checkNumberOfItem(row, number) { // Check parameter existence def checkParameterExistence(it, list) { if (!list.contains(it)) { - println("Unknown parameter: ${it}") + log.warn "Unknown parameter: ${it}" return false } return true From dc25d277ca56a0ac08d6ab6be06a3911f6a1d226 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 13:44:47 +0100 Subject: [PATCH 099/179] code polishing --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index a0f0b3e550..2124a0d340 100644 --- a/main.nf +++ b/main.nf @@ -1012,7 +1012,7 @@ process SentieonBQSR { set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC - when: params.sentieon && (step in ['mapping', 'recalibrate']) + when: params.sentieon script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') From fba89d0cdb42ae84c569f000df171a6cd05fa334 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 14:51:16 +0100 Subject: [PATCH 100/179] code polishing --- main.nf | 175 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 88 insertions(+), 87 deletions(-) diff --git a/main.nf b/main.nf index 2124a0d340..d3e0a1d9d4 100644 --- a/main.nf +++ b/main.nf @@ -978,9 +978,95 @@ process BaseRecalibrator { tableGatherBQSRReports = tableGatherBQSRReports.groupTuple(by:[0, 1]) -// STEP 3': SENTIEON BQSR +// STEP 3.5: MERGING RECALIBRATION TABLES + +process GatherBQSRReports { + label 'memory_singleCPU_2_task' + label 'cpus_2' + + tag {idPatient + "-" + idSample} + + publishDir "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked", mode: params.publishDirMode, overwrite: false + + input: + set idPatient, idSample, file(recal) from tableGatherBQSRReports + + output: + set idPatient, idSample, file("${idSample}.recal.table") into recalTable + set idPatient, idSample, val("${idSample}.md.bam"), val("${idSample}.md.bai"), val("${idSample}.recal.table") into (recalTableTSV, recalTableSampleTSV) + + when: step == 'mapping' + + script: + input = recal.collect{"-I ${it}"}.join(' ') + """ + gatk --java-options -Xmx${task.memory.toGiga()}g \ + GatherBQSRReports \ + ${input} \ + -O ${idSample}.recal.table \ + """ +} + +// Create TSV files to restart from this step +recalTableTSV.map { idPatient, idSample, bam, bai, recalTable -> + status = statusMap[idPatient, idSample] + gender = genderMap[idPatient] + "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bam}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bai}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${recalTable}\n" +}.collectFile( + name: 'duplicateMarked.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" +) + +recalTableSampleTSV + .collectFile(storeDir: "${params.outdir}/Preprocessing/TSV/") { + idPatient, idSample, bam, bai, recalTable -> + status = statusMap[idPatient, idSample] + gender = genderMap[idPatient] + ["duplicateMarked_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bam}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bai}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${recalTable}\n"] +} + +bamApplyBQSR = bamMDToJoin.join(recalTable, by:[0,1]) + +if (step == 'recalibrate') { + if (params.sentieon) bamDedupedSentieon = inputSample + else bamApplyBQSR = inputSample +} + +bamApplyBQSR = bamApplyBQSR.dump(tag:'recal.table') + +bamApplyBQSR = bamApplyBQSR.combine(intApplyBQSR) + +// STEP 4: RECALIBRATING + +process ApplyBQSR { + label 'memory_singleCPU_2_task' + label 'cpus_2' + + tag {idPatient + "-" + idSample + "-" + intervalBed.baseName} + + input: + set idPatient, idSample, file(bam), file(bai), file(recalibrationReport), file(intervalBed) from bamApplyBQSR + file(dict) from ch_dict + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + + output: + set idPatient, idSample, file("${intervalBed.baseName}_${idSample}.recal.bam") into bamMergeBamRecal + + script: + """ + gatk --java-options -Xmx${task.memory.toGiga()}g \ + ApplyBQSR \ + -R ${fasta} \ + --input ${bam} \ + --output ${intervalBed.baseName}_${idSample}.recal.bam \ + -L ${intervalBed} \ + --bqsr-recal-file ${recalibrationReport} + """ +} + +bamMergeBamRecal = bamMergeBamRecal.groupTuple(by:[0, 1]) -if (step == 'recalibrate' && params.sentieon) bamDedupedSentieon = inputSample +// STEP 4': SENTIEON BQSR bamDedupedSentieon = bamDedupedSentieon.dump(tag:'deduped.bam') @@ -1068,91 +1154,6 @@ bamRecalSentieonSampleTSV ["recalibrated_sentieon_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] } -// STEP 3.5: MERGING RECALIBRATION TABLES - -process GatherBQSRReports { - label 'memory_singleCPU_2_task' - label 'cpus_2' - - tag {idPatient + "-" + idSample} - - publishDir "${params.outdir}/Preprocessing/${idSample}/DuplicateMarked", mode: params.publishDirMode, overwrite: false - - input: - set idPatient, idSample, file(recal) from tableGatherBQSRReports - - output: - set idPatient, idSample, file("${idSample}.recal.table") into recalTable - set idPatient, idSample, val("${idSample}.md.bam"), val("${idSample}.md.bai"), val("${idSample}.recal.table") into (recalTableTSV, recalTableSampleTSV) - - when: step == 'mapping' - - script: - input = recal.collect{"-I ${it}"}.join(' ') - """ - gatk --java-options -Xmx${task.memory.toGiga()}g \ - GatherBQSRReports \ - ${input} \ - -O ${idSample}.recal.table \ - """ -} - -// Create TSV files to restart from this step -recalTableTSV.map { idPatient, idSample, bam, bai, recalTable -> - status = statusMap[idPatient, idSample] - gender = genderMap[idPatient] - "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bam}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bai}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${recalTable}\n" -}.collectFile( - name: 'duplicateMarked.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" -) - -recalTableSampleTSV - .collectFile(storeDir: "${params.outdir}/Preprocessing/TSV/") { - idPatient, idSample, bam, bai, recalTable -> - status = statusMap[idPatient, idSample] - gender = genderMap[idPatient] - ["duplicateMarked_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bam}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${bai}\t${params.outdir}/Preprocessing/${idSample}/DuplicateMarked/${recalTable}\n"] -} - -bamApplyBQSR = bamMDToJoin.join(recalTable, by:[0,1]) - -if (step == 'recalibrate' && (!params.sentieon)) bamApplyBQSR = inputSample - -bamApplyBQSR = bamApplyBQSR.dump(tag:'recal.table') - -bamApplyBQSR = bamApplyBQSR.combine(intApplyBQSR) - -// STEP 4: RECALIBRATING - -process ApplyBQSR { - label 'memory_singleCPU_2_task' - label 'cpus_2' - - tag {idPatient + "-" + idSample + "-" + intervalBed.baseName} - - input: - set idPatient, idSample, file(bam), file(bai), file(recalibrationReport), file(intervalBed) from bamApplyBQSR - file(dict) from ch_dict - file(fasta) from ch_fasta - file(fastaFai) from ch_fastaFai - - output: - set idPatient, idSample, file("${intervalBed.baseName}_${idSample}.recal.bam") into bamMergeBamRecal - - script: - """ - gatk --java-options -Xmx${task.memory.toGiga()}g \ - ApplyBQSR \ - -R ${fasta} \ - --input ${bam} \ - --output ${intervalBed.baseName}_${idSample}.recal.bam \ - -L ${intervalBed} \ - --bqsr-recal-file ${recalibrationReport} - """ -} - -bamMergeBamRecal = bamMergeBamRecal.groupTuple(by:[0, 1]) - // STEP 4.5: MERGING THE RECALIBRATED BAM FILES process MergeBamRecal { From 6f73d832c2427a1ed373ea1768cb7ebb78781ad0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 15:01:48 +0100 Subject: [PATCH 101/179] remove when statement --- main.nf | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/main.nf b/main.nf index d3e0a1d9d4..d701674b19 100644 --- a/main.nf +++ b/main.nf @@ -622,7 +622,7 @@ process FastQCFQ { output: file("*.{html,zip}") into fastQCFQReport - when: step == 'mapping' && !('fastqc' in skipQC) + when: !('fastqc' in skipQC) script: """ @@ -643,7 +643,7 @@ process FastQCBAM { output: file("*.{html,zip}") into fastQCBAMReport - when: step == 'mapping' && !('fastqc' in skipQC) + when: !('fastqc' in skipQC) script: """ @@ -678,8 +678,6 @@ process MapReads { set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMapped set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedBamQC - when: step == 'mapping' - script: // -K is an hidden option, used to fix the number of reads processed by bwa mem // Chunk size can affect bwa results, if not specified, @@ -733,8 +731,6 @@ process SentieonMapReads { set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMappedSentieon set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedSentieonBamQC - when: step == 'mapping' && params.sentieon - script: // -K is an hidden option, used to fix the number of reads processed by bwa mem // Chunk size can affect bwa results, if not specified, @@ -781,8 +777,6 @@ process MergeBamMapped { output: set idPatient, idSample, file("${idSample}.bam") into mergedBam - when: step == 'mapping' - script: """ samtools merge --threads ${task.cpus} ${idSample}.bam ${bam} @@ -812,8 +806,6 @@ process IndexBamMergedForSentieon { output: set idPatient, idSample, file(bam), file("${idSample}.bam.bai") into bamForSentieonDedup - when: step == 'mapping' - script: """ samtools index ${bam} @@ -840,8 +832,6 @@ process MarkDuplicates { set idPatient, idSample, file("${idSample}.md.bam"), file("${idSample}.md.bai") into duplicateMarkedBams file ("${idSample}.bam.metrics") into markDuplicatesReport - when: step == 'mapping' - script: markdup_java_options = task.memory.toGiga() > 8 ? params.markdup_java_options : "\"-Xms" + (task.memory.toGiga() / 2).trunc() + "g -Xmx" + (task.memory.toGiga() - 1) + "g\"" """ @@ -893,8 +883,6 @@ process SentieonDedup { set idPatient, idSample into bamDedupedSentieonTSV file("${idSample}_*.txt") into bamDedupedSentieonQC - when: step == 'mapping' && params.sentieon - script: """ sentieon driver -t ${task.cpus} -r ${fasta} -i ${bam} \ @@ -957,8 +945,6 @@ process BaseRecalibrator { output: set idPatient, idSample, file("${intervalBed.baseName}_${idSample}.recal.table") into tableGatherBQSRReports - when: step == 'mapping' - script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') // TODO: --use-original-qualities ??? @@ -995,8 +981,6 @@ process GatherBQSRReports { set idPatient, idSample, file("${idSample}.recal.table") into recalTable set idPatient, idSample, val("${idSample}.md.bam"), val("${idSample}.md.bai"), val("${idSample}.recal.table") into (recalTableTSV, recalTableSampleTSV) - when: step == 'mapping' - script: input = recal.collect{"-I ${it}"}.join(' ') """ @@ -1098,8 +1082,6 @@ process SentieonBQSR { set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC - when: params.sentieon - script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') """ From b0f091e2a1c1a1132edd0f095f59fcfb1c5b6a38 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 16:23:41 +0100 Subject: [PATCH 102/179] fix typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index d701674b19..bb5b625021 100644 --- a/main.nf +++ b/main.nf @@ -2878,7 +2878,7 @@ def defineSkipQClist() { 'markduplicates', 'multiqc', 'samtools', - 'senteion', + 'sentieon', 'vcftools', 'versions' ] From 1aa82a947f94318406f953ccbf8d80d1bcdff4ca Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 16:31:33 +0100 Subject: [PATCH 103/179] remove tsv for recalibrate with sentieon --- main.nf | 32 +++----------------------------- 1 file changed, 3 insertions(+), 29 deletions(-) diff --git a/main.nf b/main.nf index bb5b625021..0f2360ba31 100644 --- a/main.nf +++ b/main.nf @@ -193,7 +193,8 @@ if (params.sampleDir) tsvPath = params.sampleDir // only for steps recalibrate and variantCalling if (!params.input && step != 'mapping' && step != 'annotate') { if (params.sentieon) { - tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/deduped_sentieon.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated_sentieon.tsv" + if (step == 'variantcalling') tsvPath = "${params.outdir}/Preprocessing/TSV/recalibrated_sentieon.tsv" + else exit 1, "Not possible to restart from that step" } else { tsvPath = step == 'recalibrate' ? "${params.outdir}/Preprocessing/TSV/duplicateMarked.tsv" : "${params.outdir}/Preprocessing/TSV/recalibrated.tsv" @@ -880,7 +881,6 @@ process SentieonDedup { output: set idPatient, idSample, file("${idSample}.deduped.bam"), file("${idSample}.deduped.bam.bai") into bamDedupedSentieon - set idPatient, idSample into bamDedupedSentieonTSV file("${idSample}_*.txt") into bamDedupedSentieonQC script: @@ -901,29 +901,6 @@ process SentieonDedup { """ } -(bamDedupedSentieonTSV, bamDedupedSentieonSampleTSV) = bamDedupedSentieonTSV.into(2) - -// Creating a TSV file to restart from this step -bamDedupedSentieonTSV.map { idPatient, idSample -> - gender = genderMap[idPatient] - status = statusMap[idPatient, idSample] - bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam.bai" - "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n" -}.collectFile( - name: 'deduped_sentieon.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" -) - -bamDedupedSentieonSampleTSV - .collectFile(storeDir: "${params.outdir}/Preprocessing/TSV") { - idPatient, idSample -> - status = statusMap[idPatient, idSample] - gender = genderMap[idPatient] - bam = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/DedupedSentieon/${idSample}.deduped.bam.bai" - ["deduped_sentieon_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] -} - // STEP 3: CREATING RECALIBRATION TABLES process BaseRecalibrator { @@ -1010,10 +987,7 @@ recalTableSampleTSV bamApplyBQSR = bamMDToJoin.join(recalTable, by:[0,1]) -if (step == 'recalibrate') { - if (params.sentieon) bamDedupedSentieon = inputSample - else bamApplyBQSR = inputSample -} +if (step == 'recalibrate') bamApplyBQSR = inputSample bamApplyBQSR = bamApplyBQSR.dump(tag:'recal.table') From bbe01fb1e1409187b45da20c37b09efb308bc1fc Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 16:59:10 +0100 Subject: [PATCH 104/179] add dnascope dnaseq --- main.nf | 88 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 0f2360ba31..7269cc8d54 100644 --- a/main.nf +++ b/main.nf @@ -1231,7 +1231,7 @@ bamRecal = bamRecal.dump(tag:'BAM') // Manta will be run in Germline mode, or in Tumor mode depending on status // HaplotypeCaller, TIDDIT and Strelka will be run for Normal and Tumor samples -(bamMantaSingle, bamStrelkaSingle, bamTIDDIT, bamRecalAll, bamRecalAllTemp) = bamRecal.into(5) +(bamSentieonDNAscope, bamSentieonDNAseq, bamMantaSingle, bamStrelkaSingle, bamTIDDIT, bamRecalAll, bamRecalAllTemp) = bamRecal.into(7) // To speed Variant Callers up we are chopping the reference into smaller pieces // Do variant calling by this intervals, and re-merge the VCFs @@ -1314,6 +1314,92 @@ process GenotypeGVCFs { vcfGenotypeGVCFs = vcfGenotypeGVCFs.groupTuple(by:[0, 1, 2]) +// STEP SENTIEON DNAseq + +process SentieonDNAseq { + label 'cpus_max' + label 'memory_max' + label 'sentieon' + + tag {idSample} + + input: + set idPatient, idSample, file(bam), file(bai) from bamSentieonDNAseq + file(dbsnp) from ch_dbsnp + file(dbsnpIndex) from ch_dbsnpIndex + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + + output: + set val("SentieonDNAseq"), idPatient, idSample, file("DNAseq_${idSample}.vcf") into sentieonDNAseqVCF + + when: 'dnaseq' in tools && params.sentieon + + script: + """ + sentieon driver \ + -t ${task.cpus} \ + -r ${fasta} \ + -i ${bam} \ + --algo Genotyper \ + -d ${dbsnp} \ + DNAseq_${idSample}.vcf + """ +} + +sentieonDNAseqVCF = sentieonDNAseqVCF.dump(tag:'sentieon DNAseq') + +// STEP SENTIEON DNAscope + +process SentieonDNAscope { + label 'cpus_max' + label 'memory_max' + label 'sentieon' + + tag {idSample} + + input: + set idPatient, idSample, file(bam), file(bai) from bamSentieonDNAscope + file(dbsnp) from ch_dbsnp + file(dbsnpIndex) from ch_dbsnpIndex + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + + output: + set val("SentieonDNAscope"), idPatient, idSample, file("DNAscope_${idSample}.vcf"), file("DNAscope_SV_${idSample}.vcf") into sentieonDNAscopeVCF + + when: 'dnascope' in tools && params.sentieon + + script: + """ + sentieon driver \ + -t ${task.cpus} \ + -r ${fasta} \ + -i ${bam} \ + --algo DNAscope \ + -d ${dbsnp} \ + DNAscope_${idSample}.vcf + + sentieon driver \ + -t ${task.cpus} \ + -r ${fasta}\ + -i ${bam} \ + --algo DNAscope + --var_type bnd \ + -d ${dbsnp} + DNAscope_${idSample}.temp.vcf + + sentieon driver \ + -t ${task.cpus} \ + -r ${fasta}\ + --algo SVSolver \ + -v DNAscope_${idSample}.temp.vcf \ + DNAscope_SV_${idSample}.vcf + """ +} + +sentieonDNAscopeVCF = sentieonDNAscopeVCF.dump(tag:'sentieon DNAscope') + // STEP STRELKA.1 - SINGLE MODE process StrelkaSingle { From 2d980d8d183d16014b9e34d870da94f54a8521a6 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 12 Nov 2019 17:06:37 +0100 Subject: [PATCH 105/179] fix dnascope --- main.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 7269cc8d54..38d7e2b81a 100644 --- a/main.nf +++ b/main.nf @@ -1384,15 +1384,15 @@ process SentieonDNAscope { -t ${task.cpus} \ -r ${fasta}\ -i ${bam} \ - --algo DNAscope + --algo DNAscope \ --var_type bnd \ - -d ${dbsnp} + -d ${dbsnp} \ DNAscope_${idSample}.temp.vcf sentieon driver \ -t ${task.cpus} \ -r ${fasta}\ - --algo SVSolver \ + --algo SVSolver \ -v DNAscope_${idSample}.temp.vcf \ DNAscope_SV_${idSample}.vcf """ From f67f8f35851183357022989414614e75f7a8d4a0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 14:10:58 +0100 Subject: [PATCH 106/179] add TNscope process --- main.nf | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/main.nf b/main.nf index 38d7e2b81a..45b91c0d34 100644 --- a/main.nf +++ b/main.nf @@ -871,7 +871,7 @@ process SentieonDedup { saveAs: { if (it == "${idSample}_*.txt" && 'sentieon' in skipQC) null else if (it == "${idSample}_*.txt") "Reports/${idSample}/Sentieon/${it}" - else "Preprocessing/${idSample}/DedupedSentieon/${it}" + else null } input: @@ -885,18 +885,28 @@ process SentieonDedup { script: """ - sentieon driver -t ${task.cpus} -r ${fasta} -i ${bam} \ + sentieon driver \ + -t ${task.cpus} \ + -i ${bam} \ + -r ${fasta} \ --algo GCBias --summary ${idSample}_gc_summary.txt ${idSample}_gc_metric.txt \ --algo MeanQualityByCycle ${idSample}_mq_metric.txt \ --algo QualDistribution ${idSample}_qd_metric.txt \ --algo InsertSizeMetricAlgo ${idSample}_is_metric.txt \ --algo AlignmentStat ${idSample}_aln_metric.txt - sentieon driver -t ${task.cpus} -i ${bam} \ - --algo LocusCollector --fun score_info ${idSample}_score.gz + sentieon driver \ + -t ${task.cpus} \ + -i ${bam} \ + --algo LocusCollector \ + --fun score_info ${idSample}_score.gz - sentieon driver -t ${task.cpus} -i ${bam} \ - --algo Dedup --rmdup --score_info ${idSample}_score.gz \ + sentieon driver \ + -t ${task.cpus} \ + -i ${bam} \ + --algo Dedup \ + --rmdup \ + --score_info ${idSample}_score.gz \ --metrics ${idSample}_dedup_metric.txt ${idSample}.deduped.bam """ } @@ -1323,6 +1333,8 @@ process SentieonDNAseq { tag {idSample} + publishDir "${params.outdir}/VariantCalling/${idSample}/SentieonDNAseq", mode: params.publishDirMode + input: set idPatient, idSample, file(bam), file(bai) from bamSentieonDNAseq file(dbsnp) from ch_dbsnp @@ -1358,6 +1370,8 @@ process SentieonDNAscope { tag {idSample} + publishDir "${params.outdir}/VariantCalling/${idSample}/SentieonDNAscope", mode: params.publishDirMode + input: set idPatient, idSample, file(bam), file(bai) from bamSentieonDNAscope file(dbsnp) from ch_dbsnp @@ -1566,8 +1580,8 @@ pairBam = bamNormal.cross(bamTumor).map { pairBam = pairBam.dump(tag:'BAM Somatic Pair') -// Manta and Strelka -(pairBamManta, pairBamStrelka, pairBamStrelkaBP, pairBamCalculateContamination, pairBamFilterMutect2, pairBam) = pairBam.into(6) +// Manta, Strelka, Mutect2 +(pairBamManta, pairBamStrelka, pairBamStrelkaBP, pairBamCalculateContamination, pairBamFilterMutect2, pairBamTNscope, pairBam) = pairBam.into(7) intervalPairBam = pairBam.spread(bedIntervals) @@ -1867,6 +1881,47 @@ process FilterMutect2Calls { """ } +// STEP SENTIEON TNSCOPE + +process SentieonTNscope { + label 'cpus_max' + label 'memory_max' + label 'sentieon' + + tag {idSampleTumor + "_vs_" + idSampleNormal} + + publishDir "${params.outdir}/VariantCalling/${idSampleTumor}_vs_${idSampleNormal}/SentieonTNscope", mode: params.publishDirMode + + input: + set idPatient, idSampleNormal, file(bamNormal), file(baiNormal), idSampleTumor, file(bamTumor), file(baiTumor) from pairBamTNscope + file(dict) from ch_dict + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + file(dbsnp) from ch_dbsnp + file(dbsnpIndex) from ch_dbsnpIndex + + output: + set val("SentieonTNscope"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("*.vcf.gz"), file("*.vcf.gz.tbi") into vcfTNscope + + when: 'tnscope' in tools + + script: + """ + sentieon driver \ + -t ${task.cpus} \ + -r ${fasta} \ + -i ${bamTumor} \ + -i ${bamNormal} \ + --algo TNscope \ + --tumor_sample ${idSampleTumor} \ + --normal_sample ${idSampleNormal} \ + --dbsnp ${dbsnp} \ + SentieonTNscope_${idSampleTumor}_vs_${idSampleNormal}.vcf + """ +} + +vcfTNscope = vcfTNscope.dump(tag:'SentieonTNscope') + // STEP STRELKA.2 - SOMATIC PAIR process Strelka { From 9d6c76ee8d2a0da1ce62de6d3e70f52cae9a656b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 14:13:01 +0100 Subject: [PATCH 107/179] fix TNscope output --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 45b91c0d34..464f47605b 100644 --- a/main.nf +++ b/main.nf @@ -1901,7 +1901,7 @@ process SentieonTNscope { file(dbsnpIndex) from ch_dbsnpIndex output: - set val("SentieonTNscope"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("*.vcf.gz"), file("*.vcf.gz.tbi") into vcfTNscope + set val("SentieonTNscope"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("*.vcf") into vcfTNscope when: 'tnscope' in tools From 0aa8ebea42ff458e4de47bb32ac192e6b92a4970 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 15:18:03 +0100 Subject: [PATCH 108/179] add pon for TNscope --- main.nf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.nf b/main.nf index 464f47605b..12289b6f57 100644 --- a/main.nf +++ b/main.nf @@ -1899,6 +1899,7 @@ process SentieonTNscope { file(fastaFai) from ch_fastaFai file(dbsnp) from ch_dbsnp file(dbsnpIndex) from ch_dbsnpIndex + file(pon) from ch_pon output: set val("SentieonTNscope"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("*.vcf") into vcfTNscope @@ -1906,6 +1907,7 @@ process SentieonTNscope { when: 'tnscope' in tools script: + PON = params.pon ? "--pon ${pon}" : "" """ sentieon driver \ -t ${task.cpus} \ @@ -1916,6 +1918,7 @@ process SentieonTNscope { --tumor_sample ${idSampleTumor} \ --normal_sample ${idSampleNormal} \ --dbsnp ${dbsnp} \ + ${PON} \ SentieonTNscope_${idSampleTumor}_vs_${idSampleNormal}.vcf """ } From 10ad68729a0c9a2f7e75ff81d587114cbc38ba28 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 15:29:54 +0100 Subject: [PATCH 109/179] add params.pon_index --- main.nf | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 12289b6f57..a7259085da 100644 --- a/main.nf +++ b/main.nf @@ -64,6 +64,8 @@ def helpMessage() { --annotation_cache Enable the use of cache for annotation, to be used with --snpEff_cache and/or --vep_cache --snpEff_cache Specity the path to snpEff cache, to be used with --annotation_cache --vep_cache Specity the path to VEP cache, to be used with --annotation_cache + --pon panel-of-normals VCF (bgzipped, indexed). See: https://software.broadinstitute.org/gatk/documentation/tooldocs/current/org_broadinstitute_hellbender_tools_walkers_mutect_CreateSomaticPanelOfNormals.php + --pon_index index of pon panel-of-normals VCF References If not specified in the configuration file or you wish to overwrite any of the references. --acLoci acLoci file @@ -87,7 +89,6 @@ def helpMessage() { --monochrome_logs Logs will be without colors --email Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits --maxMultiqcEmailFileSize Theshold size for MultiQC report to be attached in notification email. If file generated by pipeline exceeds the threshold, it will not be attached (Default: 25MB) - --pon panel-of-normals VCF (bgzipped, indexed). See: https://software.broadinstitute.org/gatk/documentation/tooldocs/current/org_broadinstitute_hellbender_tools_walkers_mutect_CreateSomaticPanelOfNormals.php -name Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic AWSBatch options: @@ -500,6 +501,26 @@ process BuildKnownIndelsIndex { """ } +process BuildPonIndex { + tag {pon} + + publishDir params.outdir, mode: params.publishDirMode, + saveAs: {params.saveGenomeIndex ? "reference_genome/${it}" : null } + + input: + file(pon) from ch_pon + + output: + file("${pon}.tbi") into ponIndexBuilt + + when: !(params.ponIndex) && params.pon && ('tnscope' in tools || 'mutect2' in tools) + + script: + """ + tabix -p vcf ${pon} + """ +} + // Initialize channels based on params or indexes that were just built ch_bwaIndex = params.bwaIndex ? Channel.value(file(params.bwaIndex)) : bwaIndexes ch_dbsnpIndex = params.dbsnpIndex ? Channel.value(file(params.dbsnpIndex)) : dbsnpIndexBuilt @@ -507,6 +528,7 @@ ch_dict = params.dict ? Channel.value(file(params.dict)) : dictBuilt ch_fastaFai = params.fastaFai ? Channel.value(file(params.fastaFai)) : fastaFaiBuilt ch_germlineResourceIndex = params.germlineResourceIndex ? Channel.value(file(params.germlineResourceIndex)) : germlineResourceIndexBuilt ch_knownIndelsIndex = params.knownIndelsIndex ? Channel.value(file(params.knownIndelsIndex)) : knownIndelsIndexBuilt.collect() +ch_ponIndex = params.ponIndex ? Channel.value(file(params.ponIndex)) : ponIndexBuilt /* ================================================================================ @@ -1641,6 +1663,8 @@ process Mutect2 { file(germlineResourceIndex) from ch_germlineResourceIndex file(intervals) from ch_intervals file(pon) from ch_pon + file(ponIndex) from ch_ponIndex + file(ponIndex) from ch_ponIndex output: set val("Mutect2"), @@ -1900,6 +1924,7 @@ process SentieonTNscope { file(dbsnp) from ch_dbsnp file(dbsnpIndex) from ch_dbsnpIndex file(pon) from ch_pon + file(ponIndex) from ch_ponIndex output: set val("SentieonTNscope"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("*.vcf") into vcfTNscope From 03332fc6a5600c0e39781953729aa55ef882fc19 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 16:23:45 +0100 Subject: [PATCH 110/179] add annotation for sention DNAseq, DNAscope, TNscope --- main.nf | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) diff --git a/main.nf b/main.nf index a7259085da..28bb3adfdd 100644 --- a/main.nf +++ b/main.nf @@ -1402,7 +1402,8 @@ process SentieonDNAscope { file(fastaFai) from ch_fastaFai output: - set val("SentieonDNAscope"), idPatient, idSample, file("DNAscope_${idSample}.vcf"), file("DNAscope_SV_${idSample}.vcf") into sentieonDNAscopeVCF + set val("SentieonDNAscope"), idPatient, idSample, file("DNAscope_${idSample}.vcf") into sentieonDNAscopeVCF + set val("SentieonDNAscope"), idPatient, idSample, file("DNAscope_SV_${idSample}.vcf") into sentieonDNAscopeSVVCF when: 'dnascope' in tools && params.sentieon @@ -1435,6 +1436,7 @@ process SentieonDNAscope { } sentieonDNAscopeVCF = sentieonDNAscopeVCF.dump(tag:'sentieon DNAscope') +sentieonDNAscopeSVVCF = sentieonDNAscopeSVVCF.dump(tag:'sentieon DNAscope SV') // STEP STRELKA.1 - SINGLE MODE @@ -1948,7 +1950,29 @@ process SentieonTNscope { """ } -vcfTNscope = vcfTNscope.dump(tag:'SentieonTNscope') +vcfTNscope = vcfTNscope.dump(tag:'Sentieon TNscope') + +sentieonVCF = sentieonDNAseqVCF.mix(sentieonDNAscopeVCF, sentieonDNAscopeSVVCF, vcfTNscope) + +process CompressSentieonVCF { + tag {"${idSample} - ${vcf}"} + + publishDir "${params.outdir}/VariantCalling/${idSample}/${variantCaller}", mode: params.publishDirMode + + input: + set variantCaller, idPatient, idSample, file(vcf) from sentieonVCF + + output: + set variantCaller, idPatient, idSample, file("*.vcf.gz"), file("*.vcf.gz.tbi") into vcfSentieon + + script: + """ + bgzip < ${vcf} > ${vcf}.gz + tabix ${vcf}.gz + """ +} + +vcfSentieon = vcfSentieon.dump(tag:'Sentieon VCF indexed') // STEP STRELKA.2 - SOMATIC PAIR @@ -2387,6 +2411,10 @@ controlFreecVizOut.dump(tag:'ControlFreecViz') (vcfMantaSomaticSV, vcfMantaDiploidSV) = vcfManta.into(2) vcfKeep = Channel.empty().mix( + vcfSentieon.map { + variantcaller, idPatient, idSample, vcf, tbi -> + [variantcaller, idSample, vcf + }, vcfStrelkaSingle.map { variantcaller, idPatient, idSample, vcf, tbi -> [variantcaller, idSample, vcf[1]] @@ -2506,13 +2534,19 @@ if (step == 'annotate') { // This field is used to output final annotated VCFs in the correct directory Channel.empty().mix( Channel.fromPath("${params.outdir}/VariantCalling/*/HaplotypeCaller/*.vcf.gz") - .flatten().map{vcf -> ['haplotypecaller', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, + .flatten().map{vcf -> ['HaplotypeCaller', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, Channel.fromPath("${params.outdir}/VariantCalling/*/Manta/*[!candidate]SV.vcf.gz") - .flatten().map{vcf -> ['manta', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, + .flatten().map{vcf -> ['Manta', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, Channel.fromPath("${params.outdir}/VariantCalling/*/Mutect2/*.vcf.gz") - .flatten().map{vcf -> ['mutect2', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, + .flatten().map{vcf -> ['Mutect2', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, + Channel.fromPath("${params.outdir}/VariantCalling/*/SentieonDNAseq/*.vcf.gz") + .flatten().map{vcf -> ['SentieonDNAseq', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, + Channel.fromPath("${params.outdir}/VariantCalling/*/SentieonDNAscope/*.vcf.gz") + .flatten().map{vcf -> ['SentieonDNAscope', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, + Channel.fromPath("${params.outdir}/VariantCalling/*/SentieonTNscope/*.vcf.gz") + .flatten().map{vcf -> ['SentieonTNscope', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, Channel.fromPath("${params.outdir}/VariantCalling/*/Strelka/*{somatic,variant}*.vcf.gz") - .flatten().map{vcf -> ['strelka', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, + .flatten().map{vcf -> ['Strelka', vcf.minus(vcf.fileName)[-2].toString(), vcf]}, Channel.fromPath("${params.outdir}/VariantCalling/*/TIDDIT/*.vcf.gz") .flatten().map{vcf -> ['TIDDIT', vcf.minus(vcf.fileName)[-2].toString(), vcf]} ).choice(vcfToAnnotate, vcfNoAnnotate) { From afc5046f54c235ba013e94b8a76e7a838ea39313 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 16:23:57 +0100 Subject: [PATCH 111/179] add default pon_index --- nextflow.config | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/nextflow.config b/nextflow.config index a39be4f66a..09b2ae03eb 100644 --- a/nextflow.config +++ b/nextflow.config @@ -31,11 +31,12 @@ params { sentieon = null // Not using Sentieon by default // Optional files/directory - cadd_InDels = false // No CADD files - cadd_InDels_tbi = false // No CADD files - cadd_WG_SNVs = false // No CADD files - cadd_WG_SNVs_tbi = false // No CADD files - pon = false // No default PON file for GATK Mutect2 Panel of Normal + cadd_InDels = false // No CADD InDels file + cadd_InDels_tbi = false // No CADD InDels index + cadd_WG_SNVs = false // No CADD SNVs file + cadd_WG_SNVs_tbi = false // No CADD SNVs index + pon = false // No default PON (Panel of Normals) file for GATK Mutect2 / Sentieon TNscope + pon_index = false // No default PON index for GATK Mutect2 / Sentieon TNscope snpEff_cache = null // No directory for snpEff cache targetBED = false // No default TargetBED file for targeted sequencing vep_cache = null // No directory for VEP cache From dd7c1f8a868b8eea4312f7ae21574b740344c9c5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 16:25:26 +0100 Subject: [PATCH 112/179] typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 28bb3adfdd..7a08e43082 100644 --- a/main.nf +++ b/main.nf @@ -2413,7 +2413,7 @@ controlFreecVizOut.dump(tag:'ControlFreecViz') vcfKeep = Channel.empty().mix( vcfSentieon.map { variantcaller, idPatient, idSample, vcf, tbi -> - [variantcaller, idSample, vcf + [variantcaller, idSample, vcf] }, vcfStrelkaSingle.map { variantcaller, idPatient, idSample, vcf, tbi -> From 0c29e692bc98508c3a639b072c83990dedb548fd Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 16:36:53 +0100 Subject: [PATCH 113/179] fix typo --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 7a08e43082..4a4a994ce1 100644 --- a/main.nf +++ b/main.nf @@ -223,7 +223,7 @@ if (tsvPath) { } tsvFile = params.input // used in the reports } else if (step == 'annotate') { - log.info "Annotating ${tsvFile}" + log.info "Annotating ${tsvPath}" } else exit 1, 'No sample were defined, see --help' (genderMap, statusMap, inputSample) = extractInfos(inputSample) From 2fe67d5b0ff289896c0530e63a8baf079a27a116 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 16:40:56 +0100 Subject: [PATCH 114/179] improve automatic annotation --- main.nf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 4a4a994ce1..ff169f7444 100644 --- a/main.nf +++ b/main.nf @@ -222,8 +222,10 @@ if (tsvPath) { if (it.size() == 0) exit 1, "No FASTQ files found in --input directory '${params.input}'" } tsvFile = params.input // used in the reports -} else if (step == 'annotate') { +} else if (tsvPath && step == 'annotate') { log.info "Annotating ${tsvPath}" +} else if (step == 'annotate') { + log.info "Trying automatic annotation on file in the VariantCalling directory" } else exit 1, 'No sample were defined, see --help' (genderMap, statusMap, inputSample) = extractInfos(inputSample) From 2bbc127db7e466980605b8a729f1154bd3f645e4 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 17:28:32 +0100 Subject: [PATCH 115/179] typo --- main.nf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index ff169f7444..7b67208e09 100644 --- a/main.nf +++ b/main.nf @@ -315,6 +315,9 @@ if (params.knownIndels) summary['knownIndels'] = params.know if (params.knownIndelsIndex) summary['knownIndelsIndex'] = params.knownIndelsIndex if (params.snpeffDb) summary['snpeffDb'] = params.snpeffDb if (params.vepCacheVersion) summary['vepCacheVersion'] = params.vepCacheVersion +if (params.species) summary['species'] = params.species +if (params.snpEff_cache) summary['snpEff_cache'] = params.snpEff_cache +if (params.vep_cache) summary['vep_cache'] = params.vep_cache if (workflow.profile == 'awsbatch') { summary['AWS Region'] = params.awsregion @@ -515,7 +518,7 @@ process BuildPonIndex { output: file("${pon}.tbi") into ponIndexBuilt - when: !(params.ponIndex) && params.pon && ('tnscope' in tools || 'mutect2' in tools) + when: !(params.pon_index) && params.pon && ('tnscope' in tools || 'mutect2' in tools) script: """ @@ -530,7 +533,7 @@ ch_dict = params.dict ? Channel.value(file(params.dict)) : dictBuilt ch_fastaFai = params.fastaFai ? Channel.value(file(params.fastaFai)) : fastaFaiBuilt ch_germlineResourceIndex = params.germlineResourceIndex ? Channel.value(file(params.germlineResourceIndex)) : germlineResourceIndexBuilt ch_knownIndelsIndex = params.knownIndelsIndex ? Channel.value(file(params.knownIndelsIndex)) : knownIndelsIndexBuilt.collect() -ch_ponIndex = params.ponIndex ? Channel.value(file(params.ponIndex)) : ponIndexBuilt +ch_ponIndex = params.pon_index ? Channel.value(file(params.pon_index)) : ponIndexBuilt /* ================================================================================ @@ -2530,7 +2533,7 @@ if (step == 'annotate') { if (tsvPath == []) { // Sarek, by default, annotates all available vcfs that it can find in the VariantCalling directory // Excluding vcfs from FreeBayes, and g.vcf from HaplotypeCaller - // Basically it's: VariantCalling/*/{HaplotypeCaller,Manta,Mutect2,Strelka,TIDDIT}/*.vcf.gz + // Basically it's: results/VariantCalling/*/{HaplotypeCaller,Manta,Mutect2,SentieonDNAseq,SentieonDNAscope,SentieonTNscope,Strelka,TIDDIT}/*.vcf.gz // Without *SmallIndels.vcf.gz from Manta, and *.genome.vcf.gz from Strelka // The small snippet `vcf.minus(vcf.fileName)[-2]` catches idSample // This field is used to output final annotated VCFs in the correct directory From 66276c37b3b27864ca3a815b4ea54e29b58eede7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 17:30:38 +0100 Subject: [PATCH 116/179] typo --- main.nf | 1 - 1 file changed, 1 deletion(-) diff --git a/main.nf b/main.nf index 7b67208e09..117ccf171f 100644 --- a/main.nf +++ b/main.nf @@ -1671,7 +1671,6 @@ process Mutect2 { file(intervals) from ch_intervals file(pon) from ch_pon file(ponIndex) from ch_ponIndex - file(ponIndex) from ch_ponIndex output: set val("Mutect2"), From fc27dd064a0accb0d085642a65192a8445491568 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 13 Nov 2019 17:44:16 +0100 Subject: [PATCH 117/179] add condition on when statement on TNscope --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 117ccf171f..f54d4be675 100644 --- a/main.nf +++ b/main.nf @@ -1935,7 +1935,7 @@ process SentieonTNscope { output: set val("SentieonTNscope"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("*.vcf") into vcfTNscope - when: 'tnscope' in tools + when: 'tnscope' in tools && params.sentieon script: PON = params.pon ? "--pon ${pon}" : "" From 6d9124740ae798c8e94ff4506277586b6bcfde4a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 14 Nov 2019 10:32:17 +0100 Subject: [PATCH 118/179] clean up --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index f54d4be675..908da73e68 100644 --- a/main.nf +++ b/main.nf @@ -207,7 +207,7 @@ if (tsvPath) { tsvFile = file(tsvPath) switch (step) { case 'mapping': inputSample = extractFastq(tsvFile); break - case 'recalibrate': inputSample = params.sentieon ? extractBam(tsvFile) : extractRecal(tsvFile) ; break + case 'recalibrate': inputSample = extractRecal(tsvFile) ; break case 'variantcalling': inputSample = extractBam(tsvFile); break case 'annotate': break default: exit 1, "Unknown step ${step}" @@ -1257,7 +1257,7 @@ bamQCReport = bamQCReport.dump(tag:'BamQC') ================================================================================ */ -if (params.sentieon && step in ['mapping', 'recalibrate']) bamRecal = bamRecalSentieon +if (params.sentieon && step == 'mapping') bamRecal = bamRecalSentieon if (step == 'variantcalling') bamRecal = inputSample From c23306bf55c1bd1ce370f498860866a371094d41 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 14 Nov 2019 10:34:05 +0100 Subject: [PATCH 119/179] code polish --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 908da73e68..3734b855a7 100644 --- a/main.nf +++ b/main.nf @@ -207,7 +207,7 @@ if (tsvPath) { tsvFile = file(tsvPath) switch (step) { case 'mapping': inputSample = extractFastq(tsvFile); break - case 'recalibrate': inputSample = extractRecal(tsvFile) ; break + case 'recalibrate': inputSample = extractRecal(tsvFile); break case 'variantcalling': inputSample = extractBam(tsvFile); break case 'annotate': break default: exit 1, "Unknown step ${step}" From 07e8502cb093cba1406f3ca73db847ff6eb6aa14 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 15 Nov 2019 10:45:23 +0100 Subject: [PATCH 120/179] add CODEOWNERS file --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..04c39ab2b5 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @MaxUlysse \ No newline at end of file From a85b9be8ba8d935d7d5203db6472377640c25c93 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 18 Nov 2019 17:00:56 +0100 Subject: [PATCH 121/179] add when statement on all sentieon processes with params.sentieon --- main.nf | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/main.nf b/main.nf index 3734b855a7..dd03f8fadc 100644 --- a/main.nf +++ b/main.nf @@ -759,6 +759,8 @@ process SentieonMapReads { set idPatient, idSample, idRun, file("${idSample}_${idRun}.bam") into bamMappedSentieon set idPatient, idSample, file("${idSample}_${idRun}.bam") into bamMappedSentieonBamQC + when: params.sentieon + script: // -K is an hidden option, used to fix the number of reads processed by bwa mem // Chunk size can affect bwa results, if not specified, @@ -910,6 +912,8 @@ process SentieonDedup { set idPatient, idSample, file("${idSample}.deduped.bam"), file("${idSample}.deduped.bam.bai") into bamDedupedSentieon file("${idSample}_*.txt") into bamDedupedSentieonQC + when: params.sentieon + script: """ sentieon driver \ @@ -1093,6 +1097,8 @@ process SentieonBQSR { set idPatient, idSample into bamRecalSentieonTSV file("${idSample}_recal_result.csv") into bamRecalSentieonQC + when: params.sentieon + script: known = knownIndels.collect{"--known-sites ${it}"}.join(' ') """ @@ -1969,6 +1975,8 @@ process CompressSentieonVCF { output: set variantCaller, idPatient, idSample, file("*.vcf.gz"), file("*.vcf.gz.tbi") into vcfSentieon + when: params.sentieon + script: """ bgzip < ${vcf} > ${vcf}.gz From b84cbc4be780afdddaf4e6b1d16c2a55c4dc939a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 20 Nov 2019 10:12:17 +0100 Subject: [PATCH 122/179] remove munin sentieon specific configs from config --- conf/base.config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/conf/base.config b/conf/base.config index 3eeac179f5..5c76d275e6 100644 --- a/conf/base.config +++ b/conf/base.config @@ -75,8 +75,4 @@ process { container = {(params.annotation_cache && params.vep_cache) ? 'nfcore/sarek:dev' : "nfcore/sarekvep:dev.${params.genome}"} errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} } - withLabel:sentieon { - beforeScript = {params.sentieon ? 'module load sentieon/201808.05' : ''} - container = {params.sentieon ? '' : 'nfcore/sarek:dev'} - } } From 38d113e2d5de4750849ece63ec33e380abd94e31 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 20 Nov 2019 10:12:30 +0100 Subject: [PATCH 123/179] load sarek specific config --- nextflow.config | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/nextflow.config b/nextflow.config index 09b2ae03eb..49d37893cf 100644 --- a/nextflow.config +++ b/nextflow.config @@ -100,6 +100,13 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Load nf-core/sarek custom profiles from different Institutions +try { + includeConfig "${params.custom_config_base}/pipeline/nfcore_custom_sarek.config" +} catch (Exception e) { + System.err.println("WARNING: Could not load nf-core/config/sarek profiles: ${params.custom_config_base}/pipeline/nfcore_custom_sarek.config") +} + profiles { awsbatch { includeConfig 'conf/awsbatch.config' } conda { From daaf48f947f13ef31d2c2c215e3ecd62ca99e668 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 20 Nov 2019 14:03:34 +0100 Subject: [PATCH 124/179] update path to specific config --- nextflow.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nextflow.config b/nextflow.config index 49d37893cf..2789042979 100644 --- a/nextflow.config +++ b/nextflow.config @@ -102,9 +102,9 @@ try { // Load nf-core/sarek custom profiles from different Institutions try { - includeConfig "${params.custom_config_base}/pipeline/nfcore_custom_sarek.config" + includeConfig "${params.custom_config_base}/pipeline/sarek.config" } catch (Exception e) { - System.err.println("WARNING: Could not load nf-core/config/sarek profiles: ${params.custom_config_base}/pipeline/nfcore_custom_sarek.config") + System.err.println("WARNING: Could not load nf-core/config/sarek profiles: ${params.custom_config_base}/pipeline/sarek.config") } profiles { From 485ac145a9fd25a8bfd0e6fcc185af0d88fa50ab Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 28 Nov 2019 17:28:27 +0100 Subject: [PATCH 125/179] update docs --- .github/CONTRIBUTING.md | 48 +++-- .github/ISSUE_TEMPLATE/bug_report.md | 43 ++-- .github/ISSUE_TEMPLATE/feature_request.md | 18 +- .github/PULL_REQUEST_TEMPLATE.md | 23 ++- .github/workflows/branch.yml | 2 +- CHANGELOG.md | 241 ++++++++++++---------- README.md | 23 +-- 7 files changed, 219 insertions(+), 179 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c8210fcedb..8c8447976d 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,47 +1,53 @@ # nf-core/sarek: Contributing Guidelines -Hi there! Many thanks for taking an interest in improving nf-core/sarek. +Hi there! +Many thanks for taking an interest in improving nf-core/sarek. -We try to manage the required tasks for nf-core/sarek using GitHub issues, you probably came to this page when creating one. Please use the pre-filled template to save time. - -However, don't be put off by this template - other more general issues and suggestions are welcome! Contributions to the code are even more welcome ;) - -> If you need help using or modifying nf-core/sarek then the best place to ask is on the pipeline channel on [Slack](https://nf-core-invite.herokuapp.com/). +We try to manage the required tasks for nf-core/sarek using GitHub issues, you probably came to this page when creating one. +Please use the pre-filled template to save time. +However, don't be put off by this template - other more general issues and suggestions are welcome! +Contributions to the code are even more welcome ;) +> If you need help using or modifying nf-core/sarek then the best place to ask is on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). ## Contribution workflow -If you'd like to write some code for nf-core/sarek, the standard workflow -is as follows: -1. Check that there isn't already an issue about your idea in the - [nf-core/sarek issues](https://github.com/nf-core/sarek/issues) to avoid - duplicating work. +If you'd like to write some code for nf-core/sarek, the standard workflow is as follows: + +1. Check that there isn't already an issue about your idea in the [nf-core/sarek issues](https://github.com/nf-core/sarek/issues) to avoid duplicating work * If there isn't one already, please create one so that others know you're working on this -2. Fork the [nf-core/sarek repository](https://github.com/nf-core/sarek) to your GitHub account +2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/sarek repository](https://github.com/nf-core/sarek) to your GitHub account 3. Make the necessary changes / additions within your forked repository -4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged. - -If you're not used to this workflow with git, you can start with some [basic docs from GitHub](https://help.github.com/articles/fork-a-repo/) or even their [excellent interactive tutorial](https://try.github.io/). +4. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged +If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). ## Tests -When you create a pull request with changes, [Travis CI](https://travis-ci.org/) will run automatic tests. + +When you create a pull request with changes, [GitHub Actions](https://github.com/features/actions) will run automatic tests. Typically, pull-requests are only fully reviewed when these tests are passing, though of course we can help out before then. There are typically two types of tests that run: ### Lint Tests -The nf-core has a [set of guidelines](http://nf-co.re/guidelines) which all pipelines must adhere to. + +`nf-core` has a [set of guidelines](https://nf-co.re/developers/guidelines) which all pipelines must adhere to. To enforce these and ensure that all pipelines stay in sync, we have developed a helper tool which runs checks on the pipeline code. This is in the [nf-core/tools repository](https://github.com/nf-core/tools) and once installed can be run locally with the `nf-core lint ` command. If any failures or warnings are encountered, please follow the listed URL for more documentation. ### Pipeline Tests -Each nf-core pipeline should be set up with a minimal set of test-data. -Travis CI then runs the pipeline on this data to ensure that it exists successfully. + +Each `nf-core` pipeline should be set up with a minimal set of test-data. +`GitHub Actions` then runs the pipeline on this data to ensure that it exits successfully. If there are any failures then the automated tests fail. -These tests are run both with the latest available version of Nextflow and also the minimum required version that is stated in the pipeline code. +These tests are run both with the latest available version of `Nextflow` and also the minimum required version that is stated in the pipeline code. + +## Patch + +When patching a release, please work on your fork on a new branch named `patch` ## Getting help -For further information/help, please consult the [nf-core/sarek documentation](https://github.com/nf-core/sarek#documentation) and don't hesitate to get in touch on the [sarek pipeline channel](https://nfcore.slack.com/channels/sarek) on [Slack](https://nf-co.re/join/slack). + +For further information/help, please consult the [nf-core/sarek documentation](https://github.com/nf-core/sarek#documentation) and don't hesitate to get in touch on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 6df6c5052c..5e62bedd66 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,31 +1,42 @@ +# nf-core/sarek bug report + Hi there! -Thanks for telling us about a problem with the pipeline. Please delete this text and anything that's not relevant from the template below: +Thanks for telling us about a problem with the pipeline. +Please delete this text and anything that's not relevant from the template below: + +## Describe the bug -#### Describe the bug A clear and concise description of what the bug is. -#### Steps to reproduce +## Steps to reproduce + Steps to reproduce the behaviour: + 1. Command line: `nextflow run ...` 2. See error: _Please provide your error message_ -#### Expected behaviour +## Expected behaviour + A clear and concise description of what you expected to happen. -#### System: - - Hardware: [e.g. HPC, Desktop, Cloud...] - - Executor: [e.g. slurm, local, awsbatch...] - - OS: [e.g. CentOS Linux, macOS, Linux Mint...] - - Version [e.g. 7, 10.13.6, 18.3...] +## System + +- Hardware: [e.g. HPC, Desktop, Cloud...] +- Executor: [e.g. slurm, local, awsbatch...] +- OS: [e.g. CentOS Linux, macOS, Linux Mint...] +- Version [e.g. 7, 10.13.6, 18.3...] + +## Nextflow Installation + +- Version: [e.g. 0.31.0] + +## Container engine -#### Nextflow Installation: - - Version: [e.g. 0.31.0] +- Engine: [e.g. Conda, Docker or Singularity] +- version: [e.g. 1.0.0] +- Image tag: [e.g. nfcore/sarek:2.5.1] -#### Container engine: - - Engine: [e.g. Conda, Docker or Singularity] - - version: [e.g. 1.0.0] - - Image tag: [e.g. nfcore/sarek:1.0.0] +## Additional context -#### Additional context Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 1f025b779c..e3f009a723 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,16 +1,24 @@ +# nf-core/sarek feature request + Hi there! -Thanks for suggesting a new feature for the pipeline! Please delete this text and anything that's not relevant from the template below: +Thanks for suggesting a new feature for the pipeline! +Please delete this text and anything that's not relevant from the template below: + +## Is your feature request related to a problem? Please describe -#### Is your feature request related to a problem? Please describe. A clear and concise description of what the problem is. + Ex. I'm always frustrated when [...] -#### Describe the solution you'd like +## Describe the solution you'd like + A clear and concise description of what you want to happen. -#### Describe alternatives you've considered +## Describe alternatives you've considered + A clear and concise description of any alternative solutions or features you've considered. -#### Additional context +## Additional context + Add any other context about the feature request here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 15c9a1b1df..913a3fa83c 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,16 +1,19 @@ -Many thanks to contributing to nf-core/sarek! +# nf-core/sarek pull request + +Many thanks for contributing to nf-core/sarek! Please fill in the appropriate checklist below (delete whatever is not relevant). These are the most common things requested on pull requests (PRs). ## PR checklist - - [ ] This comment contains a description of changes (with reason) - - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If necessary, also make a PR on the [nf-core/sarek branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/sarek) - - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - - [ ] Make sure your code lints (`nf-core lint .`). - - [ ] Documentation in `docs` is updated - - [ ] `CHANGELOG.md` is updated - - [ ] `README.md` is updated -**Learn more about contributing:** [guidelines](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) \ No newline at end of file +- [ ] This comment contains a description of changes (with reason) +- [ ] If you've fixed a bug or added code that should be tested, add tests! +- [ ] If necessary, also make a PR on the [nf-core/sarek branch on the nf-core/test-datasets repo](https://github.com/nf-core/test-datasets/pull/new/nf-core/sarek) +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Documentation in `docs` is updated +- [ ] `CHANGELOG.md` is updated +- [ ] `README.md` is updated + +**Learn more about contributing:** [CONTRIBUTING.md](https://github.com/nf-core/sarek/tree/master/.github/CONTRIBUTING.md) \ No newline at end of file diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 174e995a05..06824f2d77 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,4 +13,4 @@ jobs: - uses: actions/checkout@v1 - name: Check PRs run: | - { [[ $(git remote get-url origin) == *nf-core/sarek ]] && [[ ${GITHUB_BASE_REF} = "master" ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == patch* ]] \ No newline at end of file + { [[ $(git remote get-url origin) == *nf-core/sarek ]] && [[ ${GITHUB_HEAD_REF} = "dev" ]]; } || [[ ${GITHUB_HEAD_REF} == "patch" ]] \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 7238d184b1..20f8b472e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,14 +2,14 @@ All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) -and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). ## dev ### `Added` -- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts +- [#45](https://github.com/nf-core/sarek/pull/45) - Include Workflow figure in `README.md` +- [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstracts - [#52](https://github.com/nf-core/sarek/pull/52) - Add support for mouse data `GRCm38` ### `Changed` @@ -23,11 +23,13 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#41](https://github.com/nf-core/sarek/pull/41), [#55](https://github.com/nf-core/sarek/pull/55) - Update `tiddit` from `2.7.1` to `2.8.1` - [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` - [#54](https://github.com/nf-core/sarek/pull/54) - Bump version to `2.5.2dev` +- [#XXX](https://github.com/nf-core/sarek/pull/XXX) - Update `README` +- [#XXX](https://github.com/nf-core/sarek/pull/XXX) - Update `CHANGELOG` ### `Removed` -- [#45](https://github.com/nf-core/sarek/pull/45) - Include Workflow figure in `README.md` - [#46](https://github.com/nf-core/sarek/pull/46) - Remove mention of old `build.nf` script which was included in `main.nf` +- [#XXX](https://github.com/nf-core/sarek/pull/XXX) - Remove `Freebayes` ### `Fixed` @@ -35,7 +37,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#42](https://github.com/nf-core/sarek/pull/42) - Fix typos, and minor updates in `README.md` - [#43](https://github.com/nf-core/sarek/pull/43) - Fix automated `VEP` builds with circleCI - [#54](https://github.com/nf-core/sarek/pull/54) - Apply fixes from release `2.5.1` -- [#58](https://github.com/nf-core/sarek/pull/58) - Fix issue with `.interval_list` file from the GATK bundle [#56](https://github.com/nf-core/sarek/issues/56) that was not recognized in the `CreateIntervalsBed` process +- [#58](https://github.com/nf-core/sarek/pull/58) - Fix issue with `.interval_list` file from the `GATK` bundle [#56](https://github.com/nf-core/sarek/issues/56) that was not recognized in the `CreateIntervalsBed` process +- [#XXX](https://github.com/nf-core/sarek/pull/XXX) - Fix typos in `CHANGELOG` ## [2.5.1] - Årjep-Ålkatjjekna @@ -53,6 +56,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. ## [2.5] - Ålkatj +Ålkatj is one of the main massif in the Sarek National Park. + Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) template. ### `Added` @@ -61,37 +66,37 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#2](https://github.com/nf-core/sarek/pull/2), [#3](https://github.com/nf-core/sarek/pull/3), [#4](https://github.com/nf-core/sarek/pull/4), [#5](https://github.com/nf-core/sarek/pull/5), [#7](https://github.com/nf-core/sarek/pull/7), [#9](https://github.com/nf-core/sarek/pull/9), [#10](https://github.com/nf-core/sarek/pull/10), [#11](https://github.com/nf-core/sarek/pull/11), [#12](https://github.com/nf-core/sarek/pull/12) - Add CI for `nf-core/sarek` - [#3](https://github.com/nf-core/sarek/pull/3) - Add preprocessing to `nf-core/sarek` - [#4](https://github.com/nf-core/sarek/pull/4) - Add variant calling to `nf-core/sarek` with `HaplotypeCaller`, and single mode `Manta` and `Strelka` -- [#5](https://github.com/nf-core/sarek/pull/5), [#34](https://github.com/nf-core/sarek/pull/34) - Add variant calling to `nf-core/sarek` with `Manta`, `Strelka`, `Strelka Best Practices`, `MuTecT2`, `FreeBayes`, `ASCAT`, `ControlFREEC` +- [#5](https://github.com/nf-core/sarek/pull/5), [#34](https://github.com/nf-core/sarek/pull/34) - Add variant calling to `nf-core/sarek` with `Manta`, `Strelka`, `Strelka Best Practices`, `Mutect2`, `FreeBayes`, `ASCAT`, `ControlFREEC` - [#6](https://github.com/nf-core/sarek/pull/6) - Add default containers for annotation to `nf-core/sarek` -- [#7](https://github.com/nf-core/sarek/pull/7) - Add MultiQC +- [#7](https://github.com/nf-core/sarek/pull/7) - Add `MultiQC` - [#7](https://github.com/nf-core/sarek/pull/7) - Add annotation - [#7](https://github.com/nf-core/sarek/pull/7) - Add social preview image in `png` and `svg` format - [#7](https://github.com/nf-core/sarek/pull/7), [#8](https://github.com/nf-core/sarek/pull/8), [#11](https://github.com/nf-core/sarek/pull/11), [#21](https://github.com/nf-core/sarek/pull/21) - Add helper script `run_tests.sh` to run different tests - [#7](https://github.com/nf-core/sarek/pull/7), [#8](https://github.com/nf-core/sarek/pull/8), [#9](https://github.com/nf-core/sarek/pull/9) - Add automatic build of specific containers for annotation for `GRCh37`, `GRCh38` and `GRCm38` using `CircleCI` - [#7](https://github.com/nf-core/sarek/pull/7), [#8](https://github.com/nf-core/sarek/pull/8), [#9](https://github.com/nf-core/sarek/pull/9), [#11](https://github.com/nf-core/sarek/pull/11) - Add helper script `build_reference.sh` to build small reference from [nf-core/test-datasets:sarek](https://github.com/nf-core/test-datasets/tree/sarek) - [#7](https://github.com/nf-core/sarek/pull/7), [#9](https://github.com/nf-core/sarek/pull/9), [#11](https://github.com/nf-core/sarek/pull/11), [#12](https://github.com/nf-core/sarek/pull/12) - Add helper script `download_image.sh` to download containers for testing -- [#8](https://github.com/nf-core/sarek/pull/8) - Add test configation for easier testing +- [#8](https://github.com/nf-core/sarek/pull/8) - Add test configuration for easier testing - [#9](https://github.com/nf-core/sarek/pull/9), [#11](https://github.com/nf-core/sarek/pull/11) - Add scripts for `ASCAT` - [#10](https://github.com/nf-core/sarek/pull/10) - Add `TIDDIT` to detect structural variants - [#11](https://github.com/nf-core/sarek/pull/11) - Add automatic build of specific containers for annotation for `CanFam3.1` using `CircleCI` - [#11](https://github.com/nf-core/sarek/pull/11), [#12](https://github.com/nf-core/sarek/pull/12) - Add posters and abstracts - [#12](https://github.com/nf-core/sarek/pull/12) - Add helper script `make_snapshot.sh` to make an archive for usage on a secure cluster - [#12](https://github.com/nf-core/sarek/pull/12) - Add helper scripts `filter_locifile.py` and `selectROI.py` -- [#12](https://github.com/nf-core/sarek/pull/12) - Use `label` for processes configation +- [#12](https://github.com/nf-core/sarek/pull/12) - Use `label` for processes configuration - [#13](https://github.com/nf-core/sarek/pull/13) - Add Citation documentation - [#13](https://github.com/nf-core/sarek/pull/13) - Add `BamQC` process - [#13](https://github.com/nf-core/sarek/pull/13) - Add `CompressVCFsnpEff` and `CompressVCFvep` processes - [#18](https://github.com/nf-core/sarek/pull/18) - Add `--no-reports` option for tests + add snpEff,VEP,merge to MULTIPLE test -- [#18](https://github.com/nf-core/sarek/pull/18) - Add logo to MultiQC report +- [#18](https://github.com/nf-core/sarek/pull/18) - Add logo to `MultiQC` report - [#18](https://github.com/nf-core/sarek/pull/18), [#29](https://github.com/nf-core/sarek/pull/29) - Add params `--skipQC` to skip specified QC tools - [#18](https://github.com/nf-core/sarek/pull/18) - Add possibility to download other genome for `sareksnpeff` and `sarekvep` containers - [#20](https://github.com/nf-core/sarek/pull/20) - Add `markdownlint` config file -- [#21](https://github.com/nf-core/sarek/pull/21) - Add tests for latest Nextflow version as well -- [#21](https://github.com/nf-core/sarek/pull/21) - Add `genomes.config` for genomes without AWS iGenomes -- [#24](https://github.com/nf-core/sarek/pull/24) - Added GATK4 Mutect2 calling and filtering +- [#21](https://github.com/nf-core/sarek/pull/21) - Add tests for latest `Nextflow` version as well +- [#21](https://github.com/nf-core/sarek/pull/21) - Add `genomes.config` for genomes without `AWS iGenomes` +- [#24](https://github.com/nf-core/sarek/pull/24) - Added `GATK4 Mutect2` calling and filtering - [#27](https://github.com/nf-core/sarek/pull/27), [#30](https://github.com/nf-core/sarek/pull/30) - Use Github actions for CI, linting and branch protection -- [#31](https://github.com/nf-core/sarek/pull/31) - Add nf-core lint -- [#31](https://github.com/nf-core/sarek/pull/31) - Add extra CI to GitHub Actions nf-core extra CI +- [#31](https://github.com/nf-core/sarek/pull/31) - Add `nf-core lint` +- [#31](https://github.com/nf-core/sarek/pull/31) - Add extra CI to `GitHub Actions` nf-core extra CI - [#35](https://github.com/nf-core/sarek/pull/35) - Building indexes from [nf-core/test-datasets:sarek](https://github.com/nf-core/test-datasets/tree/sarek) for CI and small tests ### `Changed` @@ -103,10 +108,10 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#7](https://github.com/nf-core/sarek/pull/8), [#23](https://github.com/nf-core/sarek/pull/23) - `--annotateVCF` is now deprecated, use `--input` instead - [#8](https://github.com/nf-core/sarek/pull/8), [#12](https://github.com/nf-core/sarek/pull/12) - Improve helper script `build.nf` for downloading and building reference files - [#9](https://github.com/nf-core/sarek/pull/9) - `ApplyBQSR` is now parallelized -- [#9](https://github.com/nf-core/sarek/pull/9) - Fastq files are named following "${idRun}_R1.fastq.gz" in the FastQC output for easier reporting +- [#9](https://github.com/nf-core/sarek/pull/9) - Fastq files are named following "${idRun}_R1.fastq.gz" in the `FastQC` output for easier reporting - [#9](https://github.com/nf-core/sarek/pull/9) - Status is now a map with `idpatient`, `idsample` as keys (ie: `status = statusMap[idPatient, idSample]`) - [#9](https://github.com/nf-core/sarek/pull/9) - Use `ensembl-vep` `95.2` instead of `96.0` -- [#11](https://github.com/nf-core/sarek/pull/11) - Summary HTML from VWP is now in the `Reports` directory +- [#11](https://github.com/nf-core/sarek/pull/11) - Summary HTML from `VEP` is now in the `Reports` directory - [#12](https://github.com/nf-core/sarek/pull/12) - Update configuration files - [#12](https://github.com/nf-core/sarek/pull/12) - Disable `Docker` in `singularity` profile - [#12](https://github.com/nf-core/sarek/pull/12) - Disable `Singularity` in `docker` profile @@ -119,23 +124,23 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#18](https://github.com/nf-core/sarek/pull/18) - Add `--no-reports` for all tests but MULTIPLE in Jenkins - [#18](https://github.com/nf-core/sarek/pull/18), [#29](https://github.com/nf-core/sarek/pull/29) - `--noReports` is now `--skipQC all` - [#18](https://github.com/nf-core/sarek/pull/18), [#21](https://github.com/nf-core/sarek/pull/21) - Update logo -- [#21](https://github.com/nf-core/sarek/pull/21) - Moved smallGRCh37 path to `genomes.config` +- [#21](https://github.com/nf-core/sarek/pull/21) - Moved `smallGRCh37` path to `genomes.config` - [#23](https://github.com/nf-core/sarek/pull/23) - Rename `genomeFile`, `genomeIndex` and `genomeDict` by `fasta`, `fastaFai` and `dict` - [#23](https://github.com/nf-core/sarek/pull/23) - `--sample` is now deprecated, use `--input` instead - [#23](https://github.com/nf-core/sarek/pull/23) - `--genomeFile` is now deprecated, use `--fasta` instead - [#23](https://github.com/nf-core/sarek/pull/23) - `--genomeIndex` is now deprecated, use `--fastaFai` instead - [#23](https://github.com/nf-core/sarek/pull/23) - `--genomeDict` is now deprecated, use `--dict` instead -- [#24](https://github.com/nf-core/sarek/pull/24) - iGenomes config now contains germline resource for GATK4 Mutect2 +- [#24](https://github.com/nf-core/sarek/pull/24) - `AWS iGenomes` config now contains germline resource for `GATK4 Mutect2` - [#30](https://github.com/nf-core/sarek/pull/30) - Simplify code for `MapReads` process -- [#24](https://github.com/nf-core/sarek/pull/24) - iGenomes config now contains germline resource for `GATK4 Mutect2` -- [#31](https://github.com/nf-core/sarek/pull/31) - Move extra CI to GitHub Actions nf-core extra CI +- [#24](https://github.com/nf-core/sarek/pull/24) - `AWS iGenomes` config now contains germline resource for `GATK4 Mutect2` +- [#31](https://github.com/nf-core/sarek/pull/31) - Move extra CI to `GitHub Actions` nf-core extra CI - [#32](https://github.com/nf-core/sarek/pull/32), [#33](https://github.com/nf-core/sarek/pull/33) - Install `ASCAT` with `conda` in the `environment.yml` file -- [#33](https://github.com/nf-core/sarek/pull/33) - use `workflow.manifest.version` to specify workflow version in path to scripts for `ControlFREEC` and `VEP` processes +- [#33](https://github.com/nf-core/sarek/pull/33) - Use `workflow.manifest.version` to specify workflow version in path to scripts for `ControlFREEC` and `VEP` processes - [#35](https://github.com/nf-core/sarek/pull/35) - Building indexes is now done in `main.nf` - [#35](https://github.com/nf-core/sarek/pull/35) - `build.nf` script now only download cache, so renamed to `downloadcache.nf` - [#35](https://github.com/nf-core/sarek/pull/35) - Use `tabix` instead of `IGVtools` to build vcf indexes - [#35](https://github.com/nf-core/sarek/pull/35) - Refactor references handling -- [#35](https://github.com/nf-core/sarek/pull/35) - use Channel values instead of `referenceMap` +- [#35](https://github.com/nf-core/sarek/pull/35) - Use Channel values instead of `referenceMap` - [#37](https://github.com/nf-core/sarek/pull/37) - Bump version for Release - [#38](https://github.com/nf-core/sarek/pull/38) - File names before merge is based on `${idSample}_${idRun}` instead of `${idRun}` @@ -145,8 +150,8 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#13](https://github.com/nf-core/sarek/pull/13) - Removed `BamQCmapped` and `BamQCrecalibrated` processes - [#13](https://github.com/nf-core/sarek/pull/13) - Removed `CompressVCF` - [#18](https://github.com/nf-core/sarek/pull/18) - Removed params `--noReports` -- [#24](https://github.com/nf-core/sarek/pull/18) - Removed GATK3.X MuTect2 -- [#31](https://github.com/nf-core/sarek/pull/31) - Remove extra CI from Travis CI and GitHub Actions nf-core CI +- [#24](https://github.com/nf-core/sarek/pull/18) - Removed `GATK3.X Mutect2` +- [#31](https://github.com/nf-core/sarek/pull/31) - Remove extra CI from `Travis CI` and `GitHub Actions` nf-core CI - [#32](https://github.com/nf-core/sarek/pull/32), [#35](https://github.com/nf-core/sarek/pull/35) - Clean up `environment.yml` file - [#35](https://github.com/nf-core/sarek/pull/35) - Remove building indexes from `build.nf` script - [#35](https://github.com/nf-core/sarek/pull/35) - Remove helper script `build_reference.sh` @@ -156,21 +161,21 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Fixed` -- [#3](https://github.com/nf-core/sarek/pull/3) - Fix Docker ownership +- [#3](https://github.com/nf-core/sarek/pull/3) - Fix `Docker` ownership - [#11](https://github.com/nf-core/sarek/pull/11) - Fix `MergeMpileup` PublishDir - [#13](https://github.com/nf-core/sarek/pull/13) - Fix merge in annotation - [#14](https://github.com/nf-core/sarek/pull/14) - Fix output name for vcf files -- [#16](https://github.com/nf-core/sarek/pull/16) - Fix path to Rscript +- [#16](https://github.com/nf-core/sarek/pull/16) - Fix path to `Rscript` - [#18](https://github.com/nf-core/sarek/pull/18) - Improve cpu usage -- [#18](https://github.com/nf-core/sarek/pull/18) - Use same font for nf-core and sarek in ascii art +- [#18](https://github.com/nf-core/sarek/pull/18) - Use same font for `nf-core` and `sarek` in ascii art - [#20](https://github.com/nf-core/sarek/pull/20) - Use new logo in README - [#20](https://github.com/nf-core/sarek/pull/20) - Fix path to references genomes - [#22](https://github.com/nf-core/sarek/pull/22) - Fix `--singleCPUMem` issue -- [#30](https://github.com/nf-core/sarek/pull/30) - fix choice between `inputPairReadsFastQC` and `inputBAMFastQC` channels +- [#30](https://github.com/nf-core/sarek/pull/30) - Fix choice between `inputPairReadsFastQC` and `inputBAMFastQC` channels - [#31](https://github.com/nf-core/sarek/pull/31) - Fix badges according to nf-core lint -- [#31](https://github.com/nf-core/sarek/pull/31) - Fix rcolorbrewer version according to nf-core lint +- [#31](https://github.com/nf-core/sarek/pull/31) - Fix `rcolorbrewer` version according to nf-core lint - [#33](https://github.com/nf-core/sarek/pull/33) - Fix MD Linting -- [#38](https://github.com/nf-core/sarek/pull/38) - Avoid collision in MultiQC +- [#38](https://github.com/nf-core/sarek/pull/38) - Avoid collision in `MultiQC` - [#39](https://github.com/nf-core/sarek/pull/39) - Fix `ch_dbsnp` channel ### `Deprecated` @@ -185,10 +190,12 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Fixed` -- [#742](https://github.com/SciLifeLab/Sarek/pull/742) - Fix output dirs (HaplotypeCaller that was not recognized by annotate.nf introduced by [#728](https://github.com/SciLifeLab/Sarek/pull/728)) +- [#742](https://github.com/SciLifeLab/Sarek/pull/742) - Fix output dirs (`HaplotypeCaller` that was not recognized by `annotate.nf` introduced by [#728](https://github.com/SciLifeLab/Sarek/pull/728)) ## [2.3] - Äpar - 2019-02-27 +Äpar is one of the main massif in the Sarek National Park. + ### `Added` - [#628](https://github.com/SciLifeLab/Sarek/pull/628), [#722](https://github.com/SciLifeLab/Sarek/pull/722) - `ASCAT` now use `.gc` file @@ -200,50 +207,50 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#722](https://github.com/SciLifeLab/Sarek/pull/722) - Add path to ASCAT `.gc` file in `igenomes.config` - [#728](https://github.com/SciLifeLab/Sarek/pull/728) - Update `Sarek-data` submodule with multiple patients TSV file - [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Add `cadd_WG_SNVs`, `cadd_WG_SNVs_tbi`, `cadd_InDels`, `cadd_InDels_tbi` and `cadd_cache` params -- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Add tabix indexed cache for VEP +- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Add `tabix` indexed cache for `VEP` - [#732](https://github.com/SciLifeLab/Sarek/pull/732) - New `DownloadCADD` process to download CADD files - [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Specify values for `cadd_WG_SNVs`, `cadd_WG_SNVs_tbi`, `cadd_InDels`, `cadd_InDels_tbi` and `cadd_cache` params in `munin.conf` file - [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Use `cadd_cache` param for optional use of CADD VEP plugin in `annotate.nf` -- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - VEP cache has now fasta files for `--HGVS` -- [#735](https://github.com/SciLifeLab/Sarek/pull/735) - Added `--exome` for Manta, and for StrelkaBP -- [#735](https://github.com/SciLifeLab/Sarek/pull/735) - Added Travis CI test for targeted +- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - `VEP` cache has now fasta files for `--HGVS` +- [#735](https://github.com/SciLifeLab/Sarek/pull/735) - Added `--exome` for `Manta`, and for `StrelkaBP` +- [#735](https://github.com/SciLifeLab/Sarek/pull/735) - Added `Travis CI` test for targeted ### `Changed` - [#710](https://github.com/SciLifeLab/Sarek/pull/710) - Improve release checklist and script - [#711](https://github.com/SciLifeLab/Sarek/pull/711) - Improve configuration priorities -- [#716](https://github.com/SciLifeLab/Sarek/pull/716) - Update paths to containers and iGenomes +- [#716](https://github.com/SciLifeLab/Sarek/pull/716) - Update paths to containers and `AWS iGenomes` - [#717](https://github.com/SciLifeLab/Sarek/pull/717) - `checkFileExtension` has changed to `hasExtension`, and now only verify if file has extension - [#717](https://github.com/SciLifeLab/Sarek/pull/717) - `fastqFiles` renamed to `inputFiles` - [#717](https://github.com/SciLifeLab/Sarek/pull/717) - `mapping` step can now map BAM files too - [#717](https://github.com/SciLifeLab/Sarek/pull/717) - `MapReads` can now convert BAM to FASTQ and feed it to BWA on the fly - [#717](https://github.com/SciLifeLab/Sarek/pull/717), [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Update documentation -- [#719](https://github.com/SciLifeLab/Sarek/pull/719) - `snpeff` and `vep` containers are now built with conda +- [#719](https://github.com/SciLifeLab/Sarek/pull/719) - `snpeff` and `vep` containers are now built with `conda` - [#719](https://github.com/SciLifeLab/Sarek/pull/719) - `vepCacheVersion` is now defined in `conf/genomes.config` or `conf/igenomes.config` - [#722](https://github.com/SciLifeLab/Sarek/pull/722) - Add path to ASCAT `.gc` file in `igenomes.config` - [#722](https://github.com/SciLifeLab/Sarek/pull/722) - Update `Sarek-data` submodule - [#723](https://github.com/SciLifeLab/Sarek/pull/723), [#725](https://github.com/SciLifeLab/Sarek/pull/725) - Update docs -- [#724](https://github.com/SciLifeLab/Sarek/pull/724) - Improved AwsBatch configuration +- [#724](https://github.com/SciLifeLab/Sarek/pull/724) - Improved `AWS batch` configuration - [#728](https://github.com/SciLifeLab/Sarek/pull/728) - Improved usage of `targetBED` params -- [#728](https://github.com/SciLifeLab/Sarek/pull/728) - Strelka Best Practices output is now prefixed with `StrelkaBP_` +- [#728](https://github.com/SciLifeLab/Sarek/pull/728) - `Strelka` Best Practices output is now prefixed with `StrelkaBP_` - [#728](https://github.com/SciLifeLab/Sarek/pull/728) - VCFs and Annotated VCFs are now ordered by Patient, then tools - [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Merge `buildContainers.nf` and `buildReferences.nf` in `build.nf` - [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Reduce number of CPUs for `RunVEP` to `4` cf: [VEP docs](https://www.ensembl.org/info/docs/tools/vep/script/vep_other.html) -- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Update VEP from `95.1` to `95.2` +- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Update `VEP` from `95.1` to `95.2` ### `Removed` - [#715](https://github.com/SciLifeLab/Sarek/pull/715) - Remove `defReferencesFiles` function from `buildReferences.nf` - [#719](https://github.com/SciLifeLab/Sarek/pull/719) - `snpEff` base container is no longer used -- [#721](https://github.com/SciLifeLab/Sarek/pull/721) - Remove COSMIC docs +- [#721](https://github.com/SciLifeLab/Sarek/pull/721) - Remove `COSMIC` docs - [#728](https://github.com/SciLifeLab/Sarek/pull/728) - Remove `defineDirectoryMap()` -- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Removed `--database` option for VEP cf: [VEP docs](https://www.ensembl.org/info/docs/tools/vep/script/vep_other.html) +- [#732](https://github.com/SciLifeLab/Sarek/pull/732) - Remove `--database` option for VEP cf: [VEP docs](https://www.ensembl.org/info/docs/tools/vep/script/vep_other.html) ### `Fixed` -- [#720](https://github.com/SciLifeLab/Sarek/pull/720) - bamQC is now run on the recalibrated bams, and not after MarkDuplicates -- [#726](https://github.com/SciLifeLab/Sarek/pull/726) - Fix Ascat ref file input (one file can't be a set) -- [#727](https://github.com/SciLifeLab/Sarek/pull/727) - bamQC outputs are no longer overwritten (name of dir is now the file instead of sample) +- [#720](https://github.com/SciLifeLab/Sarek/pull/720) - `bamQC` is now run on the recalibrated bams, and not after `MarkDuplicates` +- [#726](https://github.com/SciLifeLab/Sarek/pull/726) - Fix `Ascat` ref file input (one file can't be a set) +- [#727](https://github.com/SciLifeLab/Sarek/pull/727) - `bamQC` outputs are no longer overwritten (name of dir is now the file instead of sample) - [#728](https://github.com/SciLifeLab/Sarek/pull/728) - Fix issue with annotation that was consuming `cache` channels - [#728](https://github.com/SciLifeLab/Sarek/pull/728) - Fix multi sample TSV file [#691](https://github.com/SciLifeLab/Sarek/issues/691) - [#733](https://github.com/SciLifeLab/Sarek/pull/733) - Fix the possibility to specify reference files on the command line @@ -255,31 +262,31 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#671](https://github.com/SciLifeLab/Sarek/pull/671) - New `publishDirMode` param and docs - [#673](https://github.com/SciLifeLab/Sarek/pull/673), [#675](https://github.com/SciLifeLab/Sarek/pull/675), [#676](https://github.com/SciLifeLab/Sarek/pull/676) - Profiles for BinAC and CFC clusters in Tübingen - [#679](https://github.com/SciLifeLab/Sarek/pull/679) - Add container for `CreateIntervalBeds` -- [#692](https://github.com/SciLifeLab/Sarek/pull/692), [#697](https://github.com/SciLifeLab/Sarek/pull/697) - Add AWS iGenomes possibilities (within `conf/igenomes.conf`) +- [#692](https://github.com/SciLifeLab/Sarek/pull/692), [#697](https://github.com/SciLifeLab/Sarek/pull/697) - Add `AWS iGenomes` possibilities (within `conf/igenomes.conf`) - [#694](https://github.com/SciLifeLab/Sarek/pull/694) - Add monochrome and grey logos for light or dark background - [#698](https://github.com/SciLifeLab/Sarek/pull/698) - Add btb profile for munin server -- [#702](https://github.com/SciLifeLab/Sarek/pull/702) - Add font-ttf-dejavu-sans-mono `2.37` and fontconfig `2.12.6` to container +- [#702](https://github.com/SciLifeLab/Sarek/pull/702) - Add `font-ttf-dejavu-sans-mono` `2.37` and `fontconfig` `2.12.6` to container ### `Changed` - [#663](https://github.com/SciLifeLab/Sarek/pull/663) - Update `do_release.sh` script -- [#671](https://github.com/SciLifeLab/Sarek/pull/671) - publishDir modes are now params +- [#671](https://github.com/SciLifeLab/Sarek/pull/671) - `publishDir` modes are now params - [#677](https://github.com/SciLifeLab/Sarek/pull/677), [#698](https://github.com/SciLifeLab/Sarek/pull/698), [#703](https://github.com/SciLifeLab/Sarek/pull/703) - Update docs -- [#678](https://github.com/SciLifeLab/Sarek/pull/678) - Changing VEP to v92 and adjusting CPUs for VEP -- [#679](https://github.com/SciLifeLab/Sarek/pull/679) - Update old awsbatch configuration -- [#682](https://github.com/SciLifeLab/Sarek/pull/682) - Specifications for memory and cpus for awsbatch -- [#693](https://github.com/SciLifeLab/Sarek/pull/693) - Qualimap bamQC is now ran after mapping and after recalibration for better QC -- [#700](https://github.com/SciLifeLab/Sarek/pull/700) - Update GATK to `4.0.9.0` -- [#702](https://github.com/SciLifeLab/Sarek/pull/702) - Update FastQC to `0.11.8` -- [#705](https://github.com/SciLifeLab/Sarek/pull/705) - Change `--TMP_DIR` by `--tmp-dir` for GATK `4.0.9.0` BaseRecalibrator -- [#706](https://github.com/SciLifeLab/Sarek/pull/706) - Update TravisCI testing +- [#678](https://github.com/SciLifeLab/Sarek/pull/678) - Changing `VEP` to `v92` and adjusting CPUs for `VEP` +- [#679](https://github.com/SciLifeLab/Sarek/pull/679) - Update old `awsbatch` configuration +- [#682](https://github.com/SciLifeLab/Sarek/pull/682) - Specifications for memory and cpus for `awsbatch` +- [#693](https://github.com/SciLifeLab/Sarek/pull/693) - `Qualimap bamQC` is now ran after mapping and after recalibration for better QC +- [#700](https://github.com/SciLifeLab/Sarek/pull/700) - Update `GATK` to `4.0.9.0` +- [#702](https://github.com/SciLifeLab/Sarek/pull/702) - Update `FastQC` to `0.11.8` +- [#705](https://github.com/SciLifeLab/Sarek/pull/705) - Change `--TMP_DIR` by `--tmp-dir` for `GATK` `4.0.9.0` `BaseRecalibrator` +- [#706](https://github.com/SciLifeLab/Sarek/pull/706) - Update `Travis CI` testing ### `Fixed` -- [#665](https://github.com/SciLifeLab/Sarek/pull/665) - Input bam file now has always the same name (whether it is from a single fastq pair or multiple) in the MarkDuplicates process, so metrics too -- [#672](https://github.com/SciLifeLab/Sarek/pull/672) - process `PullSingularityContainers` from `buildContainers.nf` now expect a file with the correct `.simg` extension for singularity images, and no longer the `.img` one. -- [#679](https://github.com/SciLifeLab/Sarek/pull/679) - Add publishDirMode for `germlineVC.nf` -- [#700](https://github.com/SciLifeLab/Sarek/pull/700) - Fix [#699](https://github.com/SciLifeLab/Sarek/issues/699) missing DP in the FORMAT column VCFs for MuTect2 +- [#665](https://github.com/SciLifeLab/Sarek/pull/665) - Input bam file now has always the same name (whether it is from a single fastq pair or multiple) in the `MarkDuplicates` process, so metrics too +- [#672](https://github.com/SciLifeLab/Sarek/pull/672) - Process `PullSingularityContainers` from `buildContainers.nf` now expect a file with the correct `.simg` extension for singularity images, and no longer the `.img` one. +- [#679](https://github.com/SciLifeLab/Sarek/pull/679) - Add `publishDirMode` for `germlineVC.nf` +- [#700](https://github.com/SciLifeLab/Sarek/pull/700) - Fix [#699](https://github.com/SciLifeLab/Sarek/issues/699) missing DP in the FORMAT column VCFs for Mutect2 - [#702](https://github.com/SciLifeLab/Sarek/pull/702) - Fix [#701](https://github.com/SciLifeLab/Sarek/issues/701) - [#705](https://github.com/SciLifeLab/Sarek/pull/705) - Fix [#704](https://github.com/SciLifeLab/Sarek/issues/704) @@ -288,16 +295,18 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Changed` - [#646](https://github.com/SciLifeLab/Sarek/pull/646) - Update [`pathfindr`](https://github.com/NBISweden/pathfindr) submodule -- [#659](https://github.com/SciLifeLab/Sarek/pull/659) - Update Nextflow to `0.32.0` +- [#659](https://github.com/SciLifeLab/Sarek/pull/659) - Update `Nextflow` to `0.32.0` - [#660](https://github.com/SciLifeLab/Sarek/pull/660) - Update docs ### `Fixed` - [#657](https://github.com/SciLifeLab/Sarek/pull/657) - Fix `RunMultiQC.nf` bug -- [#659](https://github.com/SciLifeLab/Sarek/pull/659) - Fix bugs due to updating Nextflow +- [#659](https://github.com/SciLifeLab/Sarek/pull/659) - Fix bugs due to updating `Nextflow` ## [2.2.0] - Skårki - 2018-09-21 +Skårki is one of the main massif in the Sarek National Park. + ### `Added` - [#613](https://github.com/SciLifeLab/Sarek/pull/613) - Add Issue Templates (bug report and feature request) @@ -312,23 +321,23 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Changed` -- [#608](https://github.com/SciLifeLab/Sarek/pull/608) - Update Nextflow required version +- [#608](https://github.com/SciLifeLab/Sarek/pull/608) - Update `Nextflow` required version - [#615](https://github.com/SciLifeLab/Sarek/pull/615) - Use `splitCsv` instead of `readlines` -- [#616](https://github.com/SciLifeLab/Sarek/pull/616) - Update CHANGELOG +- [#616](https://github.com/SciLifeLab/Sarek/pull/616) - Update `CHANGELOG` - [#621](https://github.com/SciLifeLab/Sarek/pull/621), [#638](https://github.com/SciLifeLab/Sarek/pull/638) - Improve install script - [#621](https://github.com/SciLifeLab/Sarek/pull/621), [#638](https://github.com/SciLifeLab/Sarek/pull/638) - Simplify tests - [#627](https://github.com/SciLifeLab/Sarek/pull/627), [#629](https://github.com/SciLifeLab/Sarek/pull/629), [#637](https://github.com/SciLifeLab/Sarek/pull/637) - Refactor docs - [#629](https://github.com/SciLifeLab/Sarek/pull/629) - Refactor config -- [#632](https://github.com/SciLifeLab/Sarek/pull/632) - Use 2 threads and 2 cpus FastQC processes +- [#632](https://github.com/SciLifeLab/Sarek/pull/632) - Use 2 threads and 2 cpus `FastQC` processes - [#637](https://github.com/SciLifeLab/Sarek/pull/637) - Update tool version gathering - [#638](https://github.com/SciLifeLab/Sarek/pull/638) - Use correct `.simg` extension for Singularity images - [#639](https://github.com/SciLifeLab/Sarek/pull/639) - Smaller refactoring of the docs - [#640](https://github.com/SciLifeLab/Sarek/pull/640) - Update RELEASE_CHECKLIST -- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - MultiQC 1.5 -> 1.6 -- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - Qualimap 2.2.2a -> 2.2.2b -- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - Update conda channel order priorities -- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - VCFanno 0.2.8 -> 0.3.0 -- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - VCFtools 0.1.15 -> 0.1.16 +- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - `MultiQC` 1.5 -> 1.6 +- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - `Qualimap` 2.2.2a -> 2.2.2b +- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - Update `conda` channel order priorities +- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - `VCFanno` 0.2.8 -> 0.3.0 +- [#642](https://github.com/SciLifeLab/Sarek/pull/642) - `VCFtools` 0.1.15 -> 0.1.16 ### `Removed` @@ -338,34 +347,36 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Fixed` -- [#621](https://github.com/SciLifeLab/Sarek/pull/621) - Fix VEP tests +- [#621](https://github.com/SciLifeLab/Sarek/pull/621) - Fix `VEP` tests - [#637](https://github.com/SciLifeLab/Sarek/pull/637) - Fix links in MD files ## [2.1.0] - Ruotes - 2018-08-14 +Ruotes is one of the main massif in the Sarek National Park. + ### `Added` - [#555](https://github.com/SciLifeLab/Sarek/pull/555) - `snpEff` output into `VEP` - [#556](https://github.com/SciLifeLab/Sarek/pull/556) - `Strelka` Best Practices - [#563](https://github.com/SciLifeLab/Sarek/pull/563) - Use `SnpEFF` reports in `MultiQC` - [#568](https://github.com/SciLifeLab/Sarek/pull/568) - `VCFTools` process `RunVcftools` for QC -- [#574](https://github.com/SciLifeLab/Sarek/pull/574), [#580](https://github.com/SciLifeLab/Sarek/pull/580) - Abstracts for NPMI, JOBIM and EACR25 +- [#574](https://github.com/SciLifeLab/Sarek/pull/574), [#580](https://github.com/SciLifeLab/Sarek/pull/580) - Abstracts for `NPMI`, `JOBIM` and `EACR25` - [#577](https://github.com/SciLifeLab/Sarek/pull/577) - New repository for testing: [Sarek-data](https://github.com/SciLifeLab/Sarek-data) - [#595](https://github.com/SciLifeLab/Sarek/pull/595) - New library `QC` for functions `bamQC`, `bcftools`, `samtoolsStats`, `vcftools`, `getVersionBCFtools`, `getVersionGATK`, `getVersionManta`, `getVersionSnpEFF`, `getVersionStrelka`, `getVersionVCFtools`, `getVersionVEP` - [#595](https://github.com/SciLifeLab/Sarek/pull/595) - New Processes `GetVersionBCFtools`, `GetVersionGATK`, `GetVersionManta`, `GetVersionSnpEFF`, `GetVersionStrelka`, `GetVersionVCFtools`, `GetVersionVEP` -- [#595](https://github.com/SciLifeLab/Sarek/pull/595) - new Python script `bin/scrape_tool_versions.py` inspired by @ewels and @apeltzer +- [#595](https://github.com/SciLifeLab/Sarek/pull/595) - New `Python` script `bin/scrape_tool_versions.py` inspired by @ewels and @apeltzer - [#595](https://github.com/SciLifeLab/Sarek/pull/595) - New QC Process `RunVcftools` -- [#596](https://github.com/SciLifeLab/Sarek/pull/596) - New profile for BinAC cluster +- [#596](https://github.com/SciLifeLab/Sarek/pull/596) - New profile for `BinAC` cluster - [#597](https://github.com/SciLifeLab/Sarek/pull/597) - New function `sarek_ascii()` in `SarekUtils` - [#599](https://github.com/SciLifeLab/Sarek/pull/599), [#602](https://github.com/SciLifeLab/Sarek/pull/602) - New Process `CompressVCF` -- [#601](https://github.com/SciLifeLab/Sarek/pull/601), [#603](https://github.com/SciLifeLab/Sarek/pull/603) - Container for GATK4 +- [#601](https://github.com/SciLifeLab/Sarek/pull/601), [#603](https://github.com/SciLifeLab/Sarek/pull/603) - Container for `GATK4` - [#606](https://github.com/SciLifeLab/Sarek/pull/606) - Add test data as a submodule from [`Sarek-data`](https://github.com/SciLifeLab/Sarek-data) - [#608](https://github.com/SciLifeLab/Sarek/pull/608) - Add documentation on how to install Nextflow on `bianca` ### `Changed` - [#557](https://github.com/SciLifeLab/Sarek/pull/557), [#583](https://github.com/SciLifeLab/Sarek/pull/583), [#585](https://github.com/SciLifeLab/Sarek/pull/585), [#588](https://github.com/SciLifeLab/Sarek/pull/588) - Update help -- [#560](https://github.com/SciLifeLab/Sarek/pull/560) - GitHub langage for the repository is now `Nextflow` +- [#560](https://github.com/SciLifeLab/Sarek/pull/560) - `GitHub` langage for the repository is now `Nextflow` - [#561](https://github.com/SciLifeLab/Sarek/pull/561) - `do_all.sh` build only containers for one genome reference (default `GRCh38`) only - [#571](https://github.com/SciLifeLab/Sarek/pull/571) - Only one container for all QC tools - [#582](https://github.com/SciLifeLab/Sarek/pull/582), [#587](https://github.com/SciLifeLab/Sarek/pull/587) - Update figures @@ -378,10 +389,10 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#599](https://github.com/SciLifeLab/Sarek/pull/599) - Merge is tested with `ANNOTATEALL` - [#604](https://github.com/SciLifeLab/Sarek/pull/604) - Synching `GRCh38` `wgs_calling_regions` bedfiles - [#607](https://github.com/SciLifeLab/Sarek/pull/607) - One container approach -- [#607](https://github.com/SciLifeLab/Sarek/pull/607) - Update to GATK4 -- [#608](https://github.com/SciLifeLab/Sarek/pull/608) - Update Nextflow required version -- [#616](https://github.com/SciLifeLab/Sarek/pull/616) - Update CHANGELOG -- [#617](https://github.com/SciLifeLab/Sarek/pull/617) - Replace deprecated $name syntax with withName +- [#607](https://github.com/SciLifeLab/Sarek/pull/607) - Update to `GATK4` +- [#608](https://github.com/SciLifeLab/Sarek/pull/608) - Update `Nextflow` required version +- [#616](https://github.com/SciLifeLab/Sarek/pull/616) - Update `CHANGELOG` +- [#617](https://github.com/SciLifeLab/Sarek/pull/617) - Replace deprecated `Nextflow ``$name` syntax with `withName` ### `Fixed` @@ -389,24 +400,26 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - [#566](https://github.com/SciLifeLab/Sarek/pull/566) - `slurmDownload` profile - [#579](https://github.com/SciLifeLab/Sarek/pull/579), [#584](https://github.com/SciLifeLab/Sarek/pull/584) - `Manta` output reorganized after modification for `Strelka Best Practices` process - [#585](https://github.com/SciLifeLab/Sarek/pull/583) - Trace file is plain txt -- [#590](https://github.com/SciLifeLab/Sarek/pull/590), [#593](https://github.com/SciLifeLab/Sarek/pull/593) - Fix Singularity installation in Travis CI testing -- [#598](https://github.com/SciLifeLab/Sarek/pull/598), [#601](https://github.com/SciLifeLab/Sarek/pull/601) - Fixes for Python script `selectROI.py` to work with CLC viewer +- [#590](https://github.com/SciLifeLab/Sarek/pull/590), [#593](https://github.com/SciLifeLab/Sarek/pull/593) - Fix `Singularity` installation in `Travis CI` testing +- [#598](https://github.com/SciLifeLab/Sarek/pull/598), [#601](https://github.com/SciLifeLab/Sarek/pull/601) - Fixes for `Python` script `selectROI.py` to work with `CLC` viewer ### `Removed` -- [#607](https://github.com/SciLifeLab/Sarek/pull/607) - Remove Mutect1 +- [#607](https://github.com/SciLifeLab/Sarek/pull/607) - Remove `Mutect1` ## [2.0.0] - 2018-03-23 +First release under the `Sarek` name, from the National Park in Northern Sweden + ### `Added` -- basic wrapper script +- Basic wrapper script - Abstract, posters and figures -- ROI selector and FreeBayes sanitizer scripts +- ROI selector and `FreeBayes` sanitizer scripts - New logo and icon for the project -- check for existing tumor/normal channel +- Check for existing tumor/normal channel - `SarekUtils` with `checkParams()`, `checkParameterList()`, `checkParameterExistence()` and `isAllowedParams()` functions -- some `runOptions` for `docker` (prevent some user right problem) +- Some `runOptions` for `docker` (prevent some user right problem) - This `CHANGELOG` ### `Changed` @@ -415,22 +428,22 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - Dissect Workflow in 5 new scripts: `annotate.nf`, `main.nf`, `germlineVC.nf`, `runMultiQC.nf` and `somaticVC.nf` - `report.html`, `timeline.html` and `trace.html` are generated in `Reports/` - `--version` is now used to define the workflow version -- most params are now defined in the base.config file instead of in the scripts -- update RELEASE_CHECKLIST.md +- Most params are now defined in the `base.config` file instead of in the scripts +- Update `RELEASE_CHECKLIST.md` - `checkParams()`, `checkParameterList()`, `checkParameterExistence()` and `isAllowedParams()` in script functions are now called within `SarekUtils` - `nf_required_version` is now `params.nfRequiredVersion` -- in `buildReferences.nf` script, channels now begin by `ch_`, and files by `f_` -- use `PublishDir mode: 'link'` instead of `copy` +- In `buildReferences.nf` script, channels now begin by `ch_`, and files by `f_` +- Use `PublishDir mode: 'link'` instead of `copy` - `directoryMap` now contains `params.outDir` -- [#539](https://github.com/SciLifeLab/Sarek/issues/539) - use Nextflow support of scratch -- reordered Travis CI tests -- update documentation +- [#539](https://github.com/SciLifeLab/Sarek/issues/539) - Use Nextflow support of scratch +- Reordered `Travis CI` tests +- Update documentation - `MultiQC` version in container from v`1.4` to v`1.5` - `vepgrch37` container base image from `release_90.6` to `release_92` - `vepgrch38` container base image from `release_90.6` to `release_92` - `VEP` version in containers from v`90` to v`91` - `nucleotidesPerSecond` is now `params.nucleotidesPerSecond` -- default `params.tag` is now `latest` instead of current version, so --tag needs to be specified with the right version to be sure of using the `containers` corresponding +- Default `params.tag` is now `latest` instead of current version, so `--tag` needs to be specified with the right version to be sure of using the `containers` corresponding ### `Deprecated` @@ -440,22 +453,22 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Removed` - `scripts/skeleton_batch.sh` -- old data and tsv files -- UPPMAX directories from containers +- Old data and tsv files +- `UPPMAX` directories from containers - `--step` in `annotate.nf`, `germlineVC.nf` and `somatic.nf` -- some `runOptions` for Singularity (binding not needed anymore on UPPMAX) +- Some `runOptions` for `Singularity` (binding not needed anymore on `UPPMAX`) - `download` profile ### `Fixed` -- [#530](https://github.com/SciLifeLab/Sarek/issues/530) - use `$PWD` for default `outDir` +- [#530](https://github.com/SciLifeLab/Sarek/issues/530) - Use `$PWD` for default `outDir` - [#533](https://github.com/SciLifeLab/Sarek/issues/533) - Replace `VEP` `--pick` option by `--per_gene` ## [1.2.5] - 2018-01-18 ### `Added` -- Zenodo for DOI +- `Zenodo` for DOI - Delivery README - Document use of the `--sampleDir` option - Contributing Guidelines @@ -464,22 +477,22 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) - `--outDir` - `awsbatch` profile - `aws-batch.config` config file -- `--noBAMQC` params (failing sometimes on Bianca) +- `--noBAMQC` params (failing sometimes on `Bianca`) ### `Changed` -- Update `Nextflow` to `0.26.0` (new fancy report + AWS Batch) -- Extra time on Travis CI testing +- Update `Nextflow` to `0.26.0` (new fancy report + `AWS Batch`) +- Extra time on `Travis CI` testing - Replace `bundleDir` by `params.genome_base` -- Update `MultiQC` to `1.3` (MEGAQC FTW) +- Update `MultiQC` to `1.3` (`MEGAQC` FTW) - Move and rename some test files ### `Fixed` -- Version of COSMIC GRCh37 v83 +- Version of `COSMIC` `GRCh37` `v83` - Write an error message when `--sampleDir` does not find any FASTQ files -- `base.config` for ConcatVCF process -- File specification for recalibrationReport in RecalibrateBam process (got error on AWS Batch) +- `base.config` for `ConcatVCF` process +- File specification for `recalibrationReport` in `RecalibrateBam` process (got error on `AWS Batch`) ## [1.2.4] - 2017-10-27 @@ -493,7 +506,7 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Fixed` -- [#357](https://github.com/SciLifeLab/Sarek/issues/357) - `ASCAT` works for GRCh38 +- [#357](https://github.com/SciLifeLab/Sarek/issues/357) - `ASCAT` works for `GRCh38` - [#471](https://github.com/SciLifeLab/Sarek/issues/471) - Running `Singularity` on `/scratch` - [#475](https://github.com/SciLifeLab/Sarek/issues/475) - 16 cpus for local executor - [#480](https://github.com/SciLifeLab/Sarek/issues/480) - No `tsv` file needed for step `annotate` @@ -519,7 +532,7 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Fixed` - [#471](https://github.com/SciLifeLab/Sarek/issues/471) - Running `Singularity` on /scratch -- [#472](https://github.com/SciLifeLab/Sarek/issues/472) - Update function to check Nextflow version +- [#472](https://github.com/SciLifeLab/Sarek/issues/472) - Update function to check `Nextflow` version - [#473](https://github.com/SciLifeLab/Sarek/issues/473) - Remove `returnMin()` function ## [1.2.0] - 2017-10-02 @@ -532,14 +545,14 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Added` -- Singularity possibilities +- `Singularity` possibilities ### `Changed` - Reports made by default - Intervals file can be a bed file -- Normal sample preprocessing + HaplotypeCaller is possible -- Better Travis CI tests +- Normal sample preprocessing + `HaplotypeCaller` is possible +- Better `Travis CI` tests ### `Fixed` @@ -549,7 +562,7 @@ Initial release of `nf-core/sarek`, created with the [nf-core](http://nf-co.re/) ### `Added` -- Docker possibilities +- `Docker` possibilities ## [0.9] - 2016-11-16 diff --git a/README.md b/README.md index d689576f19..addec50a11 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,24 @@ -# [![Sarek](docs/images/nf-core_sarek_logo.png "Sarek")](https://sarek.scilifelab.se/) +# [![Sarek](docs/images/nf-core_sarek_logo.png "Sarek")](https://nf-co.re/sarek) > **An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing** -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.04.0-brightgreen.svg)](https://www.nextflow.io/) -[![nf-core](https://img.shields.io/badge/nf--core-pipeline-brightgreen.svg)](https://nf-co.re/) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.04.0-brightgreen)](https://www.nextflow.io/) +[![nf-core](https://img.shields.io/badge/nf--core-pipeline-brightgreen)](https://nf-co.re/) [![DOI](https://zenodo.org/badge/184289291.svg)](https://zenodo.org/badge/latestdoi/184289291) -[![Travis build status](https://img.shields.io/travis/nf-core/sarek.svg)](https://travis-ci.com/nf-core/sarek/) -[![CircleCi build status](https://img.shields.io/circleci/project/github/nf-core/sarek.svg)](https://circleci.com/gh/nf-core/sarek/) +[![GitHub Actions CI status](https://github.com/nf-core/sarek/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+CI%22) +[![GitHub Actions extra-CI status](https://github.com/nf-core/sarek/workflows/nf-core%20extra%20CI/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+extra+CI%22) +[![GitHub Actions Linting status](https://github.com/nf-core/sarek/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+linting%22) +[![CircleCi build status](https://img.shields.io/circleci/project/github/nf-core/sarek?logo=circleci)](https://circleci.com/gh/nf-core/sarek/) -[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) -[![Docker Container available](https://img.shields.io/docker/automated/nfcore/sarek.svg)](https://hub.docker.com/r/nfcore/sarek/) -[![Install with Singularity](https://img.shields.io/badge/use%20with-singularity-purple.svg)](https://www.sylabs.io/docs/) +[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen)](http://bioconda.github.io/) +[![Docker Container available](https://img.shields.io/docker/automated/nfcore/sarek)](https://hub.docker.com/r/nfcore/sarek/) +[![Install with Singularity](https://img.shields.io/badge/use%20with-singularity-purple)](https://www.sylabs.io/docs/) -[![Join us on Slack](https://img.shields.io/badge/slack-nfcore/sarek-blue.svg)](https://nfcore.slack.com/messages/CGFUX04HZ/) +[![Join us on Slack](https://img.shields.io/badge/slack-nfcore/sarek-blue)](https://nfcore.slack.com/channels/sarek) ## Introduction - - -Previously known as the Cancer Analysis Workflow (CAW), Sarek is a workflow designed to run analyses on whole genome or targeted sequencing data from regular samples or tumour / normal pairs and could include additional relapses. It's built using [Nextflow](https://www.nextflow.io), From e7d4428d68d50efea2a03ca0987f3c61d1a6168f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 28 Nov 2019 17:28:48 +0100 Subject: [PATCH 126/179] remove Freebayes --- bin/scrape_software_versions.py | 2 -- docs/containers.md | 1 - docs/output.md | 14 --------- docs/usage.md | 9 +++--- environment.yml | 1 - main.nf | 52 +++++---------------------------- scripts/run_tests.sh | 4 +-- 7 files changed, 14 insertions(+), 69 deletions(-) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index 617740e595..d85700a0e2 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -9,7 +9,6 @@ 'bcftools': ['v_bcftools.txt', r"bcftools (\S+)"], 'BWA': ['v_bwa.txt', r"Version: (\S+)"], 'FastQC': ['v_fastqc.txt', r"FastQC v(\S+)"], - 'FreeBayes': ['v_freebayes.txt', r"version: v(\d\.\d\.\d+)"], 'GATK': ['v_gatk.txt', r"Version:(\S+)"], 'htslib': ['v_samtools.txt', r"htslib (\S+)"], 'Manta': ['v_manta.txt', r"([0-9.]+)"], @@ -33,7 +32,6 @@ results['bcftools'] = 'N/A' results['BWA'] = 'N/A' results['FastQC'] = 'N/A' -results['FreeBayes'] = 'N/A' results['GATK'] = 'N/A' results['htslib'] = 'N/A' results['Manta'] = 'N/A' diff --git a/docs/containers.md b/docs/containers.md index b75d74db9a..d8a51fb637 100644 --- a/docs/containers.md +++ b/docs/containers.md @@ -20,7 +20,6 @@ For annotation, the main container can be used, but the cache has to be download - Contain **[BWA](https://github.com/lh3/bwa)** 0.7.17 - Contain **[Control-FREEC](https://github.com/BoevaLab/FREEC)** 11.5 - Contain **[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/)** 0.11.8 -- Contain **[FreeBayes](https://github.com/ekg/freebayes)** 1.3.1 - Contain **[GATK4](https://github.com/broadinstitute/gatk)** 4.1.4.0 - Contain **[GeneSplicer](https://ccb.jhu.edu/software/genesplicer/)** 1.0 - Contain **[HTSlib](https://github.com/samtools/htslib)** 1.9 diff --git a/docs/output.md b/docs/output.md index 58f9af63a2..1f14fdf857 100644 --- a/docs/output.md +++ b/docs/output.md @@ -17,7 +17,6 @@ The pipeline processes data using the following steps: * `GATK ApplyBQSR` 2. [**Variant calling**](#Variant-Calling) * SNVs and small indels - * [`FreeBayes`](#FreeBayes) * [`GATK HaplotypeCaller`](#HaplotypeCaller) * [`GATK GenotypeGVCFs`](#GenotypeGVCFs) * [`GATK Mutect2`](#Mutect2) @@ -100,18 +99,6 @@ All the results regarding variant-calling are collected in this directory. Recalibrated BAM files can also be used as an input to start the Variant Calling, for more information see [TSV files output information](#TSV-files) -### FreeBayes - -[FreeBayes](https://github.com/ekg/freebayes) is a Bayesian genetic variant detector designed to find small polymorphisms, specifically SNPs, indels, MNPs, and complex events smaller than the length of a short-read sequencing alignment.. - -For further reading and documentation see the [FreeBayes manual](https://github.com/ekg/freebayes/blob/master/README.md#user-manual-and-guide). - -For a Tumor/Normal pair only: -**Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/FreeBayes`** - -* `FreeBayes_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `FreeBayes_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` - * VCF with Tabix index - ### HaplotypeCaller [GATK HaplotypeCaller](https://github.com/broadinstitute/gatk) calls germline SNPs and indels via local re-assembly of haplotypes. @@ -331,7 +318,6 @@ For a Tumor/Normal pair only: This directory contains results from the final annotation steps: two software are used for annotation, [snpEff](http://snpeff.sourceforge.net/) and [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html). Only a subset of the VCF files are annotated, and only variants that have a PASS filter. -FreeBayes results are not annotated in the moment yet as we are lacking a decent somatic filter. For HaplotypeCaller the germline variations are annotated for both the tumor and the normal sample. ### snpEff diff --git a/docs/usage.md b/docs/usage.md index ef4346006d..4ddc0ba79b 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -106,8 +106,9 @@ results # Finished results (configurable, see below) ``` The nf-core/sarek pipeline comes with more documentation about running the pipeline, found in the `docs/` directory: - * [Extra Documentation on variant calling](docs/variantcalling.md) - * [Extra Documentation on annotation](docs/annotation.md) + +* [Output and how to interpret the results](output.md) +* [Extra Documentation on annotation](annotation.md) ### Updating the pipeline @@ -268,7 +269,7 @@ Available: `mapping`, `recalibrate`, `variantcalling` and `annotate` ### `--tools` Use this to specify the tools to run: -Available: `ASCAT`, `ControlFREEC`, `FreeBayes`, `HaplotypeCaller`, `Manta`, `mpileup`, `MuTect2`, `Strelka`, `TIDDIT` +Available: `ASCAT`, `ControlFREEC`, `HaplotypeCaller`, `Manta`, `mpileup`, `Mutect2`, `Strelka`, `TIDDIT` ### `--noStrelkaBP` @@ -280,7 +281,7 @@ Use this to specify the target BED file for targeted or whole exome sequencing. ## Reference genomes -The pipeline config files come bundled with paths to the illumina iGenomes reference index files. +The pipeline config files come bundled with paths to the Illumina iGenomes reference index files. If running with docker or AWS, the configuration is set up to use the [AWS-iGenomes](https://ewels.github.io/AWS-iGenomes/) resource. ### `--genome` (using iGenomes) diff --git a/environment.yml b/environment.yml index 56e57e8f0a..bcaea91970 100644 --- a/environment.yml +++ b/environment.yml @@ -13,7 +13,6 @@ dependencies: - control-freec=11.5 - ensembl-vep=98.2 - fastqc=0.11.8 - - freebayes=1.3.1 - gatk4=4.1.4.0 - genesplicer=1.0 - htslib=1.9 diff --git a/main.nf b/main.nf index 052b7fb26b..fef6238812 100644 --- a/main.nf +++ b/main.nf @@ -50,7 +50,7 @@ def helpMessage() { Available: Mapping, Recalibrate, VariantCalling, Annotate Default: Mapping --tools Specify tools to use for variant calling: - Available: ASCAT, ControlFREEC, FreeBayes, HaplotypeCaller + Available: ASCAT, ControlFREEC, HaplotypeCaller Manta, mpileup, Mutect2, Strelka, TIDDIT and/or for annotation: snpEff, VEP, merge @@ -348,7 +348,6 @@ process GetSoftwareVersions { echo "${workflow.nextflow.version}" &> v_nextflow.txt 2>&1 || true echo "SNPEFF version"\$(snpEff -h 2>&1) > v_snpeff.txt fastqc --version > v_fastqc.txt 2>&1 || true - freebayes --version > v_freebayes.txt 2>&1 || true gatk ApplyBQSR --help 2>&1 | grep Version: > v_gatk.txt 2>&1 || true multiqc --version &> v_multiqc.txt 2>&1 || true qualimap --version &> v_qualimap.txt 2>&1 || true @@ -1277,44 +1276,8 @@ intervalPairBam = pairBam.spread(bedIntervals) bamMpileup = bamMpileup.spread(intMpileup) -// intervals for Mutect2 calls, FreeBayes and pileups for Mutect2 filtering -(pairBamMutect2, pairBamFreeBayes, pairBamPileupSummaries) = intervalPairBam.into(3) - -// STEP FREEBAYES - -process FreeBayes { - tag {idSampleTumor + "_vs_" + idSampleNormal + "-" + intervalBed.baseName} - label 'cpus_1' - - input: - set idPatient, idSampleNormal, file(bamNormal), file(baiNormal), idSampleTumor, file(bamTumor), file(baiTumor), file(intervalBed) from pairBamFreeBayes - file(fasta) from ch_fasta - file(fastaFai) from ch_fastaFai - - output: - set val("FreeBayes"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("${intervalBed.baseName}_${idSampleTumor}_vs_${idSampleNormal}.vcf") into vcfFreeBayes - - when: 'freebayes' in tools - - script: - """ - freebayes \ - -f ${fasta} \ - --pooled-continuous \ - --pooled-discrete \ - --genotype-qualities \ - --report-genotype-likelihood-max \ - --allele-balance-priors-off \ - --min-alternate-fraction 0.03 \ - --min-repeat-entropy 1 \ - --min-alternate-count 2 \ - -t ${intervalBed} \ - ${bamTumor} \ - ${bamNormal} > ${intervalBed.baseName}_${idSampleTumor}_vs_${idSampleNormal}.vcf - """ -} - -vcfFreeBayes = vcfFreeBayes.groupTuple(by:[0,1,2]) +// intervals for Mutect2 calls and pileups for Mutect2 filtering +(pairBamMutect2, pairBamPileupSummaries) = intervalPairBam.into(2) // STEP GATK MUTECT2.1 - RAW CALLS @@ -1403,9 +1366,9 @@ process MergeMutect2Stats { // we are merging the VCFs that are called separatelly for different intervals // so we can have a single sorted VCF containing all the calls for a given caller -// STEP MERGING VCF - FREEBAYES, GATK HAPLOTYPECALLER & GATK MUTECT2 (UNFILTERED) +// STEP MERGING VCF - GATK HAPLOTYPECALLER & GATK MUTECT2 (UNFILTERED) -vcfConcatenateVCFs = mutect2Output.mix( vcfFreeBayes, vcfGenotypeGVCFs, gvcfHaplotypeCaller) +vcfConcatenateVCFs = mutect2Output.mix(vcfGenotypeGVCFs, gvcfHaplotypeCaller) vcfConcatenateVCFs = vcfConcatenateVCFs.dump(tag:'VCF to merge') process ConcatVCF { @@ -1424,7 +1387,7 @@ process ConcatVCF { // we have this funny *_* pattern to avoid copying the raw calls to publishdir set variantCaller, idPatient, idSample, file("*_*.vcf.gz"), file("*_*.vcf.gz.tbi") into vcfConcatenated - when: ('haplotypecaller' in tools || 'mutect2' in tools || 'freebayes' in tools) + when: ('haplotypecaller' in tools || 'mutect2' in tools) script: if (variantCaller == 'HaplotypeCallerGVCF') @@ -2120,7 +2083,7 @@ if (step == 'annotate') { if (tsvPath == []) { // Sarek, by default, annotates all available vcfs that it can find in the VariantCalling directory - // Excluding vcfs from FreeBayes, and g.vcf from HaplotypeCaller + // Excluding g.vcf from HaplotypeCaller // Basically it's: VariantCalling/*/{HaplotypeCaller,Manta,Mutect2,Strelka,TIDDIT}/*.vcf.gz // Without *SmallIndels.vcf.gz from Manta, and *.genome.vcf.gz from Strelka // The small snippet `vcf.minus(vcf.fileName)[-2]` catches idSample @@ -2662,7 +2625,6 @@ def defineToolList() { return [ 'ascat', 'controlfreec', - 'freebayes', 'haplotypecaller', 'manta', 'merge', diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index cb6db88901..4892df61f8 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -84,7 +84,7 @@ else SUFFIX="" fi -OPTIONS="--tools FreeBayes,HaplotypeCaller,Manta,Mutect2,Strelka,TIDDIT" +OPTIONS="--tools HaplotypeCaller,Manta,Mutect2,Strelka,TIDDIT" if [[ $TEST == "GERMLINE" ]] && [[ $OFFLINE == false ]] then @@ -117,7 +117,7 @@ case $TEST in run_sarek --tools HaplotypeCaller --input results/Preprocessing/TSV/recalibrated.tsv --step variantCalling ;; MULTIPLE) - run_sarek --tools FreeBayes,HaplotypeCaller,Manta,Strelka,TIDDIT,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv + run_sarek --tools HaplotypeCaller,Manta,Strelka,TIDDIT,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv ;; SOMATIC) run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv From a48c35ee74cbd8afa0945f2758b8335fe98d66b6 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 28 Nov 2019 17:32:51 +0100 Subject: [PATCH 127/179] update workflow image --- docs/images/sarek_workflow.png | Bin 50856 -> 47599 bytes docs/images/sarek_workflow.svg | 16 ++++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/images/sarek_workflow.png b/docs/images/sarek_workflow.png index f7f019de0cd8cec8f39e17cfdc182eefb16a9160..3d7253ee44af0ebaff1486b35b3b90e6abbb58a8 100644 GIT binary patch literal 47599 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 literal 50856 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 @@ -2787,6 +2788,7 @@ + Preprocessing + • Freebayes, Mutect2 Strelka2• Mutect2, Strelka2• MantaAnnotation + Reports + 2.52.6 Date: Thu, 28 Nov 2019 17:33:09 +0100 Subject: [PATCH 128/179] remove old logo --- docs/images/CAW_logo.png | Bin 9692 -> 0 bytes docs/images/CAW_logo.svg | 649 --------------------------------------- 2 files changed, 649 deletions(-) delete mode 100644 docs/images/CAW_logo.png delete mode 100644 docs/images/CAW_logo.svg diff --git a/docs/images/CAW_logo.png b/docs/images/CAW_logo.png deleted file mode 100644 index 285d7274089e79ade109491e7103fad4758d204e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9692 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 rHPwD=?T>lm=HdSZd3Vtt diff --git a/docs/images/CAW_logo.svg b/docs/images/CAW_logo.svg deleted file mode 100644 index 9b25dec5f6..0000000000 --- a/docs/images/CAW_logo.svg +++ /dev/null @@ -1,649 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From b6942fd1084a5b3d0392316fc7e4b8d2b157d99a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 29 Nov 2019 10:41:32 +0100 Subject: [PATCH 129/179] fix tests --- main.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 973418cb02..50dff290a4 100644 --- a/main.nf +++ b/main.nf @@ -585,7 +585,10 @@ bedIntervals = bedIntervals.dump(tag:'bedintervals') inputPairReads = Channel.create() inputBam = Channel.create() -inputSample.choice(inputPairReads, inputBam) {hasExtension(it[3], "bam") ? 1 : 0} +if (step in ['recalibrate', 'variantcalling']) { + inputBam.close() + inputPairReads.close() +} else inputSample.choice(inputPairReads, inputBam) {hasExtension(it[3], "bam") ? 1 : 0} (inputBam, inputBamFastQC) = inputBam.into(2) From 503c1023a8290f65437f4b7b6b35700e30ae4156 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 29 Nov 2019 11:04:05 +0100 Subject: [PATCH 130/179] add docs about params split_fastq --- docs/usage.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/usage.md b/docs/usage.md index ef4346006d..7317872e10 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -12,6 +12,7 @@ * [Main arguments](#main-arguments) * [`-profile`](#-profile) * [`--input`](#--input) + * [`--split_fastq`](#--split_fastq) * [`--sample`](#--sample) * [`--sampleDir`](#--sampledir) * [`--annotateVCF`](#--annotatevcf) @@ -182,6 +183,15 @@ For example: Multiple VCF files can be specified if the path must be enclosed in quotes +### `--split_fastq` + +Use the Nextflow [`splitFastq`](https://www.nextflow.io/docs/latest/operator.html#splitfastq) operator to specify how many reads should be contained in the split fastq file. +For example: + +```bash +--split_fastq 10000 +``` + ### `--sample` > :warning: This params is deprecated -- it will be removed in a future release. From 7176fa58adb82f53ba94974aca8ceab0d5e1ee45 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 29 Nov 2019 11:27:51 +0100 Subject: [PATCH 131/179] update CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7238d184b1..6e2b55345b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#46](https://github.com/nf-core/sarek/pull/46) - Add location to abstacts - [#52](https://github.com/nf-core/sarek/pull/52) - Add support for mouse data `GRCm38` +- [#61](https://github.com/nf-core/sarek/pull/61) - Add params `split_fastq` +- [#61](https://github.com/nf-core/sarek/pull/61) - Add test `SPLITFASTQ` ### `Changed` From d0ff5761e45ca77b0a9f5f3b496e2361e1403e3d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 2 Dec 2019 10:28:47 +0100 Subject: [PATCH 132/179] improve docs --- .github/CONTRIBUTING.md | 8 ++++++-- .github/ISSUE_TEMPLATE/bug_report.md | 16 ++++++++-------- README.md | 12 ++++++------ docs/annotation.md | 3 ++- docs/input.md | 2 ++ 5 files changed, 24 insertions(+), 17 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 8c8447976d..36fed625b8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -46,8 +46,12 @@ These tests are run both with the latest available version of `Nextflow` and als ## Patch -When patching a release, please work on your fork on a new branch named `patch` +: warning: Only in the unlikely and regretful event of a release happening with a bug. + +* On your own fork, make a new branch `patch` based on `upstream/master`. +* Fix the bug, and bump version (X.Y.Z+1). +* A PR should be made on `master` from patch to directly this particular bug. ## Getting help -For further information/help, please consult the [nf-core/sarek documentation](https://github.com/nf-core/sarek#documentation) and don't hesitate to get in touch on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). +For further information/help, please consult the [nf-core/sarek documentation](https://nf-co.re/sarek/docs) and don't hesitate to get in touch on the nf-core Slack [#sarek](https://nfcore.slack.com/channels/sarek) channel ([join our Slack here](https://nf-co.re/join/slack)). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 5e62bedd66..c6643b83ab 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -22,20 +22,20 @@ A clear and concise description of what you expected to happen. ## System -- Hardware: [e.g. HPC, Desktop, Cloud...] -- Executor: [e.g. slurm, local, awsbatch...] -- OS: [e.g. CentOS Linux, macOS, Linux Mint...] -- Version [e.g. 7, 10.13.6, 18.3...] +- Hardware: +- Executor: +- OS: +- Version ## Nextflow Installation -- Version: [e.g. 0.31.0] +- Version: ## Container engine -- Engine: [e.g. Conda, Docker or Singularity] -- version: [e.g. 1.0.0] -- Image tag: [e.g. nfcore/sarek:2.5.1] +- Engine: +- version: +- Image tag: ## Additional context diff --git a/README.md b/README.md index addec50a11..6c9101cbc3 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ > **An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing** -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.04.0-brightgreen)](https://www.nextflow.io/) -[![nf-core](https://img.shields.io/badge/nf--core-pipeline-brightgreen)](https://nf-co.re/) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.04.0-brightgreen.svg)](https://www.nextflow.io/) +[![nf-core](https://img.shields.io/badge/nf--core-pipeline-brightgreen.svg)](https://nf-co.re/) [![DOI](https://zenodo.org/badge/184289291.svg)](https://zenodo.org/badge/latestdoi/184289291) [![GitHub Actions CI status](https://github.com/nf-core/sarek/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+CI%22) @@ -11,11 +11,11 @@ [![GitHub Actions Linting status](https://github.com/nf-core/sarek/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+linting%22) [![CircleCi build status](https://img.shields.io/circleci/project/github/nf-core/sarek?logo=circleci)](https://circleci.com/gh/nf-core/sarek/) -[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen)](http://bioconda.github.io/) -[![Docker Container available](https://img.shields.io/docker/automated/nfcore/sarek)](https://hub.docker.com/r/nfcore/sarek/) -[![Install with Singularity](https://img.shields.io/badge/use%20with-singularity-purple)](https://www.sylabs.io/docs/) +[![install with bioconda](https://img.shields.io/badge/install%20with-bioconda-brightgreen.svg)](http://bioconda.github.io/) +[![Docker Container available](https://img.shields.io/docker/automated/nfcore/sarek.svg)](https://hub.docker.com/r/nfcore/sarek/) +[![Install with Singularity](https://img.shields.io/badge/use%20with-singularity-purple.svg)](https://www.sylabs.io/docs/) -[![Join us on Slack](https://img.shields.io/badge/slack-nfcore/sarek-blue)](https://nfcore.slack.com/channels/sarek) +[![Join us on Slack](https://img.shields.io/badge/slack-nfcore/sarek-blue.svg)](https://nfcore.slack.com/channels/sarek) ## Introduction diff --git a/docs/annotation.md b/docs/annotation.md index bec92ff7d6..2d954f3ac8 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -14,6 +14,7 @@ With Sarek, annotation is done using `snpEff`, `VEP`, or even both consecutively - To annotate using `snpEff` followed by `VEP` VCF produced by Sarek will be annotated if `snpEff` or `VEP` are specified with the `--tools` command. +As Sarek will use `bgzip` and `tabix` to compress and index VCF files annotated, it expects VCF files to be sorted. In these examples, all command lines will be launched starting with step `annotate`. It can of course be started directly from any other step instead. @@ -23,7 +24,7 @@ It can of course be started directly from any other step instead. Sarek has already designed containers with `snpEff` and `VEP` files for `GRCh37`, `GRCh38` and `GRCm38`. Default settings will run using these containers. -The main Sarek container has also `snpEff` and `VEP` installed, but without the cache files that can be downloaded separatelly. +The main Sarek container has also `snpEff` and `VEP` installed, but without the cache files that can be downloaded separately. ## Using downloaded cache diff --git a/docs/input.md b/docs/input.md index 18e6695855..7507344cd9 100644 --- a/docs/input.md +++ b/docs/input.md @@ -131,6 +131,8 @@ G15511 XX 1 D0ENMT pathToFiles/G15511.D0ENMT.md.recal.bam pathToF Input files for Sarek can be specified using the path to a VCF directory given to the `--input` command only with the `annotate` step. Multiple VCF files can be specified if the path is enclosed in quotes. +As Sarek will use `bgzip` and `tabix` to compress and index VCF files annotated, it expects VCF files to be sorted. + ```bash nextflow run nf-core/sarek --step annotate --input "results/VariantCalling/*/.vcf.gz" ... ``` From 8c0cf0d599b49a543d931fe27a559739417748f1 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 2 Dec 2019 10:53:00 +0100 Subject: [PATCH 133/179] more tests but less NF versions --- .github/workflows/ci-extra.yml | 6 +++--- scripts/run_tests.sh | 16 ++++++++++------ 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index d37a33aae0..2d38b8c02d 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -7,15 +7,15 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - test: [ANNOTATESNPEFF, GERMLINE, SOMATIC, TARGETED] - nxf_ver: ['19.04.0', ''] + test: [ANNOTATESNPEFF, GERMLINE, TARGETED, HAPLOTYPECALLER, MANTA, MUTECT2, STRELKA, TIDDIT] steps: - uses: actions/checkout@v1 - name: Install Nextflow run: | - export NXF_VER=${{ matrix.nxf_ver }} wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.04.0' - name: Download image run: | ${GITHUB_WORKSPACE}/scripts/download_image.sh -n docker --source-version dev --target-version dev --test ${{ matrix.test }} diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index 4892df61f8..6c4b0ef143 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -107,6 +107,13 @@ case $TEST in ;; esac +if [[ HAPLOTYPECALLER,MANTA,MUTECT2,STRELKA,TIDDIT =~ $TEST ]] +then + TOOLS=$TEST +fi + + + case $TEST in ANNOTATE) run_sarek --step annotate --tools ${ANNOTATOR} --input ${PATHTOSAMPLE}/vcf/Strelka_1234N_variants.vcf.gz --skipQC all @@ -116,14 +123,11 @@ case $TEST in run_sarek --tools=false --input results/Preprocessing/TSV/duplicateMarked.tsv --step recalibrate run_sarek --tools HaplotypeCaller --input results/Preprocessing/TSV/recalibrated.tsv --step variantCalling ;; - MULTIPLE) - run_sarek --tools HaplotypeCaller,Manta,Strelka,TIDDIT,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv - ;; - SOMATIC) - run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv + TOOLS) + run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --TOOLS ${TOOLS} ;; TARGETED) - run_sarek ${OPTIONS} --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --targetBED ${PATHTOSAMPLE}/target.bed + run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --targetBED ${PATHTOSAMPLE}/target.bed --tools Manta,Strelka ;; esac From df3d68a3c988b46dad5c8c4c11bd5aeb403134b5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 2 Dec 2019 10:59:46 +0100 Subject: [PATCH 134/179] actually run the tests --- scripts/run_tests.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index 6c4b0ef143..eecf762b86 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -110,10 +110,9 @@ esac if [[ HAPLOTYPECALLER,MANTA,MUTECT2,STRELKA,TIDDIT =~ $TEST ]] then TOOLS=$TEST + TEST="TOOLS" fi - - case $TEST in ANNOTATE) run_sarek --step annotate --tools ${ANNOTATOR} --input ${PATHTOSAMPLE}/vcf/Strelka_1234N_variants.vcf.gz --skipQC all From 9b3a02730be59531797bb1c14f56d80a8258dc71 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 2 Dec 2019 11:08:37 +0100 Subject: [PATCH 135/179] typo --- scripts/run_tests.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index eecf762b86..b84cb85a40 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -123,7 +123,7 @@ case $TEST in run_sarek --tools HaplotypeCaller --input results/Preprocessing/TSV/recalibrated.tsv --step variantCalling ;; TOOLS) - run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --TOOLS ${TOOLS} + run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --tools ${TOOLS} ;; TARGETED) run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --targetBED ${PATHTOSAMPLE}/target.bed --tools Manta,Strelka From 6b76428b40a7847232c80c005ac6c1b55372c01b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 2 Dec 2019 15:50:13 +0100 Subject: [PATCH 136/179] simplify configs --- conf/base.config | 5 +---- main.nf | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/conf/base.config b/conf/base.config index 5c76d275e6..7c889b04ba 100644 --- a/conf/base.config +++ b/conf/base.config @@ -54,10 +54,7 @@ process { // (exit code 141). Rerunning the process will usually work. errorStrategy = {task.exitStatus == 141 ? 'retry' : 'terminate'} } - withName:FastQCBAM { - errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} - } - withName:FastQCFQ { + withLabel:FastQC { errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} } withName:MapReads { diff --git a/main.nf b/main.nf index fef6238812..33d34766de 100644 --- a/main.nf +++ b/main.nf @@ -603,6 +603,7 @@ inputReads = inputReads.dump(tag:'INPUT') // FASTQ and uBAM files are renamed based on the sample name process FastQCFQ { + label 'FastQC' label 'cpus_2' tag {idPatient + "-" + idRun} @@ -624,6 +625,7 @@ process FastQCFQ { } process FastQCBAM { + label 'FastQC' label 'cpus_2' tag {idPatient + "-" + idRun} From b696b5a1abb50c496bfbed5e37e4567d99574f34 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 2 Dec 2019 15:50:28 +0100 Subject: [PATCH 137/179] add test for mpileup --- .github/workflows/ci-extra.yml | 2 +- scripts/run_tests.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index 2d38b8c02d..b2c57a84f3 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - test: [ANNOTATESNPEFF, GERMLINE, TARGETED, HAPLOTYPECALLER, MANTA, MUTECT2, STRELKA, TIDDIT] + test: [ANNOTATESNPEFF, GERMLINE, TARGETED, HAPLOTYPECALLER, MANTA, MPILEUP, MUTECT2, STRELKA, TIDDIT] steps: - uses: actions/checkout@v1 - name: Install Nextflow diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index b84cb85a40..2b4a74436d 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -107,7 +107,7 @@ case $TEST in ;; esac -if [[ HAPLOTYPECALLER,MANTA,MUTECT2,STRELKA,TIDDIT =~ $TEST ]] +if [[ HAPLOTYPECALLER,MANTA,MPILEUP,MUTECT2,STRELKA,TIDDIT =~ $TEST ]] then TOOLS=$TEST TEST="TOOLS" From 67c53094ceb2ebed6b9e942a1d4019bbcd17736c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 3 Dec 2019 16:01:05 +0100 Subject: [PATCH 138/179] go crazy with tests --- .github/workflows/branch.yml | 2 +- .github/workflows/ci-extra.yml | 52 ++++++++++++++++++++++++++++++---- .github/workflows/ci.yml | 2 +- .github/workflows/linting.yml | 6 ++-- conf/test.config | 4 ++- conf/test_annotation.config | 15 ++++++++++ conf/test_splitfastq.config | 12 ++++++++ conf/test_targeted.config | 15 ++++++++++ conf/test_tool.config | 16 +++++++++++ nextflow.config | 4 +++ scripts/download_image.sh | 13 ++------- scripts/run_tests.sh | 18 ------------ 12 files changed, 120 insertions(+), 39 deletions(-) create mode 100644 conf/test_annotation.config create mode 100644 conf/test_splitfastq.config create mode 100644 conf/test_targeted.config create mode 100644 conf/test_tool.config diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 06824f2d77..1342a9d7b3 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -7,7 +7,7 @@ on: jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: # PRs are only ok if coming from an nf-core dev branch - uses: actions/checkout@v1 diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index 3043486bcd..f0d07178bb 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -3,11 +3,11 @@ name: sarek extra CI on: [push, pull_request] jobs: - test: - runs-on: ubuntu-latest + profile: + runs-on: ubuntu-18.04 strategy: matrix: - test: [ANNOTATESNPEFF, GERMLINE, SPLITFASTQ, TARGETED, HAPLOTYPECALLER, MANTA, MPILEUP, MUTECT2, STRELKA, TIDDIT] + profile: [splitfastq, targeted] steps: - uses: actions/checkout@v1 - name: Install Nextflow @@ -18,7 +18,49 @@ jobs: NXF_VER: '19.04.0' - name: Download image run: | - ${GITHUB_WORKSPACE}/scripts/download_image.sh -n docker --source-version dev --target-version dev --test ${{ matrix.test }} + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev - name: Run test run: | - ${GITHUB_WORKSPACE}/scripts/run_tests.sh --test ${{ matrix.test }} --verbose \ No newline at end of file + nextflow run . -profile ${{ matrix.profile }},docker --verbose + tools: + runs-on: ubuntu-18.04 + strategy: + matrix: + tool: [Haplotypecaller, Manta, mpileup, Mutect2, Strelka, TIDDIT] + steps: + - uses: actions/checkout@v1 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.04.0' + - name: Download image + run: | + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev + - name: Run test + run: | + nextflow run . -profile test_tool,docker --verbose --tools ${{ matrix.tool }} + annotation: + runs-on: ubuntu-18.04 + strategy: + matrix: + annotator: [snpeff] + specie: [GRCh37] + steps: + - uses: actions/checkout@v1 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.04.0' + - name: Download image + run: | + docker pull nfcore/sarek${{ matrix.annotator }}:dev.{{ matrix.specie }} + docker tag nfcore/sarek${{ matrix.annotator }}:dev.{{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:dev.{{ matrix.specie }} + - name: Run test + run: | + nextflow run . -profile test_annotation,docker --verbose --tools ${{ matrix.annotator }} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 22c1031208..9b65872c36 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: test: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 strategy: matrix: nxf_ver: ['19.04.0', ''] diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3892e41f2f..53f1efd031 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -4,7 +4,7 @@ on: [push, pull_request] jobs: Markdown: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 @@ -17,7 +17,7 @@ jobs: run: | markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml YAML: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 @@ -30,7 +30,7 @@ jobs: run: | yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml") nf-core: - runs-on: ubuntu-latest + runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v1 - name: Install Nextflow diff --git a/conf/test.config b/conf/test.config index 9652998f3b..d8b3673d9c 100644 --- a/conf/test.config +++ b/conf/test.config @@ -24,9 +24,11 @@ params { process { withName:Snpeff { + container = 'nfcore/sareksnpeff:dev.GRCh37' maxForks = 1 } - withName:VEP { + withLabel:VEP { + container = 'nfcore/sarekvep:dev.GRCh37' maxForks = 1 } } diff --git a/conf/test_annotation.config b/conf/test_annotation.config new file mode 100644 index 0000000000..6dc8799d22 --- /dev/null +++ b/conf/test_annotation.config @@ -0,0 +1,15 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: + * nextflow run nf-core/sarek -profile test + */ + +includeConfig 'test.config' + +params { + input = 'https://github.com/nf-core/test-datasets/raw/sarek/testdata/vcf/Strelka_1234N_variants.vcf.gz' + genome = 'GRCh37' +} \ No newline at end of file diff --git a/conf/test_splitfastq.config b/conf/test_splitfastq.config new file mode 100644 index 0000000000..734852424e --- /dev/null +++ b/conf/test_splitfastq.config @@ -0,0 +1,12 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: + * nextflow run nf-core/sarek -profile test + */ + +params { + split_fastq = 500 +} \ No newline at end of file diff --git a/conf/test_targeted.config b/conf/test_targeted.config new file mode 100644 index 0000000000..b3575300c1 --- /dev/null +++ b/conf/test_targeted.config @@ -0,0 +1,15 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: + * nextflow run nf-core/sarek -profile test_targeted + */ + +includeConfig 'test.config' + +params { + targetBed = 'https://github.com/nf-core/test-datasets/raw/sarek/testdata/tsv/tiny-manta-https.tsv' + tools = 'manta,strelka' +} \ No newline at end of file diff --git a/conf/test_tool.config b/conf/test_tool.config new file mode 100644 index 0000000000..fa51779592 --- /dev/null +++ b/conf/test_tool.config @@ -0,0 +1,16 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: + * nextflow run nf-core/sarek -profile test + */ + +includeConfig 'test.config' + +params { + // Input data + input = 'https://github.com/nf-core/test-datasets/raw/sarek/testdata/tsv/tiny-recal-pair-https.tsv' + step = 'variantcalling' +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index d5ef7098be..1038bbcc8c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -121,6 +121,10 @@ profiles { singularity.enabled = true } test { includeConfig 'conf/test.config' } + test_annotation { includeConfig 'conf/test_annotation.config' } + test_splitfastq { includeConfig 'conf/test_splitfastq.config' } + test_targeted { includeConfig 'conf/test_targeted.config' } + test_tool { includeConfig 'conf/test_tool.config' } } // Load genomes.config or igenomes.config diff --git a/scripts/download_image.sh b/scripts/download_image.sh index b4ce89205b..b2955c240b 100755 --- a/scripts/download_image.sh +++ b/scripts/download_image.sh @@ -6,7 +6,7 @@ set -xeuo pipefail usage() { echo "Usage: $0 <-t test|annotation tool> <-n engine> <-S version to pull/build> <-T version to tag> <-g genome>" 1>&2; exit 1; } ENGINE=docker -GENOME=smallGRCh37 +GENOME=GRCh37 NXF_SINGULARITY_CACHEDIR=${NXF_SINGULARITY_CACHEDIR:-work/singularity/.} TEST=ALL VERSION=dev @@ -48,13 +48,6 @@ do esac done -SOURCEGENOME=${GENOME} - -if [[ smallGRCh37 =~ $SOURCEGENOME ]] -then - SOURCEGENOME=GRCh37 -fi - get_image(){ CONTAINER=$1 SOURCE=$2 @@ -72,12 +65,12 @@ get_image(){ if [[ ALL,ANNOTATEBOTH,ANNOTATESNPEFF,SNPEFF =~ $TEST ]] then - get_image sareksnpeff ${VERSION}.${SOURCEGENOME} ${TARGETVERSION}.${GENOME} + get_image sareksnpeff ${VERSION}.${GENOME} ${TARGETVERSION}.${GENOME} fi if [[ ALL,ANNOTATEBOTH,ANNOTATEVEP,VEP =~ $TEST ]] then - get_image sarekvep ${VERSION}.${SOURCEGENOME} ${TARGETVERSION}.${GENOME} + get_image sarekvep ${VERSION}.${GENOME} ${TARGETVERSION}.${GENOME} fi get_image sarek ${VERSION} ${TARGETVERSION} \ No newline at end of file diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh index f45d6a5433..977543c730 100755 --- a/scripts/run_tests.sh +++ b/scripts/run_tests.sh @@ -105,16 +105,7 @@ case $TEST in ;; esac -if [[ HAPLOTYPECALLER,MANTA,MPILEUP,MUTECT2,STRELKA,TIDDIT =~ $TEST ]] -then - TOOLS=$TEST - TEST="TOOLS" -fi - case $TEST in - ANNOTATE) - run_sarek --step annotate --tools ${ANNOTATOR} --input ${PATHTOSAMPLE}/vcf/Strelka_1234N_variants.vcf.gz --skipQC all - ;; GERMLINE) run_sarek --tools=false --input data/testdata/tiny/normal run_sarek --tools=false --input results/Preprocessing/TSV/duplicateMarked.tsv --step recalibrate @@ -123,15 +114,6 @@ case $TEST in MULTIPLE) run_sarek --tools FreeBayes,HaplotypeCaller,Manta,Strelka,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv ;; - SPLITFASTQ) - run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --split_fastq 500 - ;; - TARGETED) - run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --targetBED ${PATHTOSAMPLE}/target.bed --tools Manta,Strelka - ;; - TOOLS) - run_sarek --input ${PATHTOSAMPLE}/tsv/tiny-manta${SUFFIX}.tsv --tools ${TOOLS} - ;; esac if [[ $TEST == "GERMLINE" ]] && [[ $OFFLINE == false ]] From a44ae395695c131b8985ffd070817679de558cd0 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 3 Dec 2019 16:12:14 +0100 Subject: [PATCH 139/179] fix tests --- .github/workflows/ci-extra.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index f0d07178bb..77d1c50e30 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-18.04 strategy: matrix: - profile: [splitfastq, targeted] + profile: [test_splitfastq, test_targeted] steps: - uses: actions/checkout@v1 - name: Install Nextflow @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-18.04 strategy: matrix: - tool: [Haplotypecaller, Manta, mpileup, Mutect2, Strelka, TIDDIT] + tool: [Haplotypecaller, Manta, mpileup, Mutect2, Strelka] steps: - uses: actions/checkout@v1 - name: Install Nextflow @@ -59,8 +59,8 @@ jobs: NXF_VER: '19.04.0' - name: Download image run: | - docker pull nfcore/sarek${{ matrix.annotator }}:dev.{{ matrix.specie }} - docker tag nfcore/sarek${{ matrix.annotator }}:dev.{{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:dev.{{ matrix.specie }} + docker pull nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} + docker tag nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} - name: Run test run: | nextflow run . -profile test_annotation,docker --verbose --tools ${{ matrix.annotator }} \ No newline at end of file From b0a6557d0d5953082ff948b77f16fb29d9e8c04f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 3 Dec 2019 16:16:34 +0100 Subject: [PATCH 140/179] includ test.config --- conf/test_splitfastq.config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/conf/test_splitfastq.config b/conf/test_splitfastq.config index 734852424e..5209ec401b 100644 --- a/conf/test_splitfastq.config +++ b/conf/test_splitfastq.config @@ -7,6 +7,8 @@ * nextflow run nf-core/sarek -profile test */ +includeConfig 'test.config' + params { split_fastq = 500 } \ No newline at end of file From 9ab028d8e440de6dd5c7b620fcd4073bf7d167b5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 3 Dec 2019 16:38:24 +0100 Subject: [PATCH 141/179] restore FreeBayes --- .github/workflows/ci-extra.yml | 2 +- CHANGELOG.md | 1 - bin/scrape_software_versions.py | 2 ++ docs/containers.md | 1 + docs/images/sarek_workflow.png | Bin 47599 -> 49025 bytes docs/images/sarek_workflow.svg | 22 +++++++++++--- docs/output.md | 14 +++++++++ docs/usage.md | 2 +- environment.yml | 1 + main.nf | 52 +++++++++++++++++++++++++++----- 10 files changed, 83 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index 77d1c50e30..6bd09884b3 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-18.04 strategy: matrix: - tool: [Haplotypecaller, Manta, mpileup, Mutect2, Strelka] + tool: [Haplotypecaller, Freebayes, Manta, mpileup, Mutect2, Strelka] steps: - uses: actions/checkout@v1 - name: Install Nextflow diff --git a/CHANGELOG.md b/CHANGELOG.md index 0877fb43de..f57c4d1f0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,7 +31,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a ### `Removed` - [#46](https://github.com/nf-core/sarek/pull/46) - Remove mention of old `build.nf` script which was included in `main.nf` -- [#XXX](https://github.com/nf-core/sarek/pull/XXX) - Remove `Freebayes` ### `Fixed` diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py index d85700a0e2..617740e595 100755 --- a/bin/scrape_software_versions.py +++ b/bin/scrape_software_versions.py @@ -9,6 +9,7 @@ 'bcftools': ['v_bcftools.txt', r"bcftools (\S+)"], 'BWA': ['v_bwa.txt', r"Version: (\S+)"], 'FastQC': ['v_fastqc.txt', r"FastQC v(\S+)"], + 'FreeBayes': ['v_freebayes.txt', r"version: v(\d\.\d\.\d+)"], 'GATK': ['v_gatk.txt', r"Version:(\S+)"], 'htslib': ['v_samtools.txt', r"htslib (\S+)"], 'Manta': ['v_manta.txt', r"([0-9.]+)"], @@ -32,6 +33,7 @@ results['bcftools'] = 'N/A' results['BWA'] = 'N/A' results['FastQC'] = 'N/A' +results['FreeBayes'] = 'N/A' results['GATK'] = 'N/A' results['htslib'] = 'N/A' results['Manta'] = 'N/A' diff --git a/docs/containers.md b/docs/containers.md index d8a51fb637..b75d74db9a 100644 --- a/docs/containers.md +++ b/docs/containers.md @@ -20,6 +20,7 @@ For annotation, the main container can be used, but the cache has to be download - Contain **[BWA](https://github.com/lh3/bwa)** 0.7.17 - Contain **[Control-FREEC](https://github.com/BoevaLab/FREEC)** 11.5 - Contain **[FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/)** 0.11.8 +- Contain **[FreeBayes](https://github.com/ekg/freebayes)** 1.3.1 - Contain **[GATK4](https://github.com/broadinstitute/gatk)** 4.1.4.0 - Contain **[GeneSplicer](https://ccb.jhu.edu/software/genesplicer/)** 1.0 - Contain **[HTSlib](https://github.com/samtools/htslib)** 1.9 diff --git a/docs/images/sarek_workflow.png b/docs/images/sarek_workflow.png index 3d7253ee44af0ebaff1486b35b3b90e6abbb58a8..1a1821cbf77d305e27a0a2198050f886dafdc5eb 100644 GIT binary patch delta 30537 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 delta 29100 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%0APrs#4*+H{s-7mJ4 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 Dw9ogd diff --git a/docs/images/sarek_workflow.svg b/docs/images/sarek_workflow.svg index f17b20d570..3c65217c05 100644 --- a/docs/images/sarek_workflow.svg +++ b/docs/images/sarek_workflow.svg @@ -2218,10 +2218,10 @@ id="namedview4" showgrid="false" inkscape:zoom="0.5" - inkscape:cx="75.30477" + inkscape:cx="-604.69523" inkscape:cy="732.99056" - inkscape:window-x="0" - inkscape:window-y="0" + inkscape:window-x="1920" + inkscape:window-y="759" inkscape:window-maximized="1" inkscape:current-layer="g10" units="mm" @@ -2259,6 +2259,8 @@ + + @@ -2789,6 +2791,8 @@ + + • Mutect2, Strelka2• FreeBayes, Mutect2 Strelka2• Manta v_nextflow.txt 2>&1 || true echo "SNPEFF version"\$(snpEff -h 2>&1) > v_snpeff.txt fastqc --version > v_fastqc.txt 2>&1 || true + freebayes --version > v_freebayes.txt 2>&1 || true gatk ApplyBQSR --help 2>&1 | grep Version: > v_gatk.txt 2>&1 || true multiqc --version &> v_multiqc.txt 2>&1 || true qualimap --version &> v_qualimap.txt 2>&1 || true @@ -1302,8 +1303,44 @@ intervalPairBam = pairBam.spread(bedIntervals) bamMpileup = bamMpileup.spread(intMpileup) -// intervals for Mutect2 calls and pileups for Mutect2 filtering -(pairBamMutect2, pairBamPileupSummaries) = intervalPairBam.into(2) +// intervals for Mutect2 calls, FreeBayes and pileups for Mutect2 filtering +(pairBamMutect2, pairBamFreeBayes, pairBamPileupSummaries) = intervalPairBam.into(3) + +// STEP FREEBAYES + +process FreeBayes { + tag {idSampleTumor + "_vs_" + idSampleNormal + "-" + intervalBed.baseName} + label 'cpus_1' + + input: + set idPatient, idSampleNormal, file(bamNormal), file(baiNormal), idSampleTumor, file(bamTumor), file(baiTumor), file(intervalBed) from pairBamFreeBayes + file(fasta) from ch_fasta + file(fastaFai) from ch_fastaFai + + output: + set val("FreeBayes"), idPatient, val("${idSampleTumor}_vs_${idSampleNormal}"), file("${intervalBed.baseName}_${idSampleTumor}_vs_${idSampleNormal}.vcf") into vcfFreeBayes + + when: 'freebayes' in tools + + script: + """ + freebayes \ + -f ${fasta} \ + --pooled-continuous \ + --pooled-discrete \ + --genotype-qualities \ + --report-genotype-likelihood-max \ + --allele-balance-priors-off \ + --min-alternate-fraction 0.03 \ + --min-repeat-entropy 1 \ + --min-alternate-count 2 \ + -t ${intervalBed} \ + ${bamTumor} \ + ${bamNormal} > ${intervalBed.baseName}_${idSampleTumor}_vs_${idSampleNormal}.vcf + """ +} + +vcfFreeBayes = vcfFreeBayes.groupTuple(by:[0,1,2]) // STEP GATK MUTECT2.1 - RAW CALLS @@ -1392,9 +1429,9 @@ process MergeMutect2Stats { // we are merging the VCFs that are called separatelly for different intervals // so we can have a single sorted VCF containing all the calls for a given caller -// STEP MERGING VCF - GATK HAPLOTYPECALLER & GATK MUTECT2 (UNFILTERED) +// STEP MERGING VCF - FREEBAYES, GATK HAPLOTYPECALLER & GATK MUTECT2 (UNFILTERED) -vcfConcatenateVCFs = mutect2Output.mix(vcfGenotypeGVCFs, gvcfHaplotypeCaller) +vcfConcatenateVCFs = mutect2Output.mix(vcfFreeBayes, vcfGenotypeGVCFs, gvcfHaplotypeCaller) vcfConcatenateVCFs = vcfConcatenateVCFs.dump(tag:'VCF to merge') process ConcatVCF { @@ -1413,7 +1450,7 @@ process ConcatVCF { // we have this funny *_* pattern to avoid copying the raw calls to publishdir set variantCaller, idPatient, idSample, file("*_*.vcf.gz"), file("*_*.vcf.gz.tbi") into vcfConcatenated - when: ('haplotypecaller' in tools || 'mutect2' in tools) + when: ('haplotypecaller' in tools || 'mutect2' in tools || 'freebayes' in tools) script: if (variantCaller == 'HaplotypeCallerGVCF') @@ -2109,7 +2146,7 @@ if (step == 'annotate') { if (tsvPath == []) { // Sarek, by default, annotates all available vcfs that it can find in the VariantCalling directory - // Excluding g.vcf from HaplotypeCaller + // Excluding vcfs from FreeBayes, and g.vcf from HaplotypeCaller // Basically it's: VariantCalling/*/{HaplotypeCaller,Manta,Mutect2,Strelka,TIDDIT}/*.vcf.gz // Without *SmallIndels.vcf.gz from Manta, and *.genome.vcf.gz from Strelka // The small snippet `vcf.minus(vcf.fileName)[-2]` catches idSample @@ -2651,6 +2688,7 @@ def defineToolList() { return [ 'ascat', 'controlfreec', + 'freebayes', 'haplotypecaller', 'manta', 'merge', From 67e5001bdec78d9fb1acd28cb1a05811a05c15b8 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 3 Dec 2019 20:39:29 +0100 Subject: [PATCH 142/179] remove label memory_max from BaseRecalibrator process to fix #72 --- CHANGELOG.md | 1 + main.nf | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e2b55345b..0fb77cee9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0. - [#43](https://github.com/nf-core/sarek/pull/43) - Fix automated `VEP` builds with circleCI - [#54](https://github.com/nf-core/sarek/pull/54) - Apply fixes from release `2.5.1` - [#58](https://github.com/nf-core/sarek/pull/58) - Fix issue with `.interval_list` file from the GATK bundle [#56](https://github.com/nf-core/sarek/issues/56) that was not recognized in the `CreateIntervalsBed` process +- [#73](https://github.com/nf-core/sarek/pull/73) - Fix issue with label `memory_max` for `BaseRecalibrator` process [#72](https://github.com/nf-core/sarek/issues/72) ## [2.5.1] - Årjep-Ålkatjjekna diff --git a/main.nf b/main.nf index 50dff290a4..43b61fc5ec 100644 --- a/main.nf +++ b/main.nf @@ -801,7 +801,6 @@ bamBaseRecalibrator = bamBaseRecalibrator.dump(tag:'BAM FOR BASERECALIBRATOR') // STEP 3: CREATING RECALIBRATION TABLES process BaseRecalibrator { - label 'memory_max' label 'cpus_1' tag {idPatient + "-" + idSample + "-" + intervalBed} From 89cbf62b31a31ab98ac259b3b989a6dbce08171d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 10:30:42 +0100 Subject: [PATCH 143/179] add --skipQC all and --tools Manta,mpileup,Strelka to minimal genome tests --- .github/workflows/ci-extra.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index c9c6d82a9e..f93f75b7b8 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -23,7 +23,7 @@ jobs: docker tag nfcore/sarek:dev nfcore/sarek:dev - name: Run test run: | - nextflow run . -profile test,docker --verbose --genome ${{ matrix.genome }} ${{ matrix.intervals }} + nextflow run . -profile test,docker --skipQC all --verbose --genome ${{ matrix.genome }} ${{ matrix.intervals }} --tools Manta,mpileup,Strelka profile: runs-on: ubuntu-18.04 strategy: From 3e045b054173ff28d70e321257e32b4cc6760170 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 10:34:45 +0100 Subject: [PATCH 144/179] update Nextflow version --- .github/workflows/ci-extra.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml index f93f75b7b8..190c7e36ef 100644 --- a/.github/workflows/ci-extra.yml +++ b/.github/workflows/ci-extra.yml @@ -16,7 +16,7 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ env: - NXF_VER: '19.04.0' + NXF_VER: '19.10.0' - name: Download image run: | docker pull nfcore/sarek:dev @@ -36,7 +36,7 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ env: - NXF_VER: '19.04.0' + NXF_VER: '19.10.0' - name: Download image run: | docker pull nfcore/sarek:dev @@ -56,7 +56,7 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ env: - NXF_VER: '19.04.0' + NXF_VER: '19.10.0' - name: Download image run: | docker pull nfcore/sarek:dev @@ -77,7 +77,7 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ env: - NXF_VER: '19.04.0' + NXF_VER: '19.10.0' - name: Download image run: | docker pull nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} From 544a9d505be7e29a8c7586e78ffa52baeb96a35a Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 10:36:11 +0100 Subject: [PATCH 145/179] update Nextflow version --- .github/workflows/ci.yml | 2 +- README.md | 2 +- nextflow.config | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b65872c36..1b01846e1c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-18.04 strategy: matrix: - nxf_ver: ['19.04.0', ''] + nxf_ver: ['19.10.0', ''] steps: - uses: actions/checkout@v1 - name: Install Nextflow diff --git a/README.md b/README.md index 6c9101cbc3..8651fb0812 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ > **An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing** -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.04.0-brightgreen.svg)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A519.10.0-brightgreen.svg)](https://www.nextflow.io/) [![nf-core](https://img.shields.io/badge/nf--core-pipeline-brightgreen.svg)](https://nf-co.re/) [![DOI](https://zenodo.org/badge/184289291.svg)](https://zenodo.org/badge/latestdoi/184289291) diff --git a/nextflow.config b/nextflow.config index b55cc7eb48..6d4d86ed5f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -161,7 +161,7 @@ manifest { homePage = 'https://github.com/nf-core/sarek' description = 'An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing' mainScript = 'main.nf' - nextflowVersion = '>=19.04.0' + nextflowVersion = '>=19.10.0' version = '2.5.2dev' } From e2f01e9221554762f8c4c67d6c9bae5d6f769a6c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 10:55:11 +0100 Subject: [PATCH 146/179] update Nextflow --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 450539446e..3713a63aff 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,7 +30,7 @@ install: - sudo apt-get install npm && npm install -g markdownlint-cli env: - - NXF_VER='19.04.0' # Specify a minimum NF version that should be tested and work + - NXF_VER='19.10.0' # Specify a minimum NF version that should be tested and work - NXF_VER='' # Plus: get the latest NF version and check that it works script: From 361716a2ddbeedf819fb6db8d51fd6c6b78cbdec Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 11:45:51 +0100 Subject: [PATCH 147/179] add --step annotation to profile --- conf/test_annotation.config | 1 + 1 file changed, 1 insertion(+) diff --git a/conf/test_annotation.config b/conf/test_annotation.config index 6dc8799d22..2a1efe923e 100644 --- a/conf/test_annotation.config +++ b/conf/test_annotation.config @@ -12,4 +12,5 @@ includeConfig 'test.config' params { input = 'https://github.com/nf-core/test-datasets/raw/sarek/testdata/vcf/Strelka_1234N_variants.vcf.gz' genome = 'GRCh37' + step = 'annotate' } \ No newline at end of file From 357138bdf02debd17d0e65c4f54ef122598f170b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 12:15:36 +0100 Subject: [PATCH 148/179] don't need to specify step here --- conf/test_annotation.config | 1 - 1 file changed, 1 deletion(-) diff --git a/conf/test_annotation.config b/conf/test_annotation.config index 2a1efe923e..6dc8799d22 100644 --- a/conf/test_annotation.config +++ b/conf/test_annotation.config @@ -12,5 +12,4 @@ includeConfig 'test.config' params { input = 'https://github.com/nf-core/test-datasets/raw/sarek/testdata/vcf/Strelka_1234N_variants.vcf.gz' genome = 'GRCh37' - step = 'annotate' } \ No newline at end of file From 83fcf656f23155ee7d27f2249294f0dcf6049975 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 12:19:23 +0100 Subject: [PATCH 149/179] move params initalization --- main.nf | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/main.nf b/main.nf index 4a45d75483..6973004aaf 100644 --- a/main.nf +++ b/main.nf @@ -150,28 +150,6 @@ annoList = defineAnnoList() annotateTools = params.annotateTools ? params.annotateTools.split(',').collect{it.trim().toLowerCase()} : [] if (!checkParameterList(annotateTools,annoList)) exit 1, 'Unknown tool(s) to annotate, see --help for more information' -// Initialize each params in params.genomes, catch the command line first if it was defined -// params.fasta has to be the first one -params.fasta = params.genome && !('annotate' in step) ? params.genomes[params.genome].fasta ?: null : null -// The rest can be sorted -params.acLoci = params.genome && 'ascat' in tools ? params.genomes[params.genome].acLoci ?: null : null -params.acLociGC = params.genome && 'ascat' in tools ? params.genomes[params.genome].acLociGC ?: null : null -params.bwaIndex = params.genome && params.fasta && 'mapping' in step ? params.genomes[params.genome].bwaIndex ?: null : null -params.chrDir = params.genome && 'controlfreec' in tools ? params.genomes[params.genome].chrDir ?: null : null -params.chrLength = params.genome && 'controlfreec' in tools ? params.genomes[params.genome].chrLength ?: null : null -params.dbsnp = params.genome && ('mapping' in step || 'controlfreec' in tools || 'haplotypecaller' in tools || 'mutect2' in tools) ? params.genomes[params.genome].dbsnp ?: null : null -params.dbsnpIndex = params.genome && params.dbsnp ? params.genomes[params.genome].dbsnpIndex ?: null : null -params.dict = params.genome && params.fasta ? params.genomes[params.genome].dict ?: null : null -params.fastaFai = params.genome && params.fasta ? params.genomes[params.genome].fastaFai ?: null : null -params.germlineResource = params.genome && 'mutect2' in tools ? params.genomes[params.genome].germlineResource ?: null : null -params.germlineResourceIndex = params.genome && params.germlineResource ? params.genomes[params.genome].germlineResourceIndex ?: null : null -params.intervals = params.genome && !('annotate' in step) ? params.genomes[params.genome].intervals ?: null : null -params.knownIndels = params.genome && 'mapping' in step ? params.genomes[params.genome].knownIndels ?: null : null -params.knownIndelsIndex = params.genome && params.knownIndels ? params.genomes[params.genome].knownIndelsIndex ?: null : null -params.snpeffDb = params.genome && 'snpeff' in tools ? params.genomes[params.genome].snpeffDb ?: null : null -params.species = params.genome && 'vep' in tools ? params.genomes[params.genome].species ?: null : null -params.vepCacheVersion = params.genome && 'vep' in tools ? params.genomes[params.genome].vepCacheVersion ?: null : null - // Handle deprecation if (params.noReports) skipQC = skipQClist @@ -240,6 +218,28 @@ if (tsvPath) { ================================================================================ */ +// Initialize each params in params.genomes, catch the command line first if it was defined +// params.fasta has to be the first one +params.fasta = params.genome && !('annotate' in step) ? params.genomes[params.genome].fasta ?: null : null +// The rest can be sorted +params.acLoci = params.genome && 'ascat' in tools ? params.genomes[params.genome].acLoci ?: null : null +params.acLociGC = params.genome && 'ascat' in tools ? params.genomes[params.genome].acLociGC ?: null : null +params.bwaIndex = params.genome && params.fasta && 'mapping' in step ? params.genomes[params.genome].bwaIndex ?: null : null +params.chrDir = params.genome && 'controlfreec' in tools ? params.genomes[params.genome].chrDir ?: null : null +params.chrLength = params.genome && 'controlfreec' in tools ? params.genomes[params.genome].chrLength ?: null : null +params.dbsnp = params.genome && ('mapping' in step || 'controlfreec' in tools || 'haplotypecaller' in tools || 'mutect2' in tools) ? params.genomes[params.genome].dbsnp ?: null : null +params.dbsnpIndex = params.genome && params.dbsnp ? params.genomes[params.genome].dbsnpIndex ?: null : null +params.dict = params.genome && params.fasta ? params.genomes[params.genome].dict ?: null : null +params.fastaFai = params.genome && params.fasta ? params.genomes[params.genome].fastaFai ?: null : null +params.germlineResource = params.genome && 'mutect2' in tools ? params.genomes[params.genome].germlineResource ?: null : null +params.germlineResourceIndex = params.genome && params.germlineResource ? params.genomes[params.genome].germlineResourceIndex ?: null : null +params.intervals = params.genome && !('annotate' in step) ? params.genomes[params.genome].intervals ?: null : null +params.knownIndels = params.genome && 'mapping' in step ? params.genomes[params.genome].knownIndels ?: null : null +params.knownIndelsIndex = params.genome && params.knownIndels ? params.genomes[params.genome].knownIndelsIndex ?: null : null +params.snpeffDb = params.genome && 'snpeff' in tools ? params.genomes[params.genome].snpeffDb ?: null : null +params.species = params.genome && 'vep' in tools ? params.genomes[params.genome].species ?: null : null +params.vepCacheVersion = params.genome && 'vep' in tools ? params.genomes[params.genome].vepCacheVersion ?: null : null + // Initialize channels based on params ch_acLoci = params.acLoci && 'ascat' in tools ? Channel.value(file(params.acLoci)) : "null" ch_acLociGC = params.acLociGC && 'ascat' in tools ? Channel.value(file(params.acLociGC)) : "null" @@ -249,6 +249,7 @@ ch_dbsnp = params.dbsnp && ('mapping' in step || 'controlfreec' in tools || 'hap ch_fasta = params.fasta && !('annotate' in step) ? Channel.value(file(params.fasta)) : "null" ch_fastaFai = params.fastaFai && !('annotate' in step) ? Channel.value(file(params.fastaFai)) : "null" ch_germlineResource = params.germlineResource && 'mutect2' in tools ? Channel.value(file(params.germlineResource)) : "null" +ch_intervals = params.intervals && !params.no_intervals && !('annotate' in step) ? Channel.value(file(params.intervals)) : "null" // knownIndels is currently a list of file for smallGRCh37, so transform it in a channel li_knownIndels = [] @@ -283,7 +284,7 @@ summary['Max Resources'] = "${params.max_memory} memory, ${params.max_cpus} if (workflow.containerEngine) summary['Container'] = "${workflow.containerEngine} - ${workflow.container}" if (params.input) summary['Input'] = params.input if (params.targetBED) summary['Target BED'] = params.targetBED -if (params.step) summary['Step'] = params.step +if (step) summary['Step'] = step if (params.tools) summary['Tools'] = tools.join(', ') if (params.skipQC) summary['QC tools skip'] = skipQC.join(', ') From 67dd6379a71f7336a188f680f1fe0fb846acc015 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 14:26:56 +0100 Subject: [PATCH 150/179] add docs --- docs/reference.md | 14 ++++++++++++++ docs/usage.md | 5 +++++ 2 files changed, 19 insertions(+) diff --git a/docs/reference.md b/docs/reference.md index 65d96997e0..284ff04c0a 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -37,6 +37,14 @@ Second, the jobs with largest processing time are started first, which reduces w If no runtime is given, a time of 1000 nucleotides per second is assumed. Actual figures vary from 2 nucleotides/second to 30000 nucleotides/second. +If no intervals files are specified, one will be automatically generated following: + +```bash +awk -v FS='\t' -v OFS='\t' '{ print \$1, \"0\", \$2 }' .fasta.fai > .bed +``` + +To disable this feature, please use [`--no_intervals`](usage.md#--no_intervals) + ### Working with whole exome (WES) or panel data The `--targetBED` parameter does _not_ imply that the workflow is running alignment or variant calling only for the supplied targets. @@ -44,3 +52,9 @@ Instead, we are aligning for the whole genome, and selecting variants only at th Adding every exon as an interval in case of WES can generate >200K processes or jobs, much more forks, and similar number of directories in the Nextflow work directory. Furthermore, primers and/or baits are not 100% specific, (certainly not for MHC and KIR, etc.), quite likely there going to be reads mapping to multiple locations. If you are certain that the target is unique for your genome (all the reads will certainly map to only one location), and aligning to the whole genome is an overkill, better to change the reference itself. + +### Working with other genomes + +> :warning: This is a new feature, in active development, so usage could change. + +Sarek can also do limited preprocessing from any genome, providing a `fasta` file as a reference genome, followed by limited variant calling using `mpileup`, `Manta` and `Strelka`. \ No newline at end of file diff --git a/docs/usage.md b/docs/usage.md index f0c933dc1d..8208579e58 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -23,6 +23,7 @@ * [`--step`](#--step) * [`--tools`](#--tools) * [`--noStrelkaBP`](#--nostrelkabp) + * [`--no_intervals`](#--no_intervals) * [`--targetBED`](#--targetbed) * [Reference genomes](#reference-genomes) * [`--genome` (using iGenomes)](#--genome-using-igenomes) @@ -285,6 +286,10 @@ Available: `ASCAT`, `ControlFREEC`, `FreeBayes`, `HaplotypeCaller`, `Manta`, `mp Use this not to use `Manta` `candidateSmallIndels` for `Strelka` as Best Practice. +### `--no_intervals_` + +Disable usage of intervals file, and disable automatic generation of intervals file when none are provided. + ### `--targetBED` Use this to specify the target BED file for targeted or whole exome sequencing. From 430a09b244f69c8c642aab7cb3a0efca16b9e820 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 14:28:10 +0100 Subject: [PATCH 151/179] fix markdownlint --- docs/reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/reference.md b/docs/reference.md index 284ff04c0a..9287cffd32 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -57,4 +57,4 @@ If you are certain that the target is unique for your genome (all the reads will > :warning: This is a new feature, in active development, so usage could change. -Sarek can also do limited preprocessing from any genome, providing a `fasta` file as a reference genome, followed by limited variant calling using `mpileup`, `Manta` and `Strelka`. \ No newline at end of file +Sarek can also do limited preprocessing from any genome, providing a `fasta` file as a reference genome, followed by limited variant calling using `mpileup`, `Manta` and `Strelka`. From 22d386ad7f0e5c683334a88f993092ba69eb6977 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Fri, 6 Dec 2019 15:16:41 +0100 Subject: [PATCH 152/179] more complete docs + sort genomes --- CHANGELOG.md | 2 +- conf/genomes.config | 22 ++------- conf/igenomes.config | 112 +++++++++++++++++++++---------------------- docs/reference.md | 2 + docs/usage.md | 89 ++++++++++++++++++++++++++++++++-- 5 files changed, 148 insertions(+), 79 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f6f3ca85eb..55e65e46cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a - [#60](https://github.com/nf-core/sarek/pull/60) - Add minimal support for minimal genome (only `fasta`, or `fasta` + `knownIndels`) - [#60](https://github.com/nf-core/sarek/pull/60) - Add new processes (`IndexBamFile`, `IndexBamRecal`) to deal with optional usage of interval files and minimal genome - [#60](https://github.com/nf-core/sarek/pull/60) - Add tests for minimal genome usage -- [#60](https://github.com/nf-core/sarek/pull/60) - Add new minimal genomes (`AGPv3`, `BDGP6`, `CHIMP2.1.4`, `CanFam3.1`, `EB1`, `EB2`, `EF2`, `EquCab2`, `GRCz10`, `Galgal4`, `Gm01`, `IRGSP-1.0`, `Mmul_1`, `R64-1-1`, `Rnor_6.0`, `Sbi1`, `Sscrofa10.2`, `TAIR10`, `UMD3.1`, `WBcel235`, `bosTau8`, `canFam3`, `ce10`, `danRer10`, `dm6`, `equCab2`, `galGal4`, `hg19`, `hg38`, `mm10`, `panTro4`, `rn6`, `sacCer3`, `susScr3`) to `igenomes.config` +- [#60](https://github.com/nf-core/sarek/pull/60) - Add new minimal genomes (`TAIR10`, `EB2`, `UMD3.1`, `bosTau8`, `WBcel235`, `ce10`, `CanFam3.1`, `canFam3`, `GRCz10`, `danRer10`, `BDGP6`, `dm6`, `EquCab2`, `equCab2`, `EB1`, `Galgal4`, `galGal4`, `Gm01`, `hg38`, `hg19`, `Mmul_1`, `mm10`, `IRGSP-1.0`, `CHIMP2.1.4`, `panTro4`, `Rnor_6.0`, `rn6`, `R64-1-1`, `sacCer3`, `EF2`, `Sbi1`, `Sscrofa10.2`, `susScr3`, `AGPv3`) to `igenomes.config` - [#61](https://github.com/nf-core/sarek/pull/61) - Add params `split_fastq` - [#61](https://github.com/nf-core/sarek/pull/61) - Add test `SPLITFASTQ` diff --git a/conf/genomes.config b/conf/genomes.config index acc6137506..11c449ba55 100644 --- a/conf/genomes.config +++ b/conf/genomes.config @@ -49,6 +49,9 @@ params { species = 'homo_sapiens' vepCacheVersion = '95' } + 'minimalGRCh37' { + fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" + } 'smallGRCh37' { dbsnp = "${params.genomes_base}/dbsnp_138.b37.small.vcf.gz" fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" @@ -59,28 +62,9 @@ params { species = 'homo_sapiens' vepCacheVersion = '95' } - 'GRCm38' { - bwaIndex = "${params.genomes_base}/genome.fa.{amb,ann,bwt,pac,sa}" - chrDir = "${params.genomes_base}/Chromosomes" - chrLength = "${params.genomes_base}/GRCm38.len" - dbsnp = "${params.genomes_base}/mgp.v5.merged.snps_all.dbSNP142.vcf.gz" - dbsnpIndex = "${params.genomes_base}/mgp.v5.merged.snps_all.dbSNP142.vcf.gz.tbi" - dict = "${params.genomes_base}/genome.dict" - fasta = "${params.genomes_base}/genome.fa" - fastaFai = "${params.genomes_base}/genome.fa.fai" - intervals = "${params.genomes_base}/GRCm38_calling_list.bed" - knownIndels = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz" - knownIndelsIndex = "${params.genomes_base}/mgp.v5.merged.indels.dbSNP142.normed.vcf.gz.tbi" - snpeffDb = 'GRCm38.86' - species = 'mus_musculus' - vepCacheVersion = '98' - } 'smallerGRCh37' { fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" knownIndels = "${params.genomes_base}/dbsnp_138.b37.small.vcf.gz" } - 'minimalGRCh37' { - fasta = "${params.genomes_base}/human_g1k_v37_decoy.small.fasta" - } } } diff --git a/conf/igenomes.config b/conf/igenomes.config index 0dc0f857a0..7ecdd98b40 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -77,26 +77,50 @@ params { bwaIndex = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" } + 'bosTau8' { + bwaIndex = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" + } 'WBcel235' { bwaIndex = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" } + 'ce10' { + bwaIndex = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" + } 'CanFam3.1' { bwaIndex = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" } + 'canFam3' { + bwaIndex = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" + } 'GRCz10' { bwaIndex = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" } + 'danRer10' { + bwaIndex = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" + } 'BDGP6' { bwaIndex = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" } + 'dm6' { + bwaIndex = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" + } 'EquCab2' { bwaIndex = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" } + 'equCab2' { + bwaIndex = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" + } 'EB1' { bwaIndex = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" @@ -105,14 +129,30 @@ params { bwaIndex = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" } + 'galGal4' { + bwaIndex = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" + } 'Gm01' { bwaIndex = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" } + 'hg38' { + bwaIndex = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" + } + 'hg19' { + bwaIndex = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" + } 'Mmul_1' { bwaIndex = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" } + 'mm10' { + bwaIndex = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" + } 'IRGSP-1.0' { bwaIndex = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" @@ -121,14 +161,26 @@ params { bwaIndex = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" } + 'panTro4' { + bwaIndex = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" + } 'Rnor_6.0' { bwaIndex = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" } + 'rn6' { + bwaIndex = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" + } 'R64-1-1' { bwaIndex = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" } + 'sacCer3' { + bwaIndex = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" + } 'EF2' { bwaIndex = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" @@ -141,65 +193,13 @@ params { bwaIndex = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" } - 'AGPv3' { - bwaIndex = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - } - 'hg38' { - bwaIndex = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - } - 'hg19' { - bwaIndex = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - } - 'mm10' { - bwaIndex = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - } - 'bosTau8' { - bwaIndex = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - } - 'ce10' { - bwaIndex = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - } - 'canFam3' { - bwaIndex = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - } - 'danRer10' { - bwaIndex = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - } - 'dm6' { - bwaIndex = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - } - 'equCab2' { - bwaIndex = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - } - 'galGal4' { - bwaIndex = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - } - 'panTro4' { - bwaIndex = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - } - 'rn6' { - bwaIndex = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - } - 'sacCer3' { - bwaIndex = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" - fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - } 'susScr3' { bwaIndex = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" } + 'AGPv3' { + bwaIndex = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa.{amb,ann,bwt,pac,sa}" + fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" + } } } diff --git a/docs/reference.md b/docs/reference.md index 9287cffd32..741c61bd1b 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -58,3 +58,5 @@ If you are certain that the target is unique for your genome (all the reads will > :warning: This is a new feature, in active development, so usage could change. Sarek can also do limited preprocessing from any genome, providing a `fasta` file as a reference genome, followed by limited variant calling using `mpileup`, `Manta` and `Strelka`. + +Limited support for `TAIR10`, `EB2`, `UMD3.1`, `bosTau8`, `WBcel235`, `ce10`, `CanFam3.1`, `canFam3`, `GRCz10`, `danRer10`, `BDGP6`, `dm6`, `EquCab2`, `equCab2`, `EB1`, `Galgal4`, `galGal4`, `Gm01`, `hg38`, `hg19`, `Mmul_1`, `mm10`, `IRGSP-1.0`, `CHIMP2.1.4`, `panTro4`, `Rnor_6.0`, `rn6`, `R64-1-1`, `sacCer3`, `EF2`, `Sbi1`, `Sscrofa10.2`, `susScr3`, `AGPv3`. diff --git a/docs/usage.md b/docs/usage.md index 8208579e58..b5f5d45691 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -307,9 +307,92 @@ To run the pipeline, you must specify which to use with the `--genome` flag. You can find the keys to specify the genomes in the [iGenomes config file](../conf/igenomes.config). Genomes that are supported are: -* Human - * `--genome GRCh37` - * `--genome GRCh38` +* Homo sapiens + * `--genome GRCh37` (GATK Bundle) + * `--genome GRCh38` (GATK Bundle) + +* Mus musculus + * `--genome GRCm38` (Ensembl) + +Limited support for: + +* Arabidopsis thaliana + * `--genome TAIR10` (Ensembl) + +* Bacillus subtilis 168 + * `--genome EB2` (Ensembl) + +* Bos taurus + * `--genome UMD3.1` (Ensembl) + * `--genome bosTau8` (UCSC) + +* Caenorhabditis elegans + * `--genome WBcel235` (Ensembl) + * `--genome ce10` (UCSC) + +* Canis familiaris + * `--genome CanFam3.1` (Ensembl) + * `--genome canFam3` (UCSC) + +* Danio rerio + * `--genome GRCz10` (Ensembl) + * `--genome danRer10` (UCSC) + +* Drosophila melanogaster + * `--genome BDGP6` (Ensembl) + * `--genome dm6` (UCSC) + +* Equus caballus + * `--genome EquCab2` (Ensembl) + * `--genome equCab2` (UCSC) + +* Escherichia coli K 12 DH10B + * `--genome EB1` (Ensembl) + +* Gallus gallus + * `--genome Galgal4` (Ensembl) + * `--genome galgal4` (UCSC) + +* Glycine max + * `--genome Gm01` (Ensembl) + +* Homo sapiens + * `--genome hg19` (UCSC) + * `--genome hg38` (UCSC) + +* Macaca mulatta + * `--genome Mmul_1` (Ensembl) + +* Mus musculus + * `--genome mm10` (Ensembl) + +* Oryza sativa japonica + * `--genome IRGSP-1.0` (Ensembl) + +* Pan troglodytes + * `--genome CHIMP2.1.4` (Ensembl) + * `--genome panTro4` (UCSC) + +* Rattus norvegicus + * `--genome Rnor_6.0` (Ensembl) + * `--genome rn6` (UCSC) + +* Saccharomyces cerevisiae + * `--genome R64-1-1` (Ensembl) + * `--genome sacCer3` (UCSC) + +* Schizosaccharomyces pombe + * `--genome EF2` (Ensembl) + +* Sorghum bicolor + * `--genome Sbi1` (Ensembl) + +* Sus scrofa + * `--genome Sscrofa10.2` (Ensembl) + * `--genome susScr3` (UCSC) + +* Zea mays + * `--genome AGPv3` (Ensembl) Note that you can use the same configuration setup to save sets of reference files for your own use, even if they are not part of the iGenomes resource. See the [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for instructions on where to save such a file. From 63f48c6772791f3671b3a4d137dda1bdf8ed3c67 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 14:09:46 +0100 Subject: [PATCH 153/179] improve tests --- .github/workflows/ci-extra.yml | 87 ---------------------- .github/workflows/ci.yml | 106 ++++++++++++++++++++++++++- Jenkinsfile | 37 ++++++---- scripts/download_image.sh | 76 -------------------- scripts/run_tests.sh | 128 --------------------------------- 5 files changed, 129 insertions(+), 305 deletions(-) delete mode 100644 .github/workflows/ci-extra.yml delete mode 100755 scripts/download_image.sh delete mode 100755 scripts/run_tests.sh diff --git a/.github/workflows/ci-extra.yml b/.github/workflows/ci-extra.yml deleted file mode 100644 index 190c7e36ef..0000000000 --- a/.github/workflows/ci-extra.yml +++ /dev/null @@ -1,87 +0,0 @@ -name: sarek extra CI -# This workflow is triggered on pushes and PRs to the repository. -on: [push, pull_request] - -jobs: - minimal: - runs-on: ubuntu-18.04 - strategy: - matrix: - genome: [smallerGRCh37, minimalGRCh37] - intervals: [--no_intervals, ''] - steps: - - uses: actions/checkout@v1 - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - env: - NXF_VER: '19.10.0' - - name: Download image - run: | - docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev - - name: Run test - run: | - nextflow run . -profile test,docker --skipQC all --verbose --genome ${{ matrix.genome }} ${{ matrix.intervals }} --tools Manta,mpileup,Strelka - profile: - runs-on: ubuntu-18.04 - strategy: - matrix: - profile: [test_splitfastq, test_targeted] - steps: - - uses: actions/checkout@v1 - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - env: - NXF_VER: '19.10.0' - - name: Download image - run: | - docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev - - name: Run test - run: | - nextflow run . -profile ${{ matrix.profile }},docker --verbose - tools: - runs-on: ubuntu-18.04 - strategy: - matrix: - tool: [Haplotypecaller, Freebayes, Manta, mpileup, Mutect2, Strelka] - steps: - - uses: actions/checkout@v1 - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - env: - NXF_VER: '19.10.0' - - name: Download image - run: | - docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev - - name: Run test - run: | - nextflow run . -profile test_tool,docker --verbose --tools ${{ matrix.tool }} - annotation: - runs-on: ubuntu-18.04 - strategy: - matrix: - annotator: [snpeff] - specie: [GRCh37] - steps: - - uses: actions/checkout@v1 - - name: Install Nextflow - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - env: - NXF_VER: '19.10.0' - - name: Download image - run: | - docker pull nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} - docker tag nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} - - name: Run test - run: | - nextflow run . -profile test_annotation,docker --verbose --tools ${{ matrix.annotator }} \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1b01846e1c..9691252722 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,4 +21,108 @@ jobs: docker tag nfcore/sarek:dev nfcore/sarek:dev - name: Run test run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker \ No newline at end of file + nextflow run ${GITHUB_WORKSPACE} -profile test,docker + annotation: + runs-on: ubuntu-18.04 + strategy: + matrix: + annotator: [snpeff] + specie: [GRCh37] + steps: + - uses: actions/checkout@v1 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.10.0' + - name: Download image + run: | + docker pull nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} + docker tag nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} + - name: Run test + run: | + nextflow run . -profile test_annotation,docker --verbose --tools ${{ matrix.annotator }} + germline: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v1 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.10.0' + - name: Download image + run: | + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev + - name: Get test data + run: | + git clone --single-branch --branch sarek https://github.com/nf-core/test-datasets.git data + - name: Run test + run: | + nextflow run --input data/testdata/tiny/normal + nextflow run --input=false --step recalibrate -resume + nextflow run --input=false --step variantCalling + minimal: + runs-on: ubuntu-18.04 + strategy: + matrix: + genome: [smallerGRCh37, minimalGRCh37] + intervals: [--no_intervals, ''] + steps: + - uses: actions/checkout@v1 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.10.0' + - name: Download image + run: | + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev + - name: Run test + run: | + nextflow run . -profile test,docker --skipQC all --verbose --genome ${{ matrix.genome }} ${{ matrix.intervals }} --tools Manta,mpileup,Strelka + profile: + runs-on: ubuntu-18.04 + strategy: + matrix: + profile: [test_splitfastq, test_targeted] + steps: + - uses: actions/checkout@v1 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.10.0' + - name: Download image + run: | + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev + - name: Run test + run: | + nextflow run . -profile ${{ matrix.profile }},docker --verbose + tools: + runs-on: ubuntu-18.04 + strategy: + matrix: + tool: [Haplotypecaller, Freebayes, Manta, mpileup, Mutect2, Strelka] + steps: + - uses: actions/checkout@v1 + - name: Install Nextflow + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + env: + NXF_VER: '19.10.0' + - name: Download image + run: | + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev + - name: Run test + run: | + nextflow run . -profile test_tool,docker --verbose --tools ${{ matrix.tool }} \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index 00c743cde2..7dc9b45a88 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,35 +8,46 @@ pipeline { stages { stage('Docker setup') { steps { - sh "./scripts/download_image.sh -n docker -t ALL --source-version dev --target-version dev -g smallGRCh37" + sh "docker pull nfcore/sarek:dev" + sh "docker tag nfcore/sarek:dev nfcore/sarek:dev" + sh "docker pull nfcore/sareksnpeff:dev.GRCh37" + sh "docker tag nfcore/sareksnpeff:dev.GRCh37 nfcore/sareksnpeff:dev.GRCh37" + sh "docker pull nfcore/sarekvep:dev.GRCh37" + sh "docker tag nfcore/sarekvep:dev.GRCh37 nfcore/sarekvep:dev.GRCh37" + } + } + stage('Annotation') { + steps { + sh "nextflow run . -profile test_annotation,docker --verbose --tools snpeff,vep,merge" } } stage('Germline') { steps { sh "rm -rf data/" sh "git clone --single-branch --branch sarek https://github.com/nf-core/test-datasets.git data" - sh "./scripts/run_tests.sh --profile kraken --test GERMLINE --no-reports" + sh "nextflow run --input data/testdata/tiny/normal" + sh "nextflow run --input=false --step recalibrate -resume" + sh "nextflow run --input=false --step variantCalling" sh "rm -rf data/" } } - stage('Somatic') { + stage('Minimal') { steps { - sh "./scripts/run_tests.sh --profile kraken --test SOMATIC --no-reports" + sh "nextflow run . -profile test,docker --skipQC all --verbose --genome smallerGRCh37 --no_intervals --tools Manta,mpileup,Strelka" + sh "nextflow run . -profile test,docker --skipQC all --verbose --genome smallerGRCh37 --tools Manta,mpileup,Strelka" + sh "nextflow run . -profile test,docker --skipQC all --verbose --genome minimalGRCh37 --no_intervals --tools Manta,mpileup,Strelka" + sh "nextflow run . -profile test,docker --skipQC all --verbose --genome minimalGRCh37 --tools Manta,mpileup,Strelka" } } - stage('Targeted') { - steps { - sh "./scripts/run_tests.sh --profile kraken --test TARGETED --no-reports" - } - } - stage('Annotation') { + stage('Profile') { steps { - sh "./scripts/run_tests.sh --profile kraken --test ANNOTATEBOTH --no-reports" + sh "nextflow run . -profile test_splitfastq,docker --verbose" + sh "nextflow run . -profile test_targeted,docker --verbose" } } - stage('Multiple') { + stage('Tools') { steps { - sh "./scripts/run_tests.sh --profile kraken --test MULTIPLE" + sh "nextflow run . -profile test_tool,docker --verbose --tools Haplotypecaller,Freebayes,Manta,mpileup,Mutect2,Strelka" } } } diff --git a/scripts/download_image.sh b/scripts/download_image.sh deleted file mode 100755 index b2955c240b..0000000000 --- a/scripts/download_image.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/bin/bash -set -xeuo pipefail - -# This script download and tag image for sarek tests - -usage() { echo "Usage: $0 <-t test|annotation tool> <-n engine> <-S version to pull/build> <-T version to tag> <-g genome>" 1>&2; exit 1; } - -ENGINE=docker -GENOME=GRCh37 -NXF_SINGULARITY_CACHEDIR=${NXF_SINGULARITY_CACHEDIR:-work/singularity/.} -TEST=ALL -VERSION=dev -TARGETVERSION=${VERSION} - -while [[ $# -gt 0 ]] -do - key=$1 - case $key in - -g|--genome) - GENOME=$2 - shift # past argument - shift # past value - ;; - -n|--engine) - ENGINE=$2 - shift # past argument - shift # past value - ;; - -T|--target-version) - TARGETVERSION=$2 - shift # past argument - shift # past value - ;; - -S|--source-version) - VERSION=$2 - shift # past argument - shift # past value - ;; - -t|--test|--tool) - TEST=$2 - shift # past argument - shift # past value - ;; - *) # unknown option - usage - shift # past argument - ;; - esac -done - -get_image(){ - CONTAINER=$1 - SOURCE=$2 - TARGET=$3 - if [[ docker =~ $ENGINE ]] - then - docker pull nfcore/${1}:${2} - docker tag nfcore/${1}:${2} nfcore/${1}:${3} - elif [[ singularity =~ $ENGINE ]] - then - mkdir -p ${NXF_SINGULARITY_CACHEDIR} - singularity build ${NXF_SINGULARITY_CACHEDIR}/nfcore-${1}-${3}.img docker://nfcore/${1}:${2} - fi -} - -if [[ ALL,ANNOTATEBOTH,ANNOTATESNPEFF,SNPEFF =~ $TEST ]] -then - get_image sareksnpeff ${VERSION}.${GENOME} ${TARGETVERSION}.${GENOME} -fi - -if [[ ALL,ANNOTATEBOTH,ANNOTATEVEP,VEP =~ $TEST ]] -then - get_image sarekvep ${VERSION}.${GENOME} ${TARGETVERSION}.${GENOME} -fi - -get_image sarek ${VERSION} ${TARGETVERSION} \ No newline at end of file diff --git a/scripts/run_tests.sh b/scripts/run_tests.sh deleted file mode 100755 index 00c6d30ef5..0000000000 --- a/scripts/run_tests.sh +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/bash -set -xeuo pipefail - -# This script run sarek tests -# https://github.com/nf-core/test-datasets/raw/sarek - -usage() { echo "Usage: $0 <-p profile> <-t test> <-c cpus> <-n> <-v> <-m memory>" 1>&2; exit 1; } - -CPUS=2 -LOGS='' -MEMORY='6.GB' -NXF_SINGULARITY_CACHEDIR=${NXF_SINGULARITY_CACHEDIR:-work/singularity/.} -OFFLINE=false -PROFILE=docker -REPORTS='' -TEST=MULTIPLE -TRAVIS=${TRAVIS:-false} -TRAVIS_BUILD_DIR=${TRAVIS_BUILD_DIR:-.} -VERBOSE='' - -while [[ $# -gt 0 ]] -do - key=$1 - case $key in - -c|--cpus) - CPUS=$2 - shift # past value - ;; - -m|--memory) - MEMORY=$2 - shift # past argument - shift # past value - ;; - -n|--no-logs) - LOGS=true - shift # past value - ;; - --no-reports) - REPORTS="--skipQC all" - shift # past value - ;; - --offline) - OFFLINE=true - shift # past value - ;; - -p|--profile) - PROFILE=$2 - shift # past argument - shift # past value - ;; - -t|--test) - TEST=$2 - shift # past argument - shift # past value - ;; - -v|--verbose) - VERBOSE="-ansi-log false -dump-channels" - shift # past value - ;; - *) # unknown option - usage - shift # past argument - ;; - esac -done - -function manage_logs() { - if [[ $LOGS ]] - then - rm -rf .nextflow* results/ work/ - fi -} - -function run_sarek() { - nextflow run ${TRAVIS_BUILD_DIR}/main.nf -profile test,${PROFILE} ${VERBOSE} --monochrome_logs ${REPORTS} --max_memory ${MEMORY} $@ -} - -if [[ $OFFLINE == false ]] -then - PATHTOSAMPLE="https://github.com/nf-core/test-datasets/raw/sarek/testdata" - SUFFIX="-https" -else - PATHTOSAMPLE="data/testdata" - SUFFIX="" -fi - -if [[ $TEST == "GERMLINE" ]] && [[ $OFFLINE == false ]] -then - rm -rf data - git clone --single-branch --branch sarek https://github.com/nf-core/test-datasets.git data -fi - -case $TEST in - ANNOTATEBOTH) - ANNOTATOR="merge,snpEFF,VEP" - TEST=ANNOTATE - ;; - ANNOTATESNPEFF) - ANNOTATOR="snpEFF" - TEST=ANNOTATE - ;; - ANNOTATEVEP) - ANNOTATOR="VEP" - TEST=ANNOTATE - ;; -esac - -case $TEST in - GERMLINE) - run_sarek --tools=false --input data/testdata/tiny/normal - run_sarek --tools=false --input results/Preprocessing/TSV/duplicateMarked.tsv --step recalibrate -resume - run_sarek --tools HaplotypeCaller --input results/Preprocessing/TSV/recalibrated.tsv --step variantCalling - ;; - MINIMAL) - run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 - run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome smallerGRCh37 --noIntervals -resume - run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 -resume - run_sarek --tools manta,Mpileup,strelka --input ${PATHTOSAMPLE}/tsv/tiny-manta-normal${SUFFIX}.tsv --genome minimalGRCh37 --noIntervals -resume - ;; - MULTIPLE) - run_sarek --tools FreeBayes,HaplotypeCaller,Manta,Mpileup,Strelka,snpEff,VEP,merge --input ${PATHTOSAMPLE}/tsv/tiny-multiple${SUFFIX}.tsv - ;; -esac - -if [[ $TEST == "GERMLINE" ]] && [[ $OFFLINE == false ]] -then - rm -rf data -fi From 21e2b3aca6572a5969ddff736e1d1f42f92ea26d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 14:10:02 +0100 Subject: [PATCH 154/179] update docs --- docs/annotation.md | 8 ++-- docs/containers.md | 100 ++++++++++++++++++++++++++++++++++----------- docs/use_cases.md | 12 +++--- 3 files changed, 87 insertions(+), 33 deletions(-) diff --git a/docs/annotation.md b/docs/annotation.md index 2d954f3ac8..8500a6d59e 100644 --- a/docs/annotation.md +++ b/docs/annotation.md @@ -36,8 +36,8 @@ The cache will only be used when `--annotation_cache` and cache directories are Example: ```bash -nextflow run nf-core/sarek/main.nf --tools snpEff --step annotate --sample file.vcf.gz --snpEff_cache /Path/To/snpEffCache --annotation_cache -nextflow run nf-core/sarek/main.nf --tools VEP --step annotate --sample file.vcf.gz --vep_cache /Path/To/vepCache --annotation_cache +nextflow run nf-core/sarek --tools snpEff --step annotate --sample file.vcf.gz --snpEff_cache /Path/To/snpEffCache --annotation_cache +nextflow run nf-core/sarek --tools VEP --step annotate --sample file.vcf.gz --vep_cache /Path/To/vepCache --annotation_cache ``` ## Using VEP CADD plugin @@ -51,7 +51,7 @@ To enable the use of the VEP CADD plugin: Example: ```bash -nextflow run nf-core/sarek/main.nf --step annotate --tools VEP --sample file.vcf.gz --cadd_cache \ +nextflow run nf-core/sarek --step annotate --tools VEP --sample file.vcf.gz --cadd_cache \ --cadd_InDels /PathToCADD/InDels.tsv.gz \ --cadd_InDels_tbi /PathToCADD/InDels.tsv.gz.tbi \ --cadd_WG_SNVs /PathToCADD/whole_genome_SNVs.tsv.gz \ @@ -76,5 +76,5 @@ To enable the use of the VEP GeneSplicer plugin: Example: ```bash -nextflow run nf-core/sarek/main.nf --step annotate --tools VEP --sample file.vcf.gz --genesplicer +nextflow run nf-core/sarek --step annotate --tools VEP --sample file.vcf.gz --genesplicer ``` diff --git a/docs/containers.md b/docs/containers.md index b75d74db9a..6dfd8edae2 100644 --- a/docs/containers.md +++ b/docs/containers.md @@ -48,42 +48,96 @@ For annotation, the main container can be used, but the cache has to be download - Contain **[VEP](https://github.com/Ensembl/ensembl-vep)** 98.2 - Contain cache for `GRCh37`, `GRCh38`, `GRCm38` or `CanFam3.1` -## Using helper script +## Building your own -A helper script, used for testing can also be used to help with pulling docker containers, or building singularity images. -The following parameters can be used: +Our containers are designed using [Conda](https://conda.io/). +The [`environment.yml`](../environment.yml) file can be modified if particular versions of tools are more suited to your needs. -### Engine: -n +The following commands can be used to build/download containers on your own system: -Specify which container engine to use: `docker` or `singularity`. -Default:`docker` +- Adjust `VERSION` for sarek version (typically a release or `dev`). -### Containers: -c +### Build with Conda -Specify which containers to build: `SNPEFF`, `VEP` or `ALL`. -Default:`ALL` +```Bash +conda env create -f environment.yml +``` -### Version: -T +### Build with Docker -Specify which release to pull or build: any tagged release, or `dev`. -Default:`dev` +- `sarek` -### Genome: -g +```Bash +docker build -t nfcore/sarek: . +``` -Specify which release genome to use for annotation containers (`sareksnpeff`, `sarekvep`): `smallGRCh37`, `GRCh37`, `GRCh38`, `GRCm38` or `CanFam3.1`. -Default:`smallGRCh37` +- `sareksnpeff` -### Singularity +Adjust arguments for `GENOME` version and snpEff `CACHE_VERSION` -To specify where to build singularity image, use the Nextflow ENV variable `NXF_SINGULARITY_CACHEDIR`, ie: +```Bash +docker build -t nfcore/sareksnpeff:. containers/snpeff/. --build-arg GENOME= --build-arg CACHE_VERSION= +``` -```bash -NXF_SINGULARITY_CACHEDIR=/data/singularity ./scripts/download_image.sh -n singularity -t ALL -T dev -g GRCh38 +- `sarekvep` + +Adjust arguments for `GENOME` version, `SPECIES` name and VEP `VEP_VERSION` + +```Bash +docker build -t nfcore/sarekvep:. containers/vep/. --build-arg GENOME= --build-arg SPECIES= --build-arg VEP_VERSION= ``` -That will build the main container, plus the annotation containers (`sareksnpeff`, `sarekvep`) for `GRCh38`, in the `/data/singularity` folder. +### Pull with Docker -## Building your own +- `sarek` -Our containers are designed using [Conda](https://conda.io/). -The `environment.yml` file can easilly be modified if particular versions of tools are more suited to your needs. +```Bash +docker pull nfcore/sarek: +``` + +- `sareksnpeff` + +Adjust arguments for `GENOME` version + +```Bash +docker pull nfcore/sareksnpeff:. +``` + +- `sarekvep` + +Adjust arguments for `GENOME` version + +```Bash +docker pull nfcore/sarekvep:. +``` + +### Pull with Singularity + +You can directly pull singularity image, in the path used by the Nextflow ENV variable `NXF_SINGULARITY_CACHEDIR`, ie: + +```Bash +cd $NXF_SINGULARITY_CACHEDIR +singularity build ... +``` + +- `sarek` + +```Bash +singularity build nfcore-sarek-.img docker://nfcore/sarek: +``` + +- `sareksnpeff` + +Adjust arguments for `GENOME` version + +```Bash +singularity build nfcore-sareksnpeff-..img docker://nfcore/sareksnpeff:. +``` + +- `sarekvep` + +Adjust arguments for `GENOME` version + +```Bash +singularity build nfcore-sarekvep-..img docker://nfcore/sarekvep:. +``` diff --git a/docs/use_cases.md b/docs/use_cases.md index 2491ad69e6..f94400735a 100644 --- a/docs/use_cases.md +++ b/docs/use_cases.md @@ -5,7 +5,7 @@ Using the `mapping` directive one will have a pair of mapped, deduplicated and r This is the usual option you have to give when you are starting from raw FASTQ data: ```bash -nextflow run nf-core/sarek/main.nf --input mysample.tsv --tools +nextflow run nf-core/sarek --input mysample.tsv --tools ``` `mapping` will start by default, you do not have to give any additional parameters, only the TSV file describing the sample (see below). @@ -20,7 +20,7 @@ Also, older version are renamed with incremented numbers. The workflow should be started in this case with the smallest set of options as written above: ```bash -nextflow run nf-core/sarek/main.nf --input mysample.tsv --tools +nextflow run nf-core/sarek --input mysample.tsv --tools ``` The TSV file should look like: @@ -36,7 +36,7 @@ See the [input files documentation](docs/input.md) for more information. The `--input` option can be also used to point Sarek to a directory with FASTQ files: ```bash -nextflow run nf-core/sarek/main.nf --input path/to/FASTQ/files --tools +nextflow run nf-core/sarek --input path/to/FASTQ/files --tools ``` The given directory is searched recursively for FASTQ files that are named `*_R1_*.fastq.gz`, and a matching pair with the same name except `_R2_` instead of `_R1_` is expected to exist alongside. @@ -78,7 +78,7 @@ See the [input files documentation](docs/input.md) for more information. ## Starting from recalibration ```bash -nextflow run nf-core/sarek/main.nf --input mysample.tsv --step recalibrate --tools +nextflow run nf-core/sarek --input mysample.tsv --step recalibrate --tools ``` And the corresponding TSV file should be like: @@ -97,7 +97,7 @@ See the [input files documentation](docs/input.md) for more information. At this step we are assuming that all the required preprocessing is over, we only want to run variant callers or other tools using recalibrated BAM files. ```bash -nextflow run nf-core/sarek/main.nf --step variantcalling --tools +nextflow run nf-core/sarek --step variantcalling --tools ``` And the corresponding TSV file should be like: @@ -121,5 +121,5 @@ It is adviced to pad the variant calling regions (exons or the target) to some e To add the target BED file configure the flow like: ```bash -nextflow run nf-core/sarek/main.nf --tools haplotypecaller,strelka,mutect2 --targetBED targets.bed --input my_panel.tsv +nextflow run nf-core/sarek --tools haplotypecaller,strelka,mutect2 --targetBED targets.bed --input my_panel.tsv ``` From bdec00559c99309fa52184556b20fa81d003fc38 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 15:25:24 +0100 Subject: [PATCH 155/179] update CHANGELOG --- CHANGELOG.md | 4 ++++ README.md | 1 - downloadcache.nf | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55e65e46cd..a52ada6b0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,10 +35,14 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a - [#60](https://github.com/nf-core/sarek/pull/60) - Update documentation - [#71](https://github.com/nf-core/sarek/pull/71) - Update `README` - [#71](https://github.com/nf-core/sarek/pull/71) - Update `CHANGELOG` +- [#74](https://github.com/nf-core/sarek/pull/74) - Update docs +- [#74](https://github.com/nf-core/sarek/pull/74) - Improve CI tests (both Jenkins and GitHub actions tests) +- [#74](https://github.com/nf-core/sarek/pull/74) - Move all ci from `ci-extra.yml` to `ci.yml` ### `Removed` - [#46](https://github.com/nf-core/sarek/pull/46) - Remove mention of old `build.nf` script which was included in `main.nf` +- [#74](https://github.com/nf-core/sarek/pull/74) - Remove `download_image.sh` and `run_tests.sh` scripts ### `Fixed` diff --git a/README.md b/README.md index 8651fb0812..e42c1f74de 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,6 @@ [![DOI](https://zenodo.org/badge/184289291.svg)](https://zenodo.org/badge/latestdoi/184289291) [![GitHub Actions CI status](https://github.com/nf-core/sarek/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+CI%22) -[![GitHub Actions extra-CI status](https://github.com/nf-core/sarek/workflows/nf-core%20extra%20CI/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+extra+CI%22) [![GitHub Actions Linting status](https://github.com/nf-core/sarek/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/sarek/actions?query=workflow%3A%22sarek+linting%22) [![CircleCi build status](https://img.shields.io/circleci/project/github/nf-core/sarek?logo=circleci)](https://circleci.com/gh/nf-core/sarek/) diff --git a/downloadcache.nf b/downloadcache.nf index 8e758391d5..00bfbbb775 100644 --- a/downloadcache.nf +++ b/downloadcache.nf @@ -54,7 +54,7 @@ params.build = null params.offline = null params.cadd_cache = null params.cadd_version = 'v1.5' -params.genome = 'smallGRCh37' +params.genome = 'GRCh37' params.snpEff_cache = null params.vep_cache = null From 20c2a44752e26816d7aefee7c2fe7dfe07255654 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 15:26:06 +0100 Subject: [PATCH 156/179] improve script --- downloadcache.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/downloadcache.nf b/downloadcache.nf index 00bfbbb775..1a1048a7e8 100644 --- a/downloadcache.nf +++ b/downloadcache.nf @@ -182,7 +182,7 @@ process BuildCache_VEP { when: params.vep_cache && params.download_cache && !params.offline script: - genome = params.genome == "smallGRCh37" ? "GRCh37" : params.genome + genome = params.genome species = genome =~ "GRCh3*" ? "homo_sapiens" : genome =~ "GRCm3*" ? "mus_musculus" : "" """ vep_install \ From d90d0b7fd193b38ae8ddbe2bea17be37cb67efcf Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 15:30:38 +0100 Subject: [PATCH 157/179] fix tests --- .github/workflows/ci.yml | 6 +++--- Jenkinsfile | 22 +++++++++++----------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9691252722..aa6edd447d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -62,9 +62,9 @@ jobs: git clone --single-branch --branch sarek https://github.com/nf-core/test-datasets.git data - name: Run test run: | - nextflow run --input data/testdata/tiny/normal - nextflow run --input=false --step recalibrate -resume - nextflow run --input=false --step variantCalling + nextflow run . -profile test,docker --input data/testdata/tiny/normal + nextflow run . -profile test,docker --input=false --step recalibrate -resume + nextflow run . -profile test,docker --input=false --step variantCalling minimal: runs-on: ubuntu-18.04 strategy: diff --git a/Jenkinsfile b/Jenkinsfile index 7dc9b45a88..2a26fd3d5f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -18,36 +18,36 @@ pipeline { } stage('Annotation') { steps { - sh "nextflow run . -profile test_annotation,docker --verbose --tools snpeff,vep,merge" + sh "nextflow run . -profile test_annotation,kraken --verbose --tools snpeff,vep,merge" } } stage('Germline') { steps { sh "rm -rf data/" sh "git clone --single-branch --branch sarek https://github.com/nf-core/test-datasets.git data" - sh "nextflow run --input data/testdata/tiny/normal" - sh "nextflow run --input=false --step recalibrate -resume" - sh "nextflow run --input=false --step variantCalling" + sh "nextflow run . -profile test,kraken --input data/testdata/tiny/normal" + sh "nextflow run . -profile test,kraken --input=false --step recalibrate -resume" + sh "nextflow run . -profile test,kraken --input=false --step variantCalling" sh "rm -rf data/" } } stage('Minimal') { steps { - sh "nextflow run . -profile test,docker --skipQC all --verbose --genome smallerGRCh37 --no_intervals --tools Manta,mpileup,Strelka" - sh "nextflow run . -profile test,docker --skipQC all --verbose --genome smallerGRCh37 --tools Manta,mpileup,Strelka" - sh "nextflow run . -profile test,docker --skipQC all --verbose --genome minimalGRCh37 --no_intervals --tools Manta,mpileup,Strelka" - sh "nextflow run . -profile test,docker --skipQC all --verbose --genome minimalGRCh37 --tools Manta,mpileup,Strelka" + sh "nextflow run . -profile test,kraken --skipQC all --verbose --genome smallerGRCh37 --no_intervals --tools Manta,mpileup,Strelka" + sh "nextflow run . -profile test,kraken --skipQC all --verbose --genome smallerGRCh37 --tools Manta,mpileup,Strelka" + sh "nextflow run . -profile test,kraken --skipQC all --verbose --genome minimalGRCh37 --no_intervals --tools Manta,mpileup,Strelka" + sh "nextflow run . -profile test,kraken --skipQC all --verbose --genome minimalGRCh37 --tools Manta,mpileup,Strelka" } } stage('Profile') { steps { - sh "nextflow run . -profile test_splitfastq,docker --verbose" - sh "nextflow run . -profile test_targeted,docker --verbose" + sh "nextflow run . -profile test_splitfastq,kraken --verbose" + sh "nextflow run . -profile test_targeted,kraken --verbose" } } stage('Tools') { steps { - sh "nextflow run . -profile test_tool,docker --verbose --tools Haplotypecaller,Freebayes,Manta,mpileup,Mutect2,Strelka" + sh "nextflow run . -profile test_tool,kraken --verbose --tools Haplotypecaller,Freebayes,Manta,mpileup,Mutect2,Strelka" } } } From 5355c1ea63a55b98da2eafb315ab46540d35a9ea Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 15:36:26 +0100 Subject: [PATCH 158/179] better comments --- .github/workflows/ci.yml | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa6edd447d..89ee9f46d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -36,11 +36,13 @@ jobs: sudo mv nextflow /usr/local/bin/ env: NXF_VER: '19.10.0' - - name: Download image + - name: Download and tag images run: | + docker pull nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:dev docker pull nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} docker tag nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} - - name: Run test + - name: Run annotation test run: | nextflow run . -profile test_annotation,docker --verbose --tools ${{ matrix.annotator }} germline: @@ -53,14 +55,14 @@ jobs: sudo mv nextflow /usr/local/bin/ env: NXF_VER: '19.10.0' - - name: Download image + - name: Download and tag image run: | docker pull nfcore/sarek:dev docker tag nfcore/sarek:dev nfcore/sarek:dev - name: Get test data run: | git clone --single-branch --branch sarek https://github.com/nf-core/test-datasets.git data - - name: Run test + - name: Run germline test run: | nextflow run . -profile test,docker --input data/testdata/tiny/normal nextflow run . -profile test,docker --input=false --step recalibrate -resume @@ -79,11 +81,11 @@ jobs: sudo mv nextflow /usr/local/bin/ env: NXF_VER: '19.10.0' - - name: Download image + - name: Download and tag image run: | docker pull nfcore/sarek:dev docker tag nfcore/sarek:dev nfcore/sarek:dev - - name: Run test + - name: Run test for minimal genomes run: | nextflow run . -profile test,docker --skipQC all --verbose --genome ${{ matrix.genome }} ${{ matrix.intervals }} --tools Manta,mpileup,Strelka profile: @@ -99,11 +101,11 @@ jobs: sudo mv nextflow /usr/local/bin/ env: NXF_VER: '19.10.0' - - name: Download image + - name: Download and tag image run: | docker pull nfcore/sarek:dev docker tag nfcore/sarek:dev nfcore/sarek:dev - - name: Run test + - name: Run targeted and splitfastq tests run: | nextflow run . -profile ${{ matrix.profile }},docker --verbose tools: @@ -119,10 +121,10 @@ jobs: sudo mv nextflow /usr/local/bin/ env: NXF_VER: '19.10.0' - - name: Download image + - name: Download and tag image run: | docker pull nfcore/sarek:dev docker tag nfcore/sarek:dev nfcore/sarek:dev - - name: Run test + - name: Run vriant calling test on specific tools run: | nextflow run . -profile test_tool,docker --verbose --tools ${{ matrix.tool }} \ No newline at end of file From dc043d0019a739fe6e1327a5c8c3398e18d37fc2 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 16:10:42 +0100 Subject: [PATCH 159/179] better comments --- main.nf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 7276c2f0bf..6ce7efc521 100644 --- a/main.nf +++ b/main.nf @@ -1431,10 +1431,13 @@ bamQCReport = bamQCReport.dump(tag:'BamQC') ================================================================================ */ +// When using sentieon for mapping, Channel bamRecal is bamRecalSentieon if (params.sentieon && step == 'mapping') bamRecal = bamRecalSentieon -bamRecal = params.knownIndels ? bamRecal : indexedBam +// When no knownIndels for mapping, Channel bamRecal is indexedBam +bamRecal = (params.knownIndels && step == 'mapping') ? bamRecal : indexedBam +// When starting with variant calling, Channel bamRecal is inputSample if (step == 'variantcalling') bamRecal = inputSample bamRecal = bamRecal.dump(tag:'BAM') From 68571f41bb110fbd5b60e61eac6021833784607b Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 16:13:42 +0100 Subject: [PATCH 160/179] fix error on channel name --- main.nf | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/main.nf b/main.nf index 6ce7efc521..4a42883a38 100644 --- a/main.nf +++ b/main.nf @@ -755,13 +755,13 @@ fastQCReport = fastQCReport.dump(tag:'FastQC') // STEP 1: MAPPING READS TO REFERENCE GENOME WITH BWA MEM -inputReads = inputReads.dump(tag:'INPUT') +inputPairReads = inputPairReads.dump(tag:'INPUT') -inputReads = inputPairReads.mix(inputBam) +inputPairReads = inputPairReads.mix(inputBam) -(inputReads, inputReadsSentieon) = inputReads.into(2) -if (params.sentieon) inputReads.close() -else inputReadsSentieon.close() +(inputPairReads, inputPairReadsSentieon) = inputPairReads.into(2) +if (params.sentieon) inputPairReads.close() +else inputPairReadsSentieon.close() process MapReads { label 'cpus_max' @@ -769,7 +769,7 @@ process MapReads { tag {idPatient + "-" + idRun} input: - set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputReads + set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputPairReads file(bwaIndex) from ch_bwaIndex file(fasta) from ch_fasta file(fastaFai) from ch_fastaFai @@ -822,7 +822,7 @@ process SentieonMapReads { tag {idPatient + "-" + idRun} input: - set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputReadsSentieon + set idPatient, idSample, idRun, file(inputFile1), file(inputFile2) from inputPairReadsSentieon file(bwaIndex) from ch_bwaIndex file(fasta) from ch_fasta file(fastaFai) from ch_fastaFai From 4286ef33d17279aad1df1c69cb045aca7ec2d877 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Mon, 9 Dec 2019 16:40:52 +0100 Subject: [PATCH 161/179] fix output for MergeBamRecal --- main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.nf b/main.nf index 4a42883a38..664975d474 100644 --- a/main.nf +++ b/main.nf @@ -1295,7 +1295,7 @@ process MergeBamRecal { set idPatient, idSample, file(bam) from bamMergeBamRecal output: - set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecal + set idPatient, idSample, file("${idSample}.recal.bam") into bamRecal set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalQC set idPatient, idSample into bamRecalTSV From 77de22886778f0713e8bbbc7d3d1ec71df8eb5ab Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 10 Dec 2019 09:45:14 +0100 Subject: [PATCH 162/179] fix MergeBamRecal output --- main.nf | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/main.nf b/main.nf index 664975d474..997cd9c318 100644 --- a/main.nf +++ b/main.nf @@ -1295,7 +1295,7 @@ process MergeBamRecal { set idPatient, idSample, file(bam) from bamMergeBamRecal output: - set idPatient, idSample, file("${idSample}.recal.bam") into bamRecal + set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bam.bai") into bamRecal set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalQC set idPatient, idSample into bamRecalTSV @@ -1321,7 +1321,7 @@ process IndexBamRecal { set idPatient, idSample, file("${idSample}.recal.bam") from bamMergeBamRecalNoInt output: - set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bai") into bamRecalNoInt + set idPatient, idSample, file("${idSample}.recal.bam"), file("${idSample}.recal.bam.bai") into bamRecalNoInt set idPatient, idSample, file("${idSample}.recal.bam") into bamRecalQCnoInt set idPatient, idSample into bamRecalTSVnoInt @@ -1330,7 +1330,6 @@ process IndexBamRecal { script: """ samtools index ${idSample}.recal.bam - mv ${idSample}.recal.bam.bai ${idSample}.recal.bai """ } From 72fb6027ef32f87d4de4d20eb293e7424dade1aa Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 10 Dec 2019 09:52:56 +0100 Subject: [PATCH 163/179] fix TSV file --- main.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.nf b/main.nf index 997cd9c318..1265c244f8 100644 --- a/main.nf +++ b/main.nf @@ -1345,7 +1345,7 @@ bamRecalTSV.map { idPatient, idSample -> gender = genderMap[idPatient] status = statusMap[idPatient, idSample] bam = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bai" + bai = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bam.bai" "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n" }.collectFile( name: 'recalibrated.tsv', sort: true, storeDir: "${params.outdir}/Preprocessing/TSV" @@ -1357,7 +1357,7 @@ bamRecalSampleTSV status = statusMap[idPatient, idSample] gender = genderMap[idPatient] bam = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bam" - bai = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bai" + bai = "${params.outdir}/Preprocessing/${idSample}/Recalibrated/${idSample}.recal.bam.bai" ["recalibrated_${idSample}.tsv", "${idPatient}\t${gender}\t${status}\t${idSample}\t${bam}\t${bai}\n"] } From d896596d6bb6f6fc89b6f3a16063e138655757b1 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 10 Dec 2019 11:29:29 +0100 Subject: [PATCH 164/179] update comments and docs --- docs/output.md | 557 ++++++++++++++++++++++++++++--------------------- docs/usage.md | 423 +++++++++++++++++++------------------ main.nf | 16 +- 3 files changed, 542 insertions(+), 454 deletions(-) diff --git a/docs/output.md b/docs/output.md index 58f9af63a2..3c62b97abb 100644 --- a/docs/output.md +++ b/docs/output.md @@ -1,72 +1,97 @@ -# nf-core/sarek: Output +# nf-core/sarek: Output This document describes the output produced by the pipeline. -## Pipeline overview +## Pipeline overview The pipeline processes data using the following steps: -1. [**Preprocessing**](#Preprocessing) _(based on [GATK best practices](https://software.broadinstitute.org/gatk/best-practices/))_ - * Map reads to Reference - * `BWA mem` - * Mark Duplicates - * `GATK MarkDuplicates` - * Base (Quality Score) Recalibration - * `GATK BaseRecalibrator` - * `GATK GatherBQSRReports` - * `GATK ApplyBQSR` -2. [**Variant calling**](#Variant-Calling) - * SNVs and small indels - * [`FreeBayes`](#FreeBayes) - * [`GATK HaplotypeCaller`](#HaplotypeCaller) - * [`GATK GenotypeGVCFs`](#GenotypeGVCFs) - * [`GATK Mutect2`](#Mutect2) - * [`Strelka2`](#Strelka2) - * Structural variants - * [`Manta`](#Manta) - * [`TIDDIT`](#TIDDIT) - * Sample heterogeneity, ploidy and CNVs - * `alleleCounter` - * [`ConvertAlleleCounts`](#ConvertAlleleCounts) - * [`ASCAT`](#ASCAT) - * [`samtools mpileup`](#mpileup) - * [`Control-FREEC`](#Control-FREEC) -3. [**Annotation**](#Annotation) - * Variant annotation - * [`snpEff`](#snpEff) - * [`VEP` (Variant Effect Predictor)](#VEP) -4. [**QC and Reporting**](#QC-and-reporting) - * QC - * [`FastQC`](#FastQC) - * [`Qualimap bamqc`](#bamQC) - * [`GATK MarkDuplicates`](#MarkDuplicates-reports) - * [`samtools stats`](#Samtools-stats) - * [`bcftools stats`](#bcftools-stats) - * [`VCFtools`](#VCFtools) - * [`snpeff`](#snpEff-reports) - * [`VEP`](#snpEff-reports) - * Reporting - * [`MultiQC`](#MultiQC) +- [Preprocessing](#preprocessing) + - [Map to Reference](#map-to-reference) + - [BWA mem](#bwa-mem) + - [Mark Duplicates](#mark-duplicates) + - [GATK MarkDuplicates](#gatk-markduplicates) + - [Base (Quality Score) Recalibration](#base-quality-score-recalibration) + - [GATK BaseRecalibrator](#gatk-baserecalibrator) + - [GATK ApplyBQSR](#gatk-applybqsr) + - [TSV files](#tsv-files) +- [Variant Calling](#variant-calling) + - [SNVs and small indels](#snvs-and-small-indels) + - [FreeBayes](#freebayes) + - [GATK HaplotypeCaller](#gatk-haplotypecaller) + - [GATK GenotypeGVCFs](#gatk-genotypegvcfs) + - [GATK Mutect2](#gatk-mutect2) + - [samtools mpileup](#samtools-mpileup) + - [Strelka2](#strelka2) + - [Sentieon DNAseq](#sentieon-dnaseq) + - [Sentieon DNAscope](#sentieon-dnascope) + - [Sentieon TNscope](#sentieon-tnscope) + - [Structural Variants](#structural-variants) + - [Manta](#manta) + - [TIDDIT](#tiddit) + - [Sentieon DNAscope SV](#sentieon-dnascope-sv) + - [Sample heterogeneity, ploidy and CNVs](#sample-heterogeneity-ploidy-and-cnvs) + - [ConvertAlleleCounts](#convertallelecounts) + - [ASCAT](#ascat) + - [Control-FREEC](#control-freec) +- [Variant annotation](#variant-annotation) + - [snpEff](#snpeff) + - [VEP](#vep) +- [QC and reporting](#qc-and-reporting) + - [QC](#qc) + - [FastQC](#fastqc) + - [bamQC](#bamqc) + - [MarkDuplicates reports](#markduplicates-reports) + - [samtools stats](#samtools-stats) + - [bcftools stats](#bcftools-stats) + - [VCFtools](#vcftools) + - [snpEff reports](#snpeff-reports) + - [VEP reports](#vep-reports) + - [Reporting](#reporting) + - [MultiQC](#multiqc) ## Preprocessing Sarek preprocesses raw FastQ files or unmapped BAM files, based on [GATK best practices](https://software.broadinstitute.org/gatk/best-practices/). -BAM files with Recalibration tables can also be used as an input to start with the recalibration of said BAM files, for more information see [TSV files output information](#TSV-files) +BAM files with Recalibration tables can also be used as an input to start with the recalibration of said BAM files, for more information see [TSV files output information](#tsv-files) -### Duplicate Marked BAM file(s) with Recalibration Table(s) +### Map to Reference -This directory is the location for the BAM files delivered to users. Besides the duplicate marked BAM files, the recalibration tables (`*.recal.table`) are also stored, and can be used to create base recalibrated files. +#### BWA mem + +[BWA mem](http://bio-bwa.sourceforge.net/) is a software package for mapping low-divergent sequences against a large reference genome. + +Such files are intermediate and not kept in the final files delivered to users. + +### Mark Duplicates + +#### GATK MarkDuplicates + +[GATK MarkDuplicates](https://software.broadinstitute.org/gatk/documentation/tooldocs/4.1.4.0/picard_sam_markduplicates_MarkDuplicates.php) locates and tags duplicate reads in a BAM or SAM file, where duplicate reads are defined as originating from a single fragment of DNA. + +This directory is the location for the BAM files delivered to users. +Besides the duplicate marked BAM files, the recalibration tables (`*.recal.table`) are also stored, and can be used to create base recalibrated files. For further reading and documentation see the [data pre-processing workflow from the GATK best practices](https://software.broadinstitute.org/gatk/best-practices/workflow?id=11165). For all samples: **Output directory: `results/Preprocessing/[SAMPLE]/DuplicateMarked`** -* `[SAMPLE].md.bam`, `[SAMPLE].md.bai` and `[SAMPLE].recal.table` - * BAM file and index with Recalibration Table +- `[SAMPLE].md.bam`, `[SAMPLE].md.bai` and `[SAMPLE].recal.table` + - BAM file and index with Recalibration Table + +### Base (Quality Score) Recalibration + +#### GATK BaseRecalibrator + +[GATK BaseRecalibrator](https://software.broadinstitute.org/gatk/documentation/tooldocs/current/org_broadinstitute_hellbender_tools_walkers_bqsr_BaseRecalibrator.php) generates a recalibration table based on various covariates. -### Recalibrated BAM file(s) +Such files are intermediate and not kept in the final files delivered to users. + +#### GATK ApplyBQSR + +[GATK ApplyBQSR](https://software.broadinstitute.org/gatk/documentation/tooldocs/current/org_broadinstitute_hellbender_tools_walkers_bqsr_ApplyBQSR.php) recalibrates the base qualities of the input reads based on the recalibration table produced by the [`BaseRecalibrator`](#gatk-baserecalibrator) tool. This directory is usually empty, it is the location for the final recalibrated BAM files. Recalibrated BAM files are usually 2-3 times larger than the duplicate marked BAM files. @@ -77,30 +102,32 @@ For further reading and documentation see the [data pre-processing workflow from For all samples: **Output directory: `results/Preprocessing/[SAMPLE]/Recalibrated`** -* `[SAMPLE].recal.bam` and `[SAMPLE].recal.bai` - * BAM file and index +- `[SAMPLE].recal.bam` and `[SAMPLE].recal.bai` + - BAM file and index ### TSV files -The TSV files are autogenerated and can be used by Sarek for further processing and/or variant calling. +The TSV files are auto-generated and can be used by Sarek for further processing and/or variant calling. For further reading and documentation see the [input documentation](https://github.com/nf-core/sarek/blob/master/docs/input.md). For all samples: **Output directory: `results/Preprocessing/TSV`** -* `duplicateMarked.tsv` and `recalibrated.tsv` - * TSV files to start Sarek from `recalibration` or `variantcalling` steps. -* `duplicateMarked_[SAMPLE].tsv` and `recalibrated_[SAMPLE].tsv` - * TSV files to start Sarek from `recalibration` or `variantcalling` steps for a specific sample. +- `duplicateMarked.tsv` and `recalibrated.tsv` + - TSV files to start Sarek from `recalibration` or `variantcalling` steps. +- `duplicateMarked_[SAMPLE].tsv` and `recalibrated_[SAMPLE].tsv` + - TSV files to start Sarek from `recalibration` or `variantcalling` steps for a specific sample. ## Variant Calling -All the results regarding variant-calling are collected in this directory. +All the results regarding Variant Calling are collected in this directory. + +Recalibrated BAM files can also be used as an input to start the Variant Calling, for more information see [TSV files output information](#tsv-files) -Recalibrated BAM files can also be used as an input to start the Variant Calling, for more information see [TSV files output information](#TSV-files) +### SNVs and small indels -### FreeBayes +#### FreeBayes [FreeBayes](https://github.com/ekg/freebayes) is a Bayesian genetic variant detector designed to find small polymorphisms, specifically SNPs, indels, MNPs, and complex events smaller than the length of a short-read sequencing alignment.. @@ -109,10 +136,10 @@ For further reading and documentation see the [FreeBayes manual](https://github. For a Tumor/Normal pair only: **Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/FreeBayes`** -* `FreeBayes_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `FreeBayes_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` - * VCF with Tabix index +- `FreeBayes_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `FreeBayes_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` + - VCF with Tabix index -### HaplotypeCaller +#### GATK HaplotypeCaller [GATK HaplotypeCaller](https://github.com/broadinstitute/gatk) calls germline SNPs and indels via local re-assembly of haplotypes. @@ -123,10 +150,10 @@ For further reading and documentation see the [HaplotypeCaller manual](https://s For all samples: **Output directory: `results/VariantCalling/[SAMPLE]/HaploTypeCaller`** -* `HaplotypeCaller_[SAMPLE].vcf.gz` and `HaplotypeCaller_[SAMPLE].vcf.gz.tbi` - * VCF with Tabix index +- `HaplotypeCaller_[SAMPLE].vcf.gz` and `HaplotypeCaller_[SAMPLE].vcf.gz.tbi` + - VCF with Tabix index -### GenotypeGVCFs +#### GATK GenotypeGVCFs [GATK GenotypeGVCFs](https://github.com/broadinstitute/gatk) performs joint genotyping on one or more samples pre-called with HaplotypeCaller. @@ -137,10 +164,10 @@ For further reading and documentation see the [GenotypeGVCFs manual](https://sof For all samples: **Output directory: `results/VariantCalling/[SAMPLE]/HaplotypeCallerGVCF`** -* `HaplotypeCaller_[SAMPLE].g.vcf.gz` and `HaplotypeCaller_[SAMPLE].g.vcf.gz.tbi` - * VCF with Tabix index +- `HaplotypeCaller_[SAMPLE].g.vcf.gz` and `HaplotypeCaller_[SAMPLE].g.vcf.gz.tbi` + - VCF with Tabix index -### Mutect2 +#### GATK Mutect2 [GATK Mutect2](https://github.com/broadinstitute/gatk) calls somatic SNVs and indels via local assembly of haplotypes. @@ -152,41 +179,28 @@ For a Tumor/Normal pair only: Files created: -* `unfiltered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `unfiltered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` - * unfiltered (raw) Mutect2 calls VCF with Tabix index -* `filtered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `filtered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` - * filtered Mutect2 calls VCF with Tabix index: these entries has a PASS filter, you can get these when supplying a panel of normals using the `--pon` option -* `[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.stats` - * a stats file generated during calling raw variants (needed for filtering) -* `[TUMORSAMPLE]_contamination.table` - * a text file exported when panel-of-normals provided about sample contamination +- `unfiltered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `unfiltered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` + - unfiltered (raw) Mutect2 calls VCF with Tabix index +- `filtered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `filtered_Mutect2_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` + - filtered Mutect2 calls VCF with Tabix index: these entries has a PASS filter, you can get these when supplying a panel of normals using the `--pon` option +- `[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.stats` + - a stats file generated during calling raw variants (needed for filtering) +- `[TUMORSAMPLE]_contamination.table` + - a text file exported when panel-of-normals provided about sample contamination -### TIDDIT - -[TIDDIT](https://github.com/SciLifeLab/TIDDIT) identifies intra and inter-chromosomal translocations, deletions, tandem-duplications and inversions. +#### samtools mpileup -Germline calls are provided for all samples, to able comparison of both tumor and normal for possible mixup. -Low quality calls are removed internally, to simplify processing of variant calls but they are saved by Sarek. +[samtools mpileup](https://www.htslib.org/doc/samtools.html) generate pileup for a BAM file. -For further reading and documentation see the [TIDDIT manual](https://github.com/SciLifeLab/TIDDIT/blob/master/README.md). +For further reading and documentation see the [samtools manual](https://www.htslib.org/doc/samtools.html#COMMANDS_AND_OPTIONS). For all samples: -**Output directory: `results/VariantCalling/[SAMPLE]/TIDDIT`** +**Output directory: `results/VariantCalling/[SAMPLE]/mpileup`** -* `TIDDIT_[SAMPLE].vcf.gz` and `TIDDIT_[SAMPLE].vcf.gz.tbi` - * VCF with Tabix index -* `TIDDIT_[SAMPLE].signals.tab` - * tab file describing coverage across the genome, binned per 50 bp -* `TIDDIT_[SAMPLE].ploidy.tab` - * tab file describing the estimated ploïdy and coverage across each contig -* `TIDDIT_[SAMPLE].old.vcf` - * VCF including the low qualiy calls -* `TIDDIT_[SAMPLE].wig` - * wiggle file containing coverage across the genome, binned per 50 bp -* `TIDDIT_[SAMPLE].gc.wig` - * wiggle file containing fraction of gc content, binned per 50 bp - -### Strelka2 +- `[SAMPLE].pileup.gz` + - The pileup format is a text-based format for summarizing the base calls of aligned reads to a reference sequence. Alignment records are grouped by sample (SM) identifiers in @RG header lines. + +#### Strelka2 [Strelka2](https://github.com/Illumina/strelka) is a fast and accurate small variant caller optimized for analysis of germline variation in small cohorts and somatic variation in tumor/normal sample pairs. @@ -195,28 +209,66 @@ For further reading and documentation see the [Strelka2 user guide](https://gith For all samples: **Output directory: `results/VariantCalling/[SAMPLE]/Strelka`** -* `Strelka_Sample_genome.vcf.gz` and `Strelka_Sample_genome.vcf.gz.tbi` - * VCF with Tabix index -* `Strelka_Sample_variants.vcf.gz` and `Strelka_Sample_variants.vcf.gz.tbi` - * VCF with Tabix index +- `Strelka_Sample_genome.vcf.gz` and `Strelka_Sample_genome.vcf.gz.tbi` + - VCF with Tabix index +- `Strelka_Sample_variants.vcf.gz` and `Strelka_Sample_variants.vcf.gz.tbi` + - VCF with Tabix index For a Tumor/Normal pair: **Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/Strelka`** -* `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz` and `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz.tbi` - * VCF with Tabix index -* `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz` and `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz.tbi` - * VCF with Tabix index +- `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz` and `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz.tbi` + - VCF with Tabix index +- `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz` and `Strelka_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz.tbi` + - VCF with Tabix index Using [Strelka Best Practices](https://github.com/Illumina/strelka/blob/v2.9.x/docs/userGuide/README.md#somatic-configuration-example) with the `candidateSmallIndels` from `Manta`: **Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/Strelka`** -* `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz` and `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz.tbi` - * VCF with Tabix index -* `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz` and `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz.tbi` - * VCF with Tabix index +- `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz` and `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_indels.vcf.gz.tbi` + - VCF with Tabix index +- `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz` and `StrelkaBP_[TUMORSAMPLE]_vs_[NORMALSAMPLE]_somatic_snvs.vcf.gz.tbi` + - VCF with Tabix index + +#### Sentieon DNAseq + +[Sentieon DNAseq](https://www.sentieon.com/products/#dnaseq) implements the same mathematics used in the Broad Institute’s BWA-GATK HaplotypeCaller 3.3-4.1 Best Practices Workflow pipeline. + +For further reading and documentation see the [Sentieon DNAseq user guide](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/). + +For all samples: +**Output directory: `results/VariantCalling/[SAMPLE]/SentieonDNAseq`** + +- `DNAseq_Sample.vcf.gz` and `DNAseq_Sample.vcf.gz.tbi` + - VCF with Tabix index + +#### Sentieon DNAscope + +[Sentieon DNAscope](https://www.sentieon.com/products) calls SNPs and small indels. + +For further reading and documentation see the [Sentieon DNAscope user guide](https://support.sentieon.com/manual/DNAscope_usage/dnascope/). + +For all samples: +**Output directory: `results/VariantCalling/[SAMPLE]/SentieonDNAscope`** + +- `DNAscope_Sample.vcf.gz` and `DNAscope_Sample.vcf.gz.tbi` + - VCF with Tabix index + +#### Sentieon TNscope + +[Sentieon TNscope](https://www.sentieon.com/products/#tnscope) calls SNPs and small indels on an Tumor/Normal pair. -### Manta +For further reading and documentation see the [Sentieon TNscope user guide](https://support.sentieon.com/manual/TNscope_usage/tnscope/). + +For a Tumor/Normal pair: +**Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/SentieonTNscope`** + +- `TNscope_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz` and `TNscope_[TUMORSAMPLE]_vs_[NORMALSAMPLE].vcf.gz.tbi` + - VCF with Tabix index + +### Structural Variants + +#### Manta [Manta](https://github.com/Illumina/manta) calls structural variants (SVs) and indels from mapped paired-end sequencing reads. It is optimized for analysis of germline variation in small sets of individuals and somatic variation in tumor/normal sample pairs. @@ -227,46 +279,85 @@ For further reading and documentation see the [Manta user guide](https://github. For all samples: **Output directory: `results/VariantCalling/[SAMPLE]/Manta`** -* `Manta_[SAMPLE].candidateSmallIndels.vcf.gz` and `Manta_[SAMPLE].candidateSmallIndels.vcf.gz.tbi` - * VCF with Tabix index -* `Manta_[SAMPLE].candidateSV.vcf.gz` and `Manta_[SAMPLE].candidateSV.vcf.gz.tbi` - * VCF with Tabix index +- `Manta_[SAMPLE].candidateSmallIndels.vcf.gz` and `Manta_[SAMPLE].candidateSmallIndels.vcf.gz.tbi` + - VCF with Tabix index +- `Manta_[SAMPLE].candidateSV.vcf.gz` and `Manta_[SAMPLE].candidateSV.vcf.gz.tbi` + - VCF with Tabix index For Normal sample only: -* `Manta_[NORMALSAMPLE].diploidSV.vcf.gz` and `Manta_[NORMALSAMPLE].diploidSV.vcf.gz.tbi` - * VCF with Tabix index +- `Manta_[NORMALSAMPLE].diploidSV.vcf.gz` and `Manta_[NORMALSAMPLE].diploidSV.vcf.gz.tbi` + - VCF with Tabix index For a Tumor sample only: -* `Manta_[TUMORSAMPLE].tumorSV.vcf.gz` and `Manta_[TUMORSAMPLE].tumorSV.vcf.gz.tbi` - * VCF with Tabix index +- `Manta_[TUMORSAMPLE].tumorSV.vcf.gz` and `Manta_[TUMORSAMPLE].tumorSV.vcf.gz.tbi` + - VCF with Tabix index For a Tumor/Normal pair only: **Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/Manta`** -* `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSmallIndels.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSmallIndels.vcf.gz.tbi` - * VCF with Tabix index -* `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSV.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSV.vcf.gz.tbi` - * VCF with Tabix index -* `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].diploidSV.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].diploidSV.vcf.gz.tbi` - * VCF with Tabix index -* `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].somaticSV.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].somaticSV.vcf.gz.tbi` - * VCF with Tabix index +- `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSmallIndels.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSmallIndels.vcf.gz.tbi` + - VCF with Tabix index +- `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSV.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].candidateSV.vcf.gz.tbi` + - VCF with Tabix index +- `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].diploidSV.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].diploidSV.vcf.gz.tbi` + - VCF with Tabix index +- `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].somaticSV.vcf.gz` and `Manta_[TUMORSAMPLE]_vs_[NORMALSAMPLE].somaticSV.vcf.gz.tbi` + - VCF with Tabix index + +#### TIDDIT + +[TIDDIT](https://github.com/SciLifeLab/TIDDIT) identifies intra and inter-chromosomal translocations, deletions, tandem-duplications and inversions. + +Germline calls are provided for all samples, to able comparison of both tumor and normal for possible mixup. +Low quality calls are removed internally, to simplify processing of variant calls but they are saved by Sarek. + +For further reading and documentation see the [TIDDIT manual](https://github.com/SciLifeLab/TIDDIT/blob/master/README.md). + +For all samples: +**Output directory: `results/VariantCalling/[SAMPLE]/TIDDIT`** + +- `TIDDIT_[SAMPLE].vcf.gz` and `TIDDIT_[SAMPLE].vcf.gz.tbi` + - VCF with Tabix index +- `TIDDIT_[SAMPLE].signals.tab` + - tab file describing coverage across the genome, binned per 50 bp +- `TIDDIT_[SAMPLE].ploidy.tab` + - tab file describing the estimated ploïdy and coverage across each contig +- `TIDDIT_[SAMPLE].old.vcf` + - VCF including the low qualiy calls +- `TIDDIT_[SAMPLE].wig` + - wiggle file containing coverage across the genome, binned per 50 bp +- `TIDDIT_[SAMPLE].gc.wig` + - wiggle file containing fraction of gc content, binned per 50 bp + +#### Sentieon DNAscope SV -### ConvertAlleleCounts +[Sentieon DNAscope](https://www.sentieon.com/products) can perform structural variant calling in addition to calling SNPs and small indels. + +For further reading and documentation see the [Sentieon DNAscope user guide](https://support.sentieon.com/manual/DNAscope_usage/dnascope/). + +For all samples: +**Output directory: `results/VariantCalling/[SAMPLE]/SentieonDNAscope`** + +- `DNAscope_SV_Sample.vcf.gz` and `DNAscope_SV_Sample.vcf.gz.tbi` + - VCF with Tabix index + +### Sample heterogeneity, ploidy and CNVs + +#### ConvertAlleleCounts [ConvertAlleleCounts](https://github.com/nf-core/sarek/blob/master/bin/convertAlleleCounts.r) is a R-script for converting output from AlleleCount to BAF and LogR values. For a Tumor/Normal pair only: **Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/ASCAT`** -* `[TUMORSAMPLE].BAF` and `[NORMALSAMPLE].BAF` - * file with beta allele frequencies -* `[TUMORSAMPLE].LogR` and `[NORMALSAMPLE].LogR` - * file with total copy number on a logarithmic scale +- `[TUMORSAMPLE].BAF` and `[NORMALSAMPLE].BAF` + - file with beta allele frequencies +- `[TUMORSAMPLE].LogR` and `[NORMALSAMPLE].LogR` + - file with total copy number on a logarithmic scale -### ASCAT +#### ASCAT [ASCAT](https://github.com/Crick-CancerGenomics/ascat) is a method to derive copy number profiles of tumor cells, accounting for normal cell admixture and tumor aneuploidy. ASCAT infers tumor purity and ploidy and calculates whole-genome allele-specific copy number profiles. @@ -276,38 +367,26 @@ For further reading and documentation see [the Sarek documentation about ASCAT]( For a Tumor/Normal pair only: **Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/ASCAT`** -* `[TUMORSAMPLE].aberrationreliability.png` - * Image with information about aberration reliability -* `[TUMORSAMPLE].ASCATprofile.png` - * Image with information about ASCAT profile -* `[TUMORSAMPLE].ASPCF.png` - * Image with information about ASPCF -* `[TUMORSAMPLE].rawprofile.png` - * Image with information about raw profile -* `[TUMORSAMPLE].sunrise.png` - * Image with information about sunrise -* `[TUMORSAMPLE].tumour.png` - * Image with information about tumor -* `[TUMORSAMPLE].cnvs.txt` - * file with information about CNVS -* `[TUMORSAMPLE].LogR.PCFed.txt` - * file with information about LogR -* `[TUMORSAMPLE].purityploidy.txt` - * file with information about purity ploidy - -### mpileup - -[samtools mpileup](https://www.htslib.org/doc/samtools.html) generate pileup for a BAM file. - -For further reading and documentation see the [samtools manual](https://www.htslib.org/doc/samtools.html#COMMANDS_AND_OPTIONS). - -For all samples: -**Output directory: `results/VariantCalling/[SAMPLE]/mpileup`** - -* `[SAMPLE].pileup.gz` - * The pileup format is a text-based format for summarizing the base calls of aligned reads to a reference sequence. Alignment records are grouped by sample (SM) identifiers in @RG header lines. - -### Control-FREEC +- `[TUMORSAMPLE].aberrationreliability.png` + - Image with information about aberration reliability +- `[TUMORSAMPLE].ASCATprofile.png` + - Image with information about ASCAT profile +- `[TUMORSAMPLE].ASPCF.png` + - Image with information about ASPCF +- `[TUMORSAMPLE].rawprofile.png` + - Image with information about raw profile +- `[TUMORSAMPLE].sunrise.png` + - Image with information about sunrise +- `[TUMORSAMPLE].tumour.png` + - Image with information about tumor +- `[TUMORSAMPLE].cnvs.txt` + - file with information about CNVS +- `[TUMORSAMPLE].LogR.PCFed.txt` + - file with information about LogR +- `[TUMORSAMPLE].purityploidy.txt` + - file with information about purity ploidy + +#### Control-FREEC [Control-FREEC](https://github.com/BoevaLab/FREEC) is a tool for detection of copy-number changes and allelic imbalances (including LOH) using deep-sequencing data. Control-FREEC automatically computes, normalizes, segments copy number and beta allele frequency profiles, then calls copy number alterations and LOH. @@ -318,16 +397,16 @@ For further reading and documentation see the [Control-FREEC manual](http://boev For a Tumor/Normal pair only: **Output directory: `results/VariantCalling/[TUMOR_vs_NORMAL]/ControlFREEC`** -* `[TUMORSAMPLE]_vs_[NORMALSAMPLE].config.txt` - * Configuration file used to run Control-FREEC -* `[TUMORSAMPLE].pileup.gz_CNVs` and `[TUMORSAMPLE].pileup.gz_normal_CNVs` - * file with coordinates of predicted copy number alterations -* `[TUMORSAMPLE].pileup.gz_ratio.txt` and `[TUMORSAMPLE].pileup.gz_normal_ratio.txt` - * file with ratios and predicted copy number alterations for each window -* `[TUMORSAMPLE].pileup.gz_BAF.txt` and `[NORMALSAMPLE].pileup.gz_BAF.txt` - * file with beta allele frequencies for each possibly heterozygous SNP position +- `[TUMORSAMPLE]_vs_[NORMALSAMPLE].config.txt` + - Configuration file used to run Control-FREEC +- `[TUMORSAMPLE].pileup.gz_CNVs` and `[TUMORSAMPLE].pileup.gz_normal_CNVs` + - file with coordinates of predicted copy number alterations +- `[TUMORSAMPLE].pileup.gz_ratio.txt` and `[TUMORSAMPLE].pileup.gz_normal_ratio.txt` + - file with ratios and predicted copy number alterations for each window +- `[TUMORSAMPLE].pileup.gz_BAF.txt` and `[NORMALSAMPLE].pileup.gz_BAF.txt` + - file with beta allele frequencies for each possibly heterozygous SNP position -## Annotation +## Variant annotation This directory contains results from the final annotation steps: two software are used for annotation, [snpEff](http://snpeff.sourceforge.net/) and [VEP](https://www.ensembl.org/info/docs/tools/vep/index.html). Only a subset of the VCF files are annotated, and only variants that have a PASS filter. @@ -345,8 +424,8 @@ For further reading and documentation see the [snpEff manual](http://snpeff.sour For all samples: **Output directory: `results/Annotation/[SAMPLE]/snpEff`** -* `VariantCaller_Sample_snpEff.ann.vcf.gz` and `VariantCaller_Sample_snpEff.ann.vcf.gz.tbi` - * VCF with Tabix index +- `VariantCaller_Sample_snpEff.ann.vcf.gz` and `VariantCaller_Sample_snpEff.ann.vcf.gz.tbi` + - VCF with Tabix index ### VEP @@ -355,29 +434,31 @@ The generated VCF header contains the software version, also the version numbers The format of the [consequence annotations](https://www.ensembl.org/info/genome/variation/prediction/predicted_data.html) is also in the VCF header describing the INFO field. In the moment it contains: -* Consequence: impact of the variation, if there is any -* Codons: the codon change, i.e. cGt/cAt -* Amino_acids: change in amino acids, i.e. R/H if there is any -* Gene: ENSEMBL gene name -* SYMBOL: gene symbol -* Feature: actual transcript name -* EXON: affected exon -* PolyPhen: prediction based on [PolyPhen](http://genetics.bwh.harvard.edu/pph2/) -* SIFT: prediction by [SIFT](http://sift.bii.a-star.edu.sg/) -* Protein_position: Relative position of amino acid in protein -* BIOTYPE: Biotype of transcript or regulatory feature +- Consequence: impact of the variation, if there is any +- Codons: the codon change, i.e. cGt/cAt +- Amino_acids: change in amino acids, i.e. R/H if there is any +- Gene: ENSEMBL gene name +- SYMBOL: gene symbol +- Feature: actual transcript name +- EXON: affected exon +- PolyPhen: prediction based on [PolyPhen](http://genetics.bwh.harvard.edu/pph2/) +- SIFT: prediction by [SIFT](http://sift.bii.a-star.edu.sg/) +- Protein_position: Relative position of amino acid in protein +- BIOTYPE: Biotype of transcript or regulatory feature For further reading and documentation see the [VEP manual](https://www.ensembl.org/info/docs/tools/vep/index.html) For all samples: **Output directory: `results/Annotation/[SAMPLE]/VEP`** -* `VariantCaller_Sample_VEP.ann.vcf.gz` and `VariantCaller_Sample_VEP.ann.vcf.gz.tbi` - * VCF with Tabix index +- `VariantCaller_Sample_VEP.ann.vcf.gz` and `VariantCaller_Sample_VEP.ann.vcf.gz.tbi` + - VCF with Tabix index ## QC and reporting -### FastQC +### QC + +#### FastQC [FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/) gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%T/A/G/C). @@ -388,28 +469,28 @@ For further reading and documentation see the [FastQC help](http://www.bioinform For all samples: **Output directory: `results/Reports/[SAMPLE]/fastqc`** -* `sample_R1_XXX_fastqc.html` and `sample_R2_XXX_fastqc.html` - * FastQC report, containing quality metrics for each pair of the raw fastq files -* `sample_R1_XXX_fastqc.zip` and `sample_R2_XXX_fastqc.zip` - * zip file containing the FastQC reports, tab-delimited data files and plot images +- `sample_R1_XXX_fastqc.html` and `sample_R2_XXX_fastqc.html` + - FastQC report, containing quality metrics for each pair of the raw fastq files +- `sample_R1_XXX_fastqc.zip` and `sample_R2_XXX_fastqc.zip` + - zip file containing the FastQC reports, tab-delimited data files and plot images -### bamQC +#### bamQC [Qualimap bamqc](http://qualimap.bioinfo.cipf.es/) reports information for the evaluation of the quality of the provided alignment data. In short, the basic statistics of the alignment (number of reads, coverage, GC-content, etc.) are summarized and a number of useful graphs are produced. Plot will show: -* Stats by non-reference allele frequency, depth distribution, stats by quality and per-sample counts, singleton stats, etc. +- Stats by non-reference allele frequency, depth distribution, stats by quality and per-sample counts, singleton stats, etc. For all samples: **Output directory: `results/Reports/[SAMPLE]/bamQC`** -* `VariantCaller_[SAMPLE].bcf.tools.stats.out` - * RAW statistics used by MultiQC +- `VariantCaller_[SAMPLE].bcf.tools.stats.out` + - RAW statistics used by MultiQC For more information about how to use Qualimap bamqc reports, see [Qualimap bamqc manual](http://qualimap.bioinfo.cipf.es/doc_html/analysis.html#id7) -### MarkDuplicates reports +#### MarkDuplicates reports [GATK MarkDuplicates](https://github.com/broadinstitute/gatk) locates and tags duplicate reads in a BAM or SAM file, where duplicate reads are defined as originating from a single fragment of DNA. Duplicates can arise during sample preparation e.g. @@ -420,99 +501,101 @@ These duplication artifacts are referred to as optical duplicates. For all samples: **Output directory: `results/Reports/[SAMPLE]/MarkDuplicates`** -* `[SAMPLE].bam.metrics` - * RAW statistics used by MultiQC +- `[SAMPLE].bam.metrics` + - RAW statistics used by MultiQC For further reading and documentation see the [MarkDuplicates manual](https://software.broadinstitute.org/gatk/documentation/tooldocs/4.1.2.0/picard_sam_markduplicates_MarkDuplicates.php). -### samtools stats +#### samtools stats [samtools stats](https://www.htslib.org/doc/samtools.html) collects statistics from BAM files and outputs in a text format. Plots will show: -* Alignment metrics. +- Alignment metrics. For all samples: **Output directory: `results/Reports/[SAMPLE]/SamToolsStats`** -* `[SAMPLE].bam.samtools.stats.out` - * RAW statistics used by MultiQC +- `[SAMPLE].bam.samtools.stats.out` + - RAW statistics used by MultiQC For further reading and documentation see the [samtools manual](https://www.htslib.org/doc/samtools.html#COMMANDS_AND_OPTIONS) -### bcftools stats +#### bcftools stats [bcftools](https://samtools.github.io/bcftools/) is a program for variant calling and manipulating files in the Variant Call Format. Plot will show: -* Stats by non-reference allele frequency, depth distribution, stats by quality and per-sample counts, singleton stats, etc. +- Stats by non-reference allele frequency, depth distribution, stats by quality and per-sample counts, singleton stats, etc. For all samples: **Output directory: `results/Reports/[SAMPLE]/BCFToolsStats`** -* `VariantCaller_[SAMPLE].bcf.tools.stats.out` - * RAW statistics used by MultiQC +- `VariantCaller_[SAMPLE].bcf.tools.stats.out` + - RAW statistics used by MultiQC For further reading and documentation see the [bcftools stats manual](https://samtools.github.io/bcftools/bcftools.html#stats) -### VCFtools +#### VCFtools [VCFtools](https://vcftools.github.io/) is a program package designed for working with VCF files. Plots will show: -* the summary counts of each type of transition to transversion ratio for each FILTER category. -* the transition to transversion ratio as a function of alternative allele count (using only bi-allelic SNPs). -* the transition to transversion ratio as a function of SNP quality threshold (using only bi-allelic SNPs). +- the summary counts of each type of transition to transversion ratio for each FILTER category. +- the transition to transversion ratio as a function of alternative allele count (using only bi-allelic SNPs). +- the transition to transversion ratio as a function of SNP quality threshold (using only bi-allelic SNPs). For all samples: **Output directory: `results/Reports/[SAMPLE]/VCFTools`** -* `VariantCaller_[SAMPLE].FILTER.summary` - * RAW statistics used by MultiQC -* `VariantCaller_[SAMPLE].TsTv.count` - * RAW statistics used by MultiQC -* `VariantCaller_[SAMPLE].TsTv.qual` - * RAW statistics used by MultiQC +- `VariantCaller_[SAMPLE].FILTER.summary` + - RAW statistics used by MultiQC +- `VariantCaller_[SAMPLE].TsTv.count` + - RAW statistics used by MultiQC +- `VariantCaller_[SAMPLE].TsTv.qual` + - RAW statistics used by MultiQC For further reading and documentation see the [VCFtools manual](https://vcftools.github.io/man_latest.html#OUTPUT%20OPTIONS) -### snpEff reports +#### snpEff reports [snpeff](http://snpeff.sourceforge.net/) is a genetic variant annotation and effect prediction toolbox. It annotates and predicts the effects of variants on genes (such as amino acid changes) using multiple databases for annotations. Plots will shows : -* locations of detected variants in the genome and the number of variants for each location. -* the putative impact of detected variants and the number of variants for each impact. -* the effect of variants at protein level and the number of variants for each effect type. -* the quantity as function of the variant quality score. +- locations of detected variants in the genome and the number of variants for each location. +- the putative impact of detected variants and the number of variants for each impact. +- the effect of variants at protein level and the number of variants for each effect type. +- the quantity as function of the variant quality score. For all samples: **Output directory: `results/Reports/[SAMPLE]/snpEff`** -* `VariantCaller_Sample_snpEff.csv` - * RAW statistics used by MultiQC -* `VariantCaller_Sample_snpEff.html` - * Statistics to be visualised with a web browser -* `VariantCaller_Sample_snpEff.txt` - * TXT (tab separated) summary counts for variants affecting each transcript and gene +- `VariantCaller_Sample_snpEff.csv` + - RAW statistics used by MultiQC +- `VariantCaller_Sample_snpEff.html` + - Statistics to be visualised with a web browser +- `VariantCaller_Sample_snpEff.txt` + - TXT (tab separated) summary counts for variants affecting each transcript and gene For further reading and documentation see the [snpEff manual](http://snpeff.sourceforge.net/SnpEff_manual.html#outputSummary) -### VEP reports +#### VEP reports [VEP (Variant Effect Predictor)](https://www.ensembl.org/info/docs/tools/vep/index.html), based on Ensembl, is a tools to determine the effects of all sorts of variants, including SNPs, indels, structural variants, CNVs. For all samples: **Output directory: `results/Reports/[SAMPLE]/VEP`** -* `VariantCaller_Sample_VEP.summary.html` - * Summary of the VEP run to be visualised with a web browser +- `VariantCaller_Sample_VEP.summary.html` + - Summary of the VEP run to be visualised with a web browser For further reading and documentation see the [VEP manual](https://www.ensembl.org/info/docs/tools/vep/index.html) -### MultiQC +### Reporting + +#### MultiQC [MultiQC](http://multiqc.info) is a visualisation tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available in within the report data directory. @@ -522,9 +605,9 @@ The pipeline has special steps which allow the software versions used to be repo For the whole Sarek run: **Output directory: `results/Reports/MultiQC`** -* `multiqc_report.html` - * MultiQC report - a standalone HTML file that can be viewed in your web browser -* `multiqc_data/` - * Directory containing parsed statistics from the different tools used in the pipeline +- `multiqc_report.html` + - MultiQC report - a standalone HTML file that can be viewed in your web browser +- `multiqc_data/` + - Directory containing parsed statistics from the different tools used in the pipeline For further reading and documentation see the [MultiQC website](http://multiqc.info) diff --git a/docs/usage.md b/docs/usage.md index b5f5d45691..1d74294890 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -1,77 +1,73 @@ -# nf-core/sarek: Usage - -## Table of contents - - - -* [Table of contents](#table-of-contents) -* [Introduction](#introduction) -* [Running the pipeline](#running-the-pipeline) - * [Updating the pipeline](#updating-the-pipeline) - * [Reproducibility](#reproducibility) -* [Main arguments](#main-arguments) - * [`-profile`](#-profile) - * [`--input`](#--input) - * [`--split_fastq`](#--split_fastq) - * [`--sample`](#--sample) - * [`--sampleDir`](#--sampledir) - * [`--annotateVCF`](#--annotatevcf) - * [`--noGVCF`](#--nogvcf) - * [`--skipQC`](#--skipqc) - * [`--noReports`](#--noreports) - * [`--nucleotidesPerSecond`](#--nucleotidespersecond) - * [`--step`](#--step) - * [`--tools`](#--tools) - * [`--noStrelkaBP`](#--nostrelkabp) - * [`--no_intervals`](#--no_intervals) - * [`--targetBED`](#--targetbed) -* [Reference genomes](#reference-genomes) - * [`--genome` (using iGenomes)](#--genome-using-igenomes) - * [`--acLoci`](#--acloci) - * [`--acLociGC`](#--aclocigc) - * [`--bwaIndex`](#--bwaindex) - * [`--chrDir`](#--chrdir) - * [`--chrLength`](#--chrlength) - * [`--dbsnp`](#--dbsnp) - * [`--dbsnpIndex`](#--dbsnpindex) - * [`--dict`](#--dict) - * [`--fasta`](#--fasta) - * [`--fastaFai`](#--fastafai) - * [`--genomeDict`](#--genomedict) - * [`--genomeFile`](#--genomefile) - * [`--genomeIndex`](#--genomeindex) - * [`--germlineResource`](#--germlineresource) - * [`--germlineResourceIndex`](#--germlineresourceindex) - * [`--intervals`](#--intervals) - * [`--knownIndels`](#--knownindels) - * [`--knownIndelsIndex`](#--knownindelsindex) - * [`--pon`](#--pon) - * [`--snpeffDb`](#--snpeffdb) - * [`--vepCacheVersion`](#--vepcacheversion) - * [`--igenomesIgnore`](#--igenomesignore) - * [`--species`](#--species) -* [Job resources](#job-resources) - * [Automatic resubmission](#automatic-resubmission) - * [Custom resource requests](#custom-resource-requests) -* [AWS Batch specific parameters](#aws-batch-specific-parameters) - * [`--awsqueue`](#--awsqueue) - * [`--awsregion`](#--awsregion) -* [Other command line parameters](#other-command-line-parameters) - * [`--outdir`](#--outdir) - * [`--sequencing_center`](#--sequencing_center) - * [`--email`](#--email) - * [`-name`](#-name) - * [`-resume`](#-resume) - * [`-c`](#-c) - * [`--custom_config_version`](#--custom_config_version) - * [`--custom_config_base`](#--custom_config_base) - * [`--max_memory`](#--max_memory) - * [`--max_time`](#--max_time) - * [`--max_cpus`](#--max_cpus) - * [`--plaintext_email`](#--plaintext_email) - * [`--monochrome_logs`](#--monochrome_logs) - * [`--multiqc_config`](#--multiqc_config) - +# nf-core/sarek: Usage + +- [Introduction](#introduction) +- [Running the pipeline](#running-the-pipeline) + - [Updating the pipeline](#updating-the-pipeline) + - [Reproducibility](#reproducibility) +- [Main arguments](#main-arguments) + - [-profile](#-profile) + - [--input](#--input) + - [--split_fastq](#--split_fastq) + - [--sample](#--sample) + - [--sampleDir](#--sampledir) + - [--annotateVCF](#--annotatevcf) + - [--noGVCF](#--nogvcf) + - [--skipQC](#--skipqc) + - [--noReports](#--noreports) + - [--nucleotidesPerSecond](#--nucleotidespersecond) + - [--step](#--step) + - [--tools](#--tools) + - [--sentieon](#--sentieon) + - [--noStrelkaBP](#--nostrelkabp) + - [--no_intervals](#--no_intervals) + - [--targetBED](#--targetbed) +- [Reference genomes](#reference-genomes) + - [--genome (using iGenomes)](#--genome-using-igenomes) + - [--acLoci](#--acloci) + - [--acLociGC](#--aclocigc) + - [--bwaIndex](#--bwaindex) + - [--chrDir](#--chrdir) + - [--chrLength](#--chrlength) + - [--dbsnp](#--dbsnp) + - [--dbsnpIndex](#--dbsnpindex) + - [--dict](#--dict) + - [--fasta](#--fasta) + - [--fastaFai](#--fastafai) + - [--genomeDict](#--genomedict) + - [--genomeFile](#--genomefile) + - [--genomeIndex](#--genomeindex) + - [--germlineResource](#--germlineresource) + - [--germlineResourceIndex](#--germlineresourceindex) + - [--intervals](#--intervals) + - [--knownIndels](#--knownindels) + - [--knownIndelsIndex](#--knownindelsindex) + - [--pon](#--pon) + - [--pon_index](#--pon_index) + - [--snpeffDb](#--snpeffdb) + - [--vepCacheVersion](#--vepcacheversion) + - [--igenomesIgnore](#--igenomesignore) + - [--species](#--species) +- [Job resources](#job-resources) + - [Automatic resubmission](#automatic-resubmission) + - [Custom resource requests](#custom-resource-requests) +- [AWS Batch specific parameters](#aws-batch-specific-parameters) + - [--awsqueue](#--awsqueue) + - [--awsregion](#--awsregion) +- [Other command line parameters](#other-command-line-parameters) + - [--outdir](#--outdir) + - [--sequencing_center](#--sequencing_center) + - [--email](#--email) + - [-name](#-name) + - [-resume](#-resume) + - [-c](#-c) + - [--custom_config_version](#--custom_config_version) + - [--custom_config_base](#--custom_config_base) + - [--max_memory](#--max_memory) + - [--max_time](#--max_time) + - [--max_cpus](#--max_cpus) + - [--plaintext_email](#--plaintext_email) + - [--monochrome_logs](#--monochrome_logs) + - [--multiqc_config](#--multiqc_config) ## Introduction @@ -109,8 +105,8 @@ results # Finished results (configurable, see below) The nf-core/sarek pipeline comes with more documentation about running the pipeline, found in the `docs/` directory: -* [Output and how to interpret the results](output.md) -* [Extra Documentation on annotation](annotation.md) +- [Output and how to interpret the results](output.md) +- [Extra Documentation on annotation](annotation.md) ### Updating the pipeline @@ -135,7 +131,7 @@ This version number will be logged in reports when you run the pipeline, so that ## Main arguments -### `-profile` +### -profile Use this parameter to choose a configuration profile. Profiles can give configuration presets for different compute environments. @@ -143,22 +139,22 @@ Note that multiple profiles can be loaded, for example: `-profile docker` - the If `-profile` is not specified at all the pipeline will be run locally and expects all software to be installed and available on the `PATH`. -* `awsbatch` - * A generic configuration profile to be used with AWS Batch. -* `conda` - * A generic configuration profile to be used with [conda](https://conda.io/docs/) - * Pulls most software from [Bioconda](https://bioconda.github.io/) -* `docker` - * A generic configuration profile to be used with [Docker](http://docker.com/) - * Pulls software from dockerhub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) -* `singularity` - * A generic configuration profile to be used with [Singularity](http://singularity.lbl.gov/) - * Pulls software from DockerHub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) -* `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters - -### `--input` +- `awsbatch` + - A generic configuration profile to be used with AWS Batch. +- `conda` + - A generic configuration profile to be used with [conda](https://conda.io/docs/) + - Pulls most software from [Bioconda](https://bioconda.github.io/) +- `docker` + - A generic configuration profile to be used with [Docker](http://docker.com/) + - Pulls software from dockerhub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) +- `singularity` + - A generic configuration profile to be used with [Singularity](http://singularity.lbl.gov/) + - Pulls software from DockerHub: [`nfcore/sarek`](http://hub.docker.com/r/nfcore/sarek/) +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters + +### --input Use this to specify the location of your input TSV file, on `mapping`, `recalibrate` and `variantcalling` steps. For example: @@ -185,7 +181,7 @@ For example: Multiple VCF files can be specified if the path must be enclosed in quotes -### `--split_fastq` +### --split_fastq Use the Nextflow [`splitFastq`](https://www.nextflow.io/docs/latest/operator.html#splitfastq) operator to specify how many reads should be contained in the split fastq file. For example: @@ -194,7 +190,7 @@ For example: --split_fastq 10000 ``` -### `--sample` +### --sample > :warning: This params is deprecated -- it will be removed in a future release. > Please check: [`--input`](#--input) @@ -224,7 +220,7 @@ For example: Multiple VCF files can be specified if the path must be enclosed in quotes -### `--sampleDir` +### --sampleDir > :warning: This params is deprecated -- it will be removed in a future release. > Please check: [`--input`](#--input) @@ -236,7 +232,7 @@ For example: --sampleDir PathToDirectory ``` -### `--annotateVCF` +### --annotateVCF > :warning: This params is deprecated -- it will be removed in a future release. > Please check: [`--input`](#--input) @@ -250,47 +246,56 @@ For example: Multiple VCF files can be specified if the path must be enclosed in quotes -### `--noGVCF` +### --noGVCF Use this to disable g.vcf from `HaplotypeCaller`. -### `--skipQC` +### --skipQC Use this to disable specific QC and Reporting tools. Available: `all`, `bamQC`, `BCFtools`, `FastQC`, `MultiQC`, `samtools`, `vcftools`, `versions` Default: `None` -### `--noReports` +### --noReports > :warning: This params is deprecated -- it will be removed in a future release. > Please check: [`--skipQC`](#--skipQC) Use this to disable all QC and Reporting tools. -### `--nucleotidesPerSecond` +### --nucleotidesPerSecond Use this to estimate of how many seconds it will take to call variants on any interval, the default value is `1000` is it's not specified in the `.bed` file. -### `--step` +### --step Use this to specify the starting step: Default `mapping` Available: `mapping`, `recalibrate`, `variantcalling` and `annotate` -### `--tools` +### --tools Use this to specify the tools to run: Available: `ASCAT`, `ControlFREEC`, `FreeBayes`, `HaplotypeCaller`, `Manta`, `mpileup`, `Mutect2`, `Strelka`, `TIDDIT` -### `--noStrelkaBP` +### --sentieon + +If [Sentieon](https://www.sentieon.com/) is available, use this to enable it for preprocessing, and variant calling. +Adds the following tools for the [`--tools`](#--tools) options: `DNAseq`, `DNAscope` and `TNscope`. + +Please refer to the [nf-core/configs](https://github.com/nf-core/configs#adding-a-new-pipeline-specific-config) repository on how to make a pipeline-specific configuration file based on the [munin-sarek specific configuration file](https://github.com/nf-core/configs/blob/master/conf/pipeline/sarek/munin.config). + +Or ask us on the [nf-core Slack](http://nf-co.re/join/slack) on the following channels: [#sarek](https://nfcore.slack.com/channels/sarek) [#configs](https://nfcore.slack.com/channels/configs). + +### --noStrelkaBP Use this not to use `Manta` `candidateSmallIndels` for `Strelka` as Best Practice. -### `--no_intervals_` +### --no_intervals Disable usage of intervals file, and disable automatic generation of intervals file when none are provided. -### `--targetBED` +### --targetBED Use this to specify the target BED file for targeted or whole exome sequencing. @@ -299,7 +304,7 @@ Use this to specify the target BED file for targeted or whole exome sequencing. The pipeline config files come bundled with paths to the Illumina iGenomes reference index files. If running with docker or AWS, the configuration is set up to use the [AWS-iGenomes](https://ewels.github.io/AWS-iGenomes/) resource. -### `--genome` (using iGenomes) +### --genome (using iGenomes) There are 2 different species supported by Sarek in the iGenomes references. To run the pipeline, you must specify which to use with the `--genome` flag. @@ -307,92 +312,92 @@ To run the pipeline, you must specify which to use with the `--genome` flag. You can find the keys to specify the genomes in the [iGenomes config file](../conf/igenomes.config). Genomes that are supported are: -* Homo sapiens - * `--genome GRCh37` (GATK Bundle) - * `--genome GRCh38` (GATK Bundle) +- Homo sapiens + - `--genome GRCh37` (GATK Bundle) + - `--genome GRCh38` (GATK Bundle) -* Mus musculus - * `--genome GRCm38` (Ensembl) +- Mus musculus + - `--genome GRCm38` (Ensembl) Limited support for: -* Arabidopsis thaliana - * `--genome TAIR10` (Ensembl) +- Arabidopsis thaliana + - `--genome TAIR10` (Ensembl) -* Bacillus subtilis 168 - * `--genome EB2` (Ensembl) +- Bacillus subtilis 168 + - `--genome EB2` (Ensembl) -* Bos taurus - * `--genome UMD3.1` (Ensembl) - * `--genome bosTau8` (UCSC) +- Bos taurus + - `--genome UMD3.1` (Ensembl) + - `--genome bosTau8` (UCSC) -* Caenorhabditis elegans - * `--genome WBcel235` (Ensembl) - * `--genome ce10` (UCSC) +- Caenorhabditis elegans + - `--genome WBcel235` (Ensembl) + - `--genome ce10` (UCSC) -* Canis familiaris - * `--genome CanFam3.1` (Ensembl) - * `--genome canFam3` (UCSC) +- Canis familiaris + - `--genome CanFam3.1` (Ensembl) + - `--genome canFam3` (UCSC) -* Danio rerio - * `--genome GRCz10` (Ensembl) - * `--genome danRer10` (UCSC) +- Danio rerio + - `--genome GRCz10` (Ensembl) + - `--genome danRer10` (UCSC) -* Drosophila melanogaster - * `--genome BDGP6` (Ensembl) - * `--genome dm6` (UCSC) +- Drosophila melanogaster + - `--genome BDGP6` (Ensembl) + - `--genome dm6` (UCSC) -* Equus caballus - * `--genome EquCab2` (Ensembl) - * `--genome equCab2` (UCSC) +- Equus caballus + - `--genome EquCab2` (Ensembl) + - `--genome equCab2` (UCSC) -* Escherichia coli K 12 DH10B - * `--genome EB1` (Ensembl) +- Escherichia coli K 12 DH10B + - `--genome EB1` (Ensembl) -* Gallus gallus - * `--genome Galgal4` (Ensembl) - * `--genome galgal4` (UCSC) +- Gallus gallus + - `--genome Galgal4` (Ensembl) + - `--genome galgal4` (UCSC) -* Glycine max - * `--genome Gm01` (Ensembl) +- Glycine max + - `--genome Gm01` (Ensembl) -* Homo sapiens - * `--genome hg19` (UCSC) - * `--genome hg38` (UCSC) +- Homo sapiens + - `--genome hg19` (UCSC) + - `--genome hg38` (UCSC) -* Macaca mulatta - * `--genome Mmul_1` (Ensembl) +- Macaca mulatta + - `--genome Mmul_1` (Ensembl) -* Mus musculus - * `--genome mm10` (Ensembl) +- Mus musculus + - `--genome mm10` (Ensembl) -* Oryza sativa japonica - * `--genome IRGSP-1.0` (Ensembl) +- Oryza sativa japonica + - `--genome IRGSP-1.0` (Ensembl) -* Pan troglodytes - * `--genome CHIMP2.1.4` (Ensembl) - * `--genome panTro4` (UCSC) +- Pan troglodytes + - `--genome CHIMP2.1.4` (Ensembl) + - `--genome panTro4` (UCSC) -* Rattus norvegicus - * `--genome Rnor_6.0` (Ensembl) - * `--genome rn6` (UCSC) +- Rattus norvegicus + - `--genome Rnor_6.0` (Ensembl) + - `--genome rn6` (UCSC) -* Saccharomyces cerevisiae - * `--genome R64-1-1` (Ensembl) - * `--genome sacCer3` (UCSC) +- Saccharomyces cerevisiae + - `--genome R64-1-1` (Ensembl) + - `--genome sacCer3` (UCSC) -* Schizosaccharomyces pombe - * `--genome EF2` (Ensembl) +- Schizosaccharomyces pombe + - `--genome EF2` (Ensembl) -* Sorghum bicolor - * `--genome Sbi1` (Ensembl) +- Sorghum bicolor + - `--genome Sbi1` (Ensembl) -* Sus scrofa - * `--genome Sscrofa10.2` (Ensembl) - * `--genome susScr3` (UCSC) +- Sus scrofa + - `--genome Sscrofa10.2` (Ensembl) + - `--genome susScr3` (UCSC) -* Zea mays - * `--genome AGPv3` (Ensembl) +- Zea mays + - `--genome AGPv3` (Ensembl) Note that you can use the same configuration setup to save sets of reference files for your own use, even if they are not part of the iGenomes resource. See the [Nextflow documentation](https://www.nextflow.io/docs/latest/config.html) for instructions on where to save such a file. @@ -422,7 +427,7 @@ params { } ``` -### `--acLoci` +### --acLoci If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -430,7 +435,7 @@ If you prefer, you can specify the full path to your reference genome when you r --acLoci '[path to the acLoci file]' ``` -### `--acLociGC` +### --acLociGC If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -438,7 +443,7 @@ If you prefer, you can specify the full path to your reference genome when you r --acLociGC '[path to the acLociGC file]' ``` -### `--bwaIndex` +### --bwaIndex If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -446,7 +451,7 @@ If you prefer, you can specify the full path to your reference genome when you r --bwaIndex '[path to the bwa indexes]' ``` -### `--chrDir` +### --chrDir If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -454,7 +459,7 @@ If you prefer, you can specify the full path to your reference genome when you r --chrDir '[path to the Chromosomes folder]' ``` -### `--chrLength` +### --chrLength If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -462,7 +467,7 @@ If you prefer, you can specify the full path to your reference genome when you r --chrLength '[path to the Chromosomes length file]' ``` -### `--dbsnp` +### --dbsnp If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -470,7 +475,7 @@ If you prefer, you can specify the full path to your reference genome when you r --dbsnp '[path to the dbsnp file]' ``` -### `--dbsnpIndex` +### --dbsnpIndex If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -478,7 +483,7 @@ If you prefer, you can specify the full path to your reference genome when you r --dbsnpIndex '[path to the dbsnp index]' ``` -### `--dict` +### --dict If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -486,7 +491,7 @@ If you prefer, you can specify the full path to your reference genome when you r --dict '[path to the dict file]' ``` -### `--fasta` +### --fasta If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -494,7 +499,7 @@ If you prefer, you can specify the full path to your reference genome when you r --fasta '[path to the reference fasta file]' ``` -### `--fastaFai` +### --fastaFai If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -502,7 +507,7 @@ If you prefer, you can specify the full path to your reference genome when you r --fastaFai '[path to the reference index]' ``` -### `--genomeDict` +### --genomeDict > :warning: This params is deprecated -- it will be removed in a future release. > Please check: [`--dict`](#--dict) @@ -513,7 +518,7 @@ If you prefer, you can specify the full path to your reference genome when you r --dict '[path to the dict file]' ``` -### `--genomeFile` +### --genomeFile > :warning: This params is deprecated -- it will be removed in a future release. > Please check: [`--fasta`](#--fasta) @@ -524,7 +529,7 @@ If you prefer, you can specify the full path to your reference genome when you r --fasta '[path to the reference fasta file]' ``` -### `--genomeIndex` +### --genomeIndex > :warning: This params is deprecated -- it will be removed in a future release. > Please check: [`--fastaFai`](#--fastaFai) @@ -535,7 +540,7 @@ If you prefer, you can specify the full path to your reference genome when you r --fastaFai '[path to the reference index]' ``` -### `--germlineResource` +### --germlineResource The [germline resource VCF file](https://software.broadinstitute.org/gatk/documentation/tooldocs/current/org_broadinstitute_hellbender_tools_walkers_mutect_Mutect2.php#--germline-resource) (bgzipped and tabixed) needed by GATK4 Mutect2 is a collection of calls that are likely present in the sample, with allele frequencies. The AF info field must be present. @@ -546,7 +551,7 @@ To add your own germline resource supply --germlineResource '[path to my resource.vcf.gz]' ``` -### `--germlineResourceIndex` +### --germlineResourceIndex Tabix index of the germline resource specified at [`--germlineResource`](#--germlineResource). To add your own germline resource supply @@ -555,7 +560,7 @@ To add your own germline resource supply --germlineResourceIndex '[path to my resource.vcf.gz.idx]' ``` -### `--intervals` +### --intervals If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -563,7 +568,7 @@ If you prefer, you can specify the full path to your reference genome when you r --intervals '[path to the intervals file]' ``` -### `--knownIndels` +### --knownIndels If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -571,7 +576,7 @@ If you prefer, you can specify the full path to your reference genome when you r --knownIndels '[path to the knownIndels file]' ``` -### `--knownIndelsIndex` +### --knownIndelsIndex If you prefer, you can specify the full path to your reference genome when you run the pipeline: @@ -579,7 +584,7 @@ If you prefer, you can specify the full path to your reference genome when you r --knownIndelsIndex '[path to the knownIndels index]' ``` -### `--pon` +### --pon When a panel of normals [PON](https://gatkforums.broadinstitute.org/gatk/discussion/24057/how-to-call-somatic-mutations-using-gatk4-mutect2#latest) is defined, you will get filtered somatic calls as a result. Without PON, there will be no calls with PASS in the INFO field, only an _unfiltered_ VCF is written. @@ -593,7 +598,11 @@ Provide your PON by: If the PON file is bgzipped, there has to be a tabixed index file at the same directory. -### `--snpeffDb` +### --pon_index + +Tabix index of the panel-of-normals bgzipped VCF file. + +### --snpeffDb If you prefer, you can specify the DB version when you run the pipeline: @@ -601,7 +610,7 @@ If you prefer, you can specify the DB version when you run the pipeline: --snpeffDb '[version of the snpEff DB]' ``` -### `--vepCacheVersion` +### --vepCacheVersion If you prefer, you can specify the cache version when you run the pipeline: @@ -609,12 +618,12 @@ If you prefer, you can specify the cache version when you run the pipeline: --vepCacheVersion '[version of the VEP cache]' ``` -### `--igenomesIgnore` +### --igenomesIgnore Do not load `igenomes.config` when running the pipeline. You may choose this option if you observe clashes between custom parameters and those supplied in `igenomes.config`. -### `--species` +### --species This specifies the species used for running VEP annotation. For human data, this needs to be set to `homo_sapiens`, for mouse data `mus_musculus` as the annotation needs to know where to look for appropriate annotation references. If you use iGenomes or a local resource with `genomes.conf`, this has already been set for you appropriately. @@ -642,11 +651,11 @@ If you have any questions or issues please send us a message on [Slack](https:// Running the pipeline on AWS Batch requires a couple of specific parameters to be set according to your AWS Batch configuration. Please use the `-awsbatch` profile and then specify all of the following parameters. -### `--awsqueue` +### --awsqueue The JobQueue that you intend to use on AWS Batch. -### `--awsregion` +### --awsregion The AWS region to run your job in. Default is set to `eu-west-1` but can be adjusted to your needs. @@ -655,21 +664,21 @@ Please make sure to also set the `-w/--work-dir` and `--outdir` parameters to a ## Other command line parameters -### `--outdir` +### --outdir The output directory where the results will be saved. Default: `results/ -### `--sequencing_center` +### --sequencing_center The sequencing center that will be used in the BAM CN field -### `--email` +### --email Set this parameter to your e-mail address to get a summary e-mail with details of the run sent to you when the workflow exits. If set in your user config file (`~/.nextflow/config`) then you don't need to specify this on the command line for every run. -### `-name` +### -name Name for the pipeline run. If not specified, Nextflow will automatically generate a random mnemonic. @@ -678,7 +687,7 @@ This is used in the MultiQC report (if not default) and in the summary HTML / e- **NB:** Single hyphen (core Nextflow option) -### `-resume` +### -resume Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. @@ -688,7 +697,7 @@ Use the `nextflow log` command to show previous run names. **NB:** Single hyphen (core Nextflow option) -### `-c` +### -c Specify the path to a specific config file (this is a core NextFlow command). @@ -696,7 +705,7 @@ Specify the path to a specific config file (this is a core NextFlow command). Note - you can use this to override pipeline defaults. -### `--custom_config_version` +### --custom_config_version Provide git commit id for custom Institutional configs hosted at `nf-core/configs`. This was implemented for reproducibility purposes. @@ -707,7 +716,7 @@ Default is set to `master`. --custom_config_version d52db660777c4bf36546ddb188ec530c3ada1b96 ``` -### `--custom_config_base` +### --custom_config_base If you're running offline, nextflow will not be able to fetch the institutional config files from the internet. @@ -729,29 +738,29 @@ nextflow run /path/to/pipeline/ --custom_config_base /path/to/my/configs/configs > Note that the nf-core/tools helper package has a `download` command to download all required pipeline > files + singularity containers + institutional configs in one go for you, to make this process easier. -### `--max_memory` +### --max_memory Use to set a top-limit for the default memory requirement for each process. Should be a string in the format integer-unit eg. `--max_memory '8.GB'` -### `--max_time` +### --max_time Use to set a top-limit for the default time requirement for each process. Should be a string in the format integer-unit eg. `--max_time '2.h'` -### `--max_cpus` +### --max_cpus Use to set a top-limit for the default CPU requirement for each process. Should be a string in the format integer-unit eg. `--max_cpus 1` -### `--plaintext_email` +### --plaintext_email Set to receive plain-text e-mails instead of HTML formatted. -### `--monochrome_logs` +### --monochrome_logs Set to disable colourful command line output and live life in monochrome. -### `--multiqc_config` +### --multiqc_config Specify a path to a custom MultiQC configuration file. diff --git a/main.nf b/main.nf index 1265c244f8..2ef926a2cb 100644 --- a/main.nf +++ b/main.nf @@ -35,9 +35,9 @@ def helpMessage() { Works also with the path to a directory on mapping step with a single germline sample only Alternatively, path to VCF input file on annotate step Multiple VCF files can be specified with quotes - - -profile Configuration profile to use. Can use multiple (comma separated) - Available: conda, docker, singularity, awsbatch, test and more. + -profile Configuration profile to use + Can use multiple (comma separated) + Available: conda, docker, singularity, test and more Options: --genome Name of iGenomes reference @@ -62,6 +62,8 @@ def helpMessage() { --annotateTools Specify from which tools Sarek will look for VCF files to annotate, only for step annotate Available: HaplotypeCaller, Manta, Mutect2, Strelka, TIDDIT Default: None + --sentieon If sentieon is available, will enable it for preprocessing, and variant calling + Adds the following tools for --tools: DNAseq, DNAscope and TNscope --annotation_cache Enable the use of cache for annotation, to be used with --snpEff_cache and/or --vep_cache --snpEff_cache Specity the path to snpEff cache, to be used with --annotation_cache --vep_cache Specity the path to VEP cache, to be used with --annotation_cache @@ -1538,8 +1540,6 @@ process SentieonDNAseq { tag {idSample} - publishDir "${params.outdir}/VariantCalling/${idSample}/SentieonDNAseq", mode: params.publishDirMode - input: set idPatient, idSample, file(bam), file(bai) from bamSentieonDNAseq file(dbsnp) from ch_dbsnp @@ -1575,8 +1575,6 @@ process SentieonDNAscope { tag {idSample} - publishDir "${params.outdir}/VariantCalling/${idSample}/SentieonDNAscope", mode: params.publishDirMode - input: set idPatient, idSample, file(bam), file(bai) from bamSentieonDNAscope file(dbsnp) from ch_dbsnp @@ -2098,8 +2096,6 @@ process SentieonTNscope { tag {idSampleTumor + "_vs_" + idSampleNormal} - publishDir "${params.outdir}/VariantCalling/${idSampleTumor}_vs_${idSampleNormal}/SentieonTNscope", mode: params.publishDirMode - input: set idPatient, idSampleNormal, file(bamNormal), file(baiNormal), idSampleTumor, file(bamTumor), file(baiTumor) from pairBamTNscope file(dict) from ch_dict @@ -2128,7 +2124,7 @@ process SentieonTNscope { --normal_sample ${idSampleNormal} \ --dbsnp ${dbsnp} \ ${PON} \ - SentieonTNscope_${idSampleTumor}_vs_${idSampleNormal}.vcf + TNscope_${idSampleTumor}_vs_${idSampleNormal}.vcf """ } From c75a95b861fb9b40f8cf4158335b9d04f5640350 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 10 Dec 2019 13:01:34 +0100 Subject: [PATCH 165/179] add warning for sentieon only processes --- docs/output.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/output.md b/docs/output.md index 3c62b97abb..4d4813dbc3 100644 --- a/docs/output.md +++ b/docs/output.md @@ -119,6 +119,16 @@ For all samples: - `duplicateMarked_[SAMPLE].tsv` and `recalibrated_[SAMPLE].tsv` - TSV files to start Sarek from `recalibration` or `variantcalling` steps for a specific sample. +> :warning: Only with [`--sentieon`](usage.md#--sentieon) + +For all samples: +**Output directory: `results/Preprocessing/TSV`** + +- `recalibrated_sentieon.tsv` + - TSV files to start Sarek from `variantcalling` step. +- `recalibrated_sentieon_[SAMPLE].tsv` + - TSV files to start Sarek from `variantcalling` step for a specific sample. + ## Variant Calling All the results regarding Variant Calling are collected in this directory. @@ -232,6 +242,8 @@ Using [Strelka Best Practices](https://github.com/Illumina/strelka/blob/v2.9.x/d #### Sentieon DNAseq +> :warning: Only with [`--sentieon`](usage.md#--sentieon) + [Sentieon DNAseq](https://www.sentieon.com/products/#dnaseq) implements the same mathematics used in the Broad Institute’s BWA-GATK HaplotypeCaller 3.3-4.1 Best Practices Workflow pipeline. For further reading and documentation see the [Sentieon DNAseq user guide](https://support.sentieon.com/manual/DNAseq_usage/dnaseq/). @@ -244,6 +256,8 @@ For all samples: #### Sentieon DNAscope +> :warning: Only with [`--sentieon`](usage.md#--sentieon) + [Sentieon DNAscope](https://www.sentieon.com/products) calls SNPs and small indels. For further reading and documentation see the [Sentieon DNAscope user guide](https://support.sentieon.com/manual/DNAscope_usage/dnascope/). @@ -256,6 +270,8 @@ For all samples: #### Sentieon TNscope +> :warning: Only with [`--sentieon`](usage.md#--sentieon) + [Sentieon TNscope](https://www.sentieon.com/products/#tnscope) calls SNPs and small indels on an Tumor/Normal pair. For further reading and documentation see the [Sentieon TNscope user guide](https://support.sentieon.com/manual/TNscope_usage/tnscope/). @@ -333,6 +349,8 @@ For all samples: #### Sentieon DNAscope SV +> :warning: Only with [`--sentieon`](usage.md#--sentieon) + [Sentieon DNAscope](https://www.sentieon.com/products) can perform structural variant calling in addition to calling SNPs and small indels. For further reading and documentation see the [Sentieon DNAscope user guide](https://support.sentieon.com/manual/DNAscope_usage/dnascope/). From 09deda678c93c06a8c837bb54da6cd14070282da Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 11 Dec 2019 11:27:18 +0100 Subject: [PATCH 166/179] nf-core bump-version . 2.5.2 --- .travis.yml | 2 +- Dockerfile | 2 +- environment.yml | 2 +- nextflow.config | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3713a63aff..1ee0bf40db 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,7 @@ before_install: - docker pull nfcore/sarek:dev # Fake the tag locally so that the pipeline runs properly # Looks weird when this is :dev to :dev, but makes sense when testing code for a release (:dev to :1.0.1) - - docker tag nfcore/sarek:dev nfcore/sarek:dev + - docker tag nfcore/sarek:dev nfcore/sarek:2.5.2 install: # Install Nextflow diff --git a/Dockerfile b/Dockerfile index 2179ebbdda..84d313d85a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -4,4 +4,4 @@ LABEL authors="Maxime Garcia, Szilveszter Juhos" \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/nf-core-sarek-2.5.2dev/bin:$PATH +ENV PATH /opt/conda/envs/nf-core-sarek-2.5.2/bin:$PATH diff --git a/environment.yml b/environment.yml index 56e57e8f0a..55c919d180 100644 --- a/environment.yml +++ b/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: nf-core-sarek-2.5.2dev +name: nf-core-sarek-2.5.2 channels: - conda-forge - bioconda diff --git a/nextflow.config b/nextflow.config index 22baf9ad56..909ad25108 100644 --- a/nextflow.config +++ b/nextflow.config @@ -90,7 +90,7 @@ params { // Container slug. Stable releases should specify release tag! // Developmental code should specify :dev -process.container = 'nfcore/sarek:dev' +process.container = 'nfcore/sarek:2.5.2' // Load base.config by default for all pipelines includeConfig 'conf/base.config' @@ -171,7 +171,7 @@ manifest { description = 'An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing' mainScript = 'main.nf' nextflowVersion = '>=19.10.0' - version = '2.5.2dev' + version = '2.5.2' } // Return the minimum between requirements and a maximum limit to ensure that resource requirements don't go over From ce8c4df616be9d5090ff715d484f27bd8202e6c4 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 11 Dec 2019 11:32:32 +0100 Subject: [PATCH 167/179] manual bump-version . 2.5.2 --- .circleci/config.yml | 8 ++++---- .github/workflows/ci.yml | 14 +++++++------- Jenkinsfile | 6 +++--- conf/base.config | 4 ++-- conf/test.config | 4 ++-- containers/snpeff/Dockerfile | 2 +- containers/snpeff/environment.yml | 2 +- containers/vep/Dockerfile | 2 +- containers/vep/environment.yml | 2 +- 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 582f2750a9..540c2fb782 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,11 +10,11 @@ jobs: - checkout - setup_remote_docker - run: - command: docker build -t nfcore/sareksnpeff:dev.${GENOME} containers/snpeff/. --build-arg GENOME=${GENOME} --build-arg SNPEFF_CACHE_VERSION=${SNPEFF_CACHE_VERSION} + command: docker build -t nfcore/sareksnpeff:2.5.2.${GENOME} containers/snpeff/. --build-arg GENOME=${GENOME} --build-arg SNPEFF_CACHE_VERSION=${SNPEFF_CACHE_VERSION} - run: command: | echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin - docker push nfcore/sareksnpeff:dev.${GENOME} + docker push nfcore/sareksnpeff:2.5.2.${GENOME} snpeffgrch38: << : *buildsnpeff @@ -45,10 +45,10 @@ jobs: - checkout - setup_remote_docker - run: - command: docker build -t nfcore/sarekvep:dev.${GENOME} containers/vep/. --build-arg GENOME=${GENOME} --build-arg SPECIES=${SPECIES} --build-arg VEP_VERSION=${VEP_VERSION} + command: docker build -t nfcore/sarekvep:2.5.2.${GENOME} containers/vep/. --build-arg GENOME=${GENOME} --build-arg SPECIES=${SPECIES} --build-arg VEP_VERSION=${VEP_VERSION} no_output_timeout: 3h - run: - command: echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin ; docker push nfcore/sarekvep:dev.${GENOME} + command: echo "$DOCKERHUB_PASS" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin ; docker push nfcore/sarekvep:2.5.2.${GENOME} vepgrch38: << : *buildvep diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 89ee9f46d5..eb37d34cef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,7 +18,7 @@ jobs: - name: Download and tag image run: | docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:2.5.2 - name: Run test run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker @@ -39,9 +39,9 @@ jobs: - name: Download and tag images run: | docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:2.5.2 docker pull nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} - docker tag nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} + docker tag nfcore/sarek${{ matrix.annotator }}:dev.${{ matrix.specie }} nfcore/sarek${{ matrix.annotator }}:2.5.2.${{ matrix.specie }} - name: Run annotation test run: | nextflow run . -profile test_annotation,docker --verbose --tools ${{ matrix.annotator }} @@ -58,7 +58,7 @@ jobs: - name: Download and tag image run: | docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:2.5.2 - name: Get test data run: | git clone --single-branch --branch sarek https://github.com/nf-core/test-datasets.git data @@ -84,7 +84,7 @@ jobs: - name: Download and tag image run: | docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:2.5.2 - name: Run test for minimal genomes run: | nextflow run . -profile test,docker --skipQC all --verbose --genome ${{ matrix.genome }} ${{ matrix.intervals }} --tools Manta,mpileup,Strelka @@ -104,7 +104,7 @@ jobs: - name: Download and tag image run: | docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:2.5.2 - name: Run targeted and splitfastq tests run: | nextflow run . -profile ${{ matrix.profile }},docker --verbose @@ -124,7 +124,7 @@ jobs: - name: Download and tag image run: | docker pull nfcore/sarek:dev - docker tag nfcore/sarek:dev nfcore/sarek:dev + docker tag nfcore/sarek:dev nfcore/sarek:2.5.2 - name: Run vriant calling test on specific tools run: | nextflow run . -profile test_tool,docker --verbose --tools ${{ matrix.tool }} \ No newline at end of file diff --git a/Jenkinsfile b/Jenkinsfile index 2a26fd3d5f..71ea4d76b7 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,11 +9,11 @@ pipeline { stage('Docker setup') { steps { sh "docker pull nfcore/sarek:dev" - sh "docker tag nfcore/sarek:dev nfcore/sarek:dev" + sh "docker tag nfcore/sarek:dev nfcore/sarek:2.5.2" sh "docker pull nfcore/sareksnpeff:dev.GRCh37" - sh "docker tag nfcore/sareksnpeff:dev.GRCh37 nfcore/sareksnpeff:dev.GRCh37" + sh "docker tag nfcore/sareksnpeff:dev.GRCh37 nfcore/sareksnpeff:2.5.2.GRCh37" sh "docker pull nfcore/sarekvep:dev.GRCh37" - sh "docker tag nfcore/sarekvep:dev.GRCh37 nfcore/sarekvep:dev.GRCh37" + sh "docker tag nfcore/sarekvep:dev.GRCh37 nfcore/sarekvep:2.5.2.GRCh37" } } stage('Annotation') { diff --git a/conf/base.config b/conf/base.config index 7c889b04ba..a21c748ba9 100644 --- a/conf/base.config +++ b/conf/base.config @@ -65,11 +65,11 @@ process { errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} } withName:Snpeff { - container = {(params.annotation_cache && params.snpEff_cache) ? 'nfcore/sarek:dev' : "nfcore/sareksnpeff:dev.${params.genome}"} + container = {(params.annotation_cache && params.snpEff_cache) ? 'nfcore/sarek:2.5.2' : "nfcore/sareksnpeff:2.5.2.${params.genome}"} errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} } withLabel:VEP { - container = {(params.annotation_cache && params.vep_cache) ? 'nfcore/sarek:dev' : "nfcore/sarekvep:dev.${params.genome}"} + container = {(params.annotation_cache && params.vep_cache) ? 'nfcore/sarek:2.5.2' : "nfcore/sarekvep:2.5.2.${params.genome}"} errorStrategy = {task.exitStatus == 143 ? 'retry' : 'ignore'} } } diff --git a/conf/test.config b/conf/test.config index d8b3673d9c..55b2defe4d 100644 --- a/conf/test.config +++ b/conf/test.config @@ -24,11 +24,11 @@ params { process { withName:Snpeff { - container = 'nfcore/sareksnpeff:dev.GRCh37' + container = 'nfcore/sareksnpeff:2.5.2.GRCh37' maxForks = 1 } withLabel:VEP { - container = 'nfcore/sarekvep:dev.GRCh37' + container = 'nfcore/sarekvep:2.5.2.GRCh37' maxForks = 1 } } diff --git a/containers/snpeff/Dockerfile b/containers/snpeff/Dockerfile index cbd68c52d8..65aea05046 100644 --- a/containers/snpeff/Dockerfile +++ b/containers/snpeff/Dockerfile @@ -7,7 +7,7 @@ LABEL \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/sarek-snpeff-2.5.2dev/bin:$PATH +ENV PATH /opt/conda/envs/sarek-snpeff-2.5.2/bin:$PATH # Setup default ARG variables ARG GENOME=GRCh38 diff --git a/containers/snpeff/environment.yml b/containers/snpeff/environment.yml index 5e73063ece..35279d068c 100644 --- a/containers/snpeff/environment.yml +++ b/containers/snpeff/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: sarek-snpeff-2.5.2dev +name: sarek-snpeff-2.5.2 channels: - conda-forge - bioconda diff --git a/containers/vep/Dockerfile b/containers/vep/Dockerfile index 562b770bef..3f9b7d10ab 100644 --- a/containers/vep/Dockerfile +++ b/containers/vep/Dockerfile @@ -7,7 +7,7 @@ LABEL \ COPY environment.yml / RUN conda env create -f /environment.yml && conda clean -a -ENV PATH /opt/conda/envs/sarek-vep-2.5.2dev/bin:$PATH +ENV PATH /opt/conda/envs/sarek-vep-2.5.2/bin:$PATH # Setup default ARG variables ARG GENOME=GRCh38 diff --git a/containers/vep/environment.yml b/containers/vep/environment.yml index 993a963ab0..2c8854d968 100644 --- a/containers/vep/environment.yml +++ b/containers/vep/environment.yml @@ -1,6 +1,6 @@ # You can use this file to create a conda environment for this pipeline: # conda env create -f environment.yml -name: sarek-vep-2.5.2dev +name: sarek-vep-2.5.2 channels: - conda-forge - bioconda From 9b2df57ab0a5e7bb96684badf319ee1c11e181a1 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 11 Dec 2019 11:37:29 +0100 Subject: [PATCH 168/179] update workflow image --- docs/images/sarek_workflow.png | Bin 49025 -> 127219 bytes docs/images/sarek_workflow.svg | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/docs/images/sarek_workflow.png b/docs/images/sarek_workflow.png index 1a1821cbf77d305e27a0a2198050f886dafdc5eb..2ded2109327042bc93b3fa54aa2ca68568087183 100644 GIT binary patch literal 127219 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­zFf$9TjSuwAzO5;=g+8Uzw>*Uu~yqo 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 Q6#QeLyI<#-*6}O<1LT@63IG5A diff --git a/docs/images/sarek_workflow.svg b/docs/images/sarek_workflow.svg index 3c65217c05..0b1e65f314 100644 --- a/docs/images/sarek_workflow.svg +++ b/docs/images/sarek_workflow.svg @@ -2217,11 +2217,11 @@ inkscape:window-height="1012" id="namedview4" showgrid="false" - inkscape:zoom="0.5" - inkscape:cx="-604.69523" - inkscape:cy="732.99056" - inkscape:window-x="1920" - inkscape:window-y="759" + inkscape:zoom="0.70710678" + inkscape:cx="394.00446" + inkscape:cy="931.73227" + inkscape:window-x="0" + inkscape:window-y="0" inkscape:window-maximized="1" inkscape:current-layer="g10" units="mm" @@ -2261,6 +2261,7 @@ + @@ -2793,6 +2794,7 @@ + • HaplotypeCaller Strelka2 mpileup, Strelka2• Manta, TIDDIT2.62.5.2 Date: Wed, 11 Dec 2019 11:39:07 +0100 Subject: [PATCH 169/179] downgrade tools for release --- CHANGELOG.md | 8 -------- environment.yml | 16 ++++++++-------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a52ada6b0f..a6bb8e1334 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,14 +22,6 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a ### `Changed` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `control-freec` from `11.4` to `11.5` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `ensembl-vep` from `95.2` to `98.2` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `freebayes` from `1.2.0` to `1.3.1` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `gatk4` from `4.1.2.0` to `4.1.4.0` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `manta` from `1.5.0` to `1.6.0` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `qualimap` from `2.2.2b` to `2.2.2c` -- [#41](https://github.com/nf-core/sarek/pull/41), [#55](https://github.com/nf-core/sarek/pull/55) - Update `tiddit` from `2.7.1` to `2.8.1` -- [#41](https://github.com/nf-core/sarek/pull/41) - Update `vcfanno` from `0.3.1` to `0.3.2` - [#54](https://github.com/nf-core/sarek/pull/54) - Bump version to `2.5.2dev` - [#60](https://github.com/nf-core/sarek/pull/60) - Some process (`BaseRecalibrator`, `ApplyBQSR`, `Mpileup`) have now optional usage of interval files - [#60](https://github.com/nf-core/sarek/pull/60) - Update documentation diff --git a/environment.yml b/environment.yml index 55c919d180..00a6acf06b 100644 --- a/environment.yml +++ b/environment.yml @@ -10,19 +10,19 @@ dependencies: - bcftools=1.9 - bwa=0.7.17 - cancerit-allelecount=4.0.2 - - control-freec=11.5 - - ensembl-vep=98.2 + - control-freec=11.4 + - ensembl-vep=95.2 - fastqc=0.11.8 - - freebayes=1.3.1 - - gatk4=4.1.4.0 + - freebayes=1.2.0 + - gatk4=4.1.2.0 - genesplicer=1.0 - htslib=1.9 - - manta=1.6.0 + - manta=1.5.0 - multiqc=1.7 - - qualimap=2.2.2c + - qualimap=2.2.2b - samtools=1.9 - snpeff=4.3.1t - strelka=2.9.10 - - tiddit=2.8.1 - - vcfanno=0.3.2 + - tiddit=2.7.1 + - vcfanno=0.3.1 - vcftools=0.1.16 \ No newline at end of file From feb865688fdce99a886e7be46687243017e38548 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Wed, 11 Dec 2019 12:09:11 +0100 Subject: [PATCH 170/179] update CHANGELOG --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6bb8e1334..1a6bfcaf79 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## dev +## [2.5.2] - Jåkkåtjkaskajekna + +Jåkkåtjkaskajekna is one of the two glaciers of the Ålkatj Massif. ### `Added` @@ -29,7 +31,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) a - [#71](https://github.com/nf-core/sarek/pull/71) - Update `CHANGELOG` - [#74](https://github.com/nf-core/sarek/pull/74) - Update docs - [#74](https://github.com/nf-core/sarek/pull/74) - Improve CI tests (both Jenkins and GitHub actions tests) -- [#74](https://github.com/nf-core/sarek/pull/74) - Move all ci from `ci-extra.yml` to `ci.yml` +- [#74](https://github.com/nf-core/sarek/pull/74) - Move all CI from `ci-extra.yml` to `ci.yml` ### `Removed` From 8cd87a4fb25c7d82f1796197d7f0a7a928a0e40d Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Thu, 12 Dec 2019 13:16:59 +0100 Subject: [PATCH 171/179] clean up and update workflow image --- README.md | 2 +- conf/awsbatch.config | 18 -- docs/images/sarek_workflow.png | Bin 127219 -> 138905 bytes docs/images/sarek_workflow.svg | 329 +++++++++++++++++---------------- nextflow.config | 12 +- 5 files changed, 179 insertions(+), 182 deletions(-) delete mode 100644 conf/awsbatch.config diff --git a/README.md b/README.md index e42c1f74de..d817195e18 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Software dependencies are handled using [Conda](https://conda.io/), [Docker](htt Thus making installation trivial and results highly reproducible.

- +

It's listed on the [Elixir - Tools and Data Services Registry](https://bio.tools/Sarek), [Dockstore](https://dockstore.org/workflows/github.com/nf-core/sarek) and [omicX - Bioinformatics tools](https://omictools.com/sarek-tool). diff --git a/conf/awsbatch.config b/conf/awsbatch.config deleted file mode 100644 index 14af5866f5..0000000000 --- a/conf/awsbatch.config +++ /dev/null @@ -1,18 +0,0 @@ -/* - * ------------------------------------------------- - * Nextflow config file for running on AWS batch - * ------------------------------------------------- - * Base config needed for running with -profile awsbatch - */ -params { - config_profile_name = 'AWSBATCH' - config_profile_description = 'AWSBATCH Cloud Profile' - config_profile_contact = 'Alexander Peltzer (@apeltzer)' - config_profile_url = 'https://aws.amazon.com/de/batch/' -} - -aws.region = params.awsregion -process.executor = 'awsbatch' -process.queue = params.awsqueue -executor.awscli = '/home/ec2-user/miniconda/bin/aws' -params.tracedir = './' diff --git a/docs/images/sarek_workflow.png b/docs/images/sarek_workflow.png index 2ded2109327042bc93b3fa54aa2ca68568087183..4499cf75d4cfbdc7be50a8aac28d03bd0413c339 100644 GIT binary patch literal 138905 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 literal 127219 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­zFf$9TjSuwAzO5;=g+8Uzw>*Uu~yqo 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/svg+xml @@ -2795,6 +2803,8 @@ + + 2.5.2