diff --git a/Dockerfile b/Dockerfile index 4bd9a6e..6cdf90e 100755 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ FROM continuumio/miniconda3:4.7.12 LABEL base_image="continuumio/miniconda3" LABEL version="4.7.12" LABEL software="mutect-nf" -LABEL software.version="2.2" +LABEL software.version="2.3" LABEL about.summary="Container image containing all requirements for mutect-nf" LABEL about.home="http://github.com/IARCbioinfo/mutect-nf" LABEL about.documentation="http://github.com/IARCbioinfo/mutect-nf/README.md" diff --git a/Dockerfile_gatk2 b/Dockerfile_gatk2 index 6e5fd6e..a718591 100755 --- a/Dockerfile_gatk2 +++ b/Dockerfile_gatk2 @@ -6,7 +6,7 @@ FROM continuumio/miniconda3:4.7.12 LABEL base_image="continuumio/miniconda3" LABEL version="4.7.12" LABEL software="mutect-nf_gatk2" -LABEL software.version="2.2" +LABEL software.version="2.3" LABEL about.summary="Container image containing all requirements for mutect-nf with gatk2 (mutect1)" LABEL about.home="http://github.com/IARCbioinfo/mutect-nf" LABEL about.documentation="http://github.com/IARCbioinfo/mutect-nf/README.md" diff --git a/Dockerfile_gatk3 b/Dockerfile_gatk3 index fe25bc6..d07beb7 100755 --- a/Dockerfile_gatk3 +++ b/Dockerfile_gatk3 @@ -6,7 +6,7 @@ FROM continuumio/miniconda3:4.7.12 LABEL base_image="continuumio/miniconda3" LABEL version="4.7.12" LABEL software="mutect-nf_gatk3" -LABEL software.version="2.2" +LABEL software.version="2.3" LABEL about.summary="Container image containing all requirements for mutect-nf with gatk3" LABEL about.home="http://github.com/IARCbioinfo/mutect-nf" LABEL about.documentation="http://github.com/IARCbioinfo/mutect-nf/README.md" diff --git a/README.md b/README.md index 9674d84..56260fb 100755 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # mutect-nf + + ## Mutect pipeline for somatic variant calling with Nextflow [![CircleCI](https://circleci.com/gh/IARCbioinfo/mutect-nf/tree/master.svg?style=svg)](https://circleci.com/gh/IARCbioinfo/mutect-nf/tree/master) [![Docker Hub](https://img.shields.io/badge/docker-ready-blue.svg)](https://hub.docker.com/r/iarcbioinfo/mutect-nf/) diff --git a/dag.html b/dag.html index aa79964..ead88ae 100644 --- a/dag.html +++ b/dag.html @@ -226,8 +226,8 @@ { data: { source: 'p49', target: 'p51', label: 'pileupsT0' } }, { data: { source: 'p50', target: 'p52', label: 'pileupsN' } }, { data: { source: 'p50', target: 'p54', label: 'pileupsN4pr' } }, -{ data: { source: 'p51', target: 'p52', label: 'pileupsT' } }, { data: { source: 'p51', target: 'p54', label: 'pileupsT4pr' } }, +{ data: { source: 'p51', target: 'p52', label: 'pileupsT' } }, { data: { source: 'p52', target: 'p53'} }, { data: { source: 'p53', target: 'p57', label: 'pileups4cont' } }, { data: { source: 'p54', target: 'p55'} }, diff --git a/dag.png b/dag.png index 64090ef..84d9ddd 100644 Binary files a/dag.png and b/dag.png differ diff --git a/environment.yml b/environment.yml index e306a5d..a2c8887 100755 --- a/environment.yml +++ b/environment.yml @@ -4,7 +4,7 @@ channels: - bioconda - defaults dependencies: - - gatk4=4.1.7.0 + - gatk4=4.2.0.0 - pysam=0.15.2 - bedops=2.4.37 - bedtools=2.29.2 diff --git a/mutect.nf b/mutect.nf index e15cbb7..c901f89 100755 --- a/mutect.nf +++ b/mutect.nf @@ -39,6 +39,7 @@ params.estimate_contamination = null params.filter_readorientation = null params.genotype = null params.ref_RNA = "NO_REF_RNA_FILE" +params.ext = "cram" params.help = null @@ -131,6 +132,7 @@ log.info '-------------------------------------------------------------' log.info "genotype = ${params.genotype}" log.info "ref = ${params.ref}" log.info "ref_RNA = ${params.ref_RNA}" + log.info "ext = ${params.ext}" } //load reference @@ -139,6 +141,11 @@ fasta_ref_fai = file( params.ref+'.fai' ) fasta_ref_gzi = file( params.ref+'.gzi' ) fasta_ref_dict = file( params.ref.replace(".fasta",".dict").replace(".fa",".dict") ) + +ext_ind = ".crai" +if(params.ext=="bam"){ ext_ind=".bai"} + + if(params.genotype){ if(params.ref_RNA == "NO_REF_RNA_FILE"){ fasta_ref_RNA = file( params.ref ) @@ -190,10 +197,10 @@ if (params.PON) { if (params.tn_file) { // FOR INPUT AS A TAB DELIMITED FILE pairs = Channel.fromPath(params.tn_file).splitCsv(header: true, sep: '\t', strip: true) - .map{ row -> [ row.sample , file(row.tumor), file(row.tumor+'.bai'), file(row.normal), file(row.normal+'.bai') ] } + .map{ row -> [ row.sample , file(row.tumor), file(row.tumor+ext_ind), file(row.normal), file(row.normal+ext_ind) ] } pairs2 = Channel.fromPath(params.tn_file).splitCsv(header: true, sep: '\t', strip: true) - .map{ row -> [ row.sample , file(row.tumor), file(row.tumor+'.bai'), file(row.normal), file(row.normal+'.bai') ] } + .map{ row -> [ row.sample , file(row.tumor), file(row.tumor+ext_ind), file(row.normal), file(row.normal+ext_ind) ] } tn_bambai2 = pairs2.groupTuple(by: 0) .map { row -> tuple(row[0] , row[1], row[2] , row[3][0] , row[4][0] ) } @@ -203,23 +210,24 @@ if (params.tn_file) { if(params.estimate_contamination){ pairsT4cont = Channel.fromPath(params.tn_file).splitCsv(header: true, sep: '\t', strip: true) - .map{ row -> [ row.sample , 'T' , file(row.tumor), file(row.tumor+'.bai') ] } + .map{ row -> [ row.sample , 'T' , file(row.tumor), file(row.tumor+ext_ind) ] } pairsN4cont = Channel.fromPath(params.tn_file).splitCsv(header: true, sep: '\t', strip: true) - .map{ row -> [ row.sample , 'N', file(row.normal), file(row.normal+'.bai') ] } + .map{ row -> [ row.sample , 'N', file(row.normal), file(row.normal+ext_ind) ] } .unique() pairs4cont = pairsT4cont.concat( pairsN4cont ) } } else { // FOR INPUT AS TWO FOLDER // recovering of bam files - tumor_bams = Channel.fromPath( params.tumor_bam_folder+'/*'+params.suffix_tumor+'.bam' ) - .ifEmpty { error "Cannot find any bam file in: ${params.tumor_bam_folder}" } - .map { path -> [ path.name.replace("${params.suffix_tumor}.bam",""), path ] } + ext_ind + tumor_bams = Channel.fromPath( params.tumor_bam_folder+'/*'+params.suffix_tumor+'.'+params.ext ) + .ifEmpty { error "Cannot find any bam/cram file in: ${params.tumor_bam_folder}" } + .map { path -> [ path.name.replace("${params.suffix_tumor}."+params.ext,""), path ] } // recovering of bai files - tumor_bais = Channel.fromPath( params.tumor_bam_folder+'/*'+params.suffix_tumor+'.bam.bai' ) - .ifEmpty { error "Cannot find any bai file in: ${params.tumor_bam_folder}" } - .map { path -> [ path.name.replace("${params.suffix_tumor}.bam.bai",""), path ] } + tumor_bais = Channel.fromPath( params.tumor_bam_folder+'/*'+params.suffix_tumor+'.'+params.ext+ext_ind ) + .ifEmpty { error "Cannot find any bai/crai file in: ${params.tumor_bam_folder}" } + .map { path -> [ path.name.replace("${params.suffix_tumor}."+params.ext+ext_ind,""), path ] } // building bam-bai pairs tumor_bam_bai = tumor_bams @@ -228,14 +236,14 @@ if (params.tn_file) { // FOR NORMAL // recovering of bam files - normal_bams = Channel.fromPath( params.normal_bam_folder+'/*'+params.suffix_normal+'.bam' ) - .ifEmpty { error "Cannot find any bam file in: ${params.normal_bam_folder}" } - .map { path -> [ path.name.replace("${params.suffix_normal}.bam",""), path ] } + normal_bams = Channel.fromPath( params.normal_bam_folder+'/*'+params.suffix_normal+'.'+params.ext ) + .ifEmpty { error "Cannot find any bam/cram file in: ${params.normal_bam_folder}" } + .map { path -> [ path.name.replace("${params.suffix_normal}."+params.ext,""), path ] } // recovering of bai files - normal_bais = Channel.fromPath( params.normal_bam_folder+'/*'+params.suffix_normal+'.bam.bai' ) - .ifEmpty { error "Cannot find any bai file in: ${params.normal_bam_folder}" } - .map { path -> [ path.name.replace("${params.suffix_normal}.bam.bai",""), path ] } + normal_bais = Channel.fromPath( params.normal_bam_folder+'/*'+params.suffix_normal+'.'+params.ext+ext_ind ) + .ifEmpty { error "Cannot find any bai/crai file in: ${params.normal_bam_folder}" } + .map { path -> [ path.name.replace("${params.suffix_normal}."+params.ext+ext_ind,""), path ] } // building bam-bai pairs normal_bam_bai = normal_bams @@ -248,12 +256,12 @@ if (params.tn_file) { .map {tumor_bb, normal_bb -> [ tumor_bb[0], tumor_bb[1], tumor_bb[2], normal_bb[1], normal_bb[2] ] } // here each element X of tn_bambai channel is a 4-uplet. X[0] is the tumor bam, X[1] the tumor bai, X[2] the normal bam and X[3] the normal bai. if(params.estimate_contamination){ - pairsT4cont = Channel.fromPath( params.tumor_bam_folder+'/*'+params.suffix_tumor+'.bam' ) - .map { path -> [ path.name.replace("${params.suffix_tumor}.bam",""), 'T', - file(path), file(path + '.bai') ] } - pairsN4cont = Channel.fromPath( params.normal_bam_folder+'/*'+params.suffix_normal+'.bam' ) - .map { path -> [ path.name.replace("${params.suffix_normal}.bam",""), 'N', - file(path), file(path + '.bai') ] } + pairsT4cont = Channel.fromPath( params.tumor_bam_folder+'/*'+params.suffix_tumor+'.'+params.ext ) + .map { path -> [ path.name.replace("${params.suffix_tumor}."+params.ext,""), 'T', + file(path), file(path +ext_ind) ] } + pairsN4cont = Channel.fromPath( params.normal_bam_folder+'/*'+params.suffix_normal+'.'+params.ext ) + .map { path -> [ path.name.replace("${params.suffix_normal}."+params.ext,""), 'N', + file(path), file(path +ext_ind ) ] } .unique() pairs4cont = pairsT4cont.concat( pairsN4cont ) } @@ -274,8 +282,8 @@ if (params.tn_file) { if(params.genotype){ pairs2 = Channel.fromPath(params.tn_file).splitCsv(header: true, sep: '\t', strip: true) .map{ row -> [ row.sample , row.preproc, file(row.tumor), - file(row.tumor+'.bai'), file(row.normal), - file(row.normal+'.bai'), file(row.vcf) ] } + file(row.tumor+ext_ind), file(row.normal), + file(row.normal+ext_ind), file(row.vcf) ] } pairs2.branch{ bam2preproc: it[1]=="yes" @@ -299,7 +307,7 @@ process RNAseq_preproc_fixMCNDN_fixMQ{ ''' if [ -L "None" ]; then unlink None; unlink None.bai; touch None;touch None.bai; fi if [ -L "none" ]; then unlink none; unlink none.bai; touch none;touch none.bai; fi - SM=`samtools view -H !{bam} | grep SM | head -1 | awk '{print $4}' | cut -c 4-` + SM=`samtools view -H !{bam} | grep "^@RG" | head -1 | awk '{print $NF}' | cut -c 4-` python !{baseDir}/bin/correctNDN.py !{bam} !{sample}_$SM"_MCNDNfixed.bam" samtools view -H !{sample}_$SM"_MCNDNfixed.bam" | sed -e "s/SM:"$SM"/SM:"$SM"_MCNDNfixed/" | samtools reheader - !{sample}_$SM"_MCNDNfixed.bam" > !{sample}_$SM"_MCNDNfixed_rehead.bam" samtools index !{sample}_$SM"_MCNDNfixed_rehead.bam" !{sample}_$SM"_MCNDNfixed_rehead.bai" @@ -323,7 +331,7 @@ process RNAseq_preproc_split{ shell: new_tag = sample+"_MCNDNfixed_split" ''' - SM=`samtools view -H !{bam} | grep SM | head -1 | awk '{print $4}' | cut -c 4-` + SM=`samtools view -H !{bam} | grep "^@RG" | head -1 | awk '{print $NF}' | cut -c 4-` gatk SplitNCigarReads --java-options "-Xmx!{params.mem}G -Djava.io.tmpdir=$PWD" --add-output-sam-program-record -fixNDN true -R !{fasta_ref_RNA} -I !{bam} -O !{new_tag}_$SM.bam ''' } @@ -376,7 +384,7 @@ process genotype{ } ''' !{baseDir}/bin/prep_vcf_bed.sh !{known_snp} !{PON} - normal_name=`samtools view -H !{bamN} | grep SM | head -1 | awk '{print $4}' | cut -c 4-` + normal_name=`samtools view -H !{bamN} | grep "^@RG" | head -1 | awk '{print $NF}' | cut -c 4-` gatk IndexFeatureFile -I !{vcf} gatk Mutect2 --java-options "-Xmx!{params.mem}G" -R !{fasta_ref} !{known_snp_option} !{PON_option} !{input_t} !{input_n} \ -O !{printed_tag}_genotyped.vcf !{params.mutect_args} --alleles !{vcf} -L regions.bed --disable-read-filter NonChimericOriginalAlignmentReadFilter --disable-read-filter NotDuplicateReadFilter \ @@ -488,7 +496,7 @@ process mutect { PON_option = "" } ''' - normal_name=`samtools view -H !{bamN} | grep SM | head -1 | awk '{print $4}' | cut -c 4-` + normal_name=`samtools view -H !{bamN} | grep "^@RG" | head -1 | awk '{print $NF}' | cut -c 4-` gatk Mutect2 --java-options "-Xmx!{params.mem}G" -R !{fasta_ref} !{known_snp_option} !{PON_option} \ !{input_t} !{input_n} -O !{printed_tag}_calls.vcf -L !{bed} !{params.mutect_args} --f1r2-tar-gz !{printed_tag}_f1r2.tar.gz ''' diff --git a/mutect_build_pon.nf b/mutect_build_pon.nf new file mode 100755 index 0000000..c77ca75 --- /dev/null +++ b/mutect_build_pon.nf @@ -0,0 +1,263 @@ +#! /usr/bin/env nextflow + +// Copyright (C) 2010 IARC/WHO + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +params.mem = 8 +params.cpu = 4 +params.output_folder = "mutect_pon_results" +params.mutect_args = "" +params.nsplit = 1 +params.java = "java" +params.known_snp = "NO_SNP_FILE" +params.region = null +params.bed = null +params.gatk_version = "4" +params.normal_file = null +params.ext = "cram" +//#known_snp: /data/gcs/mesomics/files/databases/BundleMutect2/af-only-gnomad.hg38.vcf.gz +params.help = null + +log.info "" +log.info "--------------------------------------------------------" +log.info " mutect-nf 2.2.0: Mutect pipeline for PON creation with Nextflow " +log.info "--------------------------------------------------------" +log.info "Copyright (C) IARC/WHO" +log.info "This program comes with ABSOLUTELY NO WARRANTY; for details see LICENSE" +log.info "This is free software, and you are welcome to redistribute it" +log.info "under certain conditions; see LICENSE for details." +log.info "--------------------------------------------------------" +log.info "" + + +if (params.help) { +log.info '-------------------------------------------------------------' + log.info ' USAGE ' + log.info '-------------------------------------------------------------' + log.info '' + log.info 'nextflow run mutect_build_pon.nf --ref ref.fasta --normal_file normals.tab [OPTIONS] ' + log.info '' + log.info 'Mandatory arguments:' + log.info ' --normal_file FILE input tabulation-separated values file with columns sample (sample name),' + log.info ' and normal (full path to matched normal cram);' + log.info ' --ref FILE (with indexes) Reference fasta file.' + log.info 'Optional arguments:' + log.info ' --nsplit INTEGER Split the region for calling in nsplit pieces and run in parallel (default: 1).' + log.info ' --known_snp FILE VCF file with known variants and frequency (e.g., from gnomad).' + log.info ' --mutect_args STRING Arguments you want to pass to mutect.' + log.info ' --gatk_version INTEGER gatk version, used to call Mutect and add the appropriate options (default: 4).' + log.info ' --cpu INTEGER Number of cpu used (default: 4).' + log.info ' --mem INTEGER Java memory passed to mutect in GB (default: 8).' + log.info ' --output_folder FOLDER Output folder (default: mutect_pon_results).' + log.info ' --java PATH Name of the JAVA command (default: java).' + log.info ' --ext STRING Type of alignment file [Def:cram]' + log.info '' + exit 0 +}else{ + /* Software information */ + log.info "mem = ${params.mem}" + log.info "cpu = ${params.cpu}" + log.info "output_folder = ${params.output_folder}" + log.info "mutect_args = ${params.mutect_args}" + log.info "nsplit = ${params.nsplit}" + log.info "known_snp = ${params.known_snp}" + log.info "gatk_version = ${params.gatk_version}" + log.info "normal_file = ${params.normal_file}" + log.info "ref = ${params.ref}" + log.info "ext = ${params.ext}" +} + +//load reference +fasta_ref = file( params.ref ) +fasta_ref_fai = file( params.ref+'.fai' ) +fasta_ref_gzi = file( params.ref+'.gzi' ) +fasta_ref_dict = file( params.ref.replace(".fasta",".dict").replace(".fa",".dict") ) + + +ext_ind = ".crai" +if(params.ext=="bam"){ ext_ind=".bai"} + +//load know snps +known_snp = file(params.known_snp) +known_snp_tbi = file(params.known_snp+".tbi") + + + +//load input files +if (params.normal_file) { + // FOR INPUT AS A TAB DELIMITED FILE + pairs = Channel.fromPath(params.normal_file).splitCsv(header: true, sep: '\t', strip: true) + .map{ row -> [ row.sample , file(row.normal), file(row.normal+ext_ind) ] } + tn_bambai = pairs.groupTuple(by: 0) + .map { row -> tuple(row[0] , row[1] , row[2]) } + +} else { + exit 0; +} + + + +/* manage input positions to call (bed or region or whole-genome) */ +input_region = 'whole_genome' + +if (params.region) { + input_region = 'region' +} else if (params.bed) { + input_region = 'bed' + bed = file(params.bed) +} else { + input_region = 'whole_genome' +} + + +/* process to create a bed file from region or from faidx if whole-genome, otherwise return the input bed file */ +process bed { + output: + file "temp.bed" into outbed, all_regions + + shell: + if (input_region == 'region') + ''' + echo !{params.region} | sed -e 's/[:|-]/ /g' > temp.bed + ''' + else if (input_region == 'whole_genome') + ''' + cat !{fasta_ref_fai} | awk '{print $1" "0" "$2 }' | grep -v -P "alt|random|Un|chrEBV|HLA" > temp.bed + ''' + } + +/* split bed file into nsplit regions */ +process split_bed { + + input: + file bed from outbed + + output: + file '*_regions.bed' into split_bed, count_split_bed mode flatten + + shell: + ''' + grep -v '^track' !{bed} | sort -T $PWD -k1,1 -k2,2n | bedtools merge -i stdin | awk '{print $1" "$2" "$3}' | cut_into_small_beds.r !{params.nsplit} + ''' +} + +( split_bed1 , split_bed2) = split_bed.into(2) + +process mutect { + memory params.mem+'GB' + cpus params.cpu + + tag { printed_tag } + + input: + set val(sample), file(bamN), file(baiN), file(bed) from tn_bambai.combine(split_bed1) + file fasta_ref + file fasta_ref_fai + file fasta_ref_dict + file known_snp + file known_snp_tbi + + output: + set val(sample), file("${printed_tag}_*.vcf") into mutect_output1 + + shell: + bed_tag0 = bed.baseName + bed_tag = bed_tag0.replaceAll("[^a-zA-Z0-9 _-]+","") + printed_tag = "${sample}_" + bed_tag + if("${params.gatk_version}" == "4"){ + ''' + gatk Mutect2 --java-options "-Xmx!{params.mem}G" -R !{fasta_ref} -L !{bed} !{params.mutect_args} -I !{bamN} --max-mnp-distance 0 -O !{printed_tag}_pon.vcf + ''' + }else{ + ''' + echo "Mutect version not supported\n" + exit 1; + ''' + } +} + +beds_length = count_split_bed.count().val + +process mergeMuTectOutputs { + + tag { normal_tag } + + publishDir params.output_folder, mode: 'copy', saveAs: {filename -> + if (filename.indexOf(".vcf.gz") > 0) "intermediate_calls/raw_calls/$filename" + } + + input: + set val(normal_tag), file(vcf_files) from mutect_output1.groupTuple(size: beds_length) + + output: + file("${normal_tag}_pon.vcf.gz") into res_merged + file("${normal_tag}_pon.vcf.gz") into res_merged_vcfs + file("${normal_tag}_pon.vcf.gz.tbi") into res_merged_vcfs_indexs + + shell: + ''' + #rm -f !{normal_tag}_pon.vcf + #rm -f !{normal_tag}_pon.vcf.gz + #rm -f !{normal_tag}_pon.vcf.gz.tbi + # MERGE VCF FILES + sed '/^#CHROM/q' `ls -1 *.vcf | head -1` > header.txt + # Check if sort command allows sorting in natural order (chr1 chr2 chr10 instead of chr1 chr10 chr2) + if [ `sort --help | grep -c 'version-sort' ` == 0 ] + then + sort_ops="-k1,1d" + else + sort_ops="-k1,1V" + fi + # Add all VCF contents and sort + grep --no-filename -v '^#' *.vcf | LC_ALL=C sort -T $PWD -t ' ' $sort_ops -k2,2n >> header.txt + mv header.txt !{normal_tag}_pon.vcf + #we index the created PON of normals + bcftools view -O z !{normal_tag}_pon.vcf > !{normal_tag}_pon.vcf.gz + bcftools index -t !{normal_tag}_pon.vcf.gz + + ''' +} + +process create_Genomics_DB{ + tag { "Build_PON" } + publishDir params.output_folder+'/PON/', mode: 'copy' + input: + file(vcfs) from res_merged_vcfs.collect() + file(vcfs_index) from res_merged_vcfs_indexs.collect() + file(intervals) from all_regions + file fasta_ref + file fasta_ref_fai + file fasta_ref_dict + file known_snp + file known_snp_tbi + output: + file("pon.vcf.gz") into mutect_pon_result + file("pon.vcf.gz.tbi") into mutect_pon_result_index + shell: + input_vcf="" + for( vcf in vcfs ){ + input_vcf=input_vcf+" -V ${vcf}" + } + ''' + # We create the GenomicsDBinport database + gatk GenomicsDBImport -R !{fasta_ref} -L !{intervals} \ + --genomicsdb-workspace-path pon_db !{input_vcf} + # We create the panel of normals + gatk CreateSomaticPanelOfNormals -R !{fasta_ref} \ + --germline-resource !{known_snp} \ + -V gendb://pon_db \ + -O pon.vcf.gz + ''' +} diff --git a/nextflow.config b/nextflow.config index 502a19e..fbb2906 100755 --- a/nextflow.config +++ b/nextflow.config @@ -19,29 +19,29 @@ profiles { } docker { docker.enabled = true - process.container = 'iarcbioinfo/mutect-nf:v2.2' + process.container = 'iarcbioinfo/mutect-nf:v2.3' } docker_gatk3 { docker.enabled = true - process.container = 'iarcbioinfo/mutect-nf:v2.2_gatk3' + process.container = 'iarcbioinfo/mutect-nf:v2.3_gatk3' } docker_gatk2 { docker.enabled = true - process.container = 'iarcbioinfo/mutect-nf:v2.2_gatk2' + process.container = 'iarcbioinfo/mutect-nf:v2.3_gatk2' } singularity { singularity.enabled = true - process.container = 'shub://IARCbioinfo/mutect-nf:v2.2' + process.container = 'iarcbioinfo/mutect-nf:v2.3' pullTimeout = "200 min" } singularity_gatk3 { singularity.enabled = true - process.container = 'shub://IARCbioinfo/mutect-nf:v2.2_gatk3' + process.container = 'iarcbioinfo/mutect-nf:v2.3_gatk3' pullTimeout = "200 min" } singularity_gatk2 { singularity.enabled = true - process.container = 'shub://IARCbioinfo/mutect-nf:v2.2_gatk2' + process.container = 'iarcbioinfo/mutect-nf:v2.3_gatk2' pullTimeout = "200 min" } }